@vielzeug/courier 2.2.1 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/courier.cjs +2 -2
- package/dist/courier.cjs.map +1 -1
- package/dist/courier.d.ts +21 -0
- package/dist/courier.d.ts.map +1 -1
- package/dist/courier.iife.js +2 -2
- package/dist/courier.iife.js.map +1 -1
- package/dist/courier.js +2 -2
- package/dist/courier.js.map +1 -1
- package/dist/errors.cjs +1 -1
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.js +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/query.cjs +1 -1
- package/dist/query.cjs.map +1 -1
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +1 -1
- package/dist/query.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -1
package/dist/query.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","names":[],"sources":["../src/query.ts"],"sourcesContent":["import { hash } from '@vielzeug/arsenal/object';\nimport { CourierDisposedError } from './errors';\nimport type { AsyncState, QueryCache, QueryContext, QueryDefinition, QueryKey, Unsubscribe } from './types';\n\nconst DEFAULT_STALE_TIME = 0;\nconst DEFAULT_GC_TIME = 5 * 60_000;\n\ntype Entry = {\n controller: AbortController | undefined;\n definition: QueryDefinition<unknown> | undefined;\n key: QueryKey;\n promise: Promise<unknown> | undefined;\n snapshot: AsyncState<unknown>;\n};\n\ntype CancellableQueryCache = QueryCache & {\n cancelAll(): void;\n};\n\nfunction loading<T>(isFetching = false): AsyncState<T> {\n return { data: undefined, error: null, isFetching, status: 'loading', updatedAt: undefined };\n}\n\n/** Transport-agnostic cache. Queries are identified by explicit keys and fetch definitions.\n * Entries with no subscribers are garbage-collected after `gcTime` (default 5 min; `Infinity` disables). */\nexport function createQueryCache(options?: {\n gcTime?: number;\n signal?: AbortSignal;\n staleTime?: number;\n}): CancellableQueryCache {\n const staleTime = options?.staleTime ?? DEFAULT_STALE_TIME;\n const gcTime = options?.gcTime ?? DEFAULT_GC_TIME;\n const entries = new Map<string, Entry>();\n const listeners = new Map<string, Set<Unsubscribe>>();\n let disposed = options?.signal?.aborted ?? false;\n let gcTimer: ReturnType<typeof setTimeout> | undefined;\n\n const hasSubscribers = (id: string): boolean => (listeners.get(id)?.size ?? 0) > 0;\n\n const notify = (key: QueryKey): void => {\n for (const listener of [...(listeners.get(hash(key)) ?? [])]) listener();\n };\n\n const scheduleGc = (): void => {\n if (gcTime === Number.POSITIVE_INFINITY || disposed) {\n if (gcTimer) clearTimeout(gcTimer);\n gcTimer = undefined;\n return;\n }\n\n if (gcTimer) clearTimeout(gcTimer);\n\n let earliest: number | undefined;\n\n for (const entry of entries.values()) {\n if (entry.snapshot.status !== 'success' || entry.promise) continue;\n if (hasSubscribers(hash(entry.key))) continue;\n\n const expiresAt = entry.snapshot.updatedAt + gcTime;\n\n if (earliest === undefined || expiresAt < earliest) earliest = expiresAt;\n }\n\n if (earliest === undefined) {\n gcTimer = undefined;\n return;\n }\n\n gcTimer = setTimeout(runGc, Math.max(0, earliest - Date.now()));\n };\n\n const runGc = (): void => {\n const now = Date.now();\n\n for (const [id, entry] of entries) {\n if (entry.snapshot.status !== 'success' || entry.promise) continue;\n if (hasSubscribers(id)) continue;\n if (now - entry.snapshot.updatedAt >= gcTime) entries.delete(id);\n }\n\n scheduleGc();\n };\n\n const cancelAll = (): void => {\n for (const entry of entries.values()) {\n entry.controller?.abort();\n entry.controller = undefined;\n entry.promise = undefined;\n }\n };\n\n const clear = (): void => {\n const keys = [...entries.values()].map((entry) => entry.key);\n\n cancelAll();\n entries.clear();\n\n if (gcTimer) {\n clearTimeout(gcTimer);\n gcTimer = undefined;\n }\n\n for (const key of keys) notify(key);\n };\n\n options?.signal?.addEventListener(\n 'abort',\n () => {\n disposed = true;\n clear();\n },\n { once: true },\n );\n\n const entryFor = (key: QueryKey): Entry => {\n const id = hash(key);\n let entry = entries.get(id);\n\n if (!entry) {\n entry = {\n controller: undefined,\n definition: undefined,\n key,\n promise: undefined,\n snapshot: loading(),\n };\n entries.set(id, entry);\n }\n\n return entry;\n };\n\n const fetchEntry = <T>(entry: Entry, force: boolean): Promise<T> => {\n if (disposed) return Promise.reject(new CourierDisposedError('QueryCache'));\n\n if (!entry.definition)\n return Promise.reject(new Error(`No fetch function registered for query ${hash(entry.key)}.`));\n\n const entryStaleTime = entry.definition.staleTime ?? staleTime;\n\n if (\n !force &&\n entry.snapshot.status === 'success' &&\n Date.now() - entry.snapshot.updatedAt < entryStaleTime &&\n !entry.snapshot.isFetching\n ) {\n return Promise.resolve(entry.snapshot.data as T);\n }\n\n if (entry.promise) return entry.promise as Promise<T>;\n\n const controller = new AbortController();\n\n entry.controller = controller;\n entry.snapshot =\n entry.snapshot.status === 'success' ? { ...entry.snapshot, isFetching: true } : { ...loading<unknown>(true) };\n notify(entry.key);\n\n const promise = Promise.resolve()\n .then(() => entry.definition?.fetch({ key: entry.key, signal: controller.signal } as QueryContext))\n .then(\n (data) => {\n if (entry.promise !== promise) return data;\n\n entry.snapshot = { data, error: null, isFetching: false, status: 'success', updatedAt: Date.now() };\n entry.controller = undefined;\n entry.promise = undefined;\n notify(entry.key);\n scheduleGc();\n\n return data;\n },\n (cause: unknown) => {\n if (entry.promise !== promise) throw cause;\n\n const error = cause instanceof Error ? cause : new Error(String(cause));\n\n entry.snapshot = {\n data: entry.snapshot.status === 'success' ? entry.snapshot.data : undefined,\n error,\n isFetching: false,\n status: 'error',\n updatedAt: Date.now(),\n };\n entry.controller = undefined;\n entry.promise = undefined;\n notify(entry.key);\n\n throw error;\n },\n );\n\n entry.promise = promise;\n\n return promise as Promise<T>;\n };\n\n return {\n cancelAll,\n clear,\n fetch<T>(definition: QueryDefinition<T>, fetchOptions?: { force?: boolean }): Promise<T> {\n const entry = entryFor(definition.key);\n\n entry.definition = definition as QueryDefinition<unknown>;\n\n return fetchEntry<T>(entry, fetchOptions?.force ?? false);\n },\n get<T>(key: QueryKey): T | undefined {\n const entry = entries.get(hash(key));\n\n return entry?.snapshot.status === 'success' ? (entry.snapshot.data as T) : undefined;\n },\n getSnapshot<T>(key: QueryKey): AsyncState<T> | null {\n return (entries.get(hash(key))?.snapshot as AsyncState<T> | undefined) ?? null;\n },\n invalidate(prefix: readonly unknown[], invalidateOptions?: { refetch?: boolean }): void {\n const refetch = invalidateOptions?.refetch ?? false;\n let invalidated = false;\n\n for (const entry of entries.values()) {\n const matches = prefix.length <= entry.key.length && prefix.every((atom, index) => atom === entry.key[index]);\n\n if (matches) {\n if (entry.snapshot.status === 'success') entry.snapshot = { ...entry.snapshot, updatedAt: 0 };\n\n notify(entry.key);\n\n if (refetch && entry.definition && !entry.promise) {\n void fetchEntry(entry, true).catch(() => {\n /* Error surfaces through cache snapshot; suppress unhandled rejection. */\n });\n }\n\n invalidated = true;\n }\n }\n\n if (invalidated) scheduleGc();\n },\n keys(): QueryKey[] {\n return [...entries.values()].map((entry) => entry.key);\n },\n set<T>(key: QueryKey, data: T, setOptions?: { updatedAt?: number }): void {\n const entry = entryFor(key);\n\n entry.snapshot = {\n data,\n error: null,\n isFetching: false,\n status: 'success',\n updatedAt: setOptions?.updatedAt ?? Date.now(),\n };\n notify(key);\n scheduleGc();\n },\n subscribe(key: QueryKey, listener: () => void): Unsubscribe {\n const id = hash(key);\n const keyListeners = listeners.get(id) ?? new Set<Unsubscribe>();\n\n keyListeners.add(listener);\n listeners.set(id, keyListeners);\n\n return () => {\n keyListeners.delete(listener);\n\n if (keyListeners.size === 0) {\n listeners.delete(id);\n scheduleGc();\n }\n };\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"query.js","names":[],"sources":["../src/query.ts"],"sourcesContent":["import { hash } from '@vielzeug/arsenal/object';\nimport { CourierDisposedError } from './errors';\nimport type { AsyncState, QueryCache, QueryContext, QueryDefinition, QueryKey, Unsubscribe } from './types';\n\nconst DEFAULT_STALE_TIME = 0;\nconst DEFAULT_GC_TIME = 5 * 60_000;\n\ntype Entry = {\n controller: AbortController | undefined;\n definition: QueryDefinition<unknown> | undefined;\n key: QueryKey;\n promise: Promise<unknown> | undefined;\n snapshot: AsyncState<unknown>;\n};\n\ntype CancellableQueryCache = QueryCache & {\n cancelAll(): void;\n};\n\nfunction loading<T>(isFetching = false): AsyncState<T> {\n return { data: undefined, error: null, isFetching, status: 'loading', updatedAt: undefined };\n}\n\n/** Transport-agnostic cache. Queries are identified by explicit keys and fetch definitions.\n * Entries with no subscribers are garbage-collected after `gcTime` (default 5 min; `Infinity` disables). */\nexport function createQueryCache(options?: {\n gcTime?: number;\n signal?: AbortSignal;\n staleTime?: number;\n}): CancellableQueryCache {\n const staleTime = options?.staleTime ?? DEFAULT_STALE_TIME;\n const gcTime = options?.gcTime ?? DEFAULT_GC_TIME;\n const entries = new Map<string, Entry>();\n const listeners = new Map<string, Set<Unsubscribe>>();\n let disposed = options?.signal?.aborted ?? false;\n let gcTimer: ReturnType<typeof setTimeout> | undefined;\n\n const hasSubscribers = (id: string): boolean => (listeners.get(id)?.size ?? 0) > 0;\n\n const notify = (key: QueryKey): void => {\n for (const listener of [...(listeners.get(hash(key)) ?? [])]) listener();\n };\n\n const scheduleGc = (): void => {\n if (gcTime === Number.POSITIVE_INFINITY || disposed) {\n if (gcTimer) clearTimeout(gcTimer);\n gcTimer = undefined;\n return;\n }\n\n if (gcTimer) clearTimeout(gcTimer);\n\n let earliest: number | undefined;\n\n for (const entry of entries.values()) {\n if (entry.snapshot.status !== 'success' || entry.promise) continue;\n if (hasSubscribers(hash(entry.key))) continue;\n\n const expiresAt = entry.snapshot.updatedAt + gcTime;\n\n if (earliest === undefined || expiresAt < earliest) earliest = expiresAt;\n }\n\n if (earliest === undefined) {\n gcTimer = undefined;\n return;\n }\n\n gcTimer = setTimeout(runGc, Math.max(0, earliest - Date.now()));\n };\n\n const runGc = (): void => {\n const now = Date.now();\n\n for (const [id, entry] of entries) {\n if (entry.snapshot.status !== 'success' || entry.promise) continue;\n if (hasSubscribers(id)) continue;\n if (now - entry.snapshot.updatedAt >= gcTime) entries.delete(id);\n }\n\n scheduleGc();\n };\n\n const cancelAll = (): void => {\n for (const entry of entries.values()) {\n entry.controller?.abort();\n entry.controller = undefined;\n entry.promise = undefined;\n }\n };\n\n const clear = (): void => {\n const keys = [...entries.values()].map((entry) => entry.key);\n\n cancelAll();\n entries.clear();\n\n if (gcTimer) {\n clearTimeout(gcTimer);\n gcTimer = undefined;\n }\n\n for (const key of keys) notify(key);\n };\n\n options?.signal?.addEventListener(\n 'abort',\n () => {\n disposed = true;\n clear();\n },\n { once: true },\n );\n\n const entryFor = (key: QueryKey): Entry => {\n const id = hash(key);\n let entry = entries.get(id);\n\n if (!entry) {\n entry = {\n controller: undefined,\n definition: undefined,\n key,\n promise: undefined,\n snapshot: loading(),\n };\n entries.set(id, entry);\n }\n\n return entry;\n };\n\n const fetchEntry = <T>(entry: Entry, force: boolean): Promise<T> => {\n if (disposed) return Promise.reject(new CourierDisposedError('QueryCache'));\n\n if (!entry.definition)\n return Promise.reject(new Error(`No fetch function registered for query ${hash(entry.key)}.`));\n\n const entryStaleTime = entry.definition.staleTime ?? staleTime;\n\n if (\n !force &&\n entry.snapshot.status === 'success' &&\n Date.now() - entry.snapshot.updatedAt < entryStaleTime &&\n !entry.snapshot.isFetching\n ) {\n return Promise.resolve(entry.snapshot.data as T);\n }\n\n if (entry.promise) return entry.promise as Promise<T>;\n\n const controller = new AbortController();\n\n entry.controller = controller;\n entry.snapshot =\n entry.snapshot.status === 'success' ? { ...entry.snapshot, isFetching: true } : { ...loading<unknown>(true) };\n notify(entry.key);\n\n const promise = Promise.resolve()\n .then(() => entry.definition?.fetch({ key: entry.key, signal: controller.signal } as QueryContext))\n .then(\n (data) => {\n if (entry.promise !== promise) return data;\n\n entry.snapshot = { data, error: null, isFetching: false, status: 'success', updatedAt: Date.now() };\n entry.controller = undefined;\n entry.promise = undefined;\n notify(entry.key);\n scheduleGc();\n\n return data;\n },\n (cause: unknown) => {\n if (entry.promise !== promise) throw cause;\n\n const error = cause instanceof Error ? cause : new Error(String(cause));\n\n entry.snapshot = {\n data: entry.snapshot.status === 'success' ? entry.snapshot.data : undefined,\n error,\n isFetching: false,\n status: 'error',\n updatedAt: Date.now(),\n };\n entry.controller = undefined;\n entry.promise = undefined;\n notify(entry.key);\n\n throw error;\n },\n );\n\n entry.promise = promise;\n\n return promise as Promise<T>;\n };\n\n return {\n cancelAll,\n clear,\n delete(key: QueryKey): void {\n const id = hash(key);\n const entry = entries.get(id);\n\n if (!entry) return;\n\n // Prevent an aborted in-flight promise from writing a stale error snapshot\n // after this entry has been explicitly removed.\n entry.promise = undefined;\n entry.controller?.abort();\n entry.controller = undefined;\n\n entries.delete(id);\n notify(key);\n scheduleGc();\n },\n fetch<T>(definition: QueryDefinition<T>, fetchOptions?: { force?: boolean }): Promise<T> {\n const entry = entryFor(definition.key);\n\n entry.definition = definition as QueryDefinition<unknown>;\n\n return fetchEntry<T>(entry, fetchOptions?.force ?? false);\n },\n get<T>(key: QueryKey): T | undefined {\n const entry = entries.get(hash(key));\n\n return entry?.snapshot.status === 'success' ? (entry.snapshot.data as T) : undefined;\n },\n getSnapshot<T>(key: QueryKey): AsyncState<T> | null {\n return (entries.get(hash(key))?.snapshot as AsyncState<T> | undefined) ?? null;\n },\n invalidate(prefix: readonly unknown[], invalidateOptions?: { refetch?: boolean }): void {\n const refetch = invalidateOptions?.refetch ?? false;\n let invalidated = false;\n\n for (const entry of entries.values()) {\n const matches = prefix.length <= entry.key.length && prefix.every((atom, index) => atom === entry.key[index]);\n\n if (matches) {\n if (entry.snapshot.status === 'success') entry.snapshot = { ...entry.snapshot, updatedAt: 0 };\n\n notify(entry.key);\n\n if (refetch && entry.definition && !entry.promise) {\n void fetchEntry(entry, true).catch(() => {\n /* Error surfaces through cache snapshot; suppress unhandled rejection. */\n });\n }\n\n invalidated = true;\n }\n }\n\n if (invalidated) scheduleGc();\n },\n keys(): QueryKey[] {\n return [...entries.values()].map((entry) => entry.key);\n },\n set<T>(key: QueryKey, data: T, setOptions?: { updatedAt?: number }): void {\n const entry = entryFor(key);\n\n entry.snapshot = {\n data,\n error: null,\n isFetching: false,\n status: 'success',\n updatedAt: setOptions?.updatedAt ?? Date.now(),\n };\n notify(key);\n scheduleGc();\n },\n subscribe(key: QueryKey, listener: () => void): Unsubscribe {\n const id = hash(key);\n const keyListeners = listeners.get(id) ?? new Set<Unsubscribe>();\n\n keyListeners.add(listener);\n listeners.set(id, keyListeners);\n\n return () => {\n keyListeners.delete(listener);\n\n if (keyListeners.size === 0) {\n listeners.delete(id);\n scheduleGc();\n }\n };\n },\n };\n}\n"],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vielzeug/courier",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"description": "HTTP client with caching, request deduplication, typed mutations, SSE streaming, and interceptors",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"types": "./dist/index.d.ts"
|
|
25
25
|
}
|
|
26
26
|
},
|
|
27
|
+
"sideEffects": false,
|
|
27
28
|
"publishConfig": {
|
|
28
29
|
"access": "public",
|
|
29
30
|
"registry": "https://registry.npmjs.org/"
|