@uns-kit/core 1.0.39 → 1.0.41
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/dist/uns/uns-interfaces.d.ts +2 -19
- package/dist/uns/uns-interfaces.d.ts.map +1 -1
- package/dist/uns/uns-interfaces.js.map +1 -1
- package/dist/uns-grpc/uns-gateway-server.d.ts.map +1 -1
- package/dist/uns-grpc/uns-gateway-server.js +8 -14
- package/dist/uns-grpc/uns-gateway-server.js.map +1 -1
- package/dist/uns-mqtt/uns-mqtt-proxy.d.ts +2 -2
- package/dist/uns-mqtt/uns-mqtt-proxy.d.ts.map +1 -1
- package/dist/uns-mqtt/uns-mqtt-proxy.js +53 -68
- package/dist/uns-mqtt/uns-mqtt-proxy.js.map +1 -1
- package/package.json +1 -1
|
@@ -128,23 +128,6 @@ export interface IUnsTable {
|
|
|
128
128
|
dataGroup?: string;
|
|
129
129
|
columns: IUnsTableColumn[];
|
|
130
130
|
}
|
|
131
|
-
export interface IMqttMessage {
|
|
132
|
-
topic: UnsTopics;
|
|
133
|
-
attribute: UnsAttribute;
|
|
134
|
-
asset: UnsAsset;
|
|
135
|
-
assetDescription?: string;
|
|
136
|
-
objectType: UnsObjectType;
|
|
137
|
-
objectTypeDescription?: string;
|
|
138
|
-
objectId: UnsObjectId;
|
|
139
|
-
description?: string;
|
|
140
|
-
tags?: UnsTags[];
|
|
141
|
-
packet?: IUnsPacket;
|
|
142
|
-
data?: IUnsData;
|
|
143
|
-
table?: IUnsTable;
|
|
144
|
-
createdAt?: ISO8601;
|
|
145
|
-
expiresAt?: ISO8601;
|
|
146
|
-
attributeNeedsPersistence?: boolean | null;
|
|
147
|
-
}
|
|
148
131
|
export interface IMqttAttributeMessage {
|
|
149
132
|
attribute: UnsAttribute;
|
|
150
133
|
description?: string;
|
|
@@ -171,14 +154,14 @@ type AttributePayload = {
|
|
|
171
154
|
expiresAt?: ISO8601;
|
|
172
155
|
};
|
|
173
156
|
export type IMqttAttributeEntry = IMqttAttributeMessage & AttributePayload;
|
|
174
|
-
export interface
|
|
157
|
+
export interface IMqttPublishRequest {
|
|
175
158
|
topic: UnsTopics;
|
|
176
159
|
asset: UnsAsset;
|
|
177
160
|
assetDescription?: string;
|
|
178
161
|
objectType: UnsObjectType;
|
|
179
162
|
objectTypeDescription?: string;
|
|
180
163
|
objectId: UnsObjectId;
|
|
181
|
-
attributes: IMqttAttributeEntry[];
|
|
164
|
+
attributes: IMqttAttributeEntry | IMqttAttributeEntry[];
|
|
182
165
|
}
|
|
183
166
|
export interface IUnsPacket {
|
|
184
167
|
message: IUnsExtendedMessage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uns-interfaces.d.ts","sourceRoot":"","sources":["../../src/uns/uns-interfaces.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"uns-interfaces.d.ts","sourceRoot":"","sources":["../../src/uns/uns-interfaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uns-interfaces.js","sourceRoot":"","sources":["../../src/uns/uns-interfaces.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,YAAY,GAAG,+CAA+C,CAAC;IACrE,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAID,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC","sourcesContent":["import { UnsAttributeType } from \"../graphql/schema.js\";\nimport { MeasurementUnit } from \"./uns-measurements.js\";\nimport { UnsTags } from \"./uns-tags.js\";\nimport type { UnsObjectId, UnsObjectType } from \"./uns-object.js\";\nimport type { UnsAsset } from \"./uns-asset.js\";\nimport type { IMqttConnectProperties, IMqttServerConfig, MqttProtocol } from \"../uns-mqtt/mqtt-interfaces.js\";\nimport { UnsTopics } from \"./uns-topics.js\";\nimport { knownUnsAttributes, type KnownUnsAttributeName } from \"./uns-attributes.js\";\n\nexport type ISO8601 = `${number}-${string}-${string}T${string}:${string}:${string}.${string}Z`;\nexport function isIOS8601Type(value: string): value is ISO8601 {\n const iso8601Regex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/;\n return iso8601Regex.test(value);\n}\n// Known attribute names (with IntelliSense) while still allowing arbitrary strings.\nexport type UnsAttribute = KnownUnsAttributeName | (string & {});\n\nexport const valueTypes = [\"string\", \"number\"];\nexport type ValueTypeString = typeof valueTypes[number];\nexport type ValueType = string | number;\n\n// Supported QuestDB column types for UNS tables.\nexport type QuestDbType =\n | \"boolean\"\n | \"ipv4\"\n | \"byte\"\n | \"short\"\n | \"char\"\n | \"int\"\n | \"float\"\n | \"symbol\"\n | \"varchar\"\n | \"string\"\n | \"long\"\n | \"date\"\n | \"timestamp\"\n | \"timestamp_ns\"\n | \"double\"\n | \"uuid\"\n | \"binary\"\n | \"long256\"\n | `geohash(${number}${\"b\" | \"c\"})`\n | `decimal(${number},${number})`\n | `array<${string}>`;\n\nexport interface IUnsParameters {\n mqttSubToTopics?: string | string[];\n username?: string;\n password?: string;\n mqttSSL?: boolean;\n publishThrottlingDelay?: number; // Delay in milliseconds; default is 1ms\n subscribeThrottlingDelay?: number; // Delay in milliseconds; default is 1ms\n rejectUnauthorized?: boolean;\n clientId?: string;\n hosts?: string[];\n servers?: IMqttServerConfig[];\n port?: number;\n protocol?: MqttProtocol;\n keepalive?: number;\n clean?: boolean;\n connectTimeout?: number;\n reconnectPeriod?: number;\n reconnectOnConnackError?: boolean;\n resubscribe?: boolean;\n queueQoSZero?: boolean;\n properties?: IMqttConnectProperties;\n ca?: string;\n cert?: string;\n key?: string;\n servername?: string;\n}\n\nexport interface IUnsProcessParameters {\n processName: string;\n mqttSubToTopics?: string | string[];\n username?: string;\n password?: string;\n mqttSSL?: boolean;\n clientId?: string;\n hosts?: string[];\n servers?: IMqttServerConfig[];\n port?: number;\n protocol?: MqttProtocol;\n keepalive?: number;\n clean?: boolean;\n connectTimeout?: number;\n reconnectPeriod?: number;\n reconnectOnConnackError?: boolean;\n resubscribe?: boolean;\n queueQoSZero?: boolean;\n rejectUnauthorized?: boolean;\n properties?: IMqttConnectProperties;\n ca?: string;\n cert?: string;\n key?: string;\n servername?: string;\n}\n\nexport interface UnsEvents {\n // Emitters in MqttProxy, UnsMqttProxy\n input: { topic: string; message: string, packet: any };\n mqttProxyStatus: { event: string, value: number, uom: MeasurementUnit, statusTopic: string };\n \n // Emitters in MqttProxy\n error: { code: number; message: string };\n \n // Emitters in UnsMqttProxy\n mqttWorker: { command: string, instanceName: string; batchSize: number, referenceHash: string };\n\n // Emitter in UnsCronProxy\n cronEvent: { event?: string; cronExpression?: string };\n\n // Emitters in UnsApiProxy\n apiGetEvent: {req: any, res: any};\n\n // Emitters in UnsProxy\n unsProxyProducedTopics: { producedTopics: ITopicObject[], statusTopic: string };\n\n // Emitters in UnsProxy\n unsProxyProducedApiEndpoints: { producedApiEndpoints: IApiObject[], statusTopic: string };\n\n // Emitters in UnsProxy\n unsProxyProducedApiCatchAll: { producedCatchall: IApiCatchallMapping[], statusTopic: string };\n}\n\nexport interface IUnsExtendedData extends IUnsData {\n valueType: ValueTypeString;\n}\n\nexport interface IUnsData {\n time: ISO8601;\n value: ValueType;\n dataGroup?: string;\n uom?: MeasurementUnit;\n foreignEventKey?: string;\n}\n\nexport interface IUnsTableColumn {\n name: string;\n type: QuestDbType;\n value: string | number | null;\n uom?: MeasurementUnit;\n}\n\nexport interface IUnsTable {\n time: ISO8601;\n dataGroup?: string;\n columns: IUnsTableColumn[];\n}\n\nexport interface
|
|
1
|
+
{"version":3,"file":"uns-interfaces.js","sourceRoot":"","sources":["../../src/uns/uns-interfaces.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,YAAY,GAAG,+CAA+C,CAAC;IACrE,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAID,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC","sourcesContent":["import { UnsAttributeType } from \"../graphql/schema.js\";\nimport { MeasurementUnit } from \"./uns-measurements.js\";\nimport { UnsTags } from \"./uns-tags.js\";\nimport type { UnsObjectId, UnsObjectType } from \"./uns-object.js\";\nimport type { UnsAsset } from \"./uns-asset.js\";\nimport type { IMqttConnectProperties, IMqttServerConfig, MqttProtocol } from \"../uns-mqtt/mqtt-interfaces.js\";\nimport { UnsTopics } from \"./uns-topics.js\";\nimport { knownUnsAttributes, type KnownUnsAttributeName } from \"./uns-attributes.js\";\n\nexport type ISO8601 = `${number}-${string}-${string}T${string}:${string}:${string}.${string}Z`;\nexport function isIOS8601Type(value: string): value is ISO8601 {\n const iso8601Regex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/;\n return iso8601Regex.test(value);\n}\n// Known attribute names (with IntelliSense) while still allowing arbitrary strings.\nexport type UnsAttribute = KnownUnsAttributeName | (string & {});\n\nexport const valueTypes = [\"string\", \"number\"];\nexport type ValueTypeString = typeof valueTypes[number];\nexport type ValueType = string | number;\n\n// Supported QuestDB column types for UNS tables.\nexport type QuestDbType =\n | \"boolean\"\n | \"ipv4\"\n | \"byte\"\n | \"short\"\n | \"char\"\n | \"int\"\n | \"float\"\n | \"symbol\"\n | \"varchar\"\n | \"string\"\n | \"long\"\n | \"date\"\n | \"timestamp\"\n | \"timestamp_ns\"\n | \"double\"\n | \"uuid\"\n | \"binary\"\n | \"long256\"\n | `geohash(${number}${\"b\" | \"c\"})`\n | `decimal(${number},${number})`\n | `array<${string}>`;\n\nexport interface IUnsParameters {\n mqttSubToTopics?: string | string[];\n username?: string;\n password?: string;\n mqttSSL?: boolean;\n publishThrottlingDelay?: number; // Delay in milliseconds; default is 1ms\n subscribeThrottlingDelay?: number; // Delay in milliseconds; default is 1ms\n rejectUnauthorized?: boolean;\n clientId?: string;\n hosts?: string[];\n servers?: IMqttServerConfig[];\n port?: number;\n protocol?: MqttProtocol;\n keepalive?: number;\n clean?: boolean;\n connectTimeout?: number;\n reconnectPeriod?: number;\n reconnectOnConnackError?: boolean;\n resubscribe?: boolean;\n queueQoSZero?: boolean;\n properties?: IMqttConnectProperties;\n ca?: string;\n cert?: string;\n key?: string;\n servername?: string;\n}\n\nexport interface IUnsProcessParameters {\n processName: string;\n mqttSubToTopics?: string | string[];\n username?: string;\n password?: string;\n mqttSSL?: boolean;\n clientId?: string;\n hosts?: string[];\n servers?: IMqttServerConfig[];\n port?: number;\n protocol?: MqttProtocol;\n keepalive?: number;\n clean?: boolean;\n connectTimeout?: number;\n reconnectPeriod?: number;\n reconnectOnConnackError?: boolean;\n resubscribe?: boolean;\n queueQoSZero?: boolean;\n rejectUnauthorized?: boolean;\n properties?: IMqttConnectProperties;\n ca?: string;\n cert?: string;\n key?: string;\n servername?: string;\n}\n\nexport interface UnsEvents {\n // Emitters in MqttProxy, UnsMqttProxy\n input: { topic: string; message: string, packet: any };\n mqttProxyStatus: { event: string, value: number, uom: MeasurementUnit, statusTopic: string };\n \n // Emitters in MqttProxy\n error: { code: number; message: string };\n \n // Emitters in UnsMqttProxy\n mqttWorker: { command: string, instanceName: string; batchSize: number, referenceHash: string };\n\n // Emitter in UnsCronProxy\n cronEvent: { event?: string; cronExpression?: string };\n\n // Emitters in UnsApiProxy\n apiGetEvent: {req: any, res: any};\n\n // Emitters in UnsProxy\n unsProxyProducedTopics: { producedTopics: ITopicObject[], statusTopic: string };\n\n // Emitters in UnsProxy\n unsProxyProducedApiEndpoints: { producedApiEndpoints: IApiObject[], statusTopic: string };\n\n // Emitters in UnsProxy\n unsProxyProducedApiCatchAll: { producedCatchall: IApiCatchallMapping[], statusTopic: string };\n}\n\nexport interface IUnsExtendedData extends IUnsData {\n valueType: ValueTypeString;\n}\n\nexport interface IUnsData {\n time: ISO8601;\n value: ValueType;\n dataGroup?: string;\n uom?: MeasurementUnit;\n foreignEventKey?: string;\n}\n\nexport interface IUnsTableColumn {\n name: string;\n type: QuestDbType;\n value: string | number | null;\n uom?: MeasurementUnit;\n}\n\nexport interface IUnsTable {\n time: ISO8601;\n dataGroup?: string;\n columns: IUnsTableColumn[];\n}\n\nexport interface IMqttAttributeMessage {\n attribute: UnsAttribute;\n description?: string;\n tags?: UnsTags[];\n attributeNeedsPersistence?: boolean | null;\n}\n\ntype AttributePayload =\n | { message: IUnsMessage; data?: never; table?: never; createdAt?: never; expiresAt?: never }\n | { message?: never; data: IUnsData; table?: never; createdAt?: ISO8601; expiresAt?: ISO8601 }\n | { message?: never; data?: never; table: IUnsTable; createdAt?: ISO8601; expiresAt?: ISO8601 };\n\nexport type IMqttAttributeEntry = IMqttAttributeMessage & AttributePayload;\n\nexport interface IMqttPublishRequest {\n topic: UnsTopics;\n asset: UnsAsset;\n assetDescription?: string;\n objectType: UnsObjectType;\n objectTypeDescription?: string;\n objectId: UnsObjectId;\n attributes: IMqttAttributeEntry | IMqttAttributeEntry[];\n}\n\n// This interface represents a packet for a UNS system\nexport interface IUnsPacket {\n // The message object of the packet\n message: IUnsExtendedMessage;\n \n // The HMAC signature of the message\n messageSignature?: string;\n\n // Automatically calculated interval between two packets in ms\n interval?: number;\n\n // Current library version\n readonly version: string;\n\n // Autogenerated sequence number\n sequenceId?: number;\n}\n\nexport interface IUnsPackatParameters {\n\n}\n\nexport interface IUnsMessage {\n data?: IUnsData;\n table?: IUnsTable;\n expiresAt?: ISO8601;\n createdAt?: ISO8601;\n}\n\nexport interface IUnsExtendedMessage extends IUnsMessage {\n data?: IUnsExtendedData;\n}\n\nexport interface ITopicObject {\n timestamp: string;\n attribute:string;\n attributeType: UnsAttributeType;\n topic:string;\n description:string;\n dataGroup:string;\n tags:string[] | null;\n attributeNeedsPersistence: boolean | null;\n asset: UnsAsset;\n assetDescription?: string;\n objectType: UnsObjectType;\n objectTypeDescription?: string;\n objectId: UnsObjectId;\n}\n\n// API Interfaces below\nexport interface IApiObject {\n timestamp: string;\n attribute:string;\n topic:string;\n attributeType: UnsAttributeType;\n apiDescription?: string; // Optional description for the API endpoint\n apiHost: string; // Hostname of the service\n apiEndpoint: string; // API endpoint for virtual topics\n apiSwaggerEndpoint: string; // Swagger endpoint for API documentation\n apiMethod: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\"; // HTTP method for API endpoint\n apiQueryParams: QueryParamDef[]; // query parameters for the API endpoint\n asset: UnsAsset;\n objectType: UnsObjectType;\n objectId: UnsObjectId;\n}\n\nexport interface IApiCatchallMapping {\n topic: string;\n apiBase: string;\n apiBasePath: string;\n swaggerPath: string;\n}\n\nexport interface QueryParamDef {\n name: string;\n type: \"string\" | \"number\" | \"boolean\";\n required?: boolean;\n description?: string;\n}\n\nexport interface IApiProxyOptions {\n jwtSecret?: string;\n jwks?: {\n wellKnownJwksUrl: string;\n activeKidUrl?: string;\n cacheTtlMs?: number;\n algorithms?: (\"RS256\" | \"RS384\" | \"RS512\")[];\n };\n}\n\nexport interface IGetEndpointOptions {\n apiDescription?: string;\n tags?: string[];\n queryParams?: QueryParamDef[];\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uns-gateway-server.d.ts","sourceRoot":"","sources":["../../src/uns-grpc/uns-gateway-server.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;IACrD,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AA4GD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,UAAU,CAAuC;IACzD,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,UAAU,CAA+B;IAEjD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,kBAAkB,CAAS;IAEtB,KAAK,CAChB,WAAW,CAAC,EAAE,MAAM,EACpB,IAAI,CAAC,EAAE;QACL,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,oBAAoB,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;QACrD,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC5B,GACA,OAAO,CAAC,cAAc,CAAC;IA0E1B,OAAO,CAAC,cAAc;YAWR,OAAO;
|
|
1
|
+
{"version":3,"file":"uns-gateway-server.d.ts","sourceRoot":"","sources":["../../src/uns-grpc/uns-gateway-server.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;IACrD,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AA4GD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,UAAU,CAAuC;IACzD,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,UAAU,CAA+B;IAEjD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,kBAAkB,CAAS;IAEtB,KAAK,CAChB,WAAW,CAAC,EAAE,MAAM,EACpB,IAAI,CAAC,EAAE;QACL,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,oBAAoB,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;QACrD,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC5B,GACA,OAAO,CAAC,cAAc,CAAC;IA0E1B,OAAO,CAAC,cAAc;YAWR,OAAO;YAiFP,SAAS;IA8BvB,OAAO,CAAC,qBAAqB;YAaf,gBAAgB;YAqBhB,eAAe;YAoBf,cAAc;IAU5B,OAAO,CAAC,eAAe;YAKT,cAAc;YA4Bd,gBAAgB;IAc9B,OAAO,CAAC,aAAa;YA0BP,cAAc;YAwBd,KAAK;IAiDnB,OAAO,CAAC,cAAc;IAKT,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAYvC;AAED,wBAAsB,eAAe,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CAGhH"}
|
|
@@ -9,7 +9,6 @@ import logger from "../logger.js";
|
|
|
9
9
|
import { ConfigFile } from "../config-file.js";
|
|
10
10
|
import UnsProxyProcess from "../uns/uns-proxy-process.js";
|
|
11
11
|
import { MessageMode } from "../uns-mqtt/uns-mqtt-proxy.js";
|
|
12
|
-
import { UnsPacket } from "../uns/uns-packet.js";
|
|
13
12
|
import { randomUUID } from "crypto";
|
|
14
13
|
import { MqttTopicBuilder } from "../uns-mqtt/mqtt-topic-builder.js";
|
|
15
14
|
import { ObjectTypes } from "../uns/uns-object.js";
|
|
@@ -242,25 +241,20 @@ export class UnsGatewayServer {
|
|
|
242
241
|
else {
|
|
243
242
|
throw new Error("PublishRequest.content must be data or table");
|
|
244
243
|
}
|
|
245
|
-
const packet = await UnsPacket.unsPacketFromUnsMessage(message);
|
|
246
244
|
const mqttMsg = {
|
|
247
245
|
topic,
|
|
248
|
-
attribute,
|
|
249
|
-
description,
|
|
250
|
-
tags,
|
|
251
|
-
packet,
|
|
252
246
|
asset: "meter",
|
|
253
247
|
objectType: ObjectTypes["energy-resource"],
|
|
254
248
|
objectId: "main",
|
|
255
|
-
|
|
249
|
+
attributes: {
|
|
250
|
+
attribute,
|
|
251
|
+
description,
|
|
252
|
+
tags,
|
|
253
|
+
attributeNeedsPersistence,
|
|
254
|
+
...(message.data ? { data: message.data } : { table: message.table }),
|
|
255
|
+
},
|
|
256
256
|
};
|
|
257
|
-
|
|
258
|
-
if (message.data && valueIsCumulative) {
|
|
259
|
-
this.mqttOutput.publishMqttMessage(mqttMsg, MessageMode.Delta);
|
|
260
|
-
}
|
|
261
|
-
else {
|
|
262
|
-
this.mqttOutput.publishMqttMessage(mqttMsg, MessageMode.Raw);
|
|
263
|
-
}
|
|
257
|
+
this.mqttOutput.publishMqttMessage(mqttMsg, message.data && valueIsCumulative ? MessageMode.Delta : MessageMode.Raw);
|
|
264
258
|
callback(null, { ok: true });
|
|
265
259
|
}
|
|
266
260
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uns-gateway-server.js","sourceRoot":"","sources":["../../src/uns-grpc/uns-gateway-server.ts"],"names":[],"mappings":"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","sourcesContent":["import grpc from \"@grpc/grpc-js\";\nimport protoLoader from \"@grpc/proto-loader\";\nimport path from \"path\";\nimport getPort from \"get-port\";\nimport { readFileSync } from \"fs\";\nimport { fileURLToPath } from \"url\";\nimport { basePath } from \"../base-path.js\";\n\nimport logger from \"../logger.js\";\nimport { ConfigFile } from \"../config-file.js\";\nimport UnsProxyProcess from \"../uns/uns-proxy-process.js\";\nimport UnsMqttProxy, { MessageMode } from \"../uns-mqtt/uns-mqtt-proxy.js\";\nimport { IApiProxyOptions, IGetEndpointOptions, IMqttMessage, IUnsMessage, IUnsParameters, IUnsProcessParameters } from \"../uns/uns-interfaces.js\";\nimport type { IMqttConnectProperties, IMqttServerConfig, MqttProtocol } from \"../uns-mqtt/mqtt-interfaces.js\";\nimport { UnsPacket } from \"../uns/uns-packet.js\";\nimport { randomUUID } from \"crypto\";\nimport { MqttTopicBuilder } from \"../uns-mqtt/mqtt-topic-builder.js\";\nimport { ObjectTypes } from \"../uns/uns-object.js\";\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nconst defaultGatewayProto = path.resolve(__dirname, \"uns-gateway.proto\");\nconst GATEWAY_PROTO = process.env.UNS_GATEWAY_PROTO\n ? path.resolve(process.cwd(), process.env.UNS_GATEWAY_PROTO)\n : defaultGatewayProto;\n\ntype GrpcServer = grpc.Server;\n\nexport interface GatewayAddress {\n address: string; // e.g. unix:/tmp/... or 0.0.0.0:PORT\n isUDS: boolean;\n}\n\nexport interface GatewayStartOptions {\n processNameOverride?: string;\n instanceSuffix?: string;\n instanceModeOverride?: \"wait\" | \"force\" | \"handover\";\n handoverOverride?: boolean;\n}\n\ntype UnsApiProxyLike = {\n event: { on(event: string, handler: (payload: any) => void): void };\n get(topic: string, attribute: string, options: IGetEndpointOptions): Promise<void>;\n unregister(topic: string, attribute: string, method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\"): Promise<void>;\n};\n\ntype UnsProxyProcessWithApi = UnsProxyProcess & {\n createApiProxy(instanceName: string, options: IApiProxyOptions): Promise<UnsApiProxyLike>;\n};\n\ntype MqttChannelConfig = {\n host?: string;\n hosts?: string[];\n servers?: IMqttServerConfig[];\n port?: number;\n protocol?: MqttProtocol;\n username?: string;\n password?: string;\n clientId?: string;\n clean?: boolean;\n keepalive?: number;\n connectTimeout?: number;\n reconnectPeriod?: number;\n reconnectOnConnackError?: boolean;\n resubscribe?: boolean;\n queueQoSZero?: boolean;\n rejectUnauthorized?: boolean;\n properties?: IMqttConnectProperties;\n ca?: string;\n cert?: string;\n key?: string;\n servername?: string;\n};\n\nconst resolveMqttHost = (channel: MqttChannelConfig | undefined, pathLabel: string): string => {\n if (!channel) {\n throw new Error(`Configuration value '${pathLabel}' is required.`);\n }\n if (typeof channel.host === \"string\" && channel.host.length > 0) {\n return channel.host;\n }\n if (Array.isArray(channel.hosts) && channel.hosts.length > 0) {\n const candidate = channel.hosts.find((host) => typeof host === \"string\" && host.length > 0);\n if (candidate) return candidate;\n }\n if (Array.isArray(channel.servers) && channel.servers.length > 0) {\n const candidate = channel.servers.find((server) => typeof server.host === \"string\" && server.host.length > 0);\n if (candidate) return candidate.host;\n }\n throw new Error(`Configuration value '${pathLabel}' must include host, hosts, or servers.`);\n};\n\nconst buildUnsProcessParameters = (\n channel: MqttChannelConfig | undefined,\n): Omit<IUnsProcessParameters, \"processName\"> => {\n if (!channel) return {};\n return {\n username: channel.username,\n password: channel.password,\n clientId: channel.clientId,\n hosts: channel.hosts,\n servers: channel.servers,\n port: channel.port,\n protocol: channel.protocol,\n keepalive: channel.keepalive,\n clean: channel.clean,\n connectTimeout: channel.connectTimeout,\n reconnectPeriod: channel.reconnectPeriod,\n reconnectOnConnackError: channel.reconnectOnConnackError,\n resubscribe: channel.resubscribe,\n queueQoSZero: channel.queueQoSZero,\n rejectUnauthorized: channel.rejectUnauthorized,\n properties: channel.properties,\n ca: channel.ca,\n cert: channel.cert,\n key: channel.key,\n servername: channel.servername,\n };\n};\n\nconst buildUnsParameters = (channel: MqttChannelConfig | undefined): IUnsParameters => {\n if (!channel) return {};\n return {\n username: channel.username,\n password: channel.password,\n clientId: channel.clientId,\n hosts: channel.hosts,\n servers: channel.servers,\n port: channel.port,\n protocol: channel.protocol,\n keepalive: channel.keepalive,\n clean: channel.clean,\n connectTimeout: channel.connectTimeout,\n reconnectPeriod: channel.reconnectPeriod,\n reconnectOnConnackError: channel.reconnectOnConnackError,\n resubscribe: channel.resubscribe,\n queueQoSZero: channel.queueQoSZero,\n rejectUnauthorized: channel.rejectUnauthorized,\n properties: channel.properties,\n ca: channel.ca,\n cert: channel.cert,\n key: channel.key,\n servername: channel.servername,\n };\n};\n\nexport class UnsGatewayServer {\n private server: GrpcServer | null = null;\n private unsProcess: UnsProxyProcessWithApi | null = null;\n private mqttInput: UnsMqttProxy | null = null;\n private mqttOutput: UnsMqttProxy | null = null;\n private handlers: Set<Function> = new Set();\n private unsApiProxy: UnsApiProxyLike | null = null;\n private apiStreams: Set<any> = new Set();\n private pendingApi: Map<string, any> = new Map();\n\n private inputHost: string;\n private outputHost: string;\n private inputParams: IUnsParameters | null = null;\n private outputParams: IUnsParameters | null = null;\n private apiOptions: IApiProxyOptions | null = null;\n private outPublisherActive = false;\n private inSubscriberActive = false;\n\n public async start(\n desiredAddr?: string,\n opts?: {\n processNameOverride?: string;\n instanceSuffix?: string;\n instanceModeOverride?: \"wait\" | \"force\" | \"handover\";\n handoverOverride?: boolean;\n }\n ): Promise<GatewayAddress> {\n const packageDef = protoLoader.loadSync(GATEWAY_PROTO, {\n keepCase: true,\n longs: String,\n enums: String,\n defaults: true,\n oneofs: true,\n });\n const proto = grpc.loadPackageDefinition(packageDef) as any;\n\n // Load config and init UNS process + MQTT proxies\n const cfg = await ConfigFile.loadConfig();\n const processName = opts?.processNameOverride ?? cfg.uns.processName;\n const instanceMode = opts?.instanceModeOverride ?? cfg.uns.instanceMode;\n const handover = (typeof opts?.handoverOverride === \"boolean\") ? opts.handoverOverride : cfg.uns.handover;\n const suffix = opts?.instanceSuffix ? `-${opts.instanceSuffix}` : \"\";\n\n const infraHost = resolveMqttHost(cfg.infra as MqttChannelConfig, \"infra\");\n const infraParams = buildUnsProcessParameters(cfg.infra as MqttChannelConfig);\n this.unsProcess = new UnsProxyProcess(infraHost, { processName, ...infraParams }) as UnsProxyProcessWithApi;\n // cache hosts/options; proxies created lazily on first use\n this.inputHost = resolveMqttHost(cfg.input as MqttChannelConfig, \"input\");\n this.outputHost = resolveMqttHost(cfg.output as MqttChannelConfig, \"output\");\n this.inputParams = buildUnsParameters(cfg.input as MqttChannelConfig);\n this.outputParams = buildUnsParameters(cfg.output as MqttChannelConfig);\n this.apiOptions = cfg.uns?.jwksWellKnownUrl\n ? { jwks: { wellKnownJwksUrl: cfg.uns.jwksWellKnownUrl, activeKidUrl: cfg.uns.kidWellKnownUrl } }\n : { jwtSecret: \"CHANGEME\" };\n\n const serviceImpl = {\n Publish: this.publish.bind(this),\n Subscribe: this.subscribe.bind(this),\n RegisterApiGet: this.registerApiGet.bind(this),\n UnregisterApiGet: this.unregisterApiGet.bind(this),\n ApiEventStream: this.apiEventStream.bind(this),\n Ready: this.ready.bind(this),\n };\n\n this.server = new grpc.Server();\n this.server.addService(proto.uns.UnsGateway.service, serviceImpl);\n\n const isUnix = process.platform !== \"win32\";\n let addr: string | null = desiredAddr || process.env.UNS_GATEWAY_ADDR || null;\n if (!addr) {\n if (isUnix) {\n const sanitizedProcess = MqttTopicBuilder.sanitizeTopicPart(this.getProcessName());\n const sock = `/tmp/${sanitizedProcess}-uns-gateway.sock`;\n addr = `unix:${sock}`;\n } else {\n const port = await getPort();\n addr = `0.0.0.0:${port}`;\n }\n }\n\n // If UDS and file exists, best-effort unlink (stale sock)\n if (addr.startsWith(\"unix:\")) {\n const fs = await import(\"fs\");\n const p = addr.slice(\"unix:\".length);\n try { if (fs.existsSync(p)) fs.unlinkSync(p); } catch {}\n }\n\n await new Promise<void>((resolve, reject) => {\n this.server!.bindAsync(addr!, grpc.ServerCredentials.createInsecure(), (err) => {\n if (err) return reject(err);\n // grpc-js automatically starts the server after bindAsync in recent versions\n // Calling start() is deprecated; omit to avoid warnings.\n logger.info(`UNS gRPC Gateway listening on ${addr}`);\n resolve();\n });\n });\n\n return { address: addr!, isUDS: addr!.startsWith(\"unix:\") };\n }\n\n private getProcessName(): string {\n try {\n const pkgPath = path.join(basePath, \"package.json\");\n const raw = readFileSync(pkgPath, \"utf8\");\n const pkg = JSON.parse(raw);\n return `${pkg.name}-${pkg.version}`;\n } catch {\n return `uns-gateway`;\n }\n }\n\n private async publish(call: any, callback: any) {\n try {\n await this.ensureMqttOutput();\n const req = call.request as any;\n if (!this.mqttOutput) throw new Error(\"Gateway not initialized\");\n\n const topic: string = req.topic;\n const attribute: string = req.attribute;\n const description: string = req.description ?? \"\";\n const tags: string[] = (req.tags ?? []) as string[];\n const attributeNeedsPersistence: boolean | null = req.attribute_needs_persistence ?? null;\n const valueIsCumulative: boolean = req.value_is_cumulative ?? false;\n\n let message: IUnsMessage | null = null;\n\n if (req.data) {\n const d = req.data;\n const time: string = d.time;\n const uom: string | undefined = d.uom || undefined;\n const dataGroup: string | undefined = d.data_group || undefined;\n const foreignEventKey: string | undefined = d.foreign_event_key || undefined;\n\n let value: any = undefined;\n if (typeof d.value_number === \"number\" && !Number.isNaN(d.value_number)) {\n value = d.value_number;\n } else if (typeof d.value_string === \"string\" && d.value_string.length > 0) {\n value = d.value_string;\n }\n if (value === undefined) throw new Error(\"Data.value_number or Data.value_string must be set\");\n\n message = { data: { time, value, uom, dataGroup, foreignEventKey } } as IUnsMessage;\n } else if (req.table) {\n const t = req.table;\n const time: string = t.time;\n const dataGroup: string | undefined = t.data_group || undefined;\n const columns = (t.columns ?? []).map((col: any) => {\n let value: string | number | null = null;\n if (typeof col.value_number === \"number\" && !Number.isNaN(col.value_number)) {\n value = col.value_number;\n } else if (typeof col.value_string === \"string\") {\n value = col.value_string;\n }\n return {\n name: col.name as string,\n type: col.type as any,\n uom: col.uom || undefined,\n value,\n };\n });\n\n message = { table: { time, columns, dataGroup } } as IUnsMessage;\n } else {\n throw new Error(\"PublishRequest.content must be data or table\");\n }\n\n const packet = await UnsPacket.unsPacketFromUnsMessage(message);\n const mqttMsg: IMqttMessage = {\n topic,\n attribute,\n description,\n tags,\n packet,\n asset:\"meter\",\n objectType: ObjectTypes[\"energy-resource\"],\n objectId: \"main\",\n attributeNeedsPersistence,\n };\n\n // delta mode if cumulative\n if (message.data && valueIsCumulative) {\n this.mqttOutput.publishMqttMessage(mqttMsg, MessageMode.Delta);\n } else {\n this.mqttOutput.publishMqttMessage(mqttMsg, MessageMode.Raw);\n }\n\n callback(null, { ok: true });\n } catch (err: any) {\n logger.error(`Gateway Publish error: ${err.message}`);\n callback(null, { ok: false, error: err.message });\n }\n }\n\n private async subscribe(call: any) {\n await this.ensureMqttInput();\n const req = call.request as any;\n const topics: string[] = (req.topics ?? []) as string[];\n if (topics.length === 0) {\n call.emit(\"error\", { code: grpc.status.INVALID_ARGUMENT, details: \"topics is required\" });\n call.end();\n return;\n }\n\n // Subscribe and stream messages to this client\n this.mqttInput.subscribeAsync(topics);\n\n const handler = (event: any) => {\n try {\n // Forward as UNS packet JSON if parsable, else raw message\n const payload = event.packet ? JSON.stringify(event.packet) : String(event.message ?? \"\");\n call.write({ topic: event.topic, payload });\n } catch (e) {\n // drop\n }\n };\n this.handlers.add(handler);\n this.mqttInput.event.on(\"input\", handler);\n\n call.on(\"cancelled\", () => this.cleanupHandler(handler));\n call.on(\"error\", () => this.cleanupHandler(handler));\n call.on(\"close\", () => this.cleanupHandler(handler));\n }\n\n private attachStatusListeners(): void {\n if (this.mqttOutput) {\n this.mqttOutput.event.on(\"mqttProxyStatus\", (e: any) => {\n if (e?.event === \"t-publisher-active\") this.outPublisherActive = !!e.value;\n });\n }\n if (this.mqttInput) {\n this.mqttInput.event.on(\"mqttProxyStatus\", (e: any) => {\n if (e?.event === \"t-subscriber-active\") this.inSubscriberActive = !!e.value;\n });\n }\n }\n\n private async ensureMqttOutput() {\n if (!this.mqttOutput) {\n // slight delay to let process MQTT connect\n while ((this.unsProcess as any)?.processMqttProxy?.isConnected === false) {\n await new Promise((r) => setTimeout(r, 50));\n }\n const outputParams: IUnsParameters = {\n ...(this.outputParams ?? {}),\n publishThrottlingDelay: this.outputParams?.publishThrottlingDelay ?? 1,\n };\n this.mqttOutput = await this.unsProcess!.createUnsMqttProxy(\n this.outputHost,\n this.getInstanceName(\"gatewayOutput\"),\n \"force\",\n true,\n outputParams,\n );\n this.attachStatusListeners();\n }\n }\n\n private async ensureMqttInput() {\n if (!this.mqttInput) {\n while ((this.unsProcess as any)?.processMqttProxy?.isConnected === false) {\n await new Promise((r) => setTimeout(r, 50));\n }\n const inputParams: IUnsParameters = {\n ...(this.inputParams ?? {}),\n mqttSubToTopics: this.inputParams?.mqttSubToTopics ?? [],\n };\n this.mqttInput = await this.unsProcess!.createUnsMqttProxy(\n this.inputHost,\n this.getInstanceName(\"gatewayInput\"),\n \"force\",\n true,\n inputParams,\n );\n this.attachStatusListeners();\n }\n }\n\n private async ensureApiProxy() {\n if (!this.unsApiProxy) {\n if (typeof (this.unsProcess as any)?.createApiProxy !== \"function\") {\n throw new Error(\"API plugin not registered. Please install @uns-kit/api and register it with UnsProxyProcess before starting the gateway.\");\n }\n this.unsApiProxy = await this.unsProcess!.createApiProxy(this.getInstanceName(\"gatewayApi\"), this.apiOptions!);\n this.unsApiProxy.event.on(\"apiGetEvent\", (event: any) => this.onApiGetEvent(event));\n }\n }\n\n private getInstanceName(base: string): string {\n // derive suffix from processName/CLI by inspecting configured instanceStatusTopic is overkill; keep base names unique per process\n return base;\n }\n\n private async registerApiGet(call: any, callback: any) {\n try {\n await this.ensureApiProxy();\n const req = call.request as any;\n const topic: string = req.topic;\n const attribute: string = req.attribute;\n const apiDescription: string | undefined = req.api_description || undefined;\n const tags: string[] | undefined = (req.tags ?? []) as string[];\n const queryParams: any[] = (req.query_params ?? []).map((p: any) => ({\n name: p.name,\n type: (p.type === \"number\" || p.type === \"boolean\") ? p.type : \"string\",\n required: !!p.required,\n description: p.description ?? undefined,\n }));\n\n const options: IGetEndpointOptions = {\n apiDescription,\n tags,\n queryParams,\n };\n await this.unsApiProxy.get(topic as any, attribute, options);\n callback(null, { ok: true });\n } catch (err: any) {\n logger.error(`Gateway RegisterApiGet error: ${err.message}`);\n callback(null, { ok: false, error: err.message });\n }\n }\n\n private async unregisterApiGet(call: any, callback: any) {\n try {\n await this.ensureApiProxy();\n const req = call.request as any;\n const topic: string = req.topic;\n const attribute: string = req.attribute;\n await this.unsApiProxy.unregister(topic as any, attribute, \"GET\");\n callback(null, { ok: true });\n } catch (err: any) {\n logger.error(`Gateway UnregisterApiGet error: ${err.message}`);\n callback(null, { ok: false, error: err.message });\n }\n }\n\n private onApiGetEvent(event: any) {\n // Correlate request and forward to connected gRPC streams\n const id = randomUUID();\n const req = event.req;\n const res = event.res;\n const path: string = req.path || req.originalUrl || \"/\";\n // Derive topic/attribute is optional; we send path and query\n const bearer = (req.headers?.[\"authorization\"] as string | undefined) ?? \"\";\n this.pendingApi.set(id, res);\n // Timeout after 10s\n setTimeout(() => {\n if (this.pendingApi.has(id)) {\n const r = this.pendingApi.get(id);\n try { r.status(504).send(\"Gateway timeout\"); } catch {}\n this.pendingApi.delete(id);\n }\n }, 10_000).unref?.();\n\n const query: Record<string, string> = {};\n Object.entries(req.query || {}).forEach(([k, v]) => { query[k] = String(v); });\n const msg = { id, method: \"GET\", path, query, bearer };\n for (const stream of this.apiStreams) {\n try { stream.write(msg); } catch {}\n }\n }\n\n private async apiEventStream(call: any) {\n // Register stream\n await this.ensureApiProxy();\n this.apiStreams.add(call);\n call.on(\"data\", (resp: any) => {\n const id: string = resp.id;\n const status: number = resp.status ?? 200;\n const body: string = resp.body ?? \"\";\n const headers: Record<string, string> = resp.headers ?? {};\n const res = this.pendingApi.get(id);\n if (res) {\n try {\n Object.entries(headers).forEach(([k, v]) => res.setHeader(k, v));\n res.status(status).send(body);\n } catch {}\n this.pendingApi.delete(id);\n }\n });\n const cleanup = () => { this.apiStreams.delete(call); };\n call.on(\"cancelled\", cleanup);\n call.on(\"error\", cleanup);\n call.on(\"close\", cleanup);\n }\n\n private async ready(call: any, callback: any) {\n try {\n const req = call.request as any;\n const timeoutMs: number = req.timeout_ms && req.timeout_ms > 0 ? req.timeout_ms : 15000;\n const waitOut = !!req.wait_output;\n const waitIn = !!req.wait_input;\n const waitApi = !!req.wait_api;\n\n if (waitOut) await this.ensureMqttOutput();\n if (waitIn) await this.ensureMqttInput();\n if (waitApi) await this.ensureApiProxy();\n\n const start = Date.now();\n const check = () => {\n const okOut = !waitOut || this.outPublisherActive;\n const okIn = !waitIn || this.inSubscriberActive;\n const okApi = !waitApi || !!this.unsApiProxy; // creation ensures listening\n return okOut && okIn && okApi;\n };\n\n if (check()) return callback(null, { ok: true });\n\n const onStatus = () => {\n if (check()) done(true);\n };\n\n const done = (ok: boolean, err?: string) => {\n if (this.mqttOutput) this.mqttOutput.event.off(\"mqttProxyStatus\", onStatus as any);\n if (this.mqttInput) this.mqttInput.event.off(\"mqttProxyStatus\", onStatus as any);\n callback(null, { ok, error: err });\n };\n\n if (this.mqttOutput) this.mqttOutput.event.on(\"mqttProxyStatus\", onStatus as any);\n if (this.mqttInput) this.mqttInput.event.on(\"mqttProxyStatus\", onStatus as any);\n\n const iv = setInterval(() => {\n if (check()) {\n clearInterval(iv);\n done(true);\n } else if (Date.now() - start > timeoutMs) {\n clearInterval(iv);\n done(false, \"timeout waiting for readiness\");\n }\n }, 100);\n } catch (e: any) {\n callback(null, { ok: false, error: e.message });\n }\n }\n\n private cleanupHandler(handler: Function) {\n if (this.mqttInput) this.mqttInput.event.off(\"input\", handler as any);\n this.handlers.delete(handler);\n }\n\n public async shutdown(): Promise<void> {\n try {\n for (const h of Array.from(this.handlers)) this.cleanupHandler(h);\n if (this.server) {\n await new Promise<void>((resolve) => this.server!.tryShutdown(() => resolve()));\n this.server = null;\n }\n if (this.unsProcess) this.unsProcess.shutdown();\n } catch (e: any) {\n logger.error(`Gateway shutdown error: ${e.message}`);\n }\n }\n}\n\nexport async function startUnsGateway(addrOverride?: string, opts?: GatewayStartOptions): Promise<GatewayAddress> {\n const gw = new UnsGatewayServer();\n return gw.start(addrOverride, opts);\n}\nfunction sanitizeTopicPart(getProcessName: () => string) {\n throw new Error(\"Function not implemented.\");\n}\n"]}
|
|
1
|
+
{"version":3,"file":"uns-gateway-server.js","sourceRoot":"","sources":["../../src/uns-grpc/uns-gateway-server.ts"],"names":[],"mappings":"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","sourcesContent":["import grpc from \"@grpc/grpc-js\";\nimport protoLoader from \"@grpc/proto-loader\";\nimport path from \"path\";\nimport getPort from \"get-port\";\nimport { readFileSync } from \"fs\";\nimport { fileURLToPath } from \"url\";\nimport { basePath } from \"../base-path.js\";\n\nimport logger from \"../logger.js\";\nimport { ConfigFile } from \"../config-file.js\";\nimport UnsProxyProcess from \"../uns/uns-proxy-process.js\";\nimport UnsMqttProxy, { MessageMode } from \"../uns-mqtt/uns-mqtt-proxy.js\";\nimport { IApiProxyOptions, IGetEndpointOptions, IMqttPublishRequest, IUnsMessage, IUnsParameters, IUnsProcessParameters } from \"../uns/uns-interfaces.js\";\nimport type { IMqttConnectProperties, IMqttServerConfig, MqttProtocol } from \"../uns-mqtt/mqtt-interfaces.js\";\nimport { UnsPacket } from \"../uns/uns-packet.js\";\nimport { randomUUID } from \"crypto\";\nimport { MqttTopicBuilder } from \"../uns-mqtt/mqtt-topic-builder.js\";\nimport { ObjectTypes } from \"../uns/uns-object.js\";\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nconst defaultGatewayProto = path.resolve(__dirname, \"uns-gateway.proto\");\nconst GATEWAY_PROTO = process.env.UNS_GATEWAY_PROTO\n ? path.resolve(process.cwd(), process.env.UNS_GATEWAY_PROTO)\n : defaultGatewayProto;\n\ntype GrpcServer = grpc.Server;\n\nexport interface GatewayAddress {\n address: string; // e.g. unix:/tmp/... or 0.0.0.0:PORT\n isUDS: boolean;\n}\n\nexport interface GatewayStartOptions {\n processNameOverride?: string;\n instanceSuffix?: string;\n instanceModeOverride?: \"wait\" | \"force\" | \"handover\";\n handoverOverride?: boolean;\n}\n\ntype UnsApiProxyLike = {\n event: { on(event: string, handler: (payload: any) => void): void };\n get(topic: string, attribute: string, options: IGetEndpointOptions): Promise<void>;\n unregister(topic: string, attribute: string, method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\"): Promise<void>;\n};\n\ntype UnsProxyProcessWithApi = UnsProxyProcess & {\n createApiProxy(instanceName: string, options: IApiProxyOptions): Promise<UnsApiProxyLike>;\n};\n\ntype MqttChannelConfig = {\n host?: string;\n hosts?: string[];\n servers?: IMqttServerConfig[];\n port?: number;\n protocol?: MqttProtocol;\n username?: string;\n password?: string;\n clientId?: string;\n clean?: boolean;\n keepalive?: number;\n connectTimeout?: number;\n reconnectPeriod?: number;\n reconnectOnConnackError?: boolean;\n resubscribe?: boolean;\n queueQoSZero?: boolean;\n rejectUnauthorized?: boolean;\n properties?: IMqttConnectProperties;\n ca?: string;\n cert?: string;\n key?: string;\n servername?: string;\n};\n\nconst resolveMqttHost = (channel: MqttChannelConfig | undefined, pathLabel: string): string => {\n if (!channel) {\n throw new Error(`Configuration value '${pathLabel}' is required.`);\n }\n if (typeof channel.host === \"string\" && channel.host.length > 0) {\n return channel.host;\n }\n if (Array.isArray(channel.hosts) && channel.hosts.length > 0) {\n const candidate = channel.hosts.find((host) => typeof host === \"string\" && host.length > 0);\n if (candidate) return candidate;\n }\n if (Array.isArray(channel.servers) && channel.servers.length > 0) {\n const candidate = channel.servers.find((server) => typeof server.host === \"string\" && server.host.length > 0);\n if (candidate) return candidate.host;\n }\n throw new Error(`Configuration value '${pathLabel}' must include host, hosts, or servers.`);\n};\n\nconst buildUnsProcessParameters = (\n channel: MqttChannelConfig | undefined,\n): Omit<IUnsProcessParameters, \"processName\"> => {\n if (!channel) return {};\n return {\n username: channel.username,\n password: channel.password,\n clientId: channel.clientId,\n hosts: channel.hosts,\n servers: channel.servers,\n port: channel.port,\n protocol: channel.protocol,\n keepalive: channel.keepalive,\n clean: channel.clean,\n connectTimeout: channel.connectTimeout,\n reconnectPeriod: channel.reconnectPeriod,\n reconnectOnConnackError: channel.reconnectOnConnackError,\n resubscribe: channel.resubscribe,\n queueQoSZero: channel.queueQoSZero,\n rejectUnauthorized: channel.rejectUnauthorized,\n properties: channel.properties,\n ca: channel.ca,\n cert: channel.cert,\n key: channel.key,\n servername: channel.servername,\n };\n};\n\nconst buildUnsParameters = (channel: MqttChannelConfig | undefined): IUnsParameters => {\n if (!channel) return {};\n return {\n username: channel.username,\n password: channel.password,\n clientId: channel.clientId,\n hosts: channel.hosts,\n servers: channel.servers,\n port: channel.port,\n protocol: channel.protocol,\n keepalive: channel.keepalive,\n clean: channel.clean,\n connectTimeout: channel.connectTimeout,\n reconnectPeriod: channel.reconnectPeriod,\n reconnectOnConnackError: channel.reconnectOnConnackError,\n resubscribe: channel.resubscribe,\n queueQoSZero: channel.queueQoSZero,\n rejectUnauthorized: channel.rejectUnauthorized,\n properties: channel.properties,\n ca: channel.ca,\n cert: channel.cert,\n key: channel.key,\n servername: channel.servername,\n };\n};\n\nexport class UnsGatewayServer {\n private server: GrpcServer | null = null;\n private unsProcess: UnsProxyProcessWithApi | null = null;\n private mqttInput: UnsMqttProxy | null = null;\n private mqttOutput: UnsMqttProxy | null = null;\n private handlers: Set<Function> = new Set();\n private unsApiProxy: UnsApiProxyLike | null = null;\n private apiStreams: Set<any> = new Set();\n private pendingApi: Map<string, any> = new Map();\n\n private inputHost: string;\n private outputHost: string;\n private inputParams: IUnsParameters | null = null;\n private outputParams: IUnsParameters | null = null;\n private apiOptions: IApiProxyOptions | null = null;\n private outPublisherActive = false;\n private inSubscriberActive = false;\n\n public async start(\n desiredAddr?: string,\n opts?: {\n processNameOverride?: string;\n instanceSuffix?: string;\n instanceModeOverride?: \"wait\" | \"force\" | \"handover\";\n handoverOverride?: boolean;\n }\n ): Promise<GatewayAddress> {\n const packageDef = protoLoader.loadSync(GATEWAY_PROTO, {\n keepCase: true,\n longs: String,\n enums: String,\n defaults: true,\n oneofs: true,\n });\n const proto = grpc.loadPackageDefinition(packageDef) as any;\n\n // Load config and init UNS process + MQTT proxies\n const cfg = await ConfigFile.loadConfig();\n const processName = opts?.processNameOverride ?? cfg.uns.processName;\n const instanceMode = opts?.instanceModeOverride ?? cfg.uns.instanceMode;\n const handover = (typeof opts?.handoverOverride === \"boolean\") ? opts.handoverOverride : cfg.uns.handover;\n const suffix = opts?.instanceSuffix ? `-${opts.instanceSuffix}` : \"\";\n\n const infraHost = resolveMqttHost(cfg.infra as MqttChannelConfig, \"infra\");\n const infraParams = buildUnsProcessParameters(cfg.infra as MqttChannelConfig);\n this.unsProcess = new UnsProxyProcess(infraHost, { processName, ...infraParams }) as UnsProxyProcessWithApi;\n // cache hosts/options; proxies created lazily on first use\n this.inputHost = resolveMqttHost(cfg.input as MqttChannelConfig, \"input\");\n this.outputHost = resolveMqttHost(cfg.output as MqttChannelConfig, \"output\");\n this.inputParams = buildUnsParameters(cfg.input as MqttChannelConfig);\n this.outputParams = buildUnsParameters(cfg.output as MqttChannelConfig);\n this.apiOptions = cfg.uns?.jwksWellKnownUrl\n ? { jwks: { wellKnownJwksUrl: cfg.uns.jwksWellKnownUrl, activeKidUrl: cfg.uns.kidWellKnownUrl } }\n : { jwtSecret: \"CHANGEME\" };\n\n const serviceImpl = {\n Publish: this.publish.bind(this),\n Subscribe: this.subscribe.bind(this),\n RegisterApiGet: this.registerApiGet.bind(this),\n UnregisterApiGet: this.unregisterApiGet.bind(this),\n ApiEventStream: this.apiEventStream.bind(this),\n Ready: this.ready.bind(this),\n };\n\n this.server = new grpc.Server();\n this.server.addService(proto.uns.UnsGateway.service, serviceImpl);\n\n const isUnix = process.platform !== \"win32\";\n let addr: string | null = desiredAddr || process.env.UNS_GATEWAY_ADDR || null;\n if (!addr) {\n if (isUnix) {\n const sanitizedProcess = MqttTopicBuilder.sanitizeTopicPart(this.getProcessName());\n const sock = `/tmp/${sanitizedProcess}-uns-gateway.sock`;\n addr = `unix:${sock}`;\n } else {\n const port = await getPort();\n addr = `0.0.0.0:${port}`;\n }\n }\n\n // If UDS and file exists, best-effort unlink (stale sock)\n if (addr.startsWith(\"unix:\")) {\n const fs = await import(\"fs\");\n const p = addr.slice(\"unix:\".length);\n try { if (fs.existsSync(p)) fs.unlinkSync(p); } catch {}\n }\n\n await new Promise<void>((resolve, reject) => {\n this.server!.bindAsync(addr!, grpc.ServerCredentials.createInsecure(), (err) => {\n if (err) return reject(err);\n // grpc-js automatically starts the server after bindAsync in recent versions\n // Calling start() is deprecated; omit to avoid warnings.\n logger.info(`UNS gRPC Gateway listening on ${addr}`);\n resolve();\n });\n });\n\n return { address: addr!, isUDS: addr!.startsWith(\"unix:\") };\n }\n\n private getProcessName(): string {\n try {\n const pkgPath = path.join(basePath, \"package.json\");\n const raw = readFileSync(pkgPath, \"utf8\");\n const pkg = JSON.parse(raw);\n return `${pkg.name}-${pkg.version}`;\n } catch {\n return `uns-gateway`;\n }\n }\n\n private async publish(call: any, callback: any) {\n try {\n await this.ensureMqttOutput();\n const req = call.request as any;\n if (!this.mqttOutput) throw new Error(\"Gateway not initialized\");\n\n const topic: string = req.topic;\n const attribute: string = req.attribute;\n const description: string = req.description ?? \"\";\n const tags: string[] = (req.tags ?? []) as string[];\n const attributeNeedsPersistence: boolean | null = req.attribute_needs_persistence ?? null;\n const valueIsCumulative: boolean = req.value_is_cumulative ?? false;\n\n let message: IUnsMessage | null = null;\n\n if (req.data) {\n const d = req.data;\n const time: string = d.time;\n const uom: string | undefined = d.uom || undefined;\n const dataGroup: string | undefined = d.data_group || undefined;\n const foreignEventKey: string | undefined = d.foreign_event_key || undefined;\n\n let value: any = undefined;\n if (typeof d.value_number === \"number\" && !Number.isNaN(d.value_number)) {\n value = d.value_number;\n } else if (typeof d.value_string === \"string\" && d.value_string.length > 0) {\n value = d.value_string;\n }\n if (value === undefined) throw new Error(\"Data.value_number or Data.value_string must be set\");\n\n message = { data: { time, value, uom, dataGroup, foreignEventKey } } as IUnsMessage;\n } else if (req.table) {\n const t = req.table;\n const time: string = t.time;\n const dataGroup: string | undefined = t.data_group || undefined;\n const columns = (t.columns ?? []).map((col: any) => {\n let value: string | number | null = null;\n if (typeof col.value_number === \"number\" && !Number.isNaN(col.value_number)) {\n value = col.value_number;\n } else if (typeof col.value_string === \"string\") {\n value = col.value_string;\n }\n return {\n name: col.name as string,\n type: col.type as any,\n uom: col.uom || undefined,\n value,\n };\n });\n\n message = { table: { time, columns, dataGroup } } as IUnsMessage;\n } else {\n throw new Error(\"PublishRequest.content must be data or table\");\n }\n\n const mqttMsg: IMqttPublishRequest = {\n topic,\n asset: \"meter\",\n objectType: ObjectTypes[\"energy-resource\"],\n objectId: \"main\",\n attributes: {\n attribute,\n description,\n tags,\n attributeNeedsPersistence,\n ...(message.data ? { data: message.data } : { table: message.table! }),\n },\n };\n\n this.mqttOutput.publishMqttMessage(\n mqttMsg,\n message.data && valueIsCumulative ? MessageMode.Delta : MessageMode.Raw,\n );\n\n callback(null, { ok: true });\n } catch (err: any) {\n logger.error(`Gateway Publish error: ${err.message}`);\n callback(null, { ok: false, error: err.message });\n }\n }\n\n private async subscribe(call: any) {\n await this.ensureMqttInput();\n const req = call.request as any;\n const topics: string[] = (req.topics ?? []) as string[];\n if (topics.length === 0) {\n call.emit(\"error\", { code: grpc.status.INVALID_ARGUMENT, details: \"topics is required\" });\n call.end();\n return;\n }\n\n // Subscribe and stream messages to this client\n this.mqttInput.subscribeAsync(topics);\n\n const handler = (event: any) => {\n try {\n // Forward as UNS packet JSON if parsable, else raw message\n const payload = event.packet ? JSON.stringify(event.packet) : String(event.message ?? \"\");\n call.write({ topic: event.topic, payload });\n } catch (e) {\n // drop\n }\n };\n this.handlers.add(handler);\n this.mqttInput.event.on(\"input\", handler);\n\n call.on(\"cancelled\", () => this.cleanupHandler(handler));\n call.on(\"error\", () => this.cleanupHandler(handler));\n call.on(\"close\", () => this.cleanupHandler(handler));\n }\n\n private attachStatusListeners(): void {\n if (this.mqttOutput) {\n this.mqttOutput.event.on(\"mqttProxyStatus\", (e: any) => {\n if (e?.event === \"t-publisher-active\") this.outPublisherActive = !!e.value;\n });\n }\n if (this.mqttInput) {\n this.mqttInput.event.on(\"mqttProxyStatus\", (e: any) => {\n if (e?.event === \"t-subscriber-active\") this.inSubscriberActive = !!e.value;\n });\n }\n }\n\n private async ensureMqttOutput() {\n if (!this.mqttOutput) {\n // slight delay to let process MQTT connect\n while ((this.unsProcess as any)?.processMqttProxy?.isConnected === false) {\n await new Promise((r) => setTimeout(r, 50));\n }\n const outputParams: IUnsParameters = {\n ...(this.outputParams ?? {}),\n publishThrottlingDelay: this.outputParams?.publishThrottlingDelay ?? 1,\n };\n this.mqttOutput = await this.unsProcess!.createUnsMqttProxy(\n this.outputHost,\n this.getInstanceName(\"gatewayOutput\"),\n \"force\",\n true,\n outputParams,\n );\n this.attachStatusListeners();\n }\n }\n\n private async ensureMqttInput() {\n if (!this.mqttInput) {\n while ((this.unsProcess as any)?.processMqttProxy?.isConnected === false) {\n await new Promise((r) => setTimeout(r, 50));\n }\n const inputParams: IUnsParameters = {\n ...(this.inputParams ?? {}),\n mqttSubToTopics: this.inputParams?.mqttSubToTopics ?? [],\n };\n this.mqttInput = await this.unsProcess!.createUnsMqttProxy(\n this.inputHost,\n this.getInstanceName(\"gatewayInput\"),\n \"force\",\n true,\n inputParams,\n );\n this.attachStatusListeners();\n }\n }\n\n private async ensureApiProxy() {\n if (!this.unsApiProxy) {\n if (typeof (this.unsProcess as any)?.createApiProxy !== \"function\") {\n throw new Error(\"API plugin not registered. Please install @uns-kit/api and register it with UnsProxyProcess before starting the gateway.\");\n }\n this.unsApiProxy = await this.unsProcess!.createApiProxy(this.getInstanceName(\"gatewayApi\"), this.apiOptions!);\n this.unsApiProxy.event.on(\"apiGetEvent\", (event: any) => this.onApiGetEvent(event));\n }\n }\n\n private getInstanceName(base: string): string {\n // derive suffix from processName/CLI by inspecting configured instanceStatusTopic is overkill; keep base names unique per process\n return base;\n }\n\n private async registerApiGet(call: any, callback: any) {\n try {\n await this.ensureApiProxy();\n const req = call.request as any;\n const topic: string = req.topic;\n const attribute: string = req.attribute;\n const apiDescription: string | undefined = req.api_description || undefined;\n const tags: string[] | undefined = (req.tags ?? []) as string[];\n const queryParams: any[] = (req.query_params ?? []).map((p: any) => ({\n name: p.name,\n type: (p.type === \"number\" || p.type === \"boolean\") ? p.type : \"string\",\n required: !!p.required,\n description: p.description ?? undefined,\n }));\n\n const options: IGetEndpointOptions = {\n apiDescription,\n tags,\n queryParams,\n };\n await this.unsApiProxy.get(topic as any, attribute, options);\n callback(null, { ok: true });\n } catch (err: any) {\n logger.error(`Gateway RegisterApiGet error: ${err.message}`);\n callback(null, { ok: false, error: err.message });\n }\n }\n\n private async unregisterApiGet(call: any, callback: any) {\n try {\n await this.ensureApiProxy();\n const req = call.request as any;\n const topic: string = req.topic;\n const attribute: string = req.attribute;\n await this.unsApiProxy.unregister(topic as any, attribute, \"GET\");\n callback(null, { ok: true });\n } catch (err: any) {\n logger.error(`Gateway UnregisterApiGet error: ${err.message}`);\n callback(null, { ok: false, error: err.message });\n }\n }\n\n private onApiGetEvent(event: any) {\n // Correlate request and forward to connected gRPC streams\n const id = randomUUID();\n const req = event.req;\n const res = event.res;\n const path: string = req.path || req.originalUrl || \"/\";\n // Derive topic/attribute is optional; we send path and query\n const bearer = (req.headers?.[\"authorization\"] as string | undefined) ?? \"\";\n this.pendingApi.set(id, res);\n // Timeout after 10s\n setTimeout(() => {\n if (this.pendingApi.has(id)) {\n const r = this.pendingApi.get(id);\n try { r.status(504).send(\"Gateway timeout\"); } catch {}\n this.pendingApi.delete(id);\n }\n }, 10_000).unref?.();\n\n const query: Record<string, string> = {};\n Object.entries(req.query || {}).forEach(([k, v]) => { query[k] = String(v); });\n const msg = { id, method: \"GET\", path, query, bearer };\n for (const stream of this.apiStreams) {\n try { stream.write(msg); } catch {}\n }\n }\n\n private async apiEventStream(call: any) {\n // Register stream\n await this.ensureApiProxy();\n this.apiStreams.add(call);\n call.on(\"data\", (resp: any) => {\n const id: string = resp.id;\n const status: number = resp.status ?? 200;\n const body: string = resp.body ?? \"\";\n const headers: Record<string, string> = resp.headers ?? {};\n const res = this.pendingApi.get(id);\n if (res) {\n try {\n Object.entries(headers).forEach(([k, v]) => res.setHeader(k, v));\n res.status(status).send(body);\n } catch {}\n this.pendingApi.delete(id);\n }\n });\n const cleanup = () => { this.apiStreams.delete(call); };\n call.on(\"cancelled\", cleanup);\n call.on(\"error\", cleanup);\n call.on(\"close\", cleanup);\n }\n\n private async ready(call: any, callback: any) {\n try {\n const req = call.request as any;\n const timeoutMs: number = req.timeout_ms && req.timeout_ms > 0 ? req.timeout_ms : 15000;\n const waitOut = !!req.wait_output;\n const waitIn = !!req.wait_input;\n const waitApi = !!req.wait_api;\n\n if (waitOut) await this.ensureMqttOutput();\n if (waitIn) await this.ensureMqttInput();\n if (waitApi) await this.ensureApiProxy();\n\n const start = Date.now();\n const check = () => {\n const okOut = !waitOut || this.outPublisherActive;\n const okIn = !waitIn || this.inSubscriberActive;\n const okApi = !waitApi || !!this.unsApiProxy; // creation ensures listening\n return okOut && okIn && okApi;\n };\n\n if (check()) return callback(null, { ok: true });\n\n const onStatus = () => {\n if (check()) done(true);\n };\n\n const done = (ok: boolean, err?: string) => {\n if (this.mqttOutput) this.mqttOutput.event.off(\"mqttProxyStatus\", onStatus as any);\n if (this.mqttInput) this.mqttInput.event.off(\"mqttProxyStatus\", onStatus as any);\n callback(null, { ok, error: err });\n };\n\n if (this.mqttOutput) this.mqttOutput.event.on(\"mqttProxyStatus\", onStatus as any);\n if (this.mqttInput) this.mqttInput.event.on(\"mqttProxyStatus\", onStatus as any);\n\n const iv = setInterval(() => {\n if (check()) {\n clearInterval(iv);\n done(true);\n } else if (Date.now() - start > timeoutMs) {\n clearInterval(iv);\n done(false, \"timeout waiting for readiness\");\n }\n }, 100);\n } catch (e: any) {\n callback(null, { ok: false, error: e.message });\n }\n }\n\n private cleanupHandler(handler: Function) {\n if (this.mqttInput) this.mqttInput.event.off(\"input\", handler as any);\n this.handlers.delete(handler);\n }\n\n public async shutdown(): Promise<void> {\n try {\n for (const h of Array.from(this.handlers)) this.cleanupHandler(h);\n if (this.server) {\n await new Promise<void>((resolve) => this.server!.tryShutdown(() => resolve()));\n this.server = null;\n }\n if (this.unsProcess) this.unsProcess.shutdown();\n } catch (e: any) {\n logger.error(`Gateway shutdown error: ${e.message}`);\n }\n }\n}\n\nexport async function startUnsGateway(addrOverride?: string, opts?: GatewayStartOptions): Promise<GatewayAddress> {\n const gw = new UnsGatewayServer();\n return gw.start(addrOverride, opts);\n}\nfunction sanitizeTopicPart(getProcessName: () => string) {\n throw new Error(\"Function not implemented.\");\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { IMqttPublishRequest, IUnsPacket, IUnsParameters, UnsEvents } from "../uns/uns-interfaces.js";
|
|
2
2
|
import UnsProxy from "../uns/uns-proxy.js";
|
|
3
3
|
export declare enum MessageMode {
|
|
4
4
|
Raw = "raw",// Send only the original message
|
|
@@ -72,7 +72,7 @@ export default class UnsMqttProxy extends UnsProxy {
|
|
|
72
72
|
* @param mqttMessage - The MQTT message object.
|
|
73
73
|
* @param mode - The message mode (Raw, Delta, or Both).
|
|
74
74
|
*/
|
|
75
|
-
publishMqttMessage(mqttMessage:
|
|
75
|
+
publishMqttMessage(mqttMessage: IMqttPublishRequest | null, mode?: MessageMode): Promise<void>;
|
|
76
76
|
/**
|
|
77
77
|
* Publishes a message to a specified topic.
|
|
78
78
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uns-mqtt-proxy.d.ts","sourceRoot":"","sources":["../../src/uns-mqtt/uns-mqtt-proxy.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"uns-mqtt-proxy.d.ts","sourceRoot":"","sources":["../../src/uns-mqtt/uns-mqtt-proxy.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,mBAAmB,EAAe,UAAU,EAAE,cAAc,EAAgB,SAAS,EAAa,MAAM,0BAA0B,CAAC;AAO5I,OAAO,QAAQ,MAAM,qBAAqB,CAAC;AAa3C,oBAAY,WAAW;IACrB,GAAG,QAAQ,CAAM,iCAAiC;IAClD,KAAK,UAAU,CAAE,8BAA8B;IAC/C,IAAI,SAAS;CACd;AAgBD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,QAAQ;IAChD,OAAO,CAAC,UAAU,CAA8E;IAChG,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,eAAe,CAAmF;IAC1G,OAAO,CAAC,aAAa,CAAiB;IACtC,SAAS,CAAC,kBAAkB,EAAE,MAAM,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,YAAY,CAAmB;gBAGrC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE,cAAc,EAC9B,eAAe,GAAE,OAAe,EAChC,gBAAgB,GAAE,OAAe;IA4CnC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAkC7B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAIhC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAmDxB;;;;;;;OAOG;YACW,2BAA2B;IASzC;;;;;OAKG;IACI,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAI3E;;;OAGG;IACI,mBAAmB,IAAI,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAY9D;;;;;OAKG;IACI,mBAAmB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAI5E;;;OAGG;IACI,oBAAoB,IAAI,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAa/D;;;OAGG;IACU,iCAAiC,IAAI,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAWlF;;;;;OAKG;IACU,kBAAkB,CAAC,WAAW,EAAE,mBAAmB,GAAG,IAAI,EAAE,IAAI,GAAE,WAA6B;IAoE5G;;;;;;OAMG;IACI,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpE;;;;;OAKG;IACI,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAI7D;;;;OAIG;IACI,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAItD;;;;OAIG;IACI,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAI/C;;;;;;;OAOG;YACW,wBAAwB;IA+EtC;;OAEG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAmBnC"}
|
|
@@ -244,77 +244,62 @@ export default class UnsMqttProxy extends UnsProxy {
|
|
|
244
244
|
logger.error(`${this.instanceNameWithSuffix} - Error publishing mqtt message: mqttMessage must be defined.`);
|
|
245
245
|
return;
|
|
246
246
|
}
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
const
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
247
|
+
const attrs = Array.isArray(mqttMessage.attributes)
|
|
248
|
+
? mqttMessage.attributes
|
|
249
|
+
: [mqttMessage.attributes];
|
|
250
|
+
const { topic, asset, assetDescription, objectType, objectTypeDescription, objectId } = mqttMessage;
|
|
251
|
+
for (const attrEntry of attrs) {
|
|
252
|
+
const attrDescription = attrEntry.description ?? getAttributeDescription(attrEntry.attribute);
|
|
253
|
+
const message = "message" in attrEntry && attrEntry.message
|
|
254
|
+
? attrEntry.message
|
|
255
|
+
: "data" in attrEntry && attrEntry.data
|
|
256
|
+
? { data: attrEntry.data, createdAt: attrEntry.createdAt, expiresAt: attrEntry.expiresAt }
|
|
257
|
+
: "table" in attrEntry && attrEntry.table
|
|
258
|
+
? { table: attrEntry.table, createdAt: attrEntry.createdAt, expiresAt: attrEntry.expiresAt }
|
|
259
|
+
: (() => { throw new Error("Attribute entry must include exactly one of data/table/message"); })();
|
|
260
|
+
const packet = await UnsPacket.unsPacketFromUnsMessage(message);
|
|
261
|
+
const singleMsg = {
|
|
262
|
+
topic,
|
|
263
|
+
asset,
|
|
264
|
+
assetDescription,
|
|
265
|
+
objectType,
|
|
266
|
+
objectTypeDescription,
|
|
267
|
+
objectId,
|
|
268
|
+
attribute: attrEntry.attribute,
|
|
269
|
+
description: attrDescription,
|
|
270
|
+
tags: attrEntry.tags,
|
|
271
|
+
attributeNeedsPersistence: attrEntry.attributeNeedsPersistence,
|
|
272
|
+
packet,
|
|
273
|
+
};
|
|
274
|
+
// existing single-attribute flow
|
|
275
|
+
const baseDescription = singleMsg.description ??
|
|
276
|
+
getAttributeDescription(singleMsg.attribute) ??
|
|
277
|
+
singleMsg.attribute;
|
|
278
|
+
const mqttMessageWithDesc = { ...singleMsg, description: baseDescription };
|
|
279
|
+
const time = UnsPacket.formatToISO8601(new Date());
|
|
280
|
+
switch (mode) {
|
|
281
|
+
case MessageMode.Raw: {
|
|
282
|
+
this.processAndEnqueueMessage(mqttMessageWithDesc, time, false);
|
|
283
|
+
break;
|
|
284
|
+
}
|
|
285
|
+
case MessageMode.Delta: {
|
|
286
|
+
const deltaMessage = { ...mqttMessageWithDesc };
|
|
287
|
+
deltaMessage.attribute = `${mqttMessageWithDesc.attribute}-delta`;
|
|
288
|
+
deltaMessage.description = `${baseDescription ?? ""} (delta)`;
|
|
289
|
+
this.processAndEnqueueMessage(deltaMessage, time, true);
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
case MessageMode.Both: {
|
|
293
|
+
this.processAndEnqueueMessage(mqttMessageWithDesc, time, false);
|
|
294
|
+
const deltaMessageBoth = { ...mqttMessageWithDesc };
|
|
295
|
+
deltaMessageBoth.attribute = `${mqttMessageWithDesc.attribute}-delta`;
|
|
296
|
+
deltaMessageBoth.description = `${baseDescription ?? ""} (delta)`;
|
|
297
|
+
this.processAndEnqueueMessage(deltaMessageBoth, time, true);
|
|
298
|
+
break;
|
|
284
299
|
}
|
|
285
|
-
: null;
|
|
286
|
-
if (!derivedMessage) {
|
|
287
|
-
logger.error(`${this.instanceNameWithSuffix} - Error publishing mqtt message: mqttMessage.packet must be defined.`);
|
|
288
|
-
return;
|
|
289
|
-
}
|
|
290
|
-
mqttMessage.packet = await UnsPacket.unsPacketFromUnsMessage(derivedMessage);
|
|
291
|
-
}
|
|
292
|
-
const baseDescription = mqttMessage.description ??
|
|
293
|
-
getAttributeDescription(mqttMessage.attribute) ??
|
|
294
|
-
mqttMessage.attribute;
|
|
295
|
-
const mqttMessageWithDesc = { ...mqttMessage, description: baseDescription };
|
|
296
|
-
const time = UnsPacket.formatToISO8601(new Date());
|
|
297
|
-
switch (mode) {
|
|
298
|
-
case MessageMode.Raw: {
|
|
299
|
-
this.processAndEnqueueMessage(mqttMessageWithDesc, time, false);
|
|
300
|
-
break;
|
|
301
|
-
}
|
|
302
|
-
case MessageMode.Delta: {
|
|
303
|
-
const deltaMessage = { ...mqttMessageWithDesc };
|
|
304
|
-
deltaMessage.attribute = `${mqttMessageWithDesc.attribute}-delta`;
|
|
305
|
-
deltaMessage.description = `${baseDescription ?? ""} (delta)`;
|
|
306
|
-
this.processAndEnqueueMessage(deltaMessage, time, true);
|
|
307
|
-
break;
|
|
308
|
-
}
|
|
309
|
-
case MessageMode.Both: {
|
|
310
|
-
this.processAndEnqueueMessage(mqttMessageWithDesc, time, false);
|
|
311
|
-
const deltaMessageBoth = { ...mqttMessageWithDesc };
|
|
312
|
-
deltaMessageBoth.attribute = `${mqttMessageWithDesc.attribute}-delta`;
|
|
313
|
-
deltaMessageBoth.description = `${baseDescription ?? ""} (delta)`;
|
|
314
|
-
this.processAndEnqueueMessage(deltaMessageBoth, time, true);
|
|
315
|
-
break;
|
|
316
300
|
}
|
|
317
301
|
}
|
|
302
|
+
return;
|
|
318
303
|
}
|
|
319
304
|
/**
|
|
320
305
|
* Publishes a message to a specified topic.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uns-mqtt-proxy.js","sourceRoot":"","sources":["../../src/uns-mqtt/uns-mqtt-proxy.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from \"fs\";\nimport { IClientPublishOptions } from \"mqtt\";\nimport * as path from \"path\";\nimport { Worker } from \"worker_threads\";\nimport { fileURLToPath } from \"url\";\nimport { basePath } from \"../base-path.js\";\nimport logger from \"../logger.js\";\nimport { IMqttMessage, IMqttMultiMessage, IUnsMessage, IUnsPacket, IUnsParameters, UnsEvents, ValueType } from \"../uns/uns-interfaces.js\";\nimport { getObjectTypeDescription, type UnsObjectId, type UnsObjectType } from \"../uns/uns-object.js\";\nimport type { UnsAsset } from \"../uns/uns-asset.js\";\nimport { MeasurementUnit } from \"../uns/uns-measurements.js\";\nimport { UnsPacket } from \"../uns/uns-packet.js\";\nimport { IMqttParameters, IMqttWorkerData } from \"./mqtt-interfaces.js\";\nimport { MqttTopicBuilder } from \"./mqtt-topic-builder.js\";\nimport UnsProxy from \"../uns/uns-proxy.js\";\nimport { UnsAttributeType } from \"../graphql/schema.js\";\nimport { getAttributeDescription } from \"../uns/uns-attributes.js\";\n\nconst packageJsonPath = path.join(basePath, \"package.json\");\nconst packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf8\"));\n\nconst moduleDirectory = path.dirname(fileURLToPath(import.meta.url));\nconst packageRoot = path.resolve(moduleDirectory, \"..\", \"..\");\nconst workerScriptPath = path.join(packageRoot, \"dist/uns-mqtt/mqtt-worker-init.js\");\n\nexport enum MessageMode {\n Raw = 'raw', // Send only the original message\n Delta = 'delta', // Send only the delta message\n Both = 'both' // Send both the original and delta messages\n}\n\nexport default class UnsMqttProxy extends UnsProxy {\n private lastValues: Map<string, { value: ValueType; uom: string; timestamp: Date }> = new Map();\n private worker: Worker;\n private pendingEnqueues: Map<string, { resolve: () => void; reject: (reason?: any) => void }> = new Map();\n private unsParameters: IUnsParameters;\n protected processStatusTopic: string;\n public instanceName: string;\n private currentSequenceId: Map<string, number> = new Map();\n private topicBuilder: MqttTopicBuilder;\n\n constructor(\n mqttHost: string,\n processName: string,\n instanceName: string,\n unsParameters?: IUnsParameters,\n publisherActive: boolean = false,\n subscriberActive: boolean = false\n ) {\n super();\n this.instanceName = instanceName;\n // Create the topic builder using packageJson values and the processName.\n this.topicBuilder = new MqttTopicBuilder(`uns-infra/${MqttTopicBuilder.sanitizeTopicPart(packageJson.name)}/${MqttTopicBuilder.sanitizeTopicPart(packageJson.version)}/${MqttTopicBuilder.sanitizeTopicPart(processName)}/`);\n\n // Generate the processStatusTopic using the builder.\n this.processStatusTopic = this.topicBuilder.getProcessStatusTopic();\n // Derive the instanceStatusTopic by appending the instance name.\n this.instanceStatusTopic = this.processStatusTopic + instanceName + \"/\";\n\n // Concatenate processName with instanceName for the worker identification.\n this.instanceNameWithSuffix = `${processName}-${instanceName}`;\n \n const mqttParameters: IMqttParameters = {\n mqttSubToTopics: unsParameters?.mqttSubToTopics ?? [],\n username: unsParameters?.username ?? \"\",\n password: unsParameters?.password ?? \"\",\n mqttSSL: unsParameters?.mqttSSL ?? false,\n statusTopic: this.instanceStatusTopic,\n rejectUnauthorized: unsParameters?.rejectUnauthorized ?? false,\n clientId: unsParameters?.clientId,\n hosts: unsParameters?.hosts,\n servers: unsParameters?.servers,\n port: unsParameters?.port,\n protocol: unsParameters?.protocol,\n keepalive: unsParameters?.keepalive,\n clean: unsParameters?.clean,\n connectTimeout: unsParameters?.connectTimeout,\n reconnectPeriod: unsParameters?.reconnectPeriod,\n reconnectOnConnackError: unsParameters?.reconnectOnConnackError,\n resubscribe: unsParameters?.resubscribe,\n queueQoSZero: unsParameters?.queueQoSZero,\n properties: unsParameters?.properties,\n ca: unsParameters?.ca,\n cert: unsParameters?.cert,\n key: unsParameters?.key,\n servername: unsParameters?.servername,\n };\n this.unsParameters = unsParameters ?? {};\n this.startQueueWorker(mqttHost, this.instanceNameWithSuffix, mqttParameters, publisherActive, subscriberActive);\n }\n\n /**\n * Resolve object identity from explicit fields or the tail of the topic path.\n * Falls back to parsing when not provided for backward compatibility.\n */\n private resolveObjectIdentity(msg: IMqttMessage): { objectType?: UnsObjectType; objectId?: UnsObjectId; asset?: UnsAsset } {\n const providedType = msg.objectType;\n const providedId = msg.objectId;\n const providedAsset = msg.asset;\n\n const topicParts = msg.topic.split(\"/\").filter((part) => part.length > 0);\n const hasObjectTail = topicParts.length >= 2;\n const parsedType = hasObjectTail ? topicParts[topicParts.length - 2] as UnsObjectType : undefined;\n const parsedId = hasObjectTail ? topicParts[topicParts.length - 1] as UnsObjectId : undefined;\n const parsedAsset = hasObjectTail\n ? (topicParts.length >= 3 ? topicParts[topicParts.length - 3] as UnsAsset : undefined)\n : (topicParts.length >= 1 ? topicParts[topicParts.length - 1] as UnsAsset : undefined);\n\n const objectType = providedType ?? parsedType;\n const objectId = providedId ?? parsedId ?? \"main\";\n const asset = providedAsset ?? parsedAsset;\n\n // If values are provided, trust them; otherwise derive from topic.\n if (!providedType || !providedId) {\n if (parsedType && parsedId) {\n logger.warn(`${this.instanceNameWithSuffix} - objectType/objectId missing; derived from topic tail ${parsedType}/${parsedId}`);\n } else {\n logger.warn(`${this.instanceNameWithSuffix} - objectType/objectId missing; defaulting objectId to 'main' for topic '${msg.topic}'. Expected topic to end with '<objectType>/<objectId>/'`);\n }\n }\n // Asset is optional; no warning on mismatch to avoid noisy logs when base topics don't carry it.\n\n msg.objectType = objectType;\n msg.objectId = objectId;\n msg.asset = asset;\n\n return { objectType, objectId, asset };\n }\n\n /**\n * Ensure the topic ends with a trailing slash for attribute concatenation.\n */\n private normalizeTopicWithObject(topic: string): string {\n return topic.endsWith(\"/\") ? topic : `${topic}/`;\n }\n\n /**\n * Starts a worker thread to process the throttled publish queue.\n */\n private startQueueWorker(\n mqttHost: string,\n instanceNameWithSuffix: string,\n mqttParameters: IMqttParameters,\n publisherActive: boolean,\n subscriberActive: boolean\n ): void {\n const workerData: IMqttWorkerData = {\n publishThrottlingDelay: this.unsParameters.publishThrottlingDelay ?? 1,\n subscribeThrottlingDelay: this.unsParameters.subscribeThrottlingDelay ?? 1,\n persistToDisk: false,\n mqttHost: mqttHost,\n instanceNameWithSuffix: instanceNameWithSuffix,\n mqttParameters: mqttParameters,\n publisherActive,\n subscriberActive\n };\n\n this.worker = new Worker(workerScriptPath, { workerData });\n\n this.worker.on(\"message\", (msg) => {\n if (msg && msg.command === \"enqueueResult\" && msg.id) {\n const pending = this.pendingEnqueues.get(msg.id);\n if (pending) {\n if (msg.status === \"success\" && msg.topic && msg.message) {\n pending.resolve();\n } else {\n pending.reject(new Error(msg.error));\n }\n this.pendingEnqueues.delete(msg.id);\n }\n } else if (msg && msg.command === \"input\") {\n this.event.emit(\"input\", { topic: msg.topic, message: msg.message.toString(), packet: msg.packet });\n } else if (msg && (msg.command === \"handover_subscriber\" || msg.command === \"handover_publisher\")) {\n this.event.emit(\"mqttWorker\", { command: msg.command, batchSize: msg.batchSize, referenceHash: msg.referenceHash, instanceName: this.instanceName });\n } else if (msg && msg.command === \"mqttProxyStatus\") {\n this.event.emit(\"mqttProxyStatus\", { event: msg.event, value: msg.value, uom: msg.uom, statusTopic: msg.statusTopic });\n }\n });\n\n this.worker.on(\"error\", (err) => {\n logger.error(\"Error in worker:\", err);\n });\n\n this.worker.on(\"exit\", (code) => {\n if (code !== 0) {\n logger.error(`Worker exited with code ${code}`);\n }\n });\n }\n\n /**\n * Enqueues a message to the worker queue.\n *\n * @param topic - The topic to which the message belongs.\n * @param message - The message to be enqueued.\n * @param options - Optional publish options.\n * @returns A promise that resolves when the message is successfully enqueued.\n */\n private async enqueueMessageToWorkerQueue(topic: string, message: string, options?: IClientPublishOptions): Promise<void> {\n return new Promise((resolve, reject) => {\n // const id: string = String(this.currentSequenceId.get(topic) ?? 0);\n const id = `${Date.now()}-${Math.random()}`;\n this.pendingEnqueues.set(id, { resolve, reject });\n this.worker.postMessage({ command: \"enqueue\", id, topic, message, options });\n });\n }\n\n /**\n * Sets the publisher active state.\n *\n * @param batchSize - Optional batch size.\n * @param referenceHash - Optional reference hash.\n */\n public setPublisherActive(batchSize?: number, referenceHash?: string): void {\n this.worker.postMessage({ command: \"setPublisherActive\", batchSize, referenceHash });\n }\n\n /**\n * Sets the publisher to passive mode.\n * @returns A promise that resolves when the publisher is set to passive.\n */\n public setPublisherPassive(): Promise<UnsEvents[\"mqttWorker\"]> {\n this.worker.postMessage({ command: \"setPublisherPassive\"});\n return new Promise((resolve) => {\n this.event.on(\"mqttWorker\", (msg: UnsEvents[\"mqttWorker\"]) => {\n if (msg.command === \"handover_publisher\") {\n logger.info(`${this.instanceNameWithSuffix} - Publisher set to passive.`);\n resolve(msg);\n }\n });\n });\n }\n\n /**\n * Sets the subscriber active state.\n *\n * @param batchSize - Optional batch size.\n * @param referenceHash - Optional reference hash.\n */\n public setSubscriberActive(batchSize?: number, referenceHash?: string): void {\n this.worker.postMessage({ command: \"setSubscriberActive\", batchSize, referenceHash });\n }\n\n /**\n * Sets the subscriber to passive mode.\n * @returns A promise that resolves when the subscriber is set to passive.\n */\n public setSubscriberPassive(): Promise<UnsEvents[\"mqttWorker\"]> {\n this.worker.postMessage({ command: \"setSubscriberPassive\"});\n return new Promise((resolve) => {\n this.event.on(\"mqttWorker\", (msg: UnsEvents[\"mqttWorker\"]) => {\n if (msg.command === \"handover_subscriber\") {\n logger.info(`${this.instanceNameWithSuffix} - Publisher set to passive.`);\n resolve(msg);\n }\n });\n });\n }\n\n\n /**\n * Sets the subscriber to passive mode and allows the publisher to run\n * until the queue is empty (all messages are processed).\n */\n public async setSubscriberPassiveAndDrainQueue(): Promise<UnsEvents[\"mqttWorker\"]> {\n return new Promise(async (resolve) => {\n const mqttWorkerData = await this.setSubscriberPassive();\n while (this.pendingEnqueues.size > 0) {\n await new Promise((resolve) => setTimeout(resolve, 100)); // Poll every 100ms\n }\n logger.info(`${this.instanceNameWithSuffix} - Subscriber set to passive and queue drained.`);\n resolve(mqttWorkerData);\n });\n }\n\n /**\n * Processes and publishes MQTT messages based on the selected message mode.\n *\n * @param mqttMessage - The MQTT message object.\n * @param mode - The message mode (Raw, Delta, or Both).\n */\n public async publishMqttMessage(mqttMessage: IMqttMessage | IMqttMultiMessage | null, mode: MessageMode = MessageMode.Raw) {\n if (!mqttMessage) {\n logger.error(`${this.instanceNameWithSuffix} - Error publishing mqtt message: mqttMessage must be defined.`);\n return;\n }\n\n // Multi-attribute payload\n if (\"attributes\" in mqttMessage) {\n const { topic, asset, assetDescription, objectType, objectTypeDescription, objectId } = mqttMessage;\n for (const attrEntry of mqttMessage.attributes) {\n const attrDescription = attrEntry.description ?? getAttributeDescription(attrEntry.attribute);\n const message: IUnsMessage =\n \"message\" in attrEntry && attrEntry.message\n ? attrEntry.message\n : \"data\" in attrEntry && attrEntry.data\n ? { data: attrEntry.data, createdAt: attrEntry.createdAt, expiresAt: attrEntry.expiresAt }\n : \"table\" in attrEntry && attrEntry.table\n ? { table: attrEntry.table, createdAt: attrEntry.createdAt, expiresAt: attrEntry.expiresAt }\n : (() => { throw new Error(\"Attribute entry must include exactly one of data/table/message\"); })();\n const packet = await UnsPacket.unsPacketFromUnsMessage(message);\n const singleMsg: IMqttMessage = {\n topic,\n asset,\n assetDescription,\n objectType,\n objectTypeDescription,\n objectId,\n attribute: attrEntry.attribute,\n description: attrDescription,\n tags: attrEntry.tags,\n attributeNeedsPersistence: attrEntry.attributeNeedsPersistence,\n packet,\n };\n await this.publishMqttMessage(singleMsg, mode);\n }\n return;\n }\n\n if (!mqttMessage.packet) {\n const derivedMessage: IUnsMessage | null =\n mqttMessage.data || mqttMessage.table || mqttMessage.createdAt || mqttMessage.expiresAt\n ? {\n ...(mqttMessage.data ? { data: mqttMessage.data } : {}),\n ...(mqttMessage.table ? { table: mqttMessage.table } : {}),\n ...(mqttMessage.createdAt ? { createdAt: mqttMessage.createdAt } : {}),\n ...(mqttMessage.expiresAt ? { expiresAt: mqttMessage.expiresAt } : {}),\n }\n : null;\n if (!derivedMessage) {\n logger.error(`${this.instanceNameWithSuffix} - Error publishing mqtt message: mqttMessage.packet must be defined.`);\n return;\n }\n mqttMessage.packet = await UnsPacket.unsPacketFromUnsMessage(derivedMessage);\n }\n\n const baseDescription =\n mqttMessage.description ??\n getAttributeDescription(mqttMessage.attribute) ??\n mqttMessage.attribute;\n const mqttMessageWithDesc: IMqttMessage = { ...mqttMessage, description: baseDescription };\n\n const time = UnsPacket.formatToISO8601(new Date());\n switch (mode) {\n case MessageMode.Raw: {\n this.processAndEnqueueMessage(mqttMessageWithDesc, time, false);\n break;\n }\n case MessageMode.Delta: {\n const deltaMessage = { ...mqttMessageWithDesc };\n deltaMessage.attribute = `${mqttMessageWithDesc.attribute}-delta`;\n deltaMessage.description = `${baseDescription ?? \"\"} (delta)`;\n this.processAndEnqueueMessage(deltaMessage, time, true);\n break;\n }\n case MessageMode.Both: {\n this.processAndEnqueueMessage(mqttMessageWithDesc, time, false);\n const deltaMessageBoth = { ...mqttMessageWithDesc };\n deltaMessageBoth.attribute = `${mqttMessageWithDesc.attribute}-delta`;\n deltaMessageBoth.description = `${baseDescription ?? \"\"} (delta)`;\n this.processAndEnqueueMessage(deltaMessageBoth, time, true);\n break;\n }\n } \n }\n\n /**\n * Publishes a message to a specified topic.\n *\n * @param topic - The MQTT topic.\n * @param message - The message to publish.\n * @returns A promise that resolves when enqueued.\n */\n public publishMessage(topic: string, message: string): Promise<void> {\n return this.enqueueMessageToWorkerQueue(topic, message);\n }\n\n /**\n * Parses an MQTT packet from a JSON string.\n *\n * @param mqttPacket - The MQTT packet string.\n * @returns A parsed IUnsPacket object or null.\n */\n public parseMqttPacket(mqttPacket: string): IUnsPacket | null {\n return UnsPacket.parseMqttPacket(mqttPacket, this.instanceNameWithSuffix);\n }\n\n /**\n * Subscribes asynchronously to one or more topics.\n *\n * @param topics - A topic or list of topics.\n */\n public subscribeAsync(topics: string | string[]): void {\n this.worker.postMessage({ command: \"subscribeAsync\", topics });\n }\n\n /**\n * Unsubscribes asynchronously from the given topics.\n *\n * @param topics - A list of topics.\n */\n public unsubscribeAsync(topics: string[]): void {\n this.worker.postMessage({ command: \"unsubscribeAsync\", topics });\n }\n\n /**\n * Processes and enqueues a message to the worker queue, including handling\n * sequencing, value differences, and tracking of unique topics.\n *\n * @param msg - The MQTT message to process.\n * @param time - The timestamp.\n * @param valueIsCumulative - Whether the value is cumulative.\n */\n private async processAndEnqueueMessage(msg: IMqttMessage, time: string, valueIsCumulative: boolean = false): Promise<void> {\n try {\n const attributeType =\n msg.packet.message.data ? UnsAttributeType.Data :\n msg.packet.message.table ? UnsAttributeType.Table : null;\n \n let dataGroup = \"\";\n if (attributeType == UnsAttributeType.Data)\n dataGroup = msg.packet.message.data.dataGroup ?? \"\";\n if (attributeType == UnsAttributeType.Table)\n dataGroup = msg.packet.message.table.dataGroup ?? \"\";\n\n const { objectType, objectId, asset } = this.resolveObjectIdentity(msg);\n const normalizedTopic = this.normalizeTopicWithObject(msg.topic);\n msg.topic = normalizedTopic;\n const description = msg.description ?? getAttributeDescription(msg.attribute as string) ?? \"\";\n const objectTypeDescription = msg.objectTypeDescription ?? (objectType ? getObjectTypeDescription(objectType) : undefined);\n\n this.registerUniqueTopic({\n timestamp: time,\n topic: msg.topic,\n attribute: msg.attribute,\n attributeType: attributeType,\n description,\n tags: msg.tags,\n attributeNeedsPersistence: msg.attributeNeedsPersistence,\n dataGroup,\n asset,\n assetDescription: msg.assetDescription,\n objectType,\n objectTypeDescription,\n objectId\n });\n\n const publishTopic = `${msg.topic}${asset ? `${asset}/` : \"\"}${objectType ? `${objectType}/` : \"\"}${objectId ? `${objectId}/` : \"\"}${msg.attribute}`;\n const sequenceId = this.currentSequenceId.get(msg.topic) ?? 0;\n this.currentSequenceId.set(msg.topic, sequenceId + 1);\n msg.packet.sequenceId = sequenceId;\n\n if (msg.packet.message.data) {\n const newValue = msg.packet.message.data.value;\n const newUom: MeasurementUnit = msg.packet.message.data.uom;\n const lastValueEntry = this.lastValues.get(publishTopic);\n const currentTime = new Date(msg.packet.message.data.time);\n\n if (lastValueEntry) {\n const intervalBetweenMessages = currentTime.getTime() - lastValueEntry.timestamp.getTime();\n const lastValue = lastValueEntry.value;\n this.lastValues.set(publishTopic, { value: newValue, uom: newUom, timestamp: currentTime });\n // Compute the delta and manage cumulative resets\n if (valueIsCumulative == true && typeof newValue === \"number\" && typeof lastValue === \"number\") {\n // Skip if newValue is 0 (likely a glitch)\n if (newValue === 0) {\n return; // Don't process or enqueue\n }\n const delta = newValue - lastValue;\n msg.packet.message.data.value = delta < 0 ? newValue : delta;\n }\n msg.packet.interval = intervalBetweenMessages;\n await this.enqueueMessageToWorkerQueue(publishTopic, JSON.stringify(msg.packet));\n } else {\n this.lastValues.set(publishTopic, { value: newValue, uom: newUom, timestamp: currentTime });\n logger.debug(`${this.instanceNameWithSuffix} - Need one more packet to calculate interval on topic ${publishTopic}`);\n if (valueIsCumulative === false) {\n await this.enqueueMessageToWorkerQueue(publishTopic, JSON.stringify(msg.packet));\n } else {\n logger.debug(`${this.instanceNameWithSuffix} - Need one more packet to calculate difference on value in data for topic ${publishTopic}`);\n }\n }\n } else if (msg.packet.message.table) {\n await this.enqueueMessageToWorkerQueue(publishTopic, JSON.stringify(msg.packet));\n } else {\n logger.error(`${this.instanceNameWithSuffix} - Error publishing message to topic ${publishTopic}: packet.message must include data or table`);\n }\n } catch (error: any) {\n logger.error(`${this.instanceNameWithSuffix} - Error publishing message to topic ${msg.topic}${msg.attribute}: ${error.message}`);\n }\n }\n\n /**\n * Stops the UnsProxy instance and cleans up resources.\n */\n public async stop(): Promise<void> {\n super.stop();\n // Terminate the worker thread if it exists.\n if (this.worker) {\n try {\n const exitCode = await this.worker.terminate();\n logger.info(`${this.instanceNameWithSuffix} - Worker terminated with exit code ${exitCode}`);\n } catch (error: any) {\n logger.error(`${this.instanceNameWithSuffix} - Error terminating worker: ${error.message}`);\n }\n }\n \n // Optionally, handle any pending enqueues.\n for (const [id, pending] of this.pendingEnqueues) {\n pending.reject(new Error(\"UnsProxy has been stopped\"));\n this.pendingEnqueues.delete(id);\n }\n }\n\n}\n"]}
|
|
1
|
+
{"version":3,"file":"uns-mqtt-proxy.js","sourceRoot":"","sources":["../../src/uns-mqtt/uns-mqtt-proxy.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from \"fs\";\nimport { IClientPublishOptions } from \"mqtt\";\nimport * as path from \"path\";\nimport { Worker } from \"worker_threads\";\nimport { fileURLToPath } from \"url\";\nimport { basePath } from \"../base-path.js\";\nimport logger from \"../logger.js\";\nimport { IMqttPublishRequest, IUnsMessage, IUnsPacket, IUnsParameters, UnsAttribute, UnsEvents, ValueType } from \"../uns/uns-interfaces.js\";\nimport { getObjectTypeDescription, type UnsObjectId, type UnsObjectType } from \"../uns/uns-object.js\";\nimport type { UnsAsset } from \"../uns/uns-asset.js\";\nimport { MeasurementUnit } from \"../uns/uns-measurements.js\";\nimport { UnsPacket } from \"../uns/uns-packet.js\";\nimport { IMqttParameters, IMqttWorkerData } from \"./mqtt-interfaces.js\";\nimport { MqttTopicBuilder } from \"./mqtt-topic-builder.js\";\nimport UnsProxy from \"../uns/uns-proxy.js\";\nimport { UnsAttributeType } from \"../graphql/schema.js\";\nimport { getAttributeDescription } from \"../uns/uns-attributes.js\";\nimport { UnsTags } from \"../uns/uns-tags.js\";\nimport { UnsTopics } from \"../uns/uns-topics.js\";\n\nconst packageJsonPath = path.join(basePath, \"package.json\");\nconst packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf8\"));\n\nconst moduleDirectory = path.dirname(fileURLToPath(import.meta.url));\nconst packageRoot = path.resolve(moduleDirectory, \"..\", \"..\");\nconst workerScriptPath = path.join(packageRoot, \"dist/uns-mqtt/mqtt-worker-init.js\");\n\nexport enum MessageMode {\n Raw = 'raw', // Send only the original message\n Delta = 'delta', // Send only the delta message\n Both = 'both' // Send both the original and delta messages\n}\n\ntype InternalMqttMessage = {\n topic: UnsTopics;\n attribute: UnsAttribute;\n asset: UnsAsset;\n assetDescription?: string;\n objectType: UnsObjectType;\n objectTypeDescription?: string;\n objectId: UnsObjectId;\n description?: string;\n tags?: UnsTags[];\n attributeNeedsPersistence?: boolean | null;\n packet: IUnsPacket;\n};\n\nexport default class UnsMqttProxy extends UnsProxy {\n private lastValues: Map<string, { value: ValueType; uom: string; timestamp: Date }> = new Map();\n private worker: Worker;\n private pendingEnqueues: Map<string, { resolve: () => void; reject: (reason?: any) => void }> = new Map();\n private unsParameters: IUnsParameters;\n protected processStatusTopic: string;\n public instanceName: string;\n private currentSequenceId: Map<string, number> = new Map();\n private topicBuilder: MqttTopicBuilder;\n\n constructor(\n mqttHost: string,\n processName: string,\n instanceName: string,\n unsParameters?: IUnsParameters,\n publisherActive: boolean = false,\n subscriberActive: boolean = false\n ) {\n super();\n this.instanceName = instanceName;\n // Create the topic builder using packageJson values and the processName.\n this.topicBuilder = new MqttTopicBuilder(`uns-infra/${MqttTopicBuilder.sanitizeTopicPart(packageJson.name)}/${MqttTopicBuilder.sanitizeTopicPart(packageJson.version)}/${MqttTopicBuilder.sanitizeTopicPart(processName)}/`);\n\n // Generate the processStatusTopic using the builder.\n this.processStatusTopic = this.topicBuilder.getProcessStatusTopic();\n // Derive the instanceStatusTopic by appending the instance name.\n this.instanceStatusTopic = this.processStatusTopic + instanceName + \"/\";\n\n // Concatenate processName with instanceName for the worker identification.\n this.instanceNameWithSuffix = `${processName}-${instanceName}`;\n \n const mqttParameters: IMqttParameters = {\n mqttSubToTopics: unsParameters?.mqttSubToTopics ?? [],\n username: unsParameters?.username ?? \"\",\n password: unsParameters?.password ?? \"\",\n mqttSSL: unsParameters?.mqttSSL ?? false,\n statusTopic: this.instanceStatusTopic,\n rejectUnauthorized: unsParameters?.rejectUnauthorized ?? false,\n clientId: unsParameters?.clientId,\n hosts: unsParameters?.hosts,\n servers: unsParameters?.servers,\n port: unsParameters?.port,\n protocol: unsParameters?.protocol,\n keepalive: unsParameters?.keepalive,\n clean: unsParameters?.clean,\n connectTimeout: unsParameters?.connectTimeout,\n reconnectPeriod: unsParameters?.reconnectPeriod,\n reconnectOnConnackError: unsParameters?.reconnectOnConnackError,\n resubscribe: unsParameters?.resubscribe,\n queueQoSZero: unsParameters?.queueQoSZero,\n properties: unsParameters?.properties,\n ca: unsParameters?.ca,\n cert: unsParameters?.cert,\n key: unsParameters?.key,\n servername: unsParameters?.servername,\n };\n this.unsParameters = unsParameters ?? {};\n this.startQueueWorker(mqttHost, this.instanceNameWithSuffix, mqttParameters, publisherActive, subscriberActive);\n }\n\n /**\n * Resolve object identity from explicit fields or the tail of the topic path.\n * Falls back to parsing when not provided for backward compatibility.\n */\n private resolveObjectIdentity(msg: InternalMqttMessage): { objectType?: UnsObjectType; objectId?: UnsObjectId; asset?: UnsAsset } {\n const providedType = msg.objectType;\n const providedId = msg.objectId;\n const providedAsset = msg.asset;\n\n const topicParts = msg.topic.split(\"/\").filter((part) => part.length > 0);\n const hasObjectTail = topicParts.length >= 2;\n const parsedType = hasObjectTail ? topicParts[topicParts.length - 2] as UnsObjectType : undefined;\n const parsedId = hasObjectTail ? topicParts[topicParts.length - 1] as UnsObjectId : undefined;\n const parsedAsset = hasObjectTail\n ? (topicParts.length >= 3 ? topicParts[topicParts.length - 3] as UnsAsset : undefined)\n : (topicParts.length >= 1 ? topicParts[topicParts.length - 1] as UnsAsset : undefined);\n\n const objectType = providedType ?? parsedType;\n const objectId = providedId ?? parsedId ?? \"main\";\n const asset = providedAsset ?? parsedAsset;\n\n // If values are provided, trust them; otherwise derive from topic.\n if (!providedType || !providedId) {\n if (parsedType && parsedId) {\n logger.warn(`${this.instanceNameWithSuffix} - objectType/objectId missing; derived from topic tail ${parsedType}/${parsedId}`);\n } else {\n logger.warn(`${this.instanceNameWithSuffix} - objectType/objectId missing; defaulting objectId to 'main' for topic '${msg.topic}'. Expected topic to end with '<objectType>/<objectId>/'`);\n }\n }\n // Asset is optional; no warning on mismatch to avoid noisy logs when base topics don't carry it.\n\n msg.objectType = objectType;\n msg.objectId = objectId;\n msg.asset = asset;\n\n return { objectType, objectId, asset };\n }\n\n /**\n * Ensure the topic ends with a trailing slash for attribute concatenation.\n */\n private normalizeTopicWithObject(topic: string): string {\n return topic.endsWith(\"/\") ? topic : `${topic}/`;\n }\n\n /**\n * Starts a worker thread to process the throttled publish queue.\n */\n private startQueueWorker(\n mqttHost: string,\n instanceNameWithSuffix: string,\n mqttParameters: IMqttParameters,\n publisherActive: boolean,\n subscriberActive: boolean\n ): void {\n const workerData: IMqttWorkerData = {\n publishThrottlingDelay: this.unsParameters.publishThrottlingDelay ?? 1,\n subscribeThrottlingDelay: this.unsParameters.subscribeThrottlingDelay ?? 1,\n persistToDisk: false,\n mqttHost: mqttHost,\n instanceNameWithSuffix: instanceNameWithSuffix,\n mqttParameters: mqttParameters,\n publisherActive,\n subscriberActive\n };\n\n this.worker = new Worker(workerScriptPath, { workerData });\n\n this.worker.on(\"message\", (msg) => {\n if (msg && msg.command === \"enqueueResult\" && msg.id) {\n const pending = this.pendingEnqueues.get(msg.id);\n if (pending) {\n if (msg.status === \"success\" && msg.topic && msg.message) {\n pending.resolve();\n } else {\n pending.reject(new Error(msg.error));\n }\n this.pendingEnqueues.delete(msg.id);\n }\n } else if (msg && msg.command === \"input\") {\n this.event.emit(\"input\", { topic: msg.topic, message: msg.message.toString(), packet: msg.packet });\n } else if (msg && (msg.command === \"handover_subscriber\" || msg.command === \"handover_publisher\")) {\n this.event.emit(\"mqttWorker\", { command: msg.command, batchSize: msg.batchSize, referenceHash: msg.referenceHash, instanceName: this.instanceName });\n } else if (msg && msg.command === \"mqttProxyStatus\") {\n this.event.emit(\"mqttProxyStatus\", { event: msg.event, value: msg.value, uom: msg.uom, statusTopic: msg.statusTopic });\n }\n });\n\n this.worker.on(\"error\", (err) => {\n logger.error(\"Error in worker:\", err);\n });\n\n this.worker.on(\"exit\", (code) => {\n if (code !== 0) {\n logger.error(`Worker exited with code ${code}`);\n }\n });\n }\n\n /**\n * Enqueues a message to the worker queue.\n *\n * @param topic - The topic to which the message belongs.\n * @param message - The message to be enqueued.\n * @param options - Optional publish options.\n * @returns A promise that resolves when the message is successfully enqueued.\n */\n private async enqueueMessageToWorkerQueue(topic: string, message: string, options?: IClientPublishOptions): Promise<void> {\n return new Promise((resolve, reject) => {\n // const id: string = String(this.currentSequenceId.get(topic) ?? 0);\n const id = `${Date.now()}-${Math.random()}`;\n this.pendingEnqueues.set(id, { resolve, reject });\n this.worker.postMessage({ command: \"enqueue\", id, topic, message, options });\n });\n }\n\n /**\n * Sets the publisher active state.\n *\n * @param batchSize - Optional batch size.\n * @param referenceHash - Optional reference hash.\n */\n public setPublisherActive(batchSize?: number, referenceHash?: string): void {\n this.worker.postMessage({ command: \"setPublisherActive\", batchSize, referenceHash });\n }\n\n /**\n * Sets the publisher to passive mode.\n * @returns A promise that resolves when the publisher is set to passive.\n */\n public setPublisherPassive(): Promise<UnsEvents[\"mqttWorker\"]> {\n this.worker.postMessage({ command: \"setPublisherPassive\"});\n return new Promise((resolve) => {\n this.event.on(\"mqttWorker\", (msg: UnsEvents[\"mqttWorker\"]) => {\n if (msg.command === \"handover_publisher\") {\n logger.info(`${this.instanceNameWithSuffix} - Publisher set to passive.`);\n resolve(msg);\n }\n });\n });\n }\n\n /**\n * Sets the subscriber active state.\n *\n * @param batchSize - Optional batch size.\n * @param referenceHash - Optional reference hash.\n */\n public setSubscriberActive(batchSize?: number, referenceHash?: string): void {\n this.worker.postMessage({ command: \"setSubscriberActive\", batchSize, referenceHash });\n }\n\n /**\n * Sets the subscriber to passive mode.\n * @returns A promise that resolves when the subscriber is set to passive.\n */\n public setSubscriberPassive(): Promise<UnsEvents[\"mqttWorker\"]> {\n this.worker.postMessage({ command: \"setSubscriberPassive\"});\n return new Promise((resolve) => {\n this.event.on(\"mqttWorker\", (msg: UnsEvents[\"mqttWorker\"]) => {\n if (msg.command === \"handover_subscriber\") {\n logger.info(`${this.instanceNameWithSuffix} - Publisher set to passive.`);\n resolve(msg);\n }\n });\n });\n }\n\n\n /**\n * Sets the subscriber to passive mode and allows the publisher to run\n * until the queue is empty (all messages are processed).\n */\n public async setSubscriberPassiveAndDrainQueue(): Promise<UnsEvents[\"mqttWorker\"]> {\n return new Promise(async (resolve) => {\n const mqttWorkerData = await this.setSubscriberPassive();\n while (this.pendingEnqueues.size > 0) {\n await new Promise((resolve) => setTimeout(resolve, 100)); // Poll every 100ms\n }\n logger.info(`${this.instanceNameWithSuffix} - Subscriber set to passive and queue drained.`);\n resolve(mqttWorkerData);\n });\n }\n\n /**\n * Processes and publishes MQTT messages based on the selected message mode.\n *\n * @param mqttMessage - The MQTT message object.\n * @param mode - The message mode (Raw, Delta, or Both).\n */\n public async publishMqttMessage(mqttMessage: IMqttPublishRequest | null, mode: MessageMode = MessageMode.Raw) {\n if (!mqttMessage) {\n logger.error(`${this.instanceNameWithSuffix} - Error publishing mqtt message: mqttMessage must be defined.`);\n return;\n }\n\n const attrs = Array.isArray(mqttMessage.attributes)\n ? mqttMessage.attributes\n : [mqttMessage.attributes];\n const { topic, asset, assetDescription, objectType, objectTypeDescription, objectId } = mqttMessage;\n for (const attrEntry of attrs) {\n const attrDescription = attrEntry.description ?? getAttributeDescription(attrEntry.attribute);\n const message: IUnsMessage =\n \"message\" in attrEntry && attrEntry.message\n ? attrEntry.message\n : \"data\" in attrEntry && attrEntry.data\n ? { data: attrEntry.data, createdAt: attrEntry.createdAt, expiresAt: attrEntry.expiresAt }\n : \"table\" in attrEntry && attrEntry.table\n ? { table: attrEntry.table, createdAt: attrEntry.createdAt, expiresAt: attrEntry.expiresAt }\n : (() => { throw new Error(\"Attribute entry must include exactly one of data/table/message\"); })();\n const packet = await UnsPacket.unsPacketFromUnsMessage(message);\n const singleMsg: InternalMqttMessage = {\n topic,\n asset,\n assetDescription,\n objectType,\n objectTypeDescription,\n objectId,\n attribute: attrEntry.attribute,\n description: attrDescription,\n tags: attrEntry.tags,\n attributeNeedsPersistence: attrEntry.attributeNeedsPersistence,\n packet,\n };\n\n // existing single-attribute flow\n const baseDescription =\n singleMsg.description ??\n getAttributeDescription(singleMsg.attribute) ??\n singleMsg.attribute;\n const mqttMessageWithDesc = { ...singleMsg, description: baseDescription };\n\n const time = UnsPacket.formatToISO8601(new Date());\n switch (mode) {\n case MessageMode.Raw: {\n this.processAndEnqueueMessage(mqttMessageWithDesc, time, false);\n break;\n }\n case MessageMode.Delta: {\n const deltaMessage = { ...mqttMessageWithDesc };\n deltaMessage.attribute = `${mqttMessageWithDesc.attribute}-delta`;\n deltaMessage.description = `${baseDescription ?? \"\"} (delta)`;\n this.processAndEnqueueMessage(deltaMessage, time, true);\n break;\n }\n case MessageMode.Both: {\n this.processAndEnqueueMessage(mqttMessageWithDesc, time, false);\n const deltaMessageBoth = { ...mqttMessageWithDesc };\n deltaMessageBoth.attribute = `${mqttMessageWithDesc.attribute}-delta`;\n deltaMessageBoth.description = `${baseDescription ?? \"\"} (delta)`;\n this.processAndEnqueueMessage(deltaMessageBoth, time, true);\n break;\n }\n }\n }\n return;\n }\n\n /**\n * Publishes a message to a specified topic.\n *\n * @param topic - The MQTT topic.\n * @param message - The message to publish.\n * @returns A promise that resolves when enqueued.\n */\n public publishMessage(topic: string, message: string): Promise<void> {\n return this.enqueueMessageToWorkerQueue(topic, message);\n }\n\n /**\n * Parses an MQTT packet from a JSON string.\n *\n * @param mqttPacket - The MQTT packet string.\n * @returns A parsed IUnsPacket object or null.\n */\n public parseMqttPacket(mqttPacket: string): IUnsPacket | null {\n return UnsPacket.parseMqttPacket(mqttPacket, this.instanceNameWithSuffix);\n }\n\n /**\n * Subscribes asynchronously to one or more topics.\n *\n * @param topics - A topic or list of topics.\n */\n public subscribeAsync(topics: string | string[]): void {\n this.worker.postMessage({ command: \"subscribeAsync\", topics });\n }\n\n /**\n * Unsubscribes asynchronously from the given topics.\n *\n * @param topics - A list of topics.\n */\n public unsubscribeAsync(topics: string[]): void {\n this.worker.postMessage({ command: \"unsubscribeAsync\", topics });\n }\n\n /**\n * Processes and enqueues a message to the worker queue, including handling\n * sequencing, value differences, and tracking of unique topics.\n *\n * @param msg - The MQTT message to process.\n * @param time - The timestamp.\n * @param valueIsCumulative - Whether the value is cumulative.\n */\n private async processAndEnqueueMessage(msg: InternalMqttMessage, time: string, valueIsCumulative: boolean = false): Promise<void> {\n try {\n const attributeType =\n msg.packet.message.data ? UnsAttributeType.Data :\n msg.packet.message.table ? UnsAttributeType.Table : null;\n \n let dataGroup = \"\";\n if (attributeType == UnsAttributeType.Data)\n dataGroup = msg.packet.message.data.dataGroup ?? \"\";\n if (attributeType == UnsAttributeType.Table)\n dataGroup = msg.packet.message.table.dataGroup ?? \"\";\n\n const { objectType, objectId, asset } = this.resolveObjectIdentity(msg);\n const normalizedTopic = this.normalizeTopicWithObject(msg.topic);\n msg.topic = normalizedTopic;\n const description = msg.description ?? getAttributeDescription(msg.attribute as string) ?? \"\";\n const objectTypeDescription = msg.objectTypeDescription ?? (objectType ? getObjectTypeDescription(objectType) : undefined);\n\n this.registerUniqueTopic({\n timestamp: time,\n topic: msg.topic,\n attribute: msg.attribute,\n attributeType: attributeType,\n description,\n tags: msg.tags,\n attributeNeedsPersistence: msg.attributeNeedsPersistence,\n dataGroup,\n asset,\n assetDescription: msg.assetDescription,\n objectType,\n objectTypeDescription,\n objectId\n });\n\n const publishTopic = `${msg.topic}${asset ? `${asset}/` : \"\"}${objectType ? `${objectType}/` : \"\"}${objectId ? `${objectId}/` : \"\"}${msg.attribute}`;\n const sequenceId = this.currentSequenceId.get(msg.topic) ?? 0;\n this.currentSequenceId.set(msg.topic, sequenceId + 1);\n msg.packet.sequenceId = sequenceId;\n\n if (msg.packet.message.data) {\n const newValue = msg.packet.message.data.value;\n const newUom: MeasurementUnit = msg.packet.message.data.uom;\n const lastValueEntry = this.lastValues.get(publishTopic);\n const currentTime = new Date(msg.packet.message.data.time);\n\n if (lastValueEntry) {\n const intervalBetweenMessages = currentTime.getTime() - lastValueEntry.timestamp.getTime();\n const lastValue = lastValueEntry.value;\n this.lastValues.set(publishTopic, { value: newValue, uom: newUom, timestamp: currentTime });\n // Compute the delta and manage cumulative resets\n if (valueIsCumulative == true && typeof newValue === \"number\" && typeof lastValue === \"number\") {\n // Skip if newValue is 0 (likely a glitch)\n if (newValue === 0) {\n return; // Don't process or enqueue\n }\n const delta = newValue - lastValue;\n msg.packet.message.data.value = delta < 0 ? newValue : delta;\n }\n msg.packet.interval = intervalBetweenMessages;\n await this.enqueueMessageToWorkerQueue(publishTopic, JSON.stringify(msg.packet));\n } else {\n this.lastValues.set(publishTopic, { value: newValue, uom: newUom, timestamp: currentTime });\n logger.debug(`${this.instanceNameWithSuffix} - Need one more packet to calculate interval on topic ${publishTopic}`);\n if (valueIsCumulative === false) {\n await this.enqueueMessageToWorkerQueue(publishTopic, JSON.stringify(msg.packet));\n } else {\n logger.debug(`${this.instanceNameWithSuffix} - Need one more packet to calculate difference on value in data for topic ${publishTopic}`);\n }\n }\n } else if (msg.packet.message.table) {\n await this.enqueueMessageToWorkerQueue(publishTopic, JSON.stringify(msg.packet));\n } else {\n logger.error(`${this.instanceNameWithSuffix} - Error publishing message to topic ${publishTopic}: packet.message must include data or table`);\n }\n } catch (error: any) {\n logger.error(`${this.instanceNameWithSuffix} - Error publishing message to topic ${msg.topic}${msg.attribute}: ${error.message}`);\n }\n }\n\n /**\n * Stops the UnsProxy instance and cleans up resources.\n */\n public async stop(): Promise<void> {\n super.stop();\n // Terminate the worker thread if it exists.\n if (this.worker) {\n try {\n const exitCode = await this.worker.terminate();\n logger.info(`${this.instanceNameWithSuffix} - Worker terminated with exit code ${exitCode}`);\n } catch (error: any) {\n logger.error(`${this.instanceNameWithSuffix} - Error terminating worker: ${error.message}`);\n }\n }\n \n // Optionally, handle any pending enqueues.\n for (const [id, pending] of this.pendingEnqueues) {\n pending.reject(new Error(\"UnsProxy has been stopped\"));\n this.pendingEnqueues.delete(id);\n }\n }\n\n}\n"]}
|