OLD | NEW |
---|---|
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #library("chat_server"); | 5 #library("chat_server"); |
6 #import("dart:io"); | 6 #import("dart:io"); |
7 #import("dart:isolate"); | 7 #import("dart:isolate"); |
8 #import("dart:json"); | 8 #import("dart:json"); |
9 | 9 |
10 void startChatServer() { | |
11 var server = new ChatServer(); | |
12 server.init(); | |
13 port.receive((message, replyTo) { | |
kasperl
2012/08/03 05:20:27
port.receive(server.dispatch)?
Mads Ager (google)
2012/08/03 05:51:35
D'oh! Done for all of them.
| |
14 server.dispatch(message, replyTo); | |
15 }); | |
16 } | |
17 | |
10 class ChatServer extends IsolatedServer { | 18 class ChatServer extends IsolatedServer { |
11 } | 19 } |
12 | 20 |
13 class ServerMain { | 21 class ServerMain { |
14 ServerMain.start(IsolatedServer server, | 22 ServerMain.start(SendPort serverPort, |
15 String hostAddress, | 23 String hostAddress, |
16 int tcpPort, | 24 int tcpPort, |
17 [int listenBacklog = 5]) | 25 [int listenBacklog = 5]) |
18 : _statusPort = new ReceivePort(), | 26 : _statusPort = new ReceivePort(), |
19 _serverPort = null { | 27 _serverPort = serverPort { |
20 server.spawn().then((SendPort port) { | |
21 _serverPort = port; | |
22 _start(hostAddress, tcpPort, listenBacklog); | |
23 }); | |
24 // We can only guess this is the right URL. At least it gives a | 28 // We can only guess this is the right URL. At least it gives a |
25 // hint to the user. | 29 // hint to the user. |
26 print('Server starting http://${hostAddress}:${tcpPort}/'); | 30 print('Server starting http://${hostAddress}:${tcpPort}/'); |
31 _start(hostAddress, tcpPort, listenBacklog); | |
27 } | 32 } |
28 | 33 |
29 void _start(String hostAddress, int tcpPort, int listenBacklog) { | 34 void _start(String hostAddress, int tcpPort, int listenBacklog) { |
30 // Handle status messages from the server. | 35 // Handle status messages from the server. |
31 _statusPort.receive((var message, SendPort replyTo) { | 36 _statusPort.receive((var message, SendPort replyTo) { |
32 String status = message.message; | 37 String status = message.message; |
33 print("Received status: $status"); | 38 print("Received status: $status"); |
34 }); | 39 }); |
35 | 40 |
36 // Send server start message to the server. | 41 // Send server start message to the server. |
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
280 int get port() => _port; | 285 int get port() => _port; |
281 Dynamic get error() => _error; | 286 Dynamic get error() => _error; |
282 | 287 |
283 int _state; | 288 int _state; |
284 String _message; | 289 String _message; |
285 int _port; | 290 int _port; |
286 var _error; | 291 var _error; |
287 } | 292 } |
288 | 293 |
289 | 294 |
290 class IsolatedServer extends Isolate { | 295 class IsolatedServer { |
291 static final String redirectPageHtml = """ | 296 static final String redirectPageHtml = """ |
292 <html> | 297 <html> |
293 <head><title>Welcome to the dart server</title></head> | 298 <head><title>Welcome to the dart server</title></head> |
294 <body><h1>Redirecting to the front page...</h1></body> | 299 <body><h1>Redirecting to the front page...</h1></body> |
295 </html>"""; | 300 </html>"""; |
296 static final String notFoundPageHtml = """ | 301 static final String notFoundPageHtml = """ |
297 <html><head> | 302 <html><head> |
298 <title>404 Not Found</title> | 303 <title>404 Not Found</title> |
299 </head><body> | 304 </head><body> |
300 <h1>Not Found</h1> | 305 <h1>Not Found</h1> |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
513 | 518 |
514 } else { | 519 } else { |
515 _protocolError(request, response); | 520 _protocolError(request, response); |
516 } | 521 } |
517 } else { | 522 } else { |
518 _protocolError(request, response); | 523 _protocolError(request, response); |
519 } | 524 } |
520 }; | 525 }; |
521 } | 526 } |
522 | 527 |
523 void main() { | 528 void init() { |
524 _logRequests = false; | 529 _logRequests = false; |
525 _topic = new Topic(); | 530 _topic = new Topic(); |
526 _serverStart = new Date.now(); | 531 _serverStart = new Date.now(); |
527 _messageCount = 0; | 532 _messageCount = 0; |
528 _messageRate = new Rate(); | 533 _messageRate = new Rate(); |
529 | 534 |
530 // Start a timer for cleanup events. | 535 // Start a timer for cleanup events. |
531 _cleanupTimer = | 536 _cleanupTimer = |
532 new Timer.repeating(10000, (timer) => _topic._handleTimer(timer)); | 537 new Timer.repeating(10000, (timer) => _topic._handleTimer(timer)); |
538 } | |
533 | 539 |
534 // Start timer for periodic logging. | 540 // Start timer for periodic logging. |
535 void _handleLogging(Timer timer) { | 541 void _handleLogging(Timer timer) { |
536 if (_logging) { | 542 if (_logging) { |
537 print("${_messageRate.rate} messages/s " | 543 print("${_messageRate.rate} messages/s " |
538 "(total $_messageCount messages)"); | 544 "(total $_messageCount messages)"); |
545 } | |
546 } | |
547 | |
548 void dispatch(message, replyTo) { | |
549 if (message.isStart) { | |
550 _host = message.host; | |
551 _port = message.port; | |
552 _logging = message.logging; | |
553 replyTo.send(new ChatServerStatus.starting(), null); | |
554 _server = new HttpServer(); | |
555 _server.defaultRequestHandler = _notFoundHandler; | |
556 _server.addRequestHandler( | |
557 (request) => request.path == "/", | |
558 (HttpRequest request, HttpResponse response) => | |
559 redirectPageHandler( | |
560 request, response, "dart_client/index.html")); | |
561 _server.addRequestHandler( | |
562 (request) => request.path == "/js_client/index.html", | |
563 (HttpRequest request, HttpResponse response) => | |
564 fileHandler(request, response)); | |
565 _server.addRequestHandler( | |
566 (request) => request.path == "/js_client/code.js", | |
567 (HttpRequest request, HttpResponse response) => | |
568 fileHandler(request, response)); | |
569 _server.addRequestHandler( | |
570 (request) => request.path == "/dart_client/index.html", | |
571 (HttpRequest request, HttpResponse response) => | |
572 fileHandler(request, response)); | |
573 _server.addRequestHandler( | |
574 (request) => request.path == "/out.js", | |
575 (HttpRequest request, HttpResponse response) => | |
576 fileHandler(request, response)); | |
577 _server.addRequestHandler( | |
578 (request) => request.path == "/favicon.ico", | |
579 (HttpRequest request, HttpResponse response) => | |
580 fileHandler(request, response, "static/favicon.ico")); | |
581 | |
582 _server.addRequestHandler( | |
583 (request) => request.path == "/join", _joinHandler); | |
584 _server.addRequestHandler( | |
585 (request) => request.path == "/leave", _leaveHandler); | |
586 _server.addRequestHandler( | |
587 (request) => request.path == "/message", _messageHandler); | |
588 _server.addRequestHandler( | |
589 (request) => request.path == "/receive", _receiveHandler); | |
590 try { | |
591 _server.listen(_host, _port, backlog: message.backlog); | |
592 replyTo.send(new ChatServerStatus.started(_server.port), null); | |
593 _loggingTimer = new Timer.repeating(1000, _handleLogging); | |
594 } catch (var e) { | |
595 replyTo.send(new ChatServerStatus.error(e.toString()), null); | |
539 } | 596 } |
597 } else if (message.isStop) { | |
598 replyTo.send(new ChatServerStatus.stopping(), null); | |
599 stop(); | |
600 replyTo.send(new ChatServerStatus.stopped(), null); | |
540 } | 601 } |
541 | |
542 this.port.receive((var message, SendPort replyTo) { | |
543 if (message.isStart) { | |
544 _host = message.host; | |
545 _port = message.port; | |
546 _logging = message.logging; | |
547 replyTo.send(new ChatServerStatus.starting(), null); | |
548 _server = new HttpServer(); | |
549 _server.defaultRequestHandler = _notFoundHandler; | |
550 _server.addRequestHandler( | |
551 (request) => request.path == "/", | |
552 (HttpRequest request, HttpResponse response) => | |
553 redirectPageHandler( | |
554 request, response, "dart_client/index.html")); | |
555 _server.addRequestHandler( | |
556 (request) => request.path == "/js_client/index.html", | |
557 (HttpRequest request, HttpResponse response) => | |
558 fileHandler(request, response)); | |
559 _server.addRequestHandler( | |
560 (request) => request.path == "/js_client/code.js", | |
561 (HttpRequest request, HttpResponse response) => | |
562 fileHandler(request, response)); | |
563 _server.addRequestHandler( | |
564 (request) => request.path == "/dart_client/index.html", | |
565 (HttpRequest request, HttpResponse response) => | |
566 fileHandler(request, response)); | |
567 _server.addRequestHandler( | |
568 (request) => request.path == "/out.js", | |
569 (HttpRequest request, HttpResponse response) => | |
570 fileHandler(request, response)); | |
571 _server.addRequestHandler( | |
572 (request) => request.path == "/favicon.ico", | |
573 (HttpRequest request, HttpResponse response) => | |
574 fileHandler(request, response, "static/favicon.ico")); | |
575 | |
576 _server.addRequestHandler( | |
577 (request) => request.path == "/join", _joinHandler); | |
578 _server.addRequestHandler( | |
579 (request) => request.path == "/leave", _leaveHandler); | |
580 _server.addRequestHandler( | |
581 (request) => request.path == "/message", _messageHandler); | |
582 _server.addRequestHandler( | |
583 (request) => request.path == "/receive", _receiveHandler); | |
584 try { | |
585 _server.listen(_host, _port, backlog: message.backlog); | |
586 replyTo.send(new ChatServerStatus.started(_server.port), null); | |
587 _loggingTimer = new Timer.repeating(1000, _handleLogging); | |
588 } catch (var e) { | |
589 replyTo.send(new ChatServerStatus.error(e.toString()), null); | |
590 } | |
591 } else if (message.isStop) { | |
592 replyTo.send(new ChatServerStatus.stopping(), null); | |
593 stop(); | |
594 replyTo.send(new ChatServerStatus.stopped(), null); | |
595 } | |
596 }); | |
597 } | 602 } |
598 | 603 |
599 stop() { | 604 stop() { |
600 _server.close(); | 605 _server.close(); |
601 _cleanupTimer.cancel(); | 606 _cleanupTimer.cancel(); |
602 this.port.close(); | 607 port.close(); |
603 } | 608 } |
604 | 609 |
605 String _host; | 610 String _host; |
606 int _port; | 611 int _port; |
607 HttpServer _server; // HTTP server instance. | 612 HttpServer _server; // HTTP server instance. |
608 bool _logRequests; | 613 bool _logRequests; |
609 | 614 |
610 Topic _topic; | 615 Topic _topic; |
611 Timer _cleanupTimer; | 616 Timer _cleanupTimer; |
612 Timer _loggingTimer; | 617 Timer _loggingTimer; |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
679 } | 684 } |
680 } | 685 } |
681 | 686 |
682 int _timeRange; | 687 int _timeRange; |
683 List<int> _buckets; | 688 List<int> _buckets; |
684 int _currentBucket; | 689 int _currentBucket; |
685 int _currentBucketTime; | 690 int _currentBucketTime; |
686 num _bucketTimeRange; | 691 num _bucketTimeRange; |
687 int _sum; | 692 int _sum; |
688 } | 693 } |
OLD | NEW |