@aws-amplify/pubsub
Version:
Pubsub category of aws-amplify
1 lines • 21.8 kB
Source Map (JSON)
{"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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"}