| 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(); | 
| }; | 
|  | 
|  |