cross-state 0.48.1 → 0.49.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 +54 -45
- package/dist/cjs/scope.cjs.map +1 -1
- package/dist/es/scope.mjs +55 -46
- package/dist/es/scope.mjs.map +1 -1
- package/dist/types/core/cache.d.ts +3 -1
- package/package.json +1 -1
package/dist/cjs/scope.cjs
CHANGED
|
@@ -121,14 +121,14 @@ class Cache extends store.Store {
|
|
|
121
121
|
this.watchFocus();
|
|
122
122
|
}
|
|
123
123
|
get({ update = "whenStale", backgroundUpdate = false } = {}) {
|
|
124
|
+
this.calculatedValue?.check();
|
|
124
125
|
const promise = this.calculatedValue?.value;
|
|
125
126
|
const stalePromise = this.stalePromise;
|
|
126
127
|
if (update === "whenMissing" && !promise && !stalePromise || update === "whenStale" && !promise || update === "force") {
|
|
127
|
-
this.calculatedValue?.stop();
|
|
128
128
|
this.calculatedValue = store.calculatedValue(this, this.notify);
|
|
129
129
|
this.notify();
|
|
130
130
|
if (!promise && !stalePromise || !backgroundUpdate) {
|
|
131
|
-
return
|
|
131
|
+
return this.calculatedValue.value;
|
|
132
132
|
}
|
|
133
133
|
}
|
|
134
134
|
if (!promise || stalePromise && backgroundUpdate) {
|
|
@@ -171,22 +171,8 @@ class Cache extends store.Store {
|
|
|
171
171
|
delete this.stalePromise;
|
|
172
172
|
super.invalidate(recursive);
|
|
173
173
|
}
|
|
174
|
-
mapValue(
|
|
175
|
-
|
|
176
|
-
const derivedFromCache = {
|
|
177
|
-
cache: this.derivedFromCache ? this.derivedFromCache.cache : this,
|
|
178
|
-
selectors: this.derivedFromCache ? [...this.derivedFromCache.selectors, _selector] : [_selector]
|
|
179
|
-
};
|
|
180
|
-
return new Cache(
|
|
181
|
-
async ({ use }) => {
|
|
182
|
-
const value = await use(this);
|
|
183
|
-
return selector(value);
|
|
184
|
-
},
|
|
185
|
-
{
|
|
186
|
-
equals: this.options.equals
|
|
187
|
-
},
|
|
188
|
-
derivedFromCache
|
|
189
|
-
);
|
|
174
|
+
mapValue(selector) {
|
|
175
|
+
return mapValue(this, selector);
|
|
190
176
|
}
|
|
191
177
|
watchPromise() {
|
|
192
178
|
this.subscribe(
|
|
@@ -280,7 +266,28 @@ class Cache extends store.Store {
|
|
|
280
266
|
document.addEventListener("visibilitychange", onFocus);
|
|
281
267
|
}
|
|
282
268
|
}
|
|
269
|
+
function mapValue(cache, _selector, get) {
|
|
270
|
+
const selector = store.makeSelector(_selector);
|
|
271
|
+
const derivedFromCache = {
|
|
272
|
+
cache: cache.derivedFromCache ? cache.derivedFromCache.cache : cache,
|
|
273
|
+
selectors: cache.derivedFromCache ? [...cache.derivedFromCache.selectors, _selector] : [_selector]
|
|
274
|
+
};
|
|
275
|
+
return new Cache(
|
|
276
|
+
async ({ use }) => {
|
|
277
|
+
const value = await use(cache);
|
|
278
|
+
return selector(value);
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
equals: cache.options.equals
|
|
282
|
+
},
|
|
283
|
+
derivedFromCache,
|
|
284
|
+
get
|
|
285
|
+
);
|
|
286
|
+
}
|
|
283
287
|
function create(cacheFunction, options) {
|
|
288
|
+
return internalCreate(cacheFunction, options);
|
|
289
|
+
}
|
|
290
|
+
function internalCreate(source, options) {
|
|
284
291
|
options = { ...createCache.defaultOptions, ...options };
|
|
285
292
|
const { clearUnusedAfter, resourceGroup } = options ?? {};
|
|
286
293
|
let baseInstance;
|
|
@@ -289,18 +296,34 @@ function create(cacheFunction, options) {
|
|
|
289
296
|
if (args.length === 0 && baseInstance) {
|
|
290
297
|
return baseInstance;
|
|
291
298
|
}
|
|
292
|
-
|
|
293
|
-
const
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
+
if (Array.isArray(source)) {
|
|
300
|
+
const [cache, selector] = source;
|
|
301
|
+
return mapValue(cache(...args), selector, get);
|
|
302
|
+
}
|
|
303
|
+
return new Cache(
|
|
304
|
+
(helpers) => {
|
|
305
|
+
const result = source.apply(helpers, args);
|
|
306
|
+
if (result instanceof Function) {
|
|
307
|
+
return result(helpers);
|
|
308
|
+
}
|
|
309
|
+
return result;
|
|
310
|
+
},
|
|
311
|
+
options,
|
|
312
|
+
undefined,
|
|
313
|
+
args.length === 0 ? get : undefined
|
|
314
|
+
);
|
|
299
315
|
},
|
|
300
316
|
clearUnusedAfter ? store.calcDuration(clearUnusedAfter) : undefined
|
|
301
317
|
);
|
|
302
|
-
|
|
318
|
+
function get(...args) {
|
|
319
|
+
const sliceAfter = args.lastIndexOf(undefined);
|
|
320
|
+
if (sliceAfter !== -1) {
|
|
321
|
+
args = args.slice(0, sliceAfter);
|
|
322
|
+
}
|
|
303
323
|
return instanceCache.get(...args);
|
|
324
|
+
}
|
|
325
|
+
const mapCache = (selector) => {
|
|
326
|
+
return internalCreate([baseInstance, selector]);
|
|
304
327
|
};
|
|
305
328
|
const invalidateAll = () => {
|
|
306
329
|
for (const instance of instanceCache.values()) {
|
|
@@ -312,29 +335,15 @@ function create(cacheFunction, options) {
|
|
|
312
335
|
instance.clear();
|
|
313
336
|
}
|
|
314
337
|
};
|
|
315
|
-
baseInstance = Object.assign(
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
return result(helpers);
|
|
321
|
-
}
|
|
322
|
-
return result;
|
|
323
|
-
},
|
|
324
|
-
options,
|
|
325
|
-
undefined,
|
|
326
|
-
get
|
|
327
|
-
),
|
|
328
|
-
{
|
|
329
|
-
invalidateAll,
|
|
330
|
-
clearAll
|
|
331
|
-
}
|
|
332
|
-
);
|
|
338
|
+
baseInstance = Object.assign(get(...[]), {
|
|
339
|
+
mapCache,
|
|
340
|
+
invalidateAll,
|
|
341
|
+
clearAll
|
|
342
|
+
});
|
|
333
343
|
const groups = Array.isArray(resourceGroup) ? resourceGroup : resourceGroup ? [resourceGroup] : [];
|
|
334
344
|
for (const group of groups.concat(allResources)) {
|
|
335
345
|
group.add(baseInstance);
|
|
336
346
|
}
|
|
337
|
-
get(...[]);
|
|
338
347
|
return baseInstance;
|
|
339
348
|
}
|
|
340
349
|
const createCache = /* @__PURE__ */ Object.assign(create, {
|
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 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?.stop();\n this.calculatedValue = calculatedValue(this, this.notify);\n this.notify();\n\n if ((!promise && !stalePromise) || !backgroundUpdate) {\n return super.get();\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>(selector: Constrain<P, Path<T>>): Cache<Value<T, P>>;\n\n mapValue<S>(_selector: Selector<T, S> | AnyPath): Cache<S> {\n const selector = makeSelector(_selector);\n const derivedFromCache = {\n cache: this.derivedFromCache ? this.derivedFromCache.cache : this,\n selectors: this.derivedFromCache\n ? [...this.derivedFromCache.selectors, _selector]\n : [_selector],\n };\n\n return new Cache(\n async ({ use }) => {\n const value = await use(this);\n return selector(value);\n },\n {\n equals: this.options.equals,\n },\n derivedFromCache,\n );\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\ntype CreateReturnType<T, Args extends any[]> = {\n (...args: Args): Cache<T>;\n invalidateAll: () => void;\n clearAll: () => void;\n} & ([] extends Args ? Cache<T> : {});\n\nfunction create<T, Args extends any[] = []>(\n cacheFunction: CacheFunction<T, Args>,\n options?: CacheOptions<T>,\n): CreateReturnType<T, Args> {\n options = { ...createCache.defaultOptions, ...options };\n const { clearUnusedAfter, resourceGroup } = options ?? {};\n\n let baseInstance: CreateReturnType<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 return new Cache((helpers) => {\n const result = cacheFunction.apply(helpers, args);\n\n if (result instanceof Function) {\n return result(helpers);\n }\n\n return result;\n }, options);\n },\n clearUnusedAfter ? calcDuration(clearUnusedAfter) : undefined,\n );\n\n const get = (...args: Args) => {\n return instanceCache.get(...args);\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(\n new Cache(\n (helpers) => {\n const result = cacheFunction.apply(helpers);\n\n if (result instanceof Function) {\n return result(helpers);\n }\n\n return result;\n },\n options,\n undefined,\n get,\n ),\n {\n invalidateAll,\n clearAll,\n },\n ) as CreateReturnType<T, Args> & Cache<T>;\n\n const groups = Array.isArray(resourceGroup)\n ? resourceGroup\n : resourceGroup\n ? [resourceGroup]\n : [];\n for (const group of groups.concat(allResources)) {\n group.add(baseInstance);\n }\n\n get(...([] as any));\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","makeSelector","calcDuration","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 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\ntype CreateReturnType<T, Args extends any[]> = {\n (...args: Args): Cache<T>;\n mapCache<S>(selector: Selector<T, S>): CreateReturnType<S, Args>;\n mapValue<const P>(selector: Constrain<P, Path<T>>): CreateReturnType<Value<T, P>, Args>;\n invalidateAll: () => void;\n clearAll: () => void;\n} & ([] extends Args ? Cache<T> : {});\n\nfunction create<T, Args extends any[] = []>(\n cacheFunction: CacheFunction<T, Args>,\n options?: CacheOptions<T>,\n): CreateReturnType<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: CreateReturnType<any, Args>, selector: Selector<any, T> | AnyPath],\n options?: CacheOptions<T>,\n): CreateReturnType<T, Args> {\n options = { ...createCache.defaultOptions, ...options };\n const { clearUnusedAfter, resourceGroup } = options ?? {};\n\n let baseInstance: CreateReturnType<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 CreateReturnType<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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"}
|
package/dist/es/scope.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { f as autobind, S as Store, b as createStore, g as calculatedValue, P as PromiseWithState,
|
|
1
|
+
import { f as autobind, S as Store, b as createStore, g as calculatedValue, P as PromiseWithState, c as calcDuration, h as makeSelector } from './store.mjs';
|
|
2
2
|
import { d as deepEqual } from './propAccess.mjs';
|
|
3
3
|
import { s as simpleHash } from './hash.mjs';
|
|
4
4
|
|
|
@@ -119,14 +119,14 @@ class Cache extends Store {
|
|
|
119
119
|
this.watchFocus();
|
|
120
120
|
}
|
|
121
121
|
get({ update = "whenStale", backgroundUpdate = false } = {}) {
|
|
122
|
+
this.calculatedValue?.check();
|
|
122
123
|
const promise = this.calculatedValue?.value;
|
|
123
124
|
const stalePromise = this.stalePromise;
|
|
124
125
|
if (update === "whenMissing" && !promise && !stalePromise || update === "whenStale" && !promise || update === "force") {
|
|
125
|
-
this.calculatedValue?.stop();
|
|
126
126
|
this.calculatedValue = calculatedValue(this, this.notify);
|
|
127
127
|
this.notify();
|
|
128
128
|
if (!promise && !stalePromise || !backgroundUpdate) {
|
|
129
|
-
return
|
|
129
|
+
return this.calculatedValue.value;
|
|
130
130
|
}
|
|
131
131
|
}
|
|
132
132
|
if (!promise || stalePromise && backgroundUpdate) {
|
|
@@ -169,22 +169,8 @@ class Cache extends Store {
|
|
|
169
169
|
delete this.stalePromise;
|
|
170
170
|
super.invalidate(recursive);
|
|
171
171
|
}
|
|
172
|
-
mapValue(
|
|
173
|
-
|
|
174
|
-
const derivedFromCache = {
|
|
175
|
-
cache: this.derivedFromCache ? this.derivedFromCache.cache : this,
|
|
176
|
-
selectors: this.derivedFromCache ? [...this.derivedFromCache.selectors, _selector] : [_selector]
|
|
177
|
-
};
|
|
178
|
-
return new Cache(
|
|
179
|
-
async ({ use }) => {
|
|
180
|
-
const value = await use(this);
|
|
181
|
-
return selector(value);
|
|
182
|
-
},
|
|
183
|
-
{
|
|
184
|
-
equals: this.options.equals
|
|
185
|
-
},
|
|
186
|
-
derivedFromCache
|
|
187
|
-
);
|
|
172
|
+
mapValue(selector) {
|
|
173
|
+
return mapValue(this, selector);
|
|
188
174
|
}
|
|
189
175
|
watchPromise() {
|
|
190
176
|
this.subscribe(
|
|
@@ -278,7 +264,28 @@ class Cache extends Store {
|
|
|
278
264
|
document.addEventListener("visibilitychange", onFocus);
|
|
279
265
|
}
|
|
280
266
|
}
|
|
267
|
+
function mapValue(cache, _selector, get) {
|
|
268
|
+
const selector = makeSelector(_selector);
|
|
269
|
+
const derivedFromCache = {
|
|
270
|
+
cache: cache.derivedFromCache ? cache.derivedFromCache.cache : cache,
|
|
271
|
+
selectors: cache.derivedFromCache ? [...cache.derivedFromCache.selectors, _selector] : [_selector]
|
|
272
|
+
};
|
|
273
|
+
return new Cache(
|
|
274
|
+
async ({ use }) => {
|
|
275
|
+
const value = await use(cache);
|
|
276
|
+
return selector(value);
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
equals: cache.options.equals
|
|
280
|
+
},
|
|
281
|
+
derivedFromCache,
|
|
282
|
+
get
|
|
283
|
+
);
|
|
284
|
+
}
|
|
281
285
|
function create(cacheFunction, options) {
|
|
286
|
+
return internalCreate(cacheFunction, options);
|
|
287
|
+
}
|
|
288
|
+
function internalCreate(source, options) {
|
|
282
289
|
options = { ...createCache.defaultOptions, ...options };
|
|
283
290
|
const { clearUnusedAfter, resourceGroup } = options ?? {};
|
|
284
291
|
let baseInstance;
|
|
@@ -287,18 +294,34 @@ function create(cacheFunction, options) {
|
|
|
287
294
|
if (args.length === 0 && baseInstance) {
|
|
288
295
|
return baseInstance;
|
|
289
296
|
}
|
|
290
|
-
|
|
291
|
-
const
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
+
if (Array.isArray(source)) {
|
|
298
|
+
const [cache, selector] = source;
|
|
299
|
+
return mapValue(cache(...args), selector, get);
|
|
300
|
+
}
|
|
301
|
+
return new Cache(
|
|
302
|
+
(helpers) => {
|
|
303
|
+
const result = source.apply(helpers, args);
|
|
304
|
+
if (result instanceof Function) {
|
|
305
|
+
return result(helpers);
|
|
306
|
+
}
|
|
307
|
+
return result;
|
|
308
|
+
},
|
|
309
|
+
options,
|
|
310
|
+
undefined,
|
|
311
|
+
args.length === 0 ? get : undefined
|
|
312
|
+
);
|
|
297
313
|
},
|
|
298
314
|
clearUnusedAfter ? calcDuration(clearUnusedAfter) : undefined
|
|
299
315
|
);
|
|
300
|
-
|
|
316
|
+
function get(...args) {
|
|
317
|
+
const sliceAfter = args.lastIndexOf(undefined);
|
|
318
|
+
if (sliceAfter !== -1) {
|
|
319
|
+
args = args.slice(0, sliceAfter);
|
|
320
|
+
}
|
|
301
321
|
return instanceCache.get(...args);
|
|
322
|
+
}
|
|
323
|
+
const mapCache = (selector) => {
|
|
324
|
+
return internalCreate([baseInstance, selector]);
|
|
302
325
|
};
|
|
303
326
|
const invalidateAll = () => {
|
|
304
327
|
for (const instance of instanceCache.values()) {
|
|
@@ -310,29 +333,15 @@ function create(cacheFunction, options) {
|
|
|
310
333
|
instance.clear();
|
|
311
334
|
}
|
|
312
335
|
};
|
|
313
|
-
baseInstance = Object.assign(
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
return result(helpers);
|
|
319
|
-
}
|
|
320
|
-
return result;
|
|
321
|
-
},
|
|
322
|
-
options,
|
|
323
|
-
undefined,
|
|
324
|
-
get
|
|
325
|
-
),
|
|
326
|
-
{
|
|
327
|
-
invalidateAll,
|
|
328
|
-
clearAll
|
|
329
|
-
}
|
|
330
|
-
);
|
|
336
|
+
baseInstance = Object.assign(get(...[]), {
|
|
337
|
+
mapCache,
|
|
338
|
+
invalidateAll,
|
|
339
|
+
clearAll
|
|
340
|
+
});
|
|
331
341
|
const groups = Array.isArray(resourceGroup) ? resourceGroup : resourceGroup ? [resourceGroup] : [];
|
|
332
342
|
for (const group of groups.concat(allResources)) {
|
|
333
343
|
group.add(baseInstance);
|
|
334
344
|
}
|
|
335
|
-
get(...[]);
|
|
336
345
|
return baseInstance;
|
|
337
346
|
}
|
|
338
347
|
const createCache = /* @__PURE__ */ Object.assign(create, {
|
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 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?.stop();\n this.calculatedValue = calculatedValue(this, this.notify);\n this.notify();\n\n if ((!promise && !stalePromise) || !backgroundUpdate) {\n return super.get();\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>(selector: Constrain<P, Path<T>>): Cache<Value<T, P>>;\n\n mapValue<S>(_selector: Selector<T, S> | AnyPath): Cache<S> {\n const selector = makeSelector(_selector);\n const derivedFromCache = {\n cache: this.derivedFromCache ? this.derivedFromCache.cache : this,\n selectors: this.derivedFromCache\n ? [...this.derivedFromCache.selectors, _selector]\n : [_selector],\n };\n\n return new Cache(\n async ({ use }) => {\n const value = await use(this);\n return selector(value);\n },\n {\n equals: this.options.equals,\n },\n derivedFromCache,\n );\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\ntype CreateReturnType<T, Args extends any[]> = {\n (...args: Args): Cache<T>;\n invalidateAll: () => void;\n clearAll: () => void;\n} & ([] extends Args ? Cache<T> : {});\n\nfunction create<T, Args extends any[] = []>(\n cacheFunction: CacheFunction<T, Args>,\n options?: CacheOptions<T>,\n): CreateReturnType<T, Args> {\n options = { ...createCache.defaultOptions, ...options };\n const { clearUnusedAfter, resourceGroup } = options ?? {};\n\n let baseInstance: CreateReturnType<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 return new Cache((helpers) => {\n const result = cacheFunction.apply(helpers, args);\n\n if (result instanceof Function) {\n return result(helpers);\n }\n\n return result;\n }, options);\n },\n clearUnusedAfter ? calcDuration(clearUnusedAfter) : undefined,\n );\n\n const get = (...args: Args) => {\n return instanceCache.get(...args);\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(\n new Cache(\n (helpers) => {\n const result = cacheFunction.apply(helpers);\n\n if (result instanceof Function) {\n return result(helpers);\n }\n\n return result;\n },\n options,\n undefined,\n get,\n ),\n {\n invalidateAll,\n clearAll,\n },\n ) as CreateReturnType<T, Args> & Cache<T>;\n\n const groups = Array.isArray(resourceGroup)\n ? resourceGroup\n : resourceGroup\n ? [resourceGroup]\n : [];\n for (const group of groups.concat(allResources)) {\n group.add(baseInstance);\n }\n\n get(...([] as any));\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 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\ntype CreateReturnType<T, Args extends any[]> = {\n (...args: Args): Cache<T>;\n mapCache<S>(selector: Selector<T, S>): CreateReturnType<S, Args>;\n mapValue<const P>(selector: Constrain<P, Path<T>>): CreateReturnType<Value<T, P>, Args>;\n invalidateAll: () => void;\n clearAll: () => void;\n} & ([] extends Args ? Cache<T> : {});\n\nfunction create<T, Args extends any[] = []>(\n cacheFunction: CacheFunction<T, Args>,\n options?: CacheOptions<T>,\n): CreateReturnType<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: CreateReturnType<any, Args>, selector: Selector<any, T> | AnyPath],\n options?: CacheOptions<T>,\n): CreateReturnType<T, Args> {\n options = { ...createCache.defaultOptions, ...options };\n const { clearUnusedAfter, resourceGroup } = options ?? {};\n\n let baseInstance: CreateReturnType<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 CreateReturnType<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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"}
|
|
@@ -39,13 +39,15 @@ export declare class Cache<T> extends Store<Promise<T>> {
|
|
|
39
39
|
invalidate(recursive?: boolean): void;
|
|
40
40
|
clear(recursive?: boolean): void;
|
|
41
41
|
mapValue<S>(selector: Selector<T, S>): Cache<S>;
|
|
42
|
-
mapValue<const P>(selector:
|
|
42
|
+
mapValue<const P extends AnyPath>(selector: P extends Path<T> ? P : Path<T>): Cache<Value<T, P>>;
|
|
43
43
|
protected watchPromise(): void;
|
|
44
44
|
protected setTimers(): void;
|
|
45
45
|
protected watchFocus(): void;
|
|
46
46
|
}
|
|
47
47
|
type CreateReturnType<T, Args extends any[]> = {
|
|
48
48
|
(...args: Args): Cache<T>;
|
|
49
|
+
mapCache<S>(selector: Selector<T, S>): CreateReturnType<S, Args>;
|
|
50
|
+
mapValue<const P>(selector: Constrain<P, Path<T>>): CreateReturnType<Value<T, P>, Args>;
|
|
49
51
|
invalidateAll: () => void;
|
|
50
52
|
clearAll: () => void;
|
|
51
53
|
} & ([] extends Args ? Cache<T> : {});
|