steddy 0.1.0 → 0.1.1

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/README.md CHANGED
@@ -45,7 +45,7 @@ focusRevalidate(defaultCoordinator);
45
45
  clear("user");
46
46
  ```
47
47
 
48
- Need an isolated cache (tests, multiple trees, SSR): wrap with `SteddyProvider` and pass `createStore()` + `createCoordinator(store)`, or `createRuntime()`. Pass `cache={dump(store)}` across an RSC boundary. `{ suspense: true }` throws the in-flight waiter. `useSteddyInfinite` keeps one cache entry per page. `ttlEvict` drops unused keys.
48
+ Need an isolated cache (tests, multiple trees, SSR): wrap with `SteddyProvider` and pass `createStore()` + `createCoordinator(store)`, or `createRuntime()`. Pass `cache={dump(store)}` across an RSC boundary. `{ suspense: true }` throws the in-flight waiter. `{ keepPreviousData: true }` keeps the last value on screen while a new key loads. `useSteddyInfinite` keeps one cache entry per page; `mutate` writes every page, and `getKey` stops when a later page would reuse an earlier key. `ttlEvict` drops unused keys.
49
49
 
50
50
  ## Architecture
51
51
 
@@ -55,7 +55,7 @@ plugins → coordinator → store
55
55
  hooks
56
56
  ```
57
57
 
58
- A new request for the same key **aborts** the in-flight one. Aborted requests do not write to the store. Optimistic `mutate` rolls back on error by default.
58
+ A new request for the same key **aborts** the in-flight one. Aborted requests do not write to the store. The last subscriber’s unmount delays that abort by a tick so a remount can reuse the waiter. Optimistic `mutate` rolls back on error by default.
59
59
 
60
60
  ## License
61
61
 
package/dist/index.cjs CHANGED
@@ -7,13 +7,23 @@ var jsxRuntime = require('react/jsx-runtime');
7
7
 
8
8
  // src/coordinator.ts
9
9
  var DEDUP_WINDOW_MS = 2e3;
10
+ var UNSUBSCRIBE_GRACE_MS = 0;
10
11
  function isAbortError(error) {
11
12
  return typeof DOMException !== "undefined" && error instanceof DOMException && error.name === "AbortError" || error instanceof Error && error.name === "AbortError";
12
13
  }
13
14
  function createCoordinator(store) {
14
15
  const registered = /* @__PURE__ */ new Map();
15
16
  const inflight = /* @__PURE__ */ new Map();
17
+ const releaseTimers = /* @__PURE__ */ new Map();
16
18
  let generation = 0;
19
+ function cancelRelease(serializedKey) {
20
+ const timer = releaseTimers.get(serializedKey);
21
+ if (timer == null) {
22
+ return;
23
+ }
24
+ clearTimeout(timer);
25
+ releaseTimers.delete(serializedKey);
26
+ }
17
27
  function abortInternal(serializedKey, markIdle) {
18
28
  const current = inflight.get(serializedKey);
19
29
  if (!current) {
@@ -31,11 +41,25 @@ function createCoordinator(store) {
31
41
  }
32
42
  const coordinator = {
33
43
  register(serializedKey, key, fetcher) {
44
+ cancelRelease(serializedKey);
34
45
  registered.set(serializedKey, { key, fetcher });
35
46
  },
36
47
  unregister(serializedKey) {
48
+ cancelRelease(serializedKey);
37
49
  registered.delete(serializedKey);
38
50
  },
51
+ scheduleRelease(serializedKey) {
52
+ cancelRelease(serializedKey);
53
+ const timer = setTimeout(() => {
54
+ releaseTimers.delete(serializedKey);
55
+ if (store.subscriberCount(serializedKey) > 0) {
56
+ return;
57
+ }
58
+ abortInternal(serializedKey, true);
59
+ registered.delete(serializedKey);
60
+ }, UNSUBSCRIBE_GRACE_MS);
61
+ releaseTimers.set(serializedKey, timer);
62
+ },
39
63
  async revalidate(serializedKey, fetcher, options) {
40
64
  if (!options?.force) {
41
65
  const entry = store.get(serializedKey);
@@ -117,6 +141,7 @@ function createCoordinator(store) {
117
141
  return [...registered.keys()];
118
142
  },
119
143
  abort(serializedKey) {
144
+ cancelRelease(serializedKey);
120
145
  abortInternal(serializedKey, true);
121
146
  },
122
147
  evict(options) {
@@ -155,6 +180,7 @@ function createCoordinator(store) {
155
180
  }
156
181
  }
157
182
  for (const key of victims) {
183
+ cancelRelease(key);
158
184
  abortInternal(key, false);
159
185
  registered.delete(key);
160
186
  store.delete(key);
@@ -162,6 +188,9 @@ function createCoordinator(store) {
162
188
  return [...victims];
163
189
  },
164
190
  reset() {
191
+ for (const key of [...releaseTimers.keys()]) {
192
+ cancelRelease(key);
193
+ }
165
194
  for (const key of [...inflight.keys()]) {
166
195
  abortInternal(key, false);
167
196
  }
@@ -466,8 +495,7 @@ function useSteddy(key, fetcher, options) {
466
495
  return () => {
467
496
  unsubscribe();
468
497
  if (store.subscriberCount(serialized) === 0) {
469
- coordinator.abort(serialized);
470
- coordinator.unregister(serialized);
498
+ coordinator.scheduleRelease(serialized);
471
499
  }
472
500
  };
473
501
  },
@@ -489,26 +517,38 @@ function useSteddy(key, fetcher, options) {
489
517
  },
490
518
  [runtimeMutate]
491
519
  );
520
+ const keepPreviousData = options?.keepPreviousData === true;
521
+ const previousRef = react.useRef(
522
+ void 0
523
+ );
524
+ if (serialized != null && snapshot.data !== void 0) {
525
+ previousRef.current = { serialized, data: snapshot.data };
526
+ }
527
+ const data = keepPreviousData && serialized != null && snapshot.data === void 0 && snapshot.error == null && previousRef.current != null && previousRef.current.serialized !== serialized ? previousRef.current.data : snapshot.data;
492
528
  if (options?.suspense && serialized != null) {
493
529
  if (snapshot.error != null) {
494
530
  throw snapshot.error;
495
531
  }
496
- if (snapshot.data === void 0) {
532
+ if (snapshot.data === void 0 && data === void 0) {
497
533
  const waiter = coordinator.getInFlightPromise(serialized) ?? coordinator.revalidate(serialized).catch(() => {
498
534
  });
499
535
  throw waiter;
500
536
  }
501
537
  }
502
538
  return {
503
- data: snapshot.data,
539
+ data,
504
540
  error: snapshot.error,
505
- isLoading: serialized != null && snapshot.data === void 0 && snapshot.error == null,
541
+ isLoading: serialized != null && data === void 0 && snapshot.error == null,
506
542
  isValidating: snapshot.isValidating,
507
543
  mutate: boundMutate
508
544
  };
509
545
  }
546
+ function isThenable2(value) {
547
+ return typeof value === "object" && value !== null && typeof value.then === "function";
548
+ }
510
549
  function collectPages(getKey, getData, size) {
511
550
  const pages = [];
551
+ const seen = /* @__PURE__ */ new Set();
512
552
  let previous;
513
553
  for (let index = 0; index < size; index++) {
514
554
  const key = getKey(index, previous);
@@ -516,13 +556,17 @@ function collectPages(getKey, getData, size) {
516
556
  break;
517
557
  }
518
558
  const serialized = serializeKey(key);
559
+ if (seen.has(serialized)) {
560
+ break;
561
+ }
562
+ seen.add(serialized);
519
563
  pages.push({ key, serialized });
520
564
  previous = getData(serialized);
521
565
  }
522
566
  return pages;
523
567
  }
524
568
  function useSteddyInfinite(getKey, fetcher, options) {
525
- const { store, coordinator, mutate: runtimeMutate } = useSteddyRuntime();
569
+ const { store, coordinator } = useSteddyRuntime();
526
570
  const [size, setSizeState] = react.useState(options?.initialSize ?? 1);
527
571
  const fetcherRef = react.useRef(fetcher);
528
572
  fetcherRef.current = fetcher;
@@ -564,8 +608,7 @@ function useSteddyInfinite(getKey, fetcher, options) {
564
608
  for (const [index, page] of currentPages.entries()) {
565
609
  unsubscribes[index]?.();
566
610
  if (store.subscriberCount(page.serialized) === 0) {
567
- coordinator.abort(page.serialized);
568
- coordinator.unregister(page.serialized);
611
+ coordinator.scheduleRelease(page.serialized);
569
612
  }
570
613
  }
571
614
  };
@@ -628,32 +671,71 @@ function useSteddyInfinite(getKey, fetcher, options) {
628
671
  );
629
672
  const boundMutate = react.useCallback(
630
673
  async (updater, mutateOptions) => {
674
+ const revalidate = mutateOptions?.revalidate ?? true;
675
+ const rollbackOnError = mutateOptions?.rollbackOnError ?? true;
631
676
  const currentPages = collectPages(
632
677
  getKeyRef.current,
633
678
  (serialized) => store.get(serialized)?.data,
634
679
  size
635
680
  );
636
- const first2 = currentPages[0];
637
- if (!first2) {
681
+ if (currentPages.length === 0) {
638
682
  return void 0;
639
683
  }
640
- if (updater !== void 0 && typeof updater !== "function") {
641
- const pagesValue = updater;
642
- const firstPage = pagesValue[0];
643
- if (firstPage !== void 0) {
644
- await runtimeMutate(first2.key, firstPage, mutateOptions);
684
+ const previous = currentPages.map((page) => ({
685
+ serialized: page.serialized,
686
+ entry: store.get(page.serialized)
687
+ }));
688
+ const restore = () => {
689
+ for (const item of previous) {
690
+ if (item.entry === void 0) {
691
+ store.delete(item.serialized);
692
+ } else {
693
+ store.set(item.serialized, item.entry);
694
+ }
695
+ }
696
+ };
697
+ try {
698
+ const loaded = [];
699
+ for (const page of currentPages) {
700
+ const pageData = store.get(page.serialized)?.data;
701
+ if (pageData === void 0) {
702
+ break;
703
+ }
704
+ loaded.push(pageData);
645
705
  }
646
- return pagesValue;
706
+ const current = loaded.length === 0 ? void 0 : loaded;
707
+ const next = typeof updater === "function" ? updater(current) : updater;
708
+ const resolved = isThenable2(next) ? await next : next;
709
+ const pagesValue = resolved;
710
+ for (const [index, page] of currentPages.entries()) {
711
+ if (index >= pagesValue.length) {
712
+ break;
713
+ }
714
+ store.set(page.serialized, {
715
+ data: pagesValue[index],
716
+ error: void 0,
717
+ timestamp: Date.now(),
718
+ isValidating: revalidate
719
+ });
720
+ }
721
+ if (revalidate) {
722
+ await Promise.all(
723
+ currentPages.map(
724
+ (page) => coordinator.revalidate(page.serialized, void 0, {
725
+ force: true
726
+ })
727
+ )
728
+ );
729
+ }
730
+ return currentPages.map((page) => store.get(page.serialized)?.data).filter((page) => page !== void 0);
731
+ } catch (error) {
732
+ if (rollbackOnError) {
733
+ restore();
734
+ }
735
+ throw error;
647
736
  }
648
- await Promise.all(
649
- currentPages.map(
650
- (page) => coordinator.revalidate(page.serialized, void 0, { force: true }).catch(() => {
651
- })
652
- )
653
- );
654
- return currentPages.map((page) => store.get(page.serialized)?.data).filter((page) => page !== void 0);
655
737
  },
656
- [coordinator, runtimeMutate, size, store]
738
+ [coordinator, size, store]
657
739
  );
658
740
  const first = pages[0];
659
741
  const firstEntry = first ? store.getSnapshot(first.serialized) : void 0;
@@ -763,6 +845,7 @@ function ttlEvict(coordinator, options) {
763
845
 
764
846
  exports.DEDUP_WINDOW_MS = DEDUP_WINDOW_MS;
765
847
  exports.SteddyProvider = SteddyProvider;
848
+ exports.UNSUBSCRIBE_GRACE_MS = UNSUBSCRIBE_GRACE_MS;
766
849
  exports.clear = clear;
767
850
  exports.createCoordinator = createCoordinator;
768
851
  exports.createMutate = createMutate;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/coordinator.ts","../src/store.ts","../src/defaults.ts","../src/key.ts","../src/mutate.ts","../src/context.tsx","../src/useSteddy.ts","../src/useSteddyInfinite.ts","../src/plugins/focus.ts","../src/plugins/reconnect.ts","../src/plugins/polling.ts","../src/plugins/retry.ts","../src/plugins/ttl.ts"],"names":["mutate","createContext","useMemo","jsx","useContext","useRef","useCallback","useSyncExternalStore","useState","first","isAbortError"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { EvictOptions, Fetcher, Key } from \"./types\";\nimport type { Store } from \"./store\";\n\nexport const DEDUP_WINDOW_MS = 2000;\n\nexport type RevalidateOptions = {\n force?: boolean;\n};\n\nexport type Coordinator = {\n register(serializedKey: string, key: Key, fetcher: Fetcher<unknown>): void;\n unregister(serializedKey: string): void;\n revalidate(\n serializedKey: string,\n fetcher?: Fetcher<unknown>,\n options?: RevalidateOptions,\n ): Promise<void>;\n isInFlight(serializedKey: string): boolean;\n getInFlightPromise(serializedKey: string): Promise<void> | undefined;\n getRegisteredKeys(): string[];\n abort(serializedKey: string): void;\n evict(options: EvictOptions): string[];\n reset(): void;\n};\n\ntype InFlight = {\n controller: AbortController;\n generation: number;\n waiter: Promise<void>;\n settle: () => void;\n};\n\nfunction isAbortError(error: unknown): boolean {\n return (\n (typeof DOMException !== \"undefined\" &&\n error instanceof DOMException &&\n error.name === \"AbortError\") ||\n (error instanceof Error && error.name === \"AbortError\")\n );\n}\n\nexport function createCoordinator(store: Store): Coordinator {\n const registered = new Map<\n string,\n { key: Key; fetcher: Fetcher<unknown> }\n >();\n const inflight = new Map<string, InFlight>();\n let generation = 0;\n\n function abortInternal(serializedKey: string, markIdle: boolean): void {\n const current = inflight.get(serializedKey);\n if (!current) {\n return;\n }\n current.controller.abort();\n current.settle();\n inflight.delete(serializedKey);\n if (markIdle) {\n const entry = store.get(serializedKey);\n if (entry?.isValidating) {\n store.set(serializedKey, { ...entry, isValidating: false });\n }\n }\n }\n\n const coordinator: Coordinator = {\n register(serializedKey, key, fetcher) {\n registered.set(serializedKey, { key, fetcher });\n },\n\n unregister(serializedKey) {\n registered.delete(serializedKey);\n },\n\n async revalidate(serializedKey, fetcher, options) {\n if (!options?.force) {\n const entry = store.get(serializedKey);\n if (\n entry &&\n !entry.isValidating &&\n entry.error == null &&\n entry.data !== undefined &&\n Date.now() - entry.timestamp < DEDUP_WINDOW_MS\n ) {\n return;\n }\n }\n\n abortInternal(serializedKey, false);\n\n const record = registered.get(serializedKey);\n const key = record?.key ?? serializedKey;\n const run = fetcher ?? record?.fetcher;\n if (!run) {\n return;\n }\n\n const controller = new AbortController();\n const currentGeneration = ++generation;\n let settled = false;\n let settleWaiter!: () => void;\n const waiter = new Promise<void>((resolve) => {\n settleWaiter = resolve;\n });\n const settle = (): void => {\n if (!settled) {\n settled = true;\n settleWaiter();\n }\n };\n inflight.set(serializedKey, {\n controller,\n generation: currentGeneration,\n waiter,\n settle,\n });\n\n const previous = store.get(serializedKey);\n store.set(serializedKey, {\n data: previous?.data,\n error: previous?.error,\n timestamp: previous?.timestamp ?? 0,\n isValidating: true,\n });\n\n try {\n const data = await run(key, { signal: controller.signal });\n const stillCurrent =\n inflight.get(serializedKey)?.generation === currentGeneration;\n if (!stillCurrent || controller.signal.aborted) {\n return;\n }\n inflight.delete(serializedKey);\n store.set(serializedKey, {\n data,\n error: undefined,\n timestamp: Date.now(),\n isValidating: false,\n });\n } catch (error) {\n const stillCurrent =\n inflight.get(serializedKey)?.generation === currentGeneration;\n if (!stillCurrent || controller.signal.aborted || isAbortError(error)) {\n return;\n }\n inflight.delete(serializedKey);\n const current = store.get(serializedKey);\n store.set(serializedKey, {\n data: current?.data,\n error,\n timestamp: current?.timestamp ?? 0,\n isValidating: false,\n });\n throw error;\n } finally {\n settle();\n }\n },\n\n isInFlight(serializedKey) {\n return inflight.has(serializedKey);\n },\n\n getInFlightPromise(serializedKey) {\n return inflight.get(serializedKey)?.waiter;\n },\n\n getRegisteredKeys() {\n return [...registered.keys()];\n },\n\n abort(serializedKey) {\n abortInternal(serializedKey, true);\n },\n\n evict(options) {\n const now = Date.now();\n const removable: { key: string; timestamp: number }[] = [];\n for (const key of store.keys()) {\n if (inflight.has(key) || store.subscriberCount(key) > 0) {\n continue;\n }\n const entry = store.get(key);\n if (!entry) {\n continue;\n }\n removable.push({ key, timestamp: entry.timestamp });\n }\n\n const victims = new Set<string>();\n if (options.maxAge != null) {\n for (const item of removable) {\n if (now - item.timestamp >= options.maxAge) {\n victims.add(item.key);\n }\n }\n }\n\n if (options.maxKeys != null) {\n const liveCount = store.keys().filter((key) => !victims.has(key)).length;\n let over = liveCount - options.maxKeys;\n if (over > 0) {\n const extra = removable\n .filter((item) => !victims.has(item.key))\n .sort((a, b) => a.timestamp - b.timestamp);\n for (const item of extra) {\n if (over <= 0) {\n break;\n }\n victims.add(item.key);\n over -= 1;\n }\n }\n }\n\n for (const key of victims) {\n abortInternal(key, false);\n registered.delete(key);\n store.delete(key);\n }\n return [...victims];\n },\n\n reset() {\n for (const key of [...inflight.keys()]) {\n abortInternal(key, false);\n }\n registered.clear();\n },\n };\n\n return coordinator;\n}\n","import type { CacheEntry } from \"./types\";\n\n/**\n * Dumb key-value store with per-key subscriptions.\n * Hard rule: this file must not import network requests, timers, or browser events.\n */\nexport type Store = {\n get(key: string): CacheEntry | undefined;\n set(key: string, entry: CacheEntry): void;\n delete(key: string): void;\n subscribe(key: string, callback: () => void): () => void;\n getSnapshot(key: string): CacheEntry;\n subscriberCount(key: string): number;\n keys(): string[];\n clear(): void;\n};\n\nexport const EMPTY_SNAPSHOT: CacheEntry = Object.freeze({\n data: undefined,\n error: undefined,\n timestamp: 0,\n isValidating: false,\n});\n\nexport function createStore(): Store {\n const entries = new Map<string, CacheEntry>();\n const listeners = new Map<string, Set<() => void>>();\n\n function emit(key: string): void {\n const subs = listeners.get(key);\n if (!subs) {\n return;\n }\n for (const callback of subs) {\n callback();\n }\n }\n\n return {\n get(key) {\n return entries.get(key);\n },\n\n set(key, entry) {\n entries.set(key, entry);\n emit(key);\n },\n\n delete(key) {\n const existed = entries.delete(key);\n if (existed) {\n emit(key);\n }\n },\n\n subscribe(key, callback) {\n let subs = listeners.get(key);\n if (!subs) {\n subs = new Set();\n listeners.set(key, subs);\n }\n subs.add(callback);\n return () => {\n const current = listeners.get(key);\n if (!current) {\n return;\n }\n current.delete(callback);\n if (current.size === 0) {\n listeners.delete(key);\n }\n };\n },\n\n getSnapshot(key) {\n return entries.get(key) ?? EMPTY_SNAPSHOT;\n },\n\n subscriberCount(key) {\n return listeners.get(key)?.size ?? 0;\n },\n\n keys() {\n return [...entries.keys()];\n },\n\n clear() {\n const keys = new Set([...entries.keys(), ...listeners.keys()]);\n entries.clear();\n for (const key of keys) {\n emit(key);\n }\n },\n };\n}\n","import { createCoordinator } from \"./coordinator\";\nimport { createStore } from \"./store\";\n\nexport const defaultStore = createStore();\nexport const defaultCoordinator = createCoordinator(defaultStore);\n","import type { Key } from \"./types\";\n\nexport function serializeKey(key: Key): string {\n if (typeof key === \"string\") {\n return key;\n }\n return JSON.stringify(key);\n}\n\nexport function keysShallowEqual(a: Key | null, b: Key | null): boolean {\n if (a === b) {\n return true;\n }\n if (a == null || b == null) {\n return false;\n }\n if (typeof a === \"string\" || typeof b === \"string\") {\n return a === b;\n }\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (!Object.is(a[i], b[i])) {\n return false;\n }\n }\n return true;\n}\n","import type { Coordinator } from \"./coordinator\";\nimport { defaultCoordinator, defaultStore } from \"./defaults\";\nimport { serializeKey } from \"./key\";\nimport type { Store } from \"./store\";\nimport type { Key, MutateOptions, MutateUpdater } from \"./types\";\n\nfunction isThenable<T>(value: T | Promise<T>): value is Promise<T> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as Promise<T>).then === \"function\"\n );\n}\n\nexport function createMutate(store: Store, coordinator: Coordinator) {\n return async function mutate<T>(\n key: Key,\n updater: MutateUpdater<T>,\n options?: MutateOptions,\n ): Promise<T | undefined> {\n const revalidate = options?.revalidate ?? true;\n const rollbackOnError = options?.rollbackOnError ?? true;\n const serialized = serializeKey(key);\n const previous = store.get(serialized);\n\n const restore = (): void => {\n if (previous === undefined) {\n store.delete(serialized);\n } else {\n store.set(serialized, previous);\n }\n };\n\n try {\n const currentData = previous?.data as T | undefined;\n const next =\n typeof updater === \"function\"\n ? (updater as (current: T | undefined) => T | Promise<T>)(currentData)\n : updater;\n\n if (isThenable(next)) {\n store.set(serialized, {\n data: currentData,\n error: previous?.error,\n timestamp: previous?.timestamp ?? 0,\n isValidating: true,\n });\n const resolved = await next;\n store.set(serialized, {\n data: resolved,\n error: undefined,\n timestamp: Date.now(),\n isValidating: revalidate,\n });\n } else {\n store.set(serialized, {\n data: next,\n error: undefined,\n timestamp: Date.now(),\n isValidating: revalidate,\n });\n }\n\n if (revalidate) {\n await coordinator.revalidate(serialized, undefined, { force: true });\n }\n\n return store.get(serialized)?.data as T | undefined;\n } catch (error) {\n if (rollbackOnError) {\n restore();\n } else {\n const current = store.get(serialized);\n store.set(serialized, {\n data: current?.data,\n error,\n timestamp: current?.timestamp ?? Date.now(),\n isValidating: false,\n });\n }\n throw error;\n }\n };\n}\n\nexport const mutate = createMutate(defaultStore, defaultCoordinator);\n","import { createCoordinator, type Coordinator } from \"./coordinator\";\nimport { createMutate } from \"./mutate\";\nimport { defaultCoordinator, defaultStore } from \"./defaults\";\nimport { createStore, type Store } from \"./store\";\nimport type { CacheSnapshot, Key } from \"./types\";\nimport { serializeKey } from \"./key\";\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\";\n\nexport type SteddyRuntime = {\n store: Store;\n coordinator: Coordinator;\n mutate: ReturnType<typeof createMutate>;\n};\n\nexport function createRuntime(): SteddyRuntime {\n const store = createStore();\n const coordinator = createCoordinator(store);\n return {\n store,\n coordinator,\n mutate: createMutate(store, coordinator),\n };\n}\n\nconst defaultRuntime: SteddyRuntime = {\n store: defaultStore,\n coordinator: defaultCoordinator,\n mutate: createMutate(defaultStore, defaultCoordinator),\n};\n\nconst SteddyContext = createContext<SteddyRuntime>(defaultRuntime);\n\nexport function SteddyProvider({\n store,\n coordinator,\n cache,\n children,\n}: {\n store: Store;\n coordinator: Coordinator;\n cache?: CacheSnapshot;\n children: ReactNode;\n}) {\n const value = useMemo<SteddyRuntime>(() => {\n if (cache) {\n hydrateAll(cache, store);\n }\n return {\n store,\n coordinator,\n mutate: createMutate(store, coordinator),\n };\n }, [store, coordinator, cache]);\n return <SteddyContext.Provider value={value}>{children}</SteddyContext.Provider>;\n}\n\nexport function useSteddyRuntime(): SteddyRuntime {\n return useContext(SteddyContext);\n}\n\n/** Seed the cache so the next render can show data immediately. Timestamp is 0 so mount still revalidates. */\nexport function hydrate<T>(key: Key, data: T, store: Store = defaultStore): void {\n store.set(serializeKey(key), {\n data,\n error: undefined,\n timestamp: 0,\n isValidating: false,\n });\n}\n\n/** JSON-safe cache payload for SSR / RSC client boundaries. Errors and in-flight flags are omitted. */\nexport function dump(store: Store = defaultStore): CacheSnapshot {\n const snapshot: Record<string, { data: unknown; timestamp: number }> = {};\n for (const key of store.keys()) {\n const entry = store.get(key);\n if (!entry || entry.data === undefined) {\n continue;\n }\n snapshot[key] = { data: entry.data, timestamp: entry.timestamp };\n }\n return snapshot;\n}\n\n/** Restore a dumped snapshot. Timestamps are 0 so the client still revalidates. */\nexport function hydrateAll(\n snapshot: CacheSnapshot,\n store: Store = defaultStore,\n): void {\n for (const [key, payload] of Object.entries(snapshot)) {\n store.set(key, {\n data: payload.data,\n error: undefined,\n timestamp: 0,\n isValidating: false,\n });\n }\n}\n\n/** Drop one key, or the whole cache. Aborts in-flight work for deleted keys. */\nexport function clear(\n key?: Key,\n runtime: Pick<SteddyRuntime, \"store\" | \"coordinator\"> = defaultRuntime,\n): void {\n if (key === undefined) {\n for (const active of runtime.coordinator.getRegisteredKeys()) {\n runtime.coordinator.abort(active);\n }\n runtime.coordinator.reset();\n runtime.store.clear();\n return;\n }\n const serialized = serializeKey(key);\n runtime.coordinator.abort(serialized);\n runtime.coordinator.unregister(serialized);\n runtime.store.delete(serialized);\n}\n","import { useCallback, useRef, useSyncExternalStore } from \"react\";\nimport { useSteddyRuntime } from \"./context\";\nimport { keysShallowEqual, serializeKey } from \"./key\";\nimport { EMPTY_SNAPSHOT } from \"./store\";\nimport type {\n Fetcher,\n Key,\n MutateFn,\n UseSteddyOptions,\n UseSteddyResult,\n} from \"./types\";\n\nfunction useSerializedKey(key: Key | null): string | null {\n const prevKey = useRef<Key | null>(null);\n const prevSerialized = useRef<string | null>(null);\n if (key == null) {\n prevKey.current = null;\n prevSerialized.current = null;\n return null;\n }\n if (\n prevSerialized.current != null &&\n keysShallowEqual(prevKey.current, key)\n ) {\n return prevSerialized.current;\n }\n prevKey.current = key;\n prevSerialized.current = serializeKey(key);\n return prevSerialized.current;\n}\n\nexport function useSteddy<T>(\n key: Key | null,\n fetcher: Fetcher<T>,\n options?: UseSteddyOptions,\n): UseSteddyResult<T> {\n const { store, coordinator, mutate: runtimeMutate } = useSteddyRuntime();\n const serialized = useSerializedKey(key);\n const fetcherRef = useRef(fetcher);\n fetcherRef.current = fetcher;\n const keyRef = useRef(key);\n keyRef.current = key;\n\n if (serialized != null && key != null) {\n coordinator.register(serialized, key, (k, ctx) =>\n fetcherRef.current(k, ctx),\n );\n }\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n if (serialized == null || keyRef.current == null) {\n return () => {};\n }\n const originalKey = keyRef.current;\n coordinator.register(serialized, originalKey, (k, ctx) =>\n fetcherRef.current(k, ctx),\n );\n const unsubscribe = store.subscribe(serialized, onStoreChange);\n if (!coordinator.isInFlight(serialized)) {\n void coordinator.revalidate(serialized).catch(() => {});\n }\n return () => {\n unsubscribe();\n if (store.subscriberCount(serialized) === 0) {\n coordinator.abort(serialized);\n coordinator.unregister(serialized);\n }\n };\n },\n [serialized, store, coordinator],\n );\n\n const getSnapshot = useCallback(() => {\n if (serialized == null) {\n return EMPTY_SNAPSHOT;\n }\n return store.getSnapshot(serialized);\n }, [serialized, store]);\n\n // Same snapshot on the server so a dumped cache can render without a mismatch.\n // Source: https://react.dev/reference/react/useSyncExternalStore\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n const boundMutate = useCallback<MutateFn<T>>(\n (updater, mutateOptions) => {\n if (keyRef.current == null) {\n return Promise.resolve(undefined);\n }\n return runtimeMutate(keyRef.current, updater, mutateOptions);\n },\n [runtimeMutate],\n );\n\n if (options?.suspense && serialized != null) {\n if (snapshot.error != null) {\n throw snapshot.error;\n }\n if (snapshot.data === undefined) {\n const waiter =\n coordinator.getInFlightPromise(serialized) ??\n coordinator.revalidate(serialized).catch(() => {});\n throw waiter;\n }\n }\n\n return {\n data: snapshot.data as T | undefined,\n error: snapshot.error,\n isLoading:\n serialized != null &&\n snapshot.data === undefined &&\n snapshot.error == null,\n isValidating: snapshot.isValidating,\n mutate: boundMutate,\n };\n}\n","import { useCallback, useRef, useState, useSyncExternalStore } from \"react\";\nimport { useSteddyRuntime } from \"./context\";\nimport { serializeKey } from \"./key\";\nimport type { Fetcher, Key, MutateFn } from \"./types\";\n\nexport type UseSteddyInfiniteResult<T> = {\n data: T[] | undefined;\n error: unknown;\n isLoading: boolean;\n isValidating: boolean;\n size: number;\n setSize: (next: number | ((current: number) => number)) => void;\n mutate: MutateFn<T[]>;\n};\n\nfunction collectPages<T>(\n getKey: (index: number, previousPageData: T | undefined) => Key | null,\n getData: (serialized: string) => T | undefined,\n size: number,\n): { key: Key; serialized: string }[] {\n const pages: { key: Key; serialized: string }[] = [];\n let previous: T | undefined;\n for (let index = 0; index < size; index++) {\n const key = getKey(index, previous);\n if (key == null) {\n break;\n }\n const serialized = serializeKey(key);\n pages.push({ key, serialized });\n previous = getData(serialized);\n }\n return pages;\n}\n\nexport function useSteddyInfinite<T>(\n getKey: (\n index: number,\n previousPageData: T | undefined,\n ) => Key | null,\n fetcher: Fetcher<T>,\n options?: { initialSize?: number },\n): UseSteddyInfiniteResult<T> {\n const { store, coordinator, mutate: runtimeMutate } = useSteddyRuntime();\n const [size, setSizeState] = useState(options?.initialSize ?? 1);\n const fetcherRef = useRef(fetcher);\n fetcherRef.current = fetcher;\n const getKeyRef = useRef(getKey);\n getKeyRef.current = getKey;\n\n const pages = collectPages(\n getKey,\n (serialized) => store.get(serialized)?.data as T | undefined,\n size,\n );\n const serializedList = pages.map((page) => page.serialized).join(\"\\0\");\n\n for (const page of pages) {\n coordinator.register(page.serialized, page.key, (k, ctx) =>\n fetcherRef.current(k, ctx),\n );\n }\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n const currentPages = collectPages(\n getKeyRef.current,\n (serialized) => store.get(serialized)?.data as T | undefined,\n size,\n );\n const unsubscribes = currentPages.map((page) => {\n coordinator.register(page.serialized, page.key, (k, ctx) =>\n fetcherRef.current(k, ctx),\n );\n if (!coordinator.isInFlight(page.serialized)) {\n void coordinator.revalidate(page.serialized).catch(() => {});\n }\n return store.subscribe(page.serialized, onStoreChange);\n });\n return () => {\n for (const [index, page] of currentPages.entries()) {\n unsubscribes[index]?.();\n if (store.subscriberCount(page.serialized) === 0) {\n coordinator.abort(page.serialized);\n coordinator.unregister(page.serialized);\n }\n }\n };\n },\n [serializedList, size, store, coordinator],\n );\n\n const snapshotRef = useRef<{\n fingerprint: string;\n data: T[] | undefined;\n error: unknown;\n isValidating: boolean;\n }>({\n fingerprint: \"\",\n data: undefined,\n error: undefined,\n isValidating: false,\n });\n\n const getSnapshot = useCallback(() => {\n const currentPages = collectPages(\n getKeyRef.current,\n (serialized) => store.get(serialized)?.data as T | undefined,\n size,\n );\n const fingerprint = currentPages\n .map((page) => {\n const entry = store.getSnapshot(page.serialized);\n return `${page.serialized}:${entry.timestamp}:${entry.isValidating ? 1 : 0}:${entry.error == null ? 0 : 1}:${entry.data === undefined ? 0 : 1}`;\n })\n .join(\"|\");\n if (snapshotRef.current.fingerprint === fingerprint) {\n return snapshotRef.current;\n }\n const loaded: T[] = [];\n let error: unknown;\n let isValidating = false;\n let missing = false;\n for (const page of currentPages) {\n const entry = store.getSnapshot(page.serialized);\n if (entry.isValidating) {\n isValidating = true;\n }\n if (entry.error != null && error === undefined) {\n error = entry.error;\n }\n if (entry.data === undefined) {\n missing = true;\n break;\n }\n loaded.push(entry.data as T);\n }\n snapshotRef.current = {\n fingerprint,\n data: missing && loaded.length === 0 ? undefined : loaded,\n error,\n isValidating,\n };\n return snapshotRef.current;\n }, [serializedList, size, store]);\n\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n const setSize = useCallback(\n (next: number | ((current: number) => number)) => {\n setSizeState((current) =>\n typeof next === \"function\" ? next(current) : next,\n );\n },\n [],\n );\n\n const boundMutate = useCallback<MutateFn<T[]>>(\n async (updater, mutateOptions) => {\n const currentPages = collectPages(\n getKeyRef.current,\n (serialized) => store.get(serialized)?.data as T | undefined,\n size,\n );\n const first = currentPages[0];\n if (!first) {\n return undefined;\n }\n if (updater !== undefined && typeof updater !== \"function\") {\n const pagesValue = updater as T[];\n const firstPage = pagesValue[0];\n if (firstPage !== undefined) {\n await runtimeMutate(first.key, firstPage, mutateOptions);\n }\n return pagesValue;\n }\n await Promise.all(\n currentPages.map((page) =>\n coordinator\n .revalidate(page.serialized, undefined, { force: true })\n .catch(() => {}),\n ),\n );\n return currentPages\n .map((page) => store.get(page.serialized)?.data as T | undefined)\n .filter((page): page is T => page !== undefined);\n },\n [coordinator, runtimeMutate, size, store],\n );\n\n const first = pages[0];\n const firstEntry = first ? store.getSnapshot(first.serialized) : undefined;\n\n return {\n data: snapshot.data,\n error: snapshot.error,\n isLoading:\n first != null &&\n firstEntry?.data === undefined &&\n firstEntry?.error == null,\n isValidating: snapshot.isValidating,\n size,\n setSize,\n mutate: boundMutate,\n };\n}\n","export type FocusCoordinator = {\n revalidate(key: string): Promise<void>;\n getRegisteredKeys(): string[];\n};\n\nexport function focusRevalidate(coordinator: FocusCoordinator): () => void {\n const onFocus = (): void => {\n for (const key of coordinator.getRegisteredKeys()) {\n void coordinator.revalidate(key);\n }\n };\n window.addEventListener(\"focus\", onFocus);\n return () => {\n window.removeEventListener(\"focus\", onFocus);\n };\n}\n","export type ReconnectCoordinator = {\n revalidate(key: string): Promise<void>;\n getRegisteredKeys(): string[];\n};\n\nexport function reconnectRevalidate(\n coordinator: ReconnectCoordinator,\n): () => void {\n const onOnline = (): void => {\n for (const key of coordinator.getRegisteredKeys()) {\n void coordinator.revalidate(key);\n }\n };\n window.addEventListener(\"online\", onOnline);\n return () => {\n window.removeEventListener(\"online\", onOnline);\n };\n}\n","export type PollingCoordinator = {\n revalidate(key: string): Promise<void>;\n};\n\nexport function pollingRevalidate(\n coordinator: PollingCoordinator,\n key: string,\n interval: number,\n): () => void {\n const id = setInterval(() => {\n void coordinator.revalidate(key);\n }, interval);\n return () => {\n clearInterval(id);\n };\n}\n","import type { Fetcher } from \"../types\";\n\nexport type RetryCoordinator = {\n revalidate(key: string): Promise<void>;\n};\n\nfunction isAbortError(error: unknown): boolean {\n return (\n (typeof DOMException !== \"undefined\" &&\n error instanceof DOMException &&\n error.name === \"AbortError\") ||\n (error instanceof Error && error.name === \"AbortError\")\n );\n}\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n return;\n }\n const id = setTimeout(resolve, ms);\n const onAbort = () => {\n clearTimeout(id);\n reject(signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\n/**\n * Wraps a fetcher with bounded backoff retries.\n * Retries happen inside the in-flight request. Do not call `coordinator.revalidate`\n * here — that would abort the request being retried.\n */\nexport function retryOnError<T>(\n _coordinator: RetryCoordinator,\n options: { attempts: number; backoff: number },\n): (fetcher: Fetcher<T>) => Fetcher<T> {\n return (fetcher) =>\n async (key, context) => {\n let lastError: unknown;\n for (let attempt = 0; attempt < options.attempts; attempt++) {\n if (context.signal.aborted) {\n throw (\n context.signal.reason ?? new DOMException(\"Aborted\", \"AbortError\")\n );\n }\n try {\n return await fetcher(key, context);\n } catch (error) {\n lastError = error;\n if (isAbortError(error) || attempt === options.attempts - 1) {\n break;\n }\n await sleep(options.backoff * 2 ** attempt, context.signal);\n }\n }\n throw lastError;\n };\n}\n","import type { EvictOptions } from \"../types\";\n\nexport type TtlEvictCoordinator = {\n evict(options: EvictOptions): string[];\n};\n\nexport function ttlEvict(\n coordinator: TtlEvictCoordinator,\n options: EvictOptions & { interval?: number },\n): () => void {\n const maxAge = options.maxAge;\n const maxKeys = options.maxKeys;\n const evictOptions: EvictOptions = {\n ...(maxAge != null ? { maxAge } : {}),\n ...(maxKeys != null ? { maxKeys } : {}),\n };\n const tick = (): void => {\n coordinator.evict(evictOptions);\n };\n tick();\n const id = setInterval(tick, options.interval ?? 30_000);\n return () => {\n clearInterval(id);\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/coordinator.ts","../src/store.ts","../src/defaults.ts","../src/key.ts","../src/mutate.ts","../src/context.tsx","../src/useSteddy.ts","../src/useSteddyInfinite.ts","../src/plugins/focus.ts","../src/plugins/reconnect.ts","../src/plugins/polling.ts","../src/plugins/retry.ts","../src/plugins/ttl.ts"],"names":["mutate","createContext","useMemo","jsx","useContext","useRef","useCallback","useSyncExternalStore","isThenable","useState","isAbortError"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { EvictOptions, Fetcher, Key } from \"./types\";\nimport type { Store } from \"./store\";\n\nexport const DEDUP_WINDOW_MS = 2000;\nexport const UNSUBSCRIBE_GRACE_MS = 0;\n\nexport type RevalidateOptions = {\n force?: boolean;\n};\n\nexport type Coordinator = {\n register(serializedKey: string, key: Key, fetcher: Fetcher<unknown>): void;\n unregister(serializedKey: string): void;\n scheduleRelease(serializedKey: string): void;\n revalidate(\n serializedKey: string,\n fetcher?: Fetcher<unknown>,\n options?: RevalidateOptions,\n ): Promise<void>;\n isInFlight(serializedKey: string): boolean;\n getInFlightPromise(serializedKey: string): Promise<void> | undefined;\n getRegisteredKeys(): string[];\n abort(serializedKey: string): void;\n evict(options: EvictOptions): string[];\n reset(): void;\n};\n\ntype InFlight = {\n controller: AbortController;\n generation: number;\n waiter: Promise<void>;\n settle: () => void;\n};\n\nfunction isAbortError(error: unknown): boolean {\n return (\n (typeof DOMException !== \"undefined\" &&\n error instanceof DOMException &&\n error.name === \"AbortError\") ||\n (error instanceof Error && error.name === \"AbortError\")\n );\n}\n\nexport function createCoordinator(store: Store): Coordinator {\n const registered = new Map<\n string,\n { key: Key; fetcher: Fetcher<unknown> }\n >();\n const inflight = new Map<string, InFlight>();\n const releaseTimers = new Map<string, ReturnType<typeof setTimeout>>();\n let generation = 0;\n\n function cancelRelease(serializedKey: string): void {\n const timer = releaseTimers.get(serializedKey);\n if (timer == null) {\n return;\n }\n clearTimeout(timer);\n releaseTimers.delete(serializedKey);\n }\n\n function abortInternal(serializedKey: string, markIdle: boolean): void {\n const current = inflight.get(serializedKey);\n if (!current) {\n return;\n }\n current.controller.abort();\n current.settle();\n inflight.delete(serializedKey);\n if (markIdle) {\n const entry = store.get(serializedKey);\n if (entry?.isValidating) {\n store.set(serializedKey, { ...entry, isValidating: false });\n }\n }\n }\n\n const coordinator: Coordinator = {\n register(serializedKey, key, fetcher) {\n cancelRelease(serializedKey);\n registered.set(serializedKey, { key, fetcher });\n },\n\n unregister(serializedKey) {\n cancelRelease(serializedKey);\n registered.delete(serializedKey);\n },\n\n scheduleRelease(serializedKey) {\n cancelRelease(serializedKey);\n const timer = setTimeout(() => {\n releaseTimers.delete(serializedKey);\n if (store.subscriberCount(serializedKey) > 0) {\n return;\n }\n abortInternal(serializedKey, true);\n registered.delete(serializedKey);\n }, UNSUBSCRIBE_GRACE_MS);\n releaseTimers.set(serializedKey, timer);\n },\n\n async revalidate(serializedKey, fetcher, options) {\n if (!options?.force) {\n const entry = store.get(serializedKey);\n if (\n entry &&\n !entry.isValidating &&\n entry.error == null &&\n entry.data !== undefined &&\n Date.now() - entry.timestamp < DEDUP_WINDOW_MS\n ) {\n return;\n }\n }\n\n abortInternal(serializedKey, false);\n\n const record = registered.get(serializedKey);\n const key = record?.key ?? serializedKey;\n const run = fetcher ?? record?.fetcher;\n if (!run) {\n return;\n }\n\n const controller = new AbortController();\n const currentGeneration = ++generation;\n let settled = false;\n let settleWaiter!: () => void;\n const waiter = new Promise<void>((resolve) => {\n settleWaiter = resolve;\n });\n const settle = (): void => {\n if (!settled) {\n settled = true;\n settleWaiter();\n }\n };\n inflight.set(serializedKey, {\n controller,\n generation: currentGeneration,\n waiter,\n settle,\n });\n\n const previous = store.get(serializedKey);\n store.set(serializedKey, {\n data: previous?.data,\n error: previous?.error,\n timestamp: previous?.timestamp ?? 0,\n isValidating: true,\n });\n\n try {\n const data = await run(key, { signal: controller.signal });\n const stillCurrent =\n inflight.get(serializedKey)?.generation === currentGeneration;\n if (!stillCurrent || controller.signal.aborted) {\n return;\n }\n inflight.delete(serializedKey);\n store.set(serializedKey, {\n data,\n error: undefined,\n timestamp: Date.now(),\n isValidating: false,\n });\n } catch (error) {\n const stillCurrent =\n inflight.get(serializedKey)?.generation === currentGeneration;\n if (!stillCurrent || controller.signal.aborted || isAbortError(error)) {\n return;\n }\n inflight.delete(serializedKey);\n const current = store.get(serializedKey);\n store.set(serializedKey, {\n data: current?.data,\n error,\n timestamp: current?.timestamp ?? 0,\n isValidating: false,\n });\n throw error;\n } finally {\n settle();\n }\n },\n\n isInFlight(serializedKey) {\n return inflight.has(serializedKey);\n },\n\n getInFlightPromise(serializedKey) {\n return inflight.get(serializedKey)?.waiter;\n },\n\n getRegisteredKeys() {\n return [...registered.keys()];\n },\n\n abort(serializedKey) {\n cancelRelease(serializedKey);\n abortInternal(serializedKey, true);\n },\n\n evict(options) {\n const now = Date.now();\n const removable: { key: string; timestamp: number }[] = [];\n for (const key of store.keys()) {\n if (inflight.has(key) || store.subscriberCount(key) > 0) {\n continue;\n }\n const entry = store.get(key);\n if (!entry) {\n continue;\n }\n removable.push({ key, timestamp: entry.timestamp });\n }\n\n const victims = new Set<string>();\n if (options.maxAge != null) {\n for (const item of removable) {\n if (now - item.timestamp >= options.maxAge) {\n victims.add(item.key);\n }\n }\n }\n\n if (options.maxKeys != null) {\n const liveCount = store.keys().filter((key) => !victims.has(key)).length;\n let over = liveCount - options.maxKeys;\n if (over > 0) {\n const extra = removable\n .filter((item) => !victims.has(item.key))\n .sort((a, b) => a.timestamp - b.timestamp);\n for (const item of extra) {\n if (over <= 0) {\n break;\n }\n victims.add(item.key);\n over -= 1;\n }\n }\n }\n\n for (const key of victims) {\n cancelRelease(key);\n abortInternal(key, false);\n registered.delete(key);\n store.delete(key);\n }\n return [...victims];\n },\n\n reset() {\n for (const key of [...releaseTimers.keys()]) {\n cancelRelease(key);\n }\n for (const key of [...inflight.keys()]) {\n abortInternal(key, false);\n }\n registered.clear();\n },\n };\n\n return coordinator;\n}\n","import type { CacheEntry } from \"./types\";\n\n/**\n * Dumb key-value store with per-key subscriptions.\n * Hard rule: this file must not import network requests, timers, or browser events.\n */\nexport type Store = {\n get(key: string): CacheEntry | undefined;\n set(key: string, entry: CacheEntry): void;\n delete(key: string): void;\n subscribe(key: string, callback: () => void): () => void;\n getSnapshot(key: string): CacheEntry;\n subscriberCount(key: string): number;\n keys(): string[];\n clear(): void;\n};\n\nexport const EMPTY_SNAPSHOT: CacheEntry = Object.freeze({\n data: undefined,\n error: undefined,\n timestamp: 0,\n isValidating: false,\n});\n\nexport function createStore(): Store {\n const entries = new Map<string, CacheEntry>();\n const listeners = new Map<string, Set<() => void>>();\n\n function emit(key: string): void {\n const subs = listeners.get(key);\n if (!subs) {\n return;\n }\n for (const callback of subs) {\n callback();\n }\n }\n\n return {\n get(key) {\n return entries.get(key);\n },\n\n set(key, entry) {\n entries.set(key, entry);\n emit(key);\n },\n\n delete(key) {\n const existed = entries.delete(key);\n if (existed) {\n emit(key);\n }\n },\n\n subscribe(key, callback) {\n let subs = listeners.get(key);\n if (!subs) {\n subs = new Set();\n listeners.set(key, subs);\n }\n subs.add(callback);\n return () => {\n const current = listeners.get(key);\n if (!current) {\n return;\n }\n current.delete(callback);\n if (current.size === 0) {\n listeners.delete(key);\n }\n };\n },\n\n getSnapshot(key) {\n return entries.get(key) ?? EMPTY_SNAPSHOT;\n },\n\n subscriberCount(key) {\n return listeners.get(key)?.size ?? 0;\n },\n\n keys() {\n return [...entries.keys()];\n },\n\n clear() {\n const keys = new Set([...entries.keys(), ...listeners.keys()]);\n entries.clear();\n for (const key of keys) {\n emit(key);\n }\n },\n };\n}\n","import { createCoordinator } from \"./coordinator\";\nimport { createStore } from \"./store\";\n\nexport const defaultStore = createStore();\nexport const defaultCoordinator = createCoordinator(defaultStore);\n","import type { Key } from \"./types\";\n\nexport function serializeKey(key: Key): string {\n if (typeof key === \"string\") {\n return key;\n }\n return JSON.stringify(key);\n}\n\nexport function keysShallowEqual(a: Key | null, b: Key | null): boolean {\n if (a === b) {\n return true;\n }\n if (a == null || b == null) {\n return false;\n }\n if (typeof a === \"string\" || typeof b === \"string\") {\n return a === b;\n }\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (!Object.is(a[i], b[i])) {\n return false;\n }\n }\n return true;\n}\n","import type { Coordinator } from \"./coordinator\";\nimport { defaultCoordinator, defaultStore } from \"./defaults\";\nimport { serializeKey } from \"./key\";\nimport type { Store } from \"./store\";\nimport type { Key, MutateOptions, MutateUpdater } from \"./types\";\n\nfunction isThenable<T>(value: T | Promise<T>): value is Promise<T> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as Promise<T>).then === \"function\"\n );\n}\n\nexport function createMutate(store: Store, coordinator: Coordinator) {\n return async function mutate<T>(\n key: Key,\n updater: MutateUpdater<T>,\n options?: MutateOptions,\n ): Promise<T | undefined> {\n const revalidate = options?.revalidate ?? true;\n const rollbackOnError = options?.rollbackOnError ?? true;\n const serialized = serializeKey(key);\n const previous = store.get(serialized);\n\n const restore = (): void => {\n if (previous === undefined) {\n store.delete(serialized);\n } else {\n store.set(serialized, previous);\n }\n };\n\n try {\n const currentData = previous?.data as T | undefined;\n const next =\n typeof updater === \"function\"\n ? (updater as (current: T | undefined) => T | Promise<T>)(currentData)\n : updater;\n\n if (isThenable(next)) {\n store.set(serialized, {\n data: currentData,\n error: previous?.error,\n timestamp: previous?.timestamp ?? 0,\n isValidating: true,\n });\n const resolved = await next;\n store.set(serialized, {\n data: resolved,\n error: undefined,\n timestamp: Date.now(),\n isValidating: revalidate,\n });\n } else {\n store.set(serialized, {\n data: next,\n error: undefined,\n timestamp: Date.now(),\n isValidating: revalidate,\n });\n }\n\n if (revalidate) {\n await coordinator.revalidate(serialized, undefined, { force: true });\n }\n\n return store.get(serialized)?.data as T | undefined;\n } catch (error) {\n if (rollbackOnError) {\n restore();\n } else {\n const current = store.get(serialized);\n store.set(serialized, {\n data: current?.data,\n error,\n timestamp: current?.timestamp ?? Date.now(),\n isValidating: false,\n });\n }\n throw error;\n }\n };\n}\n\nexport const mutate = createMutate(defaultStore, defaultCoordinator);\n","import { createCoordinator, type Coordinator } from \"./coordinator\";\nimport { createMutate } from \"./mutate\";\nimport { defaultCoordinator, defaultStore } from \"./defaults\";\nimport { createStore, type Store } from \"./store\";\nimport type { CacheSnapshot, Key } from \"./types\";\nimport { serializeKey } from \"./key\";\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\";\n\nexport type SteddyRuntime = {\n store: Store;\n coordinator: Coordinator;\n mutate: ReturnType<typeof createMutate>;\n};\n\nexport function createRuntime(): SteddyRuntime {\n const store = createStore();\n const coordinator = createCoordinator(store);\n return {\n store,\n coordinator,\n mutate: createMutate(store, coordinator),\n };\n}\n\nconst defaultRuntime: SteddyRuntime = {\n store: defaultStore,\n coordinator: defaultCoordinator,\n mutate: createMutate(defaultStore, defaultCoordinator),\n};\n\nconst SteddyContext = createContext<SteddyRuntime>(defaultRuntime);\n\nexport function SteddyProvider({\n store,\n coordinator,\n cache,\n children,\n}: {\n store: Store;\n coordinator: Coordinator;\n cache?: CacheSnapshot;\n children: ReactNode;\n}) {\n const value = useMemo<SteddyRuntime>(() => {\n if (cache) {\n hydrateAll(cache, store);\n }\n return {\n store,\n coordinator,\n mutate: createMutate(store, coordinator),\n };\n }, [store, coordinator, cache]);\n return <SteddyContext.Provider value={value}>{children}</SteddyContext.Provider>;\n}\n\nexport function useSteddyRuntime(): SteddyRuntime {\n return useContext(SteddyContext);\n}\n\n/** Seed the cache so the next render can show data immediately. Timestamp is 0 so mount still revalidates. */\nexport function hydrate<T>(key: Key, data: T, store: Store = defaultStore): void {\n store.set(serializeKey(key), {\n data,\n error: undefined,\n timestamp: 0,\n isValidating: false,\n });\n}\n\n/** JSON-safe cache payload for SSR / RSC client boundaries. Errors and in-flight flags are omitted. */\nexport function dump(store: Store = defaultStore): CacheSnapshot {\n const snapshot: Record<string, { data: unknown; timestamp: number }> = {};\n for (const key of store.keys()) {\n const entry = store.get(key);\n if (!entry || entry.data === undefined) {\n continue;\n }\n snapshot[key] = { data: entry.data, timestamp: entry.timestamp };\n }\n return snapshot;\n}\n\n/** Restore a dumped snapshot. Timestamps are 0 so the client still revalidates. */\nexport function hydrateAll(\n snapshot: CacheSnapshot,\n store: Store = defaultStore,\n): void {\n for (const [key, payload] of Object.entries(snapshot)) {\n store.set(key, {\n data: payload.data,\n error: undefined,\n timestamp: 0,\n isValidating: false,\n });\n }\n}\n\n/** Drop one key, or the whole cache. Aborts in-flight work for deleted keys. */\nexport function clear(\n key?: Key,\n runtime: Pick<SteddyRuntime, \"store\" | \"coordinator\"> = defaultRuntime,\n): void {\n if (key === undefined) {\n for (const active of runtime.coordinator.getRegisteredKeys()) {\n runtime.coordinator.abort(active);\n }\n runtime.coordinator.reset();\n runtime.store.clear();\n return;\n }\n const serialized = serializeKey(key);\n runtime.coordinator.abort(serialized);\n runtime.coordinator.unregister(serialized);\n runtime.store.delete(serialized);\n}\n","import { useCallback, useRef, useSyncExternalStore } from \"react\";\nimport { useSteddyRuntime } from \"./context\";\nimport { keysShallowEqual, serializeKey } from \"./key\";\nimport { EMPTY_SNAPSHOT } from \"./store\";\nimport type {\n Fetcher,\n Key,\n MutateFn,\n UseSteddyOptions,\n UseSteddyResult,\n} from \"./types\";\n\nfunction useSerializedKey(key: Key | null): string | null {\n const prevKey = useRef<Key | null>(null);\n const prevSerialized = useRef<string | null>(null);\n if (key == null) {\n prevKey.current = null;\n prevSerialized.current = null;\n return null;\n }\n if (\n prevSerialized.current != null &&\n keysShallowEqual(prevKey.current, key)\n ) {\n return prevSerialized.current;\n }\n prevKey.current = key;\n prevSerialized.current = serializeKey(key);\n return prevSerialized.current;\n}\n\nexport function useSteddy<T>(\n key: Key | null,\n fetcher: Fetcher<T>,\n options?: UseSteddyOptions,\n): UseSteddyResult<T> {\n const { store, coordinator, mutate: runtimeMutate } = useSteddyRuntime();\n const serialized = useSerializedKey(key);\n const fetcherRef = useRef(fetcher);\n fetcherRef.current = fetcher;\n const keyRef = useRef(key);\n keyRef.current = key;\n\n if (serialized != null && key != null) {\n coordinator.register(serialized, key, (k, ctx) =>\n fetcherRef.current(k, ctx),\n );\n }\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n if (serialized == null || keyRef.current == null) {\n return () => {};\n }\n const originalKey = keyRef.current;\n coordinator.register(serialized, originalKey, (k, ctx) =>\n fetcherRef.current(k, ctx),\n );\n const unsubscribe = store.subscribe(serialized, onStoreChange);\n if (!coordinator.isInFlight(serialized)) {\n void coordinator.revalidate(serialized).catch(() => {});\n }\n return () => {\n unsubscribe();\n if (store.subscriberCount(serialized) === 0) {\n coordinator.scheduleRelease(serialized);\n }\n };\n },\n [serialized, store, coordinator],\n );\n\n const getSnapshot = useCallback(() => {\n if (serialized == null) {\n return EMPTY_SNAPSHOT;\n }\n return store.getSnapshot(serialized);\n }, [serialized, store]);\n\n // Same snapshot on the server so a dumped cache can render without a mismatch.\n // Source: https://react.dev/reference/react/useSyncExternalStore\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n const boundMutate = useCallback<MutateFn<T>>(\n (updater, mutateOptions) => {\n if (keyRef.current == null) {\n return Promise.resolve(undefined);\n }\n return runtimeMutate(keyRef.current, updater, mutateOptions);\n },\n [runtimeMutate],\n );\n\n const keepPreviousData = options?.keepPreviousData === true;\n const previousRef = useRef<{ serialized: string; data: T } | undefined>(\n undefined,\n );\n if (serialized != null && snapshot.data !== undefined) {\n previousRef.current = { serialized, data: snapshot.data as T };\n }\n\n const data =\n keepPreviousData &&\n serialized != null &&\n snapshot.data === undefined &&\n snapshot.error == null &&\n previousRef.current != null &&\n previousRef.current.serialized !== serialized\n ? previousRef.current.data\n : (snapshot.data as T | undefined);\n\n if (options?.suspense && serialized != null) {\n if (snapshot.error != null) {\n throw snapshot.error;\n }\n if (snapshot.data === undefined && data === undefined) {\n const waiter =\n coordinator.getInFlightPromise(serialized) ??\n coordinator.revalidate(serialized).catch(() => {});\n throw waiter;\n }\n }\n\n return {\n data,\n error: snapshot.error,\n isLoading:\n serialized != null && data === undefined && snapshot.error == null,\n isValidating: snapshot.isValidating,\n mutate: boundMutate,\n };\n}\n","import { useCallback, useRef, useState, useSyncExternalStore } from \"react\";\nimport { useSteddyRuntime } from \"./context\";\nimport { serializeKey } from \"./key\";\nimport type { Fetcher, Key, MutateFn } from \"./types\";\n\nexport type UseSteddyInfiniteResult<T> = {\n data: T[] | undefined;\n error: unknown;\n isLoading: boolean;\n isValidating: boolean;\n size: number;\n setSize: (next: number | ((current: number) => number)) => void;\n mutate: MutateFn<T[]>;\n};\n\nfunction isThenable<T>(value: T | Promise<T>): value is Promise<T> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as Promise<T>).then === \"function\"\n );\n}\n\nexport function collectPages<T>(\n getKey: (index: number, previousPageData: T | undefined) => Key | null,\n getData: (serialized: string) => T | undefined,\n size: number,\n): { key: Key; serialized: string }[] {\n const pages: { key: Key; serialized: string }[] = [];\n const seen = new Set<string>();\n let previous: T | undefined;\n for (let index = 0; index < size; index++) {\n const key = getKey(index, previous);\n if (key == null) {\n break;\n }\n const serialized = serializeKey(key);\n if (seen.has(serialized)) {\n break;\n }\n seen.add(serialized);\n pages.push({ key, serialized });\n previous = getData(serialized);\n }\n return pages;\n}\n\nexport function useSteddyInfinite<T>(\n getKey: (\n index: number,\n previousPageData: T | undefined,\n ) => Key | null,\n fetcher: Fetcher<T>,\n options?: { initialSize?: number },\n): UseSteddyInfiniteResult<T> {\n const { store, coordinator } = useSteddyRuntime();\n const [size, setSizeState] = useState(options?.initialSize ?? 1);\n const fetcherRef = useRef(fetcher);\n fetcherRef.current = fetcher;\n const getKeyRef = useRef(getKey);\n getKeyRef.current = getKey;\n\n const pages = collectPages(\n getKey,\n (serialized) => store.get(serialized)?.data as T | undefined,\n size,\n );\n const serializedList = pages.map((page) => page.serialized).join(\"\\0\");\n\n for (const page of pages) {\n coordinator.register(page.serialized, page.key, (k, ctx) =>\n fetcherRef.current(k, ctx),\n );\n }\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n const currentPages = collectPages(\n getKeyRef.current,\n (serialized) => store.get(serialized)?.data as T | undefined,\n size,\n );\n const unsubscribes = currentPages.map((page) => {\n coordinator.register(page.serialized, page.key, (k, ctx) =>\n fetcherRef.current(k, ctx),\n );\n if (!coordinator.isInFlight(page.serialized)) {\n void coordinator.revalidate(page.serialized).catch(() => {});\n }\n return store.subscribe(page.serialized, onStoreChange);\n });\n return () => {\n for (const [index, page] of currentPages.entries()) {\n unsubscribes[index]?.();\n if (store.subscriberCount(page.serialized) === 0) {\n coordinator.scheduleRelease(page.serialized);\n }\n }\n };\n },\n [serializedList, size, store, coordinator],\n );\n\n const snapshotRef = useRef<{\n fingerprint: string;\n data: T[] | undefined;\n error: unknown;\n isValidating: boolean;\n }>({\n fingerprint: \"\",\n data: undefined,\n error: undefined,\n isValidating: false,\n });\n\n const getSnapshot = useCallback(() => {\n const currentPages = collectPages(\n getKeyRef.current,\n (serialized) => store.get(serialized)?.data as T | undefined,\n size,\n );\n const fingerprint = currentPages\n .map((page) => {\n const entry = store.getSnapshot(page.serialized);\n return `${page.serialized}:${entry.timestamp}:${entry.isValidating ? 1 : 0}:${entry.error == null ? 0 : 1}:${entry.data === undefined ? 0 : 1}`;\n })\n .join(\"|\");\n if (snapshotRef.current.fingerprint === fingerprint) {\n return snapshotRef.current;\n }\n const loaded: T[] = [];\n let error: unknown;\n let isValidating = false;\n let missing = false;\n for (const page of currentPages) {\n const entry = store.getSnapshot(page.serialized);\n if (entry.isValidating) {\n isValidating = true;\n }\n if (entry.error != null && error === undefined) {\n error = entry.error;\n }\n if (entry.data === undefined) {\n missing = true;\n break;\n }\n loaded.push(entry.data as T);\n }\n snapshotRef.current = {\n fingerprint,\n data: missing && loaded.length === 0 ? undefined : loaded,\n error,\n isValidating,\n };\n return snapshotRef.current;\n }, [serializedList, size, store]);\n\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n const setSize = useCallback(\n (next: number | ((current: number) => number)) => {\n setSizeState((current) =>\n typeof next === \"function\" ? next(current) : next,\n );\n },\n [],\n );\n\n const boundMutate = useCallback<MutateFn<T[]>>(\n async (updater, mutateOptions) => {\n const revalidate = mutateOptions?.revalidate ?? true;\n const rollbackOnError = mutateOptions?.rollbackOnError ?? true;\n const currentPages = collectPages(\n getKeyRef.current,\n (serialized) => store.get(serialized)?.data as T | undefined,\n size,\n );\n if (currentPages.length === 0) {\n return undefined;\n }\n\n const previous = currentPages.map((page) => ({\n serialized: page.serialized,\n entry: store.get(page.serialized),\n }));\n const restore = (): void => {\n for (const item of previous) {\n if (item.entry === undefined) {\n store.delete(item.serialized);\n } else {\n store.set(item.serialized, item.entry);\n }\n }\n };\n\n try {\n const loaded: T[] = [];\n for (const page of currentPages) {\n const pageData = store.get(page.serialized)?.data as T | undefined;\n if (pageData === undefined) {\n break;\n }\n loaded.push(pageData);\n }\n const current = loaded.length === 0 ? undefined : loaded;\n const next =\n typeof updater === \"function\"\n ? (\n updater as (\n current: T[] | undefined,\n ) => T[] | Promise<T[]>\n )(current)\n : updater;\n const resolved = isThenable(next) ? await next : next;\n const pagesValue = resolved as T[];\n\n for (const [index, page] of currentPages.entries()) {\n if (index >= pagesValue.length) {\n break;\n }\n store.set(page.serialized, {\n data: pagesValue[index],\n error: undefined,\n timestamp: Date.now(),\n isValidating: revalidate,\n });\n }\n\n if (revalidate) {\n await Promise.all(\n currentPages.map((page) =>\n coordinator.revalidate(page.serialized, undefined, {\n force: true,\n }),\n ),\n );\n }\n\n return currentPages\n .map((page) => store.get(page.serialized)?.data as T | undefined)\n .filter((page): page is T => page !== undefined);\n } catch (error) {\n if (rollbackOnError) {\n restore();\n }\n throw error;\n }\n },\n [coordinator, size, store],\n );\n\n const first = pages[0];\n const firstEntry = first ? store.getSnapshot(first.serialized) : undefined;\n\n return {\n data: snapshot.data,\n error: snapshot.error,\n isLoading:\n first != null &&\n firstEntry?.data === undefined &&\n firstEntry?.error == null,\n isValidating: snapshot.isValidating,\n size,\n setSize,\n mutate: boundMutate,\n };\n}\n","export type FocusCoordinator = {\n revalidate(key: string): Promise<void>;\n getRegisteredKeys(): string[];\n};\n\nexport function focusRevalidate(coordinator: FocusCoordinator): () => void {\n const onFocus = (): void => {\n for (const key of coordinator.getRegisteredKeys()) {\n void coordinator.revalidate(key);\n }\n };\n window.addEventListener(\"focus\", onFocus);\n return () => {\n window.removeEventListener(\"focus\", onFocus);\n };\n}\n","export type ReconnectCoordinator = {\n revalidate(key: string): Promise<void>;\n getRegisteredKeys(): string[];\n};\n\nexport function reconnectRevalidate(\n coordinator: ReconnectCoordinator,\n): () => void {\n const onOnline = (): void => {\n for (const key of coordinator.getRegisteredKeys()) {\n void coordinator.revalidate(key);\n }\n };\n window.addEventListener(\"online\", onOnline);\n return () => {\n window.removeEventListener(\"online\", onOnline);\n };\n}\n","export type PollingCoordinator = {\n revalidate(key: string): Promise<void>;\n};\n\nexport function pollingRevalidate(\n coordinator: PollingCoordinator,\n key: string,\n interval: number,\n): () => void {\n const id = setInterval(() => {\n void coordinator.revalidate(key);\n }, interval);\n return () => {\n clearInterval(id);\n };\n}\n","import type { Fetcher } from \"../types\";\n\nexport type RetryCoordinator = {\n revalidate(key: string): Promise<void>;\n};\n\nfunction isAbortError(error: unknown): boolean {\n return (\n (typeof DOMException !== \"undefined\" &&\n error instanceof DOMException &&\n error.name === \"AbortError\") ||\n (error instanceof Error && error.name === \"AbortError\")\n );\n}\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n return;\n }\n const id = setTimeout(resolve, ms);\n const onAbort = () => {\n clearTimeout(id);\n reject(signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\n/**\n * Wraps a fetcher with bounded backoff retries.\n * Retries happen inside the in-flight request. Do not call `coordinator.revalidate`\n * here — that would abort the request being retried.\n */\nexport function retryOnError<T>(\n _coordinator: RetryCoordinator,\n options: { attempts: number; backoff: number },\n): (fetcher: Fetcher<T>) => Fetcher<T> {\n return (fetcher) =>\n async (key, context) => {\n let lastError: unknown;\n for (let attempt = 0; attempt < options.attempts; attempt++) {\n if (context.signal.aborted) {\n throw (\n context.signal.reason ?? new DOMException(\"Aborted\", \"AbortError\")\n );\n }\n try {\n return await fetcher(key, context);\n } catch (error) {\n lastError = error;\n if (isAbortError(error) || attempt === options.attempts - 1) {\n break;\n }\n await sleep(options.backoff * 2 ** attempt, context.signal);\n }\n }\n throw lastError;\n };\n}\n","import type { EvictOptions } from \"../types\";\n\nexport type TtlEvictCoordinator = {\n evict(options: EvictOptions): string[];\n};\n\nexport function ttlEvict(\n coordinator: TtlEvictCoordinator,\n options: EvictOptions & { interval?: number },\n): () => void {\n const maxAge = options.maxAge;\n const maxKeys = options.maxKeys;\n const evictOptions: EvictOptions = {\n ...(maxAge != null ? { maxAge } : {}),\n ...(maxKeys != null ? { maxKeys } : {}),\n };\n const tick = (): void => {\n coordinator.evict(evictOptions);\n };\n tick();\n const id = setInterval(tick, options.interval ?? 30_000);\n return () => {\n clearInterval(id);\n };\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -22,6 +22,7 @@ type MutateOptions = {
22
22
  type MutateFn<T> = (updater: MutateUpdater<T>, options?: MutateOptions) => Promise<T | undefined>;
23
23
  type UseSteddyOptions = {
24
24
  suspense?: boolean;
25
+ keepPreviousData?: boolean;
25
26
  };
26
27
  type CacheSnapshot = {
27
28
  readonly [serializedKey: string]: {
@@ -73,12 +74,14 @@ type Store = {
73
74
  declare function createStore(): Store;
74
75
 
75
76
  declare const DEDUP_WINDOW_MS = 2000;
77
+ declare const UNSUBSCRIBE_GRACE_MS = 0;
76
78
  type RevalidateOptions = {
77
79
  force?: boolean;
78
80
  };
79
81
  type Coordinator = {
80
82
  register(serializedKey: string, key: Key, fetcher: Fetcher<unknown>): void;
81
83
  unregister(serializedKey: string): void;
84
+ scheduleRelease(serializedKey: string): void;
82
85
  revalidate(serializedKey: string, fetcher?: Fetcher<unknown>, options?: RevalidateOptions): Promise<void>;
83
86
  isInFlight(serializedKey: string): boolean;
84
87
  getInFlightPromise(serializedKey: string): Promise<void> | undefined;
@@ -155,4 +158,4 @@ declare function ttlEvict(coordinator: TtlEvictCoordinator, options: EvictOption
155
158
  interval?: number;
156
159
  }): () => void;
157
160
 
158
- export { type CacheEntry, type CacheSnapshot, type Coordinator, DEDUP_WINDOW_MS, type EvictOptions, type Fetcher, type Key, type MutateFn, type MutateOptions, type MutateUpdater, type RevalidateOptions, type Serializable, SteddyProvider, type SteddyRuntime, type Store, type UseSteddyInfiniteResult, type UseSteddyOptions, type UseSteddyResult, clear, createCoordinator, createMutate, createRuntime, createStore, defaultCoordinator, defaultStore, dump, focusRevalidate, hydrate, hydrateAll, mutate, pollingRevalidate, reconnectRevalidate, retryOnError, serializeKey, ttlEvict, useSteddy, useSteddyInfinite };
161
+ export { type CacheEntry, type CacheSnapshot, type Coordinator, DEDUP_WINDOW_MS, type EvictOptions, type Fetcher, type Key, type MutateFn, type MutateOptions, type MutateUpdater, type RevalidateOptions, type Serializable, SteddyProvider, type SteddyRuntime, type Store, UNSUBSCRIBE_GRACE_MS, type UseSteddyInfiniteResult, type UseSteddyOptions, type UseSteddyResult, clear, createCoordinator, createMutate, createRuntime, createStore, defaultCoordinator, defaultStore, dump, focusRevalidate, hydrate, hydrateAll, mutate, pollingRevalidate, reconnectRevalidate, retryOnError, serializeKey, ttlEvict, useSteddy, useSteddyInfinite };
package/dist/index.d.ts CHANGED
@@ -22,6 +22,7 @@ type MutateOptions = {
22
22
  type MutateFn<T> = (updater: MutateUpdater<T>, options?: MutateOptions) => Promise<T | undefined>;
23
23
  type UseSteddyOptions = {
24
24
  suspense?: boolean;
25
+ keepPreviousData?: boolean;
25
26
  };
26
27
  type CacheSnapshot = {
27
28
  readonly [serializedKey: string]: {
@@ -73,12 +74,14 @@ type Store = {
73
74
  declare function createStore(): Store;
74
75
 
75
76
  declare const DEDUP_WINDOW_MS = 2000;
77
+ declare const UNSUBSCRIBE_GRACE_MS = 0;
76
78
  type RevalidateOptions = {
77
79
  force?: boolean;
78
80
  };
79
81
  type Coordinator = {
80
82
  register(serializedKey: string, key: Key, fetcher: Fetcher<unknown>): void;
81
83
  unregister(serializedKey: string): void;
84
+ scheduleRelease(serializedKey: string): void;
82
85
  revalidate(serializedKey: string, fetcher?: Fetcher<unknown>, options?: RevalidateOptions): Promise<void>;
83
86
  isInFlight(serializedKey: string): boolean;
84
87
  getInFlightPromise(serializedKey: string): Promise<void> | undefined;
@@ -155,4 +158,4 @@ declare function ttlEvict(coordinator: TtlEvictCoordinator, options: EvictOption
155
158
  interval?: number;
156
159
  }): () => void;
157
160
 
158
- export { type CacheEntry, type CacheSnapshot, type Coordinator, DEDUP_WINDOW_MS, type EvictOptions, type Fetcher, type Key, type MutateFn, type MutateOptions, type MutateUpdater, type RevalidateOptions, type Serializable, SteddyProvider, type SteddyRuntime, type Store, type UseSteddyInfiniteResult, type UseSteddyOptions, type UseSteddyResult, clear, createCoordinator, createMutate, createRuntime, createStore, defaultCoordinator, defaultStore, dump, focusRevalidate, hydrate, hydrateAll, mutate, pollingRevalidate, reconnectRevalidate, retryOnError, serializeKey, ttlEvict, useSteddy, useSteddyInfinite };
161
+ export { type CacheEntry, type CacheSnapshot, type Coordinator, DEDUP_WINDOW_MS, type EvictOptions, type Fetcher, type Key, type MutateFn, type MutateOptions, type MutateUpdater, type RevalidateOptions, type Serializable, SteddyProvider, type SteddyRuntime, type Store, UNSUBSCRIBE_GRACE_MS, type UseSteddyInfiniteResult, type UseSteddyOptions, type UseSteddyResult, clear, createCoordinator, createMutate, createRuntime, createStore, defaultCoordinator, defaultStore, dump, focusRevalidate, hydrate, hydrateAll, mutate, pollingRevalidate, reconnectRevalidate, retryOnError, serializeKey, ttlEvict, useSteddy, useSteddyInfinite };
package/dist/index.js CHANGED
@@ -5,13 +5,23 @@ import { jsx } from 'react/jsx-runtime';
5
5
 
6
6
  // src/coordinator.ts
7
7
  var DEDUP_WINDOW_MS = 2e3;
8
+ var UNSUBSCRIBE_GRACE_MS = 0;
8
9
  function isAbortError(error) {
9
10
  return typeof DOMException !== "undefined" && error instanceof DOMException && error.name === "AbortError" || error instanceof Error && error.name === "AbortError";
10
11
  }
11
12
  function createCoordinator(store) {
12
13
  const registered = /* @__PURE__ */ new Map();
13
14
  const inflight = /* @__PURE__ */ new Map();
15
+ const releaseTimers = /* @__PURE__ */ new Map();
14
16
  let generation = 0;
17
+ function cancelRelease(serializedKey) {
18
+ const timer = releaseTimers.get(serializedKey);
19
+ if (timer == null) {
20
+ return;
21
+ }
22
+ clearTimeout(timer);
23
+ releaseTimers.delete(serializedKey);
24
+ }
15
25
  function abortInternal(serializedKey, markIdle) {
16
26
  const current = inflight.get(serializedKey);
17
27
  if (!current) {
@@ -29,11 +39,25 @@ function createCoordinator(store) {
29
39
  }
30
40
  const coordinator = {
31
41
  register(serializedKey, key, fetcher) {
42
+ cancelRelease(serializedKey);
32
43
  registered.set(serializedKey, { key, fetcher });
33
44
  },
34
45
  unregister(serializedKey) {
46
+ cancelRelease(serializedKey);
35
47
  registered.delete(serializedKey);
36
48
  },
49
+ scheduleRelease(serializedKey) {
50
+ cancelRelease(serializedKey);
51
+ const timer = setTimeout(() => {
52
+ releaseTimers.delete(serializedKey);
53
+ if (store.subscriberCount(serializedKey) > 0) {
54
+ return;
55
+ }
56
+ abortInternal(serializedKey, true);
57
+ registered.delete(serializedKey);
58
+ }, UNSUBSCRIBE_GRACE_MS);
59
+ releaseTimers.set(serializedKey, timer);
60
+ },
37
61
  async revalidate(serializedKey, fetcher, options) {
38
62
  if (!options?.force) {
39
63
  const entry = store.get(serializedKey);
@@ -115,6 +139,7 @@ function createCoordinator(store) {
115
139
  return [...registered.keys()];
116
140
  },
117
141
  abort(serializedKey) {
142
+ cancelRelease(serializedKey);
118
143
  abortInternal(serializedKey, true);
119
144
  },
120
145
  evict(options) {
@@ -153,6 +178,7 @@ function createCoordinator(store) {
153
178
  }
154
179
  }
155
180
  for (const key of victims) {
181
+ cancelRelease(key);
156
182
  abortInternal(key, false);
157
183
  registered.delete(key);
158
184
  store.delete(key);
@@ -160,6 +186,9 @@ function createCoordinator(store) {
160
186
  return [...victims];
161
187
  },
162
188
  reset() {
189
+ for (const key of [...releaseTimers.keys()]) {
190
+ cancelRelease(key);
191
+ }
163
192
  for (const key of [...inflight.keys()]) {
164
193
  abortInternal(key, false);
165
194
  }
@@ -464,8 +493,7 @@ function useSteddy(key, fetcher, options) {
464
493
  return () => {
465
494
  unsubscribe();
466
495
  if (store.subscriberCount(serialized) === 0) {
467
- coordinator.abort(serialized);
468
- coordinator.unregister(serialized);
496
+ coordinator.scheduleRelease(serialized);
469
497
  }
470
498
  };
471
499
  },
@@ -487,26 +515,38 @@ function useSteddy(key, fetcher, options) {
487
515
  },
488
516
  [runtimeMutate]
489
517
  );
518
+ const keepPreviousData = options?.keepPreviousData === true;
519
+ const previousRef = useRef(
520
+ void 0
521
+ );
522
+ if (serialized != null && snapshot.data !== void 0) {
523
+ previousRef.current = { serialized, data: snapshot.data };
524
+ }
525
+ const data = keepPreviousData && serialized != null && snapshot.data === void 0 && snapshot.error == null && previousRef.current != null && previousRef.current.serialized !== serialized ? previousRef.current.data : snapshot.data;
490
526
  if (options?.suspense && serialized != null) {
491
527
  if (snapshot.error != null) {
492
528
  throw snapshot.error;
493
529
  }
494
- if (snapshot.data === void 0) {
530
+ if (snapshot.data === void 0 && data === void 0) {
495
531
  const waiter = coordinator.getInFlightPromise(serialized) ?? coordinator.revalidate(serialized).catch(() => {
496
532
  });
497
533
  throw waiter;
498
534
  }
499
535
  }
500
536
  return {
501
- data: snapshot.data,
537
+ data,
502
538
  error: snapshot.error,
503
- isLoading: serialized != null && snapshot.data === void 0 && snapshot.error == null,
539
+ isLoading: serialized != null && data === void 0 && snapshot.error == null,
504
540
  isValidating: snapshot.isValidating,
505
541
  mutate: boundMutate
506
542
  };
507
543
  }
544
+ function isThenable2(value) {
545
+ return typeof value === "object" && value !== null && typeof value.then === "function";
546
+ }
508
547
  function collectPages(getKey, getData, size) {
509
548
  const pages = [];
549
+ const seen = /* @__PURE__ */ new Set();
510
550
  let previous;
511
551
  for (let index = 0; index < size; index++) {
512
552
  const key = getKey(index, previous);
@@ -514,13 +554,17 @@ function collectPages(getKey, getData, size) {
514
554
  break;
515
555
  }
516
556
  const serialized = serializeKey(key);
557
+ if (seen.has(serialized)) {
558
+ break;
559
+ }
560
+ seen.add(serialized);
517
561
  pages.push({ key, serialized });
518
562
  previous = getData(serialized);
519
563
  }
520
564
  return pages;
521
565
  }
522
566
  function useSteddyInfinite(getKey, fetcher, options) {
523
- const { store, coordinator, mutate: runtimeMutate } = useSteddyRuntime();
567
+ const { store, coordinator } = useSteddyRuntime();
524
568
  const [size, setSizeState] = useState(options?.initialSize ?? 1);
525
569
  const fetcherRef = useRef(fetcher);
526
570
  fetcherRef.current = fetcher;
@@ -562,8 +606,7 @@ function useSteddyInfinite(getKey, fetcher, options) {
562
606
  for (const [index, page] of currentPages.entries()) {
563
607
  unsubscribes[index]?.();
564
608
  if (store.subscriberCount(page.serialized) === 0) {
565
- coordinator.abort(page.serialized);
566
- coordinator.unregister(page.serialized);
609
+ coordinator.scheduleRelease(page.serialized);
567
610
  }
568
611
  }
569
612
  };
@@ -626,32 +669,71 @@ function useSteddyInfinite(getKey, fetcher, options) {
626
669
  );
627
670
  const boundMutate = useCallback(
628
671
  async (updater, mutateOptions) => {
672
+ const revalidate = mutateOptions?.revalidate ?? true;
673
+ const rollbackOnError = mutateOptions?.rollbackOnError ?? true;
629
674
  const currentPages = collectPages(
630
675
  getKeyRef.current,
631
676
  (serialized) => store.get(serialized)?.data,
632
677
  size
633
678
  );
634
- const first2 = currentPages[0];
635
- if (!first2) {
679
+ if (currentPages.length === 0) {
636
680
  return void 0;
637
681
  }
638
- if (updater !== void 0 && typeof updater !== "function") {
639
- const pagesValue = updater;
640
- const firstPage = pagesValue[0];
641
- if (firstPage !== void 0) {
642
- await runtimeMutate(first2.key, firstPage, mutateOptions);
682
+ const previous = currentPages.map((page) => ({
683
+ serialized: page.serialized,
684
+ entry: store.get(page.serialized)
685
+ }));
686
+ const restore = () => {
687
+ for (const item of previous) {
688
+ if (item.entry === void 0) {
689
+ store.delete(item.serialized);
690
+ } else {
691
+ store.set(item.serialized, item.entry);
692
+ }
693
+ }
694
+ };
695
+ try {
696
+ const loaded = [];
697
+ for (const page of currentPages) {
698
+ const pageData = store.get(page.serialized)?.data;
699
+ if (pageData === void 0) {
700
+ break;
701
+ }
702
+ loaded.push(pageData);
643
703
  }
644
- return pagesValue;
704
+ const current = loaded.length === 0 ? void 0 : loaded;
705
+ const next = typeof updater === "function" ? updater(current) : updater;
706
+ const resolved = isThenable2(next) ? await next : next;
707
+ const pagesValue = resolved;
708
+ for (const [index, page] of currentPages.entries()) {
709
+ if (index >= pagesValue.length) {
710
+ break;
711
+ }
712
+ store.set(page.serialized, {
713
+ data: pagesValue[index],
714
+ error: void 0,
715
+ timestamp: Date.now(),
716
+ isValidating: revalidate
717
+ });
718
+ }
719
+ if (revalidate) {
720
+ await Promise.all(
721
+ currentPages.map(
722
+ (page) => coordinator.revalidate(page.serialized, void 0, {
723
+ force: true
724
+ })
725
+ )
726
+ );
727
+ }
728
+ return currentPages.map((page) => store.get(page.serialized)?.data).filter((page) => page !== void 0);
729
+ } catch (error) {
730
+ if (rollbackOnError) {
731
+ restore();
732
+ }
733
+ throw error;
645
734
  }
646
- await Promise.all(
647
- currentPages.map(
648
- (page) => coordinator.revalidate(page.serialized, void 0, { force: true }).catch(() => {
649
- })
650
- )
651
- );
652
- return currentPages.map((page) => store.get(page.serialized)?.data).filter((page) => page !== void 0);
653
735
  },
654
- [coordinator, runtimeMutate, size, store]
736
+ [coordinator, size, store]
655
737
  );
656
738
  const first = pages[0];
657
739
  const firstEntry = first ? store.getSnapshot(first.serialized) : void 0;
@@ -759,6 +841,6 @@ function ttlEvict(coordinator, options) {
759
841
  };
760
842
  }
761
843
 
762
- export { DEDUP_WINDOW_MS, SteddyProvider, clear, createCoordinator, createMutate, createRuntime, createStore, defaultCoordinator, defaultStore, dump, focusRevalidate, hydrate, hydrateAll, mutate, pollingRevalidate, reconnectRevalidate, retryOnError, serializeKey, ttlEvict, useSteddy, useSteddyInfinite };
844
+ export { DEDUP_WINDOW_MS, SteddyProvider, UNSUBSCRIBE_GRACE_MS, clear, createCoordinator, createMutate, createRuntime, createStore, defaultCoordinator, defaultStore, dump, focusRevalidate, hydrate, hydrateAll, mutate, pollingRevalidate, reconnectRevalidate, retryOnError, serializeKey, ttlEvict, useSteddy, useSteddyInfinite };
763
845
  //# sourceMappingURL=index.js.map
764
846
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/coordinator.ts","../src/store.ts","../src/defaults.ts","../src/key.ts","../src/mutate.ts","../src/context.tsx","../src/useSteddy.ts","../src/useSteddyInfinite.ts","../src/plugins/focus.ts","../src/plugins/reconnect.ts","../src/plugins/polling.ts","../src/plugins/retry.ts","../src/plugins/ttl.ts"],"names":["mutate","useRef","useCallback","useSyncExternalStore","first","isAbortError"],"mappings":"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","file":"index.js","sourcesContent":["import type { EvictOptions, Fetcher, Key } from \"./types\";\nimport type { Store } from \"./store\";\n\nexport const DEDUP_WINDOW_MS = 2000;\n\nexport type RevalidateOptions = {\n force?: boolean;\n};\n\nexport type Coordinator = {\n register(serializedKey: string, key: Key, fetcher: Fetcher<unknown>): void;\n unregister(serializedKey: string): void;\n revalidate(\n serializedKey: string,\n fetcher?: Fetcher<unknown>,\n options?: RevalidateOptions,\n ): Promise<void>;\n isInFlight(serializedKey: string): boolean;\n getInFlightPromise(serializedKey: string): Promise<void> | undefined;\n getRegisteredKeys(): string[];\n abort(serializedKey: string): void;\n evict(options: EvictOptions): string[];\n reset(): void;\n};\n\ntype InFlight = {\n controller: AbortController;\n generation: number;\n waiter: Promise<void>;\n settle: () => void;\n};\n\nfunction isAbortError(error: unknown): boolean {\n return (\n (typeof DOMException !== \"undefined\" &&\n error instanceof DOMException &&\n error.name === \"AbortError\") ||\n (error instanceof Error && error.name === \"AbortError\")\n );\n}\n\nexport function createCoordinator(store: Store): Coordinator {\n const registered = new Map<\n string,\n { key: Key; fetcher: Fetcher<unknown> }\n >();\n const inflight = new Map<string, InFlight>();\n let generation = 0;\n\n function abortInternal(serializedKey: string, markIdle: boolean): void {\n const current = inflight.get(serializedKey);\n if (!current) {\n return;\n }\n current.controller.abort();\n current.settle();\n inflight.delete(serializedKey);\n if (markIdle) {\n const entry = store.get(serializedKey);\n if (entry?.isValidating) {\n store.set(serializedKey, { ...entry, isValidating: false });\n }\n }\n }\n\n const coordinator: Coordinator = {\n register(serializedKey, key, fetcher) {\n registered.set(serializedKey, { key, fetcher });\n },\n\n unregister(serializedKey) {\n registered.delete(serializedKey);\n },\n\n async revalidate(serializedKey, fetcher, options) {\n if (!options?.force) {\n const entry = store.get(serializedKey);\n if (\n entry &&\n !entry.isValidating &&\n entry.error == null &&\n entry.data !== undefined &&\n Date.now() - entry.timestamp < DEDUP_WINDOW_MS\n ) {\n return;\n }\n }\n\n abortInternal(serializedKey, false);\n\n const record = registered.get(serializedKey);\n const key = record?.key ?? serializedKey;\n const run = fetcher ?? record?.fetcher;\n if (!run) {\n return;\n }\n\n const controller = new AbortController();\n const currentGeneration = ++generation;\n let settled = false;\n let settleWaiter!: () => void;\n const waiter = new Promise<void>((resolve) => {\n settleWaiter = resolve;\n });\n const settle = (): void => {\n if (!settled) {\n settled = true;\n settleWaiter();\n }\n };\n inflight.set(serializedKey, {\n controller,\n generation: currentGeneration,\n waiter,\n settle,\n });\n\n const previous = store.get(serializedKey);\n store.set(serializedKey, {\n data: previous?.data,\n error: previous?.error,\n timestamp: previous?.timestamp ?? 0,\n isValidating: true,\n });\n\n try {\n const data = await run(key, { signal: controller.signal });\n const stillCurrent =\n inflight.get(serializedKey)?.generation === currentGeneration;\n if (!stillCurrent || controller.signal.aborted) {\n return;\n }\n inflight.delete(serializedKey);\n store.set(serializedKey, {\n data,\n error: undefined,\n timestamp: Date.now(),\n isValidating: false,\n });\n } catch (error) {\n const stillCurrent =\n inflight.get(serializedKey)?.generation === currentGeneration;\n if (!stillCurrent || controller.signal.aborted || isAbortError(error)) {\n return;\n }\n inflight.delete(serializedKey);\n const current = store.get(serializedKey);\n store.set(serializedKey, {\n data: current?.data,\n error,\n timestamp: current?.timestamp ?? 0,\n isValidating: false,\n });\n throw error;\n } finally {\n settle();\n }\n },\n\n isInFlight(serializedKey) {\n return inflight.has(serializedKey);\n },\n\n getInFlightPromise(serializedKey) {\n return inflight.get(serializedKey)?.waiter;\n },\n\n getRegisteredKeys() {\n return [...registered.keys()];\n },\n\n abort(serializedKey) {\n abortInternal(serializedKey, true);\n },\n\n evict(options) {\n const now = Date.now();\n const removable: { key: string; timestamp: number }[] = [];\n for (const key of store.keys()) {\n if (inflight.has(key) || store.subscriberCount(key) > 0) {\n continue;\n }\n const entry = store.get(key);\n if (!entry) {\n continue;\n }\n removable.push({ key, timestamp: entry.timestamp });\n }\n\n const victims = new Set<string>();\n if (options.maxAge != null) {\n for (const item of removable) {\n if (now - item.timestamp >= options.maxAge) {\n victims.add(item.key);\n }\n }\n }\n\n if (options.maxKeys != null) {\n const liveCount = store.keys().filter((key) => !victims.has(key)).length;\n let over = liveCount - options.maxKeys;\n if (over > 0) {\n const extra = removable\n .filter((item) => !victims.has(item.key))\n .sort((a, b) => a.timestamp - b.timestamp);\n for (const item of extra) {\n if (over <= 0) {\n break;\n }\n victims.add(item.key);\n over -= 1;\n }\n }\n }\n\n for (const key of victims) {\n abortInternal(key, false);\n registered.delete(key);\n store.delete(key);\n }\n return [...victims];\n },\n\n reset() {\n for (const key of [...inflight.keys()]) {\n abortInternal(key, false);\n }\n registered.clear();\n },\n };\n\n return coordinator;\n}\n","import type { CacheEntry } from \"./types\";\n\n/**\n * Dumb key-value store with per-key subscriptions.\n * Hard rule: this file must not import network requests, timers, or browser events.\n */\nexport type Store = {\n get(key: string): CacheEntry | undefined;\n set(key: string, entry: CacheEntry): void;\n delete(key: string): void;\n subscribe(key: string, callback: () => void): () => void;\n getSnapshot(key: string): CacheEntry;\n subscriberCount(key: string): number;\n keys(): string[];\n clear(): void;\n};\n\nexport const EMPTY_SNAPSHOT: CacheEntry = Object.freeze({\n data: undefined,\n error: undefined,\n timestamp: 0,\n isValidating: false,\n});\n\nexport function createStore(): Store {\n const entries = new Map<string, CacheEntry>();\n const listeners = new Map<string, Set<() => void>>();\n\n function emit(key: string): void {\n const subs = listeners.get(key);\n if (!subs) {\n return;\n }\n for (const callback of subs) {\n callback();\n }\n }\n\n return {\n get(key) {\n return entries.get(key);\n },\n\n set(key, entry) {\n entries.set(key, entry);\n emit(key);\n },\n\n delete(key) {\n const existed = entries.delete(key);\n if (existed) {\n emit(key);\n }\n },\n\n subscribe(key, callback) {\n let subs = listeners.get(key);\n if (!subs) {\n subs = new Set();\n listeners.set(key, subs);\n }\n subs.add(callback);\n return () => {\n const current = listeners.get(key);\n if (!current) {\n return;\n }\n current.delete(callback);\n if (current.size === 0) {\n listeners.delete(key);\n }\n };\n },\n\n getSnapshot(key) {\n return entries.get(key) ?? EMPTY_SNAPSHOT;\n },\n\n subscriberCount(key) {\n return listeners.get(key)?.size ?? 0;\n },\n\n keys() {\n return [...entries.keys()];\n },\n\n clear() {\n const keys = new Set([...entries.keys(), ...listeners.keys()]);\n entries.clear();\n for (const key of keys) {\n emit(key);\n }\n },\n };\n}\n","import { createCoordinator } from \"./coordinator\";\nimport { createStore } from \"./store\";\n\nexport const defaultStore = createStore();\nexport const defaultCoordinator = createCoordinator(defaultStore);\n","import type { Key } from \"./types\";\n\nexport function serializeKey(key: Key): string {\n if (typeof key === \"string\") {\n return key;\n }\n return JSON.stringify(key);\n}\n\nexport function keysShallowEqual(a: Key | null, b: Key | null): boolean {\n if (a === b) {\n return true;\n }\n if (a == null || b == null) {\n return false;\n }\n if (typeof a === \"string\" || typeof b === \"string\") {\n return a === b;\n }\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (!Object.is(a[i], b[i])) {\n return false;\n }\n }\n return true;\n}\n","import type { Coordinator } from \"./coordinator\";\nimport { defaultCoordinator, defaultStore } from \"./defaults\";\nimport { serializeKey } from \"./key\";\nimport type { Store } from \"./store\";\nimport type { Key, MutateOptions, MutateUpdater } from \"./types\";\n\nfunction isThenable<T>(value: T | Promise<T>): value is Promise<T> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as Promise<T>).then === \"function\"\n );\n}\n\nexport function createMutate(store: Store, coordinator: Coordinator) {\n return async function mutate<T>(\n key: Key,\n updater: MutateUpdater<T>,\n options?: MutateOptions,\n ): Promise<T | undefined> {\n const revalidate = options?.revalidate ?? true;\n const rollbackOnError = options?.rollbackOnError ?? true;\n const serialized = serializeKey(key);\n const previous = store.get(serialized);\n\n const restore = (): void => {\n if (previous === undefined) {\n store.delete(serialized);\n } else {\n store.set(serialized, previous);\n }\n };\n\n try {\n const currentData = previous?.data as T | undefined;\n const next =\n typeof updater === \"function\"\n ? (updater as (current: T | undefined) => T | Promise<T>)(currentData)\n : updater;\n\n if (isThenable(next)) {\n store.set(serialized, {\n data: currentData,\n error: previous?.error,\n timestamp: previous?.timestamp ?? 0,\n isValidating: true,\n });\n const resolved = await next;\n store.set(serialized, {\n data: resolved,\n error: undefined,\n timestamp: Date.now(),\n isValidating: revalidate,\n });\n } else {\n store.set(serialized, {\n data: next,\n error: undefined,\n timestamp: Date.now(),\n isValidating: revalidate,\n });\n }\n\n if (revalidate) {\n await coordinator.revalidate(serialized, undefined, { force: true });\n }\n\n return store.get(serialized)?.data as T | undefined;\n } catch (error) {\n if (rollbackOnError) {\n restore();\n } else {\n const current = store.get(serialized);\n store.set(serialized, {\n data: current?.data,\n error,\n timestamp: current?.timestamp ?? Date.now(),\n isValidating: false,\n });\n }\n throw error;\n }\n };\n}\n\nexport const mutate = createMutate(defaultStore, defaultCoordinator);\n","import { createCoordinator, type Coordinator } from \"./coordinator\";\nimport { createMutate } from \"./mutate\";\nimport { defaultCoordinator, defaultStore } from \"./defaults\";\nimport { createStore, type Store } from \"./store\";\nimport type { CacheSnapshot, Key } from \"./types\";\nimport { serializeKey } from \"./key\";\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\";\n\nexport type SteddyRuntime = {\n store: Store;\n coordinator: Coordinator;\n mutate: ReturnType<typeof createMutate>;\n};\n\nexport function createRuntime(): SteddyRuntime {\n const store = createStore();\n const coordinator = createCoordinator(store);\n return {\n store,\n coordinator,\n mutate: createMutate(store, coordinator),\n };\n}\n\nconst defaultRuntime: SteddyRuntime = {\n store: defaultStore,\n coordinator: defaultCoordinator,\n mutate: createMutate(defaultStore, defaultCoordinator),\n};\n\nconst SteddyContext = createContext<SteddyRuntime>(defaultRuntime);\n\nexport function SteddyProvider({\n store,\n coordinator,\n cache,\n children,\n}: {\n store: Store;\n coordinator: Coordinator;\n cache?: CacheSnapshot;\n children: ReactNode;\n}) {\n const value = useMemo<SteddyRuntime>(() => {\n if (cache) {\n hydrateAll(cache, store);\n }\n return {\n store,\n coordinator,\n mutate: createMutate(store, coordinator),\n };\n }, [store, coordinator, cache]);\n return <SteddyContext.Provider value={value}>{children}</SteddyContext.Provider>;\n}\n\nexport function useSteddyRuntime(): SteddyRuntime {\n return useContext(SteddyContext);\n}\n\n/** Seed the cache so the next render can show data immediately. Timestamp is 0 so mount still revalidates. */\nexport function hydrate<T>(key: Key, data: T, store: Store = defaultStore): void {\n store.set(serializeKey(key), {\n data,\n error: undefined,\n timestamp: 0,\n isValidating: false,\n });\n}\n\n/** JSON-safe cache payload for SSR / RSC client boundaries. Errors and in-flight flags are omitted. */\nexport function dump(store: Store = defaultStore): CacheSnapshot {\n const snapshot: Record<string, { data: unknown; timestamp: number }> = {};\n for (const key of store.keys()) {\n const entry = store.get(key);\n if (!entry || entry.data === undefined) {\n continue;\n }\n snapshot[key] = { data: entry.data, timestamp: entry.timestamp };\n }\n return snapshot;\n}\n\n/** Restore a dumped snapshot. Timestamps are 0 so the client still revalidates. */\nexport function hydrateAll(\n snapshot: CacheSnapshot,\n store: Store = defaultStore,\n): void {\n for (const [key, payload] of Object.entries(snapshot)) {\n store.set(key, {\n data: payload.data,\n error: undefined,\n timestamp: 0,\n isValidating: false,\n });\n }\n}\n\n/** Drop one key, or the whole cache. Aborts in-flight work for deleted keys. */\nexport function clear(\n key?: Key,\n runtime: Pick<SteddyRuntime, \"store\" | \"coordinator\"> = defaultRuntime,\n): void {\n if (key === undefined) {\n for (const active of runtime.coordinator.getRegisteredKeys()) {\n runtime.coordinator.abort(active);\n }\n runtime.coordinator.reset();\n runtime.store.clear();\n return;\n }\n const serialized = serializeKey(key);\n runtime.coordinator.abort(serialized);\n runtime.coordinator.unregister(serialized);\n runtime.store.delete(serialized);\n}\n","import { useCallback, useRef, useSyncExternalStore } from \"react\";\nimport { useSteddyRuntime } from \"./context\";\nimport { keysShallowEqual, serializeKey } from \"./key\";\nimport { EMPTY_SNAPSHOT } from \"./store\";\nimport type {\n Fetcher,\n Key,\n MutateFn,\n UseSteddyOptions,\n UseSteddyResult,\n} from \"./types\";\n\nfunction useSerializedKey(key: Key | null): string | null {\n const prevKey = useRef<Key | null>(null);\n const prevSerialized = useRef<string | null>(null);\n if (key == null) {\n prevKey.current = null;\n prevSerialized.current = null;\n return null;\n }\n if (\n prevSerialized.current != null &&\n keysShallowEqual(prevKey.current, key)\n ) {\n return prevSerialized.current;\n }\n prevKey.current = key;\n prevSerialized.current = serializeKey(key);\n return prevSerialized.current;\n}\n\nexport function useSteddy<T>(\n key: Key | null,\n fetcher: Fetcher<T>,\n options?: UseSteddyOptions,\n): UseSteddyResult<T> {\n const { store, coordinator, mutate: runtimeMutate } = useSteddyRuntime();\n const serialized = useSerializedKey(key);\n const fetcherRef = useRef(fetcher);\n fetcherRef.current = fetcher;\n const keyRef = useRef(key);\n keyRef.current = key;\n\n if (serialized != null && key != null) {\n coordinator.register(serialized, key, (k, ctx) =>\n fetcherRef.current(k, ctx),\n );\n }\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n if (serialized == null || keyRef.current == null) {\n return () => {};\n }\n const originalKey = keyRef.current;\n coordinator.register(serialized, originalKey, (k, ctx) =>\n fetcherRef.current(k, ctx),\n );\n const unsubscribe = store.subscribe(serialized, onStoreChange);\n if (!coordinator.isInFlight(serialized)) {\n void coordinator.revalidate(serialized).catch(() => {});\n }\n return () => {\n unsubscribe();\n if (store.subscriberCount(serialized) === 0) {\n coordinator.abort(serialized);\n coordinator.unregister(serialized);\n }\n };\n },\n [serialized, store, coordinator],\n );\n\n const getSnapshot = useCallback(() => {\n if (serialized == null) {\n return EMPTY_SNAPSHOT;\n }\n return store.getSnapshot(serialized);\n }, [serialized, store]);\n\n // Same snapshot on the server so a dumped cache can render without a mismatch.\n // Source: https://react.dev/reference/react/useSyncExternalStore\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n const boundMutate = useCallback<MutateFn<T>>(\n (updater, mutateOptions) => {\n if (keyRef.current == null) {\n return Promise.resolve(undefined);\n }\n return runtimeMutate(keyRef.current, updater, mutateOptions);\n },\n [runtimeMutate],\n );\n\n if (options?.suspense && serialized != null) {\n if (snapshot.error != null) {\n throw snapshot.error;\n }\n if (snapshot.data === undefined) {\n const waiter =\n coordinator.getInFlightPromise(serialized) ??\n coordinator.revalidate(serialized).catch(() => {});\n throw waiter;\n }\n }\n\n return {\n data: snapshot.data as T | undefined,\n error: snapshot.error,\n isLoading:\n serialized != null &&\n snapshot.data === undefined &&\n snapshot.error == null,\n isValidating: snapshot.isValidating,\n mutate: boundMutate,\n };\n}\n","import { useCallback, useRef, useState, useSyncExternalStore } from \"react\";\nimport { useSteddyRuntime } from \"./context\";\nimport { serializeKey } from \"./key\";\nimport type { Fetcher, Key, MutateFn } from \"./types\";\n\nexport type UseSteddyInfiniteResult<T> = {\n data: T[] | undefined;\n error: unknown;\n isLoading: boolean;\n isValidating: boolean;\n size: number;\n setSize: (next: number | ((current: number) => number)) => void;\n mutate: MutateFn<T[]>;\n};\n\nfunction collectPages<T>(\n getKey: (index: number, previousPageData: T | undefined) => Key | null,\n getData: (serialized: string) => T | undefined,\n size: number,\n): { key: Key; serialized: string }[] {\n const pages: { key: Key; serialized: string }[] = [];\n let previous: T | undefined;\n for (let index = 0; index < size; index++) {\n const key = getKey(index, previous);\n if (key == null) {\n break;\n }\n const serialized = serializeKey(key);\n pages.push({ key, serialized });\n previous = getData(serialized);\n }\n return pages;\n}\n\nexport function useSteddyInfinite<T>(\n getKey: (\n index: number,\n previousPageData: T | undefined,\n ) => Key | null,\n fetcher: Fetcher<T>,\n options?: { initialSize?: number },\n): UseSteddyInfiniteResult<T> {\n const { store, coordinator, mutate: runtimeMutate } = useSteddyRuntime();\n const [size, setSizeState] = useState(options?.initialSize ?? 1);\n const fetcherRef = useRef(fetcher);\n fetcherRef.current = fetcher;\n const getKeyRef = useRef(getKey);\n getKeyRef.current = getKey;\n\n const pages = collectPages(\n getKey,\n (serialized) => store.get(serialized)?.data as T | undefined,\n size,\n );\n const serializedList = pages.map((page) => page.serialized).join(\"\\0\");\n\n for (const page of pages) {\n coordinator.register(page.serialized, page.key, (k, ctx) =>\n fetcherRef.current(k, ctx),\n );\n }\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n const currentPages = collectPages(\n getKeyRef.current,\n (serialized) => store.get(serialized)?.data as T | undefined,\n size,\n );\n const unsubscribes = currentPages.map((page) => {\n coordinator.register(page.serialized, page.key, (k, ctx) =>\n fetcherRef.current(k, ctx),\n );\n if (!coordinator.isInFlight(page.serialized)) {\n void coordinator.revalidate(page.serialized).catch(() => {});\n }\n return store.subscribe(page.serialized, onStoreChange);\n });\n return () => {\n for (const [index, page] of currentPages.entries()) {\n unsubscribes[index]?.();\n if (store.subscriberCount(page.serialized) === 0) {\n coordinator.abort(page.serialized);\n coordinator.unregister(page.serialized);\n }\n }\n };\n },\n [serializedList, size, store, coordinator],\n );\n\n const snapshotRef = useRef<{\n fingerprint: string;\n data: T[] | undefined;\n error: unknown;\n isValidating: boolean;\n }>({\n fingerprint: \"\",\n data: undefined,\n error: undefined,\n isValidating: false,\n });\n\n const getSnapshot = useCallback(() => {\n const currentPages = collectPages(\n getKeyRef.current,\n (serialized) => store.get(serialized)?.data as T | undefined,\n size,\n );\n const fingerprint = currentPages\n .map((page) => {\n const entry = store.getSnapshot(page.serialized);\n return `${page.serialized}:${entry.timestamp}:${entry.isValidating ? 1 : 0}:${entry.error == null ? 0 : 1}:${entry.data === undefined ? 0 : 1}`;\n })\n .join(\"|\");\n if (snapshotRef.current.fingerprint === fingerprint) {\n return snapshotRef.current;\n }\n const loaded: T[] = [];\n let error: unknown;\n let isValidating = false;\n let missing = false;\n for (const page of currentPages) {\n const entry = store.getSnapshot(page.serialized);\n if (entry.isValidating) {\n isValidating = true;\n }\n if (entry.error != null && error === undefined) {\n error = entry.error;\n }\n if (entry.data === undefined) {\n missing = true;\n break;\n }\n loaded.push(entry.data as T);\n }\n snapshotRef.current = {\n fingerprint,\n data: missing && loaded.length === 0 ? undefined : loaded,\n error,\n isValidating,\n };\n return snapshotRef.current;\n }, [serializedList, size, store]);\n\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n const setSize = useCallback(\n (next: number | ((current: number) => number)) => {\n setSizeState((current) =>\n typeof next === \"function\" ? next(current) : next,\n );\n },\n [],\n );\n\n const boundMutate = useCallback<MutateFn<T[]>>(\n async (updater, mutateOptions) => {\n const currentPages = collectPages(\n getKeyRef.current,\n (serialized) => store.get(serialized)?.data as T | undefined,\n size,\n );\n const first = currentPages[0];\n if (!first) {\n return undefined;\n }\n if (updater !== undefined && typeof updater !== \"function\") {\n const pagesValue = updater as T[];\n const firstPage = pagesValue[0];\n if (firstPage !== undefined) {\n await runtimeMutate(first.key, firstPage, mutateOptions);\n }\n return pagesValue;\n }\n await Promise.all(\n currentPages.map((page) =>\n coordinator\n .revalidate(page.serialized, undefined, { force: true })\n .catch(() => {}),\n ),\n );\n return currentPages\n .map((page) => store.get(page.serialized)?.data as T | undefined)\n .filter((page): page is T => page !== undefined);\n },\n [coordinator, runtimeMutate, size, store],\n );\n\n const first = pages[0];\n const firstEntry = first ? store.getSnapshot(first.serialized) : undefined;\n\n return {\n data: snapshot.data,\n error: snapshot.error,\n isLoading:\n first != null &&\n firstEntry?.data === undefined &&\n firstEntry?.error == null,\n isValidating: snapshot.isValidating,\n size,\n setSize,\n mutate: boundMutate,\n };\n}\n","export type FocusCoordinator = {\n revalidate(key: string): Promise<void>;\n getRegisteredKeys(): string[];\n};\n\nexport function focusRevalidate(coordinator: FocusCoordinator): () => void {\n const onFocus = (): void => {\n for (const key of coordinator.getRegisteredKeys()) {\n void coordinator.revalidate(key);\n }\n };\n window.addEventListener(\"focus\", onFocus);\n return () => {\n window.removeEventListener(\"focus\", onFocus);\n };\n}\n","export type ReconnectCoordinator = {\n revalidate(key: string): Promise<void>;\n getRegisteredKeys(): string[];\n};\n\nexport function reconnectRevalidate(\n coordinator: ReconnectCoordinator,\n): () => void {\n const onOnline = (): void => {\n for (const key of coordinator.getRegisteredKeys()) {\n void coordinator.revalidate(key);\n }\n };\n window.addEventListener(\"online\", onOnline);\n return () => {\n window.removeEventListener(\"online\", onOnline);\n };\n}\n","export type PollingCoordinator = {\n revalidate(key: string): Promise<void>;\n};\n\nexport function pollingRevalidate(\n coordinator: PollingCoordinator,\n key: string,\n interval: number,\n): () => void {\n const id = setInterval(() => {\n void coordinator.revalidate(key);\n }, interval);\n return () => {\n clearInterval(id);\n };\n}\n","import type { Fetcher } from \"../types\";\n\nexport type RetryCoordinator = {\n revalidate(key: string): Promise<void>;\n};\n\nfunction isAbortError(error: unknown): boolean {\n return (\n (typeof DOMException !== \"undefined\" &&\n error instanceof DOMException &&\n error.name === \"AbortError\") ||\n (error instanceof Error && error.name === \"AbortError\")\n );\n}\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n return;\n }\n const id = setTimeout(resolve, ms);\n const onAbort = () => {\n clearTimeout(id);\n reject(signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\n/**\n * Wraps a fetcher with bounded backoff retries.\n * Retries happen inside the in-flight request. Do not call `coordinator.revalidate`\n * here — that would abort the request being retried.\n */\nexport function retryOnError<T>(\n _coordinator: RetryCoordinator,\n options: { attempts: number; backoff: number },\n): (fetcher: Fetcher<T>) => Fetcher<T> {\n return (fetcher) =>\n async (key, context) => {\n let lastError: unknown;\n for (let attempt = 0; attempt < options.attempts; attempt++) {\n if (context.signal.aborted) {\n throw (\n context.signal.reason ?? new DOMException(\"Aborted\", \"AbortError\")\n );\n }\n try {\n return await fetcher(key, context);\n } catch (error) {\n lastError = error;\n if (isAbortError(error) || attempt === options.attempts - 1) {\n break;\n }\n await sleep(options.backoff * 2 ** attempt, context.signal);\n }\n }\n throw lastError;\n };\n}\n","import type { EvictOptions } from \"../types\";\n\nexport type TtlEvictCoordinator = {\n evict(options: EvictOptions): string[];\n};\n\nexport function ttlEvict(\n coordinator: TtlEvictCoordinator,\n options: EvictOptions & { interval?: number },\n): () => void {\n const maxAge = options.maxAge;\n const maxKeys = options.maxKeys;\n const evictOptions: EvictOptions = {\n ...(maxAge != null ? { maxAge } : {}),\n ...(maxKeys != null ? { maxKeys } : {}),\n };\n const tick = (): void => {\n coordinator.evict(evictOptions);\n };\n tick();\n const id = setInterval(tick, options.interval ?? 30_000);\n return () => {\n clearInterval(id);\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/coordinator.ts","../src/store.ts","../src/defaults.ts","../src/key.ts","../src/mutate.ts","../src/context.tsx","../src/useSteddy.ts","../src/useSteddyInfinite.ts","../src/plugins/focus.ts","../src/plugins/reconnect.ts","../src/plugins/polling.ts","../src/plugins/retry.ts","../src/plugins/ttl.ts"],"names":["mutate","isThenable","useRef","useCallback","useSyncExternalStore","isAbortError"],"mappings":"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","file":"index.js","sourcesContent":["import type { EvictOptions, Fetcher, Key } from \"./types\";\nimport type { Store } from \"./store\";\n\nexport const DEDUP_WINDOW_MS = 2000;\nexport const UNSUBSCRIBE_GRACE_MS = 0;\n\nexport type RevalidateOptions = {\n force?: boolean;\n};\n\nexport type Coordinator = {\n register(serializedKey: string, key: Key, fetcher: Fetcher<unknown>): void;\n unregister(serializedKey: string): void;\n scheduleRelease(serializedKey: string): void;\n revalidate(\n serializedKey: string,\n fetcher?: Fetcher<unknown>,\n options?: RevalidateOptions,\n ): Promise<void>;\n isInFlight(serializedKey: string): boolean;\n getInFlightPromise(serializedKey: string): Promise<void> | undefined;\n getRegisteredKeys(): string[];\n abort(serializedKey: string): void;\n evict(options: EvictOptions): string[];\n reset(): void;\n};\n\ntype InFlight = {\n controller: AbortController;\n generation: number;\n waiter: Promise<void>;\n settle: () => void;\n};\n\nfunction isAbortError(error: unknown): boolean {\n return (\n (typeof DOMException !== \"undefined\" &&\n error instanceof DOMException &&\n error.name === \"AbortError\") ||\n (error instanceof Error && error.name === \"AbortError\")\n );\n}\n\nexport function createCoordinator(store: Store): Coordinator {\n const registered = new Map<\n string,\n { key: Key; fetcher: Fetcher<unknown> }\n >();\n const inflight = new Map<string, InFlight>();\n const releaseTimers = new Map<string, ReturnType<typeof setTimeout>>();\n let generation = 0;\n\n function cancelRelease(serializedKey: string): void {\n const timer = releaseTimers.get(serializedKey);\n if (timer == null) {\n return;\n }\n clearTimeout(timer);\n releaseTimers.delete(serializedKey);\n }\n\n function abortInternal(serializedKey: string, markIdle: boolean): void {\n const current = inflight.get(serializedKey);\n if (!current) {\n return;\n }\n current.controller.abort();\n current.settle();\n inflight.delete(serializedKey);\n if (markIdle) {\n const entry = store.get(serializedKey);\n if (entry?.isValidating) {\n store.set(serializedKey, { ...entry, isValidating: false });\n }\n }\n }\n\n const coordinator: Coordinator = {\n register(serializedKey, key, fetcher) {\n cancelRelease(serializedKey);\n registered.set(serializedKey, { key, fetcher });\n },\n\n unregister(serializedKey) {\n cancelRelease(serializedKey);\n registered.delete(serializedKey);\n },\n\n scheduleRelease(serializedKey) {\n cancelRelease(serializedKey);\n const timer = setTimeout(() => {\n releaseTimers.delete(serializedKey);\n if (store.subscriberCount(serializedKey) > 0) {\n return;\n }\n abortInternal(serializedKey, true);\n registered.delete(serializedKey);\n }, UNSUBSCRIBE_GRACE_MS);\n releaseTimers.set(serializedKey, timer);\n },\n\n async revalidate(serializedKey, fetcher, options) {\n if (!options?.force) {\n const entry = store.get(serializedKey);\n if (\n entry &&\n !entry.isValidating &&\n entry.error == null &&\n entry.data !== undefined &&\n Date.now() - entry.timestamp < DEDUP_WINDOW_MS\n ) {\n return;\n }\n }\n\n abortInternal(serializedKey, false);\n\n const record = registered.get(serializedKey);\n const key = record?.key ?? serializedKey;\n const run = fetcher ?? record?.fetcher;\n if (!run) {\n return;\n }\n\n const controller = new AbortController();\n const currentGeneration = ++generation;\n let settled = false;\n let settleWaiter!: () => void;\n const waiter = new Promise<void>((resolve) => {\n settleWaiter = resolve;\n });\n const settle = (): void => {\n if (!settled) {\n settled = true;\n settleWaiter();\n }\n };\n inflight.set(serializedKey, {\n controller,\n generation: currentGeneration,\n waiter,\n settle,\n });\n\n const previous = store.get(serializedKey);\n store.set(serializedKey, {\n data: previous?.data,\n error: previous?.error,\n timestamp: previous?.timestamp ?? 0,\n isValidating: true,\n });\n\n try {\n const data = await run(key, { signal: controller.signal });\n const stillCurrent =\n inflight.get(serializedKey)?.generation === currentGeneration;\n if (!stillCurrent || controller.signal.aborted) {\n return;\n }\n inflight.delete(serializedKey);\n store.set(serializedKey, {\n data,\n error: undefined,\n timestamp: Date.now(),\n isValidating: false,\n });\n } catch (error) {\n const stillCurrent =\n inflight.get(serializedKey)?.generation === currentGeneration;\n if (!stillCurrent || controller.signal.aborted || isAbortError(error)) {\n return;\n }\n inflight.delete(serializedKey);\n const current = store.get(serializedKey);\n store.set(serializedKey, {\n data: current?.data,\n error,\n timestamp: current?.timestamp ?? 0,\n isValidating: false,\n });\n throw error;\n } finally {\n settle();\n }\n },\n\n isInFlight(serializedKey) {\n return inflight.has(serializedKey);\n },\n\n getInFlightPromise(serializedKey) {\n return inflight.get(serializedKey)?.waiter;\n },\n\n getRegisteredKeys() {\n return [...registered.keys()];\n },\n\n abort(serializedKey) {\n cancelRelease(serializedKey);\n abortInternal(serializedKey, true);\n },\n\n evict(options) {\n const now = Date.now();\n const removable: { key: string; timestamp: number }[] = [];\n for (const key of store.keys()) {\n if (inflight.has(key) || store.subscriberCount(key) > 0) {\n continue;\n }\n const entry = store.get(key);\n if (!entry) {\n continue;\n }\n removable.push({ key, timestamp: entry.timestamp });\n }\n\n const victims = new Set<string>();\n if (options.maxAge != null) {\n for (const item of removable) {\n if (now - item.timestamp >= options.maxAge) {\n victims.add(item.key);\n }\n }\n }\n\n if (options.maxKeys != null) {\n const liveCount = store.keys().filter((key) => !victims.has(key)).length;\n let over = liveCount - options.maxKeys;\n if (over > 0) {\n const extra = removable\n .filter((item) => !victims.has(item.key))\n .sort((a, b) => a.timestamp - b.timestamp);\n for (const item of extra) {\n if (over <= 0) {\n break;\n }\n victims.add(item.key);\n over -= 1;\n }\n }\n }\n\n for (const key of victims) {\n cancelRelease(key);\n abortInternal(key, false);\n registered.delete(key);\n store.delete(key);\n }\n return [...victims];\n },\n\n reset() {\n for (const key of [...releaseTimers.keys()]) {\n cancelRelease(key);\n }\n for (const key of [...inflight.keys()]) {\n abortInternal(key, false);\n }\n registered.clear();\n },\n };\n\n return coordinator;\n}\n","import type { CacheEntry } from \"./types\";\n\n/**\n * Dumb key-value store with per-key subscriptions.\n * Hard rule: this file must not import network requests, timers, or browser events.\n */\nexport type Store = {\n get(key: string): CacheEntry | undefined;\n set(key: string, entry: CacheEntry): void;\n delete(key: string): void;\n subscribe(key: string, callback: () => void): () => void;\n getSnapshot(key: string): CacheEntry;\n subscriberCount(key: string): number;\n keys(): string[];\n clear(): void;\n};\n\nexport const EMPTY_SNAPSHOT: CacheEntry = Object.freeze({\n data: undefined,\n error: undefined,\n timestamp: 0,\n isValidating: false,\n});\n\nexport function createStore(): Store {\n const entries = new Map<string, CacheEntry>();\n const listeners = new Map<string, Set<() => void>>();\n\n function emit(key: string): void {\n const subs = listeners.get(key);\n if (!subs) {\n return;\n }\n for (const callback of subs) {\n callback();\n }\n }\n\n return {\n get(key) {\n return entries.get(key);\n },\n\n set(key, entry) {\n entries.set(key, entry);\n emit(key);\n },\n\n delete(key) {\n const existed = entries.delete(key);\n if (existed) {\n emit(key);\n }\n },\n\n subscribe(key, callback) {\n let subs = listeners.get(key);\n if (!subs) {\n subs = new Set();\n listeners.set(key, subs);\n }\n subs.add(callback);\n return () => {\n const current = listeners.get(key);\n if (!current) {\n return;\n }\n current.delete(callback);\n if (current.size === 0) {\n listeners.delete(key);\n }\n };\n },\n\n getSnapshot(key) {\n return entries.get(key) ?? EMPTY_SNAPSHOT;\n },\n\n subscriberCount(key) {\n return listeners.get(key)?.size ?? 0;\n },\n\n keys() {\n return [...entries.keys()];\n },\n\n clear() {\n const keys = new Set([...entries.keys(), ...listeners.keys()]);\n entries.clear();\n for (const key of keys) {\n emit(key);\n }\n },\n };\n}\n","import { createCoordinator } from \"./coordinator\";\nimport { createStore } from \"./store\";\n\nexport const defaultStore = createStore();\nexport const defaultCoordinator = createCoordinator(defaultStore);\n","import type { Key } from \"./types\";\n\nexport function serializeKey(key: Key): string {\n if (typeof key === \"string\") {\n return key;\n }\n return JSON.stringify(key);\n}\n\nexport function keysShallowEqual(a: Key | null, b: Key | null): boolean {\n if (a === b) {\n return true;\n }\n if (a == null || b == null) {\n return false;\n }\n if (typeof a === \"string\" || typeof b === \"string\") {\n return a === b;\n }\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (!Object.is(a[i], b[i])) {\n return false;\n }\n }\n return true;\n}\n","import type { Coordinator } from \"./coordinator\";\nimport { defaultCoordinator, defaultStore } from \"./defaults\";\nimport { serializeKey } from \"./key\";\nimport type { Store } from \"./store\";\nimport type { Key, MutateOptions, MutateUpdater } from \"./types\";\n\nfunction isThenable<T>(value: T | Promise<T>): value is Promise<T> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as Promise<T>).then === \"function\"\n );\n}\n\nexport function createMutate(store: Store, coordinator: Coordinator) {\n return async function mutate<T>(\n key: Key,\n updater: MutateUpdater<T>,\n options?: MutateOptions,\n ): Promise<T | undefined> {\n const revalidate = options?.revalidate ?? true;\n const rollbackOnError = options?.rollbackOnError ?? true;\n const serialized = serializeKey(key);\n const previous = store.get(serialized);\n\n const restore = (): void => {\n if (previous === undefined) {\n store.delete(serialized);\n } else {\n store.set(serialized, previous);\n }\n };\n\n try {\n const currentData = previous?.data as T | undefined;\n const next =\n typeof updater === \"function\"\n ? (updater as (current: T | undefined) => T | Promise<T>)(currentData)\n : updater;\n\n if (isThenable(next)) {\n store.set(serialized, {\n data: currentData,\n error: previous?.error,\n timestamp: previous?.timestamp ?? 0,\n isValidating: true,\n });\n const resolved = await next;\n store.set(serialized, {\n data: resolved,\n error: undefined,\n timestamp: Date.now(),\n isValidating: revalidate,\n });\n } else {\n store.set(serialized, {\n data: next,\n error: undefined,\n timestamp: Date.now(),\n isValidating: revalidate,\n });\n }\n\n if (revalidate) {\n await coordinator.revalidate(serialized, undefined, { force: true });\n }\n\n return store.get(serialized)?.data as T | undefined;\n } catch (error) {\n if (rollbackOnError) {\n restore();\n } else {\n const current = store.get(serialized);\n store.set(serialized, {\n data: current?.data,\n error,\n timestamp: current?.timestamp ?? Date.now(),\n isValidating: false,\n });\n }\n throw error;\n }\n };\n}\n\nexport const mutate = createMutate(defaultStore, defaultCoordinator);\n","import { createCoordinator, type Coordinator } from \"./coordinator\";\nimport { createMutate } from \"./mutate\";\nimport { defaultCoordinator, defaultStore } from \"./defaults\";\nimport { createStore, type Store } from \"./store\";\nimport type { CacheSnapshot, Key } from \"./types\";\nimport { serializeKey } from \"./key\";\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\";\n\nexport type SteddyRuntime = {\n store: Store;\n coordinator: Coordinator;\n mutate: ReturnType<typeof createMutate>;\n};\n\nexport function createRuntime(): SteddyRuntime {\n const store = createStore();\n const coordinator = createCoordinator(store);\n return {\n store,\n coordinator,\n mutate: createMutate(store, coordinator),\n };\n}\n\nconst defaultRuntime: SteddyRuntime = {\n store: defaultStore,\n coordinator: defaultCoordinator,\n mutate: createMutate(defaultStore, defaultCoordinator),\n};\n\nconst SteddyContext = createContext<SteddyRuntime>(defaultRuntime);\n\nexport function SteddyProvider({\n store,\n coordinator,\n cache,\n children,\n}: {\n store: Store;\n coordinator: Coordinator;\n cache?: CacheSnapshot;\n children: ReactNode;\n}) {\n const value = useMemo<SteddyRuntime>(() => {\n if (cache) {\n hydrateAll(cache, store);\n }\n return {\n store,\n coordinator,\n mutate: createMutate(store, coordinator),\n };\n }, [store, coordinator, cache]);\n return <SteddyContext.Provider value={value}>{children}</SteddyContext.Provider>;\n}\n\nexport function useSteddyRuntime(): SteddyRuntime {\n return useContext(SteddyContext);\n}\n\n/** Seed the cache so the next render can show data immediately. Timestamp is 0 so mount still revalidates. */\nexport function hydrate<T>(key: Key, data: T, store: Store = defaultStore): void {\n store.set(serializeKey(key), {\n data,\n error: undefined,\n timestamp: 0,\n isValidating: false,\n });\n}\n\n/** JSON-safe cache payload for SSR / RSC client boundaries. Errors and in-flight flags are omitted. */\nexport function dump(store: Store = defaultStore): CacheSnapshot {\n const snapshot: Record<string, { data: unknown; timestamp: number }> = {};\n for (const key of store.keys()) {\n const entry = store.get(key);\n if (!entry || entry.data === undefined) {\n continue;\n }\n snapshot[key] = { data: entry.data, timestamp: entry.timestamp };\n }\n return snapshot;\n}\n\n/** Restore a dumped snapshot. Timestamps are 0 so the client still revalidates. */\nexport function hydrateAll(\n snapshot: CacheSnapshot,\n store: Store = defaultStore,\n): void {\n for (const [key, payload] of Object.entries(snapshot)) {\n store.set(key, {\n data: payload.data,\n error: undefined,\n timestamp: 0,\n isValidating: false,\n });\n }\n}\n\n/** Drop one key, or the whole cache. Aborts in-flight work for deleted keys. */\nexport function clear(\n key?: Key,\n runtime: Pick<SteddyRuntime, \"store\" | \"coordinator\"> = defaultRuntime,\n): void {\n if (key === undefined) {\n for (const active of runtime.coordinator.getRegisteredKeys()) {\n runtime.coordinator.abort(active);\n }\n runtime.coordinator.reset();\n runtime.store.clear();\n return;\n }\n const serialized = serializeKey(key);\n runtime.coordinator.abort(serialized);\n runtime.coordinator.unregister(serialized);\n runtime.store.delete(serialized);\n}\n","import { useCallback, useRef, useSyncExternalStore } from \"react\";\nimport { useSteddyRuntime } from \"./context\";\nimport { keysShallowEqual, serializeKey } from \"./key\";\nimport { EMPTY_SNAPSHOT } from \"./store\";\nimport type {\n Fetcher,\n Key,\n MutateFn,\n UseSteddyOptions,\n UseSteddyResult,\n} from \"./types\";\n\nfunction useSerializedKey(key: Key | null): string | null {\n const prevKey = useRef<Key | null>(null);\n const prevSerialized = useRef<string | null>(null);\n if (key == null) {\n prevKey.current = null;\n prevSerialized.current = null;\n return null;\n }\n if (\n prevSerialized.current != null &&\n keysShallowEqual(prevKey.current, key)\n ) {\n return prevSerialized.current;\n }\n prevKey.current = key;\n prevSerialized.current = serializeKey(key);\n return prevSerialized.current;\n}\n\nexport function useSteddy<T>(\n key: Key | null,\n fetcher: Fetcher<T>,\n options?: UseSteddyOptions,\n): UseSteddyResult<T> {\n const { store, coordinator, mutate: runtimeMutate } = useSteddyRuntime();\n const serialized = useSerializedKey(key);\n const fetcherRef = useRef(fetcher);\n fetcherRef.current = fetcher;\n const keyRef = useRef(key);\n keyRef.current = key;\n\n if (serialized != null && key != null) {\n coordinator.register(serialized, key, (k, ctx) =>\n fetcherRef.current(k, ctx),\n );\n }\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n if (serialized == null || keyRef.current == null) {\n return () => {};\n }\n const originalKey = keyRef.current;\n coordinator.register(serialized, originalKey, (k, ctx) =>\n fetcherRef.current(k, ctx),\n );\n const unsubscribe = store.subscribe(serialized, onStoreChange);\n if (!coordinator.isInFlight(serialized)) {\n void coordinator.revalidate(serialized).catch(() => {});\n }\n return () => {\n unsubscribe();\n if (store.subscriberCount(serialized) === 0) {\n coordinator.scheduleRelease(serialized);\n }\n };\n },\n [serialized, store, coordinator],\n );\n\n const getSnapshot = useCallback(() => {\n if (serialized == null) {\n return EMPTY_SNAPSHOT;\n }\n return store.getSnapshot(serialized);\n }, [serialized, store]);\n\n // Same snapshot on the server so a dumped cache can render without a mismatch.\n // Source: https://react.dev/reference/react/useSyncExternalStore\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n const boundMutate = useCallback<MutateFn<T>>(\n (updater, mutateOptions) => {\n if (keyRef.current == null) {\n return Promise.resolve(undefined);\n }\n return runtimeMutate(keyRef.current, updater, mutateOptions);\n },\n [runtimeMutate],\n );\n\n const keepPreviousData = options?.keepPreviousData === true;\n const previousRef = useRef<{ serialized: string; data: T } | undefined>(\n undefined,\n );\n if (serialized != null && snapshot.data !== undefined) {\n previousRef.current = { serialized, data: snapshot.data as T };\n }\n\n const data =\n keepPreviousData &&\n serialized != null &&\n snapshot.data === undefined &&\n snapshot.error == null &&\n previousRef.current != null &&\n previousRef.current.serialized !== serialized\n ? previousRef.current.data\n : (snapshot.data as T | undefined);\n\n if (options?.suspense && serialized != null) {\n if (snapshot.error != null) {\n throw snapshot.error;\n }\n if (snapshot.data === undefined && data === undefined) {\n const waiter =\n coordinator.getInFlightPromise(serialized) ??\n coordinator.revalidate(serialized).catch(() => {});\n throw waiter;\n }\n }\n\n return {\n data,\n error: snapshot.error,\n isLoading:\n serialized != null && data === undefined && snapshot.error == null,\n isValidating: snapshot.isValidating,\n mutate: boundMutate,\n };\n}\n","import { useCallback, useRef, useState, useSyncExternalStore } from \"react\";\nimport { useSteddyRuntime } from \"./context\";\nimport { serializeKey } from \"./key\";\nimport type { Fetcher, Key, MutateFn } from \"./types\";\n\nexport type UseSteddyInfiniteResult<T> = {\n data: T[] | undefined;\n error: unknown;\n isLoading: boolean;\n isValidating: boolean;\n size: number;\n setSize: (next: number | ((current: number) => number)) => void;\n mutate: MutateFn<T[]>;\n};\n\nfunction isThenable<T>(value: T | Promise<T>): value is Promise<T> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as Promise<T>).then === \"function\"\n );\n}\n\nexport function collectPages<T>(\n getKey: (index: number, previousPageData: T | undefined) => Key | null,\n getData: (serialized: string) => T | undefined,\n size: number,\n): { key: Key; serialized: string }[] {\n const pages: { key: Key; serialized: string }[] = [];\n const seen = new Set<string>();\n let previous: T | undefined;\n for (let index = 0; index < size; index++) {\n const key = getKey(index, previous);\n if (key == null) {\n break;\n }\n const serialized = serializeKey(key);\n if (seen.has(serialized)) {\n break;\n }\n seen.add(serialized);\n pages.push({ key, serialized });\n previous = getData(serialized);\n }\n return pages;\n}\n\nexport function useSteddyInfinite<T>(\n getKey: (\n index: number,\n previousPageData: T | undefined,\n ) => Key | null,\n fetcher: Fetcher<T>,\n options?: { initialSize?: number },\n): UseSteddyInfiniteResult<T> {\n const { store, coordinator } = useSteddyRuntime();\n const [size, setSizeState] = useState(options?.initialSize ?? 1);\n const fetcherRef = useRef(fetcher);\n fetcherRef.current = fetcher;\n const getKeyRef = useRef(getKey);\n getKeyRef.current = getKey;\n\n const pages = collectPages(\n getKey,\n (serialized) => store.get(serialized)?.data as T | undefined,\n size,\n );\n const serializedList = pages.map((page) => page.serialized).join(\"\\0\");\n\n for (const page of pages) {\n coordinator.register(page.serialized, page.key, (k, ctx) =>\n fetcherRef.current(k, ctx),\n );\n }\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n const currentPages = collectPages(\n getKeyRef.current,\n (serialized) => store.get(serialized)?.data as T | undefined,\n size,\n );\n const unsubscribes = currentPages.map((page) => {\n coordinator.register(page.serialized, page.key, (k, ctx) =>\n fetcherRef.current(k, ctx),\n );\n if (!coordinator.isInFlight(page.serialized)) {\n void coordinator.revalidate(page.serialized).catch(() => {});\n }\n return store.subscribe(page.serialized, onStoreChange);\n });\n return () => {\n for (const [index, page] of currentPages.entries()) {\n unsubscribes[index]?.();\n if (store.subscriberCount(page.serialized) === 0) {\n coordinator.scheduleRelease(page.serialized);\n }\n }\n };\n },\n [serializedList, size, store, coordinator],\n );\n\n const snapshotRef = useRef<{\n fingerprint: string;\n data: T[] | undefined;\n error: unknown;\n isValidating: boolean;\n }>({\n fingerprint: \"\",\n data: undefined,\n error: undefined,\n isValidating: false,\n });\n\n const getSnapshot = useCallback(() => {\n const currentPages = collectPages(\n getKeyRef.current,\n (serialized) => store.get(serialized)?.data as T | undefined,\n size,\n );\n const fingerprint = currentPages\n .map((page) => {\n const entry = store.getSnapshot(page.serialized);\n return `${page.serialized}:${entry.timestamp}:${entry.isValidating ? 1 : 0}:${entry.error == null ? 0 : 1}:${entry.data === undefined ? 0 : 1}`;\n })\n .join(\"|\");\n if (snapshotRef.current.fingerprint === fingerprint) {\n return snapshotRef.current;\n }\n const loaded: T[] = [];\n let error: unknown;\n let isValidating = false;\n let missing = false;\n for (const page of currentPages) {\n const entry = store.getSnapshot(page.serialized);\n if (entry.isValidating) {\n isValidating = true;\n }\n if (entry.error != null && error === undefined) {\n error = entry.error;\n }\n if (entry.data === undefined) {\n missing = true;\n break;\n }\n loaded.push(entry.data as T);\n }\n snapshotRef.current = {\n fingerprint,\n data: missing && loaded.length === 0 ? undefined : loaded,\n error,\n isValidating,\n };\n return snapshotRef.current;\n }, [serializedList, size, store]);\n\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n const setSize = useCallback(\n (next: number | ((current: number) => number)) => {\n setSizeState((current) =>\n typeof next === \"function\" ? next(current) : next,\n );\n },\n [],\n );\n\n const boundMutate = useCallback<MutateFn<T[]>>(\n async (updater, mutateOptions) => {\n const revalidate = mutateOptions?.revalidate ?? true;\n const rollbackOnError = mutateOptions?.rollbackOnError ?? true;\n const currentPages = collectPages(\n getKeyRef.current,\n (serialized) => store.get(serialized)?.data as T | undefined,\n size,\n );\n if (currentPages.length === 0) {\n return undefined;\n }\n\n const previous = currentPages.map((page) => ({\n serialized: page.serialized,\n entry: store.get(page.serialized),\n }));\n const restore = (): void => {\n for (const item of previous) {\n if (item.entry === undefined) {\n store.delete(item.serialized);\n } else {\n store.set(item.serialized, item.entry);\n }\n }\n };\n\n try {\n const loaded: T[] = [];\n for (const page of currentPages) {\n const pageData = store.get(page.serialized)?.data as T | undefined;\n if (pageData === undefined) {\n break;\n }\n loaded.push(pageData);\n }\n const current = loaded.length === 0 ? undefined : loaded;\n const next =\n typeof updater === \"function\"\n ? (\n updater as (\n current: T[] | undefined,\n ) => T[] | Promise<T[]>\n )(current)\n : updater;\n const resolved = isThenable(next) ? await next : next;\n const pagesValue = resolved as T[];\n\n for (const [index, page] of currentPages.entries()) {\n if (index >= pagesValue.length) {\n break;\n }\n store.set(page.serialized, {\n data: pagesValue[index],\n error: undefined,\n timestamp: Date.now(),\n isValidating: revalidate,\n });\n }\n\n if (revalidate) {\n await Promise.all(\n currentPages.map((page) =>\n coordinator.revalidate(page.serialized, undefined, {\n force: true,\n }),\n ),\n );\n }\n\n return currentPages\n .map((page) => store.get(page.serialized)?.data as T | undefined)\n .filter((page): page is T => page !== undefined);\n } catch (error) {\n if (rollbackOnError) {\n restore();\n }\n throw error;\n }\n },\n [coordinator, size, store],\n );\n\n const first = pages[0];\n const firstEntry = first ? store.getSnapshot(first.serialized) : undefined;\n\n return {\n data: snapshot.data,\n error: snapshot.error,\n isLoading:\n first != null &&\n firstEntry?.data === undefined &&\n firstEntry?.error == null,\n isValidating: snapshot.isValidating,\n size,\n setSize,\n mutate: boundMutate,\n };\n}\n","export type FocusCoordinator = {\n revalidate(key: string): Promise<void>;\n getRegisteredKeys(): string[];\n};\n\nexport function focusRevalidate(coordinator: FocusCoordinator): () => void {\n const onFocus = (): void => {\n for (const key of coordinator.getRegisteredKeys()) {\n void coordinator.revalidate(key);\n }\n };\n window.addEventListener(\"focus\", onFocus);\n return () => {\n window.removeEventListener(\"focus\", onFocus);\n };\n}\n","export type ReconnectCoordinator = {\n revalidate(key: string): Promise<void>;\n getRegisteredKeys(): string[];\n};\n\nexport function reconnectRevalidate(\n coordinator: ReconnectCoordinator,\n): () => void {\n const onOnline = (): void => {\n for (const key of coordinator.getRegisteredKeys()) {\n void coordinator.revalidate(key);\n }\n };\n window.addEventListener(\"online\", onOnline);\n return () => {\n window.removeEventListener(\"online\", onOnline);\n };\n}\n","export type PollingCoordinator = {\n revalidate(key: string): Promise<void>;\n};\n\nexport function pollingRevalidate(\n coordinator: PollingCoordinator,\n key: string,\n interval: number,\n): () => void {\n const id = setInterval(() => {\n void coordinator.revalidate(key);\n }, interval);\n return () => {\n clearInterval(id);\n };\n}\n","import type { Fetcher } from \"../types\";\n\nexport type RetryCoordinator = {\n revalidate(key: string): Promise<void>;\n};\n\nfunction isAbortError(error: unknown): boolean {\n return (\n (typeof DOMException !== \"undefined\" &&\n error instanceof DOMException &&\n error.name === \"AbortError\") ||\n (error instanceof Error && error.name === \"AbortError\")\n );\n}\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n return;\n }\n const id = setTimeout(resolve, ms);\n const onAbort = () => {\n clearTimeout(id);\n reject(signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\n/**\n * Wraps a fetcher with bounded backoff retries.\n * Retries happen inside the in-flight request. Do not call `coordinator.revalidate`\n * here — that would abort the request being retried.\n */\nexport function retryOnError<T>(\n _coordinator: RetryCoordinator,\n options: { attempts: number; backoff: number },\n): (fetcher: Fetcher<T>) => Fetcher<T> {\n return (fetcher) =>\n async (key, context) => {\n let lastError: unknown;\n for (let attempt = 0; attempt < options.attempts; attempt++) {\n if (context.signal.aborted) {\n throw (\n context.signal.reason ?? new DOMException(\"Aborted\", \"AbortError\")\n );\n }\n try {\n return await fetcher(key, context);\n } catch (error) {\n lastError = error;\n if (isAbortError(error) || attempt === options.attempts - 1) {\n break;\n }\n await sleep(options.backoff * 2 ** attempt, context.signal);\n }\n }\n throw lastError;\n };\n}\n","import type { EvictOptions } from \"../types\";\n\nexport type TtlEvictCoordinator = {\n evict(options: EvictOptions): string[];\n};\n\nexport function ttlEvict(\n coordinator: TtlEvictCoordinator,\n options: EvictOptions & { interval?: number },\n): () => void {\n const maxAge = options.maxAge;\n const maxKeys = options.maxKeys;\n const evictOptions: EvictOptions = {\n ...(maxAge != null ? { maxAge } : {}),\n ...(maxKeys != null ? { maxKeys } : {}),\n };\n const tick = (): void => {\n coordinator.evict(evictOptions);\n };\n tick();\n const id = setInterval(tick, options.interval ?? 30_000);\n return () => {\n clearInterval(id);\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "steddy",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Stale-while-revalidate data fetching for React, with strict layer separation.",
5
5
  "type": "module",
6
6
  "sideEffects": false,