use-everywhere 0.7.0 → 0.8.0
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.
- package/dist/{chunk-LNJEF4DI.js → chunk-75TICQ7E.js} +67 -13
- package/dist/devtools/index.cjs +14 -5
- package/dist/devtools/index.js +1 -1
- package/dist/index.cjs +259 -68
- package/dist/index.d.cts +242 -10
- package/dist/index.d.ts +242 -10
- package/dist/index.js +164 -26
- package/package.json +23 -11
package/dist/index.cjs
CHANGED
|
@@ -21,44 +21,57 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
21
21
|
// src/index.ts
|
|
22
22
|
var src_exports = {};
|
|
23
23
|
__export(src_exports, {
|
|
24
|
-
BroadcastChannelTransport: () =>
|
|
25
|
-
CID_PARAM: () =>
|
|
24
|
+
BroadcastChannelTransport: () => import_core4.BroadcastChannelTransport,
|
|
25
|
+
CID_PARAM: () => import_core4.CID_PARAM,
|
|
26
26
|
DEFAULT_NAME: () => import_core.DEFAULT_NAME,
|
|
27
|
-
HandshakeTimeoutError: () =>
|
|
28
|
-
NoopTransport: () =>
|
|
29
|
-
StorageTransport: () =>
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
27
|
+
HandshakeTimeoutError: () => import_core4.HandshakeTimeoutError,
|
|
28
|
+
NoopTransport: () => import_core4.NoopTransport,
|
|
29
|
+
StorageTransport: () => import_core4.StorageTransport,
|
|
30
|
+
WIRE_VERSION: () => import_core4.WIRE_VERSION,
|
|
31
|
+
WindowClosedError: () => import_core4.WindowClosedError,
|
|
32
|
+
connectToOpener: () => import_core4.connectToOpener,
|
|
33
|
+
createChannel: () => import_core4.createChannel,
|
|
34
|
+
createLeader: () => import_core4.createLeader,
|
|
35
|
+
createNamespace: () => createNamespace,
|
|
36
|
+
createPresence: () => import_core4.createPresence,
|
|
37
|
+
createSharedReducer: () => import_core4.createSharedReducer,
|
|
38
|
+
createSharedStore: () => import_core4.createSharedStore,
|
|
39
|
+
defaultTransport: () => import_core4.defaultTransport,
|
|
37
40
|
defineChannel: () => defineChannel,
|
|
38
41
|
defineStore: () => defineStore,
|
|
39
|
-
enableDebug: () =>
|
|
40
|
-
getBusNames: () =>
|
|
42
|
+
enableDebug: () => import_core4.enableDebug,
|
|
43
|
+
getBusNames: () => import_core4.getBusNames,
|
|
41
44
|
getLeader: () => getLeader,
|
|
42
45
|
getSharedStore: () => getSharedStore,
|
|
43
|
-
getTransportKind: () =>
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
46
|
+
getTransportKind: () => import_core4.getTransportKind,
|
|
47
|
+
getWireSkew: () => import_core4.getWireSkew,
|
|
48
|
+
indexedDbAdapter: () => import_core4.indexedDbAdapter,
|
|
49
|
+
isBroadcastChannelAvailable: () => import_core4.isBroadcastChannelAvailable,
|
|
50
|
+
isStorageEventAvailable: () => import_core4.isStorageEventAvailable,
|
|
51
|
+
jsonSerializer: () => import_core4.jsonSerializer,
|
|
52
|
+
localStorageAdapter: () => import_core4.localStorageAdapter,
|
|
53
|
+
newer: () => import_core4.newer,
|
|
54
|
+
observeBus: () => import_core4.observeBus,
|
|
55
|
+
openWindow: () => import_core4.openWindow,
|
|
56
|
+
sessionStorageAdapter: () => import_core4.sessionStorageAdapter,
|
|
57
|
+
shallowEqual: () => shallowEqual,
|
|
58
|
+
useAnswer: () => useAnswer,
|
|
59
|
+
useAsk: () => useAsk,
|
|
51
60
|
useChannel: () => useChannel,
|
|
52
61
|
useClientId: () => useClientId,
|
|
62
|
+
useHydrated: () => useHydrated,
|
|
53
63
|
useIsLeader: () => useIsLeader,
|
|
54
64
|
useLeader: () => useLeader,
|
|
55
65
|
useLeaderEffect: () => useLeaderEffect,
|
|
56
66
|
useMessage: () => useMessage,
|
|
57
67
|
useOpenedWindow: () => useOpenedWindow,
|
|
58
68
|
usePeers: () => usePeers,
|
|
69
|
+
usePresenceMetadata: () => usePresenceMetadata,
|
|
59
70
|
useSend: () => useSend,
|
|
71
|
+
useSharedReducer: () => useSharedReducer,
|
|
60
72
|
useSharedState: () => useSharedState,
|
|
61
|
-
|
|
73
|
+
useSharedStore: () => useSharedStore,
|
|
74
|
+
webStorageAdapter: () => import_core4.webStorageAdapter
|
|
62
75
|
});
|
|
63
76
|
module.exports = __toCommonJS(src_exports);
|
|
64
77
|
|
|
@@ -107,6 +120,12 @@ var unsubscribe = () => noop;
|
|
|
107
120
|
var INERT = Object.freeze({
|
|
108
121
|
clientId: SERVER_CLIENT_ID,
|
|
109
122
|
// store
|
|
123
|
+
//
|
|
124
|
+
// Resolved, unlike the leader's `waitForLeadership` below. A server render
|
|
125
|
+
// has nothing to restore and is documented to render defaults, so `await
|
|
126
|
+
// store.hydrated` must proceed — a never-settling promise would hang the
|
|
127
|
+
// render rather than describe it honestly.
|
|
128
|
+
hydrated: Promise.resolve(),
|
|
110
129
|
state: EMPTY,
|
|
111
130
|
getVersions: () => EMPTY,
|
|
112
131
|
set: noop,
|
|
@@ -115,6 +134,8 @@ var INERT = Object.freeze({
|
|
|
115
134
|
// store + leader share getSnapshot; presence has getPeers
|
|
116
135
|
getSnapshot: () => EMPTY,
|
|
117
136
|
getPeers: () => NO_PEERS,
|
|
137
|
+
// presence
|
|
138
|
+
setMetadata: noop,
|
|
118
139
|
// leader
|
|
119
140
|
resign: noop,
|
|
120
141
|
setEligible: noop,
|
|
@@ -133,6 +154,12 @@ var createServerLeader = () => ({
|
|
|
133
154
|
getSnapshot: () => NO_LEADER,
|
|
134
155
|
waitForLeadership: NEVER
|
|
135
156
|
});
|
|
157
|
+
var createServerReducer = (initial) => ({
|
|
158
|
+
...INERT,
|
|
159
|
+
getSnapshot: () => initial,
|
|
160
|
+
dispatch: noop,
|
|
161
|
+
pendingCount: () => 0
|
|
162
|
+
});
|
|
136
163
|
var createServerChannel = (name) => ({ ...INERT, name, post: noop, on: unsubscribe });
|
|
137
164
|
|
|
138
165
|
// src/registry.ts
|
|
@@ -153,15 +180,17 @@ function getSharedStore(name = import_core.DEFAULT_NAME, scope = "everywhere") {
|
|
|
153
180
|
function configSignature(options) {
|
|
154
181
|
const persist = options?.persist;
|
|
155
182
|
if (!persist) return "none";
|
|
156
|
-
return `persist:${persist.keys?.join(",") ?? "*"}:${persist.debounceMs ?? "default"}`;
|
|
183
|
+
return `persist:${persist.keys?.join(",") ?? "*"}:${persist.debounceMs ?? "default"}:v${persist.version ?? 0}`;
|
|
157
184
|
}
|
|
158
185
|
function configureStore(name, scope, options) {
|
|
159
186
|
const key = `${scope} ${name}`;
|
|
160
187
|
if (stores.has(key)) {
|
|
161
188
|
if (configSignature(storeConfig.get(key)) === configSignature(options)) return;
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
189
|
+
if (process.env.NODE_ENV !== "production") {
|
|
190
|
+
devWarn(
|
|
191
|
+
`[use-everywhere] defineStore('${name}') ran after that store was already created, with different options. The live store keeps the configuration it was built with. Move defineStore to module scope, before any component reads the store.`
|
|
192
|
+
);
|
|
193
|
+
}
|
|
165
194
|
return;
|
|
166
195
|
}
|
|
167
196
|
storeConfig.set(key, options);
|
|
@@ -175,11 +204,12 @@ function getStore(name, scope = "everywhere") {
|
|
|
175
204
|
}
|
|
176
205
|
return store;
|
|
177
206
|
}
|
|
178
|
-
function getPresence(name) {
|
|
179
|
-
|
|
207
|
+
function getPresence(name, includeSelf = false) {
|
|
208
|
+
const key = includeSelf ? `self ${name}` : name;
|
|
209
|
+
let presence = presences.get(key);
|
|
180
210
|
if (!presence) {
|
|
181
|
-
presence = isServer() ? createServerPresence() : (0, import_core.createPresence)(name);
|
|
182
|
-
presences.set(
|
|
211
|
+
presence = isServer() ? createServerPresence() : (0, import_core.createPresence)(name, { includeSelf });
|
|
212
|
+
presences.set(key, presence);
|
|
183
213
|
}
|
|
184
214
|
return presence;
|
|
185
215
|
}
|
|
@@ -200,16 +230,43 @@ function warnOnLeaderOptionConflict(name, options) {
|
|
|
200
230
|
for (const key of ["heartbeatMs", "leaseMs"]) {
|
|
201
231
|
const requested = options[key];
|
|
202
232
|
if (requested !== void 0 && requested !== first?.[key]) {
|
|
233
|
+
if (process.env.NODE_ENV !== "production") {
|
|
234
|
+
devWarn(
|
|
235
|
+
`[use-everywhere] leader "${name}": ${key} ignored \u2014 the first useLeader/getLeader call fixes the election timings for this tab.`
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
var channelConfig = /* @__PURE__ */ new Map();
|
|
242
|
+
function configureChannel(name, options) {
|
|
243
|
+
if (channels.has(name)) {
|
|
244
|
+
const before = Object.keys(channelConfig.get(name)?.schema ?? {}).sort();
|
|
245
|
+
const after = Object.keys(options.schema ?? {}).sort();
|
|
246
|
+
if (before.join() === after.join()) return;
|
|
247
|
+
if (process.env.NODE_ENV !== "production") {
|
|
203
248
|
devWarn(
|
|
204
|
-
`[use-everywhere]
|
|
249
|
+
`[use-everywhere] defineChannel('${name}') ran after that channel was already created, with different options. The live channel keeps the configuration it was built with. Move defineChannel to module scope, before any component sends or receives on it.`
|
|
205
250
|
);
|
|
206
251
|
}
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
channelConfig.set(name, options);
|
|
255
|
+
}
|
|
256
|
+
var reducers = /* @__PURE__ */ new Map();
|
|
257
|
+
function getReducer(name, key, reducer, initial) {
|
|
258
|
+
const id = `${name} ${key}`;
|
|
259
|
+
let existing = reducers.get(id);
|
|
260
|
+
if (!existing) {
|
|
261
|
+
existing = isServer() ? createServerReducer(initial) : (0, import_core.createSharedReducer)(name, reducer, initial, { key, leader: getLeader(name) });
|
|
262
|
+
reducers.set(id, existing);
|
|
207
263
|
}
|
|
264
|
+
return existing;
|
|
208
265
|
}
|
|
209
266
|
function getChannel(name) {
|
|
210
267
|
let channel = channels.get(name);
|
|
211
268
|
if (!channel) {
|
|
212
|
-
channel = isServer() ? createServerChannel(name) : (0, import_core.createChannel)(name);
|
|
269
|
+
channel = isServer() ? createServerChannel(name) : (0, import_core.createChannel)(name, channelConfig.get(name));
|
|
213
270
|
channels.set(name, channel);
|
|
214
271
|
}
|
|
215
272
|
return channel;
|
|
@@ -220,7 +277,9 @@ function useSharedState(key, initial, options) {
|
|
|
220
277
|
const storeName = options?.store ?? import_core.DEFAULT_NAME;
|
|
221
278
|
const store = getStore(storeName, options?.scope ?? "everywhere");
|
|
222
279
|
store.registerKey(key, initial);
|
|
223
|
-
|
|
280
|
+
if (process.env.NODE_ENV !== "production") {
|
|
281
|
+
warnOnInitialMismatch(storeName, key, initial);
|
|
282
|
+
}
|
|
224
283
|
const value = (0, import_react.useSyncExternalStore)(
|
|
225
284
|
(0, import_react.useCallback)((onChange) => store.subscribeKey(key, onChange), [store, key]),
|
|
226
285
|
() => store.getSnapshot()[key],
|
|
@@ -233,27 +292,98 @@ function useSharedState(key, initial, options) {
|
|
|
233
292
|
return [value, setValue];
|
|
234
293
|
}
|
|
235
294
|
|
|
236
|
-
// src/use-
|
|
295
|
+
// src/use-shared-reducer.ts
|
|
237
296
|
var import_react2 = require("react");
|
|
297
|
+
function useSharedReducer(reducer, initial, options) {
|
|
298
|
+
const engine = getReducer(
|
|
299
|
+
options?.name ?? import_core.DEFAULT_NAME,
|
|
300
|
+
options?.key ?? "default",
|
|
301
|
+
reducer,
|
|
302
|
+
initial
|
|
303
|
+
);
|
|
304
|
+
const value = (0, import_react2.useSyncExternalStore)(
|
|
305
|
+
(0, import_react2.useCallback)((onChange) => engine.subscribe(onChange), [engine]),
|
|
306
|
+
() => engine.getSnapshot(),
|
|
307
|
+
() => initial
|
|
308
|
+
);
|
|
309
|
+
const dispatch = (0, import_react2.useCallback)((action) => engine.dispatch(action), [engine]);
|
|
310
|
+
return [value, dispatch];
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// src/use-shared-selector.ts
|
|
314
|
+
var import_react3 = require("react");
|
|
315
|
+
function useSharedStore(selector, options) {
|
|
316
|
+
const store = getStore(options?.store ?? import_core.DEFAULT_NAME, options?.scope ?? "everywhere");
|
|
317
|
+
const equal = options?.equal ?? Object.is;
|
|
318
|
+
const selectorRef = (0, import_react3.useRef)(selector);
|
|
319
|
+
selectorRef.current = selector;
|
|
320
|
+
const equalRef = (0, import_react3.useRef)(equal);
|
|
321
|
+
equalRef.current = equal;
|
|
322
|
+
const cache = (0, import_react3.useRef)(null);
|
|
323
|
+
const getSelection = (0, import_react3.useCallback)(() => {
|
|
324
|
+
const source = store.getSnapshot();
|
|
325
|
+
const select = selectorRef.current;
|
|
326
|
+
const previous = cache.current;
|
|
327
|
+
if (previous && previous.source === source && previous.select === select) return previous.value;
|
|
328
|
+
const next = select(source);
|
|
329
|
+
const value = previous && equalRef.current(previous.value, next) ? previous.value : next;
|
|
330
|
+
cache.current = { source, select, value };
|
|
331
|
+
return value;
|
|
332
|
+
}, [store]);
|
|
333
|
+
return (0, import_react3.useSyncExternalStore)(
|
|
334
|
+
(0, import_react3.useCallback)((onChange) => store.subscribe(onChange), [store]),
|
|
335
|
+
getSelection,
|
|
336
|
+
getSelection
|
|
337
|
+
);
|
|
338
|
+
}
|
|
339
|
+
function shallowEqual(a, b) {
|
|
340
|
+
if (Object.is(a, b)) return true;
|
|
341
|
+
if (typeof a !== "object" || a === null || typeof b !== "object" || b === null) return false;
|
|
342
|
+
const left = a;
|
|
343
|
+
const right = b;
|
|
344
|
+
const keys = Object.keys(left);
|
|
345
|
+
if (keys.length !== Object.keys(right).length) return false;
|
|
346
|
+
return keys.every((key) => Object.is(left[key], right[key]));
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// src/use-message.ts
|
|
350
|
+
var import_react4 = require("react");
|
|
238
351
|
function useChannel(name) {
|
|
239
352
|
return getChannel(name);
|
|
240
353
|
}
|
|
241
|
-
function useMessage(channel, type, handler) {
|
|
242
|
-
const handlerRef = (0,
|
|
243
|
-
(0,
|
|
354
|
+
function useMessage(channel, type, handler, options) {
|
|
355
|
+
const handlerRef = (0, import_react4.useRef)(handler);
|
|
356
|
+
(0, import_react4.useEffect)(() => {
|
|
244
357
|
handlerRef.current = handler;
|
|
245
358
|
});
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
359
|
+
const enabled = options?.enabled ?? true;
|
|
360
|
+
const once = options?.once ?? false;
|
|
361
|
+
(0, import_react4.useEffect)(() => {
|
|
362
|
+
if (!enabled) return;
|
|
363
|
+
return channel.on(type, (payload, meta) => handlerRef.current(payload, meta), { once });
|
|
364
|
+
}, [channel, type, enabled, once]);
|
|
365
|
+
}
|
|
366
|
+
function useAnswer(channel, type, responder, options) {
|
|
367
|
+
const responderRef = (0, import_react4.useRef)(responder);
|
|
368
|
+
(0, import_react4.useEffect)(() => {
|
|
369
|
+
responderRef.current = responder;
|
|
370
|
+
});
|
|
371
|
+
const enabled = options?.enabled ?? true;
|
|
372
|
+
(0, import_react4.useEffect)(() => {
|
|
373
|
+
if (!enabled) return;
|
|
374
|
+
return channel.answer(type, (payload, meta) => responderRef.current(payload, meta));
|
|
375
|
+
}, [channel, type, enabled]);
|
|
250
376
|
}
|
|
251
377
|
function useSend(channel) {
|
|
252
378
|
return channel.post;
|
|
253
379
|
}
|
|
380
|
+
function useAsk(channel) {
|
|
381
|
+
return channel.ask;
|
|
382
|
+
}
|
|
254
383
|
|
|
255
384
|
// src/define-channel.ts
|
|
256
|
-
function defineChannel(name) {
|
|
385
|
+
function defineChannel(name, options) {
|
|
386
|
+
if (options) configureChannel(name, options);
|
|
257
387
|
const useBoundSend = () => useSend(useChannel(name));
|
|
258
388
|
const useBoundMessage = (type, handler) => useMessage(useChannel(name), type, handler);
|
|
259
389
|
return {
|
|
@@ -271,7 +401,10 @@ function defineStore(name, options = {}) {
|
|
|
271
401
|
persist: {
|
|
272
402
|
adapter: options.persist,
|
|
273
403
|
...options.persistKeys ? { keys: options.persistKeys } : {},
|
|
274
|
-
...options.persistDebounceMs === void 0 ? {} : { debounceMs: options.persistDebounceMs }
|
|
404
|
+
...options.persistDebounceMs === void 0 ? {} : { debounceMs: options.persistDebounceMs },
|
|
405
|
+
...options.persistVersion === void 0 ? {} : { version: options.persistVersion },
|
|
406
|
+
...options.migrate ? { migrate: options.migrate } : {},
|
|
407
|
+
...options.onRestoreError ? { onRestoreError: options.onRestoreError } : {}
|
|
275
408
|
}
|
|
276
409
|
});
|
|
277
410
|
}
|
|
@@ -282,41 +415,64 @@ function defineStore(name, options = {}) {
|
|
|
282
415
|
}
|
|
283
416
|
|
|
284
417
|
// src/use-peers.ts
|
|
285
|
-
var
|
|
418
|
+
var import_react5 = require("react");
|
|
286
419
|
var NO_PEERS2 = Object.freeze([]);
|
|
287
420
|
function usePeers(options) {
|
|
288
|
-
const presence = getPresence(options?.name ?? import_core.DEFAULT_NAME);
|
|
289
|
-
return (0,
|
|
290
|
-
(0,
|
|
421
|
+
const presence = getPresence(options?.name ?? import_core.DEFAULT_NAME, options?.includeSelf ?? false);
|
|
422
|
+
return (0, import_react5.useSyncExternalStore)(
|
|
423
|
+
(0, import_react5.useCallback)((onChange) => presence.subscribe(onChange), [presence]),
|
|
291
424
|
() => presence.getPeers(),
|
|
292
425
|
() => NO_PEERS2
|
|
293
426
|
);
|
|
294
427
|
}
|
|
295
428
|
function useClientId(options) {
|
|
296
429
|
const presence = getPresence(options?.name ?? import_core.DEFAULT_NAME);
|
|
297
|
-
return (0,
|
|
430
|
+
return (0, import_react5.useSyncExternalStore)(
|
|
298
431
|
// The id never changes for the life of a presence engine, so there is
|
|
299
432
|
// nothing to subscribe to — but uSES still needs the post-hydration read,
|
|
300
433
|
// which it performs when it attaches this subscription.
|
|
301
|
-
(0,
|
|
434
|
+
(0, import_react5.useCallback)(() => () => {
|
|
302
435
|
}, [presence]),
|
|
303
436
|
() => presence.clientId,
|
|
304
437
|
() => SERVER_CLIENT_ID
|
|
305
438
|
);
|
|
306
439
|
}
|
|
440
|
+
function usePresenceMetadata(metadata, options) {
|
|
441
|
+
const presence = getPresence(options?.name ?? import_core.DEFAULT_NAME, options?.includeSelf ?? false);
|
|
442
|
+
(0, import_react5.useEffect)(() => {
|
|
443
|
+
presence.setMetadata(metadata);
|
|
444
|
+
}, [presence, metadata]);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
// src/use-hydrated.ts
|
|
448
|
+
var import_react6 = require("react");
|
|
449
|
+
function useHydrated(options) {
|
|
450
|
+
const store = getStore(options?.store ?? import_core.DEFAULT_NAME, options?.scope ?? "everywhere");
|
|
451
|
+
const [ready, setReady] = (0, import_react6.useState)(false);
|
|
452
|
+
(0, import_react6.useEffect)(() => {
|
|
453
|
+
let cancelled = false;
|
|
454
|
+
void store.hydrated.then(() => {
|
|
455
|
+
if (!cancelled) setReady(true);
|
|
456
|
+
});
|
|
457
|
+
return () => {
|
|
458
|
+
cancelled = true;
|
|
459
|
+
};
|
|
460
|
+
}, [store]);
|
|
461
|
+
return ready;
|
|
462
|
+
}
|
|
307
463
|
|
|
308
464
|
// src/use-leader.ts
|
|
309
|
-
var
|
|
465
|
+
var import_react7 = require("react");
|
|
310
466
|
var NO_LEADER2 = Object.freeze({ leaderId: null, isLeader: false });
|
|
311
467
|
function useLeader(options) {
|
|
312
468
|
const leader = getLeader(options?.name ?? import_core.DEFAULT_NAME, options);
|
|
313
469
|
const eligible = options?.eligible;
|
|
314
|
-
(0,
|
|
470
|
+
(0, import_react7.useEffect)(() => {
|
|
315
471
|
if (eligible === void 0) return;
|
|
316
472
|
leader.setEligible(eligible);
|
|
317
473
|
}, [leader, eligible]);
|
|
318
|
-
return (0,
|
|
319
|
-
(0,
|
|
474
|
+
return (0, import_react7.useSyncExternalStore)(
|
|
475
|
+
(0, import_react7.useCallback)((onChange) => leader.subscribe(onChange), [leader]),
|
|
320
476
|
() => leader.getSnapshot(),
|
|
321
477
|
() => NO_LEADER2
|
|
322
478
|
);
|
|
@@ -326,32 +482,54 @@ function useIsLeader(options) {
|
|
|
326
482
|
}
|
|
327
483
|
function useLeaderEffect(effect, options) {
|
|
328
484
|
const { isLeader } = useLeader(options);
|
|
329
|
-
const effectRef = (0,
|
|
330
|
-
(0,
|
|
485
|
+
const effectRef = (0, import_react7.useRef)(effect);
|
|
486
|
+
(0, import_react7.useEffect)(() => {
|
|
331
487
|
effectRef.current = effect;
|
|
332
488
|
});
|
|
333
|
-
(0,
|
|
489
|
+
(0, import_react7.useEffect)(() => {
|
|
334
490
|
if (!isLeader) return;
|
|
335
491
|
return effectRef.current();
|
|
336
492
|
}, [isLeader]);
|
|
337
493
|
}
|
|
338
494
|
|
|
339
|
-
// src/
|
|
340
|
-
var import_react5 = require("react");
|
|
495
|
+
// src/namespace.ts
|
|
341
496
|
var import_core2 = require("@use-everywhere/core");
|
|
497
|
+
function createNamespace(namespace) {
|
|
498
|
+
const core = (0, import_core2.createNamespace)(namespace);
|
|
499
|
+
const { busName } = core;
|
|
500
|
+
return {
|
|
501
|
+
...core,
|
|
502
|
+
defineStore: (name, options) => defineStore(busName(name), options),
|
|
503
|
+
defineChannel: (name, options) => defineChannel(busName(name), options),
|
|
504
|
+
getSharedStore: (name, scope) => getSharedStore(busName(name), scope),
|
|
505
|
+
useSharedState: (key, initial, options) => useSharedState(key, initial, { ...options, store: busName(options?.store) }),
|
|
506
|
+
useSharedStore: (selector, options) => useSharedStore(selector, { ...options, store: busName(options?.store) }),
|
|
507
|
+
usePeers: (options) => usePeers({ ...options, name: busName(options?.name) }),
|
|
508
|
+
usePresenceMetadata: (metadata, options) => usePresenceMetadata(metadata, { ...options, name: busName(options?.name) }),
|
|
509
|
+
useHydrated: (options) => useHydrated({ ...options, store: busName(options?.store) }),
|
|
510
|
+
useClientId: (options) => useClientId({ name: busName(options?.name) }),
|
|
511
|
+
useLeader: (options) => useLeader({ ...options, name: busName(options?.name) }),
|
|
512
|
+
useIsLeader: (options) => useIsLeader({ ...options, name: busName(options?.name) }),
|
|
513
|
+
useLeaderEffect: (effect, options) => useLeaderEffect(effect, { ...options, name: busName(options?.name) })
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
// src/use-opened-window.ts
|
|
518
|
+
var import_react8 = require("react");
|
|
519
|
+
var import_core3 = require("@use-everywhere/core");
|
|
342
520
|
var IDLE = Object.freeze({
|
|
343
521
|
status: "idle",
|
|
344
522
|
result: void 0,
|
|
345
523
|
error: void 0
|
|
346
524
|
});
|
|
347
525
|
function useOpenedWindow(factory) {
|
|
348
|
-
const [state, setState] = (0,
|
|
349
|
-
const current = (0,
|
|
350
|
-
const factoryRef = (0,
|
|
351
|
-
(0,
|
|
526
|
+
const [state, setState] = (0, import_react8.useState)(IDLE);
|
|
527
|
+
const current = (0, import_react8.useRef)(null);
|
|
528
|
+
const factoryRef = (0, import_react8.useRef)(factory);
|
|
529
|
+
(0, import_react8.useEffect)(() => {
|
|
352
530
|
factoryRef.current = factory;
|
|
353
531
|
});
|
|
354
|
-
const open = (0,
|
|
532
|
+
const open = (0, import_react8.useCallback)(() => {
|
|
355
533
|
current.current?.close();
|
|
356
534
|
let opened;
|
|
357
535
|
try {
|
|
@@ -381,20 +559,20 @@ function useOpenedWindow(factory) {
|
|
|
381
559
|
(err) => {
|
|
382
560
|
if (!fresh()) return;
|
|
383
561
|
setState(
|
|
384
|
-
err instanceof
|
|
562
|
+
err instanceof import_core3.WindowClosedError ? { status: "closed-early", result: void 0, error: err } : { status: "error", result: void 0, error: err }
|
|
385
563
|
);
|
|
386
564
|
}
|
|
387
565
|
);
|
|
388
566
|
}, []);
|
|
389
|
-
const post = (0,
|
|
567
|
+
const post = (0, import_react8.useCallback)((type, payload) => {
|
|
390
568
|
current.current?.post(type, payload);
|
|
391
569
|
}, []);
|
|
392
|
-
const close = (0,
|
|
570
|
+
const close = (0, import_react8.useCallback)(() => current.current?.close(), []);
|
|
393
571
|
return { ...state, open, post, close };
|
|
394
572
|
}
|
|
395
573
|
|
|
396
574
|
// src/index.ts
|
|
397
|
-
var
|
|
575
|
+
var import_core4 = require("@use-everywhere/core");
|
|
398
576
|
// Annotate the CommonJS export names for ESM import in node:
|
|
399
577
|
0 && (module.exports = {
|
|
400
578
|
BroadcastChannelTransport,
|
|
@@ -403,11 +581,14 @@ var import_core3 = require("@use-everywhere/core");
|
|
|
403
581
|
HandshakeTimeoutError,
|
|
404
582
|
NoopTransport,
|
|
405
583
|
StorageTransport,
|
|
584
|
+
WIRE_VERSION,
|
|
406
585
|
WindowClosedError,
|
|
407
586
|
connectToOpener,
|
|
408
587
|
createChannel,
|
|
409
588
|
createLeader,
|
|
589
|
+
createNamespace,
|
|
410
590
|
createPresence,
|
|
591
|
+
createSharedReducer,
|
|
411
592
|
createSharedStore,
|
|
412
593
|
defaultTransport,
|
|
413
594
|
defineChannel,
|
|
@@ -417,22 +598,32 @@ var import_core3 = require("@use-everywhere/core");
|
|
|
417
598
|
getLeader,
|
|
418
599
|
getSharedStore,
|
|
419
600
|
getTransportKind,
|
|
601
|
+
getWireSkew,
|
|
602
|
+
indexedDbAdapter,
|
|
420
603
|
isBroadcastChannelAvailable,
|
|
421
604
|
isStorageEventAvailable,
|
|
605
|
+
jsonSerializer,
|
|
422
606
|
localStorageAdapter,
|
|
423
607
|
newer,
|
|
424
608
|
observeBus,
|
|
425
609
|
openWindow,
|
|
426
610
|
sessionStorageAdapter,
|
|
611
|
+
shallowEqual,
|
|
612
|
+
useAnswer,
|
|
613
|
+
useAsk,
|
|
427
614
|
useChannel,
|
|
428
615
|
useClientId,
|
|
616
|
+
useHydrated,
|
|
429
617
|
useIsLeader,
|
|
430
618
|
useLeader,
|
|
431
619
|
useLeaderEffect,
|
|
432
620
|
useMessage,
|
|
433
621
|
useOpenedWindow,
|
|
434
622
|
usePeers,
|
|
623
|
+
usePresenceMetadata,
|
|
435
624
|
useSend,
|
|
625
|
+
useSharedReducer,
|
|
436
626
|
useSharedState,
|
|
627
|
+
useSharedStore,
|
|
437
628
|
webStorageAdapter
|
|
438
629
|
});
|