UNPKG

@aws-amplify/datastore

Version:

AppSyncLocal support for aws-amplify

1 lines • 37 kB
{"version":3,"file":"subscription.mjs","sources":["../../../../src/sync/processors/subscription.ts"],"sourcesContent":["import { InternalAPI } from '@aws-amplify/api/internals';\nimport { ConsoleLogger, Hub, fetchAuthSession, } from '@aws-amplify/core';\nimport { BackgroundProcessManager, Category, DataStoreAction, } from '@aws-amplify/core/internals/utils';\nimport { Observable } from 'rxjs';\nimport { CONTROL_MSG as PUBSUB_CONTROL_MSG } from '@aws-amplify/api-graphql';\nimport { ProcessName, } from '../../types';\nimport { RTFError, TransformerMutationType, buildSubscriptionGraphQLOperation, generateRTFRemediation, getAuthorizationRules, getModelAuthModes, getTokenForCustomAuth, getUserGroupsFromToken, predicateToGraphQLFilter, } from '../utils';\nimport { ModelPredicateCreator } from '../../predicates';\nimport { validatePredicate } from '../../util';\nimport { getSubscriptionErrorType } from './errorMaps';\nconst logger = new ConsoleLogger('DataStore');\nexport var CONTROL_MSG;\n(function (CONTROL_MSG) {\n CONTROL_MSG[\"CONNECTED\"] = \"CONNECTED\";\n})(CONTROL_MSG || (CONTROL_MSG = {}));\nexport var USER_CREDENTIALS;\n(function (USER_CREDENTIALS) {\n USER_CREDENTIALS[USER_CREDENTIALS[\"none\"] = 0] = \"none\";\n USER_CREDENTIALS[USER_CREDENTIALS[\"unauth\"] = 1] = \"unauth\";\n USER_CREDENTIALS[USER_CREDENTIALS[\"auth\"] = 2] = \"auth\";\n})(USER_CREDENTIALS || (USER_CREDENTIALS = {}));\nclass SubscriptionProcessor {\n constructor(schema, syncPredicates, amplifyConfig = {}, authModeStrategy, errorHandler, amplifyContext = {\n InternalAPI,\n }) {\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.buffer = [];\n this.runningProcesses = new BackgroundProcessManager();\n }\n buildSubscription(namespace, model, transformerMutationType, userCredentials, oidcTokenPayload, authMode, filterArg = false) {\n const { aws_appsync_authenticationType } = this.amplifyConfig;\n const { isOwner, ownerField, ownerValue } = this.getAuthorizationInfo(model, userCredentials, aws_appsync_authenticationType, oidcTokenPayload, authMode) || {};\n const [opType, opName, query] = buildSubscriptionGraphQLOperation(namespace, model, transformerMutationType, isOwner, ownerField, filterArg);\n return { authMode, opType, opName, query, isOwner, ownerField, ownerValue };\n }\n getAuthorizationInfo(model, userCredentials, defaultAuthType, oidcTokenPayload, authMode) {\n const rules = getAuthorizationRules(model);\n // Return null if user doesn't have proper credentials for private API with IAM auth\n const iamPrivateAuth = authMode === 'iam' &&\n rules.find(rule => rule.authStrategy === 'private' && rule.provider === 'iam');\n if (iamPrivateAuth && userCredentials === USER_CREDENTIALS.unauth) {\n return null;\n }\n // Group auth should take precedence over owner auth, so we are checking\n // if rule(s) have group authorization as well as if either the Cognito or\n // OIDC token has a groupClaim. If so, we are returning auth info before\n // any further owner-based auth checks.\n const groupAuthRules = rules.filter(rule => rule.authStrategy === 'groups' &&\n ['userPools', 'oidc'].includes(rule.provider));\n const validGroup = (authMode === 'oidc' || authMode === 'userPool') &&\n // eslint-disable-next-line array-callback-return\n groupAuthRules.find(groupAuthRule => {\n // validate token against groupClaim\n if (oidcTokenPayload) {\n const oidcUserGroups = getUserGroupsFromToken(oidcTokenPayload, groupAuthRule);\n return [...oidcUserGroups].find(userGroup => {\n return groupAuthRule.groups.find(group => group === userGroup);\n });\n }\n });\n if (validGroup) {\n return {\n authMode,\n isOwner: false,\n };\n }\n let ownerAuthInfo;\n if (ownerAuthInfo) {\n return ownerAuthInfo;\n }\n // Owner auth needs additional values to be returned in order to create the subscription with\n // the correct parameters so we are getting the owner value from the OIDC token via the\n // identityClaim from the auth rule.\n const oidcOwnerAuthRules = authMode === 'oidc' || authMode === 'userPool'\n ? rules.filter(rule => rule.authStrategy === 'owner' &&\n (rule.provider === 'oidc' || rule.provider === 'userPools'))\n : [];\n oidcOwnerAuthRules.forEach(ownerAuthRule => {\n const ownerValue = oidcTokenPayload?.[ownerAuthRule.identityClaim];\n const singleOwner = model.fields[ownerAuthRule.ownerField]?.isArray !== true;\n const isOwnerArgRequired = singleOwner && !ownerAuthRule.areSubscriptionsPublic;\n if (ownerValue) {\n ownerAuthInfo = {\n authMode,\n isOwner: isOwnerArgRequired,\n ownerField: ownerAuthRule.ownerField,\n ownerValue: String(ownerValue),\n };\n }\n });\n if (ownerAuthInfo) {\n return ownerAuthInfo;\n }\n // Fallback: return authMode or default auth type\n return {\n authMode: authMode || defaultAuthType,\n isOwner: false,\n };\n }\n hubQueryCompletionListener(completed, capsule) {\n const { payload: { event }, } = capsule;\n if (event === PUBSUB_CONTROL_MSG.SUBSCRIPTION_ACK) {\n completed();\n }\n }\n start() {\n this.runningProcesses =\n this.runningProcesses || new BackgroundProcessManager();\n const ctlObservable = new Observable(observer => {\n const promises = [];\n // Creating subs for each model/operation combo so they can be unsubscribed\n // independently, since the auth retry behavior is asynchronous.\n let subscriptions = {};\n let oidcTokenPayload;\n let userCredentials = USER_CREDENTIALS.none;\n this.runningProcesses.add(async () => {\n try {\n // retrieving current AWS Credentials\n const credentials = (await fetchAuthSession()).tokens?.accessToken;\n userCredentials = credentials\n ? USER_CREDENTIALS.auth\n : USER_CREDENTIALS.unauth;\n }\n catch (err) {\n // best effort to get AWS credentials\n }\n try {\n // retrieving current token info from Cognito UserPools\n const session = await fetchAuthSession();\n oidcTokenPayload = session.tokens?.idToken?.payload;\n }\n catch (err) {\n // best effort to get jwt from Cognito\n }\n Object.values(this.schema.namespaces).forEach(namespace => {\n Object.values(namespace.models)\n .filter(({ syncable }) => syncable)\n .forEach(modelDefinition => this.runningProcesses.isOpen &&\n this.runningProcesses.add(async () => {\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 // subscriptions are created only based on the READ auth mode(s)\n const readAuthModes = modelAuthModes.READ;\n subscriptions = {\n ...subscriptions,\n [modelDefinition.name]: {\n [TransformerMutationType.CREATE]: [],\n [TransformerMutationType.UPDATE]: [],\n [TransformerMutationType.DELETE]: [],\n },\n };\n const operations = [\n TransformerMutationType.CREATE,\n TransformerMutationType.UPDATE,\n TransformerMutationType.DELETE,\n ];\n const operationAuthModeAttempts = {\n [TransformerMutationType.CREATE]: 0,\n [TransformerMutationType.UPDATE]: 0,\n [TransformerMutationType.DELETE]: 0,\n };\n const predicatesGroup = ModelPredicateCreator.getPredicates(this.syncPredicates.get(modelDefinition), false);\n const addFilterArg = predicatesGroup !== undefined;\n // Retry subscriptions that failed for one of the following reasons:\n // 1. unauthorized - retry with next auth mode (if available)\n // 2. RTF error - retry without sending filter arg. (filtering will fall back to clientside)\n const subscriptionRetry = async (operation, addFilter = addFilterArg) => {\n const { opType: transformerMutationType, opName, query, isOwner, ownerField, ownerValue, authMode, } = this.buildSubscription(namespace, modelDefinition, operation, userCredentials, oidcTokenPayload, readAuthModes[operationAuthModeAttempts[operation]], addFilter);\n const authToken = await getTokenForCustomAuth(authMode, this.amplifyConfig);\n const variables = {};\n const customUserAgentDetails = {\n category: Category.DataStore,\n action: DataStoreAction.Subscribe,\n };\n if (addFilter && predicatesGroup) {\n variables.filter =\n predicateToGraphQLFilter(predicatesGroup);\n }\n if (isOwner) {\n if (!ownerValue) {\n observer.error('Owner field required, sign in is needed in order to perform this operation');\n return;\n }\n variables[ownerField] = ownerValue;\n }\n logger.debug(`Attempting ${operation} subscription with authMode: ${readAuthModes[operationAuthModeAttempts[operation]]}`);\n const queryObservable = this.amplifyContext.InternalAPI.graphql({\n query,\n variables,\n ...{ authMode },\n authToken,\n }, undefined, customUserAgentDetails);\n let subscriptionReadyCallback;\n // TODO: consider onTerminate.then(() => API.cancel(...))\n subscriptions[modelDefinition.name][transformerMutationType].push(queryObservable.subscribe({\n next: result => {\n const { data, errors } = result;\n if (Array.isArray(errors) && errors.length > 0) {\n const messages = errors.map(({ message }) => message);\n logger.warn(`Skipping incoming subscription. Messages: ${messages.join('\\n')}`);\n this.drainBuffer();\n return;\n }\n const resolvedPredicatesGroup = ModelPredicateCreator.getPredicates(this.syncPredicates.get(modelDefinition), false);\n const { [opName]: record } = data;\n // checking incoming subscription against syncPredicate.\n // once AppSync implements filters on subscriptions, we'll be\n // able to set these when establishing the subscription instead.\n // Until then, we'll need to filter inbound\n if (this.passesPredicateValidation(record, resolvedPredicatesGroup)) {\n this.pushToBuffer(transformerMutationType, modelDefinition, record);\n }\n this.drainBuffer();\n },\n error: async (subscriptionError) => {\n const { errors: [{ message = '' } = {}], } = ({\n // eslint-disable-next-line no-empty-pattern\n errors: [],\n } = subscriptionError);\n const isRTFError = \n // only attempt catch if a filter variable was added to the subscription query\n addFilter &&\n this.catchRTFError(message, modelDefinition, predicatesGroup);\n // Catch RTF errors\n if (isRTFError) {\n // Unsubscribe and clear subscription array for model/operation\n subscriptions[modelDefinition.name][transformerMutationType].forEach(subscription => subscription.unsubscribe());\n subscriptions[modelDefinition.name][transformerMutationType] = [];\n // retry subscription connection without filter\n subscriptionRetry(operation, false);\n return;\n }\n if (message.includes(PUBSUB_CONTROL_MSG.REALTIME_SUBSCRIPTION_INIT_ERROR) ||\n message.includes(PUBSUB_CONTROL_MSG.CONNECTION_FAILED)) {\n // Unsubscribe and clear subscription array for model/operation\n subscriptions[modelDefinition.name][transformerMutationType].forEach(subscription => subscription.unsubscribe());\n subscriptions[modelDefinition.name][transformerMutationType] = [];\n operationAuthModeAttempts[operation]++;\n if (operationAuthModeAttempts[operation] >=\n readAuthModes.length) {\n // last auth mode retry. Continue with error\n logger.debug(`${operation} subscription failed with authMode: ${readAuthModes[operationAuthModeAttempts[operation] - 1]}`);\n }\n else {\n // retry with different auth mode. Do not trigger\n // observer error or error handler\n logger.debug(`${operation} subscription failed with authMode: ${readAuthModes[operationAuthModeAttempts[operation] - 1]}. Retrying with authMode: ${readAuthModes[operationAuthModeAttempts[operation]]}`);\n subscriptionRetry(operation);\n return;\n }\n }\n logger.warn('subscriptionError', message);\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,\n model: modelDefinition.name,\n operation,\n errorType: getSubscriptionErrorType(subscriptionError),\n process: ProcessName.subscribe,\n remoteModel: null,\n cause: subscriptionError,\n });\n }\n catch (e) {\n logger.error('Subscription error handler failed with:', e);\n }\n if (typeof subscriptionReadyCallback === 'function') {\n subscriptionReadyCallback();\n }\n if (message.includes('\"errorType\":\"Unauthorized\"') ||\n message.includes('\"errorType\":\"OperationDisabled\"')) {\n return;\n }\n observer.error(message);\n },\n }));\n promises.push((async () => {\n let boundFunction;\n let removeBoundFunctionListener;\n await new Promise(resolve => {\n subscriptionReadyCallback = resolve;\n boundFunction = this.hubQueryCompletionListener.bind(this, resolve);\n removeBoundFunctionListener = Hub.listen('api', boundFunction);\n });\n removeBoundFunctionListener();\n })());\n };\n operations.forEach(op => subscriptionRetry(op));\n }));\n });\n this.runningProcesses.isOpen &&\n this.runningProcesses.add(() => Promise.all(promises).then(() => {\n observer.next(CONTROL_MSG.CONNECTED);\n }));\n }, 'subscription processor new subscriber');\n return this.runningProcesses.addCleaner(async () => {\n Object.keys(subscriptions).forEach(modelName => {\n subscriptions[modelName][TransformerMutationType.CREATE].forEach(subscription => {\n subscription.unsubscribe();\n });\n subscriptions[modelName][TransformerMutationType.UPDATE].forEach(subscription => {\n subscription.unsubscribe();\n });\n subscriptions[modelName][TransformerMutationType.DELETE].forEach(subscription => {\n subscription.unsubscribe();\n });\n });\n });\n });\n const dataObservable = new Observable(observer => {\n this.dataObserver = observer;\n this.drainBuffer();\n return this.runningProcesses.addCleaner(async () => {\n this.dataObserver = null;\n });\n });\n return [ctlObservable, dataObservable];\n }\n async stop() {\n await this.runningProcesses.close();\n await this.runningProcesses.open();\n }\n passesPredicateValidation(record, predicatesGroup) {\n if (!predicatesGroup) {\n return true;\n }\n const { predicates, type } = predicatesGroup;\n return validatePredicate(record, type, predicates);\n }\n pushToBuffer(transformerMutationType, modelDefinition, data) {\n this.buffer.push([transformerMutationType, modelDefinition, data]);\n }\n drainBuffer() {\n if (this.dataObserver) {\n this.buffer.forEach(data => {\n this.dataObserver.next(data);\n });\n this.buffer = [];\n }\n }\n /**\n * @returns true if the service returned an RTF subscription error\n * @remarks logs a warning with remediation instructions\n *\n */\n catchRTFError(message, modelDefinition, predicatesGroup) {\n const header = 'Backend subscriptions filtering error.\\n' +\n 'Subscriptions filtering will be applied clientside.\\n';\n const messageErrorTypeMap = {\n 'UnknownArgument: Unknown field argument filter': RTFError.UnknownField,\n 'Filters exceed maximum attributes limit': RTFError.MaxAttributes,\n 'Filters combination exceed maximum limit': RTFError.MaxCombinations,\n 'filter uses same fieldName multiple time': RTFError.RepeatedFieldname,\n \"The variables input contains a field name 'not'\": RTFError.NotGroup,\n 'The variables input contains a field that is not defined for input object type': RTFError.FieldNotInType,\n };\n const [_errorMsg, errorType] = Object.entries(messageErrorTypeMap).find(([errorMsg]) => message.includes(errorMsg)) || [];\n if (errorType !== undefined) {\n const remediationMessage = generateRTFRemediation(errorType, modelDefinition, predicatesGroup);\n logger.warn(`${header}\\n${message}\\n${remediationMessage}`);\n return true;\n }\n return false;\n }\n}\nexport { SubscriptionProcessor };\n"],"names":["PUBSUB_CONTROL_MSG"],"mappings":"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"}