Index: mojo/public/bindings/js/router.js |
diff --git a/mojo/public/bindings/js/router.js b/mojo/public/bindings/js/router.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..51f061acfa33032ad44c07892235c7060038a7f5 |
--- /dev/null |
+++ b/mojo/public/bindings/js/router.js |
@@ -0,0 +1,70 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+define("mojo/public/bindings/js/router", [ |
+ "mojo/public/bindings/js/codec", |
+ "mojo/public/bindings/js/connector", |
+], function(codec, connector) { |
+ |
+ function Router(handle) { |
+ this.connector_ = new connector.Connector(handle); |
+ this.incomingReceiver_ = null; |
+ this.nextRequestID_ = 0; |
+ this.responders_ = {}; |
+ |
+ this.connector_.setIncomingReceiver({ |
+ accept: this.handleIncomingMessage_.bind(this), |
+ }); |
+ } |
+ |
+ Router.prototype.close = function() { |
+ this.connector_.close(); |
+ }; |
abarth-chromium
2014/03/26 19:05:45
Should we drop the responders_ too?
|
+ |
+ Router.prototype.accept = function(message) { |
+ this.connector_.accept(message); |
+ }; |
+ |
+ Router.prototype.acceptWithResponder = function(message, responder) { |
+ // Reserve 0 in case we want it to convey special meaning in the future. |
+ var requestID = this.nextRequestID_++; |
+ if (requestID == 0) |
Matt Perry
2014/03/26 18:19:43
why not just start nextRequestId at 1? or are you
|
+ requestID = this.nextRequestID_++; |
+ |
+ message.setRequestID(requestID); |
+ this.connector_.accept(message); |
+ |
+ this.responders_[requestID] = responder; |
+ }; |
+ |
+ Router.prototype.setIncomingReceiver = function(receiver) { |
+ this.incomingReceiver_ = receiver; |
+ }; |
+ |
+ Router.prototype.handleIncomingMessage_ = function(message) { |
+ var flags = message.getFlags(); |
+ if (flags & codec.kMessageExpectsResponse) { |
+ if (this.incomingReceiver_) { |
+ this.incomingReceiver_.acceptWithResponder(message, this); |
+ } else { |
+ // If we receive a request expecting a response when the client is not |
+ // listening, then we have no choice but to tear down the pipe. |
+ this.close(); |
+ } |
+ } else if (flags & codec.kMessageIsResponse) { |
+ var reader = new codec.MessageReader(message); |
+ var requestID = reader.requestID; |
+ var responder = this.responders_[requestID]; |
+ delete this.responders_[requestID]; |
+ responder.accept(message); |
+ } else { |
+ if (this.incomingReceiver_) |
+ this.incomingReceiver_.accept(message); |
+ } |
+ }; |
+ |
+ var exports = {}; |
+ exports.Router = Router; |
+ return exports; |
+}); |