@dxos/client-services 0.10.0 → 0.11.1

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 (304) hide show
  1. package/dist/lib/chunk-client-services-layer.mjs +11425 -0
  2. package/dist/lib/chunk-client-services-layer.mjs.map +1 -0
  3. package/dist/lib/chunk-decorate.mjs +9 -0
  4. package/dist/lib/index.mjs +731 -0
  5. package/dist/lib/index.mjs.map +1 -0
  6. package/dist/lib/packlets/diagnostics/browser-diagnostics-broadcast.mjs +72 -0
  7. package/dist/lib/packlets/diagnostics/browser-diagnostics-broadcast.mjs.map +1 -0
  8. package/dist/lib/packlets/diagnostics/diagnostics-broadcast.mjs +14 -0
  9. package/dist/lib/packlets/diagnostics/diagnostics-broadcast.mjs.map +1 -0
  10. package/dist/lib/packlets/locks/browser.mjs +105 -0
  11. package/dist/lib/packlets/locks/browser.mjs.map +1 -0
  12. package/dist/lib/packlets/locks/node.mjs +53 -0
  13. package/dist/lib/packlets/locks/node.mjs.map +1 -0
  14. package/dist/lib/testing.mjs +570 -0
  15. package/dist/lib/testing.mjs.map +1 -0
  16. package/dist/types/src/index.d.ts +2 -0
  17. package/dist/types/src/index.d.ts.map +1 -1
  18. package/dist/types/src/packlets/agents/edge-agent-manager.d.ts +21 -4
  19. package/dist/types/src/packlets/agents/edge-agent-manager.d.ts.map +1 -1
  20. package/dist/types/src/packlets/agents/edge-agent-service.d.ts +8 -7
  21. package/dist/types/src/packlets/agents/edge-agent-service.d.ts.map +1 -1
  22. package/dist/types/src/packlets/devices/devices-service.d.ts +7 -5
  23. package/dist/types/src/packlets/devices/devices-service.d.ts.map +1 -1
  24. package/dist/types/src/packlets/devtools/devtools.d.ts +30 -29
  25. package/dist/types/src/packlets/devtools/devtools.d.ts.map +1 -1
  26. package/dist/types/src/packlets/devtools/feeds.d.ts +1 -1
  27. package/dist/types/src/packlets/devtools/feeds.d.ts.map +1 -1
  28. package/dist/types/src/packlets/devtools/network.d.ts +2 -1
  29. package/dist/types/src/packlets/devtools/network.d.ts.map +1 -1
  30. package/dist/types/src/packlets/devtools/spaces.d.ts.map +1 -1
  31. package/dist/types/src/packlets/diagnostics/diagnostics-broadcast.d.ts +2 -2
  32. package/dist/types/src/packlets/diagnostics/diagnostics-broadcast.d.ts.map +1 -1
  33. package/dist/types/src/packlets/diagnostics/diagnostics-collector.d.ts.map +1 -1
  34. package/dist/types/src/packlets/diagnostics/diagnostics.d.ts +1 -8
  35. package/dist/types/src/packlets/diagnostics/diagnostics.d.ts.map +1 -1
  36. package/dist/types/src/packlets/identity/authenticator.d.ts +1 -1
  37. package/dist/types/src/packlets/identity/authenticator.d.ts.map +1 -1
  38. package/dist/types/src/packlets/identity/contacts-service.d.ts +9 -6
  39. package/dist/types/src/packlets/identity/contacts-service.d.ts.map +1 -1
  40. package/dist/types/src/packlets/identity/identity-manager.d.ts +32 -3
  41. package/dist/types/src/packlets/identity/identity-manager.d.ts.map +1 -1
  42. package/dist/types/src/packlets/identity/identity-recovery-manager.d.ts +23 -4
  43. package/dist/types/src/packlets/identity/identity-recovery-manager.d.ts.map +1 -1
  44. package/dist/types/src/packlets/identity/identity-service.d.ts +15 -20
  45. package/dist/types/src/packlets/identity/identity-service.d.ts.map +1 -1
  46. package/dist/types/src/packlets/identity/identity.d.ts +2 -2
  47. package/dist/types/src/packlets/identity/identity.d.ts.map +1 -1
  48. package/dist/types/src/packlets/invitations/edge-invitation-handler.d.ts.map +1 -1
  49. package/dist/types/src/packlets/invitations/invitations-handler.d.ts +17 -0
  50. package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +1 -1
  51. package/dist/types/src/packlets/invitations/invitations-manager.d.ts +25 -4
  52. package/dist/types/src/packlets/invitations/invitations-manager.d.ts.map +1 -1
  53. package/dist/types/src/packlets/invitations/invitations-service.d.ts +11 -11
  54. package/dist/types/src/packlets/invitations/invitations-service.d.ts.map +1 -1
  55. package/dist/types/src/packlets/logging/logging-service.d.ts +14 -12
  56. package/dist/types/src/packlets/logging/logging-service.d.ts.map +1 -1
  57. package/dist/types/src/packlets/metadata/index.d.ts +3 -0
  58. package/dist/types/src/packlets/metadata/index.d.ts.map +1 -0
  59. package/dist/types/src/packlets/metadata/metadata-store.d.ts +107 -0
  60. package/dist/types/src/packlets/metadata/metadata-store.d.ts.map +1 -0
  61. package/dist/types/src/packlets/metadata/metadata-store.test.d.ts +2 -0
  62. package/dist/types/src/packlets/metadata/metadata-store.test.d.ts.map +1 -0
  63. package/dist/types/src/packlets/metadata/sqlite-metadata-store.d.ts +65 -0
  64. package/dist/types/src/packlets/metadata/sqlite-metadata-store.d.ts.map +1 -0
  65. package/dist/types/src/packlets/network/network-service.d.ts +15 -14
  66. package/dist/types/src/packlets/network/network-service.d.ts.map +1 -1
  67. package/dist/types/src/packlets/pipeline/codec.d.ts +11 -0
  68. package/dist/types/src/packlets/pipeline/codec.d.ts.map +1 -0
  69. package/dist/types/src/packlets/pipeline/feeds.d.ts +7 -0
  70. package/dist/types/src/packlets/pipeline/feeds.d.ts.map +1 -0
  71. package/dist/types/src/packlets/pipeline/index.d.ts +5 -0
  72. package/dist/types/src/packlets/pipeline/index.d.ts.map +1 -0
  73. package/dist/types/src/packlets/pipeline/message-selector.d.ts +11 -0
  74. package/dist/types/src/packlets/pipeline/message-selector.d.ts.map +1 -0
  75. package/dist/types/src/packlets/pipeline/pipeline-stress.test.d.ts +2 -0
  76. package/dist/types/src/packlets/pipeline/pipeline-stress.test.d.ts.map +1 -0
  77. package/dist/types/src/packlets/pipeline/pipeline.d.ts +131 -0
  78. package/dist/types/src/packlets/pipeline/pipeline.d.ts.map +1 -0
  79. package/dist/types/src/packlets/pipeline/pipeline.test.d.ts +2 -0
  80. package/dist/types/src/packlets/pipeline/pipeline.test.d.ts.map +1 -0
  81. package/dist/types/src/packlets/pipeline/testing/index.d.ts +2 -0
  82. package/dist/types/src/packlets/pipeline/testing/index.d.ts.map +1 -0
  83. package/dist/types/src/packlets/pipeline/testing/test-feed-builder.d.ts +9 -0
  84. package/dist/types/src/packlets/pipeline/testing/test-feed-builder.d.ts.map +1 -0
  85. package/dist/types/src/packlets/pipeline/timeframe-clock.d.ts +31 -0
  86. package/dist/types/src/packlets/pipeline/timeframe-clock.d.ts.map +1 -0
  87. package/dist/types/src/packlets/services/client-services-layer.d.ts +21 -0
  88. package/dist/types/src/packlets/services/client-services-layer.d.ts.map +1 -0
  89. package/dist/types/src/packlets/services/cross-device-space-synchronizer.d.ts +28 -0
  90. package/dist/types/src/packlets/services/cross-device-space-synchronizer.d.ts.map +1 -0
  91. package/dist/types/src/packlets/services/effect-rpc.test.d.ts +2 -0
  92. package/dist/types/src/packlets/services/effect-rpc.test.d.ts.map +1 -0
  93. package/dist/types/src/packlets/services/feed-syncer.d.ts +22 -2
  94. package/dist/types/src/packlets/services/feed-syncer.d.ts.map +1 -1
  95. package/dist/types/src/packlets/services/index.d.ts +2 -2
  96. package/dist/types/src/packlets/services/index.d.ts.map +1 -1
  97. package/dist/types/src/packlets/services/platform.d.ts.map +1 -1
  98. package/dist/types/src/packlets/services/service-context.d.ts +38 -57
  99. package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
  100. package/dist/types/src/packlets/services/service-host.d.ts +82 -31
  101. package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
  102. package/dist/types/src/packlets/services/sqlite-storage.d.ts +29 -0
  103. package/dist/types/src/packlets/services/sqlite-storage.d.ts.map +1 -1
  104. package/dist/types/src/packlets/services/sqlite-storage.test.d.ts +2 -0
  105. package/dist/types/src/packlets/services/sqlite-storage.test.d.ts.map +1 -0
  106. package/dist/types/src/packlets/space/admission-discovery-extension.d.ts +30 -0
  107. package/dist/types/src/packlets/space/admission-discovery-extension.d.ts.map +1 -0
  108. package/dist/types/src/packlets/space/auth.d.ts +24 -0
  109. package/dist/types/src/packlets/space/auth.d.ts.map +1 -0
  110. package/dist/types/src/packlets/space/control-pipeline.d.ts +46 -0
  111. package/dist/types/src/packlets/space/control-pipeline.d.ts.map +1 -0
  112. package/dist/types/src/packlets/space/control-pipeline.test.d.ts +2 -0
  113. package/dist/types/src/packlets/space/control-pipeline.test.d.ts.map +1 -0
  114. package/dist/types/src/packlets/space/index.d.ts +6 -0
  115. package/dist/types/src/packlets/space/index.d.ts.map +1 -0
  116. package/dist/types/src/packlets/space/replication.browser.test.d.ts +2 -0
  117. package/dist/types/src/packlets/space/replication.browser.test.d.ts.map +1 -0
  118. package/dist/types/src/packlets/space/space-manager.browser.test.d.ts +2 -0
  119. package/dist/types/src/packlets/space/space-manager.browser.test.d.ts.map +1 -0
  120. package/dist/types/src/packlets/space/space-manager.d.ts +72 -0
  121. package/dist/types/src/packlets/space/space-manager.d.ts.map +1 -0
  122. package/dist/types/src/packlets/space/space-protocol.browser.test.d.ts +2 -0
  123. package/dist/types/src/packlets/space/space-protocol.browser.test.d.ts.map +1 -0
  124. package/dist/types/src/packlets/space/space-protocol.d.ts +99 -0
  125. package/dist/types/src/packlets/space/space-protocol.d.ts.map +1 -0
  126. package/dist/types/src/packlets/space/space-protocol.test.d.ts +2 -0
  127. package/dist/types/src/packlets/space/space-protocol.test.d.ts.map +1 -0
  128. package/dist/types/src/packlets/space/space.d.ts +65 -0
  129. package/dist/types/src/packlets/space/space.d.ts.map +1 -0
  130. package/dist/types/src/packlets/space/space.test.d.ts +2 -0
  131. package/dist/types/src/packlets/space/space.test.d.ts.map +1 -0
  132. package/dist/types/src/packlets/space/testing/change-metadata.d.ts +8 -0
  133. package/dist/types/src/packlets/space/testing/change-metadata.d.ts.map +1 -0
  134. package/dist/types/src/packlets/space/testing/index.d.ts +4 -0
  135. package/dist/types/src/packlets/space/testing/index.d.ts.map +1 -0
  136. package/dist/types/src/packlets/space/testing/test-agent-builder.d.ts +62 -0
  137. package/dist/types/src/packlets/space/testing/test-agent-builder.d.ts.map +1 -0
  138. package/dist/types/src/packlets/space-export/serialized-space-reader.d.ts +1 -1
  139. package/dist/types/src/packlets/space-export/serialized-space-reader.d.ts.map +1 -1
  140. package/dist/types/src/packlets/space-export/serialized-space-writer.d.ts.map +1 -1
  141. package/dist/types/src/packlets/spaces/data-space-manager.d.ts +40 -7
  142. package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
  143. package/dist/types/src/packlets/spaces/data-space.d.ts +3 -1
  144. package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
  145. package/dist/types/src/packlets/spaces/genesis.d.ts +1 -1
  146. package/dist/types/src/packlets/spaces/genesis.d.ts.map +1 -1
  147. package/dist/types/src/packlets/spaces/spaces-service.d.ts +25 -23
  148. package/dist/types/src/packlets/spaces/spaces-service.d.ts.map +1 -1
  149. package/dist/types/src/packlets/storage/level.d.ts.map +1 -1
  150. package/dist/types/src/packlets/system/system-service.d.ts +18 -18
  151. package/dist/types/src/packlets/system/system-service.d.ts.map +1 -1
  152. package/dist/types/src/packlets/testing/invitation-utils.d.ts +1 -1
  153. package/dist/types/src/packlets/testing/invitation-utils.d.ts.map +1 -1
  154. package/dist/types/src/packlets/testing/test-builder.d.ts +7 -6
  155. package/dist/types/src/packlets/testing/test-builder.d.ts.map +1 -1
  156. package/dist/types/src/packlets/worker/worker-runtime.d.ts +41 -58
  157. package/dist/types/src/packlets/worker/worker-runtime.d.ts.map +1 -1
  158. package/dist/types/src/packlets/worker/worker-session.d.ts +21 -8
  159. package/dist/types/src/packlets/worker/worker-session.d.ts.map +1 -1
  160. package/dist/types/src/testing/index.d.ts +1 -0
  161. package/dist/types/src/testing/index.d.ts.map +1 -1
  162. package/dist/types/src/version.d.ts +1 -1
  163. package/dist/types/tsconfig.tsbuildinfo +1 -1
  164. package/package.json +52 -48
  165. package/src/index.ts +2 -0
  166. package/src/packlets/agents/edge-agent-manager.ts +56 -15
  167. package/src/packlets/agents/edge-agent-service.ts +25 -15
  168. package/src/packlets/devices/devices-service.test.ts +20 -19
  169. package/src/packlets/devices/devices-service.ts +17 -17
  170. package/src/packlets/devtools/devtools.ts +133 -75
  171. package/src/packlets/devtools/feeds.ts +2 -1
  172. package/src/packlets/devtools/network.ts +42 -12
  173. package/src/packlets/devtools/spaces.ts +1 -1
  174. package/src/packlets/diagnostics/diagnostics-broadcast.ts +4 -2
  175. package/src/packlets/diagnostics/diagnostics-collector.ts +5 -18
  176. package/src/packlets/diagnostics/diagnostics.ts +0 -11
  177. package/src/packlets/identity/authenticator.ts +2 -1
  178. package/src/packlets/identity/contacts-service.ts +46 -37
  179. package/src/packlets/identity/identity-manager.test.ts +3 -1
  180. package/src/packlets/identity/identity-manager.ts +73 -5
  181. package/src/packlets/identity/identity-recovery-manager.ts +56 -7
  182. package/src/packlets/identity/identity-service.test.ts +27 -18
  183. package/src/packlets/identity/identity-service.ts +114 -71
  184. package/src/packlets/identity/identity.test.ts +4 -9
  185. package/src/packlets/identity/identity.ts +1 -2
  186. package/src/packlets/invitations/edge-invitation-handler.ts +0 -1
  187. package/src/packlets/invitations/invitations-handler.ts +39 -3
  188. package/src/packlets/invitations/invitations-manager.ts +52 -4
  189. package/src/packlets/invitations/invitations-service.ts +54 -28
  190. package/src/packlets/logging/logging-service.ts +41 -29
  191. package/src/packlets/logging/logging.test.ts +28 -15
  192. package/src/packlets/metadata/index.ts +6 -0
  193. package/src/packlets/metadata/metadata-store.test.ts +49 -0
  194. package/src/packlets/metadata/metadata-store.ts +446 -0
  195. package/src/packlets/metadata/sqlite-metadata-store.ts +409 -0
  196. package/src/packlets/network/network-service.test.ts +19 -12
  197. package/src/packlets/network/network-service.ts +96 -29
  198. package/src/packlets/pipeline/codec.ts +18 -0
  199. package/src/packlets/pipeline/feeds.ts +22 -0
  200. package/src/packlets/pipeline/index.ts +8 -0
  201. package/src/packlets/pipeline/message-selector.ts +35 -0
  202. package/src/packlets/pipeline/pipeline-stress.test.ts +230 -0
  203. package/src/packlets/pipeline/pipeline.test.ts +140 -0
  204. package/src/packlets/pipeline/pipeline.ts +439 -0
  205. package/src/packlets/pipeline/testing/index.ts +5 -0
  206. package/src/packlets/pipeline/testing/test-feed-builder.ts +19 -0
  207. package/src/packlets/pipeline/timeframe-clock.ts +81 -0
  208. package/src/packlets/services/client-services-layer.ts +186 -0
  209. package/src/packlets/services/cross-device-space-synchronizer.ts +132 -0
  210. package/src/packlets/services/effect-rpc.test.ts +314 -0
  211. package/src/packlets/services/feed-syncer.ts +57 -3
  212. package/src/packlets/services/index.ts +2 -2
  213. package/src/packlets/services/platform.ts +0 -6
  214. package/src/packlets/services/service-context.ts +219 -522
  215. package/src/packlets/services/service-host.test.ts +34 -11
  216. package/src/packlets/services/service-host.ts +693 -213
  217. package/src/packlets/services/spec.md +106 -0
  218. package/src/packlets/services/sqlite-storage.test.ts +48 -0
  219. package/src/packlets/services/sqlite-storage.ts +117 -20
  220. package/src/packlets/space/admission-discovery-extension.ts +91 -0
  221. package/src/packlets/space/auth.ts +92 -0
  222. package/src/packlets/space/control-pipeline.test.ts +165 -0
  223. package/src/packlets/space/control-pipeline.ts +229 -0
  224. package/src/packlets/space/index.ts +9 -0
  225. package/src/packlets/space/replication.browser.test.ts +58 -0
  226. package/src/packlets/space/space-manager.browser.test.ts +40 -0
  227. package/src/packlets/space/space-manager.ts +224 -0
  228. package/src/packlets/space/space-protocol.browser.test.ts +129 -0
  229. package/src/packlets/space/space-protocol.test.ts +158 -0
  230. package/src/packlets/space/space-protocol.ts +308 -0
  231. package/src/packlets/space/space.test.ts +181 -0
  232. package/src/packlets/space/space.ts +196 -0
  233. package/src/packlets/space/testing/change-metadata.ts +27 -0
  234. package/src/packlets/space/testing/index.ts +7 -0
  235. package/src/packlets/space/testing/test-agent-builder.ts +252 -0
  236. package/src/packlets/space-export/serialized-space-reader.ts +3 -1
  237. package/src/packlets/space-export/serialized-space-writer.ts +53 -30
  238. package/src/packlets/space-export/space-archive.test.ts +30 -0
  239. package/src/packlets/spaces/data-space-manager.test.ts +1 -1
  240. package/src/packlets/spaces/data-space-manager.ts +148 -33
  241. package/src/packlets/spaces/data-space.ts +29 -18
  242. package/src/packlets/spaces/edge-feed-replicator.test.ts +1 -1
  243. package/src/packlets/spaces/genesis.ts +1 -1
  244. package/src/packlets/spaces/spaces-service.test.ts +35 -22
  245. package/src/packlets/spaces/spaces-service.ts +259 -180
  246. package/src/packlets/storage/level.ts +3 -1
  247. package/src/packlets/system/system-service.test.ts +31 -13
  248. package/src/packlets/system/system-service.ts +65 -37
  249. package/src/packlets/testing/invitation-utils.ts +3 -3
  250. package/src/packlets/testing/test-builder.ts +35 -20
  251. package/src/packlets/worker/worker-runtime.ts +222 -260
  252. package/src/packlets/worker/worker-session.ts +108 -91
  253. package/src/testing/index.ts +1 -0
  254. package/src/version.ts +1 -1
  255. package/dist/lib/browser/chunk-QCWEHHJW.mjs +0 -24
  256. package/dist/lib/browser/chunk-QCWEHHJW.mjs.map +0 -7
  257. package/dist/lib/browser/chunk-XJRPB3GA.mjs +0 -22
  258. package/dist/lib/browser/chunk-XJRPB3GA.mjs.map +0 -7
  259. package/dist/lib/browser/chunk-XU5R2BMF.mjs +0 -8837
  260. package/dist/lib/browser/chunk-XU5R2BMF.mjs.map +0 -7
  261. package/dist/lib/browser/index.mjs +0 -876
  262. package/dist/lib/browser/index.mjs.map +0 -7
  263. package/dist/lib/browser/meta.json +0 -1
  264. package/dist/lib/browser/packlets/diagnostics/browser-diagnostics-broadcast.mjs +0 -88
  265. package/dist/lib/browser/packlets/diagnostics/browser-diagnostics-broadcast.mjs.map +0 -7
  266. package/dist/lib/browser/packlets/diagnostics/diagnostics-broadcast.mjs +0 -11
  267. package/dist/lib/browser/packlets/diagnostics/diagnostics-broadcast.mjs.map +0 -7
  268. package/dist/lib/browser/packlets/locks/browser.mjs +0 -86
  269. package/dist/lib/browser/packlets/locks/browser.mjs.map +0 -7
  270. package/dist/lib/browser/packlets/locks/node.mjs +0 -48
  271. package/dist/lib/browser/packlets/locks/node.mjs.map +0 -7
  272. package/dist/lib/browser/testing/index.mjs +0 -436
  273. package/dist/lib/browser/testing/index.mjs.map +0 -7
  274. package/dist/lib/node-esm/chunk-2DT3MZRL.mjs +0 -22
  275. package/dist/lib/node-esm/chunk-2DT3MZRL.mjs.map +0 -7
  276. package/dist/lib/node-esm/chunk-2SZHAWBN.mjs +0 -24
  277. package/dist/lib/node-esm/chunk-2SZHAWBN.mjs.map +0 -7
  278. package/dist/lib/node-esm/chunk-H5YTUD35.mjs +0 -8837
  279. package/dist/lib/node-esm/chunk-H5YTUD35.mjs.map +0 -7
  280. package/dist/lib/node-esm/index.mjs +0 -876
  281. package/dist/lib/node-esm/index.mjs.map +0 -7
  282. package/dist/lib/node-esm/meta.json +0 -1
  283. package/dist/lib/node-esm/packlets/diagnostics/browser-diagnostics-broadcast.mjs +0 -88
  284. package/dist/lib/node-esm/packlets/diagnostics/browser-diagnostics-broadcast.mjs.map +0 -7
  285. package/dist/lib/node-esm/packlets/diagnostics/diagnostics-broadcast.mjs +0 -11
  286. package/dist/lib/node-esm/packlets/diagnostics/diagnostics-broadcast.mjs.map +0 -7
  287. package/dist/lib/node-esm/packlets/locks/browser.mjs +0 -86
  288. package/dist/lib/node-esm/packlets/locks/browser.mjs.map +0 -7
  289. package/dist/lib/node-esm/packlets/locks/node.mjs +0 -48
  290. package/dist/lib/node-esm/packlets/locks/node.mjs.map +0 -7
  291. package/dist/lib/node-esm/testing/index.mjs +0 -436
  292. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  293. package/dist/types/src/packlets/services/client-rpc-server.d.ts +0 -24
  294. package/dist/types/src/packlets/services/client-rpc-server.d.ts.map +0 -1
  295. package/dist/types/src/packlets/services/service-registry.d.ts +0 -15
  296. package/dist/types/src/packlets/services/service-registry.d.ts.map +0 -1
  297. package/dist/types/src/packlets/services/service-registry.test.d.ts +0 -2
  298. package/dist/types/src/packlets/services/service-registry.test.d.ts.map +0 -1
  299. package/dist/types/src/testing/setup.d.ts +0 -3
  300. package/dist/types/src/testing/setup.d.ts.map +0 -1
  301. package/src/packlets/services/client-rpc-server.ts +0 -111
  302. package/src/packlets/services/service-registry.test.ts +0 -78
  303. package/src/packlets/services/service-registry.ts +0 -36
  304. package/src/testing/setup.ts +0 -11
@@ -0,0 +1,570 @@
1
+ import { I as DataSpaceManager, J as MOCK_AUTH_PROVIDER, W as SpaceManager, X as SpaceProtocol, Y as MOCK_AUTH_VERIFIER, dt as SpaceInvitationProtocol, lt as MetadataStore, n as ClientServicesHost, ot as SqliteMetadataStore, pt as InvitationsHandler, rt as InvitationsManager, s as SqliteStorage, tt as valueEncoding } from "./chunk-client-services-layer.mjs";
2
+ import * as Effect from "effect/Effect";
3
+ import { Trigger } from "@dxos/async";
4
+ import { Context } from "@dxos/context";
5
+ import { FeedFactory, FeedStore } from "@dxos/feed-store";
6
+ import { PublicKey } from "@dxos/keys";
7
+ import { log } from "@dxos/log";
8
+ import { ComplexMap } from "@dxos/util";
9
+ import { CredentialGenerator, createCredential, createCredentialSignerWithChain } from "@dxos/credentials";
10
+ import { invariant } from "@dxos/invariant";
11
+ import { Invitation } from "@dxos/protocols/proto/dxos/client/services";
12
+ import { schema } from "@dxos/protocols/proto";
13
+ import { InvitationEncoder } from "@dxos/client-protocol";
14
+ import { AdmittedFeed } from "@dxos/protocols/proto/dxos/halo/credentials";
15
+ import * as Layer from "effect/Layer";
16
+ import { EchoHost, MeshEchoReplicator } from "@dxos/echo-host";
17
+ import { SqliteKeyring } from "@dxos/keyring";
18
+ import { Gossip, Presence } from "@dxos/teleport-extension-gossip";
19
+ import { MemoryTransportFactory, SwarmNetworkManager } from "@dxos/network-manager";
20
+ import { RuntimeProvider } from "@dxos/effect";
21
+ import { failUndefined } from "@dxos/debug";
22
+ import { BlobStore, SqliteBlobStore } from "@dxos/teleport-extension-object-sync";
23
+ import { MemorySignalManager, MemorySignalManagerContext } from "@dxos/messaging";
24
+ import * as ManagedRuntime from "effect/ManagedRuntime";
25
+ import { Config } from "@dxos/config";
26
+ import { StorageType, createStorage } from "@dxos/random-access-storage";
27
+ import * as Reactivity from "@effect/experimental/Reactivity";
28
+ import * as SqlTransaction from "@dxos/sql-sqlite/SqlTransaction";
29
+ import { TestBuilder as TestBuilder$1 } from "@dxos/feed-store/testing";
30
+ import { layerMemory } from "@dxos/sql-sqlite/platform";
31
+ //#region src/packlets/pipeline/testing/test-feed-builder.ts
32
+ /**
33
+ * Builder with default encoder and generator.
34
+ */
35
+ var TestFeedBuilder = class extends TestBuilder$1 {
36
+ constructor() {
37
+ super({ valueEncoding });
38
+ }
39
+ };
40
+ //#endregion
41
+ //#region src/packlets/space/testing/change-metadata.ts
42
+ var __dxlog_file$3 = "/__w/dxos/dxos/packages/sdk/client-services/src/packlets/space/testing/change-metadata.ts";
43
+ var EchoMetadata = schema.getCodecForType("dxos.echo.metadata.EchoMetadata");
44
+ /**
45
+ * This function will change the storage version in the metadata.
46
+ * This will break your storage and make it unusable.
47
+ * Use this only for testing purposes.
48
+ */
49
+ var changeStorageVersionInMetadata = async (storage, version) => {
50
+ log("Changing storage version in metadata. USE ONLY FOR TESTING.", void 0, {
51
+ "~LogMeta": "~LogMeta",
52
+ F: __dxlog_file$3,
53
+ L: 19,
54
+ S: void 0
55
+ });
56
+ const metadata = new MetadataStore(storage.createDirectory("metadata"));
57
+ await metadata.load();
58
+ const echoMetadata = metadata.metadata;
59
+ echoMetadata.version = version;
60
+ const file = metadata._directory.getOrCreateFile("EchoMetadata");
61
+ await metadata._writeFile(file, EchoMetadata, echoMetadata);
62
+ await metadata._directory.flush();
63
+ };
64
+ //#endregion
65
+ //#region src/packlets/space/testing/test-agent-builder.ts
66
+ var __dxlog_file$2 = "/__w/dxos/dxos/packages/sdk/client-services/src/packlets/space/testing/test-agent-builder.ts";
67
+ var MemoryNetworkManagerProvider = (signalContext) => () => new SwarmNetworkManager({
68
+ signalManager: new MemorySignalManager(signalContext),
69
+ transportFactory: MemoryTransportFactory
70
+ });
71
+ /**
72
+ * Factory for test agents.
73
+ */
74
+ var TestAgentBuilder = class {
75
+ _agents = new ComplexMap(PublicKey.hash);
76
+ _storage;
77
+ _networkManagerProvider;
78
+ constructor({ storage, networkManagerProvider } = {}) {
79
+ this._storage = storage ?? createStorage({ type: StorageType.RAM });
80
+ this._networkManagerProvider = networkManagerProvider ?? MemoryNetworkManagerProvider(new MemorySignalManagerContext());
81
+ }
82
+ async close() {
83
+ return Promise.all(this.agents.map((agent) => agent.close()));
84
+ }
85
+ get agents() {
86
+ return Array.from(this._agents.values());
87
+ }
88
+ getAgent(deviceKey) {
89
+ return this._agents.get(deviceKey);
90
+ }
91
+ async createPeer() {
92
+ const feedBuilder = new TestFeedBuilder().setStorage(this._storage, `agent-${this._agents.size}`);
93
+ const identityKey = await feedBuilder.keyring.createKey();
94
+ const deviceKey = await feedBuilder.keyring.createKey();
95
+ const agent = new TestAgent(this._networkManagerProvider, feedBuilder, identityKey, deviceKey);
96
+ this._agents.set(deviceKey, agent);
97
+ return agent;
98
+ }
99
+ };
100
+ /**
101
+ * Test agent that enables the creation and replication of multiple spaces.
102
+ */
103
+ var TestAgent = class {
104
+ _networkManagerProvider;
105
+ _feedBuilder;
106
+ identityKey;
107
+ deviceKey;
108
+ _spaces = new ComplexMap(PublicKey.hash);
109
+ storage;
110
+ keyring;
111
+ feedStore;
112
+ _metadataStore;
113
+ get metadataStore() {
114
+ return this._metadataStore ??= new MetadataStore(this.storage.createDirectory("metadata"));
115
+ }
116
+ _blobStore;
117
+ get blobStore() {
118
+ return this._blobStore ??= new BlobStore(this.storage.createDirectory("blobs"));
119
+ }
120
+ constructor(_networkManagerProvider, _feedBuilder, identityKey, deviceKey) {
121
+ this._networkManagerProvider = _networkManagerProvider;
122
+ this._feedBuilder = _feedBuilder;
123
+ this.identityKey = identityKey;
124
+ this.deviceKey = deviceKey;
125
+ this.storage = this._feedBuilder.storage;
126
+ this.keyring = this._feedBuilder.keyring;
127
+ this.feedStore = this._feedBuilder.createFeedStore();
128
+ }
129
+ async close() {
130
+ return Promise.all([...this.spaces.map((space) => space.close())]);
131
+ }
132
+ get spaces() {
133
+ return Array.from(this._spaces.values());
134
+ }
135
+ getSpace(spaceKey) {
136
+ return this._spaces.get(spaceKey);
137
+ }
138
+ _networkManager;
139
+ get networkManager() {
140
+ if (this._networkManager) return this._networkManager;
141
+ this._networkManager = this._networkManagerProvider();
142
+ this._networkManager.setPeerInfo({
143
+ peerKey: this.deviceKey.toHex(),
144
+ identityKey: this.identityKey.toHex()
145
+ });
146
+ return this._networkManager;
147
+ }
148
+ _spaceManager;
149
+ get spaceManager() {
150
+ return this._spaceManager ??= new SpaceManager({
151
+ feedStore: this.feedStore,
152
+ networkManager: this.networkManager,
153
+ metadataStore: this.metadataStore,
154
+ blobStore: this.blobStore
155
+ });
156
+ }
157
+ async createSpace(identityKey = this.identityKey, spaceKey, genesisKey, dataKey, saveMetadata = false) {
158
+ if (!spaceKey) {
159
+ saveMetadata = true;
160
+ spaceKey = await this.keyring.createKey();
161
+ }
162
+ if (!genesisKey) genesisKey = await this.keyring.createKey();
163
+ const controlFeed = await this.feedStore.openFeed(genesisKey, { writable: true });
164
+ const dataFeed = await this.feedStore.openFeed(dataKey ?? await this.keyring.createKey(), {
165
+ writable: true,
166
+ sparse: true
167
+ });
168
+ const metadata = {
169
+ key: spaceKey,
170
+ genesisFeedKey: genesisKey,
171
+ controlFeedKey: controlFeed.key,
172
+ dataFeedKey: dataFeed.key
173
+ };
174
+ if (saveMetadata) await this.metadataStore.addSpace(metadata);
175
+ await this.spaceManager.open();
176
+ const space = await this.spaceManager.constructSpace({
177
+ metadata,
178
+ swarmIdentity: {
179
+ identityKey: this.identityKey,
180
+ peerKey: this.deviceKey,
181
+ credentialProvider: MOCK_AUTH_PROVIDER,
182
+ credentialAuthenticator: MOCK_AUTH_VERIFIER
183
+ },
184
+ memberKey: identityKey,
185
+ onAuthorizedConnection: (session) => {
186
+ session.addExtension("dxos.mesh.teleport.gossip", this.createGossip().createExtension({ remotePeerId: session.remotePeerId }));
187
+ },
188
+ onDelegatedInvitationStatusChange: async () => {},
189
+ onMemberRolesChanged: async () => {}
190
+ });
191
+ await space.setControlFeed(controlFeed);
192
+ await space.setDataFeed(dataFeed);
193
+ await space.open(new Context(void 0, {
194
+ "~LogMeta": "~LogMeta",
195
+ F: __dxlog_file$2,
196
+ L: 197
197
+ }));
198
+ this._spaces.set(spaceKey, space);
199
+ return space;
200
+ }
201
+ createSpaceProtocol(topic, gossip) {
202
+ return new SpaceProtocol({
203
+ topic,
204
+ swarmIdentity: {
205
+ identityKey: this.identityKey,
206
+ peerKey: this.deviceKey,
207
+ credentialProvider: MOCK_AUTH_PROVIDER,
208
+ credentialAuthenticator: MOCK_AUTH_VERIFIER
209
+ },
210
+ networkManager: this.networkManager,
211
+ blobStore: this.blobStore,
212
+ onSessionAuth: (session) => {
213
+ session.addExtension("dxos.mesh.teleport.gossip", (gossip ?? this.createGossip()).createExtension({ remotePeerId: session.remotePeerId }));
214
+ }
215
+ });
216
+ }
217
+ createGossip() {
218
+ return new Gossip({ localPeerId: this.deviceKey });
219
+ }
220
+ createPresence(gossip) {
221
+ return new Presence({
222
+ announceInterval: 30,
223
+ offlineTimeout: 200,
224
+ identityKey: this.identityKey,
225
+ gossip: gossip ?? this.createGossip()
226
+ });
227
+ }
228
+ async spaceGenesis(space) {
229
+ const generator = new CredentialGenerator(this.keyring, this.identityKey, this.deviceKey);
230
+ const credentials = [
231
+ ...await generator.createSpaceGenesis(space.key, space.controlFeedKey),
232
+ await generator.createFeedAdmission(space.key, space.dataFeedKey, AdmittedFeed.Designation.DATA),
233
+ await generator.createEpochCredential(space.key)
234
+ ];
235
+ for (const credential of credentials) await space.controlPipeline.writer.write({ credential: { credential } });
236
+ }
237
+ };
238
+ //#endregion
239
+ //#region src/packlets/testing/credential-utils.ts
240
+ var createMockCredential = async ({ signer, issuer }) => createCredential({
241
+ signer,
242
+ issuer,
243
+ subject: new PublicKey(Buffer.from("test")),
244
+ assertion: {
245
+ "@type": "example.testing.rpc.MessageWithAny",
246
+ "payload": {
247
+ "@type": "google.protobuf.Any",
248
+ "value": Buffer.from("test")
249
+ }
250
+ }
251
+ });
252
+ //#endregion
253
+ //#region src/packlets/testing/invitation-utils.ts
254
+ var __dxlog_file$1 = "/__w/dxos/dxos/packages/sdk/client-services/src/packlets/testing/invitation-utils.ts";
255
+ /**
256
+ * Strip secrets from invitation before giving it to the peer.
257
+ */
258
+ var sanitizeInvitation = (invitation) => {
259
+ return InvitationEncoder.decode(InvitationEncoder.encode(invitation));
260
+ };
261
+ /**
262
+ *
263
+ */
264
+ var performInvitation = ({ host, guest, guestDeviceProfile, options, hooks, codeInputDelay }) => {
265
+ let guestError = false;
266
+ let guestConnected = false;
267
+ let wereConnected = false;
268
+ const hostComplete = new Trigger();
269
+ const guestComplete = new Trigger();
270
+ const authCode = new Trigger();
271
+ createInvitation(host, options).then((hostObservable) => {
272
+ hostObservable.subscribe(async (hostInvitation) => {
273
+ switch (hostInvitation.state) {
274
+ case Invitation.State.CONNECTING: {
275
+ if (guestConnected) {
276
+ if (wereConnected) hostComplete.wake({ invitation: hostInvitation });
277
+ break;
278
+ }
279
+ guestConnected = true;
280
+ if (hooks?.host?.onConnecting?.(hostObservable)) break;
281
+ const guestObservable = acceptInvitation(guest, hostInvitation, guestDeviceProfile);
282
+ guestObservable.subscribe(async (guestInvitation) => {
283
+ switch (guestInvitation.state) {
284
+ case Invitation.State.CONNECTING:
285
+ if (hooks?.guest?.onConnecting?.(guestObservable)) break;
286
+ invariant(hostInvitation.swarmKey.equals(guestInvitation.swarmKey), void 0, {
287
+ "~LogMeta": "~LogMeta",
288
+ F: __dxlog_file$1,
289
+ L: 99,
290
+ S: void 0,
291
+ A: ["hostInvitation.swarmKey!.equals(guestInvitation.swarmKey!)", ""]
292
+ });
293
+ break;
294
+ case Invitation.State.CONNECTED:
295
+ hooks?.guest?.onConnected?.(guestObservable);
296
+ break;
297
+ case Invitation.State.READY_FOR_AUTHENTICATION: {
298
+ if (hooks?.guest?.onReady?.(guestObservable)) break;
299
+ const code = await authCode.wait();
300
+ if (codeInputDelay == null) await guestObservable.authenticate(code);
301
+ else setTimeout(async () => {
302
+ if (!guestError) await guestObservable.authenticate(code);
303
+ }, codeInputDelay);
304
+ break;
305
+ }
306
+ case Invitation.State.AUTHENTICATING:
307
+ hooks?.guest?.onAuthenticating?.(guestObservable);
308
+ break;
309
+ case Invitation.State.SUCCESS:
310
+ if (hooks?.guest?.onSuccess?.(guestObservable)) break;
311
+ guestComplete.wake({ invitation: guestInvitation });
312
+ break;
313
+ case Invitation.State.CANCELLED:
314
+ if (hooks?.guest?.onCancelled?.(guestObservable)) break;
315
+ guestComplete.wake({ invitation: guestInvitation });
316
+ break;
317
+ case Invitation.State.TIMEOUT:
318
+ if (hooks?.guest?.onTimeout?.(guestObservable)) return;
319
+ guestComplete.wake({ invitation: guestInvitation });
320
+ }
321
+ }, (error) => {
322
+ guestError = true;
323
+ if (hooks?.guest?.onError?.(guestObservable)) return;
324
+ guestComplete.wake({ error });
325
+ });
326
+ break;
327
+ }
328
+ case Invitation.State.CONNECTED:
329
+ wereConnected = true;
330
+ hooks?.host?.onConnected?.(hostObservable);
331
+ break;
332
+ case Invitation.State.READY_FOR_AUTHENTICATION:
333
+ if (hooks?.host?.onReady?.(hostObservable)) break;
334
+ if (hostInvitation.authCode) authCode.wake(hostInvitation.authCode);
335
+ break;
336
+ case Invitation.State.AUTHENTICATING:
337
+ hooks?.host?.onAuthenticating?.(hostObservable);
338
+ break;
339
+ case Invitation.State.SUCCESS:
340
+ if (hooks?.host?.onSuccess?.(hostObservable)) break;
341
+ hostComplete.wake({ invitation: hostInvitation });
342
+ break;
343
+ case Invitation.State.CANCELLED:
344
+ if (hooks?.host?.onCancelled?.(hostObservable)) break;
345
+ hostComplete.wake({ invitation: hostInvitation });
346
+ break;
347
+ case Invitation.State.TIMEOUT:
348
+ if (hooks?.host?.onTimeout?.(hostObservable)) break;
349
+ hostComplete.wake({ invitation: hostInvitation });
350
+ break;
351
+ }
352
+ }, (error) => {
353
+ if (hooks?.host?.onError?.(hostObservable)) return;
354
+ hostComplete.wake({ error });
355
+ });
356
+ });
357
+ return [hostComplete.wait(), guestComplete.wait()];
358
+ };
359
+ var createInvitation = async (host, options) => {
360
+ options ??= {
361
+ authMethod: Invitation.AuthMethod.NONE,
362
+ ...options ?? {}
363
+ };
364
+ if (host instanceof ClientServicesHost) return host.invitationsManager.createInvitation(new Context(void 0, {
365
+ "~LogMeta": "~LogMeta",
366
+ F: __dxlog_file$1,
367
+ L: 233
368
+ }), {
369
+ kind: Invitation.Kind.SPACE,
370
+ ...options
371
+ });
372
+ return host.share(options);
373
+ };
374
+ var acceptInvitation = (guest, invitation, guestDeviceProfile) => {
375
+ invitation = sanitizeInvitation(invitation);
376
+ if (guest instanceof ClientServicesHost) return guest.invitationsManager.acceptInvitation(new Context(void 0, {
377
+ "~LogMeta": "~LogMeta",
378
+ F: __dxlog_file$1,
379
+ L: 250
380
+ }), {
381
+ invitation,
382
+ deviceProfile: guestDeviceProfile
383
+ });
384
+ return guest.join(invitation, guestDeviceProfile);
385
+ };
386
+ //#endregion
387
+ //#region src/packlets/testing/test-builder.ts
388
+ var __dxlog_file = "/__w/dxos/dxos/packages/sdk/client-services/src/packlets/testing/test-builder.ts";
389
+ var createServiceHost = (config, signalManagerContext) => {
390
+ return new ClientServicesHost({
391
+ config,
392
+ signalManager: new MemorySignalManager(signalManagerContext),
393
+ transportFactory: MemoryTransportFactory,
394
+ runtime: ManagedRuntime.make(SqlTransaction.layer.pipe(Layer.provideMerge(layerMemory), Layer.provideMerge(Reactivity.layer)).pipe(Layer.orDie)).runtimeEffect
395
+ });
396
+ };
397
+ var createServiceContext = async ({ signalManagerFactory = async () => {
398
+ return new MemorySignalManager(new MemorySignalManagerContext());
399
+ }, runtimeProps } = {}) => {
400
+ const signalManager = await signalManagerFactory();
401
+ const runtime = ManagedRuntime.make(SqlTransaction.layer.pipe(Layer.provideMerge(layerMemory), Layer.provideMerge(Reactivity.layer)).pipe(Layer.orDie));
402
+ const host = new ClientServicesHost({
403
+ config: new Config(),
404
+ signalManager,
405
+ transportFactory: MemoryTransportFactory,
406
+ runtime: runtime.runtimeEffect,
407
+ runtimeProps: {
408
+ invitationConnectionDefaultProps: { teleport: { controlHeartbeatInterval: 200 } },
409
+ ...runtimeProps
410
+ }
411
+ });
412
+ const closeHost = host.close.bind(host);
413
+ host.close = async (ctx = new Context(void 0, {
414
+ "~LogMeta": "~LogMeta",
415
+ F: __dxlog_file,
416
+ L: 83
417
+ })) => {
418
+ await closeHost(ctx);
419
+ await runtime.dispose();
420
+ };
421
+ return host;
422
+ };
423
+ var createPeers = async (numPeers, signalManagerFactory) => {
424
+ if (!signalManagerFactory) {
425
+ const signalContext = new MemorySignalManagerContext();
426
+ signalManagerFactory = async () => new MemorySignalManager(signalContext);
427
+ }
428
+ return await Promise.all(Array.from(Array(numPeers)).map(async () => {
429
+ const peer = await createServiceContext({ signalManagerFactory });
430
+ await peer.open(new Context(void 0, {
431
+ "~LogMeta": "~LogMeta",
432
+ F: __dxlog_file,
433
+ L: 99
434
+ }));
435
+ return peer;
436
+ }));
437
+ };
438
+ var createIdentity = async (peer) => {
439
+ await peer.createIdentity();
440
+ return peer;
441
+ };
442
+ var TestBuilder = class {
443
+ signalContext = new MemorySignalManagerContext();
444
+ _ctx = new Context(void 0, {
445
+ "~LogMeta": "~LogMeta",
446
+ F: __dxlog_file,
447
+ L: 112
448
+ });
449
+ createPeer(peerOptions) {
450
+ const peer = new TestPeer(this.signalContext, peerOptions);
451
+ this._ctx.onDispose(async () => peer.destroy());
452
+ return peer;
453
+ }
454
+ async destroy() {
455
+ await this._ctx.dispose();
456
+ }
457
+ };
458
+ var TestPeer = class {
459
+ _signalContext;
460
+ _opts;
461
+ _props = {};
462
+ _runtime = ManagedRuntime.make(SqlTransaction.layer.pipe(Layer.provideMerge(layerMemory), Layer.provideMerge(Reactivity.layer)).pipe(Layer.orDie));
463
+ _feedStorage = new SqliteStorage({ runtime: this._runtime.runtimeEffect });
464
+ constructor(_signalContext, _opts = { dataStore: StorageType.RAM }) {
465
+ this._signalContext = _signalContext;
466
+ this._opts = _opts;
467
+ }
468
+ get props() {
469
+ return this._props;
470
+ }
471
+ get keyring() {
472
+ return this._props.keyring ??= new SqliteKeyring({ runtime: this._runtime.runtimeEffect });
473
+ }
474
+ get feedStore() {
475
+ return this._props.feedStore ??= new FeedStore({ factory: new FeedFactory({
476
+ root: this._feedStorage.createDirectory("feeds"),
477
+ signer: this.keyring,
478
+ hypercore: { valueEncoding }
479
+ }) });
480
+ }
481
+ get metadataStore() {
482
+ return this._props.metadataStore ??= new SqliteMetadataStore({ runtime: this._runtime.runtimeEffect });
483
+ }
484
+ get blobStore() {
485
+ return this._props.blobStore ??= new SqliteBlobStore({ runtime: this._runtime.runtimeEffect });
486
+ }
487
+ get networkManager() {
488
+ return this._props.networkManager ??= new SwarmNetworkManager({
489
+ signalManager: new MemorySignalManager(this._signalContext),
490
+ transportFactory: MemoryTransportFactory
491
+ });
492
+ }
493
+ get spaceManager() {
494
+ return this._props.spaceManager ??= new SpaceManager({
495
+ feedStore: this.feedStore,
496
+ networkManager: this.networkManager,
497
+ metadataStore: this.metadataStore,
498
+ blobStore: this.blobStore
499
+ });
500
+ }
501
+ get identity() {
502
+ return this._props.signingContext ?? failUndefined();
503
+ }
504
+ get echoHost() {
505
+ return this._props.echoHost ??= new EchoHost({ runtime: this._runtime.runtimeEffect });
506
+ }
507
+ get meshEchoReplicator() {
508
+ return this._props.meshEchoReplicator ??= new MeshEchoReplicator();
509
+ }
510
+ get dataSpaceManager() {
511
+ return this._props.dataSpaceManager ??= new DataSpaceManager({
512
+ spaceManager: this.spaceManager,
513
+ metadataStore: this.metadataStore,
514
+ keyring: this.keyring,
515
+ signingContextProvider: () => this.identity,
516
+ feedStore: this.feedStore,
517
+ echoHost: this.echoHost,
518
+ invitationsManager: this.invitationsManager,
519
+ edgeConnection: void 0,
520
+ meshReplicator: this.meshEchoReplicator,
521
+ echoEdgeReplicator: void 0,
522
+ runtimeProps: this._opts.dataSpaceProps
523
+ });
524
+ }
525
+ get invitationsManager() {
526
+ if (!this._props.invitationsManager) {
527
+ const manager = new InvitationsManager(new InvitationsHandler(this.networkManager), this.metadataStore);
528
+ manager.setInvitationHandlerFactory((invitation) => {
529
+ if (invitation.kind === Invitation.Kind.SPACE) return new SpaceInvitationProtocol(this.dataSpaceManager, this.identity, this.keyring, invitation.spaceKey);
530
+ else throw new Error("not implemented");
531
+ });
532
+ this._props.invitationsManager = manager;
533
+ }
534
+ return this._props.invitationsManager;
535
+ }
536
+ async createIdentity() {
537
+ await this.migrate();
538
+ this._props.signingContext ??= await createSigningContext(this.keyring);
539
+ this.networkManager.setPeerInfo({
540
+ identityKey: this._props.signingContext.identityKey.toHex(),
541
+ peerKey: this._props.signingContext.deviceKey.toHex()
542
+ });
543
+ }
544
+ async migrate() {
545
+ await RuntimeProvider.runPromise(this._runtime.runtimeEffect)(Effect.all([
546
+ this.metadataStore.migrate,
547
+ this.blobStore.migrate,
548
+ this.keyring.migrate,
549
+ this._feedStorage.migrate
550
+ ]));
551
+ }
552
+ async destroy() {
553
+ await this._runtime.dispose();
554
+ }
555
+ };
556
+ var createSigningContext = async (keyring) => {
557
+ const identityKey = await keyring.createKey();
558
+ const deviceKey = await keyring.createKey();
559
+ return {
560
+ identityKey,
561
+ deviceKey,
562
+ credentialSigner: createCredentialSignerWithChain(keyring, { credential: await new CredentialGenerator(keyring, identityKey, deviceKey).createDeviceAuthorization(deviceKey) }, deviceKey),
563
+ recordCredential: async () => {},
564
+ getProfile: () => void 0
565
+ };
566
+ };
567
+ //#endregion
568
+ export { MemoryNetworkManagerProvider, TestAgent, TestAgentBuilder, TestBuilder, TestFeedBuilder, TestPeer, acceptInvitation, changeStorageVersionInMetadata, createIdentity, createInvitation, createMockCredential, createPeers, createServiceContext, createServiceHost, createSigningContext, performInvitation, sanitizeInvitation };
569
+
570
+ //# sourceMappingURL=testing.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.mjs","names":[],"sources":["../../src/packlets/pipeline/testing/test-feed-builder.ts","../../src/packlets/space/testing/change-metadata.ts","../../src/packlets/space/testing/test-agent-builder.ts","../../src/packlets/testing/credential-utils.ts","../../src/packlets/testing/invitation-utils.ts","../../src/packlets/testing/test-builder.ts"],"sourcesContent":["//\n// Copyright 2022 DXOS.org\n//\n\nimport { TestBuilder } from '@dxos/feed-store/testing';\nimport type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\n\nimport { valueEncoding } from '../codec';\n\n/**\n * Builder with default encoder and generator.\n */\nexport class TestFeedBuilder extends TestBuilder<FeedMessage> {\n constructor() {\n super({\n valueEncoding,\n });\n }\n}\n","//\n// Copyright 2023 DXOS.org\n//\n\nimport { log } from '@dxos/log';\nimport { schema } from '@dxos/protocols/proto';\nimport type { Storage } from '@dxos/random-access-storage';\n\nimport { MetadataStore } from '../../metadata';\n\nconst EchoMetadata = schema.getCodecForType('dxos.echo.metadata.EchoMetadata');\n\n/**\n * This function will change the storage version in the metadata.\n * This will break your storage and make it unusable.\n * Use this only for testing purposes.\n */\nexport const changeStorageVersionInMetadata = async (storage: Storage, version: number) => {\n log('Changing storage version in metadata. USE ONLY FOR TESTING.');\n const metadata = new MetadataStore(storage.createDirectory('metadata'));\n await metadata.load();\n const echoMetadata = metadata.metadata;\n echoMetadata.version = version;\n const file = metadata._directory.getOrCreateFile('EchoMetadata');\n await metadata._writeFile(file, EchoMetadata, echoMetadata);\n await metadata._directory.flush();\n};\n","//\n// Copyright 2022 DXOS.org\n//\n\nimport { Context } from '@dxos/context';\nimport { CredentialGenerator } from '@dxos/credentials';\nimport { type FeedStore } from '@dxos/feed-store';\nimport { type Keyring } from '@dxos/keyring';\nimport { PublicKey } from '@dxos/keys';\nimport { MemorySignalManager, MemorySignalManagerContext } from '@dxos/messaging';\nimport { MemoryTransportFactory, SwarmNetworkManager } from '@dxos/network-manager';\nimport { type FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { type SpaceMetadata } from '@dxos/protocols/proto/dxos/echo/metadata';\nimport { AdmittedFeed } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { type Storage, StorageType, createStorage } from '@dxos/random-access-storage';\nimport { Gossip, Presence } from '@dxos/teleport-extension-gossip';\nimport { BlobStore } from '@dxos/teleport-extension-object-sync';\nimport { ComplexMap } from '@dxos/util';\n\nimport { MetadataStore } from '../../metadata';\nimport { TestFeedBuilder } from '../../pipeline/testing';\nimport { MOCK_AUTH_PROVIDER, MOCK_AUTH_VERIFIER, type Space, SpaceManager, SpaceProtocol } from '../index';\n\nexport type NetworkManagerProvider = () => SwarmNetworkManager;\n\nexport const MemoryNetworkManagerProvider =\n (signalContext: MemorySignalManagerContext): NetworkManagerProvider =>\n () =>\n new SwarmNetworkManager({\n signalManager: new MemorySignalManager(signalContext),\n transportFactory: MemoryTransportFactory,\n });\n\nexport type TestAgentBuilderOptions = {\n storage?: Storage;\n networkManagerProvider?: NetworkManagerProvider;\n};\n\n/**\n * Factory for test agents.\n */\nexport class TestAgentBuilder {\n private readonly _agents = new ComplexMap<PublicKey, TestAgent>(PublicKey.hash);\n private readonly _storage: Storage;\n private readonly _networkManagerProvider: NetworkManagerProvider;\n\n constructor({ storage, networkManagerProvider }: TestAgentBuilderOptions = {}) {\n this._storage = storage ?? createStorage({ type: StorageType.RAM });\n this._networkManagerProvider =\n networkManagerProvider ?? MemoryNetworkManagerProvider(new MemorySignalManagerContext());\n }\n\n async close() {\n return Promise.all(this.agents.map((agent) => agent.close()));\n }\n\n get agents() {\n return Array.from(this._agents.values());\n }\n\n getAgent(deviceKey: PublicKey): TestAgent | undefined {\n return this._agents.get(deviceKey);\n }\n\n async createPeer(): Promise<TestAgent> {\n // prettier-ignore\n const feedBuilder = new TestFeedBuilder()\n .setStorage(this._storage, `agent-${this._agents.size}`);\n\n const identityKey = await feedBuilder.keyring.createKey();\n const deviceKey = await feedBuilder.keyring.createKey();\n\n const agent = new TestAgent(this._networkManagerProvider, feedBuilder, identityKey, deviceKey);\n this._agents.set(deviceKey, agent);\n return agent;\n }\n}\n\n/**\n * Test agent that enables the creation and replication of multiple spaces.\n */\nexport class TestAgent {\n private readonly _spaces = new ComplexMap<PublicKey, Space>(PublicKey.hash);\n\n public readonly storage: Storage;\n public readonly keyring: Keyring;\n public readonly feedStore: FeedStore<FeedMessage>;\n\n private _metadataStore?: MetadataStore;\n get metadataStore() {\n return (this._metadataStore ??= new MetadataStore(this.storage.createDirectory('metadata')));\n }\n\n private _blobStore?: BlobStore;\n get blobStore() {\n return (this._blobStore ??= new BlobStore(this.storage.createDirectory('blobs')));\n }\n\n constructor(\n private readonly _networkManagerProvider: NetworkManagerProvider,\n private readonly _feedBuilder: TestFeedBuilder,\n public readonly identityKey: PublicKey,\n public readonly deviceKey: PublicKey,\n ) {\n this.storage = this._feedBuilder.storage;\n this.keyring = this._feedBuilder.keyring;\n this.feedStore = this._feedBuilder.createFeedStore();\n }\n\n async close() {\n return Promise.all([...this.spaces.map((space) => space.close())]);\n }\n\n get spaces() {\n return Array.from(this._spaces.values());\n }\n\n getSpace(spaceKey: PublicKey): Space | undefined {\n return this._spaces.get(spaceKey);\n }\n\n private _networkManager?: SwarmNetworkManager;\n get networkManager() {\n if (this._networkManager) {\n return this._networkManager;\n }\n\n this._networkManager = this._networkManagerProvider();\n this._networkManager.setPeerInfo({ peerKey: this.deviceKey.toHex(), identityKey: this.identityKey.toHex() });\n\n return this._networkManager;\n }\n\n private _spaceManager?: SpaceManager;\n get spaceManager() {\n return (this._spaceManager ??= new SpaceManager({\n feedStore: this.feedStore,\n networkManager: this.networkManager,\n metadataStore: this.metadataStore,\n blobStore: this.blobStore,\n }));\n }\n\n async createSpace(\n identityKey: PublicKey = this.identityKey,\n spaceKey?: PublicKey,\n genesisKey?: PublicKey,\n dataKey?: PublicKey,\n saveMetadata = false,\n ): Promise<Space> {\n if (!spaceKey) {\n saveMetadata = true;\n spaceKey = await this.keyring.createKey();\n }\n if (!genesisKey) {\n genesisKey = await this.keyring.createKey();\n }\n\n const controlFeed = await this.feedStore.openFeed(genesisKey, { writable: true });\n const dataFeed = await this.feedStore.openFeed(dataKey ?? (await this.keyring.createKey()), {\n writable: true,\n sparse: true,\n });\n\n const metadata: SpaceMetadata = {\n key: spaceKey,\n genesisFeedKey: genesisKey,\n controlFeedKey: controlFeed.key,\n dataFeedKey: dataFeed.key,\n };\n if (saveMetadata) {\n await this.metadataStore.addSpace(metadata);\n }\n\n await this.spaceManager.open();\n const space = await this.spaceManager.constructSpace({\n metadata,\n swarmIdentity: {\n identityKey: this.identityKey,\n peerKey: this.deviceKey,\n credentialProvider: MOCK_AUTH_PROVIDER,\n credentialAuthenticator: MOCK_AUTH_VERIFIER,\n },\n memberKey: identityKey,\n onAuthorizedConnection: (session) => {\n session.addExtension(\n 'dxos.mesh.teleport.gossip',\n this.createGossip().createExtension({ remotePeerId: session.remotePeerId }),\n );\n },\n onDelegatedInvitationStatusChange: async () => {},\n onMemberRolesChanged: async () => {},\n });\n await space.setControlFeed(controlFeed);\n await space.setDataFeed(dataFeed);\n\n await space.open(new Context());\n\n this._spaces.set(spaceKey, space);\n return space;\n }\n\n createSpaceProtocol(topic: PublicKey, gossip?: Gossip): SpaceProtocol {\n return new SpaceProtocol({\n topic,\n swarmIdentity: {\n identityKey: this.identityKey,\n peerKey: this.deviceKey,\n credentialProvider: MOCK_AUTH_PROVIDER,\n credentialAuthenticator: MOCK_AUTH_VERIFIER,\n },\n networkManager: this.networkManager,\n blobStore: this.blobStore,\n onSessionAuth: (session) => {\n session.addExtension(\n 'dxos.mesh.teleport.gossip',\n (gossip ?? this.createGossip()).createExtension({ remotePeerId: session.remotePeerId }),\n );\n },\n });\n }\n\n createGossip(): Gossip {\n return new Gossip({\n localPeerId: this.deviceKey,\n });\n }\n\n createPresence(gossip?: Gossip): Presence {\n return new Presence({\n announceInterval: 30,\n offlineTimeout: 200,\n identityKey: this.identityKey,\n gossip: gossip ?? this.createGossip(),\n });\n }\n\n async spaceGenesis(space: Space): Promise<void> {\n const generator = new CredentialGenerator(this.keyring, this.identityKey, this.deviceKey);\n const credentials = [\n ...(await generator.createSpaceGenesis(space.key, space.controlFeedKey!)),\n await generator.createFeedAdmission(space.key, space.dataFeedKey!, AdmittedFeed.Designation.DATA),\n await generator.createEpochCredential(space.key),\n ];\n\n for (const credential of credentials) {\n await space.controlPipeline.writer.write({\n credential: { credential },\n });\n }\n }\n}\n","//\n// Copyright 2023 DXOS.org\n//\n\nimport { createCredential } from '@dxos/credentials';\nimport { type Signer } from '@dxos/crypto';\nimport { PublicKey } from '@dxos/keys';\nimport { type Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\n\nexport const createMockCredential = async ({\n signer,\n issuer,\n}: {\n signer: Signer;\n issuer: PublicKey;\n}): Promise<Credential> =>\n createCredential({\n signer,\n issuer,\n subject: new PublicKey(Buffer.from('test')),\n assertion: {\n '@type': 'example.testing.rpc.MessageWithAny',\n 'payload': {\n '@type': 'google.protobuf.Any',\n 'value': Buffer.from('test'),\n },\n },\n });\n","//\n// Copyright 2023 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\nimport { type AuthenticatingInvitation, type CancellableInvitation, InvitationEncoder } from '@dxos/client-protocol';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { Invitation } from '@dxos/protocols/proto/dxos/client/services';\nimport { type DeviceProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';\n\nimport { ClientServicesHost, type ServiceContext } from '../services';\n\n/**\n * Strip secrets from invitation before giving it to the peer.\n */\nexport const sanitizeInvitation = (invitation: Invitation): Invitation => {\n return InvitationEncoder.decode(InvitationEncoder.encode(invitation));\n};\n\nexport type InvitationHost = {\n share(options?: Partial<Invitation>): CancellableInvitation;\n};\n\nexport type InvitationGuest = {\n join(invitation: Invitation | string, deviceProfile?: DeviceProfileDocument): AuthenticatingInvitation;\n};\n\nexport type PerformInvitationCallbacks<T> = {\n onConnecting?: (value: T) => boolean | void;\n onConnected?: (value: T) => boolean | void;\n onReady?: (value: T) => boolean | void;\n onAuthenticating?: (value: T) => boolean | void;\n onSuccess?: (value: T) => boolean | void;\n onCancelled?: (value: T) => boolean | void;\n onTimeout?: (value: T) => boolean | void;\n onError?: (value: T) => boolean | void;\n};\n\nexport type PerformInvitationProps = {\n host: ServiceContext | InvitationHost;\n guest: ServiceContext | InvitationGuest;\n guestDeviceProfile?: DeviceProfileDocument;\n options?: Partial<Invitation>;\n hooks?: {\n host?: PerformInvitationCallbacks<CancellableInvitation>;\n guest?: PerformInvitationCallbacks<AuthenticatingInvitation>;\n };\n codeInputDelay?: number;\n};\n\nexport type Result = { invitation?: Invitation; error?: Error };\n\n// TODO(burdon): Make async.\n// TODO(burdon): Rename startInvitation.\n/**\n *\n */\nexport const performInvitation = ({\n host,\n guest,\n guestDeviceProfile,\n options,\n hooks,\n codeInputDelay,\n}: PerformInvitationProps): [Promise<Result>, Promise<Result>] => {\n let guestError = false;\n let guestConnected = false;\n let wereConnected = false;\n const hostComplete = new Trigger<Result>();\n const guestComplete = new Trigger<Result>();\n const authCode = new Trigger<string>();\n\n void createInvitation(host, options).then((hostObservable) => {\n hostObservable.subscribe(\n async (hostInvitation: Invitation) => {\n switch (hostInvitation.state) {\n case Invitation.State.CONNECTING: {\n if (guestConnected) {\n if (wereConnected) {\n hostComplete.wake({ invitation: hostInvitation });\n }\n break;\n }\n\n guestConnected = true;\n if (hooks?.host?.onConnecting?.(hostObservable)) {\n break;\n }\n\n const guestObservable = acceptInvitation(guest, hostInvitation, guestDeviceProfile);\n guestObservable.subscribe(\n async (guestInvitation: Invitation) => {\n switch (guestInvitation.state) {\n case Invitation.State.CONNECTING: {\n if (hooks?.guest?.onConnecting?.(guestObservable)) {\n break;\n }\n invariant(hostInvitation.swarmKey!.equals(guestInvitation.swarmKey!));\n break;\n }\n\n case Invitation.State.CONNECTED: {\n hooks?.guest?.onConnected?.(guestObservable);\n break;\n }\n\n case Invitation.State.READY_FOR_AUTHENTICATION: {\n if (hooks?.guest?.onReady?.(guestObservable)) {\n break;\n }\n const code = await authCode.wait();\n if (codeInputDelay == null) {\n await guestObservable.authenticate(code);\n } else {\n setTimeout(async () => {\n if (!guestError) {\n await guestObservable.authenticate(code);\n }\n }, codeInputDelay);\n }\n break;\n }\n\n case Invitation.State.AUTHENTICATING: {\n hooks?.guest?.onAuthenticating?.(guestObservable);\n break;\n }\n\n case Invitation.State.SUCCESS: {\n if (hooks?.guest?.onSuccess?.(guestObservable)) {\n break;\n }\n guestComplete.wake({ invitation: guestInvitation });\n break;\n }\n\n case Invitation.State.CANCELLED: {\n if (hooks?.guest?.onCancelled?.(guestObservable)) {\n break;\n }\n guestComplete.wake({ invitation: guestInvitation });\n break;\n }\n\n case Invitation.State.TIMEOUT: {\n if (hooks?.guest?.onTimeout?.(guestObservable)) {\n return;\n }\n guestComplete.wake({ invitation: guestInvitation });\n }\n }\n },\n (error: Error) => {\n guestError = true;\n if (hooks?.guest?.onError?.(guestObservable)) {\n return;\n }\n guestComplete.wake({ error });\n },\n );\n break;\n }\n\n case Invitation.State.CONNECTED: {\n wereConnected = true;\n hooks?.host?.onConnected?.(hostObservable);\n break;\n }\n\n case Invitation.State.READY_FOR_AUTHENTICATION: {\n if (hooks?.host?.onReady?.(hostObservable)) {\n break;\n }\n if (hostInvitation.authCode) {\n authCode.wake(hostInvitation.authCode);\n }\n break;\n }\n\n case Invitation.State.AUTHENTICATING: {\n hooks?.host?.onAuthenticating?.(hostObservable);\n break;\n }\n\n case Invitation.State.SUCCESS: {\n if (hooks?.host?.onSuccess?.(hostObservable)) {\n break;\n }\n hostComplete.wake({ invitation: hostInvitation });\n break;\n }\n\n case Invitation.State.CANCELLED: {\n if (hooks?.host?.onCancelled?.(hostObservable)) {\n break;\n }\n hostComplete.wake({ invitation: hostInvitation });\n break;\n }\n\n case Invitation.State.TIMEOUT: {\n if (hooks?.host?.onTimeout?.(hostObservable)) {\n break;\n }\n hostComplete.wake({ invitation: hostInvitation });\n break;\n }\n }\n },\n (error: Error) => {\n if (hooks?.host?.onError?.(hostObservable)) {\n return;\n }\n hostComplete.wake({ error });\n },\n );\n });\n\n return [hostComplete.wait(), guestComplete.wait()];\n};\n\nexport const createInvitation = async (\n host: ServiceContext | InvitationHost,\n options?: Partial<Invitation>,\n): Promise<CancellableInvitation> => {\n options ??= {\n authMethod: Invitation.AuthMethod.NONE,\n ...(options ?? {}),\n };\n\n if (host instanceof ClientServicesHost) {\n return host.invitationsManager.createInvitation(new Context(), {\n kind: Invitation.Kind.SPACE,\n ...options,\n });\n }\n\n return host.share(options);\n};\n\nexport const acceptInvitation = (\n guest: ServiceContext | InvitationGuest,\n invitation: Invitation,\n guestDeviceProfile?: DeviceProfileDocument,\n): AuthenticatingInvitation => {\n invitation = sanitizeInvitation(invitation);\n\n if (guest instanceof ClientServicesHost) {\n return guest.invitationsManager.acceptInvitation(new Context(), {\n invitation,\n deviceProfile: guestDeviceProfile,\n });\n }\n\n return guest.join(invitation, guestDeviceProfile);\n};\n","//\n// Copyright 2022 DXOS.org\n//\n\nimport * as Reactivity from '@effect/experimental/Reactivity';\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\nimport * as ManagedRuntime from 'effect/ManagedRuntime';\n\nimport { Config } from '@dxos/config';\nimport { Context } from '@dxos/context';\nimport { CredentialGenerator, createCredentialSignerWithChain } from '@dxos/credentials';\nimport { failUndefined } from '@dxos/debug';\nimport { EchoHost, MeshEchoReplicator } from '@dxos/echo-host';\nimport { RuntimeProvider } from '@dxos/effect';\nimport { FeedFactory, FeedStore } from '@dxos/feed-store';\nimport { SqliteKeyring } from '@dxos/keyring';\nimport { MemorySignalManager, MemorySignalManagerContext, type SignalManager } from '@dxos/messaging';\nimport { MemoryTransportFactory, SwarmNetworkManager } from '@dxos/network-manager';\nimport { Invitation } from '@dxos/protocols/proto/dxos/client/services';\nimport { StorageType } from '@dxos/random-access-storage';\nimport { layerMemory as sqliteLayerMemory } from '@dxos/sql-sqlite/platform';\nimport * as SqlTransaction from '@dxos/sql-sqlite/SqlTransaction';\nimport { SqliteBlobStore } from '@dxos/teleport-extension-object-sync';\n\nimport { InvitationsHandler, InvitationsManager, SpaceInvitationProtocol } from '../invitations';\nimport { SqliteMetadataStore } from '../metadata';\nimport { valueEncoding } from '../pipeline';\nimport { ClientServicesHost, type ServiceContext, type ServiceContextRuntimeProps } from '../services';\nimport { SqliteStorage } from '../services/sqlite-storage';\nimport { SpaceManager } from '../space';\nimport { DataSpaceManager, type DataSpaceManagerRuntimeProps, type SigningContext } from '../spaces';\n\n//\n// TODO(burdon): Replace with test builder.\n//\n\nexport const createServiceHost = (config: Config, signalManagerContext: MemorySignalManagerContext) => {\n return new ClientServicesHost({\n config,\n signalManager: new MemorySignalManager(signalManagerContext),\n transportFactory: MemoryTransportFactory,\n runtime: ManagedRuntime.make(\n SqlTransaction.layer\n .pipe(Layer.provideMerge(sqliteLayerMemory), Layer.provideMerge(Reactivity.layer))\n .pipe(Layer.orDie),\n ).runtimeEffect,\n });\n};\n\nexport const createServiceContext = async ({\n signalManagerFactory = async () => {\n const signalContext = new MemorySignalManagerContext();\n return new MemorySignalManager(signalContext);\n },\n runtimeProps,\n}: {\n signalManagerFactory?: () => Promise<SignalManager>;\n runtimeProps?: ServiceContextRuntimeProps;\n} = {}): Promise<ServiceContext> => {\n const signalManager = await signalManagerFactory();\n\n // The host builds its component stack over this SQLite runtime; dispose it once the host closes so\n // the layer-scoped finalizers (e.g. EchoHost) do not leak across tests.\n const runtime = ManagedRuntime.make(\n SqlTransaction.layer\n .pipe(Layer.provideMerge(sqliteLayerMemory), Layer.provideMerge(Reactivity.layer))\n .pipe(Layer.orDie),\n );\n\n const host = new ClientServicesHost({\n config: new Config(),\n signalManager,\n transportFactory: MemoryTransportFactory,\n runtime: runtime.runtimeEffect,\n runtimeProps: {\n invitationConnectionDefaultProps: { teleport: { controlHeartbeatInterval: 200 } },\n ...runtimeProps,\n },\n });\n\n const closeHost = host.close.bind(host);\n host.close = async (ctx = new Context()) => {\n await closeHost(ctx);\n await runtime.dispose();\n };\n\n return host;\n};\n\nexport const createPeers = async (numPeers: number, signalManagerFactory?: () => Promise<SignalManager>) => {\n if (!signalManagerFactory) {\n const signalContext = new MemorySignalManagerContext();\n signalManagerFactory = async () => new MemorySignalManager(signalContext);\n }\n return await Promise.all(\n Array.from(Array(numPeers)).map(async () => {\n const peer = await createServiceContext({ signalManagerFactory });\n await peer.open(new Context());\n return peer;\n }),\n );\n};\n\nexport const createIdentity = async (peer: ServiceContext) => {\n await peer.createIdentity();\n return peer;\n};\n\nexport class TestBuilder {\n public readonly signalContext = new MemorySignalManagerContext();\n private readonly _ctx = new Context();\n\n createPeer(peerOptions?: TestPeerOpts): TestPeer {\n const peer = new TestPeer(this.signalContext, peerOptions);\n this._ctx.onDispose(async () => peer.destroy());\n return peer;\n }\n\n async destroy(): Promise<void> {\n await this._ctx.dispose();\n }\n}\n\nexport type TestPeerOpts = {\n dataStore?: StorageType;\n dataSpaceProps?: DataSpaceManagerRuntimeProps;\n};\n\nexport type TestPeerProps = {\n feedStore?: FeedStore<any>;\n metadataStore?: SqliteMetadataStore;\n keyring?: SqliteKeyring;\n networkManager?: SwarmNetworkManager;\n spaceManager?: SpaceManager;\n dataSpaceManager?: DataSpaceManager;\n signingContext?: SigningContext;\n blobStore?: SqliteBlobStore;\n echoHost?: EchoHost;\n meshEchoReplicator?: MeshEchoReplicator;\n invitationsManager?: InvitationsManager;\n};\n\nexport class TestPeer {\n private _props: TestPeerProps = {};\n private readonly _runtime = ManagedRuntime.make(\n SqlTransaction.layer\n .pipe(Layer.provideMerge(sqliteLayerMemory), Layer.provideMerge(Reactivity.layer))\n .pipe(Layer.orDie),\n );\n private readonly _feedStorage = new SqliteStorage({ runtime: this._runtime.runtimeEffect });\n\n constructor(\n private readonly _signalContext: MemorySignalManagerContext,\n private readonly _opts: TestPeerOpts = { dataStore: StorageType.RAM },\n ) {}\n\n get props() {\n return this._props;\n }\n\n get keyring() {\n return (this._props.keyring ??= new SqliteKeyring({ runtime: this._runtime.runtimeEffect }));\n }\n\n get feedStore() {\n return (this._props.feedStore ??= new FeedStore({\n factory: new FeedFactory({\n root: this._feedStorage.createDirectory('feeds'),\n signer: this.keyring,\n hypercore: {\n valueEncoding,\n },\n }),\n }));\n }\n\n get metadataStore() {\n return (this._props.metadataStore ??= new SqliteMetadataStore({ runtime: this._runtime.runtimeEffect }));\n }\n\n get blobStore() {\n return (this._props.blobStore ??= new SqliteBlobStore({ runtime: this._runtime.runtimeEffect }));\n }\n\n get networkManager() {\n return (this._props.networkManager ??= new SwarmNetworkManager({\n signalManager: new MemorySignalManager(this._signalContext),\n transportFactory: MemoryTransportFactory,\n }));\n }\n\n get spaceManager() {\n return (this._props.spaceManager ??= new SpaceManager({\n feedStore: this.feedStore,\n networkManager: this.networkManager,\n metadataStore: this.metadataStore,\n blobStore: this.blobStore,\n }));\n }\n\n get identity() {\n return this._props.signingContext ?? failUndefined();\n }\n\n get echoHost() {\n return (this._props.echoHost ??= new EchoHost({\n runtime: this._runtime.runtimeEffect,\n }));\n }\n\n get meshEchoReplicator() {\n return (this._props.meshEchoReplicator ??= new MeshEchoReplicator());\n }\n\n get dataSpaceManager(): DataSpaceManager {\n return (this._props.dataSpaceManager ??= new DataSpaceManager({\n spaceManager: this.spaceManager,\n metadataStore: this.metadataStore,\n keyring: this.keyring,\n signingContextProvider: () => this.identity,\n feedStore: this.feedStore,\n echoHost: this.echoHost,\n invitationsManager: this.invitationsManager,\n edgeConnection: undefined,\n meshReplicator: this.meshEchoReplicator,\n echoEdgeReplicator: undefined,\n runtimeProps: this._opts.dataSpaceProps,\n }));\n }\n\n get invitationsManager() {\n if (!this._props.invitationsManager) {\n const manager = new InvitationsManager(new InvitationsHandler(this.networkManager), this.metadataStore);\n manager.setInvitationHandlerFactory((invitation) => {\n if (invitation.kind === Invitation.Kind.SPACE) {\n return new SpaceInvitationProtocol(this.dataSpaceManager, this.identity!, this.keyring, invitation.spaceKey!);\n } else {\n throw new Error('not implemented');\n }\n });\n this._props.invitationsManager = manager;\n }\n return this._props.invitationsManager;\n }\n\n async createIdentity(): Promise<void> {\n await this.migrate();\n this._props.signingContext ??= await createSigningContext(this.keyring);\n this.networkManager.setPeerInfo({\n identityKey: this._props.signingContext.identityKey.toHex(),\n peerKey: this._props.signingContext.deviceKey.toHex(),\n });\n }\n\n async migrate(): Promise<void> {\n await RuntimeProvider.runPromise(this._runtime.runtimeEffect)(\n Effect.all([this.metadataStore.migrate, this.blobStore.migrate, this.keyring.migrate, this._feedStorage.migrate]),\n );\n }\n\n async destroy(): Promise<void> {\n await this._runtime.dispose();\n }\n}\n\nexport const createSigningContext = async (keyring: SqliteKeyring): Promise<SigningContext> => {\n const identityKey = await keyring.createKey();\n const deviceKey = await keyring.createKey();\n\n return {\n identityKey,\n deviceKey,\n credentialSigner: createCredentialSignerWithChain(\n keyring,\n {\n credential: await new CredentialGenerator(keyring, identityKey, deviceKey).createDeviceAuthorization(deviceKey),\n },\n deviceKey,\n ),\n recordCredential: async () => {}, // No-op.\n getProfile: () => undefined,\n };\n};\n"],"mappings":"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"}
@@ -3,7 +3,9 @@ export * from './packlets/diagnostics';
3
3
  export * from './packlets/identity';
4
4
  export * from './packlets/invitations';
5
5
  export * from './packlets/locks';
6
+ export * from './packlets/metadata';
6
7
  export * from './packlets/services';
8
+ export * from './packlets/space';
7
9
  export * from './packlets/space-export';
8
10
  export * from './packlets/spaces';
9
11
  export * from './packlets/storage';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}