@dxos/client-services 0.1.29-next.ed4ce05 → 0.1.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/lib/browser/{chunk-ILMYW75X.mjs → chunk-ZIQUYEJS.mjs} +183 -94
  2. package/dist/lib/browser/{chunk-ILMYW75X.mjs.map → chunk-ZIQUYEJS.mjs.map} +4 -4
  3. package/dist/lib/browser/index.mjs +1 -1
  4. package/dist/lib/browser/meta.json +1 -1
  5. package/dist/lib/browser/packlets/testing/index.mjs +1 -1
  6. package/dist/lib/node/index.cjs +191 -104
  7. package/dist/lib/node/index.cjs.map +4 -4
  8. package/dist/lib/node/meta.json +1 -1
  9. package/dist/lib/node/packlets/testing/index.cjs +196 -100
  10. package/dist/lib/node/packlets/testing/index.cjs.map +4 -4
  11. package/dist/types/src/packlets/services/client-rpc-server.d.ts +22 -0
  12. package/dist/types/src/packlets/services/client-rpc-server.d.ts.map +1 -0
  13. package/dist/types/src/packlets/services/local-client-services.d.ts +2 -1
  14. package/dist/types/src/packlets/services/local-client-services.d.ts.map +1 -1
  15. package/dist/types/src/packlets/services/service-host.d.ts +21 -6
  16. package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
  17. package/dist/types/src/packlets/services/service-registry.d.ts +3 -1
  18. package/dist/types/src/packlets/services/service-registry.d.ts.map +1 -1
  19. package/dist/types/src/packlets/system/system-service.d.ts +2 -2
  20. package/dist/types/src/packlets/system/system-service.d.ts.map +1 -1
  21. package/dist/types/src/packlets/vault/iframe-host-runtime.d.ts +0 -1
  22. package/dist/types/src/packlets/vault/iframe-host-runtime.d.ts.map +1 -1
  23. package/dist/types/src/packlets/vault/worker-runtime.d.ts.map +1 -1
  24. package/dist/types/src/packlets/vault/worker-session.d.ts +4 -4
  25. package/dist/types/src/packlets/vault/worker-session.d.ts.map +1 -1
  26. package/package.json +30 -30
  27. package/src/packlets/services/client-rpc-server.ts +91 -0
  28. package/src/packlets/services/local-client-services.ts +4 -0
  29. package/src/packlets/services/service-host.ts +51 -10
  30. package/src/packlets/services/service-registry.ts +9 -1
  31. package/src/packlets/system/system-service.ts +3 -3
  32. package/src/packlets/tests/shared-worker.test.ts +39 -42
  33. package/src/packlets/vault/iframe-host-runtime.ts +25 -34
  34. package/src/packlets/vault/worker-runtime.ts +5 -15
  35. package/src/packlets/vault/worker-session.ts +40 -28
@@ -0,0 +1,22 @@
1
+ import { ClientServices } from '@dxos/client';
2
+ import { Any, Stream } from '@dxos/codec-protobuf';
3
+ import { RpcPeerOptions } from '@dxos/rpc';
4
+ import { MaybePromise } from '@dxos/util';
5
+ import { ServiceRegistry } from './service-registry';
6
+ export declare type ClientRpcServerParams = {
7
+ serviceRegistry: ServiceRegistry<ClientServices>;
8
+ handleCall?: (method: string, params: Any, handler: (method: string, params: Any) => MaybePromise<Any>) => Promise<Any>;
9
+ handleStream?: (method: string, params: Any, handler: (method: string, params: Any) => Stream<Any>) => MaybePromise<Stream<Any>>;
10
+ } & Omit<RpcPeerOptions, 'callHandler' | 'streamHandler'>;
11
+ export declare class ClientRpcServer {
12
+ private readonly _serviceRegistry;
13
+ private readonly _rpcPeer;
14
+ private readonly _handlerCache;
15
+ private readonly _handleCall;
16
+ private readonly _handleStream;
17
+ constructor(params: ClientRpcServerParams);
18
+ open(): Promise<void>;
19
+ close(): Promise<void>;
20
+ private _getServiceHandler;
21
+ }
22
+ //# sourceMappingURL=client-rpc-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-rpc-server.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/services/client-rpc-server.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAkB,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnE,OAAO,EAA4B,cAAc,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,oBAAY,qBAAqB,GAAG;IAClC,eAAe,EAAE,eAAe,CAAC,cAAc,CAAC,CAAC;IACjD,UAAU,CAAC,EAAE,CACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,GAAG,EACX,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,YAAY,CAAC,GAAG,CAAC,KACxD,OAAO,CAAC,GAAG,CAAC,CAAC;IAClB,YAAY,CAAC,EAAE,CACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,GAAG,EACX,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,KAClD,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;CAChC,GAAG,IAAI,CAAC,cAAc,EAAE,aAAa,GAAG,eAAe,CAAC,CAAC;AAE1D,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkC;IACnE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0C;IACxE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;IAClE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwC;gBAE1D,MAAM,EAAE,qBAAqB;IAgCnC,IAAI;IAIJ,KAAK;IAIX,OAAO,CAAC,kBAAkB;CAiB3B"}
@@ -1,6 +1,6 @@
1
1
  import { ClientServices, ClientServicesProvider } from '@dxos/client';
2
2
  import { ServiceBundle } from '@dxos/rpc';
3
- import { ClientServicesHostParams } from './service-host';
3
+ import { ClientServicesHost, ClientServicesHostParams } from './service-host';
4
4
  /**
5
5
  * Starts a local instance of the service host.
6
6
  */
@@ -9,6 +9,7 @@ export declare class LocalClientServices implements ClientServicesProvider {
9
9
  constructor(params: ClientServicesHostParams);
10
10
  get descriptors(): ServiceBundle<ClientServices>;
11
11
  get services(): Partial<ClientServices>;
12
+ get host(): ClientServicesHost;
12
13
  open(): Promise<void>;
13
14
  close(): Promise<void>;
14
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"local-client-services.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/services/local-client-services.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAsB,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE9E;;GAEG;AACH,qBAAa,mBAAoB,YAAW,sBAAsB;IAChE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;gBAE/B,MAAM,EAAE,wBAAwB;IAI5C,IAAI,WAAW,IAAI,aAAa,CAAC,cAAc,CAAC,CAE/C;IAED,IAAI,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC,CAEtC;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
1
+ {"version":3,"file":"local-client-services.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/services/local-client-services.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE9E;;GAEG;AACH,qBAAa,mBAAoB,YAAW,sBAAsB;IAChE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;gBAE/B,MAAM,EAAE,wBAAwB;IAI5C,IAAI,WAAW,IAAI,aAAa,CAAC,cAAc,CAAC,CAE/C;IAED,IAAI,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC,CAEtC;IAED,IAAI,IAAI,IAAI,kBAAkB,CAE7B;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -3,13 +3,21 @@ import { Config } from '@dxos/config';
3
3
  import { ModelFactory } from '@dxos/model-factory';
4
4
  import { NetworkManager } from '@dxos/network-manager';
5
5
  import { Storage } from '@dxos/random-access-storage';
6
+ import { ServiceRegistry } from './service-registry';
6
7
  export declare type ClientServicesHostParams = {
7
- config: Config;
8
+ /**
9
+ * Can be omitted if `initialize` is later called.
10
+ */
11
+ config?: Config;
8
12
  modelFactory?: ModelFactory;
9
- networkManager: NetworkManager;
13
+ networkManager?: NetworkManager;
10
14
  storage?: Storage;
11
15
  lockKey?: string;
12
16
  };
17
+ export declare type InitializeOptions = {
18
+ config?: Config;
19
+ networkManager?: NetworkManager;
20
+ };
13
21
  /**
14
22
  * Remote service implementation.
15
23
  */
@@ -17,16 +25,23 @@ export declare class ClientServicesHost {
17
25
  private readonly _resourceLock?;
18
26
  private readonly _serviceRegistry;
19
27
  private readonly _systemService;
20
- private readonly _config;
28
+ private _config?;
21
29
  private readonly _statusUpdate;
22
30
  private readonly _modelFactory;
23
- private readonly _networkManager;
24
- private readonly _storage;
31
+ private _networkManager?;
32
+ private _storage?;
25
33
  private _open;
26
- constructor({ config, modelFactory, networkManager, storage, lockKey }: ClientServicesHostParams);
34
+ constructor({ config, modelFactory, networkManager, storage, lockKey }?: ClientServicesHostParams);
27
35
  get isOpen(): boolean;
36
+ get serviceRegistry(): ServiceRegistry<ClientServices>;
28
37
  get descriptors(): import("@dxos/rpc").ServiceBundle<ClientServices>;
29
38
  get services(): Partial<ClientServices>;
39
+ /**
40
+ * Initialize the service host with the config.
41
+ * Config can also be provided in the constructor.
42
+ * Can only be called once.
43
+ */
44
+ initialize({ config, networkManager }: InitializeOptions): void;
30
45
  open(): Promise<void>;
31
46
  close(): Promise<void>;
32
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"service-host.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/services/service-host.ts"],"names":[],"mappings":"AAOA,OAAO,EAAuB,cAAc,EAA6B,MAAM,cAAc,CAAC;AAC9F,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAItC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAetD,oBAAY,wBAAwB,GAAG;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,cAAc,EAAE,cAAc,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAoB;IACnD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkC;IACnE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoB;IAEnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IAMnC,OAAO,CAAC,KAAK,CAAS;gBAEV,EACV,MAAM,EACN,YAA0C,EAE1C,cAAc,EACd,OAAiF,EAEjF,OAAO,EACR,EAAE,wBAAwB;IAyC3B,IAAI,MAAM,YAET;IAED,IAAI,WAAW,sDAEd;IAED,IAAI,QAAQ,4BAEX;IAEK,IAAI;IA6DJ,KAAK;CAaZ"}
1
+ {"version":3,"file":"service-host.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/services/service-host.ts"],"names":[],"mappings":"AAOA,OAAO,EAAuB,cAAc,EAA6B,MAAM,cAAc,CAAC;AAC9F,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAItC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAatD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,oBAAY,wBAAwB,GAAG;IACrC;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,oBAAY,iBAAiB,GAAG;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC,CAAC;AAEF;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAoB;IACnD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkC;IACnE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoB;IAEnD,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,CAAU;IAM3B,OAAO,CAAC,KAAK,CAAS;gBAEV,EACV,MAAM,EACN,YAA0C,EAE1C,cAAc,EACd,OAAO,EAEP,OAAO,EACR,GAAE,wBAA6B;IA2ChC,IAAI,MAAM,YAET;IAED,IAAI,eAAe,oCAElB;IAED,IAAI,WAAW,sDAEd;IAED,IAAI,QAAQ,4BAEX;IAED;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,iBAAiB;IAkBlD,IAAI;IAiEJ,KAAK;CAaZ"}
@@ -5,9 +5,11 @@ import { ServiceBundle } from '@dxos/rpc';
5
5
  export declare class ServiceRegistry<Services> {
6
6
  private readonly _serviceBundle;
7
7
  private _handlers;
8
- constructor(_serviceBundle: ServiceBundle<Services>, _handlers: Partial<Services>);
8
+ constructor(_serviceBundle: ServiceBundle<Services>, _handlers?: Partial<Services>);
9
9
  get descriptors(): ServiceBundle<Services>;
10
10
  get services(): Partial<Services>;
11
11
  setServices(services: Partial<Services>): void;
12
+ addService(name: keyof Services, service: Services[keyof Services]): void;
13
+ removeService(name: keyof Services): void;
12
14
  }
13
15
  //# sourceMappingURL=service-registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"service-registry.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/services/service-registry.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C;;GAEG;AACH,qBAAa,eAAe,CAAC,QAAQ;IAGjC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,SAAS;gBADA,cAAc,EAAE,aAAa,CAAC,QAAQ,CAAC,EAChD,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC;IAGtC,IAAI,WAAW,4BAEd;IAED,IAAI,QAAQ,sBAEX;IAED,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC;CAGxC"}
1
+ {"version":3,"file":"service-registry.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/services/service-registry.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C;;GAEG;AACH,qBAAa,eAAe,CAAC,QAAQ;IAGjC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,SAAS;gBADA,cAAc,EAAE,aAAa,CAAC,QAAQ,CAAC,EAChD,SAAS,GAAE,OAAO,CAAC,QAAQ,CAAM;IAG3C,IAAI,WAAW,4BAEd;IAED,IAAI,QAAQ,sBAEX;IAED,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC;IAIvC,UAAU,CAAC,IAAI,EAAE,MAAM,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,QAAQ,CAAC;IAIlE,aAAa,CAAC,IAAI,EAAE,MAAM,QAAQ;CAGnC"}
@@ -4,7 +4,7 @@ import { Config } from '@dxos/config';
4
4
  import { SystemStatus, SystemStatusResponse, SystemService, UpdateSystemStatusRequest } from '@dxos/protocols/proto/dxos/client/services';
5
5
  import { MaybePromise } from '@dxos/util';
6
6
  export declare type SystemServiceOptions = {
7
- config: Config;
7
+ config?: Config;
8
8
  statusUpdate: Event<void>;
9
9
  getCurrentStatus: () => SystemStatus;
10
10
  onUpdateStatus: (status: SystemStatus) => MaybePromise<void>;
@@ -14,7 +14,7 @@ export declare type SystemServiceOptions = {
14
14
  *
15
15
  */
16
16
  export declare class SystemServiceImpl implements SystemService {
17
- private readonly _config;
17
+ private readonly _config?;
18
18
  private readonly _statusUpdate;
19
19
  private readonly _getCurrentStatus;
20
20
  private readonly _onUpdateStatus;
@@ -1 +1 @@
1
- {"version":3,"file":"system-service.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/system/system-service.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,yBAAyB,EAC1B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,oBAAY,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,gBAAgB,EAAE,MAAM,YAAY,CAAC;IACrC,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;IAC7D,OAAO,EAAE,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;CACnC,CAAC;AAEF;;GAEG;AACH,qBAAa,iBAAkB,YAAW,aAAa;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuC;IACrE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA2C;IAC7E,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyC;IACzE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;gBAE/C,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,oBAAoB;IAQ/F,SAAS;IAIT,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE,yBAAyB;IAIxD,WAAW,IAAI,MAAM,CAAC,oBAAoB,CAAC;IAiBrC,KAAK;CAGZ"}
1
+ {"version":3,"file":"system-service.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/system/system-service.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,yBAAyB,EAC1B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,oBAAY,oBAAoB,GAAG;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,gBAAgB,EAAE,MAAM,YAAY,CAAC;IACrC,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;IAC7D,OAAO,EAAE,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;CACnC,CAAC;AAEF;;GAEG;AACH,qBAAa,iBAAkB,YAAW,aAAa;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAiC;IAC1D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuC;IACrE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA2C;IAC7E,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyC;IACzE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;gBAE/C,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,oBAAoB;IAQ/F,SAAS;IAIT,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE,yBAAyB;IAIxD,WAAW,IAAI,MAAM,CAAC,oBAAoB,CAAC;IAiBrC,KAAK;CAGZ"}
@@ -18,7 +18,6 @@ export declare class IFrameHostRuntime {
18
18
  private readonly _configProvider;
19
19
  private readonly _transportFactory;
20
20
  private readonly _ready;
21
- private readonly _getService;
22
21
  private readonly _appPort;
23
22
  private readonly _shellPort?;
24
23
  private _config;
@@ -1 +1 @@
1
- {"version":3,"file":"iframe-host-runtime.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/vault/iframe-host-runtime.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAItC,OAAO,EAAoC,OAAO,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAiB,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,YAAY,EAAoB,MAAM,iBAAiB,CAAC;AAIjE,oBAAY,uBAAuB,GAAG;IACpC,cAAc,EAAE,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF;;;;;GAKG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IACrE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAkC;IACpE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAEN;IAEtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAU;IACtC,OAAO,CAAC,OAAO,CAAU;IAGzB,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,aAAa,CAAC,CAAmB;IAGlC,MAAM,CAAC,EAAE,MAAM,CAAC;gBAEX,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,uBAAuB;IAwB3E,IAAI,QAAQ,wBAEX;IAED,IAAI,KAAK,IAAI,YAAY,GAAG,SAAS,CAEpC;IAEK,KAAK;IA2CL,IAAI;CAOX"}
1
+ {"version":3,"file":"iframe-host-runtime.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/vault/iframe-host-runtime.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAItC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAiB,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,YAAY,EAAoB,MAAM,iBAAiB,CAAC;AAIjE,oBAAY,uBAAuB,GAAG;IACpC,cAAc,EAAE,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF;;;;;GAKG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IACrE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAkC;IACpE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAE3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAU;IACtC,OAAO,CAAC,OAAO,CAAU;IAGzB,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,aAAa,CAAC,CAAmB;IAGlC,MAAM,CAAC,EAAE,MAAM,CAAC;gBAEX,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,uBAAuB;IAU3E,IAAI,QAAQ,wBAEX;IAED,IAAI,KAAK,IAAI,YAAY,GAAG,SAAS,CAEpC;IAEK,KAAK;IAmDL,IAAI;CAOX"}
@@ -1 +1 @@
1
- {"version":3,"file":"worker-runtime.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/vault/worker-runtime.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAItC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM1C,oBAAY,mBAAmB,GAAG;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,qBAAa,aAAa;IAUtB,OAAO,CAAC,QAAQ,CAAC,eAAe;IATlC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAqC;IACvE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IACrD,OAAO,CAAC,qBAAqB,CAAC,CAAgB;IAC9C,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,OAAO,CAAU;gBAIN,eAAe,EAAE,MAAM,YAAY,CAAC,MAAM,CAAC;IAGxD,KAAK;IAyBL,IAAI;IAKV;;OAEG;IACG,aAAa,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,mBAAmB;IAiC3E;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAmBzB"}
1
+ {"version":3,"file":"worker-runtime.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/vault/worker-runtime.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAItC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM1C,oBAAY,mBAAmB,GAAG;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,qBAAa,aAAa;IAUtB,OAAO,CAAC,QAAQ,CAAC,eAAe;IATlC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAqC;IACvE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IACrD,OAAO,CAAC,qBAAqB,CAAC,CAAgB;IAC9C,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,OAAO,CAAU;gBAIN,eAAe,EAAE,MAAM,YAAY,CAAC,MAAM,CAAC;IAKxD,KAAK;IAyBL,IAAI;IAKV;;OAEG;IACG,aAAa,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,mBAAmB;IAqB3E;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAmBzB"}
@@ -1,10 +1,10 @@
1
1
  import { Trigger } from '@dxos/async';
2
- import { ClientServices } from '@dxos/client';
3
2
  import { BridgeService } from '@dxos/protocols/proto/dxos/mesh/bridge';
4
3
  import { RpcPort } from '@dxos/rpc';
5
4
  import { Callback } from '@dxos/util';
5
+ import { ClientServicesHost } from '../services';
6
6
  export declare type WorkerSessionParams = {
7
- getService: <Service>(find: (services: Partial<ClientServices>) => Service | undefined) => Promise<Service>;
7
+ serviceHost: ClientServicesHost;
8
8
  systemPort: RpcPort;
9
9
  appPort: RpcPort;
10
10
  shellPort: RpcPort;
@@ -21,13 +21,13 @@ export declare class WorkerSession {
21
21
  private readonly _shellClientRpc;
22
22
  private readonly _iframeRpc;
23
23
  private readonly _startTrigger;
24
- private readonly _getService;
24
+ private readonly _serviceHost;
25
25
  private readonly _options;
26
26
  private _heartbeatTimer?;
27
27
  readonly onClose: Callback<() => Promise<void>>;
28
28
  origin?: string;
29
29
  bridgeService?: BridgeService;
30
- constructor({ getService, systemPort, appPort, shellPort, options }: WorkerSessionParams);
30
+ constructor({ serviceHost, systemPort, appPort, shellPort, readySignal, options }: WorkerSessionParams);
31
31
  open(): Promise<void>;
32
32
  close(): Promise<void>;
33
33
  private _maybeOpenShell;
@@ -1 +1 @@
1
- {"version":3,"file":"worker-session.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/vault/worker-session.ts"],"names":[],"mappings":"AAMA,OAAO,EAAgB,OAAO,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAEL,cAAc,EAIf,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACvE,OAAO,EAAoC,OAAO,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,oBAAY,mBAAmB,GAAG;IAChC,UAAU,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,KAAK,OAAO,GAAG,SAAS,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5G,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE;QACR,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA+B;IAC1D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA+B;IAC/D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoC;IAC/D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiB;IAC/C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoC;IAChE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8C;IACvE,OAAO,CAAC,eAAe,CAAC,CAAiB;IAEzC,SAAgB,OAAO,iBAAsB,QAAQ,IAAI,CAAC,EAAI;IAGvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,aAAa,CAAC,EAAE,aAAa,CAAC;gBAEzB,EACV,UAAU,EACV,UAAU,EACV,OAAO,EACP,SAAS,EACT,OAEC,EACF,EAAE,mBAAmB;IAkDhB,IAAI;IAuBJ,KAAK;YAeG,eAAe;CAO9B"}
1
+ {"version":3,"file":"worker-session.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/vault/worker-session.ts"],"names":[],"mappings":"AAMA,OAAO,EAAgB,OAAO,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACvE,OAAO,EAAoC,OAAO,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGjD,oBAAY,mBAAmB,GAAG;IAChC,WAAW,EAAE,kBAAkB,CAAC;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE;QACR,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoC;IAC/D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiB;IAC/C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8C;IACvE,OAAO,CAAC,eAAe,CAAC,CAAiB;IAEzC,SAAgB,OAAO,iBAAsB,QAAQ,IAAI,CAAC,EAAI;IAGvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,aAAa,CAAC,EAAE,aAAa,CAAC;gBAEzB,EACV,WAAW,EACX,UAAU,EACV,OAAO,EACP,SAAS,EACT,WAAW,EACX,OAEC,EACF,EAAE,mBAAmB;IAgEhB,IAAI;IAuBJ,KAAK;YAeG,eAAe;CAO9B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/client-services",
3
- "version": "0.1.29-next.ed4ce05",
3
+ "version": "0.1.29",
4
4
  "description": "DXOS client services implementation",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -20,38 +20,38 @@
20
20
  "src"
21
21
  ],
22
22
  "dependencies": {
23
- "@dxos/async": "0.1.29-next.ed4ce05",
24
- "@dxos/client": "0.1.29-next.ed4ce05",
25
- "@dxos/codec-protobuf": "0.1.29-next.ed4ce05",
26
- "@dxos/config": "0.1.29-next.ed4ce05",
27
- "@dxos/context": "0.1.29-next.ed4ce05",
28
- "@dxos/credentials": "0.1.29-next.ed4ce05",
29
- "@dxos/crypto": "0.1.29-next.ed4ce05",
30
- "@dxos/debug": "0.1.29-next.ed4ce05",
31
- "@dxos/document-model": "0.1.29-next.ed4ce05",
32
- "@dxos/echo-db": "0.1.29-next.ed4ce05",
33
- "@dxos/echo-pipeline": "0.1.29-next.ed4ce05",
34
- "@dxos/errors": "0.1.29-next.ed4ce05",
35
- "@dxos/feed-store": "0.1.29-next.ed4ce05",
36
- "@dxos/keyring": "0.1.29-next.ed4ce05",
37
- "@dxos/keys": "0.1.29-next.ed4ce05",
38
- "@dxos/log": "0.1.29-next.ed4ce05",
39
- "@dxos/messaging": "0.1.29-next.ed4ce05",
40
- "@dxos/model-factory": "0.1.29-next.ed4ce05",
41
- "@dxos/network-manager": "0.1.29-next.ed4ce05",
42
- "@dxos/node-std": "0.1.29-next.ed4ce05",
43
- "@dxos/protocols": "0.1.29-next.ed4ce05",
44
- "@dxos/random-access-storage": "0.1.29-next.ed4ce05",
45
- "@dxos/rpc": "0.1.29-next.ed4ce05",
46
- "@dxos/teleport": "0.1.29-next.ed4ce05",
47
- "@dxos/teleport-extension-presence": "0.1.29-next.ed4ce05",
48
- "@dxos/text-model": "0.1.29-next.ed4ce05",
49
- "@dxos/timeframe": "0.1.29-next.ed4ce05",
50
- "@dxos/util": "0.1.29-next.ed4ce05"
23
+ "@dxos/async": "0.1.29",
24
+ "@dxos/client": "0.1.29",
25
+ "@dxos/codec-protobuf": "0.1.29",
26
+ "@dxos/config": "0.1.29",
27
+ "@dxos/context": "0.1.29",
28
+ "@dxos/credentials": "0.1.29",
29
+ "@dxos/crypto": "0.1.29",
30
+ "@dxos/debug": "0.1.29",
31
+ "@dxos/document-model": "0.1.29",
32
+ "@dxos/echo-db": "0.1.29",
33
+ "@dxos/echo-pipeline": "0.1.29",
34
+ "@dxos/errors": "0.1.29",
35
+ "@dxos/feed-store": "0.1.29",
36
+ "@dxos/keyring": "0.1.29",
37
+ "@dxos/keys": "0.1.29",
38
+ "@dxos/log": "0.1.29",
39
+ "@dxos/messaging": "0.1.29",
40
+ "@dxos/model-factory": "0.1.29",
41
+ "@dxos/network-manager": "0.1.29",
42
+ "@dxos/node-std": "0.1.29",
43
+ "@dxos/protocols": "0.1.29",
44
+ "@dxos/random-access-storage": "0.1.29",
45
+ "@dxos/rpc": "0.1.29",
46
+ "@dxos/teleport": "0.1.29",
47
+ "@dxos/teleport-extension-presence": "0.1.29",
48
+ "@dxos/text-model": "0.1.29",
49
+ "@dxos/timeframe": "0.1.29",
50
+ "@dxos/util": "0.1.29"
51
51
  },
52
52
  "devDependencies": {
53
53
  "@types/readable-stream": "^2.3.9",
54
- "@dxos/signal": "0.1.29-next.ed4ce05"
54
+ "@dxos/signal": "0.1.29"
55
55
  },
56
56
  "publishConfig": {
57
57
  "access": "public"
@@ -0,0 +1,91 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { ClientServices } from '@dxos/client';
6
+ import { Any, ServiceHandler, Stream } from '@dxos/codec-protobuf';
7
+ import { raise } from '@dxos/debug';
8
+ import { parseMethodName, RpcPeer, RpcPeerOptions } from '@dxos/rpc';
9
+ import { MaybePromise } from '@dxos/util';
10
+
11
+ import { ServiceRegistry } from './service-registry';
12
+
13
+ export type ClientRpcServerParams = {
14
+ serviceRegistry: ServiceRegistry<ClientServices>;
15
+ handleCall?: (
16
+ method: string,
17
+ params: Any,
18
+ handler: (method: string, params: Any) => MaybePromise<Any>
19
+ ) => Promise<Any>;
20
+ handleStream?: (
21
+ method: string,
22
+ params: Any,
23
+ handler: (method: string, params: Any) => Stream<Any>
24
+ ) => MaybePromise<Stream<Any>>;
25
+ } & Omit<RpcPeerOptions, 'callHandler' | 'streamHandler'>;
26
+
27
+ export class ClientRpcServer {
28
+ private readonly _serviceRegistry: ServiceRegistry<ClientServices>;
29
+ private readonly _rpcPeer: RpcPeer;
30
+ private readonly _handlerCache = new Map<string, ServiceHandler<any>>();
31
+ private readonly _handleCall: ClientRpcServerParams['handleCall'];
32
+ private readonly _handleStream: ClientRpcServerParams['handleStream'];
33
+
34
+ constructor(params: ClientRpcServerParams) {
35
+ const { serviceRegistry, handleCall, handleStream, ...rpcOptions } = params;
36
+ this._handleCall = handleCall;
37
+ this._handleStream = handleStream;
38
+
39
+ this._serviceRegistry = serviceRegistry;
40
+ this._rpcPeer = new RpcPeer({
41
+ ...rpcOptions,
42
+ callHandler: (method, params) => {
43
+ const [serviceName, methodName] = parseMethodName(method);
44
+ const handler = (method: string, params: Any) => this._getServiceHandler(serviceName).call(method, params);
45
+
46
+ if (this._handleCall) {
47
+ return this._handleCall(methodName, params, handler);
48
+ } else {
49
+ return handler(methodName, params);
50
+ }
51
+ },
52
+ streamHandler: (method, params) => {
53
+ const [serviceName, methodName] = parseMethodName(method);
54
+ const handler = (method: string, params: Any) =>
55
+ this._getServiceHandler(serviceName).callStream(method, params);
56
+
57
+ if (this._handleStream) {
58
+ return Stream.unwrapPromise(this._handleStream(methodName, params, handler));
59
+ } else {
60
+ return handler(methodName, params);
61
+ }
62
+ }
63
+ });
64
+ }
65
+
66
+ async open() {
67
+ await this._rpcPeer.open();
68
+ }
69
+
70
+ async close() {
71
+ await this._rpcPeer.close();
72
+ }
73
+
74
+ private _getServiceHandler(serviceName: string) {
75
+ if (!this._handlerCache.has(serviceName)) {
76
+ const [key, descriptor] =
77
+ Object.entries(this._serviceRegistry.descriptors).find(
78
+ ([key, descriptor]) => descriptor.name === serviceName
79
+ ) ?? raise(new Error(`Service not available: ${serviceName}`));
80
+
81
+ const service = this._serviceRegistry.services[key as keyof ClientServices];
82
+ if (!service) {
83
+ throw new Error(`Service not available: ${serviceName}`);
84
+ }
85
+
86
+ this._handlerCache.set(serviceName, descriptor.createServer(service as any));
87
+ }
88
+
89
+ return this._handlerCache.get(serviceName)!;
90
+ }
91
+ }
@@ -25,6 +25,10 @@ export class LocalClientServices implements ClientServicesProvider {
25
25
  return this._host.services;
26
26
  }
27
27
 
28
+ get host(): ClientServicesHost {
29
+ return this._host;
30
+ }
31
+
28
32
  async open(): Promise<void> {
29
33
  await this._host.open();
30
34
  }
@@ -29,13 +29,21 @@ import { ServiceContext } from './service-context';
29
29
  import { ServiceRegistry } from './service-registry';
30
30
 
31
31
  export type ClientServicesHostParams = {
32
- config: Config;
32
+ /**
33
+ * Can be omitted if `initialize` is later called.
34
+ */
35
+ config?: Config;
33
36
  modelFactory?: ModelFactory;
34
- networkManager: NetworkManager;
37
+ networkManager?: NetworkManager;
35
38
  storage?: Storage;
36
39
  lockKey?: string;
37
40
  };
38
41
 
42
+ export type InitializeOptions = {
43
+ config?: Config;
44
+ networkManager?: NetworkManager;
45
+ };
46
+
39
47
  /**
40
48
  * Remote service implementation.
41
49
  */
@@ -44,11 +52,11 @@ export class ClientServicesHost {
44
52
  private readonly _serviceRegistry: ServiceRegistry<ClientServices>;
45
53
  private readonly _systemService: SystemServiceImpl;
46
54
 
47
- private readonly _config: Config;
55
+ private _config?: Config;
48
56
  private readonly _statusUpdate = new Event<void>();
49
57
  private readonly _modelFactory: ModelFactory;
50
- private readonly _networkManager: NetworkManager;
51
- private readonly _storage: Storage;
58
+ private _networkManager?: NetworkManager;
59
+ private _storage?: Storage;
52
60
 
53
61
  /**
54
62
  * @internal
@@ -61,14 +69,16 @@ export class ClientServicesHost {
61
69
  modelFactory = createDefaultModelFactory(),
62
70
  // TODO(burdon): Create ApolloLink abstraction (see Client).
63
71
  networkManager,
64
- storage = createStorageObjects(config.get('runtime.client.storage', {})!).storage,
72
+ storage,
65
73
  // TODO(wittjosiah): Turn this on by default.
66
74
  lockKey
67
- }: ClientServicesHostParams) {
68
- this._config = config;
69
- this._modelFactory = modelFactory;
70
- this._networkManager = networkManager;
75
+ }: ClientServicesHostParams = {}) {
71
76
  this._storage = storage;
77
+ this._modelFactory = modelFactory;
78
+
79
+ if (config) {
80
+ this.initialize({ config, networkManager });
81
+ }
72
82
 
73
83
  this._resourceLock = lockKey
74
84
  ? new VaultResourceLock({
@@ -109,6 +119,10 @@ export class ClientServicesHost {
109
119
  return this._open;
110
120
  }
111
121
 
122
+ get serviceRegistry() {
123
+ return this._serviceRegistry;
124
+ }
125
+
112
126
  get descriptors() {
113
127
  return this._serviceRegistry.descriptors;
114
128
  }
@@ -117,11 +131,38 @@ export class ClientServicesHost {
117
131
  return this._serviceRegistry.services;
118
132
  }
119
133
 
134
+ /**
135
+ * Initialize the service host with the config.
136
+ * Config can also be provided in the constructor.
137
+ * Can only be called once.
138
+ */
139
+ initialize({ config, networkManager }: InitializeOptions) {
140
+ assert(!this._open, 'service host is open');
141
+
142
+ if (config) {
143
+ assert(!this._config, 'config already set');
144
+
145
+ this._config = config;
146
+ if (!this._storage) {
147
+ this._storage = createStorageObjects(config.get('runtime.client.storage', {})!).storage;
148
+ }
149
+ }
150
+
151
+ if (networkManager) {
152
+ assert(!this._networkManager, 'network manager already set');
153
+ this._networkManager = networkManager;
154
+ }
155
+ }
156
+
120
157
  async open() {
121
158
  if (this._open) {
122
159
  return;
123
160
  }
124
161
 
162
+ assert(this._config, 'config not set');
163
+ assert(this._storage, 'storage not set');
164
+ assert(this._networkManager, 'network manager not set');
165
+
125
166
  log('opening...');
126
167
  await this._resourceLock?.acquire();
127
168
 
@@ -11,7 +11,7 @@ export class ServiceRegistry<Services> {
11
11
  // prettier-ignore
12
12
  constructor (
13
13
  private readonly _serviceBundle: ServiceBundle<Services>,
14
- private _handlers: Partial<Services>
14
+ private _handlers: Partial<Services> = {}
15
15
  ) {}
16
16
 
17
17
  get descriptors() {
@@ -25,4 +25,12 @@ export class ServiceRegistry<Services> {
25
25
  setServices(services: Partial<Services>) {
26
26
  this._handlers = services;
27
27
  }
28
+
29
+ addService(name: keyof Services, service: Services[keyof Services]) {
30
+ this._handlers[name] = service;
31
+ }
32
+
33
+ removeService(name: keyof Services) {
34
+ delete this._handlers[name];
35
+ }
28
36
  }
@@ -14,7 +14,7 @@ import {
14
14
  import { MaybePromise } from '@dxos/util';
15
15
 
16
16
  export type SystemServiceOptions = {
17
- config: Config;
17
+ config?: Config;
18
18
  statusUpdate: Event<void>;
19
19
  getCurrentStatus: () => SystemStatus;
20
20
  onUpdateStatus: (status: SystemStatus) => MaybePromise<void>;
@@ -25,7 +25,7 @@ export type SystemServiceOptions = {
25
25
  *
26
26
  */
27
27
  export class SystemServiceImpl implements SystemService {
28
- private readonly _config: SystemServiceOptions['config'];
28
+ private readonly _config?: SystemServiceOptions['config'];
29
29
  private readonly _statusUpdate: SystemServiceOptions['statusUpdate'];
30
30
  private readonly _getCurrentStatus: SystemServiceOptions['getCurrentStatus'];
31
31
  private readonly _onUpdateStatus: SystemServiceOptions['onUpdateStatus'];
@@ -40,7 +40,7 @@ export class SystemServiceImpl implements SystemService {
40
40
  }
41
41
 
42
42
  async getConfig() {
43
- return this._config.values;
43
+ return this._config?.values ?? {};
44
44
  }
45
45
 
46
46
  async updateStatus({ status }: UpdateSystemStatusRequest) {