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

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

Issue 696373003: Don't GC message pipes that have an in-flight request (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 years, 1 month 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
« no previous file with comments | « no previous file | mojo/public/tools/bindings/generators/js_templates/interface_definition.tmpl » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/public/js/bindings/router.js
diff --git a/mojo/public/js/bindings/router.js b/mojo/public/js/bindings/router.js
index 36823921ae84a8669fce511bc46a3108a81ced34..b653c2bea4cf79ec5ffa62a58eb082f408de05ca 100644
--- a/mojo/public/js/bindings/router.js
+++ b/mojo/public/js/bindings/router.js
@@ -14,7 +14,7 @@ define("mojo/public/js/bindings/router", [
this.connector_ = new connectorFactory(handle);
this.incomingReceiver_ = null;
this.nextRequestID_ = 0;
- this.responders_ = {};
+ this.completers_ = new Map();
this.payloadValidators_ = [];
this.connector_.setIncomingReceiver({
@@ -26,7 +26,7 @@ define("mojo/public/js/bindings/router", [
}
Router.prototype.close = function() {
- this.responders_ = {}; // Drop any responders.
+ this.completers_ = null; // Drop any responders.
this.connector_.close();
};
@@ -38,7 +38,7 @@ define("mojo/public/js/bindings/router", [
// TODO(mpcomplete): no way to trasmit errors over a Connection.
};
- Router.prototype.acceptWithResponder = function(message, responder) {
+ Router.prototype.acceptAndExpectResponse = function(message) {
// Reserve 0 in case we want it to convey special meaning in the future.
var requestID = this.nextRequestID_++;
if (requestID == 0)
@@ -46,13 +46,15 @@ define("mojo/public/js/bindings/router", [
message.setRequestID(requestID);
var result = this.connector_.accept(message);
-
- this.responders_[requestID] = responder;
-
- // TODO(mpcomplete): accept should return a Promise too, maybe?
- if (result)
- return Promise.resolve();
- return Promise.reject(Error("Connection error"));
+ if (!result)
+ return Promise.reject(Error("Connection error"));
+
+ var completer = {};
+ this.completers_.set(requestID, completer);
+ return new Promise(function(resolve, reject) {
+ completer.resolve = resolve;
+ completer.reject = reject;
+ });
};
Router.prototype.setIncomingReceiver = function(receiver) {
@@ -92,9 +94,9 @@ define("mojo/public/js/bindings/router", [
} else if (message.isResponse()) {
var reader = new codec.MessageReader(message);
var requestID = reader.requestID;
- var responder = this.responders_[requestID];
- delete this.responders_[requestID];
- responder.accept(message);
+ var completer = this.completers_.get(requestID);
+ this.completers_.delete(requestID);
+ completer.resolve(message);
} else {
if (this.incomingReceiver_)
this.incomingReceiver_.accept(message);
@@ -106,8 +108,9 @@ define("mojo/public/js/bindings/router", [
}
Router.prototype.handleConnectionError_ = function(result) {
- for (var each in this.responders_)
- this.responders_[each].reject(result);
+ this.completers_.forEach(function(value) {
+ value.reject(result);
+ });
this.close();
};
« no previous file with comments | « no previous file | mojo/public/tools/bindings/generators/js_templates/interface_definition.tmpl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698