{"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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"}