@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.
- package/dist/lib/browser/{chunk-OTSGRZZI.mjs → chunk-JLLUQQXD.mjs} +29 -9
- package/dist/lib/browser/{chunk-OTSGRZZI.mjs.map → chunk-JLLUQQXD.mjs.map} +4 -4
- package/dist/lib/browser/index.mjs +3 -1
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/packlets/testing/index.mjs +1 -1
- package/dist/lib/node/index.cjs +28 -7
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/packlets/testing/index.cjs +26 -7
- package/dist/lib/node/packlets/testing/index.cjs.map +4 -4
- package/dist/types/src/packlets/devices/devices-service.test.d.ts +2 -0
- package/dist/types/src/packlets/devices/devices-service.test.d.ts.map +1 -0
- package/dist/types/src/packlets/identity/identity-service.test.d.ts +2 -0
- package/dist/types/src/packlets/identity/identity-service.test.d.ts.map +1 -0
- package/dist/types/src/packlets/network/network-service.test.d.ts +2 -0
- package/dist/types/src/packlets/network/network-service.test.d.ts.map +1 -0
- package/dist/types/src/packlets/services/index.d.ts +1 -0
- package/dist/types/src/packlets/services/index.d.ts.map +1 -1
- package/dist/types/src/packlets/services/local-client-services.d.ts +15 -0
- package/dist/types/src/packlets/services/local-client-services.d.ts.map +1 -0
- package/dist/types/src/packlets/services/service-host.d.ts +3 -4
- package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/spaces-service.test.d.ts +2 -0
- package/dist/types/src/packlets/spaces/spaces-service.test.d.ts.map +1 -0
- package/dist/types/src/packlets/vault/iframe-host-runtime.d.ts +2 -2
- package/dist/types/src/packlets/vault/iframe-host-runtime.d.ts.map +1 -1
- package/package.json +29 -29
- package/src/packlets/devices/devices-service.test.ts +56 -0
- package/src/packlets/identity/identity-service.test.ts +82 -0
- package/src/packlets/network/network-service.test.ts +52 -0
- package/src/packlets/services/index.ts +1 -0
- package/src/packlets/services/local-client-services.ts +35 -0
- package/src/packlets/services/service-host.ts +3 -3
- package/src/packlets/spaces/data-space-manager.ts +1 -1
- package/src/packlets/spaces/spaces-service.test.ts +107 -0
- package/src/packlets/vault/iframe-host-runtime.ts +5 -3
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"identity-service.test.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/identity/identity-service.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-service.test.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/network/network-service.test.ts"],"names":[],"mappings":""}
|
|
@@ -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 {
|
|
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
|
|
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,
|
|
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 @@
|
|
|
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 {
|
|
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():
|
|
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,
|
|
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.
|
|
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.
|
|
25
|
-
"@dxos/codec-protobuf": "0.1.
|
|
26
|
-
"@dxos/config": "0.1.
|
|
27
|
-
"@dxos/context": "0.1.
|
|
28
|
-
"@dxos/credentials": "0.1.
|
|
29
|
-
"@dxos/crypto": "0.1.
|
|
30
|
-
"@dxos/debug": "0.1.
|
|
31
|
-
"@dxos/document-model": "0.1.
|
|
32
|
-
"@dxos/echo-db": "0.1.
|
|
33
|
-
"@dxos/echo-pipeline": "0.1.
|
|
34
|
-
"@dxos/errors": "0.1.
|
|
35
|
-
"@dxos/feed-store": "0.1.
|
|
36
|
-
"@dxos/keyring": "0.1.
|
|
37
|
-
"@dxos/keys": "0.1.
|
|
38
|
-
"@dxos/log": "0.1.
|
|
39
|
-
"@dxos/messaging": "0.1.
|
|
40
|
-
"@dxos/model-factory": "0.1.
|
|
41
|
-
"@dxos/network-manager": "0.1.
|
|
42
|
-
"@dxos/node-std": "0.1.
|
|
43
|
-
"@dxos/protocols": "0.1.
|
|
44
|
-
"@dxos/random-access-storage": "0.1.
|
|
45
|
-
"@dxos/rpc": "0.1.
|
|
46
|
-
"@dxos/teleport": "0.1.
|
|
47
|
-
"@dxos/teleport-extension-presence": "0.1.
|
|
48
|
-
"@dxos/text-model": "0.1.
|
|
49
|
-
"@dxos/timeframe": "0.1.
|
|
50
|
-
"@dxos/util": "0.1.
|
|
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.
|
|
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
|
+
});
|
|
@@ -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 {
|
|
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
|
|
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:
|
|
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,
|
|
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
|
-
|
|
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
|
|
87
|
+
this._clientServices = new LocalClientServices({
|
|
86
88
|
lockKey: LOCK_KEY,
|
|
87
89
|
config: this._config,
|
|
88
90
|
networkManager: new NetworkManager({
|