@uns-kit/core 2.0.20 → 2.0.22
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/LICENSE +21 -21
- package/README.md +130 -130
- package/dist/app-config.d.ts.map +1 -0
- package/dist/app-config.js.map +1 -0
- package/dist/base-path.js.map +1 -1
- package/dist/config/app-config.d.ts +140 -135
- package/dist/config/app-config.d.ts.map +1 -1
- package/dist/config/app-config.js.map +1 -1
- package/dist/config/project.config.extension.js.map +1 -1
- package/dist/config-file.js.map +1 -1
- package/dist/graphql/schema.js.map +1 -1
- package/dist/index.d.ts +7 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -5
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +3 -2
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +80 -18
- package/dist/logger.js.map +1 -1
- package/dist/tools/auth/auth-client.js.map +1 -1
- package/dist/tools/auth/index.js.map +1 -1
- package/dist/tools/auth/secure-store.js.map +1 -1
- package/dist/tools/base-path.js.map +1 -1
- package/dist/tools/file-utils.js.map +1 -1
- package/dist/tools/generate-config-schema.js.map +1 -1
- package/dist/tools/generate-uns-dictionary.js +7 -7
- package/dist/tools/generate-uns-dictionary.js.map +1 -1
- package/dist/tools/generate-uns-measurements.js +7 -7
- package/dist/tools/generate-uns-measurements.js.map +1 -1
- package/dist/tools/generate-uns-reference.js +9 -9
- package/dist/tools/generate-uns-reference.js.map +1 -1
- package/dist/tools/pull-request.js.map +1 -1
- package/dist/tools/refresh-uns.js +50 -50
- package/dist/tools/refresh-uns.js.map +1 -1
- package/dist/tools/schema.js.map +1 -1
- package/dist/tools/sync-uns-schema.js +14 -14
- package/dist/tools/sync-uns-schema.js.map +1 -1
- package/dist/uns/handover-manager-event-emitter.js.map +1 -1
- package/dist/uns/handover-manager.js.map +1 -1
- package/dist/uns/process-config.js.map +1 -1
- package/dist/uns/process-name-service.js.map +1 -1
- package/dist/uns/status-monitor.js.map +1 -1
- package/dist/uns/uns-asset.js.map +1 -1
- package/dist/uns/uns-attributes.js.map +1 -1
- package/dist/uns/uns-dictionary-registry.js.map +1 -1
- package/dist/uns/uns-dictionary.generated.js.map +1 -1
- package/dist/uns/uns-event-emitter.js.map +1 -1
- package/dist/uns/uns-interfaces.js.map +1 -1
- package/dist/uns/uns-measurements.generated.js.map +1 -1
- package/dist/uns/uns-measurements.js.map +1 -1
- package/dist/uns/uns-object.js.map +1 -1
- package/dist/uns/uns-packet.js.map +1 -1
- package/dist/uns/uns-path.js.map +1 -1
- package/dist/uns/uns-proxy-process.js.map +1 -1
- package/dist/uns/uns-proxy.js.map +1 -1
- package/dist/uns/uns-tags.js.map +1 -1
- package/dist/uns/uns-topic-matcher.js.map +1 -1
- package/dist/uns/uns-topics.js.map +1 -1
- package/dist/uns-config/config-schema.js.map +1 -1
- package/dist/uns-config/host-placeholders.js.map +1 -1
- package/dist/uns-config/schema-tolls.js.map +1 -1
- package/dist/uns-config/schema-tools.js.map +1 -1
- package/dist/uns-config/secret-placeholders.js.map +1 -1
- package/dist/uns-config/secret-resolver.js.map +1 -1
- package/dist/uns-config/uns-core-schema.d.ts +3271 -3150
- package/dist/uns-config/uns-core-schema.d.ts.map +1 -1
- package/dist/uns-config/uns-core-schema.js +76 -71
- package/dist/uns-config/uns-core-schema.js.map +1 -1
- package/dist/uns-grpc/uns-gateway-cli.js.map +1 -1
- package/dist/uns-grpc/uns-gateway-server.js.map +1 -1
- package/dist/uns-grpc/uns-gateway.proto +104 -104
- package/dist/uns-mqtt/mqtt-interfaces.js.map +1 -1
- package/dist/uns-mqtt/mqtt-proxy.js.map +1 -1
- package/dist/uns-mqtt/mqtt-topic-builder.js.map +1 -1
- package/dist/uns-mqtt/mqtt-worker-init.js.map +1 -1
- package/dist/uns-mqtt/mqtt-worker.js.map +1 -1
- package/dist/uns-mqtt/throttled-queue.js.map +1 -1
- package/dist/uns-mqtt/uns-mqtt-proxy.js.map +1 -1
- package/dist/uns-mqtt/ws-proxy.js.map +1 -1
- package/package.json +9 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uns-core-schema.d.ts","sourceRoot":"","sources":["../../src/uns-config/uns-core-schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAsBxB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0B5B,CAAC;AAEH,eAAO,MAAM,aAAa
|
|
1
|
+
{"version":3,"file":"uns-core-schema.d.ts","sourceRoot":"","sources":["../../src/uns-config/uns-core-schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAsBxB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0B5B,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+Bf,CAAC;AAEZ,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC"}
|
|
@@ -1,72 +1,77 @@
|
|
|
1
|
-
// src/uns-config/uns-core-schema.ts
|
|
2
|
-
import { z } from "zod";
|
|
3
|
-
import { secretValueSchema } from "./secret-placeholders.js";
|
|
4
|
-
import { hostValueSchema } from "./host-placeholders.js";
|
|
5
|
-
const mqttProtocolSchema = z.enum(["mqtt", "mqtts", "ws", "wss", "tcp", "ssl"]);
|
|
6
|
-
const mqttServerSchema = z.object({
|
|
7
|
-
host: hostValueSchema,
|
|
8
|
-
port: z.number().int().positive().optional(),
|
|
9
|
-
protocol: mqttProtocolSchema.optional(),
|
|
10
|
-
}).strict();
|
|
11
|
-
const mqttConnectPropertiesSchema = z.object({
|
|
12
|
-
sessionExpiryInterval: z.number().int().nonnegative().optional(),
|
|
13
|
-
receiveMaximum: z.number().int().positive().optional(),
|
|
14
|
-
maximumPacketSize: z.number().int().positive().optional(),
|
|
15
|
-
topicAliasMaximum: z.number().int().nonnegative().optional(),
|
|
16
|
-
requestResponseInformation: z.boolean().optional(),
|
|
17
|
-
requestProblemInformation: z.boolean().optional(),
|
|
18
|
-
userProperties: z.record(z.string()).optional(),
|
|
19
|
-
}).strict();
|
|
20
|
-
export const mqttChannelSchema = z.object({
|
|
21
|
-
host: hostValueSchema.optional(),
|
|
22
|
-
hosts: z.array(hostValueSchema).optional(),
|
|
23
|
-
servers: z.array(mqttServerSchema).optional(),
|
|
24
|
-
port: z.number().int().positive().optional(),
|
|
25
|
-
protocol: mqttProtocolSchema.optional(),
|
|
26
|
-
username: z.string().optional(),
|
|
27
|
-
password: secretValueSchema.optional(),
|
|
28
|
-
clientId: z.string().optional(),
|
|
29
|
-
clean: z.boolean().optional(),
|
|
30
|
-
keepalive: z.number().int().nonnegative().optional(),
|
|
31
|
-
connectTimeout: z.number().int().nonnegative().optional(),
|
|
32
|
-
reconnectPeriod: z.number().int().nonnegative().optional(),
|
|
33
|
-
reconnectOnConnackError: z.boolean().optional(),
|
|
34
|
-
resubscribe: z.boolean().optional(),
|
|
35
|
-
queueQoSZero: z.boolean().optional(),
|
|
36
|
-
rejectUnauthorized: z.boolean().optional(),
|
|
37
|
-
properties: mqttConnectPropertiesSchema.optional(),
|
|
38
|
-
ca: z.string().optional(),
|
|
39
|
-
cert: z.string().optional(),
|
|
40
|
-
key: z.string().optional(),
|
|
41
|
-
servername: z.string().optional(),
|
|
42
|
-
}).strict().refine((value) => {
|
|
43
|
-
return !!value.host || (Array.isArray(value.hosts) && value.hosts.length > 0) || (Array.isArray(value.servers) && value.servers.length > 0);
|
|
44
|
-
}, {
|
|
45
|
-
message: "One of host, hosts, or servers must be provided.",
|
|
46
|
-
});
|
|
47
|
-
export const unsCoreSchema = z.object({
|
|
48
|
-
uns: z.object({
|
|
49
|
-
graphql: z.string().url(),
|
|
50
|
-
rest: z.string().url(),
|
|
51
|
-
email: z.string().email().describe("Email used when authenticating to graphql endpoint of the UNS instance."),
|
|
52
|
-
password: secretValueSchema.describe("Password or secret value paired with the UNS email."),
|
|
53
|
-
instanceMode: z.enum(["wait", "force", "handover"]).default("wait"),
|
|
54
|
-
processName: z
|
|
55
|
-
.string()
|
|
56
|
-
.min(1)
|
|
57
|
-
.describe("Process name used in MQTT topics and logs."),
|
|
58
|
-
handover: z.boolean().default(true),
|
|
59
|
-
jwksWellKnownUrl: z.string().url().optional(),
|
|
60
|
-
kidWellKnownUrl: z.string().url().optional(),
|
|
61
|
-
env: z.enum(["dev", "staging", "test", "prod"]).default("dev"),
|
|
62
|
-
}).strict(),
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
1
|
+
// src/uns-config/uns-core-schema.ts
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { secretValueSchema } from "./secret-placeholders.js";
|
|
4
|
+
import { hostValueSchema } from "./host-placeholders.js";
|
|
5
|
+
const mqttProtocolSchema = z.enum(["mqtt", "mqtts", "ws", "wss", "tcp", "ssl"]);
|
|
6
|
+
const mqttServerSchema = z.object({
|
|
7
|
+
host: hostValueSchema,
|
|
8
|
+
port: z.number().int().positive().optional(),
|
|
9
|
+
protocol: mqttProtocolSchema.optional(),
|
|
10
|
+
}).strict();
|
|
11
|
+
const mqttConnectPropertiesSchema = z.object({
|
|
12
|
+
sessionExpiryInterval: z.number().int().nonnegative().optional(),
|
|
13
|
+
receiveMaximum: z.number().int().positive().optional(),
|
|
14
|
+
maximumPacketSize: z.number().int().positive().optional(),
|
|
15
|
+
topicAliasMaximum: z.number().int().nonnegative().optional(),
|
|
16
|
+
requestResponseInformation: z.boolean().optional(),
|
|
17
|
+
requestProblemInformation: z.boolean().optional(),
|
|
18
|
+
userProperties: z.record(z.string()).optional(),
|
|
19
|
+
}).strict();
|
|
20
|
+
export const mqttChannelSchema = z.object({
|
|
21
|
+
host: hostValueSchema.optional(),
|
|
22
|
+
hosts: z.array(hostValueSchema).optional(),
|
|
23
|
+
servers: z.array(mqttServerSchema).optional(),
|
|
24
|
+
port: z.number().int().positive().optional(),
|
|
25
|
+
protocol: mqttProtocolSchema.optional(),
|
|
26
|
+
username: z.string().optional(),
|
|
27
|
+
password: secretValueSchema.optional(),
|
|
28
|
+
clientId: z.string().optional(),
|
|
29
|
+
clean: z.boolean().optional(),
|
|
30
|
+
keepalive: z.number().int().nonnegative().optional(),
|
|
31
|
+
connectTimeout: z.number().int().nonnegative().optional(),
|
|
32
|
+
reconnectPeriod: z.number().int().nonnegative().optional(),
|
|
33
|
+
reconnectOnConnackError: z.boolean().optional(),
|
|
34
|
+
resubscribe: z.boolean().optional(),
|
|
35
|
+
queueQoSZero: z.boolean().optional(),
|
|
36
|
+
rejectUnauthorized: z.boolean().optional(),
|
|
37
|
+
properties: mqttConnectPropertiesSchema.optional(),
|
|
38
|
+
ca: z.string().optional(),
|
|
39
|
+
cert: z.string().optional(),
|
|
40
|
+
key: z.string().optional(),
|
|
41
|
+
servername: z.string().optional(),
|
|
42
|
+
}).strict().refine((value) => {
|
|
43
|
+
return !!value.host || (Array.isArray(value.hosts) && value.hosts.length > 0) || (Array.isArray(value.servers) && value.servers.length > 0);
|
|
44
|
+
}, {
|
|
45
|
+
message: "One of host, hosts, or servers must be provided.",
|
|
46
|
+
});
|
|
47
|
+
export const unsCoreSchema = z.object({
|
|
48
|
+
uns: z.object({
|
|
49
|
+
graphql: z.string().url(),
|
|
50
|
+
rest: z.string().url(),
|
|
51
|
+
email: z.string().email().describe("Email used when authenticating to graphql endpoint of the UNS instance."),
|
|
52
|
+
password: secretValueSchema.describe("Password or secret value paired with the UNS email."),
|
|
53
|
+
instanceMode: z.enum(["wait", "force", "handover"]).default("wait"),
|
|
54
|
+
processName: z
|
|
55
|
+
.string()
|
|
56
|
+
.min(1)
|
|
57
|
+
.describe("Process name used in MQTT topics and logs."),
|
|
58
|
+
handover: z.boolean().default(true),
|
|
59
|
+
jwksWellKnownUrl: z.string().url().optional(),
|
|
60
|
+
kidWellKnownUrl: z.string().url().optional(),
|
|
61
|
+
env: z.enum(["dev", "staging", "test", "prod"]).default("dev"),
|
|
62
|
+
}).strict(),
|
|
63
|
+
logging: z.object({
|
|
64
|
+
adapter: z.string().min(1).default("udp"),
|
|
65
|
+
host: hostValueSchema,
|
|
66
|
+
port: z.number().int().positive().default(12201),
|
|
67
|
+
}).strict().optional(),
|
|
68
|
+
input: mqttChannelSchema.optional(),
|
|
69
|
+
output: mqttChannelSchema.optional(),
|
|
70
|
+
infra: mqttChannelSchema,
|
|
71
|
+
devops: z.object({
|
|
72
|
+
provider: z.enum(["azure-devops"]).default("azure-devops"),
|
|
73
|
+
organization: z.string().min(1),
|
|
74
|
+
project: z.string().min(1).optional(),
|
|
75
|
+
}).strict().optional(),
|
|
76
|
+
}).strict();
|
|
72
77
|
//# sourceMappingURL=uns-core-schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uns-core-schema.js","sourceRoot":"","sources":["../../src/uns-config/uns-core-schema.ts"],"names":[],"mappings":"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","sourcesContent":["// src/uns-config/uns-core-schema.ts\nimport { z } from \"zod\";\nimport { secretValueSchema } from \"./secret-placeholders.js\";\nimport { hostValueSchema } from \"./host-placeholders.js\";\n\nconst mqttProtocolSchema = z.enum([\"mqtt\", \"mqtts\", \"ws\", \"wss\", \"tcp\", \"ssl\"]);\n\nconst mqttServerSchema = z.object({\n host: hostValueSchema,\n port: z.number().int().positive().optional(),\n protocol: mqttProtocolSchema.optional(),\n}).strict();\n\nconst mqttConnectPropertiesSchema = z.object({\n sessionExpiryInterval: z.number().int().nonnegative().optional(),\n receiveMaximum: z.number().int().positive().optional(),\n maximumPacketSize: z.number().int().positive().optional(),\n topicAliasMaximum: z.number().int().nonnegative().optional(),\n requestResponseInformation: z.boolean().optional(),\n requestProblemInformation: z.boolean().optional(),\n userProperties: z.record(z.string()).optional(),\n}).strict();\n\nexport const mqttChannelSchema = z.object({\n host: hostValueSchema.optional(),\n hosts: z.array(hostValueSchema).optional(),\n servers: z.array(mqttServerSchema).optional(),\n port: z.number().int().positive().optional(),\n protocol: mqttProtocolSchema.optional(),\n username: z.string().optional(),\n password: secretValueSchema.optional(),\n clientId: z.string().optional(),\n clean: z.boolean().optional(),\n keepalive: z.number().int().nonnegative().optional(),\n connectTimeout: z.number().int().nonnegative().optional(),\n reconnectPeriod: z.number().int().nonnegative().optional(),\n reconnectOnConnackError: z.boolean().optional(),\n resubscribe: z.boolean().optional(),\n queueQoSZero: z.boolean().optional(),\n rejectUnauthorized: z.boolean().optional(),\n properties: mqttConnectPropertiesSchema.optional(),\n ca: z.string().optional(),\n cert: z.string().optional(),\n key: z.string().optional(),\n servername: z.string().optional(),\n}).strict().refine((value) => {\n return !!value.host || (Array.isArray(value.hosts) && value.hosts.length > 0) || (Array.isArray(value.servers) && value.servers.length > 0);\n}, {\n message: \"One of host, hosts, or servers must be provided.\",\n});\n\nexport const unsCoreSchema = z.object({\n uns: z.object({\n graphql: z.string().url(),\n rest: z.string().url(),\n email: z.string().email().describe(\"Email used when authenticating to graphql endpoint of the UNS instance.\"),\n password: secretValueSchema.describe(\"Password or secret value paired with the UNS email.\"),\n instanceMode: z.enum([\"wait\", \"force\", \"handover\"]).default(\"wait\"),\n processName: z\n .string()\n .min(1)\n .describe(\"Process name used in MQTT topics and logs.\"),\n handover: z.boolean().default(true),\n jwksWellKnownUrl: z.string().url().optional(),\n kidWellKnownUrl: z.string().url().optional(),\n env: z.enum([\"dev\", \"staging\", \"test\", \"prod\"]).default(\"dev\"),\n }).strict(),\n\n input: mqttChannelSchema.optional(),\n output: mqttChannelSchema.optional(),\n infra: mqttChannelSchema,\n devops: z.object({\n provider: z.enum([\"azure-devops\"]).default(\"azure-devops\"),\n organization: z.string().min(1),\n project: z.string().min(1).optional(),\n }).strict().optional(),\n}).strict();\n\nexport type UnsCore = z.infer<typeof unsCoreSchema>;\n"]}
|
|
1
|
+
{"version":3,"file":"uns-core-schema.js","sourceRoot":"","sources":["../../src/uns-config/uns-core-schema.ts"],"names":[],"mappings":"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","sourcesContent":["// src/uns-config/uns-core-schema.ts\r\nimport { z } from \"zod\";\r\nimport { secretValueSchema } from \"./secret-placeholders.js\";\r\nimport { hostValueSchema } from \"./host-placeholders.js\";\r\n\r\nconst mqttProtocolSchema = z.enum([\"mqtt\", \"mqtts\", \"ws\", \"wss\", \"tcp\", \"ssl\"]);\r\n\r\nconst mqttServerSchema = z.object({\r\n host: hostValueSchema,\r\n port: z.number().int().positive().optional(),\r\n protocol: mqttProtocolSchema.optional(),\r\n}).strict();\r\n\r\nconst mqttConnectPropertiesSchema = z.object({\r\n sessionExpiryInterval: z.number().int().nonnegative().optional(),\r\n receiveMaximum: z.number().int().positive().optional(),\r\n maximumPacketSize: z.number().int().positive().optional(),\r\n topicAliasMaximum: z.number().int().nonnegative().optional(),\r\n requestResponseInformation: z.boolean().optional(),\r\n requestProblemInformation: z.boolean().optional(),\r\n userProperties: z.record(z.string()).optional(),\r\n}).strict();\r\n\r\nexport const mqttChannelSchema = z.object({\r\n host: hostValueSchema.optional(),\r\n hosts: z.array(hostValueSchema).optional(),\r\n servers: z.array(mqttServerSchema).optional(),\r\n port: z.number().int().positive().optional(),\r\n protocol: mqttProtocolSchema.optional(),\r\n username: z.string().optional(),\r\n password: secretValueSchema.optional(),\r\n clientId: z.string().optional(),\r\n clean: z.boolean().optional(),\r\n keepalive: z.number().int().nonnegative().optional(),\r\n connectTimeout: z.number().int().nonnegative().optional(),\r\n reconnectPeriod: z.number().int().nonnegative().optional(),\r\n reconnectOnConnackError: z.boolean().optional(),\r\n resubscribe: z.boolean().optional(),\r\n queueQoSZero: z.boolean().optional(),\r\n rejectUnauthorized: z.boolean().optional(),\r\n properties: mqttConnectPropertiesSchema.optional(),\r\n ca: z.string().optional(),\r\n cert: z.string().optional(),\r\n key: z.string().optional(),\r\n servername: z.string().optional(),\r\n}).strict().refine((value) => {\r\n return !!value.host || (Array.isArray(value.hosts) && value.hosts.length > 0) || (Array.isArray(value.servers) && value.servers.length > 0);\r\n}, {\r\n message: \"One of host, hosts, or servers must be provided.\",\r\n});\r\n\r\nexport const unsCoreSchema = z.object({\n uns: z.object({\n graphql: z.string().url(),\r\n rest: z.string().url(),\r\n email: z.string().email().describe(\"Email used when authenticating to graphql endpoint of the UNS instance.\"),\r\n password: secretValueSchema.describe(\"Password or secret value paired with the UNS email.\"),\r\n instanceMode: z.enum([\"wait\", \"force\", \"handover\"]).default(\"wait\"),\r\n processName: z\r\n .string()\r\n .min(1)\r\n .describe(\"Process name used in MQTT topics and logs.\"),\r\n handover: z.boolean().default(true),\r\n jwksWellKnownUrl: z.string().url().optional(),\r\n kidWellKnownUrl: z.string().url().optional(),\r\n env: z.enum([\"dev\", \"staging\", \"test\", \"prod\"]).default(\"dev\"),\n }).strict(),\n\n logging: z.object({\n adapter: z.string().min(1).default(\"udp\"),\n host: hostValueSchema,\n port: z.number().int().positive().default(12201),\n }).strict().optional(),\n\n input: mqttChannelSchema.optional(),\n output: mqttChannelSchema.optional(),\n infra: mqttChannelSchema,\n devops: z.object({\r\n provider: z.enum([\"azure-devops\"]).default(\"azure-devops\"),\r\n organization: z.string().min(1),\r\n project: z.string().min(1).optional(),\r\n }).strict().optional(),\r\n}).strict();\r\n\r\nexport type UnsCore = z.infer<typeof unsCoreSchema>;\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uns-gateway-cli.js","sourceRoot":"","sources":["../../src/uns-grpc/uns-gateway-cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,SAAS,SAAS;IAChB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,IAAI,GAAqC,EAAE,CAAC;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACxF,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9C,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AACtC,CAAC;AAED,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;AACzB,MAAM,IAAI,GAAG,YAAY,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AACrG,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE;IACxC,mBAAmB,EAAE,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;IACtG,cAAc,EAAE,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;IACvG,oBAAoB,EAAE,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAS,CAAC,CAAC,CAAC,SAAS;IAClH,gBAAgB,EAAE,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;CACnG,CAAC,CAAC;AACH,OAAO,CAAC,GAAG,CAAC,4BAA4B,KAAK,CAAC,OAAO,SAAS,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;AAC9E,WAAW,CAAC,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC","sourcesContent":["#!/usr/bin/env node\nimport { startUnsGateway } from \"./uns-gateway-server.js\";\n\nfunction parseArgs() {\n const argv = process.argv.slice(2);\n const args: Record<string, string | boolean> = {};\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i];\n if (a.startsWith(\"--\")) {\n const key = a.slice(2);\n const val = (i + 1 < argv.length && !argv[i + 1].startsWith(\"--\")) ? argv[++i] : \"true\";\n args[key] = val;\n }\n }\n return args;\n}\n\nfunction parseAddrArg(): string | undefined {\n const idx = process.argv.indexOf(\"--addr\");\n if (idx >= 0 && idx + 1 < process.argv.length) {\n return process.argv[idx + 1];\n }\n return process.env.UNS_GATEWAY_ADDR;\n}\n\nconst args = parseArgs();\nconst addr = parseAddrArg() ?? (typeof args[\"addr\"] === \"string\" ? String(args[\"addr\"]) : undefined);\nconst bound = await startUnsGateway(addr, {\n processNameOverride: typeof args[\"processName\"] === \"string\" ? String(args[\"processName\"]) : undefined,\n instanceSuffix: typeof args[\"instanceSuffix\"] === \"string\" ? String(args[\"instanceSuffix\"]) : undefined,\n instanceModeOverride: typeof args[\"instanceMode\"] === \"string\" ? (String(args[\"instanceMode\"]) as any) : undefined,\n handoverOverride: typeof args[\"handover\"] === \"string\" ? (args[\"handover\"] === \"true\") : undefined,\n});\nconsole.log(`UNS Gateway listening on ${bound.address} (UDS=${bound.isUDS})`);\nsetInterval(() => {}, 1 << 30);\n"]}
|
|
1
|
+
{"version":3,"file":"uns-gateway-cli.js","sourceRoot":"","sources":["../../src/uns-grpc/uns-gateway-cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,SAAS,SAAS;IAChB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,IAAI,GAAqC,EAAE,CAAC;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACxF,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9C,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AACtC,CAAC;AAED,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;AACzB,MAAM,IAAI,GAAG,YAAY,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AACrG,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE;IACxC,mBAAmB,EAAE,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;IACtG,cAAc,EAAE,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;IACvG,oBAAoB,EAAE,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAS,CAAC,CAAC,CAAC,SAAS;IAClH,gBAAgB,EAAE,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;CACnG,CAAC,CAAC;AACH,OAAO,CAAC,GAAG,CAAC,4BAA4B,KAAK,CAAC,OAAO,SAAS,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;AAC9E,WAAW,CAAC,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC","sourcesContent":["#!/usr/bin/env node\r\nimport { startUnsGateway } from \"./uns-gateway-server.js\";\r\n\r\nfunction parseArgs() {\r\n const argv = process.argv.slice(2);\r\n const args: Record<string, string | boolean> = {};\r\n for (let i = 0; i < argv.length; i++) {\r\n const a = argv[i];\r\n if (a.startsWith(\"--\")) {\r\n const key = a.slice(2);\r\n const val = (i + 1 < argv.length && !argv[i + 1].startsWith(\"--\")) ? argv[++i] : \"true\";\r\n args[key] = val;\r\n }\r\n }\r\n return args;\r\n}\r\n\r\nfunction parseAddrArg(): string | undefined {\r\n const idx = process.argv.indexOf(\"--addr\");\r\n if (idx >= 0 && idx + 1 < process.argv.length) {\r\n return process.argv[idx + 1];\r\n }\r\n return process.env.UNS_GATEWAY_ADDR;\r\n}\r\n\r\nconst args = parseArgs();\r\nconst addr = parseAddrArg() ?? (typeof args[\"addr\"] === \"string\" ? String(args[\"addr\"]) : undefined);\r\nconst bound = await startUnsGateway(addr, {\r\n processNameOverride: typeof args[\"processName\"] === \"string\" ? String(args[\"processName\"]) : undefined,\r\n instanceSuffix: typeof args[\"instanceSuffix\"] === \"string\" ? String(args[\"instanceSuffix\"]) : undefined,\r\n instanceModeOverride: typeof args[\"instanceMode\"] === \"string\" ? (String(args[\"instanceMode\"]) as any) : undefined,\r\n handoverOverride: typeof args[\"handover\"] === \"string\" ? (args[\"handover\"] === \"true\") : undefined,\r\n});\r\nconsole.log(`UNS Gateway listening on ${bound.address} (UDS=${bound.isUDS})`);\r\nsetInterval(() => {}, 1 << 30);\r\n"]}
|
|
@@ -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, 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
|
+
{"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\";\r\nimport protoLoader from \"@grpc/proto-loader\";\r\nimport path from \"path\";\r\nimport getPort from \"get-port\";\r\nimport { readFileSync } from \"fs\";\r\nimport { fileURLToPath } from \"url\";\r\nimport { basePath } from \"../base-path.js\";\r\n\r\nimport logger from \"../logger.js\";\r\nimport { ConfigFile } from \"../config-file.js\";\r\nimport UnsProxyProcess from \"../uns/uns-proxy-process.js\";\r\nimport UnsMqttProxy, { MessageMode } from \"../uns-mqtt/uns-mqtt-proxy.js\";\r\nimport { IApiProxyOptions, IGetEndpointOptions, IMqttPublishRequest, IUnsMessage, IUnsParameters, IUnsProcessParameters } from \"../uns/uns-interfaces.js\";\r\nimport type { IMqttConnectProperties, IMqttServerConfig, MqttProtocol } from \"../uns-mqtt/mqtt-interfaces.js\";\r\nimport { UnsPacket } from \"../uns/uns-packet.js\";\r\nimport { randomUUID } from \"crypto\";\r\nimport { MqttTopicBuilder } from \"../uns-mqtt/mqtt-topic-builder.js\";\r\nimport { ObjectTypes } from \"../uns/uns-object.js\";\r\nconst __filename = fileURLToPath(import.meta.url);\r\nconst __dirname = path.dirname(__filename);\r\n\r\nconst defaultGatewayProto = path.resolve(__dirname, \"uns-gateway.proto\");\r\nconst GATEWAY_PROTO = process.env.UNS_GATEWAY_PROTO\r\n ? path.resolve(process.cwd(), process.env.UNS_GATEWAY_PROTO)\r\n : defaultGatewayProto;\r\n\r\ntype GrpcServer = grpc.Server;\r\n\r\nexport interface GatewayAddress {\r\n address: string; // e.g. unix:/tmp/... or 0.0.0.0:PORT\r\n isUDS: boolean;\r\n}\r\n\r\nexport interface GatewayStartOptions {\r\n processNameOverride?: string;\r\n instanceSuffix?: string;\r\n instanceModeOverride?: \"wait\" | \"force\" | \"handover\";\r\n handoverOverride?: boolean;\r\n}\r\n\r\ntype UnsApiProxyLike = {\r\n event: { on(event: string, handler: (payload: any) => void): void };\r\n get(topic: string, attribute: string, options: IGetEndpointOptions): Promise<void>;\r\n unregister(topic: string, attribute: string, method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\"): Promise<void>;\r\n};\r\n\r\ntype UnsProxyProcessWithApi = UnsProxyProcess & {\r\n createApiProxy(instanceName: string, options: IApiProxyOptions): Promise<UnsApiProxyLike>;\r\n};\r\n\r\ntype MqttChannelConfig = {\r\n host?: string;\r\n hosts?: string[];\r\n servers?: IMqttServerConfig[];\r\n port?: number;\r\n protocol?: MqttProtocol;\r\n username?: string;\r\n password?: string;\r\n clientId?: string;\r\n clean?: boolean;\r\n keepalive?: number;\r\n connectTimeout?: number;\r\n reconnectPeriod?: number;\r\n reconnectOnConnackError?: boolean;\r\n resubscribe?: boolean;\r\n queueQoSZero?: boolean;\r\n rejectUnauthorized?: boolean;\r\n properties?: IMqttConnectProperties;\r\n ca?: string;\r\n cert?: string;\r\n key?: string;\r\n servername?: string;\r\n};\r\n\r\nconst resolveMqttHost = (channel: MqttChannelConfig | undefined, pathLabel: string): string => {\r\n if (!channel) {\r\n throw new Error(`Configuration value '${pathLabel}' is required.`);\r\n }\r\n if (typeof channel.host === \"string\" && channel.host.length > 0) {\r\n return channel.host;\r\n }\r\n if (Array.isArray(channel.hosts) && channel.hosts.length > 0) {\r\n const candidate = channel.hosts.find((host) => typeof host === \"string\" && host.length > 0);\r\n if (candidate) return candidate;\r\n }\r\n if (Array.isArray(channel.servers) && channel.servers.length > 0) {\r\n const candidate = channel.servers.find((server) => typeof server.host === \"string\" && server.host.length > 0);\r\n if (candidate) return candidate.host;\r\n }\r\n throw new Error(`Configuration value '${pathLabel}' must include host, hosts, or servers.`);\r\n};\r\n\r\nconst buildUnsProcessParameters = (\r\n channel: MqttChannelConfig | undefined,\r\n): Omit<IUnsProcessParameters, \"processName\"> => {\r\n if (!channel) return {};\r\n return {\r\n username: channel.username,\r\n password: channel.password,\r\n clientId: channel.clientId,\r\n hosts: channel.hosts,\r\n servers: channel.servers,\r\n port: channel.port,\r\n protocol: channel.protocol,\r\n keepalive: channel.keepalive,\r\n clean: channel.clean,\r\n connectTimeout: channel.connectTimeout,\r\n reconnectPeriod: channel.reconnectPeriod,\r\n reconnectOnConnackError: channel.reconnectOnConnackError,\r\n resubscribe: channel.resubscribe,\r\n queueQoSZero: channel.queueQoSZero,\r\n rejectUnauthorized: channel.rejectUnauthorized,\r\n properties: channel.properties,\r\n ca: channel.ca,\r\n cert: channel.cert,\r\n key: channel.key,\r\n servername: channel.servername,\r\n };\r\n};\r\n\r\nconst buildUnsParameters = (channel: MqttChannelConfig | undefined): IUnsParameters => {\r\n if (!channel) return {};\r\n return {\r\n username: channel.username,\r\n password: channel.password,\r\n clientId: channel.clientId,\r\n hosts: channel.hosts,\r\n servers: channel.servers,\r\n port: channel.port,\r\n protocol: channel.protocol,\r\n keepalive: channel.keepalive,\r\n clean: channel.clean,\r\n connectTimeout: channel.connectTimeout,\r\n reconnectPeriod: channel.reconnectPeriod,\r\n reconnectOnConnackError: channel.reconnectOnConnackError,\r\n resubscribe: channel.resubscribe,\r\n queueQoSZero: channel.queueQoSZero,\r\n rejectUnauthorized: channel.rejectUnauthorized,\r\n properties: channel.properties,\r\n ca: channel.ca,\r\n cert: channel.cert,\r\n key: channel.key,\r\n servername: channel.servername,\r\n };\r\n};\r\n\r\nexport class UnsGatewayServer {\r\n private server: GrpcServer | null = null;\r\n private unsProcess: UnsProxyProcessWithApi | null = null;\r\n private mqttInput: UnsMqttProxy | null = null;\r\n private mqttOutput: UnsMqttProxy | null = null;\r\n private handlers: Set<Function> = new Set();\r\n private unsApiProxy: UnsApiProxyLike | null = null;\r\n private apiStreams: Set<any> = new Set();\r\n private pendingApi: Map<string, any> = new Map();\r\n\r\n private inputHost: string;\r\n private outputHost: string;\r\n private inputParams: IUnsParameters | null = null;\r\n private outputParams: IUnsParameters | null = null;\r\n private apiOptions: IApiProxyOptions | null = null;\r\n private outPublisherActive = false;\r\n private inSubscriberActive = false;\r\n\r\n public async start(\r\n desiredAddr?: string,\r\n opts?: {\r\n processNameOverride?: string;\r\n instanceSuffix?: string;\r\n instanceModeOverride?: \"wait\" | \"force\" | \"handover\";\r\n handoverOverride?: boolean;\r\n }\r\n ): Promise<GatewayAddress> {\r\n const packageDef = protoLoader.loadSync(GATEWAY_PROTO, {\r\n keepCase: true,\r\n longs: String,\r\n enums: String,\r\n defaults: true,\r\n oneofs: true,\r\n });\r\n const proto = grpc.loadPackageDefinition(packageDef) as any;\r\n\r\n // Load config and init UNS process + MQTT proxies\r\n const cfg = await ConfigFile.loadConfig();\r\n const processName = opts?.processNameOverride ?? cfg.uns.processName;\r\n const instanceMode = opts?.instanceModeOverride ?? cfg.uns.instanceMode;\r\n const handover = (typeof opts?.handoverOverride === \"boolean\") ? opts.handoverOverride : cfg.uns.handover;\r\n const suffix = opts?.instanceSuffix ? `-${opts.instanceSuffix}` : \"\";\r\n\r\n const infraHost = resolveMqttHost(cfg.infra as MqttChannelConfig, \"infra\");\r\n const infraParams = buildUnsProcessParameters(cfg.infra as MqttChannelConfig);\r\n this.unsProcess = new UnsProxyProcess(infraHost, { processName, ...infraParams }) as UnsProxyProcessWithApi;\r\n // cache hosts/options; proxies created lazily on first use\r\n this.inputHost = resolveMqttHost(cfg.input as MqttChannelConfig, \"input\");\r\n this.outputHost = resolveMqttHost(cfg.output as MqttChannelConfig, \"output\");\r\n this.inputParams = buildUnsParameters(cfg.input as MqttChannelConfig);\r\n this.outputParams = buildUnsParameters(cfg.output as MqttChannelConfig);\r\n this.apiOptions = cfg.uns?.jwksWellKnownUrl\r\n ? { jwks: { wellKnownJwksUrl: cfg.uns.jwksWellKnownUrl, activeKidUrl: cfg.uns.kidWellKnownUrl } }\r\n : { jwtSecret: \"CHANGEME\" };\r\n\r\n const serviceImpl = {\r\n Publish: this.publish.bind(this),\r\n Subscribe: this.subscribe.bind(this),\r\n RegisterApiGet: this.registerApiGet.bind(this),\r\n UnregisterApiGet: this.unregisterApiGet.bind(this),\r\n ApiEventStream: this.apiEventStream.bind(this),\r\n Ready: this.ready.bind(this),\r\n };\r\n\r\n this.server = new grpc.Server();\r\n this.server.addService(proto.uns.UnsGateway.service, serviceImpl);\r\n\r\n const isUnix = process.platform !== \"win32\";\r\n let addr: string | null = desiredAddr || process.env.UNS_GATEWAY_ADDR || null;\r\n if (!addr) {\r\n if (isUnix) {\r\n const sanitizedProcess = MqttTopicBuilder.sanitizeTopicPart(this.getProcessName());\r\n const sock = `/tmp/${sanitizedProcess}-uns-gateway.sock`;\r\n addr = `unix:${sock}`;\r\n } else {\r\n const port = await getPort();\r\n addr = `0.0.0.0:${port}`;\r\n }\r\n }\r\n\r\n // If UDS and file exists, best-effort unlink (stale sock)\r\n if (addr.startsWith(\"unix:\")) {\r\n const fs = await import(\"fs\");\r\n const p = addr.slice(\"unix:\".length);\r\n try { if (fs.existsSync(p)) fs.unlinkSync(p); } catch {}\r\n }\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n this.server!.bindAsync(addr!, grpc.ServerCredentials.createInsecure(), (err) => {\r\n if (err) return reject(err);\r\n // grpc-js automatically starts the server after bindAsync in recent versions\r\n // Calling start() is deprecated; omit to avoid warnings.\r\n logger.info(`UNS gRPC Gateway listening on ${addr}`);\r\n resolve();\r\n });\r\n });\r\n\r\n return { address: addr!, isUDS: addr!.startsWith(\"unix:\") };\r\n }\r\n\r\n private getProcessName(): string {\r\n try {\r\n const pkgPath = path.join(basePath, \"package.json\");\r\n const raw = readFileSync(pkgPath, \"utf8\");\r\n const pkg = JSON.parse(raw);\r\n return `${pkg.name}-${pkg.version}`;\r\n } catch {\r\n return `uns-gateway`;\r\n }\r\n }\r\n\r\n private async publish(call: any, callback: any) {\r\n try {\r\n await this.ensureMqttOutput();\r\n const req = call.request as any;\r\n if (!this.mqttOutput) throw new Error(\"Gateway not initialized\");\r\n\r\n const topic: string = req.topic;\r\n const attribute: string = req.attribute;\r\n const description: string = req.description ?? \"\";\r\n const tags: string[] = (req.tags ?? []) as string[];\r\n const attributeNeedsPersistence: boolean | null = req.attribute_needs_persistence ?? null;\r\n const valueIsCumulative: boolean = req.value_is_cumulative ?? false;\r\n\r\n let message: IUnsMessage | null = null;\r\n\r\n if (req.data) {\r\n const d = req.data;\r\n const time: string = d.time;\r\n const uom: string | undefined = d.uom || undefined;\r\n const dataGroup: string | undefined = d.data_group || undefined;\r\n const foreignEventKey: string | undefined = d.foreign_event_key || undefined;\r\n\r\n let value: any = undefined;\r\n if (typeof d.value_number === \"number\" && !Number.isNaN(d.value_number)) {\r\n value = d.value_number;\r\n } else if (typeof d.value_string === \"string\" && d.value_string.length > 0) {\r\n value = d.value_string;\r\n }\r\n if (value === undefined) throw new Error(\"Data.value_number or Data.value_string must be set\");\r\n\r\n message = { data: { time, value, uom, dataGroup, foreignEventKey } } as IUnsMessage;\r\n } else if (req.table) {\r\n const t = req.table;\r\n const time: string = t.time;\r\n const dataGroup: string | undefined = t.data_group || undefined;\r\n const columns = (t.columns ?? []).map((col: any) => {\r\n let value: string | number | null = null;\r\n if (typeof col.value_number === \"number\" && !Number.isNaN(col.value_number)) {\r\n value = col.value_number;\r\n } else if (typeof col.value_string === \"string\") {\r\n value = col.value_string;\r\n }\r\n return {\r\n name: col.name as string,\r\n type: col.type as any,\r\n uom: col.uom || undefined,\r\n value,\r\n };\r\n });\r\n\r\n message = { table: { time, columns, dataGroup } } as IUnsMessage;\r\n } else {\r\n throw new Error(\"PublishRequest.content must be data or table\");\r\n }\r\n\r\n const mqttMsg: IMqttPublishRequest = {\r\n topic,\r\n asset: \"meter\",\r\n objectType: ObjectTypes[\"energy-resource\"],\r\n objectId: \"main\",\r\n attributes: {\r\n attribute,\r\n description,\r\n tags,\r\n attributeNeedsPersistence,\r\n ...(message.data ? { data: message.data } : { table: message.table! }),\r\n },\r\n };\r\n\r\n this.mqttOutput.publishMqttMessage(\r\n mqttMsg,\r\n message.data && valueIsCumulative ? MessageMode.Delta : MessageMode.Raw,\r\n );\r\n\r\n callback(null, { ok: true });\r\n } catch (err: any) {\r\n logger.error(`Gateway Publish error: ${err.message}`);\r\n callback(null, { ok: false, error: err.message });\r\n }\r\n }\r\n\r\n private async subscribe(call: any) {\r\n await this.ensureMqttInput();\r\n const req = call.request as any;\r\n const topics: string[] = (req.topics ?? []) as string[];\r\n if (topics.length === 0) {\r\n call.emit(\"error\", { code: grpc.status.INVALID_ARGUMENT, details: \"topics is required\" });\r\n call.end();\r\n return;\r\n }\r\n\r\n // Subscribe and stream messages to this client\r\n this.mqttInput.subscribeAsync(topics);\r\n\r\n const handler = (event: any) => {\r\n try {\r\n // Forward as UNS packet JSON if parsable, else raw message\r\n const payload = event.packet ? JSON.stringify(event.packet) : String(event.message ?? \"\");\r\n call.write({ topic: event.topic, payload });\r\n } catch (e) {\r\n // drop\r\n }\r\n };\r\n this.handlers.add(handler);\r\n this.mqttInput.event.on(\"input\", handler);\r\n\r\n call.on(\"cancelled\", () => this.cleanupHandler(handler));\r\n call.on(\"error\", () => this.cleanupHandler(handler));\r\n call.on(\"close\", () => this.cleanupHandler(handler));\r\n }\r\n\r\n private attachStatusListeners(): void {\r\n if (this.mqttOutput) {\r\n this.mqttOutput.event.on(\"mqttProxyStatus\", (e: any) => {\r\n if (e?.event === \"t-publisher-active\") this.outPublisherActive = !!e.value;\r\n });\r\n }\r\n if (this.mqttInput) {\r\n this.mqttInput.event.on(\"mqttProxyStatus\", (e: any) => {\r\n if (e?.event === \"t-subscriber-active\") this.inSubscriberActive = !!e.value;\r\n });\r\n }\r\n }\r\n\r\n private async ensureMqttOutput() {\r\n if (!this.mqttOutput) {\r\n // slight delay to let process MQTT connect\r\n while ((this.unsProcess as any)?.processMqttProxy?.isConnected === false) {\r\n await new Promise((r) => setTimeout(r, 50));\r\n }\r\n const outputParams: IUnsParameters = {\r\n ...(this.outputParams ?? {}),\r\n publishThrottlingDelay: this.outputParams?.publishThrottlingDelay ?? 1,\r\n };\r\n this.mqttOutput = await this.unsProcess!.createUnsMqttProxy(\r\n this.outputHost,\r\n this.getInstanceName(\"gatewayOutput\"),\r\n \"force\",\r\n true,\r\n outputParams,\r\n );\r\n this.attachStatusListeners();\r\n }\r\n }\r\n\r\n private async ensureMqttInput() {\r\n if (!this.mqttInput) {\r\n while ((this.unsProcess as any)?.processMqttProxy?.isConnected === false) {\r\n await new Promise((r) => setTimeout(r, 50));\r\n }\r\n const inputParams: IUnsParameters = {\r\n ...(this.inputParams ?? {}),\r\n mqttSubToTopics: this.inputParams?.mqttSubToTopics ?? [],\r\n };\r\n this.mqttInput = await this.unsProcess!.createUnsMqttProxy(\r\n this.inputHost,\r\n this.getInstanceName(\"gatewayInput\"),\r\n \"force\",\r\n true,\r\n inputParams,\r\n );\r\n this.attachStatusListeners();\r\n }\r\n }\r\n\r\n private async ensureApiProxy() {\r\n if (!this.unsApiProxy) {\r\n if (typeof (this.unsProcess as any)?.createApiProxy !== \"function\") {\r\n throw new Error(\"API plugin not registered. Please install @uns-kit/api and register it with UnsProxyProcess before starting the gateway.\");\r\n }\r\n this.unsApiProxy = await this.unsProcess!.createApiProxy(this.getInstanceName(\"gatewayApi\"), this.apiOptions!);\r\n this.unsApiProxy.event.on(\"apiGetEvent\", (event: any) => this.onApiGetEvent(event));\r\n }\r\n }\r\n\r\n private getInstanceName(base: string): string {\r\n // derive suffix from processName/CLI by inspecting configured instanceStatusTopic is overkill; keep base names unique per process\r\n return base;\r\n }\r\n\r\n private async registerApiGet(call: any, callback: any) {\r\n try {\r\n await this.ensureApiProxy();\r\n const req = call.request as any;\r\n const topic: string = req.topic;\r\n const attribute: string = req.attribute;\r\n const apiDescription: string | undefined = req.api_description || undefined;\r\n const tags: string[] | undefined = (req.tags ?? []) as string[];\r\n const queryParams: any[] = (req.query_params ?? []).map((p: any) => ({\r\n name: p.name,\r\n type: (p.type === \"number\" || p.type === \"boolean\") ? p.type : \"string\",\r\n required: !!p.required,\r\n description: p.description ?? undefined,\r\n }));\r\n\r\n const options: IGetEndpointOptions = {\r\n apiDescription,\r\n tags,\r\n queryParams,\r\n };\r\n await this.unsApiProxy.get(topic as any, attribute, options);\r\n callback(null, { ok: true });\r\n } catch (err: any) {\r\n logger.error(`Gateway RegisterApiGet error: ${err.message}`);\r\n callback(null, { ok: false, error: err.message });\r\n }\r\n }\r\n\r\n private async unregisterApiGet(call: any, callback: any) {\r\n try {\r\n await this.ensureApiProxy();\r\n const req = call.request as any;\r\n const topic: string = req.topic;\r\n const attribute: string = req.attribute;\r\n await this.unsApiProxy.unregister(topic as any, attribute, \"GET\");\r\n callback(null, { ok: true });\r\n } catch (err: any) {\r\n logger.error(`Gateway UnregisterApiGet error: ${err.message}`);\r\n callback(null, { ok: false, error: err.message });\r\n }\r\n }\r\n\r\n private onApiGetEvent(event: any) {\r\n // Correlate request and forward to connected gRPC streams\r\n const id = randomUUID();\r\n const req = event.req;\r\n const res = event.res;\r\n const path: string = req.path || req.originalUrl || \"/\";\r\n // Derive topic/attribute is optional; we send path and query\r\n const bearer = (req.headers?.[\"authorization\"] as string | undefined) ?? \"\";\r\n this.pendingApi.set(id, res);\r\n // Timeout after 10s\r\n setTimeout(() => {\r\n if (this.pendingApi.has(id)) {\r\n const r = this.pendingApi.get(id);\r\n try { r.status(504).send(\"Gateway timeout\"); } catch {}\r\n this.pendingApi.delete(id);\r\n }\r\n }, 10_000).unref?.();\r\n\r\n const query: Record<string, string> = {};\r\n Object.entries(req.query || {}).forEach(([k, v]) => { query[k] = String(v); });\r\n const msg = { id, method: \"GET\", path, query, bearer };\r\n for (const stream of this.apiStreams) {\r\n try { stream.write(msg); } catch {}\r\n }\r\n }\r\n\r\n private async apiEventStream(call: any) {\r\n // Register stream\r\n await this.ensureApiProxy();\r\n this.apiStreams.add(call);\r\n call.on(\"data\", (resp: any) => {\r\n const id: string = resp.id;\r\n const status: number = resp.status ?? 200;\r\n const body: string = resp.body ?? \"\";\r\n const headers: Record<string, string> = resp.headers ?? {};\r\n const res = this.pendingApi.get(id);\r\n if (res) {\r\n try {\r\n Object.entries(headers).forEach(([k, v]) => res.setHeader(k, v));\r\n res.status(status).send(body);\r\n } catch {}\r\n this.pendingApi.delete(id);\r\n }\r\n });\r\n const cleanup = () => { this.apiStreams.delete(call); };\r\n call.on(\"cancelled\", cleanup);\r\n call.on(\"error\", cleanup);\r\n call.on(\"close\", cleanup);\r\n }\r\n\r\n private async ready(call: any, callback: any) {\r\n try {\r\n const req = call.request as any;\r\n const timeoutMs: number = req.timeout_ms && req.timeout_ms > 0 ? req.timeout_ms : 15000;\r\n const waitOut = !!req.wait_output;\r\n const waitIn = !!req.wait_input;\r\n const waitApi = !!req.wait_api;\r\n\r\n if (waitOut) await this.ensureMqttOutput();\r\n if (waitIn) await this.ensureMqttInput();\r\n if (waitApi) await this.ensureApiProxy();\r\n\r\n const start = Date.now();\r\n const check = () => {\r\n const okOut = !waitOut || this.outPublisherActive;\r\n const okIn = !waitIn || this.inSubscriberActive;\r\n const okApi = !waitApi || !!this.unsApiProxy; // creation ensures listening\r\n return okOut && okIn && okApi;\r\n };\r\n\r\n if (check()) return callback(null, { ok: true });\r\n\r\n const onStatus = () => {\r\n if (check()) done(true);\r\n };\r\n\r\n const done = (ok: boolean, err?: string) => {\r\n if (this.mqttOutput) this.mqttOutput.event.off(\"mqttProxyStatus\", onStatus as any);\r\n if (this.mqttInput) this.mqttInput.event.off(\"mqttProxyStatus\", onStatus as any);\r\n callback(null, { ok, error: err });\r\n };\r\n\r\n if (this.mqttOutput) this.mqttOutput.event.on(\"mqttProxyStatus\", onStatus as any);\r\n if (this.mqttInput) this.mqttInput.event.on(\"mqttProxyStatus\", onStatus as any);\r\n\r\n const iv = setInterval(() => {\r\n if (check()) {\r\n clearInterval(iv);\r\n done(true);\r\n } else if (Date.now() - start > timeoutMs) {\r\n clearInterval(iv);\r\n done(false, \"timeout waiting for readiness\");\r\n }\r\n }, 100);\r\n } catch (e: any) {\r\n callback(null, { ok: false, error: e.message });\r\n }\r\n }\r\n\r\n private cleanupHandler(handler: Function) {\r\n if (this.mqttInput) this.mqttInput.event.off(\"input\", handler as any);\r\n this.handlers.delete(handler);\r\n }\r\n\r\n public async shutdown(): Promise<void> {\r\n try {\r\n for (const h of Array.from(this.handlers)) this.cleanupHandler(h);\r\n if (this.server) {\r\n await new Promise<void>((resolve) => this.server!.tryShutdown(() => resolve()));\r\n this.server = null;\r\n }\r\n if (this.unsProcess) this.unsProcess.shutdown();\r\n } catch (e: any) {\r\n logger.error(`Gateway shutdown error: ${e.message}`);\r\n }\r\n }\r\n}\r\n\r\nexport async function startUnsGateway(addrOverride?: string, opts?: GatewayStartOptions): Promise<GatewayAddress> {\r\n const gw = new UnsGatewayServer();\r\n return gw.start(addrOverride, opts);\r\n}\r\nfunction sanitizeTopicPart(getProcessName: () => string) {\r\n throw new Error(\"Function not implemented.\");\r\n}\r\n"]}
|