@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
@@ -14,12 +14,18 @@ export const getPlatform = (): Platform => {
14
14
  userAgent,
15
15
  uptime: Math.floor((Date.now() - window.performance.timeOrigin) / 1_000),
16
16
  };
17
- } else {
17
+ } else if (typeof SharedWorkerGlobalScope !== 'undefined') {
18
18
  // Shared worker.
19
19
  return {
20
20
  type: Platform.PLATFORM_TYPE.SHARED_WORKER,
21
21
  uptime: Math.floor((Date.now() - performance.timeOrigin) / 1_000),
22
22
  };
23
+ } else {
24
+ // Dedicated worker.
25
+ return {
26
+ type: Platform.PLATFORM_TYPE.DEDICATED_WORKER,
27
+ uptime: Math.floor((Date.now() - performance.timeOrigin) / 1_000),
28
+ };
23
29
  }
24
30
  } else {
25
31
  // Node.
@@ -4,7 +4,8 @@
4
4
 
5
5
  import { describe, test } from 'vitest';
6
6
 
7
- import { MemorySignalManagerContext, MemorySignalManager } from '@dxos/messaging';
7
+ import { Context } from '@dxos/context';
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';
10
11
 
@@ -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,9 +2,11 @@
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
- import { getCredentialAssertion, type CredentialProcessor } from '@dxos/credentials';
9
+ import { type CredentialProcessor, getCredentialAssertion } from '@dxos/credentials';
8
10
  import { failUndefined, warnAfterTimeout } from '@dxos/debug';
9
11
  import {
10
12
  EchoEdgeReplicator,
@@ -15,49 +17,54 @@ import {
15
17
  valueEncoding,
16
18
  } from '@dxos/echo-pipeline';
17
19
  import { createChainEdgeIdentity, createEphemeralEdgeIdentity } from '@dxos/edge-client';
18
- import type { EdgeHttpClient, EdgeConnection, EdgeIdentity } from '@dxos/edge-client';
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';
36
41
 
37
42
  import { EdgeAgentManager } from '../agents';
38
43
  import {
39
- IdentityManager,
40
44
  type CreateIdentityOptions,
41
- type IdentityManagerParams,
42
- type JoinIdentityParams,
45
+ type Identity,
46
+ IdentityManager,
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,
54
+ type InvitationProtocol,
48
55
  InvitationsHandler,
49
56
  InvitationsManager,
50
57
  SpaceInvitationProtocol,
51
- type InvitationProtocol,
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,22 @@ 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
+ useSubduction: this._edgeFeatures?.subductionReplicator,
171
+ syncQueue: async (ctx, request) => {
172
+ return this._feedSyncer?.syncBlocking(ctx, {
173
+ spaceId: request.spaceId as SpaceId,
174
+ subspaceTag: request.subspaceTag,
175
+ shouldPush: request.shouldPush,
176
+ shouldPull: request.shouldPull,
177
+ });
161
178
  },
162
179
  });
163
180
 
164
- this._meshReplicator = new MeshEchoReplicator();
165
-
166
181
  this.invitations = new InvitationsHandler(
167
182
  this.networkManager, //
168
183
  this._edgeHttpClient,
169
- _runtimeParams?.invitationConnectionDefaultParams,
184
+ _runtimeProps?.invitationConnectionDefaultProps,
170
185
  );
171
186
  this.invitationsManager = new InvitationsManager(
172
187
  this.invitations,
@@ -186,80 +201,129 @@ export class ServiceContext extends Resource {
186
201
  ),
187
202
  );
188
203
 
189
- if (!this._runtimeParams?.disableP2pReplication) {
204
+ if (!this._runtimeProps?.disableP2pReplication) {
190
205
  this._meshReplicator = new MeshEchoReplicator();
191
206
  }
192
- if (this._edgeConnection && this._edgeFeatures?.echoReplicator) {
207
+ if (this._edgeConnection && this._edgeFeatures?.echoReplicator && this._edgeHttpClient) {
193
208
  this._echoEdgeReplicator = new EchoEdgeReplicator({
194
209
  edgeConnection: this._edgeConnection,
210
+ edgeHttpClient: this._edgeHttpClient,
211
+ });
212
+ }
213
+
214
+ if (this.echoHost.feedStore && this._edgeConnection) {
215
+ this._feedSyncer = new FeedSyncer({
216
+ runtime: this._runtime,
217
+ feedStore: this.echoHost.feedStore,
218
+ edgeClient: this._edgeConnection,
219
+ peerId: this.identityManager.identity?.deviceKey?.toHex() ?? '',
220
+ getSpaceIds: () => this.echoHost!.spaceIds,
221
+ syncNamespaces: [FeedProtocol.WellKnownNamespaces.data, FeedProtocol.WellKnownNamespaces.trace],
195
222
  });
196
223
  }
197
224
  }
198
225
 
199
- @Trace.span()
226
+ @Trace.span({ op: 'lifecycle' })
200
227
  protected override async _open(ctx: Context): Promise<void> {
201
228
  await this._checkStorageVersion();
202
229
 
203
230
  log('opening...');
204
- log.trace('dxos.sdk.service-context.open', trace.begin({ id: this._instanceId }));
205
231
 
232
+ log('opening identityManager...');
206
233
  await this.identityManager.open(ctx);
234
+ log('identityManager opened', { hasIdentity: !!this.identityManager.identity });
235
+
236
+ log('setting network identity...');
237
+ await this._setNetworkIdentity({ identity: this.identityManager.identity });
238
+ log('network identity set');
207
239
 
208
- await this._setNetworkIdentity();
240
+ log('opening edge connection...');
241
+ await this._edgeConnection?.open(ctx);
242
+ log('edge connection opened');
209
243
 
210
- await this._edgeConnection?.open();
211
- await this.signalManager.open();
244
+ log('opening signal manager...');
245
+ await this.signalManager.open(ctx);
246
+ log('signal manager opened');
247
+
248
+ log('opening network manager...');
212
249
  await this.networkManager.open();
250
+ log('network manager opened');
213
251
 
252
+ log('opening echo host...');
214
253
  await this.echoHost.open(ctx);
254
+ log('echo host opened');
215
255
 
216
256
  if (this._meshReplicator) {
217
- await this.echoHost.addReplicator(this._meshReplicator);
257
+ log('adding mesh replicator...');
258
+ await this.echoHost.addReplicator(ctx, this._meshReplicator);
259
+ log('mesh replicator added');
218
260
  }
219
261
  if (this._echoEdgeReplicator) {
220
- await this.echoHost.addReplicator(this._echoEdgeReplicator);
262
+ log('adding edge replicator...');
263
+ await this.echoHost.addReplicator(ctx, this._echoEdgeReplicator);
264
+ log('edge replicator added');
221
265
  }
222
266
 
267
+ log('loading metadata store...');
223
268
  await this.metadataStore.load();
269
+ log('metadata store loaded');
270
+
271
+ log('opening space manager...');
224
272
  await this.spaceManager.open();
273
+ log('space manager opened');
225
274
 
226
275
  if (this.identityManager.identity) {
227
- await this.identityManager.identity.joinNetwork();
276
+ log('joining network...');
277
+ await this.identityManager.identity.joinNetwork(ctx);
278
+ log('network joined');
279
+
280
+ log('initializing spaces...(calling _initialize)');
228
281
  await this._initialize(ctx);
282
+ log('spaces initialized');
283
+ } else {
284
+ log('no identity, skipping network join and space initialization');
229
285
  }
230
286
 
231
- const loadedInvitations = await this.invitationsManager.loadPersistentInvitations();
287
+ log('opening feed syncer...');
288
+ await this._feedSyncer?.open(ctx);
289
+ log('feed syncer opened');
290
+
291
+ log('loading persistent invitations...');
292
+ const loadedInvitations = await this.invitationsManager.loadPersistentInvitations(ctx);
232
293
  log('loaded persistent invitations', { count: loadedInvitations.invitations?.length });
233
294
 
234
- log.trace('dxos.sdk.service-context.open', trace.end({ id: this._instanceId }));
235
295
  log('opened');
236
296
  }
237
297
 
238
298
  protected override async _close(ctx: Context): Promise<void> {
239
299
  log('closing...');
300
+
301
+ await this._feedSyncer?.close();
302
+
240
303
  if (this._deviceSpaceSync && this.identityManager.identity) {
241
304
  await this.identityManager.identity.space.spaceState.removeCredentialProcessor(this._deviceSpaceSync);
242
305
  }
243
- await this.dataSpaceManager?.close();
306
+ await this.dataSpaceManager?.close(ctx);
244
307
  await this.edgeAgentManager?.close();
245
- await this.identityManager.close();
308
+ await this.identityManager.close(ctx);
246
309
  await this.spaceManager.close();
247
- await this.feedStore.close();
248
- await this.metadataStore.close();
249
-
250
310
  await this.echoHost.close(ctx);
251
- await this.networkManager.close();
311
+
312
+ await this.networkManager.close(ctx);
252
313
  await this.signalManager.close();
253
314
  await this._edgeConnection?.close();
315
+ await this.feedStore.close();
316
+ await this.metadataStore.close();
254
317
 
255
318
  log('closed');
256
319
  }
257
320
 
258
- async createIdentity(params: CreateIdentityOptions = {}) {
259
- const identity = await this.identityManager.createIdentity(params);
260
- await this._setNetworkIdentity();
261
- await identity.joinNetwork();
262
- await this._initialize(new Context());
321
+ async createIdentity(params: CreateIdentityOptions = {}, ctx?: Context) {
322
+ ctx ??= this._ctx;
323
+ const identity = await this.identityManager.createIdentity(params, ctx);
324
+ await this._setNetworkIdentity({ identity });
325
+ await identity.joinNetwork(ctx);
326
+ await this._initialize(ctx);
263
327
  return identity;
264
328
  }
265
329
 
@@ -282,12 +346,12 @@ export class ServiceContext extends Resource {
282
346
  }
283
347
  }
284
348
 
285
- private async _acceptIdentity(params: JoinIdentityParams) {
286
- const { identity, identityRecord } = await this.identityManager.prepareIdentity(params);
287
- await this._setNetworkIdentity({ deviceCredential: params.authorizedDeviceCredential! });
288
- await identity.joinNetwork();
349
+ private async _acceptIdentity(params: JoinIdentityProps) {
350
+ const { identity, identityRecord } = await this.identityManager.prepareIdentity(params, this._ctx);
351
+ await this._setNetworkIdentity({ deviceCredential: params.authorizedDeviceCredential!, identity });
352
+ await identity.joinNetwork(this._ctx);
289
353
  await this.identityManager.acceptIdentity(identity, identityRecord, params.deviceProfile);
290
- await this._initialize(new Context());
354
+ await this._initialize(this._ctx);
291
355
  return identity;
292
356
  }
293
357
 
@@ -302,7 +366,7 @@ export class ServiceContext extends Resource {
302
366
  // Called when identity is created.
303
367
  @Trace.span()
304
368
  private async _initialize(ctx: Context): Promise<void> {
305
- log('initializing spaces...');
369
+ log('_initialize: start');
306
370
  const identity = this.identityManager.identity ?? failUndefined();
307
371
  const signingContext: SigningContext = {
308
372
  credentialSigner: identity.getIdentityCredentialSigner(),
@@ -314,6 +378,7 @@ export class ServiceContext extends Resource {
314
378
  },
315
379
  };
316
380
 
381
+ log('_initialize: creating DataSpaceManager');
317
382
  this.dataSpaceManager = new DataSpaceManager({
318
383
  spaceManager: this.spaceManager,
319
384
  metadataStore: this.metadataStore,
@@ -326,10 +391,12 @@ export class ServiceContext extends Resource {
326
391
  edgeHttpClient: this._edgeHttpClient,
327
392
  echoEdgeReplicator: this._echoEdgeReplicator,
328
393
  meshReplicator: this._meshReplicator,
329
- runtimeParams: this._runtimeParams as DataSpaceManagerRuntimeParams,
394
+ runtimeProps: this._runtimeProps as DataSpaceManagerRuntimeProps,
330
395
  edgeFeatures: this._edgeFeatures,
331
396
  });
332
- await this.dataSpaceManager.open();
397
+ log('_initialize: opening DataSpaceManager...');
398
+ await this.dataSpaceManager.open(ctx);
399
+ log('_initialize: DataSpaceManager opened');
333
400
 
334
401
  this.edgeAgentManager = new EdgeAgentManager(
335
402
  this._edgeFeatures,
@@ -337,13 +404,16 @@ export class ServiceContext extends Resource {
337
404
  this.dataSpaceManager,
338
405
  identity,
339
406
  );
340
- await this.edgeAgentManager.open();
407
+ log('_initialize: opening EdgeAgentManager...');
408
+ await this.edgeAgentManager.open(ctx);
409
+ log('_initialize: EdgeAgentManager opened');
341
410
 
342
411
  this._handlerFactories.set(Invitation.Kind.SPACE, (invitation) => {
343
412
  invariant(this.dataSpaceManager, 'dataSpaceManager not initialized yet');
344
413
  return new SpaceInvitationProtocol(this.dataSpaceManager, signingContext, this.keyring, invitation.spaceKey);
345
414
  });
346
415
  this.initialized.wake();
416
+ log('_initialize: initialized.wake() called');
347
417
 
348
418
  this._deviceSpaceSync = {
349
419
  processCredential: async (credential: Credential) => {
@@ -366,9 +436,10 @@ export class ServiceContext extends Resource {
366
436
 
367
437
  try {
368
438
  log('accepting space recorded in halo', { details: assertion });
369
- await this.dataSpaceManager.acceptSpace({
439
+ await this.dataSpaceManager.acceptSpace(this._ctx, {
370
440
  spaceKey: assertion.spaceKey,
371
441
  genesisFeedKey: assertion.genesisFeedKey,
442
+ tags: assertion.tags,
372
443
  });
373
444
  } catch (err) {
374
445
  log.catch(err);
@@ -379,33 +450,42 @@ export class ServiceContext extends Resource {
379
450
  await identity.space.spaceState.addCredentialProcessor(this._deviceSpaceSync);
380
451
  }
381
452
 
382
- private async _setNetworkIdentity(params?: { deviceCredential: Credential }): Promise<void> {
453
+ private async _setNetworkIdentity(params?: { deviceCredential?: Credential; identity?: Identity }): Promise<void> {
454
+ log('_setNetworkIdentity: acquiring mutex...');
383
455
  using _ = await this._edgeIdentityUpdateMutex.acquire();
456
+ log('_setNetworkIdentity: mutex acquired');
384
457
 
385
458
  let edgeIdentity: EdgeIdentity;
386
- const identity = this.identityManager.identity;
459
+ const identity = params?.identity;
387
460
  if (identity) {
388
- log('setting identity on edge connection', {
461
+ log('_setNetworkIdentity: has identity', {
389
462
  identity: identity.identityKey.toHex(),
390
- swarms: this.networkManager.topics,
463
+ hasDeviceCredential: !!params?.deviceCredential,
391
464
  });
392
465
 
393
466
  if (params?.deviceCredential) {
467
+ log('_setNetworkIdentity: creating chain edge identity with device credential...');
394
468
  edgeIdentity = await createChainEdgeIdentity(
395
469
  identity.signer,
396
470
  identity.identityKey,
397
471
  identity.deviceKey,
398
- params?.deviceCredential && { credential: params.deviceCredential },
472
+ { credential: params.deviceCredential },
399
473
  [], // TODO(dmaretskyi): Service access credentials.
400
474
  );
475
+ log('_setNetworkIdentity: chain edge identity created');
401
476
  } else {
477
+ log('_setNetworkIdentity: waiting for identity.ready()...');
402
478
  // TODO: throw here or from identity if device chain can't be loaded, to avoid indefinite hangup
403
479
  await warnAfterTimeout(10_000, 'Waiting for identity to be ready for edge connection', async () => {
404
480
  await identity.ready();
405
481
  });
482
+ log('_setNetworkIdentity: identity.ready() resolved', {
483
+ hasDeviceCredentialChain: !!identity.deviceCredentialChain,
484
+ });
406
485
 
407
486
  invariant(identity.deviceCredentialChain);
408
487
 
488
+ log('_setNetworkIdentity: creating chain edge identity...');
409
489
  edgeIdentity = await createChainEdgeIdentity(
410
490
  identity.signer,
411
491
  identity.identityKey,
@@ -413,9 +493,12 @@ export class ServiceContext extends Resource {
413
493
  identity.deviceCredentialChain,
414
494
  [], // TODO(dmaretskyi): Service access credentials.
415
495
  );
496
+ log('_setNetworkIdentity: chain edge identity created');
416
497
  }
417
498
  } else {
499
+ log('_setNetworkIdentity: no identity, creating ephemeral edge identity...');
418
500
  edgeIdentity = await createEphemeralEdgeIdentity();
501
+ log('_setNetworkIdentity: ephemeral edge identity created');
419
502
  }
420
503
 
421
504
  this._edgeConnection?.setIdentity(edgeIdentity);
@@ -424,5 +507,6 @@ export class ServiceContext extends Resource {
424
507
  identityKey: edgeIdentity.identityKey,
425
508
  peerKey: edgeIdentity.peerKey,
426
509
  });
510
+ log('_setNetworkIdentity: done');
427
511
  }
428
512
  }
@@ -3,15 +3,16 @@
3
3
  //
4
4
 
5
5
  import { rmSync } from 'node:fs';
6
- import { afterEach, onTestFinished, describe, expect, test } from 'vitest';
6
+ import { afterEach, describe, expect, onTestFinished, test } from 'vitest';
7
7
 
8
- import { asyncTimeout, latch, Trigger } from '@dxos/async';
8
+ import { Trigger, asyncTimeout, latch } from '@dxos/async';
9
9
  import { Config } from '@dxos/config';
10
10
  import { Context } from '@dxos/context';
11
11
  import { verifyPresentation } from '@dxos/credentials';
12
12
  import { type PublicKey } from '@dxos/keys';
13
13
  import { MemorySignalManagerContext } from '@dxos/messaging';
14
14
  import { type Identity } from '@dxos/protocols/proto/dxos/client/services';
15
+ import { MembershipPolicy } from '@dxos/protocols/proto/dxos/halo/credentials';
15
16
  import { type Credential } from '@dxos/protocols/proto/dxos/halo/credentials';
16
17
  import { isNode } from '@dxos/util';
17
18
 
@@ -28,16 +29,16 @@ describe('ClientServicesHost', () => {
28
29
  test('open and close', async () => {
29
30
  const host = createServiceHost(new Config(), new MemorySignalManagerContext());
30
31
  await host.open(new Context());
31
- await host.close();
32
+ await host.close(Context.default());
32
33
  });
33
34
 
34
35
  test('queryCredentials', async () => {
35
36
  const host = createServiceHost(new Config(), new MemorySignalManagerContext());
36
37
  await host.open(new Context());
37
- onTestFinished(() => host.close());
38
+ onTestFinished(() => host.close(Context.default()));
38
39
 
39
40
  await host.services.IdentityService!.createIdentity({});
40
- const { spaceKey } = await host.services.SpacesService!.createSpace();
41
+ const { spaceKey } = await host.services.SpacesService!.createSpace({ membershipPolicy: MembershipPolicy.INVITE });
41
42
 
42
43
  const stream = host.services.SpacesService!.queryCredentials({ spaceKey });
43
44
  const [done, tick] = latch({ count: 3 });
@@ -53,7 +54,7 @@ describe('ClientServicesHost', () => {
53
54
  test('write and query credentials', async () => {
54
55
  const host = createServiceHost(new Config(), new MemorySignalManagerContext());
55
56
  await host.open(new Context());
56
- onTestFinished(() => host.close());
57
+ onTestFinished(() => host.close(Context.default()));
57
58
 
58
59
  await host.services.IdentityService!.createIdentity({});
59
60
 
@@ -90,7 +91,7 @@ describe('ClientServicesHost', () => {
90
91
  test('sign presentation', async () => {
91
92
  const host = createServiceHost(new Config(), new MemorySignalManagerContext());
92
93
  await host.open(new Context());
93
- onTestFinished(() => host.close());
94
+ onTestFinished(() => host.close(Context.default()));
94
95
 
95
96
  await host.services.IdentityService!.createIdentity({});
96
97
 
@@ -127,7 +128,7 @@ describe('ClientServicesHost', () => {
127
128
  expect(host.context.storage.size).to.exist;
128
129
 
129
130
  await asyncTimeout(host.reset(), 1000);
130
- await host.close();
131
+ await host.close(Context.default());
131
132
  }
132
133
 
133
134
  {
@@ -145,7 +146,7 @@ describe('ClientServicesHost', () => {
145
146
  });
146
147
  await expect(asyncTimeout(trigger.wait(), 200)).rejects.toBeInstanceOf(Error);
147
148
  await stream?.close();
148
- await host.close();
149
+ await host.close(Context.default());
149
150
  }
150
151
  });
151
152
  });