UNPKG

@aws-amplify/datastore

Version:

AppSyncLocal support for aws-amplify

1 lines • 25.7 kB
{"version":3,"file":"storage.mjs","sources":["../../../src/storage/storage.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { Subject, filter, map } from 'rxjs';\nimport { Mutex } from '@aws-amplify/core/internals/utils';\nimport { ConsoleLogger } from '@aws-amplify/core';\nimport { ModelPredicateCreator } from '../predicates';\nimport { OpType, QueryOne, isTargetNameAssociation, } from '../types';\nimport { STORAGE, isModelConstructor, validatePredicate, valuesEqual, } from '../util';\nimport { getIdentifierValue } from '../sync/utils';\nimport getDefaultAdapter from './adapter/getDefaultAdapter';\nconst logger = new ConsoleLogger('DataStore');\nclass StorageClass {\n constructor(schema, namespaceResolver, getModelConstructorByModelName, modelInstanceCreator, adapter, sessionId) {\n this.schema = schema;\n this.namespaceResolver = namespaceResolver;\n this.getModelConstructorByModelName = getModelConstructorByModelName;\n this.modelInstanceCreator = modelInstanceCreator;\n this.adapter = adapter;\n this.sessionId = sessionId;\n this.adapter = this.adapter || getDefaultAdapter();\n this.pushStream = new Subject();\n }\n static getNamespace() {\n const namespace = {\n name: STORAGE,\n relationships: {},\n enums: {},\n models: {},\n nonModels: {},\n };\n return namespace;\n }\n async init() {\n if (this.initialized !== undefined) {\n await this.initialized;\n return;\n }\n logger.debug('Starting Storage');\n let resolve;\n let reject;\n this.initialized = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n this.adapter.setUp(this.schema, this.namespaceResolver, this.modelInstanceCreator, this.getModelConstructorByModelName, this.sessionId).then(resolve, reject);\n await this.initialized;\n }\n async save(model, condition, mutator, patchesTuple) {\n await this.init();\n if (!this.adapter) {\n throw new Error('Storage adapter is missing');\n }\n const result = await this.adapter.save(model, condition);\n result.forEach(r => {\n const [savedElement, opType] = r;\n // truthy when save is called by the Merger\n const syncResponse = !!mutator;\n let updateMutationInput;\n // don't attempt to calc mutation input when storage.save\n // is called by Merger, i.e., when processing an AppSync response\n if ((opType === OpType.UPDATE || opType === OpType.INSERT) &&\n !syncResponse) {\n //\n // TODO: LOOK!!!\n // the `model` used here is in effect regardless of what model\n // comes back from adapter.save().\n // Prior to fix, SQLite adapter had been returning two models\n // of different types, resulting in invalid outbox entries.\n //\n // the bug is essentially fixed in SQLite adapter.\n // leaving as-is, because it's currently unclear whether anything\n // depends on this remaining as-is.\n //\n updateMutationInput = this.getChangedFieldsInput(model, savedElement, patchesTuple);\n // // an update without changed user fields\n // => don't create mutationEvent\n if (updateMutationInput === null) {\n return result;\n }\n }\n const element = updateMutationInput || savedElement;\n const modelConstructor = Object.getPrototypeOf(savedElement)\n .constructor;\n this.pushStream.next({\n model: modelConstructor,\n opType,\n element,\n mutator,\n condition: (condition &&\n ModelPredicateCreator.getPredicates(condition, false)) ||\n null,\n savedElement,\n });\n });\n return result;\n }\n async delete(modelOrModelConstructor, condition, mutator) {\n await this.init();\n if (!this.adapter) {\n throw new Error('Storage adapter is missing');\n }\n let models;\n let deleted;\n [models, deleted] = await this.adapter.delete(modelOrModelConstructor, condition);\n const modelConstructor = isModelConstructor(modelOrModelConstructor)\n ? modelOrModelConstructor\n : Object.getPrototypeOf(modelOrModelConstructor || {})\n .constructor;\n const namespaceName = this.namespaceResolver(modelConstructor);\n const modelDefinition = this.schema.namespaces[namespaceName].models[modelConstructor.name];\n const modelIds = new Set(models.map(model => {\n const modelId = getIdentifierValue(modelDefinition, model);\n return modelId;\n }));\n if (!isModelConstructor(modelOrModelConstructor) &&\n !Array.isArray(deleted)) {\n deleted = [deleted];\n }\n deleted.forEach(model => {\n const resolvedModelConstructor = Object.getPrototypeOf(model)\n .constructor;\n let theCondition;\n if (!isModelConstructor(modelOrModelConstructor)) {\n const modelId = getIdentifierValue(modelDefinition, model);\n theCondition = modelIds.has(modelId)\n ? ModelPredicateCreator.getPredicates(condition, false)\n : undefined;\n }\n this.pushStream.next({\n model: resolvedModelConstructor,\n opType: OpType.DELETE,\n element: model,\n mutator,\n condition: theCondition || null,\n });\n });\n return [models, deleted];\n }\n async query(modelConstructor, predicate, pagination) {\n await this.init();\n if (!this.adapter) {\n throw new Error('Storage adapter is missing');\n }\n return this.adapter.query(modelConstructor, predicate, pagination);\n }\n async queryOne(modelConstructor, firstOrLast = QueryOne.FIRST) {\n await this.init();\n if (!this.adapter) {\n throw new Error('Storage adapter is missing');\n }\n return this.adapter.queryOne(modelConstructor, firstOrLast);\n }\n observe(modelConstructor, predicate, skipOwn) {\n const listenToAll = !modelConstructor;\n const { predicates, type } = (predicate && ModelPredicateCreator.getPredicates(predicate, false)) ||\n {};\n let result = this.pushStream\n .pipe(filter(({ mutator }) => {\n return !skipOwn || mutator !== skipOwn;\n }))\n .pipe(map(({ mutator: _mutator, ...message }) => message));\n if (!listenToAll) {\n result = result.pipe(filter(({ model, element }) => {\n if (modelConstructor !== model) {\n return false;\n }\n if (!!predicates && !!type) {\n return validatePredicate(element, type, predicates);\n }\n return true;\n }));\n }\n return result;\n }\n async clear(completeObservable = true) {\n this.initialized = undefined;\n if (!this.adapter) {\n throw new Error('Storage adapter is missing');\n }\n await this.adapter.clear();\n if (completeObservable) {\n this.pushStream.complete();\n }\n }\n async batchSave(modelConstructor, items, mutator) {\n await this.init();\n if (!this.adapter) {\n throw new Error('Storage adapter is missing');\n }\n const result = await this.adapter.batchSave(modelConstructor, items);\n result.forEach(([element, opType]) => {\n this.pushStream.next({\n model: modelConstructor,\n opType,\n element,\n mutator,\n condition: null,\n });\n });\n return result;\n }\n // returns null if no user fields were changed (determined by value comparison)\n getChangedFieldsInput(model, originalElement, patchesTuple) {\n const containsPatches = patchesTuple && patchesTuple.length;\n if (!containsPatches) {\n return null;\n }\n const [patches, source] = patchesTuple;\n const updatedElement = {};\n // extract array of updated fields from patches\n const updatedFields = patches.map(patch => patch.path && patch.path[0]);\n // check model def for association and replace with targetName if exists\n const modelConstructor = Object.getPrototypeOf(model)\n .constructor;\n const namespace = this.namespaceResolver(modelConstructor);\n const { fields } = this.schema.namespaces[namespace].models[modelConstructor.name];\n const { primaryKey, compositeKeys = [] } = this.schema.namespaces[namespace].keys?.[modelConstructor.name] || {};\n // set original values for these fields\n updatedFields.forEach((field) => {\n const targetNames = isTargetNameAssociation(fields[field]?.association);\n if (Array.isArray(targetNames)) {\n // if field refers to a belongsTo relation, use the target field instead\n for (const targetName of targetNames) {\n // check field values by value. Ignore unchanged fields\n if (!valuesEqual(source[targetName], originalElement[targetName])) {\n // if the field was updated to 'undefined', replace with 'null' for compatibility with JSON and GraphQL\n updatedElement[targetName] =\n originalElement[targetName] === undefined\n ? null\n : originalElement[targetName];\n for (const fieldSet of compositeKeys) {\n // include all of the fields that comprise the composite key\n if (fieldSet.has(targetName)) {\n for (const compositeField of fieldSet) {\n updatedElement[compositeField] =\n originalElement[compositeField];\n }\n }\n }\n }\n }\n }\n else {\n // Backwards compatibility pre-CPK\n // if field refers to a belongsTo relation, use the target field instead\n const key = targetNames || field;\n // check field values by value. Ignore unchanged fields\n if (!valuesEqual(source[key], originalElement[key])) {\n // if the field was updated to 'undefined', replace with 'null' for compatibility with JSON and GraphQL\n updatedElement[key] =\n originalElement[key] === undefined ? null : originalElement[key];\n for (const fieldSet of compositeKeys) {\n // include all of the fields that comprise the composite key\n if (fieldSet.has(key)) {\n for (const compositeField of fieldSet) {\n updatedElement[compositeField] =\n originalElement[compositeField];\n }\n }\n }\n }\n }\n });\n // Exit early when there are no changes introduced in the update mutation\n if (Object.keys(updatedElement).length === 0) {\n return null;\n }\n // include field(s) from custom PK if one is specified for the model\n if (primaryKey && primaryKey.length) {\n for (const pkField of primaryKey) {\n updatedElement[pkField] = originalElement[pkField];\n }\n }\n const { id, _version, _lastChangedAt, _deleted } = originalElement;\n // For update mutations we only want to send fields with changes\n // and the required internal fields\n return {\n ...updatedElement,\n id,\n _version,\n _lastChangedAt,\n _deleted,\n };\n }\n}\nclass ExclusiveStorage {\n constructor(schema, namespaceResolver, getModelConstructorByModelName, modelInstanceCreator, adapter, sessionId) {\n this.mutex = new Mutex();\n this.storage = new StorageClass(schema, namespaceResolver, getModelConstructorByModelName, modelInstanceCreator, adapter, sessionId);\n }\n runExclusive(fn) {\n return this.mutex.runExclusive(fn.bind(this, this.storage));\n }\n async save(model, condition, mutator, patchesTuple) {\n return this.runExclusive(storage => storage.save(model, condition, mutator, patchesTuple));\n }\n async delete(modelOrModelConstructor, condition, mutator) {\n return this.runExclusive(storage => {\n if (isModelConstructor(modelOrModelConstructor)) {\n const modelConstructor = modelOrModelConstructor;\n return storage.delete(modelConstructor, condition, mutator);\n }\n else {\n const model = modelOrModelConstructor;\n return storage.delete(model, condition, mutator);\n }\n });\n }\n async query(modelConstructor, predicate, pagination) {\n return this.runExclusive(storage => storage.query(modelConstructor, predicate, pagination));\n }\n async queryOne(modelConstructor, firstOrLast = QueryOne.FIRST) {\n return this.runExclusive(storage => storage.queryOne(modelConstructor, firstOrLast));\n }\n static getNamespace() {\n return StorageClass.getNamespace();\n }\n observe(modelConstructor, predicate, skipOwn) {\n return this.storage.observe(modelConstructor, predicate, skipOwn);\n }\n async clear() {\n await this.runExclusive(storage => storage.clear());\n }\n batchSave(modelConstructor, items) {\n return this.storage.batchSave(modelConstructor, items);\n }\n async init() {\n return this.storage.init();\n }\n}\nexport { ExclusiveStorage };\n"],"names":[],"mappings":"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"}