{"version":3,"file":"createQueuedStorage.mjs","sources":["../../../../src/utils/queuedStorage/createQueuedStorage.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { DATABASE_NAME, STORE_NAME } from './constants';\nimport { getAddItemBytesSize } from './getAddItemBytesSize';\nexport const createQueuedStorage = () => {\n    let currentBytesSize = 0;\n    let error;\n    const openDBPromise = new Promise((resolve, reject) => {\n        const { indexedDB } = window;\n        const openRequest = indexedDB.open(DATABASE_NAME, 1);\n        openRequest.onupgradeneeded = () => {\n            const db = openRequest.result;\n            if (!db.objectStoreNames.contains(STORE_NAME)) {\n                db.createObjectStore(STORE_NAME, {\n                    keyPath: 'id',\n                    autoIncrement: true,\n                });\n            }\n        };\n        openRequest.onsuccess = async () => {\n            const db = openRequest.result;\n            const transaction = db.transaction(STORE_NAME, 'readonly');\n            const request = transaction.objectStore(STORE_NAME).getAll();\n            await promisifyIDBRequest(request);\n            for (const item of request.result) {\n                currentBytesSize += item.bytesSize;\n            }\n            resolve(openRequest.result);\n        };\n        openRequest.onerror = () => {\n            reject(openRequest.error);\n        };\n    }).catch(err => {\n        error = err;\n        return undefined;\n    });\n    const getDB = async () => {\n        const db = await openDBPromise;\n        if (!db) {\n            throw error;\n        }\n        return db;\n    };\n    const getStore = async () => {\n        const db = await getDB();\n        const transaction = db.transaction(STORE_NAME, 'readwrite');\n        return transaction.objectStore(STORE_NAME);\n    };\n    const _peek = async (n) => {\n        const store = await getStore();\n        const request = store.getAll(undefined, n);\n        await promisifyIDBRequest(request);\n        return request.result.map(item => item);\n    };\n    return {\n        async add(item, { dequeueBeforeEnqueue } = { dequeueBeforeEnqueue: false }) {\n            if (dequeueBeforeEnqueue) {\n                const itemsToDelete = await this.peek(1);\n                await this.delete(itemsToDelete);\n            }\n            const store = await getStore();\n            const itemBytesSize = getAddItemBytesSize(item);\n            const queuedItem = {\n                ...item,\n                bytesSize: itemBytesSize,\n            };\n            const request = store.add(queuedItem);\n            await promisifyIDBRequest(request);\n            currentBytesSize += itemBytesSize;\n        },\n        async peek(n) {\n            return _peek(n);\n        },\n        async peekAll() {\n            return _peek();\n        },\n        async delete(items) {\n            if (!items.length) {\n                return;\n            }\n            const store = await getStore();\n            // delete by range to improve performance\n            const keyRangesToDelete = findRanges(items\n                .map(item => item.id)\n                .filter((id) => id !== undefined)).map(([lower, upper]) => IDBKeyRange.bound(lower, upper));\n            await Promise.all(keyRangesToDelete.map(range => promisifyIDBRequest(store.delete(range))));\n            for (const item of items) {\n                currentBytesSize -= item.bytesSize;\n            }\n        },\n        async clear() {\n            const store = await getStore();\n            await store.clear();\n            currentBytesSize = 0;\n        },\n        isFull(maxBytesSizeInMiB) {\n            return currentBytesSize >= maxBytesSizeInMiB * 1024 * 1024;\n        },\n    };\n};\nconst promisifyIDBRequest = (request) => new Promise((resolve, reject) => {\n    request.onsuccess = () => {\n        resolve();\n    };\n    request.onerror = () => {\n        reject(request.error);\n    };\n});\nconst findRanges = (input) => {\n    const nums = input.concat().sort((a, b) => a - b);\n    const result = [];\n    let rangeLength = 1;\n    for (let i = 1; i <= nums.length; i++) {\n        if (i === nums.length || nums[i] - nums[i - 1] !== 1) {\n            if (rangeLength === 1) {\n                result.push([nums[i - rangeLength], nums[i - rangeLength]]);\n            }\n            else {\n                result.push([nums[i - rangeLength], nums[i - 1]]);\n            }\n            rangeLength = 1;\n        }\n        else {\n            rangeLength += 1;\n        }\n    }\n    return result;\n};\n"],"names":[],"mappings":"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"}