UNPKG

@aws-amplify/datastore

Version:

AppSyncLocal support for aws-amplify

1 lines • 20.6 kB
{"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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"}