{"version":3,"file":"index.mjs","sources":["../../../../src/Providers/AWSWebSocketProvider/index.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { Observable } from 'rxjs';\nimport { GraphQLError } from 'graphql';\nimport { ConsoleLogger, Hub } from '@aws-amplify/core';\nimport { NonRetryableError, amplifyUuid, base64Encoder, isNonRetryableError, jitteredExponentialRetry, } from '@aws-amplify/core/internals/utils';\nimport { CONTROL_MSG, ConnectionState, } from '../../types/PubSub';\nimport { AMPLIFY_SYMBOL, CONNECTION_INIT_TIMEOUT, CONNECTION_STATE_CHANGE, DEFAULT_KEEP_ALIVE_ALERT_TIMEOUT, DEFAULT_KEEP_ALIVE_HEARTBEAT_TIMEOUT, MAX_DELAY_MS, MESSAGE_TYPES, NON_RETRYABLE_CODES, NON_RETRYABLE_ERROR_TYPES, SOCKET_STATUS, START_ACK_TIMEOUT, SUBSCRIPTION_STATUS, } from '../constants';\nimport { CONNECTION_CHANGE, ConnectionStateMonitor, } from '../../utils/ConnectionStateMonitor';\nimport { ReconnectEvent, ReconnectionMonitor, } from '../../utils/ReconnectionMonitor';\nimport { additionalHeadersFromOptions, queryParamsFromCustomHeaders, realtimeUrlWithQueryString, } from './appsyncUrl';\nimport { awsRealTimeHeaderBasedAuth } from './authHeaders';\nconst dispatchApiEvent = (payload) => {\n    Hub.dispatch('api', payload, 'PubSub', AMPLIFY_SYMBOL);\n};\nexport class AWSWebSocketProvider {\n    constructor(args) {\n        this.subscriptionObserverMap = new Map();\n        this.allowNoSubscriptions = false;\n        this.socketStatus = SOCKET_STATUS.CLOSED;\n        this.keepAliveTimestamp = Date.now();\n        this.promiseArray = [];\n        this.connectionStateMonitor = new ConnectionStateMonitor();\n        this.reconnectionMonitor = new ReconnectionMonitor();\n        /**\n         * Open WebSocket connection & perform handshake\n         * Ref: https://docs.aws.amazon.com/appsync/latest/devguide/real-time-websocket-client.html#appsynclong-real-time-websocket-client-implementation-guide-for-graphql-subscriptions\n         *\n         * @param subprotocol -\n         */\n        this._establishConnection = async (awsRealTimeUrl, subprotocol) => {\n            this.logger.debug(`Establishing WebSocket connection to ${awsRealTimeUrl}`);\n            try {\n                await this._openConnection(awsRealTimeUrl, subprotocol);\n                await this._initiateHandshake();\n            }\n            catch (err) {\n                const { errorType, errorCode } = err;\n                if (NON_RETRYABLE_CODES.includes(errorCode) ||\n                    // Event API does not currently return `errorCode`. This may change in the future.\n                    // For now fall back to also checking known non-retryable error types\n                    NON_RETRYABLE_ERROR_TYPES.includes(errorType)) {\n                    throw new NonRetryableError(errorType);\n                }\n                else if (errorType) {\n                    throw new Error(errorType);\n                }\n                else {\n                    throw err;\n                }\n            }\n        };\n        this.logger = new ConsoleLogger(args.providerName);\n        this.wsProtocolName = args.wsProtocolName;\n        this.wsConnectUri = args.connectUri;\n        this.connectionStateMonitorSubscription =\n            this._startConnectionStateMonitoring();\n    }\n    /**\n     * Mark the socket closed and release all active listeners\n     */\n    close() {\n        // Mark the socket closed both in status and the connection monitor\n        this.socketStatus = SOCKET_STATUS.CLOSED;\n        this.connectionStateMonitor.record(CONNECTION_CHANGE.CONNECTION_FAILED);\n        // Turn off the subscription monitor Hub publishing\n        this.connectionStateMonitorSubscription.unsubscribe();\n        // Complete all reconnect observers\n        this.reconnectionMonitor.close();\n        return new Promise((resolve, reject) => {\n            if (this.awsRealTimeSocket) {\n                this.awsRealTimeSocket.onclose = (_) => {\n                    this._closeSocket();\n                    this.subscriptionObserverMap = new Map();\n                    this.awsRealTimeSocket = undefined;\n                    resolve();\n                };\n                this.awsRealTimeSocket.onerror = (err) => {\n                    reject(err);\n                };\n                this.awsRealTimeSocket.close();\n            }\n            else {\n                resolve();\n            }\n        });\n    }\n    subscribe(options, customUserAgentDetails) {\n        return new Observable(observer => {\n            if (!options?.appSyncGraphqlEndpoint) {\n                observer.error({\n                    errors: [\n                        {\n                            ...new GraphQLError(`Subscribe only available for AWS AppSync endpoint`),\n                        },\n                    ],\n                });\n                observer.complete();\n                return;\n            }\n            let subscriptionStartInProgress = false;\n            const subscriptionId = amplifyUuid();\n            const startSubscription = () => {\n                if (!subscriptionStartInProgress) {\n                    subscriptionStartInProgress = true;\n                    this._startSubscriptionWithAWSAppSyncRealTime({\n                        options,\n                        observer,\n                        subscriptionId,\n                        customUserAgentDetails,\n                    })\n                        .catch(err => {\n                        this.logger.debug(`${CONTROL_MSG.REALTIME_SUBSCRIPTION_INIT_ERROR}: ${err}`);\n                        this._closeSocket();\n                    })\n                        .finally(() => {\n                        subscriptionStartInProgress = false;\n                    });\n                }\n            };\n            // Add an observable to the reconnection list to manage reconnection for this subscription\n            const reconnectSubscription = new Observable(reconnectSubscriptionObserver => {\n                this.reconnectionMonitor.addObserver(reconnectSubscriptionObserver);\n            }).subscribe(() => {\n                startSubscription();\n            });\n            startSubscription();\n            return async () => {\n                await this._cleanupSubscription(subscriptionId, reconnectSubscription);\n            };\n        });\n    }\n    async connect(options) {\n        if (this.socketStatus === SOCKET_STATUS.READY) {\n            return;\n        }\n        await this._connectWebSocket(options);\n    }\n    async publish(options, customUserAgentDetails) {\n        if (this.socketStatus !== SOCKET_STATUS.READY) {\n            throw new Error('Subscription has not been initialized');\n        }\n        return this._publishMessage(options, customUserAgentDetails);\n    }\n    async _connectWebSocket(options) {\n        const { apiKey, appSyncGraphqlEndpoint, authenticationType, region } = options;\n        const { additionalCustomHeaders } = await additionalHeadersFromOptions(options);\n        this.connectionStateMonitor.record(CONNECTION_CHANGE.OPENING_CONNECTION);\n        await this._initializeWebSocketConnection({\n            apiKey,\n            appSyncGraphqlEndpoint,\n            authenticationType,\n            region,\n            additionalCustomHeaders,\n        });\n    }\n    async _publishMessage(options, customUserAgentDetails) {\n        const subscriptionId = amplifyUuid();\n        const { additionalCustomHeaders, libraryConfigHeaders } = await additionalHeadersFromOptions(options);\n        const serializedSubscriptionMessage = await this._prepareSubscriptionPayload({\n            options,\n            subscriptionId,\n            customUserAgentDetails,\n            additionalCustomHeaders,\n            libraryConfigHeaders,\n            publish: true,\n        });\n        return new Promise((resolve, reject) => {\n            if (this.awsRealTimeSocket) {\n                const publishListener = (event) => {\n                    const data = JSON.parse(event.data);\n                    if (data.id === subscriptionId && data.type === 'publish_success') {\n                        this.awsRealTimeSocket &&\n                            this.awsRealTimeSocket.removeEventListener('message', publishListener);\n                        cleanup();\n                        resolve();\n                    }\n                    if (data.errors && data.errors.length > 0) {\n                        const errorTypes = data.errors.map((error) => error.errorType);\n                        cleanup();\n                        reject(new Error(`Publish errors: ${errorTypes.join(', ')}`));\n                    }\n                };\n                const errorListener = (error) => {\n                    cleanup();\n                    reject(new Error(`WebSocket error: ${error}`));\n                };\n                const closeListener = () => {\n                    cleanup();\n                    reject(new Error('WebSocket is closed'));\n                };\n                const cleanup = () => {\n                    this.awsRealTimeSocket?.removeEventListener('message', publishListener);\n                    this.awsRealTimeSocket?.removeEventListener('error', errorListener);\n                    this.awsRealTimeSocket?.removeEventListener('close', closeListener);\n                };\n                this.awsRealTimeSocket.addEventListener('message', publishListener);\n                this.awsRealTimeSocket.addEventListener('error', errorListener);\n                this.awsRealTimeSocket.addEventListener('close', closeListener);\n                this.awsRealTimeSocket.send(serializedSubscriptionMessage);\n            }\n            else {\n                reject(new Error('WebSocket is not connected'));\n            }\n        });\n    }\n    async _cleanupSubscription(subscriptionId, reconnectSubscription) {\n        // Cleanup reconnection subscription\n        reconnectSubscription?.unsubscribe();\n        // Cleanup after unsubscribing or observer.complete was called after _startSubscriptionWithAWSAppSyncRealTime\n        try {\n            // Waiting that subscription has been connected before trying to unsubscribe\n            await this._waitForSubscriptionToBeConnected(subscriptionId);\n            const { subscriptionState } = this.subscriptionObserverMap.get(subscriptionId) || {};\n            if (!subscriptionState) {\n                // subscription already unsubscribed\n                return;\n            }\n            if (subscriptionState === SUBSCRIPTION_STATUS.CONNECTED) {\n                this._sendUnsubscriptionMessage(subscriptionId);\n            }\n            else {\n                throw new Error('Subscription never connected');\n            }\n        }\n        catch (err) {\n            this.logger.debug(`Error while unsubscribing ${err}`);\n        }\n        finally {\n            this._removeSubscriptionObserver(subscriptionId);\n        }\n    }\n    // Monitor the connection state and pass changes along to Hub\n    _startConnectionStateMonitoring() {\n        return this.connectionStateMonitor.connectionStateObservable.subscribe(connectionState => {\n            dispatchApiEvent({\n                event: CONNECTION_STATE_CHANGE,\n                data: {\n                    provider: this,\n                    connectionState,\n                },\n                message: `Connection state is ${connectionState}`,\n            });\n            this.connectionState = connectionState;\n            // Trigger START_RECONNECT when the connection is disrupted\n            if (connectionState === ConnectionState.ConnectionDisrupted) {\n                this.reconnectionMonitor.record(ReconnectEvent.START_RECONNECT);\n            }\n            // Trigger HALT_RECONNECT to halt reconnection attempts when the state is anything other than\n            // ConnectionDisrupted or Connecting\n            if ([\n                ConnectionState.Connected,\n                ConnectionState.ConnectedPendingDisconnect,\n                ConnectionState.ConnectedPendingKeepAlive,\n                ConnectionState.ConnectedPendingNetwork,\n                ConnectionState.ConnectionDisruptedPendingNetwork,\n                ConnectionState.Disconnected,\n            ].includes(connectionState)) {\n                this.reconnectionMonitor.record(ReconnectEvent.HALT_RECONNECT);\n            }\n        });\n    }\n    async _startSubscriptionWithAWSAppSyncRealTime({ options, observer, subscriptionId, customUserAgentDetails, }) {\n        const { query, variables } = options;\n        this.subscriptionObserverMap.set(subscriptionId, {\n            observer,\n            query: query ?? '',\n            variables: variables ?? {},\n            subscriptionState: SUBSCRIPTION_STATUS.PENDING,\n            startAckTimeoutId: undefined,\n        });\n        const { additionalCustomHeaders, libraryConfigHeaders } = await additionalHeadersFromOptions(options);\n        const serializedSubscriptionMessage = await this._prepareSubscriptionPayload({\n            options,\n            subscriptionId,\n            customUserAgentDetails,\n            additionalCustomHeaders,\n            libraryConfigHeaders,\n        });\n        try {\n            await this._connectWebSocket(options);\n        }\n        catch (err) {\n            this._logStartSubscriptionError(subscriptionId, observer, err);\n            return;\n        }\n        // Potential race condition can occur when unsubscribe is called during _initializeWebSocketConnection.\n        // E.g.unsubscribe gets invoked prior to finishing WebSocket handshake or START_ACK.\n        // Both subscriptionFailedCallback and subscriptionReadyCallback are used to synchronized this.\n        const { subscriptionFailedCallback, subscriptionReadyCallback } = this.subscriptionObserverMap.get(subscriptionId) ?? {};\n        // This must be done before sending the message in order to be listening immediately\n        this.subscriptionObserverMap.set(subscriptionId, {\n            observer,\n            subscriptionState: SUBSCRIPTION_STATUS.PENDING,\n            query: query ?? '',\n            variables: variables ?? {},\n            subscriptionReadyCallback,\n            subscriptionFailedCallback,\n            startAckTimeoutId: setTimeout(() => {\n                this._timeoutStartSubscriptionAck(subscriptionId);\n            }, START_ACK_TIMEOUT),\n        });\n        if (this.awsRealTimeSocket) {\n            this.awsRealTimeSocket.send(serializedSubscriptionMessage);\n        }\n    }\n    // Log logic for start subscription failures\n    _logStartSubscriptionError(subscriptionId, observer, err) {\n        this.logger.debug({ err });\n        const message = String(err.message ?? '');\n        // Resolving to give the state observer time to propogate the update\n        this._closeSocket();\n        // Capture the error only when the network didn't cause disruption\n        if (this.connectionState !== ConnectionState.ConnectionDisruptedPendingNetwork) {\n            // When the error is non-retriable, error out the observable\n            if (isNonRetryableError(err)) {\n                observer.error({\n                    errors: [\n                        {\n                            ...new GraphQLError(`${CONTROL_MSG.CONNECTION_FAILED}: ${message}`),\n                        },\n                    ],\n                });\n            }\n            else {\n                this.logger.debug(`${CONTROL_MSG.CONNECTION_FAILED}: ${message}`);\n            }\n            const { subscriptionFailedCallback } = this.subscriptionObserverMap.get(subscriptionId) || {};\n            // Notify concurrent unsubscription\n            if (typeof subscriptionFailedCallback === 'function') {\n                subscriptionFailedCallback();\n            }\n        }\n    }\n    // Waiting that subscription has been connected before trying to unsubscribe\n    async _waitForSubscriptionToBeConnected(subscriptionId) {\n        const subscriptionObserver = this.subscriptionObserverMap.get(subscriptionId);\n        if (subscriptionObserver) {\n            const { subscriptionState } = subscriptionObserver;\n            // This in case unsubscribe is invoked before sending start subscription message\n            if (subscriptionState === SUBSCRIPTION_STATUS.PENDING) {\n                return new Promise((resolve, reject) => {\n                    const { observer, subscriptionState: observedSubscriptionState, variables, query, } = subscriptionObserver;\n                    this.subscriptionObserverMap.set(subscriptionId, {\n                        observer,\n                        subscriptionState: observedSubscriptionState,\n                        variables,\n                        query,\n                        subscriptionReadyCallback: resolve,\n                        subscriptionFailedCallback: reject,\n                    });\n                });\n            }\n        }\n    }\n    _sendUnsubscriptionMessage(subscriptionId) {\n        try {\n            if (this.awsRealTimeSocket &&\n                this.awsRealTimeSocket.readyState === WebSocket.OPEN &&\n                this.socketStatus === SOCKET_STATUS.READY) {\n                // Preparing unsubscribe message to stop receiving messages for that subscription\n                const unsubscribeMessage = this._unsubscribeMessage(subscriptionId);\n                const stringToAWSRealTime = JSON.stringify(unsubscribeMessage);\n                this.awsRealTimeSocket.send(stringToAWSRealTime);\n            }\n        }\n        catch (err) {\n            // If GQL_STOP is not sent because of disconnection issue, then there is nothing the client can do\n            this.logger.debug({ err });\n        }\n    }\n    _removeSubscriptionObserver(subscriptionId) {\n        this.subscriptionObserverMap.delete(subscriptionId);\n        // Verifying 1000ms after removing subscription in case there are new subscription unmount/mount\n        if (!this.allowNoSubscriptions) {\n            setTimeout(this._closeSocketIfRequired.bind(this), 1000);\n        }\n    }\n    _closeSocketIfRequired() {\n        if (this.subscriptionObserverMap.size > 0) {\n            // Active subscriptions on the WebSocket\n            return;\n        }\n        if (!this.awsRealTimeSocket) {\n            this.socketStatus = SOCKET_STATUS.CLOSED;\n            return;\n        }\n        this.connectionStateMonitor.record(CONNECTION_CHANGE.CLOSING_CONNECTION);\n        if (this.awsRealTimeSocket.bufferedAmount > 0) {\n            // Still data on the WebSocket\n            setTimeout(this._closeSocketIfRequired.bind(this), 1000);\n        }\n        else {\n            this.logger.debug('closing WebSocket...');\n            const tempSocket = this.awsRealTimeSocket;\n            // Cleaning callbacks to avoid race condition, socket still exists\n            tempSocket.onclose = null;\n            tempSocket.onerror = null;\n            tempSocket.close(1000);\n            this.awsRealTimeSocket = undefined;\n            this.socketStatus = SOCKET_STATUS.CLOSED;\n            this._closeSocket();\n        }\n    }\n    maintainKeepAlive() {\n        this.keepAliveTimestamp = Date.now();\n    }\n    keepAliveHeartbeat(connectionTimeoutMs) {\n        const currentTime = Date.now();\n        // Check for missed KA message\n        if (currentTime - this.keepAliveTimestamp >\n            DEFAULT_KEEP_ALIVE_ALERT_TIMEOUT) {\n            this.connectionStateMonitor.record(CONNECTION_CHANGE.KEEP_ALIVE_MISSED);\n        }\n        else {\n            this.connectionStateMonitor.record(CONNECTION_CHANGE.KEEP_ALIVE);\n        }\n        // Recognize we are disconnected if we haven't seen messages in the keep alive timeout period\n        if (currentTime - this.keepAliveTimestamp > connectionTimeoutMs) {\n            this._errorDisconnect(CONTROL_MSG.TIMEOUT_DISCONNECT);\n        }\n    }\n    _handleIncomingSubscriptionMessage(message) {\n        if (typeof message.data !== 'string') {\n            return;\n        }\n        const [isData, data] = this._handleSubscriptionData(message);\n        if (isData) {\n            this.maintainKeepAlive();\n            return;\n        }\n        const { type, id, payload } = data;\n        const { observer = null, query = '', variables = {}, startAckTimeoutId, subscriptionReadyCallback, subscriptionFailedCallback, } = this.subscriptionObserverMap.get(id) || {};\n        if (type === MESSAGE_TYPES.GQL_START_ACK ||\n            type === MESSAGE_TYPES.EVENT_SUBSCRIBE_ACK) {\n            this.logger.debug(`subscription ready for ${JSON.stringify({ query, variables })}`);\n            if (typeof subscriptionReadyCallback === 'function') {\n                subscriptionReadyCallback();\n            }\n            if (startAckTimeoutId)\n                clearTimeout(startAckTimeoutId);\n            dispatchApiEvent({\n                event: CONTROL_MSG.SUBSCRIPTION_ACK,\n                data: { query, variables },\n                message: 'Connection established for subscription',\n            });\n            const subscriptionState = SUBSCRIPTION_STATUS.CONNECTED;\n            if (observer) {\n                this.subscriptionObserverMap.set(id, {\n                    observer,\n                    query,\n                    variables,\n                    startAckTimeoutId: undefined,\n                    subscriptionState,\n                    subscriptionReadyCallback,\n                    subscriptionFailedCallback,\n                });\n            }\n            this.connectionStateMonitor.record(CONNECTION_CHANGE.CONNECTION_ESTABLISHED);\n            return;\n        }\n        if (type === MESSAGE_TYPES.GQL_CONNECTION_KEEP_ALIVE) {\n            this.maintainKeepAlive();\n            return;\n        }\n        if (type === MESSAGE_TYPES.GQL_ERROR ||\n            type === MESSAGE_TYPES.EVENT_SUBSCRIBE_ERROR) {\n            const subscriptionState = SUBSCRIPTION_STATUS.FAILED;\n            if (observer) {\n                this.subscriptionObserverMap.set(id, {\n                    observer,\n                    query,\n                    variables,\n                    startAckTimeoutId,\n                    subscriptionReadyCallback,\n                    subscriptionFailedCallback,\n                    subscriptionState,\n                });\n                let errorMessage = JSON.stringify(payload ?? data);\n                let isAuthError = false;\n                const AUTH_ERROR_TYPES = [\n                    'UnauthorizedException',\n                    'Unauthorized',\n                    'NotAuthorizedException',\n                ];\n                if (type === MESSAGE_TYPES.EVENT_SUBSCRIBE_ERROR) {\n                    const { errors } = JSON.parse(String(message.data));\n                    if (Array.isArray(errors) && errors.length > 0) {\n                        const error = errors[0];\n                        errorMessage = `${error.errorType}: ${error.message}`;\n                        isAuthError =\n                            AUTH_ERROR_TYPES.includes(error.errorType) ||\n                                error.message?.includes('Token expired');\n                    }\n                }\n                else if (type === MESSAGE_TYPES.GQL_ERROR &&\n                    payload &&\n                    typeof payload === 'object') {\n                    const { errors } = payload;\n                    if (Array.isArray(errors) && errors.length > 0) {\n                        const error = errors[0];\n                        isAuthError =\n                            AUTH_ERROR_TYPES.includes(error.errorType) ||\n                                error.message?.includes('Token expired');\n                    }\n                }\n                this.logger.debug(`${CONTROL_MSG.CONNECTION_FAILED}: ${errorMessage}`);\n                // On auth errors, close the socket to trigger reconnection with fresh tokens.\n                // The onclose handler fires _errorDisconnect → CONNECTION_CLOSED, which the\n                // ConnectionStateMonitor picks up as ConnectionDisrupted and the\n                // ReconnectionMonitor reconnects with refreshed credentials.\n                if (isAuthError && this.awsRealTimeSocket) {\n                    this.logger.warn('Subscription failed due to auth error, closing WebSocket to trigger reconnection with fresh tokens');\n                    this.awsRealTimeSocket.close(1000, 'Auth error - reconnecting');\n                }\n                observer.error({\n                    errors: [\n                        {\n                            ...new GraphQLError(`${CONTROL_MSG.CONNECTION_FAILED}: ${errorMessage}`),\n                        },\n                    ],\n                });\n                if (startAckTimeoutId)\n                    clearTimeout(startAckTimeoutId);\n                if (typeof subscriptionFailedCallback === 'function') {\n                    subscriptionFailedCallback();\n                }\n            }\n        }\n    }\n    _errorDisconnect(msg) {\n        this.logger.debug(`Disconnect error: ${msg}`);\n        if (this.awsRealTimeSocket) {\n            this._closeSocket();\n            this.awsRealTimeSocket.close();\n        }\n        this.socketStatus = SOCKET_STATUS.CLOSED;\n    }\n    _closeSocket() {\n        if (this.keepAliveHeartbeatIntervalId) {\n            clearInterval(this.keepAliveHeartbeatIntervalId);\n            this.keepAliveHeartbeatIntervalId = undefined;\n        }\n        this.connectionStateMonitor.record(CONNECTION_CHANGE.CLOSED);\n    }\n    _timeoutStartSubscriptionAck(subscriptionId) {\n        const subscriptionObserver = this.subscriptionObserverMap.get(subscriptionId);\n        if (subscriptionObserver) {\n            const { observer, query, variables } = subscriptionObserver;\n            if (!observer) {\n                return;\n            }\n            this.subscriptionObserverMap.set(subscriptionId, {\n                observer,\n                query,\n                variables,\n                subscriptionState: SUBSCRIPTION_STATUS.FAILED,\n            });\n            this._closeSocket();\n            this.logger.debug('timeoutStartSubscription', JSON.stringify({ query, variables }));\n        }\n    }\n    _initializeWebSocketConnection({ appSyncGraphqlEndpoint, authenticationType, apiKey, region, additionalCustomHeaders, }) {\n        if (this.socketStatus === SOCKET_STATUS.READY) {\n            return;\n        }\n        // TODO(Eslint): refactor to now use async function as the promise executor\n        // eslint-disable-next-line no-async-promise-executor\n        return new Promise(async (resolve, reject) => {\n            this.promiseArray.push({ res: resolve, rej: reject });\n            if (this.socketStatus === SOCKET_STATUS.CLOSED) {\n                try {\n                    this.socketStatus = SOCKET_STATUS.CONNECTING;\n                    // Empty payload on connect\n                    const payloadString = '{}';\n                    const authHeader = await awsRealTimeHeaderBasedAuth({\n                        authenticationType,\n                        payload: payloadString,\n                        canonicalUri: this.wsConnectUri,\n                        apiKey,\n                        appSyncGraphqlEndpoint,\n                        region,\n                        additionalCustomHeaders,\n                    });\n                    const headerString = authHeader ? JSON.stringify(authHeader) : '';\n                    // base64url-encoded string\n                    const encodedHeader = base64Encoder.convert(headerString, {\n                        urlSafe: true,\n                        skipPadding: true,\n                    });\n                    const authTokenSubprotocol = `header-${encodedHeader}`;\n                    const queryParams = queryParamsFromCustomHeaders(additionalCustomHeaders);\n                    const awsRealTimeUrl = realtimeUrlWithQueryString(appSyncGraphqlEndpoint, queryParams);\n                    await this._establishRetryableConnection(awsRealTimeUrl, authTokenSubprotocol);\n                    this.promiseArray.forEach(({ res }) => {\n                        this.logger.debug('Notifying connection successful');\n                        res();\n                    });\n                    this.socketStatus = SOCKET_STATUS.READY;\n                    this.promiseArray = [];\n                }\n                catch (err) {\n                    this.logger.debug('Connection exited with', err);\n                    this.promiseArray.forEach(({ rej }) => {\n                        rej(err);\n                    });\n                    this.promiseArray = [];\n                    if (this.awsRealTimeSocket &&\n                        this.awsRealTimeSocket.readyState === WebSocket.OPEN) {\n                        this.awsRealTimeSocket.close(3001);\n                    }\n                    this.awsRealTimeSocket = undefined;\n                    this.socketStatus = SOCKET_STATUS.CLOSED;\n                }\n            }\n        });\n    }\n    async _establishRetryableConnection(awsRealTimeUrl, subprotocol) {\n        this.logger.debug(`Establishing retryable connection`);\n        await jitteredExponentialRetry(this._establishConnection.bind(this), [awsRealTimeUrl, subprotocol], MAX_DELAY_MS);\n    }\n    async _openConnection(awsRealTimeUrl, subprotocol) {\n        return new Promise((resolve, reject) => {\n            const newSocket = this._getNewWebSocket(awsRealTimeUrl, [\n                this.wsProtocolName,\n                subprotocol,\n            ]);\n            newSocket.onerror = () => {\n                this.logger.debug(`WebSocket connection error`);\n            };\n            newSocket.onclose = () => {\n                this._closeSocket();\n                reject(new Error('Connection handshake error'));\n            };\n            newSocket.onopen = () => {\n                this.awsRealTimeSocket = newSocket;\n                resolve();\n            };\n        });\n    }\n    _getNewWebSocket(url, protocol) {\n        return new WebSocket(url, protocol);\n    }\n    async _initiateHandshake() {\n        return new Promise((resolve, reject) => {\n            if (!this.awsRealTimeSocket) {\n                reject(new Error('awsRealTimeSocket undefined'));\n                return;\n            }\n            let ackOk = false;\n            this.awsRealTimeSocket.onerror = error => {\n                this.logger.debug(`WebSocket error ${JSON.stringify(error)}`);\n            };\n            this.awsRealTimeSocket.onclose = event => {\n                this.logger.debug(`WebSocket closed ${event.reason}`);\n                this._closeSocket();\n                reject(new Error(JSON.stringify(event)));\n            };\n            this.awsRealTimeSocket.onmessage = (message) => {\n                if (typeof message.data !== 'string') {\n                    return;\n                }\n                this.logger.debug(`subscription message from AWS AppSyncRealTime: ${message.data} `);\n                const data = JSON.parse(message.data);\n                const { type } = data;\n                const connectionTimeoutMs = this._extractConnectionTimeout(data);\n                if (type === MESSAGE_TYPES.GQL_CONNECTION_ACK) {\n                    ackOk = true;\n                    this._registerWebsocketHandlers(connectionTimeoutMs);\n                    resolve('Connected to AWS AppSyncRealTime');\n                    return;\n                }\n                if (type === MESSAGE_TYPES.GQL_CONNECTION_ERROR) {\n                    const { errorType, errorCode } = this._extractErrorCodeAndType(data);\n                    // TODO(Eslint): refactor to reject an Error object instead of a plain object\n                    // eslint-disable-next-line prefer-promise-reject-errors\n                    reject({ errorType, errorCode });\n                }\n            };\n            const gqlInit = {\n                type: MESSAGE_TYPES.GQL_CONNECTION_INIT,\n            };\n            this.awsRealTimeSocket.send(JSON.stringify(gqlInit));\n            const checkAckOk = (targetAckOk) => {\n                if (!targetAckOk) {\n                    this.connectionStateMonitor.record(CONNECTION_CHANGE.CONNECTION_FAILED);\n                    reject(new Error(`Connection timeout: ack from AWSAppSyncRealTime was not received after ${CONNECTION_INIT_TIMEOUT} ms`));\n                }\n            };\n            setTimeout(() => {\n                checkAckOk(ackOk);\n            }, CONNECTION_INIT_TIMEOUT);\n        });\n    }\n    _registerWebsocketHandlers(connectionTimeoutMs) {\n        if (!this.awsRealTimeSocket) {\n            return;\n        }\n        // Set up a keep alive heartbeat for this connection\n        this.keepAliveHeartbeatIntervalId = setInterval(() => {\n            this.keepAliveHeartbeat(connectionTimeoutMs);\n        }, DEFAULT_KEEP_ALIVE_HEARTBEAT_TIMEOUT);\n        this.awsRealTimeSocket.onmessage =\n            this._handleIncomingSubscriptionMessage.bind(this);\n        this.awsRealTimeSocket.onerror = err => {\n            this.logger.debug(err);\n            this._errorDisconnect(CONTROL_MSG.CONNECTION_CLOSED);\n        };\n        this.awsRealTimeSocket.onclose = event => {\n            this.logger.debug(`WebSocket closed ${event.reason}`);\n            this._closeSocket();\n            this._errorDisconnect(CONTROL_MSG.CONNECTION_CLOSED);\n        };\n    }\n}\n"],"names":[],"mappings":"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"}