@dxos/client-services 0.1.30-next.7c60cd3 → 0.1.31-next.ea8f0bc
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-JLLUQQXD.mjs → chunk-ZIQUYEJS.mjs} +898 -1132
- package/dist/lib/browser/chunk-ZIQUYEJS.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +5 -41
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/packlets/testing/index.mjs +163 -50
- package/dist/lib/browser/packlets/testing/index.mjs.map +4 -4
- package/dist/lib/node/index.cjs +785 -1043
- 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 +2812 -2686
- package/dist/lib/node/packlets/testing/index.cjs.map +4 -4
- package/dist/types/src/packlets/invitations/device-invitations-handler.d.ts +1 -2
- package/dist/types/src/packlets/invitations/device-invitations-handler.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/device-invitations-service.d.ts +1 -1
- package/dist/types/src/packlets/invitations/device-invitations-service.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/index.d.ts +0 -6
- package/dist/types/src/packlets/invitations/index.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/invitations-service.d.ts +2 -3
- package/dist/types/src/packlets/invitations/invitations-service.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/space-invitations-handler.d.ts +2 -4
- package/dist/types/src/packlets/invitations/space-invitations-handler.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/space-invitations-service.d.ts +2 -3
- package/dist/types/src/packlets/invitations/space-invitations-service.d.ts.map +1 -1
- package/dist/types/src/packlets/services/client-rpc-server.d.ts +22 -0
- package/dist/types/src/packlets/services/client-rpc-server.d.ts.map +1 -0
- package/dist/types/src/packlets/services/index.d.ts +2 -3
- package/dist/types/src/packlets/services/index.d.ts.map +1 -1
- package/dist/types/src/packlets/services/local-client-services.d.ts +3 -2
- package/dist/types/src/packlets/services/local-client-services.d.ts.map +1 -1
- package/dist/types/src/packlets/services/service-context.d.ts +1 -1
- package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
- package/dist/types/src/packlets/services/service-host.d.ts +22 -8
- package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
- package/dist/types/src/packlets/services/service-registry.d.ts +3 -1
- package/dist/types/src/packlets/services/service-registry.d.ts.map +1 -1
- package/dist/types/src/packlets/services/utils.d.ts +7 -0
- package/dist/types/src/packlets/services/utils.d.ts.map +1 -0
- package/dist/types/src/packlets/spaces/index.d.ts +2 -0
- package/dist/types/src/packlets/spaces/index.d.ts.map +1 -1
- package/dist/types/src/packlets/system/system-service.d.ts +2 -2
- package/dist/types/src/packlets/system/system-service.d.ts.map +1 -1
- package/dist/types/src/packlets/testing/host-test-builder.d.ts +43 -0
- package/dist/types/src/packlets/testing/host-test-builder.d.ts.map +1 -0
- package/dist/types/src/packlets/testing/index.d.ts +1 -0
- package/dist/types/src/packlets/testing/index.d.ts.map +1 -1
- package/dist/types/src/packlets/testing/invitation-utils.d.ts +1 -1
- package/dist/types/src/packlets/testing/invitation-utils.d.ts.map +1 -1
- package/dist/types/src/packlets/testing/test-builder.d.ts +30 -34
- package/dist/types/src/packlets/testing/test-builder.d.ts.map +1 -1
- package/dist/types/src/packlets/tests/client-services.test.d.ts +2 -0
- package/dist/types/src/packlets/tests/client-services.test.d.ts.map +1 -0
- package/dist/types/src/packlets/tests/client.test.d.ts +2 -0
- package/dist/types/src/packlets/tests/client.test.d.ts.map +1 -0
- package/dist/types/src/packlets/tests/halo-credentials.test.d.ts +2 -0
- package/dist/types/src/packlets/tests/halo-credentials.test.d.ts.map +1 -0
- package/dist/types/src/packlets/tests/halo-persistent.test.d.ts +2 -0
- package/dist/types/src/packlets/tests/halo-persistent.test.d.ts.map +1 -0
- package/dist/types/src/packlets/tests/halo-profile.test.d.ts +2 -0
- package/dist/types/src/packlets/tests/halo-profile.test.d.ts.map +1 -0
- package/dist/types/src/packlets/tests/shared-worker.test.d.ts +2 -0
- package/dist/types/src/packlets/tests/shared-worker.test.d.ts.map +1 -0
- package/dist/types/src/packlets/tests/spaces-invitations.test.d.ts +2 -0
- package/dist/types/src/packlets/tests/spaces-invitations.test.d.ts.map +1 -0
- package/dist/types/src/packlets/tests/spaces.test.d.ts +2 -0
- package/dist/types/src/packlets/tests/spaces.test.d.ts.map +1 -0
- package/dist/types/src/packlets/vault/iframe-host-runtime.d.ts +0 -1
- package/dist/types/src/packlets/vault/iframe-host-runtime.d.ts.map +1 -1
- package/dist/types/src/packlets/vault/iframe-proxy-runtime.d.ts.map +1 -1
- package/dist/types/src/packlets/vault/index.d.ts +0 -2
- package/dist/types/src/packlets/vault/index.d.ts.map +1 -1
- package/dist/types/src/packlets/vault/shell-runtime.d.ts.map +1 -1
- package/dist/types/src/packlets/vault/worker-runtime.d.ts.map +1 -1
- package/dist/types/src/packlets/vault/worker-session.d.ts +4 -4
- package/dist/types/src/packlets/vault/worker-session.d.ts.map +1 -1
- package/package.json +30 -30
- package/src/packlets/invitations/device-invitations-handler.ts +10 -9
- package/src/packlets/invitations/device-invitations-service.test.ts +1 -1
- package/src/packlets/invitations/device-invitations-service.ts +1 -1
- package/src/packlets/invitations/index.ts +0 -6
- package/src/packlets/invitations/invitations-service.ts +7 -2
- package/src/packlets/invitations/space-invitations-handler.test.ts +3 -3
- package/src/packlets/invitations/space-invitations-handler.ts +11 -11
- package/src/packlets/invitations/space-invitations-service.test.ts +1 -1
- package/src/packlets/invitations/space-invitations-service.ts +2 -3
- package/src/packlets/services/client-rpc-server.ts +91 -0
- package/src/packlets/services/index.ts +2 -3
- package/src/packlets/services/local-client-services.ts +5 -1
- package/src/packlets/services/service-context.test.ts +4 -4
- package/src/packlets/services/service-context.ts +1 -1
- package/src/packlets/services/service-host.ts +52 -19
- package/src/packlets/services/service-registry.test.ts +2 -2
- package/src/packlets/services/service-registry.ts +9 -1
- package/src/packlets/services/utils.ts +53 -0
- package/src/packlets/spaces/data-space-manager.test.ts +4 -4
- package/src/packlets/spaces/index.ts +2 -0
- package/src/packlets/system/system-service.ts +3 -3
- package/src/packlets/testing/host-test-builder.ts +163 -0
- package/src/packlets/testing/index.ts +1 -0
- package/src/packlets/testing/invitation-utils.ts +1 -2
- package/src/packlets/testing/test-builder.ts +118 -140
- package/src/packlets/tests/client-services.test.ts +252 -0
- package/src/packlets/tests/client.test.ts +143 -0
- package/src/packlets/tests/halo-credentials.test.ts +94 -0
- package/src/packlets/tests/halo-persistent.test.ts +53 -0
- package/src/packlets/tests/halo-profile.test.ts +74 -0
- package/src/packlets/tests/shared-worker.test.ts +93 -0
- package/src/packlets/tests/spaces-invitations.test.ts +24 -0
- package/src/packlets/tests/spaces.test.ts +68 -0
- package/src/packlets/vault/iframe-host-runtime.ts +26 -34
- package/src/packlets/vault/iframe-proxy-runtime.ts +1 -1
- package/src/packlets/vault/index.ts +0 -2
- package/src/packlets/vault/shell-runtime.ts +1 -2
- package/src/packlets/vault/worker-runtime.ts +5 -15
- package/src/packlets/vault/worker-session.ts +39 -23
- package/dist/lib/browser/chunk-JLLUQQXD.mjs.map +0 -7
- package/dist/types/src/packlets/invitations/device-invitations-proxy.d.ts +0 -8
- package/dist/types/src/packlets/invitations/device-invitations-proxy.d.ts.map +0 -1
- package/dist/types/src/packlets/invitations/encoder.d.ts +0 -9
- package/dist/types/src/packlets/invitations/encoder.d.ts.map +0 -1
- package/dist/types/src/packlets/invitations/encoder.test.d.ts +0 -2
- package/dist/types/src/packlets/invitations/encoder.test.d.ts.map +0 -1
- package/dist/types/src/packlets/invitations/invitations-handler.d.ts +0 -56
- package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +0 -1
- package/dist/types/src/packlets/invitations/invitations-proxy.d.ts +0 -18
- package/dist/types/src/packlets/invitations/invitations-proxy.d.ts.map +0 -1
- package/dist/types/src/packlets/invitations/invitations.d.ts +0 -55
- package/dist/types/src/packlets/invitations/invitations.d.ts.map +0 -1
- package/dist/types/src/packlets/invitations/space-invitations-proxy.d.ts +0 -11
- package/dist/types/src/packlets/invitations/space-invitations-proxy.d.ts.map +0 -1
- package/dist/types/src/packlets/services/service-definitions.d.ts +0 -30
- package/dist/types/src/packlets/services/service-definitions.d.ts.map +0 -1
- package/dist/types/src/packlets/services/service-proxy.d.ts +0 -17
- package/dist/types/src/packlets/services/service-proxy.d.ts.map +0 -1
- package/dist/types/src/packlets/vault/services.d.ts +0 -21
- package/dist/types/src/packlets/vault/services.d.ts.map +0 -1
- package/dist/types/src/packlets/vault/shell-controller.d.ts +0 -18
- package/dist/types/src/packlets/vault/shell-controller.d.ts.map +0 -1
- package/src/packlets/invitations/device-invitations-proxy.ts +0 -14
- package/src/packlets/invitations/encoder.test.ts +0 -23
- package/src/packlets/invitations/encoder.ts +0 -26
- package/src/packlets/invitations/invitations-handler.ts +0 -68
- package/src/packlets/invitations/invitations-proxy.ts +0 -159
- package/src/packlets/invitations/invitations.ts +0 -113
- package/src/packlets/invitations/space-invitations-proxy.ts +0 -16
- package/src/packlets/services/service-definitions.ts +0 -68
- package/src/packlets/services/service-proxy.ts +0 -54
- package/src/packlets/vault/services.ts +0 -42
- package/src/packlets/vault/shell-controller.ts +0 -56
|
@@ -5,16 +5,15 @@
|
|
|
5
5
|
import assert from 'node:assert';
|
|
6
6
|
|
|
7
7
|
import { Event } from '@dxos/async';
|
|
8
|
+
import { clientServiceBundle, ClientServices, createDefaultModelFactory } from '@dxos/client';
|
|
8
9
|
import { Config } from '@dxos/config';
|
|
9
10
|
import { raise } from '@dxos/debug';
|
|
10
|
-
import { DocumentModel } from '@dxos/document-model';
|
|
11
11
|
import { DataServiceImpl } from '@dxos/echo-pipeline';
|
|
12
12
|
import { log } from '@dxos/log';
|
|
13
13
|
import { ModelFactory } from '@dxos/model-factory';
|
|
14
14
|
import { NetworkManager } from '@dxos/network-manager';
|
|
15
15
|
import { SystemStatus } from '@dxos/protocols/proto/dxos/client/services';
|
|
16
16
|
import { Storage } from '@dxos/random-access-storage';
|
|
17
|
-
import { TextModel } from '@dxos/text-model';
|
|
18
17
|
|
|
19
18
|
import { TracingServiceImpl } from '../deprecated';
|
|
20
19
|
import { DevicesServiceImpl } from '../devices';
|
|
@@ -27,23 +26,24 @@ import { createStorageObjects } from '../storage';
|
|
|
27
26
|
import { SystemServiceImpl } from '../system';
|
|
28
27
|
import { VaultResourceLock } from '../vault';
|
|
29
28
|
import { ServiceContext } from './service-context';
|
|
30
|
-
import { ClientServices, clientServiceBundle } from './service-definitions';
|
|
31
29
|
import { ServiceRegistry } from './service-registry';
|
|
32
30
|
|
|
33
|
-
// TODO(burdon): Factor out to spaces.
|
|
34
|
-
// TODO(burdon): Defaults (with TextModel).
|
|
35
|
-
export const createDefaultModelFactory = () => {
|
|
36
|
-
return new ModelFactory().registerModel(DocumentModel).registerModel(TextModel);
|
|
37
|
-
};
|
|
38
|
-
|
|
39
31
|
export type ClientServicesHostParams = {
|
|
40
|
-
|
|
32
|
+
/**
|
|
33
|
+
* Can be omitted if `initialize` is later called.
|
|
34
|
+
*/
|
|
35
|
+
config?: Config;
|
|
41
36
|
modelFactory?: ModelFactory;
|
|
42
|
-
networkManager
|
|
37
|
+
networkManager?: NetworkManager;
|
|
43
38
|
storage?: Storage;
|
|
44
39
|
lockKey?: string;
|
|
45
40
|
};
|
|
46
41
|
|
|
42
|
+
export type InitializeOptions = {
|
|
43
|
+
config?: Config;
|
|
44
|
+
networkManager?: NetworkManager;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
47
|
/**
|
|
48
48
|
* Remote service implementation.
|
|
49
49
|
*/
|
|
@@ -52,11 +52,11 @@ export class ClientServicesHost {
|
|
|
52
52
|
private readonly _serviceRegistry: ServiceRegistry<ClientServices>;
|
|
53
53
|
private readonly _systemService: SystemServiceImpl;
|
|
54
54
|
|
|
55
|
-
private
|
|
55
|
+
private _config?: Config;
|
|
56
56
|
private readonly _statusUpdate = new Event<void>();
|
|
57
57
|
private readonly _modelFactory: ModelFactory;
|
|
58
|
-
private
|
|
59
|
-
private
|
|
58
|
+
private _networkManager?: NetworkManager;
|
|
59
|
+
private _storage?: Storage;
|
|
60
60
|
|
|
61
61
|
/**
|
|
62
62
|
* @internal
|
|
@@ -69,14 +69,16 @@ export class ClientServicesHost {
|
|
|
69
69
|
modelFactory = createDefaultModelFactory(),
|
|
70
70
|
// TODO(burdon): Create ApolloLink abstraction (see Client).
|
|
71
71
|
networkManager,
|
|
72
|
-
storage
|
|
72
|
+
storage,
|
|
73
73
|
// TODO(wittjosiah): Turn this on by default.
|
|
74
74
|
lockKey
|
|
75
|
-
}: ClientServicesHostParams) {
|
|
76
|
-
this._config = config;
|
|
77
|
-
this._modelFactory = modelFactory;
|
|
78
|
-
this._networkManager = networkManager;
|
|
75
|
+
}: ClientServicesHostParams = {}) {
|
|
79
76
|
this._storage = storage;
|
|
77
|
+
this._modelFactory = modelFactory;
|
|
78
|
+
|
|
79
|
+
if (config) {
|
|
80
|
+
this.initialize({ config, networkManager });
|
|
81
|
+
}
|
|
80
82
|
|
|
81
83
|
this._resourceLock = lockKey
|
|
82
84
|
? new VaultResourceLock({
|
|
@@ -117,6 +119,10 @@ export class ClientServicesHost {
|
|
|
117
119
|
return this._open;
|
|
118
120
|
}
|
|
119
121
|
|
|
122
|
+
get serviceRegistry() {
|
|
123
|
+
return this._serviceRegistry;
|
|
124
|
+
}
|
|
125
|
+
|
|
120
126
|
get descriptors() {
|
|
121
127
|
return this._serviceRegistry.descriptors;
|
|
122
128
|
}
|
|
@@ -125,11 +131,38 @@ export class ClientServicesHost {
|
|
|
125
131
|
return this._serviceRegistry.services;
|
|
126
132
|
}
|
|
127
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
|
+
|
|
128
157
|
async open() {
|
|
129
158
|
if (this._open) {
|
|
130
159
|
return;
|
|
131
160
|
}
|
|
132
161
|
|
|
162
|
+
assert(this._config, 'config not set');
|
|
163
|
+
assert(this._storage, 'storage not set');
|
|
164
|
+
assert(this._networkManager, 'network manager not set');
|
|
165
|
+
|
|
133
166
|
log('opening...');
|
|
134
167
|
await this._resourceLock?.acquire();
|
|
135
168
|
|
|
@@ -5,15 +5,15 @@
|
|
|
5
5
|
import assert from 'node:assert';
|
|
6
6
|
|
|
7
7
|
import { Trigger } from '@dxos/async';
|
|
8
|
+
import { ClientServices, SpaceInvitationsProxy } from '@dxos/client';
|
|
8
9
|
import { log } from '@dxos/log';
|
|
9
10
|
import { schema } from '@dxos/protocols';
|
|
10
11
|
import { Invitation, SpaceInvitationsService } from '@dxos/protocols/proto/dxos/client/services';
|
|
11
12
|
import { createLinkedPorts, createProtoRpcPeer, createServiceBundle } from '@dxos/rpc';
|
|
12
13
|
import { describe, test } from '@dxos/test';
|
|
13
14
|
|
|
14
|
-
import {
|
|
15
|
+
import { SpaceInvitationsServiceImpl } from '../invitations';
|
|
15
16
|
import { createServiceContext } from '../testing';
|
|
16
|
-
import { ClientServices } from './service-definitions';
|
|
17
17
|
import { ServiceRegistry } from './service-registry';
|
|
18
18
|
|
|
19
19
|
// TODO(burdon): Create TestService (that doesn't require peers).
|
|
@@ -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
|
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { ClientServicesProvider } from '@dxos/client';
|
|
6
|
+
import { Config } from '@dxos/config';
|
|
7
|
+
import { log } from '@dxos/log';
|
|
8
|
+
import { MemorySignalManager, MemorySignalManagerContext, WebsocketSignalManager } from '@dxos/messaging';
|
|
9
|
+
import {
|
|
10
|
+
createWebRTCTransportFactory,
|
|
11
|
+
MemoryTransportFactory,
|
|
12
|
+
NetworkManager,
|
|
13
|
+
NetworkManagerOptions
|
|
14
|
+
} from '@dxos/network-manager';
|
|
15
|
+
|
|
16
|
+
import { LocalClientServices } from './local-client-services';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Creates stand-alone services without rpc.
|
|
20
|
+
*/
|
|
21
|
+
export const fromHost = (config: Config = new Config()): ClientServicesProvider => {
|
|
22
|
+
return new LocalClientServices({
|
|
23
|
+
config,
|
|
24
|
+
networkManager: createNetworkManager(config)
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Creates a WebRTC network manager connected to the specified signal server.
|
|
30
|
+
*/
|
|
31
|
+
// TODO(burdon): Move to client-services and remove dependencies from here.
|
|
32
|
+
const createNetworkManager = (config: Config, options: Partial<NetworkManagerOptions> = {}): NetworkManager => {
|
|
33
|
+
const signalServer = config.get('runtime.services.signal.server');
|
|
34
|
+
if (signalServer) {
|
|
35
|
+
const {
|
|
36
|
+
log = true,
|
|
37
|
+
signalManager = new WebsocketSignalManager([signalServer]),
|
|
38
|
+
transportFactory = createWebRTCTransportFactory({
|
|
39
|
+
iceServers: config.get('runtime.services.ice')
|
|
40
|
+
})
|
|
41
|
+
} = options;
|
|
42
|
+
|
|
43
|
+
return new NetworkManager({ log, signalManager, transportFactory });
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// TODO(burdon): Should not provide a memory signal manager since no shared context.
|
|
47
|
+
// Use TestClientBuilder for shared memory tests.
|
|
48
|
+
log.warn('P2P network is not configured.');
|
|
49
|
+
return new NetworkManager({
|
|
50
|
+
signalManager: new MemorySignalManager(new MemorySignalManagerContext()),
|
|
51
|
+
transportFactory: MemoryTransportFactory
|
|
52
|
+
});
|
|
53
|
+
};
|
|
@@ -12,12 +12,12 @@ import { log } from '@dxos/log';
|
|
|
12
12
|
import { ModelFactory } from '@dxos/model-factory';
|
|
13
13
|
import { test, describe } from '@dxos/test';
|
|
14
14
|
|
|
15
|
-
import { createSigningContext,
|
|
15
|
+
import { createSigningContext, HostTestBuilder, syncItemsLocal } from '../testing';
|
|
16
16
|
import { DataSpaceManager } from './data-space-manager';
|
|
17
17
|
|
|
18
18
|
describe('DataSpaceManager', () => {
|
|
19
19
|
test('create space', async () => {
|
|
20
|
-
const builder = new
|
|
20
|
+
const builder = new HostTestBuilder();
|
|
21
21
|
|
|
22
22
|
const peer = builder.createPeer();
|
|
23
23
|
const identity = await createSigningContext(peer.keyring);
|
|
@@ -43,7 +43,7 @@ describe('DataSpaceManager', () => {
|
|
|
43
43
|
});
|
|
44
44
|
|
|
45
45
|
test('sync between peers', async () => {
|
|
46
|
-
const builder = new
|
|
46
|
+
const builder = new HostTestBuilder();
|
|
47
47
|
|
|
48
48
|
const peer1 = builder.createPeer();
|
|
49
49
|
const identity1 = await createSigningContext(peer1.keyring);
|
|
@@ -121,7 +121,7 @@ describe('DataSpaceManager', () => {
|
|
|
121
121
|
});
|
|
122
122
|
log.break();
|
|
123
123
|
|
|
124
|
-
await
|
|
124
|
+
await syncItemsLocal(space1.dataPipelineController, space2.dataPipelineController);
|
|
125
125
|
|
|
126
126
|
expect(space1.inner.protocol.sessions.get(identity2.deviceKey)).to.exist;
|
|
127
127
|
expect(space1.inner.protocol.sessions.get(identity2.deviceKey)?.authStatus).to.equal(AuthStatus.SUCCESS);
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
import { MaybePromise } from '@dxos/util';
|
|
15
15
|
|
|
16
16
|
export type SystemServiceOptions = {
|
|
17
|
-
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
|
|
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
|
|
43
|
+
return this._config?.values ?? {};
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
async updateStatus({ status }: UpdateSystemStatusRequest) {
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { createDefaultModelFactory } from '@dxos/client';
|
|
6
|
+
import { Config } from '@dxos/config';
|
|
7
|
+
import { createCredentialSignerWithChain, CredentialGenerator } from '@dxos/credentials';
|
|
8
|
+
import {
|
|
9
|
+
SnapshotStore,
|
|
10
|
+
DataPipelineControllerImpl,
|
|
11
|
+
MetadataStore,
|
|
12
|
+
SigningContext,
|
|
13
|
+
SpaceManager,
|
|
14
|
+
valueEncoding
|
|
15
|
+
} from '@dxos/echo-pipeline';
|
|
16
|
+
import { testLocalDatabase } from '@dxos/echo-pipeline/testing';
|
|
17
|
+
import { FeedFactory, FeedStore } from '@dxos/feed-store';
|
|
18
|
+
import { Keyring } from '@dxos/keyring';
|
|
19
|
+
import { MemorySignalManager, MemorySignalManagerContext } from '@dxos/messaging';
|
|
20
|
+
import { MemoryTransportFactory, NetworkManager } from '@dxos/network-manager';
|
|
21
|
+
import { createStorage, Storage, StorageType } from '@dxos/random-access-storage';
|
|
22
|
+
|
|
23
|
+
import { ClientServicesHost, ServiceContext } from '../services';
|
|
24
|
+
|
|
25
|
+
//
|
|
26
|
+
// TODO(burdon): Replace with test builder.
|
|
27
|
+
//
|
|
28
|
+
|
|
29
|
+
export const createServiceHost = (config: Config, signalManagerContext: MemorySignalManagerContext) => {
|
|
30
|
+
const networkManager = new NetworkManager({
|
|
31
|
+
signalManager: new MemorySignalManager(signalManagerContext),
|
|
32
|
+
transportFactory: MemoryTransportFactory
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
return new ClientServicesHost({
|
|
36
|
+
config,
|
|
37
|
+
networkManager
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export const createServiceContext = ({
|
|
42
|
+
signalContext = new MemorySignalManagerContext(),
|
|
43
|
+
storage = createStorage({ type: StorageType.RAM })
|
|
44
|
+
}: {
|
|
45
|
+
signalContext?: MemorySignalManagerContext;
|
|
46
|
+
storage?: Storage;
|
|
47
|
+
} = {}) => {
|
|
48
|
+
const networkManager = new NetworkManager({
|
|
49
|
+
signalManager: new MemorySignalManager(signalContext),
|
|
50
|
+
transportFactory: MemoryTransportFactory
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
const modelFactory = createDefaultModelFactory();
|
|
54
|
+
return new ServiceContext(storage, networkManager, modelFactory);
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export const createPeers = async (numPeers: number) => {
|
|
58
|
+
const signalContext = new MemorySignalManagerContext();
|
|
59
|
+
|
|
60
|
+
return await Promise.all(
|
|
61
|
+
Array.from(Array(numPeers)).map(async () => {
|
|
62
|
+
const peer = createServiceContext({ signalContext });
|
|
63
|
+
await peer.open();
|
|
64
|
+
return peer;
|
|
65
|
+
})
|
|
66
|
+
);
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export const createIdentity = async (peer: ServiceContext) => {
|
|
70
|
+
await peer.createIdentity();
|
|
71
|
+
return peer;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
// TODO(burdon): Remove @dxos/client-testing.
|
|
75
|
+
// TODO(burdon): Create builder and make configurable.
|
|
76
|
+
export const syncItemsLocal = async (db1: DataPipelineControllerImpl, db2: DataPipelineControllerImpl) => {
|
|
77
|
+
await testLocalDatabase(db1, db2);
|
|
78
|
+
await testLocalDatabase(db2, db1);
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export class HostTestBuilder {
|
|
82
|
+
public readonly signalContext = new MemorySignalManagerContext();
|
|
83
|
+
|
|
84
|
+
createPeer(): TestPeer {
|
|
85
|
+
return new TestPeer(this.signalContext);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export type TestPeerProps = {
|
|
90
|
+
storage?: Storage;
|
|
91
|
+
feedStore?: FeedStore<any>;
|
|
92
|
+
metadataStore?: MetadataStore;
|
|
93
|
+
keyring?: Keyring;
|
|
94
|
+
networkManager?: NetworkManager;
|
|
95
|
+
spaceManager?: SpaceManager;
|
|
96
|
+
snapshotStore?: SnapshotStore;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
export class TestPeer {
|
|
100
|
+
private _props: TestPeerProps = {};
|
|
101
|
+
|
|
102
|
+
constructor(private readonly signalContext: MemorySignalManagerContext) {}
|
|
103
|
+
|
|
104
|
+
get storage() {
|
|
105
|
+
return (this._props.storage ??= createStorage({ type: StorageType.RAM }));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
get keyring() {
|
|
109
|
+
return (this._props.keyring ??= new Keyring(this.storage.createDirectory('keyring')));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
get feedStore() {
|
|
113
|
+
return (this._props.feedStore ??= new FeedStore({
|
|
114
|
+
factory: new FeedFactory({
|
|
115
|
+
root: this.storage.createDirectory('feeds'),
|
|
116
|
+
signer: this.keyring,
|
|
117
|
+
hypercore: {
|
|
118
|
+
valueEncoding
|
|
119
|
+
}
|
|
120
|
+
})
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
get metadataStore() {
|
|
125
|
+
return (this._props.metadataStore ??= new MetadataStore(this.storage.createDirectory('metadata')));
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
get snapshotStore() {
|
|
129
|
+
return (this._props.snapshotStore ??= new SnapshotStore(this.storage.createDirectory('snapshots')));
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
get networkManager() {
|
|
133
|
+
return (this._props.networkManager ??= new NetworkManager({
|
|
134
|
+
signalManager: new MemorySignalManager(this.signalContext),
|
|
135
|
+
transportFactory: MemoryTransportFactory
|
|
136
|
+
}));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
get spaceManager() {
|
|
140
|
+
return (this._props.spaceManager ??= new SpaceManager({
|
|
141
|
+
feedStore: this.feedStore,
|
|
142
|
+
networkManager: this.networkManager
|
|
143
|
+
}));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export const createSigningContext = async (keyring: Keyring): Promise<SigningContext> => {
|
|
148
|
+
const identityKey = await keyring.createKey();
|
|
149
|
+
const deviceKey = await keyring.createKey();
|
|
150
|
+
|
|
151
|
+
return {
|
|
152
|
+
identityKey,
|
|
153
|
+
deviceKey,
|
|
154
|
+
credentialSigner: createCredentialSignerWithChain(
|
|
155
|
+
keyring,
|
|
156
|
+
{
|
|
157
|
+
credential: await new CredentialGenerator(keyring, identityKey, deviceKey).createDeviceAuthorization(deviceKey)
|
|
158
|
+
},
|
|
159
|
+
deviceKey
|
|
160
|
+
),
|
|
161
|
+
recordCredential: async () => {} // No-op.
|
|
162
|
+
};
|
|
163
|
+
};
|
|
@@ -5,11 +5,10 @@
|
|
|
5
5
|
import assert from 'node:assert';
|
|
6
6
|
|
|
7
7
|
import { Trigger } from '@dxos/async';
|
|
8
|
+
import { InvitationsHandler } from '@dxos/client';
|
|
8
9
|
import { raise } from '@dxos/debug';
|
|
9
10
|
import { Invitation } from '@dxos/protocols/proto/dxos/client/services';
|
|
10
11
|
|
|
11
|
-
import { InvitationsHandler } from '../invitations';
|
|
12
|
-
|
|
13
12
|
export const performInvitation = async <T>(host: InvitationsHandler<T>, guest: InvitationsHandler<T>, context: T) => {
|
|
14
13
|
const done1 = new Trigger<Invitation>(); // peer 1 connected.
|
|
15
14
|
const done2 = new Trigger<Invitation>(); // peer 2 connected.
|