@uns-kit/core 3.0.37 → 3.0.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MIGRATIONS.md +39 -0
- package/README.md +11 -0
- package/dist/runtime/input-queue-boundary.d.ts +15 -0
- package/dist/runtime/input-queue-boundary.d.ts.map +1 -0
- package/dist/runtime/input-queue-boundary.js +33 -0
- package/dist/runtime/input-queue-boundary.js.map +1 -0
- package/dist/runtime/mqtt-handover-state.d.ts +4 -1
- package/dist/runtime/mqtt-handover-state.d.ts.map +1 -1
- package/dist/runtime/mqtt-handover-state.js +5 -3
- package/dist/runtime/mqtt-handover-state.js.map +1 -1
- package/dist/uns/handover-manager.d.ts +3 -0
- package/dist/uns/handover-manager.d.ts.map +1 -1
- package/dist/uns/handover-manager.js +61 -11
- package/dist/uns/handover-manager.js.map +1 -1
- package/dist/uns/uns-interfaces.d.ts +1 -0
- package/dist/uns/uns-interfaces.d.ts.map +1 -1
- package/dist/uns/uns-interfaces.js.map +1 -1
- package/dist/uns-mqtt/mqtt-proxy.d.ts +1 -0
- package/dist/uns-mqtt/mqtt-proxy.d.ts.map +1 -1
- package/dist/uns-mqtt/mqtt-proxy.js +1 -0
- package/dist/uns-mqtt/mqtt-proxy.js.map +1 -1
- package/dist/uns-mqtt/mqtt-worker.d.ts.map +1 -1
- package/dist/uns-mqtt/mqtt-worker.js +11 -0
- package/dist/uns-mqtt/mqtt-worker.js.map +1 -1
- package/dist/uns-mqtt/subscription-readiness.d.ts +2 -0
- package/dist/uns-mqtt/subscription-readiness.d.ts.map +1 -1
- package/dist/uns-mqtt/subscription-readiness.js +5 -1
- package/dist/uns-mqtt/subscription-readiness.js.map +1 -1
- package/dist/uns-mqtt/throttled-queue.d.ts +5 -8
- package/dist/uns-mqtt/throttled-queue.d.ts.map +1 -1
- package/dist/uns-mqtt/throttled-queue.js +25 -1
- package/dist/uns-mqtt/throttled-queue.js.map +1 -1
- package/dist/uns-mqtt/uns-mqtt-proxy.d.ts +10 -8
- package/dist/uns-mqtt/uns-mqtt-proxy.d.ts.map +1 -1
- package/dist/uns-mqtt/uns-mqtt-proxy.js +43 -3
- package/dist/uns-mqtt/uns-mqtt-proxy.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mqtt-proxy.js","sourceRoot":"","sources":["../../src/uns-mqtt/mqtt-proxy.ts"],"names":[],"mappings":"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","sourcesContent":["import { SubscriptionReadiness } from \"./subscription-readiness.js\";\nimport mqtt, { IClientOptions, MqttClient } from \"mqtt\";\nimport logger from \"../logger.js\";\nimport { UnsEvents } from \"../uns/uns-interfaces.js\";\nimport { UnsEventEmitter } from \"../uns/uns-event-emitter.js\";\nimport { IMqttParameters } from \"./mqtt-interfaces.js\";\nimport { MqttWorker } from \"./mqtt-worker.js\";\nimport { DataSizeMeasurements, PhysicalMeasurements } from \"../uns/uns-measurements.js\";\n\nexport type MqttStopOptions = {\n silent?: boolean;\n force?: boolean;\n reason?: \"retry\" | \"shutdown\";\n};\n\ntype MqttErrorInfo = {\n code: string | number;\n message: string;\n};\n\nexport default class MqttProxy {\n public event: UnsEventEmitter<UnsEvents> = new UnsEventEmitter<UnsEvents>();\n public statusTopic: string;\n public instanceName: string;\n private mqttHost: string;\n private mqttSubToTopics: string | string[];\n private mqttSSL: boolean;\n private mqttClient: MqttClient;\n private startDate: Date;\n private mqttParameters: IMqttParameters;\n private statusUpdateInterval: ReturnType<typeof setInterval>;\n private transformationStatsInterval: NodeJS.Timeout | null = null;\n private publishedMessageCount = 0;\n private publishedMessageBytes = 0;\n private subscribedMessageCount = 0;\n private subscribedMessageBytes = 0;\n private mqttWorker: MqttWorker;\n public isConnected = false;\n private subscriptionReadiness = new SubscriptionReadiness();\n private lastSubscriptionReady: boolean | null = null;\n private rejectUnauthorized: boolean;\n private pendingReconnectWait: Promise<void> | null = null;\n private hasEstablishedConnection = false;\n private startupSettled = false;\n private startupResolve: (() => void) | null = null;\n private startupReject: ((error: unknown) => void) | null = null;\n\n constructor(mqttHost: string, instanceName: string, mqttParameters: IMqttParameters, mqttWorker?: MqttWorker) {\n this.mqttSSL = mqttParameters?.mqttSSL ?? false;\n this.rejectUnauthorized = mqttParameters.rejectUnauthorized ?? false;\n this.mqttSubToTopics = mqttParameters?.mqttSubToTopics ?? [];\n this.mqttHost = mqttHost;\n this.startDate = new Date();\n this.instanceName = instanceName ?? \"process\";\n this.statusTopic = `${mqttParameters?.statusTopic}`;\n this.mqttParameters = mqttParameters ?? {};\n this.mqttWorker = mqttWorker;\n }\n\n private resolveProtocol(): IMqttParameters[\"protocol\"] {\n return this.mqttParameters.protocol ?? (this.mqttSSL ? \"mqtts\" : \"mqtt\");\n }\n\n private resolveDefaultPort(protocol: IMqttParameters[\"protocol\"]): number {\n switch (protocol) {\n case \"mqtts\":\n case \"ssl\":\n return 8883;\n case \"wss\":\n return 443;\n case \"ws\":\n return 80;\n case \"tcp\":\n case \"mqtt\":\n default:\n return 1883;\n }\n }\n\n private ensureStatusUpdateInterval(): void {\n if (this.statusTopic && !this.statusUpdateInterval) {\n this.statusUpdateInterval = setInterval(() => this.emitStatusUpdates(), 10000);\n }\n }\n\n private ensureTransformationStatsInterval(): void {\n if (!this.transformationStatsInterval) {\n this.transformationStatsInterval = setInterval(() => {\n this.emitTransformationStatistics();\n }, 60000);\n }\n }\n\n private lastTransportConnected: boolean | undefined;\n private emitSubscriptionReadiness(force = false): void {\n if(force || this.lastTransportConnected!==this.isConnected){\n this.lastTransportConnected=this.isConnected;\n this.event.emit(\"mqttProxyStatus\",{event:\"mqtt-connected\",value:this.isConnected?1:0,uom:DataSizeMeasurements.Bit,statusTopic:this.statusTopic+\"mqtt-connected\"});\n }\n const ready = this.subscriptionReadiness.ready();\n if (!force && ready === this.lastSubscriptionReady) return;\n this.lastSubscriptionReady = ready;\n this.event.emit(\"mqttProxyStatus\", {event: \"mqtt-subscriptions-ready\", value: ready ? 1 : 0,\n uom: DataSizeMeasurements.Bit, statusTopic: this.statusTopic + \"mqtt-subscriptions-ready\"});\n }\n\n private subscribeToTopics(): void {\n if (this.mqttSubToTopics && this.mqttSubToTopics.length > 0) {\n logger.debug(`${this.instanceName} - Subscribed to ${this.mqttSubToTopics.length} topics.`);\n this.mqttClient.subscribe(this.mqttSubToTopics, { qos: 0 });\n }\n }\n\n private buildServers(defaultProtocol: IMqttParameters[\"protocol\"]): IClientOptions[\"servers\"] | undefined {\n const servers: IClientOptions[\"servers\"] = [];\n const { port } = this.mqttParameters;\n const protocol = this.mqttParameters.protocol ?? defaultProtocol;\n\n if (Array.isArray(this.mqttParameters.servers) && this.mqttParameters.servers.length > 0) {\n for (const server of this.mqttParameters.servers) {\n if (!server?.host) continue;\n const resolvedProtocol = server.protocol ?? protocol;\n const resolvedPort =\n typeof server.port === \"number\"\n ? server.port\n : typeof port === \"number\"\n ? port\n : this.resolveDefaultPort(resolvedProtocol);\n const entry: { host: string; port: number; protocol?: IMqttParameters[\"protocol\"] } = {\n host: server.host,\n port: resolvedPort,\n };\n if (resolvedProtocol) {\n entry.protocol = resolvedProtocol;\n }\n servers.push(entry);\n }\n } else if (Array.isArray(this.mqttParameters.hosts) && this.mqttParameters.hosts.length > 0) {\n for (const host of this.mqttParameters.hosts) {\n if (!host) continue;\n const resolvedPort = typeof port === \"number\" ? port : this.resolveDefaultPort(protocol);\n const entry: { host: string; port: number; protocol?: IMqttParameters[\"protocol\"] } = {\n host,\n port: resolvedPort,\n };\n if (protocol) {\n entry.protocol = protocol;\n }\n servers.push(entry);\n }\n }\n\n return servers.length > 0 ? servers : undefined;\n }\n\n public async start(): Promise<void> {\n logger.debug(`${this.instanceName} - Connecting to MQTT broker...`);\n this.startupSettled = false;\n\n return new Promise<void>((resolve, reject) => {\n this.startupResolve = resolve;\n this.startupReject = reject;\n try {\n const username = this.mqttParameters.username;\n const password = this.mqttParameters.password;\n const clientId = this.mqttParameters.clientId ?? this.instanceName;\n const protocol = this.resolveProtocol();\n\n const options: IClientOptions = {\n username,\n password,\n protocolVersion: 5,\n rejectUnauthorized: this.rejectUnauthorized,\n keepalive: this.mqttParameters.keepalive,\n clean: this.mqttParameters.clean ?? true,\n connectTimeout: this.mqttParameters.connectTimeout,\n reconnectPeriod: this.mqttParameters.reconnectPeriod,\n reconnectOnConnackError: this.mqttParameters.reconnectOnConnackError,\n resubscribe: this.mqttParameters.resubscribe,\n queueQoSZero: this.mqttParameters.queueQoSZero,\n properties: this.mqttParameters.properties,\n ca: this.mqttParameters.ca,\n cert: this.mqttParameters.cert,\n key: this.mqttParameters.key,\n servername: this.mqttParameters.servername,\n \n will: {\n topic: `${this.statusTopic}alive`,\n payload: Buffer.from(\"\"),\n qos: 0,\n retain: true,\n properties: { messageExpiryInterval: 3600 },\n },\n clientId,\n };\n\n const servers = this.buildServers(protocol);\n if (servers) {\n options.servers = servers;\n options.protocol = protocol;\n this.mqttClient = mqtt.connect(options);\n } else {\n options.host = this.mqttHost;\n options.port = this.mqttParameters.port;\n options.protocol = protocol;\n this.mqttClient = mqtt.connect(options);\n }\n\n const onConnect = () => this.handleMqttConnect();\n\n this.mqttClient.on(\"connect\", onConnect);\n this.mqttClient.on(\"packetsend\", packet => {\n this.subscriptionReadiness.sent(packet as Parameters<SubscriptionReadiness[\"sent\"]>[0]);\n this.emitSubscriptionReadiness();\n });\n this.mqttClient.on(\"packetreceive\", packet => {\n this.subscriptionReadiness.received(packet as Parameters<SubscriptionReadiness[\"received\"]>[0]);\n this.emitSubscriptionReadiness();\n });\n\n this.mqttClient.on(\"message\", (topic: string, message: Buffer, packet: mqtt.IPublishPacket) => {\n try {\n logger.debug(`${this.instanceName} - Message received on topic ${topic}`);\n this.event.emit(\"input\", {\n message: message.toString(),\n topic: topic,\n packet: packet,\n });\n this.updateSubscribeTransformationStats(message.length);\n } catch (error) {\n logger.error(`${this.instanceName} - Error in MQTT message handler: ${error.message}`);\n }\n });\n\n this.mqttClient.on(\"error\", (error) => {\n const errorInfo = formatMqttError(error);\n logger.error(`${this.instanceName} - MQTT client error: ${errorInfo.message}`);\n this.isConnected = false;\n this.subscriptionReadiness.connection(false);\n this.emitSubscriptionReadiness();\n this.event.emit(\"error\", {\n code: typeof errorInfo.code === \"number\" ? errorInfo.code : 0,\n message: errorInfo.message,\n });\n reject(error);\n });\n\n this.mqttClient.on(\"reconnect\", () => {\n logger.debug(`${this.instanceName} - Attempting to reconnect to MQTT broker...`);\n });\n\n this.mqttClient.on(\"close\", () => {\n logger.debug(`${this.instanceName} - MQTT connection closed.`);\n this.isConnected = false;\n this.subscriptionReadiness.connection(false);\n this.emitSubscriptionReadiness();\n });\n\n this.mqttClient.on(\"offline\", () => {\n logger.debug(`${this.instanceName} - MQTT client is offline.`);\n this.isConnected = false;\n this.subscriptionReadiness.connection(false);\n this.emitSubscriptionReadiness();\n });\n\n this.mqttClient.on(\"end\", () => {\n logger.debug(`${this.instanceName} - MQTT client connection ended.`);\n this.isConnected = false;\n this.subscriptionReadiness.connection(false);\n this.emitSubscriptionReadiness();\n });\n\n this.mqttClient.on(\"disconnect\", (packet) => {\n logger.debug(`${this.instanceName} - MQTT client disconnected. Reason: ${packet?.reasonCode}`);\n this.isConnected = false;\n this.subscriptionReadiness.connection(false);\n this.emitSubscriptionReadiness();\n });\n } catch (error) {\n logger.error(`${this.instanceName} - Error starting MQTT proxy: ${formatMqttError(error).message}`);\n this.isConnected = false;\n this.subscriptionReadiness.connection(false);\n this.emitSubscriptionReadiness();\n reject(error);\n }\n });\n }\n\n public async publish(topic: string, message: string | Buffer, options?: mqtt.IClientPublishOptions): Promise<void> {\n this.updatePublishTransformationStats(JSON.stringify(message).length);\n const client = this.mqttClient;\n if (!client) {\n throw new Error(`${this.instanceName} - MQTT client missing; cannot publish to ${topic}`);\n }\n\n if (!client.connected) {\n // Wait briefly for reconnection before giving up.\n await this.waitForReconnect(client, 5000);\n }\n\n if (!client.connected) {\n throw new Error(`${this.instanceName} - MQTT client still disconnected; publish failed for ${topic}`);\n }\n\n return new Promise((resolve, reject) => {\n client.publish(topic, message, options || {}, (err) => {\n if (err) {\n logger.error(`${this.instanceName} - Error publishing to topic ${topic}: ${err.message}`);\n return reject(err);\n }\n logger.debug(`${this.instanceName} - Published message to topic ${topic}`);\n resolve();\n });\n });\n }\n\n /** A bounded delivery attempt for the SDK outbox. Expired attempts retire their socket. */\n public async publishConfirmed(topic: string, message: string, options: mqtt.IClientPublishOptions, timeoutMs: number): Promise<void> {\n let timer: ReturnType<typeof setTimeout>;\n let timedOut = false;\n try {\n await Promise.race([\n this.publish(topic, message, options),\n new Promise<never>((_, reject) => { timer = setTimeout(() => {\n timedOut = true;\n reject(new Error(\"MQTT broker acknowledgement timed out; delivery outcome unknown\"));\n }, timeoutMs); }),\n ]);\n } finally {\n clearTimeout(timer);\n if (timedOut) {\n // Do not retry alongside mqtt.js's old in-flight operation. A late PUBACK may\n // already have followed delivery: the outbox deliberately permits replay.\n await this.stop({ silent: true, reason: \"retry\", force: true });\n void this.start().catch((): void => {});\n }\n }\n }\n\n public async subscribeAsync(topic: string | string[], options?: mqtt.IClientSubscribeOptions): Promise<mqtt.ISubscriptionGrant[]> {\n return this.mqttClient.subscribeAsync(topic, options);\n }\n\n public async unsubscribeAsync(topic: string | string[]): Promise<mqtt.Packet | undefined> {\n const topics = Array.isArray(topic) ? topic.filter((t) => typeof t === \"string\" && t.length > 0) : [topic].filter((t): t is string => typeof t === \"string\" && t.length > 0);\n if (topics.length === 0) {\n logger.warn(`${this.instanceName} - unsubscribeAsync called with empty topic list; skipping.`);\n return Promise.resolve(undefined);\n }\n return this.mqttClient.unsubscribeAsync(topics);\n }\n\n public stop(options: MqttStopOptions = {}): Promise<void> {\n const silent = options.silent === true || options.reason === \"retry\";\n const shouldLogDisconnect = !silent && this.hasEstablishedConnection;\n\n if (shouldLogDisconnect) {\n logger.debug(`${this.instanceName} - Disconnecting from MQTT broker...`);\n }\n\n return new Promise((resolve, reject) => {\n const resetState = () => {\n this.isConnected = false;\n this.subscriptionReadiness.connection(false);\n this.emitSubscriptionReadiness();\n this.pendingReconnectWait = null;\n this.startupSettled = false;\n this.hasEstablishedConnection = false;\n this.startupResolve = null;\n this.startupReject = null;\n };\n\n try {\n if (this.statusUpdateInterval) {\n clearInterval(this.statusUpdateInterval);\n this.statusUpdateInterval = null;\n }\n if (this.transformationStatsInterval) {\n clearInterval(this.transformationStatsInterval);\n this.transformationStatsInterval = null;\n }\n if (this.mqttClient) {\n this.mqttClient.end(options.force ?? false, () => {\n resetState();\n if (shouldLogDisconnect) {\n logger.debug(`${this.instanceName} - Disconnected from MQTT broker.`);\n }\n resolve();\n });\n } else {\n resetState();\n resolve();\n }\n } catch (error) {\n resetState();\n const reason = error instanceof Error ? error : new Error(String(error));\n if (!silent) {\n logger.error(`${this.instanceName} - Error during stop: ${formatMqttError(reason).message}`);\n }\n reject(reason);\n }\n });\n }\n\n private handleMqttConnect(): void {\n const resolve = this.startupResolve;\n const reject = this.startupReject;\n if (!resolve || !reject) {\n return;\n }\n\n try {\n this.mqttClient.stream.setMaxListeners(0);\n const isFirstConnect = !this.startupSettled;\n this.startupSettled = true;\n this.hasEstablishedConnection = true;\n this.isConnected = true;\n this.subscriptionReadiness.connection(true);\n this.emitSubscriptionReadiness();\n\n if (isFirstConnect) {\n logger.info(`${this.instanceName} - Connected to MQTT broker at ${this.mqttHost}`);\n this.subscribeToTopics();\n this.ensureStatusUpdateInterval();\n this.ensureTransformationStatsInterval();\n resolve();\n return;\n }\n\n logger.info(`${this.instanceName} - Reconnected to MQTT broker at ${this.mqttHost}`);\n if (this.mqttParameters.resubscribe === false) {\n this.subscribeToTopics();\n }\n this.ensureStatusUpdateInterval();\n this.ensureTransformationStatsInterval();\n } catch (error) {\n logger.error(`${this.instanceName} - Error in MQTT connect handler: ${formatMqttError(error).message}`);\n this.isConnected = false;\n this.subscriptionReadiness.connection(false);\n this.emitSubscriptionReadiness();\n reject(error);\n }\n }\n\n private emitStatusUpdates() {\n try {\n this.emitSubscriptionReadiness(true);\n const uptime = Math.round((new Date().getTime() - this.startDate.getTime()) / 60000);\n this.event.emit(\"mqttProxyStatus\", { event: \"uptime\", value: uptime, uom: PhysicalMeasurements.Minute, statusTopic: this.statusTopic + \"uptime\" });\n this.event.emit(\"mqttProxyStatus\", { event: \"alive\", value: 1, uom: DataSizeMeasurements.Bit, statusTopic: this.statusTopic + \"alive\" });\n\n if (this.mqttWorker !== undefined) {\n const tpValue = this.mqttWorker.getPublisherState() ? 1 : 0;\n this.event.emit(\"mqttProxyStatus\", { event: \"t-publisher-active\", value: tpValue, uom: DataSizeMeasurements.Bit, statusTopic: this.statusTopic + \"t-publisher-active\" });\n const tsValue = this.mqttWorker.getSubscriberState() ? 1 : 0;\n this.event.emit(\"mqttProxyStatus\", { event: \"t-subscriber-active\", value: tsValue, uom: DataSizeMeasurements.Bit, statusTopic: this.statusTopic + \"t-subscriber-active\" });\n }\n } catch (error) {\n logger.error(`${this.instanceName} - Error publishing MQTT status: ${error.message}`);\n }\n }\n\n private updatePublishTransformationStats(messageSizeOut: number): void {\n this.publishedMessageCount += 1;\n this.publishedMessageBytes += messageSizeOut;\n }\n\n private updateSubscribeTransformationStats(messageSizeIn: number): void {\n this.subscribedMessageCount += 1;\n this.subscribedMessageBytes += messageSizeIn;\n }\n\n private waitForReconnect(client: mqtt.MqttClient, timeoutMs: number): Promise<void> {\n if (client.connected) {\n return Promise.resolve();\n }\n\n if (this.pendingReconnectWait) {\n return this.pendingReconnectWait;\n }\n\n this.pendingReconnectWait = new Promise<void>((resolve) => {\n if (client.connected) return resolve();\n\n const onConnect = () => {\n cleanup();\n resolve();\n };\n const onClose = () => {\n // stay waiting; close is expected during reconnect attempts\n };\n const cleanup = () => {\n client.off(\"connect\", onConnect);\n client.off(\"close\", onClose);\n };\n\n client.on(\"connect\", onConnect);\n client.on(\"close\", onClose);\n\n setTimeout(() => {\n cleanup();\n resolve();\n }, timeoutMs).unref?.();\n }).finally(() => {\n this.pendingReconnectWait = null;\n });\n\n return this.pendingReconnectWait;\n }\n\n private async emitTransformationStatistics(): Promise<void> {\n if (this.statusTopic !== \"\") {\n try {\n this.event.emit(\"mqttProxyStatus\", {\n event: \"published-message-count\",\n value: this.publishedMessageCount,\n uom: \"\",\n statusTopic: this.statusTopic + \"published-message-count\",\n });\n this.event.emit(\"mqttProxyStatus\", {\n event: \"published-message-bytes\",\n value: Math.round(this.publishedMessageBytes / 1024),\n uom: DataSizeMeasurements.KiloByte,\n statusTopic: this.statusTopic + \"published-message-bytes\",\n });\n this.event.emit(\"mqttProxyStatus\", {\n event: \"subscribed-message-count\",\n value: this.subscribedMessageCount,\n uom: \"\",\n statusTopic: this.statusTopic + \"subscribed-message-count\",\n });\n this.event.emit(\"mqttProxyStatus\", {\n event: \"subscribed-message-bytes\",\n value: Math.round(this.subscribedMessageBytes / 1024),\n uom: DataSizeMeasurements.KiloByte,\n statusTopic: this.statusTopic + \"subscribed-message-bytes\",\n });\n this.publishedMessageCount = 0;\n this.publishedMessageBytes = 0;\n this.subscribedMessageCount = 0;\n this.subscribedMessageBytes = 0;\n } catch (error: any) {\n this.publishedMessageCount = 0;\n this.publishedMessageBytes = 0;\n this.subscribedMessageCount = 0;\n this.subscribedMessageBytes = 0;\n logger.error(`${this.instanceName} - Error emitting transformation statistics: ${error.message}`);\n }\n }\n }\n}\n\nexport function formatMqttError(error: unknown): MqttErrorInfo {\n const parts: string[] = [];\n const codes: Array<string | number> = [];\n collectMqttErrorParts(error, parts, codes);\n\n const uniqueParts = Array.from(new Set(parts.map((part) => part.trim()).filter(Boolean)));\n const message = uniqueParts.join(\"; \") || \"Unknown MQTT error\";\n\n return {\n code: codes[0] ?? 0,\n message,\n };\n}\n\nfunction collectMqttErrorParts(\n error: unknown,\n parts: string[],\n codes: Array<string | number>,\n): void {\n if (error instanceof AggregateError) {\n if (typeof error.message === \"string\" && error.message.trim()) {\n parts.push(error.message.trim());\n }\n for (const nested of error.errors) {\n collectMqttErrorParts(nested, parts, codes);\n }\n return;\n }\n\n if (typeof error === \"string\") {\n if (error.trim()) {\n parts.push(error.trim());\n }\n return;\n }\n\n if (!error || typeof error !== \"object\") {\n return;\n }\n\n const record = error as {\n message?: unknown;\n name?: unknown;\n code?: unknown;\n address?: unknown;\n port?: unknown;\n cause?: unknown;\n };\n\n const code =\n typeof record.code === \"string\" || typeof record.code === \"number\"\n ? record.code\n : undefined;\n if (code !== undefined) {\n codes.push(code);\n }\n\n const message =\n typeof record.message === \"string\" && record.message.trim()\n ? record.message.trim()\n : undefined;\n const address =\n typeof record.address === \"string\" && record.address.trim()\n ? record.address.trim()\n : undefined;\n const port = typeof record.port === \"number\" ? record.port : undefined;\n const endpoint =\n address || port !== undefined\n ? `${address ?? \"\"}${address && port !== undefined ? \":\" : \"\"}${port ?? \"\"}`.trim()\n : undefined;\n\n const detailParts = [\n code !== undefined && !message?.includes(String(code)) ? String(code) : undefined,\n message,\n endpoint && !message?.includes(endpoint) ? endpoint : undefined,\n ].filter((part): part is string => typeof part === \"string\" && part.length > 0);\n\n if (detailParts.length > 0) {\n parts.push(detailParts.join(\" \"));\n } else if (typeof record.name === \"string\" && record.name.trim()) {\n parts.push(record.name.trim());\n }\n\n if (record.cause !== undefined) {\n collectMqttErrorParts(record.cause, parts, codes);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"mqtt-proxy.js","sourceRoot":"","sources":["../../src/uns-mqtt/mqtt-proxy.ts"],"names":[],"mappings":"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","sourcesContent":["import { SubscriptionReadiness } from \"./subscription-readiness.js\";\nimport mqtt, { IClientOptions, MqttClient } from \"mqtt\";\nimport logger from \"../logger.js\";\nimport { UnsEvents } from \"../uns/uns-interfaces.js\";\nimport { UnsEventEmitter } from \"../uns/uns-event-emitter.js\";\nimport { IMqttParameters } from \"./mqtt-interfaces.js\";\nimport { MqttWorker } from \"./mqtt-worker.js\";\nimport { DataSizeMeasurements, PhysicalMeasurements } from \"../uns/uns-measurements.js\";\n\nexport type MqttStopOptions = {\n silent?: boolean;\n force?: boolean;\n reason?: \"retry\" | \"shutdown\";\n};\n\ntype MqttErrorInfo = {\n code: string | number;\n message: string;\n};\n\nexport default class MqttProxy {\n public event: UnsEventEmitter<UnsEvents> = new UnsEventEmitter<UnsEvents>();\n public statusTopic: string;\n public instanceName: string;\n private mqttHost: string;\n private mqttSubToTopics: string | string[];\n private mqttSSL: boolean;\n private mqttClient: MqttClient;\n private startDate: Date;\n private mqttParameters: IMqttParameters;\n private statusUpdateInterval: ReturnType<typeof setInterval>;\n private transformationStatsInterval: NodeJS.Timeout | null = null;\n private publishedMessageCount = 0;\n private publishedMessageBytes = 0;\n private subscribedMessageCount = 0;\n private subscribedMessageBytes = 0;\n private mqttWorker: MqttWorker;\n public isConnected = false;\n public isHandoverInputReady(): boolean { return this.subscriptionReadiness.handoverReady(); }\n private subscriptionReadiness = new SubscriptionReadiness();\n private lastSubscriptionReady: boolean | null = null;\n private rejectUnauthorized: boolean;\n private pendingReconnectWait: Promise<void> | null = null;\n private hasEstablishedConnection = false;\n private startupSettled = false;\n private startupResolve: (() => void) | null = null;\n private startupReject: ((error: unknown) => void) | null = null;\n\n constructor(mqttHost: string, instanceName: string, mqttParameters: IMqttParameters, mqttWorker?: MqttWorker) {\n this.mqttSSL = mqttParameters?.mqttSSL ?? false;\n this.rejectUnauthorized = mqttParameters.rejectUnauthorized ?? false;\n this.mqttSubToTopics = mqttParameters?.mqttSubToTopics ?? [];\n this.mqttHost = mqttHost;\n this.startDate = new Date();\n this.instanceName = instanceName ?? \"process\";\n this.statusTopic = `${mqttParameters?.statusTopic}`;\n this.mqttParameters = mqttParameters ?? {};\n this.mqttWorker = mqttWorker;\n }\n\n private resolveProtocol(): IMqttParameters[\"protocol\"] {\n return this.mqttParameters.protocol ?? (this.mqttSSL ? \"mqtts\" : \"mqtt\");\n }\n\n private resolveDefaultPort(protocol: IMqttParameters[\"protocol\"]): number {\n switch (protocol) {\n case \"mqtts\":\n case \"ssl\":\n return 8883;\n case \"wss\":\n return 443;\n case \"ws\":\n return 80;\n case \"tcp\":\n case \"mqtt\":\n default:\n return 1883;\n }\n }\n\n private ensureStatusUpdateInterval(): void {\n if (this.statusTopic && !this.statusUpdateInterval) {\n this.statusUpdateInterval = setInterval(() => this.emitStatusUpdates(), 10000);\n }\n }\n\n private ensureTransformationStatsInterval(): void {\n if (!this.transformationStatsInterval) {\n this.transformationStatsInterval = setInterval(() => {\n this.emitTransformationStatistics();\n }, 60000);\n }\n }\n\n private lastTransportConnected: boolean | undefined;\n private emitSubscriptionReadiness(force = false): void {\n if(force || this.lastTransportConnected!==this.isConnected){\n this.lastTransportConnected=this.isConnected;\n this.event.emit(\"mqttProxyStatus\",{event:\"mqtt-connected\",value:this.isConnected?1:0,uom:DataSizeMeasurements.Bit,statusTopic:this.statusTopic+\"mqtt-connected\"});\n }\n const ready = this.subscriptionReadiness.ready();\n if (!force && ready === this.lastSubscriptionReady) return;\n this.lastSubscriptionReady = ready;\n this.event.emit(\"mqttProxyStatus\", {event: \"mqtt-subscriptions-ready\", value: ready ? 1 : 0,\n uom: DataSizeMeasurements.Bit, statusTopic: this.statusTopic + \"mqtt-subscriptions-ready\"});\n }\n\n private subscribeToTopics(): void {\n if (this.mqttSubToTopics && this.mqttSubToTopics.length > 0) {\n logger.debug(`${this.instanceName} - Subscribed to ${this.mqttSubToTopics.length} topics.`);\n this.mqttClient.subscribe(this.mqttSubToTopics, { qos: 0 });\n }\n }\n\n private buildServers(defaultProtocol: IMqttParameters[\"protocol\"]): IClientOptions[\"servers\"] | undefined {\n const servers: IClientOptions[\"servers\"] = [];\n const { port } = this.mqttParameters;\n const protocol = this.mqttParameters.protocol ?? defaultProtocol;\n\n if (Array.isArray(this.mqttParameters.servers) && this.mqttParameters.servers.length > 0) {\n for (const server of this.mqttParameters.servers) {\n if (!server?.host) continue;\n const resolvedProtocol = server.protocol ?? protocol;\n const resolvedPort =\n typeof server.port === \"number\"\n ? server.port\n : typeof port === \"number\"\n ? port\n : this.resolveDefaultPort(resolvedProtocol);\n const entry: { host: string; port: number; protocol?: IMqttParameters[\"protocol\"] } = {\n host: server.host,\n port: resolvedPort,\n };\n if (resolvedProtocol) {\n entry.protocol = resolvedProtocol;\n }\n servers.push(entry);\n }\n } else if (Array.isArray(this.mqttParameters.hosts) && this.mqttParameters.hosts.length > 0) {\n for (const host of this.mqttParameters.hosts) {\n if (!host) continue;\n const resolvedPort = typeof port === \"number\" ? port : this.resolveDefaultPort(protocol);\n const entry: { host: string; port: number; protocol?: IMqttParameters[\"protocol\"] } = {\n host,\n port: resolvedPort,\n };\n if (protocol) {\n entry.protocol = protocol;\n }\n servers.push(entry);\n }\n }\n\n return servers.length > 0 ? servers : undefined;\n }\n\n public async start(): Promise<void> {\n logger.debug(`${this.instanceName} - Connecting to MQTT broker...`);\n this.startupSettled = false;\n\n return new Promise<void>((resolve, reject) => {\n this.startupResolve = resolve;\n this.startupReject = reject;\n try {\n const username = this.mqttParameters.username;\n const password = this.mqttParameters.password;\n const clientId = this.mqttParameters.clientId ?? this.instanceName;\n const protocol = this.resolveProtocol();\n\n const options: IClientOptions = {\n username,\n password,\n protocolVersion: 5,\n rejectUnauthorized: this.rejectUnauthorized,\n keepalive: this.mqttParameters.keepalive,\n clean: this.mqttParameters.clean ?? true,\n connectTimeout: this.mqttParameters.connectTimeout,\n reconnectPeriod: this.mqttParameters.reconnectPeriod,\n reconnectOnConnackError: this.mqttParameters.reconnectOnConnackError,\n resubscribe: this.mqttParameters.resubscribe,\n queueQoSZero: this.mqttParameters.queueQoSZero,\n properties: this.mqttParameters.properties,\n ca: this.mqttParameters.ca,\n cert: this.mqttParameters.cert,\n key: this.mqttParameters.key,\n servername: this.mqttParameters.servername,\n \n will: {\n topic: `${this.statusTopic}alive`,\n payload: Buffer.from(\"\"),\n qos: 0,\n retain: true,\n properties: { messageExpiryInterval: 3600 },\n },\n clientId,\n };\n\n const servers = this.buildServers(protocol);\n if (servers) {\n options.servers = servers;\n options.protocol = protocol;\n this.mqttClient = mqtt.connect(options);\n } else {\n options.host = this.mqttHost;\n options.port = this.mqttParameters.port;\n options.protocol = protocol;\n this.mqttClient = mqtt.connect(options);\n }\n\n const onConnect = () => this.handleMqttConnect();\n\n this.mqttClient.on(\"connect\", onConnect);\n this.mqttClient.on(\"packetsend\", packet => {\n this.subscriptionReadiness.sent(packet as Parameters<SubscriptionReadiness[\"sent\"]>[0]);\n this.emitSubscriptionReadiness();\n });\n this.mqttClient.on(\"packetreceive\", packet => {\n this.subscriptionReadiness.received(packet as Parameters<SubscriptionReadiness[\"received\"]>[0]);\n this.emitSubscriptionReadiness();\n });\n\n this.mqttClient.on(\"message\", (topic: string, message: Buffer, packet: mqtt.IPublishPacket) => {\n try {\n logger.debug(`${this.instanceName} - Message received on topic ${topic}`);\n this.event.emit(\"input\", {\n message: message.toString(),\n topic: topic,\n packet: packet,\n });\n this.updateSubscribeTransformationStats(message.length);\n } catch (error) {\n logger.error(`${this.instanceName} - Error in MQTT message handler: ${error.message}`);\n }\n });\n\n this.mqttClient.on(\"error\", (error) => {\n const errorInfo = formatMqttError(error);\n logger.error(`${this.instanceName} - MQTT client error: ${errorInfo.message}`);\n this.isConnected = false;\n this.subscriptionReadiness.connection(false);\n this.emitSubscriptionReadiness();\n this.event.emit(\"error\", {\n code: typeof errorInfo.code === \"number\" ? errorInfo.code : 0,\n message: errorInfo.message,\n });\n reject(error);\n });\n\n this.mqttClient.on(\"reconnect\", () => {\n logger.debug(`${this.instanceName} - Attempting to reconnect to MQTT broker...`);\n });\n\n this.mqttClient.on(\"close\", () => {\n logger.debug(`${this.instanceName} - MQTT connection closed.`);\n this.isConnected = false;\n this.subscriptionReadiness.connection(false);\n this.emitSubscriptionReadiness();\n });\n\n this.mqttClient.on(\"offline\", () => {\n logger.debug(`${this.instanceName} - MQTT client is offline.`);\n this.isConnected = false;\n this.subscriptionReadiness.connection(false);\n this.emitSubscriptionReadiness();\n });\n\n this.mqttClient.on(\"end\", () => {\n logger.debug(`${this.instanceName} - MQTT client connection ended.`);\n this.isConnected = false;\n this.subscriptionReadiness.connection(false);\n this.emitSubscriptionReadiness();\n });\n\n this.mqttClient.on(\"disconnect\", (packet) => {\n logger.debug(`${this.instanceName} - MQTT client disconnected. Reason: ${packet?.reasonCode}`);\n this.isConnected = false;\n this.subscriptionReadiness.connection(false);\n this.emitSubscriptionReadiness();\n });\n } catch (error) {\n logger.error(`${this.instanceName} - Error starting MQTT proxy: ${formatMqttError(error).message}`);\n this.isConnected = false;\n this.subscriptionReadiness.connection(false);\n this.emitSubscriptionReadiness();\n reject(error);\n }\n });\n }\n\n public async publish(topic: string, message: string | Buffer, options?: mqtt.IClientPublishOptions): Promise<void> {\n this.updatePublishTransformationStats(JSON.stringify(message).length);\n const client = this.mqttClient;\n if (!client) {\n throw new Error(`${this.instanceName} - MQTT client missing; cannot publish to ${topic}`);\n }\n\n if (!client.connected) {\n // Wait briefly for reconnection before giving up.\n await this.waitForReconnect(client, 5000);\n }\n\n if (!client.connected) {\n throw new Error(`${this.instanceName} - MQTT client still disconnected; publish failed for ${topic}`);\n }\n\n return new Promise((resolve, reject) => {\n client.publish(topic, message, options || {}, (err) => {\n if (err) {\n logger.error(`${this.instanceName} - Error publishing to topic ${topic}: ${err.message}`);\n return reject(err);\n }\n logger.debug(`${this.instanceName} - Published message to topic ${topic}`);\n resolve();\n });\n });\n }\n\n /** A bounded delivery attempt for the SDK outbox. Expired attempts retire their socket. */\n public async publishConfirmed(topic: string, message: string, options: mqtt.IClientPublishOptions, timeoutMs: number): Promise<void> {\n let timer: ReturnType<typeof setTimeout>;\n let timedOut = false;\n try {\n await Promise.race([\n this.publish(topic, message, options),\n new Promise<never>((_, reject) => { timer = setTimeout(() => {\n timedOut = true;\n reject(new Error(\"MQTT broker acknowledgement timed out; delivery outcome unknown\"));\n }, timeoutMs); }),\n ]);\n } finally {\n clearTimeout(timer);\n if (timedOut) {\n // Do not retry alongside mqtt.js's old in-flight operation. A late PUBACK may\n // already have followed delivery: the outbox deliberately permits replay.\n await this.stop({ silent: true, reason: \"retry\", force: true });\n void this.start().catch((): void => {});\n }\n }\n }\n\n public async subscribeAsync(topic: string | string[], options?: mqtt.IClientSubscribeOptions): Promise<mqtt.ISubscriptionGrant[]> {\n return this.mqttClient.subscribeAsync(topic, options);\n }\n\n public async unsubscribeAsync(topic: string | string[]): Promise<mqtt.Packet | undefined> {\n const topics = Array.isArray(topic) ? topic.filter((t) => typeof t === \"string\" && t.length > 0) : [topic].filter((t): t is string => typeof t === \"string\" && t.length > 0);\n if (topics.length === 0) {\n logger.warn(`${this.instanceName} - unsubscribeAsync called with empty topic list; skipping.`);\n return Promise.resolve(undefined);\n }\n return this.mqttClient.unsubscribeAsync(topics);\n }\n\n public stop(options: MqttStopOptions = {}): Promise<void> {\n const silent = options.silent === true || options.reason === \"retry\";\n const shouldLogDisconnect = !silent && this.hasEstablishedConnection;\n\n if (shouldLogDisconnect) {\n logger.debug(`${this.instanceName} - Disconnecting from MQTT broker...`);\n }\n\n return new Promise((resolve, reject) => {\n const resetState = () => {\n this.isConnected = false;\n this.subscriptionReadiness.connection(false);\n this.emitSubscriptionReadiness();\n this.pendingReconnectWait = null;\n this.startupSettled = false;\n this.hasEstablishedConnection = false;\n this.startupResolve = null;\n this.startupReject = null;\n };\n\n try {\n if (this.statusUpdateInterval) {\n clearInterval(this.statusUpdateInterval);\n this.statusUpdateInterval = null;\n }\n if (this.transformationStatsInterval) {\n clearInterval(this.transformationStatsInterval);\n this.transformationStatsInterval = null;\n }\n if (this.mqttClient) {\n this.mqttClient.end(options.force ?? false, () => {\n resetState();\n if (shouldLogDisconnect) {\n logger.debug(`${this.instanceName} - Disconnected from MQTT broker.`);\n }\n resolve();\n });\n } else {\n resetState();\n resolve();\n }\n } catch (error) {\n resetState();\n const reason = error instanceof Error ? error : new Error(String(error));\n if (!silent) {\n logger.error(`${this.instanceName} - Error during stop: ${formatMqttError(reason).message}`);\n }\n reject(reason);\n }\n });\n }\n\n private handleMqttConnect(): void {\n const resolve = this.startupResolve;\n const reject = this.startupReject;\n if (!resolve || !reject) {\n return;\n }\n\n try {\n this.mqttClient.stream.setMaxListeners(0);\n const isFirstConnect = !this.startupSettled;\n this.startupSettled = true;\n this.hasEstablishedConnection = true;\n this.isConnected = true;\n this.subscriptionReadiness.connection(true);\n this.emitSubscriptionReadiness();\n\n if (isFirstConnect) {\n logger.info(`${this.instanceName} - Connected to MQTT broker at ${this.mqttHost}`);\n this.subscribeToTopics();\n this.ensureStatusUpdateInterval();\n this.ensureTransformationStatsInterval();\n resolve();\n return;\n }\n\n logger.info(`${this.instanceName} - Reconnected to MQTT broker at ${this.mqttHost}`);\n if (this.mqttParameters.resubscribe === false) {\n this.subscribeToTopics();\n }\n this.ensureStatusUpdateInterval();\n this.ensureTransformationStatsInterval();\n } catch (error) {\n logger.error(`${this.instanceName} - Error in MQTT connect handler: ${formatMqttError(error).message}`);\n this.isConnected = false;\n this.subscriptionReadiness.connection(false);\n this.emitSubscriptionReadiness();\n reject(error);\n }\n }\n\n private emitStatusUpdates() {\n try {\n this.emitSubscriptionReadiness(true);\n const uptime = Math.round((new Date().getTime() - this.startDate.getTime()) / 60000);\n this.event.emit(\"mqttProxyStatus\", { event: \"uptime\", value: uptime, uom: PhysicalMeasurements.Minute, statusTopic: this.statusTopic + \"uptime\" });\n this.event.emit(\"mqttProxyStatus\", { event: \"alive\", value: 1, uom: DataSizeMeasurements.Bit, statusTopic: this.statusTopic + \"alive\" });\n\n if (this.mqttWorker !== undefined) {\n const tpValue = this.mqttWorker.getPublisherState() ? 1 : 0;\n this.event.emit(\"mqttProxyStatus\", { event: \"t-publisher-active\", value: tpValue, uom: DataSizeMeasurements.Bit, statusTopic: this.statusTopic + \"t-publisher-active\" });\n const tsValue = this.mqttWorker.getSubscriberState() ? 1 : 0;\n this.event.emit(\"mqttProxyStatus\", { event: \"t-subscriber-active\", value: tsValue, uom: DataSizeMeasurements.Bit, statusTopic: this.statusTopic + \"t-subscriber-active\" });\n }\n } catch (error) {\n logger.error(`${this.instanceName} - Error publishing MQTT status: ${error.message}`);\n }\n }\n\n private updatePublishTransformationStats(messageSizeOut: number): void {\n this.publishedMessageCount += 1;\n this.publishedMessageBytes += messageSizeOut;\n }\n\n private updateSubscribeTransformationStats(messageSizeIn: number): void {\n this.subscribedMessageCount += 1;\n this.subscribedMessageBytes += messageSizeIn;\n }\n\n private waitForReconnect(client: mqtt.MqttClient, timeoutMs: number): Promise<void> {\n if (client.connected) {\n return Promise.resolve();\n }\n\n if (this.pendingReconnectWait) {\n return this.pendingReconnectWait;\n }\n\n this.pendingReconnectWait = new Promise<void>((resolve) => {\n if (client.connected) return resolve();\n\n const onConnect = () => {\n cleanup();\n resolve();\n };\n const onClose = () => {\n // stay waiting; close is expected during reconnect attempts\n };\n const cleanup = () => {\n client.off(\"connect\", onConnect);\n client.off(\"close\", onClose);\n };\n\n client.on(\"connect\", onConnect);\n client.on(\"close\", onClose);\n\n setTimeout(() => {\n cleanup();\n resolve();\n }, timeoutMs).unref?.();\n }).finally(() => {\n this.pendingReconnectWait = null;\n });\n\n return this.pendingReconnectWait;\n }\n\n private async emitTransformationStatistics(): Promise<void> {\n if (this.statusTopic !== \"\") {\n try {\n this.event.emit(\"mqttProxyStatus\", {\n event: \"published-message-count\",\n value: this.publishedMessageCount,\n uom: \"\",\n statusTopic: this.statusTopic + \"published-message-count\",\n });\n this.event.emit(\"mqttProxyStatus\", {\n event: \"published-message-bytes\",\n value: Math.round(this.publishedMessageBytes / 1024),\n uom: DataSizeMeasurements.KiloByte,\n statusTopic: this.statusTopic + \"published-message-bytes\",\n });\n this.event.emit(\"mqttProxyStatus\", {\n event: \"subscribed-message-count\",\n value: this.subscribedMessageCount,\n uom: \"\",\n statusTopic: this.statusTopic + \"subscribed-message-count\",\n });\n this.event.emit(\"mqttProxyStatus\", {\n event: \"subscribed-message-bytes\",\n value: Math.round(this.subscribedMessageBytes / 1024),\n uom: DataSizeMeasurements.KiloByte,\n statusTopic: this.statusTopic + \"subscribed-message-bytes\",\n });\n this.publishedMessageCount = 0;\n this.publishedMessageBytes = 0;\n this.subscribedMessageCount = 0;\n this.subscribedMessageBytes = 0;\n } catch (error: any) {\n this.publishedMessageCount = 0;\n this.publishedMessageBytes = 0;\n this.subscribedMessageCount = 0;\n this.subscribedMessageBytes = 0;\n logger.error(`${this.instanceName} - Error emitting transformation statistics: ${error.message}`);\n }\n }\n }\n}\n\nexport function formatMqttError(error: unknown): MqttErrorInfo {\n const parts: string[] = [];\n const codes: Array<string | number> = [];\n collectMqttErrorParts(error, parts, codes);\n\n const uniqueParts = Array.from(new Set(parts.map((part) => part.trim()).filter(Boolean)));\n const message = uniqueParts.join(\"; \") || \"Unknown MQTT error\";\n\n return {\n code: codes[0] ?? 0,\n message,\n };\n}\n\nfunction collectMqttErrorParts(\n error: unknown,\n parts: string[],\n codes: Array<string | number>,\n): void {\n if (error instanceof AggregateError) {\n if (typeof error.message === \"string\" && error.message.trim()) {\n parts.push(error.message.trim());\n }\n for (const nested of error.errors) {\n collectMqttErrorParts(nested, parts, codes);\n }\n return;\n }\n\n if (typeof error === \"string\") {\n if (error.trim()) {\n parts.push(error.trim());\n }\n return;\n }\n\n if (!error || typeof error !== \"object\") {\n return;\n }\n\n const record = error as {\n message?: unknown;\n name?: unknown;\n code?: unknown;\n address?: unknown;\n port?: unknown;\n cause?: unknown;\n };\n\n const code =\n typeof record.code === \"string\" || typeof record.code === \"number\"\n ? record.code\n : undefined;\n if (code !== undefined) {\n codes.push(code);\n }\n\n const message =\n typeof record.message === \"string\" && record.message.trim()\n ? record.message.trim()\n : undefined;\n const address =\n typeof record.address === \"string\" && record.address.trim()\n ? record.address.trim()\n : undefined;\n const port = typeof record.port === \"number\" ? record.port : undefined;\n const endpoint =\n address || port !== undefined\n ? `${address ?? \"\"}${address && port !== undefined ? \":\" : \"\"}${port ?? \"\"}`.trim()\n : undefined;\n\n const detailParts = [\n code !== undefined && !message?.includes(String(code)) ? String(code) : undefined,\n message,\n endpoint && !message?.includes(endpoint) ? endpoint : undefined,\n ].filter((part): part is string => typeof part === \"string\" && part.length > 0);\n\n if (detailParts.length > 0) {\n parts.push(detailParts.join(\" \"));\n } else if (typeof record.name === \"string\" && record.name.trim()) {\n parts.push(record.name.trim());\n }\n\n if (record.cause !== undefined) {\n collectMqttErrorParts(record.cause, parts, codes);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mqtt-worker.d.ts","sourceRoot":"","sources":["../../src/uns-mqtt/mqtt-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAOtD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE/E,qBAAa,UAAU;IACrB,OAAO,CAAC,SAAS,CAAY;IAC7B,SAAS,CAAC,SAAS,EAAE,kBAAkB,GAAG,gBAAgB,CAAC;IAC3D,SAAS,CAAC,UAAU,EAAE,mBAAmB,CAAC;IAC1C,OAAO,CAAC,qBAAqB,CAAC,CAAwB;gBAE1C,UAAU,EAAE,eAAe;IAyFvC;;OAEG;IACH,OAAO,CAAC,yBAAyB;
|
|
1
|
+
{"version":3,"file":"mqtt-worker.d.ts","sourceRoot":"","sources":["../../src/uns-mqtt/mqtt-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAOtD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE/E,qBAAa,UAAU;IACrB,OAAO,CAAC,SAAS,CAAY;IAC7B,SAAS,CAAC,SAAS,EAAE,kBAAkB,GAAG,gBAAgB,CAAC;IAC3D,SAAS,CAAC,UAAU,EAAE,mBAAmB,CAAC;IAC1C,OAAO,CAAC,qBAAqB,CAAC,CAAwB;gBAE1C,UAAU,EAAE,eAAe;IAyFvC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IA6FjC;;OAEG;IACI,iBAAiB,IAAI,OAAO;IAGnC;;OAEG;IACI,kBAAkB,IAAI,OAAO;CAIrC"}
|
|
@@ -142,6 +142,17 @@ export class MqttWorker {
|
|
|
142
142
|
else if (msg && msg.command === "unsubscribeAsync" && msg.topics) {
|
|
143
143
|
this.mqttProxy.unsubscribeAsync(msg.topics);
|
|
144
144
|
}
|
|
145
|
+
else if (msg?.command === "previewSubscriberInput" || msg?.command === "reviewSubscriberInput") {
|
|
146
|
+
try {
|
|
147
|
+
if (!this.mqttProxy.isHandoverInputReady())
|
|
148
|
+
throw Error("MQTT input subscriptions are not ready");
|
|
149
|
+
const result = msg.command === "previewSubscriberInput" ? this.subscriber.getInputPreview() : this.subscriber.canResumeInput(msg.preview);
|
|
150
|
+
parentPort?.postMessage({ command: "publishQueueReply", id: msg.id, status: "success", result });
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
parentPort?.postMessage({ command: "publishQueueReply", id: msg.id, status: "error", error: "MQTT input boundary review unavailable" });
|
|
154
|
+
}
|
|
155
|
+
}
|
|
145
156
|
else if (msg?.command === "prepareSubscriberResume" || msg?.command === "activatePreparedSubscriber") {
|
|
146
157
|
try {
|
|
147
158
|
if (msg.command === "prepareSubscriberResume")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mqtt-worker.js","sourceRoot":"","sources":["../../src/uns-mqtt/mqtt-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,MAAM,MAAM,cAAc,CAAC;AAElC,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE/E,MAAM,OAAO,UAAU;IACb,SAAS,CAAY;IACnB,SAAS,CAAwC;IACjD,UAAU,CAAsB;IAClC,qBAAqB,CAAyB;IAEtD,YAAY,UAA2B;QACrC,MAAM,sBAAsB,GAAG,UAAU,CAAC,sBAAsB,IAAI,CAAC,CAAC;QACtE,MAAM,kBAAkB,GAAG,UAAU,CAAC,kBAAkB,IAAI,CAAC,CAAC;QAC9D,MAAM,mBAAmB,GAAG,UAAU,CAAC,mBAAmB,CAAC;QAC3D,MAAM,wBAAwB,GAAG,UAAU,CAAC,wBAAwB,IAAI,CAAC,CAAC;QAC1E,MAAM,aAAa,GAAG,UAAU,CAAC,aAAa,IAAI,KAAK,CAAC;QACxD,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;QACrC,MAAM,YAAY,GAAG,UAAU,CAAC,sBAAsB,CAAC;QACvD,MAAM,cAAc,GAAG,UAAU,CAAC,cAAc,CAAC;QACjD,MAAM,eAAe,GAAG,UAAU,CAAC,eAAe,CAAC;QACnD,MAAM,gBAAgB,GAAG,UAAU,CAAC,gBAAgB,CAAC;QACrD,MAAM,qBAAqB,GAAG,UAAU,CAAC,qBAAqB,CAAC;QAC/D,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAC;QAEnD,uCAAuC;QACvC,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;QAC7E,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,GAAS,EAAE,GAAE,CAAC,CAAC,CAAC;QAEnD,uEAAuE;QACvE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACzC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,qEAAqE;QACrE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,EAAE;YACnD,UAAU,EAAE,WAAW,CAAC;gBACtB,OAAO,EAAE,iBAAiB;gBAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,GAAG,EAAE,KAAK,CAAC,GAAG;aACf,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,oEAAoE;QACpE,MAAM,eAAe,GAAG,KAAK,EAAE,KAAa,EAAE,OAAe,EAAE,EAAU,EAAE,OAA+B,EAAiB,EAAE;YAC3H,MAAM,cAAc,GAAG,OAAO,IAAI,qBAAqB,CAAC;YACxD,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;YAC/D,CAAC;YAAC,OAAO,MAAW,EAAE,CAAC;gBACrB,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,wCAAwC,KAAK,KAAK,MAAM,EAAE,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACnH,MAAM,MAAM,CAAC;YACf,CAAC;QACH,CAAC,CAAC;QAEF,4CAA4C;QAC5C,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;YAC5B,IAAI,kBAAkB,KAAK,CAAC,IAAI,aAAa;gBAAE,MAAM,KAAK,CAAC,iGAAiG,CAAC,CAAC;YAC9J,IAAI,CAAC,UAAU,CAAC,oBAAoB;gBAAE,MAAM,KAAK,CAAC,oEAAoE,CAAC,CAAC;YACxH,IAAI,CAAC,SAAS,GAAG,IAAI,gBAAgB,CAAC,UAAU,CAAC,YAAY,EAAE,UAAU,CAAC,oBAAoB,EAC5F,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EACpF,UAAU,CAAC,YAAY,CAAC,gBAAgB,IAAI,KAAK,CAAC,EAAE,eAAe,EACrE,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAClF,CAAC;aAAM,CAAC;YACR,IAAI,CAAC,SAAS,GAAG,IAAI,kBAAkB,CACrC,sBAAsB,EACtB,eAAe,EACf,aAAa,EACb,IAAI,CAAC,QAAQ,EAAE,eAAe,EAAE,gCAAgC,CAAC,EACjE,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,mBAAmB,CACpB,CAAC;QACF,CAAC;QAED,oDAAoD;QACpD,MAAM,cAAc,GAAG,KAAK,EAAE,KAAa,EAAE,OAAe,EAAiB,EAAE;YAC7E,UAAU,EAAE,WAAW,CAAC;gBACtB,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,OAAO;aACjB,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,6CAA6C;QAC7C,IAAI,CAAC,UAAU,GAAG,IAAI,mBAAmB,CACvC,wBAAwB,EACxB,cAAc,EACd,aAAa,EACb,IAAI,CAAC,QAAQ,EAAE,eAAe,EAAE,iCAAiC,CAAC,EAClE,YAAY,EACZ,gBAAgB,CACjB,CAAC;QAEF,iEAAiE;QACjE,IAAI,CAAC,yBAAyB,EAAE,CAAC;IACnC,CAAC;IAED;;OAEG;IACK,yBAAyB;QAC/B,UAAU,EAAE,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACtC,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBACzF,IAAI,CAAC;oBACH,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,qBAAqB,CAAC,CAAC;oBAChI,UAAU,EAAE,WAAW,CAAC;wBACtB,OAAO,EAAE,iBAAiB;wBAC1B,EAAE,EAAE,GAAG,CAAC,EAAE;wBACV,MAAM,EAAE,UAAU;qBACnB,CAAC,CAAC;oBACH,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;oBAC1B,KAAK,cAAc;yBAChB,IAAI,CAAC,GAAG,EAAE;wBACT,UAAU,EAAE,WAAW,CAAC;4BACtB,OAAO,EAAE,eAAe;4BACxB,EAAE;4BACF,MAAM,EAAE,SAAS;4BACjB,KAAK;yBACN,CAAC,CAAC;oBACL,CAAC,CAAC;yBACD,KAAK,CAAC,CAAC,KAAU,EAAE,EAAE;wBACpB,UAAU,EAAE,WAAW,CAAC;4BACtB,OAAO,EAAE,eAAe;4BACxB,EAAE;4BACF,MAAM,EAAE,OAAO;4BACf,KAAK;4BACL,KAAK,EAAE,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC;yBACvC,CAAC,CAAC;oBACL,CAAC,CAAC,CAAC;gBACP,CAAC;gBAAC,OAAO,KAAU,EAAE,CAAC;oBACpB,UAAU,EAAE,WAAW,CAAC;wBACtB,OAAO,EAAE,iBAAiB;wBAC1B,EAAE,EAAE,GAAG,CAAC,EAAE;wBACV,MAAM,EAAE,OAAO;wBACf,KAAK,EAAE,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC;qBACvC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;iBAAM,IAAI,GAAG,EAAE,OAAO,KAAK,gBAAgB,IAAI,IAAI,CAAC,SAAS,YAAY,gBAAgB,EAAE,CAAC;gBAC3F,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;oBAChD,UAAU,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC3F,CAAC;gBAAC,MAAM,CAAC;oBACP,UAAU,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,6DAA6D,EAAE,CAAC,CAAC;gBAC/J,CAAC;YACH,CAAC;iBAAM,IAAI,GAAG,EAAE,OAAO,KAAK,gBAAgB,IAAI,IAAI,CAAC,SAAS,YAAY,gBAAgB,EAAE,CAAC;gBAC3F,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC3C,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;oBAC7B,UAAU,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC3F,CAAC;gBAAC,MAAM,CAAC;oBACP,UAAU,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,mEAAmE,EAAE,CAAC,CAAC;gBACrK,CAAC;YACH,CAAC;iBAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACjE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC5C,CAAC;iBAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,kBAAkB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACnE,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC9C,CAAC;iBAAM,IAAI,GAAG,EAAE,OAAO,KAAK,yBAAyB,IAAI,GAAG,EAAE,OAAO,KAAK,4BAA4B,EAAE,CAAC;gBACvG,IAAI,CAAC;oBACH,IAAI,GAAG,CAAC,OAAO,KAAK,yBAAyB;wBAAE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;;wBACpF,IAAI,CAAC,UAAU,CAAC,sBAAsB,EAAE,CAAC;oBAC9C,UAAU,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC3F,CAAC;gBAAC,MAAM,CAAC;oBACP,UAAU,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC,CAAC;gBACrI,CAAC;YACH,CAAC;iBAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,oBAAoB,EAAE,CAAC;gBACvD,IAAI,CAAC;oBAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAC,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,EAAC,CAAC,CAAC;gBAAC,CAAC;gBACpG,MAAM,CAAC;oBAAC,UAAU,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,KAAK,EAAE,0DAA0D,EAAE,CAAC,CAAC;gBAAC,CAAC;YAChJ,CAAC;iBAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,qBAAqB,EAAE,CAAC;gBACxD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;gBACvD,UAAU,EAAE,WAAW,CAAC;oBACtB,OAAO,EAAE,oBAAoB;oBAC7B,GAAG,QAAQ;iBACZ,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,qBAAqB,EAAE,CAAC;gBACxD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAC,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,EAAC,CAAC,CAAC;YAC/F,CAAC;iBAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,sBAAsB,EAAE,CAAC;gBACzD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;gBAC7E,UAAU,EAAE,WAAW,CAAC;oBACtB,OAAO,EAAE,qBAAqB;oBAC9B,GAAG,QAAQ;iBACZ,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,iBAAiB;QACtB,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;IACnC,CAAC;IACD;;OAEG;IACI,kBAAkB;QACvB,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;IACpC,CAAC;CAEF","sourcesContent":["import { MqttPublishQueue } from \"./publish-queue.js\";\nimport { IClientPublishOptions } from \"mqtt\";\nimport { join } from \"path\";\nimport { parentPort } from \"worker_threads\";\n\nimport { basePath } from \"../base-path.js\";\nimport logger from \"../logger.js\";\nimport { IMqttWorkerData } from \"./mqtt-interfaces.js\";\nimport MqttProxy from \"./mqtt-proxy.js\";\nimport { ThrottledPublisher, ThrottledSubscriber } from \"./throttled-queue.js\";\n\nexport class MqttWorker {\n private mqttProxy: MqttProxy;\n protected publisher: ThrottledPublisher | MqttPublishQueue;\n protected subscriber: ThrottledSubscriber;\n private defaultPublishOptions?: IClientPublishOptions;\n\n constructor(workerData: IMqttWorkerData) {\n const publishThrottlingDelay = workerData.publishThrottlingDelay ?? 1;\n const publishConcurrency = workerData.publishConcurrency ?? 1;\n const maxPendingPublishes = workerData.maxPendingPublishes;\n const subscribeThrottlingDelay = workerData.subscribeThrottlingDelay ?? 1;\n const persistToDisk = workerData.persistToDisk ?? false;\n const mqttHost = workerData.mqttHost;\n const instanceName = workerData.instanceNameWithSuffix;\n const mqttParameters = workerData.mqttParameters;\n const publisherActive = workerData.publisherActive;\n const subscriberActive = workerData.subscriberActive;\n const defaultPublishOptions = workerData.defaultPublishOptions;\n this.defaultPublishOptions = defaultPublishOptions;\n\n // Initialize and start the MQTT proxy.\n this.mqttProxy = new MqttProxy(mqttHost, instanceName, mqttParameters, this);\n void this.mqttProxy.start()?.catch((): void => {});\n\n // Set up the event listener for incoming messages from the MQTT proxy.\n this.mqttProxy.event.on(\"input\", (event) => {\n this.subscriber.enqueue(event.topic, event.message.toString());\n });\n\n // Set up the event listener for status messages from the MQTT proxy.\n this.mqttProxy.event.on(\"mqttProxyStatus\", (event) => {\n parentPort?.postMessage({\n command: \"mqttProxyStatus\",\n event: event.event,\n value: event.value,\n statusTopic: event.statusTopic,\n uom: event.uom,\n });\n });\n\n // Define the publish function to be used by the ThrottledPublisher.\n const publishFunction = async (topic: string, message: string, id: string, options?: IClientPublishOptions): Promise<void> => {\n const publishOptions = options ?? defaultPublishOptions;\n try {\n await this.mqttProxy.publish(topic, message, publishOptions);\n } catch (reason: any) {\n logger.error(`${instanceName} - Error publishing message to topic ${topic}: ${reason?.message ?? String(reason)}`);\n throw reason;\n }\n };\n\n // Create an instance of ThrottledPublisher.\n if (workerData.publishQueue) {\n if (publishConcurrency !== 1 || persistToDisk) throw Error(\"MQTT output persistence requires serial publishing and cannot combine with legacy persistToDisk\");\n if (!workerData.publishQueueIdentity) throw Error(\"MQTT outbox requires an explicit stable owner/destination identity\");\n this.publisher = new MqttPublishQueue(workerData.publishQueue, workerData.publishQueueIdentity,\n record => this.mqttProxy.publishConfirmed(record.topic, record.message, record.options,\n workerData.publishQueue.publishTimeoutMs ?? 10000), publisherActive,\n status => parentPort?.postMessage({ command: \"publishQueueStatus\", status }));\n } else {\n this.publisher = new ThrottledPublisher(\n publishThrottlingDelay,\n publishFunction,\n persistToDisk,\n join(basePath, \"/workerQueue/\", \"throttled-publisher-queue.json\"),\n instanceName,\n publisherActive,\n publishConcurrency,\n maxPendingPublishes,\n );\n }\n\n // Define the message handler for incoming messages.\n const messageHandler = async (topic: string, message: string): Promise<void> => {\n parentPort?.postMessage({\n command: \"input\",\n topic: topic,\n message: message,\n });\n };\n\n // Create an instance of ThrottledSubscriber.\n this.subscriber = new ThrottledSubscriber(\n subscribeThrottlingDelay,\n messageHandler,\n persistToDisk,\n join(basePath, \"/workerQueue/\", \"throttled-subscriber-queue.json\"),\n instanceName,\n subscriberActive,\n );\n\n // Set up the message listener for commands from the main thread.\n this.initializeMessageListener();\n }\n\n /**\n * Listen for incoming messages from the main thread and process them.\n */\n private initializeMessageListener(): void {\n parentPort?.on(\"message\", async (msg) => {\n if (msg && msg.command === \"enqueue\" && msg.id && msg.topic && msg.message !== undefined) {\n try {\n const publishPromise = this.publisher.enqueueOrThrow(msg.topic, msg.message, msg.id, msg.options ?? this.defaultPublishOptions);\n parentPort?.postMessage({\n command: \"enqueueAccepted\",\n id: msg.id,\n status: \"accepted\",\n });\n const { id, topic } = msg;\n void publishPromise\n .then(() => {\n parentPort?.postMessage({\n command: \"publishResult\",\n id,\n status: \"success\",\n topic,\n });\n })\n .catch((error: any) => {\n parentPort?.postMessage({\n command: \"publishResult\",\n id,\n status: \"error\",\n topic,\n error: error?.message ?? String(error),\n });\n });\n } catch (error: any) {\n parentPort?.postMessage({\n command: \"enqueueAccepted\",\n id: msg.id,\n status: \"error\",\n error: error?.message ?? String(error),\n });\n }\n } else if (msg?.command === \"flushPublishes\" && this.publisher instanceof MqttPublishQueue) {\n try {\n await this.publisher.waitForIdle(msg.timeoutMs);\n parentPort?.postMessage({ command: \"publishQueueReply\", id: msg.id, status: \"success\" });\n } catch {\n parentPort?.postMessage({ command: \"publishQueueReply\", id: msg.id, status: \"error\", error: \"MQTT queue drain failed or timed out; pending work retained\" });\n }\n } else if (msg?.command === \"closePublisher\" && this.publisher instanceof MqttPublishQueue) {\n try {\n await this.mqttProxy.stop({ force: true });\n await this.publisher.close();\n parentPort?.postMessage({ command: \"publishQueueReply\", id: msg.id, status: \"success\" });\n } catch {\n parentPort?.postMessage({ command: \"publishQueueReply\", id: msg.id, status: \"error\", error: \"MQTT output could not be safely persisted/closed; worker retained\" });\n }\n } else if (msg && msg.command === \"subscribeAsync\" && msg.topics) {\n this.mqttProxy.subscribeAsync(msg.topics);\n } else if (msg && msg.command === \"unsubscribeAsync\" && msg.topics) {\n this.mqttProxy.unsubscribeAsync(msg.topics);\n } else if (msg?.command === \"prepareSubscriberResume\" || msg?.command === \"activatePreparedSubscriber\") {\n try {\n if (msg.command === \"prepareSubscriberResume\") this.subscriber.prepareResume(msg.cursor);\n else this.subscriber.activatePreparedResume();\n parentPort?.postMessage({ command: \"publishQueueReply\", id: msg.id, status: \"success\" });\n } catch {\n parentPort?.postMessage({ command: \"publishQueueReply\", id: msg.id, status: \"error\", error: \"MQTT subscriber resume not proven\" });\n }\n } else if (msg && msg.command === \"setPublisherActive\") {\n try { this.publisher.becomeActive({batchSize: msg?.batchSize, referenceHash: msg?.referenceHash}); }\n catch { parentPort?.postMessage({ command: \"publishQueueControlError\", error: \"Persistent output cannot resume using a legacy skip hash\" }); }\n } else if (msg && msg.command === \"setPublisherPassive\") {\n const snapshot = await this.publisher.becomePassive(3);\n parentPort?.postMessage({\n command: \"handover_publisher\",\n ...snapshot\n }); \n } else if (msg && msg.command === \"setSubscriberActive\") {\n this.subscriber.becomeActive({batchSize: msg?.batchSize, referenceHash: msg?.referenceHash});\n } else if (msg && msg.command === \"setSubscriberPassive\") {\n const snapshot = await this.subscriber.becomePassive(3, msg.strict === true);\n parentPort?.postMessage({\n command: \"handover_subscriber\",\n ...snapshot\n }); \n }\n });\n }\n\n /**\n * Get the state of the publisher.\n */\n public getPublisherState(): boolean {\n return this.publisher.getState();\n }\n /**\n * Get the state of the subscriber.\n */\n public getSubscriberState(): boolean {\n return this.subscriber.getState();\n }\n\n}\n"]}
|
|
1
|
+
{"version":3,"file":"mqtt-worker.js","sourceRoot":"","sources":["../../src/uns-mqtt/mqtt-worker.ts"],"names":[],"mappings":"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","sourcesContent":["import { MqttPublishQueue } from \"./publish-queue.js\";\nimport { IClientPublishOptions } from \"mqtt\";\nimport { join } from \"path\";\nimport { parentPort } from \"worker_threads\";\n\nimport { basePath } from \"../base-path.js\";\nimport logger from \"../logger.js\";\nimport { IMqttWorkerData } from \"./mqtt-interfaces.js\";\nimport MqttProxy from \"./mqtt-proxy.js\";\nimport { ThrottledPublisher, ThrottledSubscriber } from \"./throttled-queue.js\";\n\nexport class MqttWorker {\n private mqttProxy: MqttProxy;\n protected publisher: ThrottledPublisher | MqttPublishQueue;\n protected subscriber: ThrottledSubscriber;\n private defaultPublishOptions?: IClientPublishOptions;\n\n constructor(workerData: IMqttWorkerData) {\n const publishThrottlingDelay = workerData.publishThrottlingDelay ?? 1;\n const publishConcurrency = workerData.publishConcurrency ?? 1;\n const maxPendingPublishes = workerData.maxPendingPublishes;\n const subscribeThrottlingDelay = workerData.subscribeThrottlingDelay ?? 1;\n const persistToDisk = workerData.persistToDisk ?? false;\n const mqttHost = workerData.mqttHost;\n const instanceName = workerData.instanceNameWithSuffix;\n const mqttParameters = workerData.mqttParameters;\n const publisherActive = workerData.publisherActive;\n const subscriberActive = workerData.subscriberActive;\n const defaultPublishOptions = workerData.defaultPublishOptions;\n this.defaultPublishOptions = defaultPublishOptions;\n\n // Initialize and start the MQTT proxy.\n this.mqttProxy = new MqttProxy(mqttHost, instanceName, mqttParameters, this);\n void this.mqttProxy.start()?.catch((): void => {});\n\n // Set up the event listener for incoming messages from the MQTT proxy.\n this.mqttProxy.event.on(\"input\", (event) => {\n this.subscriber.enqueue(event.topic, event.message.toString());\n });\n\n // Set up the event listener for status messages from the MQTT proxy.\n this.mqttProxy.event.on(\"mqttProxyStatus\", (event) => {\n parentPort?.postMessage({\n command: \"mqttProxyStatus\",\n event: event.event,\n value: event.value,\n statusTopic: event.statusTopic,\n uom: event.uom,\n });\n });\n\n // Define the publish function to be used by the ThrottledPublisher.\n const publishFunction = async (topic: string, message: string, id: string, options?: IClientPublishOptions): Promise<void> => {\n const publishOptions = options ?? defaultPublishOptions;\n try {\n await this.mqttProxy.publish(topic, message, publishOptions);\n } catch (reason: any) {\n logger.error(`${instanceName} - Error publishing message to topic ${topic}: ${reason?.message ?? String(reason)}`);\n throw reason;\n }\n };\n\n // Create an instance of ThrottledPublisher.\n if (workerData.publishQueue) {\n if (publishConcurrency !== 1 || persistToDisk) throw Error(\"MQTT output persistence requires serial publishing and cannot combine with legacy persistToDisk\");\n if (!workerData.publishQueueIdentity) throw Error(\"MQTT outbox requires an explicit stable owner/destination identity\");\n this.publisher = new MqttPublishQueue(workerData.publishQueue, workerData.publishQueueIdentity,\n record => this.mqttProxy.publishConfirmed(record.topic, record.message, record.options,\n workerData.publishQueue.publishTimeoutMs ?? 10000), publisherActive,\n status => parentPort?.postMessage({ command: \"publishQueueStatus\", status }));\n } else {\n this.publisher = new ThrottledPublisher(\n publishThrottlingDelay,\n publishFunction,\n persistToDisk,\n join(basePath, \"/workerQueue/\", \"throttled-publisher-queue.json\"),\n instanceName,\n publisherActive,\n publishConcurrency,\n maxPendingPublishes,\n );\n }\n\n // Define the message handler for incoming messages.\n const messageHandler = async (topic: string, message: string): Promise<void> => {\n parentPort?.postMessage({\n command: \"input\",\n topic: topic,\n message: message,\n });\n };\n\n // Create an instance of ThrottledSubscriber.\n this.subscriber = new ThrottledSubscriber(\n subscribeThrottlingDelay,\n messageHandler,\n persistToDisk,\n join(basePath, \"/workerQueue/\", \"throttled-subscriber-queue.json\"),\n instanceName,\n subscriberActive,\n );\n\n // Set up the message listener for commands from the main thread.\n this.initializeMessageListener();\n }\n\n /**\n * Listen for incoming messages from the main thread and process them.\n */\n private initializeMessageListener(): void {\n parentPort?.on(\"message\", async (msg) => {\n if (msg && msg.command === \"enqueue\" && msg.id && msg.topic && msg.message !== undefined) {\n try {\n const publishPromise = this.publisher.enqueueOrThrow(msg.topic, msg.message, msg.id, msg.options ?? this.defaultPublishOptions);\n parentPort?.postMessage({\n command: \"enqueueAccepted\",\n id: msg.id,\n status: \"accepted\",\n });\n const { id, topic } = msg;\n void publishPromise\n .then(() => {\n parentPort?.postMessage({\n command: \"publishResult\",\n id,\n status: \"success\",\n topic,\n });\n })\n .catch((error: any) => {\n parentPort?.postMessage({\n command: \"publishResult\",\n id,\n status: \"error\",\n topic,\n error: error?.message ?? String(error),\n });\n });\n } catch (error: any) {\n parentPort?.postMessage({\n command: \"enqueueAccepted\",\n id: msg.id,\n status: \"error\",\n error: error?.message ?? String(error),\n });\n }\n } else if (msg?.command === \"flushPublishes\" && this.publisher instanceof MqttPublishQueue) {\n try {\n await this.publisher.waitForIdle(msg.timeoutMs);\n parentPort?.postMessage({ command: \"publishQueueReply\", id: msg.id, status: \"success\" });\n } catch {\n parentPort?.postMessage({ command: \"publishQueueReply\", id: msg.id, status: \"error\", error: \"MQTT queue drain failed or timed out; pending work retained\" });\n }\n } else if (msg?.command === \"closePublisher\" && this.publisher instanceof MqttPublishQueue) {\n try {\n await this.mqttProxy.stop({ force: true });\n await this.publisher.close();\n parentPort?.postMessage({ command: \"publishQueueReply\", id: msg.id, status: \"success\" });\n } catch {\n parentPort?.postMessage({ command: \"publishQueueReply\", id: msg.id, status: \"error\", error: \"MQTT output could not be safely persisted/closed; worker retained\" });\n }\n } else if (msg && msg.command === \"subscribeAsync\" && msg.topics) {\n this.mqttProxy.subscribeAsync(msg.topics);\n } else if (msg && msg.command === \"unsubscribeAsync\" && msg.topics) {\n this.mqttProxy.unsubscribeAsync(msg.topics);\n } else if (msg?.command === \"previewSubscriberInput\" || msg?.command === \"reviewSubscriberInput\") {\n try {\n if (!this.mqttProxy.isHandoverInputReady()) throw Error(\"MQTT input subscriptions are not ready\");\n const result = msg.command === \"previewSubscriberInput\" ? this.subscriber.getInputPreview() : this.subscriber.canResumeInput(msg.preview);\n parentPort?.postMessage({ command: \"publishQueueReply\", id: msg.id, status: \"success\", result });\n } catch {\n parentPort?.postMessage({ command: \"publishQueueReply\", id: msg.id, status: \"error\", error: \"MQTT input boundary review unavailable\" });\n }\n } else if (msg?.command === \"prepareSubscriberResume\" || msg?.command === \"activatePreparedSubscriber\") {\n try {\n if (msg.command === \"prepareSubscriberResume\") this.subscriber.prepareResume(msg.cursor);\n else this.subscriber.activatePreparedResume();\n parentPort?.postMessage({ command: \"publishQueueReply\", id: msg.id, status: \"success\" });\n } catch {\n parentPort?.postMessage({ command: \"publishQueueReply\", id: msg.id, status: \"error\", error: \"MQTT subscriber resume not proven\" });\n }\n } else if (msg && msg.command === \"setPublisherActive\") {\n try { this.publisher.becomeActive({batchSize: msg?.batchSize, referenceHash: msg?.referenceHash}); }\n catch { parentPort?.postMessage({ command: \"publishQueueControlError\", error: \"Persistent output cannot resume using a legacy skip hash\" }); }\n } else if (msg && msg.command === \"setPublisherPassive\") {\n const snapshot = await this.publisher.becomePassive(3);\n parentPort?.postMessage({\n command: \"handover_publisher\",\n ...snapshot\n }); \n } else if (msg && msg.command === \"setSubscriberActive\") {\n this.subscriber.becomeActive({batchSize: msg?.batchSize, referenceHash: msg?.referenceHash});\n } else if (msg && msg.command === \"setSubscriberPassive\") {\n const snapshot = await this.subscriber.becomePassive(3, msg.strict === true);\n parentPort?.postMessage({\n command: \"handover_subscriber\",\n ...snapshot\n }); \n }\n });\n }\n\n /**\n * Get the state of the publisher.\n */\n public getPublisherState(): boolean {\n return this.publisher.getState();\n }\n /**\n * Get the state of the subscriber.\n */\n public getSubscriberState(): boolean {\n return this.subscriber.getState();\n }\n\n}\n"]}
|
|
@@ -19,5 +19,7 @@ export declare class SubscriptionReadiness {
|
|
|
19
19
|
granted?: number[];
|
|
20
20
|
}): void;
|
|
21
21
|
ready(): boolean;
|
|
22
|
+
/** A connected output-only proxy has an empty input boundary, not a pending SUBACK. */
|
|
23
|
+
handoverReady(): boolean;
|
|
22
24
|
}
|
|
23
25
|
//# sourceMappingURL=subscription-readiness.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscription-readiness.d.ts","sourceRoot":"","sources":["../../src/uns-mqtt/subscription-readiness.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,qBAAa,qBAAqB;IAChC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,OAAO,CAAgE;IAC/E,OAAO,CAAC,OAAO,CAA2F;IAE1G,UAAU,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAKpC,IAAI,CAAC,MAAM,EAAE;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,KAAK,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAC,CAAC,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;KAAC,GAAG,IAAI;IAYzH,QAAQ,CAAC,MAAM,EAAE;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KAAC,GAAG,IAAI;IAc7E,KAAK,IAAI,OAAO;
|
|
1
|
+
{"version":3,"file":"subscription-readiness.d.ts","sourceRoot":"","sources":["../../src/uns-mqtt/subscription-readiness.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,qBAAa,qBAAqB;IAChC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,OAAO,CAAgE;IAC/E,OAAO,CAAC,OAAO,CAA2F;IAE1G,UAAU,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAKpC,IAAI,CAAC,MAAM,EAAE;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,KAAK,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAC,CAAC,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;KAAC,GAAG,IAAI;IAYzH,QAAQ,CAAC,MAAM,EAAE;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KAAC,GAAG,IAAI;IAc7E,KAAK,IAAI,OAAO;IAIhB,uFAAuF;IACvF,aAAa,IAAI,OAAO;CAIzB"}
|
|
@@ -43,7 +43,11 @@ export class SubscriptionReadiness {
|
|
|
43
43
|
});
|
|
44
44
|
}
|
|
45
45
|
ready() {
|
|
46
|
-
return this.
|
|
46
|
+
return this.filters.size > 0 && this.handoverReady();
|
|
47
|
+
}
|
|
48
|
+
/** A connected output-only proxy has an empty input boundary, not a pending SUBACK. */
|
|
49
|
+
handoverReady() {
|
|
50
|
+
return this.connected && this.pending.size === 0
|
|
47
51
|
&& [...this.filters.values()].every(filter => filter.acknowledged);
|
|
48
52
|
}
|
|
49
53
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscription-readiness.js","sourceRoot":"","sources":["../../src/uns-mqtt/subscription-readiness.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,MAAM,OAAO,qBAAqB;IACxB,SAAS,GAAG,KAAK,CAAC;IAClB,QAAQ,GAAG,CAAC,CAAC;IACb,OAAO,GAAG,IAAI,GAAG,EAAqD,CAAC;IACvE,OAAO,GAAG,IAAI,GAAG,EAAgF,CAAC;IAE1G,UAAU,CAAC,SAAkB;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,EAAE,CAAC;YAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;IACjE,CAAC;IAED,IAAI,CAAC,MAA6G;QAChH,IAAI,CAAC,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC;YAAE,OAAO;QACtG,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC;QAC7G,IAAI,CAAC,MAAM,EAAE,MAAM;YAAE,OAAO;QAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACjC,MAAM,QAAQ,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC;YACjC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAC,CAAC,CAAC;YACzD,OAAO,EAAC,KAAK,EAAE,QAAQ,EAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAU,EAAE,EAAC,MAAM,EAAE,MAAM,CAAC,GAAG,KAAK,aAAa,EAAE,OAAO,EAAC,CAAC,CAAC;IACvF,CAAC;IAED,QAAQ,CAAC,MAA6D;QACpE,IAAI,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS;YAAE,OAAO;QAC3F,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,UAAU,CAAC;YAAE,OAAO;QACvE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACtC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAC,KAAK,EAAE,QAAQ,EAAC,EAAE,KAAK,EAAE,EAAE;YACnD,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,QAAQ,KAAK,QAAQ;gBAAE,OAAO;YAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;YACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;YACjI,IAAI,OAAO,CAAC,MAAM,IAAI,QAAQ;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;;gBACtD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,EAAC,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"subscription-readiness.js","sourceRoot":"","sources":["../../src/uns-mqtt/subscription-readiness.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,MAAM,OAAO,qBAAqB;IACxB,SAAS,GAAG,KAAK,CAAC;IAClB,QAAQ,GAAG,CAAC,CAAC;IACb,OAAO,GAAG,IAAI,GAAG,EAAqD,CAAC;IACvE,OAAO,GAAG,IAAI,GAAG,EAAgF,CAAC;IAE1G,UAAU,CAAC,SAAkB;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,EAAE,CAAC;YAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;IACjE,CAAC;IAED,IAAI,CAAC,MAA6G;QAChH,IAAI,CAAC,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC;YAAE,OAAO;QACtG,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC;QAC7G,IAAI,CAAC,MAAM,EAAE,MAAM;YAAE,OAAO;QAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACjC,MAAM,QAAQ,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC;YACjC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAC,CAAC,CAAC;YACzD,OAAO,EAAC,KAAK,EAAE,QAAQ,EAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAU,EAAE,EAAC,MAAM,EAAE,MAAM,CAAC,GAAG,KAAK,aAAa,EAAE,OAAO,EAAC,CAAC,CAAC;IACvF,CAAC;IAED,QAAQ,CAAC,MAA6D;QACpE,IAAI,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS;YAAE,OAAO;QAC3F,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,UAAU,CAAC;YAAE,OAAO;QACvE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACtC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAC,KAAK,EAAE,QAAQ,EAAC,EAAE,KAAK,EAAE,EAAE;YACnD,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,QAAQ,KAAK,QAAQ;gBAAE,OAAO;YAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;YACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;YACjI,IAAI,OAAO,CAAC,MAAM,IAAI,QAAQ;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;;gBACtD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,EAAC,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;IACvD,CAAC;IAED,uFAAuF;IACvF,aAAa;QACX,OAAO,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;eAC3C,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACvE,CAAC;CACF","sourcesContent":["/** Transport evidence only. No extra subscriptions, topics or credentials are published. */\nexport class SubscriptionReadiness {\n private connected = false;\n private sequence = 0;\n private filters = new Map<string, {revision: number; acknowledged: boolean}>();\n private pending = new Map<number, {remove: boolean; filters: Array<{topic: string; revision: number}>}>();\n\n connection(connected: boolean): void {\n this.connected = connected;\n if (!connected) { this.filters.clear(); this.pending.clear(); }\n }\n\n sent(packet: {cmd: string; messageId?: number; subscriptions?: Array<{topic: string}>; unsubscriptions?: string[]}): void {\n if (!['subscribe', 'unsubscribe'].includes(packet.cmd) || !Number.isInteger(packet.messageId)) return;\n const topics = packet.cmd === 'subscribe' ? packet.subscriptions?.map(s => s.topic) : packet.unsubscriptions;\n if (!topics?.length) return;\n const filters = topics.map(topic => {\n const revision = ++this.sequence;\n this.filters.set(topic, {revision, acknowledged: false});\n return {topic, revision};\n });\n this.pending.set(packet.messageId!, {remove: packet.cmd === 'unsubscribe', filters});\n }\n\n received(packet: {cmd: string; messageId?: number; granted?: number[]}): void {\n if (!['suback', 'unsuback'].includes(packet.cmd) || packet.messageId === undefined) return;\n const pending = this.pending.get(packet.messageId);\n if (!pending || pending.remove !== (packet.cmd === 'unsuback')) return;\n this.pending.delete(packet.messageId);\n pending.filters.forEach(({topic, revision}, index) => {\n if (this.filters.get(topic)?.revision !== revision) return;\n const grant = packet.granted?.[index];\n const accepted = pending.remove ? grant === undefined || grant === 0 || grant === 17 : grant === 0 || grant === 1 || grant === 2;\n if (pending.remove && accepted) this.filters.delete(topic);\n else this.filters.set(topic, {revision, acknowledged: accepted && !pending.remove});\n });\n }\n\n ready(): boolean {\n return this.filters.size > 0 && this.handoverReady();\n }\n\n /** A connected output-only proxy has an empty input boundary, not a pending SUBACK. */\n handoverReady(): boolean {\n return this.connected && this.pending.size === 0\n && [...this.filters.values()].every(filter => filter.acknowledged);\n }\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { IClientPublishOptions } from "mqtt";
|
|
2
|
+
import { type InputQueueCursor } from "../runtime/input-queue-boundary.js";
|
|
2
3
|
/**
|
|
3
4
|
* Abstract base class that encapsulates common functionality for managing
|
|
4
5
|
* a throttled in‑memory queue with an optional disk persistence.
|
|
@@ -162,19 +163,15 @@ export declare class ThrottledSubscriber extends ThrottledQueue<SubscriberQueueI
|
|
|
162
163
|
/**
|
|
163
164
|
* Switch the subscriber to a passive state and return a snapshot.
|
|
164
165
|
*/
|
|
165
|
-
becomePassive(n: number, strict?: boolean): Promise<
|
|
166
|
-
referenceHash: string;
|
|
167
|
-
batchSize: number;
|
|
168
|
-
}>;
|
|
166
|
+
becomePassive(n: number, strict?: boolean): Promise<InputQueueCursor>;
|
|
169
167
|
/**
|
|
170
168
|
* Switch the subscriber to an active state and resume processing.
|
|
171
169
|
*/
|
|
172
170
|
private preparedResume;
|
|
171
|
+
getInputPreview(): string[];
|
|
172
|
+
canResumeInput(preview: unknown): boolean;
|
|
173
173
|
/** Validate a unique overlap without consuming input or activating this owner. */
|
|
174
|
-
prepareResume(snapshot:
|
|
175
|
-
referenceHash: string;
|
|
176
|
-
batchSize: number;
|
|
177
|
-
}): void;
|
|
174
|
+
prepareResume(snapshot: InputQueueCursor): void;
|
|
178
175
|
activatePreparedResume(): void;
|
|
179
176
|
becomeActive(snapshot: {
|
|
180
177
|
referenceHash: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"throttled-queue.d.ts","sourceRoot":"","sources":["../../src/uns-mqtt/throttled-queue.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"throttled-queue.d.ts","sourceRoot":"","sources":["../../src/uns-mqtt/throttled-queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
|
3
3
|
import { join } from "path";
|
|
4
4
|
import { basePath } from "../base-path.js";
|
|
5
5
|
import logger from "../logger.js";
|
|
6
|
+
import { inputCursorSchema, inputFingerprint, inputPreviewSchema, uniqueInputBoundary } from "../runtime/input-queue-boundary.js";
|
|
6
7
|
/**
|
|
7
8
|
* Abstract base class that encapsulates common functionality for managing
|
|
8
9
|
* a throttled in‑memory queue with an optional disk persistence.
|
|
@@ -401,16 +402,39 @@ export class ThrottledSubscriber extends ThrottledQueue {
|
|
|
401
402
|
if (batchSize > 0) {
|
|
402
403
|
logger.info(`${this.instanceName} - Subscriber batch reference hash: ${referenceHash}, size: ${batchSize}`);
|
|
403
404
|
}
|
|
404
|
-
return { referenceHash, batchSize };
|
|
405
|
+
return { referenceHash, batchSize, ...(strict ? { processedTail: this.lastProcessedItems.map(inputFingerprint) } : {}) };
|
|
405
406
|
}
|
|
406
407
|
/**
|
|
407
408
|
* Switch the subscriber to an active state and resume processing.
|
|
408
409
|
*/
|
|
409
410
|
preparedResume;
|
|
411
|
+
getInputPreview() {
|
|
412
|
+
if (this.active)
|
|
413
|
+
throw Error("MQTT successor is not passive");
|
|
414
|
+
return this.queue.slice(-100).map(inputFingerprint);
|
|
415
|
+
}
|
|
416
|
+
canResumeInput(preview) {
|
|
417
|
+
const parsed = inputPreviewSchema.safeParse(preview);
|
|
418
|
+
if (!this.active || !parsed.success)
|
|
419
|
+
return false;
|
|
420
|
+
try {
|
|
421
|
+
uniqueInputBoundary(this.lastProcessedItems.map(inputFingerprint), parsed.data);
|
|
422
|
+
return true;
|
|
423
|
+
}
|
|
424
|
+
catch {
|
|
425
|
+
return false;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
410
428
|
/** Validate a unique overlap without consuming input or activating this owner. */
|
|
411
429
|
prepareResume(snapshot) {
|
|
412
430
|
if (this.active)
|
|
413
431
|
throw Error("MQTT successor is not passive");
|
|
432
|
+
this.preparedResume = undefined;
|
|
433
|
+
snapshot = inputCursorSchema.parse(snapshot);
|
|
434
|
+
if (snapshot.processedTail) {
|
|
435
|
+
this.preparedResume = uniqueInputBoundary(snapshot.processedTail, this.queue.map(inputFingerprint));
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
414
438
|
if (snapshot.batchSize === 0) {
|
|
415
439
|
this.preparedResume = 0;
|
|
416
440
|
return;
|