UNPKG

@hazae41/glacier

Version:

Yet another React data (re)fetching library

1 lines 33.5 kB
{"version":3,"file":"core.mjs","sources":["../../../../../src/mods/core/core.ts"],"sourcesContent":["import { Mutex } from \"@hazae41/mutex\"\nimport { Nullable, Option, Some } from \"@hazae41/option\"\nimport { SuperEventTarget } from \"@hazae41/plume\"\nimport { Result } from \"@hazae41/result\"\nimport { equals } from \"libs/equals/index.js\"\nimport { Time } from \"libs/time/time.js\"\nimport { Data, DataInit } from \"mods/fetched/data.js\"\nimport { Fail, FailInit } from \"mods/fetched/fail.js\"\nimport { Fetched, FetchedInit } from \"mods/fetched/fetched.js\"\nimport { Mutator, Setter } from \"mods/types/mutator.js\"\nimport { QuerySettings } from \"mods/types/settings.js\"\nimport { DataState, FailState, FakeState, RawState, RealState, State } from \"mods/types/state.js\"\n\nexport class AsyncStorageError extends Error {\n readonly #class = AsyncStorageError\n readonly name = this.#class.name\n\n constructor() {\n super(`Storage is asynchronous`)\n }\n\n}\n\nexport class TimeoutError extends Error {\n readonly #class = TimeoutError\n readonly name = this.#class.name\n\n constructor() {\n super(`Timed out`)\n }\n\n}\n\nexport class CooldownError extends Error {\n readonly #class = CooldownError\n readonly name = this.#class.name\n\n constructor() {\n super(`Cooled down`)\n }\n\n}\n\nexport class MissingKeyError extends Error {\n readonly #class = MissingKeyError\n readonly name = this.#class.name\n\n constructor() {\n super(`Missing a key`)\n }\n\n}\n\nexport class MissingFetcherError extends Error {\n readonly #class = MissingFetcherError\n readonly name = this.#class.name\n\n constructor() {\n super(`Missing a fetcher`)\n }\n\n}\n\nexport class Core {\n\n readonly onState = new SuperEventTarget<{\n \"*\": (cacheKey: string) => void\n [cacheKey: string]: (cacheKey: string) => void\n }>()\n\n readonly onAborter = new SuperEventTarget<{\n \"*\": (cacheKey: string) => void\n [cacheKey: string]: (cacheKey: string) => void\n }>()\n\n readonly mutexes = new Map<string, Mutex<void>>()\n\n readonly unstoreds = new Map<string, State<any, any>>()\n readonly storeds = new Map<string, RawState<any, any>>()\n\n readonly promises = new Map<string, Promise<unknown>>()\n readonly aborters = new Map<string, AbortController>()\n readonly timeouts = new Map<string, NodeJS.Timeout>()\n readonly counters = new Map<string, number>()\n\n readonly optimizers = new Map<string, Map<string, Mutator<any, any>>>()\n\n #mounted = true\n\n constructor() {\n new FinalizationRegistry(() => {\n this.clean()\n }).register(this, undefined)\n }\n\n clean() {\n for (const timeout of this.timeouts.values())\n clearTimeout(timeout)\n this.#mounted = false\n }\n\n getAborterSync(cacheKey: string): Nullable<AbortController> {\n return this.aborters.get(cacheKey)\n }\n\n getStateSync<D, F>(cacheKey: string): Nullable<State<D, F>> {\n return this.unstoreds.get(cacheKey)\n }\n\n getOrCreateMutex(cacheKey: string) {\n let mutex = this.mutexes.get(cacheKey)\n\n if (mutex != null)\n return mutex\n\n mutex = new Mutex(undefined)\n this.mutexes.set(cacheKey, mutex)\n return mutex\n }\n\n async runOrReplace<T>(cacheKey: string, aborter: AbortController, callback: () => Promise<T>): Promise<T> {\n const previous = this.promises.get(cacheKey)\n\n if (previous != null)\n this.aborters.get(cacheKey)!.abort()\n\n try {\n const promise = callback()\n\n this.promises.set(cacheKey, promise)\n this.aborters.set(cacheKey, aborter)\n\n await this.onAborter.emit(\"*\", cacheKey)\n await this.onAborter.emit(cacheKey, cacheKey)\n\n return await promise\n } finally {\n /**\n * Avoid cleaning if it has been replaced\n */\n if (this.aborters.get(cacheKey) === aborter) {\n this.aborters.delete(cacheKey)\n this.promises.delete(cacheKey)\n\n await this.onAborter.emit(\"*\", cacheKey)\n await this.onAborter.emit(cacheKey, cacheKey)\n }\n }\n }\n\n async runOrJoin<T>(cacheKey: string, aborter: AbortController, callback: () => Promise<T>): Promise<T> {\n const previous = this.promises.get(cacheKey)\n\n if (previous != null)\n return await previous as T\n\n try {\n const promise = callback()\n\n this.promises.set(cacheKey, promise)\n this.aborters.set(cacheKey, aborter)\n\n await this.onAborter.emit(\"*\", cacheKey)\n await this.onAborter.emit(cacheKey, cacheKey)\n\n return await promise\n } finally {\n /**\n * Avoid cleaning if it has been replaced\n */\n if (this.aborters.get(cacheKey) === aborter) {\n this.aborters.delete(cacheKey)\n this.promises.delete(cacheKey)\n\n await this.onAborter.emit(\"*\", cacheKey)\n await this.onAborter.emit(cacheKey, cacheKey)\n }\n }\n }\n\n async #getOrThrow<K, D, F>(cacheKey: string, settings: QuerySettings<K, D, F>): Promise<State<D, F>> {\n if (this.unstoreds.has(cacheKey))\n return this.unstoreds.get(cacheKey)!\n\n if (this.storeds.has(cacheKey)) {\n const stored = this.storeds.get(cacheKey)\n const unstored = await this.unstoreOrThrow(stored, settings)\n\n this.unstoreds.set(cacheKey, unstored)\n\n await this.onState.emit(\"*\", cacheKey)\n await this.onState.emit(cacheKey, cacheKey)\n\n return unstored\n }\n\n const stored = await Result.runAndWrap(async () => {\n return settings.storage?.getOrThrow?.(cacheKey)\n }).then(r => r?.getOrNull())\n\n const unstored = await this.unstoreOrThrow(stored, settings)\n\n this.storeds.set(cacheKey, stored)\n this.unstoreds.set(cacheKey, unstored)\n\n await this.onState.emit(\"*\", cacheKey)\n await this.onState.emit(cacheKey, cacheKey)\n\n return unstored\n }\n\n async getOrThrow<K, D, F>(cacheKey: string, settings: QuerySettings<K, D, F>): Promise<State<D, F>> {\n return await this.getOrCreateMutex(cacheKey).runOrWait(() => this.#getOrThrow(cacheKey, settings))\n }\n\n async tryGet<K, D, F>(cacheKey: string, settings: QuerySettings<K, D, F>): Promise<Result<State<D, F>, Error>> {\n return await Result.runAndDoubleWrap(() => this.getOrThrow(cacheKey, settings))\n }\n\n async storeOrThrow<K, D, F>(state: State<D, F>, settings: QuerySettings<K, D, F>): Promise<RawState> {\n const { key } = settings\n\n if (state.real == null)\n return undefined\n\n const { time, cooldown, expiration } = state.real.current\n\n const data = state.real.data\n const error = state.real.error\n\n return { key, version: 3, data, error, time, cooldown, expiration }\n }\n\n async unstoreOrThrow<K, D, F>(stored: RawState, settings: QuerySettings<K, D, F>): Promise<State<D, F>> {\n if (stored == null)\n return new RealState<D, F>(undefined)\n\n if (stored.version == null) {\n const { time, cooldown, expiration } = stored\n const times = { time, cooldown, expiration }\n\n const data = Option.wrap(stored.data).mapSync(x => new Data(x as D, times))\n const error = Option.wrap(stored.error).mapSync(x => new Fail(x as F, times))\n\n if (error.isSome())\n return new RealState(new FailState<D, F>(error.get(), data.getOrNull()))\n\n if (data.isSome())\n return new RealState(new DataState<D, F>(data.get()))\n\n return new RealState<D, F>(undefined)\n }\n\n if (stored.version === 2 || stored.version === 3) {\n const data = Option.wrap(stored.data).mapSync(x => Data.from(x as DataInit<D>))\n const error = Option.wrap(stored.error).mapSync(x => Fail.from(x as FailInit<F>))\n\n if (error.isSome())\n return new RealState(new FailState<D, F>(error.get(), data.getOrNull()))\n\n if (data.isSome())\n return new RealState(new DataState<D, F>(data.get()))\n\n return new RealState<D, F>(undefined)\n }\n\n return new RealState<D, F>(undefined)\n }\n\n /**\n * Set full state and store it in storage\n * @param cacheKey \n * @param setter \n * @param settings \n * @returns \n */\n async setOrThrow<K, D, F>(cacheKey: string, setter: Setter<D, F>, settings: QuerySettings<K, D, F>): Promise<State<D, F>> {\n return await this.getOrCreateMutex(cacheKey).runOrWait(async () => {\n const previous = await this.#getOrThrow(cacheKey, settings)\n const current = await Promise.resolve(setter(previous))\n\n if (current === previous)\n return previous\n\n const stored = await this.storeOrThrow(current, settings)\n\n this.storeds.set(cacheKey, stored)\n this.unstoreds.set(cacheKey, current)\n\n await this.onState.emit(\"*\", cacheKey)\n await this.onState.emit(cacheKey, cacheKey)\n\n await Promise.resolve(settings.storage?.setOrThrow?.(cacheKey, stored))\n\n await settings.indexer?.({ current, previous })\n\n return current\n })\n }\n\n async trySet<K, D, F>(cacheKey: string, setter: Setter<D, F>, settings: QuerySettings<K, D, F>): Promise<Result<State<D, F>, Error>> {\n return await Result.runAndDoubleWrap(() => this.setOrThrow(cacheKey, setter, settings))\n }\n\n #mergeRealStateWithFetched<D, F>(previous: State<D, F>, fetched: Nullable<Fetched<D, F>>): RealState<D, F> {\n if (fetched == null)\n return new RealState(undefined)\n\n if (fetched.isData())\n return new RealState(new DataState(fetched))\n\n return new RealState(new FailState(fetched, previous.real?.data))\n }\n\n #mergeFakeStateWithFetched<D, F>(previous: State<D, F>, fetched: Nullable<Fetched<D, F>>): FakeState<D, F> {\n if (fetched == null)\n return new FakeState(undefined, previous.real)\n\n if (fetched.isData())\n return new FakeState(new DataState(fetched), previous.real)\n\n return new FakeState(new FailState(fetched, previous.data), previous.real)\n }\n\n /**\n * Set real state, compare times, compare data/error, and then reoptimize\n * @param cacheKey \n * @param setter \n * @param settings \n * @returns \n */\n async updateOrThrow<K, D, F>(cacheKey: string, setter: Setter<D, F>, settings: QuerySettings<K, D, F>): Promise<State<D, F>> {\n return await this.setOrThrow(cacheKey, async (previous) => {\n const updated = await Promise.resolve(setter(previous))\n\n if (updated === previous)\n return previous\n\n let next = new RealState(updated.real)\n\n if (next.real && previous.real && Time.isBefore(next.real?.current.time, previous.real.current.time))\n return previous\n\n const normalized = await this.#normalizeOrThrow(next.real?.current, settings)\n next = this.#mergeRealStateWithFetched(next, normalized)\n\n if (next.real?.current.isData() && previous.real?.current.isData() && equals(next.real.current.get(), previous.real.current.get()))\n next = new RealState(new DataState(new Data(previous.real.current.get(), next.real.current)))\n\n if (next.real?.current.isFail() && previous.real?.current.isFail() && equals(next.real.current.getErr(), previous.real.current.getErr()))\n next = new RealState(new FailState(new Fail(previous.real.current.getErr(), next.real.current), previous.real.data))\n\n return await this.#reoptimizeOrThrow(cacheKey, next)\n }, settings)\n }\n\n /**\n * Merge real state with returned Some(fetched), if None do nothing\n * @param cacheKey \n * @param previous \n * @param fetched \n * @param settings \n * @returns \n */\n async mutateOrThrow<K, D, F>(cacheKey: string, mutator: Mutator<D, F>, settings: QuerySettings<K, D, F>) {\n return await this.updateOrThrow(cacheKey, async (previous) => {\n const mutate = await Promise.resolve(mutator(previous))\n\n if (mutate.isNone())\n return previous\n\n const init = mutate.get()\n\n if (init == null)\n return this.#mergeRealStateWithFetched(previous, undefined)\n\n const fetched = Fetched.from(init)\n\n return this.#mergeRealStateWithFetched(previous, fetched)\n }, settings)\n }\n\n /**\n * Merge real state with given fetched\n * @param cacheKey \n * @param fetched \n * @param settings \n * @returns \n */\n async replaceOrThrow<K, D, F>(cacheKey: string, fetched: Nullable<FetchedInit<D, F>>, settings: QuerySettings<K, D, F>) {\n return await this.mutateOrThrow(cacheKey, () => new Some(fetched), settings)\n }\n\n /**\n * Set real state to undefined\n * @param cacheKey \n * @param settings \n * @returns \n */\n async deleteOrThrow<K, D, F>(cacheKey: string, settings: QuerySettings<K, D, F>) {\n return await this.replaceOrThrow(cacheKey, undefined, settings)\n }\n\n /**\n * Erase and reapply all optimizations\n * @param state \n * @param optimizers \n * @returns \n */\n async #reoptimizeOrThrow<D, F>(cacheKey: string, state: State<D, F>): Promise<State<D, F>> {\n let reoptimized: State<D, F> = new RealState(state.real)\n\n const optimizers = this.optimizers.get(cacheKey)\n\n if (optimizers == null)\n return reoptimized\n\n for (const optimizer of optimizers.values()) {\n const optimized = await optimizer(reoptimized)\n\n if (optimized.isNone())\n continue\n\n const fetched = Option.wrap(optimized.get()).mapSync(Fetched.from).getOrNull()\n\n reoptimized = this.#mergeFakeStateWithFetched(reoptimized, fetched)\n }\n\n return reoptimized\n }\n\n async reoptimizeOrThrow<K, D, F>(cacheKey: string, settings: QuerySettings<K, D, F>) {\n return await this.setOrThrow(cacheKey, async (previous) => {\n return await this.#reoptimizeOrThrow(cacheKey, previous)\n }, settings)\n }\n\n async optimizeOrThrow<K, D, F>(cacheKey: string, uuid: string, optimizer: Mutator<D, F>, settings: QuerySettings<K, D, F>) {\n return await this.setOrThrow(cacheKey, async (previous) => {\n let optimizers = this.optimizers.get(cacheKey)\n\n if (optimizers == null) {\n optimizers = new Map()\n this.optimizers.set(cacheKey, optimizers)\n }\n\n if (optimizers.has(uuid)) {\n optimizers.delete(uuid)\n previous = await this.#reoptimizeOrThrow(cacheKey, previous)\n }\n\n optimizers.set(uuid, optimizer)\n\n const optimized = await Promise.resolve(optimizer(previous))\n\n if (optimized.isNone())\n return previous\n\n const fetched = Option.wrap(optimized.get()).mapSync(Fetched.from).getOrNull()\n\n return this.#mergeFakeStateWithFetched(previous, fetched)\n }, settings)\n }\n\n async deoptimize(cacheKey: string, uuid: string) {\n const optimizers = this.optimizers.get(cacheKey)\n\n if (optimizers == null)\n return\n optimizers.delete(uuid)\n }\n\n /**\n * Transform children into refs and normalize them\n * @param data \n * @param settings \n * @returns \n */\n async #normalizeOrThrow<K, D, F>(fetched: Nullable<Fetched<D, F>>, settings: QuerySettings<K, D, F>): Promise<Nullable<Fetched<D, F>>> {\n if (settings.normalizer == null)\n return fetched\n return await settings.normalizer(fetched, { shallow: false })\n }\n\n /**\n * Transform children into refs but do not normalize them\n * @param data \n * @param settings \n * @returns \n */\n async prenormalizeOrThrow<K, D, F>(fetched: Nullable<Fetched<D, F>>, settings: QuerySettings<K, D, F>): Promise<Nullable<Fetched<D, F>>> {\n if (settings.normalizer == null)\n return fetched\n return await settings.normalizer(fetched, { shallow: true })\n }\n\n /**\n * Assume cacheKey changed and reindex it\n * @param cacheKey \n * @param settings \n */\n async reindexOrThrow<K, D, F>(cacheKey: string, settings: QuerySettings<K, D, F>): Promise<void> {\n const current = await this.getOrThrow(cacheKey, settings)\n await settings.indexer?.({ current })\n }\n\n async increment<K, D, F>(cacheKey: string, settings: QuerySettings<K, D, F>): Promise<void> {\n const counter = this.counters.get(cacheKey)\n const timeout = this.timeouts.get(cacheKey)\n\n this.counters.set(cacheKey, (counter || 0) + 1)\n\n if (timeout != null) {\n clearTimeout(timeout)\n this.timeouts.delete(cacheKey)\n }\n\n return\n }\n\n async decrementOrThrow<K, D, F>(cacheKey: string, settings: QuerySettings<K, D, F>) {\n const counter = this.counters.get(cacheKey)\n\n /**\n * Already deleted\n */\n if (counter == null)\n return\n\n /**\n * Not deletable\n */\n if (counter > 1) {\n this.counters.set(cacheKey, counter - 1)\n return\n }\n\n /**\n * Counter can't go under 1\n */\n this.counters.delete(cacheKey)\n\n const state = await this.getOrThrow(cacheKey, settings)\n const expiration = state.real?.current.expiration\n\n if (expiration == null)\n return\n\n if (Date.now() > expiration) {\n await this.deleteOrThrow(cacheKey, settings)\n return\n }\n\n const deleteOrThrow = async () => {\n /**\n * This should not happen but check anyway\n */\n if (!this.#mounted)\n return\n\n const counter = this.counters.get(cacheKey)\n\n /**\n * No longer deletable\n */\n if (counter != null)\n return\n\n await this.deleteOrThrow(cacheKey, settings)\n }\n\n const onTimeout = () => {\n deleteOrThrow().catch(console.warn)\n }\n\n const delay = expiration - Date.now()\n\n if (delay > (2 ** 31))\n return\n\n const timeout = setTimeout(onTimeout, delay)\n this.timeouts.set(cacheKey, timeout)\n }\n}\n\nexport const core = new Core()"],"names":[],"mappings":"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"}