cross-state 0.50.0 → 0.52.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/cjs/scope.cjs +19 -11
- package/dist/cjs/scope.cjs.map +1 -1
- package/dist/es/scope.mjs +19 -11
- package/dist/es/scope.mjs.map +1 -1
- package/dist/types/core/cache.d.ts +67 -8
- package/dist/types/lib/instanceCache.d.ts +1 -0
- package/package.json +2 -2
package/dist/cjs/scope.cjs
CHANGED
|
@@ -23,7 +23,10 @@ class InstanceCache {
|
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
get(...args) {
|
|
26
|
-
|
|
26
|
+
return this.getWithKey(args, args);
|
|
27
|
+
}
|
|
28
|
+
getWithKey(args, cacheKey) {
|
|
29
|
+
const key = hash.simpleHash(cacheKey);
|
|
27
30
|
let entry = this.cache.get(key);
|
|
28
31
|
let value = entry?.ref ?? entry?.weakRef?.deref();
|
|
29
32
|
if (!entry || !value) {
|
|
@@ -293,9 +296,6 @@ function internalCreate(source, options) {
|
|
|
293
296
|
let baseInstance;
|
|
294
297
|
const instanceCache = new InstanceCache(
|
|
295
298
|
(...args) => {
|
|
296
|
-
if (args.length === 0 && baseInstance) {
|
|
297
|
-
return baseInstance;
|
|
298
|
-
}
|
|
299
299
|
if (Array.isArray(source)) {
|
|
300
300
|
const [cache, selector] = source;
|
|
301
301
|
return mapValue(cache(...args), selector, get);
|
|
@@ -320,25 +320,34 @@ function internalCreate(source, options) {
|
|
|
320
320
|
if (sliceAfter !== -1) {
|
|
321
321
|
args = args.slice(0, sliceAfter);
|
|
322
322
|
}
|
|
323
|
-
|
|
323
|
+
const cacheKey = options?.getCacheKey ? options.getCacheKey(...args) : args;
|
|
324
|
+
return instanceCache.getWithKey(args, cacheKey);
|
|
324
325
|
}
|
|
325
326
|
const mapCache = (selector) => {
|
|
326
327
|
return internalCreate([baseInstance, selector]);
|
|
327
328
|
};
|
|
328
|
-
const invalidateAll = () => {
|
|
329
|
+
const invalidateAll = ({ filter = () => true } = {}) => {
|
|
329
330
|
for (const instance of instanceCache.values()) {
|
|
330
|
-
instance
|
|
331
|
+
if (filter(instance)) {
|
|
332
|
+
instance.invalidate();
|
|
333
|
+
}
|
|
331
334
|
}
|
|
332
335
|
};
|
|
333
|
-
const clearAll = () => {
|
|
336
|
+
const clearAll = ({ filter = () => true } = {}) => {
|
|
334
337
|
for (const instance of instanceCache.values()) {
|
|
335
|
-
instance
|
|
338
|
+
if (filter(instance)) {
|
|
339
|
+
instance.clear();
|
|
340
|
+
}
|
|
336
341
|
}
|
|
337
342
|
};
|
|
343
|
+
const getInstances = () => {
|
|
344
|
+
return instanceCache.values();
|
|
345
|
+
};
|
|
338
346
|
baseInstance = Object.assign(get(...[]), {
|
|
339
347
|
mapCache,
|
|
340
348
|
invalidateAll,
|
|
341
|
-
clearAll
|
|
349
|
+
clearAll,
|
|
350
|
+
getInstances
|
|
342
351
|
});
|
|
343
352
|
const groups = Array.isArray(resourceGroup) ? resourceGroup : resourceGroup ? [resourceGroup] : [];
|
|
344
353
|
for (const group of groups.concat(allResources)) {
|
|
@@ -349,7 +358,6 @@ function internalCreate(source, options) {
|
|
|
349
358
|
const createCache = /* @__PURE__ */ Object.assign(create, {
|
|
350
359
|
defaultOptions: {
|
|
351
360
|
invalidateOnWindowFocus: true,
|
|
352
|
-
invalidateOnActivation: true,
|
|
353
361
|
clearUnusedAfter: { days: 1 },
|
|
354
362
|
retain: { milliseconds: 1 },
|
|
355
363
|
equals: propAccess.deepEqual
|
package/dist/cjs/scope.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.cjs","sources":["../../src/lib/instanceCache.ts","../../src/core/resourceGroup.ts","../../src/core/cache.ts","../../src/core/scope.ts"],"sourcesContent":["import { simpleHash } from './hash';\n\nexport class InstanceCache<Args extends any[], T extends object> {\n private cache = new Map<string, { t: number; ref?: T; weakRef: WeakRef<T> }>();\n\n private interval = this.cacheTime\n ? setInterval(() => this.cleanup(), Math.max(this.cacheTime / 10, 1))\n : undefined;\n\n constructor(\n public readonly factory: (...args: Args) => T,\n public readonly cacheTime?: number,\n ) {}\n\n cleanup(): void {\n const cutoff = this.now() - (this.cacheTime ?? 0);\n\n for (const [key, entry] of this.cache.entries()) {\n if (entry.ref && entry.t <= cutoff) {\n delete entry.ref;\n }\n\n if (!entry.ref && !entry.weakRef?.deref()) {\n this.cache.delete(key);\n }\n }\n }\n\n get(...args: Args): T {\n const key = simpleHash(args);\n let entry = this.cache.get(key);\n let value = entry?.ref ?? entry?.weakRef?.deref();\n\n if (!entry || !value) {\n value = this.factory(...args);\n entry = {\n t: this.now(),\n ref: value,\n weakRef: new WeakRef(value),\n };\n\n this.cache.set(key, entry);\n } else {\n entry.t = this.now();\n entry.ref ??= value;\n }\n\n return value;\n }\n\n values(): T[] {\n return [...this.cache.values()]\n .map((entry) => entry.ref ?? entry.weakRef?.deref())\n .filter((value): value is T => !!value);\n }\n\n stop(): void {\n if (this.interval) {\n clearInterval(this.interval);\n }\n }\n\n stats(): { count: number; withRef: number; withWeakRef: number } {\n return {\n count: this.cache.size,\n withRef: [...this.cache.values()].filter((x) => !!x.ref).length,\n withWeakRef: [...this.cache.values()].filter((x) => !!x.weakRef?.deref()).length,\n };\n }\n\n private now() {\n return performance.now();\n }\n}\n","import { autobind } from '@lib/autobind';\n\nexport interface Resource {\n invalidateAll(): void;\n clearAll(): void;\n}\n\nexport class ResourceGroup {\n private refMap = new WeakMap<Resource, WeakRef<Resource>>();\n\n private refSet = new Set<WeakRef<Resource>>();\n\n constructor(public readonly name?: string) {\n autobind(ResourceGroup);\n }\n\n add(resource: Resource): void {\n const ref = new WeakRef(resource);\n this.refMap.set(resource, ref);\n this.refSet.add(ref);\n }\n\n delete(resource: Resource): void {\n const ref = this.refMap.get(resource);\n if (ref) {\n this.refMap.delete(resource);\n this.refSet.delete(ref);\n }\n }\n\n invalidateAll(): void {\n for (const ref of this.refSet) {\n const resource = ref.deref();\n if (resource) {\n resource.invalidateAll();\n } else {\n this.refSet.delete(ref);\n }\n }\n }\n\n clearAll(): void {\n for (const ref of this.refSet) {\n const resource = ref.deref();\n if (resource) {\n resource.clearAll();\n } else {\n this.refSet.delete(ref);\n }\n }\n }\n}\n\nexport const allResources: ResourceGroup = /* @__PURE__ */ new ResourceGroup();\n\nexport function createResourceGroup(name?: string): ResourceGroup {\n return new ResourceGroup(name);\n}\n","import { autobind } from '@lib/autobind';\nimport type { CacheState, ErrorState, ValueState } from '@lib/cacheState';\nimport { calcDuration } from '@lib/calcDuration';\nimport { calculatedValue } from '@lib/calculatedValue';\nimport type { Constrain } from '@lib/constrain';\nimport { deepEqual } from '@lib/equals';\nimport { InstanceCache } from '@lib/instanceCache';\nimport { makeSelector } from '@lib/makeSelector';\nimport { type MaybePromise } from '@lib/maybePromise';\nimport type { AnyPath, Path, Value } from '@lib/path';\nimport { PromiseWithState } from '@lib/promiseWithState';\nimport type { Duration, Selector } from './commonTypes';\nimport { allResources, type ResourceGroup } from './resourceGroup';\nimport { Store, createStore, type Calculate, type StoreOptions } from './store';\n\nexport interface CacheGetOptions {\n update?: 'whenMissing' | 'whenStale' | 'force';\n backgroundUpdate?: boolean;\n}\n\nexport interface CacheFunction<T, Args extends any[] = []> {\n (...args: Args): Promise<T> | Calculate<Promise<T>>;\n}\n\nexport interface CacheOptions<T> extends StoreOptions<Promise<T>> {\n invalidateAfter?: Duration | ((state: ValueState<T> | ErrorState) => Duration | null) | null;\n invalidateOnWindowFocus?: boolean;\n invalidateOnActivation?: boolean;\n clearOnInvalidate?: boolean;\n clearUnusedAfter?: Duration | null;\n resourceGroup?: ResourceGroup | ResourceGroup[];\n}\n\nexport class Cache<T> extends Store<Promise<T>> {\n readonly state: Store<CacheState<T>> = createStore<CacheState<T>>({\n status: 'pending',\n isStale: true,\n isUpdating: false,\n isConnected: false,\n });\n\n protected stalePromise?: Promise<T>;\n\n protected invalidationTimer?: ReturnType<typeof setTimeout>;\n\n constructor(\n getter: Calculate<Promise<T>>,\n public readonly options: CacheOptions<T> = {},\n public readonly derivedFromCache?: {\n cache: Cache<any>;\n selectors: (Selector<any, any> | AnyPath)[];\n },\n _call?: (...args: any[]) => any,\n ) {\n super(getter, options, undefined, _call);\n autobind(Cache);\n\n this.watchPromise();\n this.watchFocus();\n }\n\n get({ update = 'whenStale', backgroundUpdate = false }: CacheGetOptions = {}): Promise<T> {\n this.calculatedValue?.check();\n const promise = this.calculatedValue?.value;\n const stalePromise = this.stalePromise;\n\n if (\n (update === 'whenMissing' && !promise && !stalePromise) ||\n (update === 'whenStale' && !promise) ||\n update === 'force'\n ) {\n this.calculatedValue = calculatedValue(this, this.notify);\n this.notify();\n\n if ((!promise && !stalePromise) || !backgroundUpdate) {\n return this.calculatedValue.value;\n }\n }\n\n if (!promise || (stalePromise && backgroundUpdate)) {\n return stalePromise!;\n }\n\n return promise;\n }\n\n updateValue(value: MaybePromise<T> | ((value: T | undefined) => T)): void {\n if (value instanceof Function) {\n value = value(this.state.get().value);\n }\n this.set(PromiseWithState.resolve(value));\n }\n\n updateError(error: unknown): void {\n this.set(PromiseWithState.reject(error));\n }\n\n invalidate(recursive?: boolean): void {\n const { clearOnInvalidate } = this.options;\n\n if (clearOnInvalidate) {\n return this.clear(recursive);\n }\n\n const { status, isStale, isUpdating } = this.state.get();\n if (status !== 'pending' && !isStale && !isUpdating) {\n this.stalePromise = this.calculatedValue?.value;\n }\n\n this.state.set((state) => ({\n ...state,\n isStale: true,\n isUpdating: false,\n }));\n\n super.invalidate(recursive);\n }\n\n clear(recursive?: boolean): void {\n this.state.set({\n status: 'pending',\n isStale: true,\n isUpdating: false,\n isConnected: false,\n });\n delete this.stalePromise;\n\n super.invalidate(recursive);\n }\n\n mapValue<S>(selector: Selector<T, S>): Cache<S>;\n\n mapValue<const P extends AnyPath>(selector: P extends Path<T> ? P : Path<T>): Cache<Value<T, P>>;\n\n mapValue(selector: Selector<any, any> | AnyPath) {\n return mapValue(this, selector);\n }\n\n protected watchPromise(): void {\n this.subscribe(\n async (promise) => {\n if (promise instanceof PromiseWithState && promise.state.status !== 'pending') {\n promise.catch(() => undefined);\n\n this.state.set((state) => ({\n ...promise.state,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n\n delete this.stalePromise;\n this.setTimers();\n return;\n }\n\n this.state.set((state) => ({\n ...state,\n isUpdating: true,\n }));\n\n this.setTimers();\n\n try {\n const value = await promise;\n\n if (promise !== this.calculatedValue?.value) {\n return;\n }\n\n this.state.set((state) => ({\n status: 'value',\n value,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n delete this.stalePromise;\n this.setTimers();\n } catch (error) {\n if (promise !== this.calculatedValue?.value) {\n return;\n }\n\n this.state.set((state) => ({\n status: 'error',\n error,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n delete this.stalePromise;\n this.setTimers();\n }\n },\n { passive: true },\n );\n }\n\n protected setTimers(): void {\n if (this.invalidationTimer) {\n clearTimeout(this.invalidationTimer);\n }\n this.invalidationTimer = undefined;\n\n const state = this.state.get();\n let { invalidateAfter } = this.options;\n const ref = new WeakRef(this);\n\n if (state.status === 'pending') {\n return;\n }\n\n if (invalidateAfter instanceof Function) {\n invalidateAfter = invalidateAfter(state);\n }\n\n if (invalidateAfter !== null && invalidateAfter !== undefined) {\n this.invalidationTimer = setTimeout(\n () => ref?.deref()?.invalidate(),\n calcDuration(invalidateAfter),\n );\n }\n }\n\n protected watchFocus(): void {\n const { invalidateOnWindowFocus } = this.options;\n\n if (\n !invalidateOnWindowFocus ||\n typeof document === 'undefined' ||\n typeof document.addEventListener === 'undefined'\n ) {\n return;\n }\n\n const ref = new WeakRef(this);\n\n const onFocus = () => {\n const that = ref?.deref();\n if (!that) {\n document.removeEventListener('visibilitychange', onFocus);\n return;\n }\n\n if (!document.hidden && !that.state.get().isConnected) {\n that.invalidate();\n }\n };\n\n document.addEventListener('visibilitychange', onFocus);\n }\n}\n\nfunction mapValue<T, S>(cache: Cache<T>, _selector: Selector<T, S> | AnyPath, get?: any): Cache<S> {\n const selector = makeSelector(_selector);\n const derivedFromCache = {\n cache: cache.derivedFromCache ? cache.derivedFromCache.cache : cache,\n selectors: cache.derivedFromCache\n ? [...cache.derivedFromCache.selectors, _selector]\n : [_selector],\n };\n\n return new Cache(\n async ({ use }) => {\n const value = await use(cache);\n return selector(value);\n },\n {\n equals: cache.options.equals,\n },\n derivedFromCache,\n get,\n );\n}\n\nexport type CreateCacheResult<T, Args extends any[]> = [] extends Args\n ? CacheBundle<T, Args> & Cache<T>\n : CacheBundle<T, Args>;\n\nexport type CacheBundle<T, Args extends any[]> = {\n (...args: Args): Cache<T>;\n mapCache<S>(selector: Selector<T, S>): CreateCacheResult<S, Args>;\n mapValue<const P>(selector: Constrain<P, Path<T>>): CreateCacheResult<Value<T, P>, Args>;\n invalidateAll: () => void;\n clearAll: () => void;\n};\n\nfunction create<T, Args extends any[] = []>(\n cacheFunction: CacheFunction<T, Args>,\n options?: CacheOptions<T>,\n): CreateCacheResult<T, Args> {\n return internalCreate<T, Args>(cacheFunction, options);\n}\n\nfunction internalCreate<T, Args extends any[] = []>(\n source:\n | CacheFunction<T, Args>\n | [cache: CacheBundle<any, Args>, selector: Selector<any, T> | AnyPath],\n options?: CacheOptions<T>,\n): CreateCacheResult<T, Args> {\n options = { ...createCache.defaultOptions, ...options };\n const { clearUnusedAfter, resourceGroup } = options ?? {};\n\n let baseInstance: CacheBundle<T, Args> & Cache<T>;\n\n const instanceCache = new InstanceCache<Args, Cache<T>>(\n (...args: Args): Cache<T> => {\n if (args.length === 0 && baseInstance) {\n return baseInstance;\n }\n\n if (Array.isArray(source)) {\n const [cache, selector] = source;\n return mapValue(cache(...args), selector, get);\n }\n\n return new Cache(\n (helpers) => {\n const result = source.apply(helpers, args);\n\n if (result instanceof Function) {\n return result(helpers);\n }\n\n return result;\n },\n options,\n undefined,\n args.length === 0 ? get : undefined,\n );\n },\n clearUnusedAfter ? calcDuration(clearUnusedAfter) : undefined,\n );\n\n function get(...args: Args) {\n const sliceAfter = args.lastIndexOf(undefined);\n if (sliceAfter !== -1) {\n args = args.slice(0, sliceAfter) as Args;\n }\n\n return instanceCache.get(...args);\n }\n\n const mapCache = (selector: any) => {\n return internalCreate([baseInstance, selector]);\n };\n\n const invalidateAll = () => {\n for (const instance of instanceCache.values()) {\n instance.invalidate();\n }\n };\n\n const clearAll = () => {\n for (const instance of instanceCache.values()) {\n instance.clear();\n }\n };\n\n baseInstance = Object.assign(get(...([] as unknown as Args)), {\n mapCache,\n invalidateAll,\n clearAll,\n }) as CacheBundle<T, Args> & Cache<T>;\n\n const groups = Array.isArray(resourceGroup)\n ? resourceGroup\n : resourceGroup\n ? [resourceGroup]\n : [];\n\n for (const group of groups.concat(allResources)) {\n group.add(baseInstance);\n }\n\n return baseInstance;\n}\n\nexport const createCache: typeof create & { defaultOptions: CacheOptions<any> } =\n /* @__PURE__ */ Object.assign(create, {\n defaultOptions: {\n invalidateOnWindowFocus: true,\n invalidateOnActivation: true,\n clearUnusedAfter: { days: 1 },\n retain: { milliseconds: 1 },\n equals: deepEqual,\n } as CacheOptions<any>,\n });\n","import { autobind } from '@lib/autobind';\n\nexport class Scope<T> {\n constructor(public readonly defaultValue: T) {\n autobind(Scope);\n }\n}\n\nexport function createScope<T>(defaultValue: T): Scope<T> {\n return new Scope(defaultValue);\n}\n"],"names":["simpleHash","autobind","Store","createStore","calculatedValue","PromiseWithState","calcDuration","makeSelector","deepEqual"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scope.cjs","sources":["../../src/lib/instanceCache.ts","../../src/core/resourceGroup.ts","../../src/core/cache.ts","../../src/core/scope.ts"],"sourcesContent":["import { simpleHash } from './hash';\n\nexport class InstanceCache<Args extends any[], T extends object> {\n private cache = new Map<string, { t: number; ref?: T; weakRef: WeakRef<T> }>();\n\n private interval = this.cacheTime\n ? setInterval(() => this.cleanup(), Math.max(this.cacheTime / 10, 1))\n : undefined;\n\n constructor(\n public readonly factory: (...args: Args) => T,\n public readonly cacheTime?: number,\n ) {}\n\n cleanup(): void {\n const cutoff = this.now() - (this.cacheTime ?? 0);\n\n for (const [key, entry] of this.cache.entries()) {\n if (entry.ref && entry.t <= cutoff) {\n delete entry.ref;\n }\n\n if (!entry.ref && !entry.weakRef?.deref()) {\n this.cache.delete(key);\n }\n }\n }\n\n get(...args: Args): T {\n return this.getWithKey(args, args);\n }\n\n getWithKey(args: Args, cacheKey: unknown): T {\n const key = simpleHash(cacheKey);\n let entry = this.cache.get(key);\n let value = entry?.ref ?? entry?.weakRef?.deref();\n\n if (!entry || !value) {\n value = this.factory(...args);\n entry = {\n t: this.now(),\n ref: value,\n weakRef: new WeakRef(value),\n };\n\n this.cache.set(key, entry);\n } else {\n entry.t = this.now();\n entry.ref ??= value;\n }\n\n return value;\n }\n\n values(): T[] {\n return [...this.cache.values()]\n .map((entry) => entry.ref ?? entry.weakRef?.deref())\n .filter((value): value is T => !!value);\n }\n\n stop(): void {\n if (this.interval) {\n clearInterval(this.interval);\n }\n }\n\n stats(): { count: number; withRef: number; withWeakRef: number } {\n return {\n count: this.cache.size,\n withRef: [...this.cache.values()].filter((x) => !!x.ref).length,\n withWeakRef: [...this.cache.values()].filter((x) => !!x.weakRef?.deref()).length,\n };\n }\n\n private now() {\n return performance.now();\n }\n}\n","import { autobind } from '@lib/autobind';\n\nexport interface Resource {\n invalidateAll(): void;\n clearAll(): void;\n}\n\nexport class ResourceGroup {\n private refMap = new WeakMap<Resource, WeakRef<Resource>>();\n\n private refSet = new Set<WeakRef<Resource>>();\n\n constructor(public readonly name?: string) {\n autobind(ResourceGroup);\n }\n\n add(resource: Resource): void {\n const ref = new WeakRef(resource);\n this.refMap.set(resource, ref);\n this.refSet.add(ref);\n }\n\n delete(resource: Resource): void {\n const ref = this.refMap.get(resource);\n if (ref) {\n this.refMap.delete(resource);\n this.refSet.delete(ref);\n }\n }\n\n invalidateAll(): void {\n for (const ref of this.refSet) {\n const resource = ref.deref();\n if (resource) {\n resource.invalidateAll();\n } else {\n this.refSet.delete(ref);\n }\n }\n }\n\n clearAll(): void {\n for (const ref of this.refSet) {\n const resource = ref.deref();\n if (resource) {\n resource.clearAll();\n } else {\n this.refSet.delete(ref);\n }\n }\n }\n}\n\nexport const allResources: ResourceGroup = /* @__PURE__ */ new ResourceGroup();\n\nexport function createResourceGroup(name?: string): ResourceGroup {\n return new ResourceGroup(name);\n}\n","import { autobind } from '@lib/autobind';\nimport type { CacheState, ErrorState, ValueState } from '@lib/cacheState';\nimport { calcDuration } from '@lib/calcDuration';\nimport { calculatedValue } from '@lib/calculatedValue';\nimport type { Constrain } from '@lib/constrain';\nimport { deepEqual } from '@lib/equals';\nimport { InstanceCache } from '@lib/instanceCache';\nimport { makeSelector } from '@lib/makeSelector';\nimport { type MaybePromise } from '@lib/maybePromise';\nimport type { AnyPath, Path, Value } from '@lib/path';\nimport { PromiseWithState } from '@lib/promiseWithState';\nimport type { Duration, Selector } from './commonTypes';\nimport { allResources, type ResourceGroup } from './resourceGroup';\nimport { Store, createStore, type Calculate, type StoreOptions } from './store';\n\nexport interface CacheGetOptions {\n /**\n * How to handle the cache when getting the value.\n * - `whenMissing`: Only fetch a new value if there is no cached value.\n * - `whenStale`: Fetch a new value if there is no cached value or if the cached value is stale.\n * - `force`: Always fetch a new value, regardless of the cache state.\n */\n update?: 'whenMissing' | 'whenStale' | 'force';\n\n /**\n * If set to `true`, the cache will be updated in the background.\n * This means that a stale value will be returned immediately, if available, while the new value is being fetched.\n */\n backgroundUpdate?: boolean;\n}\n\nexport interface CacheFunction<T, Args extends any[] = []> {\n (...args: Args): Promise<T> | Calculate<Promise<T>>;\n}\n\nexport interface CacheOptions<T, Args extends any[]> extends StoreOptions<Promise<T>> {\n /**\n * How long to keep the cache entry before it is considered stale.\n * If set to `undefined` or `null`, the cache entry will never be invalidated automatically.\n *\n * @example\n * ```typescript\n * createCache(fetchData, {\n * invalidateAfter: { seconds: 10 },\n * });\n * ```\n */\n invalidateAfter?: Duration | ((state: ValueState<T> | ErrorState) => Duration | null) | null;\n\n /**\n * If set, the cache will be invalidated when the window gets focused.\n * This is useful for caches that are used in a browser environment and might become stale when the user switches tabs.\n */\n invalidateOnWindowFocus?: boolean;\n\n /**\n * If set, the cached value will be cleared when the cache is invalidated.\n * Without this option, the cache will keep the last value as stale until a new value becomes available.\n */\n clearOnInvalidate?: boolean;\n\n /**\n * If set, cache entries will be cleared after approximately the specified duration.\n * This is useful for long lived pages or applications and helps to prevent memory leaks.\n * The exact time when the entry is cleared is not guaranteed, since it will be cleared during garbage collection.\n */\n clearUnusedAfter?: Duration | null;\n\n /**\n * Add the cache to the specified resource group(s).\n * This allows you to invalidate or clear multiple caches that belong to the same group.\n * All caches are always added to the `allResources` group.\n */\n resourceGroup?: ResourceGroup | ResourceGroup[];\n\n /**\n * Function to generate a custom cache key based on the provided arguments.\n * This allows you to control how cache entries are identified and reused.\n * By default, the arguments array is used as the cache key.\n *\n * @example\n * ```typescript\n * // Will use the same instance when provided with `undefined`, `{ num: 0 }`, `{ bool: false }`, etc.\n * createCache((filter?: { num?: number, bool?: boolean }) => fetchData(filter), {\n * getCacheKey: (filter?) => ({\n * num: filter?.num ?? 0,\n * bool: filter?.bool ?? false,\n * }),\n * });\n * ```\n */\n getCacheKey?: (...args: NoInfer<Args>) => unknown;\n}\n\nexport class Cache<T> extends Store<Promise<T>> {\n readonly state: Store<CacheState<T>> = createStore<CacheState<T>>({\n status: 'pending',\n isStale: true,\n isUpdating: false,\n isConnected: false,\n });\n\n protected stalePromise?: Promise<T>;\n\n protected invalidationTimer?: ReturnType<typeof setTimeout>;\n\n constructor(\n getter: Calculate<Promise<T>>,\n public readonly options: CacheOptions<T, any> = {},\n public readonly derivedFromCache?: {\n cache: Cache<any>;\n selectors: (Selector<any, any> | AnyPath)[];\n },\n _call?: (...args: any[]) => any,\n ) {\n super(getter, options, undefined, _call);\n autobind(Cache);\n\n this.watchPromise();\n this.watchFocus();\n }\n\n get({ update = 'whenStale', backgroundUpdate = false }: CacheGetOptions = {}): Promise<T> {\n this.calculatedValue?.check();\n const promise = this.calculatedValue?.value;\n const stalePromise = this.stalePromise;\n\n if (\n (update === 'whenMissing' && !promise && !stalePromise) ||\n (update === 'whenStale' && !promise) ||\n update === 'force'\n ) {\n this.calculatedValue = calculatedValue(this, this.notify);\n this.notify();\n\n if ((!promise && !stalePromise) || !backgroundUpdate) {\n return this.calculatedValue.value;\n }\n }\n\n if (!promise || (stalePromise && backgroundUpdate)) {\n return stalePromise!;\n }\n\n return promise;\n }\n\n updateValue(value: MaybePromise<T> | ((value: T | undefined) => T)): void {\n if (value instanceof Function) {\n value = value(this.state.get().value);\n }\n this.set(PromiseWithState.resolve(value));\n }\n\n updateError(error: unknown): void {\n this.set(PromiseWithState.reject(error));\n }\n\n invalidate(recursive?: boolean): void {\n const { clearOnInvalidate } = this.options;\n\n if (clearOnInvalidate) {\n return this.clear(recursive);\n }\n\n const { status, isStale, isUpdating } = this.state.get();\n if (status !== 'pending' && !isStale && !isUpdating) {\n this.stalePromise = this.calculatedValue?.value;\n }\n\n this.state.set((state) => ({\n ...state,\n isStale: true,\n isUpdating: false,\n }));\n\n super.invalidate(recursive);\n }\n\n clear(recursive?: boolean): void {\n this.state.set({\n status: 'pending',\n isStale: true,\n isUpdating: false,\n isConnected: false,\n });\n delete this.stalePromise;\n\n super.invalidate(recursive);\n }\n\n mapValue<S>(selector: Selector<T, S>): Cache<S>;\n\n mapValue<const P extends AnyPath>(selector: P extends Path<T> ? P : Path<T>): Cache<Value<T, P>>;\n\n mapValue(selector: Selector<any, any> | AnyPath) {\n return mapValue(this, selector);\n }\n\n protected watchPromise(): void {\n this.subscribe(\n async (promise) => {\n if (promise instanceof PromiseWithState && promise.state.status !== 'pending') {\n promise.catch(() => undefined);\n\n this.state.set((state) => ({\n ...promise.state,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n\n delete this.stalePromise;\n this.setTimers();\n return;\n }\n\n this.state.set((state) => ({\n ...state,\n isUpdating: true,\n }));\n\n this.setTimers();\n\n try {\n const value = await promise;\n\n if (promise !== this.calculatedValue?.value) {\n return;\n }\n\n this.state.set((state) => ({\n status: 'value',\n value,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n delete this.stalePromise;\n this.setTimers();\n } catch (error) {\n if (promise !== this.calculatedValue?.value) {\n return;\n }\n\n this.state.set((state) => ({\n status: 'error',\n error,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n delete this.stalePromise;\n this.setTimers();\n }\n },\n { passive: true },\n );\n }\n\n protected setTimers(): void {\n if (this.invalidationTimer) {\n clearTimeout(this.invalidationTimer);\n }\n this.invalidationTimer = undefined;\n\n const state = this.state.get();\n let { invalidateAfter } = this.options;\n const ref = new WeakRef(this);\n\n if (state.status === 'pending') {\n return;\n }\n\n if (invalidateAfter instanceof Function) {\n invalidateAfter = invalidateAfter(state);\n }\n\n if (invalidateAfter !== null && invalidateAfter !== undefined) {\n this.invalidationTimer = setTimeout(\n () => ref?.deref()?.invalidate(),\n calcDuration(invalidateAfter),\n );\n }\n }\n\n protected watchFocus(): void {\n const { invalidateOnWindowFocus } = this.options;\n\n if (\n !invalidateOnWindowFocus ||\n typeof document === 'undefined' ||\n typeof document.addEventListener === 'undefined'\n ) {\n return;\n }\n\n const ref = new WeakRef(this);\n\n const onFocus = () => {\n const that = ref?.deref();\n if (!that) {\n document.removeEventListener('visibilitychange', onFocus);\n return;\n }\n\n if (!document.hidden && !that.state.get().isConnected) {\n that.invalidate();\n }\n };\n\n document.addEventListener('visibilitychange', onFocus);\n }\n}\n\nfunction mapValue<T, S>(cache: Cache<T>, _selector: Selector<T, S> | AnyPath, get?: any): Cache<S> {\n const selector = makeSelector(_selector);\n const derivedFromCache = {\n cache: cache.derivedFromCache ? cache.derivedFromCache.cache : cache,\n selectors: cache.derivedFromCache\n ? [...cache.derivedFromCache.selectors, _selector]\n : [_selector],\n };\n\n return new Cache(\n async ({ use }) => {\n const value = await use(cache);\n return selector(value);\n },\n {\n equals: cache.options.equals,\n },\n derivedFromCache,\n get,\n );\n}\n\nexport type CreateCacheResult<T, Args extends any[]> = [] extends Args\n ? CacheBundle<T, Args> & Cache<T>\n : CacheBundle<T, Args>;\n\nexport interface InvalidationOptions<T> {\n filter?: (cache: Cache<T>) => boolean;\n}\n\nexport type CacheBundle<T, Args extends any[]> = {\n (...args: Args): Cache<T>;\n mapCache<S>(selector: Selector<T, S>): CreateCacheResult<S, Args>;\n mapValue<const P>(selector: Constrain<P, Path<T>>): CreateCacheResult<Value<T, P>, Args>;\n invalidateAll: (options?: InvalidationOptions<T>) => void;\n clearAll: (options?: InvalidationOptions<T>) => void;\n getInstances: () => Cache<T>[];\n};\n\nfunction create<T, Args extends any[] = []>(\n cacheFunction: CacheFunction<T, Args>,\n options?: CacheOptions<T, Args>,\n): CreateCacheResult<T, Args> {\n return internalCreate<T, Args>(cacheFunction, options);\n}\n\nfunction internalCreate<T, Args extends any[] = []>(\n source:\n | CacheFunction<T, Args>\n | [cache: CacheBundle<any, Args>, selector: Selector<any, T> | AnyPath],\n options?: CacheOptions<T, Args>,\n): CreateCacheResult<T, Args> {\n options = { ...createCache.defaultOptions, ...options };\n const { clearUnusedAfter, resourceGroup } = options ?? {};\n\n let baseInstance: CacheBundle<T, Args> & Cache<T>;\n\n const instanceCache = new InstanceCache<Args, Cache<T>>(\n (...args: Args): Cache<T> => {\n if (Array.isArray(source)) {\n const [cache, selector] = source;\n return mapValue(cache(...args), selector, get);\n }\n\n return new Cache(\n (helpers) => {\n const result = source.apply(helpers, args);\n\n if (result instanceof Function) {\n return result(helpers);\n }\n\n return result;\n },\n options,\n undefined,\n args.length === 0 ? get : undefined,\n );\n },\n clearUnusedAfter ? calcDuration(clearUnusedAfter) : undefined,\n );\n\n function get(...args: Args) {\n const sliceAfter = args.lastIndexOf(undefined);\n if (sliceAfter !== -1) {\n args = args.slice(0, sliceAfter) as Args;\n }\n\n const cacheKey = options?.getCacheKey ? options.getCacheKey(...args) : args;\n return instanceCache.getWithKey(args, cacheKey);\n }\n\n const mapCache = (selector: any) => {\n return internalCreate([baseInstance, selector]);\n };\n\n const invalidateAll = ({ filter = () => true }: InvalidationOptions<T> = {}) => {\n for (const instance of instanceCache.values()) {\n if (filter(instance)) {\n instance.invalidate();\n }\n }\n };\n\n const clearAll = ({ filter = () => true }: InvalidationOptions<T> = {}) => {\n for (const instance of instanceCache.values()) {\n if (filter(instance)) {\n instance.clear();\n }\n }\n };\n\n const getInstances = () => {\n return instanceCache.values();\n };\n\n baseInstance = Object.assign(get(...([] as unknown as Args)), {\n mapCache,\n invalidateAll,\n clearAll,\n getInstances,\n }) as CacheBundle<T, Args> & Cache<T>;\n\n const groups = Array.isArray(resourceGroup)\n ? resourceGroup\n : resourceGroup\n ? [resourceGroup]\n : [];\n\n for (const group of groups.concat(allResources)) {\n group.add(baseInstance);\n }\n\n return baseInstance;\n}\n\nexport const createCache: typeof create & { defaultOptions: CacheOptions<any, any> } =\n /* @__PURE__ */ Object.assign(create, {\n defaultOptions: {\n invalidateOnWindowFocus: true,\n clearUnusedAfter: { days: 1 },\n retain: { milliseconds: 1 },\n equals: deepEqual,\n } as CacheOptions<any, any>,\n });\n","import { autobind } from '@lib/autobind';\n\nexport class Scope<T> {\n constructor(public readonly defaultValue: T) {\n autobind(Scope);\n }\n}\n\nexport function createScope<T>(defaultValue: T): Scope<T> {\n return new Scope(defaultValue);\n}\n"],"names":["simpleHash","autobind","Store","createStore","calculatedValue","PromiseWithState","calcDuration","makeSelector","deepEqual"],"mappings":"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"}
|
package/dist/es/scope.mjs
CHANGED
|
@@ -21,7 +21,10 @@ class InstanceCache {
|
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
get(...args) {
|
|
24
|
-
|
|
24
|
+
return this.getWithKey(args, args);
|
|
25
|
+
}
|
|
26
|
+
getWithKey(args, cacheKey) {
|
|
27
|
+
const key = simpleHash(cacheKey);
|
|
25
28
|
let entry = this.cache.get(key);
|
|
26
29
|
let value = entry?.ref ?? entry?.weakRef?.deref();
|
|
27
30
|
if (!entry || !value) {
|
|
@@ -291,9 +294,6 @@ function internalCreate(source, options) {
|
|
|
291
294
|
let baseInstance;
|
|
292
295
|
const instanceCache = new InstanceCache(
|
|
293
296
|
(...args) => {
|
|
294
|
-
if (args.length === 0 && baseInstance) {
|
|
295
|
-
return baseInstance;
|
|
296
|
-
}
|
|
297
297
|
if (Array.isArray(source)) {
|
|
298
298
|
const [cache, selector] = source;
|
|
299
299
|
return mapValue(cache(...args), selector, get);
|
|
@@ -318,25 +318,34 @@ function internalCreate(source, options) {
|
|
|
318
318
|
if (sliceAfter !== -1) {
|
|
319
319
|
args = args.slice(0, sliceAfter);
|
|
320
320
|
}
|
|
321
|
-
|
|
321
|
+
const cacheKey = options?.getCacheKey ? options.getCacheKey(...args) : args;
|
|
322
|
+
return instanceCache.getWithKey(args, cacheKey);
|
|
322
323
|
}
|
|
323
324
|
const mapCache = (selector) => {
|
|
324
325
|
return internalCreate([baseInstance, selector]);
|
|
325
326
|
};
|
|
326
|
-
const invalidateAll = () => {
|
|
327
|
+
const invalidateAll = ({ filter = () => true } = {}) => {
|
|
327
328
|
for (const instance of instanceCache.values()) {
|
|
328
|
-
instance
|
|
329
|
+
if (filter(instance)) {
|
|
330
|
+
instance.invalidate();
|
|
331
|
+
}
|
|
329
332
|
}
|
|
330
333
|
};
|
|
331
|
-
const clearAll = () => {
|
|
334
|
+
const clearAll = ({ filter = () => true } = {}) => {
|
|
332
335
|
for (const instance of instanceCache.values()) {
|
|
333
|
-
instance
|
|
336
|
+
if (filter(instance)) {
|
|
337
|
+
instance.clear();
|
|
338
|
+
}
|
|
334
339
|
}
|
|
335
340
|
};
|
|
341
|
+
const getInstances = () => {
|
|
342
|
+
return instanceCache.values();
|
|
343
|
+
};
|
|
336
344
|
baseInstance = Object.assign(get(...[]), {
|
|
337
345
|
mapCache,
|
|
338
346
|
invalidateAll,
|
|
339
|
-
clearAll
|
|
347
|
+
clearAll,
|
|
348
|
+
getInstances
|
|
340
349
|
});
|
|
341
350
|
const groups = Array.isArray(resourceGroup) ? resourceGroup : resourceGroup ? [resourceGroup] : [];
|
|
342
351
|
for (const group of groups.concat(allResources)) {
|
|
@@ -347,7 +356,6 @@ function internalCreate(source, options) {
|
|
|
347
356
|
const createCache = /* @__PURE__ */ Object.assign(create, {
|
|
348
357
|
defaultOptions: {
|
|
349
358
|
invalidateOnWindowFocus: true,
|
|
350
|
-
invalidateOnActivation: true,
|
|
351
359
|
clearUnusedAfter: { days: 1 },
|
|
352
360
|
retain: { milliseconds: 1 },
|
|
353
361
|
equals: deepEqual
|
package/dist/es/scope.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.mjs","sources":["../../src/lib/instanceCache.ts","../../src/core/resourceGroup.ts","../../src/core/cache.ts","../../src/core/scope.ts"],"sourcesContent":["import { simpleHash } from './hash';\n\nexport class InstanceCache<Args extends any[], T extends object> {\n private cache = new Map<string, { t: number; ref?: T; weakRef: WeakRef<T> }>();\n\n private interval = this.cacheTime\n ? setInterval(() => this.cleanup(), Math.max(this.cacheTime / 10, 1))\n : undefined;\n\n constructor(\n public readonly factory: (...args: Args) => T,\n public readonly cacheTime?: number,\n ) {}\n\n cleanup(): void {\n const cutoff = this.now() - (this.cacheTime ?? 0);\n\n for (const [key, entry] of this.cache.entries()) {\n if (entry.ref && entry.t <= cutoff) {\n delete entry.ref;\n }\n\n if (!entry.ref && !entry.weakRef?.deref()) {\n this.cache.delete(key);\n }\n }\n }\n\n get(...args: Args): T {\n const key = simpleHash(args);\n let entry = this.cache.get(key);\n let value = entry?.ref ?? entry?.weakRef?.deref();\n\n if (!entry || !value) {\n value = this.factory(...args);\n entry = {\n t: this.now(),\n ref: value,\n weakRef: new WeakRef(value),\n };\n\n this.cache.set(key, entry);\n } else {\n entry.t = this.now();\n entry.ref ??= value;\n }\n\n return value;\n }\n\n values(): T[] {\n return [...this.cache.values()]\n .map((entry) => entry.ref ?? entry.weakRef?.deref())\n .filter((value): value is T => !!value);\n }\n\n stop(): void {\n if (this.interval) {\n clearInterval(this.interval);\n }\n }\n\n stats(): { count: number; withRef: number; withWeakRef: number } {\n return {\n count: this.cache.size,\n withRef: [...this.cache.values()].filter((x) => !!x.ref).length,\n withWeakRef: [...this.cache.values()].filter((x) => !!x.weakRef?.deref()).length,\n };\n }\n\n private now() {\n return performance.now();\n }\n}\n","import { autobind } from '@lib/autobind';\n\nexport interface Resource {\n invalidateAll(): void;\n clearAll(): void;\n}\n\nexport class ResourceGroup {\n private refMap = new WeakMap<Resource, WeakRef<Resource>>();\n\n private refSet = new Set<WeakRef<Resource>>();\n\n constructor(public readonly name?: string) {\n autobind(ResourceGroup);\n }\n\n add(resource: Resource): void {\n const ref = new WeakRef(resource);\n this.refMap.set(resource, ref);\n this.refSet.add(ref);\n }\n\n delete(resource: Resource): void {\n const ref = this.refMap.get(resource);\n if (ref) {\n this.refMap.delete(resource);\n this.refSet.delete(ref);\n }\n }\n\n invalidateAll(): void {\n for (const ref of this.refSet) {\n const resource = ref.deref();\n if (resource) {\n resource.invalidateAll();\n } else {\n this.refSet.delete(ref);\n }\n }\n }\n\n clearAll(): void {\n for (const ref of this.refSet) {\n const resource = ref.deref();\n if (resource) {\n resource.clearAll();\n } else {\n this.refSet.delete(ref);\n }\n }\n }\n}\n\nexport const allResources: ResourceGroup = /* @__PURE__ */ new ResourceGroup();\n\nexport function createResourceGroup(name?: string): ResourceGroup {\n return new ResourceGroup(name);\n}\n","import { autobind } from '@lib/autobind';\nimport type { CacheState, ErrorState, ValueState } from '@lib/cacheState';\nimport { calcDuration } from '@lib/calcDuration';\nimport { calculatedValue } from '@lib/calculatedValue';\nimport type { Constrain } from '@lib/constrain';\nimport { deepEqual } from '@lib/equals';\nimport { InstanceCache } from '@lib/instanceCache';\nimport { makeSelector } from '@lib/makeSelector';\nimport { type MaybePromise } from '@lib/maybePromise';\nimport type { AnyPath, Path, Value } from '@lib/path';\nimport { PromiseWithState } from '@lib/promiseWithState';\nimport type { Duration, Selector } from './commonTypes';\nimport { allResources, type ResourceGroup } from './resourceGroup';\nimport { Store, createStore, type Calculate, type StoreOptions } from './store';\n\nexport interface CacheGetOptions {\n update?: 'whenMissing' | 'whenStale' | 'force';\n backgroundUpdate?: boolean;\n}\n\nexport interface CacheFunction<T, Args extends any[] = []> {\n (...args: Args): Promise<T> | Calculate<Promise<T>>;\n}\n\nexport interface CacheOptions<T> extends StoreOptions<Promise<T>> {\n invalidateAfter?: Duration | ((state: ValueState<T> | ErrorState) => Duration | null) | null;\n invalidateOnWindowFocus?: boolean;\n invalidateOnActivation?: boolean;\n clearOnInvalidate?: boolean;\n clearUnusedAfter?: Duration | null;\n resourceGroup?: ResourceGroup | ResourceGroup[];\n}\n\nexport class Cache<T> extends Store<Promise<T>> {\n readonly state: Store<CacheState<T>> = createStore<CacheState<T>>({\n status: 'pending',\n isStale: true,\n isUpdating: false,\n isConnected: false,\n });\n\n protected stalePromise?: Promise<T>;\n\n protected invalidationTimer?: ReturnType<typeof setTimeout>;\n\n constructor(\n getter: Calculate<Promise<T>>,\n public readonly options: CacheOptions<T> = {},\n public readonly derivedFromCache?: {\n cache: Cache<any>;\n selectors: (Selector<any, any> | AnyPath)[];\n },\n _call?: (...args: any[]) => any,\n ) {\n super(getter, options, undefined, _call);\n autobind(Cache);\n\n this.watchPromise();\n this.watchFocus();\n }\n\n get({ update = 'whenStale', backgroundUpdate = false }: CacheGetOptions = {}): Promise<T> {\n this.calculatedValue?.check();\n const promise = this.calculatedValue?.value;\n const stalePromise = this.stalePromise;\n\n if (\n (update === 'whenMissing' && !promise && !stalePromise) ||\n (update === 'whenStale' && !promise) ||\n update === 'force'\n ) {\n this.calculatedValue = calculatedValue(this, this.notify);\n this.notify();\n\n if ((!promise && !stalePromise) || !backgroundUpdate) {\n return this.calculatedValue.value;\n }\n }\n\n if (!promise || (stalePromise && backgroundUpdate)) {\n return stalePromise!;\n }\n\n return promise;\n }\n\n updateValue(value: MaybePromise<T> | ((value: T | undefined) => T)): void {\n if (value instanceof Function) {\n value = value(this.state.get().value);\n }\n this.set(PromiseWithState.resolve(value));\n }\n\n updateError(error: unknown): void {\n this.set(PromiseWithState.reject(error));\n }\n\n invalidate(recursive?: boolean): void {\n const { clearOnInvalidate } = this.options;\n\n if (clearOnInvalidate) {\n return this.clear(recursive);\n }\n\n const { status, isStale, isUpdating } = this.state.get();\n if (status !== 'pending' && !isStale && !isUpdating) {\n this.stalePromise = this.calculatedValue?.value;\n }\n\n this.state.set((state) => ({\n ...state,\n isStale: true,\n isUpdating: false,\n }));\n\n super.invalidate(recursive);\n }\n\n clear(recursive?: boolean): void {\n this.state.set({\n status: 'pending',\n isStale: true,\n isUpdating: false,\n isConnected: false,\n });\n delete this.stalePromise;\n\n super.invalidate(recursive);\n }\n\n mapValue<S>(selector: Selector<T, S>): Cache<S>;\n\n mapValue<const P extends AnyPath>(selector: P extends Path<T> ? P : Path<T>): Cache<Value<T, P>>;\n\n mapValue(selector: Selector<any, any> | AnyPath) {\n return mapValue(this, selector);\n }\n\n protected watchPromise(): void {\n this.subscribe(\n async (promise) => {\n if (promise instanceof PromiseWithState && promise.state.status !== 'pending') {\n promise.catch(() => undefined);\n\n this.state.set((state) => ({\n ...promise.state,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n\n delete this.stalePromise;\n this.setTimers();\n return;\n }\n\n this.state.set((state) => ({\n ...state,\n isUpdating: true,\n }));\n\n this.setTimers();\n\n try {\n const value = await promise;\n\n if (promise !== this.calculatedValue?.value) {\n return;\n }\n\n this.state.set((state) => ({\n status: 'value',\n value,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n delete this.stalePromise;\n this.setTimers();\n } catch (error) {\n if (promise !== this.calculatedValue?.value) {\n return;\n }\n\n this.state.set((state) => ({\n status: 'error',\n error,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n delete this.stalePromise;\n this.setTimers();\n }\n },\n { passive: true },\n );\n }\n\n protected setTimers(): void {\n if (this.invalidationTimer) {\n clearTimeout(this.invalidationTimer);\n }\n this.invalidationTimer = undefined;\n\n const state = this.state.get();\n let { invalidateAfter } = this.options;\n const ref = new WeakRef(this);\n\n if (state.status === 'pending') {\n return;\n }\n\n if (invalidateAfter instanceof Function) {\n invalidateAfter = invalidateAfter(state);\n }\n\n if (invalidateAfter !== null && invalidateAfter !== undefined) {\n this.invalidationTimer = setTimeout(\n () => ref?.deref()?.invalidate(),\n calcDuration(invalidateAfter),\n );\n }\n }\n\n protected watchFocus(): void {\n const { invalidateOnWindowFocus } = this.options;\n\n if (\n !invalidateOnWindowFocus ||\n typeof document === 'undefined' ||\n typeof document.addEventListener === 'undefined'\n ) {\n return;\n }\n\n const ref = new WeakRef(this);\n\n const onFocus = () => {\n const that = ref?.deref();\n if (!that) {\n document.removeEventListener('visibilitychange', onFocus);\n return;\n }\n\n if (!document.hidden && !that.state.get().isConnected) {\n that.invalidate();\n }\n };\n\n document.addEventListener('visibilitychange', onFocus);\n }\n}\n\nfunction mapValue<T, S>(cache: Cache<T>, _selector: Selector<T, S> | AnyPath, get?: any): Cache<S> {\n const selector = makeSelector(_selector);\n const derivedFromCache = {\n cache: cache.derivedFromCache ? cache.derivedFromCache.cache : cache,\n selectors: cache.derivedFromCache\n ? [...cache.derivedFromCache.selectors, _selector]\n : [_selector],\n };\n\n return new Cache(\n async ({ use }) => {\n const value = await use(cache);\n return selector(value);\n },\n {\n equals: cache.options.equals,\n },\n derivedFromCache,\n get,\n );\n}\n\nexport type CreateCacheResult<T, Args extends any[]> = [] extends Args\n ? CacheBundle<T, Args> & Cache<T>\n : CacheBundle<T, Args>;\n\nexport type CacheBundle<T, Args extends any[]> = {\n (...args: Args): Cache<T>;\n mapCache<S>(selector: Selector<T, S>): CreateCacheResult<S, Args>;\n mapValue<const P>(selector: Constrain<P, Path<T>>): CreateCacheResult<Value<T, P>, Args>;\n invalidateAll: () => void;\n clearAll: () => void;\n};\n\nfunction create<T, Args extends any[] = []>(\n cacheFunction: CacheFunction<T, Args>,\n options?: CacheOptions<T>,\n): CreateCacheResult<T, Args> {\n return internalCreate<T, Args>(cacheFunction, options);\n}\n\nfunction internalCreate<T, Args extends any[] = []>(\n source:\n | CacheFunction<T, Args>\n | [cache: CacheBundle<any, Args>, selector: Selector<any, T> | AnyPath],\n options?: CacheOptions<T>,\n): CreateCacheResult<T, Args> {\n options = { ...createCache.defaultOptions, ...options };\n const { clearUnusedAfter, resourceGroup } = options ?? {};\n\n let baseInstance: CacheBundle<T, Args> & Cache<T>;\n\n const instanceCache = new InstanceCache<Args, Cache<T>>(\n (...args: Args): Cache<T> => {\n if (args.length === 0 && baseInstance) {\n return baseInstance;\n }\n\n if (Array.isArray(source)) {\n const [cache, selector] = source;\n return mapValue(cache(...args), selector, get);\n }\n\n return new Cache(\n (helpers) => {\n const result = source.apply(helpers, args);\n\n if (result instanceof Function) {\n return result(helpers);\n }\n\n return result;\n },\n options,\n undefined,\n args.length === 0 ? get : undefined,\n );\n },\n clearUnusedAfter ? calcDuration(clearUnusedAfter) : undefined,\n );\n\n function get(...args: Args) {\n const sliceAfter = args.lastIndexOf(undefined);\n if (sliceAfter !== -1) {\n args = args.slice(0, sliceAfter) as Args;\n }\n\n return instanceCache.get(...args);\n }\n\n const mapCache = (selector: any) => {\n return internalCreate([baseInstance, selector]);\n };\n\n const invalidateAll = () => {\n for (const instance of instanceCache.values()) {\n instance.invalidate();\n }\n };\n\n const clearAll = () => {\n for (const instance of instanceCache.values()) {\n instance.clear();\n }\n };\n\n baseInstance = Object.assign(get(...([] as unknown as Args)), {\n mapCache,\n invalidateAll,\n clearAll,\n }) as CacheBundle<T, Args> & Cache<T>;\n\n const groups = Array.isArray(resourceGroup)\n ? resourceGroup\n : resourceGroup\n ? [resourceGroup]\n : [];\n\n for (const group of groups.concat(allResources)) {\n group.add(baseInstance);\n }\n\n return baseInstance;\n}\n\nexport const createCache: typeof create & { defaultOptions: CacheOptions<any> } =\n /* @__PURE__ */ Object.assign(create, {\n defaultOptions: {\n invalidateOnWindowFocus: true,\n invalidateOnActivation: true,\n clearUnusedAfter: { days: 1 },\n retain: { milliseconds: 1 },\n equals: deepEqual,\n } as CacheOptions<any>,\n });\n","import { autobind } from '@lib/autobind';\n\nexport class Scope<T> {\n constructor(public readonly defaultValue: T) {\n autobind(Scope);\n }\n}\n\nexport function createScope<T>(defaultValue: T): Scope<T> {\n return new Scope(defaultValue);\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scope.mjs","sources":["../../src/lib/instanceCache.ts","../../src/core/resourceGroup.ts","../../src/core/cache.ts","../../src/core/scope.ts"],"sourcesContent":["import { simpleHash } from './hash';\n\nexport class InstanceCache<Args extends any[], T extends object> {\n private cache = new Map<string, { t: number; ref?: T; weakRef: WeakRef<T> }>();\n\n private interval = this.cacheTime\n ? setInterval(() => this.cleanup(), Math.max(this.cacheTime / 10, 1))\n : undefined;\n\n constructor(\n public readonly factory: (...args: Args) => T,\n public readonly cacheTime?: number,\n ) {}\n\n cleanup(): void {\n const cutoff = this.now() - (this.cacheTime ?? 0);\n\n for (const [key, entry] of this.cache.entries()) {\n if (entry.ref && entry.t <= cutoff) {\n delete entry.ref;\n }\n\n if (!entry.ref && !entry.weakRef?.deref()) {\n this.cache.delete(key);\n }\n }\n }\n\n get(...args: Args): T {\n return this.getWithKey(args, args);\n }\n\n getWithKey(args: Args, cacheKey: unknown): T {\n const key = simpleHash(cacheKey);\n let entry = this.cache.get(key);\n let value = entry?.ref ?? entry?.weakRef?.deref();\n\n if (!entry || !value) {\n value = this.factory(...args);\n entry = {\n t: this.now(),\n ref: value,\n weakRef: new WeakRef(value),\n };\n\n this.cache.set(key, entry);\n } else {\n entry.t = this.now();\n entry.ref ??= value;\n }\n\n return value;\n }\n\n values(): T[] {\n return [...this.cache.values()]\n .map((entry) => entry.ref ?? entry.weakRef?.deref())\n .filter((value): value is T => !!value);\n }\n\n stop(): void {\n if (this.interval) {\n clearInterval(this.interval);\n }\n }\n\n stats(): { count: number; withRef: number; withWeakRef: number } {\n return {\n count: this.cache.size,\n withRef: [...this.cache.values()].filter((x) => !!x.ref).length,\n withWeakRef: [...this.cache.values()].filter((x) => !!x.weakRef?.deref()).length,\n };\n }\n\n private now() {\n return performance.now();\n }\n}\n","import { autobind } from '@lib/autobind';\n\nexport interface Resource {\n invalidateAll(): void;\n clearAll(): void;\n}\n\nexport class ResourceGroup {\n private refMap = new WeakMap<Resource, WeakRef<Resource>>();\n\n private refSet = new Set<WeakRef<Resource>>();\n\n constructor(public readonly name?: string) {\n autobind(ResourceGroup);\n }\n\n add(resource: Resource): void {\n const ref = new WeakRef(resource);\n this.refMap.set(resource, ref);\n this.refSet.add(ref);\n }\n\n delete(resource: Resource): void {\n const ref = this.refMap.get(resource);\n if (ref) {\n this.refMap.delete(resource);\n this.refSet.delete(ref);\n }\n }\n\n invalidateAll(): void {\n for (const ref of this.refSet) {\n const resource = ref.deref();\n if (resource) {\n resource.invalidateAll();\n } else {\n this.refSet.delete(ref);\n }\n }\n }\n\n clearAll(): void {\n for (const ref of this.refSet) {\n const resource = ref.deref();\n if (resource) {\n resource.clearAll();\n } else {\n this.refSet.delete(ref);\n }\n }\n }\n}\n\nexport const allResources: ResourceGroup = /* @__PURE__ */ new ResourceGroup();\n\nexport function createResourceGroup(name?: string): ResourceGroup {\n return new ResourceGroup(name);\n}\n","import { autobind } from '@lib/autobind';\nimport type { CacheState, ErrorState, ValueState } from '@lib/cacheState';\nimport { calcDuration } from '@lib/calcDuration';\nimport { calculatedValue } from '@lib/calculatedValue';\nimport type { Constrain } from '@lib/constrain';\nimport { deepEqual } from '@lib/equals';\nimport { InstanceCache } from '@lib/instanceCache';\nimport { makeSelector } from '@lib/makeSelector';\nimport { type MaybePromise } from '@lib/maybePromise';\nimport type { AnyPath, Path, Value } from '@lib/path';\nimport { PromiseWithState } from '@lib/promiseWithState';\nimport type { Duration, Selector } from './commonTypes';\nimport { allResources, type ResourceGroup } from './resourceGroup';\nimport { Store, createStore, type Calculate, type StoreOptions } from './store';\n\nexport interface CacheGetOptions {\n /**\n * How to handle the cache when getting the value.\n * - `whenMissing`: Only fetch a new value if there is no cached value.\n * - `whenStale`: Fetch a new value if there is no cached value or if the cached value is stale.\n * - `force`: Always fetch a new value, regardless of the cache state.\n */\n update?: 'whenMissing' | 'whenStale' | 'force';\n\n /**\n * If set to `true`, the cache will be updated in the background.\n * This means that a stale value will be returned immediately, if available, while the new value is being fetched.\n */\n backgroundUpdate?: boolean;\n}\n\nexport interface CacheFunction<T, Args extends any[] = []> {\n (...args: Args): Promise<T> | Calculate<Promise<T>>;\n}\n\nexport interface CacheOptions<T, Args extends any[]> extends StoreOptions<Promise<T>> {\n /**\n * How long to keep the cache entry before it is considered stale.\n * If set to `undefined` or `null`, the cache entry will never be invalidated automatically.\n *\n * @example\n * ```typescript\n * createCache(fetchData, {\n * invalidateAfter: { seconds: 10 },\n * });\n * ```\n */\n invalidateAfter?: Duration | ((state: ValueState<T> | ErrorState) => Duration | null) | null;\n\n /**\n * If set, the cache will be invalidated when the window gets focused.\n * This is useful for caches that are used in a browser environment and might become stale when the user switches tabs.\n */\n invalidateOnWindowFocus?: boolean;\n\n /**\n * If set, the cached value will be cleared when the cache is invalidated.\n * Without this option, the cache will keep the last value as stale until a new value becomes available.\n */\n clearOnInvalidate?: boolean;\n\n /**\n * If set, cache entries will be cleared after approximately the specified duration.\n * This is useful for long lived pages or applications and helps to prevent memory leaks.\n * The exact time when the entry is cleared is not guaranteed, since it will be cleared during garbage collection.\n */\n clearUnusedAfter?: Duration | null;\n\n /**\n * Add the cache to the specified resource group(s).\n * This allows you to invalidate or clear multiple caches that belong to the same group.\n * All caches are always added to the `allResources` group.\n */\n resourceGroup?: ResourceGroup | ResourceGroup[];\n\n /**\n * Function to generate a custom cache key based on the provided arguments.\n * This allows you to control how cache entries are identified and reused.\n * By default, the arguments array is used as the cache key.\n *\n * @example\n * ```typescript\n * // Will use the same instance when provided with `undefined`, `{ num: 0 }`, `{ bool: false }`, etc.\n * createCache((filter?: { num?: number, bool?: boolean }) => fetchData(filter), {\n * getCacheKey: (filter?) => ({\n * num: filter?.num ?? 0,\n * bool: filter?.bool ?? false,\n * }),\n * });\n * ```\n */\n getCacheKey?: (...args: NoInfer<Args>) => unknown;\n}\n\nexport class Cache<T> extends Store<Promise<T>> {\n readonly state: Store<CacheState<T>> = createStore<CacheState<T>>({\n status: 'pending',\n isStale: true,\n isUpdating: false,\n isConnected: false,\n });\n\n protected stalePromise?: Promise<T>;\n\n protected invalidationTimer?: ReturnType<typeof setTimeout>;\n\n constructor(\n getter: Calculate<Promise<T>>,\n public readonly options: CacheOptions<T, any> = {},\n public readonly derivedFromCache?: {\n cache: Cache<any>;\n selectors: (Selector<any, any> | AnyPath)[];\n },\n _call?: (...args: any[]) => any,\n ) {\n super(getter, options, undefined, _call);\n autobind(Cache);\n\n this.watchPromise();\n this.watchFocus();\n }\n\n get({ update = 'whenStale', backgroundUpdate = false }: CacheGetOptions = {}): Promise<T> {\n this.calculatedValue?.check();\n const promise = this.calculatedValue?.value;\n const stalePromise = this.stalePromise;\n\n if (\n (update === 'whenMissing' && !promise && !stalePromise) ||\n (update === 'whenStale' && !promise) ||\n update === 'force'\n ) {\n this.calculatedValue = calculatedValue(this, this.notify);\n this.notify();\n\n if ((!promise && !stalePromise) || !backgroundUpdate) {\n return this.calculatedValue.value;\n }\n }\n\n if (!promise || (stalePromise && backgroundUpdate)) {\n return stalePromise!;\n }\n\n return promise;\n }\n\n updateValue(value: MaybePromise<T> | ((value: T | undefined) => T)): void {\n if (value instanceof Function) {\n value = value(this.state.get().value);\n }\n this.set(PromiseWithState.resolve(value));\n }\n\n updateError(error: unknown): void {\n this.set(PromiseWithState.reject(error));\n }\n\n invalidate(recursive?: boolean): void {\n const { clearOnInvalidate } = this.options;\n\n if (clearOnInvalidate) {\n return this.clear(recursive);\n }\n\n const { status, isStale, isUpdating } = this.state.get();\n if (status !== 'pending' && !isStale && !isUpdating) {\n this.stalePromise = this.calculatedValue?.value;\n }\n\n this.state.set((state) => ({\n ...state,\n isStale: true,\n isUpdating: false,\n }));\n\n super.invalidate(recursive);\n }\n\n clear(recursive?: boolean): void {\n this.state.set({\n status: 'pending',\n isStale: true,\n isUpdating: false,\n isConnected: false,\n });\n delete this.stalePromise;\n\n super.invalidate(recursive);\n }\n\n mapValue<S>(selector: Selector<T, S>): Cache<S>;\n\n mapValue<const P extends AnyPath>(selector: P extends Path<T> ? P : Path<T>): Cache<Value<T, P>>;\n\n mapValue(selector: Selector<any, any> | AnyPath) {\n return mapValue(this, selector);\n }\n\n protected watchPromise(): void {\n this.subscribe(\n async (promise) => {\n if (promise instanceof PromiseWithState && promise.state.status !== 'pending') {\n promise.catch(() => undefined);\n\n this.state.set((state) => ({\n ...promise.state,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n\n delete this.stalePromise;\n this.setTimers();\n return;\n }\n\n this.state.set((state) => ({\n ...state,\n isUpdating: true,\n }));\n\n this.setTimers();\n\n try {\n const value = await promise;\n\n if (promise !== this.calculatedValue?.value) {\n return;\n }\n\n this.state.set((state) => ({\n status: 'value',\n value,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n delete this.stalePromise;\n this.setTimers();\n } catch (error) {\n if (promise !== this.calculatedValue?.value) {\n return;\n }\n\n this.state.set((state) => ({\n status: 'error',\n error,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n delete this.stalePromise;\n this.setTimers();\n }\n },\n { passive: true },\n );\n }\n\n protected setTimers(): void {\n if (this.invalidationTimer) {\n clearTimeout(this.invalidationTimer);\n }\n this.invalidationTimer = undefined;\n\n const state = this.state.get();\n let { invalidateAfter } = this.options;\n const ref = new WeakRef(this);\n\n if (state.status === 'pending') {\n return;\n }\n\n if (invalidateAfter instanceof Function) {\n invalidateAfter = invalidateAfter(state);\n }\n\n if (invalidateAfter !== null && invalidateAfter !== undefined) {\n this.invalidationTimer = setTimeout(\n () => ref?.deref()?.invalidate(),\n calcDuration(invalidateAfter),\n );\n }\n }\n\n protected watchFocus(): void {\n const { invalidateOnWindowFocus } = this.options;\n\n if (\n !invalidateOnWindowFocus ||\n typeof document === 'undefined' ||\n typeof document.addEventListener === 'undefined'\n ) {\n return;\n }\n\n const ref = new WeakRef(this);\n\n const onFocus = () => {\n const that = ref?.deref();\n if (!that) {\n document.removeEventListener('visibilitychange', onFocus);\n return;\n }\n\n if (!document.hidden && !that.state.get().isConnected) {\n that.invalidate();\n }\n };\n\n document.addEventListener('visibilitychange', onFocus);\n }\n}\n\nfunction mapValue<T, S>(cache: Cache<T>, _selector: Selector<T, S> | AnyPath, get?: any): Cache<S> {\n const selector = makeSelector(_selector);\n const derivedFromCache = {\n cache: cache.derivedFromCache ? cache.derivedFromCache.cache : cache,\n selectors: cache.derivedFromCache\n ? [...cache.derivedFromCache.selectors, _selector]\n : [_selector],\n };\n\n return new Cache(\n async ({ use }) => {\n const value = await use(cache);\n return selector(value);\n },\n {\n equals: cache.options.equals,\n },\n derivedFromCache,\n get,\n );\n}\n\nexport type CreateCacheResult<T, Args extends any[]> = [] extends Args\n ? CacheBundle<T, Args> & Cache<T>\n : CacheBundle<T, Args>;\n\nexport interface InvalidationOptions<T> {\n filter?: (cache: Cache<T>) => boolean;\n}\n\nexport type CacheBundle<T, Args extends any[]> = {\n (...args: Args): Cache<T>;\n mapCache<S>(selector: Selector<T, S>): CreateCacheResult<S, Args>;\n mapValue<const P>(selector: Constrain<P, Path<T>>): CreateCacheResult<Value<T, P>, Args>;\n invalidateAll: (options?: InvalidationOptions<T>) => void;\n clearAll: (options?: InvalidationOptions<T>) => void;\n getInstances: () => Cache<T>[];\n};\n\nfunction create<T, Args extends any[] = []>(\n cacheFunction: CacheFunction<T, Args>,\n options?: CacheOptions<T, Args>,\n): CreateCacheResult<T, Args> {\n return internalCreate<T, Args>(cacheFunction, options);\n}\n\nfunction internalCreate<T, Args extends any[] = []>(\n source:\n | CacheFunction<T, Args>\n | [cache: CacheBundle<any, Args>, selector: Selector<any, T> | AnyPath],\n options?: CacheOptions<T, Args>,\n): CreateCacheResult<T, Args> {\n options = { ...createCache.defaultOptions, ...options };\n const { clearUnusedAfter, resourceGroup } = options ?? {};\n\n let baseInstance: CacheBundle<T, Args> & Cache<T>;\n\n const instanceCache = new InstanceCache<Args, Cache<T>>(\n (...args: Args): Cache<T> => {\n if (Array.isArray(source)) {\n const [cache, selector] = source;\n return mapValue(cache(...args), selector, get);\n }\n\n return new Cache(\n (helpers) => {\n const result = source.apply(helpers, args);\n\n if (result instanceof Function) {\n return result(helpers);\n }\n\n return result;\n },\n options,\n undefined,\n args.length === 0 ? get : undefined,\n );\n },\n clearUnusedAfter ? calcDuration(clearUnusedAfter) : undefined,\n );\n\n function get(...args: Args) {\n const sliceAfter = args.lastIndexOf(undefined);\n if (sliceAfter !== -1) {\n args = args.slice(0, sliceAfter) as Args;\n }\n\n const cacheKey = options?.getCacheKey ? options.getCacheKey(...args) : args;\n return instanceCache.getWithKey(args, cacheKey);\n }\n\n const mapCache = (selector: any) => {\n return internalCreate([baseInstance, selector]);\n };\n\n const invalidateAll = ({ filter = () => true }: InvalidationOptions<T> = {}) => {\n for (const instance of instanceCache.values()) {\n if (filter(instance)) {\n instance.invalidate();\n }\n }\n };\n\n const clearAll = ({ filter = () => true }: InvalidationOptions<T> = {}) => {\n for (const instance of instanceCache.values()) {\n if (filter(instance)) {\n instance.clear();\n }\n }\n };\n\n const getInstances = () => {\n return instanceCache.values();\n };\n\n baseInstance = Object.assign(get(...([] as unknown as Args)), {\n mapCache,\n invalidateAll,\n clearAll,\n getInstances,\n }) as CacheBundle<T, Args> & Cache<T>;\n\n const groups = Array.isArray(resourceGroup)\n ? resourceGroup\n : resourceGroup\n ? [resourceGroup]\n : [];\n\n for (const group of groups.concat(allResources)) {\n group.add(baseInstance);\n }\n\n return baseInstance;\n}\n\nexport const createCache: typeof create & { defaultOptions: CacheOptions<any, any> } =\n /* @__PURE__ */ Object.assign(create, {\n defaultOptions: {\n invalidateOnWindowFocus: true,\n clearUnusedAfter: { days: 1 },\n retain: { milliseconds: 1 },\n equals: deepEqual,\n } as CacheOptions<any, any>,\n });\n","import { autobind } from '@lib/autobind';\n\nexport class Scope<T> {\n constructor(public readonly defaultValue: T) {\n autobind(Scope);\n }\n}\n\nexport function createScope<T>(defaultValue: T): Scope<T> {\n return new Scope(defaultValue);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -6,22 +6,77 @@ import type { Duration, Selector } from './commonTypes';
|
|
|
6
6
|
import { type ResourceGroup } from './resourceGroup';
|
|
7
7
|
import { Store, type Calculate, type StoreOptions } from './store';
|
|
8
8
|
export interface CacheGetOptions {
|
|
9
|
+
/**
|
|
10
|
+
* How to handle the cache when getting the value.
|
|
11
|
+
* - `whenMissing`: Only fetch a new value if there is no cached value.
|
|
12
|
+
* - `whenStale`: Fetch a new value if there is no cached value or if the cached value is stale.
|
|
13
|
+
* - `force`: Always fetch a new value, regardless of the cache state.
|
|
14
|
+
*/
|
|
9
15
|
update?: 'whenMissing' | 'whenStale' | 'force';
|
|
16
|
+
/**
|
|
17
|
+
* If set to `true`, the cache will be updated in the background.
|
|
18
|
+
* This means that a stale value will be returned immediately, if available, while the new value is being fetched.
|
|
19
|
+
*/
|
|
10
20
|
backgroundUpdate?: boolean;
|
|
11
21
|
}
|
|
12
22
|
export interface CacheFunction<T, Args extends any[] = []> {
|
|
13
23
|
(...args: Args): Promise<T> | Calculate<Promise<T>>;
|
|
14
24
|
}
|
|
15
|
-
export interface CacheOptions<T> extends StoreOptions<Promise<T>> {
|
|
25
|
+
export interface CacheOptions<T, Args extends any[]> extends StoreOptions<Promise<T>> {
|
|
26
|
+
/**
|
|
27
|
+
* How long to keep the cache entry before it is considered stale.
|
|
28
|
+
* If set to `undefined` or `null`, the cache entry will never be invalidated automatically.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* createCache(fetchData, {
|
|
33
|
+
* invalidateAfter: { seconds: 10 },
|
|
34
|
+
* });
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
16
37
|
invalidateAfter?: Duration | ((state: ValueState<T> | ErrorState) => Duration | null) | null;
|
|
38
|
+
/**
|
|
39
|
+
* If set, the cache will be invalidated when the window gets focused.
|
|
40
|
+
* This is useful for caches that are used in a browser environment and might become stale when the user switches tabs.
|
|
41
|
+
*/
|
|
17
42
|
invalidateOnWindowFocus?: boolean;
|
|
18
|
-
|
|
43
|
+
/**
|
|
44
|
+
* If set, the cached value will be cleared when the cache is invalidated.
|
|
45
|
+
* Without this option, the cache will keep the last value as stale until a new value becomes available.
|
|
46
|
+
*/
|
|
19
47
|
clearOnInvalidate?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* If set, cache entries will be cleared after approximately the specified duration.
|
|
50
|
+
* This is useful for long lived pages or applications and helps to prevent memory leaks.
|
|
51
|
+
* The exact time when the entry is cleared is not guaranteed, since it will be cleared during garbage collection.
|
|
52
|
+
*/
|
|
20
53
|
clearUnusedAfter?: Duration | null;
|
|
54
|
+
/**
|
|
55
|
+
* Add the cache to the specified resource group(s).
|
|
56
|
+
* This allows you to invalidate or clear multiple caches that belong to the same group.
|
|
57
|
+
* All caches are always added to the `allResources` group.
|
|
58
|
+
*/
|
|
21
59
|
resourceGroup?: ResourceGroup | ResourceGroup[];
|
|
60
|
+
/**
|
|
61
|
+
* Function to generate a custom cache key based on the provided arguments.
|
|
62
|
+
* This allows you to control how cache entries are identified and reused.
|
|
63
|
+
* By default, the arguments array is used as the cache key.
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* // Will use the same instance when provided with `undefined`, `{ num: 0 }`, `{ bool: false }`, etc.
|
|
68
|
+
* createCache((filter?: { num?: number, bool?: boolean }) => fetchData(filter), {
|
|
69
|
+
* getCacheKey: (filter?) => ({
|
|
70
|
+
* num: filter?.num ?? 0,
|
|
71
|
+
* bool: filter?.bool ?? false,
|
|
72
|
+
* }),
|
|
73
|
+
* });
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
getCacheKey?: (...args: NoInfer<Args>) => unknown;
|
|
22
77
|
}
|
|
23
78
|
export declare class Cache<T> extends Store<Promise<T>> {
|
|
24
|
-
readonly options: CacheOptions<T>;
|
|
79
|
+
readonly options: CacheOptions<T, any>;
|
|
25
80
|
readonly derivedFromCache?: {
|
|
26
81
|
cache: Cache<any>;
|
|
27
82
|
selectors: (Selector<any, any> | AnyPath)[];
|
|
@@ -29,7 +84,7 @@ export declare class Cache<T> extends Store<Promise<T>> {
|
|
|
29
84
|
readonly state: Store<CacheState<T>>;
|
|
30
85
|
protected stalePromise?: Promise<T>;
|
|
31
86
|
protected invalidationTimer?: ReturnType<typeof setTimeout>;
|
|
32
|
-
constructor(getter: Calculate<Promise<T>>, options?: CacheOptions<T>, derivedFromCache?: {
|
|
87
|
+
constructor(getter: Calculate<Promise<T>>, options?: CacheOptions<T, any>, derivedFromCache?: {
|
|
33
88
|
cache: Cache<any>;
|
|
34
89
|
selectors: (Selector<any, any> | AnyPath)[];
|
|
35
90
|
} | undefined, _call?: (...args: any[]) => any);
|
|
@@ -45,15 +100,19 @@ export declare class Cache<T> extends Store<Promise<T>> {
|
|
|
45
100
|
protected watchFocus(): void;
|
|
46
101
|
}
|
|
47
102
|
export type CreateCacheResult<T, Args extends any[]> = [] extends Args ? CacheBundle<T, Args> & Cache<T> : CacheBundle<T, Args>;
|
|
103
|
+
export interface InvalidationOptions<T> {
|
|
104
|
+
filter?: (cache: Cache<T>) => boolean;
|
|
105
|
+
}
|
|
48
106
|
export type CacheBundle<T, Args extends any[]> = {
|
|
49
107
|
(...args: Args): Cache<T>;
|
|
50
108
|
mapCache<S>(selector: Selector<T, S>): CreateCacheResult<S, Args>;
|
|
51
109
|
mapValue<const P>(selector: Constrain<P, Path<T>>): CreateCacheResult<Value<T, P>, Args>;
|
|
52
|
-
invalidateAll: () => void;
|
|
53
|
-
clearAll: () => void;
|
|
110
|
+
invalidateAll: (options?: InvalidationOptions<T>) => void;
|
|
111
|
+
clearAll: (options?: InvalidationOptions<T>) => void;
|
|
112
|
+
getInstances: () => Cache<T>[];
|
|
54
113
|
};
|
|
55
|
-
declare function create<T, Args extends any[] = []>(cacheFunction: CacheFunction<T, Args>, options?: CacheOptions<T>): CreateCacheResult<T, Args>;
|
|
114
|
+
declare function create<T, Args extends any[] = []>(cacheFunction: CacheFunction<T, Args>, options?: CacheOptions<T, Args>): CreateCacheResult<T, Args>;
|
|
56
115
|
export declare const createCache: typeof create & {
|
|
57
|
-
defaultOptions: CacheOptions<any>;
|
|
116
|
+
defaultOptions: CacheOptions<any, any>;
|
|
58
117
|
};
|
|
59
118
|
export {};
|
|
@@ -6,6 +6,7 @@ export declare class InstanceCache<Args extends any[], T extends object> {
|
|
|
6
6
|
constructor(factory: (...args: Args) => T, cacheTime?: number | undefined);
|
|
7
7
|
cleanup(): void;
|
|
8
8
|
get(...args: Args): T;
|
|
9
|
+
getWithKey(args: Args, cacheKey: unknown): T;
|
|
9
10
|
values(): T[];
|
|
10
11
|
stop(): void;
|
|
11
12
|
stats(): {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cross-state",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.52.0",
|
|
4
4
|
"description": "(React) state library",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"repository": "schummar/cross-state",
|
|
@@ -208,7 +208,7 @@
|
|
|
208
208
|
"name": "core: InstanceCache",
|
|
209
209
|
"path": "dist/es/index.mjs",
|
|
210
210
|
"import": "{InstanceCache}",
|
|
211
|
-
"limit": "
|
|
211
|
+
"limit": "610 B"
|
|
212
212
|
},
|
|
213
213
|
{
|
|
214
214
|
"name": "core: calcDuration",
|