Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(714)

Unified Diff: mojo/public/bindings/js/router.js

Issue 207503004: Mojo: add javascript bindings for request/response (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix style Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
+});

Powered by Google App Engine
This is Rietveld 408576698