@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
@@ -4,6 +4,7 @@
4
4
 
5
5
  import { describe, test } from 'vitest';
6
6
 
7
+ import { Context } from '@dxos/context';
7
8
  import { MemorySignalManager, MemorySignalManagerContext } from '@dxos/messaging';
8
9
  import { Invitation } from '@dxos/protocols/proto/dxos/client/services';
9
10
  import { openAndClose } from '@dxos/test-utils';
@@ -19,7 +20,7 @@ describe('services/ServiceContext', () => {
19
20
  const device2 = await createOpenServiceContext(networkContext);
20
21
  await Promise.all(performInvitation({ host: device1, guest: device2, options: { kind: Invitation.Kind.DEVICE } }));
21
22
 
22
- const space1 = await device1.dataSpaceManager!.createSpace();
23
+ const space1 = await device1.dataSpaceManager!.createSpace(new Context());
23
24
  await device2.dataSpaceManager!.waitUntilSpaceReady(space1!.key);
24
25
  const space2 = await device2.dataSpaceManager!.spaces.get(space1.key);
25
26
  await space2!.inner.controlPipeline.state.waitUntilTimeframe(space1.inner.controlPipeline.state.timeframe);
@@ -35,7 +36,7 @@ describe('services/ServiceContext', () => {
35
36
 
36
37
  const identity2 = await createOpenServiceContext(networkContext);
37
38
  await identity2.createIdentity();
38
- const space1 = await identity2.dataSpaceManager!.createSpace();
39
+ const space1 = await identity2.dataSpaceManager!.createSpace(new Context());
39
40
  await Promise.all(
40
41
  performInvitation({
41
42
  host: identity2,
@@ -2,6 +2,8 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
+ import type * as SqlClient from '@effect/sql/SqlClient';
6
+
5
7
  import { Mutex, Trigger } from '@dxos/async';
6
8
  import { Context, Resource } from '@dxos/context';
7
9
  import { type CredentialProcessor, getCredentialAssertion } from '@dxos/credentials';
@@ -16,20 +18,23 @@ import {
16
18
  } from '@dxos/echo-pipeline';
17
19
  import { createChainEdgeIdentity, createEphemeralEdgeIdentity } from '@dxos/edge-client';
18
20
  import type { EdgeConnection, EdgeHttpClient, EdgeIdentity } from '@dxos/edge-client';
21
+ import { type RuntimeProvider } from '@dxos/effect';
19
22
  import { FeedFactory, FeedStore } from '@dxos/feed-store';
20
23
  import { invariant } from '@dxos/invariant';
21
24
  import { Keyring } from '@dxos/keyring';
22
- import { PublicKey } from '@dxos/keys';
25
+ import { type SpaceId } from '@dxos/keys';
23
26
  import { type LevelDB } from '@dxos/kv-store';
24
27
  import { log } from '@dxos/log';
25
28
  import { type SignalManager } from '@dxos/messaging';
26
29
  import { type SwarmNetworkManager } from '@dxos/network-manager';
27
- import { InvalidStorageVersionError, STORAGE_VERSION, trace } from '@dxos/protocols';
30
+ import { InvalidStorageVersionError, STORAGE_VERSION } from '@dxos/protocols';
31
+ import { FeedProtocol } from '@dxos/protocols';
28
32
  import { Invitation } from '@dxos/protocols/proto/dxos/client/services';
29
33
  import { type Runtime } from '@dxos/protocols/proto/dxos/config';
30
34
  import type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';
31
35
  import { type Credential, type ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';
32
36
  import { type Storage } from '@dxos/random-access-storage';
37
+ import type * as SqlTransaction from '@dxos/sql-sqlite/SqlTransaction';
33
38
  import { BlobStore } from '@dxos/teleport-extension-object-sync';
34
39
  import { trace as Trace } from '@dxos/tracing';
35
40
  import { safeInstanceof } from '@dxos/util';
@@ -37,27 +42,29 @@ import { safeInstanceof } from '@dxos/util';
37
42
  import { EdgeAgentManager } from '../agents';
38
43
  import {
39
44
  type CreateIdentityOptions,
45
+ type Identity,
40
46
  IdentityManager,
41
- type IdentityManagerParams,
42
- type JoinIdentityParams,
47
+ type IdentityManagerProps,
48
+ type JoinIdentityProps,
43
49
  } from '../identity';
44
50
  import { EdgeIdentityRecoveryManager } from '../identity/identity-recovery-manager';
45
51
  import {
46
52
  DeviceInvitationProtocol,
47
- type InvitationConnectionParams,
53
+ type InvitationConnectionProps,
48
54
  type InvitationProtocol,
49
55
  InvitationsHandler,
50
56
  InvitationsManager,
51
57
  SpaceInvitationProtocol,
52
58
  } from '../invitations';
53
- import { DataSpaceManager, type DataSpaceManagerRuntimeParams, type SigningContext } from '../spaces';
59
+ import { DataSpaceManager, type DataSpaceManagerRuntimeProps, type SigningContext } from '../spaces';
60
+ import { FeedSyncer } from './feed-syncer';
54
61
 
55
- export type ServiceContextRuntimeParams = Pick<
56
- IdentityManagerParams,
62
+ export type ServiceContextRuntimeProps = Pick<
63
+ IdentityManagerProps,
57
64
  'devicePresenceOfflineTimeout' | 'devicePresenceAnnounceInterval'
58
65
  > &
59
- DataSpaceManagerRuntimeParams & {
60
- invitationConnectionDefaultParams?: InvitationConnectionParams;
66
+ DataSpaceManagerRuntimeProps & {
67
+ invitationConnectionDefaultProps?: InvitationConnectionProps;
61
68
  disableP2pReplication?: boolean;
62
69
  enableVectorIndexing?: boolean;
63
70
  };
@@ -67,7 +74,7 @@ export type ServiceContextRuntimeParams = Pick<
67
74
  // TODO(burdon): Rename/break-up into smaller components. And/or make members private.
68
75
  // TODO(dmaretskyi): Gets duplicated in CJS build between normal and testing bundles.
69
76
  @safeInstanceof('dxos.client-services.ServiceContext')
70
- @Trace.resource()
77
+ @Trace.resource({ lifecycle: true })
71
78
  export class ServiceContext extends Resource {
72
79
  private readonly _edgeIdentityUpdateMutex = new Mutex();
73
80
 
@@ -84,6 +91,7 @@ export class ServiceContext extends Resource {
84
91
  public readonly echoHost: EchoHost;
85
92
  private readonly _meshReplicator?: MeshEchoReplicator = undefined;
86
93
  private readonly _echoEdgeReplicator?: EchoEdgeReplicator = undefined;
94
+ private readonly _feedSyncer?: FeedSyncer = undefined;
87
95
 
88
96
  // Initialized after identity is initialized.
89
97
  public dataSpaceManager?: DataSpaceManager;
@@ -96,8 +104,6 @@ export class ServiceContext extends Resource {
96
104
 
97
105
  private _deviceSpaceSync?: CredentialProcessor;
98
106
 
99
- private readonly _instanceId = PublicKey.random().toHex();
100
-
101
107
  constructor(
102
108
  public readonly storage: Storage,
103
109
  public readonly level: LevelDB,
@@ -105,11 +111,15 @@ export class ServiceContext extends Resource {
105
111
  public readonly signalManager: SignalManager,
106
112
  private readonly _edgeConnection: EdgeConnection | undefined,
107
113
  private readonly _edgeHttpClient: EdgeHttpClient | undefined,
108
- public readonly _runtimeParams?: ServiceContextRuntimeParams,
114
+ private readonly _runtime: RuntimeProvider.RuntimeProvider<SqlClient.SqlClient | SqlTransaction.SqlTransaction>,
115
+ public readonly _runtimeProps?: ServiceContextRuntimeProps,
109
116
  private readonly _edgeFeatures?: Runtime.Client.EdgeFeatures,
110
117
  ) {
111
118
  super();
112
119
 
120
+ log('runtimeProps', this._runtimeProps);
121
+ log('edgeFeatures', this._edgeFeatures);
122
+
113
123
  // TODO(burdon): Move strings to constants.
114
124
  this.metadataStore = new MetadataStore(storage.createDirectory('metadata'));
115
125
  this.blobStore = new BlobStore(storage.createDirectory('blobs'));
@@ -131,7 +141,7 @@ export class ServiceContext extends Resource {
131
141
  networkManager: this.networkManager,
132
142
  blobStore: this.blobStore,
133
143
  metadataStore: this.metadataStore,
134
- disableP2pReplication: this._runtimeParams?.disableP2pReplication,
144
+ disableP2pReplication: this._runtimeProps?.disableP2pReplication,
135
145
  });
136
146
 
137
147
  this.identityManager = new IdentityManager({
@@ -139,8 +149,8 @@ export class ServiceContext extends Resource {
139
149
  keyring: this.keyring,
140
150
  feedStore: this.feedStore,
141
151
  spaceManager: this.spaceManager,
142
- devicePresenceOfflineTimeout: this._runtimeParams?.devicePresenceOfflineTimeout,
143
- devicePresenceAnnounceInterval: this._runtimeParams?.devicePresenceAnnounceInterval,
152
+ devicePresenceOfflineTimeout: this._runtimeProps?.devicePresenceOfflineTimeout,
153
+ devicePresenceAnnounceInterval: this._runtimeProps?.devicePresenceAnnounceInterval,
144
154
  edgeConnection: this._edgeConnection,
145
155
  edgeFeatures: this._edgeFeatures,
146
156
  });
@@ -156,17 +166,21 @@ export class ServiceContext extends Resource {
156
166
  kv: this.level,
157
167
  peerIdProvider: () => this.identityManager.identity?.deviceKey?.toHex(),
158
168
  getSpaceKeyByRootDocumentId: (documentId) => this.spaceManager.findSpaceByRootDocumentId(documentId)?.key,
159
- indexing: {
160
- vector: this._runtimeParams?.enableVectorIndexing,
169
+ runtime: this._runtime,
170
+ syncQueue: async (ctx, request) => {
171
+ return this._feedSyncer?.syncBlocking(ctx, {
172
+ spaceId: request.spaceId as SpaceId,
173
+ subspaceTag: request.subspaceTag,
174
+ shouldPush: request.shouldPush,
175
+ shouldPull: request.shouldPull,
176
+ });
161
177
  },
162
178
  });
163
179
 
164
- this._meshReplicator = new MeshEchoReplicator();
165
-
166
180
  this.invitations = new InvitationsHandler(
167
181
  this.networkManager, //
168
182
  this._edgeHttpClient,
169
- _runtimeParams?.invitationConnectionDefaultParams,
183
+ _runtimeProps?.invitationConnectionDefaultProps,
170
184
  );
171
185
  this.invitationsManager = new InvitationsManager(
172
186
  this.invitations,
@@ -186,7 +200,7 @@ export class ServiceContext extends Resource {
186
200
  ),
187
201
  );
188
202
 
189
- if (!this._runtimeParams?.disableP2pReplication) {
203
+ if (!this._runtimeProps?.disableP2pReplication) {
190
204
  this._meshReplicator = new MeshEchoReplicator();
191
205
  }
192
206
  if (this._edgeConnection && this._edgeFeatures?.echoReplicator && this._edgeHttpClient) {
@@ -195,59 +209,106 @@ export class ServiceContext extends Resource {
195
209
  edgeHttpClient: this._edgeHttpClient,
196
210
  });
197
211
  }
212
+
213
+ if (this.echoHost.feedStore && this._edgeConnection) {
214
+ this._feedSyncer = new FeedSyncer({
215
+ runtime: this._runtime,
216
+ feedStore: this.echoHost.feedStore,
217
+ edgeClient: this._edgeConnection,
218
+ peerId: this.identityManager.identity?.deviceKey?.toHex() ?? '',
219
+ getSpaceIds: () => this.echoHost!.spaceIds,
220
+ syncNamespaces: [FeedProtocol.WellKnownNamespaces.data, FeedProtocol.WellKnownNamespaces.trace],
221
+ });
222
+ }
198
223
  }
199
224
 
200
- @Trace.span()
225
+ @Trace.span({ op: 'lifecycle' })
201
226
  protected override async _open(ctx: Context): Promise<void> {
202
227
  await this._checkStorageVersion();
203
228
 
204
229
  log('opening...');
205
- log.trace('dxos.sdk.service-context.open', trace.begin({ id: this._instanceId }));
206
230
 
231
+ log('opening identityManager...');
207
232
  await this.identityManager.open(ctx);
233
+ log('identityManager opened', { hasIdentity: !!this.identityManager.identity });
208
234
 
209
- await this._setNetworkIdentity();
235
+ log('setting network identity...');
236
+ await this._setNetworkIdentity({ identity: this.identityManager.identity });
237
+ log('network identity set');
210
238
 
211
- await this._edgeConnection?.open();
212
- await this.signalManager.open();
239
+ log('opening edge connection...');
240
+ await this._edgeConnection?.open(ctx);
241
+ log('edge connection opened');
242
+
243
+ log('opening signal manager...');
244
+ await this.signalManager.open(ctx);
245
+ log('signal manager opened');
246
+
247
+ log('opening network manager...');
213
248
  await this.networkManager.open();
249
+ log('network manager opened');
214
250
 
251
+ log('opening echo host...');
215
252
  await this.echoHost.open(ctx);
253
+ log('echo host opened');
216
254
 
217
255
  if (this._meshReplicator) {
218
- await this.echoHost.addReplicator(this._meshReplicator);
256
+ log('adding mesh replicator...');
257
+ await this.echoHost.addReplicator(ctx, this._meshReplicator);
258
+ log('mesh replicator added');
219
259
  }
220
260
  if (this._echoEdgeReplicator) {
221
- await this.echoHost.addReplicator(this._echoEdgeReplicator);
261
+ log('adding edge replicator...');
262
+ await this.echoHost.addReplicator(ctx, this._echoEdgeReplicator);
263
+ log('edge replicator added');
222
264
  }
223
265
 
266
+ log('loading metadata store...');
224
267
  await this.metadataStore.load();
268
+ log('metadata store loaded');
269
+
270
+ log('opening space manager...');
225
271
  await this.spaceManager.open();
272
+ log('space manager opened');
226
273
 
227
274
  if (this.identityManager.identity) {
228
- await this.identityManager.identity.joinNetwork();
275
+ log('joining network...');
276
+ await this.identityManager.identity.joinNetwork(ctx);
277
+ log('network joined');
278
+
279
+ log('initializing spaces...(calling _initialize)');
229
280
  await this._initialize(ctx);
281
+ log('spaces initialized');
282
+ } else {
283
+ log('no identity, skipping network join and space initialization');
230
284
  }
231
285
 
232
- const loadedInvitations = await this.invitationsManager.loadPersistentInvitations();
286
+ log('opening feed syncer...');
287
+ await this._feedSyncer?.open(ctx);
288
+ log('feed syncer opened');
289
+
290
+ log('loading persistent invitations...');
291
+ const loadedInvitations = await this.invitationsManager.loadPersistentInvitations(ctx);
233
292
  log('loaded persistent invitations', { count: loadedInvitations.invitations?.length });
234
293
 
235
- log.trace('dxos.sdk.service-context.open', trace.end({ id: this._instanceId }));
236
294
  log('opened');
237
295
  }
238
296
 
239
297
  protected override async _close(ctx: Context): Promise<void> {
240
298
  log('closing...');
299
+
300
+ await this._feedSyncer?.close();
301
+
241
302
  if (this._deviceSpaceSync && this.identityManager.identity) {
242
303
  await this.identityManager.identity.space.spaceState.removeCredentialProcessor(this._deviceSpaceSync);
243
304
  }
244
- await this.dataSpaceManager?.close();
305
+ await this.dataSpaceManager?.close(ctx);
245
306
  await this.edgeAgentManager?.close();
246
- await this.identityManager.close();
307
+ await this.identityManager.close(ctx);
247
308
  await this.spaceManager.close();
248
309
  await this.echoHost.close(ctx);
249
310
 
250
- await this.networkManager.close();
311
+ await this.networkManager.close(ctx);
251
312
  await this.signalManager.close();
252
313
  await this._edgeConnection?.close();
253
314
  await this.feedStore.close();
@@ -256,11 +317,12 @@ export class ServiceContext extends Resource {
256
317
  log('closed');
257
318
  }
258
319
 
259
- async createIdentity(params: CreateIdentityOptions = {}) {
260
- const identity = await this.identityManager.createIdentity(params);
261
- await this._setNetworkIdentity();
262
- await identity.joinNetwork();
263
- await this._initialize(new Context());
320
+ async createIdentity(params: CreateIdentityOptions = {}, ctx?: Context) {
321
+ ctx ??= this._ctx;
322
+ const identity = await this.identityManager.createIdentity(params, ctx);
323
+ await this._setNetworkIdentity({ identity });
324
+ await identity.joinNetwork(ctx);
325
+ await this._initialize(ctx);
264
326
  return identity;
265
327
  }
266
328
 
@@ -283,12 +345,12 @@ export class ServiceContext extends Resource {
283
345
  }
284
346
  }
285
347
 
286
- private async _acceptIdentity(params: JoinIdentityParams) {
287
- const { identity, identityRecord } = await this.identityManager.prepareIdentity(params);
288
- await this._setNetworkIdentity({ deviceCredential: params.authorizedDeviceCredential! });
289
- await identity.joinNetwork();
348
+ private async _acceptIdentity(params: JoinIdentityProps) {
349
+ const { identity, identityRecord } = await this.identityManager.prepareIdentity(params, this._ctx);
350
+ await this._setNetworkIdentity({ deviceCredential: params.authorizedDeviceCredential!, identity });
351
+ await identity.joinNetwork(this._ctx);
290
352
  await this.identityManager.acceptIdentity(identity, identityRecord, params.deviceProfile);
291
- await this._initialize(new Context());
353
+ await this._initialize(this._ctx);
292
354
  return identity;
293
355
  }
294
356
 
@@ -303,7 +365,7 @@ export class ServiceContext extends Resource {
303
365
  // Called when identity is created.
304
366
  @Trace.span()
305
367
  private async _initialize(ctx: Context): Promise<void> {
306
- log('initializing spaces...');
368
+ log('_initialize: start');
307
369
  const identity = this.identityManager.identity ?? failUndefined();
308
370
  const signingContext: SigningContext = {
309
371
  credentialSigner: identity.getIdentityCredentialSigner(),
@@ -315,6 +377,7 @@ export class ServiceContext extends Resource {
315
377
  },
316
378
  };
317
379
 
380
+ log('_initialize: creating DataSpaceManager');
318
381
  this.dataSpaceManager = new DataSpaceManager({
319
382
  spaceManager: this.spaceManager,
320
383
  metadataStore: this.metadataStore,
@@ -327,10 +390,12 @@ export class ServiceContext extends Resource {
327
390
  edgeHttpClient: this._edgeHttpClient,
328
391
  echoEdgeReplicator: this._echoEdgeReplicator,
329
392
  meshReplicator: this._meshReplicator,
330
- runtimeParams: this._runtimeParams as DataSpaceManagerRuntimeParams,
393
+ runtimeProps: this._runtimeProps as DataSpaceManagerRuntimeProps,
331
394
  edgeFeatures: this._edgeFeatures,
332
395
  });
333
- await this.dataSpaceManager.open();
396
+ log('_initialize: opening DataSpaceManager...');
397
+ await this.dataSpaceManager.open(ctx);
398
+ log('_initialize: DataSpaceManager opened');
334
399
 
335
400
  this.edgeAgentManager = new EdgeAgentManager(
336
401
  this._edgeFeatures,
@@ -338,13 +403,16 @@ export class ServiceContext extends Resource {
338
403
  this.dataSpaceManager,
339
404
  identity,
340
405
  );
341
- await this.edgeAgentManager.open();
406
+ log('_initialize: opening EdgeAgentManager...');
407
+ await this.edgeAgentManager.open(ctx);
408
+ log('_initialize: EdgeAgentManager opened');
342
409
 
343
410
  this._handlerFactories.set(Invitation.Kind.SPACE, (invitation) => {
344
411
  invariant(this.dataSpaceManager, 'dataSpaceManager not initialized yet');
345
412
  return new SpaceInvitationProtocol(this.dataSpaceManager, signingContext, this.keyring, invitation.spaceKey);
346
413
  });
347
414
  this.initialized.wake();
415
+ log('_initialize: initialized.wake() called');
348
416
 
349
417
  this._deviceSpaceSync = {
350
418
  processCredential: async (credential: Credential) => {
@@ -367,9 +435,10 @@ export class ServiceContext extends Resource {
367
435
 
368
436
  try {
369
437
  log('accepting space recorded in halo', { details: assertion });
370
- await this.dataSpaceManager.acceptSpace({
438
+ await this.dataSpaceManager.acceptSpace(this._ctx, {
371
439
  spaceKey: assertion.spaceKey,
372
440
  genesisFeedKey: assertion.genesisFeedKey,
441
+ tags: assertion.tags,
373
442
  });
374
443
  } catch (err) {
375
444
  log.catch(err);
@@ -380,33 +449,42 @@ export class ServiceContext extends Resource {
380
449
  await identity.space.spaceState.addCredentialProcessor(this._deviceSpaceSync);
381
450
  }
382
451
 
383
- private async _setNetworkIdentity(params?: { deviceCredential: Credential }): Promise<void> {
452
+ private async _setNetworkIdentity(params?: { deviceCredential?: Credential; identity?: Identity }): Promise<void> {
453
+ log('_setNetworkIdentity: acquiring mutex...');
384
454
  using _ = await this._edgeIdentityUpdateMutex.acquire();
455
+ log('_setNetworkIdentity: mutex acquired');
385
456
 
386
457
  let edgeIdentity: EdgeIdentity;
387
- const identity = this.identityManager.identity;
458
+ const identity = params?.identity;
388
459
  if (identity) {
389
- log('setting identity on edge connection', {
460
+ log('_setNetworkIdentity: has identity', {
390
461
  identity: identity.identityKey.toHex(),
391
- swarms: this.networkManager.topics,
462
+ hasDeviceCredential: !!params?.deviceCredential,
392
463
  });
393
464
 
394
465
  if (params?.deviceCredential) {
466
+ log('_setNetworkIdentity: creating chain edge identity with device credential...');
395
467
  edgeIdentity = await createChainEdgeIdentity(
396
468
  identity.signer,
397
469
  identity.identityKey,
398
470
  identity.deviceKey,
399
- params?.deviceCredential && { credential: params.deviceCredential },
471
+ { credential: params.deviceCredential },
400
472
  [], // TODO(dmaretskyi): Service access credentials.
401
473
  );
474
+ log('_setNetworkIdentity: chain edge identity created');
402
475
  } else {
476
+ log('_setNetworkIdentity: waiting for identity.ready()...');
403
477
  // TODO: throw here or from identity if device chain can't be loaded, to avoid indefinite hangup
404
478
  await warnAfterTimeout(10_000, 'Waiting for identity to be ready for edge connection', async () => {
405
479
  await identity.ready();
406
480
  });
481
+ log('_setNetworkIdentity: identity.ready() resolved', {
482
+ hasDeviceCredentialChain: !!identity.deviceCredentialChain,
483
+ });
407
484
 
408
485
  invariant(identity.deviceCredentialChain);
409
486
 
487
+ log('_setNetworkIdentity: creating chain edge identity...');
410
488
  edgeIdentity = await createChainEdgeIdentity(
411
489
  identity.signer,
412
490
  identity.identityKey,
@@ -414,9 +492,12 @@ export class ServiceContext extends Resource {
414
492
  identity.deviceCredentialChain,
415
493
  [], // TODO(dmaretskyi): Service access credentials.
416
494
  );
495
+ log('_setNetworkIdentity: chain edge identity created');
417
496
  }
418
497
  } else {
498
+ log('_setNetworkIdentity: no identity, creating ephemeral edge identity...');
419
499
  edgeIdentity = await createEphemeralEdgeIdentity();
500
+ log('_setNetworkIdentity: ephemeral edge identity created');
420
501
  }
421
502
 
422
503
  this._edgeConnection?.setIdentity(edgeIdentity);
@@ -425,5 +506,6 @@ export class ServiceContext extends Resource {
425
506
  identityKey: edgeIdentity.identityKey,
426
507
  peerKey: edgeIdentity.peerKey,
427
508
  });
509
+ log('_setNetworkIdentity: done');
428
510
  }
429
511
  }
@@ -3,7 +3,6 @@
3
3
  //
4
4
 
5
5
  import { rmSync } from 'node:fs';
6
-
7
6
  import { afterEach, describe, expect, onTestFinished, test } from 'vitest';
8
7
 
9
8
  import { Trigger, asyncTimeout, latch } from '@dxos/async';
@@ -13,6 +12,7 @@ import { verifyPresentation } from '@dxos/credentials';
13
12
  import { type PublicKey } from '@dxos/keys';
14
13
  import { MemorySignalManagerContext } from '@dxos/messaging';
15
14
  import { type Identity } from '@dxos/protocols/proto/dxos/client/services';
15
+ import { MembershipPolicy } from '@dxos/protocols/proto/dxos/halo/credentials';
16
16
  import { type Credential } from '@dxos/protocols/proto/dxos/halo/credentials';
17
17
  import { isNode } from '@dxos/util';
18
18
 
@@ -29,16 +29,16 @@ describe('ClientServicesHost', () => {
29
29
  test('open and close', async () => {
30
30
  const host = createServiceHost(new Config(), new MemorySignalManagerContext());
31
31
  await host.open(new Context());
32
- await host.close();
32
+ await host.close(Context.default());
33
33
  });
34
34
 
35
35
  test('queryCredentials', async () => {
36
36
  const host = createServiceHost(new Config(), new MemorySignalManagerContext());
37
37
  await host.open(new Context());
38
- onTestFinished(() => host.close());
38
+ onTestFinished(() => host.close(Context.default()));
39
39
 
40
40
  await host.services.IdentityService!.createIdentity({});
41
- const { spaceKey } = await host.services.SpacesService!.createSpace();
41
+ const { spaceKey } = await host.services.SpacesService!.createSpace({ membershipPolicy: MembershipPolicy.INVITE });
42
42
 
43
43
  const stream = host.services.SpacesService!.queryCredentials({ spaceKey });
44
44
  const [done, tick] = latch({ count: 3 });
@@ -54,7 +54,7 @@ describe('ClientServicesHost', () => {
54
54
  test('write and query credentials', async () => {
55
55
  const host = createServiceHost(new Config(), new MemorySignalManagerContext());
56
56
  await host.open(new Context());
57
- onTestFinished(() => host.close());
57
+ onTestFinished(() => host.close(Context.default()));
58
58
 
59
59
  await host.services.IdentityService!.createIdentity({});
60
60
 
@@ -91,7 +91,7 @@ describe('ClientServicesHost', () => {
91
91
  test('sign presentation', async () => {
92
92
  const host = createServiceHost(new Config(), new MemorySignalManagerContext());
93
93
  await host.open(new Context());
94
- onTestFinished(() => host.close());
94
+ onTestFinished(() => host.close(Context.default()));
95
95
 
96
96
  await host.services.IdentityService!.createIdentity({});
97
97
 
@@ -128,7 +128,7 @@ describe('ClientServicesHost', () => {
128
128
  expect(host.context.storage.size).to.exist;
129
129
 
130
130
  await asyncTimeout(host.reset(), 1000);
131
- await host.close();
131
+ await host.close(Context.default());
132
132
  }
133
133
 
134
134
  {
@@ -146,7 +146,7 @@ describe('ClientServicesHost', () => {
146
146
  });
147
147
  await expect(asyncTimeout(trigger.wait(), 200)).rejects.toBeInstanceOf(Error);
148
148
  await stream?.close();
149
- await host.close();
149
+ await host.close(Context.default());
150
150
  }
151
151
  });
152
152
  });