@aws-amplify/datastore
Version:
AppSyncLocal support for aws-amplify
1 lines • 27.5 kB
Source Map (JSON)
{"version":3,"file":"sync.mjs","sources":["../../../../src/sync/processors/sync.ts"],"sourcesContent":["import { InternalAPI } from '@aws-amplify/api/internals';\nimport { Observable } from 'rxjs';\nimport { BackgroundProcessManager, Category, DataStoreAction, NonRetryableError, jitteredExponentialRetry, } from '@aws-amplify/core/internals/utils';\nimport { ConsoleLogger, Hub } from '@aws-amplify/core';\nimport { ProcessName, } from '../../types';\nimport { buildGraphQLOperation, getClientSideAuthError, getForbiddenError, getModelAuthModes, getTokenForCustomAuth, predicateToGraphQLFilter, } from '../utils';\nimport { ModelPredicateCreator } from '../../predicates';\nimport { getSyncErrorType } from './errorMaps';\nconst opResultDefaults = {\n items: [],\n nextToken: null,\n startedAt: null,\n};\nconst logger = new ConsoleLogger('DataStore');\nclass SyncProcessor {\n constructor(schema, syncPredicates, amplifyConfig = {}, authModeStrategy, errorHandler, amplifyContext) {\n this.schema = schema;\n this.syncPredicates = syncPredicates;\n this.amplifyConfig = amplifyConfig;\n this.authModeStrategy = authModeStrategy;\n this.errorHandler = errorHandler;\n this.amplifyContext = amplifyContext;\n this.typeQuery = new WeakMap();\n this.runningProcesses = new BackgroundProcessManager();\n amplifyContext.InternalAPI = 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 [[, ...opNameQuery]] = buildGraphQLOperation(namespace, model, 'LIST');\n this.typeQuery.set(model, opNameQuery);\n });\n });\n }\n graphqlFilterFromPredicate(model) {\n if (!this.syncPredicates) {\n return null;\n }\n const predicatesGroup = ModelPredicateCreator.getPredicates(this.syncPredicates.get(model), false);\n if (!predicatesGroup) {\n return null;\n }\n return predicateToGraphQLFilter(predicatesGroup);\n }\n async retrievePage(modelDefinition, lastSync, nextToken, limit = null, filter, onTerminate) {\n const [opName, query] = this.typeQuery.get(modelDefinition);\n const variables = {\n limit,\n nextToken,\n lastSync,\n filter,\n };\n const modelAuthModes = await getModelAuthModes({\n authModeStrategy: this.authModeStrategy,\n defaultAuthMode: this.amplifyConfig.aws_appsync_authenticationType,\n modelName: modelDefinition.name,\n schema: this.schema,\n });\n // sync only needs the READ auth mode(s)\n const readAuthModes = modelAuthModes.READ;\n let authModeAttempts = 0;\n const authModeRetry = async () => {\n if (!this.runningProcesses.isOpen) {\n throw new Error('sync.retreievePage termination was requested. Exiting.');\n }\n try {\n logger.debug(`Attempting sync with authMode: ${readAuthModes[authModeAttempts]}`);\n const response = await this.jitteredRetry({\n query,\n variables,\n opName,\n modelDefinition,\n authMode: readAuthModes[authModeAttempts],\n onTerminate,\n });\n logger.debug(`Sync successful with authMode: ${readAuthModes[authModeAttempts]}`);\n return response;\n }\n catch (error) {\n authModeAttempts++;\n if (authModeAttempts >= readAuthModes.length) {\n const authMode = readAuthModes[authModeAttempts - 1];\n logger.debug(`Sync failed with authMode: ${authMode}`, error);\n if (getClientSideAuthError(error) || getForbiddenError(error)) {\n // return empty list of data so DataStore will continue to sync other models\n logger.warn(`User is unauthorized to query ${opName} with auth mode ${authMode}. No data could be returned.`);\n return {\n data: {\n [opName]: opResultDefaults,\n },\n };\n }\n throw error;\n }\n logger.debug(`Sync failed with authMode: ${readAuthModes[authModeAttempts - 1]}. Retrying with authMode: ${readAuthModes[authModeAttempts]}`);\n return authModeRetry();\n }\n };\n const { data } = await authModeRetry();\n const { [opName]: opResult } = data;\n const { items, nextToken: newNextToken, startedAt } = opResult;\n return {\n nextToken: newNextToken,\n startedAt,\n items,\n };\n }\n async jitteredRetry({ query, variables, opName, modelDefinition, authMode, onTerminate, }) {\n return jitteredExponentialRetry(async (retriedQuery, retriedVariables) => {\n try {\n const authToken = await getTokenForCustomAuth(authMode, this.amplifyConfig);\n const customUserAgentDetails = {\n category: Category.DataStore,\n action: DataStoreAction.GraphQl,\n };\n return await this.amplifyContext.InternalAPI.graphql({\n query: retriedQuery,\n variables: retriedVariables,\n authMode,\n authToken,\n }, undefined, customUserAgentDetails);\n // TODO: onTerminate.then(() => API.cancel(...))\n }\n catch (error) {\n // Catch client-side (GraphQLAuthError) & 401/403 errors here so that we don't continue to retry\n const clientOrForbiddenErrorMessage = getClientSideAuthError(error) || getForbiddenError(error);\n if (clientOrForbiddenErrorMessage) {\n logger.error('Sync processor retry error:', error);\n throw new NonRetryableError(clientOrForbiddenErrorMessage);\n }\n const hasItems = Boolean(error?.data?.[opName]?.items);\n const unauthorized = error?.errors &&\n error.errors.some(err => err.errorType === 'Unauthorized');\n const otherErrors = error?.errors &&\n error.errors.filter(err => err.errorType !== 'Unauthorized');\n const result = error;\n if (hasItems) {\n result.data[opName].items = result.data[opName].items.filter(item => item !== null);\n }\n if (hasItems && otherErrors?.length) {\n await Promise.all(otherErrors.map(async (err) => {\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: err.message,\n model: modelDefinition.name,\n operation: opName,\n errorType: getSyncErrorType(err),\n process: ProcessName.sync,\n remoteModel: null,\n cause: err,\n });\n }\n catch (e) {\n logger.error('Sync error handler failed with:', e);\n }\n }));\n Hub.dispatch('datastore', {\n event: 'nonApplicableDataReceived',\n data: {\n errors: otherErrors,\n modelName: modelDefinition.name,\n },\n });\n }\n /**\n * Handle $util.unauthorized() in resolver request mapper, which responses with something\n * like this:\n *\n * ```\n * {\n * \tdata: { syncYourModel: null },\n * \terrors: [\n * \t\t{\n * \t\t\tpath: ['syncLegacyJSONComments'],\n * \t\t\tdata: null,\n * \t\t\terrorType: 'Unauthorized',\n * \t\t\terrorInfo: null,\n * \t\t\tlocations: [{ line: 2, column: 3, sourceName: null }],\n * \t\t\tmessage:\n * \t\t\t\t'Not Authorized to access syncYourModel on type Query',\n * \t\t\t},\n * \t\t],\n * \t}\n * ```\n *\n * The correct handling for this is to signal that we've encountered a non-retryable error,\n * since the server has responded with an auth error and *NO DATA* at this point.\n */\n if (unauthorized) {\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: null,\n message: error.message,\n model: modelDefinition.name,\n operation: opName,\n errorType: getSyncErrorType(error.errors[0]),\n process: ProcessName.sync,\n remoteModel: null,\n cause: error,\n });\n throw new NonRetryableError(error);\n }\n if (result.data?.[opName]?.items?.length) {\n return result;\n }\n throw error;\n }\n }, [query, variables], undefined, onTerminate);\n }\n start(typesLastSync) {\n const { maxRecordsToSync, syncPageSize } = this.amplifyConfig;\n const parentPromises = new Map();\n const observable = new Observable(observer => {\n const sortedTypesLastSyncs = Object.values(this.schema.namespaces).reduce((map, namespace) => {\n for (const modelName of Array.from(namespace.modelTopologicalOrdering.keys())) {\n const typeLastSync = typesLastSync.get(namespace.models[modelName]);\n map.set(namespace.models[modelName], typeLastSync);\n }\n return map;\n }, new Map());\n const allModelsReady = Array.from(sortedTypesLastSyncs.entries())\n .filter(([{ syncable }]) => syncable)\n .map(([modelDefinition, [namespace, lastSync]]) => this.runningProcesses.isOpen &&\n this.runningProcesses.add(async (onTerminate) => {\n let done = false;\n let nextToken = null;\n let startedAt = null;\n let items = null;\n let recordsReceived = 0;\n const filter = this.graphqlFilterFromPredicate(modelDefinition);\n const parents = this.schema.namespaces[namespace].modelTopologicalOrdering.get(modelDefinition.name);\n const promises = parents.map(parent => parentPromises.get(`${namespace}_${parent}`));\n // eslint-disable-next-line no-async-promise-executor\n const promise = new Promise(async (resolve) => {\n await Promise.all(promises);\n do {\n /**\n * If `runningProcesses` is not open, it means that the sync processor has been\n * stopped (for example by calling `DataStore.clear()` upstream) and has not yet\n * finished terminating and/or waiting for its background processes to complete.\n */\n if (!this.runningProcesses.isOpen) {\n logger.debug(`Sync processor has been stopped, terminating sync for ${modelDefinition.name}`);\n resolve();\n return;\n }\n const limit = Math.min(maxRecordsToSync - recordsReceived, syncPageSize);\n /**\n * It's possible that `retrievePage` will fail.\n * If it does fail, continue merging the rest of the data,\n * and invoke the error handler for non-applicable data.\n */\n try {\n ({ items, nextToken, startedAt } = await this.retrievePage(modelDefinition, lastSync, nextToken, limit, filter, onTerminate));\n }\n catch (error) {\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: modelDefinition.name,\n operation: null,\n errorType: getSyncErrorType(error),\n process: ProcessName.sync,\n remoteModel: null,\n cause: error,\n });\n }\n catch (e) {\n logger.error('Sync error handler failed with:', e);\n }\n /**\n * If there's an error, this model fails, but the rest of the sync should\n * continue. To facilitate this, we explicitly mark this model as `done`\n * with no items and allow the loop to continue organically. This ensures\n * all callbacks (subscription messages) happen as normal, so anything\n * waiting on them knows the model is as done as it can be.\n */\n done = true;\n items = [];\n }\n recordsReceived += items.length;\n done =\n nextToken === null || recordsReceived >= maxRecordsToSync;\n observer.next({\n namespace,\n modelDefinition,\n items,\n done,\n startedAt,\n isFullSync: !lastSync,\n });\n } while (!done);\n resolve();\n });\n parentPromises.set(`${namespace}_${modelDefinition.name}`, promise);\n await promise;\n }, `adding model ${modelDefinition.name}`));\n Promise.all(allModelsReady).then(() => {\n observer.complete();\n });\n });\n return observable;\n }\n async stop() {\n logger.debug('stopping sync processor');\n await this.runningProcesses.close();\n await this.runningProcesses.open();\n logger.debug('sync processor stopped');\n }\n}\nexport { SyncProcessor };\n"],"names":[],"mappings":"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"}