@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
@@ -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,27 @@
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
- import { type Space } from '@dxos/client/echo';
12
- import { performInvitation, TestBuilder } from '@dxos/client/testing';
10
+ import { type Space, type SpaceId } from '@dxos/client/echo';
11
+ import { TestBuilder, performInvitation } from '@dxos/client/testing';
13
12
  import { log } from '@dxos/log';
13
+ import { ErrorBoundary } from '@dxos/react-ui';
14
14
  import { type MaybePromise } from '@dxos/util';
15
15
 
16
- import { ClientStory } from './context';
17
16
  import { ClientProvider, type ClientProviderProps } from '../client';
17
+ import { ClientStory } from './context';
18
18
 
19
19
  type InitializeProps = {
20
20
  createIdentity?: boolean;
21
21
  createSpace?: boolean;
22
22
  onInitialized?: (client: Client) => MaybePromise<void>;
23
- onIdentityCreated?: (props: { client: Client }) => MaybePromise<void>;
23
+ onCreateIdentity?: (props: { client: Client }, context: StoryContext | any) => MaybePromise<void>;
24
24
  // NOTE: context must be untyped until ClientRepeater is removed.
25
- onSpaceCreated?: (props: { client: Client; space: Space }, context: StoryContext | any) => MaybePromise<void>;
25
+ onCreateSpace?: (props: { client: Client; space: Space }, context: StoryContext | any) => MaybePromise<void>;
26
26
  };
27
27
 
28
28
  /**
@@ -30,7 +30,7 @@ type InitializeProps = {
30
30
  */
31
31
  const initializeClient = async (
32
32
  client: Client,
33
- { createIdentity, createSpace, onSpaceCreated, onIdentityCreated, onInitialized }: InitializeProps,
33
+ { createIdentity, createSpace, onCreateIdentity, onCreateSpace, onInitialized }: InitializeProps,
34
34
  context: StoryContext,
35
35
  ): Promise<ClientStory> => {
36
36
  await onInitialized?.(client);
@@ -38,17 +38,18 @@ const initializeClient = async (
38
38
  if (createIdentity || createSpace) {
39
39
  if (!client.halo.identity.get()) {
40
40
  await client.halo.createIdentity();
41
- await onIdentityCreated?.({ client });
41
+ await onCreateIdentity?.({ client }, context);
42
42
  }
43
43
  }
44
44
 
45
45
  let space: Space | undefined;
46
46
  if (createSpace) {
47
47
  space = await client.spaces.create({ name: 'Test Space' });
48
- await onSpaceCreated?.({ client, space }, context);
48
+ await space.waitUntilReady(); // Is this required?
49
+ await onCreateSpace?.({ client, space }, context);
49
50
  }
50
51
 
51
- return { space };
52
+ return { space, spaceId: space?.id };
52
53
  };
53
54
 
54
55
  export type WithClientProviderProps = InitializeProps & Omit<ClientProviderProps, 'onInitialized'>;
@@ -59,8 +60,8 @@ export type WithClientProviderProps = InitializeProps & Omit<ClientProviderProps
59
60
  export const withClientProvider = ({
60
61
  createIdentity,
61
62
  createSpace,
62
- onSpaceCreated,
63
- onIdentityCreated,
63
+ onCreateSpace,
64
+ onCreateIdentity,
64
65
  onInitialized,
65
66
  ...props
66
67
  }: WithClientProviderProps = {}): Decorator => {
@@ -72,8 +73,8 @@ export const withClientProvider = ({
72
73
  {
73
74
  createIdentity,
74
75
  createSpace,
75
- onSpaceCreated,
76
- onIdentityCreated,
76
+ onCreateSpace,
77
+ onCreateIdentity,
77
78
  onInitialized,
78
79
  },
79
80
  context,
@@ -83,7 +84,7 @@ export const withClientProvider = ({
83
84
  };
84
85
 
85
86
  return (
86
- <ErrorBoundary>
87
+ <ErrorBoundary name='client-provider'>
87
88
  <ClientProvider onInitialized={handleInitialized} {...props}>
88
89
  <ClientStory.Provider value={data}>
89
90
  <Story />
@@ -100,105 +101,87 @@ export const withClientProvider = ({
100
101
  export type WithMultiClientProviderProps = InitializeProps &
101
102
  Omit<ClientProviderProps, 'onInitialized'> & { numClients?: number };
102
103
 
103
- const MultiClientContext = createContext<{ id: number }>({ id: 0 });
104
-
105
- export const useMultiClient = () => useContext(MultiClientContext);
106
-
107
104
  /**
108
105
  * Decorator that creates a scaffold for multiple clients.
109
106
  * Orchestrates invitations between a randomly selected host and the remaining clients.
110
- * NOTE: Should come before withLayout.
111
107
  */
112
108
  export const withMultiClientProvider = ({
113
109
  numClients = 2,
114
110
  createIdentity,
115
111
  createSpace,
116
- onSpaceCreated,
117
- onIdentityCreated,
112
+ onCreateSpace,
113
+ onCreateIdentity,
118
114
  onInitialized,
119
115
  ...props
120
116
  }: WithMultiClientProviderProps): Decorator => {
121
117
  return (Story, context) => {
122
- const builder = useRef(new TestBuilder());
123
- const hostRef = useRef<Client>();
124
118
  const spaceReady = useRef(new Trigger<Space | undefined>());
119
+ const [spaceId, setSpaceId] = useState<SpaceId>();
120
+
121
+ const clients = useMemo(() => {
122
+ const buidler = new TestBuilder();
123
+ return Array.from({ length: numClients }).map(() => {
124
+ return {
125
+ services: buidler.createLocalClientServices(),
126
+ };
127
+ });
128
+ }, [numClients]);
125
129
 
126
130
  // Handle invitations.
127
131
  // 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,
132
+ const handleInitialized = useCallback(async (client: Client, index: number) => {
133
+ if (index === 0) {
134
+ // Initialize host.
135
+ const { space } = await initializeClient(
136
+ client,
137
+ {
138
+ createIdentity,
139
+ createSpace,
140
+ onCreateSpace,
141
+ onCreateIdentity,
142
+ onInitialized,
143
+ },
144
+ context,
145
+ );
146
+
147
+ log.info('inviting', { index, spaceId: space?.id });
148
+ setSpaceId(space?.id);
149
+ spaceReady.current.wake(space);
150
+ } else {
151
+ // Initialize guest.
152
+ await initializeClient(client, { createIdentity, onInitialized }, context);
153
+
154
+ log.info('waiting', { index });
155
+ const space = await spaceReady.current.wait();
156
+ if (space) {
157
+ log.info('joining', { index, spaceId: space.id });
158
+ await Promise.all(
159
+ performInvitation({
160
+ host: space,
161
+ guest: client.spaces,
162
+ }),
143
163
  );
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
164
  }
155
165
  }
156
- };
166
+ }, []);
157
167
 
158
168
  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>
169
+ <div className='absolute inset-0 grid grid-flow-col auto-cols-fr gap-4 overflow-hidden'>
170
+ {clients.map((client, index) => (
171
+ <ClientProvider
172
+ key={index}
173
+ services={client.services}
174
+ onInitialized={(client) => handleInitialized(client, index)}
175
+ {...props}
176
+ >
177
+ <ClientStory.Provider value={{ index, spaceId }}>
178
+ <ErrorBoundary name='client-provider'>
179
+ <Story />
180
+ </ErrorBoundary>
181
+ </ClientStory.Provider>
182
+ </ClientProvider>
170
183
  ))}
171
- </ErrorBoundary>
184
+ </div>
172
185
  );
173
186
  };
174
187
  };
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
@@ -45,16 +45,13 @@
45
45
  "path": "../../core/echo/echo"
46
46
  },
47
47
  {
48
- "path": "../../core/echo/echo-schema"
49
- },
50
- {
51
- "path": "../../core/echo/echo-signals"
48
+ "path": "../../core/echo/echo-react"
52
49
  },
53
50
  {
54
51
  "path": "../../core/protocols"
55
52
  },
56
53
  {
57
- "path": "../../ui/primitives/react-hooks"
54
+ "path": "../../ui/react-primitives/react-hooks"
58
55
  },
59
56
  {
60
57
  "path": "../../ui/react-ui"
@@ -63,7 +60,7 @@
63
60
  "path": "../../ui/react-ui-syntax-highlighter"
64
61
  },
65
62
  {
66
- "path": "../../ui/react-ui-theme"
63
+ "path": "../../ui/ui-theme"
67
64
  },
68
65
  {
69
66
  "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