{"version":3,"file":"MqttOverWS.mjs","sources":["../../../src/Providers/MqttOverWS.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { Observable } from 'rxjs';\nimport { ConsoleLogger, Hub } from '@aws-amplify/core';\nimport { amplifyUuid } from '@aws-amplify/core/internals/utils';\nimport { ConnectionState, } from '../types/PubSub';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore this module is expected to not have declaration file\nimport * as Paho from '../vendor/paho-mqtt.js';\nimport { CONNECTION_CHANGE, ConnectionStateMonitor, } from '../utils/ConnectionStateMonitor';\nimport { ReconnectEvent, ReconnectionMonitor, } from '../utils/ReconnectionMonitor';\nimport { AbstractPubSub } from './PubSub';\nimport { AMPLIFY_SYMBOL, CONNECTION_STATE_CHANGE } from './constants';\nconst logger = new ConsoleLogger('MqttOverWS');\nexport function mqttTopicMatch(filter, topic) {\n    const filterArray = filter.split('/');\n    const { length } = filterArray;\n    const topicArray = topic.split('/');\n    for (let i = 0; i < length; ++i) {\n        const left = filterArray[i];\n        const right = topicArray[i];\n        if (left === '#')\n            return topicArray.length >= length;\n        if (left !== '+' && left !== right)\n            return false;\n    }\n    return length === topicArray.length;\n}\nclass ClientsQueue {\n    constructor() {\n        this.promises = new Map();\n    }\n    async get(clientId, clientFactory) {\n        const cachedPromise = this.promises.get(clientId);\n        if (cachedPromise)\n            return cachedPromise;\n        if (clientFactory) {\n            const newPromise = clientFactory(clientId);\n            this.promises.set(clientId, newPromise);\n            newPromise.catch(() => this.promises.delete(clientId));\n            return newPromise;\n        }\n        return undefined;\n    }\n    get allClients() {\n        return Array.from(this.promises.keys());\n    }\n    remove(clientId) {\n        this.promises.delete(clientId);\n    }\n}\nconst dispatchPubSubEvent = (payload) => {\n    Hub.dispatch('pubsub', payload, 'PubSub', AMPLIFY_SYMBOL);\n};\nconst topicSymbol = typeof Symbol !== 'undefined' ? Symbol('topic') : '@@topic';\nexport class MqttOverWS extends AbstractPubSub {\n    constructor(options = {}) {\n        super({ ...options, clientId: options.clientId || amplifyUuid() });\n        this._clientsQueue = new ClientsQueue();\n        this.connectionStateMonitor = new ConnectionStateMonitor();\n        this.reconnectionMonitor = new ReconnectionMonitor();\n        this._topicObservers = new Map();\n        this._clientIdObservers = new Map();\n        // Monitor the connection health state and pass changes along to Hub\n        this.connectionStateMonitor.connectionStateObservable.subscribe(connectionStateChange => {\n            dispatchPubSubEvent({\n                event: CONNECTION_STATE_CHANGE,\n                data: {\n                    provider: this,\n                    connectionState: connectionStateChange,\n                },\n                message: `Connection state is ${connectionStateChange}`,\n            });\n            this.connectionState = connectionStateChange;\n            // Trigger reconnection when the connection is disrupted\n            if (connectionStateChange === ConnectionState.ConnectionDisrupted) {\n                this.reconnectionMonitor.record(ReconnectEvent.START_RECONNECT);\n            }\n            else if (connectionStateChange !== ConnectionState.Connecting) {\n                // Trigger connected to halt reconnection attempts\n                this.reconnectionMonitor.record(ReconnectEvent.HALT_RECONNECT);\n            }\n        });\n    }\n    get clientId() {\n        return this.options.clientId;\n    }\n    get endpoint() {\n        return Promise.resolve(this.options.endpoint);\n    }\n    get clientsQueue() {\n        return this._clientsQueue;\n    }\n    get isSSLEnabled() {\n        return !this.options\n            .aws_appsync_dangerously_connect_to_http_endpoint_for_testing;\n    }\n    onDisconnect({ clientId, errorCode, ...args }) {\n        if (errorCode !== 0) {\n            logger.warn(clientId, JSON.stringify({ errorCode, ...args }, null, 2));\n            if (!clientId) {\n                return;\n            }\n            const clientIdObservers = this._clientIdObservers.get(clientId);\n            if (!clientIdObservers) {\n                return;\n            }\n            this.disconnect(clientId);\n        }\n    }\n    async newClient({ url, clientId }) {\n        logger.debug('Creating new MQTT client', clientId);\n        this.connectionStateMonitor.record(CONNECTION_CHANGE.OPENING_CONNECTION);\n        // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n        // @ts-ignore this module is expected to not have declaration file\n        const client = new Paho.Client(url, clientId);\n        client.onMessageArrived = ({ destinationName: topic, payloadString: msg, }) => {\n            this._onMessage(topic, msg);\n        };\n        client.onConnectionLost = ({ errorCode, ...args }) => {\n            this.onDisconnect({ clientId, errorCode, ...args });\n            this.connectionStateMonitor.record(CONNECTION_CHANGE.CLOSED);\n        };\n        const connected = await new Promise((resolve, _reject) => {\n            client.connect({\n                useSSL: this.isSSLEnabled,\n                mqttVersion: 3,\n                onSuccess: () => {\n                    resolve(true);\n                },\n                onFailure: () => {\n                    if (clientId)\n                        this._clientsQueue.remove(clientId);\n                    this.connectionStateMonitor.record(CONNECTION_CHANGE.CLOSED);\n                    resolve(false);\n                },\n            });\n        });\n        if (connected) {\n            this.connectionStateMonitor.record(CONNECTION_CHANGE.CONNECTION_ESTABLISHED);\n        }\n        return client;\n    }\n    async connect(clientId, options = {}) {\n        return this.clientsQueue.get(clientId, async (inputClientId) => {\n            const client = await this.newClient({\n                ...options,\n                clientId: inputClientId,\n            });\n            if (client) {\n                // Once connected, subscribe to all topics registered observers\n                this._topicObservers.forEach((_value, key) => {\n                    client.subscribe(key);\n                });\n            }\n            return client;\n        });\n    }\n    async disconnect(clientId) {\n        const client = await this.clientsQueue.get(clientId);\n        if (client && client.isConnected()) {\n            client.disconnect();\n        }\n        this.clientsQueue.remove(clientId);\n        this.connectionStateMonitor.record(CONNECTION_CHANGE.CLOSED);\n    }\n    async publish({ topics, message }) {\n        const targetTopics = [].concat(topics);\n        const msg = JSON.stringify(message);\n        const client = await this.clientsQueue.get(this.clientId);\n        if (client) {\n            logger.debug('Publishing to topic(s)', targetTopics.join(','), message);\n            targetTopics.forEach(topic => {\n                client.send(topic, msg);\n            });\n        }\n        else {\n            logger.debug('Publishing to topic(s) failed', targetTopics.join(','), message);\n        }\n    }\n    _onMessage(topic, msg) {\n        try {\n            const matchedTopicObservers = [];\n            this._topicObservers.forEach((observerForTopic, observerTopic) => {\n                if (mqttTopicMatch(observerTopic, topic)) {\n                    matchedTopicObservers.push(observerForTopic);\n                }\n            });\n            const parsedMessage = JSON.parse(msg);\n            if (typeof parsedMessage === 'object') {\n                parsedMessage[topicSymbol] = topic;\n            }\n            matchedTopicObservers.forEach(observersForTopic => {\n                observersForTopic.forEach(observer => {\n                    observer.next(parsedMessage);\n                });\n            });\n        }\n        catch (error) {\n            logger.warn('Error handling message', error, msg);\n        }\n    }\n    subscribe({ topics, options = {}, }) {\n        const targetTopics = [].concat(topics);\n        logger.debug('Subscribing to topic(s)', targetTopics.join(','));\n        let reconnectSubscription;\n        return new Observable(observer => {\n            targetTopics.forEach(topic => {\n                // this._topicObservers is used to notify the observers according to the topic received on the message\n                let observersForTopic = this._topicObservers.get(topic);\n                if (!observersForTopic) {\n                    observersForTopic = new Set();\n                    this._topicObservers.set(topic, observersForTopic);\n                }\n                observersForTopic.add(observer);\n            });\n            const { clientId = this.clientId } = options;\n            // this._clientIdObservers is used to close observers when client gets disconnected\n            let observersForClientId = this._clientIdObservers.get(clientId);\n            if (!observersForClientId) {\n                observersForClientId = new Set();\n            }\n            if (observersForClientId) {\n                observersForClientId.add(observer);\n                this._clientIdObservers.set(clientId, observersForClientId);\n            }\n            (async () => {\n                const getClient = async () => {\n                    try {\n                        const { url = await this.endpoint } = options;\n                        const client = await this.connect(clientId, { url });\n                        if (client !== undefined) {\n                            targetTopics.forEach(topic => {\n                                client.subscribe(topic);\n                            });\n                        }\n                    }\n                    catch (e) {\n                        logger.debug('Error forming connection', e);\n                    }\n                };\n                // Establish the initial connection\n                await getClient();\n                // Add an observable to the reconnection list to manage reconnection for this subscription\n                reconnectSubscription = new Observable(reconnectSubscriptionObserver => {\n                    this.reconnectionMonitor.addObserver(reconnectSubscriptionObserver);\n                }).subscribe(() => {\n                    getClient();\n                });\n            })();\n            return async () => {\n                const client = await this.clientsQueue.get(clientId);\n                reconnectSubscription?.unsubscribe();\n                if (client) {\n                    this._clientIdObservers.get(clientId)?.delete(observer);\n                    // No more observers per client => client not needed anymore\n                    if (this._clientIdObservers.get(clientId)?.size === 0) {\n                        this.disconnect(clientId);\n                        this.connectionStateMonitor.record(CONNECTION_CHANGE.CLOSING_CONNECTION);\n                        this._clientIdObservers.delete(clientId);\n                    }\n                    targetTopics.forEach(topic => {\n                        const observersForTopic = this._topicObservers.get(topic) ||\n                            new Set();\n                        observersForTopic.delete(observer);\n                        // if no observers exists for the topic, topic should be removed\n                        if (observersForTopic.size === 0) {\n                            this._topicObservers.delete(topic);\n                            if (client.isConnected()) {\n                                client.unsubscribe(topic);\n                            }\n                        }\n                    });\n                }\n                return null;\n            };\n        });\n    }\n}\n"],"names":["Paho.Client"],"mappings":"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"}