UNPKG

22.3 kBSource Map (JSON)View Raw
1{"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":[],"mappings":"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"}
\No newline at end of file