steddy 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +62 -0
- package/dist/index.cjs +786 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +158 -0
- package/dist/index.d.ts +158 -0
- package/dist/index.js +764 -0
- package/dist/index.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/coordinator.ts","../src/store.ts","../src/defaults.ts","../src/key.ts","../src/mutate.ts","../src/context.tsx","../src/useSteddy.ts","../src/useSteddyInfinite.ts","../src/plugins/focus.ts","../src/plugins/reconnect.ts","../src/plugins/polling.ts","../src/plugins/retry.ts","../src/plugins/ttl.ts"],"names":["mutate","useRef","useCallback","useSyncExternalStore","first","isAbortError"],"mappings":"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","file":"index.js","sourcesContent":["import type { EvictOptions, Fetcher, Key } from \"./types\";\nimport type { Store } from \"./store\";\n\nexport const DEDUP_WINDOW_MS = 2000;\n\nexport type RevalidateOptions = {\n force?: boolean;\n};\n\nexport type Coordinator = {\n register(serializedKey: string, key: Key, fetcher: Fetcher<unknown>): void;\n unregister(serializedKey: string): void;\n revalidate(\n serializedKey: string,\n fetcher?: Fetcher<unknown>,\n options?: RevalidateOptions,\n ): Promise<void>;\n isInFlight(serializedKey: string): boolean;\n getInFlightPromise(serializedKey: string): Promise<void> | undefined;\n getRegisteredKeys(): string[];\n abort(serializedKey: string): void;\n evict(options: EvictOptions): string[];\n reset(): void;\n};\n\ntype InFlight = {\n controller: AbortController;\n generation: number;\n waiter: Promise<void>;\n settle: () => void;\n};\n\nfunction isAbortError(error: unknown): boolean {\n return (\n (typeof DOMException !== \"undefined\" &&\n error instanceof DOMException &&\n error.name === \"AbortError\") ||\n (error instanceof Error && error.name === \"AbortError\")\n );\n}\n\nexport function createCoordinator(store: Store): Coordinator {\n const registered = new Map<\n string,\n { key: Key; fetcher: Fetcher<unknown> }\n >();\n const inflight = new Map<string, InFlight>();\n let generation = 0;\n\n function abortInternal(serializedKey: string, markIdle: boolean): void {\n const current = inflight.get(serializedKey);\n if (!current) {\n return;\n }\n current.controller.abort();\n current.settle();\n inflight.delete(serializedKey);\n if (markIdle) {\n const entry = store.get(serializedKey);\n if (entry?.isValidating) {\n store.set(serializedKey, { ...entry, isValidating: false });\n }\n }\n }\n\n const coordinator: Coordinator = {\n register(serializedKey, key, fetcher) {\n registered.set(serializedKey, { key, fetcher });\n },\n\n unregister(serializedKey) {\n registered.delete(serializedKey);\n },\n\n async revalidate(serializedKey, fetcher, options) {\n if (!options?.force) {\n const entry = store.get(serializedKey);\n if (\n entry &&\n !entry.isValidating &&\n entry.error == null &&\n entry.data !== undefined &&\n Date.now() - entry.timestamp < DEDUP_WINDOW_MS\n ) {\n return;\n }\n }\n\n abortInternal(serializedKey, false);\n\n const record = registered.get(serializedKey);\n const key = record?.key ?? serializedKey;\n const run = fetcher ?? record?.fetcher;\n if (!run) {\n return;\n }\n\n const controller = new AbortController();\n const currentGeneration = ++generation;\n let settled = false;\n let settleWaiter!: () => void;\n const waiter = new Promise<void>((resolve) => {\n settleWaiter = resolve;\n });\n const settle = (): void => {\n if (!settled) {\n settled = true;\n settleWaiter();\n }\n };\n inflight.set(serializedKey, {\n controller,\n generation: currentGeneration,\n waiter,\n settle,\n });\n\n const previous = store.get(serializedKey);\n store.set(serializedKey, {\n data: previous?.data,\n error: previous?.error,\n timestamp: previous?.timestamp ?? 0,\n isValidating: true,\n });\n\n try {\n const data = await run(key, { signal: controller.signal });\n const stillCurrent =\n inflight.get(serializedKey)?.generation === currentGeneration;\n if (!stillCurrent || controller.signal.aborted) {\n return;\n }\n inflight.delete(serializedKey);\n store.set(serializedKey, {\n data,\n error: undefined,\n timestamp: Date.now(),\n isValidating: false,\n });\n } catch (error) {\n const stillCurrent =\n inflight.get(serializedKey)?.generation === currentGeneration;\n if (!stillCurrent || controller.signal.aborted || isAbortError(error)) {\n return;\n }\n inflight.delete(serializedKey);\n const current = store.get(serializedKey);\n store.set(serializedKey, {\n data: current?.data,\n error,\n timestamp: current?.timestamp ?? 0,\n isValidating: false,\n });\n throw error;\n } finally {\n settle();\n }\n },\n\n isInFlight(serializedKey) {\n return inflight.has(serializedKey);\n },\n\n getInFlightPromise(serializedKey) {\n return inflight.get(serializedKey)?.waiter;\n },\n\n getRegisteredKeys() {\n return [...registered.keys()];\n },\n\n abort(serializedKey) {\n abortInternal(serializedKey, true);\n },\n\n evict(options) {\n const now = Date.now();\n const removable: { key: string; timestamp: number }[] = [];\n for (const key of store.keys()) {\n if (inflight.has(key) || store.subscriberCount(key) > 0) {\n continue;\n }\n const entry = store.get(key);\n if (!entry) {\n continue;\n }\n removable.push({ key, timestamp: entry.timestamp });\n }\n\n const victims = new Set<string>();\n if (options.maxAge != null) {\n for (const item of removable) {\n if (now - item.timestamp >= options.maxAge) {\n victims.add(item.key);\n }\n }\n }\n\n if (options.maxKeys != null) {\n const liveCount = store.keys().filter((key) => !victims.has(key)).length;\n let over = liveCount - options.maxKeys;\n if (over > 0) {\n const extra = removable\n .filter((item) => !victims.has(item.key))\n .sort((a, b) => a.timestamp - b.timestamp);\n for (const item of extra) {\n if (over <= 0) {\n break;\n }\n victims.add(item.key);\n over -= 1;\n }\n }\n }\n\n for (const key of victims) {\n abortInternal(key, false);\n registered.delete(key);\n store.delete(key);\n }\n return [...victims];\n },\n\n reset() {\n for (const key of [...inflight.keys()]) {\n abortInternal(key, false);\n }\n registered.clear();\n },\n };\n\n return coordinator;\n}\n","import type { CacheEntry } from \"./types\";\n\n/**\n * Dumb key-value store with per-key subscriptions.\n * Hard rule: this file must not import network requests, timers, or browser events.\n */\nexport type Store = {\n get(key: string): CacheEntry | undefined;\n set(key: string, entry: CacheEntry): void;\n delete(key: string): void;\n subscribe(key: string, callback: () => void): () => void;\n getSnapshot(key: string): CacheEntry;\n subscriberCount(key: string): number;\n keys(): string[];\n clear(): void;\n};\n\nexport const EMPTY_SNAPSHOT: CacheEntry = Object.freeze({\n data: undefined,\n error: undefined,\n timestamp: 0,\n isValidating: false,\n});\n\nexport function createStore(): Store {\n const entries = new Map<string, CacheEntry>();\n const listeners = new Map<string, Set<() => void>>();\n\n function emit(key: string): void {\n const subs = listeners.get(key);\n if (!subs) {\n return;\n }\n for (const callback of subs) {\n callback();\n }\n }\n\n return {\n get(key) {\n return entries.get(key);\n },\n\n set(key, entry) {\n entries.set(key, entry);\n emit(key);\n },\n\n delete(key) {\n const existed = entries.delete(key);\n if (existed) {\n emit(key);\n }\n },\n\n subscribe(key, callback) {\n let subs = listeners.get(key);\n if (!subs) {\n subs = new Set();\n listeners.set(key, subs);\n }\n subs.add(callback);\n return () => {\n const current = listeners.get(key);\n if (!current) {\n return;\n }\n current.delete(callback);\n if (current.size === 0) {\n listeners.delete(key);\n }\n };\n },\n\n getSnapshot(key) {\n return entries.get(key) ?? EMPTY_SNAPSHOT;\n },\n\n subscriberCount(key) {\n return listeners.get(key)?.size ?? 0;\n },\n\n keys() {\n return [...entries.keys()];\n },\n\n clear() {\n const keys = new Set([...entries.keys(), ...listeners.keys()]);\n entries.clear();\n for (const key of keys) {\n emit(key);\n }\n },\n };\n}\n","import { createCoordinator } from \"./coordinator\";\nimport { createStore } from \"./store\";\n\nexport const defaultStore = createStore();\nexport const defaultCoordinator = createCoordinator(defaultStore);\n","import type { Key } from \"./types\";\n\nexport function serializeKey(key: Key): string {\n if (typeof key === \"string\") {\n return key;\n }\n return JSON.stringify(key);\n}\n\nexport function keysShallowEqual(a: Key | null, b: Key | null): boolean {\n if (a === b) {\n return true;\n }\n if (a == null || b == null) {\n return false;\n }\n if (typeof a === \"string\" || typeof b === \"string\") {\n return a === b;\n }\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (!Object.is(a[i], b[i])) {\n return false;\n }\n }\n return true;\n}\n","import type { Coordinator } from \"./coordinator\";\nimport { defaultCoordinator, defaultStore } from \"./defaults\";\nimport { serializeKey } from \"./key\";\nimport type { Store } from \"./store\";\nimport type { Key, MutateOptions, MutateUpdater } from \"./types\";\n\nfunction isThenable<T>(value: T | Promise<T>): value is Promise<T> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as Promise<T>).then === \"function\"\n );\n}\n\nexport function createMutate(store: Store, coordinator: Coordinator) {\n return async function mutate<T>(\n key: Key,\n updater: MutateUpdater<T>,\n options?: MutateOptions,\n ): Promise<T | undefined> {\n const revalidate = options?.revalidate ?? true;\n const rollbackOnError = options?.rollbackOnError ?? true;\n const serialized = serializeKey(key);\n const previous = store.get(serialized);\n\n const restore = (): void => {\n if (previous === undefined) {\n store.delete(serialized);\n } else {\n store.set(serialized, previous);\n }\n };\n\n try {\n const currentData = previous?.data as T | undefined;\n const next =\n typeof updater === \"function\"\n ? (updater as (current: T | undefined) => T | Promise<T>)(currentData)\n : updater;\n\n if (isThenable(next)) {\n store.set(serialized, {\n data: currentData,\n error: previous?.error,\n timestamp: previous?.timestamp ?? 0,\n isValidating: true,\n });\n const resolved = await next;\n store.set(serialized, {\n data: resolved,\n error: undefined,\n timestamp: Date.now(),\n isValidating: revalidate,\n });\n } else {\n store.set(serialized, {\n data: next,\n error: undefined,\n timestamp: Date.now(),\n isValidating: revalidate,\n });\n }\n\n if (revalidate) {\n await coordinator.revalidate(serialized, undefined, { force: true });\n }\n\n return store.get(serialized)?.data as T | undefined;\n } catch (error) {\n if (rollbackOnError) {\n restore();\n } else {\n const current = store.get(serialized);\n store.set(serialized, {\n data: current?.data,\n error,\n timestamp: current?.timestamp ?? Date.now(),\n isValidating: false,\n });\n }\n throw error;\n }\n };\n}\n\nexport const mutate = createMutate(defaultStore, defaultCoordinator);\n","import { createCoordinator, type Coordinator } from \"./coordinator\";\nimport { createMutate } from \"./mutate\";\nimport { defaultCoordinator, defaultStore } from \"./defaults\";\nimport { createStore, type Store } from \"./store\";\nimport type { CacheSnapshot, Key } from \"./types\";\nimport { serializeKey } from \"./key\";\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\";\n\nexport type SteddyRuntime = {\n store: Store;\n coordinator: Coordinator;\n mutate: ReturnType<typeof createMutate>;\n};\n\nexport function createRuntime(): SteddyRuntime {\n const store = createStore();\n const coordinator = createCoordinator(store);\n return {\n store,\n coordinator,\n mutate: createMutate(store, coordinator),\n };\n}\n\nconst defaultRuntime: SteddyRuntime = {\n store: defaultStore,\n coordinator: defaultCoordinator,\n mutate: createMutate(defaultStore, defaultCoordinator),\n};\n\nconst SteddyContext = createContext<SteddyRuntime>(defaultRuntime);\n\nexport function SteddyProvider({\n store,\n coordinator,\n cache,\n children,\n}: {\n store: Store;\n coordinator: Coordinator;\n cache?: CacheSnapshot;\n children: ReactNode;\n}) {\n const value = useMemo<SteddyRuntime>(() => {\n if (cache) {\n hydrateAll(cache, store);\n }\n return {\n store,\n coordinator,\n mutate: createMutate(store, coordinator),\n };\n }, [store, coordinator, cache]);\n return <SteddyContext.Provider value={value}>{children}</SteddyContext.Provider>;\n}\n\nexport function useSteddyRuntime(): SteddyRuntime {\n return useContext(SteddyContext);\n}\n\n/** Seed the cache so the next render can show data immediately. Timestamp is 0 so mount still revalidates. */\nexport function hydrate<T>(key: Key, data: T, store: Store = defaultStore): void {\n store.set(serializeKey(key), {\n data,\n error: undefined,\n timestamp: 0,\n isValidating: false,\n });\n}\n\n/** JSON-safe cache payload for SSR / RSC client boundaries. Errors and in-flight flags are omitted. */\nexport function dump(store: Store = defaultStore): CacheSnapshot {\n const snapshot: Record<string, { data: unknown; timestamp: number }> = {};\n for (const key of store.keys()) {\n const entry = store.get(key);\n if (!entry || entry.data === undefined) {\n continue;\n }\n snapshot[key] = { data: entry.data, timestamp: entry.timestamp };\n }\n return snapshot;\n}\n\n/** Restore a dumped snapshot. Timestamps are 0 so the client still revalidates. */\nexport function hydrateAll(\n snapshot: CacheSnapshot,\n store: Store = defaultStore,\n): void {\n for (const [key, payload] of Object.entries(snapshot)) {\n store.set(key, {\n data: payload.data,\n error: undefined,\n timestamp: 0,\n isValidating: false,\n });\n }\n}\n\n/** Drop one key, or the whole cache. Aborts in-flight work for deleted keys. */\nexport function clear(\n key?: Key,\n runtime: Pick<SteddyRuntime, \"store\" | \"coordinator\"> = defaultRuntime,\n): void {\n if (key === undefined) {\n for (const active of runtime.coordinator.getRegisteredKeys()) {\n runtime.coordinator.abort(active);\n }\n runtime.coordinator.reset();\n runtime.store.clear();\n return;\n }\n const serialized = serializeKey(key);\n runtime.coordinator.abort(serialized);\n runtime.coordinator.unregister(serialized);\n runtime.store.delete(serialized);\n}\n","import { useCallback, useRef, useSyncExternalStore } from \"react\";\nimport { useSteddyRuntime } from \"./context\";\nimport { keysShallowEqual, serializeKey } from \"./key\";\nimport { EMPTY_SNAPSHOT } from \"./store\";\nimport type {\n Fetcher,\n Key,\n MutateFn,\n UseSteddyOptions,\n UseSteddyResult,\n} from \"./types\";\n\nfunction useSerializedKey(key: Key | null): string | null {\n const prevKey = useRef<Key | null>(null);\n const prevSerialized = useRef<string | null>(null);\n if (key == null) {\n prevKey.current = null;\n prevSerialized.current = null;\n return null;\n }\n if (\n prevSerialized.current != null &&\n keysShallowEqual(prevKey.current, key)\n ) {\n return prevSerialized.current;\n }\n prevKey.current = key;\n prevSerialized.current = serializeKey(key);\n return prevSerialized.current;\n}\n\nexport function useSteddy<T>(\n key: Key | null,\n fetcher: Fetcher<T>,\n options?: UseSteddyOptions,\n): UseSteddyResult<T> {\n const { store, coordinator, mutate: runtimeMutate } = useSteddyRuntime();\n const serialized = useSerializedKey(key);\n const fetcherRef = useRef(fetcher);\n fetcherRef.current = fetcher;\n const keyRef = useRef(key);\n keyRef.current = key;\n\n if (serialized != null && key != null) {\n coordinator.register(serialized, key, (k, ctx) =>\n fetcherRef.current(k, ctx),\n );\n }\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n if (serialized == null || keyRef.current == null) {\n return () => {};\n }\n const originalKey = keyRef.current;\n coordinator.register(serialized, originalKey, (k, ctx) =>\n fetcherRef.current(k, ctx),\n );\n const unsubscribe = store.subscribe(serialized, onStoreChange);\n if (!coordinator.isInFlight(serialized)) {\n void coordinator.revalidate(serialized).catch(() => {});\n }\n return () => {\n unsubscribe();\n if (store.subscriberCount(serialized) === 0) {\n coordinator.abort(serialized);\n coordinator.unregister(serialized);\n }\n };\n },\n [serialized, store, coordinator],\n );\n\n const getSnapshot = useCallback(() => {\n if (serialized == null) {\n return EMPTY_SNAPSHOT;\n }\n return store.getSnapshot(serialized);\n }, [serialized, store]);\n\n // Same snapshot on the server so a dumped cache can render without a mismatch.\n // Source: https://react.dev/reference/react/useSyncExternalStore\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n const boundMutate = useCallback<MutateFn<T>>(\n (updater, mutateOptions) => {\n if (keyRef.current == null) {\n return Promise.resolve(undefined);\n }\n return runtimeMutate(keyRef.current, updater, mutateOptions);\n },\n [runtimeMutate],\n );\n\n if (options?.suspense && serialized != null) {\n if (snapshot.error != null) {\n throw snapshot.error;\n }\n if (snapshot.data === undefined) {\n const waiter =\n coordinator.getInFlightPromise(serialized) ??\n coordinator.revalidate(serialized).catch(() => {});\n throw waiter;\n }\n }\n\n return {\n data: snapshot.data as T | undefined,\n error: snapshot.error,\n isLoading:\n serialized != null &&\n snapshot.data === undefined &&\n snapshot.error == null,\n isValidating: snapshot.isValidating,\n mutate: boundMutate,\n };\n}\n","import { useCallback, useRef, useState, useSyncExternalStore } from \"react\";\nimport { useSteddyRuntime } from \"./context\";\nimport { serializeKey } from \"./key\";\nimport type { Fetcher, Key, MutateFn } from \"./types\";\n\nexport type UseSteddyInfiniteResult<T> = {\n data: T[] | undefined;\n error: unknown;\n isLoading: boolean;\n isValidating: boolean;\n size: number;\n setSize: (next: number | ((current: number) => number)) => void;\n mutate: MutateFn<T[]>;\n};\n\nfunction collectPages<T>(\n getKey: (index: number, previousPageData: T | undefined) => Key | null,\n getData: (serialized: string) => T | undefined,\n size: number,\n): { key: Key; serialized: string }[] {\n const pages: { key: Key; serialized: string }[] = [];\n let previous: T | undefined;\n for (let index = 0; index < size; index++) {\n const key = getKey(index, previous);\n if (key == null) {\n break;\n }\n const serialized = serializeKey(key);\n pages.push({ key, serialized });\n previous = getData(serialized);\n }\n return pages;\n}\n\nexport function useSteddyInfinite<T>(\n getKey: (\n index: number,\n previousPageData: T | undefined,\n ) => Key | null,\n fetcher: Fetcher<T>,\n options?: { initialSize?: number },\n): UseSteddyInfiniteResult<T> {\n const { store, coordinator, mutate: runtimeMutate } = useSteddyRuntime();\n const [size, setSizeState] = useState(options?.initialSize ?? 1);\n const fetcherRef = useRef(fetcher);\n fetcherRef.current = fetcher;\n const getKeyRef = useRef(getKey);\n getKeyRef.current = getKey;\n\n const pages = collectPages(\n getKey,\n (serialized) => store.get(serialized)?.data as T | undefined,\n size,\n );\n const serializedList = pages.map((page) => page.serialized).join(\"\\0\");\n\n for (const page of pages) {\n coordinator.register(page.serialized, page.key, (k, ctx) =>\n fetcherRef.current(k, ctx),\n );\n }\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n const currentPages = collectPages(\n getKeyRef.current,\n (serialized) => store.get(serialized)?.data as T | undefined,\n size,\n );\n const unsubscribes = currentPages.map((page) => {\n coordinator.register(page.serialized, page.key, (k, ctx) =>\n fetcherRef.current(k, ctx),\n );\n if (!coordinator.isInFlight(page.serialized)) {\n void coordinator.revalidate(page.serialized).catch(() => {});\n }\n return store.subscribe(page.serialized, onStoreChange);\n });\n return () => {\n for (const [index, page] of currentPages.entries()) {\n unsubscribes[index]?.();\n if (store.subscriberCount(page.serialized) === 0) {\n coordinator.abort(page.serialized);\n coordinator.unregister(page.serialized);\n }\n }\n };\n },\n [serializedList, size, store, coordinator],\n );\n\n const snapshotRef = useRef<{\n fingerprint: string;\n data: T[] | undefined;\n error: unknown;\n isValidating: boolean;\n }>({\n fingerprint: \"\",\n data: undefined,\n error: undefined,\n isValidating: false,\n });\n\n const getSnapshot = useCallback(() => {\n const currentPages = collectPages(\n getKeyRef.current,\n (serialized) => store.get(serialized)?.data as T | undefined,\n size,\n );\n const fingerprint = currentPages\n .map((page) => {\n const entry = store.getSnapshot(page.serialized);\n return `${page.serialized}:${entry.timestamp}:${entry.isValidating ? 1 : 0}:${entry.error == null ? 0 : 1}:${entry.data === undefined ? 0 : 1}`;\n })\n .join(\"|\");\n if (snapshotRef.current.fingerprint === fingerprint) {\n return snapshotRef.current;\n }\n const loaded: T[] = [];\n let error: unknown;\n let isValidating = false;\n let missing = false;\n for (const page of currentPages) {\n const entry = store.getSnapshot(page.serialized);\n if (entry.isValidating) {\n isValidating = true;\n }\n if (entry.error != null && error === undefined) {\n error = entry.error;\n }\n if (entry.data === undefined) {\n missing = true;\n break;\n }\n loaded.push(entry.data as T);\n }\n snapshotRef.current = {\n fingerprint,\n data: missing && loaded.length === 0 ? undefined : loaded,\n error,\n isValidating,\n };\n return snapshotRef.current;\n }, [serializedList, size, store]);\n\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n const setSize = useCallback(\n (next: number | ((current: number) => number)) => {\n setSizeState((current) =>\n typeof next === \"function\" ? next(current) : next,\n );\n },\n [],\n );\n\n const boundMutate = useCallback<MutateFn<T[]>>(\n async (updater, mutateOptions) => {\n const currentPages = collectPages(\n getKeyRef.current,\n (serialized) => store.get(serialized)?.data as T | undefined,\n size,\n );\n const first = currentPages[0];\n if (!first) {\n return undefined;\n }\n if (updater !== undefined && typeof updater !== \"function\") {\n const pagesValue = updater as T[];\n const firstPage = pagesValue[0];\n if (firstPage !== undefined) {\n await runtimeMutate(first.key, firstPage, mutateOptions);\n }\n return pagesValue;\n }\n await Promise.all(\n currentPages.map((page) =>\n coordinator\n .revalidate(page.serialized, undefined, { force: true })\n .catch(() => {}),\n ),\n );\n return currentPages\n .map((page) => store.get(page.serialized)?.data as T | undefined)\n .filter((page): page is T => page !== undefined);\n },\n [coordinator, runtimeMutate, size, store],\n );\n\n const first = pages[0];\n const firstEntry = first ? store.getSnapshot(first.serialized) : undefined;\n\n return {\n data: snapshot.data,\n error: snapshot.error,\n isLoading:\n first != null &&\n firstEntry?.data === undefined &&\n firstEntry?.error == null,\n isValidating: snapshot.isValidating,\n size,\n setSize,\n mutate: boundMutate,\n };\n}\n","export type FocusCoordinator = {\n revalidate(key: string): Promise<void>;\n getRegisteredKeys(): string[];\n};\n\nexport function focusRevalidate(coordinator: FocusCoordinator): () => void {\n const onFocus = (): void => {\n for (const key of coordinator.getRegisteredKeys()) {\n void coordinator.revalidate(key);\n }\n };\n window.addEventListener(\"focus\", onFocus);\n return () => {\n window.removeEventListener(\"focus\", onFocus);\n };\n}\n","export type ReconnectCoordinator = {\n revalidate(key: string): Promise<void>;\n getRegisteredKeys(): string[];\n};\n\nexport function reconnectRevalidate(\n coordinator: ReconnectCoordinator,\n): () => void {\n const onOnline = (): void => {\n for (const key of coordinator.getRegisteredKeys()) {\n void coordinator.revalidate(key);\n }\n };\n window.addEventListener(\"online\", onOnline);\n return () => {\n window.removeEventListener(\"online\", onOnline);\n };\n}\n","export type PollingCoordinator = {\n revalidate(key: string): Promise<void>;\n};\n\nexport function pollingRevalidate(\n coordinator: PollingCoordinator,\n key: string,\n interval: number,\n): () => void {\n const id = setInterval(() => {\n void coordinator.revalidate(key);\n }, interval);\n return () => {\n clearInterval(id);\n };\n}\n","import type { Fetcher } from \"../types\";\n\nexport type RetryCoordinator = {\n revalidate(key: string): Promise<void>;\n};\n\nfunction isAbortError(error: unknown): boolean {\n return (\n (typeof DOMException !== \"undefined\" &&\n error instanceof DOMException &&\n error.name === \"AbortError\") ||\n (error instanceof Error && error.name === \"AbortError\")\n );\n}\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n return;\n }\n const id = setTimeout(resolve, ms);\n const onAbort = () => {\n clearTimeout(id);\n reject(signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\n/**\n * Wraps a fetcher with bounded backoff retries.\n * Retries happen inside the in-flight request. Do not call `coordinator.revalidate`\n * here — that would abort the request being retried.\n */\nexport function retryOnError<T>(\n _coordinator: RetryCoordinator,\n options: { attempts: number; backoff: number },\n): (fetcher: Fetcher<T>) => Fetcher<T> {\n return (fetcher) =>\n async (key, context) => {\n let lastError: unknown;\n for (let attempt = 0; attempt < options.attempts; attempt++) {\n if (context.signal.aborted) {\n throw (\n context.signal.reason ?? new DOMException(\"Aborted\", \"AbortError\")\n );\n }\n try {\n return await fetcher(key, context);\n } catch (error) {\n lastError = error;\n if (isAbortError(error) || attempt === options.attempts - 1) {\n break;\n }\n await sleep(options.backoff * 2 ** attempt, context.signal);\n }\n }\n throw lastError;\n };\n}\n","import type { EvictOptions } from \"../types\";\n\nexport type TtlEvictCoordinator = {\n evict(options: EvictOptions): string[];\n};\n\nexport function ttlEvict(\n coordinator: TtlEvictCoordinator,\n options: EvictOptions & { interval?: number },\n): () => void {\n const maxAge = options.maxAge;\n const maxKeys = options.maxKeys;\n const evictOptions: EvictOptions = {\n ...(maxAge != null ? { maxAge } : {}),\n ...(maxKeys != null ? { maxKeys } : {}),\n };\n const tick = (): void => {\n coordinator.evict(evictOptions);\n };\n tick();\n const id = setInterval(tick, options.interval ?? 30_000);\n return () => {\n clearInterval(id);\n };\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "steddy",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Stale-while-revalidate data fetching for React, with strict layer separation.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"main": "./dist/index.cjs",
|
|
8
|
+
"module": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"require": "./dist/index.cjs"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": ["dist"],
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsup",
|
|
23
|
+
"test": "vitest run",
|
|
24
|
+
"test:watch": "vitest",
|
|
25
|
+
"typecheck": "tsc --noEmit",
|
|
26
|
+
"prepublishOnly": "npm run typecheck && npm test && npm run build"
|
|
27
|
+
},
|
|
28
|
+
"peerDependencies": {
|
|
29
|
+
"react": ">=18"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@testing-library/react": "^16.3.0",
|
|
33
|
+
"@types/node": "^24.5.2",
|
|
34
|
+
"@types/react": "^19.1.13",
|
|
35
|
+
"@types/react-dom": "^19.1.9",
|
|
36
|
+
"esbuild": "^0.25.9",
|
|
37
|
+
"jsdom": "^26.1.0",
|
|
38
|
+
"react": "^19.1.1",
|
|
39
|
+
"react-dom": "^19.1.1",
|
|
40
|
+
"tsup": "^8.5.0",
|
|
41
|
+
"typescript": "^5.9.2",
|
|
42
|
+
"vitest": "^3.2.4"
|
|
43
|
+
},
|
|
44
|
+
"license": "MIT",
|
|
45
|
+
"author": "Ian Troisi",
|
|
46
|
+
"homepage": "https://cincinnatus101010.github.io/steddyweb/",
|
|
47
|
+
"bugs": {
|
|
48
|
+
"url": "https://github.com/Cincinnatus101010/steddy/issues"
|
|
49
|
+
},
|
|
50
|
+
"repository": {
|
|
51
|
+
"type": "git",
|
|
52
|
+
"url": "git+https://github.com/Cincinnatus101010/steddy.git"
|
|
53
|
+
},
|
|
54
|
+
"keywords": [
|
|
55
|
+
"react",
|
|
56
|
+
"swr",
|
|
57
|
+
"data-fetching",
|
|
58
|
+
"cache",
|
|
59
|
+
"hooks"
|
|
60
|
+
]
|
|
61
|
+
}
|