mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
156 lines
5.6 KiB
JavaScript
156 lines
5.6 KiB
JavaScript
// 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/js/connection", [
|
|
"mojo/public/js/bindings",
|
|
"mojo/public/js/connector",
|
|
"mojo/public/js/core",
|
|
"mojo/public/js/router",
|
|
], function(bindings, connector, core, router) {
|
|
|
|
var Router = router.Router;
|
|
var EmptyProxy = bindings.EmptyProxy;
|
|
var EmptyStub = bindings.EmptyStub;
|
|
var ProxyBindings = bindings.ProxyBindings;
|
|
var StubBindings = bindings.StubBindings;
|
|
var TestConnector = connector.TestConnector;
|
|
var TestRouter = router.TestRouter;
|
|
|
|
// TODO(hansmuller): the proxy receiver_ property should be receiver$
|
|
|
|
function BaseConnection(localStub, remoteProxy, router) {
|
|
this.router_ = router;
|
|
this.local = localStub;
|
|
this.remote = remoteProxy;
|
|
|
|
this.router_.setIncomingReceiver(localStub);
|
|
if (this.remote)
|
|
this.remote.receiver_ = router;
|
|
|
|
// Validate incoming messages: remote responses and local requests.
|
|
var validateRequest = localStub && localStub.validator;
|
|
var validateResponse = remoteProxy && remoteProxy.validator;
|
|
var payloadValidators = [];
|
|
if (validateRequest)
|
|
payloadValidators.push(validateRequest);
|
|
if (validateResponse)
|
|
payloadValidators.push(validateResponse);
|
|
this.router_.setPayloadValidators(payloadValidators);
|
|
}
|
|
|
|
BaseConnection.prototype.close = function() {
|
|
this.router_.close();
|
|
this.router_ = null;
|
|
this.local = null;
|
|
this.remote = null;
|
|
};
|
|
|
|
BaseConnection.prototype.encounteredError = function() {
|
|
return this.router_.encounteredError();
|
|
};
|
|
|
|
function Connection(
|
|
handle, localFactory, remoteFactory, routerFactory, connectorFactory) {
|
|
var routerClass = routerFactory || Router;
|
|
var router = new routerClass(handle, connectorFactory);
|
|
var remoteProxy = remoteFactory && new remoteFactory(router);
|
|
var localStub = localFactory && new localFactory(remoteProxy);
|
|
BaseConnection.call(this, localStub, remoteProxy, router);
|
|
}
|
|
|
|
Connection.prototype = Object.create(BaseConnection.prototype);
|
|
|
|
// The TestConnection subclass is only intended to be used in unit tests.
|
|
function TestConnection(handle, localFactory, remoteFactory) {
|
|
Connection.call(this,
|
|
handle,
|
|
localFactory,
|
|
remoteFactory,
|
|
TestRouter,
|
|
TestConnector);
|
|
}
|
|
|
|
TestConnection.prototype = Object.create(Connection.prototype);
|
|
|
|
// Return a handle for a message pipe that's connected to a proxy
|
|
// for remoteInterface. Used by generated code for outgoing interface&
|
|
// (request) parameters: the caller is given the generated proxy via
|
|
// |proxyCallback(proxy)| and the generated code sends the handle
|
|
// returned by this function.
|
|
function bindProxy(proxyCallback, remoteInterface) {
|
|
var messagePipe = core.createMessagePipe();
|
|
if (messagePipe.result != core.RESULT_OK)
|
|
throw new Error("createMessagePipe failed " + messagePipe.result);
|
|
|
|
var proxy = new remoteInterface.proxyClass;
|
|
var router = new Router(messagePipe.handle0);
|
|
var connection = new BaseConnection(undefined, proxy, router);
|
|
ProxyBindings(proxy).connection = connection;
|
|
if (proxyCallback)
|
|
proxyCallback(proxy);
|
|
|
|
return messagePipe.handle1;
|
|
}
|
|
|
|
// Return a handle for a message pipe that's connected to a stub for
|
|
// localInterface. Used by generated code for outgoing interface
|
|
// parameters: the caller is given the generated stub via
|
|
// |stubCallback(stub)| and the generated code sends the handle
|
|
// returned by this function. The caller is responsible for managing
|
|
// the lifetime of the stub and for setting it's implementation
|
|
// delegate with: StubBindings(stub).delegate = myImpl;
|
|
function bindImpl(stubCallback, localInterface) {
|
|
var messagePipe = core.createMessagePipe();
|
|
if (messagePipe.result != core.RESULT_OK)
|
|
throw new Error("createMessagePipe failed " + messagePipe.result);
|
|
|
|
var stub = new localInterface.stubClass;
|
|
var router = new Router(messagePipe.handle0);
|
|
var connection = new BaseConnection(stub, undefined, router);
|
|
StubBindings(stub).connection = connection;
|
|
if (stubCallback)
|
|
stubCallback(stub);
|
|
|
|
return messagePipe.handle1;
|
|
}
|
|
|
|
// Return a remoteInterface proxy for handle. Used by generated code
|
|
// for converting incoming interface parameters to proxies.
|
|
function bindHandleToProxy(handle, remoteInterface) {
|
|
if (!core.isHandle(handle))
|
|
throw new Error("Not a handle " + handle);
|
|
|
|
var proxy = new remoteInterface.proxyClass;
|
|
var router = new Router(handle);
|
|
var connection = new BaseConnection(undefined, proxy, router);
|
|
ProxyBindings(proxy).connection = connection;
|
|
return proxy;
|
|
}
|
|
|
|
// Return a localInterface stub for handle. Used by generated code
|
|
// for converting incoming interface& request parameters to localInterface
|
|
// stubs. The caller can specify the stub's implementation of localInterface
|
|
// like this: StubBindings(stub).delegate = myStubImpl.
|
|
function bindHandleToStub(handle, localInterface) {
|
|
if (!core.isHandle(handle))
|
|
throw new Error("Not a handle " + handle);
|
|
|
|
var stub = new localInterface.stubClass;
|
|
var router = new Router(handle);
|
|
var connection = new BaseConnection(stub, undefined, router);
|
|
StubBindings(stub).connection = connection;
|
|
return stub;
|
|
}
|
|
|
|
var exports = {};
|
|
exports.Connection = Connection;
|
|
exports.TestConnection = TestConnection;
|
|
|
|
exports.bindProxy = bindProxy;
|
|
exports.bindImpl = bindImpl;
|
|
exports.bindHandleToProxy = bindHandleToProxy;
|
|
exports.bindHandleToStub = bindHandleToStub;
|
|
return exports;
|
|
});
|