@dxos/client-services 0.8.4-main.f9ba587 → 0.8.4-main.fcfe5033a5

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