@dxos/client-services 0.8.4-main.a4bbb77 → 0.8.4-main.abd8ff62ef

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-FZDVFED2.mjs → chunk-KW4WMU5R.mjs} +2698 -4599
  2. package/dist/lib/browser/chunk-KW4WMU5R.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-JDTIU3EP.mjs → chunk-NDMKP2CH.mjs} +2621 -4391
  25. package/dist/lib/node-esm/chunk-NDMKP2CH.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 +337 -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 +138 -56
  198. package/src/packlets/services/service-host.test.ts +8 -8
  199. package/src/packlets/services/service-host.ts +70 -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 +253 -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 -115
  210. package/src/packlets/spaces/data-space.ts +58 -33
  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-FZDVFED2.mjs.map +0 -7
  226. package/dist/lib/node-esm/chunk-JDTIU3EP.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,12 @@ 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
188
  await rootHandle?.whenReady();
185
189
  const rootDoc = rootHandle?.doc();
186
190
 
187
- const properties = rootDoc && findInlineObjectOfType(rootDoc, TYPE_PROPERTIES);
191
+ const properties = rootDoc && findInlineObjectOfType(rootDoc, Type.getTypename(SpaceProperties));
188
192
 
189
193
  return {
190
194
  key: space.key.toHex(),
@@ -212,30 +216,41 @@ export class DataSpaceManager extends Resource {
212
216
  }
213
217
 
214
218
  @synchronized
215
- protected override async _open(): Promise<void> {
219
+ @trace.span({ showInBrowserTimeline: true, op: 'lifecycle' })
220
+ protected override async _open(ctx: Context): Promise<void> {
216
221
  log('open');
217
- log.trace('dxos.echo.data-space-manager.open', Trace.begin({ id: this._instanceId }));
218
222
  log('metadata loaded', { spaces: this._metadataStore.spaces.length });
219
223
 
224
+ const spacesToActivate: DataSpace[] = [];
220
225
  await forEachAsync(this._metadataStore.spaces, async (spaceMetadata) => {
221
226
  try {
222
227
  log('load space', { spaceMetadata });
223
- await this._constructSpace(spaceMetadata);
228
+ const space = await this._constructSpace(ctx, spaceMetadata);
229
+ // Track spaces that were previously active for auto-activation (used in dedicated worker mode).
230
+ if (this._runtimeProps?.autoActivateSpaces && spaceMetadata.state === SpaceState.SPACE_ACTIVE) {
231
+ spacesToActivate.push(space);
232
+ }
224
233
  } catch (err) {
225
234
  log.error('Error loading space', { spaceMetadata, err });
226
235
  }
227
236
  });
228
237
 
229
- this.updated.emit();
238
+ // Auto-activate spaces that were previously active (used in dedicated worker mode after leader changeover).
239
+ for (const space of spacesToActivate) {
240
+ log('auto-activating space', { spaceKey: space.key });
241
+ space.activate(ctx).catch((err) => {
242
+ log.error('Error auto-activating space', { spaceKey: space.key, err });
243
+ });
244
+ }
230
245
 
231
- log.trace('dxos.echo.data-space-manager.open', Trace.end({ id: this._instanceId }));
246
+ this.updated.emit();
232
247
  }
233
248
 
234
249
  @synchronized
235
- protected override async _close(): Promise<void> {
250
+ protected override async _close(ctx: Context): Promise<void> {
236
251
  log('close');
237
252
  for (const space of this._spaces.values()) {
238
- await space.close();
253
+ await space.close(ctx);
239
254
  }
240
255
  this._spaces.clear();
241
256
  }
@@ -244,7 +259,8 @@ export class DataSpaceManager extends Resource {
244
259
  * Creates a new space writing the genesis credentials to the control feed.
245
260
  */
246
261
  @synchronized
247
- async createSpace(options: CreateSpaceOptions = {}): Promise<DataSpace> {
262
+ @trace.span({ showInBrowserTimeline: true, op: 'lifecycle' })
263
+ async createSpace(ctx: Context, options: CreateSpaceOptions = {}): Promise<DataSpace> {
248
264
  assertArgument(
249
265
  !!options.rootUrl === !!options.documents,
250
266
  'options',
@@ -252,6 +268,8 @@ export class DataSpaceManager extends Resource {
252
268
  );
253
269
 
254
270
  assertState(this._lifecycleState === LifecycleState.OPEN, 'Not open.');
271
+
272
+ const tags = options.tags ? Array.from(options.tags) : [];
255
273
  const spaceKey = await this._keyring.createKey();
256
274
  const controlFeedKey = await this._keyring.createKey();
257
275
  const dataFeedKey = await this._keyring.createKey();
@@ -264,6 +282,7 @@ export class DataSpaceManager extends Resource {
264
282
  controlFeedKey,
265
283
  dataFeedKey,
266
284
  state: SpaceState.SPACE_ACTIVE,
285
+ tags,
267
286
  };
268
287
 
269
288
  log('creating space...', { spaceId, spaceKey });
@@ -279,7 +298,18 @@ export class DataSpaceManager extends Resource {
279
298
  await Promise.all(
280
299
  Object.entries(options.documents).map(async ([documentId, data]) => {
281
300
  log('creating document...', { documentId });
282
- const newDoc = await this._echoHost.createDoc(data, { preserveHistory: true });
301
+ // TODO(dmaretskyi): Broken types -- the bytes get interpreted as CRDT data.
302
+ const newDoc = await this._echoHost.createDoc(data as any as DatabaseDirectory, {
303
+ preserveHistory: true,
304
+ });
305
+
306
+ // The archived documents might have the spaceKey from the space they were expored from, we need to update it to the new spaceKey.
307
+ if (newDoc.doc().access !== undefined && newDoc.doc().access!.spaceKey !== spaceKey.toHex()) {
308
+ newDoc.change((doc) => {
309
+ doc.access!.spaceKey = spaceKey.toHex();
310
+ });
311
+ }
312
+
283
313
  documentIdMapping[documentId as DocumentId] = newDoc.documentId;
284
314
  }),
285
315
  );
@@ -290,29 +320,37 @@ export class DataSpaceManager extends Resource {
290
320
  let root: DatabaseRoot;
291
321
  if (options.rootUrl) {
292
322
  const newRootDocId = documentIdMapping[interpretAsDocumentId(options.rootUrl)] ?? failedInvariant();
293
- const rootDocHandle = await this._echoHost.loadDoc<DatabaseDirectory>(Context.default(), newRootDocId);
323
+ const rootDocHandle = await this._echoHost.loadDoc<DatabaseDirectory>(ctx, newRootDocId);
294
324
  DatabaseRoot.mapLinks(rootDocHandle, documentIdMapping);
295
325
 
296
- root = await this._echoHost.openSpaceRoot(spaceId, `automerge:${newRootDocId}` as AutomergeUrl);
326
+ root = await this._echoHost.openSpaceRoot(ctx, spaceId, `automerge:${newRootDocId}` as AutomergeUrl);
297
327
  } else {
298
- root = await this._echoHost.createSpaceRoot(spaceKey);
328
+ root = await this._echoHost.createSpaceRoot(ctx, spaceKey);
299
329
  }
330
+ await this._echoHost.flush(ctx);
300
331
 
301
332
  log('constructing space...', { spaceKey });
302
333
 
303
- const space = await this._constructSpace(metadata);
304
- await space.open();
334
+ const space = await this._constructSpace(ctx, metadata);
335
+ await space.open(ctx);
305
336
 
306
337
  log('adding space...', { spaceKey });
307
338
 
308
- const credentials = await spaceGenesis(this._keyring, this._signingContext, space.inner, root.url);
339
+ const credentials = await spaceGenesis(
340
+ this._keyring,
341
+ this._signingContext,
342
+ space.inner,
343
+ root.url,
344
+ tags,
345
+ options.membershipPolicy,
346
+ );
309
347
  await this._metadataStore.addSpace(metadata);
310
348
 
311
349
  const memberCredential = credentials[1];
312
350
  invariant(getCredentialAssertion(memberCredential)['@type'] === 'dxos.halo.credentials.SpaceMember');
313
351
  await this._signingContext.recordCredential(memberCredential);
314
352
 
315
- await space.initializeDataPipeline();
353
+ await space.initializeDataPipeline(ctx);
316
354
 
317
355
  log('space ready.', { spaceId, spaceKey });
318
356
 
@@ -320,81 +358,36 @@ export class DataSpaceManager extends Resource {
320
358
  return space;
321
359
  }
322
360
 
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
-
361
+ /**
362
+ * Accepts an existing space by joining its swarm and initializing the data pipeline.
363
+ * @param ctx - Caller context for cancellation and tracing.
364
+ * @param opts - Space keys and optional timeframes for catch-up.
365
+ */
380
366
  // TODO(burdon): Rename join space.
381
367
  @synchronized
382
- async acceptSpace(opts: AcceptSpaceOptions): Promise<DataSpace> {
368
+ @trace.span({ showInBrowserTimeline: true, op: 'lifecycle' })
369
+ async acceptSpace(ctx: Context, opts: AcceptSpaceOptions): Promise<DataSpace> {
383
370
  log('accept space', { opts });
384
371
  invariant(this._lifecycleState === LifecycleState.OPEN, 'Not open.');
385
372
  invariant(!this._spaces.has(opts.spaceKey), 'Space already exists.');
386
373
 
374
+ const tags = opts.tags ? Array.from(opts.tags) : [];
387
375
  const metadata: SpaceMetadata = {
388
376
  key: opts.spaceKey,
389
377
  genesisFeedKey: opts.genesisFeedKey,
390
378
  controlTimeframe: opts.controlTimeframe,
391
379
  dataTimeframe: opts.dataTimeframe,
380
+ tags,
392
381
  };
393
382
 
394
- const space = await this._constructSpace(metadata);
395
- await space.open();
383
+ const space = await this._constructSpace(ctx, metadata);
384
+ await space.open(ctx);
396
385
  await this._metadataStore.addSpace(metadata);
397
- space.initializeDataPipelineAsync();
386
+ // Use DSM lifecycle ctx: the invitation accept flow disposes `ctx` as soon as
387
+ // `acceptSpace` returns (guardedState.complete -> ctx.dispose). Detached data-pipeline
388
+ // initialization must outlive the invitation flow, and its span must be parented to a
389
+ // long-lived context.
390
+ space.initializeDataPipelineAsync(this._ctx);
398
391
 
399
392
  this.updated.emit();
400
393
  return space;
@@ -418,6 +411,7 @@ export class DataSpaceManager extends Resource {
418
411
  space.spaceState.membershipChainHeads,
419
412
  options.profile,
420
413
  options.delegationCredentialId,
414
+ space.spaceState.tags,
421
415
  );
422
416
 
423
417
  // TODO(dmaretskyi): Refactor.
@@ -444,8 +438,8 @@ export class DataSpaceManager extends Resource {
444
438
  );
445
439
  }
446
440
 
447
- public async requestSpaceAdmissionCredential(spaceKey: PublicKey): Promise<Credential> {
448
- return this._spaceManager.requestSpaceAdmissionCredential({
441
+ public async requestSpaceAdmissionCredential(ctx: Context, spaceKey: PublicKey): Promise<Credential> {
442
+ return this._spaceManager.requestSpaceAdmissionCredential(ctx, {
449
443
  spaceKey,
450
444
  identityKey: this._signingContext.identityKey,
451
445
  timeout: 15_000,
@@ -458,7 +452,11 @@ export class DataSpaceManager extends Resource {
458
452
  });
459
453
  }
460
454
 
461
- async setSpaceEdgeReplicationSetting(spaceKey: PublicKey, setting: EdgeReplicationSetting): Promise<void> {
455
+ async setSpaceEdgeReplicationSetting(
456
+ ctx: Context,
457
+ spaceKey: PublicKey,
458
+ setting: EdgeReplicationSetting,
459
+ ): Promise<void> {
462
460
  const space = this._spaces.get(spaceKey);
463
461
  invariant(space, 'Space not found.');
464
462
 
@@ -470,7 +468,7 @@ export class DataSpaceManager extends Resource {
470
468
  await this._echoEdgeReplicator?.disconnectFromSpace(space.id);
471
469
  break;
472
470
  case EdgeReplicationSetting.ENABLED:
473
- await this._echoEdgeReplicator?.connectToSpace(space.id);
471
+ await this._echoEdgeReplicator?.connectToSpace(ctx, space.id);
474
472
  break;
475
473
  }
476
474
  }
@@ -478,14 +476,14 @@ export class DataSpaceManager extends Resource {
478
476
  space.stateUpdate.emit();
479
477
  }
480
478
 
481
- private async _constructSpace(metadata: SpaceMetadata): Promise<DataSpace> {
479
+ private async _constructSpace(ctx: Context, metadata: SpaceMetadata): Promise<DataSpace> {
482
480
  log('construct space', { metadata });
483
481
  const gossip = new Gossip({
484
482
  localPeerId: this._signingContext.deviceKey,
485
483
  });
486
484
  const presence = new Presence({
487
- announceInterval: this._runtimeParams?.spaceMemberPresenceAnnounceInterval ?? PRESENCE_ANNOUNCE_INTERVAL,
488
- offlineTimeout: this._runtimeParams?.spaceMemberPresenceOfflineTimeout ?? PRESENCE_OFFLINE_TIMEOUT,
485
+ announceInterval: this._runtimeProps?.spaceMemberPresenceAnnounceInterval ?? PRESENCE_ANNOUNCE_INTERVAL,
486
+ offlineTimeout: this._runtimeProps?.spaceMemberPresenceOfflineTimeout ?? PRESENCE_OFFLINE_TIMEOUT,
489
487
  identityKey: this._signingContext.identityKey,
490
488
  gossip,
491
489
  });
@@ -568,15 +566,17 @@ export class DataSpaceManager extends Resource {
568
566
  },
569
567
  },
570
568
  cache: metadata.cache,
569
+ tags: metadata.tags,
571
570
  edgeConnection: this._edgeConnection,
572
571
  edgeHttpClient: this._edgeHttpClient,
573
572
  edgeFeatures: this._edgeFeatures,
574
- activeEdgeNotarizationPollingInterval: this._runtimeParams?.activeEdgeNotarizationPollingInterval,
573
+ activeEdgeNotarizationPollingInterval: this._runtimeProps?.activeEdgeNotarizationPollingInterval,
575
574
  });
576
575
  dataSpace.postOpen.append(async () => {
577
576
  const setting = dataSpace.getEdgeReplicationSetting();
578
577
  if (!setting || setting === EdgeReplicationSetting.ENABLED) {
579
- await this._echoEdgeReplicator?.connectToSpace(dataSpace.id);
578
+ // Use lifecycle ctx: the caller ctx from _constructSpace may be disposed by the time postOpen fires.
579
+ await this._echoEdgeReplicator?.connectToSpace(this._ctx, dataSpace.id);
580
580
  } else if (this._echoEdgeReplicator) {
581
581
  log('not connecting EchoEdgeReplicator because of EdgeReplicationSetting', { spaceId: dataSpace.id });
582
582
  }
@@ -673,7 +673,7 @@ export class DataSpaceManager extends Resource {
673
673
  invitations: Array<[PublicKey, DelegateSpaceInvitation]>,
674
674
  ): Promise<void> {
675
675
  const tasks = invitations.map(([credentialId, invitation]) => {
676
- return this._invitationsManager.createInvitation({
676
+ return this._invitationsManager.createInvitation(this._ctx, {
677
677
  type: Invitation.Type.DELEGATED,
678
678
  kind: Invitation.Kind.SPACE,
679
679
  spaceKey: space.key,