@dxos/react-client 0.8.3 → 0.8.4-main.03d5cd7b56

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 (424) hide show
  1. package/.storybook/main.mts +9 -0
  2. package/.storybook/preview.mts +8 -0
  3. package/dist/lib/browser/chunk-3LVU7RNK.mjs +16 -0
  4. package/dist/lib/browser/chunk-3LVU7RNK.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-CZMIVAGI.mjs +8 -0
  6. package/dist/lib/browser/chunk-CZMIVAGI.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-XT352YI6.mjs +134 -0
  8. package/dist/lib/browser/chunk-XT352YI6.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-AL2CUQ46.mjs → chunk-YHE6WD44.mjs} +8 -18
  10. package/dist/lib/browser/chunk-YHE6WD44.mjs.map +7 -0
  11. package/dist/lib/browser/devtools/index.mjs +8 -12
  12. package/dist/lib/browser/devtools/index.mjs.map +3 -3
  13. package/dist/lib/browser/echo/index.mjs +67 -136
  14. package/dist/lib/browser/echo/index.mjs.map +4 -4
  15. package/dist/lib/browser/halo/index.mjs +12 -10
  16. package/dist/lib/browser/halo/index.mjs.map +3 -3
  17. package/dist/lib/browser/index.mjs +100 -13
  18. package/dist/lib/browser/index.mjs.map +4 -4
  19. package/dist/lib/browser/invitations/index.mjs +1 -1
  20. package/dist/lib/browser/mesh/index.mjs +4 -3
  21. package/dist/lib/browser/mesh/index.mjs.map +1 -1
  22. package/dist/lib/browser/meta.json +1 -1
  23. package/dist/lib/browser/testing/index.mjs +117 -160
  24. package/dist/lib/browser/testing/index.mjs.map +3 -3
  25. package/dist/lib/browser/worker.mjs +1 -1
  26. package/dist/lib/node-esm/chunk-CUDKNAMV.mjs +17 -0
  27. package/dist/lib/node-esm/chunk-CUDKNAMV.mjs.map +7 -0
  28. package/dist/lib/node-esm/{chunk-UYJUBYMU.mjs → chunk-RQJPEHDY.mjs} +8 -18
  29. package/dist/lib/node-esm/chunk-RQJPEHDY.mjs.map +7 -0
  30. package/dist/lib/node-esm/chunk-WL3Z5HOH.mjs +135 -0
  31. package/dist/lib/node-esm/chunk-WL3Z5HOH.mjs.map +7 -0
  32. package/dist/lib/node-esm/chunk-WUTK2IJF.mjs +10 -0
  33. package/dist/lib/node-esm/chunk-WUTK2IJF.mjs.map +7 -0
  34. package/dist/lib/node-esm/devtools/index.mjs +8 -12
  35. package/dist/lib/node-esm/devtools/index.mjs.map +3 -3
  36. package/dist/lib/node-esm/echo/index.mjs +67 -136
  37. package/dist/lib/node-esm/echo/index.mjs.map +4 -4
  38. package/dist/lib/node-esm/halo/index.mjs +12 -10
  39. package/dist/lib/node-esm/halo/index.mjs.map +3 -3
  40. package/dist/lib/node-esm/index.mjs +100 -13
  41. package/dist/lib/node-esm/index.mjs.map +4 -4
  42. package/dist/lib/node-esm/invitations/index.mjs +1 -1
  43. package/dist/lib/node-esm/mesh/index.mjs +4 -3
  44. package/dist/lib/node-esm/mesh/index.mjs.map +1 -1
  45. package/dist/lib/node-esm/meta.json +1 -1
  46. package/dist/lib/node-esm/testing/index.mjs +117 -160
  47. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  48. package/dist/lib/node-esm/worker.mjs +1 -1
  49. package/dist/types/src/banner.d.ts.map +1 -1
  50. package/dist/types/src/client/AgentHostingProvider.d.ts.map +1 -1
  51. package/dist/types/src/client/ClientProvider.d.ts +1 -11
  52. package/dist/types/src/client/ClientProvider.d.ts.map +1 -1
  53. package/dist/types/src/client/useClientStatus.d.ts.map +1 -1
  54. package/dist/types/src/devtools/useStream.d.ts.map +1 -1
  55. package/dist/types/src/echo/index.d.ts +2 -2
  56. package/dist/types/src/echo/index.d.ts.map +1 -1
  57. package/dist/types/src/echo/useMembers.d.ts +2 -2
  58. package/dist/types/src/echo/useMembers.d.ts.map +1 -1
  59. package/dist/types/src/echo/useQueue.d.ts +3 -2
  60. package/dist/types/src/echo/useQueue.d.ts.map +1 -1
  61. package/dist/types/src/echo/useSpaceInvitations.d.ts +3 -2
  62. package/dist/types/src/echo/useSpaceInvitations.d.ts.map +1 -1
  63. package/dist/types/src/echo/useSpaceProperties.d.ts +13 -0
  64. package/dist/types/src/echo/useSpaceProperties.d.ts.map +1 -0
  65. package/dist/types/src/echo/useSpaces.d.ts +19 -9
  66. package/dist/types/src/echo/useSpaces.d.ts.map +1 -1
  67. package/dist/types/src/echo/useSubscription.d.ts +1 -1
  68. package/dist/types/src/echo/useSubscription.d.ts.map +1 -1
  69. package/dist/types/src/echo/useSyncState.d.ts +1 -1
  70. package/dist/types/src/echo/useSyncState.d.ts.map +1 -1
  71. package/dist/types/src/halo/Passkey.stories.d.ts +5 -5
  72. package/dist/types/src/halo/Passkey.stories.d.ts.map +1 -1
  73. package/dist/types/src/halo/useHaloInvitations.d.ts.map +1 -1
  74. package/dist/types/src/halo/useKeyStore.d.ts.map +1 -1
  75. package/dist/types/src/invitations/useInvitationStatus.d.ts +1 -1
  76. package/dist/types/src/invitations/useInvitationStatus.d.ts.map +1 -1
  77. package/dist/types/src/testing/ClientRepeater.d.ts +6 -5
  78. package/dist/types/src/testing/ClientRepeater.d.ts.map +1 -1
  79. package/dist/types/src/testing/ClientRepeater.stories.d.ts +6 -10
  80. package/dist/types/src/testing/ClientRepeater.stories.d.ts.map +1 -1
  81. package/dist/types/src/testing/context.d.ts +4 -2
  82. package/dist/types/src/testing/context.d.ts.map +1 -1
  83. package/dist/types/src/testing/util.d.ts.map +1 -1
  84. package/dist/types/src/testing/withClientProvider.d.ts +6 -10
  85. package/dist/types/src/testing/withClientProvider.d.ts.map +1 -1
  86. package/dist/types/src/testing/withClientProvider.stories.d.ts +8 -9
  87. package/dist/types/src/testing/withClientProvider.stories.d.ts.map +1 -1
  88. package/dist/types/tsconfig.tsbuildinfo +1 -1
  89. package/docs/README.md +38 -38
  90. package/moon.yml +20 -0
  91. package/package.json +43 -58
  92. package/src/client/AgentHostingProvider.tsx +1 -1
  93. package/src/client/ClientProvider.test.tsx +2 -2
  94. package/src/client/ClientProvider.tsx +32 -50
  95. package/src/client/useConfig.test.tsx +1 -1
  96. package/src/devtools/useStream.ts +1 -1
  97. package/src/echo/index.ts +2 -2
  98. package/src/echo/useMembers.ts +5 -3
  99. package/src/echo/useQueue.ts +3 -4
  100. package/src/echo/useSpaceInvitations.ts +10 -5
  101. package/src/echo/useSpaceProperties.ts +28 -0
  102. package/src/echo/useSpaces.test.tsx +8 -14
  103. package/src/echo/useSpaces.ts +32 -30
  104. package/src/echo/useSubscription.ts +1 -1
  105. package/src/echo/useSyncState.ts +5 -4
  106. package/src/halo/Passkey.stories.tsx +20 -20
  107. package/src/halo/useDevices.test.tsx +1 -1
  108. package/src/halo/useHaloInvitations.ts +1 -1
  109. package/src/invitations/useInvitationStatus.ts +9 -8
  110. package/src/testing/ClientRepeater.stories.tsx +22 -16
  111. package/src/testing/ClientRepeater.tsx +29 -37
  112. package/src/testing/context.tsx +4 -3
  113. package/src/testing/util.tsx +0 -1
  114. package/src/testing/withClientProvider.stories.tsx +34 -20
  115. package/src/testing/withClientProvider.tsx +77 -94
  116. package/tsconfig.json +3 -6
  117. package/typedoc.json +1 -1
  118. package/vitest.config.ts +10 -16
  119. package/.eslintrc.cjs +0 -12
  120. package/README.yml +0 -33
  121. package/dist/lib/browser/chunk-72QD3PXL.mjs +0 -312
  122. package/dist/lib/browser/chunk-72QD3PXL.mjs.map +0 -7
  123. package/dist/lib/browser/chunk-AL2CUQ46.mjs.map +0 -7
  124. package/dist/lib/node/chunk-5RUIFUEC.cjs +0 -334
  125. package/dist/lib/node/chunk-5RUIFUEC.cjs.map +0 -7
  126. package/dist/lib/node/chunk-FYOAVV65.cjs +0 -188
  127. package/dist/lib/node/chunk-FYOAVV65.cjs.map +0 -7
  128. package/dist/lib/node/devtools/index.cjs +0 -62
  129. package/dist/lib/node/devtools/index.cjs.map +0 -7
  130. package/dist/lib/node/echo/index.cjs +0 -302
  131. package/dist/lib/node/echo/index.cjs.map +0 -7
  132. package/dist/lib/node/halo/index.cjs +0 -123
  133. package/dist/lib/node/halo/index.cjs.map +0 -7
  134. package/dist/lib/node/index.cjs +0 -55
  135. package/dist/lib/node/index.cjs.map +0 -7
  136. package/dist/lib/node/invitations/index.cjs +0 -39
  137. package/dist/lib/node/invitations/index.cjs.map +0 -7
  138. package/dist/lib/node/mesh/index.cjs +0 -37
  139. package/dist/lib/node/mesh/index.cjs.map +0 -7
  140. package/dist/lib/node/meta.json +0 -1
  141. package/dist/lib/node/testing/index.cjs +0 -278
  142. package/dist/lib/node/testing/index.cjs.map +0 -7
  143. package/dist/lib/node/worker.cjs +0 -23
  144. package/dist/lib/node/worker.cjs.map +0 -7
  145. package/dist/lib/node-esm/chunk-NBTZZNQ5.mjs +0 -314
  146. package/dist/lib/node-esm/chunk-NBTZZNQ5.mjs.map +0 -7
  147. package/dist/lib/node-esm/chunk-UYJUBYMU.mjs.map +0 -7
  148. package/dist/types/src/echo/useQuery.d.ts +0 -11
  149. package/dist/types/src/echo/useQuery.d.ts.map +0 -1
  150. package/dist/types/src/echo/useQuery.test.d.ts +0 -2
  151. package/dist/types/src/echo/useQuery.test.d.ts.map +0 -1
  152. package/dist/types/src/echo/useSchema.d.ts +0 -8
  153. package/dist/types/src/echo/useSchema.d.ts.map +0 -1
  154. package/dist/types/src/playwright/playwright.config.d.cts +0 -3
  155. package/dist/types/src/playwright/playwright.config.d.cts.map +0 -1
  156. package/dist/types/src/playwright/smoke.spec.d.ts +0 -2
  157. package/dist/types/src/playwright/smoke.spec.d.ts.map +0 -1
  158. package/project.json +0 -40
  159. package/src/echo/useQuery.test.tsx +0 -128
  160. package/src/echo/useQuery.ts +0 -56
  161. package/src/echo/useSchema.ts +0 -54
  162. package/src/playwright/playwright.config.cts +0 -18
  163. package/src/playwright/smoke.spec.ts +0 -26
  164. package/typedoc/.nojekyll +0 -1
  165. package/typedoc/assets/hierarchy.js +0 -1
  166. package/typedoc/assets/highlight.css +0 -99
  167. package/typedoc/assets/icons.js +0 -18
  168. package/typedoc/assets/icons.svg +0 -1
  169. package/typedoc/assets/main.js +0 -60
  170. package/typedoc/assets/navigation.js +0 -1
  171. package/typedoc/assets/search.js +0 -1
  172. package/typedoc/assets/style.css +0 -1640
  173. package/typedoc/classes/echo.Hypergraph.html +0 -17
  174. package/typedoc/classes/echo.PropertiesType.html +0 -19
  175. package/typedoc/classes/echo.QueryResult.html +0 -18
  176. package/typedoc/classes/halo.KeyStore.html +0 -6
  177. package/typedoc/classes/index.AgentClientServiceProvider.html +0 -10
  178. package/typedoc/classes/index.AgentManagerClient.html +0 -22
  179. package/typedoc/classes/index.AlreadyJoinedError.html +0 -15
  180. package/typedoc/classes/index.ApiError.html +0 -16
  181. package/typedoc/classes/index.CancelledError.html +0 -16
  182. package/typedoc/classes/index.Client.html +0 -51
  183. package/typedoc/classes/index.ClientServicesProxy.html +0 -12
  184. package/typedoc/classes/index.Config.html +0 -17
  185. package/typedoc/classes/index.DataCorruptionError.html +0 -16
  186. package/typedoc/classes/index.DatabaseError.html +0 -15
  187. package/typedoc/classes/index.EntityNotFoundError.html +0 -15
  188. package/typedoc/classes/index.FakeAgentHostingProvider.html +0 -7
  189. package/typedoc/classes/index.IFrameManager.html +0 -6
  190. package/typedoc/classes/index.IdentityNotInitializedError.html +0 -15
  191. package/typedoc/classes/index.InvalidConfigError.html +0 -16
  192. package/typedoc/classes/index.InvalidInvitationError.html +0 -15
  193. package/typedoc/classes/index.InvalidInvitationExtensionRoleError.html +0 -16
  194. package/typedoc/classes/index.InvalidStorageVersionError.html +0 -15
  195. package/typedoc/classes/index.LocalClientServices.html +0 -12
  196. package/typedoc/classes/index.PublicKey.html +0 -55
  197. package/typedoc/classes/index.RemoteServiceConnectionError.html +0 -15
  198. package/typedoc/classes/index.RemoteServiceConnectionTimeout.html +0 -15
  199. package/typedoc/classes/index.RpcClosedError.html +0 -15
  200. package/typedoc/classes/index.RpcNotOpenError.html +0 -15
  201. package/typedoc/classes/index.SharedWorkerConnection.html +0 -5
  202. package/typedoc/classes/index.Shell.html +0 -35
  203. package/typedoc/classes/index.ShellManager.html +0 -9
  204. package/typedoc/classes/index.SystemError.html +0 -16
  205. package/typedoc/classes/index.UnknownModelError.html +0 -15
  206. package/typedoc/classes/index.WorkerClientServices.html +0 -12
  207. package/typedoc/classes/invitations.AuthenticatingInvitationObservable.html +0 -30
  208. package/typedoc/classes/invitations.CancellableInvitationObservable.html +0 -29
  209. package/typedoc/classes/invitations.InvitationEncoder.html +0 -5
  210. package/typedoc/classes/invitations.InvitationsProxy.html +0 -12
  211. package/typedoc/enums/devtools.KeyType.html +0 -9
  212. package/typedoc/enums/echo.HaloSpaceMember.Role.html +0 -9
  213. package/typedoc/enums/echo.IndexKind.Kind.html +0 -8
  214. package/typedoc/enums/echo.QueryOptions.DataLocation.html +0 -6
  215. package/typedoc/enums/echo.QueryOptions.ShowDeletedOption.html +0 -6
  216. package/typedoc/enums/echo.ResultFormat.html +0 -10
  217. package/typedoc/enums/echo.SpaceMember.PresenceState.html +0 -5
  218. package/typedoc/enums/echo.SpaceState.html +0 -13
  219. package/typedoc/enums/echo.TextKind.html +0 -5
  220. package/typedoc/enums/halo.Device.PresenceState.html +0 -6
  221. package/typedoc/enums/halo.DeviceKind.html +0 -5
  222. package/typedoc/enums/halo.DeviceType.html +0 -9
  223. package/typedoc/enums/index.ShellDisplay.html +0 -5
  224. package/typedoc/enums/index.ShellLayout.html +0 -13
  225. package/typedoc/enums/index.SystemStatus.html +0 -5
  226. package/typedoc/enums/invitations.Invitation.AuthMethod.html +0 -6
  227. package/typedoc/enums/invitations.Invitation.Kind.html +0 -5
  228. package/typedoc/enums/invitations.Invitation.State.html +0 -13
  229. package/typedoc/enums/invitations.Invitation.Type.html +0 -6
  230. package/typedoc/enums/mesh.ConnectionState.html +0 -5
  231. package/typedoc/functions/devtools.useDevtools.html +0 -1
  232. package/typedoc/functions/devtools.useStream.html +0 -2
  233. package/typedoc/functions/echo.useMembers.html +0 -1
  234. package/typedoc/functions/echo.useQueue.html +0 -2
  235. package/typedoc/functions/echo.useSchema.html +0 -2
  236. package/typedoc/functions/echo.useSpace.html +0 -6
  237. package/typedoc/functions/echo.useSpaceInvitation.html +0 -1
  238. package/typedoc/functions/echo.useSpaceInvitations.html +0 -1
  239. package/typedoc/functions/echo.useSpaceSyncState.html +0 -2
  240. package/typedoc/functions/echo.useSpaces.html +0 -5
  241. package/typedoc/functions/echo.useSubscription.html +0 -3
  242. package/typedoc/functions/echo.useSyncState.html +0 -2
  243. package/typedoc/functions/halo.useContacts.html +0 -4
  244. package/typedoc/functions/halo.useCredentials.html +0 -1
  245. package/typedoc/functions/halo.useDevices.html +0 -1
  246. package/typedoc/functions/halo.useHaloInvitation.html +0 -1
  247. package/typedoc/functions/halo.useHaloInvitations.html +0 -1
  248. package/typedoc/functions/halo.useIdentity.html +0 -3
  249. package/typedoc/functions/halo.useKeyStore.html +0 -3
  250. package/typedoc/functions/index.AgentHostingProvider.html +0 -2
  251. package/typedoc/functions/index.useAgentHostingClient.html +0 -1
  252. package/typedoc/functions/index.useClient.html +0 -3
  253. package/typedoc/functions/index.useClientStatus.html +0 -1
  254. package/typedoc/functions/index.useConfig.html +0 -3
  255. package/typedoc/functions/index.useShell.html +0 -2
  256. package/typedoc/functions/index.useShellDisplay.html +0 -2
  257. package/typedoc/functions/index.useStatus.html +0 -1
  258. package/typedoc/functions/invitations.useInvitationStatus.html +0 -1
  259. package/typedoc/functions/mesh.useNetworkStatus.html +0 -2
  260. package/typedoc/hierarchy.html +0 -1
  261. package/typedoc/index.html +0 -23
  262. package/typedoc/interfaces/devtools.DevtoolsHook.html +0 -22
  263. package/typedoc/interfaces/devtools.DevtoolsHost.html +0 -26
  264. package/typedoc/interfaces/echo.DocAccessor.html +0 -3
  265. package/typedoc/interfaces/echo.Echo.html +0 -39
  266. package/typedoc/interfaces/echo.EchoDatabase.html +0 -25
  267. package/typedoc/interfaces/echo.Expando.html +0 -3
  268. package/typedoc/interfaces/echo.Filter.html +0 -3
  269. package/typedoc/interfaces/echo.HaloSpaceMember.html +0 -18
  270. package/typedoc/interfaces/echo.IDocHandle.html +0 -6
  271. package/typedoc/interfaces/echo.IndexKind.html +0 -9
  272. package/typedoc/interfaces/echo.Query.html +0 -34
  273. package/typedoc/interfaces/echo.QueryOptions.html +0 -39
  274. package/typedoc/interfaces/echo.Queue.html +0 -17
  275. package/typedoc/interfaces/echo.Ref.html +0 -32
  276. package/typedoc/interfaces/echo.Space.html +0 -39
  277. package/typedoc/interfaces/echo.SpaceMember.html +0 -7
  278. package/typedoc/interfaces/echo.SpaceSyncState.PeerState.html +0 -14
  279. package/typedoc/interfaces/echo.SpaceSyncState.html +0 -4
  280. package/typedoc/interfaces/echo.SubscriptionHandle.html +0 -5
  281. package/typedoc/interfaces/echo.TypedObject.html +0 -16
  282. package/typedoc/interfaces/halo.Contact.html +0 -10
  283. package/typedoc/interfaces/halo.Credential.html +0 -27
  284. package/typedoc/interfaces/halo.Device.html +0 -11
  285. package/typedoc/interfaces/halo.Halo.html +0 -16
  286. package/typedoc/interfaces/halo.Identity.html +0 -15
  287. package/typedoc/interfaces/index.AgentHostingProviderClient.html +0 -6
  288. package/typedoc/interfaces/index.AppContextRequest.html +0 -33
  289. package/typedoc/interfaces/index.ClientServicesProvider.html +0 -9
  290. package/typedoc/interfaces/index.InvitationUrlRequest.html +0 -9
  291. package/typedoc/interfaces/index.LayoutRequest.html +0 -29
  292. package/typedoc/interfaces/index.ShellRuntime.html +0 -15
  293. package/typedoc/interfaces/invitations.Invitation.html +0 -92
  294. package/typedoc/interfaces/invitations.Invitations.html +0 -5
  295. package/typedoc/interfaces/mesh.GossipMessage.html +0 -10
  296. package/typedoc/interfaces/mesh.NetworkStatus.Signal.html +0 -5
  297. package/typedoc/interfaces/mesh.NetworkStatus.html +0 -6
  298. package/typedoc/media/LICENSE +0 -8
  299. package/typedoc/modules/devtools.html +0 -1
  300. package/typedoc/modules/echo.Filter.html +0 -1
  301. package/typedoc/modules/echo.HaloSpaceMember.html +0 -1
  302. package/typedoc/modules/echo.IndexKind.html +0 -1
  303. package/typedoc/modules/echo.Query.html +0 -1
  304. package/typedoc/modules/echo.QueryOptions.html +0 -1
  305. package/typedoc/modules/echo.Ref.html +0 -2
  306. package/typedoc/modules/echo.SpaceMember.html +0 -1
  307. package/typedoc/modules/echo.SpaceSyncState.html +0 -1
  308. package/typedoc/modules/echo.html +0 -1
  309. package/typedoc/modules/halo.Device.html +0 -1
  310. package/typedoc/modules/halo.html +0 -1
  311. package/typedoc/modules/index.html +0 -1
  312. package/typedoc/modules/invitations.Invitation.html +0 -1
  313. package/typedoc/modules/invitations.html +0 -1
  314. package/typedoc/modules/mesh.NetworkStatus.html +0 -1
  315. package/typedoc/modules/mesh.html +0 -1
  316. package/typedoc/modules/worker.html +0 -1
  317. package/typedoc/modules.html +0 -1
  318. package/typedoc/types/devtools.MountOptions.html +0 -3
  319. package/typedoc/types/echo.AnyLiveObject.html +0 -2
  320. package/typedoc/types/echo.Filter.And.html +0 -1
  321. package/typedoc/types/echo.Filter.Any.html +0 -1
  322. package/typedoc/types/echo.Filter.Or.html +0 -1
  323. package/typedoc/types/echo.Filter.Props.html +0 -1
  324. package/typedoc/types/echo.Filter.Type.html +0 -1
  325. package/typedoc/types/echo.Live.html +0 -5
  326. package/typedoc/types/echo.ObjectMeta.html +0 -1
  327. package/typedoc/types/echo.ObjectMigration.html +0 -7
  328. package/typedoc/types/echo.ObjectVersion.html +0 -2
  329. package/typedoc/types/echo.PeerSyncState.html +0 -1
  330. package/typedoc/types/echo.Progress.html +0 -3
  331. package/typedoc/types/echo.PropertiesTypeProps.html +0 -1
  332. package/typedoc/types/echo.Query.Any.html +0 -1
  333. package/typedoc/types/echo.Query.TextSearchOptions.html +0 -2
  334. package/typedoc/types/echo.Query.Type.html +0 -1
  335. package/typedoc/types/echo.Ref.Target.html +0 -2
  336. package/typedoc/types/echo.Selection.html +0 -1
  337. package/typedoc/types/echo.SpaceId.html +0 -6
  338. package/typedoc/types/echo.SpaceSyncStateMap.html +0 -1
  339. package/typedoc/types/echo.UseQueueOptions.html +0 -2
  340. package/typedoc/types/echo.UseSpacesParams.html +0 -3
  341. package/typedoc/types/index.AgentHostingProviderProps.html +0 -3
  342. package/typedoc/types/index.ClientContextProps.html +0 -3
  343. package/typedoc/types/index.ClientOptions.html +0 -12
  344. package/typedoc/types/index.ClientProviderProps.html +0 -2
  345. package/typedoc/types/index.ClientServices.html +0 -15
  346. package/typedoc/types/index.FromAgentOptions.html +0 -2
  347. package/typedoc/types/index.PublicKeyLike.html +0 -2
  348. package/typedoc/types/invitations.InvitationAction.html +0 -1
  349. package/typedoc/types/invitations.InvitationResult.html +0 -5
  350. package/typedoc/types/invitations.InvitationStatus.html +0 -15
  351. package/typedoc/variables/devtools.mountDevtoolsHooks.html +0 -1
  352. package/typedoc/variables/devtools.unmountDevtoolsHooks.html +0 -1
  353. package/typedoc/variables/echo.DocAccessor.html +0 -1
  354. package/typedoc/variables/echo.EchoObjectSchema.html +0 -1
  355. package/typedoc/variables/echo.Expando.html +0 -1
  356. package/typedoc/variables/echo.FQ_ID_LENGTH.html +0 -1
  357. package/typedoc/variables/echo.Filter.html +0 -1
  358. package/typedoc/variables/echo.OBJECT_ID_LENGTH.html +0 -1
  359. package/typedoc/variables/echo.ObjectVersion.html +0 -1
  360. package/typedoc/variables/echo.Query.html +0 -1
  361. package/typedoc/variables/echo.Queue.html +0 -1
  362. package/typedoc/variables/echo.ReactiveObjectSchema.html +0 -1
  363. package/typedoc/variables/echo.Ref.html +0 -2
  364. package/typedoc/variables/echo.RefArray.html +0 -2
  365. package/typedoc/variables/echo.SPACE_ID_LENGTH.html +0 -1
  366. package/typedoc/variables/echo.SpaceId.html +0 -1
  367. package/typedoc/variables/echo.SpaceSchema.html +0 -1
  368. package/typedoc/variables/echo.TypedObject.html +0 -3
  369. package/typedoc/variables/echo.compareForeignKeys.html +0 -1
  370. package/typedoc/variables/echo.createDocAccessor.html +0 -1
  371. package/typedoc/variables/echo.createEmptyEdgeSyncState.html +0 -1
  372. package/typedoc/variables/echo.createObject.html +0 -1
  373. package/typedoc/variables/echo.createQueueDXN.html +0 -2
  374. package/typedoc/variables/echo.createSubscription.html +0 -5
  375. package/typedoc/variables/echo.defineObjectMigration.html +0 -1
  376. package/typedoc/variables/echo.fromCursor.html +0 -1
  377. package/typedoc/variables/echo.fullyQualifiedId.html +0 -4
  378. package/typedoc/variables/echo.getMeta.html +0 -1
  379. package/typedoc/variables/echo.getObjectCore.html +0 -1
  380. package/typedoc/variables/echo.getRangeFromCursor.html +0 -1
  381. package/typedoc/variables/echo.getSchema.html +0 -2
  382. package/typedoc/variables/echo.getSource.html +0 -4
  383. package/typedoc/variables/echo.getSpace.html +0 -1
  384. package/typedoc/variables/echo.getSyncSummary.html +0 -1
  385. package/typedoc/variables/echo.getTarget.html +0 -4
  386. package/typedoc/variables/echo.getTextInRange.html +0 -2
  387. package/typedoc/variables/echo.getType.html +0 -5
  388. package/typedoc/variables/echo.getTypename.html +0 -6
  389. package/typedoc/variables/echo.getVersion.html +0 -3
  390. package/typedoc/variables/echo.importSpace.html +0 -1
  391. package/typedoc/variables/echo.internalDecodeReference.html +0 -1
  392. package/typedoc/variables/echo.isEchoObject.html +0 -2
  393. package/typedoc/variables/echo.isLiveObject.html +0 -2
  394. package/typedoc/variables/echo.isRelation.html +0 -2
  395. package/typedoc/variables/echo.isSpace.html +0 -1
  396. package/typedoc/variables/echo.live.html +0 -3
  397. package/typedoc/variables/echo.loadObjectReferences.html +0 -7
  398. package/typedoc/variables/echo.makeRef.html +0 -2
  399. package/typedoc/variables/echo.parseFullyQualifiedId.html +0 -2
  400. package/typedoc/variables/echo.parseId.html +0 -1
  401. package/typedoc/variables/echo.refFromDXN.html +0 -2
  402. package/typedoc/variables/echo.toCursor.html +0 -1
  403. package/typedoc/variables/echo.toCursorRange.html +0 -1
  404. package/typedoc/variables/echo.updateText.html +0 -6
  405. package/typedoc/variables/echo.useQuery.html +0 -2
  406. package/typedoc/variables/index.AgentHostingContext.html +0 -1
  407. package/typedoc/variables/index.ClientProvider.html +0 -3
  408. package/typedoc/variables/index.DXOS_VERSION.html +0 -1
  409. package/typedoc/variables/index.Defaults.html +0 -2
  410. package/typedoc/variables/index.Dynamics.html +0 -2
  411. package/typedoc/variables/index.Envs.html +0 -2
  412. package/typedoc/variables/index.Local.html +0 -2
  413. package/typedoc/variables/index.Remote.html +0 -1
  414. package/typedoc/variables/index.Storage.html +0 -2
  415. package/typedoc/variables/index.createClientServices.html +0 -4
  416. package/typedoc/variables/index.fromAgent.html +0 -2
  417. package/typedoc/variables/index.fromHost.html +0 -2
  418. package/typedoc/variables/index.fromSocket.html +0 -2
  419. package/typedoc/variables/index.fromWorker.html +0 -2
  420. package/typedoc/variables/index.getUnixSocket.html +0 -1
  421. package/typedoc/variables/index.resolveRef.html +0 -1
  422. package/typedoc/variables/index.useMulticastObservable.html +0 -3
  423. package/typedoc/variables/worker.getWorkerServiceHost.html +0 -1
  424. package/typedoc/variables/worker.onconnect.html +0 -1
@@ -5,19 +5,19 @@
5
5
  import { act, renderHook } from '@testing-library/react';
6
6
  import { describe, expect, test } from 'vitest';
7
7
 
8
- import { useSpace, useSpaces } from './useSpaces';
9
8
  import { createClient, createClientContextProvider } from '../testing/util';
9
+ import { useSpace, useSpaces } from './useSpaces';
10
10
 
11
11
  describe('useSpaces', () => {
12
12
  test('lists existing spaces', async () => {
13
- const { client } = await createClient({ createIdentity: true });
13
+ const { client } = await createClient({ createIdentity: true, createSpace: true });
14
14
  const wrapper = await createClientContextProvider(client);
15
15
  const { result } = renderHook(() => useSpaces(), { wrapper });
16
16
  expect(result.current.length).to.eq(1);
17
17
  });
18
18
 
19
19
  test('updates when new spaces are created', async () => {
20
- const { client } = await createClient({ createIdentity: true });
20
+ const { client } = await createClient({ createIdentity: true, createSpace: true });
21
21
  const wrapper = await createClientContextProvider(client);
22
22
  const { result, rerender } = renderHook(() => useSpaces(), { wrapper });
23
23
  expect(result.current.length).to.eq(1);
@@ -30,23 +30,17 @@ describe('useSpaces', () => {
30
30
  });
31
31
 
32
32
  describe('useSpace', () => {
33
- test('gets default space', async () => {
34
- const { client } = await createClient();
33
+ test('returns undefined when no id provided', async () => {
34
+ const { client } = await createClient({ createIdentity: true });
35
35
  const wrapper = await createClientContextProvider(client);
36
- const { result, rerender } = renderHook(() => useSpace(), { wrapper });
36
+ const { result } = renderHook(() => useSpace(undefined), { wrapper });
37
37
  expect(result.current).to.be.undefined;
38
- await act(async () => {
39
- await client.halo.createIdentity();
40
- await client.spaces.waitUntilReady();
41
- });
42
- rerender();
43
- expect(result.current).to.not.be.undefined;
44
38
  });
45
39
 
46
- test('gets space by key', async () => {
40
+ test('gets space by id', async () => {
47
41
  const { client, space } = await createClient({ createIdentity: true, createSpace: true });
48
42
  const wrapper = await createClientContextProvider(client);
49
- const { result } = renderHook(() => useSpace(space!.key), { wrapper });
43
+ const { result } = renderHook(() => useSpace(space!.id), { wrapper });
50
44
  expect(result.current).to.not.be.undefined;
51
45
  });
52
46
  });
@@ -2,51 +2,53 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import { useEffect, useState } from 'react';
6
-
7
- import { type PublicKeyLike } from '@dxos/client';
8
- import { type Space, SpaceState } from '@dxos/client/echo';
5
+ import { PublicKey } from '@dxos/client';
6
+ import { type Space, type SpaceId, SpaceState } from '@dxos/client/echo';
9
7
  import { useMulticastObservable } from '@dxos/react-hooks';
10
8
 
11
9
  import { useClient } from '../client';
12
10
 
13
11
  /**
14
- * Get a specific Space using its key.
12
+ * Get a specific Space using its id.
15
13
  * The space is not guaranteed to be in the ready state.
16
- * Returns the default space if no key is provided.
14
+ * Returns undefined if no id is provided.
17
15
  * Requires a ClientProvider somewhere in the parent tree.
18
16
  *
19
- * @param spaceKeyLike the key of the space to look for
17
+ * @param spaceId the id of the space to look for.
20
18
  */
21
- export const useSpace = (spaceKeyLike?: PublicKeyLike): Space | undefined => {
19
+ // TODO(wittjosiah): Currently unable to remove `PublicKey` from this api.
20
+ // When initially joining a space that is all that is returned.
21
+ export const useSpace = (spaceId?: SpaceId | PublicKey): Space | undefined => {
22
22
  const client = useClient();
23
23
  const spaces = useMulticastObservable<Space[]>(client.spaces);
24
- const [ready, setReady] = useState(false);
24
+ if (!spaceId) {
25
+ return undefined;
26
+ }
25
27
 
26
- useEffect(() => {
27
- // Only wait for ready if looking for the default space.
28
- if (spaceKeyLike) {
29
- return;
28
+ return spaces.find((space) => {
29
+ if (spaceId instanceof PublicKey) {
30
+ return space.key.equals(spaceId);
30
31
  }
31
32
 
32
- const timeout = setTimeout(async () => {
33
- await client.spaces.waitUntilReady();
34
- setReady(true);
35
- });
36
-
37
- return () => clearTimeout(timeout);
38
- }, [client, spaceKeyLike]);
39
-
40
- if (spaceKeyLike) {
41
- return spaces.find((space) => space.key.equals(spaceKeyLike) || space.id === spaceKeyLike);
42
- }
33
+ return space.id === spaceId;
34
+ });
35
+ };
43
36
 
44
- if (ready && client.halo.identity.get()) {
45
- return client.spaces.default;
46
- }
37
+ /**
38
+ * Get a Space database by the id of the space.
39
+ * The space is not guaranteed to be in the ready state.
40
+ * Returns undefined if no id is provided.
41
+ * Requires a ClientProvider somewhere in the parent tree.
42
+ *
43
+ * @param spaceId the id of the space to look for.
44
+ * @deprecated Use useSpace.
45
+ */
46
+ export const useDatabase = (spaceId?: SpaceId): Space['db'] | undefined => {
47
+ const space = useSpace(spaceId);
48
+ return space?.db;
47
49
  };
48
50
 
49
- export type UseSpacesParams = {
51
+ export type UseSpacesProps = {
50
52
  /**
51
53
  * Return uninitialized spaces as well.
52
54
  */
@@ -57,9 +59,9 @@ export type UseSpacesParams = {
57
59
  * Get all Spaces available to current user.
58
60
  * Requires a ClientProvider somewhere in the parent tree.
59
61
  * By default, only ready spaces are returned.
60
- * @returns an array of Spaces
62
+ * @returns an array of Spaces.
61
63
  */
62
- export const useSpaces = ({ all = false }: UseSpacesParams = {}): Space[] => {
64
+ export const useSpaces = ({ all = false }: UseSpacesProps = {}): Space[] => {
63
65
  const client = useClient();
64
66
  const spaces = useMulticastObservable<Space[]>(client.spaces);
65
67
 
@@ -18,7 +18,7 @@ export const useSubscription = (cb: () => void, selection: Selection) => {
18
18
  const callbackRef = useRef(cb);
19
19
  callbackRef.current = cb;
20
20
 
21
- const subscriptionRef = useRef<SubscriptionHandle>();
21
+ const subscriptionRef = useRef<SubscriptionHandle>(null);
22
22
 
23
23
  useEffect(() => {
24
24
  subscriptionRef.current = createSubscription(() => {
@@ -4,15 +4,16 @@
4
4
 
5
5
  import { useEffect, useState } from 'react';
6
6
 
7
- import { type PeerSyncState, type SpaceSyncStateMap, type Space } from '@dxos/client/echo';
7
+ import { type PeerSyncState, type Space, type SpaceSyncStateMap } from '@dxos/client/echo';
8
8
  import { Context } from '@dxos/context';
9
9
  import { type SpaceId } from '@dxos/keys';
10
10
  import { EdgeService } from '@dxos/protocols';
11
+ import { compositeKey } from '@dxos/util';
11
12
 
12
13
  import { useClient } from '../client';
13
14
 
14
15
  const isEdgePeerId = (peerId: string, spaceId: SpaceId) =>
15
- peerId.startsWith(`${EdgeService.AUTOMERGE_REPLICATOR}:${spaceId}`);
16
+ peerId.startsWith(compositeKey(EdgeService.AUTOMERGE_REPLICATOR, spaceId));
16
17
 
17
18
  /**
18
19
  * Hook Subscribes to sync state for each space.
@@ -30,7 +31,7 @@ export const useSyncState = (): SpaceSyncStateMap => {
30
31
  }
31
32
 
32
33
  ctx.onDispose(
33
- space.crud.subscribeToSyncState(ctx, ({ peers = [] }) => {
34
+ space.internal.db.subscribeToSyncState(ctx, ({ peers = [] }) => {
34
35
  const syncState = peers.find((state) => isEdgePeerId(state.peerId, space.id));
35
36
  if (syncState) {
36
37
  setSpaceState((spaceState) => ({ ...spaceState, [space.id]: syncState }));
@@ -62,7 +63,7 @@ export const useSpaceSyncState = (space: Space): PeerSyncState | undefined => {
62
63
 
63
64
  useEffect(() => {
64
65
  const ctx = new Context();
65
- space.crud.subscribeToSyncState(ctx, ({ peers = [] }) => {
66
+ space.internal.db.subscribeToSyncState(ctx, ({ peers = [] }) => {
66
67
  const syncState = peers.find((state) => isEdgePeerId(state.peerId, space.id));
67
68
  if (syncState) {
68
69
  setSpaceState(syncState);
@@ -2,21 +2,20 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
6
  import React, { useCallback } from 'react';
8
7
 
9
8
  import { Config, PublicKey } from '@dxos/client';
10
9
  import { invariant } from '@dxos/invariant';
11
10
  import { log } from '@dxos/log';
12
11
  import { Button } from '@dxos/react-ui';
13
- import { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';
14
- import { withTheme } from '@dxos/storybook-utils';
12
+ import { JsonHighlighter } from '@dxos/react-ui-syntax-highlighter';
13
+ import { withTheme } from '@dxos/react-ui/testing';
15
14
 
16
- import { useCredentials } from './useCredentials';
17
- import { useIdentity } from './useIdentity';
18
15
  import { useClient } from '../client';
19
16
  import { withClientProvider } from '../testing';
17
+ import { useCredentials } from './useCredentials';
18
+ import { useIdentity } from './useIdentity';
20
19
 
21
20
  const getNewChallenge = () => Math.random().toString(36).substring(2);
22
21
 
@@ -43,7 +42,7 @@ const Test = () => {
43
42
  challenge: new TextEncoder().encode(challenge),
44
43
  rp: { id: location.hostname, name: 'Test' },
45
44
  user: {
46
- id: lookupKey.asUint8Array(),
45
+ id: lookupKey.asUint8Array() as Uint8Array<ArrayBuffer>,
47
46
  name: identity.did,
48
47
  displayName: identity.profile?.displayName ?? '',
49
48
  },
@@ -105,7 +104,7 @@ const Test = () => {
105
104
 
106
105
  return (
107
106
  <>
108
- <div className='mbe-4 flex gap-2'>
107
+ <div className='mb-4 flex gap-2'>
109
108
  <Button disabled={!!identity} onClick={handleCreateIdentity}>
110
109
  Create Identity
111
110
  </Button>
@@ -116,20 +115,13 @@ const Test = () => {
116
115
  Authenticate with Passkey
117
116
  </Button>
118
117
  </div>
119
- <div className='flex flex-col min-w-[28rem] divide-y divide-separator border border-separator rounded'>
120
- <SyntaxHighlighter language='json'>
121
- {JSON.stringify({ identity, credentials: credentials.length }, null, 2)}
122
- </SyntaxHighlighter>
118
+ <div className='flex flex-col min-w-[28rem] divide-y divide-separator border border-separator rounded-sm'>
119
+ <JsonHighlighter data={{ identity, credentials: credentials.length }} />
123
120
  </div>
124
121
  </>
125
122
  );
126
123
  };
127
124
 
128
- export default {
129
- title: 'sdk/react-client/Passkeys',
130
- render: Test,
131
- };
132
-
133
125
  const config = new Config({
134
126
  runtime: {
135
127
  client: {
@@ -150,6 +142,14 @@ const config = new Config({
150
142
  },
151
143
  });
152
144
 
153
- export const Default = {
154
- decorators: [withClientProvider({ config }), withTheme],
155
- };
145
+ const meta = {
146
+ title: 'sdk/react-client/Passkeys',
147
+ render: Test,
148
+ decorators: [withClientProvider({ config }), withTheme()],
149
+ } satisfies Meta;
150
+
151
+ export default meta;
152
+
153
+ type Story = StoryObj<typeof meta>;
154
+
155
+ export const Default: Story = {};
@@ -5,8 +5,8 @@
5
5
  import { renderHook } from '@testing-library/react';
6
6
  import { describe, expect, test } from 'vitest';
7
7
 
8
- import { useDevices } from './useDevices';
9
8
  import { createClient, createClientContextProvider } from '../testing/util';
9
+ import { useDevices } from './useDevices';
10
10
 
11
11
  describe('useDevices', () => {
12
12
  test('lists existing devices', async () => {
@@ -7,7 +7,7 @@ import { useMemo } from 'react';
7
7
  import { useMulticastObservable } from '@dxos/react-hooks';
8
8
 
9
9
  import { useClient } from '../client';
10
- import { useInvitationStatus, type CancellableInvitationObservable } from '../invitations';
10
+ import { type CancellableInvitationObservable, useInvitationStatus } from '../invitations';
11
11
 
12
12
  export const useHaloInvitations = (): CancellableInvitationObservable[] => {
13
13
  const client = useClient();
@@ -2,7 +2,7 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import { useReducer, type Reducer, useMemo, useCallback, useEffect } from 'react';
5
+ import { useCallback, useEffect, useMemo, useReducer } from 'react';
6
6
 
7
7
  import { type PublicKey } from '@dxos/client';
8
8
  import {
@@ -24,9 +24,10 @@ interface InvitationReducerState {
24
24
  status: Invitation.State; // TODO(burdon): Rename state.
25
25
  haltedAt?: Invitation.State;
26
26
  result: InvitationResult;
27
- error?: number;
27
+ error?: Error;
28
28
  id?: string;
29
29
  multiUse?: boolean;
30
+ shareable?: boolean;
30
31
  invitationCode?: string;
31
32
  authCode?: string;
32
33
  authMethod?: Invitation.AuthMethod;
@@ -72,7 +73,7 @@ export type InvitationStatus = {
72
73
  multiUse?: boolean;
73
74
  shareable?: boolean;
74
75
  result: InvitationResult;
75
- error?: number;
76
+ error?: Error;
76
77
  cancel(): void;
77
78
  // TODO(wittjosiah): Remove?
78
79
  connect(observable: CancellableInvitationObservable): void;
@@ -82,11 +83,11 @@ export type InvitationStatus = {
82
83
  // Without private key, the invitation code cannot be created.
83
84
  // These invitations are only available to be accepted but not shared.
84
85
  const isShareableInvitation = (invitation: Invitation) =>
85
- invitation.authMethod !== Invitation.AuthMethod.KNOWN_PUBLIC_KEY || invitation.guestKeypair?.privateKey;
86
+ invitation.authMethod !== Invitation.AuthMethod.KNOWN_PUBLIC_KEY || !!invitation.guestKeypair?.privateKey;
86
87
 
87
88
  export const useInvitationStatus = (observable?: CancellableInvitationObservable): InvitationStatus => {
88
- const [state, dispatch] = useReducer<Reducer<InvitationReducerState, InvitationAction>, null>(
89
- (prev, action) => {
89
+ const [state, dispatch] = useReducer(
90
+ (prev: InvitationReducerState, action: InvitationAction): InvitationReducerState => {
90
91
  log('useInvitationStatus', { action });
91
92
  const invitationProps =
92
93
  'invitation' in action
@@ -115,10 +116,10 @@ export const useInvitationStatus = (observable?: CancellableInvitationObservable
115
116
  action.status === Invitation.State.TIMEOUT) && {
116
117
  haltedAt: typeof prev.haltedAt === 'undefined' ? action.haltedAt : prev.haltedAt,
117
118
  }),
118
- } as InvitationReducerState;
119
+ };
119
120
  },
120
121
  null,
121
- (_arg: null) => {
122
+ (_arg: null): InvitationReducerState => {
122
123
  const invitation = observable?.get();
123
124
  return {
124
125
  status: Invitation.State.INIT,
@@ -2,35 +2,37 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
6
  import React from 'react';
8
7
 
8
+ import { Obj } from '@dxos/echo';
9
9
  import { Input } from '@dxos/react-ui';
10
- import { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';
11
- import { withTheme } from '@dxos/storybook-utils';
10
+ import { JsonHighlighter } from '@dxos/react-ui-syntax-highlighter';
11
+ import { withTheme } from '@dxos/react-ui/testing';
12
12
 
13
- import { ClientRepeater, type ClientRepeatedComponentProps } from './ClientRepeater';
14
13
  import { useClient } from '../client';
15
14
  import { useSpace } from '../echo';
15
+ import { type ClientRepeatedComponentProps, ClientRepeater } from './ClientRepeater';
16
16
 
17
- export default {
17
+ const meta = {
18
18
  title: 'sdk/react-client/ClientRepeater',
19
- decorators: [withTheme],
20
- };
19
+ decorators: [withTheme()],
20
+ } satisfies Meta<typeof Input>;
21
+
22
+ export default meta;
23
+
24
+ type Story = StoryObj<typeof meta>;
21
25
 
22
- const JsonPanel = ({ value }: { value: any }) => (
23
- <SyntaxHighlighter language='json'>{JSON.stringify(value, undefined, 2)}</SyntaxHighlighter>
24
- );
26
+ const JsonPanel = ({ value }: { value: any }) => <JsonHighlighter data={value} />;
25
27
 
26
28
  const ClientStory = () => {
27
29
  const client = useClient();
28
30
  return <JsonPanel value={client.toJSON()} />;
29
31
  };
30
32
 
31
- const ClientSpace = ({ spaceKey }: ClientRepeatedComponentProps) => {
33
+ const ClientSpace = ({ spaceId }: ClientRepeatedComponentProps) => {
32
34
  const client = useClient();
33
- const space = useSpace(spaceKey);
35
+ const space = useSpace(spaceId);
34
36
  if (!space?.isOpen) {
35
37
  return null;
36
38
  }
@@ -41,7 +43,11 @@ const ClientSpace = ({ spaceKey }: ClientRepeatedComponentProps) => {
41
43
  <Input.TextInput
42
44
  placeholder='Name'
43
45
  value={space.properties.name}
44
- onChange={(event) => (space.properties.name = event.target.value)}
46
+ onChange={(event) =>
47
+ Obj.update(space.properties, (obj) => {
48
+ obj.name = event.target.value;
49
+ })
50
+ }
45
51
  />
46
52
  </Input.Root>
47
53
  <JsonPanel value={client.toJSON()} />
@@ -49,10 +55,10 @@ const ClientSpace = ({ spaceKey }: ClientRepeatedComponentProps) => {
49
55
  );
50
56
  };
51
57
 
52
- export const Default = {
58
+ export const Default: Story = {
53
59
  render: () => <ClientRepeater component={ClientStory} count={2} />,
54
60
  };
55
61
 
56
- export const Space = {
62
+ export const Space: Story = {
57
63
  render: () => <ClientRepeater component={ClientSpace} count={2} createSpace />,
58
64
  };
@@ -2,18 +2,19 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import React, { useState, type FC, useEffect, useRef } from 'react';
5
+ import React, { type FC, useRef, useState } from 'react';
6
6
 
7
- import { Client, type PublicKey } from '@dxos/client';
7
+ import { Client } from '@dxos/client';
8
8
  import { TestBuilder, performInvitation } from '@dxos/client/testing';
9
- import { type TypedObject } from '@dxos/echo-schema';
10
- import { registerSignalsRuntime } from '@dxos/echo-signals/react';
11
- import { faker } from '@dxos/random';
9
+ import { type Type } from '@dxos/echo';
10
+ import { random } from '@dxos/random';
11
+ import { useAsyncEffect } from '@dxos/react-hooks';
12
12
 
13
- import { type WithClientProviderProps } from './withClientProvider';
14
13
  import { ClientProvider } from '../client';
14
+ import { type SpaceId } from '../echo';
15
+ import { type WithClientProviderProps } from './withClientProvider';
15
16
 
16
- export type ClientRepeatedComponentProps = { id: number; count: number; spaceKey?: PublicKey };
17
+ export type ClientRepeatedComponentProps = { id: number; count: number; spaceId?: SpaceId };
17
18
 
18
19
  export type ClientRepeaterControlsProps = { clients: Client[] };
19
20
 
@@ -24,9 +25,9 @@ export type ClientRepeaterProps<P extends ClientRepeatedComponentProps> = {
24
25
  controls?: FC<ClientRepeaterControlsProps>;
25
26
  count?: number;
26
27
  clients?: Client[];
27
- types?: TypedObject[];
28
+ types?: Type.AnyObj[];
28
29
  args?: Omit<P, 'id' | 'count'>;
29
- } & Pick<WithClientProviderProps, 'createIdentity' | 'createSpace' | 'onSpaceCreated'>;
30
+ } & Pick<WithClientProviderProps, 'createIdentity' | 'createSpace' | 'onCreateSpace'>;
30
31
 
31
32
  /**
32
33
  * Utility component for Storybook stories which sets up clients for n peers.
@@ -46,41 +47,32 @@ export const ClientRepeater = <P extends ClientRepeatedComponentProps>(props: Cl
46
47
  types,
47
48
  createIdentity,
48
49
  createSpace,
49
- onSpaceCreated,
50
+ onCreateSpace,
50
51
  } = props;
51
- useEffect(() => {
52
- registerSignalsRuntime();
53
- }, []);
54
52
 
55
53
  const [clients, setClients] = useState(props.clients ?? []);
56
- const [spaceKey, setSpaceKey] = useState<PublicKey>();
54
+ const [spaceId, setSpaceId] = useState<SpaceId>();
57
55
 
58
56
  const testBuilder = useRef(new TestBuilder());
59
- useEffect(() => {
60
- const timeout = setTimeout(async () => {
61
- const clients = [...Array(count)].map(
62
- (_) => new Client({ services: testBuilder.current.createLocalClientServices(), types }),
63
- );
64
-
65
- await Promise.all(clients.map((client) => client.initialize()));
66
- if (createIdentity || createSpace) {
67
- await Promise.all(clients.map((client) => client.halo.createIdentity()));
68
- }
57
+ useAsyncEffect(async () => {
58
+ const clients = [...Array(count)].map(
59
+ (_) => new Client({ services: testBuilder.current.createLocalClientServices(), types }),
60
+ );
69
61
 
70
- if (createSpace) {
71
- const client = clients[0];
72
- const space = await client.spaces.create({ name: faker.commerce.productName() });
73
- setSpaceKey(space.key);
74
- await onSpaceCreated?.({ client, space }, {});
75
- await Promise.all(
76
- clients.slice(1).flatMap((client) => performInvitation({ host: space, guest: client.spaces })),
77
- );
78
- }
62
+ await Promise.all(clients.map((client) => client.initialize()));
63
+ if (createIdentity || createSpace) {
64
+ await Promise.all(clients.map((client) => client.halo.createIdentity()));
65
+ }
79
66
 
80
- setClients(clients);
81
- });
67
+ if (createSpace) {
68
+ const client = clients[0];
69
+ const space = await client.spaces.create({ name: random.commerce.productName() });
70
+ setSpaceId(space.id);
71
+ await onCreateSpace?.({ client, space }, {});
72
+ await Promise.all(clients.slice(1).flatMap((client) => performInvitation({ host: space, guest: client.spaces })));
73
+ }
82
74
 
83
- return () => clearTimeout(timeout);
75
+ setClients(clients);
84
76
  }, []);
85
77
 
86
78
  if (clients.length === 0) {
@@ -92,7 +84,7 @@ export const ClientRepeater = <P extends ClientRepeatedComponentProps>(props: Cl
92
84
  {Controls && <Controls clients={clients} />}
93
85
  {clients.map((client, index) => (
94
86
  <ClientProvider key={index} client={client}>
95
- <Component id={index} count={clients.length} spaceKey={spaceKey} {...{ ...props.args }} />
87
+ <Component id={index} count={clients.length} spaceId={spaceId} {...{ ...props.args }} />
96
88
  </ClientProvider>
97
89
  ))}
98
90
  </>
@@ -4,16 +4,17 @@
4
4
 
5
5
  import { createContext, useContext } from 'react';
6
6
 
7
- import { type Space } from '@dxos/client/echo';
7
+ import { type Space, type SpaceId } from '@dxos/client/echo';
8
8
  import { raise } from '@dxos/debug';
9
9
 
10
10
  export type ClientStory = {
11
+ index?: number;
12
+ spaceId?: SpaceId;
11
13
  space?: Space;
12
14
  };
13
15
 
14
- // TODO(wittjosiah): Add to multi-client as well.
15
16
  export const ClientStory = createContext<ClientStory | undefined>(undefined);
16
17
 
17
- export const useClientProvider = (): ClientStory => {
18
+ export const useClientStory = (): ClientStory => {
18
19
  return useContext(ClientStory) ?? raise(new Error('Missing ClientStory'));
19
20
  };
@@ -24,7 +24,6 @@ export const createClient = async ({
24
24
  let space: Space | undefined;
25
25
  if (createSpace) {
26
26
  space = await client.spaces.create();
27
- await client.spaces.waitUntilReady();
28
27
  }
29
28
 
30
29
  return { client, space };