@dxos/client-services 0.10.0 → 0.11.0

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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/client-services",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
4
  "description": "DXOS client services implementation",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -19,8 +19,8 @@
19
19
  "default": "./src/packlets/locks/node.ts"
20
20
  },
21
21
  "types": "./dist/types/src/packlets/locks/node.d.ts",
22
- "browser": "./dist/lib/browser/packlets/locks/browser.mjs",
23
- "default": "./dist/lib/node-esm/packlets/locks/node.mjs"
22
+ "browser": "./dist/lib/packlets/locks/browser.mjs",
23
+ "default": "./dist/lib/packlets/locks/node.mjs"
24
24
  },
25
25
  "#diagnostics-broadcast": {
26
26
  "source": {
@@ -28,22 +28,20 @@
28
28
  "default": "./src/packlets/diagnostics/diagnostics-broadcast.ts"
29
29
  },
30
30
  "types": "./dist/types/src/packlets/diagnostics/diagnostics-broadcast.d.ts",
31
- "browser": "./dist/lib/browser/packlets/diagnostics/browser-diagnostics-broadcast.mjs",
32
- "default": "./dist/lib/node-esm/packlets/diagnostics/diagnostics-broadcast.mjs"
31
+ "browser": "./dist/lib/packlets/diagnostics/browser-diagnostics-broadcast.mjs",
32
+ "default": "./dist/lib/packlets/diagnostics/diagnostics-broadcast.mjs"
33
33
  }
34
34
  },
35
35
  "exports": {
36
36
  ".": {
37
37
  "source": "./src/index.ts",
38
38
  "types": "./dist/types/src/index.d.ts",
39
- "browser": "./dist/lib/browser/index.mjs",
40
- "node": "./dist/lib/node-esm/index.mjs"
39
+ "import": "./dist/lib/index.mjs"
41
40
  },
42
41
  "./testing": {
43
42
  "source": "./src/testing/index.ts",
44
43
  "types": "./dist/types/src/testing/index.d.ts",
45
- "browser": "./dist/lib/browser/testing/index.mjs",
46
- "node": "./dist/lib/node-esm/testing/index.mjs"
44
+ "import": "./dist/lib/testing.mjs"
47
45
  }
48
46
  },
49
47
  "types": "dist/types/src/index.d.ts",
@@ -53,56 +51,62 @@
53
51
  ],
54
52
  "dependencies": {
55
53
  "@automerge/automerge": "3.3.0-fragments.2",
56
- "@automerge/automerge-repo": "2.6.0-subduction.37",
54
+ "@automerge/automerge-repo": "2.6.0-subduction.40",
57
55
  "@effect/experimental": "0.60.0",
56
+ "@effect/rpc": "0.75.1",
58
57
  "@effect/sql": "0.51.1",
59
58
  "@obsidize/tar-browserify": "^5.2.0",
60
59
  "cbor-x": "^1.5.4",
60
+ "crc-32": "^1.2.2",
61
61
  "effect": "3.21.4",
62
62
  "platform": "^1.3.6",
63
- "@dxos/async": "0.10.0",
64
- "@dxos/client-protocol": "0.10.0",
65
- "@dxos/config": "0.10.0",
66
- "@dxos/codec-protobuf": "0.10.0",
67
- "@dxos/context": "0.10.0",
68
- "@dxos/credentials": "0.10.0",
69
- "@dxos/crypto": "0.10.0",
70
- "@dxos/debug": "0.10.0",
71
- "@dxos/echo": "0.10.0",
72
- "@dxos/echo-client": "0.10.0",
73
- "@dxos/echo-host": "0.10.0",
74
- "@dxos/echo-protocol": "0.10.0",
75
- "@dxos/edge-client": "0.10.0",
76
- "@dxos/effect": "0.10.0",
77
- "@dxos/feed": "0.10.0",
78
- "@dxos/feed-store": "0.10.0",
79
- "@dxos/invariant": "0.10.0",
80
- "@dxos/keys": "0.10.0",
81
- "@dxos/keyring": "0.10.0",
82
- "@dxos/kv-store": "0.10.0",
83
- "@dxos/lock-file": "0.10.0",
84
- "@dxos/messaging": "0.10.0",
85
- "@dxos/network-manager": "0.10.0",
86
- "@dxos/log": "0.10.0",
87
- "@dxos/node-std": "0.10.0",
88
- "@dxos/protocols": "0.10.0",
89
- "@dxos/random-access-storage": "0.10.0",
90
- "@dxos/rpc": "0.10.0",
91
- "@dxos/sql-sqlite": "0.10.0",
92
- "@dxos/teleport": "0.10.0",
93
- "@dxos/teleport-extension-gossip": "0.10.0",
94
- "@dxos/teleport-extension-object-sync": "0.10.0",
95
- "@dxos/tracing": "0.10.0",
96
- "@dxos/timeframe": "0.10.0",
97
- "@dxos/util": "0.10.0",
98
- "@dxos/websocket-rpc": "0.10.0"
63
+ "@dxos/async": "0.11.0",
64
+ "@dxos/client-protocol": "0.11.0",
65
+ "@dxos/codec-protobuf": "0.11.0",
66
+ "@dxos/context": "0.11.0",
67
+ "@dxos/credentials": "0.11.0",
68
+ "@dxos/crypto": "0.11.0",
69
+ "@dxos/debug": "0.11.0",
70
+ "@dxos/config": "0.11.0",
71
+ "@dxos/echo": "0.11.0",
72
+ "@dxos/echo-client": "0.11.0",
73
+ "@dxos/echo-host": "0.11.0",
74
+ "@dxos/echo-protocol": "0.11.0",
75
+ "@dxos/feed": "0.11.0",
76
+ "@dxos/effect": "0.11.0",
77
+ "@dxos/edge-client": "0.11.0",
78
+ "@dxos/feed-store": "0.11.0",
79
+ "@dxos/hypercore": "0.11.0",
80
+ "@dxos/invariant": "0.11.0",
81
+ "@dxos/keys": "0.11.0",
82
+ "@dxos/keyring": "0.11.0",
83
+ "@dxos/kv-store": "0.11.0",
84
+ "@dxos/lock-file": "0.11.0",
85
+ "@dxos/log": "0.11.0",
86
+ "@dxos/messaging": "0.11.0",
87
+ "@dxos/network-manager": "0.11.0",
88
+ "@dxos/node-std": "0.11.0",
89
+ "@dxos/protocols": "0.11.0",
90
+ "@dxos/random-access-storage": "0.11.0",
91
+ "@dxos/rpc": "0.11.0",
92
+ "@dxos/sql-sqlite": "0.11.0",
93
+ "@dxos/teleport": "0.11.0",
94
+ "@dxos/teleport-extension-gossip": "0.11.0",
95
+ "@dxos/teleport-extension-object-sync": "0.11.0",
96
+ "@dxos/teleport-extension-replicator": "0.11.0",
97
+ "@dxos/timeframe": "0.11.0",
98
+ "@dxos/tracing": "0.11.0",
99
+ "@dxos/util": "0.11.0",
100
+ "@dxos/websocket-rpc": "0.11.0"
99
101
  },
100
102
  "devDependencies": {
103
+ "@effect/platform-browser": "0.76.0",
104
+ "@effect/vitest": "0.29.0",
101
105
  "@types/platform": "^1.3.4",
102
106
  "@types/readable-stream": "^2.3.9",
107
+ "fast-check": "^3.19.0",
103
108
  "get-port-please": "^3.1.1",
104
- "@dxos/signal": "0.10.0",
105
- "@dxos/test-utils": "0.10.0"
109
+ "@dxos/test-utils": "0.11.0"
106
110
  },
107
111
  "publishConfig": {
108
112
  "access": "public"
package/src/index.ts CHANGED
@@ -7,7 +7,9 @@ export * from './packlets/diagnostics';
7
7
  export * from './packlets/identity';
8
8
  export * from './packlets/invitations';
9
9
  export * from './packlets/locks';
10
+ export * from './packlets/metadata';
10
11
  export * from './packlets/services';
12
+ export * from './packlets/space';
11
13
  export * from './packlets/space-export';
12
14
  export * from './packlets/spaces';
13
15
  export * from './packlets/storage';
@@ -2,10 +2,15 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ import * as EffectContext from 'effect/Context';
6
+ import * as Effect from 'effect/Effect';
7
+ import * as Layer from 'effect/Layer';
8
+ import * as Option from 'effect/Option';
9
+
5
10
  import { DeferredTask, Event, scheduleTask, synchronized } from '@dxos/async';
6
11
  import { Context } from '@dxos/context';
7
12
  import { Resource } from '@dxos/context';
8
- import { type EdgeHttpClient } from '@dxos/edge-client';
13
+ import { type EdgeHttpClient, EdgeHttpClientService } from '@dxos/edge-client';
9
14
  import { invariant } from '@dxos/invariant';
10
15
  import { PublicKey } from '@dxos/keys';
11
16
  import { log } from '@dxos/log';
@@ -14,15 +19,22 @@ import { SpaceState } from '@dxos/protocols/proto/dxos/client/services';
14
19
  import { type Runtime } from '@dxos/protocols/proto/dxos/config';
15
20
  import { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';
16
21
 
17
- import { type Identity } from '../identity';
18
- import { type DataSpaceManager } from '../spaces';
19
-
22
+ import { type Identity, type IdentityProvider, IdentityProviderService } from '../identity';
23
+ import { type DataSpaceManager, DataSpaceManagerService } from '../spaces';
20
24
  const AGENT_STATUS_QUERY_RETRY_INTERVAL = 5000;
21
25
  const AGENT_STATUS_QUERY_RETRY_JITTER = 1000;
22
26
  const AGENT_FEED_ADDED_CHECK_INTERVAL_MS = 3000;
23
27
 
24
28
  export type EdgeAgentManagerConfig = {};
25
29
 
30
+ /**
31
+ * Effect service tag for {@link EdgeAgentManager}.
32
+ */
33
+ export class EdgeAgentManagerService extends EffectContext.Tag('@dxos/client-services/EdgeAgentManager')<
34
+ EdgeAgentManagerService,
35
+ EdgeAgentManager
36
+ >() {}
37
+
26
38
  export class EdgeAgentManager extends Resource {
27
39
  public agentStatusChanged = new Event<EdgeAgentStatus>();
28
40
 
@@ -37,11 +49,15 @@ export class EdgeAgentManager extends Resource {
37
49
  private readonly _edgeFeatures: Runtime.Client.EdgeFeatures | undefined,
38
50
  private readonly _edgeHttpClient: EdgeHttpClient | undefined,
39
51
  private readonly _dataSpaceManager: DataSpaceManager,
40
- private readonly _identity: Identity,
52
+ private readonly _identityProvider: IdentityProvider,
41
53
  ) {
42
54
  super();
43
55
  }
44
56
 
57
+ private get identity(): Identity {
58
+ return this._identityProvider();
59
+ }
60
+
45
61
  public get agentStatus(): EdgeAgentStatus | undefined {
46
62
  return this._agentStatus;
47
63
  }
@@ -57,20 +73,20 @@ export class EdgeAgentManager extends Resource {
57
73
  invariant(this._edgeFeatures?.agents);
58
74
 
59
75
  const response = await this._edgeHttpClient.createAgent(ctx, {
60
- identityDid: this._identity.did,
61
- haloSpaceId: this._identity.haloSpaceId,
62
- haloSpaceKey: this._identity.haloSpaceKey.toHex(),
76
+ identityDid: this.identity.did,
77
+ haloSpaceId: this.identity.haloSpaceId,
78
+ haloSpaceKey: this.identity.haloSpaceKey.toHex(),
63
79
  });
64
80
 
65
81
  const deviceKey = PublicKey.fromHex(response.deviceKey);
66
82
 
67
- if (await this._identity.authorizedDeviceKeys.has(deviceKey)) {
83
+ if (await this.identity.authorizedDeviceKeys.has(deviceKey)) {
68
84
  log.info('agent was already added to HALO, ignoring response', { response });
69
85
  this._updateStatus(EdgeAgentStatus.ACTIVE, deviceKey);
70
86
  return;
71
87
  }
72
88
 
73
- await this._identity.admitDevice({
89
+ await this.identity.admitDevice({
74
90
  deviceKey,
75
91
  controlFeedKey: PublicKey.fromHex(response.feedKey),
76
92
  // TODO: agents don't have data feed, should be removed
@@ -91,7 +107,7 @@ export class EdgeAgentManager extends Resource {
91
107
  return;
92
108
  }
93
109
 
94
- this._lastKnownDeviceCount = this._identity.authorizedDeviceKeys.size;
110
+ this._lastKnownDeviceCount = this.identity.authorizedDeviceKeys.size;
95
111
  this._fetchAgentStatusTask = new DeferredTask(this._ctx, async () => {
96
112
  await this._fetchAgentStatus(this._ctx);
97
113
  });
@@ -103,12 +119,12 @@ export class EdgeAgentManager extends Resource {
103
119
  }
104
120
  });
105
121
 
106
- this._identity.stateUpdate.on(this._ctx, () => {
107
- const maybeAgentWasCreated = this._identity.authorizedDeviceKeys.size > this._lastKnownDeviceCount;
122
+ this.identity.stateUpdate.on(this._ctx, () => {
123
+ const maybeAgentWasCreated = this.identity.authorizedDeviceKeys.size > this._lastKnownDeviceCount;
108
124
  if (this.agentExists || !maybeAgentWasCreated) {
109
125
  return;
110
126
  }
111
- this._lastKnownDeviceCount = this._identity.authorizedDeviceKeys.size;
127
+ this._lastKnownDeviceCount = this.identity.authorizedDeviceKeys.size;
112
128
  this._fetchAgentStatusTask?.schedule();
113
129
  });
114
130
  }
@@ -123,7 +139,7 @@ export class EdgeAgentManager extends Resource {
123
139
  try {
124
140
  log('fetching agent status');
125
141
  const { agent } = await this._edgeHttpClient.getAgentStatus(ctx, {
126
- ownerIdentityDid: this._identity.did,
142
+ ownerIdentityDid: this.identity.did,
127
143
  });
128
144
  const wasAgentCreatedDuringQuery = this._agentStatus === EdgeAgentStatus.ACTIVE;
129
145
  if (!wasAgentCreatedDuringQuery) {
@@ -184,3 +200,28 @@ export class EdgeAgentManager extends Resource {
184
200
  log.verbose('agent status update', { status });
185
201
  }
186
202
  }
203
+
204
+ export type EdgeAgentManagerLayerOptions = {
205
+ edgeFeatures?: Runtime.Client.EdgeFeatures;
206
+ };
207
+
208
+ /**
209
+ * Effect Layer constructing a dormant {@link EdgeAgentManager}.
210
+ */
211
+ export const EdgeAgentManagerLayer = (
212
+ options: EdgeAgentManagerLayerOptions = {},
213
+ ): Layer.Layer<EdgeAgentManagerService, never, DataSpaceManagerService | IdentityProviderService> =>
214
+ Layer.effect(
215
+ EdgeAgentManagerService,
216
+ Effect.gen(function* () {
217
+ const dataSpaceManager = yield* DataSpaceManagerService;
218
+ const identityProvider = yield* IdentityProviderService;
219
+ const edgeHttpClient = yield* Effect.serviceOption(EdgeHttpClientService);
220
+ return new EdgeAgentManager(
221
+ options.edgeFeatures,
222
+ Option.getOrUndefined(edgeHttpClient),
223
+ dataSpaceManager,
224
+ identityProvider,
225
+ );
226
+ }),
227
+ );
@@ -2,32 +2,34 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { type RequestOptions } from '@dxos/codec-protobuf';
6
- import { Stream } from '@dxos/codec-protobuf/stream';
5
+ import * as Effect from 'effect/Effect';
6
+ import * as EffectStream from 'effect/Stream';
7
+
7
8
  import { Context } from '@dxos/context';
8
9
  import { type EdgeConnection } from '@dxos/edge-client';
9
10
  import { EdgeAgentStatus } from '@dxos/protocols';
10
11
  import {
11
- type EdgeAgentService,
12
12
  EdgeStatus,
13
13
  QueryAgentStatusResponse,
14
14
  type QueryEdgeStatusResponse,
15
15
  } from '@dxos/protocols/proto/dxos/client/services';
16
+ import { type EdgeAgentService } from '@dxos/protocols/rpc';
16
17
 
17
18
  import { type EdgeAgentManager } from './edge-agent-manager';
18
19
 
19
20
  // TODO(wittjosiah): This service is not currently exposed on the client api, it must be called directly.
20
- export class EdgeAgentServiceImpl implements EdgeAgentService {
21
- constructor(
21
+ export class EdgeAgentServiceImpl implements EdgeAgentService.Handlers {
22
+ 'constructor'(
22
23
  private readonly _agentManagerProvider: () => Promise<EdgeAgentManager>,
23
24
  private readonly _edgeConnection?: EdgeConnection,
24
25
  ) {}
25
26
 
26
27
  // TODO(mykola): Reconcile with NetworkService.queryStatus.
27
- queryEdgeStatus(): Stream<QueryEdgeStatusResponse> {
28
- return new Stream(({ ctx, next }) => {
28
+ ['EdgeAgentService.queryEdgeStatus'](): EffectStream.Stream<QueryEdgeStatusResponse, Error> {
29
+ return EffectStream.async<QueryEdgeStatusResponse, Error>((emit) => {
30
+ const ctx = Context.default();
29
31
  const update = () => {
30
- next({
32
+ void emit.single({
31
33
  status: this._edgeConnection?.status ?? {
32
34
  state: EdgeStatus.ConnectionState.NOT_CONNECTED,
33
35
  rtt: 0,
@@ -42,22 +44,30 @@ export class EdgeAgentServiceImpl implements EdgeAgentService {
42
44
 
43
45
  this._edgeConnection?.statusChanged.on(ctx, update);
44
46
  update();
47
+
48
+ return Effect.promise(() => ctx.dispose());
45
49
  });
46
50
  }
47
51
 
48
- async createAgent(_request: void, options?: RequestOptions): Promise<void> {
49
- return (await this._agentManagerProvider()).createAgent(options?.ctx ?? Context.default());
52
+ ['EdgeAgentService.createAgent'](): Effect.Effect<void, Error> {
53
+ return Effect.tryPromise({
54
+ try: async () => (await this._agentManagerProvider()).createAgent(Context.default()),
55
+ catch: (error) => error as Error,
56
+ });
50
57
  }
51
58
 
52
- queryAgentStatus(): Stream<QueryAgentStatusResponse> {
53
- return new Stream(({ ctx, next }) => {
54
- next({ status: QueryAgentStatusResponse.AgentStatus.UNKNOWN });
59
+ ['EdgeAgentService.queryAgentStatus'](): EffectStream.Stream<QueryAgentStatusResponse, Error> {
60
+ return EffectStream.async<QueryAgentStatusResponse, Error>((emit) => {
61
+ const ctx = Context.default();
62
+ void emit.single({ status: QueryAgentStatusResponse.AgentStatus.UNKNOWN });
55
63
  void this._agentManagerProvider().then((agentManager) => {
56
- next({ status: mapStatus(agentManager.agentStatus) });
64
+ void emit.single({ status: mapStatus(agentManager.agentStatus) });
57
65
  agentManager.agentStatusChanged.on(ctx, (newStatus) => {
58
- next({ status: mapStatus(newStatus) });
66
+ void emit.single({ status: mapStatus(newStatus) });
59
67
  });
60
68
  });
69
+
70
+ return Effect.promise(() => ctx.dispose());
61
71
  });
62
72
  }
63
73
  }
@@ -2,12 +2,15 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ import * as Runtime from 'effect/Runtime';
5
6
  import { afterEach, beforeEach, describe, expect, onTestFinished, test } from 'vitest';
6
7
 
7
8
  import { Trigger } from '@dxos/async';
8
9
  import { Context } from '@dxos/context';
10
+ import { EffectEx } from '@dxos/effect';
9
11
  import { log } from '@dxos/log';
10
- import { type Device, type DevicesService } from '@dxos/protocols/proto/dxos/client/services';
12
+ import { subscribeStream } from '@dxos/protocols';
13
+ import { type Device } from '@dxos/protocols/proto/dxos/client/services';
11
14
 
12
15
  import { type ServiceContext } from '../services';
13
16
  import { createServiceContext } from '../testing';
@@ -15,7 +18,7 @@ import { DevicesServiceImpl } from './devices-service';
15
18
 
16
19
  describe('DevicesService', () => {
17
20
  let serviceContext: ServiceContext;
18
- let devicesService: DevicesService;
21
+ let devicesService: DevicesServiceImpl;
19
22
 
20
23
  beforeEach(async () => {
21
24
  serviceContext = await createServiceContext();
@@ -29,38 +32,36 @@ describe('DevicesService', () => {
29
32
 
30
33
  describe('updateDevice', () => {
31
34
  test.skip('updates device profile', async () => {
32
- const query = devicesService.queryDevices();
33
- const device = await devicesService.updateDevice({ label: 'test-device' });
35
+ const stream = devicesService['DevicesService.queryDevices']();
36
+ const device = await EffectEx.runPromise(devicesService['DevicesService.updateDevice']({ label: 'test-device' }));
34
37
  const result = new Trigger<Device[] | undefined>();
35
- query.subscribe(({ devices }) => {
36
- result.wake(devices);
38
+ const cleanup = subscribeStream(Runtime.defaultRuntime, stream, {
39
+ onData: ({ devices }) => result.wake(devices),
37
40
  });
38
- onTestFinished(() => query.close());
41
+ onTestFinished(cleanup);
39
42
  expect(device.profile?.label).to.equal('test-device');
40
43
  });
41
44
  });
42
45
 
43
46
  describe('queryDevices', () => {
44
47
  test('returns empty list if no identity is available', async () => {
45
- const query = devicesService.queryDevices();
48
+ const stream = devicesService['DevicesService.queryDevices']();
46
49
  const result = new Trigger<Device[] | undefined>();
47
- query.subscribe(
48
- ({ devices }) => {
49
- result.wake(devices);
50
- },
51
- (err) => log.catch(err),
52
- );
53
- onTestFinished(() => query.close().catch((err) => log.catch(err)));
50
+ const cleanup = subscribeStream(Runtime.defaultRuntime, stream, {
51
+ onData: ({ devices }) => result.wake(devices),
52
+ onError: (err) => log.catch(err),
53
+ });
54
+ onTestFinished(cleanup);
54
55
  expect(await result.wait()).to.be.length(0);
55
56
  });
56
57
 
57
58
  test('updates when identity is created', async () => {
58
- const query = devicesService.queryDevices();
59
+ const stream = devicesService['DevicesService.queryDevices']();
59
60
  let result = new Trigger<Device[] | undefined>();
60
- query.subscribe(({ devices }) => {
61
- result.wake(devices);
61
+ const cleanup = subscribeStream(Runtime.defaultRuntime, stream, {
62
+ onData: ({ devices }) => result.wake(devices),
62
63
  });
63
- onTestFinished(() => query.close());
64
+ onTestFinished(cleanup);
64
65
  expect(await result.wait()).to.be.length(0);
65
66
 
66
67
  result = new Trigger<Device[] | undefined>();
@@ -2,41 +2,41 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
+ import * as Effect from 'effect/Effect';
6
+ import * as EffectStream from 'effect/Stream';
7
+
5
8
  import { SubscriptionList } from '@dxos/async';
6
- import { Stream } from '@dxos/codec-protobuf/stream';
7
9
  import { type EdgeConnection } from '@dxos/edge-client';
8
10
  import { invariant } from '@dxos/invariant';
9
- import {
10
- Device,
11
- DeviceKind,
12
- type DevicesService,
13
- EdgeStatus,
14
- type QueryDevicesResponse,
15
- } from '@dxos/protocols/proto/dxos/client/services';
11
+ import { Device, DeviceKind, EdgeStatus, type QueryDevicesResponse } from '@dxos/protocols/proto/dxos/client/services';
16
12
  import { type DeviceProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';
13
+ import { type DevicesService } from '@dxos/protocols/rpc';
17
14
 
18
15
  import { type IdentityManager } from '../identity';
19
16
 
20
- export class DevicesServiceImpl implements DevicesService {
21
- constructor(
17
+ export class DevicesServiceImpl implements DevicesService.Handlers {
18
+ 'constructor'(
22
19
  private readonly _identityManager: IdentityManager,
23
20
  private readonly _edgeConnection?: EdgeConnection,
24
21
  ) {}
25
22
 
26
- async updateDevice(profile: DeviceProfileDocument): Promise<Device> {
27
- return this._identityManager.updateDeviceProfile(profile);
23
+ ['DevicesService.updateDevice'](request: DeviceProfileDocument): Effect.Effect<Device, Error> {
24
+ return Effect.tryPromise({
25
+ try: async () => this._identityManager.updateDeviceProfile(request),
26
+ catch: (error) => error as Error,
27
+ });
28
28
  }
29
29
 
30
- queryDevices(): Stream<QueryDevicesResponse> {
31
- return new Stream(({ next }) => {
30
+ ['DevicesService.queryDevices'](): EffectStream.Stream<QueryDevicesResponse, Error> {
31
+ return EffectStream.async<QueryDevicesResponse, Error>((emit) => {
32
32
  const update = () => {
33
33
  const deviceKeys = this._identityManager.identity?.authorizedDeviceKeys;
34
34
  if (!deviceKeys) {
35
- next({ devices: [] });
35
+ void emit.single({ devices: [] });
36
36
  } else {
37
37
  invariant(this._identityManager.identity?.presence, 'presence not present');
38
38
  const peers = this._identityManager.identity.presence.getPeersOnline();
39
- next({
39
+ void emit.single({
40
40
  devices: Array.from(deviceKeys.entries()).map(([key, profile]) => {
41
41
  const isMe = this._identityManager.identity?.deviceKey.equals(key);
42
42
  let presence;
@@ -104,7 +104,7 @@ export class DevicesServiceImpl implements DevicesService {
104
104
 
105
105
  update();
106
106
 
107
- return () => subscriptions.clear();
107
+ return Effect.sync(() => subscriptions.clear());
108
108
  });
109
109
  }
110
110
  }