@dxos/react-client 0.8.3 → 0.8.4-main.05e74ebcff

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 (426) hide show
  1. package/.storybook/main.mts +9 -0
  2. package/.storybook/preview.mts +8 -0
  3. package/LICENSE +102 -5
  4. package/README.md +1 -1
  5. package/dist/lib/browser/chunk-3LVU7RNK.mjs +16 -0
  6. package/dist/lib/browser/chunk-3LVU7RNK.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-CZMIVAGI.mjs +8 -0
  8. package/dist/lib/browser/chunk-CZMIVAGI.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-XT352YI6.mjs +134 -0
  10. package/dist/lib/browser/chunk-XT352YI6.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-AL2CUQ46.mjs → chunk-YHE6WD44.mjs} +8 -18
  12. package/dist/lib/browser/chunk-YHE6WD44.mjs.map +7 -0
  13. package/dist/lib/browser/devtools/index.mjs +8 -12
  14. package/dist/lib/browser/devtools/index.mjs.map +3 -3
  15. package/dist/lib/browser/echo/index.mjs +63 -182
  16. package/dist/lib/browser/echo/index.mjs.map +4 -4
  17. package/dist/lib/browser/halo/index.mjs +12 -10
  18. package/dist/lib/browser/halo/index.mjs.map +3 -3
  19. package/dist/lib/browser/index.mjs +100 -13
  20. package/dist/lib/browser/index.mjs.map +4 -4
  21. package/dist/lib/browser/invitations/index.mjs +1 -1
  22. package/dist/lib/browser/mesh/index.mjs +4 -3
  23. package/dist/lib/browser/mesh/index.mjs.map +1 -1
  24. package/dist/lib/browser/meta.json +1 -1
  25. package/dist/lib/browser/testing/index.mjs +117 -160
  26. package/dist/lib/browser/testing/index.mjs.map +3 -3
  27. package/dist/lib/browser/worker.mjs +1 -1
  28. package/dist/lib/node-esm/chunk-CUDKNAMV.mjs +17 -0
  29. package/dist/lib/node-esm/chunk-CUDKNAMV.mjs.map +7 -0
  30. package/dist/lib/node-esm/{chunk-UYJUBYMU.mjs → chunk-RQJPEHDY.mjs} +8 -18
  31. package/dist/lib/node-esm/chunk-RQJPEHDY.mjs.map +7 -0
  32. package/dist/lib/node-esm/chunk-WL3Z5HOH.mjs +135 -0
  33. package/dist/lib/node-esm/chunk-WL3Z5HOH.mjs.map +7 -0
  34. package/dist/lib/node-esm/chunk-WUTK2IJF.mjs +10 -0
  35. package/dist/lib/node-esm/chunk-WUTK2IJF.mjs.map +7 -0
  36. package/dist/lib/node-esm/devtools/index.mjs +8 -12
  37. package/dist/lib/node-esm/devtools/index.mjs.map +3 -3
  38. package/dist/lib/node-esm/echo/index.mjs +63 -182
  39. package/dist/lib/node-esm/echo/index.mjs.map +4 -4
  40. package/dist/lib/node-esm/halo/index.mjs +12 -10
  41. package/dist/lib/node-esm/halo/index.mjs.map +3 -3
  42. package/dist/lib/node-esm/index.mjs +100 -13
  43. package/dist/lib/node-esm/index.mjs.map +4 -4
  44. package/dist/lib/node-esm/invitations/index.mjs +1 -1
  45. package/dist/lib/node-esm/mesh/index.mjs +4 -3
  46. package/dist/lib/node-esm/mesh/index.mjs.map +1 -1
  47. package/dist/lib/node-esm/meta.json +1 -1
  48. package/dist/lib/node-esm/testing/index.mjs +117 -160
  49. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  50. package/dist/lib/node-esm/worker.mjs +1 -1
  51. package/dist/types/src/banner.d.ts.map +1 -1
  52. package/dist/types/src/client/AgentHostingProvider.d.ts.map +1 -1
  53. package/dist/types/src/client/ClientProvider.d.ts +1 -11
  54. package/dist/types/src/client/ClientProvider.d.ts.map +1 -1
  55. package/dist/types/src/client/useClientStatus.d.ts.map +1 -1
  56. package/dist/types/src/devtools/useStream.d.ts.map +1 -1
  57. package/dist/types/src/echo/index.d.ts +2 -3
  58. package/dist/types/src/echo/index.d.ts.map +1 -1
  59. package/dist/types/src/echo/useMembers.d.ts +2 -2
  60. package/dist/types/src/echo/useMembers.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 -8
  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 -1
  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 +45 -59
  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 -3
  98. package/src/echo/useMembers.ts +5 -3
  99. package/src/echo/useSpaceInvitations.ts +10 -5
  100. package/src/echo/useSpaceProperties.ts +28 -0
  101. package/src/echo/useSpaces.test.tsx +8 -14
  102. package/src/echo/useSpaces.ts +32 -29
  103. package/src/echo/useSubscription.ts +1 -1
  104. package/src/echo/useSyncState.ts +5 -4
  105. package/src/halo/Passkey.stories.tsx +20 -20
  106. package/src/halo/useDevices.test.tsx +1 -1
  107. package/src/halo/useHaloInvitations.ts +1 -1
  108. package/src/invitations/useInvitationStatus.ts +9 -8
  109. package/src/testing/ClientRepeater.stories.tsx +22 -16
  110. package/src/testing/ClientRepeater.tsx +29 -37
  111. package/src/testing/context.tsx +4 -2
  112. package/src/testing/util.tsx +0 -1
  113. package/src/testing/withClientProvider.stories.tsx +34 -20
  114. package/src/testing/withClientProvider.tsx +77 -93
  115. package/tsconfig.json +6 -6
  116. package/typedoc.json +1 -1
  117. package/vitest.config.ts +10 -16
  118. package/.eslintrc.cjs +0 -12
  119. package/README.yml +0 -33
  120. package/dist/lib/browser/chunk-72QD3PXL.mjs +0 -312
  121. package/dist/lib/browser/chunk-72QD3PXL.mjs.map +0 -7
  122. package/dist/lib/browser/chunk-AL2CUQ46.mjs.map +0 -7
  123. package/dist/lib/node/chunk-5RUIFUEC.cjs +0 -334
  124. package/dist/lib/node/chunk-5RUIFUEC.cjs.map +0 -7
  125. package/dist/lib/node/chunk-FYOAVV65.cjs +0 -188
  126. package/dist/lib/node/chunk-FYOAVV65.cjs.map +0 -7
  127. package/dist/lib/node/devtools/index.cjs +0 -62
  128. package/dist/lib/node/devtools/index.cjs.map +0 -7
  129. package/dist/lib/node/echo/index.cjs +0 -302
  130. package/dist/lib/node/echo/index.cjs.map +0 -7
  131. package/dist/lib/node/halo/index.cjs +0 -123
  132. package/dist/lib/node/halo/index.cjs.map +0 -7
  133. package/dist/lib/node/index.cjs +0 -55
  134. package/dist/lib/node/index.cjs.map +0 -7
  135. package/dist/lib/node/invitations/index.cjs +0 -39
  136. package/dist/lib/node/invitations/index.cjs.map +0 -7
  137. package/dist/lib/node/mesh/index.cjs +0 -37
  138. package/dist/lib/node/mesh/index.cjs.map +0 -7
  139. package/dist/lib/node/meta.json +0 -1
  140. package/dist/lib/node/testing/index.cjs +0 -278
  141. package/dist/lib/node/testing/index.cjs.map +0 -7
  142. package/dist/lib/node/worker.cjs +0 -23
  143. package/dist/lib/node/worker.cjs.map +0 -7
  144. package/dist/lib/node-esm/chunk-NBTZZNQ5.mjs +0 -314
  145. package/dist/lib/node-esm/chunk-NBTZZNQ5.mjs.map +0 -7
  146. package/dist/lib/node-esm/chunk-UYJUBYMU.mjs.map +0 -7
  147. package/dist/types/src/echo/useQuery.d.ts +0 -11
  148. package/dist/types/src/echo/useQuery.d.ts.map +0 -1
  149. package/dist/types/src/echo/useQuery.test.d.ts +0 -2
  150. package/dist/types/src/echo/useQuery.test.d.ts.map +0 -1
  151. package/dist/types/src/echo/useQueue.d.ts +0 -11
  152. package/dist/types/src/echo/useQueue.d.ts.map +0 -1
  153. package/dist/types/src/echo/useSchema.d.ts +0 -8
  154. package/dist/types/src/echo/useSchema.d.ts.map +0 -1
  155. package/dist/types/src/playwright/playwright.config.d.cts +0 -3
  156. package/dist/types/src/playwright/playwright.config.d.cts.map +0 -1
  157. package/dist/types/src/playwright/smoke.spec.d.ts +0 -2
  158. package/dist/types/src/playwright/smoke.spec.d.ts.map +0 -1
  159. package/project.json +0 -40
  160. package/src/echo/useQuery.test.tsx +0 -128
  161. package/src/echo/useQuery.ts +0 -56
  162. package/src/echo/useQueue.ts +0 -74
  163. package/src/echo/useSchema.ts +0 -54
  164. package/src/playwright/playwright.config.cts +0 -18
  165. package/src/playwright/smoke.spec.ts +0 -26
  166. package/typedoc/.nojekyll +0 -1
  167. package/typedoc/assets/hierarchy.js +0 -1
  168. package/typedoc/assets/highlight.css +0 -99
  169. package/typedoc/assets/icons.js +0 -18
  170. package/typedoc/assets/icons.svg +0 -1
  171. package/typedoc/assets/main.js +0 -60
  172. package/typedoc/assets/navigation.js +0 -1
  173. package/typedoc/assets/search.js +0 -1
  174. package/typedoc/assets/style.css +0 -1640
  175. package/typedoc/classes/echo.Hypergraph.html +0 -17
  176. package/typedoc/classes/echo.PropertiesType.html +0 -19
  177. package/typedoc/classes/echo.QueryResult.html +0 -18
  178. package/typedoc/classes/halo.KeyStore.html +0 -6
  179. package/typedoc/classes/index.AgentClientServiceProvider.html +0 -10
  180. package/typedoc/classes/index.AgentManagerClient.html +0 -22
  181. package/typedoc/classes/index.AlreadyJoinedError.html +0 -15
  182. package/typedoc/classes/index.ApiError.html +0 -16
  183. package/typedoc/classes/index.CancelledError.html +0 -16
  184. package/typedoc/classes/index.Client.html +0 -51
  185. package/typedoc/classes/index.ClientServicesProxy.html +0 -12
  186. package/typedoc/classes/index.Config.html +0 -17
  187. package/typedoc/classes/index.DataCorruptionError.html +0 -16
  188. package/typedoc/classes/index.DatabaseError.html +0 -15
  189. package/typedoc/classes/index.EntityNotFoundError.html +0 -15
  190. package/typedoc/classes/index.FakeAgentHostingProvider.html +0 -7
  191. package/typedoc/classes/index.IFrameManager.html +0 -6
  192. package/typedoc/classes/index.IdentityNotInitializedError.html +0 -15
  193. package/typedoc/classes/index.InvalidConfigError.html +0 -16
  194. package/typedoc/classes/index.InvalidInvitationError.html +0 -15
  195. package/typedoc/classes/index.InvalidInvitationExtensionRoleError.html +0 -16
  196. package/typedoc/classes/index.InvalidStorageVersionError.html +0 -15
  197. package/typedoc/classes/index.LocalClientServices.html +0 -12
  198. package/typedoc/classes/index.PublicKey.html +0 -55
  199. package/typedoc/classes/index.RemoteServiceConnectionError.html +0 -15
  200. package/typedoc/classes/index.RemoteServiceConnectionTimeout.html +0 -15
  201. package/typedoc/classes/index.RpcClosedError.html +0 -15
  202. package/typedoc/classes/index.RpcNotOpenError.html +0 -15
  203. package/typedoc/classes/index.SharedWorkerConnection.html +0 -5
  204. package/typedoc/classes/index.Shell.html +0 -35
  205. package/typedoc/classes/index.ShellManager.html +0 -9
  206. package/typedoc/classes/index.SystemError.html +0 -16
  207. package/typedoc/classes/index.UnknownModelError.html +0 -15
  208. package/typedoc/classes/index.WorkerClientServices.html +0 -12
  209. package/typedoc/classes/invitations.AuthenticatingInvitationObservable.html +0 -30
  210. package/typedoc/classes/invitations.CancellableInvitationObservable.html +0 -29
  211. package/typedoc/classes/invitations.InvitationEncoder.html +0 -5
  212. package/typedoc/classes/invitations.InvitationsProxy.html +0 -12
  213. package/typedoc/enums/devtools.KeyType.html +0 -9
  214. package/typedoc/enums/echo.HaloSpaceMember.Role.html +0 -9
  215. package/typedoc/enums/echo.IndexKind.Kind.html +0 -8
  216. package/typedoc/enums/echo.QueryOptions.DataLocation.html +0 -6
  217. package/typedoc/enums/echo.QueryOptions.ShowDeletedOption.html +0 -6
  218. package/typedoc/enums/echo.ResultFormat.html +0 -10
  219. package/typedoc/enums/echo.SpaceMember.PresenceState.html +0 -5
  220. package/typedoc/enums/echo.SpaceState.html +0 -13
  221. package/typedoc/enums/echo.TextKind.html +0 -5
  222. package/typedoc/enums/halo.Device.PresenceState.html +0 -6
  223. package/typedoc/enums/halo.DeviceKind.html +0 -5
  224. package/typedoc/enums/halo.DeviceType.html +0 -9
  225. package/typedoc/enums/index.ShellDisplay.html +0 -5
  226. package/typedoc/enums/index.ShellLayout.html +0 -13
  227. package/typedoc/enums/index.SystemStatus.html +0 -5
  228. package/typedoc/enums/invitations.Invitation.AuthMethod.html +0 -6
  229. package/typedoc/enums/invitations.Invitation.Kind.html +0 -5
  230. package/typedoc/enums/invitations.Invitation.State.html +0 -13
  231. package/typedoc/enums/invitations.Invitation.Type.html +0 -6
  232. package/typedoc/enums/mesh.ConnectionState.html +0 -5
  233. package/typedoc/functions/devtools.useDevtools.html +0 -1
  234. package/typedoc/functions/devtools.useStream.html +0 -2
  235. package/typedoc/functions/echo.useMembers.html +0 -1
  236. package/typedoc/functions/echo.useQueue.html +0 -2
  237. package/typedoc/functions/echo.useSchema.html +0 -2
  238. package/typedoc/functions/echo.useSpace.html +0 -6
  239. package/typedoc/functions/echo.useSpaceInvitation.html +0 -1
  240. package/typedoc/functions/echo.useSpaceInvitations.html +0 -1
  241. package/typedoc/functions/echo.useSpaceSyncState.html +0 -2
  242. package/typedoc/functions/echo.useSpaces.html +0 -5
  243. package/typedoc/functions/echo.useSubscription.html +0 -3
  244. package/typedoc/functions/echo.useSyncState.html +0 -2
  245. package/typedoc/functions/halo.useContacts.html +0 -4
  246. package/typedoc/functions/halo.useCredentials.html +0 -1
  247. package/typedoc/functions/halo.useDevices.html +0 -1
  248. package/typedoc/functions/halo.useHaloInvitation.html +0 -1
  249. package/typedoc/functions/halo.useHaloInvitations.html +0 -1
  250. package/typedoc/functions/halo.useIdentity.html +0 -3
  251. package/typedoc/functions/halo.useKeyStore.html +0 -3
  252. package/typedoc/functions/index.AgentHostingProvider.html +0 -2
  253. package/typedoc/functions/index.useAgentHostingClient.html +0 -1
  254. package/typedoc/functions/index.useClient.html +0 -3
  255. package/typedoc/functions/index.useClientStatus.html +0 -1
  256. package/typedoc/functions/index.useConfig.html +0 -3
  257. package/typedoc/functions/index.useShell.html +0 -2
  258. package/typedoc/functions/index.useShellDisplay.html +0 -2
  259. package/typedoc/functions/index.useStatus.html +0 -1
  260. package/typedoc/functions/invitations.useInvitationStatus.html +0 -1
  261. package/typedoc/functions/mesh.useNetworkStatus.html +0 -2
  262. package/typedoc/hierarchy.html +0 -1
  263. package/typedoc/index.html +0 -23
  264. package/typedoc/interfaces/devtools.DevtoolsHook.html +0 -22
  265. package/typedoc/interfaces/devtools.DevtoolsHost.html +0 -26
  266. package/typedoc/interfaces/echo.DocAccessor.html +0 -3
  267. package/typedoc/interfaces/echo.Echo.html +0 -39
  268. package/typedoc/interfaces/echo.EchoDatabase.html +0 -25
  269. package/typedoc/interfaces/echo.Expando.html +0 -3
  270. package/typedoc/interfaces/echo.Filter.html +0 -3
  271. package/typedoc/interfaces/echo.HaloSpaceMember.html +0 -18
  272. package/typedoc/interfaces/echo.IDocHandle.html +0 -6
  273. package/typedoc/interfaces/echo.IndexKind.html +0 -9
  274. package/typedoc/interfaces/echo.Query.html +0 -34
  275. package/typedoc/interfaces/echo.QueryOptions.html +0 -39
  276. package/typedoc/interfaces/echo.Queue.html +0 -17
  277. package/typedoc/interfaces/echo.Ref.html +0 -32
  278. package/typedoc/interfaces/echo.Space.html +0 -39
  279. package/typedoc/interfaces/echo.SpaceMember.html +0 -7
  280. package/typedoc/interfaces/echo.SpaceSyncState.PeerState.html +0 -14
  281. package/typedoc/interfaces/echo.SpaceSyncState.html +0 -4
  282. package/typedoc/interfaces/echo.SubscriptionHandle.html +0 -5
  283. package/typedoc/interfaces/echo.TypedObject.html +0 -16
  284. package/typedoc/interfaces/halo.Contact.html +0 -10
  285. package/typedoc/interfaces/halo.Credential.html +0 -27
  286. package/typedoc/interfaces/halo.Device.html +0 -11
  287. package/typedoc/interfaces/halo.Halo.html +0 -16
  288. package/typedoc/interfaces/halo.Identity.html +0 -15
  289. package/typedoc/interfaces/index.AgentHostingProviderClient.html +0 -6
  290. package/typedoc/interfaces/index.AppContextRequest.html +0 -33
  291. package/typedoc/interfaces/index.ClientServicesProvider.html +0 -9
  292. package/typedoc/interfaces/index.InvitationUrlRequest.html +0 -9
  293. package/typedoc/interfaces/index.LayoutRequest.html +0 -29
  294. package/typedoc/interfaces/index.ShellRuntime.html +0 -15
  295. package/typedoc/interfaces/invitations.Invitation.html +0 -92
  296. package/typedoc/interfaces/invitations.Invitations.html +0 -5
  297. package/typedoc/interfaces/mesh.GossipMessage.html +0 -10
  298. package/typedoc/interfaces/mesh.NetworkStatus.Signal.html +0 -5
  299. package/typedoc/interfaces/mesh.NetworkStatus.html +0 -6
  300. package/typedoc/media/LICENSE +0 -8
  301. package/typedoc/modules/devtools.html +0 -1
  302. package/typedoc/modules/echo.Filter.html +0 -1
  303. package/typedoc/modules/echo.HaloSpaceMember.html +0 -1
  304. package/typedoc/modules/echo.IndexKind.html +0 -1
  305. package/typedoc/modules/echo.Query.html +0 -1
  306. package/typedoc/modules/echo.QueryOptions.html +0 -1
  307. package/typedoc/modules/echo.Ref.html +0 -2
  308. package/typedoc/modules/echo.SpaceMember.html +0 -1
  309. package/typedoc/modules/echo.SpaceSyncState.html +0 -1
  310. package/typedoc/modules/echo.html +0 -1
  311. package/typedoc/modules/halo.Device.html +0 -1
  312. package/typedoc/modules/halo.html +0 -1
  313. package/typedoc/modules/index.html +0 -1
  314. package/typedoc/modules/invitations.Invitation.html +0 -1
  315. package/typedoc/modules/invitations.html +0 -1
  316. package/typedoc/modules/mesh.NetworkStatus.html +0 -1
  317. package/typedoc/modules/mesh.html +0 -1
  318. package/typedoc/modules/worker.html +0 -1
  319. package/typedoc/modules.html +0 -1
  320. package/typedoc/types/devtools.MountOptions.html +0 -3
  321. package/typedoc/types/echo.AnyLiveObject.html +0 -2
  322. package/typedoc/types/echo.Filter.And.html +0 -1
  323. package/typedoc/types/echo.Filter.Any.html +0 -1
  324. package/typedoc/types/echo.Filter.Or.html +0 -1
  325. package/typedoc/types/echo.Filter.Props.html +0 -1
  326. package/typedoc/types/echo.Filter.Type.html +0 -1
  327. package/typedoc/types/echo.Live.html +0 -5
  328. package/typedoc/types/echo.ObjectMeta.html +0 -1
  329. package/typedoc/types/echo.ObjectMigration.html +0 -7
  330. package/typedoc/types/echo.ObjectVersion.html +0 -2
  331. package/typedoc/types/echo.PeerSyncState.html +0 -1
  332. package/typedoc/types/echo.Progress.html +0 -3
  333. package/typedoc/types/echo.PropertiesTypeProps.html +0 -1
  334. package/typedoc/types/echo.Query.Any.html +0 -1
  335. package/typedoc/types/echo.Query.TextSearchOptions.html +0 -2
  336. package/typedoc/types/echo.Query.Type.html +0 -1
  337. package/typedoc/types/echo.Ref.Target.html +0 -2
  338. package/typedoc/types/echo.Selection.html +0 -1
  339. package/typedoc/types/echo.SpaceId.html +0 -6
  340. package/typedoc/types/echo.SpaceSyncStateMap.html +0 -1
  341. package/typedoc/types/echo.UseQueueOptions.html +0 -2
  342. package/typedoc/types/echo.UseSpacesParams.html +0 -3
  343. package/typedoc/types/index.AgentHostingProviderProps.html +0 -3
  344. package/typedoc/types/index.ClientContextProps.html +0 -3
  345. package/typedoc/types/index.ClientOptions.html +0 -12
  346. package/typedoc/types/index.ClientProviderProps.html +0 -2
  347. package/typedoc/types/index.ClientServices.html +0 -15
  348. package/typedoc/types/index.FromAgentOptions.html +0 -2
  349. package/typedoc/types/index.PublicKeyLike.html +0 -2
  350. package/typedoc/types/invitations.InvitationAction.html +0 -1
  351. package/typedoc/types/invitations.InvitationResult.html +0 -5
  352. package/typedoc/types/invitations.InvitationStatus.html +0 -15
  353. package/typedoc/variables/devtools.mountDevtoolsHooks.html +0 -1
  354. package/typedoc/variables/devtools.unmountDevtoolsHooks.html +0 -1
  355. package/typedoc/variables/echo.DocAccessor.html +0 -1
  356. package/typedoc/variables/echo.EchoObjectSchema.html +0 -1
  357. package/typedoc/variables/echo.Expando.html +0 -1
  358. package/typedoc/variables/echo.FQ_ID_LENGTH.html +0 -1
  359. package/typedoc/variables/echo.Filter.html +0 -1
  360. package/typedoc/variables/echo.OBJECT_ID_LENGTH.html +0 -1
  361. package/typedoc/variables/echo.ObjectVersion.html +0 -1
  362. package/typedoc/variables/echo.Query.html +0 -1
  363. package/typedoc/variables/echo.Queue.html +0 -1
  364. package/typedoc/variables/echo.ReactiveObjectSchema.html +0 -1
  365. package/typedoc/variables/echo.Ref.html +0 -2
  366. package/typedoc/variables/echo.RefArray.html +0 -2
  367. package/typedoc/variables/echo.SPACE_ID_LENGTH.html +0 -1
  368. package/typedoc/variables/echo.SpaceId.html +0 -1
  369. package/typedoc/variables/echo.SpaceSchema.html +0 -1
  370. package/typedoc/variables/echo.TypedObject.html +0 -3
  371. package/typedoc/variables/echo.compareForeignKeys.html +0 -1
  372. package/typedoc/variables/echo.createDocAccessor.html +0 -1
  373. package/typedoc/variables/echo.createEmptyEdgeSyncState.html +0 -1
  374. package/typedoc/variables/echo.createObject.html +0 -1
  375. package/typedoc/variables/echo.createQueueDXN.html +0 -2
  376. package/typedoc/variables/echo.createSubscription.html +0 -5
  377. package/typedoc/variables/echo.defineObjectMigration.html +0 -1
  378. package/typedoc/variables/echo.fromCursor.html +0 -1
  379. package/typedoc/variables/echo.fullyQualifiedId.html +0 -4
  380. package/typedoc/variables/echo.getMeta.html +0 -1
  381. package/typedoc/variables/echo.getObjectCore.html +0 -1
  382. package/typedoc/variables/echo.getRangeFromCursor.html +0 -1
  383. package/typedoc/variables/echo.getSchema.html +0 -2
  384. package/typedoc/variables/echo.getSource.html +0 -4
  385. package/typedoc/variables/echo.getSpace.html +0 -1
  386. package/typedoc/variables/echo.getSyncSummary.html +0 -1
  387. package/typedoc/variables/echo.getTarget.html +0 -4
  388. package/typedoc/variables/echo.getTextInRange.html +0 -2
  389. package/typedoc/variables/echo.getType.html +0 -5
  390. package/typedoc/variables/echo.getTypename.html +0 -6
  391. package/typedoc/variables/echo.getVersion.html +0 -3
  392. package/typedoc/variables/echo.importSpace.html +0 -1
  393. package/typedoc/variables/echo.internalDecodeReference.html +0 -1
  394. package/typedoc/variables/echo.isEchoObject.html +0 -2
  395. package/typedoc/variables/echo.isLiveObject.html +0 -2
  396. package/typedoc/variables/echo.isRelation.html +0 -2
  397. package/typedoc/variables/echo.isSpace.html +0 -1
  398. package/typedoc/variables/echo.live.html +0 -3
  399. package/typedoc/variables/echo.loadObjectReferences.html +0 -7
  400. package/typedoc/variables/echo.makeRef.html +0 -2
  401. package/typedoc/variables/echo.parseFullyQualifiedId.html +0 -2
  402. package/typedoc/variables/echo.parseId.html +0 -1
  403. package/typedoc/variables/echo.refFromDXN.html +0 -2
  404. package/typedoc/variables/echo.toCursor.html +0 -1
  405. package/typedoc/variables/echo.toCursorRange.html +0 -1
  406. package/typedoc/variables/echo.updateText.html +0 -6
  407. package/typedoc/variables/echo.useQuery.html +0 -2
  408. package/typedoc/variables/index.AgentHostingContext.html +0 -1
  409. package/typedoc/variables/index.ClientProvider.html +0 -3
  410. package/typedoc/variables/index.DXOS_VERSION.html +0 -1
  411. package/typedoc/variables/index.Defaults.html +0 -2
  412. package/typedoc/variables/index.Dynamics.html +0 -2
  413. package/typedoc/variables/index.Envs.html +0 -2
  414. package/typedoc/variables/index.Local.html +0 -2
  415. package/typedoc/variables/index.Remote.html +0 -1
  416. package/typedoc/variables/index.Storage.html +0 -2
  417. package/typedoc/variables/index.createClientServices.html +0 -4
  418. package/typedoc/variables/index.fromAgent.html +0 -2
  419. package/typedoc/variables/index.fromHost.html +0 -2
  420. package/typedoc/variables/index.fromSocket.html +0 -2
  421. package/typedoc/variables/index.fromWorker.html +0 -2
  422. package/typedoc/variables/index.getUnixSocket.html +0 -1
  423. package/typedoc/variables/index.resolveRef.html +0 -1
  424. package/typedoc/variables/index.useMulticastObservable.html +0 -3
  425. package/typedoc/variables/worker.getWorkerServiceHost.html +0 -1
  426. package/typedoc/variables/worker.onconnect.html +0 -1
@@ -2,33 +2,33 @@
2
2
  // Copyright 2024 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';
7
+ import { expect, within } from 'storybook/test';
8
8
 
9
9
  import { log } from '@dxos/log';
10
- import { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';
11
- import { withLayout, withTheme } from '@dxos/storybook-utils';
10
+ import { JsonHighlighter } from '@dxos/react-ui-syntax-highlighter';
11
+ import { withLayout, withTheme, Loading } from '@dxos/react-ui/testing';
12
12
 
13
- import { withClientProvider, type WithClientProviderProps, withMultiClientProvider } from './withClientProvider';
14
13
  import { useClient } from '../client';
15
14
  import { type Space, useSpaces } from '../echo';
15
+ import { type WithClientProviderProps, withClientProvider, withMultiClientProvider } from './withClientProvider';
16
16
 
17
17
  const SpaceInfo = ({ space }: { space: Space }) => {
18
18
  const name = space.isOpen ? space.properties.name : '';
19
- return <SyntaxHighlighter language='json'>{JSON.stringify({ id: space.id, name }, null, 2)}</SyntaxHighlighter>;
19
+ return <JsonHighlighter data={{ id: space.id, name }} />;
20
20
  };
21
21
 
22
- const Test = () => {
22
+ const DefaultStory = () => {
23
23
  const client = useClient();
24
24
  const spaces = useSpaces();
25
25
  if (!client) {
26
- return null;
26
+ return <Loading data={{ client: !!client }} />;
27
27
  }
28
28
 
29
29
  return (
30
- <div className='flex flex-col min-w-[28rem] divide-y divide-separator border border-separator rounded'>
31
- <SyntaxHighlighter language='json'>{JSON.stringify(client.toJSON(), null, 2)}</SyntaxHighlighter>
30
+ <div className='flex flex-col divide-y divide-separator border border-separator'>
31
+ <JsonHighlighter data={client.toJSON()} />
32
32
  {spaces.map((space) => (
33
33
  <SpaceInfo key={space.id} space={space} />
34
34
  ))}
@@ -36,10 +36,16 @@ const Test = () => {
36
36
  );
37
37
  };
38
38
 
39
- export default {
39
+ const meta = {
40
40
  title: 'sdk/react-client/withClientProvider',
41
- render: Test,
42
- };
41
+ render: DefaultStory,
42
+ decorators: [withTheme()],
43
+ tags: ['test'],
44
+ } satisfies Meta<typeof DefaultStory>;
45
+
46
+ export default meta;
47
+
48
+ type Story = StoryObj<typeof meta>;
43
49
 
44
50
  const clientProps: WithClientProviderProps = {
45
51
  createIdentity: true,
@@ -47,19 +53,27 @@ const clientProps: WithClientProviderProps = {
47
53
  onInitialized: async (client) => {
48
54
  log.info('onInitialized', { client });
49
55
  },
50
- onSpaceCreated: async ({ client, space }) => {
51
- log.info('onSpaceCreated', { client, space });
56
+ onCreateSpace: async ({ client, space }) => {
57
+ log.info('onCreateSpace', { client, space });
52
58
  },
53
59
  };
54
60
 
55
- export const Default = {
56
- decorators: [withClientProvider(clientProps), withTheme, withLayout({ classNames: ['flex gap-2'] })],
61
+ export const Default: Story = {
62
+ decorators: [withClientProvider(clientProps)],
63
+ parameters: {
64
+ layout: 'centered',
65
+ },
66
+ play: async ({ canvasElement }) => {
67
+ const canvas = within(canvasElement);
68
+ const initializedText = await canvas.findByText(/"initialized": true/i, {}, { timeout: 30_000 });
69
+ await expect(initializedText).toBeVisible();
70
+ },
57
71
  };
58
72
 
59
- export const Multiple = {
73
+ export const Multiple: Story = {
60
74
  decorators: [
75
+ withTheme(),
76
+ withLayout({ classNames: 'grid grid-cols-3' }),
61
77
  withMultiClientProvider({ ...clientProps, numClients: 3 }),
62
- withTheme,
63
- withLayout({ classNames: ['flex gap-2'] }),
64
78
  ],
65
79
  };
@@ -2,27 +2,28 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { type StoryContext, type Decorator } from '@storybook/react';
6
- import React, { createContext, type PropsWithChildren, useContext, useEffect, useRef, useState } from 'react';
7
- import { type FallbackProps, ErrorBoundary as NativeErrorBoundary } from 'react-error-boundary';
5
+ import { type Decorator, type StoryContext } from '@storybook/react';
6
+ import React, { useCallback, useMemo, useRef, useState } from 'react';
8
7
 
9
8
  import { Trigger } from '@dxos/async';
10
9
  import { type Client } from '@dxos/client';
11
10
  import { type Space } from '@dxos/client/echo';
12
- import { performInvitation, TestBuilder } from '@dxos/client/testing';
11
+ import { TestBuilder, performInvitation } from '@dxos/client/testing';
12
+ import { type SpaceId } from '@dxos/keys';
13
13
  import { log } from '@dxos/log';
14
+ import { ErrorBoundary } from '@dxos/react-ui';
14
15
  import { type MaybePromise } from '@dxos/util';
15
16
 
16
- import { ClientStory } from './context';
17
17
  import { ClientProvider, type ClientProviderProps } from '../client';
18
+ import { ClientStory } from './context';
18
19
 
19
20
  type InitializeProps = {
20
21
  createIdentity?: boolean;
21
22
  createSpace?: boolean;
22
23
  onInitialized?: (client: Client) => MaybePromise<void>;
23
- onIdentityCreated?: (props: { client: Client }) => MaybePromise<void>;
24
+ onCreateIdentity?: (props: { client: Client }, context: StoryContext | any) => MaybePromise<void>;
24
25
  // NOTE: context must be untyped until ClientRepeater is removed.
25
- onSpaceCreated?: (props: { client: Client; space: Space }, context: StoryContext | any) => MaybePromise<void>;
26
+ onCreateSpace?: (props: { client: Client; space: Space }, context: StoryContext | any) => MaybePromise<void>;
26
27
  };
27
28
 
28
29
  /**
@@ -30,7 +31,7 @@ type InitializeProps = {
30
31
  */
31
32
  const initializeClient = async (
32
33
  client: Client,
33
- { createIdentity, createSpace, onSpaceCreated, onIdentityCreated, onInitialized }: InitializeProps,
34
+ { createIdentity, createSpace, onCreateIdentity, onCreateSpace, onInitialized }: InitializeProps,
34
35
  context: StoryContext,
35
36
  ): Promise<ClientStory> => {
36
37
  await onInitialized?.(client);
@@ -38,17 +39,18 @@ const initializeClient = async (
38
39
  if (createIdentity || createSpace) {
39
40
  if (!client.halo.identity.get()) {
40
41
  await client.halo.createIdentity();
41
- await onIdentityCreated?.({ client });
42
+ await onCreateIdentity?.({ client }, context);
42
43
  }
43
44
  }
44
45
 
45
46
  let space: Space | undefined;
46
47
  if (createSpace) {
47
48
  space = await client.spaces.create({ name: 'Test Space' });
48
- await onSpaceCreated?.({ client, space }, context);
49
+ await space.waitUntilReady(); // Is this required?
50
+ await onCreateSpace?.({ client, space }, context);
49
51
  }
50
52
 
51
- return { space };
53
+ return { space, spaceId: space?.id };
52
54
  };
53
55
 
54
56
  export type WithClientProviderProps = InitializeProps & Omit<ClientProviderProps, 'onInitialized'>;
@@ -59,8 +61,8 @@ export type WithClientProviderProps = InitializeProps & Omit<ClientProviderProps
59
61
  export const withClientProvider = ({
60
62
  createIdentity,
61
63
  createSpace,
62
- onSpaceCreated,
63
- onIdentityCreated,
64
+ onCreateSpace,
65
+ onCreateIdentity,
64
66
  onInitialized,
65
67
  ...props
66
68
  }: WithClientProviderProps = {}): Decorator => {
@@ -72,8 +74,8 @@ export const withClientProvider = ({
72
74
  {
73
75
  createIdentity,
74
76
  createSpace,
75
- onSpaceCreated,
76
- onIdentityCreated,
77
+ onCreateSpace,
78
+ onCreateIdentity,
77
79
  onInitialized,
78
80
  },
79
81
  context,
@@ -83,7 +85,7 @@ export const withClientProvider = ({
83
85
  };
84
86
 
85
87
  return (
86
- <ErrorBoundary>
88
+ <ErrorBoundary name='client-provider'>
87
89
  <ClientProvider onInitialized={handleInitialized} {...props}>
88
90
  <ClientStory.Provider value={data}>
89
91
  <Story />
@@ -100,105 +102,87 @@ export const withClientProvider = ({
100
102
  export type WithMultiClientProviderProps = InitializeProps &
101
103
  Omit<ClientProviderProps, 'onInitialized'> & { numClients?: number };
102
104
 
103
- const MultiClientContext = createContext<{ id: number }>({ id: 0 });
104
-
105
- export const useMultiClient = () => useContext(MultiClientContext);
106
-
107
105
  /**
108
106
  * Decorator that creates a scaffold for multiple clients.
109
107
  * Orchestrates invitations between a randomly selected host and the remaining clients.
110
- * NOTE: Should come before withLayout.
111
108
  */
112
109
  export const withMultiClientProvider = ({
113
110
  numClients = 2,
114
111
  createIdentity,
115
112
  createSpace,
116
- onSpaceCreated,
117
- onIdentityCreated,
113
+ onCreateSpace,
114
+ onCreateIdentity,
118
115
  onInitialized,
119
116
  ...props
120
117
  }: WithMultiClientProviderProps): Decorator => {
121
118
  return (Story, context) => {
122
- const builder = useRef(new TestBuilder());
123
- const hostRef = useRef<Client>();
124
119
  const spaceReady = useRef(new Trigger<Space | undefined>());
120
+ const [spaceId, setSpaceId] = useState<SpaceId>();
121
+
122
+ const clients = useMemo(() => {
123
+ const buidler = new TestBuilder();
124
+ return Array.from({ length: numClients }).map(() => {
125
+ return {
126
+ services: buidler.createLocalClientServices(),
127
+ };
128
+ });
129
+ }, [numClients]);
125
130
 
126
131
  // Handle invitations.
127
132
  // NOTE: The zeroth client isn't necessarily the first to be initialized.
128
- const handleInitialized = async (client: Client, index: number) => {
129
- log.info('initialized', { index });
130
- if (createSpace) {
131
- if (!hostRef.current) {
132
- hostRef.current = client;
133
- const { space } = await initializeClient(
134
- client,
135
- {
136
- createIdentity,
137
- createSpace,
138
- onSpaceCreated,
139
- onIdentityCreated,
140
- onInitialized,
141
- },
142
- context,
133
+ const handleInitialized = useCallback(async (client: Client, index: number) => {
134
+ if (index === 0) {
135
+ // Initialize host.
136
+ const { space } = await initializeClient(
137
+ client,
138
+ {
139
+ createIdentity,
140
+ createSpace,
141
+ onCreateSpace,
142
+ onCreateIdentity,
143
+ onInitialized,
144
+ },
145
+ context,
146
+ );
147
+
148
+ log.info('inviting', { index, spaceId: space?.id });
149
+ setSpaceId(space?.id);
150
+ spaceReady.current.wake(space);
151
+ } else {
152
+ // Initialize guest.
153
+ await initializeClient(client, { createIdentity, onInitialized }, context);
154
+
155
+ log.info('waiting', { index });
156
+ const space = await spaceReady.current.wait();
157
+ if (space) {
158
+ log.info('joining', { index, spaceId: space.id });
159
+ await Promise.all(
160
+ performInvitation({
161
+ host: space,
162
+ guest: client.spaces,
163
+ }),
143
164
  );
144
-
145
- spaceReady.current.wake(space);
146
- log.info('inviting', { index });
147
- } else {
148
- await initializeClient(client, { createIdentity, onInitialized }, context);
149
- const space = await spaceReady.current.wait();
150
- if (space) {
151
- log.info('joining', { index });
152
- await Promise.all(performInvitation({ host: space, guest: client.spaces }));
153
- }
154
165
  }
155
166
  }
156
- };
167
+ }, []);
157
168
 
158
169
  return (
159
- <ErrorBoundary>
160
- {Array.from({ length: numClients }).map((_, index) => (
161
- <MultiClientContext.Provider key={index} value={{ id: index }}>
162
- <ClientProvider
163
- services={builder.current.createLocalClientServices()}
164
- onInitialized={(client) => handleInitialized(client, index)}
165
- {...props}
166
- >
167
- <Story />
168
- </ClientProvider>
169
- </MultiClientContext.Provider>
170
+ <div className='absolute inset-0 grid grid-flow-col auto-cols-fr gap-4 overflow-hidden'>
171
+ {clients.map((client, index) => (
172
+ <ClientProvider
173
+ key={index}
174
+ services={client.services}
175
+ onInitialized={(client) => handleInitialized(client, index)}
176
+ {...props}
177
+ >
178
+ <ClientStory.Provider value={{ index, spaceId }}>
179
+ <ErrorBoundary name='client-provider'>
180
+ <Story />
181
+ </ErrorBoundary>
182
+ </ClientStory.Provider>
183
+ </ClientProvider>
170
184
  ))}
171
- </ErrorBoundary>
185
+ </div>
172
186
  );
173
187
  };
174
188
  };
175
-
176
- const ErrorBoundary = ({ children }: PropsWithChildren) => {
177
- const [error, setError] = useState<Error>();
178
- useEffect(() => {
179
- const handleError = (event: PromiseRejectionEvent) => {
180
- setError(event.reason);
181
- };
182
-
183
- window.addEventListener('unhandledrejection', handleError);
184
- return () => window.removeEventListener('unhandledrejection', handleError);
185
- }, []);
186
-
187
- if (error) {
188
- return <ErrorFallback error={error} resetErrorBoundary={() => setError(undefined)} />;
189
- }
190
-
191
- return <NativeErrorBoundary FallbackComponent={ErrorFallback}>{children}</NativeErrorBoundary>;
192
- };
193
-
194
- const ErrorFallback = ({ error }: FallbackProps) => {
195
- const { name, message, stack } =
196
- error instanceof Error ? error : { name: 'Error', message: String(error), stack: undefined };
197
- return (
198
- <div role='alert' className='flex flex-col p-4 gap-4 overflow-auto'>
199
- <h1 className='text-xl text-red-500'>{name}</h1>
200
- <div className='text-lg'>{message}</div>
201
- {stack && <pre className='whitespace-pre-wrap text-sm text-subdued'>{stack}</pre>}
202
- </div>
203
- );
204
- };
package/tsconfig.json CHANGED
@@ -23,6 +23,9 @@
23
23
  {
24
24
  "path": "../../common/invariant"
25
25
  },
26
+ {
27
+ "path": "../../common/keys"
28
+ },
26
29
  {
27
30
  "path": "../../common/log"
28
31
  },
@@ -45,16 +48,13 @@
45
48
  "path": "../../core/echo/echo"
46
49
  },
47
50
  {
48
- "path": "../../core/echo/echo-schema"
49
- },
50
- {
51
- "path": "../../core/echo/echo-signals"
51
+ "path": "../../core/echo/echo-react"
52
52
  },
53
53
  {
54
54
  "path": "../../core/protocols"
55
55
  },
56
56
  {
57
- "path": "../../ui/primitives/react-hooks"
57
+ "path": "../../ui/react-primitives/react-hooks"
58
58
  },
59
59
  {
60
60
  "path": "../../ui/react-ui"
@@ -63,7 +63,7 @@
63
63
  "path": "../../ui/react-ui-syntax-highlighter"
64
64
  },
65
65
  {
66
- "path": "../../ui/react-ui-theme"
66
+ "path": "../../ui/ui-theme"
67
67
  },
68
68
  {
69
69
  "path": "../client"
package/typedoc.json CHANGED
@@ -9,4 +9,4 @@
9
9
  "src/mesh/index.ts",
10
10
  "src/worker.ts"
11
11
  ]
12
- }
12
+ }
package/vitest.config.ts CHANGED
@@ -2,21 +2,15 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { defineConfig, mergeConfig } from 'vitest/config';
5
+ import path from 'node:path';
6
+ import { fileURLToPath } from 'node:url';
6
7
 
7
- import { baseConfig } from '../../../vitest.shared';
8
+ import { createConfig } from '../../../vitest.base.config';
8
9
 
9
- // TODO(wittjosiah): Factor out to shared config as an option.
10
- const specifiedEnv = (process.env.VITEST_ENV ?? 'node').toLowerCase();
11
- const environment = specifiedEnv === 'node' ? 'jsdom' : undefined;
12
-
13
- export default mergeConfig(
14
- baseConfig({ cwd: __dirname }),
15
- defineConfig({
16
- test: {
17
- environment,
18
- // TODO(dmaretskyi): Enabled because client tests were flaky. Remove when that's not the case.
19
- retry: 2,
20
- },
21
- }),
22
- );
10
+ export default createConfig({
11
+ dirname: typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)),
12
+ node: {
13
+ environment: 'happy-dom',
14
+ },
15
+ storybook: true,
16
+ });
package/.eslintrc.cjs DELETED
@@ -1,12 +0,0 @@
1
- module.exports = {
2
- "extends": [
3
- "../../../.eslintrc.js"
4
- ],
5
- "parserOptions": {
6
- "project": "tsconfig.json",
7
- "tsconfigRootDir": __dirname,
8
- },
9
- "ignorePatterns": [
10
- "**/*.d.ts"
11
- ]
12
- }
package/README.yml DELETED
@@ -1,33 +0,0 @@
1
- usage: |
2
- The snippet below illustrates a self-contained DXOS application that uses providers to create the client and instantiate a user profile.
3
-
4
- ```javascript
5
-
6
- import React from 'react';
7
- import { useClient, ClientProvider } from '@dxos/react-client';
8
- import { createRoot } from 'react-dom/client';
9
-
10
- const App = () => {
11
- const client = useClient();
12
- const space = useSpaces();
13
- return (
14
- <pre>{JSON.stringify(client.info())}</pre>
15
- );
16
- };
17
-
18
- const Root = () => (
19
- <ClientProvider>
20
- <App />
21
- </ClientProvider>
22
- );
23
-
24
- createRoot(document.getElementById('root')!)
25
- .render(<Root/>);
26
-
27
- ```
28
- storybooks:
29
- - "The [HALO Invitation Story](./stories/halo-invitations.stories.tsx) demonstrates multiple clients (devices) joining the same HALO. [Demo video](https://user-images.githubusercontent.com/3523355/137532718-a21f1f27-9854-4c0b-831a-e9ff92feac49.mov)."
30
- - "The [Space Invitation Story](./stories/space-invitations.stories.tsx) demonstrates multiple clients creating and sharing spaces. [Demo video](https://user-images.githubusercontent.com/3523355/137532717-e77395dc-96f9-4e4b-8f67-e6bd026a3abe.mov)."
31
- quickStartUrl: https://docs.dxos.org/guide/quick-start
32
- guideUrl: https://docs.dxos.org/guide/echo/react
33
- apiReferenceUrl: true