@dxos/client-services 0.8.4-main.dedc0f3 → 0.8.4-main.dfabb4ec29
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-LZ5JMQR7.mjs → chunk-DPJ5AYTT.mjs} +2729 -4593
- package/dist/lib/browser/chunk-DPJ5AYTT.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 +490 -228
- 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 +60 -90
- 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-JXUVAXX5.mjs → chunk-NAPGGOMT.mjs} +2652 -4385
- package/dist/lib/node-esm/chunk-NAPGGOMT.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +490 -228
- 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 +60 -90
- 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 +2 -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 +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/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.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.map +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 +2 -3
- 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.map +1 -1
- package/dist/types/src/packlets/identity/identity-manager.d.ts +6 -6
- 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 +8 -11
- 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 +1 -1
- package/dist/types/src/packlets/invitations/edge-invitation-handler.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 +7 -4
- 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 +3 -3
- package/dist/types/src/packlets/invitations/invitations-service.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts +4 -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/browser.d.ts.map +1 -1
- package/dist/types/src/packlets/locks/index.d.ts +1 -1
- 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 +4 -0
- package/dist/types/src/packlets/logging/logging-service.d.ts.map +1 -1
- package/dist/types/src/packlets/network/network-service.d.ts +5 -4
- 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 +13 -9
- package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
- package/dist/types/src/packlets/services/service-host.d.ts +20 -7
- 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 +7 -1
- 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.map +1 -1
- package/dist/types/src/packlets/spaces/data-space-manager.d.ts +28 -17
- package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/data-space.d.ts +26 -9
- 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 +10 -7
- 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 +1 -1
- 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 +6 -5
- 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 +70 -55
- package/src/index.ts +1 -0
- package/src/packlets/agents/edge-agent-manager.ts +8 -5
- package/src/packlets/agents/edge-agent-service.ts +15 -3
- package/src/packlets/devices/devices-service.test.ts +0 -1
- package/src/packlets/devices/devices-service.ts +1 -1
- package/src/packlets/devtools/devtools.ts +2 -3
- package/src/packlets/diagnostics/diagnostics.ts +1 -2
- package/src/packlets/diagnostics/index.ts +1 -1
- package/src/packlets/identity/authenticator.ts +2 -2
- package/src/packlets/identity/contacts-service.ts +0 -1
- package/src/packlets/identity/identity-manager.test.ts +5 -5
- package/src/packlets/identity/identity-manager.ts +23 -22
- package/src/packlets/identity/identity-recovery-manager.ts +22 -18
- package/src/packlets/identity/identity-service.test.ts +6 -27
- package/src/packlets/identity/identity-service.ts +13 -81
- package/src/packlets/identity/identity.test.ts +6 -6
- package/src/packlets/identity/identity.ts +11 -34
- package/src/packlets/invitations/device-invitation-protocol.ts +8 -7
- package/src/packlets/invitations/edge-invitation-handler.ts +9 -5
- package/src/packlets/invitations/invitation-guest-extenstion.ts +6 -4
- package/src/packlets/invitations/invitation-host-extension.ts +13 -14
- package/src/packlets/invitations/invitation-protocol.ts +7 -4
- package/src/packlets/invitations/invitation-state.ts +1 -15
- package/src/packlets/invitations/invitations-handler.test.ts +4 -5
- package/src/packlets/invitations/invitations-handler.ts +74 -22
- package/src/packlets/invitations/invitations-manager.ts +40 -15
- package/src/packlets/invitations/invitations-service.ts +9 -9
- package/src/packlets/invitations/space-invitation-protocol.test.ts +17 -16
- package/src/packlets/invitations/space-invitation-protocol.ts +11 -16
- package/src/packlets/locks/index.ts +1 -1
- package/src/packlets/logging/logging-service.ts +20 -16
- package/src/packlets/network/network-service.test.ts +0 -1
- package/src/packlets/network/network-service.ts +10 -8
- package/src/packlets/services/client-rpc-server.ts +19 -16
- 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 +3 -2
- package/src/packlets/services/service-context.ts +139 -56
- package/src/packlets/services/service-host.test.ts +8 -8
- package/src/packlets/services/service-host.ts +76 -40
- package/src/packlets/services/service-registry.test.ts +0 -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 +64 -3
- package/src/packlets/space-export/space-archive-writer.ts +41 -3
- package/src/packlets/space-export/space-archive.test.ts +461 -0
- package/src/packlets/spaces/data-space-manager.test.ts +79 -13
- package/src/packlets/spaces/data-space-manager.ts +115 -116
- package/src/packlets/spaces/data-space.ts +58 -34
- package/src/packlets/spaces/edge-feed-replicator.test.ts +2 -2
- package/src/packlets/spaces/edge-feed-replicator.ts +12 -10
- 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 +2 -2
- package/src/packlets/spaces/notarization-plugin.ts +10 -9
- package/src/packlets/spaces/spaces-service.test.ts +18 -11
- package/src/packlets/spaces/spaces-service.ts +123 -24
- package/src/packlets/storage/storage.ts +4 -4
- package/src/packlets/testing/invitation-utils.ts +10 -6
- package/src/packlets/testing/test-builder.ts +36 -10
- package/src/packlets/worker/worker-runtime.ts +188 -17
- package/src/packlets/worker/worker-session.ts +12 -18
- package/src/version.ts +1 -1
- package/dist/lib/browser/chunk-LZ5JMQR7.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-JXUVAXX5.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
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { type Doc } from '@automerge/automerge';
|
|
6
|
-
import { type AutomergeUrl, type
|
|
6
|
+
import { type AutomergeUrl, type DocumentId, interpretAsDocumentId } from '@automerge/automerge-repo';
|
|
7
7
|
|
|
8
8
|
import { Event, synchronized, trackLeaks } from '@dxos/async';
|
|
9
|
-
import {
|
|
9
|
+
import { SpaceProperties } from '@dxos/client-protocol';
|
|
10
10
|
import { Context, LifecycleState, Resource, cancelWithContext } from '@dxos/context';
|
|
11
11
|
import {
|
|
12
12
|
type CredentialSigner,
|
|
@@ -15,13 +15,13 @@ import {
|
|
|
15
15
|
createAdmissionCredentials,
|
|
16
16
|
getCredentialAssertion,
|
|
17
17
|
} from '@dxos/credentials';
|
|
18
|
+
import { Type } from '@dxos/echo';
|
|
18
19
|
import {
|
|
19
20
|
AuthStatus,
|
|
20
21
|
CredentialServerExtension,
|
|
21
22
|
DatabaseRoot,
|
|
22
23
|
type EchoEdgeReplicator,
|
|
23
24
|
type EchoHost,
|
|
24
|
-
FIND_PARAMS,
|
|
25
25
|
type MeshEchoReplicator,
|
|
26
26
|
type MetadataStore,
|
|
27
27
|
type Space,
|
|
@@ -30,46 +30,40 @@ import {
|
|
|
30
30
|
type SpaceProtocolSession,
|
|
31
31
|
findInlineObjectOfType,
|
|
32
32
|
} from '@dxos/echo-pipeline';
|
|
33
|
-
import {
|
|
34
|
-
type DatabaseDirectory,
|
|
35
|
-
type ObjectStructure,
|
|
36
|
-
SpaceDocVersion,
|
|
37
|
-
createIdFromSpaceKey,
|
|
38
|
-
encodeReference,
|
|
39
|
-
} from '@dxos/echo-protocol';
|
|
40
|
-
import { ObjectId, getTypeReference } from '@dxos/echo-schema';
|
|
33
|
+
import { type DatabaseDirectory, createIdFromSpaceKey } from '@dxos/echo-protocol';
|
|
41
34
|
import type { EdgeConnection, EdgeHttpClient } from '@dxos/edge-client';
|
|
42
35
|
import { type FeedStore, writeMessages } from '@dxos/feed-store';
|
|
43
36
|
import { assertArgument, assertState, failedInvariant, invariant } from '@dxos/invariant';
|
|
44
37
|
import { type Keyring } from '@dxos/keyring';
|
|
45
38
|
import { PublicKey, type SpaceId } from '@dxos/keys';
|
|
46
39
|
import { log } from '@dxos/log';
|
|
47
|
-
import { AlreadyJoinedError
|
|
40
|
+
import { AlreadyJoinedError } from '@dxos/protocols';
|
|
48
41
|
import { Invitation, SpaceState } from '@dxos/protocols/proto/dxos/client/services';
|
|
49
42
|
import { type Runtime } from '@dxos/protocols/proto/dxos/config';
|
|
50
43
|
import { type FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';
|
|
51
44
|
import { EdgeReplicationSetting, type SpaceMetadata } from '@dxos/protocols/proto/dxos/echo/metadata';
|
|
52
|
-
import {
|
|
45
|
+
import {
|
|
46
|
+
type Credential,
|
|
47
|
+
MembershipPolicy,
|
|
48
|
+
type ProfileDocument,
|
|
49
|
+
SpaceMember,
|
|
50
|
+
} from '@dxos/protocols/proto/dxos/halo/credentials';
|
|
53
51
|
import { type DelegateSpaceInvitation } from '@dxos/protocols/proto/dxos/halo/invitations';
|
|
54
52
|
import { type PeerState } from '@dxos/protocols/proto/dxos/mesh/presence';
|
|
55
53
|
import { type Teleport } from '@dxos/teleport';
|
|
56
54
|
import { Gossip, Presence } from '@dxos/teleport-extension-gossip';
|
|
57
55
|
import { type Timeframe } from '@dxos/timeframe';
|
|
58
56
|
import { trace } from '@dxos/tracing';
|
|
59
|
-
import { ComplexMap, deferFunction, forEachAsync
|
|
57
|
+
import { ComplexMap, deferFunction, forEachAsync } from '@dxos/util';
|
|
60
58
|
|
|
61
59
|
import { createAuthProvider } from '../identity';
|
|
62
60
|
import { type InvitationsManager } from '../invitations';
|
|
63
|
-
|
|
64
61
|
import { DataSpace } from './data-space';
|
|
65
62
|
import { spaceGenesis } from './genesis';
|
|
66
63
|
|
|
67
64
|
const PRESENCE_ANNOUNCE_INTERVAL = 10_000;
|
|
68
65
|
const PRESENCE_OFFLINE_TIMEOUT = 20_000;
|
|
69
66
|
|
|
70
|
-
// Space properties key for default metadata.
|
|
71
|
-
const DEFAULT_SPACE_KEY = '__DEFAULT__';
|
|
72
|
-
|
|
73
67
|
export interface SigningContext {
|
|
74
68
|
identityKey: PublicKey;
|
|
75
69
|
deviceKey: PublicKey;
|
|
@@ -94,6 +88,9 @@ export type AcceptSpaceOptions = {
|
|
|
94
88
|
* We will try to catch up to this timeframe before initializing the database.
|
|
95
89
|
*/
|
|
96
90
|
dataTimeframe?: Timeframe;
|
|
91
|
+
|
|
92
|
+
/** Tags assigned to the space member. */
|
|
93
|
+
tags?: string[];
|
|
97
94
|
};
|
|
98
95
|
|
|
99
96
|
export type AdmitMemberOptions = {
|
|
@@ -102,9 +99,10 @@ export type AdmitMemberOptions = {
|
|
|
102
99
|
role: SpaceMember.Role;
|
|
103
100
|
profile?: ProfileDocument;
|
|
104
101
|
delegationCredentialId?: PublicKey;
|
|
102
|
+
tags?: string[];
|
|
105
103
|
};
|
|
106
104
|
|
|
107
|
-
export type
|
|
105
|
+
export type DataSpaceManagerProps = {
|
|
108
106
|
spaceManager: SpaceManager;
|
|
109
107
|
metadataStore: MetadataStore;
|
|
110
108
|
keyring: Keyring;
|
|
@@ -116,30 +114,36 @@ export type DataSpaceManagerParams = {
|
|
|
116
114
|
edgeHttpClient?: EdgeHttpClient;
|
|
117
115
|
meshReplicator?: MeshEchoReplicator;
|
|
118
116
|
echoEdgeReplicator?: EchoEdgeReplicator;
|
|
119
|
-
|
|
117
|
+
runtimeProps?: DataSpaceManagerRuntimeProps;
|
|
120
118
|
edgeFeatures?: Runtime.Client.EdgeFeatures;
|
|
121
119
|
};
|
|
122
120
|
|
|
123
|
-
export type
|
|
121
|
+
export type DataSpaceManagerRuntimeProps = {
|
|
124
122
|
spaceMemberPresenceAnnounceInterval?: number;
|
|
125
123
|
spaceMemberPresenceOfflineTimeout?: number;
|
|
126
124
|
activeEdgeNotarizationPollingInterval?: number;
|
|
127
125
|
disableP2pReplication?: boolean;
|
|
126
|
+
/**
|
|
127
|
+
* If true, spaces that were previously SPACE_ACTIVE will be automatically activated on startup.
|
|
128
|
+
* This is used in dedicated worker mode to restore space state after leader changeover.
|
|
129
|
+
*/
|
|
130
|
+
autoActivateSpaces?: boolean;
|
|
128
131
|
};
|
|
129
132
|
|
|
130
133
|
export type CreateSpaceOptions = {
|
|
131
134
|
rootUrl?: AutomergeUrl;
|
|
132
135
|
documents?: Record<DocumentId, Uint8Array>;
|
|
136
|
+
tags?: string[];
|
|
137
|
+
membershipPolicy?: MembershipPolicy;
|
|
133
138
|
};
|
|
134
139
|
|
|
135
140
|
@trackLeaks('open', 'close')
|
|
141
|
+
@trace.resource({ lifecycle: true })
|
|
136
142
|
export class DataSpaceManager extends Resource {
|
|
137
143
|
public readonly updated = new Event();
|
|
138
144
|
|
|
139
145
|
private readonly _spaces = new ComplexMap<PublicKey, DataSpace>(PublicKey.hash);
|
|
140
146
|
|
|
141
|
-
private readonly _instanceId = PublicKey.random().toHex();
|
|
142
|
-
|
|
143
147
|
private readonly _spaceManager: SpaceManager;
|
|
144
148
|
private readonly _metadataStore: MetadataStore;
|
|
145
149
|
private readonly _keyring: Keyring;
|
|
@@ -152,9 +156,9 @@ export class DataSpaceManager extends Resource {
|
|
|
152
156
|
private readonly _edgeFeatures?: Runtime.Client.EdgeFeatures = undefined;
|
|
153
157
|
private readonly _meshReplicator?: MeshEchoReplicator = undefined;
|
|
154
158
|
private readonly _echoEdgeReplicator?: EchoEdgeReplicator = undefined;
|
|
155
|
-
private readonly
|
|
159
|
+
private readonly _runtimeProps?: DataSpaceManagerRuntimeProps = undefined;
|
|
156
160
|
|
|
157
|
-
constructor(params:
|
|
161
|
+
constructor(params: DataSpaceManagerProps) {
|
|
158
162
|
super();
|
|
159
163
|
|
|
160
164
|
this._spaceManager = params.spaceManager;
|
|
@@ -169,7 +173,7 @@ export class DataSpaceManager extends Resource {
|
|
|
169
173
|
this._edgeFeatures = params.edgeFeatures;
|
|
170
174
|
this._echoEdgeReplicator = params.echoEdgeReplicator;
|
|
171
175
|
this._edgeHttpClient = params.edgeHttpClient;
|
|
172
|
-
this.
|
|
176
|
+
this._runtimeProps = params.runtimeProps;
|
|
173
177
|
|
|
174
178
|
trace.diagnostic({
|
|
175
179
|
id: 'spaces',
|
|
@@ -179,12 +183,11 @@ export class DataSpaceManager extends Resource {
|
|
|
179
183
|
Array.from(this._spaces.values()).map(async (space) => {
|
|
180
184
|
const rootUrl = space.automergeSpaceState.rootUrl;
|
|
181
185
|
const rootHandle = rootUrl
|
|
182
|
-
? await this._echoHost.
|
|
186
|
+
? await this._echoHost.loadDoc<Doc<DatabaseDirectory>>(this._ctx, rootUrl as AutomergeUrl)
|
|
183
187
|
: undefined;
|
|
184
|
-
await rootHandle?.whenReady();
|
|
185
188
|
const rootDoc = rootHandle?.doc();
|
|
186
189
|
|
|
187
|
-
const properties = rootDoc && findInlineObjectOfType(rootDoc,
|
|
190
|
+
const properties = rootDoc && findInlineObjectOfType(rootDoc, Type.getTypename(SpaceProperties));
|
|
188
191
|
|
|
189
192
|
return {
|
|
190
193
|
key: space.key.toHex(),
|
|
@@ -212,30 +215,41 @@ export class DataSpaceManager extends Resource {
|
|
|
212
215
|
}
|
|
213
216
|
|
|
214
217
|
@synchronized
|
|
215
|
-
|
|
218
|
+
@trace.span({ showInBrowserTimeline: true, op: 'lifecycle' })
|
|
219
|
+
protected override async _open(ctx: Context): Promise<void> {
|
|
216
220
|
log('open');
|
|
217
|
-
log.trace('dxos.echo.data-space-manager.open', Trace.begin({ id: this._instanceId }));
|
|
218
221
|
log('metadata loaded', { spaces: this._metadataStore.spaces.length });
|
|
219
222
|
|
|
223
|
+
const spacesToActivate: DataSpace[] = [];
|
|
220
224
|
await forEachAsync(this._metadataStore.spaces, async (spaceMetadata) => {
|
|
221
225
|
try {
|
|
222
226
|
log('load space', { spaceMetadata });
|
|
223
|
-
await this._constructSpace(spaceMetadata);
|
|
227
|
+
const space = await this._constructSpace(ctx, spaceMetadata);
|
|
228
|
+
// Track spaces that were previously active for auto-activation (used in dedicated worker mode).
|
|
229
|
+
if (this._runtimeProps?.autoActivateSpaces && spaceMetadata.state === SpaceState.SPACE_ACTIVE) {
|
|
230
|
+
spacesToActivate.push(space);
|
|
231
|
+
}
|
|
224
232
|
} catch (err) {
|
|
225
233
|
log.error('Error loading space', { spaceMetadata, err });
|
|
226
234
|
}
|
|
227
235
|
});
|
|
228
236
|
|
|
229
|
-
|
|
237
|
+
// Auto-activate spaces that were previously active (used in dedicated worker mode after leader changeover).
|
|
238
|
+
for (const space of spacesToActivate) {
|
|
239
|
+
log('auto-activating space', { spaceKey: space.key });
|
|
240
|
+
space.activate(ctx).catch((err) => {
|
|
241
|
+
log.error('Error auto-activating space', { spaceKey: space.key, err });
|
|
242
|
+
});
|
|
243
|
+
}
|
|
230
244
|
|
|
231
|
-
|
|
245
|
+
this.updated.emit();
|
|
232
246
|
}
|
|
233
247
|
|
|
234
248
|
@synchronized
|
|
235
|
-
protected override async _close(): Promise<void> {
|
|
249
|
+
protected override async _close(ctx: Context): Promise<void> {
|
|
236
250
|
log('close');
|
|
237
251
|
for (const space of this._spaces.values()) {
|
|
238
|
-
await space.close();
|
|
252
|
+
await space.close(ctx);
|
|
239
253
|
}
|
|
240
254
|
this._spaces.clear();
|
|
241
255
|
}
|
|
@@ -244,7 +258,8 @@ export class DataSpaceManager extends Resource {
|
|
|
244
258
|
* Creates a new space writing the genesis credentials to the control feed.
|
|
245
259
|
*/
|
|
246
260
|
@synchronized
|
|
247
|
-
|
|
261
|
+
@trace.span({ showInBrowserTimeline: true, op: 'lifecycle' })
|
|
262
|
+
async createSpace(ctx: Context, options: CreateSpaceOptions = {}): Promise<DataSpace> {
|
|
248
263
|
assertArgument(
|
|
249
264
|
!!options.rootUrl === !!options.documents,
|
|
250
265
|
'options',
|
|
@@ -252,6 +267,8 @@ export class DataSpaceManager extends Resource {
|
|
|
252
267
|
);
|
|
253
268
|
|
|
254
269
|
assertState(this._lifecycleState === LifecycleState.OPEN, 'Not open.');
|
|
270
|
+
|
|
271
|
+
const tags = options.tags ? Array.from(options.tags) : [];
|
|
255
272
|
const spaceKey = await this._keyring.createKey();
|
|
256
273
|
const controlFeedKey = await this._keyring.createKey();
|
|
257
274
|
const dataFeedKey = await this._keyring.createKey();
|
|
@@ -264,6 +281,7 @@ export class DataSpaceManager extends Resource {
|
|
|
264
281
|
controlFeedKey,
|
|
265
282
|
dataFeedKey,
|
|
266
283
|
state: SpaceState.SPACE_ACTIVE,
|
|
284
|
+
tags,
|
|
267
285
|
};
|
|
268
286
|
|
|
269
287
|
log('creating space...', { spaceId, spaceKey });
|
|
@@ -279,7 +297,18 @@ export class DataSpaceManager extends Resource {
|
|
|
279
297
|
await Promise.all(
|
|
280
298
|
Object.entries(options.documents).map(async ([documentId, data]) => {
|
|
281
299
|
log('creating document...', { documentId });
|
|
282
|
-
|
|
300
|
+
// TODO(dmaretskyi): Broken types -- the bytes get interpreted as CRDT data.
|
|
301
|
+
const newDoc = await this._echoHost.createDoc(data as any as DatabaseDirectory, {
|
|
302
|
+
preserveHistory: true,
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
// The archived documents might have the spaceKey from the space they were expored from, we need to update it to the new spaceKey.
|
|
306
|
+
if (newDoc.doc().access !== undefined && newDoc.doc().access!.spaceKey !== spaceKey.toHex()) {
|
|
307
|
+
newDoc.change((doc) => {
|
|
308
|
+
doc.access!.spaceKey = spaceKey.toHex();
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
|
|
283
312
|
documentIdMapping[documentId as DocumentId] = newDoc.documentId;
|
|
284
313
|
}),
|
|
285
314
|
);
|
|
@@ -290,29 +319,37 @@ export class DataSpaceManager extends Resource {
|
|
|
290
319
|
let root: DatabaseRoot;
|
|
291
320
|
if (options.rootUrl) {
|
|
292
321
|
const newRootDocId = documentIdMapping[interpretAsDocumentId(options.rootUrl)] ?? failedInvariant();
|
|
293
|
-
const rootDocHandle = await this._echoHost.loadDoc<DatabaseDirectory>(
|
|
322
|
+
const rootDocHandle = await this._echoHost.loadDoc<DatabaseDirectory>(ctx, newRootDocId);
|
|
294
323
|
DatabaseRoot.mapLinks(rootDocHandle, documentIdMapping);
|
|
295
324
|
|
|
296
|
-
root = await this._echoHost.openSpaceRoot(spaceId, `automerge:${newRootDocId}` as AutomergeUrl);
|
|
325
|
+
root = await this._echoHost.openSpaceRoot(ctx, spaceId, `automerge:${newRootDocId}` as AutomergeUrl);
|
|
297
326
|
} else {
|
|
298
|
-
root = await this._echoHost.createSpaceRoot(spaceKey);
|
|
327
|
+
root = await this._echoHost.createSpaceRoot(ctx, spaceKey);
|
|
299
328
|
}
|
|
329
|
+
await this._echoHost.flush(ctx);
|
|
300
330
|
|
|
301
331
|
log('constructing space...', { spaceKey });
|
|
302
332
|
|
|
303
|
-
const space = await this._constructSpace(metadata);
|
|
304
|
-
await space.open();
|
|
333
|
+
const space = await this._constructSpace(ctx, metadata);
|
|
334
|
+
await space.open(ctx);
|
|
305
335
|
|
|
306
336
|
log('adding space...', { spaceKey });
|
|
307
337
|
|
|
308
|
-
const credentials = await spaceGenesis(
|
|
338
|
+
const credentials = await spaceGenesis(
|
|
339
|
+
this._keyring,
|
|
340
|
+
this._signingContext,
|
|
341
|
+
space.inner,
|
|
342
|
+
root.url,
|
|
343
|
+
tags,
|
|
344
|
+
options.membershipPolicy,
|
|
345
|
+
);
|
|
309
346
|
await this._metadataStore.addSpace(metadata);
|
|
310
347
|
|
|
311
348
|
const memberCredential = credentials[1];
|
|
312
349
|
invariant(getCredentialAssertion(memberCredential)['@type'] === 'dxos.halo.credentials.SpaceMember');
|
|
313
350
|
await this._signingContext.recordCredential(memberCredential);
|
|
314
351
|
|
|
315
|
-
await space.initializeDataPipeline();
|
|
352
|
+
await space.initializeDataPipeline(ctx);
|
|
316
353
|
|
|
317
354
|
log('space ready.', { spaceId, spaceKey });
|
|
318
355
|
|
|
@@ -320,81 +357,36 @@ export class DataSpaceManager extends Resource {
|
|
|
320
357
|
return space;
|
|
321
358
|
}
|
|
322
359
|
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
case SpaceDocVersion.CURRENT: {
|
|
329
|
-
if (!space.databaseRoot.handle.isReady()) {
|
|
330
|
-
log.warn('waiting for space root to be ready', { spaceId: space.id });
|
|
331
|
-
await space.databaseRoot.handle.whenReady();
|
|
332
|
-
}
|
|
333
|
-
const [_, properties] = findInlineObjectOfType(space.databaseRoot.doc()!, TYPE_PROPERTIES) ?? [];
|
|
334
|
-
return properties?.data?.[DEFAULT_SPACE_KEY] === this._signingContext.identityKey.toHex();
|
|
335
|
-
}
|
|
336
|
-
case SpaceDocVersion.LEGACY: {
|
|
337
|
-
throw new Error('Legacy space version is not supported');
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
default:
|
|
341
|
-
log.warn('unknown space version', { version: space.databaseRoot.getVersion(), spaceId: space.id });
|
|
342
|
-
return false;
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
async createDefaultSpace(): Promise<DataSpace> {
|
|
347
|
-
const space = await this.createSpace();
|
|
348
|
-
const document = await this._getSpaceRootDocument(space);
|
|
349
|
-
|
|
350
|
-
// TODO(dmaretskyi): Better API for low-level data access.
|
|
351
|
-
const properties: ObjectStructure = {
|
|
352
|
-
system: {
|
|
353
|
-
type: encodeReference(getTypeReference(PropertiesType)!),
|
|
354
|
-
},
|
|
355
|
-
data: {
|
|
356
|
-
[DEFAULT_SPACE_KEY]: this._signingContext.identityKey.toHex(),
|
|
357
|
-
},
|
|
358
|
-
meta: {
|
|
359
|
-
keys: [],
|
|
360
|
-
},
|
|
361
|
-
};
|
|
362
|
-
|
|
363
|
-
const propertiesId = ObjectId.random();
|
|
364
|
-
document.change((doc: DatabaseDirectory) => {
|
|
365
|
-
setDeep(doc, ['objects', propertiesId], properties);
|
|
366
|
-
});
|
|
367
|
-
|
|
368
|
-
await this._echoHost.flush();
|
|
369
|
-
return space;
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
private async _getSpaceRootDocument(space: DataSpace): Promise<DocHandle<DatabaseDirectory>> {
|
|
373
|
-
const automergeIndex = space.automergeSpaceState.rootUrl;
|
|
374
|
-
invariant(automergeIndex);
|
|
375
|
-
const document = await this._echoHost.automergeRepo.find<DatabaseDirectory>(automergeIndex as any, FIND_PARAMS);
|
|
376
|
-
await document.whenReady();
|
|
377
|
-
return document;
|
|
378
|
-
}
|
|
379
|
-
|
|
360
|
+
/**
|
|
361
|
+
* Accepts an existing space by joining its swarm and initializing the data pipeline.
|
|
362
|
+
* @param ctx - Caller context for cancellation and tracing.
|
|
363
|
+
* @param opts - Space keys and optional timeframes for catch-up.
|
|
364
|
+
*/
|
|
380
365
|
// TODO(burdon): Rename join space.
|
|
381
366
|
@synchronized
|
|
382
|
-
|
|
367
|
+
@trace.span({ showInBrowserTimeline: true, op: 'lifecycle' })
|
|
368
|
+
async acceptSpace(ctx: Context, opts: AcceptSpaceOptions): Promise<DataSpace> {
|
|
383
369
|
log('accept space', { opts });
|
|
384
370
|
invariant(this._lifecycleState === LifecycleState.OPEN, 'Not open.');
|
|
385
371
|
invariant(!this._spaces.has(opts.spaceKey), 'Space already exists.');
|
|
386
372
|
|
|
373
|
+
const tags = opts.tags ? Array.from(opts.tags) : [];
|
|
387
374
|
const metadata: SpaceMetadata = {
|
|
388
375
|
key: opts.spaceKey,
|
|
389
376
|
genesisFeedKey: opts.genesisFeedKey,
|
|
390
377
|
controlTimeframe: opts.controlTimeframe,
|
|
391
378
|
dataTimeframe: opts.dataTimeframe,
|
|
379
|
+
tags,
|
|
392
380
|
};
|
|
393
381
|
|
|
394
|
-
const space = await this._constructSpace(metadata);
|
|
395
|
-
await space.open();
|
|
382
|
+
const space = await this._constructSpace(ctx, metadata);
|
|
383
|
+
await space.open(ctx);
|
|
396
384
|
await this._metadataStore.addSpace(metadata);
|
|
397
|
-
|
|
385
|
+
// Use DSM lifecycle ctx: the invitation accept flow disposes `ctx` as soon as
|
|
386
|
+
// `acceptSpace` returns (guardedState.complete -> ctx.dispose). Detached data-pipeline
|
|
387
|
+
// initialization must outlive the invitation flow, and its span must be parented to a
|
|
388
|
+
// long-lived context.
|
|
389
|
+
space.initializeDataPipelineAsync(this._ctx);
|
|
398
390
|
|
|
399
391
|
this.updated.emit();
|
|
400
392
|
return space;
|
|
@@ -418,6 +410,7 @@ export class DataSpaceManager extends Resource {
|
|
|
418
410
|
space.spaceState.membershipChainHeads,
|
|
419
411
|
options.profile,
|
|
420
412
|
options.delegationCredentialId,
|
|
413
|
+
space.spaceState.tags,
|
|
421
414
|
);
|
|
422
415
|
|
|
423
416
|
// TODO(dmaretskyi): Refactor.
|
|
@@ -444,8 +437,8 @@ export class DataSpaceManager extends Resource {
|
|
|
444
437
|
);
|
|
445
438
|
}
|
|
446
439
|
|
|
447
|
-
public async requestSpaceAdmissionCredential(spaceKey: PublicKey): Promise<Credential> {
|
|
448
|
-
return this._spaceManager.requestSpaceAdmissionCredential({
|
|
440
|
+
public async requestSpaceAdmissionCredential(ctx: Context, spaceKey: PublicKey): Promise<Credential> {
|
|
441
|
+
return this._spaceManager.requestSpaceAdmissionCredential(ctx, {
|
|
449
442
|
spaceKey,
|
|
450
443
|
identityKey: this._signingContext.identityKey,
|
|
451
444
|
timeout: 15_000,
|
|
@@ -458,7 +451,11 @@ export class DataSpaceManager extends Resource {
|
|
|
458
451
|
});
|
|
459
452
|
}
|
|
460
453
|
|
|
461
|
-
async setSpaceEdgeReplicationSetting(
|
|
454
|
+
async setSpaceEdgeReplicationSetting(
|
|
455
|
+
ctx: Context,
|
|
456
|
+
spaceKey: PublicKey,
|
|
457
|
+
setting: EdgeReplicationSetting,
|
|
458
|
+
): Promise<void> {
|
|
462
459
|
const space = this._spaces.get(spaceKey);
|
|
463
460
|
invariant(space, 'Space not found.');
|
|
464
461
|
|
|
@@ -470,7 +467,7 @@ export class DataSpaceManager extends Resource {
|
|
|
470
467
|
await this._echoEdgeReplicator?.disconnectFromSpace(space.id);
|
|
471
468
|
break;
|
|
472
469
|
case EdgeReplicationSetting.ENABLED:
|
|
473
|
-
await this._echoEdgeReplicator?.connectToSpace(space.id);
|
|
470
|
+
await this._echoEdgeReplicator?.connectToSpace(ctx, space.id);
|
|
474
471
|
break;
|
|
475
472
|
}
|
|
476
473
|
}
|
|
@@ -478,14 +475,14 @@ export class DataSpaceManager extends Resource {
|
|
|
478
475
|
space.stateUpdate.emit();
|
|
479
476
|
}
|
|
480
477
|
|
|
481
|
-
private async _constructSpace(metadata: SpaceMetadata): Promise<DataSpace> {
|
|
478
|
+
private async _constructSpace(ctx: Context, metadata: SpaceMetadata): Promise<DataSpace> {
|
|
482
479
|
log('construct space', { metadata });
|
|
483
480
|
const gossip = new Gossip({
|
|
484
481
|
localPeerId: this._signingContext.deviceKey,
|
|
485
482
|
});
|
|
486
483
|
const presence = new Presence({
|
|
487
|
-
announceInterval: this.
|
|
488
|
-
offlineTimeout: this.
|
|
484
|
+
announceInterval: this._runtimeProps?.spaceMemberPresenceAnnounceInterval ?? PRESENCE_ANNOUNCE_INTERVAL,
|
|
485
|
+
offlineTimeout: this._runtimeProps?.spaceMemberPresenceOfflineTimeout ?? PRESENCE_OFFLINE_TIMEOUT,
|
|
489
486
|
identityKey: this._signingContext.identityKey,
|
|
490
487
|
gossip,
|
|
491
488
|
});
|
|
@@ -568,15 +565,17 @@ export class DataSpaceManager extends Resource {
|
|
|
568
565
|
},
|
|
569
566
|
},
|
|
570
567
|
cache: metadata.cache,
|
|
568
|
+
tags: metadata.tags,
|
|
571
569
|
edgeConnection: this._edgeConnection,
|
|
572
570
|
edgeHttpClient: this._edgeHttpClient,
|
|
573
571
|
edgeFeatures: this._edgeFeatures,
|
|
574
|
-
activeEdgeNotarizationPollingInterval: this.
|
|
572
|
+
activeEdgeNotarizationPollingInterval: this._runtimeProps?.activeEdgeNotarizationPollingInterval,
|
|
575
573
|
});
|
|
576
574
|
dataSpace.postOpen.append(async () => {
|
|
577
575
|
const setting = dataSpace.getEdgeReplicationSetting();
|
|
578
576
|
if (!setting || setting === EdgeReplicationSetting.ENABLED) {
|
|
579
|
-
|
|
577
|
+
// Use lifecycle ctx: the caller ctx from _constructSpace may be disposed by the time postOpen fires.
|
|
578
|
+
await this._echoEdgeReplicator?.connectToSpace(this._ctx, dataSpace.id);
|
|
580
579
|
} else if (this._echoEdgeReplicator) {
|
|
581
580
|
log('not connecting EchoEdgeReplicator because of EdgeReplicationSetting', { spaceId: dataSpace.id });
|
|
582
581
|
}
|
|
@@ -673,7 +672,7 @@ export class DataSpaceManager extends Resource {
|
|
|
673
672
|
invitations: Array<[PublicKey, DelegateSpaceInvitation]>,
|
|
674
673
|
): Promise<void> {
|
|
675
674
|
const tasks = invitations.map(([credentialId, invitation]) => {
|
|
676
|
-
return this._invitationsManager.createInvitation({
|
|
675
|
+
return this._invitationsManager.createInvitation(this._ctx, {
|
|
677
676
|
type: Invitation.Type.DELEGATED,
|
|
678
677
|
kind: Invitation.Kind.SPACE,
|
|
679
678
|
spaceKey: space.key,
|