@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
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/packlets/testing/credential-utils.ts", "../../../../src/packlets/testing/invitation-utils.ts", "../../../../src/packlets/testing/test-builder.ts"],
4
- "sourcesContent": ["//\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 { 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 ServiceContext) {\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 ServiceContext) {\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 { type Config } from '@dxos/config';\nimport { Context } from '@dxos/context';\nimport { CredentialGenerator, createCredentialSignerWithChain } from '@dxos/credentials';\nimport { failUndefined } from '@dxos/debug';\nimport { EchoHost, MeshEchoReplicator, SpaceManager, valueEncoding } from '@dxos/echo-host';\nimport { SqliteMetadataStore } 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 { ClientServicesHost, ServiceContext, type ServiceContextRuntimeProps } from '../services';\nimport { SqliteStorage } from '../services/sqlite-storage';\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} = {}) => {\n const signalManager = await signalManagerFactory();\n const networkManager = new SwarmNetworkManager({\n signalManager,\n transportFactory: MemoryTransportFactory,\n });\n\n const runtime = ManagedRuntime.make(\n SqlTransaction.layer\n .pipe(Layer.provideMerge(sqliteLayerMemory), Layer.provideMerge(Reactivity.layer))\n .pipe(Layer.orDie),\n ).runtimeEffect;\n\n return new ServiceContext(networkManager, signalManager, undefined, undefined, runtime, {\n invitationConnectionDefaultProps: { teleport: { controlHeartbeatInterval: 200 } },\n ...runtimeProps,\n });\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 signingContext: 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 return (this._props.invitationsManager ??= new InvitationsManager(\n new InvitationsHandler(this.networkManager),\n (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.metadataStore,\n ));\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"],
5
- "mappings": "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",
6
- "names": ["createCredential", "PublicKey", "createMockCredential", "signer", "issuer", "subject", "Buffer", "from", "assertion", "Trigger", "InvitationEncoder", "Context", "invariant", "Invitation", "guestConnected", "wereConnected", "guestComplete", "authCode", "Trigger", "createInvitation", "host", "options", "hostObservable", "subscribe", "hostInvitation", "Invitation", "State", "CONNECTING", "hostComplete", "invitation", "guestObservable", "guestInvitation", "hooks", "guest", "invariant", "onConnected", "authenticate", "setTimeout", "codeInputDelay", "onAuthenticating", "error", "guestError", "authMethod", "AuthMethod", "NONE", "acceptInvitation", "ServiceContext", "invitationsManager", "deviceProfile", "guestDeviceProfile", "Reactivity", "Effect", "Layer", "ManagedRuntime", "Context", "CredentialGenerator", "createCredentialSignerWithChain", "failUndefined", "EchoHost", "MeshEchoReplicator", "SpaceManager", "valueEncoding", "SqliteMetadataStore", "RuntimeProvider", "FeedFactory", "FeedStore", "SqliteKeyring", "MemorySignalManager", "MemorySignalManagerContext", "MemoryTransportFactory", "SwarmNetworkManager", "Invitation", "StorageType", "layerMemory", "sqliteLayerMemory", "SqlTransaction", "SqliteBlobStore", "__dxlog_file", "config", "signalManager", "MemorySignalManager", "transportFactory", "runtime", "ManagedRuntime", "SqlTransaction", "Layer", "signalContext", "runtimeProps", "signalManagerFactory", "networkManager", "MemoryTransportFactory", "invitationConnectionDefaultProps", "teleport", "MemorySignalManagerContext", "Array", "Context", "peer", "_ctx", "createPeer", "peerOptions", "TestPeer", "destroy", "_props", "_runtime", "_feedStorage", "_signalContext", "props", "keyring", "feedStore", "factory", "root", "createDirectory", "signer", "hypercore", "valueEncoding", "metadataStore", "blobStore", "spaceManager", "identity", "echoHost", "meshEchoReplicator", "dataSpaceManager", "signingContext", "invitationsManager", "edgeConnection", "meshReplicator", "echoEdgeReplicator", "_opts", "kind", "SpaceInvitationProtocol", "spaceKey", "Invitation", "Error", "createIdentity", "identityKey", "toHex", "peerKey", "migrate", "deviceKey", "createKey", "credentialSigner", "recordCredential", "getProfile"]
7
- }
@@ -1,24 +0,0 @@
1
- import { type ClientServices } from '@dxos/client-protocol';
2
- import { type Any, type RequestOptions, Stream } from '@dxos/codec-protobuf';
3
- import { type RpcPeerOptions } from '@dxos/rpc';
4
- import { type MaybePromise } from '@dxos/util';
5
- import { type ServiceRegistry } from './service-registry';
6
- export type ClientRpcServerProps = {
7
- serviceRegistry: ServiceRegistry<ClientServices>;
8
- handleCall?: (method: string, params: Any, handler: (method: string, params: Any, options?: RequestOptions) => MaybePromise<Any>, options?: RequestOptions) => Promise<Any>;
9
- handleStream?: (method: string, params: Any, handler: (method: string, params: Any, options?: RequestOptions) => Stream<Any>, options?: RequestOptions) => MaybePromise<Stream<Any>>;
10
- } & Omit<RpcPeerOptions, 'callHandler' | 'streamHandler'>;
11
- export declare class ClientRpcServer {
12
- private readonly _serviceRegistry;
13
- private readonly _rpcPeer;
14
- private readonly _handlerCache;
15
- private readonly _handleCall;
16
- private readonly _handleStream;
17
- private readonly _callMetrics;
18
- private get _services();
19
- constructor(params: ClientRpcServerProps);
20
- open(): Promise<void>;
21
- close(): Promise<void>;
22
- private _getServiceHandler;
23
- }
24
- //# sourceMappingURL=client-rpc-server.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client-rpc-server.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/services/client-rpc-server.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,cAAc,EAAuB,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAElG,OAAO,EAAW,KAAK,cAAc,EAAuC,MAAM,WAAW,CAAC;AAE9F,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,MAAM,oBAAoB,GAAG;IACjC,eAAe,EAAE,eAAe,CAAC,cAAc,CAAC,CAAC;IACjD,UAAU,CAAC,EAAE,CACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,GAAG,EACX,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,cAAc,KAAK,YAAY,CAAC,GAAG,CAAC,EACrF,OAAO,CAAC,EAAE,cAAc,KACrB,OAAO,CAAC,GAAG,CAAC,CAAC;IAClB,YAAY,CAAC,EAAE,CACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,GAAG,EACX,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,cAAc,KAAK,MAAM,CAAC,GAAG,CAAC,EAC/E,OAAO,CAAC,EAAE,cAAc,KACrB,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;CAChC,GAAG,IAAI,CAAC,cAAc,EAAE,aAAa,GAAG,eAAe,CAAC,CAAC;AAE1D,qBACa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkC;IACnE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0C;IACxE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqC;IACjE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuC;IAGrE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IAGjD,OAAO,KAAK,SAAS,GAEpB;IAED,YAAY,MAAM,EAAE,oBAAoB,EAsCvC;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAE1B;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;IAED,OAAO,CAAC,kBAAkB;CAiB3B"}
@@ -1,15 +0,0 @@
1
- import { type ServiceBundle } from '@dxos/rpc';
2
- /**
3
- * Registry of operational services.
4
- */
5
- export declare class ServiceRegistry<Services> {
6
- private readonly _serviceBundle;
7
- private _handlers;
8
- constructor(_serviceBundle: ServiceBundle<Services>, _handlers?: Partial<Services>);
9
- get descriptors(): ServiceBundle<Services>;
10
- get services(): Partial<Services>;
11
- setServices(services: Partial<Services>): void;
12
- addService(name: keyof Services, service: Services[keyof Services]): void;
13
- removeService(name: keyof Services): void;
14
- }
15
- //# sourceMappingURL=service-registry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service-registry.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/services/service-registry.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C;;GAEG;AACH,qBAAa,eAAe,CAAC,QAAQ;IAGjC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,SAAS;IAFnB,YACmB,cAAc,EAAE,aAAa,CAAC,QAAQ,CAAC,EAChD,SAAS,GAAE,OAAO,CAAC,QAAQ,CAAM,EACvC;IAEJ,IAAI,WAAW,4BAEd;IAED,IAAI,QAAQ,sBAEX;IAED,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAE7C;IAED,UAAU,CAAC,IAAI,EAAE,MAAM,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,QAAQ,CAAC,GAAG,IAAI,CAExE;IAED,aAAa,CAAC,IAAI,EAAE,MAAM,QAAQ,GAAG,IAAI,CAExC;CACF"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=service-registry.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service-registry.test.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/services/service-registry.test.ts"],"names":[],"mappings":""}
@@ -1,3 +0,0 @@
1
- declare const _default: () => Promise<void>;
2
- export default _default;
3
- //# sourceMappingURL=setup.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../../src/testing/setup.ts"],"names":[],"mappings":""}
@@ -1,111 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import { type ClientServices } from '@dxos/client-protocol';
6
- import { type Any, type RequestOptions, type ServiceHandler, Stream } from '@dxos/codec-protobuf';
7
- import { raise } from '@dxos/debug';
8
- import { RpcPeer, type RpcPeerOptions, type ServiceBundle, parseMethodName } from '@dxos/rpc';
9
- import { MapCounter, trace } from '@dxos/tracing';
10
- import { type MaybePromise } from '@dxos/util';
11
-
12
- import { type ServiceRegistry } from './service-registry';
13
-
14
- export type ClientRpcServerProps = {
15
- serviceRegistry: ServiceRegistry<ClientServices>;
16
- handleCall?: (
17
- method: string,
18
- params: Any,
19
- handler: (method: string, params: Any, options?: RequestOptions) => MaybePromise<Any>,
20
- options?: RequestOptions,
21
- ) => Promise<Any>;
22
- handleStream?: (
23
- method: string,
24
- params: Any,
25
- handler: (method: string, params: Any, options?: RequestOptions) => Stream<Any>,
26
- options?: RequestOptions,
27
- ) => MaybePromise<Stream<Any>>;
28
- } & Omit<RpcPeerOptions, 'callHandler' | 'streamHandler'>;
29
-
30
- @trace.resource()
31
- export class ClientRpcServer {
32
- private readonly _serviceRegistry: ServiceRegistry<ClientServices>;
33
- private readonly _rpcPeer: RpcPeer;
34
- private readonly _handlerCache = new Map<string, ServiceHandler<any>>();
35
- private readonly _handleCall: ClientRpcServerProps['handleCall'];
36
- private readonly _handleStream: ClientRpcServerProps['handleStream'];
37
-
38
- @trace.metricsCounter()
39
- private readonly _callMetrics = new MapCounter();
40
-
41
- @trace.info()
42
- private get _services() {
43
- return Object.keys(this._serviceRegistry.services);
44
- }
45
-
46
- constructor(params: ClientRpcServerProps) {
47
- const { serviceRegistry, handleCall, handleStream, ...rpcOptions } = params;
48
- this._handleCall = handleCall;
49
- this._handleStream = handleStream;
50
-
51
- this._serviceRegistry = serviceRegistry;
52
- this._rpcPeer = new RpcPeer({
53
- ...rpcOptions,
54
- callHandler: (method, params, options) => {
55
- const [serviceName, methodName] = parseMethodName(method);
56
- const handler = (method: string, params: Any, handlerOptions?: RequestOptions) =>
57
- this._getServiceHandler(serviceName).call(method, params, handlerOptions);
58
-
59
- this._callMetrics.inc(`${serviceName}.${methodName} request`);
60
-
61
- if (this._handleCall) {
62
- return this._handleCall(methodName, params, handler, options);
63
- } else {
64
- return handler(methodName, params, options);
65
- }
66
- },
67
- streamHandler: (method, params, options) => {
68
- const [serviceName, methodName] = parseMethodName(method);
69
- const handler = (method: string, params: Any, handlerOptions?: RequestOptions) =>
70
- this._getServiceHandler(serviceName).callStream(method, params, handlerOptions);
71
-
72
- this._callMetrics.inc(`${serviceName}.${methodName} request stream`);
73
-
74
- if (this._handleStream) {
75
- return Stream.map(Stream.unwrapPromise(this._handleStream(methodName, params, handler, options)), (data) => {
76
- this._callMetrics.inc(`${serviceName}.${methodName} response stream`);
77
- return data;
78
- });
79
- } else {
80
- return handler(methodName, params, options);
81
- }
82
- },
83
- });
84
- }
85
-
86
- async open(): Promise<void> {
87
- await this._rpcPeer.open();
88
- }
89
-
90
- async close(): Promise<void> {
91
- await this._rpcPeer.close();
92
- }
93
-
94
- private _getServiceHandler(serviceName: string) {
95
- if (!this._handlerCache.has(serviceName)) {
96
- const [key, descriptor] =
97
- Object.entries(this._serviceRegistry.descriptors as ServiceBundle<Record<string, any>>).find(
98
- ([key, descriptor]) => descriptor.name === serviceName,
99
- ) ?? raise(new Error(`Service not available: ${serviceName}`));
100
-
101
- const service = this._serviceRegistry.services[key as keyof ClientServices] as any;
102
- if (!service) {
103
- throw new Error(`Service not available: ${serviceName}`);
104
- }
105
-
106
- this._handlerCache.set(serviceName, descriptor.createServer(service));
107
- }
108
-
109
- return this._handlerCache.get(serviceName)!;
110
- }
111
- }
@@ -1,78 +0,0 @@
1
- //
2
- // Copyright 2022 DXOS.org
3
- //
4
-
5
- import { describe, expect, test } from 'vitest';
6
-
7
- import { Event } from '@dxos/async';
8
- import { type ClientServices } from '@dxos/client-protocol';
9
- import { Config } from '@dxos/config';
10
- import { Context } from '@dxos/context';
11
- import { log } from '@dxos/log';
12
- import { schema } from '@dxos/protocols/proto';
13
- import { type SystemService, SystemStatus } from '@dxos/protocols/proto/dxos/client/services';
14
- import { createLinkedPorts, createProtoRpcPeer, createServiceBundle } from '@dxos/rpc';
15
-
16
- import { SystemServiceImpl } from '../system';
17
- import { createServiceContext } from '../testing';
18
- import { ServiceRegistry } from './service-registry';
19
-
20
- // TODO(burdon): Create TestService (that doesn't require peers).
21
-
22
- type TestServices = {
23
- SystemService: SystemService;
24
- };
25
-
26
- const serviceBundle = createServiceBundle<TestServices>({
27
- SystemService: schema.getService('dxos.client.services.SystemService'),
28
- });
29
-
30
- describe('service registry', () => {
31
- test('builds a service registry', async () => {
32
- const remoteSource = 'https://remote.source';
33
- const serviceContext = await createServiceContext();
34
- await serviceContext.open(new Context());
35
-
36
- const serviceRegistry = new ServiceRegistry(serviceBundle, {
37
- SystemService: new SystemServiceImpl({
38
- config: () => new Config({ runtime: { client: { remoteSource } } }),
39
- getCurrentStatus: () => SystemStatus.ACTIVE,
40
- getDiagnostics: async () => ({}),
41
- onReset: () => {},
42
- onUpdateStatus: () => {},
43
- statusUpdate: new Event(),
44
- }),
45
- });
46
-
47
- const [proxyPort, serverPort] = createLinkedPorts();
48
-
49
- const proxy = createProtoRpcPeer({
50
- requested: serviceRegistry.descriptors,
51
- exposed: {},
52
- handlers: {},
53
- port: proxyPort,
54
- });
55
-
56
- const server = createProtoRpcPeer({
57
- exposed: serviceRegistry.descriptors,
58
- handlers: serviceRegistry.services as ClientServices,
59
- port: serverPort,
60
- });
61
-
62
- log('opening...');
63
- await Promise.all([proxy.open(), server.open()]);
64
- log('open');
65
-
66
- {
67
- const config = await proxy.rpc.SystemService.getConfig();
68
- expect(config.runtime?.client?.remoteSource).to.equal(remoteSource);
69
- }
70
-
71
- // TODO(burdon): Error handling (create tests).
72
- // Uncaught Error: Request was terminated because the RPC endpoint is closed.
73
- // log('closing...');
74
- // await Promise.all([proxy.close(), server.close()]);
75
- // await serviceContext.close();
76
- // log('closed');
77
- });
78
- });
@@ -1,36 +0,0 @@
1
- //
2
- // Copyright 2022 DXOS.org
3
- //
4
-
5
- import { type ServiceBundle } from '@dxos/rpc';
6
-
7
- /**
8
- * Registry of operational services.
9
- */
10
- export class ServiceRegistry<Services> {
11
- // prettier-ignore
12
- constructor (
13
- private readonly _serviceBundle: ServiceBundle<Services>,
14
- private _handlers: Partial<Services> = {}
15
- ) {}
16
-
17
- get descriptors() {
18
- return this._serviceBundle;
19
- }
20
-
21
- get services() {
22
- return this._handlers;
23
- }
24
-
25
- setServices(services: Partial<Services>): void {
26
- this._handlers = services;
27
- }
28
-
29
- addService(name: keyof Services, service: Services[keyof Services]): void {
30
- this._handlers[name] = service;
31
- }
32
-
33
- removeService(name: keyof Services): void {
34
- delete this._handlers[name];
35
- }
36
- }
@@ -1,11 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import { runTestSignalServer } from '@dxos/signal';
6
-
7
- const port = 12004;
8
-
9
- export default async () => {
10
- await runTestSignalServer({ port, killExisting: true });
11
- };