OLD | NEW |
| (Empty) |
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. | |
4 | |
5 define("mojo/services/public/js/service_provider", [ | |
6 "mojo/public/js/bindings", | |
7 "mojo/public/interfaces/application/service_provider.mojom", | |
8 "mojo/public/js/connection", | |
9 ], function(bindings, spMojom, connection) { | |
10 | |
11 const ProxyBindings = bindings.ProxyBindings; | |
12 const StubBindings = bindings.StubBindings; | |
13 const ServiceProviderInterface = spMojom.ServiceProvider; | |
14 | |
15 function checkServiceProvider(sp) { | |
16 if (!sp.providers_) | |
17 throw new Error("Service was closed"); | |
18 } | |
19 | |
20 class ServiceProvider { | |
21 constructor(servicesRequest, exposedServicesProxy) { | |
22 this.proxy = exposedServicesProxy; | |
23 this.providers_ = new Map(); // serviceName => see provideService() below | |
24 this.pendingRequests_ = new Map(); // serviceName => serviceHandle | |
25 if (servicesRequest) | |
26 StubBindings(servicesRequest).delegate = this; | |
27 } | |
28 | |
29 // Incoming requests | |
30 connectToService(serviceName, serviceHandle) { | |
31 if (!this.providers_) // We're closed. | |
32 return; | |
33 | |
34 var provider = this.providers_.get(serviceName); | |
35 if (!provider) { | |
36 this.pendingRequests_.set(serviceName, serviceHandle); | |
37 return; | |
38 } | |
39 | |
40 var stub = connection.bindHandleToStub(serviceHandle, provider.service); | |
41 StubBindings(stub).delegate = new provider.factory(); | |
42 provider.connections.push(StubBindings(stub).connection); | |
43 } | |
44 | |
45 provideService(service, factory) { | |
46 checkServiceProvider(this); | |
47 | |
48 var provider = { | |
49 service: service, // A JS bindings interface object. | |
50 factory: factory, // factory(clientProxy) => interface implemntation | |
51 connections: [], | |
52 }; | |
53 this.providers_.set(service.name, provider); | |
54 | |
55 if (this.pendingRequests_.has(service.name)) { | |
56 this.connectToService(service.name, pendingRequests_.get(service.name)); | |
57 pendingRequests_.delete(service.name); | |
58 } | |
59 return this; | |
60 } | |
61 | |
62 // Outgoing requests | |
63 requestService(interfaceObject, clientImpl) { | |
64 checkServiceProvider(this); | |
65 if (!interfaceObject.name) | |
66 throw new Error("Invalid service parameter"); | |
67 if (!clientImpl && interfaceObject.client) | |
68 throw new Error("Client implementation must be provided"); | |
69 | |
70 var serviceProxy; | |
71 var serviceHandle = connection.bindProxy( | |
72 function(sp) {serviceProxy = sp;}, interfaceObject); | |
73 this.proxy.connectToService(interfaceObject.name, serviceHandle); | |
74 return serviceProxy; | |
75 }; | |
76 | |
77 close() { | |
78 this.providers_ = null; | |
79 this.pendingRequests_ = null; | |
80 } | |
81 } | |
82 | |
83 var exports = {}; | |
84 exports.ServiceProvider = ServiceProvider; | |
85 return exports; | |
86 }); | |
OLD | NEW |