@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.
Files changed (229) hide show
  1. package/dist/lib/browser/{chunk-LZ5JMQR7.mjs → chunk-DPJ5AYTT.mjs} +2729 -4593
  2. package/dist/lib/browser/chunk-DPJ5AYTT.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-QCWEHHJW.mjs +24 -0
  4. package/dist/lib/browser/chunk-QCWEHHJW.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-XJRPB3GA.mjs +22 -0
  6. package/dist/lib/browser/chunk-XJRPB3GA.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +490 -228
  8. package/dist/lib/browser/index.mjs.map +4 -4
  9. package/dist/lib/browser/meta.json +1 -1
  10. package/dist/lib/browser/packlets/diagnostics/browser-diagnostics-broadcast.mjs +88 -0
  11. package/dist/lib/browser/packlets/diagnostics/browser-diagnostics-broadcast.mjs.map +7 -0
  12. package/dist/lib/browser/packlets/diagnostics/diagnostics-broadcast.mjs +11 -0
  13. package/dist/lib/browser/packlets/diagnostics/diagnostics-broadcast.mjs.map +7 -0
  14. package/dist/lib/browser/packlets/locks/browser.mjs +86 -0
  15. package/dist/lib/browser/packlets/locks/browser.mjs.map +7 -0
  16. package/dist/lib/browser/packlets/locks/node.mjs +48 -0
  17. package/dist/lib/browser/packlets/locks/node.mjs.map +7 -0
  18. package/dist/lib/browser/testing/index.mjs +60 -90
  19. package/dist/lib/browser/testing/index.mjs.map +3 -3
  20. package/dist/lib/node-esm/chunk-2DT3MZRL.mjs +22 -0
  21. package/dist/lib/node-esm/chunk-2DT3MZRL.mjs.map +7 -0
  22. package/dist/lib/node-esm/chunk-2SZHAWBN.mjs +24 -0
  23. package/dist/lib/node-esm/chunk-2SZHAWBN.mjs.map +7 -0
  24. package/dist/lib/node-esm/{chunk-JXUVAXX5.mjs → chunk-NAPGGOMT.mjs} +2652 -4385
  25. package/dist/lib/node-esm/chunk-NAPGGOMT.mjs.map +7 -0
  26. package/dist/lib/node-esm/index.mjs +490 -228
  27. package/dist/lib/node-esm/index.mjs.map +4 -4
  28. package/dist/lib/node-esm/meta.json +1 -1
  29. package/dist/lib/node-esm/packlets/diagnostics/browser-diagnostics-broadcast.mjs +88 -0
  30. package/dist/lib/node-esm/packlets/diagnostics/browser-diagnostics-broadcast.mjs.map +7 -0
  31. package/dist/lib/node-esm/packlets/diagnostics/diagnostics-broadcast.mjs +11 -0
  32. package/dist/lib/node-esm/packlets/diagnostics/diagnostics-broadcast.mjs.map +7 -0
  33. package/dist/lib/node-esm/packlets/locks/browser.mjs +86 -0
  34. package/dist/lib/node-esm/packlets/locks/browser.mjs.map +7 -0
  35. package/dist/lib/node-esm/packlets/locks/node.mjs +48 -0
  36. package/dist/lib/node-esm/packlets/locks/node.mjs.map +7 -0
  37. package/dist/lib/node-esm/testing/index.mjs +60 -90
  38. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  39. package/dist/types/src/index.d.ts +1 -0
  40. package/dist/types/src/index.d.ts.map +1 -1
  41. package/dist/types/src/packlets/agents/edge-agent-manager.d.ts +3 -2
  42. package/dist/types/src/packlets/agents/edge-agent-manager.d.ts.map +1 -1
  43. package/dist/types/src/packlets/agents/edge-agent-service.d.ts +2 -1
  44. package/dist/types/src/packlets/agents/edge-agent-service.d.ts.map +1 -1
  45. package/dist/types/src/packlets/devices/devices-service.d.ts.map +1 -1
  46. package/dist/types/src/packlets/devtools/devtools.d.ts +2 -2
  47. package/dist/types/src/packlets/devtools/devtools.d.ts.map +1 -1
  48. package/dist/types/src/packlets/devtools/feeds.d.ts.map +1 -1
  49. package/dist/types/src/packlets/devtools/keys.d.ts.map +1 -1
  50. package/dist/types/src/packlets/devtools/metadata.d.ts.map +1 -1
  51. package/dist/types/src/packlets/devtools/network.d.ts.map +1 -1
  52. package/dist/types/src/packlets/devtools/spaces.d.ts.map +1 -1
  53. package/dist/types/src/packlets/diagnostics/browser-diagnostics-broadcast.d.ts.map +1 -1
  54. package/dist/types/src/packlets/diagnostics/diagnostics-broadcast.d.ts.map +1 -1
  55. package/dist/types/src/packlets/diagnostics/diagnostics-collector.d.ts.map +1 -1
  56. package/dist/types/src/packlets/diagnostics/diagnostics.d.ts +2 -3
  57. package/dist/types/src/packlets/diagnostics/diagnostics.d.ts.map +1 -1
  58. package/dist/types/src/packlets/diagnostics/index.d.ts +1 -1
  59. package/dist/types/src/packlets/diagnostics/index.d.ts.map +1 -1
  60. package/dist/types/src/packlets/identity/authenticator.d.ts +2 -2
  61. package/dist/types/src/packlets/identity/authenticator.d.ts.map +1 -1
  62. package/dist/types/src/packlets/identity/contacts-service.d.ts.map +1 -1
  63. package/dist/types/src/packlets/identity/identity-manager.d.ts +6 -6
  64. package/dist/types/src/packlets/identity/identity-manager.d.ts.map +1 -1
  65. package/dist/types/src/packlets/identity/identity-recovery-manager.d.ts +8 -7
  66. package/dist/types/src/packlets/identity/identity-recovery-manager.d.ts.map +1 -1
  67. package/dist/types/src/packlets/identity/identity-service.d.ts +6 -10
  68. package/dist/types/src/packlets/identity/identity-service.d.ts.map +1 -1
  69. package/dist/types/src/packlets/identity/identity.d.ts +8 -11
  70. package/dist/types/src/packlets/identity/identity.d.ts.map +1 -1
  71. package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts +6 -5
  72. package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts.map +1 -1
  73. package/dist/types/src/packlets/invitations/edge-invitation-handler.d.ts +1 -1
  74. package/dist/types/src/packlets/invitations/edge-invitation-handler.d.ts.map +1 -1
  75. package/dist/types/src/packlets/invitations/invitation-guest-extenstion.d.ts.map +1 -1
  76. package/dist/types/src/packlets/invitations/invitation-host-extension.d.ts.map +1 -1
  77. package/dist/types/src/packlets/invitations/invitation-protocol.d.ts +7 -4
  78. package/dist/types/src/packlets/invitations/invitation-protocol.d.ts.map +1 -1
  79. package/dist/types/src/packlets/invitations/invitation-state.d.ts.map +1 -1
  80. package/dist/types/src/packlets/invitations/invitation-topology.d.ts.map +1 -1
  81. package/dist/types/src/packlets/invitations/invitations-handler.d.ts +4 -4
  82. package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +1 -1
  83. package/dist/types/src/packlets/invitations/invitations-manager.d.ts +3 -3
  84. package/dist/types/src/packlets/invitations/invitations-manager.d.ts.map +1 -1
  85. package/dist/types/src/packlets/invitations/invitations-service.d.ts +3 -3
  86. package/dist/types/src/packlets/invitations/invitations-service.d.ts.map +1 -1
  87. package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts +4 -3
  88. package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts.map +1 -1
  89. package/dist/types/src/packlets/invitations/utils.d.ts.map +1 -1
  90. package/dist/types/src/packlets/locks/browser.d.ts.map +1 -1
  91. package/dist/types/src/packlets/locks/index.d.ts +1 -1
  92. package/dist/types/src/packlets/locks/index.d.ts.map +1 -1
  93. package/dist/types/src/packlets/locks/node.d.ts.map +1 -1
  94. package/dist/types/src/packlets/logging/logging-service.d.ts +4 -0
  95. package/dist/types/src/packlets/logging/logging-service.d.ts.map +1 -1
  96. package/dist/types/src/packlets/network/network-service.d.ts +5 -4
  97. package/dist/types/src/packlets/network/network-service.d.ts.map +1 -1
  98. package/dist/types/src/packlets/services/client-rpc-server.d.ts +5 -5
  99. package/dist/types/src/packlets/services/client-rpc-server.d.ts.map +1 -1
  100. package/dist/types/src/packlets/services/feed-syncer.d.ts +59 -0
  101. package/dist/types/src/packlets/services/feed-syncer.d.ts.map +1 -0
  102. package/dist/types/src/packlets/services/feed-syncer.test.d.ts +2 -0
  103. package/dist/types/src/packlets/services/feed-syncer.test.d.ts.map +1 -0
  104. package/dist/types/src/packlets/services/platform.d.ts.map +1 -1
  105. package/dist/types/src/packlets/services/service-context.d.ts +13 -9
  106. package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
  107. package/dist/types/src/packlets/services/service-host.d.ts +20 -7
  108. package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
  109. package/dist/types/src/packlets/services/service-registry.d.ts.map +1 -1
  110. package/dist/types/src/packlets/services/util.d.ts.map +1 -1
  111. package/dist/types/src/packlets/space-export/archive-format.d.ts +9 -0
  112. package/dist/types/src/packlets/space-export/archive-format.d.ts.map +1 -0
  113. package/dist/types/src/packlets/space-export/index.d.ts +4 -1
  114. package/dist/types/src/packlets/space-export/index.d.ts.map +1 -1
  115. package/dist/types/src/packlets/space-export/serialized-space-reader.d.ts +23 -0
  116. package/dist/types/src/packlets/space-export/serialized-space-reader.d.ts.map +1 -0
  117. package/dist/types/src/packlets/space-export/serialized-space-writer.d.ts +36 -0
  118. package/dist/types/src/packlets/space-export/serialized-space-writer.d.ts.map +1 -0
  119. package/dist/types/src/packlets/space-export/space-archive-reader.d.ts +9 -1
  120. package/dist/types/src/packlets/space-export/space-archive-reader.d.ts.map +1 -1
  121. package/dist/types/src/packlets/space-export/space-archive-writer.d.ts +7 -1
  122. package/dist/types/src/packlets/space-export/space-archive-writer.d.ts.map +1 -1
  123. package/dist/types/src/packlets/space-export/space-archive.test.d.ts +2 -0
  124. package/dist/types/src/packlets/space-export/space-archive.test.d.ts.map +1 -0
  125. package/dist/types/src/packlets/spaces/automerge-space-state.d.ts.map +1 -1
  126. package/dist/types/src/packlets/spaces/data-space-manager.d.ts +28 -17
  127. package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
  128. package/dist/types/src/packlets/spaces/data-space.d.ts +26 -9
  129. package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
  130. package/dist/types/src/packlets/spaces/edge-feed-replicator.d.ts +2 -2
  131. package/dist/types/src/packlets/spaces/edge-feed-replicator.d.ts.map +1 -1
  132. package/dist/types/src/packlets/spaces/epoch-migrations.d.ts.map +1 -1
  133. package/dist/types/src/packlets/spaces/genesis.d.ts +2 -1
  134. package/dist/types/src/packlets/spaces/genesis.d.ts.map +1 -1
  135. package/dist/types/src/packlets/spaces/notarization-plugin.d.ts +6 -9
  136. package/dist/types/src/packlets/spaces/notarization-plugin.d.ts.map +1 -1
  137. package/dist/types/src/packlets/spaces/spaces-service.d.ts +10 -7
  138. package/dist/types/src/packlets/spaces/spaces-service.d.ts.map +1 -1
  139. package/dist/types/src/packlets/storage/level.d.ts.map +1 -1
  140. package/dist/types/src/packlets/storage/profile-archive.d.ts.map +1 -1
  141. package/dist/types/src/packlets/storage/storage.d.ts.map +1 -1
  142. package/dist/types/src/packlets/storage/util.d.ts.map +1 -1
  143. package/dist/types/src/packlets/system/system-service.d.ts +1 -1
  144. package/dist/types/src/packlets/system/system-service.d.ts.map +1 -1
  145. package/dist/types/src/packlets/testing/credential-utils.d.ts.map +1 -1
  146. package/dist/types/src/packlets/testing/invitation-utils.d.ts +6 -3
  147. package/dist/types/src/packlets/testing/invitation-utils.d.ts.map +1 -1
  148. package/dist/types/src/packlets/testing/test-builder.d.ts +6 -5
  149. package/dist/types/src/packlets/testing/test-builder.d.ts.map +1 -1
  150. package/dist/types/src/packlets/worker/worker-runtime.d.ts +41 -4
  151. package/dist/types/src/packlets/worker/worker-runtime.d.ts.map +1 -1
  152. package/dist/types/src/packlets/worker/worker-session.d.ts +2 -4
  153. package/dist/types/src/packlets/worker/worker-session.d.ts.map +1 -1
  154. package/dist/types/src/testing/setup.d.ts.map +1 -1
  155. package/dist/types/src/version.d.ts +1 -1
  156. package/dist/types/src/version.d.ts.map +1 -1
  157. package/dist/types/tsconfig.tsbuildinfo +1 -1
  158. package/package.json +70 -55
  159. package/src/index.ts +1 -0
  160. package/src/packlets/agents/edge-agent-manager.ts +8 -5
  161. package/src/packlets/agents/edge-agent-service.ts +15 -3
  162. package/src/packlets/devices/devices-service.test.ts +0 -1
  163. package/src/packlets/devices/devices-service.ts +1 -1
  164. package/src/packlets/devtools/devtools.ts +2 -3
  165. package/src/packlets/diagnostics/diagnostics.ts +1 -2
  166. package/src/packlets/diagnostics/index.ts +1 -1
  167. package/src/packlets/identity/authenticator.ts +2 -2
  168. package/src/packlets/identity/contacts-service.ts +0 -1
  169. package/src/packlets/identity/identity-manager.test.ts +5 -5
  170. package/src/packlets/identity/identity-manager.ts +23 -22
  171. package/src/packlets/identity/identity-recovery-manager.ts +22 -18
  172. package/src/packlets/identity/identity-service.test.ts +6 -27
  173. package/src/packlets/identity/identity-service.ts +13 -81
  174. package/src/packlets/identity/identity.test.ts +6 -6
  175. package/src/packlets/identity/identity.ts +11 -34
  176. package/src/packlets/invitations/device-invitation-protocol.ts +8 -7
  177. package/src/packlets/invitations/edge-invitation-handler.ts +9 -5
  178. package/src/packlets/invitations/invitation-guest-extenstion.ts +6 -4
  179. package/src/packlets/invitations/invitation-host-extension.ts +13 -14
  180. package/src/packlets/invitations/invitation-protocol.ts +7 -4
  181. package/src/packlets/invitations/invitation-state.ts +1 -15
  182. package/src/packlets/invitations/invitations-handler.test.ts +4 -5
  183. package/src/packlets/invitations/invitations-handler.ts +74 -22
  184. package/src/packlets/invitations/invitations-manager.ts +40 -15
  185. package/src/packlets/invitations/invitations-service.ts +9 -9
  186. package/src/packlets/invitations/space-invitation-protocol.test.ts +17 -16
  187. package/src/packlets/invitations/space-invitation-protocol.ts +11 -16
  188. package/src/packlets/locks/index.ts +1 -1
  189. package/src/packlets/logging/logging-service.ts +20 -16
  190. package/src/packlets/network/network-service.test.ts +0 -1
  191. package/src/packlets/network/network-service.ts +10 -8
  192. package/src/packlets/services/client-rpc-server.ts +19 -16
  193. package/src/packlets/services/feed-syncer.test.ts +340 -0
  194. package/src/packlets/services/feed-syncer.ts +377 -0
  195. package/src/packlets/services/platform.ts +7 -1
  196. package/src/packlets/services/service-context.test.ts +3 -2
  197. package/src/packlets/services/service-context.ts +139 -56
  198. package/src/packlets/services/service-host.test.ts +8 -8
  199. package/src/packlets/services/service-host.ts +76 -40
  200. package/src/packlets/services/service-registry.test.ts +0 -1
  201. package/src/packlets/space-export/archive-format.ts +42 -0
  202. package/src/packlets/space-export/index.ts +4 -1
  203. package/src/packlets/space-export/serialized-space-reader.ts +111 -0
  204. package/src/packlets/space-export/serialized-space-writer.ts +252 -0
  205. package/src/packlets/space-export/space-archive-reader.ts +64 -3
  206. package/src/packlets/space-export/space-archive-writer.ts +41 -3
  207. package/src/packlets/space-export/space-archive.test.ts +461 -0
  208. package/src/packlets/spaces/data-space-manager.test.ts +79 -13
  209. package/src/packlets/spaces/data-space-manager.ts +115 -116
  210. package/src/packlets/spaces/data-space.ts +58 -34
  211. package/src/packlets/spaces/edge-feed-replicator.test.ts +2 -2
  212. package/src/packlets/spaces/edge-feed-replicator.ts +12 -10
  213. package/src/packlets/spaces/epoch-migrations.ts +5 -5
  214. package/src/packlets/spaces/genesis.ts +6 -1
  215. package/src/packlets/spaces/notarization-plugin.test.ts +2 -2
  216. package/src/packlets/spaces/notarization-plugin.ts +10 -9
  217. package/src/packlets/spaces/spaces-service.test.ts +18 -11
  218. package/src/packlets/spaces/spaces-service.ts +123 -24
  219. package/src/packlets/storage/storage.ts +4 -4
  220. package/src/packlets/testing/invitation-utils.ts +10 -6
  221. package/src/packlets/testing/test-builder.ts +36 -10
  222. package/src/packlets/worker/worker-runtime.ts +188 -17
  223. package/src/packlets/worker/worker-session.ts +12 -18
  224. package/src/version.ts +1 -1
  225. package/dist/lib/browser/chunk-LZ5JMQR7.mjs.map +0 -7
  226. package/dist/lib/node-esm/chunk-JXUVAXX5.mjs.map +0 -7
  227. package/dist/types/src/packlets/identity/default-space-state-machine.d.ts +0 -19
  228. package/dist/types/src/packlets/identity/default-space-state-machine.d.ts.map +0 -1
  229. 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 DocHandle, type DocumentId, interpretAsDocumentId } from '@automerge/automerge-repo';
6
+ import { type AutomergeUrl, type DocumentId, interpretAsDocumentId } from '@automerge/automerge-repo';
7
7
 
8
8
  import { Event, synchronized, trackLeaks } from '@dxos/async';
9
- import { PropertiesType, TYPE_PROPERTIES } from '@dxos/client-protocol';
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, trace as Trace } from '@dxos/protocols';
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 { type Credential, type ProfileDocument, SpaceMember } from '@dxos/protocols/proto/dxos/halo/credentials';
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, setDeep } from '@dxos/util';
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 DataSpaceManagerParams = {
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
- runtimeParams?: DataSpaceManagerRuntimeParams;
117
+ runtimeProps?: DataSpaceManagerRuntimeProps;
120
118
  edgeFeatures?: Runtime.Client.EdgeFeatures;
121
119
  };
122
120
 
123
- export type DataSpaceManagerRuntimeParams = {
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 _runtimeParams?: DataSpaceManagerRuntimeParams = undefined;
159
+ private readonly _runtimeProps?: DataSpaceManagerRuntimeProps = undefined;
156
160
 
157
- constructor(params: DataSpaceManagerParams) {
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._runtimeParams = params.runtimeParams;
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.automergeRepo.find<Doc<DatabaseDirectory>>(rootUrl as AutomergeUrl, FIND_PARAMS)
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, TYPE_PROPERTIES);
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
- protected override async _open(): Promise<void> {
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
- this.updated.emit();
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
- log.trace('dxos.echo.data-space-manager.open', Trace.end({ id: this._instanceId }));
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
- async createSpace(options: CreateSpaceOptions = {}): Promise<DataSpace> {
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
- const newDoc = await this._echoHost.createDoc(data, { preserveHistory: true });
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>(Context.default(), newRootDocId);
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(this._keyring, this._signingContext, space.inner, root.url);
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
- async isDefaultSpace(space: DataSpace): Promise<boolean> {
324
- if (!space.databaseRoot) {
325
- return false;
326
- }
327
- switch (space.databaseRoot.getVersion()) {
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
- async acceptSpace(opts: AcceptSpaceOptions): Promise<DataSpace> {
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
- space.initializeDataPipelineAsync();
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(spaceKey: PublicKey, setting: EdgeReplicationSetting): Promise<void> {
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._runtimeParams?.spaceMemberPresenceAnnounceInterval ?? PRESENCE_ANNOUNCE_INTERVAL,
488
- offlineTimeout: this._runtimeParams?.spaceMemberPresenceOfflineTimeout ?? PRESENCE_OFFLINE_TIMEOUT,
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._runtimeParams?.activeEdgeNotarizationPollingInterval,
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
- await this._echoEdgeReplicator?.connectToSpace(dataSpace.id);
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,