{"version":3,"file":"AsyncStorageDatabase.mjs","sources":["../../../../src/storage/adapter/AsyncStorageDatabase.ts"],"sourcesContent":["import { OpType, QueryOne, } from '../../types';\nimport { DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR, indexNameFromKeys, monotonicUlidFactory, } from '../../util';\nimport { createInMemoryStore } from './InMemoryStore';\nconst DB_NAME = '@AmplifyDatastore';\nconst COLLECTION = 'Collection';\nconst DATA = 'Data';\nconst monotonicFactoriesMap = new Map();\nclass AsyncStorageDatabase {\n    constructor() {\n        /**\n         * Maps storeNames to a map of ulid->id\n         */\n        this._collectionInMemoryIndex = new Map();\n        this.storage = createInMemoryStore();\n    }\n    /**\n     * Collection index is map of stores (i.e. sync, metadata, mutation event, and data)\n     * @param storeName {string} - Name of the store\n     * @returns Map of ulid->id\n     */\n    getCollectionIndex(storeName) {\n        if (!this._collectionInMemoryIndex.has(storeName)) {\n            this._collectionInMemoryIndex.set(storeName, new Map());\n        }\n        return this._collectionInMemoryIndex.get(storeName);\n    }\n    /**\n     * Return ULID for store if it exists, otherwise create a new one\n     * @param storeName {string} - Name of the store\n     * @returns ulid\n     */\n    getMonotonicFactory(storeName) {\n        if (!monotonicFactoriesMap.has(storeName)) {\n            monotonicFactoriesMap.set(storeName, monotonicUlidFactory());\n        }\n        return monotonicFactoriesMap.get(storeName);\n    }\n    async init() {\n        this._collectionInMemoryIndex.clear();\n        const allKeys = await this.storage.getAllKeys();\n        const keysForCollectionEntries = [];\n        for (const key of allKeys) {\n            const [dbName, storeName, recordType, ulidOrId, id] = key.split('::');\n            if (dbName === DB_NAME) {\n                if (recordType === DATA) {\n                    let ulid;\n                    if (id === undefined) {\n                        // It is an old entry (without ulid). Need to migrate to new key format\n                        const resolvedId = ulidOrId;\n                        const newUlid = this.getMonotonicFactory(storeName)();\n                        const oldKey = this.getLegacyKeyForItem(storeName, resolvedId);\n                        const newKey = this.getKeyForItem(storeName, resolvedId, newUlid);\n                        const item = await this.storage.getItem(oldKey);\n                        await this.storage.setItem(newKey, item);\n                        await this.storage.removeItem(oldKey);\n                        ulid = newUlid;\n                    }\n                    else {\n                        ulid = ulidOrId;\n                    }\n                    this.getCollectionIndex(storeName).set(id, ulid);\n                }\n                else if (recordType === COLLECTION) {\n                    keysForCollectionEntries.push(key);\n                }\n            }\n        }\n        if (keysForCollectionEntries.length > 0) {\n            await this.storage.multiRemove(keysForCollectionEntries);\n        }\n    }\n    async save(item, storeName, keys, keyValuesPath) {\n        const idxName = indexNameFromKeys(keys);\n        const ulid = this.getCollectionIndex(storeName)?.get(idxName) ||\n            this.getMonotonicFactory(storeName)();\n        // Retrieve db key for item\n        const itemKey = this.getKeyForItem(storeName, keyValuesPath, ulid);\n        // Set key in collection index\n        this.getCollectionIndex(storeName)?.set(keyValuesPath, ulid);\n        // Save item in db\n        await this.storage.setItem(itemKey, JSON.stringify(item));\n    }\n    async batchSave(storeName, items, keys) {\n        if (items.length === 0) {\n            return [];\n        }\n        const result = [];\n        const collection = this.getCollectionIndex(storeName);\n        const keysToDelete = new Set();\n        const keysToSave = new Set();\n        const allItemsKeys = [];\n        const itemsMap = {};\n        /* Populate allItemKeys, keysToDelete, and keysToSave */\n        for (const item of items) {\n            // Extract keys from concatenated key path, map to item values\n            const keyValues = keys.map(field => item[field]);\n            const { _deleted } = item;\n            // If id is in the store, retrieve, otherwise generate new ULID\n            const ulid = collection.get(keyValues.join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR)) ||\n                this.getMonotonicFactory(storeName)();\n            // Generate the \"longer key\" for the item\n            const key = this.getKeyForItem(storeName, keyValues.join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR), ulid);\n            allItemsKeys.push(key);\n            itemsMap[key] = { ulid, model: item };\n            if (_deleted) {\n                keysToDelete.add(key);\n            }\n            else {\n                keysToSave.add(key);\n            }\n        }\n        const existingRecordsMap = await this.storage.multiGet(allItemsKeys);\n        const existingRecordsKeys = existingRecordsMap\n            .filter(([, v]) => !!v)\n            .reduce((set, [k]) => set.add(k), new Set());\n        // Delete\n        await new Promise((resolve, reject) => {\n            if (keysToDelete.size === 0) {\n                resolve();\n                return;\n            }\n            const keysToDeleteArray = Array.from(keysToDelete);\n            keysToDeleteArray.forEach(key => {\n                // key: full db key\n                // keys: PK and/or SK keys\n                const primaryKeyValues = keys\n                    .map(field => itemsMap[key].model[field])\n                    .join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);\n                collection.delete(primaryKeyValues);\n            });\n            this.storage.multiRemove(keysToDeleteArray, (errors) => {\n                if (errors && errors.length > 0) {\n                    reject(errors);\n                }\n                else {\n                    resolve();\n                }\n            });\n        });\n        // Save\n        await new Promise((resolve, reject) => {\n            if (keysToSave.size === 0) {\n                resolve();\n                return;\n            }\n            const entriesToSet = Array.from(keysToSave).map(key => [\n                key,\n                JSON.stringify(itemsMap[key].model),\n            ]);\n            keysToSave.forEach(key => {\n                const { model, ulid } = itemsMap[key];\n                // Retrieve values from model, use as key for collection index\n                const keyValues = keys\n                    .map(field => model[field])\n                    .join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);\n                collection.set(keyValues, ulid);\n            });\n            this.storage.multiSet(entriesToSet, (errors) => {\n                if (errors && errors.length > 0) {\n                    reject(errors);\n                }\n                else {\n                    resolve();\n                }\n            });\n        });\n        for (const key of allItemsKeys) {\n            if (keysToDelete.has(key) && existingRecordsKeys.has(key)) {\n                result.push([itemsMap[key].model, OpType.DELETE]);\n            }\n            else if (keysToSave.has(key)) {\n                result.push([\n                    itemsMap[key].model,\n                    existingRecordsKeys.has(key) ? OpType.UPDATE : OpType.INSERT,\n                ]);\n            }\n        }\n        return result;\n    }\n    async get(keyValuePath, storeName) {\n        const ulid = this.getCollectionIndex(storeName).get(keyValuePath);\n        const itemKey = this.getKeyForItem(storeName, keyValuePath, ulid);\n        const recordAsString = await this.storage.getItem(itemKey);\n        const record = recordAsString && JSON.parse(recordAsString);\n        return record;\n    }\n    async getOne(firstOrLast, storeName) {\n        const collection = this.getCollectionIndex(storeName);\n        const [itemId, ulid] = firstOrLast === QueryOne.FIRST\n            ? (() => {\n                let resolvedId, resolvedUlid;\n                // eslint-disable-next-line no-unreachable-loop\n                for ([resolvedId, resolvedUlid] of collection)\n                    break; // Get first element of the set\n                return [resolvedId, resolvedUlid];\n            })()\n            : (() => {\n                let resolvedId, resolvedUlid;\n                for ([resolvedId, resolvedUlid] of collection)\n                    ; // Get last element of the set\n                return [resolvedId, resolvedUlid];\n            })();\n        const itemKey = this.getKeyForItem(storeName, itemId, ulid);\n        const itemString = itemKey && (await this.storage.getItem(itemKey));\n        const result = itemString ? JSON.parse(itemString) || undefined : undefined;\n        return result;\n    }\n    /**\n     * This function gets all the records stored in async storage for a particular storeName\n     * It then loads all the records for that filtered set of keys using multiGet()\n     */\n    async getAll(storeName, pagination) {\n        const collection = this.getCollectionIndex(storeName);\n        const { page = 0, limit = 0 } = pagination || {};\n        const start = Math.max(0, page * limit) || 0;\n        const end = limit > 0 ? start + limit : undefined;\n        const keysForStore = [];\n        let count = 0;\n        for (const [id, ulid] of collection) {\n            count++;\n            if (count <= start) {\n                continue;\n            }\n            keysForStore.push(this.getKeyForItem(storeName, id, ulid));\n            if (count === end) {\n                break;\n            }\n        }\n        const storeRecordStrings = await this.storage.multiGet(keysForStore);\n        const records = storeRecordStrings\n            .filter(([, value]) => value)\n            .map(([, value]) => JSON.parse(value));\n        return records;\n    }\n    async delete(key, storeName) {\n        const ulid = this.getCollectionIndex(storeName).get(key);\n        const itemKey = this.getKeyForItem(storeName, key, ulid);\n        this.getCollectionIndex(storeName).delete(key);\n        await this.storage.removeItem(itemKey);\n    }\n    /**\n     * Clear the AsyncStorage of all DataStore entries\n     */\n    async clear() {\n        const allKeys = await this.storage.getAllKeys();\n        const allDataStoreKeys = allKeys.filter(key => key.startsWith(DB_NAME));\n        await this.storage.multiRemove(allDataStoreKeys);\n        this._collectionInMemoryIndex.clear();\n    }\n    getKeyForItem(storeName, id, ulid) {\n        return `${this.getKeyPrefixForStoreItems(storeName)}::${ulid}::${id}`;\n    }\n    getLegacyKeyForItem(storeName, id) {\n        return `${this.getKeyPrefixForStoreItems(storeName)}::${id}`;\n    }\n    getKeyPrefixForStoreItems(storeName) {\n        return `${DB_NAME}::${storeName}::${DATA}`;\n    }\n}\nexport default AsyncStorageDatabase;\n"],"names":[],"mappings":"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"}