@dxos/react-client 0.6.14-main.7bd9c89 → 0.6.14-main.8b352a0

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 (39) hide show
  1. package/dist/lib/browser/{chunk-GSDDO2LE.mjs → chunk-U6WOCCWH.mjs} +9 -9
  2. package/dist/lib/browser/{chunk-GSDDO2LE.mjs.map → chunk-U6WOCCWH.mjs.map} +2 -2
  3. package/dist/lib/browser/devtools/index.mjs +1 -1
  4. package/dist/lib/browser/echo/index.mjs +1 -1
  5. package/dist/lib/browser/halo/index.mjs +1 -1
  6. package/dist/lib/browser/index.mjs +1 -1
  7. package/dist/lib/browser/mesh/index.mjs +1 -1
  8. package/dist/lib/browser/meta.json +1 -1
  9. package/dist/lib/browser/testing/index.mjs +62 -12
  10. package/dist/lib/browser/testing/index.mjs.map +3 -3
  11. package/dist/lib/node/{chunk-WR4BVOQQ.cjs → chunk-BYDG3FH4.cjs} +12 -12
  12. package/dist/lib/node/{chunk-WR4BVOQQ.cjs.map → chunk-BYDG3FH4.cjs.map} +2 -2
  13. package/dist/lib/node/devtools/index.cjs +2 -2
  14. package/dist/lib/node/echo/index.cjs +3 -3
  15. package/dist/lib/node/halo/index.cjs +5 -5
  16. package/dist/lib/node/index.cjs +12 -12
  17. package/dist/lib/node/mesh/index.cjs +2 -2
  18. package/dist/lib/node/meta.json +1 -1
  19. package/dist/lib/node/testing/index.cjs +63 -12
  20. package/dist/lib/node/testing/index.cjs.map +3 -3
  21. package/dist/lib/node-esm/{chunk-LPOLSASZ.mjs → chunk-E5UAY5Z4.mjs} +9 -9
  22. package/dist/lib/node-esm/{chunk-LPOLSASZ.mjs.map → chunk-E5UAY5Z4.mjs.map} +2 -2
  23. package/dist/lib/node-esm/devtools/index.mjs +1 -1
  24. package/dist/lib/node-esm/echo/index.mjs +1 -1
  25. package/dist/lib/node-esm/halo/index.mjs +1 -1
  26. package/dist/lib/node-esm/index.mjs +1 -1
  27. package/dist/lib/node-esm/mesh/index.mjs +1 -1
  28. package/dist/lib/node-esm/meta.json +1 -1
  29. package/dist/lib/node-esm/testing/index.mjs +62 -12
  30. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  31. package/dist/types/src/client/ClientProvider.d.ts +0 -4
  32. package/dist/types/src/client/ClientProvider.d.ts.map +1 -1
  33. package/dist/types/src/testing/withClientProvider.d.ts +3 -0
  34. package/dist/types/src/testing/withClientProvider.d.ts.map +1 -1
  35. package/package.json +40 -63
  36. package/src/client/ClientProvider.tsx +1 -3
  37. package/src/playwright/smoke.spec.ts +1 -1
  38. package/src/testing/withClientProvider.tsx +37 -10
  39. package/tsconfig.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ClientProvider.d.ts","sourceRoot":"","sources":["../../../../src/client/ClientProvider.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EACZ,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EAKvB,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,KAAK,sBAAsB,EAAgB,MAAM,cAAc,CAAC;AACrG,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,OAAO,EAAyB,KAAK,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErF,OAAO,EAAiB,KAAK,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAGnE;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,aAAa,EAAE,QAAQ,GAAG,UAAU,CAAC,GAC1E,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC,GAClC,iBAAiB,CAAC;IAChB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAE5C;;;;OAIG;IAEH,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAE5C;;;;OAIG;IAEH,QAAQ,CAAC,EAAE,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAEhG;;OAEG;IACH,QAAQ,CAAC,EAAE,iBAAiB,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAE1D;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;CACxD,CAAC,CAAC;AAEL;;;GAGG;AACH,eAAO,MAAM,cAAc;IAnDvB;;;;OAIG;aACM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAE3C;;;;OAIG;aAEM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAE3C;;;;OAIG;eAEQ,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,YAAY,CAAC,sBAAsB,CAAC,CAAC;IAE/F;;OAEG;eACQ,iBAAiB,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEzD;;;OAGG;qBACc,OAAO;IAExB;;OAEG;eACQ,OAAO;IAElB;;;;OAIG;oBACa,CAAC,MAAM,EAAE,MAAM,KAAK,YAAY,CAAC,IAAI,CAAC;;;4CA4GzD,CAAC"}
1
+ {"version":3,"file":"ClientProvider.d.ts","sourceRoot":"","sources":["../../../../src/client/ClientProvider.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAEZ,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EAIvB,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,KAAK,sBAAsB,EAAgB,MAAM,cAAc,CAAC;AACrG,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,OAAO,EAAyB,KAAK,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErF,OAAO,EAAiB,KAAK,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAGnE;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,aAAa,EAAE,QAAQ,GAAG,UAAU,CAAC,GAC1E,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC,GAClC,iBAAiB,CAAC;IAChB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAE5C;;;;OAIG;IAEH,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAE5C;;;;OAIG;IAEH,QAAQ,CAAC,EAAE,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAEhG;;OAEG;IACH,QAAQ,CAAC,EAAE,iBAAiB,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAE1D;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;CACxD,CAAC,CAAC;AAEL;;;GAGG;AACH,eAAO,MAAM,cAAc;IAjDvB;;;;OAIG;aACM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAE3C;;;;OAIG;aAEM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAE3C;;;;OAIG;eAEQ,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,YAAY,CAAC,sBAAsB,CAAC,CAAC;IAE/F;;OAEG;eACQ,iBAAiB,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEzD;;;OAGG;qBACc,OAAO;IAExB;;OAEG;eACQ,OAAO;IAElB;;OAEG;oBACa,CAAC,MAAM,EAAE,MAAM,KAAK,YAAY,CAAC,IAAI,CAAC;;;4CA4GzD,CAAC"}
@@ -19,6 +19,9 @@ export declare const withClientProvider: ({ createIdentity, createSpace, onSpace
19
19
  export type WithMultiClientProviderProps = InitializeProps & ClientProviderProps & {
20
20
  numClients?: number;
21
21
  };
22
+ export declare const useMultiClient: () => {
23
+ id: number;
24
+ };
22
25
  /**
23
26
  * Decorator that creates a scaffold for multiple clients.
24
27
  * Orchestrates invitations between a randomly selected host and the remaining clients.
@@ -1 +1 @@
1
- {"version":3,"file":"withClientProvider.d.ts","sourceRoot":"","sources":["../../../../src/testing/withClientProvider.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAKlD,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAErE,KAAK,eAAe,GAAG;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;CAClF,CAAC;AA8BF,MAAM,MAAM,uBAAuB,GAAG,eAAe,GAAG,mBAAmB,CAAC;AAE5E;;GAEG;AACH,eAAO,MAAM,kBAAkB,8EAM5B,uBAAuB,KAAQ,SAcjC,CAAC;AAKF,MAAM,MAAM,4BAA4B,GAAG,eAAe,GAAG,mBAAmB,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3G;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,yFAOjC,4BAA4B,KAAG,SAuCjC,CAAC"}
1
+ {"version":3,"file":"withClientProvider.d.ts","sourceRoot":"","sources":["../../../../src/testing/withClientProvider.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAKlD,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAErE,KAAK,eAAe,GAAG;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;CAClF,CAAC;AA8BF,MAAM,MAAM,uBAAuB,GAAG,eAAe,GAAG,mBAAmB,CAAC;AAE5E;;GAEG;AACH,eAAO,MAAM,kBAAkB,8EAM5B,uBAAuB,KAAQ,SAcjC,CAAC;AAKF,MAAM,MAAM,4BAA4B,GAAG,eAAe,GAAG,mBAAmB,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAI3G,eAAO,MAAM,cAAc;QAFoB,MAAM;CAEa,CAAC;AAEnE;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,yFAOjC,4BAA4B,KAAG,SA2CjC,CAAC"}
package/package.json CHANGED
@@ -1,75 +1,52 @@
1
1
  {
2
2
  "name": "@dxos/react-client",
3
- "version": "0.6.14-main.7bd9c89",
3
+ "version": "0.6.14-main.8b352a0",
4
4
  "description": "React client API",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
7
7
  "license": "MIT",
8
8
  "author": "DXOS.org",
9
+ "sideEffects": true,
9
10
  "exports": {
10
11
  "./devtools": {
12
+ "types": "./dist/types/src/devtools/index.d.ts",
11
13
  "browser": "./dist/lib/browser/devtools/index.mjs",
12
- "node": {
13
- "require": "./dist/lib/node/devtools/index.cjs",
14
- "default": "./dist/lib/node-esm/devtools/index.mjs"
15
- },
16
- "types": "./dist/types/src/devtools/index.d.ts"
14
+ "node": "./dist/lib/node-esm/devtools/index.mjs"
17
15
  },
18
16
  "./echo": {
17
+ "types": "./dist/types/src/echo/index.d.ts",
19
18
  "browser": "./dist/lib/browser/echo/index.mjs",
20
- "node": {
21
- "require": "./dist/lib/node/echo/index.cjs",
22
- "default": "./dist/lib/node-esm/echo/index.mjs"
23
- },
24
- "types": "./dist/types/src/echo/index.d.ts"
19
+ "node": "./dist/lib/node-esm/echo/index.mjs"
25
20
  },
26
21
  "./halo": {
22
+ "types": "./dist/types/src/halo/index.d.ts",
27
23
  "browser": "./dist/lib/browser/halo/index.mjs",
28
- "node": {
29
- "require": "./dist/lib/node/halo/index.cjs",
30
- "default": "./dist/lib/node-esm/halo/index.mjs"
31
- },
32
- "types": "./dist/types/src/halo/index.d.ts"
24
+ "node": "./dist/lib/node-esm/halo/index.mjs"
33
25
  },
34
26
  ".": {
27
+ "types": "./dist/types/src/index.d.ts",
35
28
  "browser": "./dist/lib/browser/index.mjs",
36
- "node": {
37
- "require": "./dist/lib/node/index.cjs",
38
- "default": "./dist/lib/node-esm/index.mjs"
39
- },
40
- "types": "./dist/types/src/index.d.ts"
29
+ "node": "./dist/lib/node-esm/index.mjs"
41
30
  },
42
31
  "./invitations": {
32
+ "types": "./dist/types/src/invitations/index.d.ts",
43
33
  "browser": "./dist/lib/browser/invitations/index.mjs",
44
- "node": {
45
- "require": "./dist/lib/node/invitations/index.cjs",
46
- "default": "./dist/lib/node-esm/invitations/index.mjs"
47
- },
48
- "types": "./dist/types/src/invitations/index.d.ts"
34
+ "node": "./dist/lib/node-esm/invitations/index.mjs"
49
35
  },
50
36
  "./mesh": {
37
+ "types": "./dist/types/src/mesh/index.d.ts",
51
38
  "browser": "./dist/lib/browser/mesh/index.mjs",
52
- "node": {
53
- "require": "./dist/lib/node/mesh/index.cjs",
54
- "default": "./dist/lib/node-esm/mesh/index.mjs"
55
- },
56
- "types": "./dist/types/src/mesh/index.d.ts"
39
+ "node": "./dist/lib/node-esm/mesh/index.mjs"
57
40
  },
58
41
  "./testing": {
42
+ "types": "./dist/types/src/testing/index.d.ts",
59
43
  "browser": "./dist/lib/browser/testing/index.mjs",
60
- "node": {
61
- "require": "./dist/lib/node/testing/index.cjs",
62
- "default": "./dist/lib/node-esm/testing/index.mjs"
63
- },
64
- "types": "./dist/types/src/testing/index.d.ts"
44
+ "node": "./dist/lib/node-esm/testing/index.mjs"
65
45
  },
66
46
  "./worker": {
47
+ "types": "./dist/types/src/worker.d.ts",
67
48
  "browser": "./dist/lib/browser/worker.mjs",
68
- "node": {
69
- "require": "./dist/lib/node/worker.cjs",
70
- "default": "./dist/lib/node-esm/worker.mjs"
71
- },
72
- "types": "./dist/types/src/worker.d.ts"
49
+ "node": "./dist/lib/node-esm/worker.mjs"
73
50
  }
74
51
  },
75
52
  "types": "dist/types/src/index.d.ts",
@@ -100,40 +77,40 @@
100
77
  },
101
78
  "dependencies": {
102
79
  "react-error-boundary": "^4.0.13",
103
- "@dxos/client": "0.6.14-main.7bd9c89",
104
- "@dxos/async": "0.6.14-main.7bd9c89",
105
- "@dxos/codec-protobuf": "0.6.14-main.7bd9c89",
106
- "@dxos/debug": "0.6.14-main.7bd9c89",
107
- "@dxos/echo-schema": "0.6.14-main.7bd9c89",
108
- "@dxos/echo-signals": "0.6.14-main.7bd9c89",
109
- "@dxos/invariant": "0.6.14-main.7bd9c89",
110
- "@dxos/config": "0.6.14-main.7bd9c89",
111
- "@dxos/log": "0.6.14-main.7bd9c89",
112
- "@dxos/node-std": "0.6.14-main.7bd9c89",
113
- "@dxos/protocols": "0.6.14-main.7bd9c89",
114
- "@dxos/react-hooks": "0.6.14-main.7bd9c89",
115
- "@dxos/util": "0.6.14-main.7bd9c89"
80
+ "@dxos/async": "0.6.14-main.8b352a0",
81
+ "@dxos/codec-protobuf": "0.6.14-main.8b352a0",
82
+ "@dxos/client": "0.6.14-main.8b352a0",
83
+ "@dxos/config": "0.6.14-main.8b352a0",
84
+ "@dxos/debug": "0.6.14-main.8b352a0",
85
+ "@dxos/echo-schema": "0.6.14-main.8b352a0",
86
+ "@dxos/echo-signals": "0.6.14-main.8b352a0",
87
+ "@dxos/invariant": "0.6.14-main.8b352a0",
88
+ "@dxos/log": "0.6.14-main.8b352a0",
89
+ "@dxos/node-std": "0.6.14-main.8b352a0",
90
+ "@dxos/protocols": "0.6.14-main.8b352a0",
91
+ "@dxos/util": "0.6.14-main.8b352a0",
92
+ "@dxos/react-hooks": "0.6.14-main.8b352a0"
116
93
  },
117
94
  "devDependencies": {
118
95
  "@types/react": "~18.2.0",
119
96
  "@types/react-dom": "~18.2.0",
120
97
  "react": "~18.2.0",
121
98
  "react-dom": "~18.2.0",
122
- "@dxos/random": "0.6.14-main.7bd9c89",
123
- "@dxos/react-ui": "0.6.14-main.7bd9c89",
124
- "@dxos/react-ui-syntax-highlighter": "0.6.14-main.7bd9c89",
125
- "@dxos/react-ui-theme": "0.6.14-main.7bd9c89",
126
- "@dxos/test-utils": "0.6.14-main.7bd9c89",
127
- "@dxos/storybook-utils": "0.6.14-main.7bd9c89"
99
+ "@dxos/random": "0.6.14-main.8b352a0",
100
+ "@dxos/react-ui": "0.6.14-main.8b352a0",
101
+ "@dxos/react-ui-syntax-highlighter": "0.6.14-main.8b352a0",
102
+ "@dxos/react-ui-theme": "0.6.14-main.8b352a0",
103
+ "@dxos/storybook-utils": "0.6.14-main.8b352a0",
104
+ "@dxos/test-utils": "0.6.14-main.8b352a0"
128
105
  },
129
106
  "peerDependencies": {
130
107
  "react": "~18.2.0",
131
108
  "react-dom": "~18.2.0",
132
- "@dxos/react-ui": "0.6.14-main.7bd9c89",
133
- "@dxos/react-ui-theme": "0.6.14-main.7bd9c89"
109
+ "@dxos/react-ui-theme": "0.6.14-main.8b352a0",
110
+ "@dxos/react-ui": "0.6.14-main.8b352a0"
134
111
  },
135
112
  "optionalDependencies": {
136
- "@dxos/random": "0.6.14-main.7bd9c89"
113
+ "@dxos/random": "0.6.14-main.8b352a0"
137
114
  },
138
115
  "publishConfig": {
139
116
  "access": "public"
@@ -3,9 +3,9 @@
3
3
  //
4
4
 
5
5
  import React, {
6
+ forwardRef,
6
7
  type FunctionComponent,
7
8
  type PropsWithChildren,
8
- forwardRef,
9
9
  useEffect,
10
10
  useImperativeHandle,
11
11
  useState,
@@ -68,8 +68,6 @@ export type ClientProviderProps = Omit<ClientOptions, 'config' | 'services'> &
68
68
 
69
69
  /**
70
70
  * Post initialization hook to enable to caller to do custom initialization.
71
- *
72
- * @param Client
73
71
  */
74
72
  onInitialized?: (client: Client) => MaybePromise<void>;
75
73
  }>;
@@ -14,7 +14,7 @@ test.describe('Smoke test', () => {
14
14
  let page: Page;
15
15
 
16
16
  test.beforeAll(async ({ browser }) => {
17
- const result = await setupPage(browser, { url: storybookUrl('react-client-withclientprovider--default') });
17
+ const result = await setupPage(browser, { url: storybookUrl('sdk-react-client-withclientprovider--default') });
18
18
  page = result.page;
19
19
  await page.locator(':text("initialized")').waitFor({ state: 'visible' });
20
20
  });
@@ -3,13 +3,14 @@
3
3
  //
4
4
 
5
5
  import { type Decorator } from '@storybook/react';
6
- import React, { useRef } from 'react';
7
- import { type FallbackProps, ErrorBoundary } from 'react-error-boundary';
6
+ import React, { createContext, type PropsWithChildren, useContext, useEffect, useRef, useState } from 'react';
7
+ import { type FallbackProps, ErrorBoundary as NativeErrorBoundary } from 'react-error-boundary';
8
8
 
9
9
  import { Trigger } from '@dxos/async';
10
10
  import { type Client } from '@dxos/client';
11
11
  import { type Space } from '@dxos/client/echo';
12
12
  import { performInvitation, TestBuilder } from '@dxos/client/testing';
13
+ import { log } from '@dxos/log';
13
14
  import { type MaybePromise } from '@dxos/util';
14
15
 
15
16
  import { ClientProvider, type ClientProviderProps } from '../client';
@@ -66,7 +67,7 @@ export const withClientProvider = ({
66
67
  };
67
68
 
68
69
  return (
69
- <ErrorBoundary FallbackComponent={ErrorFallback}>
70
+ <ErrorBoundary>
70
71
  <ClientProvider onInitialized={handleInitialized} {...props}>
71
72
  <Story />
72
73
  </ClientProvider>
@@ -80,6 +81,10 @@ export const withClientProvider = ({
80
81
  // TODO(burdon): Delay/jitter for creation of other clients.
81
82
  export type WithMultiClientProviderProps = InitializeProps & ClientProviderProps & { numClients?: number };
82
83
 
84
+ const MultiClientContext = createContext<{ id: number }>({ id: 0 });
85
+
86
+ export const useMultiClient = () => useContext(MultiClientContext);
87
+
83
88
  /**
84
89
  * Decorator that creates a scaffold for multiple clients.
85
90
  * Orchestrates invitations between a randomly selected host and the remaining clients.
@@ -99,16 +104,20 @@ export const withMultiClientProvider = ({
99
104
  const spaceReady = useRef(new Trigger<Space | undefined>());
100
105
 
101
106
  // Handle invitations.
102
- const handleInitialized = async (client: Client) => {
107
+ // NOTE: The zeroth client isn't necessarily the first to be initialized.
108
+ const handleInitialized = async (client: Client, index: number) => {
109
+ log.info('initialized', { index });
103
110
  if (createSpace) {
104
111
  if (!hostRef.current) {
105
112
  hostRef.current = client;
106
113
  const space = await initializeClient(client, { createIdentity, createSpace, onSpaceCreated, onInitialized });
107
114
  spaceReady.current.wake(space);
115
+ log.info('inviting', { index });
108
116
  } else {
109
117
  await initializeClient(client, { createIdentity, onInitialized });
110
118
  const space = await spaceReady.current.wait();
111
119
  if (space) {
120
+ log.info('joining', { index });
112
121
  await Promise.all(performInvitation({ host: space, guest: client.spaces }));
113
122
  }
114
123
  }
@@ -116,28 +125,46 @@ export const withMultiClientProvider = ({
116
125
  };
117
126
 
118
127
  return (
119
- <>
128
+ <ErrorBoundary>
120
129
  {Array.from({ length: numClients }).map((_, index) => (
121
- <ErrorBoundary key={index} FallbackComponent={ErrorFallback}>
130
+ <MultiClientContext.Provider key={index} value={{ id: index }}>
122
131
  <ClientProvider
123
132
  services={builder.current.createLocalClientServices()}
124
- onInitialized={handleInitialized}
133
+ onInitialized={(client) => handleInitialized(client, index)}
125
134
  {...props}
126
135
  >
127
136
  <Story />
128
137
  </ClientProvider>
129
- </ErrorBoundary>
138
+ </MultiClientContext.Provider>
130
139
  ))}
131
- </>
140
+ </ErrorBoundary>
132
141
  );
133
142
  };
134
143
  };
135
144
 
145
+ const ErrorBoundary = ({ children }: PropsWithChildren) => {
146
+ const [error, setError] = useState<Error>();
147
+ useEffect(() => {
148
+ const handleError = (event: PromiseRejectionEvent) => {
149
+ setError(event.reason);
150
+ };
151
+
152
+ window.addEventListener('unhandledrejection', handleError);
153
+ return () => window.removeEventListener('unhandledrejection', handleError);
154
+ }, []);
155
+
156
+ if (error) {
157
+ return <ErrorFallback error={error} resetErrorBoundary={() => setError(undefined)} />;
158
+ }
159
+
160
+ return <NativeErrorBoundary FallbackComponent={ErrorFallback}>{children}</NativeErrorBoundary>;
161
+ };
162
+
136
163
  const ErrorFallback = ({ error }: FallbackProps) => {
137
164
  const { name, message, stack } =
138
165
  error instanceof Error ? error : { name: 'Error', message: String(error), stack: undefined };
139
166
  return (
140
- <div role='alert' className='flex flex-col overflow-hidden p-4 gap-4'>
167
+ <div role='alert' className='flex flex-col p-4 gap-4 overflow-auto'>
141
168
  <h1 className='text-xl text-red-500'>{name}</h1>
142
169
  <div className='text-lg'>{message}</div>
143
170
  {stack && <pre className='whitespace-pre-wrap text-sm text-subdued'>{stack}</pre>}
package/tsconfig.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "extends": "../../../tsconfig.json",
2
+ "extends": "../../../tsconfig.base.json",
3
3
  "compilerOptions": {
4
4
  "jsx": "react",
5
5
  "lib": [