{"version":3,"file":"basic.cjs","sources":["../../../../../src/mods/storages/idb/basic.ts"],"sourcesContent":["import { Err, Ok } from \"@hazae41/result\";\nimport { SyncIdentity } from \"mods/serializers/serializer.js\";\nimport { useEffect, useRef } from \"react\";\nimport { StorageCreationError } from \"../errors.js\";\nexport function useIDBStorage(params) {\n    const storage = useRef();\n    if (storage.current == null)\n        storage.current = IDBStorage.tryCreate(params).ignore();\n    useEffect(() => () => {\n        if (!storage.current?.isOk())\n            return;\n        storage.current?.inner.unmount().catch(console.error);\n    }, []);\n    return storage.current;\n}\nexport class IDBStorage {\n    name;\n    keySerializer;\n    valueSerializer;\n    async = true;\n    #database;\n    #onunload;\n    #storageKeys = new Map();\n    constructor(name = \"xswr\", keySerializer = SyncIdentity, valueSerializer = SyncIdentity) {\n        this.name = name;\n        this.keySerializer = keySerializer;\n        this.valueSerializer = valueSerializer;\n        this.#database = this.#load();\n        this.#onunload = () => this.#unload();\n        addEventListener(\"beforeunload\", this.#onunload);\n    }\n    static tryCreate(params = {}) {\n        const { name, keySerializer, valueSerializer } = params;\n        if (typeof indexedDB === \"undefined\")\n            return new Err(new StorageCreationError());\n        return new Ok(new IDBStorage(name, keySerializer, valueSerializer));\n    }\n    /**\n     * Load the database and the garbage collector keys\n     * @returns\n     */\n    async #load() {\n        const database = await new Promise((ok, err) => {\n            const req = indexedDB.open(this.name, 1);\n            req.onupgradeneeded = () => req.result.createObjectStore(\"keyval\", {});\n            req.onblocked = () => err(\"blocked\");\n            req.onsuccess = () => ok(req.result);\n            req.onerror = () => err(req.error);\n        });\n        await this.#transact(database, async (store) => {\n            const keys = await this.#get(store, \"__keys\");\n            if (keys == null)\n                return;\n            this.#storageKeys = new Map(keys);\n            await this.#delete(store, \"__keys\").catch(console.error);\n            await this.#collect(store).catch(console.error);\n        }, \"readwrite\");\n        return database;\n    }\n    async unmount() {\n        removeEventListener(\"beforeunload\", this.#onunload);\n        await this.collect();\n    }\n    /**\n     * Save the garbage collector keys\n     */\n    async #unload() {\n        await this.#transact(await this.#database, async (store) => {\n            await this.#set(store, \"__keys\", [...this.#storageKeys]);\n        }, \"readwrite\");\n    }\n    async #collect(store) {\n        for (const [key, expiration] of this.#storageKeys) {\n            if (expiration > Date.now())\n                continue;\n            this.#storageKeys.delete(key);\n            await this.#delete(store, key);\n        }\n    }\n    async collect() {\n        await this.#transact(await this.#database, async (store) => {\n            return await this.#collect(store);\n        }, \"readwrite\");\n    }\n    async #transact(database, callback, mode) {\n        const transaction = database.transaction(\"keyval\", mode);\n        const store = transaction.objectStore(\"keyval\");\n        try {\n            const result = await callback(store);\n            transaction.commit();\n            return result;\n        }\n        catch (e) {\n            transaction.abort();\n            throw e;\n        }\n    }\n    #get(store, key) {\n        return new Promise((ok, err) => {\n            const req = store.get(key);\n            req.onerror = () => err(req.error);\n            req.onsuccess = () => ok(req.result);\n        });\n    }\n    async get(cacheKey) {\n        const key = await this.keySerializer.stringify(cacheKey);\n        const value = await this.#transact(await this.#database, async (store) => {\n            return await this.#get(store, key);\n        }, \"readonly\");\n        if (value == null)\n            return undefined;\n        const state = await this.valueSerializer.parse(value);\n        if (state.expiration != null)\n            this.#storageKeys.set(key, state.expiration);\n        return state;\n    }\n    #set(store, key, value) {\n        return new Promise((ok, err) => {\n            const req = store.put(value, key);\n            req.onerror = () => err(req.error);\n            req.onsuccess = () => ok();\n        });\n    }\n    async set(cacheKey, state) {\n        if (state == null)\n            return await this.delete(cacheKey);\n        const storageKey = await this.keySerializer.stringify(cacheKey);\n        const storageValue = await this.valueSerializer.stringify(state);\n        if (state.expiration != null)\n            this.#storageKeys.set(storageKey, state.expiration);\n        return await this.#transact(await this.#database, async (store) => {\n            return await this.#set(store, storageKey, storageValue);\n        }, \"readwrite\");\n    }\n    #delete(store, storageKey) {\n        return new Promise((ok, err) => {\n            const req = store.delete(storageKey);\n            req.onerror = () => err(req.error);\n            req.onsuccess = () => ok();\n        });\n    }\n    async delete(cacheKey) {\n        const storageKey = await this.keySerializer.stringify(cacheKey);\n        this.#storageKeys.delete(storageKey);\n        await this.#transact(await this.#database, async (store) => {\n            await this.#delete(store, storageKey);\n        }, \"readwrite\");\n    }\n}\n//# sourceMappingURL=basic.js.map"],"names":["useRef","useEffect","SyncIdentity","Err","StorageCreationError","Ok"],"mappings":"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"}