@dxos/client-services 0.8.3 → 0.8.4-main.1c7ec43d41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. package/dist/lib/browser/{chunk-LBG3C332.mjs → chunk-J7D62ZDJ.mjs} +3826 -5125
  2. package/dist/lib/browser/chunk-J7D62ZDJ.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 +454 -148
  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 +40 -41
  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-SKGQLRKS.mjs → chunk-TLUZSZZD.mjs} +3226 -4393
  25. package/dist/lib/node-esm/chunk-TLUZSZZD.mjs.map +7 -0
  26. package/dist/lib/node-esm/index.mjs +454 -148
  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 +40 -41
  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/keys.d.ts.map +1 -1
  51. package/dist/types/src/packlets/devtools/metadata.d.ts.map +1 -1
  52. package/dist/types/src/packlets/devtools/network.d.ts +1 -1
  53. package/dist/types/src/packlets/devtools/network.d.ts.map +1 -1
  54. package/dist/types/src/packlets/devtools/spaces.d.ts.map +1 -1
  55. package/dist/types/src/packlets/diagnostics/browser-diagnostics-broadcast.d.ts +1 -1
  56. package/dist/types/src/packlets/diagnostics/browser-diagnostics-broadcast.d.ts.map +1 -1
  57. package/dist/types/src/packlets/diagnostics/diagnostics-broadcast.d.ts +1 -1
  58. package/dist/types/src/packlets/diagnostics/diagnostics-broadcast.d.ts.map +1 -1
  59. package/dist/types/src/packlets/diagnostics/diagnostics-collector.d.ts.map +1 -1
  60. package/dist/types/src/packlets/diagnostics/diagnostics.d.ts +3 -4
  61. package/dist/types/src/packlets/diagnostics/diagnostics.d.ts.map +1 -1
  62. package/dist/types/src/packlets/diagnostics/index.d.ts +1 -1
  63. package/dist/types/src/packlets/diagnostics/index.d.ts.map +1 -1
  64. package/dist/types/src/packlets/identity/authenticator.d.ts +2 -2
  65. package/dist/types/src/packlets/identity/authenticator.d.ts.map +1 -1
  66. package/dist/types/src/packlets/identity/contacts-service.d.ts +1 -1
  67. package/dist/types/src/packlets/identity/contacts-service.d.ts.map +1 -1
  68. package/dist/types/src/packlets/identity/identity-manager.d.ts +7 -7
  69. package/dist/types/src/packlets/identity/identity-manager.d.ts.map +1 -1
  70. package/dist/types/src/packlets/identity/identity-recovery-manager.d.ts +8 -7
  71. package/dist/types/src/packlets/identity/identity-recovery-manager.d.ts.map +1 -1
  72. package/dist/types/src/packlets/identity/identity-service.d.ts +6 -10
  73. package/dist/types/src/packlets/identity/identity-service.d.ts.map +1 -1
  74. package/dist/types/src/packlets/identity/identity.d.ts +9 -12
  75. package/dist/types/src/packlets/identity/identity.d.ts.map +1 -1
  76. package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts +6 -5
  77. package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts.map +1 -1
  78. package/dist/types/src/packlets/invitations/edge-invitation-handler.d.ts +2 -2
  79. package/dist/types/src/packlets/invitations/edge-invitation-handler.d.ts.map +1 -1
  80. package/dist/types/src/packlets/invitations/index.d.ts +1 -1
  81. package/dist/types/src/packlets/invitations/index.d.ts.map +1 -1
  82. package/dist/types/src/packlets/invitations/invitation-guest-extenstion.d.ts.map +1 -1
  83. package/dist/types/src/packlets/invitations/invitation-host-extension.d.ts.map +1 -1
  84. package/dist/types/src/packlets/invitations/invitation-protocol.d.ts +8 -5
  85. package/dist/types/src/packlets/invitations/invitation-protocol.d.ts.map +1 -1
  86. package/dist/types/src/packlets/invitations/invitation-state.d.ts.map +1 -1
  87. package/dist/types/src/packlets/invitations/invitation-topology.d.ts.map +1 -1
  88. package/dist/types/src/packlets/invitations/invitations-handler.d.ts +4 -4
  89. package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +1 -1
  90. package/dist/types/src/packlets/invitations/invitations-manager.d.ts +3 -3
  91. package/dist/types/src/packlets/invitations/invitations-manager.d.ts.map +1 -1
  92. package/dist/types/src/packlets/invitations/invitations-service.d.ts +4 -4
  93. package/dist/types/src/packlets/invitations/invitations-service.d.ts.map +1 -1
  94. package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts +5 -4
  95. package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts.map +1 -1
  96. package/dist/types/src/packlets/invitations/utils.d.ts.map +1 -1
  97. package/dist/types/src/packlets/locks/browser.d.ts.map +1 -1
  98. package/dist/types/src/packlets/locks/index.d.ts +2 -2
  99. package/dist/types/src/packlets/locks/index.d.ts.map +1 -1
  100. package/dist/types/src/packlets/locks/node.d.ts.map +1 -1
  101. package/dist/types/src/packlets/logging/logging-service.d.ts +5 -1
  102. package/dist/types/src/packlets/logging/logging-service.d.ts.map +1 -1
  103. package/dist/types/src/packlets/network/network-service.d.ts +7 -6
  104. package/dist/types/src/packlets/network/network-service.d.ts.map +1 -1
  105. package/dist/types/src/packlets/services/client-rpc-server.d.ts +5 -5
  106. package/dist/types/src/packlets/services/client-rpc-server.d.ts.map +1 -1
  107. package/dist/types/src/packlets/services/feed-syncer.d.ts +59 -0
  108. package/dist/types/src/packlets/services/feed-syncer.d.ts.map +1 -0
  109. package/dist/types/src/packlets/services/feed-syncer.test.d.ts +2 -0
  110. package/dist/types/src/packlets/services/feed-syncer.test.d.ts.map +1 -0
  111. package/dist/types/src/packlets/services/platform.d.ts.map +1 -1
  112. package/dist/types/src/packlets/services/service-context.d.ts +14 -10
  113. package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
  114. package/dist/types/src/packlets/services/service-host.d.ts +21 -8
  115. package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
  116. package/dist/types/src/packlets/services/service-registry.d.ts.map +1 -1
  117. package/dist/types/src/packlets/services/util.d.ts.map +1 -1
  118. package/dist/types/src/packlets/space-export/archive-format.d.ts +9 -0
  119. package/dist/types/src/packlets/space-export/archive-format.d.ts.map +1 -0
  120. package/dist/types/src/packlets/space-export/index.d.ts +4 -1
  121. package/dist/types/src/packlets/space-export/index.d.ts.map +1 -1
  122. package/dist/types/src/packlets/space-export/serialized-space-reader.d.ts +23 -0
  123. package/dist/types/src/packlets/space-export/serialized-space-reader.d.ts.map +1 -0
  124. package/dist/types/src/packlets/space-export/serialized-space-writer.d.ts +36 -0
  125. package/dist/types/src/packlets/space-export/serialized-space-writer.d.ts.map +1 -0
  126. package/dist/types/src/packlets/space-export/space-archive-reader.d.ts +9 -1
  127. package/dist/types/src/packlets/space-export/space-archive-reader.d.ts.map +1 -1
  128. package/dist/types/src/packlets/space-export/space-archive-writer.d.ts +8 -2
  129. package/dist/types/src/packlets/space-export/space-archive-writer.d.ts.map +1 -1
  130. package/dist/types/src/packlets/space-export/space-archive.test.d.ts +2 -0
  131. package/dist/types/src/packlets/space-export/space-archive.test.d.ts.map +1 -0
  132. package/dist/types/src/packlets/spaces/automerge-space-state.d.ts +1 -1
  133. package/dist/types/src/packlets/spaces/automerge-space-state.d.ts.map +1 -1
  134. package/dist/types/src/packlets/spaces/data-space-manager.d.ts +29 -18
  135. package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
  136. package/dist/types/src/packlets/spaces/data-space.d.ts +30 -13
  137. package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
  138. package/dist/types/src/packlets/spaces/edge-feed-replicator.d.ts +2 -2
  139. package/dist/types/src/packlets/spaces/edge-feed-replicator.d.ts.map +1 -1
  140. package/dist/types/src/packlets/spaces/epoch-migrations.d.ts.map +1 -1
  141. package/dist/types/src/packlets/spaces/genesis.d.ts +2 -1
  142. package/dist/types/src/packlets/spaces/genesis.d.ts.map +1 -1
  143. package/dist/types/src/packlets/spaces/notarization-plugin.d.ts +6 -9
  144. package/dist/types/src/packlets/spaces/notarization-plugin.d.ts.map +1 -1
  145. package/dist/types/src/packlets/spaces/spaces-service.d.ts +11 -8
  146. package/dist/types/src/packlets/spaces/spaces-service.d.ts.map +1 -1
  147. package/dist/types/src/packlets/storage/level.d.ts.map +1 -1
  148. package/dist/types/src/packlets/storage/profile-archive.d.ts.map +1 -1
  149. package/dist/types/src/packlets/storage/storage.d.ts.map +1 -1
  150. package/dist/types/src/packlets/storage/util.d.ts.map +1 -1
  151. package/dist/types/src/packlets/system/system-service.d.ts +2 -2
  152. package/dist/types/src/packlets/system/system-service.d.ts.map +1 -1
  153. package/dist/types/src/packlets/testing/credential-utils.d.ts.map +1 -1
  154. package/dist/types/src/packlets/testing/invitation-utils.d.ts +6 -3
  155. package/dist/types/src/packlets/testing/invitation-utils.d.ts.map +1 -1
  156. package/dist/types/src/packlets/testing/test-builder.d.ts +8 -7
  157. package/dist/types/src/packlets/testing/test-builder.d.ts.map +1 -1
  158. package/dist/types/src/packlets/worker/worker-runtime.d.ts +41 -4
  159. package/dist/types/src/packlets/worker/worker-runtime.d.ts.map +1 -1
  160. package/dist/types/src/packlets/worker/worker-session.d.ts +2 -4
  161. package/dist/types/src/packlets/worker/worker-session.d.ts.map +1 -1
  162. package/dist/types/src/testing/setup.d.ts.map +1 -1
  163. package/dist/types/src/version.d.ts +1 -1
  164. package/dist/types/src/version.d.ts.map +1 -1
  165. package/dist/types/tsconfig.tsbuildinfo +1 -1
  166. package/package.json +72 -55
  167. package/src/index.ts +1 -0
  168. package/src/packlets/agents/edge-agent-manager.ts +10 -7
  169. package/src/packlets/agents/edge-agent-service.ts +17 -5
  170. package/src/packlets/devices/devices-service.test.ts +3 -3
  171. package/src/packlets/devices/devices-service.ts +2 -2
  172. package/src/packlets/devtools/devtools.ts +29 -29
  173. package/src/packlets/devtools/feeds.ts +2 -2
  174. package/src/packlets/devtools/network.ts +1 -1
  175. package/src/packlets/diagnostics/browser-diagnostics-broadcast.ts +1 -1
  176. package/src/packlets/diagnostics/diagnostics-broadcast.ts +1 -1
  177. package/src/packlets/diagnostics/diagnostics-collector.ts +1 -1
  178. package/src/packlets/diagnostics/diagnostics.ts +2 -3
  179. package/src/packlets/diagnostics/index.ts +1 -1
  180. package/src/packlets/identity/authenticator.node.test.ts +1 -1
  181. package/src/packlets/identity/authenticator.ts +3 -3
  182. package/src/packlets/identity/contacts-service.ts +2 -2
  183. package/src/packlets/identity/identity-manager.test.ts +8 -8
  184. package/src/packlets/identity/identity-manager.ts +25 -24
  185. package/src/packlets/identity/identity-recovery-manager.ts +22 -18
  186. package/src/packlets/identity/identity-service.test.ts +8 -28
  187. package/src/packlets/identity/identity-service.ts +13 -80
  188. package/src/packlets/identity/identity.test.ts +11 -11
  189. package/src/packlets/identity/identity.ts +17 -39
  190. package/src/packlets/invitations/device-invitation-protocol.test.ts +4 -4
  191. package/src/packlets/invitations/device-invitation-protocol.ts +8 -6
  192. package/src/packlets/invitations/edge-invitation-handler.ts +10 -6
  193. package/src/packlets/invitations/index.ts +1 -1
  194. package/src/packlets/invitations/invitation-guest-extenstion.ts +7 -5
  195. package/src/packlets/invitations/invitation-host-extension.ts +15 -16
  196. package/src/packlets/invitations/invitation-protocol.ts +8 -5
  197. package/src/packlets/invitations/invitation-state.ts +1 -15
  198. package/src/packlets/invitations/invitations-handler.test.ts +301 -292
  199. package/src/packlets/invitations/invitations-handler.ts +77 -25
  200. package/src/packlets/invitations/invitations-manager.ts +43 -18
  201. package/src/packlets/invitations/invitations-service.ts +10 -10
  202. package/src/packlets/invitations/space-invitation-protocol.test.ts +26 -25
  203. package/src/packlets/invitations/space-invitation-protocol.ts +13 -17
  204. package/src/packlets/invitations/utils.ts +1 -1
  205. package/src/packlets/locks/browser.ts +1 -1
  206. package/src/packlets/locks/index.ts +2 -2
  207. package/src/packlets/logging/logging-service.ts +22 -17
  208. package/src/packlets/logging/logging.test.ts +1 -1
  209. package/src/packlets/network/network-service.test.ts +3 -3
  210. package/src/packlets/network/network-service.ts +12 -10
  211. package/src/packlets/services/client-rpc-server.ts +20 -17
  212. package/src/packlets/services/feed-syncer.test.ts +340 -0
  213. package/src/packlets/services/feed-syncer.ts +377 -0
  214. package/src/packlets/services/platform.ts +7 -1
  215. package/src/packlets/services/service-context.test.ts +4 -3
  216. package/src/packlets/services/service-context.ts +148 -64
  217. package/src/packlets/services/service-host.test.ts +10 -9
  218. package/src/packlets/services/service-host.ts +88 -49
  219. package/src/packlets/services/service-registry.test.ts +1 -1
  220. package/src/packlets/space-export/archive-format.ts +42 -0
  221. package/src/packlets/space-export/index.ts +4 -1
  222. package/src/packlets/space-export/serialized-space-reader.ts +111 -0
  223. package/src/packlets/space-export/serialized-space-writer.ts +252 -0
  224. package/src/packlets/space-export/space-archive-reader.ts +65 -4
  225. package/src/packlets/space-export/space-archive-writer.ts +44 -6
  226. package/src/packlets/space-export/space-archive.test.ts +461 -0
  227. package/src/packlets/space-export/tar.test.ts +1 -1
  228. package/src/packlets/spaces/automerge-space-state.ts +1 -1
  229. package/src/packlets/spaces/data-space-manager.test.ts +79 -13
  230. package/src/packlets/spaces/data-space-manager.ts +129 -125
  231. package/src/packlets/spaces/data-space.ts +65 -40
  232. package/src/packlets/spaces/edge-feed-replicator.test.ts +4 -4
  233. package/src/packlets/spaces/edge-feed-replicator.ts +13 -11
  234. package/src/packlets/spaces/epoch-migrations.ts +5 -5
  235. package/src/packlets/spaces/genesis.ts +6 -1
  236. package/src/packlets/spaces/notarization-plugin.test.ts +3 -3
  237. package/src/packlets/spaces/notarization-plugin.ts +13 -12
  238. package/src/packlets/spaces/spaces-service.test.ts +20 -12
  239. package/src/packlets/spaces/spaces-service.ts +138 -38
  240. package/src/packlets/storage/profile-archive.ts +1 -1
  241. package/src/packlets/storage/storage.ts +7 -8
  242. package/src/packlets/system/system-service.test.ts +1 -1
  243. package/src/packlets/system/system-service.ts +4 -4
  244. package/src/packlets/testing/invitation-utils.ts +11 -7
  245. package/src/packlets/testing/test-builder.ts +39 -13
  246. package/src/packlets/worker/worker-runtime.ts +189 -17
  247. package/src/packlets/worker/worker-session.ts +15 -21
  248. package/src/version.ts +1 -5
  249. package/README.yml +0 -5
  250. package/dist/lib/browser/chunk-LBG3C332.mjs.map +0 -7
  251. package/dist/lib/node/chunk-LMGLGOUU.cjs +0 -9311
  252. package/dist/lib/node/chunk-LMGLGOUU.cjs.map +0 -7
  253. package/dist/lib/node/index.cjs +0 -437
  254. package/dist/lib/node/index.cjs.map +0 -7
  255. package/dist/lib/node/meta.json +0 -1
  256. package/dist/lib/node/testing/index.cjs +0 -452
  257. package/dist/lib/node/testing/index.cjs.map +0 -7
  258. package/dist/lib/node-esm/chunk-SKGQLRKS.mjs.map +0 -7
  259. package/dist/types/src/packlets/identity/default-space-state-machine.d.ts +0 -19
  260. package/dist/types/src/packlets/identity/default-space-state-machine.d.ts.map +0 -1
  261. package/src/packlets/identity/default-space-state-machine.ts +0 -44
@@ -3,72 +3,67 @@
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 { 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';
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
- 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,30 +114,36 @@ 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
 
138
145
  private readonly _spaces = new ComplexMap<PublicKey, DataSpace>(PublicKey.hash);
139
146
 
140
- private readonly _instanceId = PublicKey.random().toHex();
141
-
142
147
  private readonly _spaceManager: SpaceManager;
143
148
  private readonly _metadataStore: MetadataStore;
144
149
  private readonly _keyring: Keyring;
@@ -151,9 +156,9 @@ export class DataSpaceManager extends Resource {
151
156
  private readonly _edgeFeatures?: Runtime.Client.EdgeFeatures = undefined;
152
157
  private readonly _meshReplicator?: MeshEchoReplicator = undefined;
153
158
  private readonly _echoEdgeReplicator?: EchoEdgeReplicator = undefined;
154
- private readonly _runtimeParams?: DataSpaceManagerRuntimeParams = undefined;
159
+ private readonly _runtimeProps?: DataSpaceManagerRuntimeProps = undefined;
155
160
 
156
- constructor(params: DataSpaceManagerParams) {
161
+ constructor(params: DataSpaceManagerProps) {
157
162
  super();
158
163
 
159
164
  this._spaceManager = params.spaceManager;
@@ -168,7 +173,7 @@ export class DataSpaceManager extends Resource {
168
173
  this._edgeFeatures = params.edgeFeatures;
169
174
  this._echoEdgeReplicator = params.echoEdgeReplicator;
170
175
  this._edgeHttpClient = params.edgeHttpClient;
171
- this._runtimeParams = params.runtimeParams;
176
+ this._runtimeProps = params.runtimeProps;
172
177
 
173
178
  trace.diagnostic({
174
179
  id: 'spaces',
@@ -178,12 +183,11 @@ export class DataSpaceManager extends Resource {
178
183
  Array.from(this._spaces.values()).map(async (space) => {
179
184
  const rootUrl = space.automergeSpaceState.rootUrl;
180
185
  const rootHandle = rootUrl
181
- ? await this._echoHost.automergeRepo.find<Doc<DatabaseDirectory>>(rootUrl as AutomergeUrl, FIND_PARAMS)
186
+ ? await this._echoHost.loadDoc<Doc<DatabaseDirectory>>(this._ctx, rootUrl as AutomergeUrl)
182
187
  : undefined;
183
- await rootHandle?.whenReady();
184
188
  const rootDoc = rootHandle?.doc();
185
189
 
186
- const properties = rootDoc && findInlineObjectOfType(rootDoc, TYPE_PROPERTIES);
190
+ const properties = rootDoc && findInlineObjectOfType(rootDoc, Type.getTypename(SpaceProperties));
187
191
 
188
192
  return {
189
193
  key: space.key.toHex(),
@@ -211,30 +215,41 @@ export class DataSpaceManager extends Resource {
211
215
  }
212
216
 
213
217
  @synchronized
214
- protected override async _open(): Promise<void> {
218
+ @trace.span({ showInBrowserTimeline: true, op: 'lifecycle' })
219
+ protected override async _open(ctx: Context): Promise<void> {
215
220
  log('open');
216
- log.trace('dxos.echo.data-space-manager.open', Trace.begin({ id: this._instanceId }));
217
221
  log('metadata loaded', { spaces: this._metadataStore.spaces.length });
218
222
 
223
+ const spacesToActivate: DataSpace[] = [];
219
224
  await forEachAsync(this._metadataStore.spaces, async (spaceMetadata) => {
220
225
  try {
221
226
  log('load space', { spaceMetadata });
222
- 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
+ }
223
232
  } catch (err) {
224
233
  log.error('Error loading space', { spaceMetadata, err });
225
234
  }
226
235
  });
227
236
 
228
- 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
+ }
229
244
 
230
- log.trace('dxos.echo.data-space-manager.open', Trace.end({ id: this._instanceId }));
245
+ this.updated.emit();
231
246
  }
232
247
 
233
248
  @synchronized
234
- protected override async _close(): Promise<void> {
249
+ protected override async _close(ctx: Context): Promise<void> {
235
250
  log('close');
236
251
  for (const space of this._spaces.values()) {
237
- await space.close();
252
+ await space.close(ctx);
238
253
  }
239
254
  this._spaces.clear();
240
255
  }
@@ -243,10 +258,17 @@ export class DataSpaceManager extends Resource {
243
258
  * Creates a new space writing the genesis credentials to the control feed.
244
259
  */
245
260
  @synchronized
246
- async createSpace(options: CreateSpaceOptions = {}): Promise<DataSpace> {
247
- assertArgument(!!options.rootUrl === !!options.documents, 'root url must be required when providing documents');
261
+ @trace.span({ showInBrowserTimeline: true, op: 'lifecycle' })
262
+ async createSpace(ctx: Context, options: CreateSpaceOptions = {}): Promise<DataSpace> {
263
+ assertArgument(
264
+ !!options.rootUrl === !!options.documents,
265
+ 'options',
266
+ 'root url must be required when providing documents',
267
+ );
248
268
 
249
269
  assertState(this._lifecycleState === LifecycleState.OPEN, 'Not open.');
270
+
271
+ const tags = options.tags ? Array.from(options.tags) : [];
250
272
  const spaceKey = await this._keyring.createKey();
251
273
  const controlFeedKey = await this._keyring.createKey();
252
274
  const dataFeedKey = await this._keyring.createKey();
@@ -259,6 +281,7 @@ export class DataSpaceManager extends Resource {
259
281
  controlFeedKey,
260
282
  dataFeedKey,
261
283
  state: SpaceState.SPACE_ACTIVE,
284
+ tags,
262
285
  };
263
286
 
264
287
  log('creating space...', { spaceId, spaceKey });
@@ -274,7 +297,18 @@ export class DataSpaceManager extends Resource {
274
297
  await Promise.all(
275
298
  Object.entries(options.documents).map(async ([documentId, data]) => {
276
299
  log('creating document...', { documentId });
277
- 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
+
278
312
  documentIdMapping[documentId as DocumentId] = newDoc.documentId;
279
313
  }),
280
314
  );
@@ -285,29 +319,37 @@ export class DataSpaceManager extends Resource {
285
319
  let root: DatabaseRoot;
286
320
  if (options.rootUrl) {
287
321
  const newRootDocId = documentIdMapping[interpretAsDocumentId(options.rootUrl)] ?? failedInvariant();
288
- const rootDocHandle = await this._echoHost.loadDoc<DatabaseDirectory>(Context.default(), newRootDocId);
322
+ const rootDocHandle = await this._echoHost.loadDoc<DatabaseDirectory>(ctx, newRootDocId);
289
323
  DatabaseRoot.mapLinks(rootDocHandle, documentIdMapping);
290
324
 
291
- root = await this._echoHost.openSpaceRoot(spaceId, `automerge:${newRootDocId}` as AutomergeUrl);
325
+ root = await this._echoHost.openSpaceRoot(ctx, spaceId, `automerge:${newRootDocId}` as AutomergeUrl);
292
326
  } else {
293
- root = await this._echoHost.createSpaceRoot(spaceKey);
327
+ root = await this._echoHost.createSpaceRoot(ctx, spaceKey);
294
328
  }
329
+ await this._echoHost.flush(ctx);
295
330
 
296
331
  log('constructing space...', { spaceKey });
297
332
 
298
- const space = await this._constructSpace(metadata);
299
- await space.open();
333
+ const space = await this._constructSpace(ctx, metadata);
334
+ await space.open(ctx);
300
335
 
301
336
  log('adding space...', { spaceKey });
302
337
 
303
- 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
+ );
304
346
  await this._metadataStore.addSpace(metadata);
305
347
 
306
348
  const memberCredential = credentials[1];
307
349
  invariant(getCredentialAssertion(memberCredential)['@type'] === 'dxos.halo.credentials.SpaceMember');
308
350
  await this._signingContext.recordCredential(memberCredential);
309
351
 
310
- await space.initializeDataPipeline();
352
+ await space.initializeDataPipeline(ctx);
311
353
 
312
354
  log('space ready.', { spaceId, spaceKey });
313
355
 
@@ -315,81 +357,36 @@ export class DataSpaceManager extends Resource {
315
357
  return space;
316
358
  }
317
359
 
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
-
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
+ */
375
365
  // TODO(burdon): Rename join space.
376
366
  @synchronized
377
- async acceptSpace(opts: AcceptSpaceOptions): Promise<DataSpace> {
367
+ @trace.span({ showInBrowserTimeline: true, op: 'lifecycle' })
368
+ async acceptSpace(ctx: Context, opts: AcceptSpaceOptions): Promise<DataSpace> {
378
369
  log('accept space', { opts });
379
370
  invariant(this._lifecycleState === LifecycleState.OPEN, 'Not open.');
380
371
  invariant(!this._spaces.has(opts.spaceKey), 'Space already exists.');
381
372
 
373
+ const tags = opts.tags ? Array.from(opts.tags) : [];
382
374
  const metadata: SpaceMetadata = {
383
375
  key: opts.spaceKey,
384
376
  genesisFeedKey: opts.genesisFeedKey,
385
377
  controlTimeframe: opts.controlTimeframe,
386
378
  dataTimeframe: opts.dataTimeframe,
379
+ tags,
387
380
  };
388
381
 
389
- const space = await this._constructSpace(metadata);
390
- await space.open();
382
+ const space = await this._constructSpace(ctx, metadata);
383
+ await space.open(ctx);
391
384
  await this._metadataStore.addSpace(metadata);
392
- 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);
393
390
 
394
391
  this.updated.emit();
395
392
  return space;
@@ -413,6 +410,7 @@ export class DataSpaceManager extends Resource {
413
410
  space.spaceState.membershipChainHeads,
414
411
  options.profile,
415
412
  options.delegationCredentialId,
413
+ space.spaceState.tags,
416
414
  );
417
415
 
418
416
  // TODO(dmaretskyi): Refactor.
@@ -439,8 +437,8 @@ export class DataSpaceManager extends Resource {
439
437
  );
440
438
  }
441
439
 
442
- public async requestSpaceAdmissionCredential(spaceKey: PublicKey): Promise<Credential> {
443
- return this._spaceManager.requestSpaceAdmissionCredential({
440
+ public async requestSpaceAdmissionCredential(ctx: Context, spaceKey: PublicKey): Promise<Credential> {
441
+ return this._spaceManager.requestSpaceAdmissionCredential(ctx, {
444
442
  spaceKey,
445
443
  identityKey: this._signingContext.identityKey,
446
444
  timeout: 15_000,
@@ -453,7 +451,11 @@ export class DataSpaceManager extends Resource {
453
451
  });
454
452
  }
455
453
 
456
- async setSpaceEdgeReplicationSetting(spaceKey: PublicKey, setting: EdgeReplicationSetting): Promise<void> {
454
+ async setSpaceEdgeReplicationSetting(
455
+ ctx: Context,
456
+ spaceKey: PublicKey,
457
+ setting: EdgeReplicationSetting,
458
+ ): Promise<void> {
457
459
  const space = this._spaces.get(spaceKey);
458
460
  invariant(space, 'Space not found.');
459
461
 
@@ -465,7 +467,7 @@ export class DataSpaceManager extends Resource {
465
467
  await this._echoEdgeReplicator?.disconnectFromSpace(space.id);
466
468
  break;
467
469
  case EdgeReplicationSetting.ENABLED:
468
- await this._echoEdgeReplicator?.connectToSpace(space.id);
470
+ await this._echoEdgeReplicator?.connectToSpace(ctx, space.id);
469
471
  break;
470
472
  }
471
473
  }
@@ -473,14 +475,14 @@ export class DataSpaceManager extends Resource {
473
475
  space.stateUpdate.emit();
474
476
  }
475
477
 
476
- private async _constructSpace(metadata: SpaceMetadata): Promise<DataSpace> {
478
+ private async _constructSpace(ctx: Context, metadata: SpaceMetadata): Promise<DataSpace> {
477
479
  log('construct space', { metadata });
478
480
  const gossip = new Gossip({
479
481
  localPeerId: this._signingContext.deviceKey,
480
482
  });
481
483
  const presence = new Presence({
482
- announceInterval: this._runtimeParams?.spaceMemberPresenceAnnounceInterval ?? PRESENCE_ANNOUNCE_INTERVAL,
483
- offlineTimeout: this._runtimeParams?.spaceMemberPresenceOfflineTimeout ?? PRESENCE_OFFLINE_TIMEOUT,
484
+ announceInterval: this._runtimeProps?.spaceMemberPresenceAnnounceInterval ?? PRESENCE_ANNOUNCE_INTERVAL,
485
+ offlineTimeout: this._runtimeProps?.spaceMemberPresenceOfflineTimeout ?? PRESENCE_OFFLINE_TIMEOUT,
484
486
  identityKey: this._signingContext.identityKey,
485
487
  gossip,
486
488
  });
@@ -563,15 +565,17 @@ export class DataSpaceManager extends Resource {
563
565
  },
564
566
  },
565
567
  cache: metadata.cache,
568
+ tags: metadata.tags,
566
569
  edgeConnection: this._edgeConnection,
567
570
  edgeHttpClient: this._edgeHttpClient,
568
571
  edgeFeatures: this._edgeFeatures,
569
- activeEdgeNotarizationPollingInterval: this._runtimeParams?.activeEdgeNotarizationPollingInterval,
572
+ activeEdgeNotarizationPollingInterval: this._runtimeProps?.activeEdgeNotarizationPollingInterval,
570
573
  });
571
574
  dataSpace.postOpen.append(async () => {
572
575
  const setting = dataSpace.getEdgeReplicationSetting();
573
576
  if (!setting || setting === EdgeReplicationSetting.ENABLED) {
574
- 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);
575
579
  } else if (this._echoEdgeReplicator) {
576
580
  log('not connecting EchoEdgeReplicator because of EdgeReplicationSetting', { spaceId: dataSpace.id });
577
581
  }
@@ -668,7 +672,7 @@ export class DataSpaceManager extends Resource {
668
672
  invitations: Array<[PublicKey, DelegateSpaceInvitation]>,
669
673
  ): Promise<void> {
670
674
  const tasks = invitations.map(([credentialId, invitation]) => {
671
- return this._invitationsManager.createInvitation({
675
+ return this._invitationsManager.createInvitation(this._ctx, {
672
676
  type: Invitation.Type.DELEGATED,
673
677
  kind: Invitation.Kind.SPACE,
674
678
  spaceKey: space.key,