@dxos/react-client 0.8.4-main.ef1bc66f44 → 0.8.4-main.effb148878

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 (106) hide show
  1. package/.storybook/main.mts +1 -3
  2. package/LICENSE +102 -5
  3. package/README.md +1 -1
  4. package/dist/lib/browser/{chunk-PFF63FPR.mjs → chunk-3LVU7RNK.mjs} +2 -2
  5. package/dist/lib/browser/{chunk-TSF6Y5VB.mjs → chunk-CZMIVAGI.mjs} +1 -1
  6. package/dist/lib/browser/{chunk-TSF6Y5VB.mjs.map → chunk-CZMIVAGI.mjs.map} +2 -2
  7. package/dist/lib/browser/{chunk-5UKA2BMA.mjs → chunk-XT352YI6.mjs} +11 -56
  8. package/dist/lib/browser/chunk-XT352YI6.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-LO3TU5CK.mjs → chunk-YHE6WD44.mjs} +3 -13
  10. package/dist/lib/browser/{chunk-LO3TU5CK.mjs.map → chunk-YHE6WD44.mjs.map} +2 -2
  11. package/dist/lib/browser/devtools/index.mjs +3 -8
  12. package/dist/lib/browser/devtools/index.mjs.map +2 -2
  13. package/dist/lib/browser/echo/index.mjs +89 -97
  14. package/dist/lib/browser/echo/index.mjs.map +4 -4
  15. package/dist/lib/browser/halo/index.mjs +3 -3
  16. package/dist/lib/browser/halo/index.mjs.map +2 -2
  17. package/dist/lib/browser/index.mjs +6 -21
  18. package/dist/lib/browser/index.mjs.map +2 -2
  19. package/dist/lib/browser/invitations/index.mjs +1 -1
  20. package/dist/lib/browser/mesh/index.mjs +2 -2
  21. package/dist/lib/browser/meta.json +1 -1
  22. package/dist/lib/browser/testing/index.mjs +15 -64
  23. package/dist/lib/browser/testing/index.mjs.map +3 -3
  24. package/dist/lib/node-esm/{chunk-NETTSER2.mjs → chunk-CUDKNAMV.mjs} +2 -2
  25. package/dist/lib/node-esm/{chunk-AQJH2UNZ.mjs → chunk-RQJPEHDY.mjs} +3 -13
  26. package/dist/lib/node-esm/{chunk-AQJH2UNZ.mjs.map → chunk-RQJPEHDY.mjs.map} +2 -2
  27. package/dist/lib/node-esm/{chunk-T3QTQHBD.mjs → chunk-WL3Z5HOH.mjs} +11 -56
  28. package/dist/lib/node-esm/chunk-WL3Z5HOH.mjs.map +7 -0
  29. package/dist/lib/node-esm/{chunk-373DPHEQ.mjs → chunk-WUTK2IJF.mjs} +1 -1
  30. package/dist/lib/node-esm/{chunk-373DPHEQ.mjs.map → chunk-WUTK2IJF.mjs.map} +2 -2
  31. package/dist/lib/node-esm/devtools/index.mjs +3 -8
  32. package/dist/lib/node-esm/devtools/index.mjs.map +2 -2
  33. package/dist/lib/node-esm/echo/index.mjs +89 -97
  34. package/dist/lib/node-esm/echo/index.mjs.map +4 -4
  35. package/dist/lib/node-esm/halo/index.mjs +3 -3
  36. package/dist/lib/node-esm/halo/index.mjs.map +2 -2
  37. package/dist/lib/node-esm/index.mjs +6 -21
  38. package/dist/lib/node-esm/index.mjs.map +2 -2
  39. package/dist/lib/node-esm/invitations/index.mjs +1 -1
  40. package/dist/lib/node-esm/mesh/index.mjs +2 -2
  41. package/dist/lib/node-esm/meta.json +1 -1
  42. package/dist/lib/node-esm/testing/index.mjs +15 -64
  43. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  44. package/dist/types/src/banner.d.ts.map +1 -1
  45. package/dist/types/src/client/AgentHostingProvider.d.ts.map +1 -1
  46. package/dist/types/src/client/ClientProvider.d.ts +1 -1
  47. package/dist/types/src/client/ClientProvider.d.ts.map +1 -1
  48. package/dist/types/src/client/useClientStatus.d.ts.map +1 -1
  49. package/dist/types/src/devtools/useStream.d.ts.map +1 -1
  50. package/dist/types/src/echo/index.d.ts +1 -1
  51. package/dist/types/src/echo/index.d.ts.map +1 -1
  52. package/dist/types/src/echo/useFeedSyncState.d.ts +13 -0
  53. package/dist/types/src/echo/useFeedSyncState.d.ts.map +1 -0
  54. package/dist/types/src/echo/useMembers.d.ts.map +1 -1
  55. package/dist/types/src/echo/useSpaceInvitations.d.ts +1 -1
  56. package/dist/types/src/echo/useSpaceInvitations.d.ts.map +1 -1
  57. package/dist/types/src/echo/useSpaceProperties.d.ts.map +1 -1
  58. package/dist/types/src/echo/useSpaces.d.ts +9 -7
  59. package/dist/types/src/echo/useSpaces.d.ts.map +1 -1
  60. package/dist/types/src/echo/useSubscription.d.ts.map +1 -1
  61. package/dist/types/src/echo/useSyncState.d.ts.map +1 -1
  62. package/dist/types/src/halo/Passkey.stories.d.ts.map +1 -1
  63. package/dist/types/src/halo/useHaloInvitations.d.ts.map +1 -1
  64. package/dist/types/src/halo/useKeyStore.d.ts.map +1 -1
  65. package/dist/types/src/invitations/useInvitationStatus.d.ts.map +1 -1
  66. package/dist/types/src/testing/ClientRepeater.d.ts +2 -2
  67. package/dist/types/src/testing/ClientRepeater.d.ts.map +1 -1
  68. package/dist/types/src/testing/ClientRepeater.stories.d.ts.map +1 -1
  69. package/dist/types/src/testing/context.d.ts +2 -1
  70. package/dist/types/src/testing/context.d.ts.map +1 -1
  71. package/dist/types/src/testing/util.d.ts.map +1 -1
  72. package/dist/types/src/testing/withClientProvider.d.ts.map +1 -1
  73. package/dist/types/src/testing/withClientProvider.stories.d.ts +1 -1
  74. package/dist/types/src/testing/withClientProvider.stories.d.ts.map +1 -1
  75. package/dist/types/tsconfig.tsbuildinfo +1 -1
  76. package/docs/README.md +38 -38
  77. package/moon.yml +1 -4
  78. package/package.json +27 -51
  79. package/src/client/ClientProvider.test.tsx +0 -1
  80. package/src/client/ClientProvider.tsx +0 -1
  81. package/src/client/useConfig.test.tsx +0 -1
  82. package/src/echo/index.ts +1 -1
  83. package/src/echo/useFeedSyncState.ts +78 -0
  84. package/src/echo/useSpaceInvitations.ts +1 -2
  85. package/src/echo/useSpaces.test.tsx +6 -13
  86. package/src/echo/useSpaces.ts +17 -31
  87. package/src/echo/useSyncState.ts +1 -5
  88. package/src/halo/Passkey.stories.tsx +4 -7
  89. package/src/halo/useDevices.test.tsx +0 -1
  90. package/src/testing/ClientRepeater.stories.tsx +4 -7
  91. package/src/testing/ClientRepeater.tsx +4 -5
  92. package/src/testing/context.tsx +2 -1
  93. package/src/testing/util.tsx +0 -1
  94. package/src/testing/withClientProvider.stories.tsx +6 -8
  95. package/src/testing/withClientProvider.tsx +6 -39
  96. package/tsconfig.json +6 -0
  97. package/typedoc.json +1 -1
  98. package/vitest.config.ts +0 -2
  99. package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
  100. package/dist/lib/browser/chunk-5UKA2BMA.mjs.map +0 -7
  101. package/dist/lib/node-esm/chunk-T3QTQHBD.mjs.map +0 -7
  102. package/dist/types/src/echo/useQueue.d.ts +0 -11
  103. package/dist/types/src/echo/useQueue.d.ts.map +0 -1
  104. package/src/echo/useQueue.ts +0 -74
  105. /package/dist/lib/browser/{chunk-PFF63FPR.mjs.map → chunk-3LVU7RNK.mjs.map} +0 -0
  106. /package/dist/lib/node-esm/{chunk-NETTSER2.mjs.map → chunk-CUDKNAMV.mjs.map} +0 -0
package/docs/README.md CHANGED
@@ -168,41 +168,41 @@ dxos/react-client --> dxos/react-async
168
168
 
169
169
  ## Dependencies
170
170
 
171
- | Module | Direct |
172
- |---|---|
173
- | [`@dxos/async`](../../../common/async/docs/README.md) | ✓ |
174
- | [`@dxos/broadcast`](../../../core/mesh/broadcast/docs/README.md) | |
175
- | [`@dxos/client`](../../client/docs/README.md) | ✓ |
176
- | [`@dxos/client-services`](../../client-services/docs/README.md) | ✓ |
177
- | [`@dxos/codec-protobuf`](../../../common/codec-protobuf/docs/README.md) | ✓ |
178
- | [`@dxos/config`](../../config/docs/README.md) | ✓ |
179
- | [`@dxos/context`](../../../common/context/docs/README.md) | |
180
- | [`@dxos/credentials`](../../../core/halo/credentials/docs/README.md) | |
181
- | [`@dxos/crypto`](../../../common/crypto/docs/README.md) | |
182
- | [`@dxos/debug`](../../../common/debug/docs/README.md) | ✓ |
183
- | [`@dxos/echo-db`](../../../core/echo/echo-db/docs/README.md) | |
184
- | [`@dxos/errors`](../../errors/docs/README.md) | |
185
- | [`@dxos/feed-store`](../../../common/feed-store/docs/README.md) | |
186
- | [`@dxos/hypercore`](../../../common/hypercore/docs/README.md) | |
187
- | [`@dxos/keyring`](../../../core/halo/keyring/docs/README.md) | |
188
- | [`@dxos/keys`](../../../common/keys/docs/README.md) | ✓ |
189
- | [`@dxos/log`](../../../common/log/docs/README.md) | ✓ |
190
- | [`@dxos/mesh-protocol`](../../../core/mesh/mesh-protocol/docs/README.md) | |
191
- | [`@dxos/messaging`](../../../core/mesh/messaging/docs/README.md) | ✓ |
192
- | [`@dxos/model-factory`](../../../core/echo/model-factory/docs/README.md) | |
193
- | [`@dxos/network-generator`](../../../core/mesh/network-generator/docs/README.md) | |
194
- | [`@dxos/network-manager`](../../../core/mesh/network-manager/docs/README.md) | |
195
- | [`@dxos/document-model`](../../../core/echo/document-model/docs/README.md) | |
196
- | [`@dxos/protocol-plugin-presence`](../../../core/mesh/protocol-plugin-presence/docs/README.md) | |
197
- | [`@dxos/protocol-plugin-replicator`](../../../core/mesh/protocol-plugin-replicator/docs/README.md) | |
198
- | [`@dxos/protocol-plugin-rpc`](../../../core/mesh/protocol-plugin-rpc/docs/README.md) | |
199
- | [`@dxos/protocols`](../../../core/protocols/docs/README.md) | ✓ |
200
- | [`@dxos/random-access-storage`](../../../common/random-access-storage/docs/README.md) | |
201
- | [`@dxos/react-async`](../../../common/react-async/docs/README.md) | ✓ |
202
- | [`@dxos/rpc`](../../../core/mesh/rpc/docs/README.md) | ✓ |
203
- | [`@dxos/rpc-tunnel`](../../../core/mesh/rpc-tunnel/docs/README.md) | ✓ |
204
- | [`@dxos/teleport`](../../../core/mesh/teleport/docs/README.md) | |
205
- | [`@dxos/teleport-plugin-replicator`](../../../core/mesh/teleport-plugin-replicator/docs/README.md) | |
206
- | [`@dxos/text-model`](../../../core/echo/text-model/docs/README.md) | |
207
- | [`@dxos/timeframe`](../../../common/timeframe/docs/README.md) | |
208
- | [`@dxos/util`](../../../common/util/docs/README.md) | ✓ |
171
+ | Module | Direct |
172
+ | -------------------------------------------------------------------------------------------------- | ------- |
173
+ | [`@dxos/async`](../../../common/async/docs/README.md) | ✓ |
174
+ | [`@dxos/broadcast`](../../../core/mesh/broadcast/docs/README.md) | |
175
+ | [`@dxos/client`](../../client/docs/README.md) | ✓ |
176
+ | [`@dxos/client-services`](../../client-services/docs/README.md) | ✓ |
177
+ | [`@dxos/codec-protobuf`](../../../common/codec-protobuf/docs/README.md) | ✓ |
178
+ | [`@dxos/config`](../../config/docs/README.md) | ✓ |
179
+ | [`@dxos/context`](../../../common/context/docs/README.md) | |
180
+ | [`@dxos/credentials`](../../../core/halo/credentials/docs/README.md) | |
181
+ | [`@dxos/crypto`](../../../common/crypto/docs/README.md) | |
182
+ | [`@dxos/debug`](../../../common/debug/docs/README.md) | ✓ |
183
+ | [`@dxos/echo-db`](../../../core/echo/echo-db/docs/README.md) | |
184
+ | [`@dxos/errors`](../../errors/docs/README.md) | |
185
+ | [`@dxos/feed-store`](../../../common/feed-store/docs/README.md) | |
186
+ | [`@dxos/hypercore`](../../../common/hypercore/docs/README.md) | |
187
+ | [`@dxos/keyring`](../../../core/halo/keyring/docs/README.md) | |
188
+ | [`@dxos/keys`](../../../common/keys/docs/README.md) | ✓ |
189
+ | [`@dxos/log`](../../../common/log/docs/README.md) | ✓ |
190
+ | [`@dxos/mesh-protocol`](../../../core/mesh/mesh-protocol/docs/README.md) | |
191
+ | [`@dxos/messaging`](../../../core/mesh/messaging/docs/README.md) | ✓ |
192
+ | [`@dxos/model-factory`](../../../core/echo/model-factory/docs/README.md) | |
193
+ | [`@dxos/network-generator`](../../../core/mesh/network-generator/docs/README.md) | |
194
+ | [`@dxos/network-manager`](../../../core/mesh/network-manager/docs/README.md) | |
195
+ | [`@dxos/document-model`](../../../core/echo/document-model/docs/README.md) | |
196
+ | [`@dxos/protocol-plugin-presence`](../../../core/mesh/protocol-plugin-presence/docs/README.md) | |
197
+ | [`@dxos/protocol-plugin-replicator`](../../../core/mesh/protocol-plugin-replicator/docs/README.md) | |
198
+ | [`@dxos/protocol-plugin-rpc`](../../../core/mesh/protocol-plugin-rpc/docs/README.md) | |
199
+ | [`@dxos/protocols`](../../../core/protocols/docs/README.md) | ✓ |
200
+ | [`@dxos/random-access-storage`](../../../common/random-access-storage/docs/README.md) | |
201
+ | [`@dxos/react-async`](../../../common/react-async/docs/README.md) | ✓ |
202
+ | [`@dxos/rpc`](../../../core/mesh/rpc/docs/README.md) | ✓ |
203
+ | [`@dxos/rpc-tunnel`](../../../core/mesh/rpc-tunnel/docs/README.md) | ✓ |
204
+ | [`@dxos/teleport`](../../../core/mesh/teleport/docs/README.md) | |
205
+ | [`@dxos/teleport-plugin-replicator`](../../../core/mesh/teleport-plugin-replicator/docs/README.md) | |
206
+ | [`@dxos/text-model`](../../../core/echo/text-model/docs/README.md) | |
207
+ | [`@dxos/timeframe`](../../../common/timeframe/docs/README.md) | |
208
+ | [`@dxos/util`](../../../common/util/docs/README.md) | ✓ |
package/moon.yml CHANGED
@@ -3,6 +3,7 @@ language: typescript
3
3
  tags:
4
4
  - ts-build
5
5
  - ts-test
6
+ - ts-test-storybook
6
7
  - typedoc
7
8
  - pack
8
9
  - storybook
@@ -17,7 +18,3 @@ tasks:
17
18
  - '--entryPoint=src/mesh/index.ts'
18
19
  - '--entryPoint=src/testing/index.ts'
19
20
  - '--entryPoint=src/worker.ts'
20
- test:
21
- inputs:
22
- - .storybook/*
23
- - /tools/storybook-react/.storybook/main.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/react-client",
3
- "version": "0.8.4-main.ef1bc66f44",
3
+ "version": "0.8.4-main.effb148878",
4
4
  "description": "React client API",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -8,7 +8,7 @@
8
8
  "type": "git",
9
9
  "url": "https://github.com/dxos/dxos"
10
10
  },
11
- "license": "MIT",
11
+ "license": "FSL-1.1-Apache-2.0",
12
12
  "author": "DXOS.org",
13
13
  "sideEffects": false,
14
14
  "type": "module",
@@ -63,47 +63,23 @@
63
63
  }
64
64
  },
65
65
  "types": "dist/types/src/index.d.ts",
66
- "typesVersions": {
67
- "*": {
68
- "devtools": [
69
- "dist/types/src/devtools/index.d.ts"
70
- ],
71
- "echo": [
72
- "dist/types/src/echo/index.d.ts"
73
- ],
74
- "halo": [
75
- "dist/types/src/halo/index.d.ts"
76
- ],
77
- "invitations": [
78
- "dist/types/src/invitations/index.d.ts"
79
- ],
80
- "mesh": [
81
- "dist/types/src/mesh/index.d.ts"
82
- ],
83
- "testing": [
84
- "dist/types/src/testing/index.d.ts"
85
- ],
86
- "worker": [
87
- "dist/types/src/worker.d.ts"
88
- ]
89
- }
90
- },
91
66
  "dependencies": {
92
- "react-error-boundary": "^4.0.13",
93
- "@dxos/async": "0.8.4-main.ef1bc66f44",
94
- "@dxos/codec-protobuf": "0.8.4-main.ef1bc66f44",
95
- "@dxos/config": "0.8.4-main.ef1bc66f44",
96
- "@dxos/client": "0.8.4-main.ef1bc66f44",
97
- "@dxos/context": "0.8.4-main.ef1bc66f44",
98
- "@dxos/debug": "0.8.4-main.ef1bc66f44",
99
- "@dxos/echo": "0.8.4-main.ef1bc66f44",
100
- "@dxos/echo-react": "0.8.4-main.ef1bc66f44",
101
- "@dxos/invariant": "0.8.4-main.ef1bc66f44",
102
- "@dxos/log": "0.8.4-main.ef1bc66f44",
103
- "@dxos/node-std": "0.8.4-main.ef1bc66f44",
104
- "@dxos/protocols": "0.8.4-main.ef1bc66f44",
105
- "@dxos/util": "0.8.4-main.ef1bc66f44",
106
- "@dxos/react-hooks": "0.8.4-main.ef1bc66f44"
67
+ "@dxos/async": "0.8.4-main.effb148878",
68
+ "@dxos/codec-protobuf": "0.8.4-main.effb148878",
69
+ "@dxos/client": "0.8.4-main.effb148878",
70
+ "@dxos/config": "0.8.4-main.effb148878",
71
+ "@dxos/context": "0.8.4-main.effb148878",
72
+ "@dxos/debug": "0.8.4-main.effb148878",
73
+ "@dxos/echo-react": "0.8.4-main.effb148878",
74
+ "@dxos/echo": "0.8.4-main.effb148878",
75
+ "@dxos/echo-protocol": "0.8.4-main.effb148878",
76
+ "@dxos/invariant": "0.8.4-main.effb148878",
77
+ "@dxos/keys": "0.8.4-main.effb148878",
78
+ "@dxos/log": "0.8.4-main.effb148878",
79
+ "@dxos/protocols": "0.8.4-main.effb148878",
80
+ "@dxos/node-std": "0.8.4-main.effb148878",
81
+ "@dxos/react-hooks": "0.8.4-main.effb148878",
82
+ "@dxos/util": "0.8.4-main.effb148878"
107
83
  },
108
84
  "devDependencies": {
109
85
  "@types/react": "~19.2.7",
@@ -111,21 +87,21 @@
111
87
  "react": "~19.2.3",
112
88
  "react-dom": "~19.2.3",
113
89
  "typedoc": "0.28.1",
114
- "@dxos/react-ui": "0.8.4-main.ef1bc66f44",
115
- "@dxos/random": "0.8.4-main.ef1bc66f44",
116
- "@dxos/react-ui-syntax-highlighter": "0.8.4-main.ef1bc66f44",
117
- "@dxos/storybook-utils": "0.8.4-main.ef1bc66f44",
118
- "@dxos/test-utils": "0.8.4-main.ef1bc66f44",
119
- "@dxos/ui-theme": "0.8.4-main.ef1bc66f44"
90
+ "@dxos/react-ui": "0.8.4-main.effb148878",
91
+ "@dxos/react-ui-syntax-highlighter": "0.8.4-main.effb148878",
92
+ "@dxos/storybook-utils": "0.8.4-main.effb148878",
93
+ "@dxos/test-utils": "0.8.4-main.effb148878",
94
+ "@dxos/random": "0.8.4-main.effb148878",
95
+ "@dxos/ui-theme": "0.8.4-main.effb148878"
120
96
  },
121
97
  "peerDependencies": {
122
98
  "react": "~19.2.3",
123
99
  "react-dom": "~19.2.3"
124
100
  },
125
101
  "optionalDependencies": {
126
- "@dxos/random": "0.8.4-main.ef1bc66f44",
127
- "@dxos/react-ui": "0.8.4-main.ef1bc66f44",
128
- "@dxos/ui-theme": "0.8.4-main.ef1bc66f44"
102
+ "@dxos/random": "0.8.4-main.effb148878",
103
+ "@dxos/react-ui": "0.8.4-main.effb148878",
104
+ "@dxos/ui-theme": "0.8.4-main.effb148878"
129
105
  },
130
106
  "publishConfig": {
131
107
  "access": "public"
@@ -11,7 +11,6 @@ import { Client, Config, SystemStatus, fromHost } from '@dxos/client';
11
11
  import { log } from '@dxos/log';
12
12
 
13
13
  import { useIdentity } from '../halo';
14
-
15
14
  import { ClientProvider } from './ClientProvider';
16
15
  import { useClient } from './useClient';
17
16
 
@@ -18,7 +18,6 @@ import { useAsyncEffect, useControlledState } from '@dxos/react-hooks';
18
18
  import { type MaybePromise, type Provider, getAsyncProviderValue } from '@dxos/util';
19
19
 
20
20
  import { printBanner } from '../banner';
21
-
22
21
  import { ClientContext, type ClientContextProps } from './context';
23
22
 
24
23
  /**
@@ -9,7 +9,6 @@ import { waitForCondition } from '@dxos/async';
9
9
  import { Config, SystemStatus } from '@dxos/client';
10
10
 
11
11
  import { createClient, createClientContextProvider } from '../testing/util';
12
-
13
12
  import { useConfig } from './useConfig';
14
13
 
15
14
  // TODO(burdon): Disabled in CI since flaky.
package/src/echo/index.ts CHANGED
@@ -6,9 +6,9 @@ export * from '@dxos/client/echo';
6
6
  export * from '@dxos/echo-react';
7
7
 
8
8
  export * from './useMembers';
9
- export * from './useQueue';
10
9
  export * from './useSpaces';
11
10
  export * from './useSpaceInvitations';
12
11
  export * from './useSpaceProperties';
13
12
  export * from './useSubscription';
14
13
  export * from './useSyncState';
14
+ export * from './useFeedSyncState';
@@ -0,0 +1,78 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { useEffect, useState } from 'react';
6
+
7
+ import { type SpaceId } from '@dxos/keys';
8
+
9
+ import { useClient } from '../client';
10
+
11
+ const DEFAULT_POLL_INTERVAL_MS = 5_000;
12
+
13
+ export type FeedSyncState = {
14
+ /** Combined blocks to pull + push across namespaces. */
15
+ pending: number;
16
+ /** Total blocks stored locally across namespaces. */
17
+ total: number;
18
+ };
19
+
20
+ export type FeedSyncStateMap = Record<SpaceId, FeedSyncState>;
21
+
22
+ /**
23
+ * Polls queue replication state per space.
24
+ */
25
+ export const useFeedSyncState = (pollIntervalMs = DEFAULT_POLL_INTERVAL_MS): FeedSyncStateMap => {
26
+ const client = useClient();
27
+ const [feedSyncState, setFeedSyncState] = useState<FeedSyncStateMap>({});
28
+
29
+ useEffect(() => {
30
+ const queueService = client.services.services.QueueService;
31
+ if (!queueService) {
32
+ return;
33
+ }
34
+
35
+ let cancelled = false;
36
+
37
+ const poll = async () => {
38
+ const spaces = client.spaces.get();
39
+ const entries = await Promise.all(
40
+ spaces.map(async (space) => {
41
+ try {
42
+ const response = await queueService.getSyncState({ spaceId: space.id });
43
+ const state = (response.namespaces ?? []).reduce<FeedSyncState>(
44
+ (acc, entry) => {
45
+ acc.pending += Number(entry.blocksToPull ?? 0) + Number(entry.blocksToPush ?? 0);
46
+ acc.total += Number(entry.totalBlocks ?? 0);
47
+ return acc;
48
+ },
49
+ { pending: 0, total: 0 },
50
+ );
51
+ return [space.id, state] as const;
52
+ } catch {
53
+ return [space.id, { pending: 0, total: 0 }] as const;
54
+ }
55
+ }),
56
+ );
57
+
58
+ if (!cancelled) {
59
+ setFeedSyncState(Object.fromEntries(entries));
60
+ }
61
+ };
62
+
63
+ void poll();
64
+ const interval = setInterval(() => void poll(), pollIntervalMs);
65
+
66
+ const spacesSubscription = client.spaces.subscribe(() => {
67
+ void poll();
68
+ });
69
+
70
+ return () => {
71
+ cancelled = true;
72
+ clearInterval(interval);
73
+ spacesSubscription.unsubscribe();
74
+ };
75
+ }, [client, pollIntervalMs]);
76
+
77
+ return feedSyncState;
78
+ };
@@ -6,11 +6,10 @@ import { useMemo } from 'react';
6
6
 
7
7
  import { MulticastObservable } from '@dxos/async';
8
8
  import { type PublicKey } from '@dxos/client';
9
- import { type SpaceId } from '@dxos/client/echo';
9
+ import { type SpaceId } from '@dxos/keys';
10
10
  import { useMulticastObservable } from '@dxos/react-hooks';
11
11
 
12
12
  import { type CancellableInvitationObservable, useInvitationStatus } from '../invitations';
13
-
14
13
  import { useSpace } from './useSpaces';
15
14
 
16
15
  // TODO(wittjosiah): Currently unable to remove `PublicKey` from this api.
@@ -6,19 +6,18 @@ import { act, renderHook } from '@testing-library/react';
6
6
  import { describe, expect, test } from 'vitest';
7
7
 
8
8
  import { createClient, createClientContextProvider } from '../testing/util';
9
-
10
9
  import { useSpace, useSpaces } from './useSpaces';
11
10
 
12
11
  describe('useSpaces', () => {
13
12
  test('lists existing spaces', async () => {
14
- const { client } = await createClient({ createIdentity: true });
13
+ const { client } = await createClient({ createIdentity: true, createSpace: true });
15
14
  const wrapper = await createClientContextProvider(client);
16
15
  const { result } = renderHook(() => useSpaces(), { wrapper });
17
16
  expect(result.current.length).to.eq(1);
18
17
  });
19
18
 
20
19
  test('updates when new spaces are created', async () => {
21
- const { client } = await createClient({ createIdentity: true });
20
+ const { client } = await createClient({ createIdentity: true, createSpace: true });
22
21
  const wrapper = await createClientContextProvider(client);
23
22
  const { result, rerender } = renderHook(() => useSpaces(), { wrapper });
24
23
  expect(result.current.length).to.eq(1);
@@ -31,20 +30,14 @@ describe('useSpaces', () => {
31
30
  });
32
31
 
33
32
  describe('useSpace', () => {
34
- test('gets default space', async () => {
35
- const { client } = await createClient();
33
+ test('returns undefined when no id provided', async () => {
34
+ const { client } = await createClient({ createIdentity: true });
36
35
  const wrapper = await createClientContextProvider(client);
37
- const { result, rerender } = renderHook(() => useSpace(), { wrapper });
36
+ const { result } = renderHook(() => useSpace(undefined), { wrapper });
38
37
  expect(result.current).to.be.undefined;
39
- await act(async () => {
40
- await client.halo.createIdentity();
41
- await client.spaces.waitUntilReady();
42
- });
43
- rerender();
44
- expect(result.current).to.not.be.undefined;
45
38
  });
46
39
 
47
- test('gets space by key', async () => {
40
+ test('gets space by id', async () => {
48
41
  const { client, space } = await createClient({ createIdentity: true, createSpace: true });
49
42
  const wrapper = await createClientContextProvider(client);
50
43
  const { result } = renderHook(() => useSpace(space!.id), { wrapper });
@@ -2,61 +2,47 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import { useState } from 'react';
6
-
7
5
  import { PublicKey } from '@dxos/client';
8
- import { type Space, type SpaceId, SpaceState } from '@dxos/client/echo';
9
- import { useAsyncEffect, useMulticastObservable } from '@dxos/react-hooks';
6
+ import { type Space, SpaceState } from '@dxos/client/echo';
7
+ import { type SpaceId } from '@dxos/keys';
8
+ import { useMulticastObservable } from '@dxos/react-hooks';
10
9
 
11
10
  import { useClient } from '../client';
12
11
 
13
12
  /**
14
13
  * Get a specific Space using its id.
15
14
  * The space is not guaranteed to be in the ready state.
16
- * Returns the default space if no id is provided.
15
+ * Returns undefined if no id is provided.
17
16
  * Requires a ClientProvider somewhere in the parent tree.
18
17
  *
19
- * @param spaceId the id of the space to look for
18
+ * @param spaceId the id of the space to look for.
20
19
  */
21
20
  // TODO(wittjosiah): Currently unable to remove `PublicKey` from this api.
22
21
  // When initially joining a space that is all that is returned.
23
22
  export const useSpace = (spaceId?: SpaceId | PublicKey): Space | undefined => {
24
23
  const client = useClient();
25
24
  const spaces = useMulticastObservable<Space[]>(client.spaces);
26
- const [ready, setReady] = useState(false);
25
+ if (!spaceId) {
26
+ return undefined;
27
+ }
27
28
 
28
- useAsyncEffect(async () => {
29
- // Only wait for ready if looking for the default space.
30
- if (spaceId) {
31
- return;
29
+ return spaces.find((space) => {
30
+ if (spaceId instanceof PublicKey) {
31
+ return space.key.equals(spaceId);
32
32
  }
33
33
 
34
- await client.spaces.waitUntilReady();
35
- setReady(true);
36
- }, [client, spaceId]);
37
-
38
- if (spaceId) {
39
- return spaces.find((space) => {
40
- if (spaceId instanceof PublicKey) {
41
- return space.key.equals(spaceId);
42
- }
43
-
44
- return space.id === spaceId;
45
- });
46
- }
47
-
48
- if (ready && client.halo.identity.get()) {
49
- return client.spaces.default;
50
- }
34
+ return space.id === spaceId;
35
+ });
51
36
  };
52
37
 
53
38
  /**
54
39
  * Get a Space database by the id of the space.
55
40
  * The space is not guaranteed to be in the ready state.
56
- * Returns the default space if no id is provided.
41
+ * Returns undefined if no id is provided.
57
42
  * Requires a ClientProvider somewhere in the parent tree.
58
43
  *
59
- * @param spaceId the id of the space to look for
44
+ * @param spaceId the id of the space to look for.
45
+ * @deprecated Use useSpace.
60
46
  */
61
47
  export const useDatabase = (spaceId?: SpaceId): Space['db'] | undefined => {
62
48
  const space = useSpace(spaceId);
@@ -74,7 +60,7 @@ export type UseSpacesProps = {
74
60
  * Get all Spaces available to current user.
75
61
  * Requires a ClientProvider somewhere in the parent tree.
76
62
  * By default, only ready spaces are returned.
77
- * @returns an array of Spaces
63
+ * @returns an array of Spaces.
78
64
  */
79
65
  export const useSpaces = ({ all = false }: UseSpacesProps = {}): Space[] => {
80
66
  const client = useClient();
@@ -6,14 +6,10 @@ import { useEffect, useState } from 'react';
6
6
 
7
7
  import { type PeerSyncState, type Space, type SpaceSyncStateMap } from '@dxos/client/echo';
8
8
  import { Context } from '@dxos/context';
9
- import { type SpaceId } from '@dxos/keys';
10
- import { EdgeService } from '@dxos/protocols';
9
+ import { isEdgePeerId } from '@dxos/echo-protocol';
11
10
 
12
11
  import { useClient } from '../client';
13
12
 
14
- const isEdgePeerId = (peerId: string, spaceId: SpaceId) =>
15
- peerId.startsWith(`${EdgeService.AUTOMERGE_REPLICATOR}:${spaceId}`);
16
-
17
13
  /**
18
14
  * Hook Subscribes to sync state for each space.
19
15
  */
@@ -9,12 +9,11 @@ import { Config, PublicKey } from '@dxos/client';
9
9
  import { invariant } from '@dxos/invariant';
10
10
  import { log } from '@dxos/log';
11
11
  import { Button } from '@dxos/react-ui';
12
+ import { JsonHighlighter } from '@dxos/react-ui-syntax-highlighter';
12
13
  import { withTheme } from '@dxos/react-ui/testing';
13
- import { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';
14
14
 
15
15
  import { useClient } from '../client';
16
16
  import { withClientProvider } from '../testing';
17
-
18
17
  import { useCredentials } from './useCredentials';
19
18
  import { useIdentity } from './useIdentity';
20
19
 
@@ -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,10 +115,8 @@ 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
  );
@@ -6,7 +6,6 @@ import { renderHook } from '@testing-library/react';
6
6
  import { describe, expect, test } from 'vitest';
7
7
 
8
8
  import { createClient, createClientContextProvider } from '../testing/util';
9
-
10
9
  import { useDevices } from './useDevices';
11
10
 
12
11
  describe('useDevices', () => {
@@ -7,12 +7,11 @@ import React from 'react';
7
7
 
8
8
  import { Obj } from '@dxos/echo';
9
9
  import { Input } from '@dxos/react-ui';
10
+ import { JsonHighlighter } from '@dxos/react-ui-syntax-highlighter';
10
11
  import { withTheme } from '@dxos/react-ui/testing';
11
- import { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';
12
12
 
13
13
  import { useClient } from '../client';
14
14
  import { useSpace } from '../echo';
15
-
16
15
  import { type ClientRepeatedComponentProps, ClientRepeater } from './ClientRepeater';
17
16
 
18
17
  const meta = {
@@ -24,9 +23,7 @@ export default meta;
24
23
 
25
24
  type Story = StoryObj<typeof meta>;
26
25
 
27
- const JsonPanel = ({ value }: { value: any }) => (
28
- <SyntaxHighlighter language='json'>{JSON.stringify(value, undefined, 2)}</SyntaxHighlighter>
29
- );
26
+ const JsonPanel = ({ value }: { value: any }) => <JsonHighlighter data={value} />;
30
27
 
31
28
  const ClientStory = () => {
32
29
  const client = useClient();
@@ -47,8 +44,8 @@ const ClientSpace = ({ spaceId }: ClientRepeatedComponentProps) => {
47
44
  placeholder='Name'
48
45
  value={space.properties.name}
49
46
  onChange={(event) =>
50
- Obj.change(space.properties, (p) => {
51
- p.name = event.target.value;
47
+ Obj.update(space.properties, (obj) => {
48
+ obj.name = event.target.value;
52
49
  })
53
50
  }
54
51
  />
@@ -7,12 +7,11 @@ import React, { type FC, useRef, useState } from 'react';
7
7
  import { Client } from '@dxos/client';
8
8
  import { TestBuilder, performInvitation } from '@dxos/client/testing';
9
9
  import { type Type } from '@dxos/echo';
10
- import { faker } from '@dxos/random';
10
+ import { type SpaceId } from '@dxos/keys';
11
+ import { random } from '@dxos/random';
11
12
  import { useAsyncEffect } from '@dxos/react-hooks';
12
13
 
13
14
  import { ClientProvider } from '../client';
14
- import { type SpaceId } from '../echo';
15
-
16
15
  import { type WithClientProviderProps } from './withClientProvider';
17
16
 
18
17
  export type ClientRepeatedComponentProps = { id: number; count: number; spaceId?: SpaceId };
@@ -26,7 +25,7 @@ export type ClientRepeaterProps<P extends ClientRepeatedComponentProps> = {
26
25
  controls?: FC<ClientRepeaterControlsProps>;
27
26
  count?: number;
28
27
  clients?: Client[];
29
- types?: Type.Obj.Any[];
28
+ types?: Type.AnyObj[];
30
29
  args?: Omit<P, 'id' | 'count'>;
31
30
  } & Pick<WithClientProviderProps, 'createIdentity' | 'createSpace' | 'onCreateSpace'>;
32
31
 
@@ -67,7 +66,7 @@ export const ClientRepeater = <P extends ClientRepeatedComponentProps>(props: Cl
67
66
 
68
67
  if (createSpace) {
69
68
  const client = clients[0];
70
- const space = await client.spaces.create({ name: faker.commerce.productName() });
69
+ const space = await client.spaces.create({ name: random.commerce.productName() });
71
70
  setSpaceId(space.id);
72
71
  await onCreateSpace?.({ client, space }, {});
73
72
  await Promise.all(clients.slice(1).flatMap((client) => performInvitation({ host: space, guest: client.spaces })));
@@ -4,8 +4,9 @@
4
4
 
5
5
  import { createContext, useContext } from 'react';
6
6
 
7
- import { type Space, type SpaceId } from '@dxos/client/echo';
7
+ import { type Space } from '@dxos/client/echo';
8
8
  import { raise } from '@dxos/debug';
9
+ import { type SpaceId } from '@dxos/keys';
9
10
 
10
11
  export type ClientStory = {
11
12
  index?: number;
@@ -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 };