@dxos/react-client 0.8.3 → 0.8.4-main.1068cf700f

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 (417) hide show
  1. package/.storybook/main.mts +11 -0
  2. package/.storybook/preview.mts +8 -0
  3. package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
  4. package/dist/lib/browser/chunk-5UKA2BMA.mjs +179 -0
  5. package/dist/lib/browser/chunk-5UKA2BMA.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-AL2CUQ46.mjs → chunk-LO3TU5CK.mjs} +8 -8
  7. package/dist/lib/browser/chunk-LO3TU5CK.mjs.map +7 -0
  8. package/dist/lib/browser/chunk-PFF63FPR.mjs +16 -0
  9. package/dist/lib/browser/chunk-PFF63FPR.mjs.map +7 -0
  10. package/dist/lib/browser/chunk-TSF6Y5VB.mjs +8 -0
  11. package/dist/lib/browser/chunk-TSF6Y5VB.mjs.map +7 -0
  12. package/dist/lib/browser/devtools/index.mjs +7 -6
  13. package/dist/lib/browser/devtools/index.mjs.map +3 -3
  14. package/dist/lib/browser/echo/index.mjs +67 -117
  15. package/dist/lib/browser/echo/index.mjs.map +4 -4
  16. package/dist/lib/browser/halo/index.mjs +12 -10
  17. package/dist/lib/browser/halo/index.mjs.map +3 -3
  18. package/dist/lib/browser/index.mjs +115 -13
  19. package/dist/lib/browser/index.mjs.map +4 -4
  20. package/dist/lib/browser/invitations/index.mjs +1 -1
  21. package/dist/lib/browser/mesh/index.mjs +4 -3
  22. package/dist/lib/browser/mesh/index.mjs.map +1 -1
  23. package/dist/lib/browser/meta.json +1 -1
  24. package/dist/lib/browser/testing/index.mjs +125 -119
  25. package/dist/lib/browser/testing/index.mjs.map +3 -3
  26. package/dist/lib/browser/worker.mjs +1 -1
  27. package/dist/lib/node-esm/chunk-373DPHEQ.mjs +10 -0
  28. package/dist/lib/node-esm/chunk-373DPHEQ.mjs.map +7 -0
  29. package/dist/lib/node-esm/{chunk-UYJUBYMU.mjs → chunk-AQJH2UNZ.mjs} +8 -8
  30. package/dist/lib/node-esm/chunk-AQJH2UNZ.mjs.map +7 -0
  31. package/dist/lib/node-esm/chunk-NETTSER2.mjs +17 -0
  32. package/dist/lib/node-esm/chunk-NETTSER2.mjs.map +7 -0
  33. package/dist/lib/node-esm/chunk-T3QTQHBD.mjs +180 -0
  34. package/dist/lib/node-esm/chunk-T3QTQHBD.mjs.map +7 -0
  35. package/dist/lib/node-esm/devtools/index.mjs +7 -6
  36. package/dist/lib/node-esm/devtools/index.mjs.map +3 -3
  37. package/dist/lib/node-esm/echo/index.mjs +67 -117
  38. package/dist/lib/node-esm/echo/index.mjs.map +4 -4
  39. package/dist/lib/node-esm/halo/index.mjs +12 -10
  40. package/dist/lib/node-esm/halo/index.mjs.map +3 -3
  41. package/dist/lib/node-esm/index.mjs +115 -13
  42. package/dist/lib/node-esm/index.mjs.map +4 -4
  43. package/dist/lib/node-esm/invitations/index.mjs +1 -1
  44. package/dist/lib/node-esm/mesh/index.mjs +4 -3
  45. package/dist/lib/node-esm/mesh/index.mjs.map +1 -1
  46. package/dist/lib/node-esm/meta.json +1 -1
  47. package/dist/lib/node-esm/testing/index.mjs +125 -119
  48. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  49. package/dist/lib/node-esm/worker.mjs +1 -1
  50. package/dist/types/src/client/AgentHostingProvider.d.ts.map +1 -1
  51. package/dist/types/src/client/ClientProvider.d.ts +0 -10
  52. package/dist/types/src/client/ClientProvider.d.ts.map +1 -1
  53. package/dist/types/src/echo/index.d.ts +2 -2
  54. package/dist/types/src/echo/index.d.ts.map +1 -1
  55. package/dist/types/src/echo/useMembers.d.ts +2 -2
  56. package/dist/types/src/echo/useMembers.d.ts.map +1 -1
  57. package/dist/types/src/echo/useQueue.d.ts +2 -2
  58. package/dist/types/src/echo/useQueue.d.ts.map +1 -1
  59. package/dist/types/src/echo/useSpaceInvitations.d.ts +3 -2
  60. package/dist/types/src/echo/useSpaceInvitations.d.ts.map +1 -1
  61. package/dist/types/src/echo/useSpaceProperties.d.ts +13 -0
  62. package/dist/types/src/echo/useSpaceProperties.d.ts.map +1 -0
  63. package/dist/types/src/echo/useSpaces.d.ts +17 -8
  64. package/dist/types/src/echo/useSpaces.d.ts.map +1 -1
  65. package/dist/types/src/echo/useSubscription.d.ts +1 -1
  66. package/dist/types/src/echo/useSubscription.d.ts.map +1 -1
  67. package/dist/types/src/echo/useSyncState.d.ts +1 -1
  68. package/dist/types/src/echo/useSyncState.d.ts.map +1 -1
  69. package/dist/types/src/halo/Passkey.stories.d.ts +5 -5
  70. package/dist/types/src/halo/Passkey.stories.d.ts.map +1 -1
  71. package/dist/types/src/halo/useHaloInvitations.d.ts.map +1 -1
  72. package/dist/types/src/invitations/useInvitationStatus.d.ts +1 -1
  73. package/dist/types/src/invitations/useInvitationStatus.d.ts.map +1 -1
  74. package/dist/types/src/testing/ClientRepeater.d.ts +6 -5
  75. package/dist/types/src/testing/ClientRepeater.d.ts.map +1 -1
  76. package/dist/types/src/testing/ClientRepeater.stories.d.ts +6 -10
  77. package/dist/types/src/testing/ClientRepeater.stories.d.ts.map +1 -1
  78. package/dist/types/src/testing/context.d.ts +4 -2
  79. package/dist/types/src/testing/context.d.ts.map +1 -1
  80. package/dist/types/src/testing/withClientProvider.d.ts +6 -10
  81. package/dist/types/src/testing/withClientProvider.d.ts.map +1 -1
  82. package/dist/types/src/testing/withClientProvider.stories.d.ts +8 -9
  83. package/dist/types/src/testing/withClientProvider.stories.d.ts.map +1 -1
  84. package/dist/types/tsconfig.tsbuildinfo +1 -1
  85. package/moon.yml +23 -0
  86. package/package.json +43 -32
  87. package/src/client/AgentHostingProvider.tsx +1 -1
  88. package/src/client/ClientProvider.test.tsx +3 -2
  89. package/src/client/ClientProvider.tsx +33 -50
  90. package/src/client/useConfig.test.tsx +2 -1
  91. package/src/devtools/useStream.ts +1 -1
  92. package/src/echo/index.ts +2 -2
  93. package/src/echo/useMembers.ts +5 -3
  94. package/src/echo/useQueue.ts +2 -2
  95. package/src/echo/useSpaceInvitations.ts +11 -5
  96. package/src/echo/useSpaceProperties.ts +28 -0
  97. package/src/echo/useSpaces.test.tsx +3 -2
  98. package/src/echo/useSpaces.ts +37 -20
  99. package/src/echo/useSubscription.ts +1 -1
  100. package/src/echo/useSyncState.ts +3 -3
  101. package/src/halo/Passkey.stories.tsx +17 -14
  102. package/src/halo/useDevices.test.tsx +2 -1
  103. package/src/halo/useHaloInvitations.ts +1 -1
  104. package/src/invitations/useInvitationStatus.ts +9 -8
  105. package/src/testing/ClientRepeater.stories.tsx +21 -12
  106. package/src/testing/ClientRepeater.tsx +29 -36
  107. package/src/testing/context.tsx +4 -3
  108. package/src/testing/withClientProvider.stories.tsx +32 -16
  109. package/src/testing/withClientProvider.tsx +81 -64
  110. package/tsconfig.json +3 -6
  111. package/vitest.config.ts +12 -16
  112. package/.eslintrc.cjs +0 -12
  113. package/README.yml +0 -33
  114. package/dist/lib/browser/chunk-72QD3PXL.mjs +0 -312
  115. package/dist/lib/browser/chunk-72QD3PXL.mjs.map +0 -7
  116. package/dist/lib/browser/chunk-AL2CUQ46.mjs.map +0 -7
  117. package/dist/lib/node/chunk-5RUIFUEC.cjs +0 -334
  118. package/dist/lib/node/chunk-5RUIFUEC.cjs.map +0 -7
  119. package/dist/lib/node/chunk-FYOAVV65.cjs +0 -188
  120. package/dist/lib/node/chunk-FYOAVV65.cjs.map +0 -7
  121. package/dist/lib/node/devtools/index.cjs +0 -62
  122. package/dist/lib/node/devtools/index.cjs.map +0 -7
  123. package/dist/lib/node/echo/index.cjs +0 -302
  124. package/dist/lib/node/echo/index.cjs.map +0 -7
  125. package/dist/lib/node/halo/index.cjs +0 -123
  126. package/dist/lib/node/halo/index.cjs.map +0 -7
  127. package/dist/lib/node/index.cjs +0 -55
  128. package/dist/lib/node/index.cjs.map +0 -7
  129. package/dist/lib/node/invitations/index.cjs +0 -39
  130. package/dist/lib/node/invitations/index.cjs.map +0 -7
  131. package/dist/lib/node/mesh/index.cjs +0 -37
  132. package/dist/lib/node/mesh/index.cjs.map +0 -7
  133. package/dist/lib/node/meta.json +0 -1
  134. package/dist/lib/node/testing/index.cjs +0 -278
  135. package/dist/lib/node/testing/index.cjs.map +0 -7
  136. package/dist/lib/node/worker.cjs +0 -23
  137. package/dist/lib/node/worker.cjs.map +0 -7
  138. package/dist/lib/node-esm/chunk-NBTZZNQ5.mjs +0 -314
  139. package/dist/lib/node-esm/chunk-NBTZZNQ5.mjs.map +0 -7
  140. package/dist/lib/node-esm/chunk-UYJUBYMU.mjs.map +0 -7
  141. package/dist/types/src/echo/useQuery.d.ts +0 -11
  142. package/dist/types/src/echo/useQuery.d.ts.map +0 -1
  143. package/dist/types/src/echo/useQuery.test.d.ts +0 -2
  144. package/dist/types/src/echo/useQuery.test.d.ts.map +0 -1
  145. package/dist/types/src/echo/useSchema.d.ts +0 -8
  146. package/dist/types/src/echo/useSchema.d.ts.map +0 -1
  147. package/dist/types/src/playwright/playwright.config.d.cts +0 -3
  148. package/dist/types/src/playwright/playwright.config.d.cts.map +0 -1
  149. package/dist/types/src/playwright/smoke.spec.d.ts +0 -2
  150. package/dist/types/src/playwright/smoke.spec.d.ts.map +0 -1
  151. package/project.json +0 -40
  152. package/src/echo/useQuery.test.tsx +0 -128
  153. package/src/echo/useQuery.ts +0 -56
  154. package/src/echo/useSchema.ts +0 -54
  155. package/src/playwright/playwright.config.cts +0 -18
  156. package/src/playwright/smoke.spec.ts +0 -26
  157. package/typedoc/.nojekyll +0 -1
  158. package/typedoc/assets/hierarchy.js +0 -1
  159. package/typedoc/assets/highlight.css +0 -99
  160. package/typedoc/assets/icons.js +0 -18
  161. package/typedoc/assets/icons.svg +0 -1
  162. package/typedoc/assets/main.js +0 -60
  163. package/typedoc/assets/navigation.js +0 -1
  164. package/typedoc/assets/search.js +0 -1
  165. package/typedoc/assets/style.css +0 -1640
  166. package/typedoc/classes/echo.Hypergraph.html +0 -17
  167. package/typedoc/classes/echo.PropertiesType.html +0 -19
  168. package/typedoc/classes/echo.QueryResult.html +0 -18
  169. package/typedoc/classes/halo.KeyStore.html +0 -6
  170. package/typedoc/classes/index.AgentClientServiceProvider.html +0 -10
  171. package/typedoc/classes/index.AgentManagerClient.html +0 -22
  172. package/typedoc/classes/index.AlreadyJoinedError.html +0 -15
  173. package/typedoc/classes/index.ApiError.html +0 -16
  174. package/typedoc/classes/index.CancelledError.html +0 -16
  175. package/typedoc/classes/index.Client.html +0 -51
  176. package/typedoc/classes/index.ClientServicesProxy.html +0 -12
  177. package/typedoc/classes/index.Config.html +0 -17
  178. package/typedoc/classes/index.DataCorruptionError.html +0 -16
  179. package/typedoc/classes/index.DatabaseError.html +0 -15
  180. package/typedoc/classes/index.EntityNotFoundError.html +0 -15
  181. package/typedoc/classes/index.FakeAgentHostingProvider.html +0 -7
  182. package/typedoc/classes/index.IFrameManager.html +0 -6
  183. package/typedoc/classes/index.IdentityNotInitializedError.html +0 -15
  184. package/typedoc/classes/index.InvalidConfigError.html +0 -16
  185. package/typedoc/classes/index.InvalidInvitationError.html +0 -15
  186. package/typedoc/classes/index.InvalidInvitationExtensionRoleError.html +0 -16
  187. package/typedoc/classes/index.InvalidStorageVersionError.html +0 -15
  188. package/typedoc/classes/index.LocalClientServices.html +0 -12
  189. package/typedoc/classes/index.PublicKey.html +0 -55
  190. package/typedoc/classes/index.RemoteServiceConnectionError.html +0 -15
  191. package/typedoc/classes/index.RemoteServiceConnectionTimeout.html +0 -15
  192. package/typedoc/classes/index.RpcClosedError.html +0 -15
  193. package/typedoc/classes/index.RpcNotOpenError.html +0 -15
  194. package/typedoc/classes/index.SharedWorkerConnection.html +0 -5
  195. package/typedoc/classes/index.Shell.html +0 -35
  196. package/typedoc/classes/index.ShellManager.html +0 -9
  197. package/typedoc/classes/index.SystemError.html +0 -16
  198. package/typedoc/classes/index.UnknownModelError.html +0 -15
  199. package/typedoc/classes/index.WorkerClientServices.html +0 -12
  200. package/typedoc/classes/invitations.AuthenticatingInvitationObservable.html +0 -30
  201. package/typedoc/classes/invitations.CancellableInvitationObservable.html +0 -29
  202. package/typedoc/classes/invitations.InvitationEncoder.html +0 -5
  203. package/typedoc/classes/invitations.InvitationsProxy.html +0 -12
  204. package/typedoc/enums/devtools.KeyType.html +0 -9
  205. package/typedoc/enums/echo.HaloSpaceMember.Role.html +0 -9
  206. package/typedoc/enums/echo.IndexKind.Kind.html +0 -8
  207. package/typedoc/enums/echo.QueryOptions.DataLocation.html +0 -6
  208. package/typedoc/enums/echo.QueryOptions.ShowDeletedOption.html +0 -6
  209. package/typedoc/enums/echo.ResultFormat.html +0 -10
  210. package/typedoc/enums/echo.SpaceMember.PresenceState.html +0 -5
  211. package/typedoc/enums/echo.SpaceState.html +0 -13
  212. package/typedoc/enums/echo.TextKind.html +0 -5
  213. package/typedoc/enums/halo.Device.PresenceState.html +0 -6
  214. package/typedoc/enums/halo.DeviceKind.html +0 -5
  215. package/typedoc/enums/halo.DeviceType.html +0 -9
  216. package/typedoc/enums/index.ShellDisplay.html +0 -5
  217. package/typedoc/enums/index.ShellLayout.html +0 -13
  218. package/typedoc/enums/index.SystemStatus.html +0 -5
  219. package/typedoc/enums/invitations.Invitation.AuthMethod.html +0 -6
  220. package/typedoc/enums/invitations.Invitation.Kind.html +0 -5
  221. package/typedoc/enums/invitations.Invitation.State.html +0 -13
  222. package/typedoc/enums/invitations.Invitation.Type.html +0 -6
  223. package/typedoc/enums/mesh.ConnectionState.html +0 -5
  224. package/typedoc/functions/devtools.useDevtools.html +0 -1
  225. package/typedoc/functions/devtools.useStream.html +0 -2
  226. package/typedoc/functions/echo.useMembers.html +0 -1
  227. package/typedoc/functions/echo.useQueue.html +0 -2
  228. package/typedoc/functions/echo.useSchema.html +0 -2
  229. package/typedoc/functions/echo.useSpace.html +0 -6
  230. package/typedoc/functions/echo.useSpaceInvitation.html +0 -1
  231. package/typedoc/functions/echo.useSpaceInvitations.html +0 -1
  232. package/typedoc/functions/echo.useSpaceSyncState.html +0 -2
  233. package/typedoc/functions/echo.useSpaces.html +0 -5
  234. package/typedoc/functions/echo.useSubscription.html +0 -3
  235. package/typedoc/functions/echo.useSyncState.html +0 -2
  236. package/typedoc/functions/halo.useContacts.html +0 -4
  237. package/typedoc/functions/halo.useCredentials.html +0 -1
  238. package/typedoc/functions/halo.useDevices.html +0 -1
  239. package/typedoc/functions/halo.useHaloInvitation.html +0 -1
  240. package/typedoc/functions/halo.useHaloInvitations.html +0 -1
  241. package/typedoc/functions/halo.useIdentity.html +0 -3
  242. package/typedoc/functions/halo.useKeyStore.html +0 -3
  243. package/typedoc/functions/index.AgentHostingProvider.html +0 -2
  244. package/typedoc/functions/index.useAgentHostingClient.html +0 -1
  245. package/typedoc/functions/index.useClient.html +0 -3
  246. package/typedoc/functions/index.useClientStatus.html +0 -1
  247. package/typedoc/functions/index.useConfig.html +0 -3
  248. package/typedoc/functions/index.useShell.html +0 -2
  249. package/typedoc/functions/index.useShellDisplay.html +0 -2
  250. package/typedoc/functions/index.useStatus.html +0 -1
  251. package/typedoc/functions/invitations.useInvitationStatus.html +0 -1
  252. package/typedoc/functions/mesh.useNetworkStatus.html +0 -2
  253. package/typedoc/hierarchy.html +0 -1
  254. package/typedoc/index.html +0 -23
  255. package/typedoc/interfaces/devtools.DevtoolsHook.html +0 -22
  256. package/typedoc/interfaces/devtools.DevtoolsHost.html +0 -26
  257. package/typedoc/interfaces/echo.DocAccessor.html +0 -3
  258. package/typedoc/interfaces/echo.Echo.html +0 -39
  259. package/typedoc/interfaces/echo.EchoDatabase.html +0 -25
  260. package/typedoc/interfaces/echo.Expando.html +0 -3
  261. package/typedoc/interfaces/echo.Filter.html +0 -3
  262. package/typedoc/interfaces/echo.HaloSpaceMember.html +0 -18
  263. package/typedoc/interfaces/echo.IDocHandle.html +0 -6
  264. package/typedoc/interfaces/echo.IndexKind.html +0 -9
  265. package/typedoc/interfaces/echo.Query.html +0 -34
  266. package/typedoc/interfaces/echo.QueryOptions.html +0 -39
  267. package/typedoc/interfaces/echo.Queue.html +0 -17
  268. package/typedoc/interfaces/echo.Ref.html +0 -32
  269. package/typedoc/interfaces/echo.Space.html +0 -39
  270. package/typedoc/interfaces/echo.SpaceMember.html +0 -7
  271. package/typedoc/interfaces/echo.SpaceSyncState.PeerState.html +0 -14
  272. package/typedoc/interfaces/echo.SpaceSyncState.html +0 -4
  273. package/typedoc/interfaces/echo.SubscriptionHandle.html +0 -5
  274. package/typedoc/interfaces/echo.TypedObject.html +0 -16
  275. package/typedoc/interfaces/halo.Contact.html +0 -10
  276. package/typedoc/interfaces/halo.Credential.html +0 -27
  277. package/typedoc/interfaces/halo.Device.html +0 -11
  278. package/typedoc/interfaces/halo.Halo.html +0 -16
  279. package/typedoc/interfaces/halo.Identity.html +0 -15
  280. package/typedoc/interfaces/index.AgentHostingProviderClient.html +0 -6
  281. package/typedoc/interfaces/index.AppContextRequest.html +0 -33
  282. package/typedoc/interfaces/index.ClientServicesProvider.html +0 -9
  283. package/typedoc/interfaces/index.InvitationUrlRequest.html +0 -9
  284. package/typedoc/interfaces/index.LayoutRequest.html +0 -29
  285. package/typedoc/interfaces/index.ShellRuntime.html +0 -15
  286. package/typedoc/interfaces/invitations.Invitation.html +0 -92
  287. package/typedoc/interfaces/invitations.Invitations.html +0 -5
  288. package/typedoc/interfaces/mesh.GossipMessage.html +0 -10
  289. package/typedoc/interfaces/mesh.NetworkStatus.Signal.html +0 -5
  290. package/typedoc/interfaces/mesh.NetworkStatus.html +0 -6
  291. package/typedoc/media/LICENSE +0 -8
  292. package/typedoc/modules/devtools.html +0 -1
  293. package/typedoc/modules/echo.Filter.html +0 -1
  294. package/typedoc/modules/echo.HaloSpaceMember.html +0 -1
  295. package/typedoc/modules/echo.IndexKind.html +0 -1
  296. package/typedoc/modules/echo.Query.html +0 -1
  297. package/typedoc/modules/echo.QueryOptions.html +0 -1
  298. package/typedoc/modules/echo.Ref.html +0 -2
  299. package/typedoc/modules/echo.SpaceMember.html +0 -1
  300. package/typedoc/modules/echo.SpaceSyncState.html +0 -1
  301. package/typedoc/modules/echo.html +0 -1
  302. package/typedoc/modules/halo.Device.html +0 -1
  303. package/typedoc/modules/halo.html +0 -1
  304. package/typedoc/modules/index.html +0 -1
  305. package/typedoc/modules/invitations.Invitation.html +0 -1
  306. package/typedoc/modules/invitations.html +0 -1
  307. package/typedoc/modules/mesh.NetworkStatus.html +0 -1
  308. package/typedoc/modules/mesh.html +0 -1
  309. package/typedoc/modules/worker.html +0 -1
  310. package/typedoc/modules.html +0 -1
  311. package/typedoc/types/devtools.MountOptions.html +0 -3
  312. package/typedoc/types/echo.AnyLiveObject.html +0 -2
  313. package/typedoc/types/echo.Filter.And.html +0 -1
  314. package/typedoc/types/echo.Filter.Any.html +0 -1
  315. package/typedoc/types/echo.Filter.Or.html +0 -1
  316. package/typedoc/types/echo.Filter.Props.html +0 -1
  317. package/typedoc/types/echo.Filter.Type.html +0 -1
  318. package/typedoc/types/echo.Live.html +0 -5
  319. package/typedoc/types/echo.ObjectMeta.html +0 -1
  320. package/typedoc/types/echo.ObjectMigration.html +0 -7
  321. package/typedoc/types/echo.ObjectVersion.html +0 -2
  322. package/typedoc/types/echo.PeerSyncState.html +0 -1
  323. package/typedoc/types/echo.Progress.html +0 -3
  324. package/typedoc/types/echo.PropertiesTypeProps.html +0 -1
  325. package/typedoc/types/echo.Query.Any.html +0 -1
  326. package/typedoc/types/echo.Query.TextSearchOptions.html +0 -2
  327. package/typedoc/types/echo.Query.Type.html +0 -1
  328. package/typedoc/types/echo.Ref.Target.html +0 -2
  329. package/typedoc/types/echo.Selection.html +0 -1
  330. package/typedoc/types/echo.SpaceId.html +0 -6
  331. package/typedoc/types/echo.SpaceSyncStateMap.html +0 -1
  332. package/typedoc/types/echo.UseQueueOptions.html +0 -2
  333. package/typedoc/types/echo.UseSpacesParams.html +0 -3
  334. package/typedoc/types/index.AgentHostingProviderProps.html +0 -3
  335. package/typedoc/types/index.ClientContextProps.html +0 -3
  336. package/typedoc/types/index.ClientOptions.html +0 -12
  337. package/typedoc/types/index.ClientProviderProps.html +0 -2
  338. package/typedoc/types/index.ClientServices.html +0 -15
  339. package/typedoc/types/index.FromAgentOptions.html +0 -2
  340. package/typedoc/types/index.PublicKeyLike.html +0 -2
  341. package/typedoc/types/invitations.InvitationAction.html +0 -1
  342. package/typedoc/types/invitations.InvitationResult.html +0 -5
  343. package/typedoc/types/invitations.InvitationStatus.html +0 -15
  344. package/typedoc/variables/devtools.mountDevtoolsHooks.html +0 -1
  345. package/typedoc/variables/devtools.unmountDevtoolsHooks.html +0 -1
  346. package/typedoc/variables/echo.DocAccessor.html +0 -1
  347. package/typedoc/variables/echo.EchoObjectSchema.html +0 -1
  348. package/typedoc/variables/echo.Expando.html +0 -1
  349. package/typedoc/variables/echo.FQ_ID_LENGTH.html +0 -1
  350. package/typedoc/variables/echo.Filter.html +0 -1
  351. package/typedoc/variables/echo.OBJECT_ID_LENGTH.html +0 -1
  352. package/typedoc/variables/echo.ObjectVersion.html +0 -1
  353. package/typedoc/variables/echo.Query.html +0 -1
  354. package/typedoc/variables/echo.Queue.html +0 -1
  355. package/typedoc/variables/echo.ReactiveObjectSchema.html +0 -1
  356. package/typedoc/variables/echo.Ref.html +0 -2
  357. package/typedoc/variables/echo.RefArray.html +0 -2
  358. package/typedoc/variables/echo.SPACE_ID_LENGTH.html +0 -1
  359. package/typedoc/variables/echo.SpaceId.html +0 -1
  360. package/typedoc/variables/echo.SpaceSchema.html +0 -1
  361. package/typedoc/variables/echo.TypedObject.html +0 -3
  362. package/typedoc/variables/echo.compareForeignKeys.html +0 -1
  363. package/typedoc/variables/echo.createDocAccessor.html +0 -1
  364. package/typedoc/variables/echo.createEmptyEdgeSyncState.html +0 -1
  365. package/typedoc/variables/echo.createObject.html +0 -1
  366. package/typedoc/variables/echo.createQueueDXN.html +0 -2
  367. package/typedoc/variables/echo.createSubscription.html +0 -5
  368. package/typedoc/variables/echo.defineObjectMigration.html +0 -1
  369. package/typedoc/variables/echo.fromCursor.html +0 -1
  370. package/typedoc/variables/echo.fullyQualifiedId.html +0 -4
  371. package/typedoc/variables/echo.getMeta.html +0 -1
  372. package/typedoc/variables/echo.getObjectCore.html +0 -1
  373. package/typedoc/variables/echo.getRangeFromCursor.html +0 -1
  374. package/typedoc/variables/echo.getSchema.html +0 -2
  375. package/typedoc/variables/echo.getSource.html +0 -4
  376. package/typedoc/variables/echo.getSpace.html +0 -1
  377. package/typedoc/variables/echo.getSyncSummary.html +0 -1
  378. package/typedoc/variables/echo.getTarget.html +0 -4
  379. package/typedoc/variables/echo.getTextInRange.html +0 -2
  380. package/typedoc/variables/echo.getType.html +0 -5
  381. package/typedoc/variables/echo.getTypename.html +0 -6
  382. package/typedoc/variables/echo.getVersion.html +0 -3
  383. package/typedoc/variables/echo.importSpace.html +0 -1
  384. package/typedoc/variables/echo.internalDecodeReference.html +0 -1
  385. package/typedoc/variables/echo.isEchoObject.html +0 -2
  386. package/typedoc/variables/echo.isLiveObject.html +0 -2
  387. package/typedoc/variables/echo.isRelation.html +0 -2
  388. package/typedoc/variables/echo.isSpace.html +0 -1
  389. package/typedoc/variables/echo.live.html +0 -3
  390. package/typedoc/variables/echo.loadObjectReferences.html +0 -7
  391. package/typedoc/variables/echo.makeRef.html +0 -2
  392. package/typedoc/variables/echo.parseFullyQualifiedId.html +0 -2
  393. package/typedoc/variables/echo.parseId.html +0 -1
  394. package/typedoc/variables/echo.refFromDXN.html +0 -2
  395. package/typedoc/variables/echo.toCursor.html +0 -1
  396. package/typedoc/variables/echo.toCursorRange.html +0 -1
  397. package/typedoc/variables/echo.updateText.html +0 -6
  398. package/typedoc/variables/echo.useQuery.html +0 -2
  399. package/typedoc/variables/index.AgentHostingContext.html +0 -1
  400. package/typedoc/variables/index.ClientProvider.html +0 -3
  401. package/typedoc/variables/index.DXOS_VERSION.html +0 -1
  402. package/typedoc/variables/index.Defaults.html +0 -2
  403. package/typedoc/variables/index.Dynamics.html +0 -2
  404. package/typedoc/variables/index.Envs.html +0 -2
  405. package/typedoc/variables/index.Local.html +0 -2
  406. package/typedoc/variables/index.Remote.html +0 -1
  407. package/typedoc/variables/index.Storage.html +0 -2
  408. package/typedoc/variables/index.createClientServices.html +0 -4
  409. package/typedoc/variables/index.fromAgent.html +0 -2
  410. package/typedoc/variables/index.fromHost.html +0 -2
  411. package/typedoc/variables/index.fromSocket.html +0 -2
  412. package/typedoc/variables/index.fromWorker.html +0 -2
  413. package/typedoc/variables/index.getUnixSocket.html +0 -1
  414. package/typedoc/variables/index.resolveRef.html +0 -1
  415. package/typedoc/variables/index.useMulticastObservable.html +0 -3
  416. package/typedoc/variables/worker.getWorkerServiceHost.html +0 -1
  417. package/typedoc/variables/worker.onconnect.html +0 -1
@@ -1,62 +1,57 @@
1
1
  import {
2
2
  ClientProvider
3
- } from "../chunk-72QD3PXL.mjs";
3
+ } from "../chunk-5UKA2BMA.mjs";
4
+ import "../chunk-TSF6Y5VB.mjs";
4
5
 
5
- // packages/sdk/react-client/src/testing/index.ts
6
+ // src/testing/index.ts
6
7
  export * from "@dxos/client/testing";
7
8
 
8
- // packages/sdk/react-client/src/testing/context.tsx
9
+ // src/testing/context.tsx
9
10
  import { createContext, useContext } from "react";
10
11
  import { raise } from "@dxos/debug";
11
12
  var ClientStory = /* @__PURE__ */ createContext(void 0);
12
- var useClientProvider = () => {
13
+ var useClientStory = () => {
13
14
  return useContext(ClientStory) ?? raise(new Error("Missing ClientStory"));
14
15
  };
15
16
 
16
- // packages/sdk/react-client/src/testing/ClientRepeater.tsx
17
- import React, { useState, useEffect, useRef } from "react";
17
+ // src/testing/ClientRepeater.tsx
18
+ import React, { useRef, useState } from "react";
18
19
  import { Client } from "@dxos/client";
19
20
  import { TestBuilder, performInvitation } from "@dxos/client/testing";
20
- import { registerSignalsRuntime } from "@dxos/echo-signals/react";
21
21
  import { faker } from "@dxos/random";
22
+ import { useAsyncEffect } from "@dxos/react-hooks";
22
23
  var ClientRepeater = (props) => {
23
- const { component: Component, controls: Controls, count = 1, types, createIdentity, createSpace, onSpaceCreated } = props;
24
- useEffect(() => {
25
- registerSignalsRuntime();
26
- }, []);
24
+ const { component: Component, controls: Controls, count = 1, types, createIdentity, createSpace, onCreateSpace } = props;
27
25
  const [clients, setClients] = useState(props.clients ?? []);
28
- const [spaceKey, setSpaceKey] = useState();
26
+ const [spaceId, setSpaceId] = useState();
29
27
  const testBuilder = useRef(new TestBuilder());
30
- useEffect(() => {
31
- const timeout = setTimeout(async () => {
32
- const clients2 = [
33
- ...Array(count)
34
- ].map((_) => new Client({
35
- services: testBuilder.current.createLocalClientServices(),
36
- types
37
- }));
38
- await Promise.all(clients2.map((client) => client.initialize()));
39
- if (createIdentity || createSpace) {
40
- await Promise.all(clients2.map((client) => client.halo.createIdentity()));
41
- }
42
- if (createSpace) {
43
- const client = clients2[0];
44
- const space = await client.spaces.create({
45
- name: faker.commerce.productName()
46
- });
47
- setSpaceKey(space.key);
48
- await onSpaceCreated?.({
49
- client,
50
- space
51
- }, {});
52
- await Promise.all(clients2.slice(1).flatMap((client2) => performInvitation({
53
- host: space,
54
- guest: client2.spaces
55
- })));
56
- }
57
- setClients(clients2);
58
- });
59
- return () => clearTimeout(timeout);
28
+ useAsyncEffect(async () => {
29
+ const clients2 = [
30
+ ...Array(count)
31
+ ].map((_) => new Client({
32
+ services: testBuilder.current.createLocalClientServices(),
33
+ types
34
+ }));
35
+ await Promise.all(clients2.map((client) => client.initialize()));
36
+ if (createIdentity || createSpace) {
37
+ await Promise.all(clients2.map((client) => client.halo.createIdentity()));
38
+ }
39
+ if (createSpace) {
40
+ const client = clients2[0];
41
+ const space = await client.spaces.create({
42
+ name: faker.commerce.productName()
43
+ });
44
+ setSpaceId(space.id);
45
+ await onCreateSpace?.({
46
+ client,
47
+ space
48
+ }, {});
49
+ await Promise.all(clients2.slice(1).flatMap((client2) => performInvitation({
50
+ host: space,
51
+ guest: client2.spaces
52
+ })));
53
+ }
54
+ setClients(clients2);
60
55
  }, []);
61
56
  if (clients.length === 0) {
62
57
  return null;
@@ -69,26 +64,28 @@ var ClientRepeater = (props) => {
69
64
  }, /* @__PURE__ */ React.createElement(Component, {
70
65
  id: index,
71
66
  count: clients.length,
72
- spaceKey,
67
+ spaceId,
73
68
  ...props.args
74
69
  }))));
75
70
  };
76
71
 
77
- // packages/sdk/react-client/src/testing/withClientProvider.tsx
78
- import React2, { createContext as createContext2, useContext as useContext2, useEffect as useEffect2, useRef as useRef2, useState as useState2 } from "react";
79
- import { ErrorBoundary as NativeErrorBoundary } from "react-error-boundary";
72
+ // src/testing/withClientProvider.tsx
73
+ import React2, { useCallback, useEffect, useMemo, useRef as useRef2, useState as useState2 } from "react";
74
+ import { ErrorBoundary as NaturalErrorBoundary } from "react-error-boundary";
80
75
  import { Trigger } from "@dxos/async";
81
- import { performInvitation as performInvitation2, TestBuilder as TestBuilder2 } from "@dxos/client/testing";
76
+ import { TestBuilder as TestBuilder2, performInvitation as performInvitation2 } from "@dxos/client/testing";
82
77
  import { log } from "@dxos/log";
83
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/sdk/react-client/src/testing/withClientProvider.tsx";
84
- var initializeClient = async (client, { createIdentity, createSpace, onSpaceCreated, onIdentityCreated, onInitialized }, context) => {
78
+ var __dxlog_file = "/__w/dxos/dxos/packages/sdk/react-client/src/testing/withClientProvider.tsx";
79
+ var initializeClient = async (client, { createIdentity, createSpace, onCreateIdentity, onCreateSpace, onInitialized }, context) => {
85
80
  await onInitialized?.(client);
86
81
  if (createIdentity || createSpace) {
87
82
  if (!client.halo.identity.get()) {
88
83
  await client.halo.createIdentity();
89
- await onIdentityCreated?.({
84
+ await client.spaces.waitUntilReady();
85
+ await client.spaces.default.waitUntilReady();
86
+ await onCreateIdentity?.({
90
87
  client
91
- });
88
+ }, context);
92
89
  }
93
90
  }
94
91
  let space;
@@ -96,24 +93,26 @@ var initializeClient = async (client, { createIdentity, createSpace, onSpaceCrea
96
93
  space = await client.spaces.create({
97
94
  name: "Test Space"
98
95
  });
99
- await onSpaceCreated?.({
96
+ await space.waitUntilReady();
97
+ await onCreateSpace?.({
100
98
  client,
101
99
  space
102
100
  }, context);
103
101
  }
104
102
  return {
105
- space
103
+ space,
104
+ spaceId: space?.id
106
105
  };
107
106
  };
108
- var withClientProvider = ({ createIdentity, createSpace, onSpaceCreated, onIdentityCreated, onInitialized, ...props } = {}) => {
107
+ var withClientProvider = ({ createIdentity, createSpace, onCreateSpace, onCreateIdentity, onInitialized, ...props } = {}) => {
109
108
  return (Story, context) => {
110
109
  const [data, setData] = useState2({});
111
110
  const handleInitialized = async (client) => {
112
111
  const data2 = await initializeClient(client, {
113
112
  createIdentity,
114
113
  createSpace,
115
- onSpaceCreated,
116
- onIdentityCreated,
114
+ onCreateSpace,
115
+ onCreateIdentity,
117
116
  onInitialized
118
117
  }, context);
119
118
  setData(data2);
@@ -126,83 +125,91 @@ var withClientProvider = ({ createIdentity, createSpace, onSpaceCreated, onIdent
126
125
  }, /* @__PURE__ */ React2.createElement(Story, null))));
127
126
  };
128
127
  };
129
- var MultiClientContext = /* @__PURE__ */ createContext2({
130
- id: 0
131
- });
132
- var useMultiClient = () => useContext2(MultiClientContext);
133
- var withMultiClientProvider = ({ numClients = 2, createIdentity, createSpace, onSpaceCreated, onIdentityCreated, onInitialized, ...props }) => {
128
+ var withMultiClientProvider = ({ numClients = 2, createIdentity, createSpace, onCreateSpace, onCreateIdentity, onInitialized, ...props }) => {
134
129
  return (Story, context) => {
135
- const builder = useRef2(new TestBuilder2());
136
- const hostRef = useRef2();
137
130
  const spaceReady = useRef2(new Trigger());
138
- const handleInitialized = async (client, index) => {
139
- log.info("initialized", {
140
- index
141
- }, {
142
- F: __dxlog_file,
143
- L: 129,
144
- S: void 0,
145
- C: (f, a) => f(...a)
131
+ const [spaceId, setSpaceId] = useState2();
132
+ const clients = useMemo(() => {
133
+ const buidler = new TestBuilder2();
134
+ return Array.from({
135
+ length: numClients
136
+ }).map(() => {
137
+ return {
138
+ services: buidler.createLocalClientServices()
139
+ };
146
140
  });
147
- if (createSpace) {
148
- if (!hostRef.current) {
149
- hostRef.current = client;
150
- const { space } = await initializeClient(client, {
151
- createIdentity,
152
- createSpace,
153
- onSpaceCreated,
154
- onIdentityCreated,
155
- onInitialized
156
- }, context);
157
- spaceReady.current.wake(space);
158
- log.info("inviting", {
159
- index
141
+ }, [
142
+ numClients
143
+ ]);
144
+ const handleInitialized = useCallback(async (client, index) => {
145
+ if (index === 0) {
146
+ const { space } = await initializeClient(client, {
147
+ createIdentity,
148
+ createSpace,
149
+ onCreateSpace,
150
+ onCreateIdentity,
151
+ onInitialized
152
+ }, context);
153
+ log.info("inviting", {
154
+ index,
155
+ spaceId: space?.id
156
+ }, {
157
+ F: __dxlog_file,
158
+ L: 150,
159
+ S: void 0,
160
+ C: (f, a) => f(...a)
161
+ });
162
+ setSpaceId(space?.id);
163
+ spaceReady.current.wake(space);
164
+ } else {
165
+ await initializeClient(client, {
166
+ createIdentity,
167
+ onInitialized
168
+ }, context);
169
+ log.info("waiting", {
170
+ index
171
+ }, {
172
+ F: __dxlog_file,
173
+ L: 157,
174
+ S: void 0,
175
+ C: (f, a) => f(...a)
176
+ });
177
+ const space = await spaceReady.current.wait();
178
+ if (space) {
179
+ log.info("joining", {
180
+ index,
181
+ spaceId: space.id
160
182
  }, {
161
183
  F: __dxlog_file,
162
- L: 146,
184
+ L: 160,
163
185
  S: void 0,
164
186
  C: (f, a) => f(...a)
165
187
  });
166
- } else {
167
- await initializeClient(client, {
168
- createIdentity,
169
- onInitialized
170
- }, context);
171
- const space = await spaceReady.current.wait();
172
- if (space) {
173
- log.info("joining", {
174
- index
175
- }, {
176
- F: __dxlog_file,
177
- L: 151,
178
- S: void 0,
179
- C: (f, a) => f(...a)
180
- });
181
- await Promise.all(performInvitation2({
182
- host: space,
183
- guest: client.spaces
184
- }));
185
- }
188
+ await Promise.all(performInvitation2({
189
+ host: space,
190
+ guest: client.spaces
191
+ }));
186
192
  }
187
193
  }
188
- };
189
- return /* @__PURE__ */ React2.createElement(ErrorBoundary, null, Array.from({
190
- length: numClients
191
- }).map((_, index) => /* @__PURE__ */ React2.createElement(MultiClientContext.Provider, {
194
+ }, []);
195
+ return /* @__PURE__ */ React2.createElement("div", {
196
+ className: "absolute inset-0 grid grid-flow-col auto-cols-fr gap-4 overflow-hidden"
197
+ }, clients.map((client, index) => /* @__PURE__ */ React2.createElement(ClientProvider, {
192
198
  key: index,
199
+ services: client.services,
200
+ onInitialized: (client2) => handleInitialized(client2, index),
201
+ ...props
202
+ }, /* @__PURE__ */ React2.createElement(ClientStory.Provider, {
193
203
  value: {
194
- id: index
204
+ index,
205
+ spaceId
195
206
  }
196
- }, /* @__PURE__ */ React2.createElement(ClientProvider, {
197
- services: builder.current.createLocalClientServices(),
198
- onInitialized: (client) => handleInitialized(client, index),
199
- ...props
200
- }, /* @__PURE__ */ React2.createElement(Story, null)))));
207
+ }, /* @__PURE__ */ React2.createElement(ErrorBoundary, null, /* @__PURE__ */ React2.createElement(Story, null))))));
201
208
  };
202
209
  };
203
210
  var ErrorBoundary = ({ children }) => {
204
211
  const [error, setError] = useState2();
205
- useEffect2(() => {
212
+ useEffect(() => {
206
213
  const handleError = (event) => {
207
214
  setError(event.reason);
208
215
  };
@@ -215,7 +222,7 @@ var ErrorBoundary = ({ children }) => {
215
222
  resetErrorBoundary: () => setError(void 0)
216
223
  });
217
224
  }
218
- return /* @__PURE__ */ React2.createElement(NativeErrorBoundary, {
225
+ return /* @__PURE__ */ React2.createElement(NaturalErrorBoundary, {
219
226
  FallbackComponent: ErrorFallback
220
227
  }, children);
221
228
  };
@@ -239,8 +246,7 @@ var ErrorFallback = ({ error }) => {
239
246
  export {
240
247
  ClientRepeater,
241
248
  ClientStory,
242
- useClientProvider,
243
- useMultiClient,
249
+ useClientStory,
244
250
  withClientProvider,
245
251
  withMultiClientProvider
246
252
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/testing/index.ts", "../../../../src/testing/context.tsx", "../../../../src/testing/ClientRepeater.tsx", "../../../../src/testing/withClientProvider.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2020 DXOS.org\n//\n\nexport * from '@dxos/client/testing';\n\nexport * from './context';\nexport * from './ClientRepeater';\nexport * from './withClientProvider';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { createContext, useContext } from 'react';\n\nimport { type Space } from '@dxos/client/echo';\nimport { raise } from '@dxos/debug';\n\nexport type ClientStory = {\n space?: Space;\n};\n\n// TODO(wittjosiah): Add to multi-client as well.\nexport const ClientStory = createContext<ClientStory | undefined>(undefined);\n\nexport const useClientProvider = (): ClientStory => {\n return useContext(ClientStory) ?? raise(new Error('Missing ClientStory'));\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport React, { useState, type FC, useEffect, useRef } from 'react';\n\nimport { Client, type PublicKey } from '@dxos/client';\nimport { TestBuilder, performInvitation } from '@dxos/client/testing';\nimport { type TypedObject } from '@dxos/echo-schema';\nimport { registerSignalsRuntime } from '@dxos/echo-signals/react';\nimport { faker } from '@dxos/random';\n\nimport { type WithClientProviderProps } from './withClientProvider';\nimport { ClientProvider } from '../client';\n\nexport type ClientRepeatedComponentProps = { id: number; count: number; spaceKey?: PublicKey };\n\nexport type ClientRepeaterControlsProps = { clients: Client[] };\n\n// TODO(burdon): Reconcile with ClientProviderProps.\nexport type ClientRepeaterProps<P extends ClientRepeatedComponentProps> = {\n className?: string;\n component: FC<ClientRepeatedComponentProps>;\n controls?: FC<ClientRepeaterControlsProps>;\n count?: number;\n clients?: Client[];\n types?: TypedObject[];\n args?: Omit<P, 'id' | 'count'>;\n} & Pick<WithClientProviderProps, 'createIdentity' | 'createSpace' | 'onSpaceCreated'>;\n\n/**\n * Utility component for Storybook stories which sets up clients for n peers.\n * The `Component` property is rendered n times, once for each peer.\n * @deprecated use `withClientProvider`.\n */\n// TODO(burdon): To discuss: evolve ClientRepeater with optional decorator that uses it.\n// NOTE: This is specifically not a storybook decorator because it broke stories as a decorator.\n// This seems primarily due to the fact that it required top-level await for the clients to initialize.\n// Storybook seemed to handle it alright, but Chromatic had a lot of trouble with it.\n// There was also a question of whether or not calling the story function multiple times was a good idea.\nexport const ClientRepeater = <P extends ClientRepeatedComponentProps>(props: ClientRepeaterProps<P>) => {\n const {\n component: Component,\n controls: Controls,\n count = 1,\n types,\n createIdentity,\n createSpace,\n onSpaceCreated,\n } = props;\n useEffect(() => {\n registerSignalsRuntime();\n }, []);\n\n const [clients, setClients] = useState(props.clients ?? []);\n const [spaceKey, setSpaceKey] = useState<PublicKey>();\n\n const testBuilder = useRef(new TestBuilder());\n useEffect(() => {\n const timeout = setTimeout(async () => {\n const clients = [...Array(count)].map(\n (_) => new Client({ services: testBuilder.current.createLocalClientServices(), types }),\n );\n\n await Promise.all(clients.map((client) => client.initialize()));\n if (createIdentity || createSpace) {\n await Promise.all(clients.map((client) => client.halo.createIdentity()));\n }\n\n if (createSpace) {\n const client = clients[0];\n const space = await client.spaces.create({ name: faker.commerce.productName() });\n setSpaceKey(space.key);\n await onSpaceCreated?.({ client, space }, {});\n await Promise.all(\n clients.slice(1).flatMap((client) => performInvitation({ host: space, guest: client.spaces })),\n );\n }\n\n setClients(clients);\n });\n\n return () => clearTimeout(timeout);\n }, []);\n\n if (clients.length === 0) {\n return null;\n }\n\n return (\n <>\n {Controls && <Controls clients={clients} />}\n {clients.map((client, index) => (\n <ClientProvider key={index} client={client}>\n <Component id={index} count={clients.length} spaceKey={spaceKey} {...{ ...props.args }} />\n </ClientProvider>\n ))}\n </>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type StoryContext, type Decorator } from '@storybook/react';\nimport React, { createContext, type PropsWithChildren, useContext, useEffect, useRef, useState } from 'react';\nimport { type FallbackProps, ErrorBoundary as NativeErrorBoundary } from 'react-error-boundary';\n\nimport { Trigger } from '@dxos/async';\nimport { type Client } from '@dxos/client';\nimport { type Space } from '@dxos/client/echo';\nimport { performInvitation, TestBuilder } from '@dxos/client/testing';\nimport { log } from '@dxos/log';\nimport { type MaybePromise } from '@dxos/util';\n\nimport { ClientStory } from './context';\nimport { ClientProvider, type ClientProviderProps } from '../client';\n\ntype InitializeProps = {\n createIdentity?: boolean;\n createSpace?: boolean;\n onInitialized?: (client: Client) => MaybePromise<void>;\n onIdentityCreated?: (props: { client: Client }) => MaybePromise<void>;\n // NOTE: context must be untyped until ClientRepeater is removed.\n onSpaceCreated?: (props: { client: Client; space: Space }, context: StoryContext | any) => MaybePromise<void>;\n};\n\n/**\n * Initialize client, identity and first space.\n */\nconst initializeClient = async (\n client: Client,\n { createIdentity, createSpace, onSpaceCreated, onIdentityCreated, onInitialized }: InitializeProps,\n context: StoryContext,\n): Promise<ClientStory> => {\n await onInitialized?.(client);\n\n if (createIdentity || createSpace) {\n if (!client.halo.identity.get()) {\n await client.halo.createIdentity();\n await onIdentityCreated?.({ client });\n }\n }\n\n let space: Space | undefined;\n if (createSpace) {\n space = await client.spaces.create({ name: 'Test Space' });\n await onSpaceCreated?.({ client, space }, context);\n }\n\n return { space };\n};\n\nexport type WithClientProviderProps = InitializeProps & Omit<ClientProviderProps, 'onInitialized'>;\n\n/**\n * Decorator that provides the client context.\n */\nexport const withClientProvider = ({\n createIdentity,\n createSpace,\n onSpaceCreated,\n onIdentityCreated,\n onInitialized,\n ...props\n}: WithClientProviderProps = {}): Decorator => {\n return (Story, context) => {\n const [data, setData] = useState<ClientStory>({});\n const handleInitialized = async (client: Client) => {\n const data = await initializeClient(\n client,\n {\n createIdentity,\n createSpace,\n onSpaceCreated,\n onIdentityCreated,\n onInitialized,\n },\n context,\n );\n\n setData(data);\n };\n\n return (\n <ErrorBoundary>\n <ClientProvider onInitialized={handleInitialized} {...props}>\n <ClientStory.Provider value={data}>\n <Story />\n </ClientStory.Provider>\n </ClientProvider>\n </ErrorBoundary>\n );\n };\n};\n\n// TODO(burdon): Implement context per client for context.\n// TODO(burdon): Callback once all invitations have completed.\n// TODO(burdon): Delay/jitter for creation of other clients.\nexport type WithMultiClientProviderProps = InitializeProps &\n Omit<ClientProviderProps, 'onInitialized'> & { numClients?: number };\n\nconst MultiClientContext = createContext<{ id: number }>({ id: 0 });\n\nexport const useMultiClient = () => useContext(MultiClientContext);\n\n/**\n * Decorator that creates a scaffold for multiple clients.\n * Orchestrates invitations between a randomly selected host and the remaining clients.\n * NOTE: Should come before withLayout.\n */\nexport const withMultiClientProvider = ({\n numClients = 2,\n createIdentity,\n createSpace,\n onSpaceCreated,\n onIdentityCreated,\n onInitialized,\n ...props\n}: WithMultiClientProviderProps): Decorator => {\n return (Story, context) => {\n const builder = useRef(new TestBuilder());\n const hostRef = useRef<Client>();\n const spaceReady = useRef(new Trigger<Space | undefined>());\n\n // Handle invitations.\n // NOTE: The zeroth client isn't necessarily the first to be initialized.\n const handleInitialized = async (client: Client, index: number) => {\n log.info('initialized', { index });\n if (createSpace) {\n if (!hostRef.current) {\n hostRef.current = client;\n const { space } = await initializeClient(\n client,\n {\n createIdentity,\n createSpace,\n onSpaceCreated,\n onIdentityCreated,\n onInitialized,\n },\n context,\n );\n\n spaceReady.current.wake(space);\n log.info('inviting', { index });\n } else {\n await initializeClient(client, { createIdentity, onInitialized }, context);\n const space = await spaceReady.current.wait();\n if (space) {\n log.info('joining', { index });\n await Promise.all(performInvitation({ host: space, guest: client.spaces }));\n }\n }\n }\n };\n\n return (\n <ErrorBoundary>\n {Array.from({ length: numClients }).map((_, index) => (\n <MultiClientContext.Provider key={index} value={{ id: index }}>\n <ClientProvider\n services={builder.current.createLocalClientServices()}\n onInitialized={(client) => handleInitialized(client, index)}\n {...props}\n >\n <Story />\n </ClientProvider>\n </MultiClientContext.Provider>\n ))}\n </ErrorBoundary>\n );\n };\n};\n\nconst ErrorBoundary = ({ children }: PropsWithChildren) => {\n const [error, setError] = useState<Error>();\n useEffect(() => {\n const handleError = (event: PromiseRejectionEvent) => {\n setError(event.reason);\n };\n\n window.addEventListener('unhandledrejection', handleError);\n return () => window.removeEventListener('unhandledrejection', handleError);\n }, []);\n\n if (error) {\n return <ErrorFallback error={error} resetErrorBoundary={() => setError(undefined)} />;\n }\n\n return <NativeErrorBoundary FallbackComponent={ErrorFallback}>{children}</NativeErrorBoundary>;\n};\n\nconst ErrorFallback = ({ error }: FallbackProps) => {\n const { name, message, stack } =\n error instanceof Error ? error : { name: 'Error', message: String(error), stack: undefined };\n return (\n <div role='alert' className='flex flex-col p-4 gap-4 overflow-auto'>\n <h1 className='text-xl text-red-500'>{name}</h1>\n <div className='text-lg'>{message}</div>\n {stack && <pre className='whitespace-pre-wrap text-sm text-subdued'>{stack}</pre>}\n </div>\n );\n};\n"],
5
- "mappings": "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",
6
- "names": ["createContext", "useContext", "raise", "ClientStory", "createContext", "undefined", "useClientProvider", "useContext", "raise", "Error", "React", "useState", "useEffect", "useRef", "Client", "TestBuilder", "performInvitation", "registerSignalsRuntime", "faker", "ClientRepeater", "props", "component", "Component", "controls", "Controls", "count", "types", "createIdentity", "createSpace", "onSpaceCreated", "useEffect", "registerSignalsRuntime", "clients", "setClients", "useState", "spaceKey", "setSpaceKey", "testBuilder", "useRef", "TestBuilder", "timeout", "setTimeout", "Array", "map", "_", "Client", "services", "current", "createLocalClientServices", "Promise", "all", "client", "initialize", "halo", "space", "spaces", "create", "name", "faker", "commerce", "productName", "key", "slice", "flatMap", "performInvitation", "host", "guest", "clearTimeout", "length", "index", "ClientProvider", "id", "args", "React", "createContext", "useContext", "useEffect", "useRef", "useState", "ErrorBoundary", "NativeErrorBoundary", "Trigger", "performInvitation", "TestBuilder", "log", "initializeClient", "client", "createIdentity", "createSpace", "onSpaceCreated", "onIdentityCreated", "onInitialized", "context", "halo", "identity", "get", "space", "spaces", "create", "name", "withClientProvider", "props", "Story", "data", "setData", "useState", "handleInitialized", "React", "ErrorBoundary", "ClientProvider", "ClientStory", "Provider", "value", "MultiClientContext", "createContext", "id", "useMultiClient", "useContext", "withMultiClientProvider", "numClients", "builder", "useRef", "TestBuilder", "hostRef", "spaceReady", "Trigger", "index", "log", "info", "current", "wake", "wait", "Promise", "all", "performInvitation", "host", "guest", "Array", "from", "length", "map", "_", "key", "services", "createLocalClientServices", "children", "error", "setError", "useEffect", "handleError", "event", "reason", "window", "addEventListener", "removeEventListener", "ErrorFallback", "resetErrorBoundary", "undefined", "NativeErrorBoundary", "FallbackComponent", "message", "stack", "Error", "String", "div", "role", "className", "h1", "pre"]
4
+ "sourcesContent": ["//\n// Copyright 2020 DXOS.org\n//\n\nexport * from '@dxos/client/testing';\n\nexport * from './context';\nexport * from './ClientRepeater';\nexport * from './withClientProvider';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { createContext, useContext } from 'react';\n\nimport { type Space, type SpaceId } from '@dxos/client/echo';\nimport { raise } from '@dxos/debug';\n\nexport type ClientStory = {\n index?: number;\n spaceId?: SpaceId;\n space?: Space;\n};\n\nexport const ClientStory = createContext<ClientStory | undefined>(undefined);\n\nexport const useClientStory = (): ClientStory => {\n return useContext(ClientStory) ?? raise(new Error('Missing ClientStory'));\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport React, { type FC, useRef, useState } from 'react';\n\nimport { Client } from '@dxos/client';\nimport { TestBuilder, performInvitation } from '@dxos/client/testing';\nimport { type Type } from '@dxos/echo';\nimport { faker } from '@dxos/random';\nimport { useAsyncEffect } from '@dxos/react-hooks';\n\nimport { ClientProvider } from '../client';\nimport { type SpaceId } from '../echo';\n\nimport { type WithClientProviderProps } from './withClientProvider';\n\nexport type ClientRepeatedComponentProps = { id: number; count: number; spaceId?: SpaceId };\n\nexport type ClientRepeaterControlsProps = { clients: Client[] };\n\n// TODO(burdon): Reconcile with ClientProviderProps.\nexport type ClientRepeaterProps<P extends ClientRepeatedComponentProps> = {\n className?: string;\n component: FC<ClientRepeatedComponentProps>;\n controls?: FC<ClientRepeaterControlsProps>;\n count?: number;\n clients?: Client[];\n types?: Type.Obj.Any[];\n args?: Omit<P, 'id' | 'count'>;\n} & Pick<WithClientProviderProps, 'createIdentity' | 'createSpace' | 'onCreateSpace'>;\n\n/**\n * Utility component for Storybook stories which sets up clients for n peers.\n * The `Component` property is rendered n times, once for each peer.\n * @deprecated use `withClientProvider`.\n */\n// TODO(burdon): To discuss: evolve ClientRepeater with optional decorator that uses it.\n// NOTE: This is specifically not a storybook decorator because it broke stories as a decorator.\n// This seems primarily due to the fact that it required top-level await for the clients to initialize.\n// Storybook seemed to handle it alright, but Chromatic had a lot of trouble with it.\n// There was also a question of whether or not calling the story function multiple times was a good idea.\nexport const ClientRepeater = <P extends ClientRepeatedComponentProps>(props: ClientRepeaterProps<P>) => {\n const {\n component: Component,\n controls: Controls,\n count = 1,\n types,\n createIdentity,\n createSpace,\n onCreateSpace,\n } = props;\n\n const [clients, setClients] = useState(props.clients ?? []);\n const [spaceId, setSpaceId] = useState<SpaceId>();\n\n const testBuilder = useRef(new TestBuilder());\n useAsyncEffect(async () => {\n const clients = [...Array(count)].map(\n (_) => new Client({ services: testBuilder.current.createLocalClientServices(), types }),\n );\n\n await Promise.all(clients.map((client) => client.initialize()));\n if (createIdentity || createSpace) {\n await Promise.all(clients.map((client) => client.halo.createIdentity()));\n }\n\n if (createSpace) {\n const client = clients[0];\n const space = await client.spaces.create({ name: faker.commerce.productName() });\n setSpaceId(space.id);\n await onCreateSpace?.({ client, space }, {});\n await Promise.all(clients.slice(1).flatMap((client) => performInvitation({ host: space, guest: client.spaces })));\n }\n\n setClients(clients);\n }, []);\n\n if (clients.length === 0) {\n return null;\n }\n\n return (\n <>\n {Controls && <Controls clients={clients} />}\n {clients.map((client, index) => (\n <ClientProvider key={index} client={client}>\n <Component id={index} count={clients.length} spaceId={spaceId} {...{ ...props.args }} />\n </ClientProvider>\n ))}\n </>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Decorator, type StoryContext } from '@storybook/react';\nimport React, { type PropsWithChildren, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { type FallbackProps, ErrorBoundary as NaturalErrorBoundary } from 'react-error-boundary';\n\nimport { Trigger } from '@dxos/async';\nimport { type Client } from '@dxos/client';\nimport { type Space, type SpaceId } from '@dxos/client/echo';\nimport { TestBuilder, performInvitation } from '@dxos/client/testing';\nimport { log } from '@dxos/log';\nimport { type MaybePromise } from '@dxos/util';\n\nimport { ClientProvider, type ClientProviderProps } from '../client';\n\nimport { ClientStory } from './context';\n\ntype InitializeProps = {\n createIdentity?: boolean;\n createSpace?: boolean;\n onInitialized?: (client: Client) => MaybePromise<void>;\n onCreateIdentity?: (props: { client: Client }, context: StoryContext | any) => MaybePromise<void>;\n // NOTE: context must be untyped until ClientRepeater is removed.\n onCreateSpace?: (props: { client: Client; space: Space }, context: StoryContext | any) => MaybePromise<void>;\n};\n\n/**\n * Initialize client, identity and first space.\n */\nconst initializeClient = async (\n client: Client,\n { createIdentity, createSpace, onCreateIdentity, onCreateSpace, onInitialized }: InitializeProps,\n context: StoryContext,\n): Promise<ClientStory> => {\n await onInitialized?.(client);\n\n if (createIdentity || createSpace) {\n if (!client.halo.identity.get()) {\n await client.halo.createIdentity();\n await client.spaces.waitUntilReady();\n await client.spaces.default.waitUntilReady();\n await onCreateIdentity?.({ client }, context);\n }\n }\n\n let space: Space | undefined;\n if (createSpace) {\n space = await client.spaces.create({ name: 'Test Space' });\n await space.waitUntilReady(); // Is this required?\n await onCreateSpace?.({ client, space }, context);\n }\n\n return { space, spaceId: space?.id };\n};\n\nexport type WithClientProviderProps = InitializeProps & Omit<ClientProviderProps, 'onInitialized'>;\n\n/**\n * Decorator that provides the client context.\n */\nexport const withClientProvider = ({\n createIdentity,\n createSpace,\n onCreateSpace,\n onCreateIdentity,\n onInitialized,\n ...props\n}: WithClientProviderProps = {}): Decorator => {\n return (Story, context) => {\n const [data, setData] = useState<ClientStory>({});\n const handleInitialized = async (client: Client) => {\n const data = await initializeClient(\n client,\n {\n createIdentity,\n createSpace,\n onCreateSpace,\n onCreateIdentity,\n onInitialized,\n },\n context,\n );\n\n setData(data);\n };\n\n return (\n <ErrorBoundary>\n <ClientProvider onInitialized={handleInitialized} {...props}>\n <ClientStory.Provider value={data}>\n <Story />\n </ClientStory.Provider>\n </ClientProvider>\n </ErrorBoundary>\n );\n };\n};\n\n// TODO(burdon): Implement context per client for context.\n// TODO(burdon): Callback once all invitations have completed.\n// TODO(burdon): Delay/jitter for creation of other clients.\nexport type WithMultiClientProviderProps = InitializeProps &\n Omit<ClientProviderProps, 'onInitialized'> & { numClients?: number };\n\n/**\n * Decorator that creates a scaffold for multiple clients.\n * Orchestrates invitations between a randomly selected host and the remaining clients.\n */\nexport const withMultiClientProvider = ({\n numClients = 2,\n createIdentity,\n createSpace,\n onCreateSpace,\n onCreateIdentity,\n onInitialized,\n ...props\n}: WithMultiClientProviderProps): Decorator => {\n return (Story, context) => {\n const spaceReady = useRef(new Trigger<Space | undefined>());\n const [spaceId, setSpaceId] = useState<SpaceId>();\n\n const clients = useMemo(() => {\n const buidler = new TestBuilder();\n return Array.from({ length: numClients }).map(() => {\n return {\n services: buidler.createLocalClientServices(),\n };\n });\n }, [numClients]);\n\n // Handle invitations.\n // NOTE: The zeroth client isn't necessarily the first to be initialized.\n const handleInitialized = useCallback(async (client: Client, index: number) => {\n if (index === 0) {\n // Initialize host.\n const { space } = await initializeClient(\n client,\n {\n createIdentity,\n createSpace,\n onCreateSpace,\n onCreateIdentity,\n onInitialized,\n },\n context,\n );\n\n log.info('inviting', { index, spaceId: space?.id });\n setSpaceId(space?.id);\n spaceReady.current.wake(space);\n } else {\n // Initialize guest.\n await initializeClient(client, { createIdentity, onInitialized }, context);\n\n log.info('waiting', { index });\n const space = await spaceReady.current.wait();\n if (space) {\n log.info('joining', { index, spaceId: space.id });\n await Promise.all(\n performInvitation({\n host: space,\n guest: client.spaces,\n }),\n );\n }\n }\n }, []);\n\n return (\n <div className='absolute inset-0 grid grid-flow-col auto-cols-fr gap-4 overflow-hidden'>\n {clients.map((client, index) => (\n <ClientProvider\n key={index}\n services={client.services}\n onInitialized={(client) => handleInitialized(client, index)}\n {...props}\n >\n <ClientStory.Provider value={{ index, spaceId }}>\n <ErrorBoundary>\n <Story />\n </ErrorBoundary>\n </ClientStory.Provider>\n </ClientProvider>\n ))}\n </div>\n );\n };\n};\n\nconst ErrorBoundary = ({ children }: PropsWithChildren) => {\n const [error, setError] = useState<Error>();\n useEffect(() => {\n const handleError = (event: PromiseRejectionEvent) => {\n setError(event.reason);\n };\n\n window.addEventListener('unhandledrejection', handleError);\n return () => window.removeEventListener('unhandledrejection', handleError);\n }, []);\n\n if (error) {\n return <ErrorFallback error={error} resetErrorBoundary={() => setError(undefined)} />;\n }\n\n return <NaturalErrorBoundary FallbackComponent={ErrorFallback}>{children}</NaturalErrorBoundary>;\n};\n\nconst ErrorFallback = ({ error }: FallbackProps) => {\n const { name, message, stack } =\n error instanceof Error ? error : { name: 'Error', message: String(error), stack: undefined };\n\n return (\n <div role='alert' className='flex flex-col p-4 gap-4 overflow-auto'>\n <h1 className='text-xl text-red-500'>{name}</h1>\n <div className='text-lg'>{message}</div>\n {stack && <pre className='whitespace-pre-wrap text-sm text-subdued'>{stack}</pre>}\n </div>\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["createContext", "useContext", "raise", "ClientStory", "createContext", "undefined", "useClientStory", "useContext", "raise", "Error", "React", "useRef", "useState", "Client", "TestBuilder", "performInvitation", "faker", "useAsyncEffect", "ClientRepeater", "props", "component", "Component", "controls", "Controls", "count", "types", "createIdentity", "createSpace", "onCreateSpace", "clients", "setClients", "useState", "spaceId", "setSpaceId", "testBuilder", "useRef", "TestBuilder", "useAsyncEffect", "Array", "map", "_", "Client", "services", "current", "createLocalClientServices", "Promise", "all", "client", "initialize", "halo", "space", "spaces", "create", "name", "faker", "commerce", "productName", "id", "slice", "flatMap", "performInvitation", "host", "guest", "length", "index", "ClientProvider", "key", "args", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "ErrorBoundary", "NaturalErrorBoundary", "Trigger", "TestBuilder", "performInvitation", "log", "initializeClient", "client", "createIdentity", "createSpace", "onCreateIdentity", "onCreateSpace", "onInitialized", "context", "halo", "identity", "get", "spaces", "waitUntilReady", "default", "space", "create", "name", "spaceId", "id", "withClientProvider", "props", "Story", "data", "setData", "useState", "handleInitialized", "React", "ErrorBoundary", "ClientProvider", "ClientStory", "Provider", "value", "withMultiClientProvider", "numClients", "spaceReady", "useRef", "Trigger", "setSpaceId", "clients", "useMemo", "buidler", "TestBuilder", "Array", "from", "length", "map", "services", "createLocalClientServices", "useCallback", "index", "log", "info", "current", "wake", "wait", "Promise", "all", "performInvitation", "host", "guest", "div", "className", "key", "children", "error", "setError", "useEffect", "handleError", "event", "reason", "window", "addEventListener", "removeEventListener", "ErrorFallback", "resetErrorBoundary", "undefined", "NaturalErrorBoundary", "FallbackComponent", "message", "stack", "Error", "String", "role", "h1", "pre"]
7
7
  }
@@ -1,3 +1,3 @@
1
- // packages/sdk/react-client/src/worker.ts
1
+ // src/worker.ts
2
2
  export * from "@dxos/client/worker";
3
3
  //# sourceMappingURL=worker.mjs.map
@@ -0,0 +1,10 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+
3
+ // src/client/context.ts
4
+ import { createContext } from "react";
5
+ var ClientContext = createContext(void 0);
6
+
7
+ export {
8
+ ClientContext
9
+ };
10
+ //# sourceMappingURL=chunk-373DPHEQ.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/client/context.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2020 DXOS.org\n//\n\nimport { type Context, createContext } from 'react';\n\nimport { type Client, type SystemStatus } from '@dxos/client';\n\nexport type ClientContextProps = {\n client: Client;\n status?: SystemStatus | null;\n};\n\n/**\n * @internal Use ClientProvider to create or initialize the Client.\n */\nexport const ClientContext: Context<ClientContextProps | undefined> = createContext<ClientContextProps | undefined>(\n undefined,\n);\n"],
5
+ "mappings": ";;;AAIA,SAAuBA,qBAAqB;AAYrC,IAAMC,gBAAyDC,cACpEC,MAAAA;",
6
+ "names": ["createContext", "ClientContext", "createContext", "undefined"]
7
+ }
@@ -1,21 +1,21 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
 
3
- // packages/sdk/react-client/src/invitations/index.ts
3
+ // src/invitations/index.ts
4
4
  import { AuthenticatingInvitationObservable, CancellableInvitationObservable, InvitationEncoder as InvitationEncoder2, Invitation as Invitation2, InvitationsProxy } from "@dxos/client/invitations";
5
5
 
6
- // packages/sdk/react-client/src/invitations/useInvitationStatus.ts
7
- import { useReducer, useMemo, useCallback, useEffect } from "react";
6
+ // src/invitations/useInvitationStatus.ts
7
+ import { useCallback, useEffect, useMemo, useReducer } from "react";
8
8
  import { Invitation, InvitationEncoder } from "@dxos/client/invitations";
9
9
  import { log } from "@dxos/log";
10
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/sdk/react-client/src/invitations/useInvitationStatus.ts";
11
- var isShareableInvitation = (invitation) => invitation.authMethod !== Invitation.AuthMethod.KNOWN_PUBLIC_KEY || invitation.guestKeypair?.privateKey;
10
+ var __dxlog_file = "/__w/dxos/dxos/packages/sdk/react-client/src/invitations/useInvitationStatus.ts";
11
+ var isShareableInvitation = (invitation) => invitation.authMethod !== Invitation.AuthMethod.KNOWN_PUBLIC_KEY || !!invitation.guestKeypair?.privateKey;
12
12
  var useInvitationStatus = (observable) => {
13
13
  const [state, dispatch] = useReducer((prev, action) => {
14
14
  log("useInvitationStatus", {
15
15
  action
16
16
  }, {
17
17
  F: __dxlog_file,
18
- L: 90,
18
+ L: 91,
19
19
  S: void 0,
20
20
  C: (f, a) => f(...a)
21
21
  });
@@ -128,7 +128,7 @@ var useInvitationStatus = (observable) => {
128
128
  authCode
129
129
  }, {
130
130
  F: __dxlog_file,
131
- L: 195,
131
+ L: 196,
132
132
  S: void 0,
133
133
  C: (f, a) => f(...a)
134
134
  });
@@ -162,4 +162,4 @@ export {
162
162
  Invitation2 as Invitation,
163
163
  InvitationsProxy
164
164
  };
165
- //# sourceMappingURL=chunk-UYJUBYMU.mjs.map
165
+ //# sourceMappingURL=chunk-AQJH2UNZ.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/invitations/index.ts", "../../../src/invitations/useInvitationStatus.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2020 DXOS.org\n//\n\n// NOTE: Export * fails here.\nexport {\n AuthenticatingInvitationObservable,\n CancellableInvitationObservable,\n InvitationEncoder,\n Invitation,\n type Invitations,\n InvitationsProxy,\n} from '@dxos/client/invitations';\n\nexport * from './useInvitationStatus';\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { useCallback, useEffect, useMemo, useReducer } from 'react';\n\nimport { type PublicKey } from '@dxos/client';\nimport {\n type AuthenticatingInvitationObservable,\n type CancellableInvitationObservable,\n Invitation,\n InvitationEncoder,\n} from '@dxos/client/invitations';\nimport { log } from '@dxos/log';\n\nexport type InvitationResult = {\n spaceKey: PublicKey | null;\n identityKey: PublicKey | null;\n swarmKey: PublicKey | null;\n target: string | null;\n};\n\ninterface InvitationReducerState {\n status: Invitation.State; // TODO(burdon): Rename state.\n haltedAt?: Invitation.State;\n result: InvitationResult;\n error?: Error;\n id?: string;\n multiUse?: boolean;\n shareable?: boolean;\n invitationCode?: string;\n authCode?: string;\n authMethod?: Invitation.AuthMethod;\n type?: Invitation.Type;\n}\n\ntype InvitationPayload = { invitation: Invitation };\n\nexport type InvitationAction =\n | ({\n status:\n | Invitation.State.INIT\n | Invitation.State.CONNECTED\n | Invitation.State.READY_FOR_AUTHENTICATION\n | Invitation.State.AUTHENTICATING;\n } & InvitationPayload)\n | ({\n status: Invitation.State.CONNECTING;\n observable: CancellableInvitationObservable;\n } & InvitationPayload)\n | ({\n status: Invitation.State.SUCCESS;\n result: InvitationResult;\n } & InvitationPayload)\n | ({\n status: Invitation.State.CANCELLED | Invitation.State.TIMEOUT;\n haltedAt: Invitation.State;\n } & InvitationPayload)\n | {\n status: Invitation.State.ERROR;\n error?: Error;\n haltedAt: Invitation.State;\n };\n\nexport type InvitationStatus = {\n id?: string;\n invitationCode?: string;\n authCode?: string;\n authMethod?: Invitation.AuthMethod;\n type?: Invitation.Type;\n status: Invitation.State;\n haltedAt?: Invitation.State;\n multiUse?: boolean;\n shareable?: boolean;\n result: InvitationResult;\n error?: Error;\n cancel(): void;\n // TODO(wittjosiah): Remove?\n connect(observable: CancellableInvitationObservable): void;\n authenticate(authCode: string): Promise<void>;\n};\n\n// Without private key, the invitation code cannot be created.\n// These invitations are only available to be accepted but not shared.\nconst isShareableInvitation = (invitation: Invitation) =>\n invitation.authMethod !== Invitation.AuthMethod.KNOWN_PUBLIC_KEY || !!invitation.guestKeypair?.privateKey;\n\nexport const useInvitationStatus = (observable?: CancellableInvitationObservable): InvitationStatus => {\n const [state, dispatch] = useReducer(\n (prev: InvitationReducerState, action: InvitationAction): InvitationReducerState => {\n log('useInvitationStatus', { action });\n const invitationProps =\n 'invitation' in action\n ? {\n id: action.invitation.invitationId,\n multiUse: action.invitation.multiUse,\n invitationCode: InvitationEncoder.encode(action.invitation),\n authCode: action.invitation.authCode,\n authMethod: action.invitation.authMethod,\n shareable: isShareableInvitation(action.invitation),\n type: action.invitation.type,\n }\n : {};\n return {\n ...prev,\n ...invitationProps,\n // TODO(burdon): State.\n status: action.status,\n // `invitationObservable`, `secret`, and `result` is persisted between the status-actions that set them.\n result: action.status === Invitation.State.SUCCESS ? action.result : prev.result,\n // `error` gets set each time we enter the error state\n ...(action.status === Invitation.State.ERROR && { error: action.error }),\n // `haltedAt` gets set on only the first error/cancelled/timeout action and reset on any others.\n ...((action.status === Invitation.State.ERROR ||\n action.status === Invitation.State.CANCELLED ||\n action.status === Invitation.State.TIMEOUT) && {\n haltedAt: typeof prev.haltedAt === 'undefined' ? action.haltedAt : prev.haltedAt,\n }),\n };\n },\n null,\n (_arg: null): InvitationReducerState => {\n const invitation = observable?.get();\n return {\n status: Invitation.State.INIT,\n result: { spaceKey: null, identityKey: null, swarmKey: null, target: null },\n id: invitation?.invitationId,\n multiUse: invitation?.multiUse,\n invitationCode: invitation ? InvitationEncoder.encode(invitation) : undefined,\n authCode: invitation?.authCode,\n authMethod: invitation?.authMethod,\n shareable: invitation ? isShareableInvitation(invitation) : false,\n type: invitation?.type,\n };\n },\n );\n\n // Handle unmount.\n\n useEffect(() => {\n const update = (invitation: Invitation) => {\n switch (invitation.state) {\n case Invitation.State.INIT:\n case Invitation.State.CONNECTED:\n case Invitation.State.READY_FOR_AUTHENTICATION:\n case Invitation.State.AUTHENTICATING: {\n dispatch({\n invitation,\n status: invitation.state,\n });\n break;\n }\n\n case Invitation.State.SUCCESS: {\n dispatch({\n invitation,\n status: invitation.state,\n result: {\n spaceKey: invitation.spaceKey || null,\n identityKey: invitation.identityKey || null,\n swarmKey: invitation.swarmKey || null,\n target: invitation.target || null,\n },\n });\n break;\n }\n\n case Invitation.State.CANCELLED:\n case Invitation.State.TIMEOUT: {\n dispatch({ invitation, status: invitation.state, haltedAt: state.status });\n break;\n }\n }\n };\n\n const subscription = observable?.subscribe(update, (err: Error) => {\n dispatch({ status: Invitation.State.ERROR, error: err, haltedAt: state.status });\n });\n\n const currentState = observable?.get();\n if (currentState) {\n update(currentState);\n }\n\n return () => subscription?.unsubscribe();\n }, [observable, state.status]);\n\n // Return memoized callbacks & values.\n\n const connect = useCallback((observable: CancellableInvitationObservable) => {\n dispatch({ invitation: observable.get(), status: Invitation.State.CONNECTING, observable });\n }, []);\n\n const authenticate = useCallback(\n (authCode: string) => {\n log('authenticating...', { authCode });\n return (observable as AuthenticatingInvitationObservable).authenticate(authCode);\n },\n [observable],\n );\n\n const cancel = useCallback(async () => observable?.cancel(), [observable]);\n\n return useMemo(() => {\n return {\n ...state,\n cancel,\n connect,\n authenticate,\n };\n }, [state, cancel, connect, authenticate]);\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["AuthenticatingInvitationObservable", "CancellableInvitationObservable", "InvitationEncoder", "Invitation", "InvitationsProxy", "useCallback", "useEffect", "useMemo", "useReducer", "Invitation", "InvitationEncoder", "log", "isShareableInvitation", "invitation", "authMethod", "AuthMethod", "KNOWN_PUBLIC_KEY", "guestKeypair", "privateKey", "useInvitationStatus", "observable", "state", "dispatch", "prev", "action", "invitationProps", "id", "invitationId", "multiUse", "invitationCode", "encode", "authCode", "shareable", "type", "status", "result", "State", "SUCCESS", "ERROR", "error", "CANCELLED", "TIMEOUT", "haltedAt", "_arg", "get", "INIT", "spaceKey", "identityKey", "swarmKey", "target", "undefined", "update", "CONNECTED", "READY_FOR_AUTHENTICATION", "AUTHENTICATING", "subscription", "subscribe", "err", "currentState", "unsubscribe", "connect", "CONNECTING", "authenticate", "cancel"]
7
+ }
@@ -0,0 +1,17 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ ClientContext
4
+ } from "./chunk-373DPHEQ.mjs";
5
+
6
+ // src/client/useClient.ts
7
+ import { useContext } from "react";
8
+ import { raise } from "@dxos/debug";
9
+ var useClient = () => {
10
+ const { client } = useContext(ClientContext) ?? raise(new Error("Missing ClientContext."));
11
+ return client;
12
+ };
13
+
14
+ export {
15
+ useClient
16
+ };
17
+ //# sourceMappingURL=chunk-NETTSER2.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/client/useClient.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { useContext } from 'react';\n\nimport { raise } from '@dxos/debug';\n\nimport { ClientContext } from '../client/context';\n\n/**\n * Hook returning instance of DXOS client.\n * Requires ClientContext to be set via ClientProvider.\n */\nexport const useClient = () => {\n const { client } = useContext(ClientContext) ?? raise(new Error('Missing ClientContext.'));\n return client;\n};\n"],
5
+ "mappings": ";;;;;;AAIA,SAASA,kBAAkB;AAE3B,SAASC,aAAa;AAQf,IAAMC,YAAY,MAAA;AACvB,QAAM,EAAEC,OAAM,IAAKC,WAAWC,aAAAA,KAAkBC,MAAM,IAAIC,MAAM,wBAAA,CAAA;AAChE,SAAOJ;AACT;",
6
+ "names": ["useContext", "raise", "useClient", "client", "useContext", "ClientContext", "raise", "Error"]
7
+ }