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/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: () => import_core3.BroadcastChannelTransport,
25
- CID_PARAM: () => import_core3.CID_PARAM,
24
+ BroadcastChannelTransport: () => import_core4.BroadcastChannelTransport,
25
+ CID_PARAM: () => import_core4.CID_PARAM,
26
26
  DEFAULT_NAME: () => import_core.DEFAULT_NAME,
27
- HandshakeTimeoutError: () => import_core3.HandshakeTimeoutError,
28
- NoopTransport: () => import_core3.NoopTransport,
29
- StorageTransport: () => import_core3.StorageTransport,
30
- WindowClosedError: () => import_core3.WindowClosedError,
31
- connectToOpener: () => import_core3.connectToOpener,
32
- createChannel: () => import_core3.createChannel,
33
- createLeader: () => import_core3.createLeader,
34
- createPresence: () => import_core3.createPresence,
35
- createSharedStore: () => import_core3.createSharedStore,
36
- defaultTransport: () => import_core3.defaultTransport,
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: () => import_core3.enableDebug,
40
- getBusNames: () => import_core3.getBusNames,
42
+ enableDebug: () => import_core4.enableDebug,
43
+ getBusNames: () => import_core4.getBusNames,
41
44
  getLeader: () => getLeader,
42
45
  getSharedStore: () => getSharedStore,
43
- getTransportKind: () => import_core3.getTransportKind,
44
- isBroadcastChannelAvailable: () => import_core3.isBroadcastChannelAvailable,
45
- isStorageEventAvailable: () => import_core3.isStorageEventAvailable,
46
- localStorageAdapter: () => import_core3.localStorageAdapter,
47
- newer: () => import_core3.newer,
48
- observeBus: () => import_core3.observeBus,
49
- openWindow: () => import_core3.openWindow,
50
- sessionStorageAdapter: () => import_core3.sessionStorageAdapter,
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
- webStorageAdapter: () => import_core3.webStorageAdapter
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
- devWarn(
163
- `[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.`
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
- let presence = presences.get(name);
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(name, presence);
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] leader "${name}": ${key} ignored \u2014 the first useLeader/getLeader call fixes the election timings for this tab.`
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
- warnOnInitialMismatch(storeName, key, initial);
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-message.ts
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, import_react2.useRef)(handler);
243
- (0, import_react2.useEffect)(() => {
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
- (0, import_react2.useEffect)(
247
- () => channel.on(type, (payload, meta) => handlerRef.current(payload, meta)),
248
- [channel, type]
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 import_react3 = require("react");
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, import_react3.useSyncExternalStore)(
290
- (0, import_react3.useCallback)((onChange) => presence.subscribe(onChange), [presence]),
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, import_react3.useSyncExternalStore)(
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, import_react3.useCallback)(() => () => {
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 import_react4 = require("react");
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, import_react4.useEffect)(() => {
470
+ (0, import_react7.useEffect)(() => {
315
471
  if (eligible === void 0) return;
316
472
  leader.setEligible(eligible);
317
473
  }, [leader, eligible]);
318
- return (0, import_react4.useSyncExternalStore)(
319
- (0, import_react4.useCallback)((onChange) => leader.subscribe(onChange), [leader]),
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, import_react4.useRef)(effect);
330
- (0, import_react4.useEffect)(() => {
485
+ const effectRef = (0, import_react7.useRef)(effect);
486
+ (0, import_react7.useEffect)(() => {
331
487
  effectRef.current = effect;
332
488
  });
333
- (0, import_react4.useEffect)(() => {
489
+ (0, import_react7.useEffect)(() => {
334
490
  if (!isLeader) return;
335
491
  return effectRef.current();
336
492
  }, [isLeader]);
337
493
  }
338
494
 
339
- // src/use-opened-window.ts
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, import_react5.useState)(IDLE);
349
- const current = (0, import_react5.useRef)(null);
350
- const factoryRef = (0, import_react5.useRef)(factory);
351
- (0, import_react5.useEffect)(() => {
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, import_react5.useCallback)(() => {
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 import_core2.WindowClosedError ? { status: "closed-early", result: void 0, error: err } : { status: "error", result: void 0, error: err }
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, import_react5.useCallback)((type, payload) => {
567
+ const post = (0, import_react8.useCallback)((type, payload) => {
390
568
  current.current?.post(type, payload);
391
569
  }, []);
392
- const close = (0, import_react5.useCallback)(() => current.current?.close(), []);
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 import_core3 = require("@use-everywhere/core");
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
  });