@dxos/client-services 0.1.22 → 0.1.24-next.6b1f434
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-ZPZBLOQW.mjs +4086 -0
- package/dist/lib/browser/chunk-ZPZBLOQW.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +68 -3027
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/packlets/testing/index.mjs +198 -0
- package/dist/lib/browser/packlets/testing/index.mjs.map +7 -0
- package/dist/lib/node/index.cjs +1694 -667
- 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 +3806 -0
- package/dist/lib/node/packlets/testing/index.cjs.map +7 -0
- package/dist/types/src/packlets/deprecated/profile.d.ts +3 -1
- package/dist/types/src/packlets/deprecated/profile.d.ts.map +1 -1
- package/dist/types/src/packlets/deprecated/space.d.ts.map +1 -1
- package/dist/types/src/packlets/deprecated/system.d.ts +15 -9
- package/dist/types/src/packlets/deprecated/system.d.ts.map +1 -1
- package/dist/types/src/packlets/devtools/devtools.d.ts +2 -2
- package/dist/types/src/packlets/devtools/devtools.d.ts.map +1 -1
- package/dist/types/src/packlets/devtools/feeds.d.ts.map +1 -1
- package/dist/types/src/packlets/devtools/network.d.ts +3 -3
- package/dist/types/src/packlets/devtools/network.d.ts.map +1 -1
- package/dist/types/src/packlets/devtools/spaces.d.ts.map +1 -1
- package/dist/types/src/packlets/identity/authenticator.d.ts +9 -9
- package/dist/types/src/packlets/identity/authenticator.d.ts.map +1 -1
- package/dist/types/src/packlets/identity/identity-manager.d.ts +8 -2
- package/dist/types/src/packlets/identity/identity-manager.d.ts.map +1 -1
- package/dist/types/src/packlets/identity/identity.d.ts +5 -4
- package/dist/types/src/packlets/identity/identity.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/halo-invitations-handler.d.ts +11 -3
- package/dist/types/src/packlets/invitations/halo-invitations-handler.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/invitations.d.ts +1 -1
- package/dist/types/src/packlets/invitations/invitations.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/space-invitations-handler.d.ts +1 -1
- package/dist/types/src/packlets/invitations/space-invitations-handler.d.ts.map +1 -1
- package/dist/types/src/packlets/services/service-context.d.ts +3 -1
- package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
- package/dist/types/src/packlets/services/service-context.test.d.ts +2 -0
- package/dist/types/src/packlets/services/service-context.test.d.ts.map +1 -0
- package/dist/types/src/packlets/services/service-definitions.d.ts +1 -1
- package/dist/types/src/packlets/services/service-definitions.d.ts.map +1 -1
- package/dist/types/src/packlets/services/service-host.d.ts +9 -6
- package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
- package/dist/types/src/packlets/services/service-registry.d.ts +4 -3
- package/dist/types/src/packlets/services/service-registry.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/data-space-manager.d.ts +9 -2
- package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/data-space-manager.test.d.ts +2 -0
- package/dist/types/src/packlets/spaces/data-space-manager.test.d.ts.map +1 -0
- package/dist/types/src/packlets/spaces/data-space.d.ts +20 -4
- package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/notarization-plugin.d.ts +50 -0
- package/dist/types/src/packlets/spaces/notarization-plugin.d.ts.map +1 -0
- package/dist/types/src/packlets/spaces/notarization-plugin.test.d.ts +2 -0
- package/dist/types/src/packlets/spaces/notarization-plugin.test.d.ts.map +1 -0
- package/dist/types/src/packlets/spaces/spaces-service.d.ts +3 -2
- package/dist/types/src/packlets/spaces/spaces-service.d.ts.map +1 -1
- package/dist/types/src/packlets/testing/credential-utils.d.ts +8 -0
- package/dist/types/src/packlets/testing/credential-utils.d.ts.map +1 -0
- package/dist/types/src/packlets/testing/index.d.ts +2 -0
- package/dist/types/src/packlets/testing/index.d.ts.map +1 -1
- package/dist/types/src/packlets/testing/invitation-utils.d.ts +3 -0
- package/dist/types/src/packlets/testing/invitation-utils.d.ts.map +1 -0
- package/dist/types/src/packlets/testing/test-builder.d.ts +31 -2
- package/dist/types/src/packlets/testing/test-builder.d.ts.map +1 -1
- package/dist/types/src/packlets/vault/iframe-host-runtime.d.ts +35 -0
- package/dist/types/src/packlets/vault/iframe-host-runtime.d.ts.map +1 -0
- package/dist/types/src/packlets/vault/{iframe-runtime.d.ts → iframe-proxy-runtime.d.ts} +9 -4
- package/dist/types/src/packlets/vault/iframe-proxy-runtime.d.ts.map +1 -0
- package/dist/types/src/packlets/vault/index.d.ts +6 -1
- package/dist/types/src/packlets/vault/index.d.ts.map +1 -1
- package/dist/types/src/packlets/vault/services.d.ts +9 -1
- package/dist/types/src/packlets/vault/services.d.ts.map +1 -1
- package/dist/types/src/packlets/vault/shell-controller.d.ts +24 -0
- package/dist/types/src/packlets/vault/shell-controller.d.ts.map +1 -0
- package/dist/types/src/packlets/vault/shell-runtime.d.ts +45 -0
- package/dist/types/src/packlets/vault/shell-runtime.d.ts.map +1 -0
- package/dist/types/src/packlets/vault/vault-resource-lock.d.ts +19 -0
- package/dist/types/src/packlets/vault/vault-resource-lock.d.ts.map +1 -0
- package/dist/types/src/packlets/vault/worker-runtime.d.ts +2 -1
- package/dist/types/src/packlets/vault/worker-runtime.d.ts.map +1 -1
- package/dist/types/src/packlets/vault/worker-session.d.ts +7 -4
- package/dist/types/src/packlets/vault/worker-session.d.ts.map +1 -1
- package/package.json +30 -29
- package/src/packlets/deprecated/profile.ts +20 -2
- package/src/packlets/deprecated/space.ts +41 -37
- package/src/packlets/deprecated/system.ts +26 -13
- package/src/packlets/devtools/devtools.ts +4 -4
- package/src/packlets/devtools/feeds.ts +11 -6
- package/src/packlets/devtools/network.ts +20 -9
- package/src/packlets/devtools/spaces.ts +8 -7
- package/src/packlets/identity/authenticator.test.ts +4 -4
- package/src/packlets/identity/authenticator.ts +27 -17
- package/src/packlets/identity/identity-manager.test.ts +25 -16
- package/src/packlets/identity/identity-manager.ts +25 -13
- package/src/packlets/identity/identity.test.ts +22 -23
- package/src/packlets/identity/identity.ts +15 -10
- package/src/packlets/invitations/halo-invitations-handler.test.ts +4 -45
- package/src/packlets/invitations/halo-invitations-handler.ts +33 -17
- package/src/packlets/invitations/invitations.ts +2 -1
- package/src/packlets/invitations/space-invitations-handler.test.ts +43 -26
- package/src/packlets/invitations/space-invitations-handler.ts +9 -12
- package/src/packlets/services/service-context.test.ts +56 -0
- package/src/packlets/services/service-context.ts +62 -10
- package/src/packlets/services/service-definitions.ts +1 -1
- package/src/packlets/services/service-host.test.ts +74 -5
- package/src/packlets/services/service-host.ts +86 -24
- package/src/packlets/services/service-registry.test.ts +2 -1
- package/src/packlets/services/service-registry.ts +5 -1
- package/src/packlets/spaces/data-space-manager.test.ts +131 -0
- package/src/packlets/spaces/data-space-manager.ts +61 -15
- package/src/packlets/spaces/data-space.ts +125 -14
- package/src/packlets/spaces/notarization-plugin.test.ts +81 -0
- package/src/packlets/spaces/notarization-plugin.ts +211 -0
- package/src/packlets/spaces/spaces-service.ts +10 -2
- package/src/packlets/testing/credential-utils.ts +28 -0
- package/src/packlets/testing/index.ts +2 -0
- package/src/packlets/testing/invitation-utils.ts +44 -0
- package/src/packlets/testing/test-builder.ts +96 -14
- package/src/packlets/vault/iframe-host-runtime.ts +131 -0
- package/src/packlets/vault/{iframe-runtime.ts → iframe-proxy-runtime.ts} +18 -3
- package/src/packlets/vault/index.ts +6 -1
- package/src/packlets/vault/services.ts +17 -1
- package/src/packlets/vault/shell-controller.ts +77 -0
- package/src/packlets/vault/shell-runtime.ts +133 -0
- package/src/packlets/vault/vault-resource-lock.ts +76 -0
- package/src/packlets/vault/worker-runtime.ts +16 -4
- package/src/packlets/vault/worker-session.ts +36 -26
- package/dist/types/src/packlets/vault/iframe-runtime.d.ts.map +0 -1
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2023 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { asyncTimeout, Trigger } from '@dxos/async';
|
|
6
|
+
import { log } from '@dxos/log';
|
|
7
|
+
import { MaybePromise } from '@dxos/util';
|
|
8
|
+
|
|
9
|
+
enum Message {
|
|
10
|
+
ACQUIRING = 'acquiring'
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export type VaultResourceLockOptions = {
|
|
14
|
+
lockKey: string;
|
|
15
|
+
onAcquire?: () => MaybePromise<void>;
|
|
16
|
+
onRelease?: () => MaybePromise<void>;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export class VaultResourceLock {
|
|
20
|
+
private readonly _broadcastChannel = new BroadcastChannel('vault-resource-lock');
|
|
21
|
+
private readonly _lockKey: string;
|
|
22
|
+
private readonly _onAcquire: VaultResourceLockOptions['onAcquire'];
|
|
23
|
+
private readonly _onRelease: VaultResourceLockOptions['onRelease'];
|
|
24
|
+
private _releaseTrigger = new Trigger();
|
|
25
|
+
|
|
26
|
+
constructor({ lockKey, onAcquire, onRelease }: VaultResourceLockOptions) {
|
|
27
|
+
this._lockKey = lockKey;
|
|
28
|
+
this._onAcquire = onAcquire;
|
|
29
|
+
this._onRelease = onRelease;
|
|
30
|
+
this._broadcastChannel.onmessage = this._onMessage.bind(this);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async acquire() {
|
|
34
|
+
this._broadcastChannel.postMessage({
|
|
35
|
+
message: Message.ACQUIRING
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
try {
|
|
39
|
+
await asyncTimeout(this._requestLock(), 3_000);
|
|
40
|
+
} catch {
|
|
41
|
+
await this._requestLock(true);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async release() {
|
|
46
|
+
this._releaseTrigger.wake();
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
private _onMessage(event: MessageEvent<any>) {
|
|
50
|
+
if (event.data.message === Message.ACQUIRING) {
|
|
51
|
+
this._releaseTrigger.wake();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
private async _requestLock(steal = false) {
|
|
56
|
+
log('requesting lock...', { steal });
|
|
57
|
+
const acquired = new Trigger();
|
|
58
|
+
|
|
59
|
+
void navigator.locks
|
|
60
|
+
.request(this._lockKey, { steal }, async () => {
|
|
61
|
+
await this._onAcquire?.();
|
|
62
|
+
acquired.wake();
|
|
63
|
+
this._releaseTrigger = new Trigger();
|
|
64
|
+
await this._releaseTrigger.wait();
|
|
65
|
+
log('releasing lock...');
|
|
66
|
+
await this._onRelease?.();
|
|
67
|
+
log('released lock');
|
|
68
|
+
})
|
|
69
|
+
.catch(async () => {
|
|
70
|
+
await this._onRelease?.();
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
await acquired.wait();
|
|
74
|
+
log('recieved lock', { steal });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import { Trigger } from '@dxos/async';
|
|
6
6
|
import { Config } from '@dxos/config';
|
|
7
|
+
import { log } from '@dxos/log';
|
|
7
8
|
import { MemorySignalManager, MemorySignalManagerContext, WebsocketSignalManager } from '@dxos/messaging';
|
|
8
9
|
import { NetworkManager, WebRTCTransportProxyFactory } from '@dxos/network-manager';
|
|
9
10
|
import { RpcPort } from '@dxos/rpc';
|
|
@@ -16,6 +17,7 @@ import { WorkerSession } from './worker-session';
|
|
|
16
17
|
export type CreateSessionParams = {
|
|
17
18
|
appPort: RpcPort;
|
|
18
19
|
systemPort: RpcPort;
|
|
20
|
+
shellPort: RpcPort;
|
|
19
21
|
};
|
|
20
22
|
|
|
21
23
|
/**
|
|
@@ -37,6 +39,7 @@ export class WorkerRuntime {
|
|
|
37
39
|
) { }
|
|
38
40
|
|
|
39
41
|
async start() {
|
|
42
|
+
log('starting...');
|
|
40
43
|
try {
|
|
41
44
|
this._config = await this._configProvider();
|
|
42
45
|
const signalServer = this._config.get('runtime.services.signal.server');
|
|
@@ -53,8 +56,10 @@ export class WorkerRuntime {
|
|
|
53
56
|
|
|
54
57
|
await this._clientServices.open();
|
|
55
58
|
this._ready.wake(undefined);
|
|
59
|
+
log('started');
|
|
56
60
|
} catch (err: any) {
|
|
57
61
|
this._ready.wake(err);
|
|
62
|
+
log.catch(err);
|
|
58
63
|
}
|
|
59
64
|
}
|
|
60
65
|
|
|
@@ -66,17 +71,24 @@ export class WorkerRuntime {
|
|
|
66
71
|
/**
|
|
67
72
|
* Create a new session.
|
|
68
73
|
*/
|
|
69
|
-
async createSession({ appPort, systemPort }: CreateSessionParams) {
|
|
74
|
+
async createSession({ appPort, systemPort, shellPort }: CreateSessionParams) {
|
|
70
75
|
const session = new WorkerSession({
|
|
71
|
-
|
|
76
|
+
getService: async (find) => {
|
|
72
77
|
const error = await this._ready.wait();
|
|
73
|
-
if (error
|
|
78
|
+
if (error) {
|
|
74
79
|
throw error;
|
|
75
80
|
}
|
|
76
|
-
|
|
81
|
+
|
|
82
|
+
const service = find(this._clientServices.services);
|
|
83
|
+
if (!service) {
|
|
84
|
+
throw new Error('Service not found');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return service;
|
|
77
88
|
},
|
|
78
89
|
appPort,
|
|
79
90
|
systemPort,
|
|
91
|
+
shellPort,
|
|
80
92
|
readySignal: this._ready
|
|
81
93
|
});
|
|
82
94
|
|
|
@@ -4,19 +4,20 @@
|
|
|
4
4
|
|
|
5
5
|
import assert from 'node:assert';
|
|
6
6
|
|
|
7
|
-
import { Trigger } from '@dxos/async';
|
|
7
|
+
import { asyncTimeout, Trigger } from '@dxos/async';
|
|
8
8
|
import { log, logInfo } from '@dxos/log';
|
|
9
9
|
import { BridgeService } from '@dxos/protocols/proto/dxos/mesh/bridge';
|
|
10
10
|
import { createProtoRpcPeer, ProtoRpcPeer, RpcPort } from '@dxos/rpc';
|
|
11
11
|
import { Callback } from '@dxos/util';
|
|
12
12
|
|
|
13
|
-
import { clientServiceBundle, ClientServices
|
|
13
|
+
import { clientServiceBundle, ClientServices } from '../services';
|
|
14
14
|
import { IframeServiceBundle, iframeServiceBundle, workerServiceBundle } from './services';
|
|
15
15
|
|
|
16
16
|
export type WorkerSessionParams = {
|
|
17
|
-
|
|
17
|
+
getService: <Service>(find: (services: Partial<ClientServices>) => Service | undefined) => Promise<Service>;
|
|
18
18
|
systemPort: RpcPort;
|
|
19
19
|
appPort: RpcPort;
|
|
20
|
+
shellPort: RpcPort;
|
|
20
21
|
readySignal: Trigger<Error | undefined>;
|
|
21
22
|
options?: {
|
|
22
23
|
heartbeatInterval: number;
|
|
@@ -28,9 +29,10 @@ export type WorkerSessionParams = {
|
|
|
28
29
|
*/
|
|
29
30
|
export class WorkerSession {
|
|
30
31
|
private readonly _clientRpc: ProtoRpcPeer<ClientServices>;
|
|
32
|
+
private readonly _shellClientRpc: ProtoRpcPeer<ClientServices>;
|
|
31
33
|
private readonly _iframeRpc: ProtoRpcPeer<IframeServiceBundle>;
|
|
32
34
|
private readonly _startTrigger = new Trigger();
|
|
33
|
-
private readonly
|
|
35
|
+
private readonly _getService: WorkerSessionParams['getService'];
|
|
34
36
|
private readonly _options: NonNullable<WorkerSessionParams['options']>;
|
|
35
37
|
private _heartbeatTimer?: NodeJS.Timeout;
|
|
36
38
|
|
|
@@ -42,35 +44,35 @@ export class WorkerSession {
|
|
|
42
44
|
public bridgeService?: BridgeService;
|
|
43
45
|
|
|
44
46
|
constructor({
|
|
45
|
-
|
|
47
|
+
getService,
|
|
46
48
|
systemPort,
|
|
47
49
|
appPort,
|
|
50
|
+
shellPort,
|
|
48
51
|
options = {
|
|
49
52
|
heartbeatInterval: 1_000
|
|
50
53
|
}
|
|
51
54
|
}: WorkerSessionParams) {
|
|
52
55
|
assert(options);
|
|
53
|
-
assert(
|
|
56
|
+
assert(getService);
|
|
54
57
|
this._options = options;
|
|
55
|
-
this.
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
});
|
|
58
|
+
this._getService = getService;
|
|
59
|
+
|
|
60
|
+
const handlers = {
|
|
61
|
+
DataService: async () => await this._getService((services) => services.DataService),
|
|
62
|
+
DevicesService: async () => await this._getService((services) => services.DevicesService),
|
|
63
|
+
DevtoolsHost: async () => await this._getService((services) => services.DevtoolsHost),
|
|
64
|
+
HaloInvitationsService: async () => await this._getService((services) => services.HaloInvitationsService),
|
|
65
|
+
NetworkService: async () => await this._getService((services) => services.NetworkService),
|
|
66
|
+
ProfileService: async () => await this._getService((services) => services.ProfileService),
|
|
67
|
+
SpaceInvitationsService: async () => await this._getService((services) => services.SpaceInvitationsService),
|
|
68
|
+
SpaceService: async () => await this._getService((services) => services.SpaceService),
|
|
69
|
+
SpacesService: async () => await this._getService((services) => services.SpacesService),
|
|
70
|
+
SystemService: async () => await this._getService((services) => services.SystemService),
|
|
71
|
+
TracingService: async () => await this._getService((services) => services.TracingService)
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
this._clientRpc = createProtoRpcPeer({ exposed: clientServiceBundle, handlers, port: appPort });
|
|
75
|
+
this._shellClientRpc = createProtoRpcPeer({ exposed: clientServiceBundle, handlers, port: shellPort });
|
|
74
76
|
|
|
75
77
|
this._iframeRpc = createProtoRpcPeer({
|
|
76
78
|
requested: iframeServiceBundle,
|
|
@@ -102,7 +104,7 @@ export class WorkerSession {
|
|
|
102
104
|
|
|
103
105
|
async open() {
|
|
104
106
|
log.info('opening..');
|
|
105
|
-
await Promise.all([this._clientRpc.open(), this._iframeRpc.open()]);
|
|
107
|
+
await Promise.all([this._clientRpc.open(), this._iframeRpc.open(), this._maybeOpenShell()]);
|
|
106
108
|
|
|
107
109
|
await this._startTrigger.wait({ timeout: 3_000 });
|
|
108
110
|
|
|
@@ -137,4 +139,12 @@ export class WorkerSession {
|
|
|
137
139
|
|
|
138
140
|
await Promise.all([this._clientRpc.close(), this._iframeRpc.close()]);
|
|
139
141
|
}
|
|
142
|
+
|
|
143
|
+
private async _maybeOpenShell() {
|
|
144
|
+
try {
|
|
145
|
+
await asyncTimeout(this._shellClientRpc.open(), 1_000);
|
|
146
|
+
} catch {
|
|
147
|
+
log.info('No shell connected.');
|
|
148
|
+
}
|
|
149
|
+
}
|
|
140
150
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"iframe-runtime.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/vault/iframe-runtime.ts"],"names":[],"mappings":"AAMA,OAAO,EAAoC,OAAO,EAAE,MAAM,WAAW,CAAC;AAKtE,oBAAY,mBAAmB,GAAG;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IACtC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoC;IAC/D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAgC;gBAEtD,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,EAAE,mBAAmB;IAwBvE,IAAI,CAAC,MAAM,EAAE,MAAM;IAKnB,KAAK;CAIZ"}
|