@dxos/client-services 0.8.3 → 0.8.4-main.1c7ec43d41
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-LBG3C332.mjs → chunk-J7D62ZDJ.mjs} +3826 -5125
- package/dist/lib/browser/chunk-J7D62ZDJ.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-XJRPB3GA.mjs +22 -0
- package/dist/lib/browser/chunk-XJRPB3GA.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +454 -148
- 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 +88 -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 +86 -0
- package/dist/lib/browser/packlets/locks/browser.mjs.map +7 -0
- package/dist/lib/browser/packlets/locks/node.mjs +48 -0
- package/dist/lib/browser/packlets/locks/node.mjs.map +7 -0
- package/dist/lib/browser/testing/index.mjs +40 -41
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/lib/node-esm/chunk-2DT3MZRL.mjs +22 -0
- package/dist/lib/node-esm/chunk-2DT3MZRL.mjs.map +7 -0
- 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-SKGQLRKS.mjs → chunk-TLUZSZZD.mjs} +3226 -4393
- package/dist/lib/node-esm/chunk-TLUZSZZD.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +454 -148
- 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 +88 -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 +86 -0
- package/dist/lib/node-esm/packlets/locks/browser.mjs.map +7 -0
- package/dist/lib/node-esm/packlets/locks/node.mjs +48 -0
- package/dist/lib/node-esm/packlets/locks/node.mjs.map +7 -0
- package/dist/lib/node-esm/testing/index.mjs +40 -41
- package/dist/lib/node-esm/testing/index.mjs.map +3 -3
- package/dist/types/src/index.d.ts +1 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/packlets/agents/edge-agent-manager.d.ts +3 -2
- package/dist/types/src/packlets/agents/edge-agent-manager.d.ts.map +1 -1
- package/dist/types/src/packlets/agents/edge-agent-service.d.ts +3 -2
- 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/keys.d.ts.map +1 -1
- package/dist/types/src/packlets/devtools/metadata.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/devtools/spaces.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-collector.d.ts.map +1 -1
- package/dist/types/src/packlets/diagnostics/diagnostics.d.ts +3 -4
- 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/identity-manager.d.ts +7 -7
- package/dist/types/src/packlets/identity/identity-manager.d.ts.map +1 -1
- package/dist/types/src/packlets/identity/identity-recovery-manager.d.ts +8 -7
- package/dist/types/src/packlets/identity/identity-recovery-manager.d.ts.map +1 -1
- package/dist/types/src/packlets/identity/identity-service.d.ts +6 -10
- package/dist/types/src/packlets/identity/identity-service.d.ts.map +1 -1
- package/dist/types/src/packlets/identity/identity.d.ts +9 -12
- package/dist/types/src/packlets/identity/identity.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts +6 -5
- 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 +2 -2
- 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 +8 -5
- package/dist/types/src/packlets/invitations/invitation-protocol.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/invitation-state.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/invitation-topology.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 +3 -3
- package/dist/types/src/packlets/invitations/invitations-manager.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/invitations-service.d.ts +4 -4
- package/dist/types/src/packlets/invitations/invitations-service.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts +5 -4
- 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/browser.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/locks/node.d.ts.map +1 -1
- package/dist/types/src/packlets/logging/logging-service.d.ts +5 -1
- package/dist/types/src/packlets/logging/logging-service.d.ts.map +1 -1
- package/dist/types/src/packlets/network/network-service.d.ts +7 -6
- package/dist/types/src/packlets/network/network-service.d.ts.map +1 -1
- package/dist/types/src/packlets/services/client-rpc-server.d.ts +5 -5
- package/dist/types/src/packlets/services/client-rpc-server.d.ts.map +1 -1
- package/dist/types/src/packlets/services/feed-syncer.d.ts +59 -0
- package/dist/types/src/packlets/services/feed-syncer.d.ts.map +1 -0
- package/dist/types/src/packlets/services/feed-syncer.test.d.ts +2 -0
- package/dist/types/src/packlets/services/feed-syncer.test.d.ts.map +1 -0
- package/dist/types/src/packlets/services/platform.d.ts.map +1 -1
- package/dist/types/src/packlets/services/service-context.d.ts +14 -10
- package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
- package/dist/types/src/packlets/services/service-host.d.ts +21 -8
- package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
- package/dist/types/src/packlets/services/service-registry.d.ts.map +1 -1
- package/dist/types/src/packlets/services/util.d.ts.map +1 -1
- package/dist/types/src/packlets/space-export/archive-format.d.ts +9 -0
- package/dist/types/src/packlets/space-export/archive-format.d.ts.map +1 -0
- package/dist/types/src/packlets/space-export/index.d.ts +4 -1
- package/dist/types/src/packlets/space-export/index.d.ts.map +1 -1
- package/dist/types/src/packlets/space-export/serialized-space-reader.d.ts +23 -0
- package/dist/types/src/packlets/space-export/serialized-space-reader.d.ts.map +1 -0
- package/dist/types/src/packlets/space-export/serialized-space-writer.d.ts +36 -0
- package/dist/types/src/packlets/space-export/serialized-space-writer.d.ts.map +1 -0
- package/dist/types/src/packlets/space-export/space-archive-reader.d.ts +9 -1
- package/dist/types/src/packlets/space-export/space-archive-reader.d.ts.map +1 -1
- package/dist/types/src/packlets/space-export/space-archive-writer.d.ts +8 -2
- package/dist/types/src/packlets/space-export/space-archive-writer.d.ts.map +1 -1
- package/dist/types/src/packlets/space-export/space-archive.test.d.ts +2 -0
- package/dist/types/src/packlets/space-export/space-archive.test.d.ts.map +1 -0
- 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 +29 -18
- package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/data-space.d.ts +30 -13
- 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/epoch-migrations.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/genesis.d.ts +2 -1
- package/dist/types/src/packlets/spaces/genesis.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/notarization-plugin.d.ts +6 -9
- package/dist/types/src/packlets/spaces/notarization-plugin.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/spaces-service.d.ts +11 -8
- package/dist/types/src/packlets/spaces/spaces-service.d.ts.map +1 -1
- package/dist/types/src/packlets/storage/level.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/storage/util.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/credential-utils.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 +41 -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 -4
- package/dist/types/src/packlets/worker/worker-session.d.ts.map +1 -1
- package/dist/types/src/testing/setup.d.ts.map +1 -1
- package/dist/types/src/version.d.ts +1 -1
- package/dist/types/src/version.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +72 -55
- package/src/index.ts +1 -0
- package/src/packlets/agents/edge-agent-manager.ts +10 -7
- package/src/packlets/agents/edge-agent-service.ts +17 -5
- package/src/packlets/devices/devices-service.test.ts +3 -3
- package/src/packlets/devices/devices-service.ts +2 -2
- package/src/packlets/devtools/devtools.ts +29 -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 +2 -3
- 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 +2 -2
- package/src/packlets/identity/identity-manager.test.ts +8 -8
- package/src/packlets/identity/identity-manager.ts +25 -24
- package/src/packlets/identity/identity-recovery-manager.ts +22 -18
- package/src/packlets/identity/identity-service.test.ts +8 -28
- package/src/packlets/identity/identity-service.ts +13 -80
- package/src/packlets/identity/identity.test.ts +11 -11
- package/src/packlets/identity/identity.ts +17 -39
- package/src/packlets/invitations/device-invitation-protocol.test.ts +4 -4
- package/src/packlets/invitations/device-invitation-protocol.ts +8 -6
- package/src/packlets/invitations/edge-invitation-handler.ts +10 -6
- 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 +15 -16
- package/src/packlets/invitations/invitation-protocol.ts +8 -5
- package/src/packlets/invitations/invitation-state.ts +1 -15
- package/src/packlets/invitations/invitations-handler.test.ts +301 -292
- package/src/packlets/invitations/invitations-handler.ts +77 -25
- package/src/packlets/invitations/invitations-manager.ts +43 -18
- package/src/packlets/invitations/invitations-service.ts +10 -10
- package/src/packlets/invitations/space-invitation-protocol.test.ts +26 -25
- package/src/packlets/invitations/space-invitation-protocol.ts +13 -17
- 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 +22 -17
- package/src/packlets/logging/logging.test.ts +1 -1
- package/src/packlets/network/network-service.test.ts +3 -3
- package/src/packlets/network/network-service.ts +12 -10
- package/src/packlets/services/client-rpc-server.ts +20 -17
- package/src/packlets/services/feed-syncer.test.ts +340 -0
- package/src/packlets/services/feed-syncer.ts +377 -0
- package/src/packlets/services/platform.ts +7 -1
- package/src/packlets/services/service-context.test.ts +4 -3
- package/src/packlets/services/service-context.ts +148 -64
- package/src/packlets/services/service-host.test.ts +10 -9
- package/src/packlets/services/service-host.ts +88 -49
- package/src/packlets/services/service-registry.test.ts +1 -1
- package/src/packlets/space-export/archive-format.ts +42 -0
- package/src/packlets/space-export/index.ts +4 -1
- package/src/packlets/space-export/serialized-space-reader.ts +111 -0
- package/src/packlets/space-export/serialized-space-writer.ts +252 -0
- package/src/packlets/space-export/space-archive-reader.ts +65 -4
- package/src/packlets/space-export/space-archive-writer.ts +44 -6
- package/src/packlets/space-export/space-archive.test.ts +461 -0
- 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.test.ts +79 -13
- package/src/packlets/spaces/data-space-manager.ts +129 -125
- package/src/packlets/spaces/data-space.ts +65 -40
- package/src/packlets/spaces/edge-feed-replicator.test.ts +4 -4
- package/src/packlets/spaces/edge-feed-replicator.ts +13 -11
- package/src/packlets/spaces/epoch-migrations.ts +5 -5
- package/src/packlets/spaces/genesis.ts +6 -1
- package/src/packlets/spaces/notarization-plugin.test.ts +3 -3
- package/src/packlets/spaces/notarization-plugin.ts +13 -12
- package/src/packlets/spaces/spaces-service.test.ts +20 -12
- package/src/packlets/spaces/spaces-service.ts +138 -38
- 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 +11 -7
- package/src/packlets/testing/test-builder.ts +39 -13
- package/src/packlets/worker/worker-runtime.ts +189 -17
- package/src/packlets/worker/worker-session.ts +15 -21
- package/src/version.ts +1 -5
- package/README.yml +0 -5
- package/dist/lib/browser/chunk-LBG3C332.mjs.map +0 -7
- package/dist/lib/node/chunk-LMGLGOUU.cjs +0 -9311
- package/dist/lib/node/chunk-LMGLGOUU.cjs.map +0 -7
- package/dist/lib/node/index.cjs +0 -437
- package/dist/lib/node/index.cjs.map +0 -7
- package/dist/lib/node/meta.json +0 -1
- package/dist/lib/node/testing/index.cjs +0 -452
- package/dist/lib/node/testing/index.cjs.map +0 -7
- package/dist/lib/node-esm/chunk-SKGQLRKS.mjs.map +0 -7
- package/dist/types/src/packlets/identity/default-space-state-machine.d.ts +0 -19
- package/dist/types/src/packlets/identity/default-space-state-machine.d.ts.map +0 -1
- package/src/packlets/identity/default-space-state-machine.ts +0 -44
|
@@ -14,12 +14,18 @@ export const getPlatform = (): Platform => {
|
|
|
14
14
|
userAgent,
|
|
15
15
|
uptime: Math.floor((Date.now() - window.performance.timeOrigin) / 1_000),
|
|
16
16
|
};
|
|
17
|
-
} else {
|
|
17
|
+
} else if (typeof SharedWorkerGlobalScope !== 'undefined') {
|
|
18
18
|
// Shared worker.
|
|
19
19
|
return {
|
|
20
20
|
type: Platform.PLATFORM_TYPE.SHARED_WORKER,
|
|
21
21
|
uptime: Math.floor((Date.now() - performance.timeOrigin) / 1_000),
|
|
22
22
|
};
|
|
23
|
+
} else {
|
|
24
|
+
// Dedicated worker.
|
|
25
|
+
return {
|
|
26
|
+
type: Platform.PLATFORM_TYPE.DEDICATED_WORKER,
|
|
27
|
+
uptime: Math.floor((Date.now() - performance.timeOrigin) / 1_000),
|
|
28
|
+
};
|
|
23
29
|
}
|
|
24
30
|
} else {
|
|
25
31
|
// Node.
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
import { describe, test } from 'vitest';
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { Context } from '@dxos/context';
|
|
8
|
+
import { MemorySignalManager, MemorySignalManagerContext } from '@dxos/messaging';
|
|
8
9
|
import { Invitation } from '@dxos/protocols/proto/dxos/client/services';
|
|
9
10
|
import { openAndClose } from '@dxos/test-utils';
|
|
10
11
|
|
|
@@ -19,7 +20,7 @@ describe('services/ServiceContext', () => {
|
|
|
19
20
|
const device2 = await createOpenServiceContext(networkContext);
|
|
20
21
|
await Promise.all(performInvitation({ host: device1, guest: device2, options: { kind: Invitation.Kind.DEVICE } }));
|
|
21
22
|
|
|
22
|
-
const space1 = await device1.dataSpaceManager!.createSpace();
|
|
23
|
+
const space1 = await device1.dataSpaceManager!.createSpace(new Context());
|
|
23
24
|
await device2.dataSpaceManager!.waitUntilSpaceReady(space1!.key);
|
|
24
25
|
const space2 = await device2.dataSpaceManager!.spaces.get(space1.key);
|
|
25
26
|
await space2!.inner.controlPipeline.state.waitUntilTimeframe(space1.inner.controlPipeline.state.timeframe);
|
|
@@ -35,7 +36,7 @@ describe('services/ServiceContext', () => {
|
|
|
35
36
|
|
|
36
37
|
const identity2 = await createOpenServiceContext(networkContext);
|
|
37
38
|
await identity2.createIdentity();
|
|
38
|
-
const space1 = await identity2.dataSpaceManager!.createSpace();
|
|
39
|
+
const space1 = await identity2.dataSpaceManager!.createSpace(new Context());
|
|
39
40
|
await Promise.all(
|
|
40
41
|
performInvitation({
|
|
41
42
|
host: identity2,
|
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
// Copyright 2022 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import type * as SqlClient from '@effect/sql/SqlClient';
|
|
6
|
+
|
|
5
7
|
import { Mutex, Trigger } from '@dxos/async';
|
|
6
8
|
import { Context, Resource } from '@dxos/context';
|
|
7
|
-
import {
|
|
9
|
+
import { type CredentialProcessor, getCredentialAssertion } from '@dxos/credentials';
|
|
8
10
|
import { failUndefined, warnAfterTimeout } from '@dxos/debug';
|
|
9
11
|
import {
|
|
10
12
|
EchoEdgeReplicator,
|
|
@@ -15,49 +17,54 @@ import {
|
|
|
15
17
|
valueEncoding,
|
|
16
18
|
} from '@dxos/echo-pipeline';
|
|
17
19
|
import { createChainEdgeIdentity, createEphemeralEdgeIdentity } from '@dxos/edge-client';
|
|
18
|
-
import type {
|
|
20
|
+
import type { EdgeConnection, EdgeHttpClient, EdgeIdentity } from '@dxos/edge-client';
|
|
21
|
+
import { type RuntimeProvider } from '@dxos/effect';
|
|
19
22
|
import { FeedFactory, FeedStore } from '@dxos/feed-store';
|
|
20
23
|
import { invariant } from '@dxos/invariant';
|
|
21
24
|
import { Keyring } from '@dxos/keyring';
|
|
22
|
-
import {
|
|
25
|
+
import { type SpaceId } from '@dxos/keys';
|
|
23
26
|
import { type LevelDB } from '@dxos/kv-store';
|
|
24
27
|
import { log } from '@dxos/log';
|
|
25
28
|
import { type SignalManager } from '@dxos/messaging';
|
|
26
29
|
import { type SwarmNetworkManager } from '@dxos/network-manager';
|
|
27
|
-
import { InvalidStorageVersionError, STORAGE_VERSION
|
|
30
|
+
import { InvalidStorageVersionError, STORAGE_VERSION } from '@dxos/protocols';
|
|
31
|
+
import { FeedProtocol } from '@dxos/protocols';
|
|
28
32
|
import { Invitation } from '@dxos/protocols/proto/dxos/client/services';
|
|
29
33
|
import { type Runtime } from '@dxos/protocols/proto/dxos/config';
|
|
30
34
|
import type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';
|
|
31
35
|
import { type Credential, type ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';
|
|
32
36
|
import { type Storage } from '@dxos/random-access-storage';
|
|
37
|
+
import type * as SqlTransaction from '@dxos/sql-sqlite/SqlTransaction';
|
|
33
38
|
import { BlobStore } from '@dxos/teleport-extension-object-sync';
|
|
34
39
|
import { trace as Trace } from '@dxos/tracing';
|
|
35
40
|
import { safeInstanceof } from '@dxos/util';
|
|
36
41
|
|
|
37
42
|
import { EdgeAgentManager } from '../agents';
|
|
38
43
|
import {
|
|
39
|
-
IdentityManager,
|
|
40
44
|
type CreateIdentityOptions,
|
|
41
|
-
type
|
|
42
|
-
|
|
45
|
+
type Identity,
|
|
46
|
+
IdentityManager,
|
|
47
|
+
type IdentityManagerProps,
|
|
48
|
+
type JoinIdentityProps,
|
|
43
49
|
} from '../identity';
|
|
44
50
|
import { EdgeIdentityRecoveryManager } from '../identity/identity-recovery-manager';
|
|
45
51
|
import {
|
|
46
52
|
DeviceInvitationProtocol,
|
|
47
|
-
type
|
|
53
|
+
type InvitationConnectionProps,
|
|
54
|
+
type InvitationProtocol,
|
|
48
55
|
InvitationsHandler,
|
|
49
56
|
InvitationsManager,
|
|
50
57
|
SpaceInvitationProtocol,
|
|
51
|
-
type InvitationProtocol,
|
|
52
58
|
} from '../invitations';
|
|
53
|
-
import { DataSpaceManager, type
|
|
59
|
+
import { DataSpaceManager, type DataSpaceManagerRuntimeProps, type SigningContext } from '../spaces';
|
|
60
|
+
import { FeedSyncer } from './feed-syncer';
|
|
54
61
|
|
|
55
|
-
export type
|
|
56
|
-
|
|
62
|
+
export type ServiceContextRuntimeProps = Pick<
|
|
63
|
+
IdentityManagerProps,
|
|
57
64
|
'devicePresenceOfflineTimeout' | 'devicePresenceAnnounceInterval'
|
|
58
65
|
> &
|
|
59
|
-
|
|
60
|
-
|
|
66
|
+
DataSpaceManagerRuntimeProps & {
|
|
67
|
+
invitationConnectionDefaultProps?: InvitationConnectionProps;
|
|
61
68
|
disableP2pReplication?: boolean;
|
|
62
69
|
enableVectorIndexing?: boolean;
|
|
63
70
|
};
|
|
@@ -67,7 +74,7 @@ export type ServiceContextRuntimeParams = Pick<
|
|
|
67
74
|
// TODO(burdon): Rename/break-up into smaller components. And/or make members private.
|
|
68
75
|
// TODO(dmaretskyi): Gets duplicated in CJS build between normal and testing bundles.
|
|
69
76
|
@safeInstanceof('dxos.client-services.ServiceContext')
|
|
70
|
-
@Trace.resource()
|
|
77
|
+
@Trace.resource({ lifecycle: true })
|
|
71
78
|
export class ServiceContext extends Resource {
|
|
72
79
|
private readonly _edgeIdentityUpdateMutex = new Mutex();
|
|
73
80
|
|
|
@@ -84,6 +91,7 @@ export class ServiceContext extends Resource {
|
|
|
84
91
|
public readonly echoHost: EchoHost;
|
|
85
92
|
private readonly _meshReplicator?: MeshEchoReplicator = undefined;
|
|
86
93
|
private readonly _echoEdgeReplicator?: EchoEdgeReplicator = undefined;
|
|
94
|
+
private readonly _feedSyncer?: FeedSyncer = undefined;
|
|
87
95
|
|
|
88
96
|
// Initialized after identity is initialized.
|
|
89
97
|
public dataSpaceManager?: DataSpaceManager;
|
|
@@ -96,8 +104,6 @@ export class ServiceContext extends Resource {
|
|
|
96
104
|
|
|
97
105
|
private _deviceSpaceSync?: CredentialProcessor;
|
|
98
106
|
|
|
99
|
-
private readonly _instanceId = PublicKey.random().toHex();
|
|
100
|
-
|
|
101
107
|
constructor(
|
|
102
108
|
public readonly storage: Storage,
|
|
103
109
|
public readonly level: LevelDB,
|
|
@@ -105,11 +111,15 @@ export class ServiceContext extends Resource {
|
|
|
105
111
|
public readonly signalManager: SignalManager,
|
|
106
112
|
private readonly _edgeConnection: EdgeConnection | undefined,
|
|
107
113
|
private readonly _edgeHttpClient: EdgeHttpClient | undefined,
|
|
108
|
-
|
|
114
|
+
private readonly _runtime: RuntimeProvider.RuntimeProvider<SqlClient.SqlClient | SqlTransaction.SqlTransaction>,
|
|
115
|
+
public readonly _runtimeProps?: ServiceContextRuntimeProps,
|
|
109
116
|
private readonly _edgeFeatures?: Runtime.Client.EdgeFeatures,
|
|
110
117
|
) {
|
|
111
118
|
super();
|
|
112
119
|
|
|
120
|
+
log('runtimeProps', this._runtimeProps);
|
|
121
|
+
log('edgeFeatures', this._edgeFeatures);
|
|
122
|
+
|
|
113
123
|
// TODO(burdon): Move strings to constants.
|
|
114
124
|
this.metadataStore = new MetadataStore(storage.createDirectory('metadata'));
|
|
115
125
|
this.blobStore = new BlobStore(storage.createDirectory('blobs'));
|
|
@@ -131,7 +141,7 @@ export class ServiceContext extends Resource {
|
|
|
131
141
|
networkManager: this.networkManager,
|
|
132
142
|
blobStore: this.blobStore,
|
|
133
143
|
metadataStore: this.metadataStore,
|
|
134
|
-
disableP2pReplication: this.
|
|
144
|
+
disableP2pReplication: this._runtimeProps?.disableP2pReplication,
|
|
135
145
|
});
|
|
136
146
|
|
|
137
147
|
this.identityManager = new IdentityManager({
|
|
@@ -139,8 +149,8 @@ export class ServiceContext extends Resource {
|
|
|
139
149
|
keyring: this.keyring,
|
|
140
150
|
feedStore: this.feedStore,
|
|
141
151
|
spaceManager: this.spaceManager,
|
|
142
|
-
devicePresenceOfflineTimeout: this.
|
|
143
|
-
devicePresenceAnnounceInterval: this.
|
|
152
|
+
devicePresenceOfflineTimeout: this._runtimeProps?.devicePresenceOfflineTimeout,
|
|
153
|
+
devicePresenceAnnounceInterval: this._runtimeProps?.devicePresenceAnnounceInterval,
|
|
144
154
|
edgeConnection: this._edgeConnection,
|
|
145
155
|
edgeFeatures: this._edgeFeatures,
|
|
146
156
|
});
|
|
@@ -156,17 +166,22 @@ export class ServiceContext extends Resource {
|
|
|
156
166
|
kv: this.level,
|
|
157
167
|
peerIdProvider: () => this.identityManager.identity?.deviceKey?.toHex(),
|
|
158
168
|
getSpaceKeyByRootDocumentId: (documentId) => this.spaceManager.findSpaceByRootDocumentId(documentId)?.key,
|
|
159
|
-
|
|
160
|
-
|
|
169
|
+
runtime: this._runtime,
|
|
170
|
+
useSubduction: this._edgeFeatures?.subductionReplicator,
|
|
171
|
+
syncQueue: async (ctx, request) => {
|
|
172
|
+
return this._feedSyncer?.syncBlocking(ctx, {
|
|
173
|
+
spaceId: request.spaceId as SpaceId,
|
|
174
|
+
subspaceTag: request.subspaceTag,
|
|
175
|
+
shouldPush: request.shouldPush,
|
|
176
|
+
shouldPull: request.shouldPull,
|
|
177
|
+
});
|
|
161
178
|
},
|
|
162
179
|
});
|
|
163
180
|
|
|
164
|
-
this._meshReplicator = new MeshEchoReplicator();
|
|
165
|
-
|
|
166
181
|
this.invitations = new InvitationsHandler(
|
|
167
182
|
this.networkManager, //
|
|
168
183
|
this._edgeHttpClient,
|
|
169
|
-
|
|
184
|
+
_runtimeProps?.invitationConnectionDefaultProps,
|
|
170
185
|
);
|
|
171
186
|
this.invitationsManager = new InvitationsManager(
|
|
172
187
|
this.invitations,
|
|
@@ -186,80 +201,129 @@ export class ServiceContext extends Resource {
|
|
|
186
201
|
),
|
|
187
202
|
);
|
|
188
203
|
|
|
189
|
-
if (!this.
|
|
204
|
+
if (!this._runtimeProps?.disableP2pReplication) {
|
|
190
205
|
this._meshReplicator = new MeshEchoReplicator();
|
|
191
206
|
}
|
|
192
|
-
if (this._edgeConnection && this._edgeFeatures?.echoReplicator) {
|
|
207
|
+
if (this._edgeConnection && this._edgeFeatures?.echoReplicator && this._edgeHttpClient) {
|
|
193
208
|
this._echoEdgeReplicator = new EchoEdgeReplicator({
|
|
194
209
|
edgeConnection: this._edgeConnection,
|
|
210
|
+
edgeHttpClient: this._edgeHttpClient,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
if (this.echoHost.feedStore && this._edgeConnection) {
|
|
215
|
+
this._feedSyncer = new FeedSyncer({
|
|
216
|
+
runtime: this._runtime,
|
|
217
|
+
feedStore: this.echoHost.feedStore,
|
|
218
|
+
edgeClient: this._edgeConnection,
|
|
219
|
+
peerId: this.identityManager.identity?.deviceKey?.toHex() ?? '',
|
|
220
|
+
getSpaceIds: () => this.echoHost!.spaceIds,
|
|
221
|
+
syncNamespaces: [FeedProtocol.WellKnownNamespaces.data, FeedProtocol.WellKnownNamespaces.trace],
|
|
195
222
|
});
|
|
196
223
|
}
|
|
197
224
|
}
|
|
198
225
|
|
|
199
|
-
@Trace.span()
|
|
226
|
+
@Trace.span({ op: 'lifecycle' })
|
|
200
227
|
protected override async _open(ctx: Context): Promise<void> {
|
|
201
228
|
await this._checkStorageVersion();
|
|
202
229
|
|
|
203
230
|
log('opening...');
|
|
204
|
-
log.trace('dxos.sdk.service-context.open', trace.begin({ id: this._instanceId }));
|
|
205
231
|
|
|
232
|
+
log('opening identityManager...');
|
|
206
233
|
await this.identityManager.open(ctx);
|
|
234
|
+
log('identityManager opened', { hasIdentity: !!this.identityManager.identity });
|
|
235
|
+
|
|
236
|
+
log('setting network identity...');
|
|
237
|
+
await this._setNetworkIdentity({ identity: this.identityManager.identity });
|
|
238
|
+
log('network identity set');
|
|
207
239
|
|
|
208
|
-
|
|
240
|
+
log('opening edge connection...');
|
|
241
|
+
await this._edgeConnection?.open(ctx);
|
|
242
|
+
log('edge connection opened');
|
|
209
243
|
|
|
210
|
-
|
|
211
|
-
await this.signalManager.open();
|
|
244
|
+
log('opening signal manager...');
|
|
245
|
+
await this.signalManager.open(ctx);
|
|
246
|
+
log('signal manager opened');
|
|
247
|
+
|
|
248
|
+
log('opening network manager...');
|
|
212
249
|
await this.networkManager.open();
|
|
250
|
+
log('network manager opened');
|
|
213
251
|
|
|
252
|
+
log('opening echo host...');
|
|
214
253
|
await this.echoHost.open(ctx);
|
|
254
|
+
log('echo host opened');
|
|
215
255
|
|
|
216
256
|
if (this._meshReplicator) {
|
|
217
|
-
|
|
257
|
+
log('adding mesh replicator...');
|
|
258
|
+
await this.echoHost.addReplicator(ctx, this._meshReplicator);
|
|
259
|
+
log('mesh replicator added');
|
|
218
260
|
}
|
|
219
261
|
if (this._echoEdgeReplicator) {
|
|
220
|
-
|
|
262
|
+
log('adding edge replicator...');
|
|
263
|
+
await this.echoHost.addReplicator(ctx, this._echoEdgeReplicator);
|
|
264
|
+
log('edge replicator added');
|
|
221
265
|
}
|
|
222
266
|
|
|
267
|
+
log('loading metadata store...');
|
|
223
268
|
await this.metadataStore.load();
|
|
269
|
+
log('metadata store loaded');
|
|
270
|
+
|
|
271
|
+
log('opening space manager...');
|
|
224
272
|
await this.spaceManager.open();
|
|
273
|
+
log('space manager opened');
|
|
225
274
|
|
|
226
275
|
if (this.identityManager.identity) {
|
|
227
|
-
|
|
276
|
+
log('joining network...');
|
|
277
|
+
await this.identityManager.identity.joinNetwork(ctx);
|
|
278
|
+
log('network joined');
|
|
279
|
+
|
|
280
|
+
log('initializing spaces...(calling _initialize)');
|
|
228
281
|
await this._initialize(ctx);
|
|
282
|
+
log('spaces initialized');
|
|
283
|
+
} else {
|
|
284
|
+
log('no identity, skipping network join and space initialization');
|
|
229
285
|
}
|
|
230
286
|
|
|
231
|
-
|
|
287
|
+
log('opening feed syncer...');
|
|
288
|
+
await this._feedSyncer?.open(ctx);
|
|
289
|
+
log('feed syncer opened');
|
|
290
|
+
|
|
291
|
+
log('loading persistent invitations...');
|
|
292
|
+
const loadedInvitations = await this.invitationsManager.loadPersistentInvitations(ctx);
|
|
232
293
|
log('loaded persistent invitations', { count: loadedInvitations.invitations?.length });
|
|
233
294
|
|
|
234
|
-
log.trace('dxos.sdk.service-context.open', trace.end({ id: this._instanceId }));
|
|
235
295
|
log('opened');
|
|
236
296
|
}
|
|
237
297
|
|
|
238
298
|
protected override async _close(ctx: Context): Promise<void> {
|
|
239
299
|
log('closing...');
|
|
300
|
+
|
|
301
|
+
await this._feedSyncer?.close();
|
|
302
|
+
|
|
240
303
|
if (this._deviceSpaceSync && this.identityManager.identity) {
|
|
241
304
|
await this.identityManager.identity.space.spaceState.removeCredentialProcessor(this._deviceSpaceSync);
|
|
242
305
|
}
|
|
243
|
-
await this.dataSpaceManager?.close();
|
|
306
|
+
await this.dataSpaceManager?.close(ctx);
|
|
244
307
|
await this.edgeAgentManager?.close();
|
|
245
|
-
await this.identityManager.close();
|
|
308
|
+
await this.identityManager.close(ctx);
|
|
246
309
|
await this.spaceManager.close();
|
|
247
|
-
await this.feedStore.close();
|
|
248
|
-
await this.metadataStore.close();
|
|
249
|
-
|
|
250
310
|
await this.echoHost.close(ctx);
|
|
251
|
-
|
|
311
|
+
|
|
312
|
+
await this.networkManager.close(ctx);
|
|
252
313
|
await this.signalManager.close();
|
|
253
314
|
await this._edgeConnection?.close();
|
|
315
|
+
await this.feedStore.close();
|
|
316
|
+
await this.metadataStore.close();
|
|
254
317
|
|
|
255
318
|
log('closed');
|
|
256
319
|
}
|
|
257
320
|
|
|
258
|
-
async createIdentity(params: CreateIdentityOptions = {}) {
|
|
259
|
-
|
|
260
|
-
await this.
|
|
261
|
-
await
|
|
262
|
-
await
|
|
321
|
+
async createIdentity(params: CreateIdentityOptions = {}, ctx?: Context) {
|
|
322
|
+
ctx ??= this._ctx;
|
|
323
|
+
const identity = await this.identityManager.createIdentity(params, ctx);
|
|
324
|
+
await this._setNetworkIdentity({ identity });
|
|
325
|
+
await identity.joinNetwork(ctx);
|
|
326
|
+
await this._initialize(ctx);
|
|
263
327
|
return identity;
|
|
264
328
|
}
|
|
265
329
|
|
|
@@ -282,12 +346,12 @@ export class ServiceContext extends Resource {
|
|
|
282
346
|
}
|
|
283
347
|
}
|
|
284
348
|
|
|
285
|
-
private async _acceptIdentity(params:
|
|
286
|
-
const { identity, identityRecord } = await this.identityManager.prepareIdentity(params);
|
|
287
|
-
await this._setNetworkIdentity({ deviceCredential: params.authorizedDeviceCredential
|
|
288
|
-
await identity.joinNetwork();
|
|
349
|
+
private async _acceptIdentity(params: JoinIdentityProps) {
|
|
350
|
+
const { identity, identityRecord } = await this.identityManager.prepareIdentity(params, this._ctx);
|
|
351
|
+
await this._setNetworkIdentity({ deviceCredential: params.authorizedDeviceCredential!, identity });
|
|
352
|
+
await identity.joinNetwork(this._ctx);
|
|
289
353
|
await this.identityManager.acceptIdentity(identity, identityRecord, params.deviceProfile);
|
|
290
|
-
await this._initialize(
|
|
354
|
+
await this._initialize(this._ctx);
|
|
291
355
|
return identity;
|
|
292
356
|
}
|
|
293
357
|
|
|
@@ -302,7 +366,7 @@ export class ServiceContext extends Resource {
|
|
|
302
366
|
// Called when identity is created.
|
|
303
367
|
@Trace.span()
|
|
304
368
|
private async _initialize(ctx: Context): Promise<void> {
|
|
305
|
-
log('
|
|
369
|
+
log('_initialize: start');
|
|
306
370
|
const identity = this.identityManager.identity ?? failUndefined();
|
|
307
371
|
const signingContext: SigningContext = {
|
|
308
372
|
credentialSigner: identity.getIdentityCredentialSigner(),
|
|
@@ -314,6 +378,7 @@ export class ServiceContext extends Resource {
|
|
|
314
378
|
},
|
|
315
379
|
};
|
|
316
380
|
|
|
381
|
+
log('_initialize: creating DataSpaceManager');
|
|
317
382
|
this.dataSpaceManager = new DataSpaceManager({
|
|
318
383
|
spaceManager: this.spaceManager,
|
|
319
384
|
metadataStore: this.metadataStore,
|
|
@@ -326,10 +391,12 @@ export class ServiceContext extends Resource {
|
|
|
326
391
|
edgeHttpClient: this._edgeHttpClient,
|
|
327
392
|
echoEdgeReplicator: this._echoEdgeReplicator,
|
|
328
393
|
meshReplicator: this._meshReplicator,
|
|
329
|
-
|
|
394
|
+
runtimeProps: this._runtimeProps as DataSpaceManagerRuntimeProps,
|
|
330
395
|
edgeFeatures: this._edgeFeatures,
|
|
331
396
|
});
|
|
332
|
-
|
|
397
|
+
log('_initialize: opening DataSpaceManager...');
|
|
398
|
+
await this.dataSpaceManager.open(ctx);
|
|
399
|
+
log('_initialize: DataSpaceManager opened');
|
|
333
400
|
|
|
334
401
|
this.edgeAgentManager = new EdgeAgentManager(
|
|
335
402
|
this._edgeFeatures,
|
|
@@ -337,13 +404,16 @@ export class ServiceContext extends Resource {
|
|
|
337
404
|
this.dataSpaceManager,
|
|
338
405
|
identity,
|
|
339
406
|
);
|
|
340
|
-
|
|
407
|
+
log('_initialize: opening EdgeAgentManager...');
|
|
408
|
+
await this.edgeAgentManager.open(ctx);
|
|
409
|
+
log('_initialize: EdgeAgentManager opened');
|
|
341
410
|
|
|
342
411
|
this._handlerFactories.set(Invitation.Kind.SPACE, (invitation) => {
|
|
343
412
|
invariant(this.dataSpaceManager, 'dataSpaceManager not initialized yet');
|
|
344
413
|
return new SpaceInvitationProtocol(this.dataSpaceManager, signingContext, this.keyring, invitation.spaceKey);
|
|
345
414
|
});
|
|
346
415
|
this.initialized.wake();
|
|
416
|
+
log('_initialize: initialized.wake() called');
|
|
347
417
|
|
|
348
418
|
this._deviceSpaceSync = {
|
|
349
419
|
processCredential: async (credential: Credential) => {
|
|
@@ -366,9 +436,10 @@ export class ServiceContext extends Resource {
|
|
|
366
436
|
|
|
367
437
|
try {
|
|
368
438
|
log('accepting space recorded in halo', { details: assertion });
|
|
369
|
-
await this.dataSpaceManager.acceptSpace({
|
|
439
|
+
await this.dataSpaceManager.acceptSpace(this._ctx, {
|
|
370
440
|
spaceKey: assertion.spaceKey,
|
|
371
441
|
genesisFeedKey: assertion.genesisFeedKey,
|
|
442
|
+
tags: assertion.tags,
|
|
372
443
|
});
|
|
373
444
|
} catch (err) {
|
|
374
445
|
log.catch(err);
|
|
@@ -379,33 +450,42 @@ export class ServiceContext extends Resource {
|
|
|
379
450
|
await identity.space.spaceState.addCredentialProcessor(this._deviceSpaceSync);
|
|
380
451
|
}
|
|
381
452
|
|
|
382
|
-
private async _setNetworkIdentity(params?: { deviceCredential
|
|
453
|
+
private async _setNetworkIdentity(params?: { deviceCredential?: Credential; identity?: Identity }): Promise<void> {
|
|
454
|
+
log('_setNetworkIdentity: acquiring mutex...');
|
|
383
455
|
using _ = await this._edgeIdentityUpdateMutex.acquire();
|
|
456
|
+
log('_setNetworkIdentity: mutex acquired');
|
|
384
457
|
|
|
385
458
|
let edgeIdentity: EdgeIdentity;
|
|
386
|
-
const identity =
|
|
459
|
+
const identity = params?.identity;
|
|
387
460
|
if (identity) {
|
|
388
|
-
log('
|
|
461
|
+
log('_setNetworkIdentity: has identity', {
|
|
389
462
|
identity: identity.identityKey.toHex(),
|
|
390
|
-
|
|
463
|
+
hasDeviceCredential: !!params?.deviceCredential,
|
|
391
464
|
});
|
|
392
465
|
|
|
393
466
|
if (params?.deviceCredential) {
|
|
467
|
+
log('_setNetworkIdentity: creating chain edge identity with device credential...');
|
|
394
468
|
edgeIdentity = await createChainEdgeIdentity(
|
|
395
469
|
identity.signer,
|
|
396
470
|
identity.identityKey,
|
|
397
471
|
identity.deviceKey,
|
|
398
|
-
|
|
472
|
+
{ credential: params.deviceCredential },
|
|
399
473
|
[], // TODO(dmaretskyi): Service access credentials.
|
|
400
474
|
);
|
|
475
|
+
log('_setNetworkIdentity: chain edge identity created');
|
|
401
476
|
} else {
|
|
477
|
+
log('_setNetworkIdentity: waiting for identity.ready()...');
|
|
402
478
|
// TODO: throw here or from identity if device chain can't be loaded, to avoid indefinite hangup
|
|
403
479
|
await warnAfterTimeout(10_000, 'Waiting for identity to be ready for edge connection', async () => {
|
|
404
480
|
await identity.ready();
|
|
405
481
|
});
|
|
482
|
+
log('_setNetworkIdentity: identity.ready() resolved', {
|
|
483
|
+
hasDeviceCredentialChain: !!identity.deviceCredentialChain,
|
|
484
|
+
});
|
|
406
485
|
|
|
407
486
|
invariant(identity.deviceCredentialChain);
|
|
408
487
|
|
|
488
|
+
log('_setNetworkIdentity: creating chain edge identity...');
|
|
409
489
|
edgeIdentity = await createChainEdgeIdentity(
|
|
410
490
|
identity.signer,
|
|
411
491
|
identity.identityKey,
|
|
@@ -413,9 +493,12 @@ export class ServiceContext extends Resource {
|
|
|
413
493
|
identity.deviceCredentialChain,
|
|
414
494
|
[], // TODO(dmaretskyi): Service access credentials.
|
|
415
495
|
);
|
|
496
|
+
log('_setNetworkIdentity: chain edge identity created');
|
|
416
497
|
}
|
|
417
498
|
} else {
|
|
499
|
+
log('_setNetworkIdentity: no identity, creating ephemeral edge identity...');
|
|
418
500
|
edgeIdentity = await createEphemeralEdgeIdentity();
|
|
501
|
+
log('_setNetworkIdentity: ephemeral edge identity created');
|
|
419
502
|
}
|
|
420
503
|
|
|
421
504
|
this._edgeConnection?.setIdentity(edgeIdentity);
|
|
@@ -424,5 +507,6 @@ export class ServiceContext extends Resource {
|
|
|
424
507
|
identityKey: edgeIdentity.identityKey,
|
|
425
508
|
peerKey: edgeIdentity.peerKey,
|
|
426
509
|
});
|
|
510
|
+
log('_setNetworkIdentity: done');
|
|
427
511
|
}
|
|
428
512
|
}
|
|
@@ -3,15 +3,16 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { rmSync } from 'node:fs';
|
|
6
|
-
import { afterEach,
|
|
6
|
+
import { afterEach, describe, expect, onTestFinished, test } from 'vitest';
|
|
7
7
|
|
|
8
|
-
import { asyncTimeout, latch
|
|
8
|
+
import { Trigger, asyncTimeout, latch } from '@dxos/async';
|
|
9
9
|
import { Config } from '@dxos/config';
|
|
10
10
|
import { Context } from '@dxos/context';
|
|
11
11
|
import { verifyPresentation } from '@dxos/credentials';
|
|
12
12
|
import { type PublicKey } from '@dxos/keys';
|
|
13
13
|
import { MemorySignalManagerContext } from '@dxos/messaging';
|
|
14
14
|
import { type Identity } from '@dxos/protocols/proto/dxos/client/services';
|
|
15
|
+
import { MembershipPolicy } from '@dxos/protocols/proto/dxos/halo/credentials';
|
|
15
16
|
import { type Credential } from '@dxos/protocols/proto/dxos/halo/credentials';
|
|
16
17
|
import { isNode } from '@dxos/util';
|
|
17
18
|
|
|
@@ -28,16 +29,16 @@ describe('ClientServicesHost', () => {
|
|
|
28
29
|
test('open and close', async () => {
|
|
29
30
|
const host = createServiceHost(new Config(), new MemorySignalManagerContext());
|
|
30
31
|
await host.open(new Context());
|
|
31
|
-
await host.close();
|
|
32
|
+
await host.close(Context.default());
|
|
32
33
|
});
|
|
33
34
|
|
|
34
35
|
test('queryCredentials', async () => {
|
|
35
36
|
const host = createServiceHost(new Config(), new MemorySignalManagerContext());
|
|
36
37
|
await host.open(new Context());
|
|
37
|
-
onTestFinished(() => host.close());
|
|
38
|
+
onTestFinished(() => host.close(Context.default()));
|
|
38
39
|
|
|
39
40
|
await host.services.IdentityService!.createIdentity({});
|
|
40
|
-
const { spaceKey } = await host.services.SpacesService!.createSpace();
|
|
41
|
+
const { spaceKey } = await host.services.SpacesService!.createSpace({ membershipPolicy: MembershipPolicy.INVITE });
|
|
41
42
|
|
|
42
43
|
const stream = host.services.SpacesService!.queryCredentials({ spaceKey });
|
|
43
44
|
const [done, tick] = latch({ count: 3 });
|
|
@@ -53,7 +54,7 @@ describe('ClientServicesHost', () => {
|
|
|
53
54
|
test('write and query credentials', async () => {
|
|
54
55
|
const host = createServiceHost(new Config(), new MemorySignalManagerContext());
|
|
55
56
|
await host.open(new Context());
|
|
56
|
-
onTestFinished(() => host.close());
|
|
57
|
+
onTestFinished(() => host.close(Context.default()));
|
|
57
58
|
|
|
58
59
|
await host.services.IdentityService!.createIdentity({});
|
|
59
60
|
|
|
@@ -90,7 +91,7 @@ describe('ClientServicesHost', () => {
|
|
|
90
91
|
test('sign presentation', async () => {
|
|
91
92
|
const host = createServiceHost(new Config(), new MemorySignalManagerContext());
|
|
92
93
|
await host.open(new Context());
|
|
93
|
-
onTestFinished(() => host.close());
|
|
94
|
+
onTestFinished(() => host.close(Context.default()));
|
|
94
95
|
|
|
95
96
|
await host.services.IdentityService!.createIdentity({});
|
|
96
97
|
|
|
@@ -127,7 +128,7 @@ describe('ClientServicesHost', () => {
|
|
|
127
128
|
expect(host.context.storage.size).to.exist;
|
|
128
129
|
|
|
129
130
|
await asyncTimeout(host.reset(), 1000);
|
|
130
|
-
await host.close();
|
|
131
|
+
await host.close(Context.default());
|
|
131
132
|
}
|
|
132
133
|
|
|
133
134
|
{
|
|
@@ -145,7 +146,7 @@ describe('ClientServicesHost', () => {
|
|
|
145
146
|
});
|
|
146
147
|
await expect(asyncTimeout(trigger.wait(), 200)).rejects.toBeInstanceOf(Error);
|
|
147
148
|
await stream?.close();
|
|
148
|
-
await host.close();
|
|
149
|
+
await host.close(Context.default());
|
|
149
150
|
}
|
|
150
151
|
});
|
|
151
152
|
});
|