@dxos/client-services 0.1.28 → 0.1.30-next.7c60cd3

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 (36) hide show
  1. package/dist/lib/browser/{chunk-OTSGRZZI.mjs → chunk-JLLUQQXD.mjs} +29 -9
  2. package/dist/lib/browser/{chunk-OTSGRZZI.mjs.map → chunk-JLLUQQXD.mjs.map} +4 -4
  3. package/dist/lib/browser/index.mjs +3 -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 +28 -7
  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 +26 -7
  10. package/dist/lib/node/packlets/testing/index.cjs.map +4 -4
  11. package/dist/types/src/packlets/devices/devices-service.test.d.ts +2 -0
  12. package/dist/types/src/packlets/devices/devices-service.test.d.ts.map +1 -0
  13. package/dist/types/src/packlets/identity/identity-service.test.d.ts +2 -0
  14. package/dist/types/src/packlets/identity/identity-service.test.d.ts.map +1 -0
  15. package/dist/types/src/packlets/network/network-service.test.d.ts +2 -0
  16. package/dist/types/src/packlets/network/network-service.test.d.ts.map +1 -0
  17. package/dist/types/src/packlets/services/index.d.ts +1 -0
  18. package/dist/types/src/packlets/services/index.d.ts.map +1 -1
  19. package/dist/types/src/packlets/services/local-client-services.d.ts +15 -0
  20. package/dist/types/src/packlets/services/local-client-services.d.ts.map +1 -0
  21. package/dist/types/src/packlets/services/service-host.d.ts +3 -4
  22. package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
  23. package/dist/types/src/packlets/spaces/spaces-service.test.d.ts +2 -0
  24. package/dist/types/src/packlets/spaces/spaces-service.test.d.ts.map +1 -0
  25. package/dist/types/src/packlets/vault/iframe-host-runtime.d.ts +2 -2
  26. package/dist/types/src/packlets/vault/iframe-host-runtime.d.ts.map +1 -1
  27. package/package.json +29 -29
  28. package/src/packlets/devices/devices-service.test.ts +56 -0
  29. package/src/packlets/identity/identity-service.test.ts +82 -0
  30. package/src/packlets/network/network-service.test.ts +52 -0
  31. package/src/packlets/services/index.ts +1 -0
  32. package/src/packlets/services/local-client-services.ts +35 -0
  33. package/src/packlets/services/service-host.ts +3 -3
  34. package/src/packlets/spaces/data-space-manager.ts +1 -1
  35. package/src/packlets/spaces/spaces-service.test.ts +107 -0
  36. package/src/packlets/vault/iframe-host-runtime.ts +5 -3
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=devices-service.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devices-service.test.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/devices/devices-service.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=identity-service.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-service.test.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/identity/identity-service.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=network-service.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-service.test.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/network/network-service.test.ts"],"names":[],"mappings":""}
@@ -3,4 +3,5 @@ export * from './service-definitions';
3
3
  export * from './service-host';
4
4
  export * from './service-proxy';
5
5
  export * from './service-registry';
6
+ export * from './local-client-services';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/services/index.ts"],"names":[],"mappings":"AAIA,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/services/index.ts"],"names":[],"mappings":"AAIA,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { ServiceBundle } from '@dxos/rpc';
2
+ import { ClientServices, ClientServicesProvider } from './service-definitions';
3
+ import { ClientServicesHostParams } from './service-host';
4
+ /**
5
+ * Starts a local instance of the service host.
6
+ */
7
+ export declare class LocalClientServices implements ClientServicesProvider {
8
+ private readonly _host;
9
+ constructor(params: ClientServicesHostParams);
10
+ get descriptors(): ServiceBundle<ClientServices>;
11
+ get services(): Partial<ClientServices>;
12
+ open(): Promise<void>;
13
+ close(): Promise<void>;
14
+ }
15
+ //# sourceMappingURL=local-client-services.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-client-services.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/services/local-client-services.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/E,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"}
@@ -2,9 +2,9 @@ import { Config } from '@dxos/config';
2
2
  import { ModelFactory } from '@dxos/model-factory';
3
3
  import { NetworkManager } from '@dxos/network-manager';
4
4
  import { Storage } from '@dxos/random-access-storage';
5
- import { ClientServicesProvider, ClientServices } from './service-definitions';
5
+ import { ClientServices } from './service-definitions';
6
6
  export declare const createDefaultModelFactory: () => ModelFactory;
7
- declare type ClientServicesHostParams = {
7
+ export declare type ClientServicesHostParams = {
8
8
  config: Config;
9
9
  modelFactory?: ModelFactory;
10
10
  networkManager: NetworkManager;
@@ -14,7 +14,7 @@ declare type ClientServicesHostParams = {
14
14
  /**
15
15
  * Remote service implementation.
16
16
  */
17
- export declare class ClientServicesHost implements ClientServicesProvider {
17
+ export declare class ClientServicesHost {
18
18
  private readonly _resourceLock?;
19
19
  private readonly _serviceRegistry;
20
20
  private readonly _systemService;
@@ -31,5 +31,4 @@ export declare class ClientServicesHost implements ClientServicesProvider {
31
31
  open(): Promise<void>;
32
32
  close(): Promise<void>;
33
33
  }
34
- export {};
35
34
  //# sourceMappingURL=service-host.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"service-host.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/services/service-host.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAKtC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AActD,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAuB,MAAM,uBAAuB,CAAC;AAKpG,eAAO,MAAM,yBAAyB,oBAErC,CAAC;AAEF,aAAK,wBAAwB,GAAG;IAC9B,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,kBAAmB,YAAW,sBAAsB;IAC/D,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,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAKtC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AActD,OAAO,EAAE,cAAc,EAAuB,MAAM,uBAAuB,CAAC;AAK5E,eAAO,MAAM,yBAAyB,oBAErC,CAAC;AAEF,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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=spaces-service.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spaces-service.test.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/spaces/spaces-service.test.ts"],"names":[],"mappings":""}
@@ -1,7 +1,7 @@
1
1
  import { Config } from '@dxos/config';
2
2
  import { RpcPort } from '@dxos/rpc';
3
3
  import { Provider } from '@dxos/util';
4
- import { ClientServicesHost } from '../services';
4
+ import { LocalClientServices } from '../services';
5
5
  import { ShellRuntime } from './shell-runtime';
6
6
  export declare type IFrameHostRuntimeParams = {
7
7
  configProvider: Config | Provider<Promise<Config>>;
@@ -27,7 +27,7 @@ export declare class IFrameHostRuntime {
27
27
  private _shellRuntime?;
28
28
  origin?: string;
29
29
  constructor({ configProvider, appPort, shellPort }: IFrameHostRuntimeParams);
30
- get services(): ClientServicesHost;
30
+ get services(): LocalClientServices;
31
31
  get shell(): ShellRuntime | undefined;
32
32
  start(): Promise<void>;
33
33
  stop(): Promise<void>;
@@ -1 +1 @@
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,EAAoC,OAAO,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAiB,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErD,OAAO,EAAuC,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtF,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;IACzB,OAAO,CAAC,eAAe,CAAsB;IAC7C,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,uBAEX;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,EAAoC,OAAO,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAiB,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErD,OAAO,EAAuC,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvF,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/client-services",
3
- "version": "0.1.28",
3
+ "version": "0.1.30-next.7c60cd3",
4
4
  "description": "DXOS client services implementation",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -21,37 +21,37 @@
21
21
  ],
22
22
  "dependencies": {
23
23
  "base-x": "~3.0.9",
24
- "@dxos/async": "0.1.28",
25
- "@dxos/codec-protobuf": "0.1.28",
26
- "@dxos/config": "0.1.28",
27
- "@dxos/context": "0.1.28",
28
- "@dxos/credentials": "0.1.28",
29
- "@dxos/crypto": "0.1.28",
30
- "@dxos/debug": "0.1.28",
31
- "@dxos/document-model": "0.1.28",
32
- "@dxos/echo-db": "0.1.28",
33
- "@dxos/echo-pipeline": "0.1.28",
34
- "@dxos/errors": "0.1.28",
35
- "@dxos/feed-store": "0.1.28",
36
- "@dxos/keyring": "0.1.28",
37
- "@dxos/keys": "0.1.28",
38
- "@dxos/log": "0.1.28",
39
- "@dxos/messaging": "0.1.28",
40
- "@dxos/model-factory": "0.1.28",
41
- "@dxos/network-manager": "0.1.28",
42
- "@dxos/node-std": "0.1.28",
43
- "@dxos/protocols": "0.1.28",
44
- "@dxos/random-access-storage": "0.1.28",
45
- "@dxos/rpc": "0.1.28",
46
- "@dxos/teleport": "0.1.28",
47
- "@dxos/teleport-extension-presence": "0.1.28",
48
- "@dxos/text-model": "0.1.28",
49
- "@dxos/timeframe": "0.1.28",
50
- "@dxos/util": "0.1.28"
24
+ "@dxos/async": "0.1.30-next.7c60cd3",
25
+ "@dxos/codec-protobuf": "0.1.30-next.7c60cd3",
26
+ "@dxos/config": "0.1.30-next.7c60cd3",
27
+ "@dxos/context": "0.1.30-next.7c60cd3",
28
+ "@dxos/credentials": "0.1.30-next.7c60cd3",
29
+ "@dxos/crypto": "0.1.30-next.7c60cd3",
30
+ "@dxos/debug": "0.1.30-next.7c60cd3",
31
+ "@dxos/document-model": "0.1.30-next.7c60cd3",
32
+ "@dxos/echo-db": "0.1.30-next.7c60cd3",
33
+ "@dxos/echo-pipeline": "0.1.30-next.7c60cd3",
34
+ "@dxos/errors": "0.1.30-next.7c60cd3",
35
+ "@dxos/feed-store": "0.1.30-next.7c60cd3",
36
+ "@dxos/keyring": "0.1.30-next.7c60cd3",
37
+ "@dxos/keys": "0.1.30-next.7c60cd3",
38
+ "@dxos/log": "0.1.30-next.7c60cd3",
39
+ "@dxos/messaging": "0.1.30-next.7c60cd3",
40
+ "@dxos/model-factory": "0.1.30-next.7c60cd3",
41
+ "@dxos/network-manager": "0.1.30-next.7c60cd3",
42
+ "@dxos/node-std": "0.1.30-next.7c60cd3",
43
+ "@dxos/protocols": "0.1.30-next.7c60cd3",
44
+ "@dxos/random-access-storage": "0.1.30-next.7c60cd3",
45
+ "@dxos/rpc": "0.1.30-next.7c60cd3",
46
+ "@dxos/teleport": "0.1.30-next.7c60cd3",
47
+ "@dxos/teleport-extension-presence": "0.1.30-next.7c60cd3",
48
+ "@dxos/text-model": "0.1.30-next.7c60cd3",
49
+ "@dxos/timeframe": "0.1.30-next.7c60cd3",
50
+ "@dxos/util": "0.1.30-next.7c60cd3"
51
51
  },
52
52
  "devDependencies": {
53
53
  "@types/readable-stream": "^2.3.9",
54
- "@dxos/signal": "0.1.28"
54
+ "@dxos/signal": "0.1.30-next.7c60cd3"
55
55
  },
56
56
  "publishConfig": {
57
57
  "access": "public"
@@ -0,0 +1,56 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { expect } from 'chai';
6
+
7
+ import { Trigger } from '@dxos/async';
8
+ import { DevicesService, Device } from '@dxos/protocols/proto/dxos/client/services';
9
+ import { afterEach, afterTest, beforeEach, describe, test } from '@dxos/test';
10
+
11
+ import { ServiceContext } from '../services';
12
+ import { createServiceContext } from '../testing';
13
+ import { DevicesServiceImpl } from './devices-service';
14
+
15
+ describe('DevicesService', () => {
16
+ let serviceContext: ServiceContext;
17
+ let devicesService: DevicesService;
18
+
19
+ beforeEach(async () => {
20
+ serviceContext = createServiceContext();
21
+ await serviceContext.open();
22
+ devicesService = new DevicesServiceImpl(serviceContext.identityManager);
23
+ });
24
+
25
+ afterEach(async () => {
26
+ await serviceContext.close();
27
+ });
28
+
29
+ describe.skip('updateDevice', () => {});
30
+
31
+ describe('queryDevices', () => {
32
+ test('returns empty list if no identity is available', async () => {
33
+ const query = devicesService.queryDevices();
34
+ const result = new Trigger<Device[] | undefined>();
35
+ query.subscribe(({ devices }) => {
36
+ result.wake(devices);
37
+ });
38
+ afterTest(() => query.close());
39
+ expect(await result.wait()).to.be.length(0);
40
+ });
41
+
42
+ test('updates when identity is created', async () => {
43
+ const query = devicesService.queryDevices();
44
+ let result = new Trigger<Device[] | undefined>();
45
+ query.subscribe(({ devices }) => {
46
+ result.wake(devices);
47
+ });
48
+ afterTest(() => query.close());
49
+ expect(await result.wait()).to.be.length(0);
50
+
51
+ result = new Trigger<Device[] | undefined>();
52
+ await serviceContext.createIdentity();
53
+ expect(await result.wait()).to.be.length(1);
54
+ });
55
+ });
56
+ });
@@ -0,0 +1,82 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import chai, { expect } from 'chai';
6
+ import chaiAsPromised from 'chai-as-promised';
7
+
8
+ import { Trigger } from '@dxos/async';
9
+ import { PublicKey } from '@dxos/keys';
10
+ import { Identity, IdentityService } from '@dxos/protocols/proto/dxos/client/services';
11
+ import { afterEach, afterTest, beforeEach, describe, test } from '@dxos/test';
12
+
13
+ import { ServiceContext } from '../services';
14
+ import { createServiceContext } from '../testing';
15
+ import { IdentityServiceImpl } from './identity-service';
16
+
17
+ chai.use(chaiAsPromised);
18
+
19
+ describe('IdentityService', () => {
20
+ let serviceContext: ServiceContext;
21
+ let identityService: IdentityService;
22
+
23
+ beforeEach(async () => {
24
+ serviceContext = createServiceContext();
25
+ await serviceContext.open();
26
+ identityService = new IdentityServiceImpl(serviceContext);
27
+ });
28
+
29
+ afterEach(async () => {
30
+ await serviceContext.close();
31
+ });
32
+
33
+ describe('createIdentity', () => {
34
+ test('creates a new identity', async () => {
35
+ const identity = await identityService.createIdentity({});
36
+
37
+ expect(identity.identityKey).to.be.instanceof(PublicKey);
38
+ expect(identity.spaceKey).to.be.instanceof(PublicKey);
39
+ });
40
+
41
+ test('creates a new identity with a display name', async () => {
42
+ const identity = await identityService.createIdentity({ displayName: 'Example' });
43
+
44
+ expect(identity.identityKey).to.be.instanceof(PublicKey);
45
+ expect(identity.spaceKey).to.be.instanceof(PublicKey);
46
+ expect(identity.profile?.displayName).to.equal('Example');
47
+ });
48
+
49
+ test('fails to create identity if one already exists', async () => {
50
+ await identityService.createIdentity({});
51
+ await expect(identityService.createIdentity({})).to.be.rejectedWith('Identity already exists');
52
+ });
53
+ });
54
+
55
+ describe.skip('recoverIdentity', () => {});
56
+
57
+ describe('queryIdentity', () => {
58
+ test('returns undefined if no identity is available', async () => {
59
+ const query = identityService.queryIdentity();
60
+ const result = new Trigger<Identity | undefined>();
61
+ query.subscribe(({ identity }) => {
62
+ result.wake(identity);
63
+ });
64
+ afterTest(() => query.close());
65
+ expect(await result.wait()).to.be.undefined;
66
+ });
67
+
68
+ test('updates when identity is created', async () => {
69
+ const query = identityService.queryIdentity();
70
+ let result = new Trigger<Identity | undefined>();
71
+ query.subscribe(({ identity }) => {
72
+ result.wake(identity);
73
+ });
74
+ afterTest(() => query.close());
75
+ expect(await result.wait()).to.be.undefined;
76
+
77
+ result = new Trigger<Identity | undefined>();
78
+ const identity = await identityService.createIdentity({});
79
+ expect(await result.wait()).to.deep.equal(identity);
80
+ });
81
+ });
82
+ });
@@ -0,0 +1,52 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { expect } from 'chai';
6
+
7
+ import { Trigger } from '@dxos/async';
8
+ import { NetworkService, ConnectionState } from '@dxos/protocols/proto/dxos/client/services';
9
+ import { afterEach, afterTest, beforeEach, describe, test } from '@dxos/test';
10
+
11
+ import { ServiceContext } from '../services';
12
+ import { createServiceContext } from '../testing';
13
+ import { NetworkServiceImpl } from './network-service';
14
+
15
+ describe('NetworkService', () => {
16
+ let serviceContext: ServiceContext;
17
+ let networkService: NetworkService;
18
+
19
+ beforeEach(async () => {
20
+ serviceContext = createServiceContext();
21
+ await serviceContext.open();
22
+ networkService = new NetworkServiceImpl(serviceContext.networkManager);
23
+ });
24
+
25
+ afterEach(async () => {
26
+ await serviceContext.close();
27
+ });
28
+
29
+ test('setNetworkOptions changes network status', async () => {
30
+ await networkService.setNetworkOptions({
31
+ state: ConnectionState.OFFLINE
32
+ });
33
+
34
+ expect(serviceContext.networkManager.connectionState).to.equal(ConnectionState.OFFLINE);
35
+ });
36
+
37
+ test('subscribeToNetworkStatus returns current network status', async () => {
38
+ const query = networkService.subscribeToNetworkStatus();
39
+ let result = new Trigger<ConnectionState | undefined>();
40
+ query.subscribe(({ state }) => {
41
+ result.wake(state);
42
+ });
43
+ afterTest(() => query.close());
44
+ expect(await result.wait()).to.equal(ConnectionState.ONLINE);
45
+
46
+ result = new Trigger<ConnectionState | undefined>();
47
+ await networkService.setNetworkOptions({
48
+ state: ConnectionState.OFFLINE
49
+ });
50
+ expect(await result.wait()).to.equal(ConnectionState.OFFLINE);
51
+ });
52
+ });
@@ -7,3 +7,4 @@ export * from './service-definitions';
7
7
  export * from './service-host';
8
8
  export * from './service-proxy';
9
9
  export * from './service-registry';
10
+ export * from './local-client-services';
@@ -0,0 +1,35 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { ServiceBundle } from '@dxos/rpc';
6
+
7
+ import { ClientServices, ClientServicesProvider } from './service-definitions';
8
+ import { ClientServicesHost, ClientServicesHostParams } from './service-host';
9
+
10
+ /**
11
+ * Starts a local instance of the service host.
12
+ */
13
+ export class LocalClientServices implements ClientServicesProvider {
14
+ private readonly _host: ClientServicesHost;
15
+
16
+ constructor(params: ClientServicesHostParams) {
17
+ this._host = new ClientServicesHost(params);
18
+ }
19
+
20
+ get descriptors(): ServiceBundle<ClientServices> {
21
+ return this._host.descriptors;
22
+ }
23
+
24
+ get services(): Partial<ClientServices> {
25
+ return this._host.services;
26
+ }
27
+
28
+ async open(): Promise<void> {
29
+ await this._host.open();
30
+ }
31
+
32
+ async close(): Promise<void> {
33
+ await this._host.close();
34
+ }
35
+ }
@@ -27,7 +27,7 @@ import { createStorageObjects } from '../storage';
27
27
  import { SystemServiceImpl } from '../system';
28
28
  import { VaultResourceLock } from '../vault';
29
29
  import { ServiceContext } from './service-context';
30
- import { ClientServicesProvider, ClientServices, clientServiceBundle } from './service-definitions';
30
+ import { ClientServices, clientServiceBundle } from './service-definitions';
31
31
  import { ServiceRegistry } from './service-registry';
32
32
 
33
33
  // TODO(burdon): Factor out to spaces.
@@ -36,7 +36,7 @@ export const createDefaultModelFactory = () => {
36
36
  return new ModelFactory().registerModel(DocumentModel).registerModel(TextModel);
37
37
  };
38
38
 
39
- type ClientServicesHostParams = {
39
+ export type ClientServicesHostParams = {
40
40
  config: Config;
41
41
  modelFactory?: ModelFactory;
42
42
  networkManager: NetworkManager;
@@ -47,7 +47,7 @@ type ClientServicesHostParams = {
47
47
  /**
48
48
  * Remote service implementation.
49
49
  */
50
- export class ClientServicesHost implements ClientServicesProvider {
50
+ export class ClientServicesHost {
51
51
  private readonly _resourceLock?: VaultResourceLock;
52
52
  private readonly _serviceRegistry: ServiceRegistry<ClientServices>;
53
53
  private readonly _systemService: SystemServiceImpl;
@@ -153,7 +153,7 @@ export class DataSpaceManager {
153
153
  const presence = new Presence({
154
154
  localPeerId: this._signingContext.deviceKey,
155
155
  announceInterval: 1_000,
156
- offlineTimeout: 30_000,
156
+ offlineTimeout: 10_000, // TODO(burdon): Config.
157
157
  identityKey: this._signingContext.identityKey
158
158
  });
159
159
  const snapshotManager = new SnapshotManager(this._snapshotStore);
@@ -0,0 +1,107 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import chai, { expect } from 'chai';
6
+ import chaiAsPromised from 'chai-as-promised';
7
+
8
+ import { Trigger } from '@dxos/async';
9
+ import { PublicKey } from '@dxos/keys';
10
+ import { Space, SpacesService } from '@dxos/protocols/proto/dxos/client/services';
11
+ import { afterEach, afterTest, beforeEach, describe, test } from '@dxos/test';
12
+
13
+ import { ServiceContext } from '../services';
14
+ import { createServiceContext } from '../testing';
15
+ import { SpacesServiceImpl } from './spaces-service';
16
+
17
+ chai.use(chaiAsPromised);
18
+
19
+ describe('SpacesService', () => {
20
+ let serviceContext: ServiceContext;
21
+ let spacesService: SpacesService;
22
+
23
+ beforeEach(async () => {
24
+ serviceContext = createServiceContext();
25
+ await serviceContext.open();
26
+ spacesService = new SpacesServiceImpl(
27
+ serviceContext.identityManager,
28
+ serviceContext.spaceManager,
29
+ serviceContext.dataServiceSubscriptions,
30
+ async () => {
31
+ await serviceContext.initialized.wait();
32
+ return serviceContext.dataSpaceManager!;
33
+ }
34
+ );
35
+ });
36
+
37
+ afterEach(async () => {
38
+ await serviceContext.close();
39
+ });
40
+
41
+ describe('createSpace', () => {
42
+ test('fails if no identity is available', async () => {
43
+ await expect(spacesService.createSpace()).to.be.rejectedWith();
44
+ });
45
+
46
+ test('creates a new space', async () => {
47
+ await serviceContext.createIdentity();
48
+ const space = await spacesService.createSpace();
49
+ expect(space).to.exist;
50
+ expect(space.spaceKey).to.be.instanceof(PublicKey);
51
+ });
52
+ });
53
+
54
+ describe.skip('updateSpace', () => {});
55
+
56
+ describe('querySpaces', () => {
57
+ test('returns empty list if no identity is available', async () => {
58
+ const query = spacesService.querySpaces();
59
+ const result = new Trigger<Space[] | undefined>();
60
+ query.subscribe(({ spaces }) => {
61
+ result.wake(spaces);
62
+ });
63
+ afterTest(() => query.close());
64
+ expect(await result.wait()).to.be.length(0);
65
+ });
66
+
67
+ test('returns list of existing spaces', async () => {
68
+ await serviceContext.createIdentity();
69
+ const existingSpaces = [
70
+ await spacesService.createSpace(),
71
+ await spacesService.createSpace(),
72
+ await spacesService.createSpace()
73
+ ];
74
+
75
+ const query = spacesService.querySpaces();
76
+ const result = new Trigger<Space[] | undefined>();
77
+ query.subscribe(({ spaces }) => {
78
+ result.wake(spaces);
79
+ });
80
+ afterTest(() => query.close());
81
+
82
+ const spaces = await result.wait();
83
+ expect(spaces).to.be.length(3);
84
+ expect(spaces).to.deep.equal(existingSpaces);
85
+ });
86
+
87
+ test('updates when new space is added', async () => {
88
+ await serviceContext.createIdentity();
89
+ const query = spacesService.querySpaces();
90
+ let result = new Trigger<Space[] | undefined>();
91
+ query.subscribe(({ spaces }) => {
92
+ result.wake(spaces);
93
+ });
94
+ afterTest(() => query.close());
95
+ expect(await result.wait()).to.be.length(0);
96
+
97
+ result = new Trigger<Space[] | undefined>();
98
+ const space = await spacesService.createSpace();
99
+ expect(await result.wait()).to.deep.equal([space]);
100
+ });
101
+
102
+ test.skip('updates when space is updated', async () => {});
103
+ });
104
+
105
+ describe.skip('writeCrendentials', () => {});
106
+ describe.skip('queryCrendentials', () => {});
107
+ });
@@ -10,7 +10,7 @@ import { createWebRTCTransportFactory, NetworkManager } from '@dxos/network-mana
10
10
  import { createProtoRpcPeer, ProtoRpcPeer, RpcPort } from '@dxos/rpc';
11
11
  import { getAsyncValue, Provider } from '@dxos/util';
12
12
 
13
- import { clientServiceBundle, ClientServices, ClientServicesHost } from '../services';
13
+ import { clientServiceBundle, ClientServices, LocalClientServices } from '../services';
14
14
  import { ShellRuntime, ShellRuntimeImpl } from './shell-runtime';
15
15
 
16
16
  const LOCK_KEY = 'DXOS_RESOURCE_LOCK';
@@ -38,7 +38,9 @@ export class IFrameHostRuntime {
38
38
  private readonly _appPort: RpcPort;
39
39
  private readonly _shellPort?: RpcPort;
40
40
  private _config!: Config;
41
- private _clientServices!: ClientServicesHost;
41
+
42
+ // TODO(dmaretskyi): Replace with host and figure out how to return services provider here.
43
+ private _clientServices!: LocalClientServices;
42
44
  private _clientRpc!: ProtoRpcPeer<ClientServices>;
43
45
  private _shellRuntime?: ShellRuntimeImpl;
44
46
 
@@ -82,7 +84,7 @@ export class IFrameHostRuntime {
82
84
  try {
83
85
  this._config = await getAsyncValue(this._configProvider);
84
86
  const signalServer = this._config.get('runtime.services.signal.server');
85
- this._clientServices = new ClientServicesHost({
87
+ this._clientServices = new LocalClientServices({
86
88
  lockKey: LOCK_KEY,
87
89
  config: this._config,
88
90
  networkManager: new NetworkManager({