{"version":3,"file":"mutation.mjs","sources":["../../../../src/sync/processors/mutation.ts"],"sourcesContent":["import { InternalAPI } from '@aws-amplify/api/internals';\nimport { BackgroundProcessManager, Category, DataStoreAction, NonRetryableError, jitteredBackoff, retry, } from '@aws-amplify/core/internals/utils';\nimport { Observable } from 'rxjs';\nimport { ConsoleLogger } from '@aws-amplify/core';\nimport { DISCARD, OpType, ProcessName, isModelFieldType, isTargetNameAssociation, } from '../../types';\nimport { ID, USER, extractTargetNamesFromSrc } from '../../util';\nimport { TransformerMutationType, buildGraphQLOperation, createMutationInstanceFromModelOperation, getModelAuthModes, getTokenForCustomAuth, } from '../utils';\nimport { getMutationErrorType } from './errorMaps';\nconst MAX_ATTEMPTS = 10;\nconst logger = new ConsoleLogger('DataStore');\nclass MutationProcessor {\n    constructor(schema, storage, userClasses, outbox, modelInstanceCreator, _MutationEvent, amplifyConfig = {}, authModeStrategy, errorHandler, conflictHandler, amplifyContext) {\n        this.schema = schema;\n        this.storage = storage;\n        this.userClasses = userClasses;\n        this.outbox = outbox;\n        this.modelInstanceCreator = modelInstanceCreator;\n        this._MutationEvent = _MutationEvent;\n        this.amplifyConfig = amplifyConfig;\n        this.authModeStrategy = authModeStrategy;\n        this.errorHandler = errorHandler;\n        this.conflictHandler = conflictHandler;\n        this.amplifyContext = amplifyContext;\n        this.typeQuery = new WeakMap();\n        this.processing = false;\n        this.runningProcesses = new BackgroundProcessManager();\n        this.amplifyContext.InternalAPI =\n            this.amplifyContext.InternalAPI || InternalAPI;\n        this.generateQueries();\n    }\n    generateQueries() {\n        Object.values(this.schema.namespaces).forEach(namespace => {\n            Object.values(namespace.models)\n                .filter(({ syncable }) => syncable)\n                .forEach(model => {\n                const [createMutation] = buildGraphQLOperation(namespace, model, 'CREATE');\n                const [updateMutation] = buildGraphQLOperation(namespace, model, 'UPDATE');\n                const [deleteMutation] = buildGraphQLOperation(namespace, model, 'DELETE');\n                this.typeQuery.set(model, [\n                    createMutation,\n                    updateMutation,\n                    deleteMutation,\n                ]);\n            });\n        });\n    }\n    isReady() {\n        return this.observer !== undefined;\n    }\n    start() {\n        this.runningProcesses = new BackgroundProcessManager();\n        const observable = new Observable(observer => {\n            this.observer = observer;\n            try {\n                this.resume();\n            }\n            catch (error) {\n                logger.error('mutations processor start error', error);\n                throw error;\n            }\n            return this.runningProcesses.addCleaner(async () => {\n                // The observer has unsubscribed and/or `stop()` has been called.\n                this.removeObserver();\n                this.pause();\n            });\n        });\n        return observable;\n    }\n    async stop() {\n        this.removeObserver();\n        await this.runningProcesses.close();\n        await this.runningProcesses.open();\n    }\n    removeObserver() {\n        this.observer?.complete?.();\n        this.observer = undefined;\n    }\n    async resume() {\n        if (this.runningProcesses.isOpen) {\n            await this.runningProcesses.add(async (onTerminate) => {\n                if (this.processing ||\n                    !this.isReady() ||\n                    !this.runningProcesses.isOpen) {\n                    return;\n                }\n                this.processing = true;\n                let head;\n                const namespaceName = USER;\n                // start to drain outbox\n                while (this.processing &&\n                    this.runningProcesses.isOpen &&\n                    (head = await this.outbox.peek(this.storage)) !== undefined) {\n                    const { model, operation, data, condition } = head;\n                    const modelConstructor = this.userClasses[model];\n                    let result = undefined;\n                    let opName = undefined;\n                    let modelDefinition = undefined;\n                    try {\n                        const modelAuthModes = await getModelAuthModes({\n                            authModeStrategy: this.authModeStrategy,\n                            defaultAuthMode: this.amplifyConfig.aws_appsync_authenticationType,\n                            modelName: model,\n                            schema: this.schema,\n                        });\n                        const operationAuthModes = modelAuthModes[operation.toUpperCase()];\n                        let authModeAttempts = 0;\n                        const authModeRetry = async () => {\n                            try {\n                                logger.debug(`Attempting mutation with authMode: ${operationAuthModes[authModeAttempts]}`);\n                                const response = await this.jitteredRetry(namespaceName, model, operation, data, condition, modelConstructor, this._MutationEvent, head, operationAuthModes[authModeAttempts], onTerminate);\n                                logger.debug(`Mutation sent successfully with authMode: ${operationAuthModes[authModeAttempts]}`);\n                                return response;\n                            }\n                            catch (error) {\n                                authModeAttempts++;\n                                if (authModeAttempts >= operationAuthModes.length) {\n                                    logger.debug(`Mutation failed with authMode: ${operationAuthModes[authModeAttempts - 1]}`);\n                                    try {\n                                        // eslint-disable-next-line @typescript-eslint/no-confusing-void-expression\n                                        await this.errorHandler({\n                                            recoverySuggestion: 'Ensure app code is up to date, auth directives exist and are correct on each model, and that server-side data has not been invalidated by a schema change. If the problem persists, search for or create an issue: https://github.com/aws-amplify/amplify-js/issues',\n                                            localModel: null,\n                                            message: error.message,\n                                            model: modelConstructor.name,\n                                            operation: opName,\n                                            errorType: getMutationErrorType(error),\n                                            process: ProcessName.sync,\n                                            remoteModel: null,\n                                            cause: error,\n                                        });\n                                    }\n                                    catch (e) {\n                                        logger.error('Mutation error handler failed with:', e);\n                                    }\n                                    throw error;\n                                }\n                                logger.debug(`Mutation failed with authMode: ${operationAuthModes[authModeAttempts - 1]}. Retrying with authMode: ${operationAuthModes[authModeAttempts]}`);\n                                return authModeRetry();\n                            }\n                        };\n                        [result, opName, modelDefinition] = await authModeRetry();\n                    }\n                    catch (error) {\n                        if (error.message === 'Offline' ||\n                            error.message === 'RetryMutation') {\n                            continue;\n                        }\n                    }\n                    if (result === undefined) {\n                        logger.debug('done retrying');\n                        await this.storage.runExclusive(async (storage) => {\n                            await this.outbox.dequeue(storage);\n                        });\n                        continue;\n                    }\n                    const record = result.data[opName];\n                    let hasMore = false;\n                    await this.storage.runExclusive(async (storage) => {\n                        // using runExclusive to prevent possible race condition\n                        // when another record gets enqueued between dequeue and peek\n                        await this.outbox.dequeue(storage, record, operation);\n                        hasMore = (await this.outbox.peek(storage)) !== undefined;\n                    });\n                    this.observer?.next?.({\n                        operation,\n                        modelDefinition,\n                        model: record,\n                        hasMore,\n                    });\n                }\n                // pauses itself\n                this.pause();\n            }, 'mutation resume loop');\n        }\n    }\n    async jitteredRetry(namespaceName, model, operation, data, condition, modelConstructor, MutationEventCtor, mutationEvent, authMode, onTerminate) {\n        return retry(async (retriedModel, retriedOperation, retriedData, retriedCondition, retriedModelConstructor, retiredMutationEventCtor, retiredMutationEvent) => {\n            const [query, variables, graphQLCondition, opName, modelDefinition] = this.createQueryVariables(namespaceName, retriedModel, retriedOperation, retriedData, retriedCondition);\n            const authToken = await getTokenForCustomAuth(authMode, this.amplifyConfig);\n            const tryWith = {\n                query,\n                variables,\n                authMode,\n                authToken,\n            };\n            let attempt = 0;\n            const opType = this.opTypeFromTransformerOperation(retriedOperation);\n            const customUserAgentDetails = {\n                category: Category.DataStore,\n                action: DataStoreAction.GraphQl,\n            };\n            do {\n                try {\n                    const result = (await this.amplifyContext.InternalAPI.graphql(tryWith, undefined, customUserAgentDetails));\n                    // Use `as any` because TypeScript doesn't seem to like passing tuples\n                    // through generic params.\n                    return [result, opName, modelDefinition];\n                }\n                catch (err) {\n                    if (err.errors && err.errors.length > 0) {\n                        const [error] = err.errors;\n                        const { originalError: { code = null } = {} } = error;\n                        if (error.errorType === 'Unauthorized') {\n                            throw new NonRetryableError('Unauthorized');\n                        }\n                        if (error.message === 'Network Error' ||\n                            code === 'ERR_NETWORK' // refers to axios timeout error caused by device's bad network condition\n                        ) {\n                            if (!this.processing) {\n                                throw new NonRetryableError('Offline');\n                            }\n                            // TODO: Check errors on different env (react-native or other browsers)\n                            throw new Error('Network Error');\n                        }\n                        if (error.errorType === 'ConflictUnhandled') {\n                            // TODO: add on ConflictConditionalCheck error query last from server\n                            attempt++;\n                            let retryWith;\n                            if (attempt > MAX_ATTEMPTS) {\n                                retryWith = DISCARD;\n                            }\n                            else {\n                                try {\n                                    retryWith = await this.conflictHandler({\n                                        modelConstructor: retriedModelConstructor,\n                                        localModel: this.modelInstanceCreator(retriedModelConstructor, variables.input),\n                                        remoteModel: this.modelInstanceCreator(retriedModelConstructor, error.data),\n                                        operation: opType,\n                                        attempts: attempt,\n                                    });\n                                }\n                                catch (caughtErr) {\n                                    logger.warn('conflict trycatch', caughtErr);\n                                    continue;\n                                }\n                            }\n                            if (retryWith === DISCARD) {\n                                // Query latest from server and notify merger\n                                const [[, builtOpName, builtQuery]] = buildGraphQLOperation(this.schema.namespaces[namespaceName], modelDefinition, 'GET');\n                                const newAuthToken = await getTokenForCustomAuth(authMode, this.amplifyConfig);\n                                const serverData = (await this.amplifyContext.InternalAPI.graphql({\n                                    query: builtQuery,\n                                    variables: { id: variables.input.id },\n                                    authMode,\n                                    authToken: newAuthToken,\n                                }, undefined, customUserAgentDetails));\n                                // onTerminate cancel graphql()\n                                return [serverData, builtOpName, modelDefinition];\n                            }\n                            const namespace = this.schema.namespaces[namespaceName];\n                            // convert retry with to tryWith\n                            const updatedMutation = createMutationInstanceFromModelOperation(namespace.relationships, modelDefinition, opType, retriedModelConstructor, retryWith, graphQLCondition, retiredMutationEventCtor, this.modelInstanceCreator, retiredMutationEvent.id);\n                            await this.storage.save(updatedMutation);\n                            throw new NonRetryableError('RetryMutation');\n                        }\n                        else {\n                            try {\n                                this.errorHandler({\n                                    recoverySuggestion: 'Ensure app code is up to date, auth directives exist and are correct on each model, and that server-side data has not been invalidated by a schema change. If the problem persists, search for or create an issue: https://github.com/aws-amplify/amplify-js/issues',\n                                    localModel: variables.input,\n                                    message: error.message,\n                                    operation: retriedOperation,\n                                    errorType: getMutationErrorType(error),\n                                    errorInfo: error.errorInfo,\n                                    process: ProcessName.mutate,\n                                    cause: error,\n                                    remoteModel: error.data\n                                        ? this.modelInstanceCreator(retriedModelConstructor, error.data)\n                                        : null,\n                                });\n                            }\n                            catch (caughtErr) {\n                                logger.warn('Mutation error handler failed with:', caughtErr);\n                            }\n                            finally {\n                                // Return empty tuple, dequeues the mutation\n                                // eslint-disable-next-line no-unsafe-finally\n                                return error.data\n                                    ? [\n                                        { data: { [opName]: error.data } },\n                                        opName,\n                                        modelDefinition,\n                                    ]\n                                    : [];\n                            }\n                        }\n                    }\n                    else {\n                        // Catch-all for client-side errors that don't come back in the `GraphQLError` format.\n                        // These errors should not be retried.\n                        throw new NonRetryableError(err);\n                    }\n                }\n                // eslint-disable-next-line no-unmodified-loop-condition\n            } while (tryWith);\n        }, [\n            model,\n            operation,\n            data,\n            condition,\n            modelConstructor,\n            MutationEventCtor,\n            mutationEvent,\n        ], safeJitteredBackoff, onTerminate);\n    }\n    createQueryVariables(namespaceName, model, operation, data, condition) {\n        const modelDefinition = this.schema.namespaces[namespaceName].models[model];\n        const { primaryKey } = this.schema.namespaces[namespaceName].keys[model];\n        const auth = modelDefinition.attributes?.find(a => a.type === 'auth');\n        const ownerFields = auth?.properties?.rules\n            .map(rule => rule.ownerField)\n            .filter(f => f) || ['owner'];\n        const queriesTuples = this.typeQuery.get(modelDefinition);\n        const [, opName, query] = queriesTuples.find(([transformerMutationType]) => transformerMutationType === operation);\n        const { _version, ...parsedData } = JSON.parse(data);\n        // include all the fields that comprise a custom PK if one is specified\n        const deleteInput = {};\n        if (primaryKey && primaryKey.length) {\n            for (const pkField of primaryKey) {\n                deleteInput[pkField] = parsedData[pkField];\n            }\n        }\n        else {\n            deleteInput[ID] = parsedData.id;\n        }\n        let mutationInput;\n        if (operation === TransformerMutationType.DELETE) {\n            // For DELETE mutations, only the key(s) are included in the input\n            mutationInput = deleteInput;\n        }\n        else {\n            // Otherwise, we construct the mutation input with the following logic\n            mutationInput = {};\n            const modelFields = Object.values(modelDefinition.fields);\n            for (const { name, type, association, isReadOnly } of modelFields) {\n                // omit readonly fields. cloud storage doesn't need them and won't take them!\n                if (isReadOnly) {\n                    continue;\n                }\n                // omit owner fields if it's `null`. cloud storage doesn't allow it.\n                if (ownerFields.includes(name) && parsedData[name] === null) {\n                    continue;\n                }\n                // model fields should be stripped out from the input\n                if (isModelFieldType(type)) {\n                    // except for belongs to relations - we need to replace them with the correct foreign key(s)\n                    if (isTargetNameAssociation(association) &&\n                        association.connectionType === 'BELONGS_TO') {\n                        const targetNames = extractTargetNamesFromSrc(association);\n                        if (targetNames) {\n                            // instead of including the connected model itself, we add its key(s) to the mutation input\n                            for (const targetName of targetNames) {\n                                mutationInput[targetName] = parsedData[targetName];\n                            }\n                        }\n                    }\n                    continue;\n                }\n                // scalar fields / non-model types\n                if (operation === TransformerMutationType.UPDATE) {\n                    if (!Object.prototype.hasOwnProperty.call(parsedData, name)) {\n                        // for update mutations - strip out a field if it's unchanged\n                        continue;\n                    }\n                }\n                // all other fields are added to the input object\n                mutationInput[name] = parsedData[name];\n            }\n        }\n        // Build mutation variables input object\n        const input = {\n            ...mutationInput,\n            _version,\n        };\n        const graphQLCondition = JSON.parse(condition);\n        const variables = {\n            input,\n            ...(operation === TransformerMutationType.CREATE\n                ? {}\n                : {\n                    condition: Object.keys(graphQLCondition).length > 0\n                        ? graphQLCondition\n                        : null,\n                }),\n        };\n        return [query, variables, graphQLCondition, opName, modelDefinition];\n    }\n    opTypeFromTransformerOperation(operation) {\n        switch (operation) {\n            case TransformerMutationType.CREATE:\n                return OpType.INSERT;\n            case TransformerMutationType.DELETE:\n                return OpType.DELETE;\n            case TransformerMutationType.UPDATE:\n                return OpType.UPDATE;\n            case TransformerMutationType.GET: // Intentionally blank\n                break;\n            default:\n                throw new Error(`Invalid operation ${operation}`);\n        }\n        // because it makes TS happy ...\n        return undefined;\n    }\n    pause() {\n        this.processing = false;\n    }\n}\nconst MAX_RETRY_DELAY_MS = 5 * 60 * 1000;\nconst originalJitteredBackoff = jitteredBackoff(MAX_RETRY_DELAY_MS);\n/**\n * @private\n * Internal use of Amplify only.\n *\n * Wraps the jittered backoff calculation to retry Network Errors indefinitely.\n * Backs off according to original jittered retry logic until the original retry\n * logic hits its max. After this occurs, if the error is a Network Error, we\n * ignore the attempt count and return MAX_RETRY_DELAY_MS to retry forever (until\n * the request succeeds).\n *\n * @param attempt ignored\n * @param _args ignored\n * @param error tested to see if `.message` is 'Network Error'\n * @returns number | false :\n */\nexport const safeJitteredBackoff = (attempt, _args, error) => {\n    const attemptResult = originalJitteredBackoff(attempt);\n    // If this is the last attempt and it is a network error, we retry indefinitively every 5 minutes\n    if (attemptResult === false &&\n        (error || {}).message === 'Network Error') {\n        return MAX_RETRY_DELAY_MS;\n    }\n    return attemptResult;\n};\nexport { MutationProcessor };\n"],"names":[],"mappings":"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"}