steddy 0.1.1 → 0.1.2

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. `{ 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.
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. `measurePerf(coordinator)` subscribes to fetch events and returns `{ starts, aborts, dedups, writes, errors, totalMs }`. Run `npm run bench` for coordinator microbenchmarks.
49
49
 
50
50
  ## Architecture
51
51
 
package/dist/index.cjs CHANGED
@@ -8,6 +8,9 @@ var jsxRuntime = require('react/jsx-runtime');
8
8
  // src/coordinator.ts
9
9
  var DEDUP_WINDOW_MS = 2e3;
10
10
  var UNSUBSCRIBE_GRACE_MS = 0;
11
+ function now() {
12
+ return typeof performance !== "undefined" ? performance.now() : Date.now();
13
+ }
11
14
  function isAbortError(error) {
12
15
  return typeof DOMException !== "undefined" && error instanceof DOMException && error.name === "AbortError" || error instanceof Error && error.name === "AbortError";
13
16
  }
@@ -15,7 +18,16 @@ function createCoordinator(store) {
15
18
  const registered = /* @__PURE__ */ new Map();
16
19
  const inflight = /* @__PURE__ */ new Map();
17
20
  const releaseTimers = /* @__PURE__ */ new Map();
21
+ const listeners = /* @__PURE__ */ new Set();
18
22
  let generation = 0;
23
+ function emit(event) {
24
+ if (listeners.size === 0) {
25
+ return;
26
+ }
27
+ for (const listener of listeners) {
28
+ listener(event);
29
+ }
30
+ }
19
31
  function cancelRelease(serializedKey) {
20
32
  const timer = releaseTimers.get(serializedKey);
21
33
  if (timer == null) {
@@ -29,6 +41,11 @@ function createCoordinator(store) {
29
41
  if (!current) {
30
42
  return;
31
43
  }
44
+ emit({
45
+ type: "abort",
46
+ key: serializedKey,
47
+ ms: now() - current.startedAt
48
+ });
32
49
  current.controller.abort();
33
50
  current.settle();
34
51
  inflight.delete(serializedKey);
@@ -64,6 +81,7 @@ function createCoordinator(store) {
64
81
  if (!options?.force) {
65
82
  const entry = store.get(serializedKey);
66
83
  if (entry && !entry.isValidating && entry.error == null && entry.data !== void 0 && Date.now() - entry.timestamp < DEDUP_WINDOW_MS) {
84
+ emit({ type: "dedup", key: serializedKey });
67
85
  return;
68
86
  }
69
87
  }
@@ -87,12 +105,15 @@ function createCoordinator(store) {
87
105
  settleWaiter();
88
106
  }
89
107
  };
108
+ const startedAt = now();
90
109
  inflight.set(serializedKey, {
91
110
  controller,
92
111
  generation: currentGeneration,
93
112
  waiter,
94
- settle
113
+ settle,
114
+ startedAt
95
115
  });
116
+ emit({ type: "start", key: serializedKey });
96
117
  const previous = store.get(serializedKey);
97
118
  store.set(serializedKey, {
98
119
  data: previous?.data,
@@ -113,6 +134,11 @@ function createCoordinator(store) {
113
134
  timestamp: Date.now(),
114
135
  isValidating: false
115
136
  });
137
+ emit({
138
+ type: "write",
139
+ key: serializedKey,
140
+ ms: now() - startedAt
141
+ });
116
142
  } catch (error) {
117
143
  const stillCurrent = inflight.get(serializedKey)?.generation === currentGeneration;
118
144
  if (!stillCurrent || controller.signal.aborted || isAbortError(error)) {
@@ -126,6 +152,11 @@ function createCoordinator(store) {
126
152
  timestamp: current?.timestamp ?? 0,
127
153
  isValidating: false
128
154
  });
155
+ emit({
156
+ type: "error",
157
+ key: serializedKey,
158
+ ms: now() - startedAt
159
+ });
129
160
  throw error;
130
161
  } finally {
131
162
  settle();
@@ -145,7 +176,7 @@ function createCoordinator(store) {
145
176
  abortInternal(serializedKey, true);
146
177
  },
147
178
  evict(options) {
148
- const now = Date.now();
179
+ const now2 = Date.now();
149
180
  const removable = [];
150
181
  for (const key of store.keys()) {
151
182
  if (inflight.has(key) || store.subscriberCount(key) > 0) {
@@ -160,7 +191,7 @@ function createCoordinator(store) {
160
191
  const victims = /* @__PURE__ */ new Set();
161
192
  if (options.maxAge != null) {
162
193
  for (const item of removable) {
163
- if (now - item.timestamp >= options.maxAge) {
194
+ if (now2 - item.timestamp >= options.maxAge) {
164
195
  victims.add(item.key);
165
196
  }
166
197
  }
@@ -195,6 +226,12 @@ function createCoordinator(store) {
195
226
  abortInternal(key, false);
196
227
  }
197
228
  registered.clear();
229
+ },
230
+ subscribe(listener) {
231
+ listeners.add(listener);
232
+ return () => {
233
+ listeners.delete(listener);
234
+ };
198
235
  }
199
236
  };
200
237
  return coordinator;
@@ -843,6 +880,53 @@ function ttlEvict(coordinator, options) {
843
880
  };
844
881
  }
845
882
 
883
+ // src/plugins/measure.ts
884
+ function measurePerf(coordinator, onEvent) {
885
+ const snap = {
886
+ starts: 0,
887
+ aborts: 0,
888
+ dedups: 0,
889
+ writes: 0,
890
+ errors: 0,
891
+ totalMs: 0
892
+ };
893
+ const stop = coordinator.subscribe((event) => {
894
+ switch (event.type) {
895
+ case "start":
896
+ snap.starts += 1;
897
+ break;
898
+ case "abort":
899
+ snap.aborts += 1;
900
+ snap.totalMs += event.ms;
901
+ break;
902
+ case "dedup":
903
+ snap.dedups += 1;
904
+ break;
905
+ case "write":
906
+ snap.writes += 1;
907
+ snap.totalMs += event.ms;
908
+ break;
909
+ case "error":
910
+ snap.errors += 1;
911
+ snap.totalMs += event.ms;
912
+ break;
913
+ }
914
+ onEvent?.(event);
915
+ });
916
+ return {
917
+ snapshot: () => ({ ...snap }),
918
+ reset() {
919
+ snap.starts = 0;
920
+ snap.aborts = 0;
921
+ snap.dedups = 0;
922
+ snap.writes = 0;
923
+ snap.errors = 0;
924
+ snap.totalMs = 0;
925
+ },
926
+ stop
927
+ };
928
+ }
929
+
846
930
  exports.DEDUP_WINDOW_MS = DEDUP_WINDOW_MS;
847
931
  exports.SteddyProvider = SteddyProvider;
848
932
  exports.UNSUBSCRIBE_GRACE_MS = UNSUBSCRIBE_GRACE_MS;
@@ -857,6 +941,7 @@ exports.dump = dump;
857
941
  exports.focusRevalidate = focusRevalidate;
858
942
  exports.hydrate = hydrate;
859
943
  exports.hydrateAll = hydrateAll;
944
+ exports.measurePerf = measurePerf;
860
945
  exports.mutate = mutate;
861
946
  exports.pollingRevalidate = pollingRevalidate;
862
947
  exports.reconnectRevalidate = reconnectRevalidate;
@@ -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","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"]}
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","../src/plugins/measure.ts"],"names":["now","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 CoordinatorEvent =\n | { type: \"start\"; key: string }\n | { type: \"abort\"; key: string; ms: number }\n | { type: \"dedup\"; key: string }\n | { type: \"write\"; key: string; ms: number }\n | { type: \"error\"; key: string; ms: number };\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 subscribe(listener: (event: CoordinatorEvent) => void): () => void;\n};\n\ntype InFlight = {\n controller: AbortController;\n generation: number;\n waiter: Promise<void>;\n settle: () => void;\n startedAt: number;\n};\n\nfunction now(): number {\n return typeof performance !== \"undefined\" ? performance.now() : Date.now();\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 const listeners = new Set<(event: CoordinatorEvent) => void>();\n let generation = 0;\n\n function emit(event: CoordinatorEvent): void {\n if (listeners.size === 0) {\n return;\n }\n for (const listener of listeners) {\n listener(event);\n }\n }\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 emit({\n type: \"abort\",\n key: serializedKey,\n ms: now() - current.startedAt,\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 emit({ type: \"dedup\", key: serializedKey });\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 const startedAt = now();\n inflight.set(serializedKey, {\n controller,\n generation: currentGeneration,\n waiter,\n settle,\n startedAt,\n });\n emit({ type: \"start\", key: serializedKey });\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 emit({\n type: \"write\",\n key: serializedKey,\n ms: now() - startedAt,\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 emit({\n type: \"error\",\n key: serializedKey,\n ms: now() - startedAt,\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 subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\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","import type { CoordinatorEvent } from \"../coordinator\";\n\nexport type MeasureCoordinator = {\n subscribe(listener: (event: CoordinatorEvent) => void): () => void;\n};\n\nexport type PerfSnapshot = {\n starts: number;\n aborts: number;\n dedups: number;\n writes: number;\n errors: number;\n totalMs: number;\n};\n\nexport function measurePerf(\n coordinator: MeasureCoordinator,\n onEvent?: (event: CoordinatorEvent) => void,\n): {\n snapshot: () => PerfSnapshot;\n reset: () => void;\n stop: () => void;\n} {\n const snap: PerfSnapshot = {\n starts: 0,\n aborts: 0,\n dedups: 0,\n writes: 0,\n errors: 0,\n totalMs: 0,\n };\n\n const stop = coordinator.subscribe((event) => {\n switch (event.type) {\n case \"start\":\n snap.starts += 1;\n break;\n case \"abort\":\n snap.aborts += 1;\n snap.totalMs += event.ms;\n break;\n case \"dedup\":\n snap.dedups += 1;\n break;\n case \"write\":\n snap.writes += 1;\n snap.totalMs += event.ms;\n break;\n case \"error\":\n snap.errors += 1;\n snap.totalMs += event.ms;\n break;\n }\n onEvent?.(event);\n });\n\n return {\n snapshot: () => ({ ...snap }),\n reset() {\n snap.starts = 0;\n snap.aborts = 0;\n snap.dedups = 0;\n snap.writes = 0;\n snap.errors = 0;\n snap.totalMs = 0;\n },\n stop,\n };\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -78,6 +78,25 @@ declare const UNSUBSCRIBE_GRACE_MS = 0;
78
78
  type RevalidateOptions = {
79
79
  force?: boolean;
80
80
  };
81
+ type CoordinatorEvent = {
82
+ type: "start";
83
+ key: string;
84
+ } | {
85
+ type: "abort";
86
+ key: string;
87
+ ms: number;
88
+ } | {
89
+ type: "dedup";
90
+ key: string;
91
+ } | {
92
+ type: "write";
93
+ key: string;
94
+ ms: number;
95
+ } | {
96
+ type: "error";
97
+ key: string;
98
+ ms: number;
99
+ };
81
100
  type Coordinator = {
82
101
  register(serializedKey: string, key: Key, fetcher: Fetcher<unknown>): void;
83
102
  unregister(serializedKey: string): void;
@@ -89,6 +108,7 @@ type Coordinator = {
89
108
  abort(serializedKey: string): void;
90
109
  evict(options: EvictOptions): string[];
91
110
  reset(): void;
111
+ subscribe(listener: (event: CoordinatorEvent) => void): () => void;
92
112
  };
93
113
  declare function createCoordinator(store: Store): Coordinator;
94
114
 
@@ -158,4 +178,21 @@ declare function ttlEvict(coordinator: TtlEvictCoordinator, options: EvictOption
158
178
  interval?: number;
159
179
  }): () => void;
160
180
 
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 };
181
+ type MeasureCoordinator = {
182
+ subscribe(listener: (event: CoordinatorEvent) => void): () => void;
183
+ };
184
+ type PerfSnapshot = {
185
+ starts: number;
186
+ aborts: number;
187
+ dedups: number;
188
+ writes: number;
189
+ errors: number;
190
+ totalMs: number;
191
+ };
192
+ declare function measurePerf(coordinator: MeasureCoordinator, onEvent?: (event: CoordinatorEvent) => void): {
193
+ snapshot: () => PerfSnapshot;
194
+ reset: () => void;
195
+ stop: () => void;
196
+ };
197
+
198
+ export { type CacheEntry, type CacheSnapshot, type Coordinator, type CoordinatorEvent, DEDUP_WINDOW_MS, type EvictOptions, type Fetcher, type Key, type MeasureCoordinator, type MutateFn, type MutateOptions, type MutateUpdater, type PerfSnapshot, 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, measurePerf, mutate, pollingRevalidate, reconnectRevalidate, retryOnError, serializeKey, ttlEvict, useSteddy, useSteddyInfinite };
package/dist/index.d.ts CHANGED
@@ -78,6 +78,25 @@ declare const UNSUBSCRIBE_GRACE_MS = 0;
78
78
  type RevalidateOptions = {
79
79
  force?: boolean;
80
80
  };
81
+ type CoordinatorEvent = {
82
+ type: "start";
83
+ key: string;
84
+ } | {
85
+ type: "abort";
86
+ key: string;
87
+ ms: number;
88
+ } | {
89
+ type: "dedup";
90
+ key: string;
91
+ } | {
92
+ type: "write";
93
+ key: string;
94
+ ms: number;
95
+ } | {
96
+ type: "error";
97
+ key: string;
98
+ ms: number;
99
+ };
81
100
  type Coordinator = {
82
101
  register(serializedKey: string, key: Key, fetcher: Fetcher<unknown>): void;
83
102
  unregister(serializedKey: string): void;
@@ -89,6 +108,7 @@ type Coordinator = {
89
108
  abort(serializedKey: string): void;
90
109
  evict(options: EvictOptions): string[];
91
110
  reset(): void;
111
+ subscribe(listener: (event: CoordinatorEvent) => void): () => void;
92
112
  };
93
113
  declare function createCoordinator(store: Store): Coordinator;
94
114
 
@@ -158,4 +178,21 @@ declare function ttlEvict(coordinator: TtlEvictCoordinator, options: EvictOption
158
178
  interval?: number;
159
179
  }): () => void;
160
180
 
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 };
181
+ type MeasureCoordinator = {
182
+ subscribe(listener: (event: CoordinatorEvent) => void): () => void;
183
+ };
184
+ type PerfSnapshot = {
185
+ starts: number;
186
+ aborts: number;
187
+ dedups: number;
188
+ writes: number;
189
+ errors: number;
190
+ totalMs: number;
191
+ };
192
+ declare function measurePerf(coordinator: MeasureCoordinator, onEvent?: (event: CoordinatorEvent) => void): {
193
+ snapshot: () => PerfSnapshot;
194
+ reset: () => void;
195
+ stop: () => void;
196
+ };
197
+
198
+ export { type CacheEntry, type CacheSnapshot, type Coordinator, type CoordinatorEvent, DEDUP_WINDOW_MS, type EvictOptions, type Fetcher, type Key, type MeasureCoordinator, type MutateFn, type MutateOptions, type MutateUpdater, type PerfSnapshot, 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, measurePerf, mutate, pollingRevalidate, reconnectRevalidate, retryOnError, serializeKey, ttlEvict, useSteddy, useSteddyInfinite };
package/dist/index.js CHANGED
@@ -6,6 +6,9 @@ import { jsx } from 'react/jsx-runtime';
6
6
  // src/coordinator.ts
7
7
  var DEDUP_WINDOW_MS = 2e3;
8
8
  var UNSUBSCRIBE_GRACE_MS = 0;
9
+ function now() {
10
+ return typeof performance !== "undefined" ? performance.now() : Date.now();
11
+ }
9
12
  function isAbortError(error) {
10
13
  return typeof DOMException !== "undefined" && error instanceof DOMException && error.name === "AbortError" || error instanceof Error && error.name === "AbortError";
11
14
  }
@@ -13,7 +16,16 @@ function createCoordinator(store) {
13
16
  const registered = /* @__PURE__ */ new Map();
14
17
  const inflight = /* @__PURE__ */ new Map();
15
18
  const releaseTimers = /* @__PURE__ */ new Map();
19
+ const listeners = /* @__PURE__ */ new Set();
16
20
  let generation = 0;
21
+ function emit(event) {
22
+ if (listeners.size === 0) {
23
+ return;
24
+ }
25
+ for (const listener of listeners) {
26
+ listener(event);
27
+ }
28
+ }
17
29
  function cancelRelease(serializedKey) {
18
30
  const timer = releaseTimers.get(serializedKey);
19
31
  if (timer == null) {
@@ -27,6 +39,11 @@ function createCoordinator(store) {
27
39
  if (!current) {
28
40
  return;
29
41
  }
42
+ emit({
43
+ type: "abort",
44
+ key: serializedKey,
45
+ ms: now() - current.startedAt
46
+ });
30
47
  current.controller.abort();
31
48
  current.settle();
32
49
  inflight.delete(serializedKey);
@@ -62,6 +79,7 @@ function createCoordinator(store) {
62
79
  if (!options?.force) {
63
80
  const entry = store.get(serializedKey);
64
81
  if (entry && !entry.isValidating && entry.error == null && entry.data !== void 0 && Date.now() - entry.timestamp < DEDUP_WINDOW_MS) {
82
+ emit({ type: "dedup", key: serializedKey });
65
83
  return;
66
84
  }
67
85
  }
@@ -85,12 +103,15 @@ function createCoordinator(store) {
85
103
  settleWaiter();
86
104
  }
87
105
  };
106
+ const startedAt = now();
88
107
  inflight.set(serializedKey, {
89
108
  controller,
90
109
  generation: currentGeneration,
91
110
  waiter,
92
- settle
111
+ settle,
112
+ startedAt
93
113
  });
114
+ emit({ type: "start", key: serializedKey });
94
115
  const previous = store.get(serializedKey);
95
116
  store.set(serializedKey, {
96
117
  data: previous?.data,
@@ -111,6 +132,11 @@ function createCoordinator(store) {
111
132
  timestamp: Date.now(),
112
133
  isValidating: false
113
134
  });
135
+ emit({
136
+ type: "write",
137
+ key: serializedKey,
138
+ ms: now() - startedAt
139
+ });
114
140
  } catch (error) {
115
141
  const stillCurrent = inflight.get(serializedKey)?.generation === currentGeneration;
116
142
  if (!stillCurrent || controller.signal.aborted || isAbortError(error)) {
@@ -124,6 +150,11 @@ function createCoordinator(store) {
124
150
  timestamp: current?.timestamp ?? 0,
125
151
  isValidating: false
126
152
  });
153
+ emit({
154
+ type: "error",
155
+ key: serializedKey,
156
+ ms: now() - startedAt
157
+ });
127
158
  throw error;
128
159
  } finally {
129
160
  settle();
@@ -143,7 +174,7 @@ function createCoordinator(store) {
143
174
  abortInternal(serializedKey, true);
144
175
  },
145
176
  evict(options) {
146
- const now = Date.now();
177
+ const now2 = Date.now();
147
178
  const removable = [];
148
179
  for (const key of store.keys()) {
149
180
  if (inflight.has(key) || store.subscriberCount(key) > 0) {
@@ -158,7 +189,7 @@ function createCoordinator(store) {
158
189
  const victims = /* @__PURE__ */ new Set();
159
190
  if (options.maxAge != null) {
160
191
  for (const item of removable) {
161
- if (now - item.timestamp >= options.maxAge) {
192
+ if (now2 - item.timestamp >= options.maxAge) {
162
193
  victims.add(item.key);
163
194
  }
164
195
  }
@@ -193,6 +224,12 @@ function createCoordinator(store) {
193
224
  abortInternal(key, false);
194
225
  }
195
226
  registered.clear();
227
+ },
228
+ subscribe(listener) {
229
+ listeners.add(listener);
230
+ return () => {
231
+ listeners.delete(listener);
232
+ };
196
233
  }
197
234
  };
198
235
  return coordinator;
@@ -841,6 +878,53 @@ function ttlEvict(coordinator, options) {
841
878
  };
842
879
  }
843
880
 
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 };
881
+ // src/plugins/measure.ts
882
+ function measurePerf(coordinator, onEvent) {
883
+ const snap = {
884
+ starts: 0,
885
+ aborts: 0,
886
+ dedups: 0,
887
+ writes: 0,
888
+ errors: 0,
889
+ totalMs: 0
890
+ };
891
+ const stop = coordinator.subscribe((event) => {
892
+ switch (event.type) {
893
+ case "start":
894
+ snap.starts += 1;
895
+ break;
896
+ case "abort":
897
+ snap.aborts += 1;
898
+ snap.totalMs += event.ms;
899
+ break;
900
+ case "dedup":
901
+ snap.dedups += 1;
902
+ break;
903
+ case "write":
904
+ snap.writes += 1;
905
+ snap.totalMs += event.ms;
906
+ break;
907
+ case "error":
908
+ snap.errors += 1;
909
+ snap.totalMs += event.ms;
910
+ break;
911
+ }
912
+ onEvent?.(event);
913
+ });
914
+ return {
915
+ snapshot: () => ({ ...snap }),
916
+ reset() {
917
+ snap.starts = 0;
918
+ snap.aborts = 0;
919
+ snap.dedups = 0;
920
+ snap.writes = 0;
921
+ snap.errors = 0;
922
+ snap.totalMs = 0;
923
+ },
924
+ stop
925
+ };
926
+ }
927
+
928
+ export { DEDUP_WINDOW_MS, SteddyProvider, UNSUBSCRIBE_GRACE_MS, clear, createCoordinator, createMutate, createRuntime, createStore, defaultCoordinator, defaultStore, dump, focusRevalidate, hydrate, hydrateAll, measurePerf, mutate, pollingRevalidate, reconnectRevalidate, retryOnError, serializeKey, ttlEvict, useSteddy, useSteddyInfinite };
845
929
  //# sourceMappingURL=index.js.map
846
930
  //# 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","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"]}
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","../src/plugins/measure.ts"],"names":["now","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 CoordinatorEvent =\n | { type: \"start\"; key: string }\n | { type: \"abort\"; key: string; ms: number }\n | { type: \"dedup\"; key: string }\n | { type: \"write\"; key: string; ms: number }\n | { type: \"error\"; key: string; ms: number };\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 subscribe(listener: (event: CoordinatorEvent) => void): () => void;\n};\n\ntype InFlight = {\n controller: AbortController;\n generation: number;\n waiter: Promise<void>;\n settle: () => void;\n startedAt: number;\n};\n\nfunction now(): number {\n return typeof performance !== \"undefined\" ? performance.now() : Date.now();\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 const listeners = new Set<(event: CoordinatorEvent) => void>();\n let generation = 0;\n\n function emit(event: CoordinatorEvent): void {\n if (listeners.size === 0) {\n return;\n }\n for (const listener of listeners) {\n listener(event);\n }\n }\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 emit({\n type: \"abort\",\n key: serializedKey,\n ms: now() - current.startedAt,\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 emit({ type: \"dedup\", key: serializedKey });\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 const startedAt = now();\n inflight.set(serializedKey, {\n controller,\n generation: currentGeneration,\n waiter,\n settle,\n startedAt,\n });\n emit({ type: \"start\", key: serializedKey });\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 emit({\n type: \"write\",\n key: serializedKey,\n ms: now() - startedAt,\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 emit({\n type: \"error\",\n key: serializedKey,\n ms: now() - startedAt,\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 subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\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","import type { CoordinatorEvent } from \"../coordinator\";\n\nexport type MeasureCoordinator = {\n subscribe(listener: (event: CoordinatorEvent) => void): () => void;\n};\n\nexport type PerfSnapshot = {\n starts: number;\n aborts: number;\n dedups: number;\n writes: number;\n errors: number;\n totalMs: number;\n};\n\nexport function measurePerf(\n coordinator: MeasureCoordinator,\n onEvent?: (event: CoordinatorEvent) => void,\n): {\n snapshot: () => PerfSnapshot;\n reset: () => void;\n stop: () => void;\n} {\n const snap: PerfSnapshot = {\n starts: 0,\n aborts: 0,\n dedups: 0,\n writes: 0,\n errors: 0,\n totalMs: 0,\n };\n\n const stop = coordinator.subscribe((event) => {\n switch (event.type) {\n case \"start\":\n snap.starts += 1;\n break;\n case \"abort\":\n snap.aborts += 1;\n snap.totalMs += event.ms;\n break;\n case \"dedup\":\n snap.dedups += 1;\n break;\n case \"write\":\n snap.writes += 1;\n snap.totalMs += event.ms;\n break;\n case \"error\":\n snap.errors += 1;\n snap.totalMs += event.ms;\n break;\n }\n onEvent?.(event);\n });\n\n return {\n snapshot: () => ({ ...snap }),\n reset() {\n snap.starts = 0;\n snap.aborts = 0;\n snap.dedups = 0;\n snap.writes = 0;\n snap.errors = 0;\n snap.totalMs = 0;\n },\n stop,\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "steddy",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Stale-while-revalidate data fetching for React, with strict layer separation.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -22,6 +22,7 @@
22
22
  "build": "tsup",
23
23
  "test": "vitest run",
24
24
  "test:watch": "vitest",
25
+ "bench": "vitest bench --run",
25
26
  "typecheck": "tsc --noEmit",
26
27
  "prepublishOnly": "npm run typecheck && npm test && npm run build"
27
28
  },