1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 define("mojo/services/public/js/service_exchange", [
6 "mojo/public/js/bindings",
7 "mojo/public/interfaces/application/service_provider.mojom",
8 "mojo/public/js/connection",
9 ], function(bindings
, spMojom
, connection
) {
11 const ProxyBindings
= bindings
.ProxyBindings
;
12 const StubBindings
= bindings
.StubBindings
;
13 const ServiceProviderInterface
= spMojom
.ServiceProvider
;
15 function checkServiceExchange(exch
) {
17 throw new Error("Service was closed");
20 class ServiceExchange
{
21 constructor(servicesRequest
, exposedServicesProxy
) {
22 this.proxy
= exposedServicesProxy
;
23 this.providers_
= new Map(); // serviceName => see provideService() below
24 this.pendingRequests_
= new Map(); // serviceName => serviceHandle
26 StubBindings(servicesRequest
).delegate
= this;
30 connectToService(serviceName
, serviceHandle
) {
31 if (!this.providers_
) // We're closed.
34 var provider
= this.providers_
.get(serviceName
);
36 this.pendingRequests_
.set(serviceName
, serviceHandle
);
40 var stub
= connection
.bindHandleToStub(serviceHandle
, provider
.service
);
41 StubBindings(stub
).delegate
= new provider
.factory();
42 provider
.connections
.push(StubBindings(stub
).connection
);
45 provideService(service
, factory
) {
46 checkServiceExchange(this);
49 service
: service
, // A JS bindings interface object.
50 factory
: factory
, // factory() => interface implemntation
53 this.providers_
.set(service
.name
, provider
);
55 if (this.pendingRequests_
.has(service
.name
)) {
56 this.connectToService(service
.name
, pendingRequests_
.get(service
.name
));
57 pendingRequests_
.delete(service
.name
);
63 requestService(interfaceObject
) {
64 checkServiceExchange(this);
65 if (!interfaceObject
.name
)
66 throw new Error("Invalid service parameter");
69 var serviceHandle
= connection
.bindProxy(
70 function(sp
) {serviceProxy
= sp
;}, interfaceObject
);
71 this.proxy
.connectToService(interfaceObject
.name
, serviceHandle
);
76 this.providers_
= null;
77 this.pendingRequests_
= null;
82 exports
.ServiceExchange
= ServiceExchange
;