@dxos/client-services 0.8.4-main.84f28bd → 0.8.4-main.937b3ca
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-NQSC7HOE.mjs +22 -0
- package/dist/lib/browser/chunk-NQSC7HOE.mjs.map +7 -0
- package/dist/lib/browser/chunk-QCWEHHJW.mjs +24 -0
- package/dist/lib/browser/chunk-QCWEHHJW.mjs.map +7 -0
- package/dist/lib/browser/{chunk-OCFDRCSN.mjs → chunk-UDCUM4WV.mjs} +3626 -3714
- package/dist/lib/browser/chunk-UDCUM4WV.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +462 -76
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/packlets/diagnostics/browser-diagnostics-broadcast.mjs +93 -0
- package/dist/lib/browser/packlets/diagnostics/browser-diagnostics-broadcast.mjs.map +7 -0
- package/dist/lib/browser/packlets/diagnostics/diagnostics-broadcast.mjs +11 -0
- package/dist/lib/browser/packlets/diagnostics/diagnostics-broadcast.mjs.map +7 -0
- package/dist/lib/browser/packlets/locks/browser.mjs +126 -0
- package/dist/lib/browser/packlets/locks/browser.mjs.map +7 -0
- package/dist/lib/browser/packlets/locks/node.mjs +66 -0
- package/dist/lib/browser/packlets/locks/node.mjs.map +7 -0
- package/dist/lib/browser/testing/index.mjs +34 -22
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/lib/node-esm/chunk-2SZHAWBN.mjs +24 -0
- package/dist/lib/node-esm/chunk-2SZHAWBN.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-PKEGMOQ4.mjs +22 -0
- package/dist/lib/node-esm/chunk-PKEGMOQ4.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-D7F3FYZS.mjs → chunk-Q56HAUWS.mjs} +2636 -2592
- package/dist/lib/node-esm/chunk-Q56HAUWS.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +462 -76
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/packlets/diagnostics/browser-diagnostics-broadcast.mjs +93 -0
- package/dist/lib/node-esm/packlets/diagnostics/browser-diagnostics-broadcast.mjs.map +7 -0
- package/dist/lib/node-esm/packlets/diagnostics/diagnostics-broadcast.mjs +11 -0
- package/dist/lib/node-esm/packlets/diagnostics/diagnostics-broadcast.mjs.map +7 -0
- package/dist/lib/node-esm/packlets/locks/browser.mjs +126 -0
- package/dist/lib/node-esm/packlets/locks/browser.mjs.map +7 -0
- package/dist/lib/node-esm/packlets/locks/node.mjs +66 -0
- package/dist/lib/node-esm/packlets/locks/node.mjs.map +7 -0
- package/dist/lib/node-esm/testing/index.mjs +34 -22
- package/dist/lib/node-esm/testing/index.mjs.map +3 -3
- package/dist/types/src/packlets/agents/edge-agent-service.d.ts +1 -1
- package/dist/types/src/packlets/agents/edge-agent-service.d.ts.map +1 -1
- package/dist/types/src/packlets/devices/devices-service.d.ts.map +1 -1
- package/dist/types/src/packlets/devtools/devtools.d.ts +20 -20
- package/dist/types/src/packlets/devtools/devtools.d.ts.map +1 -1
- package/dist/types/src/packlets/devtools/feeds.d.ts +1 -1
- package/dist/types/src/packlets/devtools/feeds.d.ts.map +1 -1
- package/dist/types/src/packlets/devtools/network.d.ts +1 -1
- package/dist/types/src/packlets/devtools/network.d.ts.map +1 -1
- package/dist/types/src/packlets/diagnostics/browser-diagnostics-broadcast.d.ts +1 -1
- package/dist/types/src/packlets/diagnostics/browser-diagnostics-broadcast.d.ts.map +1 -1
- package/dist/types/src/packlets/diagnostics/diagnostics-broadcast.d.ts +1 -1
- package/dist/types/src/packlets/diagnostics/diagnostics-broadcast.d.ts.map +1 -1
- package/dist/types/src/packlets/diagnostics/diagnostics.d.ts +1 -1
- package/dist/types/src/packlets/diagnostics/diagnostics.d.ts.map +1 -1
- package/dist/types/src/packlets/diagnostics/index.d.ts +1 -1
- package/dist/types/src/packlets/diagnostics/index.d.ts.map +1 -1
- package/dist/types/src/packlets/identity/authenticator.d.ts +2 -2
- package/dist/types/src/packlets/identity/authenticator.d.ts.map +1 -1
- package/dist/types/src/packlets/identity/contacts-service.d.ts +1 -1
- package/dist/types/src/packlets/identity/contacts-service.d.ts.map +1 -1
- package/dist/types/src/packlets/identity/default-space-state-machine.d.ts +3 -3
- package/dist/types/src/packlets/identity/default-space-state-machine.d.ts.map +1 -1
- package/dist/types/src/packlets/identity/identity-manager.d.ts +5 -5
- package/dist/types/src/packlets/identity/identity-manager.d.ts.map +1 -1
- package/dist/types/src/packlets/identity/identity-recovery-manager.d.ts +2 -2
- package/dist/types/src/packlets/identity/identity-recovery-manager.d.ts.map +1 -1
- package/dist/types/src/packlets/identity/identity-service.d.ts +1 -1
- package/dist/types/src/packlets/identity/identity-service.d.ts.map +1 -1
- package/dist/types/src/packlets/identity/identity.d.ts +3 -3
- package/dist/types/src/packlets/identity/identity.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts +4 -4
- package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/edge-invitation-handler.d.ts +1 -1
- package/dist/types/src/packlets/invitations/edge-invitation-handler.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/index.d.ts +1 -1
- package/dist/types/src/packlets/invitations/index.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/invitation-guest-extenstion.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/invitation-host-extension.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/invitation-protocol.d.ts +3 -4
- package/dist/types/src/packlets/invitations/invitation-protocol.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/invitations-handler.d.ts +4 -4
- package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/invitations-manager.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/invitations-service.d.ts +1 -1
- package/dist/types/src/packlets/invitations/invitations-service.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts +3 -3
- package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/utils.d.ts.map +1 -1
- package/dist/types/src/packlets/locks/index.d.ts +2 -2
- package/dist/types/src/packlets/locks/index.d.ts.map +1 -1
- package/dist/types/src/packlets/logging/logging-service.d.ts +1 -1
- package/dist/types/src/packlets/logging/logging-service.d.ts.map +1 -1
- package/dist/types/src/packlets/network/network-service.d.ts +2 -2
- package/dist/types/src/packlets/network/network-service.d.ts.map +1 -1
- package/dist/types/src/packlets/services/client-rpc-server.d.ts +2 -2
- package/dist/types/src/packlets/services/client-rpc-server.d.ts.map +1 -1
- package/dist/types/src/packlets/services/service-context.d.ts +14 -8
- package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
- package/dist/types/src/packlets/services/service-host.d.ts +20 -6
- package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
- package/dist/types/src/packlets/space-export/space-archive-writer.d.ts +1 -1
- package/dist/types/src/packlets/space-export/space-archive-writer.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/automerge-space-state.d.ts +1 -1
- package/dist/types/src/packlets/spaces/automerge-space-state.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/data-space-manager.d.ts +12 -7
- package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/data-space.d.ts +6 -6
- package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/edge-feed-replicator.d.ts +2 -2
- package/dist/types/src/packlets/spaces/edge-feed-replicator.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/notarization-plugin.d.ts +6 -6
- package/dist/types/src/packlets/spaces/notarization-plugin.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/spaces-service.d.ts +2 -2
- package/dist/types/src/packlets/spaces/spaces-service.d.ts.map +1 -1
- package/dist/types/src/packlets/storage/profile-archive.d.ts.map +1 -1
- package/dist/types/src/packlets/storage/storage.d.ts.map +1 -1
- package/dist/types/src/packlets/system/system-service.d.ts +1 -1
- package/dist/types/src/packlets/system/system-service.d.ts.map +1 -1
- package/dist/types/src/packlets/testing/invitation-utils.d.ts +6 -3
- package/dist/types/src/packlets/testing/invitation-utils.d.ts.map +1 -1
- package/dist/types/src/packlets/testing/test-builder.d.ts +8 -7
- package/dist/types/src/packlets/testing/test-builder.d.ts.map +1 -1
- package/dist/types/src/packlets/worker/worker-runtime.d.ts +23 -4
- package/dist/types/src/packlets/worker/worker-runtime.d.ts.map +1 -1
- package/dist/types/src/packlets/worker/worker-session.d.ts +2 -2
- package/dist/types/src/packlets/worker/worker-session.d.ts.map +1 -1
- package/dist/types/src/version.d.ts +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +72 -48
- package/src/packlets/agents/edge-agent-manager.ts +2 -2
- package/src/packlets/agents/edge-agent-service.ts +13 -3
- package/src/packlets/devices/devices-service.test.ts +4 -3
- package/src/packlets/devices/devices-service.ts +2 -2
- package/src/packlets/devtools/devtools.ts +30 -29
- package/src/packlets/devtools/feeds.ts +2 -2
- package/src/packlets/devtools/network.ts +1 -1
- package/src/packlets/diagnostics/browser-diagnostics-broadcast.ts +1 -1
- package/src/packlets/diagnostics/diagnostics-broadcast.ts +1 -1
- package/src/packlets/diagnostics/diagnostics-collector.ts +1 -1
- package/src/packlets/diagnostics/diagnostics.ts +1 -1
- package/src/packlets/diagnostics/index.ts +1 -1
- package/src/packlets/identity/authenticator.node.test.ts +1 -1
- package/src/packlets/identity/authenticator.ts +3 -3
- package/src/packlets/identity/contacts-service.ts +3 -2
- package/src/packlets/identity/default-space-state-machine.ts +3 -3
- package/src/packlets/identity/identity-manager.test.ts +3 -3
- package/src/packlets/identity/identity-manager.ts +9 -9
- package/src/packlets/identity/identity-recovery-manager.ts +2 -2
- package/src/packlets/identity/identity-service.test.ts +3 -2
- package/src/packlets/identity/identity-service.ts +2 -1
- package/src/packlets/identity/identity.test.ts +9 -9
- package/src/packlets/identity/identity.ts +9 -8
- package/src/packlets/invitations/device-invitation-protocol.test.ts +4 -4
- package/src/packlets/invitations/device-invitation-protocol.ts +6 -5
- package/src/packlets/invitations/edge-invitation-handler.ts +1 -1
- package/src/packlets/invitations/index.ts +1 -1
- package/src/packlets/invitations/invitation-guest-extenstion.ts +7 -5
- package/src/packlets/invitations/invitation-host-extension.ts +8 -6
- package/src/packlets/invitations/invitation-protocol.ts +3 -4
- package/src/packlets/invitations/invitations-handler.test.ts +302 -292
- package/src/packlets/invitations/invitations-handler.ts +10 -10
- package/src/packlets/invitations/invitations-manager.ts +3 -3
- package/src/packlets/invitations/invitations-service.ts +1 -1
- package/src/packlets/invitations/space-invitation-protocol.test.ts +9 -9
- package/src/packlets/invitations/space-invitation-protocol.ts +10 -15
- package/src/packlets/invitations/utils.ts +1 -1
- package/src/packlets/locks/browser.ts +1 -1
- package/src/packlets/locks/index.ts +2 -2
- package/src/packlets/logging/logging-service.ts +4 -3
- package/src/packlets/logging/logging.test.ts +1 -1
- package/src/packlets/network/network-service.test.ts +4 -3
- package/src/packlets/network/network-service.ts +2 -2
- package/src/packlets/services/client-rpc-server.ts +5 -5
- package/src/packlets/services/service-context.test.ts +1 -1
- package/src/packlets/services/service-context.ts +39 -27
- package/src/packlets/services/service-host.test.ts +3 -2
- package/src/packlets/services/service-host.ts +74 -25
- package/src/packlets/services/service-registry.test.ts +2 -1
- package/src/packlets/space-export/space-archive-reader.ts +2 -2
- package/src/packlets/space-export/space-archive-writer.ts +7 -5
- package/src/packlets/space-export/tar.test.ts +1 -1
- package/src/packlets/spaces/automerge-space-state.ts +1 -1
- package/src/packlets/spaces/data-space-manager.ts +76 -36
- package/src/packlets/spaces/data-space.ts +15 -13
- package/src/packlets/spaces/edge-feed-replicator.test.ts +3 -3
- package/src/packlets/spaces/edge-feed-replicator.ts +4 -4
- package/src/packlets/spaces/epoch-migrations.ts +2 -2
- package/src/packlets/spaces/notarization-plugin.test.ts +3 -3
- package/src/packlets/spaces/notarization-plugin.ts +11 -11
- package/src/packlets/spaces/spaces-service.test.ts +3 -2
- package/src/packlets/spaces/spaces-service.ts +27 -23
- package/src/packlets/storage/profile-archive.ts +1 -1
- package/src/packlets/storage/storage.ts +7 -8
- package/src/packlets/system/system-service.test.ts +1 -1
- package/src/packlets/system/system-service.ts +4 -4
- package/src/packlets/testing/invitation-utils.ts +8 -5
- package/src/packlets/testing/test-builder.ts +39 -13
- package/src/packlets/worker/worker-runtime.ts +143 -12
- package/src/packlets/worker/worker-session.ts +7 -7
- package/src/version.ts +1 -1
- package/dist/lib/browser/chunk-OCFDRCSN.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-D7F3FYZS.mjs.map +0 -7
|
@@ -2,11 +2,15 @@
|
|
|
2
2
|
// Copyright 2022 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import * as Reactivity from '@effect/experimental/Reactivity';
|
|
6
|
+
import * as Layer from 'effect/Layer';
|
|
7
|
+
import * as ManagedRuntime from 'effect/ManagedRuntime';
|
|
8
|
+
|
|
5
9
|
import { type Config } from '@dxos/config';
|
|
6
10
|
import { Context } from '@dxos/context';
|
|
7
|
-
import {
|
|
11
|
+
import { CredentialGenerator, createCredentialSignerWithChain } from '@dxos/credentials';
|
|
8
12
|
import { failUndefined } from '@dxos/debug';
|
|
9
|
-
import { EchoHost, MetadataStore, SpaceManager, valueEncoding
|
|
13
|
+
import { EchoHost, MeshEchoReplicator, MetadataStore, SpaceManager, valueEncoding } from '@dxos/echo-pipeline';
|
|
10
14
|
import { FeedFactory, FeedStore } from '@dxos/feed-store';
|
|
11
15
|
import { Keyring } from '@dxos/keyring';
|
|
12
16
|
import { type LevelDB } from '@dxos/kv-store';
|
|
@@ -14,12 +18,14 @@ import { createTestLevel } from '@dxos/kv-store/testing';
|
|
|
14
18
|
import { MemorySignalManager, MemorySignalManagerContext, type SignalManager } from '@dxos/messaging';
|
|
15
19
|
import { MemoryTransportFactory, SwarmNetworkManager } from '@dxos/network-manager';
|
|
16
20
|
import { Invitation } from '@dxos/protocols/proto/dxos/client/services';
|
|
17
|
-
import {
|
|
21
|
+
import { type Storage, StorageType, createStorage } from '@dxos/random-access-storage';
|
|
22
|
+
import { layerMemory as sqliteLayerMemory } from '@dxos/sql-sqlite/platform';
|
|
23
|
+
import * as SqlTransaction from '@dxos/sql-sqlite/SqlTransaction';
|
|
18
24
|
import { BlobStore } from '@dxos/teleport-extension-object-sync';
|
|
19
25
|
|
|
20
26
|
import { InvitationsHandler, InvitationsManager, SpaceInvitationProtocol } from '../invitations';
|
|
21
|
-
import { ClientServicesHost, ServiceContext, type
|
|
22
|
-
import { DataSpaceManager, type
|
|
27
|
+
import { ClientServicesHost, ServiceContext, type ServiceContextRuntimeProps } from '../services';
|
|
28
|
+
import { DataSpaceManager, type DataSpaceManagerRuntimeProps, type SigningContext } from '../spaces';
|
|
23
29
|
|
|
24
30
|
//
|
|
25
31
|
// TODO(burdon): Replace with test builder.
|
|
@@ -30,6 +36,11 @@ export const createServiceHost = (config: Config, signalManagerContext: MemorySi
|
|
|
30
36
|
config,
|
|
31
37
|
signalManager: new MemorySignalManager(signalManagerContext),
|
|
32
38
|
transportFactory: MemoryTransportFactory,
|
|
39
|
+
runtime: ManagedRuntime.make(
|
|
40
|
+
SqlTransaction.layer
|
|
41
|
+
.pipe(Layer.provideMerge(sqliteLayerMemory), Layer.provideMerge(Reactivity.layer))
|
|
42
|
+
.pipe(Layer.orDie),
|
|
43
|
+
).runtimeEffect,
|
|
33
44
|
});
|
|
34
45
|
};
|
|
35
46
|
|
|
@@ -39,11 +50,11 @@ export const createServiceContext = async ({
|
|
|
39
50
|
return new MemorySignalManager(signalContext);
|
|
40
51
|
},
|
|
41
52
|
storage = createStorage({ type: StorageType.RAM }),
|
|
42
|
-
|
|
53
|
+
runtimeProps,
|
|
43
54
|
}: {
|
|
44
55
|
signalManagerFactory?: () => Promise<SignalManager>;
|
|
45
56
|
storage?: Storage;
|
|
46
|
-
|
|
57
|
+
runtimeProps?: ServiceContextRuntimeProps;
|
|
47
58
|
} = {}) => {
|
|
48
59
|
const signalManager = await signalManagerFactory();
|
|
49
60
|
const networkManager = new SwarmNetworkManager({
|
|
@@ -53,9 +64,15 @@ export const createServiceContext = async ({
|
|
|
53
64
|
const level = createTestLevel();
|
|
54
65
|
await level.open();
|
|
55
66
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
67
|
+
const runtime = ManagedRuntime.make(
|
|
68
|
+
SqlTransaction.layer
|
|
69
|
+
.pipe(Layer.provideMerge(sqliteLayerMemory), Layer.provideMerge(Reactivity.layer))
|
|
70
|
+
.pipe(Layer.orDie),
|
|
71
|
+
).runtimeEffect;
|
|
72
|
+
|
|
73
|
+
return new ServiceContext(storage, level, networkManager, signalManager, undefined, undefined, runtime, {
|
|
74
|
+
invitationConnectionDefaultProps: { teleport: { controlHeartbeatInterval: 200 } },
|
|
75
|
+
...runtimeProps,
|
|
59
76
|
});
|
|
60
77
|
};
|
|
61
78
|
|
|
@@ -95,7 +112,7 @@ export class TestBuilder {
|
|
|
95
112
|
|
|
96
113
|
export type TestPeerOpts = {
|
|
97
114
|
dataStore?: StorageType;
|
|
98
|
-
|
|
115
|
+
dataSpaceProps?: DataSpaceManagerRuntimeProps;
|
|
99
116
|
};
|
|
100
117
|
|
|
101
118
|
export type TestPeerProps = {
|
|
@@ -116,6 +133,11 @@ export type TestPeerProps = {
|
|
|
116
133
|
|
|
117
134
|
export class TestPeer {
|
|
118
135
|
private _props: TestPeerProps = {};
|
|
136
|
+
private readonly _runtime = ManagedRuntime.make(
|
|
137
|
+
SqlTransaction.layer
|
|
138
|
+
.pipe(Layer.provideMerge(sqliteLayerMemory), Layer.provideMerge(Reactivity.layer))
|
|
139
|
+
.pipe(Layer.orDie),
|
|
140
|
+
);
|
|
119
141
|
|
|
120
142
|
constructor(
|
|
121
143
|
private readonly _signalContext: MemorySignalManagerContext,
|
|
@@ -179,7 +201,10 @@ export class TestPeer {
|
|
|
179
201
|
}
|
|
180
202
|
|
|
181
203
|
get echoHost() {
|
|
182
|
-
return (this._props.echoHost ??= new EchoHost({
|
|
204
|
+
return (this._props.echoHost ??= new EchoHost({
|
|
205
|
+
kv: this.level,
|
|
206
|
+
runtime: this._runtime.runtimeEffect,
|
|
207
|
+
}));
|
|
183
208
|
}
|
|
184
209
|
|
|
185
210
|
get meshEchoReplicator() {
|
|
@@ -198,7 +223,7 @@ export class TestPeer {
|
|
|
198
223
|
edgeConnection: undefined,
|
|
199
224
|
meshReplicator: this.meshEchoReplicator,
|
|
200
225
|
echoEdgeReplicator: undefined,
|
|
201
|
-
|
|
226
|
+
runtimeProps: this._opts.dataSpaceProps,
|
|
202
227
|
}));
|
|
203
228
|
}
|
|
204
229
|
|
|
@@ -227,6 +252,7 @@ export class TestPeer {
|
|
|
227
252
|
async destroy(): Promise<void> {
|
|
228
253
|
await this.level.close();
|
|
229
254
|
await this.storage.reset();
|
|
255
|
+
await this._runtime.dispose();
|
|
230
256
|
}
|
|
231
257
|
}
|
|
232
258
|
|
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
// Copyright 2022 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import * as Reactivity from '@effect/experimental/Reactivity';
|
|
6
|
+
import type * as SqlClient from '@effect/sql/SqlClient';
|
|
7
|
+
import * as Effect from 'effect/Effect';
|
|
8
|
+
import * as Layer from 'effect/Layer';
|
|
9
|
+
import * as ManagedRuntime from 'effect/ManagedRuntime';
|
|
10
|
+
|
|
5
11
|
import { Trigger } from '@dxos/async';
|
|
6
12
|
import { DEFAULT_WORKER_BROADCAST_CHANNEL } from '@dxos/client-protocol';
|
|
7
13
|
import { type Config } from '@dxos/config';
|
|
@@ -16,13 +22,18 @@ import {
|
|
|
16
22
|
} from '@dxos/messaging';
|
|
17
23
|
import { RtcTransportProxyFactory } from '@dxos/network-manager';
|
|
18
24
|
import { type RpcPort } from '@dxos/rpc';
|
|
25
|
+
import * as OpfsWorker from '@dxos/sql-sqlite/OpfsWorker';
|
|
26
|
+
import * as SqlExport from '@dxos/sql-sqlite/SqlExport';
|
|
27
|
+
import * as SqliteClient from '@dxos/sql-sqlite/SqliteClient';
|
|
28
|
+
import * as SqlTransaction from '@dxos/sql-sqlite/SqlTransaction';
|
|
19
29
|
import { type MaybePromise } from '@dxos/util';
|
|
20
30
|
|
|
21
|
-
import { WorkerSession } from './worker-session';
|
|
22
31
|
import { ClientServicesHost } from '../services';
|
|
23
32
|
|
|
33
|
+
import { WorkerSession } from './worker-session';
|
|
34
|
+
|
|
24
35
|
// NOTE: Keep as RpcPorts to avoid dependency on @dxos/rpc-tunnel so we don't depend on browser-specific apis.
|
|
25
|
-
export type
|
|
36
|
+
export type CreateSessionProps = {
|
|
26
37
|
appPort: RpcPort;
|
|
27
38
|
systemPort: RpcPort;
|
|
28
39
|
shellPort?: RpcPort;
|
|
@@ -34,10 +45,16 @@ export type WorkerRuntimeOptions = {
|
|
|
34
45
|
acquireLock: () => Promise<void>;
|
|
35
46
|
releaseLock: () => void;
|
|
36
47
|
onStop?: () => Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* @default true
|
|
50
|
+
*/
|
|
51
|
+
automaticallyConnectWebrtc?: boolean;
|
|
52
|
+
|
|
53
|
+
enableSqlite?: boolean;
|
|
37
54
|
};
|
|
38
55
|
|
|
39
56
|
/**
|
|
40
|
-
* Runtime for the shared worker.
|
|
57
|
+
* Runtime for the shared and dedciated worker.
|
|
41
58
|
* Manages connections from proxies (in tabs).
|
|
42
59
|
* Tabs make requests to the `ClientServicesHost`, and provide a WebRTC gateway.
|
|
43
60
|
*/
|
|
@@ -51,11 +68,17 @@ export class WorkerRuntime {
|
|
|
51
68
|
private readonly _sessions = new Set<WorkerSession>();
|
|
52
69
|
private readonly _clientServices!: ClientServicesHost;
|
|
53
70
|
private readonly _channel: string;
|
|
71
|
+
private readonly _automaticallyConnectWebrtc: boolean;
|
|
72
|
+
private readonly _livenessLock = new WebLockWrapper(`@dxos/client-services/WorkerRuntime/${crypto.randomUUID()}`);
|
|
54
73
|
private _broadcastChannel?: BroadcastChannel;
|
|
55
74
|
private _sessionForNetworking?: WorkerSession; // TODO(burdon): Expose to client QueryStatusResponse.
|
|
56
75
|
private _config!: Config;
|
|
57
76
|
private _signalMetadataTags: any = { runtime: 'worker-runtime' };
|
|
58
77
|
private _signalTelemetryEnabled: boolean = false;
|
|
78
|
+
private _runtime!: ManagedRuntime.ManagedRuntime<
|
|
79
|
+
SqlTransaction.SqlTransaction | SqlClient.SqlClient | SqlExport.SqlExport,
|
|
80
|
+
never
|
|
81
|
+
>;
|
|
59
82
|
|
|
60
83
|
constructor({
|
|
61
84
|
channel = DEFAULT_WORKER_BROADCAST_CHANNEL,
|
|
@@ -63,26 +86,47 @@ export class WorkerRuntime {
|
|
|
63
86
|
acquireLock,
|
|
64
87
|
releaseLock,
|
|
65
88
|
onStop,
|
|
89
|
+
automaticallyConnectWebrtc = true,
|
|
90
|
+
enableSqlite,
|
|
66
91
|
}: WorkerRuntimeOptions) {
|
|
67
92
|
this._configProvider = configProvider;
|
|
68
93
|
this._acquireLock = acquireLock;
|
|
69
94
|
this._releaseLock = releaseLock;
|
|
70
95
|
this._onStop = onStop;
|
|
71
96
|
this._channel = channel;
|
|
97
|
+
this._runtime = ManagedRuntime.make(
|
|
98
|
+
SqlTransaction.layer
|
|
99
|
+
.pipe(Layer.provideMerge(LocalSqliteOpfsLayer), Layer.provideMerge(Reactivity.layer))
|
|
100
|
+
.pipe(Layer.orDie),
|
|
101
|
+
);
|
|
72
102
|
this._clientServices = new ClientServicesHost({
|
|
73
103
|
callbacks: {
|
|
74
104
|
onReset: async () => this.stop(),
|
|
75
105
|
},
|
|
106
|
+
runtime: this._runtime.runtimeEffect,
|
|
107
|
+
runtimeProps: {
|
|
108
|
+
enableSqlite,
|
|
109
|
+
// Auto-activate spaces that were previously active after leader changeover.
|
|
110
|
+
autoActivateSpaces: true,
|
|
111
|
+
},
|
|
76
112
|
});
|
|
113
|
+
this._automaticallyConnectWebrtc = automaticallyConnectWebrtc;
|
|
77
114
|
}
|
|
78
115
|
|
|
79
116
|
get host() {
|
|
80
117
|
return this._clientServices;
|
|
81
118
|
}
|
|
82
119
|
|
|
120
|
+
get livenessLockKey(): string {
|
|
121
|
+
return this._livenessLock.key;
|
|
122
|
+
}
|
|
123
|
+
|
|
83
124
|
async start(): Promise<void> {
|
|
84
125
|
log('starting...');
|
|
85
126
|
try {
|
|
127
|
+
void this._livenessLock.acquire();
|
|
128
|
+
|
|
129
|
+
// Steal the lock from the other worker.
|
|
86
130
|
this._broadcastChannel = new BroadcastChannel(this._channel);
|
|
87
131
|
this._broadcastChannel.postMessage({ action: 'stop' });
|
|
88
132
|
this._broadcastChannel.onmessage = async (event) => {
|
|
@@ -126,13 +170,15 @@ export class WorkerRuntime {
|
|
|
126
170
|
this._broadcastChannel?.close();
|
|
127
171
|
this._broadcastChannel = undefined;
|
|
128
172
|
await this._clientServices.close();
|
|
173
|
+
await this._runtime.dispose();
|
|
129
174
|
await this._onStop?.();
|
|
175
|
+
await this._livenessLock.release();
|
|
130
176
|
}
|
|
131
177
|
|
|
132
178
|
/**
|
|
133
179
|
* Create a new session.
|
|
134
180
|
*/
|
|
135
|
-
async createSession({ appPort, systemPort, shellPort }:
|
|
181
|
+
async createSession({ appPort, systemPort, shellPort }: CreateSessionProps): Promise<WorkerSession> {
|
|
136
182
|
const session = new WorkerSession({
|
|
137
183
|
serviceHost: this._clientServices,
|
|
138
184
|
appPort,
|
|
@@ -148,7 +194,9 @@ export class WorkerRuntime {
|
|
|
148
194
|
// Terminate the worker when all sessions are closed.
|
|
149
195
|
await this.stop();
|
|
150
196
|
} else {
|
|
151
|
-
this.
|
|
197
|
+
if (this._automaticallyConnectWebrtc) {
|
|
198
|
+
this._reconnectWebrtc();
|
|
199
|
+
}
|
|
152
200
|
}
|
|
153
201
|
});
|
|
154
202
|
|
|
@@ -165,7 +213,24 @@ export class WorkerRuntime {
|
|
|
165
213
|
this._signalMetadataTags.origin = session.origin;
|
|
166
214
|
this._sessions.add(session);
|
|
167
215
|
|
|
168
|
-
this.
|
|
216
|
+
if (this._automaticallyConnectWebrtc) {
|
|
217
|
+
this._reconnectWebrtc();
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
return session;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Connects the WebRTC bridge to the specified session.
|
|
225
|
+
* If no session is provided, disconnects the WebRTC bridge.
|
|
226
|
+
*
|
|
227
|
+
* Called automatically if `automaticallyConnectWebrtc` is true.
|
|
228
|
+
*
|
|
229
|
+
* @param session The session to connect the WebRTC bridge to.
|
|
230
|
+
*/
|
|
231
|
+
connectWebrtcBridge(session: WorkerSession | undefined): void {
|
|
232
|
+
this._sessionForNetworking = session;
|
|
233
|
+
this._transportFactory.setBridgeService(session?.bridgeService);
|
|
169
234
|
}
|
|
170
235
|
|
|
171
236
|
/**
|
|
@@ -183,12 +248,78 @@ export class WorkerRuntime {
|
|
|
183
248
|
// Select existing session.
|
|
184
249
|
if (!this._sessionForNetworking) {
|
|
185
250
|
const selected = Array.from(this._sessions).find((session) => session.bridgeService);
|
|
186
|
-
|
|
187
|
-
this._sessionForNetworking = selected;
|
|
188
|
-
this._transportFactory.setBridgeService(selected.bridgeService);
|
|
189
|
-
} else {
|
|
190
|
-
this._transportFactory.setBridgeService(undefined);
|
|
191
|
-
}
|
|
251
|
+
this.connectWebrtcBridge(selected);
|
|
192
252
|
}
|
|
193
253
|
}
|
|
194
254
|
}
|
|
255
|
+
|
|
256
|
+
const DB_NAME = 'DXOS';
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* SqlExport layer that wraps SqliteClient to provide export functionality.
|
|
260
|
+
*/
|
|
261
|
+
const SqlExportLayer: Layer.Layer<SqlExport.SqlExport, never, SqliteClient.SqliteClient> = Layer.effect(
|
|
262
|
+
SqlExport.SqlExport,
|
|
263
|
+
Effect.gen(function* () {
|
|
264
|
+
const sql = yield* SqliteClient.SqliteClient;
|
|
265
|
+
return {
|
|
266
|
+
export: sql.export,
|
|
267
|
+
} satisfies SqlExport.Service;
|
|
268
|
+
}),
|
|
269
|
+
);
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Local SQLite layer for the worker.
|
|
273
|
+
* Uses OPFS sync API as an FS backend.
|
|
274
|
+
* Does NOT spawn a new worker.
|
|
275
|
+
* NOTE: Only usable within a worker.
|
|
276
|
+
* TODO(mykola): This does not work right now. Fix.
|
|
277
|
+
*/
|
|
278
|
+
const LocalSqliteOpfsLayer = Layer.unwrapScoped(
|
|
279
|
+
Effect.gen(function* () {
|
|
280
|
+
const { port1: clientPort, port2: serverPort } = new MessageChannel();
|
|
281
|
+
clientPort.start();
|
|
282
|
+
serverPort.start();
|
|
283
|
+
yield* Effect.addFinalizer(() =>
|
|
284
|
+
Effect.sync(() => {
|
|
285
|
+
clientPort.close();
|
|
286
|
+
serverPort.close();
|
|
287
|
+
}),
|
|
288
|
+
);
|
|
289
|
+
|
|
290
|
+
yield* Effect.forkScoped(OpfsWorker.run({ port: serverPort, dbName: DB_NAME }));
|
|
291
|
+
return SqlExportLayer.pipe(Layer.provideMerge(SqliteClient.layer({ worker: Effect.succeed(clientPort) })));
|
|
292
|
+
}),
|
|
293
|
+
);
|
|
294
|
+
|
|
295
|
+
// TODO(wittjosiah): Factor out to a separate module.
|
|
296
|
+
class WebLockWrapper {
|
|
297
|
+
readonly #key: string;
|
|
298
|
+
#release?: () => void;
|
|
299
|
+
|
|
300
|
+
constructor(key: string) {
|
|
301
|
+
this.#key = key;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
get key(): string {
|
|
305
|
+
return this.#key;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
acquire(options: LockOptions = {}) {
|
|
309
|
+
return navigator.locks.request(this.#key, options, async () => {
|
|
310
|
+
await new Promise<void>((resolve) => {
|
|
311
|
+
this.#release = resolve;
|
|
312
|
+
}); // Blocks for the duration of the worker's lifetime.
|
|
313
|
+
this.#release = undefined;
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
release() {
|
|
318
|
+
this.#release?.();
|
|
319
|
+
this.#release = undefined;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
[Symbol.dispose]() {
|
|
323
|
+
this.release();
|
|
324
|
+
}
|
|
325
|
+
}
|
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
// Copyright 2022 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { Trigger, asyncTimeout } from '@dxos/async';
|
|
6
6
|
import {
|
|
7
|
-
iframeServiceBundle,
|
|
8
7
|
type IframeServiceBundle,
|
|
9
8
|
PROXY_CONNECTION_TIMEOUT,
|
|
9
|
+
iframeServiceBundle,
|
|
10
10
|
workerServiceBundle,
|
|
11
11
|
} from '@dxos/client-protocol';
|
|
12
12
|
import { invariant } from '@dxos/invariant';
|
|
13
13
|
import { log, logInfo } from '@dxos/log';
|
|
14
14
|
import { type BridgeService } from '@dxos/protocols/proto/dxos/mesh/bridge';
|
|
15
|
-
import {
|
|
15
|
+
import { type ProtoRpcPeer, type RpcPort, createProtoRpcPeer } from '@dxos/rpc';
|
|
16
16
|
import { Callback, type MaybePromise } from '@dxos/util';
|
|
17
17
|
|
|
18
|
-
import { type
|
|
18
|
+
import { ClientRpcServer, type ClientRpcServerProps, type ClientServicesHost } from '../services';
|
|
19
19
|
|
|
20
|
-
export type
|
|
20
|
+
export type WorkerSessionProps = {
|
|
21
21
|
serviceHost: ClientServicesHost;
|
|
22
22
|
systemPort: RpcPort;
|
|
23
23
|
appPort: RpcPort;
|
|
@@ -50,11 +50,11 @@ export class WorkerSession {
|
|
|
50
50
|
|
|
51
51
|
public bridgeService?: BridgeService;
|
|
52
52
|
|
|
53
|
-
constructor({ serviceHost, systemPort, appPort, shellPort, readySignal }:
|
|
53
|
+
constructor({ serviceHost, systemPort, appPort, shellPort, readySignal }: WorkerSessionProps) {
|
|
54
54
|
invariant(serviceHost);
|
|
55
55
|
this._serviceHost = serviceHost;
|
|
56
56
|
|
|
57
|
-
const middleware: Pick<
|
|
57
|
+
const middleware: Pick<ClientRpcServerProps, 'handleCall' | 'handleStream'> = {
|
|
58
58
|
handleCall: async (method, params, handler) => {
|
|
59
59
|
const error = await readySignal.wait({ timeout: PROXY_CONNECTION_TIMEOUT });
|
|
60
60
|
if (error) {
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const DXOS_VERSION = "0.8.4-main.
|
|
1
|
+
export const DXOS_VERSION = "0.8.4-main.937b3ca";
|