From 4d8b07fc68d240a02933d6dc0591b649a0a8e938 Mon Sep 17 00:00:00 2001 From: jhartworks Date: Wed, 16 Sep 2026 12:41:24 +0200 Subject: [PATCH] Refactor code structure for improved readability and maintainability --- .env.example | 13 + .gitignore | 3 +- README.md | 25 +- api/Dockerfile | 4 +- api/package.json | 5 +- api/src/db.js | 39 +- api/src/index.js | 37 +- bacnet-collector/Dockerfile | 2 +- bacnet-collector/package.json | 5 +- collector/Dockerfile | 4 +- collector/package-lock.json | 2433 +++++++++++++++++++++++++++++++++ collector/package.json | 30 +- collector/src/index.js | 41 +- docker-compose.yml | 38 +- runner/Dockerfile | 2 +- runner/package.json | 7 +- symcon-collector/Dockerfile | 4 +- symcon-collector/package.json | 3 +- symcon-collector/src/index.js | 12 +- web/Dockerfile | 5 +- web/package.json | 5 +- web/src/App.jsx | 49 +- 22 files changed, 2670 insertions(+), 96 deletions(-) create mode 100644 .env.example create mode 100644 collector/package-lock.json diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..64c9c2f --- /dev/null +++ b/.env.example @@ -0,0 +1,13 @@ +# Copy this file to .env and replace all placeholders before production use. +JWT_SECRET=replace-with-a-long-random-secret +ADMIN_USERNAME=admin +ADMIN_EMAIL=admin@example.com +ADMIN_PASSWORD=replace-with-a-strong-admin-password +ADMIN_NAME=System Admin +# Existing controllers may require these legacy credentials. +MARIADB_ROOT_PASSWORD=SE3112 +MARIADB_PASSWORD=3112 +DB_PASSWORD_FALLBACK=root +REDIS_PASSWORD=replace-with-a-long-random-redis-password +CORS_ORIGIN=http://localhost:5173 +VITE_API_PORT=18080 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 69b287f..426bb6d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,8 @@ -node_modules +node_modules dist .DS_Store npm-debug.log* .scratch/runtime data/ web/src +.env diff --git a/README.md b/README.md index 82d3f9d..be03e0b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# SE Local Trenddata +# SE Local Trenddata SE Local Trenddata ist eine webbasierte Trend-, Dashboard- und Quellenverwaltung fuer lokale Anlagen- und WAGO-Daten. Das Projekt besteht aus einem React-Frontend, einer Node.js/Express-API, MariaDB, Redis und einem Collector-Service fuer Protokollquellen wie Modbus TCP, OPC UA, BACnet IP und KNX IP. @@ -671,3 +671,26 @@ Vor produktiver Nutzung: - Fuer vollstaendige Protokollintegration muessen je nach Feldbus noch Details wie Adressierung, Datentyp, Byteorder und Authentifizierung sauber projektspezifisch gepflegt werden. --- + +--- + +## Konfiguration und Sicherheit + +Vor dem ersten Start `.env.example` nach `.env` kopieren und mindestens `JWT_SECRET`, `ADMIN_PASSWORD` und `REDIS_PASSWORD` durch eigene lange Zufallswerte ersetzen. Die lokale `.env` wird nicht versioniert. + +Redis ist ausschließlich innerhalb des Docker-Netzwerks erreichbar und verlangt ein Passwort. Für Diagnosezwecke: + +```powershell +docker compose exec redis redis-cli -a $env:REDIS_PASSWORD ping +``` + +Alle Dienste können vor einem Deployment statisch geprüft werden: + +```powershell +npm --prefix api run check +npm --prefix collector run check +npm --prefix symcon-collector run check +npm --prefix bacnet-collector run check +npm --prefix runner run check +npm --prefix web run check +``` \ No newline at end of file diff --git a/api/Dockerfile b/api/Dockerfile index 74439f8..9b90684 100644 --- a/api/Dockerfile +++ b/api/Dockerfile @@ -1,9 +1,9 @@ -FROM node:20-alpine +FROM node:22-alpine WORKDIR /app COPY package*.json ./ -RUN npm install +RUN npm ci COPY src ./src diff --git a/api/package.json b/api/package.json index 75e0b33..22bdacb 100644 --- a/api/package.json +++ b/api/package.json @@ -5,7 +5,8 @@ "type": "module", "scripts": { "dev": "node --watch src/index.js", - "start": "node src/index.js" + "start": "node src/index.js", + "check": "node --check src/index.js && node --check src/db.js" }, "dependencies": { "bcryptjs": "^2.4.3", @@ -16,4 +17,4 @@ "jsonwebtoken": "^9.0.2", "mysql2": "^3.12.0" } -} +} \ No newline at end of file diff --git a/api/src/db.js b/api/src/db.js index c4f049a..8a3e06a 100644 --- a/api/src/db.js +++ b/api/src/db.js @@ -1,4 +1,4 @@ -import mysql from "mysql2/promise"; +import mysql from "mysql2/promise"; import { config } from "./config.js"; function createPool(password) { @@ -24,7 +24,15 @@ function isAccessDenied(error) { return error?.code === "ER_ACCESS_DENIED_ERROR"; } -async function query(sql, values) { +function isTransientConnectionError(error) { + return ["ECONNREFUSED", "ECONNRESET", "ETIMEDOUT", "PROTOCOL_CONNECTION_LOST"].includes(error?.code); +} + +function delay(milliseconds) { + return new Promise((resolve) => setTimeout(resolve, milliseconds)); +} + +async function queryWithCredentials(sql, values) { try { return await activePool.query(sql, values); } catch (error) { @@ -33,21 +41,18 @@ async function query(sql, values) { } for (const password of candidatePasswords) { - if (password === activePassword) { - continue; - } - + if (password === activePassword) continue; const fallbackPool = createPool(password); try { const result = await fallbackPool.query(sql, values); + const previousPool = activePool; activePool = fallbackPool; activePassword = password; + previousPool.end().catch(() => undefined); return result; } catch (fallbackError) { await fallbackPool.end().catch(() => undefined); - if (!isAccessDenied(fallbackError)) { - throw fallbackError; - } + if (!isAccessDenied(fallbackError)) throw fallbackError; } } @@ -55,4 +60,18 @@ async function query(sql, values) { } } -export const pool = { query }; +async function query(sql, values) { + let lastError; + for (let attempt = 0; attempt < 5; attempt += 1) { + try { + return await queryWithCredentials(sql, values); + } catch (error) { + lastError = error; + if (!isTransientConnectionError(error) || attempt === 4) throw error; + await delay(250 * 2 ** attempt); + } + } + throw lastError; +} + +export const pool = { query }; \ No newline at end of file diff --git a/api/src/index.js b/api/src/index.js index a59c752..3956aa3 100644 --- a/api/src/index.js +++ b/api/src/index.js @@ -202,18 +202,33 @@ async function ensureRolesSchema() { } -function sanitizeApiSettings(body = {}) { +function updateSecret(body, existing, field, clearField) { + if (body[clearField] === true) return ""; + const replacement = String(body[field] ?? "").trim(); + return replacement || String(existing[field] || "").trim(); +} + +function sanitizeApiSettings(body = {}, existing = {}) { return { - mailUrl: String(body.mailUrl || "https://mailapi.se-inno.de").trim() || "https://mailapi.se-inno.de", - mailApiKey: String(body.mailApiKey || "").trim(), - whatsappUrl: String(body.whatsappUrl || "https://whatsappapi.se-inno.de").trim() || "https://whatsappapi.se-inno.de", - whatsappApiKey: String(body.whatsappApiKey || "").trim(), - voipUrl: String(body.voipUrl || "https://voipapi.se-inno.de").trim() || "https://voipapi.se-inno.de", - voipApiKey: String(body.voipApiKey || "").trim(), + mailUrl: String(body.mailUrl ?? existing.mailUrl ?? "https://mailapi.se-inno.de").trim() || "https://mailapi.se-inno.de", + mailApiKey: updateSecret(body, existing, "mailApiKey", "clearMailApiKey"), + whatsappUrl: String(body.whatsappUrl ?? existing.whatsappUrl ?? "https://whatsappapi.se-inno.de").trim() || "https://whatsappapi.se-inno.de", + whatsappApiKey: updateSecret(body, existing, "whatsappApiKey", "clearWhatsappApiKey"), + voipUrl: String(body.voipUrl ?? existing.voipUrl ?? "https://voipapi.se-inno.de").trim() || "https://voipapi.se-inno.de", + voipApiKey: updateSecret(body, existing, "voipApiKey", "clearVoipApiKey"), updatedAt: new Date().toISOString(), }; } +function publicApiSettings(settings = {}) { + return { + mailUrl: settings.mailUrl || "https://mailapi.se-inno.de", + whatsappUrl: settings.whatsappUrl || "https://whatsappapi.se-inno.de", + voipUrl: settings.voipUrl || "https://voipapi.se-inno.de", + updatedAt: settings.updatedAt || null, + }; +} + function normalizeRunnerTime(value) { const raw = String(value ?? "").trim().replace(/\s*uhr$/i, "").replace(".", ":"); const match = raw.match(/^(\d{1,2}):(\d{2})$/); @@ -834,9 +849,8 @@ app.post("/api/dashboard/data", authenticateTokenOptional, wrap(async (req, res) app.get("/api/integrations", authenticateToken, requirePermission("manage_integrations"), wrap(async (_req, res) => { const current = JSON.parse(await redis.get("integration:api") || "{}"); - const settings = sanitizeApiSettings(current); res.json({ - settings, + settings: publicApiSettings(current), mailConfigured: Boolean(current.mailApiKey), whatsappConfigured: Boolean(current.whatsappApiKey), voipConfigured: Boolean(current.voipApiKey), @@ -844,10 +858,11 @@ app.get("/api/integrations", authenticateToken, requirePermission("manage_integr })); app.put("/api/integrations", authenticateToken, requirePermission("manage_integrations"), wrap(async (req, res) => { - const payload = sanitizeApiSettings(req.body || {}); + const current = JSON.parse(await redis.get("integration:api") || "{}"); + const payload = sanitizeApiSettings(req.body || {}, current); await redis.set("integration:api", JSON.stringify(payload)); res.json({ - settings: payload, + settings: publicApiSettings(payload), mailConfigured: Boolean(payload.mailApiKey), whatsappConfigured: Boolean(payload.whatsappApiKey), voipConfigured: Boolean(payload.voipApiKey), diff --git a/bacnet-collector/Dockerfile b/bacnet-collector/Dockerfile index 5f9c36c..bce1d8d 100644 --- a/bacnet-collector/Dockerfile +++ b/bacnet-collector/Dockerfile @@ -1,4 +1,4 @@ -FROM node:20-alpine +FROM node:22-alpine WORKDIR /app diff --git a/bacnet-collector/package.json b/bacnet-collector/package.json index fe53092..ce705c6 100644 --- a/bacnet-collector/package.json +++ b/bacnet-collector/package.json @@ -4,9 +4,10 @@ "private": true, "type": "module", "scripts": { - "start": "node src/index.js" + "start": "node src/index.js", + "check": "node --check src/index.js" }, "dependencies": { "bacstack": "^0.0.1-beta.14" } -} +} \ No newline at end of file diff --git a/collector/Dockerfile b/collector/Dockerfile index 3d1849c..9a868eb 100644 --- a/collector/Dockerfile +++ b/collector/Dockerfile @@ -1,9 +1,9 @@ -FROM node:20-alpine +FROM node:22-alpine WORKDIR /app COPY package*.json ./ -RUN npm install +RUN npm ci COPY src ./src RUN mkdir -p /app/data diff --git a/collector/package-lock.json b/collector/package-lock.json new file mode 100644 index 0000000..54162d0 --- /dev/null +++ b/collector/package-lock.json @@ -0,0 +1,2433 @@ +{ + "name": "seltd-collector", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "seltd-collector", + "version": "1.0.0", + "dependencies": { + "knx": "2.5.4", + "mysql2": "^3.12.0", + "node-bacnet": "0.2.4", + "node-opcua": "2.184.4" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@peculiar/asn1-asym-key": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-asym-key/-/asn1-asym-key-2.9.4.tgz", + "integrity": "sha512-s7SJfjcXlR3MYMngDTeMLCy3VjGaIxeEy905CQ0j09pDbeYhNBvBGA7r7cAvCZYkVFo9kVg9RAki0K2iUz7SGQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-pkcs8": "^2.9.4", + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/asn1-cms": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.9.4.tgz", + "integrity": "sha512-cben7oxmQsUGZqotus7yt0srYdncOT6RNWcTQ77T2RFOXejYVYkXadrfePdRcrVpO9K95IRLKKglG2k38jKXuw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", + "@peculiar/asn1-x509-attr": "^2.9.4", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/asn1-csr": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.9.4.tgz", + "integrity": "sha512-xd4YN4vpRjkDAQWVfZZkeu12IEND7DOpkqaHSIHxZl1uggUNa9Ju0QxY2jHvDAS9pP0zhRBytg8ifsnGo3V0jw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/asn1-ecc": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.9.4.tgz", + "integrity": "sha512-JJXefFshRAuVAjWQo/39bkg1ywc1VaiO44S8RRC+Ykvf/u2KDmYffoDb0ZBPCR5uJy4AGKQhl8mX+Q8ShcWaXQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/asn1-pfx": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.9.4.tgz", + "integrity": "sha512-khuGzHTzNzk4GDlIBEILyIs6Lce0yn0ZBdoI9v93kmNncfZRhD+AQ5ODFqdhvoE8cMJF/JMTQ8yA+t1D14kqCw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.9.4", + "@peculiar/asn1-pkcs8": "^2.9.4", + "@peculiar/asn1-rsa": "^2.9.4", + "@peculiar/asn1-schema": "^2.9.4", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.9.4.tgz", + "integrity": "sha512-duRdotlUx9eDZe6QrQpQKl61RbWykCHBCkKayP8V8XdEFwlKHZ8qGGDMyS6Pye7OX7nLFttTTpRkJeet78ckwQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.9.4.tgz", + "integrity": "sha512-kaL4cNxBpdQE2dKlyZBqz4ygCrwffO+8wfoxTEqM1Z8RadvCeELBRzcv0dzM8aY9azHMwODO5nxU65zXmhToOQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.9.4", + "@peculiar/asn1-pfx": "^2.9.4", + "@peculiar/asn1-pkcs8": "^2.9.4", + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", + "@peculiar/asn1-x509-attr": "^2.9.4", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/asn1-rsa": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.9.4.tgz", + "integrity": "sha512-pZ96eD1PptovcWQ/GSmuNFXd/7EQJNlKfDaNCyE2rx3W0v6QFelkzquVqRSRyyDXXCYD69ZXJDzZ8GhIiQzKoA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.9.4.tgz", + "integrity": "sha512-GjzePcT9Iw8NzeOPf73iNS9xM+TBhd/FilAfP+RQGkTMQJTVWtytN3JHJACCjf/ABNau5S7mS3g+DcuxmRgYEg==", + "license": "MIT", + "dependencies": { + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/asn1-x509": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.9.4.tgz", + "integrity": "sha512-CxhBo/RdEbMMob7T31ZdQjGuoyRFLVwrDzTn25bihzBasRg9kRm/0IxIPvhgQtcK/9dNcO1XQL2fuPugwELL0Q==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/asn1-x509-attr": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.9.4.tgz", + "integrity": "sha512-ehQXbpQaQYycgu8OrvigwSPTFfVRcu0ECNYCWw+yzBp02Lw5paRqzzhUpfOgO2K38+WfFZuEz/0RPtam5g0OMg==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/asn1-x509-post-quantum": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-post-quantum/-/asn1-x509-post-quantum-2.9.4.tgz", + "integrity": "sha512-GD0k7BY3dsEIeai7C7bVRPddj/PzZu+sTawRPRxdHKbdy1f9b58WQyk0eFJdr28GShyLVTU8poyi4+bTAZfEtQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-asym-key": "^2.9.4", + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@peculiar/utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz", + "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/webcrypto": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.7.1.tgz", + "integrity": "sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/json-schema": "^1.1.12", + "@peculiar/utils": "^2.0.2", + "tslib": "^2.8.1", + "webcrypto-core": "^1.9.2" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/@peculiar/x509": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-2.1.0.tgz", + "integrity": "sha512-IYbg1R03CSQGWwl24kGyqrdVtixNSbRaDvBg1r5wyYjTP+VwPQkka1BzTgU5+vxiuwqg04OxdvdJ1xYYFIdUSA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.9.4", + "@peculiar/asn1-csr": "^2.9.4", + "@peculiar/asn1-ecc": "^2.9.4", + "@peculiar/asn1-pkcs9": "^2.9.4", + "@peculiar/asn1-rsa": "^2.9.4", + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", + "@peculiar/asn1-x509-post-quantum": "^2.9.4", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1", + "tsyringe": "^4.10.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@ster5/global-mutex": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@ster5/global-mutex/-/global-mutex-3.3.0.tgz", + "integrity": "sha512-uiGJTiE0ZiQ6z9VMOHVT3RNrErCi3pZh1bGbfb27GAXCAsvCyLz61pLfBYq8uzsf6Y2qdybhoTwHy7UGtK6MYw==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "peerDependenciesMeta": { + "proper-lockfile": { + "optional": true + } + } + }, + "node_modules/@types/dns-packet": { + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/@types/dns-packet/-/dns-packet-5.6.5.tgz", + "integrity": "sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/multicast-dns": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@types/multicast-dns/-/multicast-dns-7.2.4.tgz", + "integrity": "sha512-ib5K4cIDR4Ro5SR3Sx/LROkMDa0BHz0OPaCBL/OSPDsAXEGZ3/KQeS6poBKYVN7BfjXDL9lWNwzyHVgt/wkyCw==", + "license": "MIT", + "dependencies": { + "@types/dns-packet": "*", + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "22.20.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.3.tgz", + "integrity": "sha512-DZmzkmwHzXrLPAXPyKNDzlIwMMUZCVacoD25ywdy5YTKGbOx/2ld+Q38Im2zJ0vBuZP5Prd3VZutKZyXwkOS8A==", + "license": "MIT", + "peer": true, + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-1mAINjtQCXXeLkJ9ehXkwOcBpqtLxiVtKhpUf83DdRNdQKV0iXZpaHYqRr7nj+wvxuJzoAmAwXI+sCNMv1CzLQ==", + "license": "MIT" + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/array-back": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.3.tgz", + "integrity": "sha512-SGDvmg6QTYiTxCBkYVmThcoa67uLl35pyzRHdpCGBOcqFy6BtwnphoFPk7LhJshD+Yk1Kt35WGWeZPTgwR4Fhw==", + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "license": "MIT" + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1js": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", + "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.5", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/aws-ssl-profiles": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", + "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/backoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", + "integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==", + "license": "MIT", + "dependencies": { + "precond": "0.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/binary-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-parser/-/binary-parser-2.3.0.tgz", + "integrity": "sha512-TXOlPrhvi+kZUv3vA1qZ+MBdqZdihF8gWw7j/MRINiJqXH652GtLSqFTHNPjG8kHbiMQSCATG9oat9ao6aA8dA==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/binary-protocol": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/binary-protocol/-/binary-protocol-0.0.0.tgz", + "integrity": "sha512-kcFqbqtZnZEGSY8Jh6dEO6VbxJDZu1tqJc3LODqADPHrDwHQwoTNdGTHW4sLhmNXeWUOZKjfRfopAu5xpRQbPw==", + "license": "MIT", + "dependencies": { + "bluebird": "~2.2.2" + } + }, + "node_modules/bluebird": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.2.2.tgz", + "integrity": "sha512-NqzuS2y44FmP++Ihv6/PgXpNRB+c282TKq0URBTQdA+EqPpR1Qu44QY8H8667LA39iOIaVHpmRPI4gpthYT8Ug==", + "license": "MIT" + }, + "node_modules/byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/command-line-args": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-6.0.2.tgz", + "integrity": "sha512-AIjYVxrV9X752LmPDLbVYv8aMCuHPSLZJXEo2qo/xJfv+NYhaZ4sMSF01rM+gHPaMgvPM0l5D/F+Qx+i2WfSmQ==", + "license": "MIT", + "dependencies": { + "array-back": "^6.2.3", + "find-replace": "^5.0.2", + "lodash.camelcase": "^4.3.0", + "typical": "^7.3.0" + }, + "engines": { + "node": ">=12.20" + }, + "peerDependencies": { + "@75lb/nature": "latest" + }, + "peerDependenciesMeta": { + "@75lb/nature": { + "optional": true + } + } + }, + "node_modules/command-line-usage": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.4.tgz", + "integrity": "sha512-85UdvzTNx/+s5CkSgBm/0hzP80RFHAa7PsfeADE5ezZF3uHz3/Tqj9gIKGT9PTtpycc3Ua64T0oVulGfKxzfqg==", + "license": "MIT", + "dependencies": { + "array-back": "^6.2.2", + "chalk-template": "^0.4.0", + "table-layout": "^4.1.1", + "typical": "^7.3.0" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dequeue": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/dequeue/-/dequeue-1.0.5.tgz", + "integrity": "sha512-2FIVJZTaWhUj0Y2uKmDAasTP6ZwFWRjkRc01MYN5jFm96iIzkYyNzGADfJ13C5W7CTN7XO9mBYDcVB68eNybBA==", + "engines": { + "node": "*" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/find-replace": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-5.0.2.tgz", + "integrity": "sha512-Y45BAiE3mz2QsrN2fb5QEtO4qb44NcS7en/0y9PEVsg351HsLeVclP8QPMH79Le9sH3rs5RSwJu99W0WPZO43Q==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@75lb/nature": "latest" + }, + "peerDependenciesMeta": { + "@75lb/nature": { + "optional": true + } + } + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "license": "MIT", + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hexy": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/hexy/-/hexy-0.4.0.tgz", + "integrity": "sha512-HxJ6HCV/zrSBeAVRNEhr3CE6yTlCYklMHfCVfJkp7kC+HJqSP1SQ+howWPiHK37t++ELUtgoAoGJut5HyRhIvg==", + "license": "MIT", + "bin": { + "hexy": "bin/hexy_cmd.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/humanize": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/humanize/-/humanize-0.0.9.tgz", + "integrity": "sha512-bvZZ7vXpr1RKoImjuQ45hJb5OvE2oJafHysiD/AL3nkqTZH2hFCjQ3YZfCd63FefDitbJze/ispUPP0gfDsT2Q==", + "engines": { + "node": "*" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ipaddr.js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.2.0.tgz", + "integrity": "sha512-ku//LD7ie/m9UVGCm9KweBIIHP4mB0maNGvav6Hz778fQCNLQF7iZ+H/UuHuqmjJCHCpA5hw8hOeRKxZl8IlXw==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", + "license": "MIT" + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "license": "MIT" + }, + "node_modules/knx": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/knx/-/knx-2.5.4.tgz", + "integrity": "sha512-h+WMbx2NPgCL1Vr4X8xAsTV9E+72XjPviKRv67iJLomapENO25ZsRGq8egvqUJwtnsordJGOxxUA4o1jMOzQYw==", + "license": "MIT", + "dependencies": { + "@types/node": "^6.14.4", + "binary-parser": "1.1.5", + "binary-protocol": "0.0.0", + "ipaddr.js": "1.2.0", + "log-driver": "1.2.7", + "machina": "^4.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/knx/node_modules/@types/node": { + "version": "6.14.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.13.tgz", + "integrity": "sha512-J1F0XJ/9zxlZel5ZlbeSuHW2OpabrUAqpFuC2sm2I3by8sERQ8+KCjNKUcq8QHuzpGMWiJpo9ZxeHrqrP2KzQw==", + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, + "node_modules/lodash.partition": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.partition/-/lodash.partition-4.6.0.tgz", + "integrity": "sha512-35L3dSF3Q6V1w5j6V3NhNlQjzsRDC/pYKCTdYTmwqSib+Q8ponkAmt/PwEOq3EmI38DSCl+SkIVwLd+uSlVdrg==", + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "license": "MIT" + }, + "node_modules/log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", + "license": "ISC", + "engines": { + "node": ">=0.8.6" + } + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/lru.min": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.5.tgz", + "integrity": "sha512-5J9ysMYUpYIg9RF2vJpy9SinEmSviFSe0GyPpCQ4L5QSkLAgeLXlTAOu2ZwWUU5m+0SBl6gUU1R1ZQB3aKypfA==", + "license": "MIT", + "engines": { + "bun": ">=1.0.0", + "deno": ">=1.30.0", + "node": ">=8.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wellwelwel" + } + }, + "node_modules/machina": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/machina/-/machina-4.0.2.tgz", + "integrity": "sha512-OOlFrW1rd783S6tF36v5Ie/TM64gfvSl9kYLWL2cPA31J71HHWW3XrgSe1BZSFAPkh8532CMJMLv/s9L2aopiA==", + "dependencies": { + "lodash": "^4.17.5" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mysql2": { + "version": "3.24.4", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.24.4.tgz", + "integrity": "sha512-A2olluVlj0mvgyIRRISMEzXc51m+21mRtcMVjJyIpt2GG98+XrC9m9HzsqcMsX2LcnfccJvY5NB22g8fENBnOA==", + "license": "MIT", + "dependencies": { + "aws-ssl-profiles": "^1.1.2", + "generate-function": "^2.3.1", + "iconv-lite": "^0.7.3", + "long": "^5.3.2", + "lru.min": "^1.1.4", + "named-placeholders": "^1.1.6", + "sql-escaper": "^1.5.1" + }, + "engines": { + "node": ">= 8.0" + }, + "peerDependencies": { + "@types/node": ">= 8" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.6.tgz", + "integrity": "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==", + "license": "MIT", + "dependencies": { + "lru.min": "^1.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/node-bacnet": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/node-bacnet/-/node-bacnet-0.2.4.tgz", + "integrity": "sha512-Ni8BQzOYmB6kJSbp0GVkRKmlJAkQaVGoZMBJVMOKF17GxWrAo+eVozEDBvGZLkiV5/CbuTaCy/pKqBFITcowGQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "iconv-lite": "^0.5.1", + "underscore": "^1.10.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/node-bacnet/node_modules/iconv-lite": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", + "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-opcua": { + "version": "2.184.4", + "resolved": "https://registry.npmjs.org/node-opcua/-/node-opcua-2.184.4.tgz", + "integrity": "sha512-GrVApNBTQ+hIqtqZ+6d6qDmlZf57h7rX58BTNzk1MwiEaBNQ91X3D9x+EkmJWfqPL/wDfH97a/zA4mzIboQ7/A==", + "license": "MIT", + "dependencies": { + "@types/semver": "7.8.0", + "chalk": "4.1.2", + "node-opcua-address-space": "2.184.4", + "node-opcua-address-space-for-conformance-testing": "2.184.4", + "node-opcua-aggregates": "2.184.4", + "node-opcua-assert": "2.184.0", + "node-opcua-basic-types": "2.184.1", + "node-opcua-binary-stream": "2.184.1", + "node-opcua-certificate-manager": "2.184.1", + "node-opcua-client": "2.184.4", + "node-opcua-client-proxy": "2.184.4", + "node-opcua-common": "2.184.1", + "node-opcua-constants": "2.184.0", + "node-opcua-crypto": "5.10.1", + "node-opcua-data-access": "2.184.1", + "node-opcua-data-model": "2.184.1", + "node-opcua-data-value": "2.184.1", + "node-opcua-debug": "2.184.0", + "node-opcua-enum": "2.184.1", + "node-opcua-factory": "2.184.1", + "node-opcua-hostname": "2.184.0", + "node-opcua-nodeid": "2.184.1", + "node-opcua-nodesets": "2.184.0", + "node-opcua-numeric-range": "2.184.1", + "node-opcua-packet-analyzer": "2.184.1", + "node-opcua-secure-channel": "2.184.4", + "node-opcua-server": "2.184.4", + "node-opcua-server-discovery": "2.184.4", + "node-opcua-service-browse": "2.184.1", + "node-opcua-service-call": "2.184.1", + "node-opcua-service-discovery": "2.184.1", + "node-opcua-service-endpoints": "2.184.1", + "node-opcua-service-filter": "2.184.3", + "node-opcua-service-history": "2.184.1", + "node-opcua-service-node-management": "2.184.1", + "node-opcua-service-query": "2.184.1", + "node-opcua-service-read": "2.184.1", + "node-opcua-service-register-node": "2.184.1", + "node-opcua-service-secure-channel": "2.184.1", + "node-opcua-service-session": "2.184.1", + "node-opcua-service-subscription": "2.184.4", + "node-opcua-service-translate-browse-path": "2.184.1", + "node-opcua-service-write": "2.184.1", + "node-opcua-status-code": "2.184.1", + "node-opcua-transport": "2.184.1", + "node-opcua-types": "2.184.1", + "node-opcua-utils": "2.184.1", + "node-opcua-variant": "2.184.1", + "node-opcua-vendor-diagnostic": "2.184.4", + "semver": "^7.8.5" + }, + "engines": { + "node": ">=22.13.0" + }, + "funding": { + "url": "https://github.com/sponsors/erossignon" + } + }, + "node_modules/node-opcua-address-space": { + "version": "2.184.4", + "resolved": "https://registry.npmjs.org/node-opcua-address-space/-/node-opcua-address-space-2.184.4.tgz", + "integrity": "sha512-s+tBPJd3XjW4BFwAQ3lztSOgPr4p1DbGzeRzNqUfixjplhZyvGX3akTRaDAXyYcZ7EAOKvKDOQPy+1mSL2xczw==", + "license": "MIT", + "dependencies": { + "@types/semver": "7.8.0", + "chalk": "4.1.2", + "dequeue": "^1.0.5", + "node-opcua-address-space-base": "2.184.3", + "node-opcua-assert": "2.184.0", + "node-opcua-basic-types": "2.184.1", + "node-opcua-binary-stream": "2.184.1", + "node-opcua-client-dynamic-extension-object": "2.184.4", + "node-opcua-constants": "2.184.0", + "node-opcua-crypto": "5.10.1", + "node-opcua-data-access": "2.184.1", + "node-opcua-data-model": "2.184.1", + "node-opcua-data-value": "2.184.1", + "node-opcua-date-time": "2.184.1", + "node-opcua-debug": "2.184.0", + "node-opcua-enum": "2.184.1", + "node-opcua-extension-object": "2.184.1", + "node-opcua-factory": "2.184.1", + "node-opcua-nodeid": "2.184.1", + "node-opcua-nodeset-ua": "2.184.3", + "node-opcua-numeric-range": "2.184.1", + "node-opcua-object-registry": "2.184.0", + "node-opcua-pseudo-session": "2.184.4", + "node-opcua-service-browse": "2.184.1", + "node-opcua-service-call": "2.184.1", + "node-opcua-service-history": "2.184.1", + "node-opcua-service-translate-browse-path": "2.184.1", + "node-opcua-service-write": "2.184.1", + "node-opcua-status-code": "2.184.1", + "node-opcua-types": "2.184.1", + "node-opcua-utils": "2.184.1", + "node-opcua-variant": "2.184.1", + "node-opcua-xml2json": "2.184.1", + "semver": "^7.8.5", + "thenify-ex": "4.4.0", + "xml-writer": "^1.7.0" + }, + "bin": { + "opcua-nodeset-image": "bin/opcua-nodeset-image.cjs", + "opcua-nodeset-live": "bin/opcua-nodeset-live.cjs" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-address-space-base": { + "version": "2.184.3", + "resolved": "https://registry.npmjs.org/node-opcua-address-space-base/-/node-opcua-address-space-base-2.184.3.tgz", + "integrity": "sha512-DzhAhZjj3JRvmGSFIwld2To5ShAmHaaPTzQDAcQIqI5gm+zrfTeO0hb5od2ffBrzlebqnj9PxCw/YrYTkl+7Rw==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.184.0", + "node-opcua-basic-types": "2.184.1", + "node-opcua-constants": "2.184.0", + "node-opcua-crypto": "5.10.1", + "node-opcua-data-model": "2.184.1", + "node-opcua-data-value": "2.184.1", + "node-opcua-date-time": "2.184.1", + "node-opcua-debug": "2.184.0", + "node-opcua-extension-object": "2.184.1", + "node-opcua-nodeid": "2.184.1", + "node-opcua-numeric-range": "2.184.1", + "node-opcua-schemas": "2.184.1", + "node-opcua-status-code": "2.184.1", + "node-opcua-types": "2.184.1", + "node-opcua-variant": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-address-space-for-conformance-testing": { + "version": "2.184.4", + "resolved": "https://registry.npmjs.org/node-opcua-address-space-for-conformance-testing/-/node-opcua-address-space-for-conformance-testing-2.184.4.tgz", + "integrity": "sha512-oIYk9++XKtc0mKOY3yOxh6eL+rjZVWR8E4K1RC7o2tFAX7il2zFJK0gh2U/PArKO60oWRb2+I7Lm32QonLImKQ==", + "license": "MIT", + "dependencies": { + "node-opcua-address-space": "2.184.4", + "node-opcua-assert": "2.184.0", + "node-opcua-basic-types": "2.184.1", + "node-opcua-data-access": "2.184.1", + "node-opcua-data-model": "2.184.1", + "node-opcua-data-value": "2.184.1", + "node-opcua-debug": "2.184.0", + "node-opcua-factory": "2.184.1", + "node-opcua-nodeid": "2.184.1", + "node-opcua-status-code": "2.184.1", + "node-opcua-variant": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-aggregates": { + "version": "2.184.4", + "resolved": "https://registry.npmjs.org/node-opcua-aggregates/-/node-opcua-aggregates-2.184.4.tgz", + "integrity": "sha512-Hxd+35fOZ2LM4LpU/Cd4BKjvunJAq+y+KLit9a80N5lXapkzfZ39pWeAyBg2gece77g7i+4EsKxSQ8pIkjFaIA==", + "license": "MIT", + "dependencies": { + "node-opcua-address-space": "2.184.4", + "node-opcua-assert": "2.184.0", + "node-opcua-constants": "2.184.0", + "node-opcua-data-model": "2.184.1", + "node-opcua-data-value": "2.184.1", + "node-opcua-nodeid": "2.184.1", + "node-opcua-numeric-range": "2.184.1", + "node-opcua-server": "2.184.4", + "node-opcua-service-history": "2.184.1", + "node-opcua-status-code": "2.184.1", + "node-opcua-types": "2.184.1", + "node-opcua-utils": "2.184.1", + "node-opcua-variant": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-alarm-condition": { + "version": "2.184.4", + "resolved": "https://registry.npmjs.org/node-opcua-alarm-condition/-/node-opcua-alarm-condition-2.184.4.tgz", + "integrity": "sha512-1EPtesGRdZw2DtUtomYxNYihWXtwJZL/SfWe/xXiODQWDJgOG88lJ+yNIDLdhUM72udv8ZlC1KNRY61EYbRf4Q==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.184.0", + "node-opcua-basic-types": "2.184.1", + "node-opcua-constants": "2.184.0", + "node-opcua-data-model": "2.184.1", + "node-opcua-debug": "2.184.0", + "node-opcua-nodeid": "2.184.1", + "node-opcua-pseudo-session": "2.184.4", + "node-opcua-service-filter": "2.184.3", + "node-opcua-service-read": "2.184.1", + "node-opcua-service-subscription": "2.184.4", + "node-opcua-service-translate-browse-path": "2.184.1", + "node-opcua-status-code": "2.184.1", + "node-opcua-types": "2.184.1", + "node-opcua-utils": "2.184.1", + "node-opcua-variant": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-assert": { + "version": "2.184.0", + "resolved": "https://registry.npmjs.org/node-opcua-assert/-/node-opcua-assert-2.184.0.tgz", + "integrity": "sha512-gUwowAURNL/HTxTRizYy6a7+uoPsAXLaWCqXrj2B+LuHCBDTWuPvkw9lzokXEFx28pBdFHI9iQ3Mk29TRaX9Yw==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-basic-types": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-basic-types/-/node-opcua-basic-types-2.184.1.tgz", + "integrity": "sha512-+bBH/47cQ5U6syuAUzkHRlfD3y8CX+q4ZnMJwS+JqMbKAdbKirvVPRmcuDs1eUFjJ4OM2VG64XCnBralHsVmxg==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.184.0", + "node-opcua-binary-stream": "2.184.1", + "node-opcua-buffer-utils": "2.184.1", + "node-opcua-date-time": "2.184.1", + "node-opcua-guid": "2.184.0", + "node-opcua-nodeid": "2.184.1", + "node-opcua-status-code": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-binary-stream": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-binary-stream/-/node-opcua-binary-stream-2.184.1.tgz", + "integrity": "sha512-3jiVsUNwZNWnE2x8N0ol0SZ6z/GkYEbAIVzZiFSJhEU+vBxg+ta7CxLUbD9cvc6qa0Obt24yNbMqx2wfA/f3kw==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.184.0", + "node-opcua-buffer-utils": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-buffer-utils": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-buffer-utils/-/node-opcua-buffer-utils-2.184.1.tgz", + "integrity": "sha512-aGg3aD7BV34/ScfaHKJnYzgFxUt8Zoz0qGbvY7u9cA0Hw4zE/PMmjoJwexENIoMt/CVndU9HQzUcNPACYySTyQ==", + "license": "MIT", + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-certificate-manager": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-certificate-manager/-/node-opcua-certificate-manager-2.184.1.tgz", + "integrity": "sha512-zCJJaK6xFjtppOFfePz2l+2/tb9zRZU5aL/Nz4b4OLOGinetlR5w3+HYibllPKpQ7Iq8ABGsgVjetupLhrXXQw==", + "license": "MIT", + "dependencies": { + "env-paths": "2.2.1", + "node-opcua-assert": "2.184.0", + "node-opcua-common": "2.184.1", + "node-opcua-crypto": "5.10.1", + "node-opcua-debug": "2.184.0", + "node-opcua-object-registry": "2.184.0", + "node-opcua-pki": "6.22.0", + "node-opcua-status-code": "2.184.1", + "thenify-ex": "4.4.0" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-chunkmanager": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-chunkmanager/-/node-opcua-chunkmanager-2.184.1.tgz", + "integrity": "sha512-4uXsWNfwC3Lf+J/oqcoPJMH0wZuJspvrfcY2u7Vkc1qhoaCNOXcirDJ/x0TYFxevPwzYzb5mE8vlLYVn8GbRXA==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.184.0", + "node-opcua-basic-types": "2.184.1", + "node-opcua-binary-stream": "2.184.1", + "node-opcua-buffer-utils": "2.184.1", + "node-opcua-factory": "2.184.1", + "node-opcua-packet-assembler": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-client": { + "version": "2.184.4", + "resolved": "https://registry.npmjs.org/node-opcua-client/-/node-opcua-client-2.184.4.tgz", + "integrity": "sha512-Lj853g350A9IzRLxDdsMCU1jXNLjIks1yupJYiFG3BRhKVgrPOd/fa6tO0Q+KFYg38xNNcWmtdAE0SRAFpWSzA==", + "license": "MIT", + "dependencies": { + "@ster5/global-mutex": "^3.3.0", + "chalk": "4.1.2", + "node-opcua-alarm-condition": "2.184.4", + "node-opcua-assert": "2.184.0", + "node-opcua-basic-types": "2.184.1", + "node-opcua-buffer-utils": "2.184.1", + "node-opcua-certificate-manager": "2.184.1", + "node-opcua-client-dynamic-extension-object": "2.184.4", + "node-opcua-common": "2.184.1", + "node-opcua-constants": "2.184.0", + "node-opcua-crypto": "5.10.1", + "node-opcua-data-model": "2.184.1", + "node-opcua-data-value": "2.184.1", + "node-opcua-date-time": "2.184.1", + "node-opcua-debug": "2.184.0", + "node-opcua-extension-object": "2.184.1", + "node-opcua-hostname": "2.184.0", + "node-opcua-nodeid": "2.184.1", + "node-opcua-numeric-range": "2.184.1", + "node-opcua-object-registry": "2.184.0", + "node-opcua-pki": "6.22.0", + "node-opcua-pseudo-session": "2.184.4", + "node-opcua-schemas": "2.184.1", + "node-opcua-secure-channel": "2.184.4", + "node-opcua-service-browse": "2.184.1", + "node-opcua-service-call": "2.184.1", + "node-opcua-service-discovery": "2.184.1", + "node-opcua-service-endpoints": "2.184.1", + "node-opcua-service-filter": "2.184.3", + "node-opcua-service-history": "2.184.1", + "node-opcua-service-query": "2.184.1", + "node-opcua-service-read": "2.184.1", + "node-opcua-service-register-node": "2.184.1", + "node-opcua-service-secure-channel": "2.184.1", + "node-opcua-service-session": "2.184.1", + "node-opcua-service-subscription": "2.184.4", + "node-opcua-service-translate-browse-path": "2.184.1", + "node-opcua-service-write": "2.184.1", + "node-opcua-status-code": "2.184.1", + "node-opcua-transport": "2.184.1", + "node-opcua-types": "2.184.1", + "node-opcua-utils": "2.184.1", + "node-opcua-variant": "2.184.1", + "thenify-ex": "4.4.0" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-client-dynamic-extension-object": { + "version": "2.184.4", + "resolved": "https://registry.npmjs.org/node-opcua-client-dynamic-extension-object/-/node-opcua-client-dynamic-extension-object-2.184.4.tgz", + "integrity": "sha512-Md4XYsR5+0fkndjT0iNFzxq5eVqtmuxJDDkSc4XU+y69v9hjF9gILd8dn5QyMgL1bpQRg29QRzkfhmZovIQp7w==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.184.0", + "node-opcua-binary-stream": "2.184.1", + "node-opcua-constants": "2.184.0", + "node-opcua-data-model": "2.184.1", + "node-opcua-data-value": "2.184.1", + "node-opcua-debug": "2.184.0", + "node-opcua-extension-object": "2.184.1", + "node-opcua-factory": "2.184.1", + "node-opcua-nodeid": "2.184.1", + "node-opcua-pseudo-session": "2.184.4", + "node-opcua-schemas": "2.184.1", + "node-opcua-service-browse": "2.184.1", + "node-opcua-service-translate-browse-path": "2.184.1", + "node-opcua-status-code": "2.184.1", + "node-opcua-types": "2.184.1", + "node-opcua-variant": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-client-proxy": { + "version": "2.184.4", + "resolved": "https://registry.npmjs.org/node-opcua-client-proxy/-/node-opcua-client-proxy-2.184.4.tgz", + "integrity": "sha512-NgKjhVEdmf2FRPfGuFDM7+09DqRwmv776lx+HK2BHP0dT45vDSfoyexyaTVl81eQ9K6QzBX+DBQ0kfzVyYCtwg==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.184.0", + "node-opcua-constants": "2.184.0", + "node-opcua-data-model": "2.184.1", + "node-opcua-data-value": "2.184.1", + "node-opcua-debug": "2.184.0", + "node-opcua-nodeid": "2.184.1", + "node-opcua-pseudo-session": "2.184.4", + "node-opcua-service-browse": "2.184.1", + "node-opcua-service-call": "2.184.1", + "node-opcua-service-read": "2.184.1", + "node-opcua-service-subscription": "2.184.4", + "node-opcua-service-write": "2.184.1", + "node-opcua-status-code": "2.184.1", + "node-opcua-utils": "2.184.1", + "node-opcua-variant": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-common": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-common/-/node-opcua-common-2.184.1.tgz", + "integrity": "sha512-zATkoGLFg74Fa+Dgv+41Bg107Tq5yQb4w8sVKKCEkAaSZBvW4TcP6MVWaOKp7Tnxm9w4xBNOB8dZ/AdOfYLCrg==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.184.0", + "node-opcua-crypto": "5.10.1", + "node-opcua-status-code": "2.184.1", + "node-opcua-types": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-constants": { + "version": "2.184.0", + "resolved": "https://registry.npmjs.org/node-opcua-constants/-/node-opcua-constants-2.184.0.tgz", + "integrity": "sha512-0Y0YGio7VSBAtzeDOrfesi8s6iXKKFpIL6d7Bpc05HNzmhjy5GRwzYdGs4RmN2//7jQMu4YT7UnsYVjq2ZtRLQ==", + "license": "MIT", + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-crypto": { + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/node-opcua-crypto/-/node-opcua-crypto-5.10.1.tgz", + "integrity": "sha512-cx3PPl90Rxixcx4ONvFp4v7BmIIurXuqibcq5S8xj+AQ5i9EMAkhIw//9i7i5MhM2AuGaxSTIcF+o9zSyrDYvQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.9.4", + "@peculiar/asn1-pfx": "^2.9.4", + "@peculiar/asn1-pkcs8": "^2.9.4", + "@peculiar/asn1-pkcs9": "^2.9.4", + "@peculiar/asn1-rsa": "^2.9.4", + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", + "@peculiar/webcrypto": "^1.7.1", + "@peculiar/x509": "^2.0.0", + "reflect-metadata": "^0.2.2", + "sshpk": "^1.18.0" + }, + "peerDependencies": { + "node-opcua-crypto-web": "^5.4.0" + }, + "peerDependenciesMeta": { + "node-opcua-crypto-web": { + "optional": true + } + } + }, + "node_modules/node-opcua-data-access": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-data-access/-/node-opcua-data-access-2.184.1.tgz", + "integrity": "sha512-Kq+V0ukGeEPTeCn8nhpnWXxODcu6mBMAU/WgTVKXkHREvINY0gDKvFTbPNY/FoaMdDyfHpCsRTrW2tLAh62WZQ==", + "license": "MIT", + "dependencies": { + "node-opcua-data-model": "2.184.1", + "node-opcua-types": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-data-model": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-data-model/-/node-opcua-data-model-2.184.1.tgz", + "integrity": "sha512-YbmF0WsNsomtaB7lxYZo/k0n9zFhIPYMR8ggdU2NqG8Y+O34oaQDrrupJ+kKwYX2jg42ZMnEW+4E1e6A+F3ieg==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.184.0", + "node-opcua-basic-types": "2.184.1", + "node-opcua-binary-stream": "2.184.1", + "node-opcua-enum": "2.184.1", + "node-opcua-factory": "2.184.1", + "node-opcua-nodeid": "2.184.1", + "node-opcua-status-code": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-data-value": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-data-value/-/node-opcua-data-value-2.184.1.tgz", + "integrity": "sha512-duBZ96ZOPm36ZORBWL6QatJs+NqyGxi+yuSqCrEcOukccbKzio9nsMw+BgE0AL2scIOqjLFC754308qXMQ8e/g==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.184.0", + "node-opcua-basic-types": "2.184.1", + "node-opcua-binary-stream": "2.184.1", + "node-opcua-data-model": "2.184.1", + "node-opcua-date-time": "2.184.1", + "node-opcua-debug": "2.184.0", + "node-opcua-enum": "2.184.1", + "node-opcua-factory": "2.184.1", + "node-opcua-numeric-range": "2.184.1", + "node-opcua-status-code": "2.184.1", + "node-opcua-variant": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-date-time": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-date-time/-/node-opcua-date-time-2.184.1.tgz", + "integrity": "sha512-ISu7jSXhDhb6luyaIQSy7MYGW7yxjWxtLtVfUpdoO3VGFcQ8HBnJ1UTBmN3tTNqgvdRSqwOdo4jkKG1Wc9g84Q==", + "license": "MIT", + "dependencies": { + "long": "5.3.2", + "node-opcua-assert": "2.184.0", + "node-opcua-binary-stream": "2.184.1", + "node-opcua-utils": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-debug": { + "version": "2.184.0", + "resolved": "https://registry.npmjs.org/node-opcua-debug/-/node-opcua-debug-2.184.0.tgz", + "integrity": "sha512-a0Z9ciB253aHVfTw+9F3WRAb5ClA0mleuNH3AoPqOlTuoTSQmy0ZM/Gp8XFXBspz0bCnh49fPM63lZCbPTONUg==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "hexy": "0.4.0", + "node-opcua-assert": "2.184.0" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-enum": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-enum/-/node-opcua-enum-2.184.1.tgz", + "integrity": "sha512-Z4tABu25RVBnDn7ndDH8HQPjReBoV7TaUnuoWajnB8Uc/e7NH7x+QliwkhHALcwDBEZW0H4Y8s3FE7nNCh/qvA==", + "license": "MIT", + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-extension-object": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-extension-object/-/node-opcua-extension-object-2.184.1.tgz", + "integrity": "sha512-qnMZ/ZecCU38+a4nktXnPfjb6njzY29ZoRl/boZaNo287woXTiHHNZVCWfnwhwup3HjA/6WzWmzyNrL1V2QwCQ==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-basic-types": "2.184.1", + "node-opcua-binary-stream": "2.184.1", + "node-opcua-debug": "2.184.0", + "node-opcua-factory": "2.184.1", + "node-opcua-nodeid": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-factory": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-factory/-/node-opcua-factory-2.184.1.tgz", + "integrity": "sha512-2/ULSnRUUG9+pEdv2VM420btPs1/A6evoJXRVkKyHXj42B6TaowGBU+mDVX3t1N/OjcUWBUWl/zw2yesYEqHnA==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.184.0", + "node-opcua-basic-types": "2.184.1", + "node-opcua-binary-stream": "2.184.1", + "node-opcua-constants": "2.184.0", + "node-opcua-debug": "2.184.0", + "node-opcua-enum": "2.184.1", + "node-opcua-guid": "2.184.0", + "node-opcua-nodeid": "2.184.1", + "node-opcua-status-code": "2.184.1", + "node-opcua-utils": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-guid": { + "version": "2.184.0", + "resolved": "https://registry.npmjs.org/node-opcua-guid/-/node-opcua-guid-2.184.0.tgz", + "integrity": "sha512-g5umlVt7MALZdvBNE0dK6uPlXsjhdLRrJRpT8hqMw847nuMfBIkdLKpccoz8fH61s3KOF8UOmHZTpTVHXSmNgw==", + "license": "MIT", + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-hostname": { + "version": "2.184.0", + "resolved": "https://registry.npmjs.org/node-opcua-hostname/-/node-opcua-hostname-2.184.0.tgz", + "integrity": "sha512-PZr7a1ZbUtZlj8ywVIjjhT5MDlcVL1RONWHZh6CdChUBAVdJdLip6lnuDktu5EyLNH+f/6RE4pOf3Fw0L499mA==", + "license": "MIT", + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-json": { + "version": "2.184.4", + "resolved": "https://registry.npmjs.org/node-opcua-json/-/node-opcua-json-2.184.4.tgz", + "integrity": "sha512-AiCgEi/AVUn4k3LbJQTV2Kc4BOIhhl8/dtVfZdrSnBVh3Z+u1dfKh41xL60iLwdGJn+TKAAdh/IBRKazL0TfJA==", + "license": "MIT", + "dependencies": { + "node-opcua-basic-types": "2.184.1", + "node-opcua-data-model": "2.184.1", + "node-opcua-data-value": "2.184.1", + "node-opcua-date-time": "2.184.1", + "node-opcua-debug": "2.184.0", + "node-opcua-extension-object": "2.184.1", + "node-opcua-factory": "2.184.1", + "node-opcua-nodeid": "2.184.1", + "node-opcua-numeric-range": "2.184.1", + "node-opcua-status-code": "2.184.1", + "node-opcua-types": "2.184.1", + "node-opcua-variant": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-nodeid": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-nodeid/-/node-opcua-nodeid-2.184.1.tgz", + "integrity": "sha512-emKXZQiKpXb4GuJuhGYyuW+oh1adCdnSjLudsxyho9mUQm4+bhr3hPLVasSXuPAoRYyVezCDFluKFMvz0KcSvA==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.184.0", + "node-opcua-constants": "2.184.0", + "node-opcua-guid": "2.184.0" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-nodeset-ua": { + "version": "2.184.3", + "resolved": "https://registry.npmjs.org/node-opcua-nodeset-ua/-/node-opcua-nodeset-ua-2.184.3.tgz", + "integrity": "sha512-N/M0U0pZMXhVFitov9yTl00uUsTWTEEK6LpbIACJmxQW3qhN4Ke7aodjDWLN3qUW2QpSVLfiCG+ukTWTmPaFIw==", + "license": "MIT", + "dependencies": { + "node-opcua-address-space-base": "2.184.3", + "node-opcua-basic-types": "2.184.1", + "node-opcua-data-access": "2.184.1", + "node-opcua-data-model": "2.184.1", + "node-opcua-data-value": "2.184.1", + "node-opcua-extension-object": "2.184.1", + "node-opcua-nodeid": "2.184.1", + "node-opcua-status-code": "2.184.1", + "node-opcua-variant": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-nodesets": { + "version": "2.184.0", + "resolved": "https://registry.npmjs.org/node-opcua-nodesets/-/node-opcua-nodesets-2.184.0.tgz", + "integrity": "sha512-ZDNHNQiJy9CueIkvAVtFJ6rKc/RDecnnAdDv7A/7/8biUzoA7nUDkrtpmCI0lNXXHOpIBcJq+FeGsMJ7fqdLFQ==", + "license": "MIT", + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-numeric-range": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-numeric-range/-/node-opcua-numeric-range-2.184.1.tgz", + "integrity": "sha512-NWszS9LntvZ17qn+IUvM0hlU1X4hhFImbNYTOiq1e7Yj+51CqP0NxbEOoLKHFIPCnQT/NG0OkeEsvDhXLWybyA==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.184.0", + "node-opcua-basic-types": "2.184.1", + "node-opcua-binary-stream": "2.184.1", + "node-opcua-factory": "2.184.1", + "node-opcua-status-code": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-object-registry": { + "version": "2.184.0", + "resolved": "https://registry.npmjs.org/node-opcua-object-registry/-/node-opcua-object-registry-2.184.0.tgz", + "integrity": "sha512-Ag1mQqCNKPN2vvmzWRL5d32g7Qz2BjQotIz3r9nw3n+NSh14iiBdeANA4ngHbm0HOk1yidT22s4KlDTLy53u4A==", + "license": "MIT", + "dependencies": { + "node-opcua-debug": "2.184.0" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-packet-analyzer": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-packet-analyzer/-/node-opcua-packet-analyzer-2.184.1.tgz", + "integrity": "sha512-NowWd/HPQxC8WtAHS52lo/jLvwSh0PhIY1r6zlU2PzNtLDHwjYmqdy20M68npXNCHtmV0GO57pv2k2nsjQMCLg==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.184.0", + "node-opcua-basic-types": "2.184.1", + "node-opcua-binary-stream": "2.184.1", + "node-opcua-debug": "2.184.0", + "node-opcua-factory": "2.184.1", + "node-opcua-utils": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-packet-assembler": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-packet-assembler/-/node-opcua-packet-assembler-2.184.1.tgz", + "integrity": "sha512-rK9ngcKVtJF4KoMDzoV9j5s2jdGO/L/KpElFiW0Fj1fgk8C9x3dnJl/d4jvGYAyrhKiysuN4++QFP/xLd3dUSQ==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.184.0", + "node-opcua-debug": "2.184.0" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-pki": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/node-opcua-pki/-/node-opcua-pki-6.22.0.tgz", + "integrity": "sha512-Fp4DcEzhs1oL4pni5oLcy3DaT0xRKqAfwuAl36sg2BE5IHs/TVqtdqpXnb191F9EzDhwPmNtj7dHl3D1U20kHQ==", + "license": "MIT", + "dependencies": { + "@ster5/global-mutex": "^3.3.0", + "byline": "^5.0.0", + "chalk": "4.1.2", + "chokidar": "4.0.3", + "command-line-args": "^6.0.2", + "command-line-usage": "^7.0.4", + "node-opcua-crypto": "5.10.1", + "yauzl": "^3.4.0" + }, + "bin": { + "node-opcua-pki": "dist/bin/pki.mjs", + "pki": "dist/bin/pki.mjs" + } + }, + "node_modules/node-opcua-pseudo-session": { + "version": "2.184.4", + "resolved": "https://registry.npmjs.org/node-opcua-pseudo-session/-/node-opcua-pseudo-session-2.184.4.tgz", + "integrity": "sha512-IbXxHr5aJFzc278+5l9zgIQzBGkcckvYhKHVhaGSnlZsgNI3vNTXiXwF48Rjv1ke/0Q5MhcYj/fQunCiGio32A==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.184.0", + "node-opcua-basic-types": "2.184.1", + "node-opcua-constants": "2.184.0", + "node-opcua-crypto": "5.10.1", + "node-opcua-data-model": "2.184.1", + "node-opcua-data-value": "2.184.1", + "node-opcua-debug": "2.184.0", + "node-opcua-nodeid": "2.184.1", + "node-opcua-service-browse": "2.184.1", + "node-opcua-service-call": "2.184.1", + "node-opcua-service-read": "2.184.1", + "node-opcua-service-subscription": "2.184.4", + "node-opcua-service-translate-browse-path": "2.184.1", + "node-opcua-service-write": "2.184.1", + "node-opcua-status-code": "2.184.1", + "node-opcua-types": "2.184.1", + "node-opcua-utils": "2.184.1", + "node-opcua-variant": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-schemas": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-schemas/-/node-opcua-schemas-2.184.1.tgz", + "integrity": "sha512-5ytjNI05jO/2mz2hjEQ7Y7evkGWkwxlqVRhaj2D/iPGYqx0bYvd954YOtZacvfUhQ+M4D7AnpnKxl5VOnRMQlA==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.184.0", + "node-opcua-binary-stream": "2.184.1", + "node-opcua-debug": "2.184.0", + "node-opcua-extension-object": "2.184.1", + "node-opcua-factory": "2.184.1", + "node-opcua-nodeid": "2.184.1", + "node-opcua-variant": "2.184.1", + "node-opcua-xml2json": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-secure-channel": { + "version": "2.184.4", + "resolved": "https://registry.npmjs.org/node-opcua-secure-channel/-/node-opcua-secure-channel-2.184.4.tgz", + "integrity": "sha512-TSqiEA4RUun3ViRzaLBENR4jtukubm78fA1QR2j3+hLKchaJlVJbNS82Ot+GNKKveP3m64acjBO0iWGXQ8G/dg==", + "license": "MIT", + "dependencies": { + "backoff": "^2.5.0", + "chalk": "4.1.2", + "node-opcua-assert": "2.184.0", + "node-opcua-basic-types": "2.184.1", + "node-opcua-binary-stream": "2.184.1", + "node-opcua-chunkmanager": "2.184.1", + "node-opcua-common": "2.184.1", + "node-opcua-crypto": "5.10.1", + "node-opcua-debug": "2.184.0", + "node-opcua-factory": "2.184.1", + "node-opcua-nodeid": "2.184.1", + "node-opcua-object-registry": "2.184.0", + "node-opcua-packet-analyzer": "2.184.1", + "node-opcua-packet-assembler": "2.184.1", + "node-opcua-service-endpoints": "2.184.1", + "node-opcua-service-secure-channel": "2.184.1", + "node-opcua-status-code": "2.184.1", + "node-opcua-transport": "2.184.1", + "node-opcua-types": "2.184.1", + "node-opcua-utils": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-server": { + "version": "2.184.4", + "resolved": "https://registry.npmjs.org/node-opcua-server/-/node-opcua-server-2.184.4.tgz", + "integrity": "sha512-C0FufxblYuLQd+++Pe9MZILRaAo22YHdvaly48lAHJcJt+XeV+9zTwcSNezppf/u1pSmCEfWZViy/xQkEk/MMQ==", + "license": "MIT", + "dependencies": { + "@ster5/global-mutex": "^3.3.0", + "chalk": "4.1.2", + "dequeue": "^1.0.5", + "lodash.partition": "^4.6.0", + "lodash.sortby": "^4.7.0", + "node-opcua-address-space": "2.184.4", + "node-opcua-address-space-base": "2.184.3", + "node-opcua-assert": "2.184.0", + "node-opcua-basic-types": "2.184.1", + "node-opcua-binary-stream": "2.184.1", + "node-opcua-certificate-manager": "2.184.1", + "node-opcua-client": "2.184.4", + "node-opcua-common": "2.184.1", + "node-opcua-constants": "2.184.0", + "node-opcua-crypto": "5.10.1", + "node-opcua-data-model": "2.184.1", + "node-opcua-data-value": "2.184.1", + "node-opcua-date-time": "2.184.1", + "node-opcua-debug": "2.184.0", + "node-opcua-extension-object": "2.184.1", + "node-opcua-factory": "2.184.1", + "node-opcua-hostname": "2.184.0", + "node-opcua-nodeid": "2.184.1", + "node-opcua-nodesets": "2.184.0", + "node-opcua-numeric-range": "2.184.1", + "node-opcua-object-registry": "2.184.0", + "node-opcua-pki": "6.22.0", + "node-opcua-secure-channel": "2.184.4", + "node-opcua-service-browse": "2.184.1", + "node-opcua-service-call": "2.184.1", + "node-opcua-service-discovery": "2.184.1", + "node-opcua-service-endpoints": "2.184.1", + "node-opcua-service-filter": "2.184.3", + "node-opcua-service-history": "2.184.1", + "node-opcua-service-node-management": "2.184.1", + "node-opcua-service-query": "2.184.1", + "node-opcua-service-read": "2.184.1", + "node-opcua-service-register-node": "2.184.1", + "node-opcua-service-secure-channel": "2.184.1", + "node-opcua-service-session": "2.184.1", + "node-opcua-service-subscription": "2.184.4", + "node-opcua-service-translate-browse-path": "2.184.1", + "node-opcua-service-write": "2.184.1", + "node-opcua-status-code": "2.184.1", + "node-opcua-transport": "2.184.1", + "node-opcua-types": "2.184.1", + "node-opcua-uanodeset-json": "2.184.4", + "node-opcua-utils": "2.184.1", + "node-opcua-variant": "2.184.1", + "thenify-ex": "4.4.0" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-server-discovery": { + "version": "2.184.4", + "resolved": "https://registry.npmjs.org/node-opcua-server-discovery/-/node-opcua-server-discovery-2.184.4.tgz", + "integrity": "sha512-ufJ3mxuRPQxWSM/FfHpl0CiMlTwAa06ldo59GnfxLFl25IDP+Nl03PAkUIBsOBnfAIqnVp6oQTcTzVrdrnyWVQ==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "env-paths": "2.2.1", + "node-opcua-assert": "2.184.0", + "node-opcua-basic-types": "2.184.1", + "node-opcua-certificate-manager": "2.184.1", + "node-opcua-common": "2.184.1", + "node-opcua-crypto": "5.10.1", + "node-opcua-debug": "2.184.0", + "node-opcua-object-registry": "2.184.0", + "node-opcua-secure-channel": "2.184.4", + "node-opcua-server": "2.184.4", + "node-opcua-service-discovery": "2.184.1", + "node-opcua-service-endpoints": "2.184.1", + "node-opcua-status-code": "2.184.1", + "sterfive-bonjour-service": "1.1.4", + "thenify-ex": "4.4.0" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-service-browse": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-service-browse/-/node-opcua-service-browse-2.184.1.tgz", + "integrity": "sha512-VUFvaBBvT9B+pv4Xe4LjFffAMl2jgbwJjYpzBfUbQj0FKSKCg86P/ccb9SsnYcy9MNj6bOF2XQGwv2HxgYzeLg==", + "license": "MIT", + "dependencies": { + "node-opcua-data-model": "2.184.1", + "node-opcua-types": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-service-call": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-service-call/-/node-opcua-service-call-2.184.1.tgz", + "integrity": "sha512-7ipFqn61O14ID9VyN08gn1fYLZuXYQA5Gt4oe8yncJ8fgP1QScFzDckGl3DVwvPWUjI0PdMhSiYwTyuu+OFnaw==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.184.0", + "node-opcua-nodeid": "2.184.1", + "node-opcua-types": "2.184.1", + "node-opcua-variant": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-service-discovery": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-service-discovery/-/node-opcua-service-discovery-2.184.1.tgz", + "integrity": "sha512-1zzM/XlvCxiWSVP93r7MrtkPVbaBRwWOMlAiQvnFHFcWP+OK3RNLImcpOBVSdJQDkaGxoi/tEMGH+HqtGWgPbw==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.184.0", + "node-opcua-debug": "2.184.0", + "node-opcua-object-registry": "2.184.0", + "node-opcua-types": "2.184.1", + "sterfive-bonjour-service": "1.1.4" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-service-endpoints": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-service-endpoints/-/node-opcua-service-endpoints-2.184.1.tgz", + "integrity": "sha512-wqhrjvZXn5BynvalEGmx9ANSvPP2qsPxaP5Z4CG2TqtvZUexD2zixTh3/HlF7tHsIQOmjSQfjnWCXQHGdUEV/g==", + "license": "MIT", + "dependencies": { + "node-opcua-types": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-service-filter": { + "version": "2.184.3", + "resolved": "https://registry.npmjs.org/node-opcua-service-filter/-/node-opcua-service-filter-2.184.3.tgz", + "integrity": "sha512-yGacd9mD4HCSMiIYR7XsCSDZDL9/7P0/sa2CvTiVYPSgDha1pNO2cHOu0em4a5sW4ejg8PSjkV6TKWAJy59nDw==", + "license": "MIT", + "dependencies": { + "node-opcua-address-space-base": "2.184.3", + "node-opcua-assert": "2.184.0", + "node-opcua-basic-types": "2.184.1", + "node-opcua-constants": "2.184.0", + "node-opcua-data-model": "2.184.1", + "node-opcua-data-value": "2.184.1", + "node-opcua-debug": "2.184.0", + "node-opcua-extension-object": "2.184.1", + "node-opcua-nodeid": "2.184.1", + "node-opcua-service-translate-browse-path": "2.184.1", + "node-opcua-status-code": "2.184.1", + "node-opcua-types": "2.184.1", + "node-opcua-variant": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-service-history": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-service-history/-/node-opcua-service-history-2.184.1.tgz", + "integrity": "sha512-qrG0OWPO2HaqMTxt5BAtQo6aJ8hPmTxrXxCifLUXWzYTk6OzRsEMqoYTw9iEz7DgiO9mxgbZL/1+dlvEW2EhdQ==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.184.0", + "node-opcua-data-value": "2.184.1", + "node-opcua-types": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-service-node-management": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-service-node-management/-/node-opcua-service-node-management-2.184.1.tgz", + "integrity": "sha512-brQBlH2P8+nOSVVYplAZcwPKazdLV73RyvBrS9HlhJkksGyUyG2GrrqwJvDFilDEFiRyTFoIeiocWNPyoPl1kg==", + "license": "MIT", + "dependencies": { + "node-opcua-types": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-service-query": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-service-query/-/node-opcua-service-query-2.184.1.tgz", + "integrity": "sha512-V9R3JBW2UilgwT5JHKJu+6QF+x0UqcojgndFp4U3f0Ufr26yjRB5Yl3Jl388dgethm9EFekWPDDfqUTthMnDaQ==", + "license": "MIT", + "dependencies": { + "node-opcua-types": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-service-read": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-service-read/-/node-opcua-service-read-2.184.1.tgz", + "integrity": "sha512-eLPzz49r9RePC8bYPh4usj6uAl/SfnNKyjW7xzgnkznAQlE2RBpRwLWsUEgN5KkfCgZsrZuMMTzTmxNGIVgR8A==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.184.0", + "node-opcua-data-model": "2.184.1", + "node-opcua-data-value": "2.184.1", + "node-opcua-service-secure-channel": "2.184.1", + "node-opcua-types": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-service-register-node": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-service-register-node/-/node-opcua-service-register-node-2.184.1.tgz", + "integrity": "sha512-RI7us49/ZWixUpiQnVllj7xJIyGSSaHmDgFN2nqB30k/lWzCesco7iHwc98zf8ZjwcA6mqOKCVdsFbAB4NDejw==", + "license": "MIT", + "dependencies": { + "node-opcua-types": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-service-secure-channel": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-service-secure-channel/-/node-opcua-service-secure-channel-2.184.1.tgz", + "integrity": "sha512-iSumNHcLeJ5SM2AXLYRtjohSSKZBLwaCRBFExF4V3HrVt58Y5/5WNuOSiwcJ9QXpZDOj+TsuDm00iAFYiFc5eA==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.184.0", + "node-opcua-basic-types": "2.184.1", + "node-opcua-binary-stream": "2.184.1", + "node-opcua-factory": "2.184.1", + "node-opcua-types": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-service-session": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-service-session/-/node-opcua-service-session-2.184.1.tgz", + "integrity": "sha512-Pq3jcEWEx4fYTr2i2lDxKbgLOqq9KFgso7cx3SHfOjXS6nAS6/JzWx55UWlHyweGsY/lDaiVSJFmY07P8WtjRg==", + "license": "MIT", + "dependencies": { + "node-opcua-factory": "2.184.1", + "node-opcua-types": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-service-subscription": { + "version": "2.184.4", + "resolved": "https://registry.npmjs.org/node-opcua-service-subscription/-/node-opcua-service-subscription-2.184.4.tgz", + "integrity": "sha512-/R79OT/v5Se5szl3RUVDtLXNRv97f8TDm9txX3ZnNJB+nHlzJapUsyoPu+m7TFYQ4cuwkKHlrvrcPaGZBPqDwg==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.184.0", + "node-opcua-types": "2.184.1", + "node-opcua-variant": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-service-translate-browse-path": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-service-translate-browse-path/-/node-opcua-service-translate-browse-path-2.184.1.tgz", + "integrity": "sha512-bTpEQp3RCDfuorX0/ri7A9BL3wR+yK2ST1wENt+Vt1XNOI6N/fzfcauU1WH48NTEk4Qxwd7OI6man9N12leTGQ==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.184.0", + "node-opcua-constants": "2.184.0", + "node-opcua-data-model": "2.184.1", + "node-opcua-nodeid": "2.184.1", + "node-opcua-types": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-service-write": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-service-write/-/node-opcua-service-write-2.184.1.tgz", + "integrity": "sha512-YA5y0t1qLCMS+0Jz3Vx1O25h59iTw5I2HCZYYWs1Aoc+CiD5TWdSP8ZbljUVSIx67C8pmyT/z+ufi7uOCWdAyA==", + "license": "MIT", + "dependencies": { + "node-opcua-types": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-status-code": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-status-code/-/node-opcua-status-code-2.184.1.tgz", + "integrity": "sha512-x7Dhr4oo/vDRoyh1u5xM00wziXaP+rHj30aN9xLcKTLgqkqZ1CifenA2D94YLCgS0H1m3NDVNjBpyufFz7yTsQ==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.184.0", + "node-opcua-binary-stream": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-transport": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-transport/-/node-opcua-transport-2.184.1.tgz", + "integrity": "sha512-DSOOYGIqb5E6FuUjkMMIIDQo4BMuhRjB4OFGV5TQfKp3IM8R4OUEqAoDvrw/HfELZfNzA91qzQt9E/WHYK05vg==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.184.0", + "node-opcua-basic-types": "2.184.1", + "node-opcua-binary-stream": "2.184.1", + "node-opcua-buffer-utils": "2.184.1", + "node-opcua-chunkmanager": "2.184.1", + "node-opcua-debug": "2.184.0", + "node-opcua-factory": "2.184.1", + "node-opcua-object-registry": "2.184.0", + "node-opcua-packet-assembler": "2.184.1", + "node-opcua-status-code": "2.184.1", + "node-opcua-utils": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-types": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-types/-/node-opcua-types-2.184.1.tgz", + "integrity": "sha512-l/lYr1ciz8r6peQ0bomCblUSDfTDj2AtKEV1GjsyGvCUqY64AZDhQsCCUV1ZXlLwqDuWbDnutIA29WvqCnJiig==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.184.0", + "node-opcua-basic-types": "2.184.1", + "node-opcua-binary-stream": "2.184.1", + "node-opcua-data-model": "2.184.1", + "node-opcua-data-value": "2.184.1", + "node-opcua-enum": "2.184.1", + "node-opcua-extension-object": "2.184.1", + "node-opcua-factory": "2.184.1", + "node-opcua-nodeid": "2.184.1", + "node-opcua-numeric-range": "2.184.1", + "node-opcua-status-code": "2.184.1", + "node-opcua-variant": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-uanodeset-json": { + "version": "2.184.4", + "resolved": "https://registry.npmjs.org/node-opcua-uanodeset-json/-/node-opcua-uanodeset-json-2.184.4.tgz", + "integrity": "sha512-PX5xtTgRiZ3eddmNoJbyYTDn1q1t0SoGePOxyNYlhqcscp2KnnV8oo3HphkWJceoCfZR+5EXI9vuZpeD9hi6jw==", + "license": "MIT", + "dependencies": { + "node-opcua-address-space": "2.184.4", + "node-opcua-basic-types": "2.184.1", + "node-opcua-data-model": "2.184.1", + "node-opcua-date-time": "2.184.1", + "node-opcua-extension-object": "2.184.1", + "node-opcua-factory": "2.184.1", + "node-opcua-json": "2.184.4", + "node-opcua-nodeid": "2.184.1", + "node-opcua-variant": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-utils": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-utils/-/node-opcua-utils-2.184.1.tgz", + "integrity": "sha512-UnVAOVuiXk1Vv82mTJHyt0LbNBn8/wYIwqFizwIc/nXH+pBW5q9Nu2mw+iUoq1Sl0tWs7C4RF5qlZ1Hsukxb7g==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.184.0" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-variant": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-variant/-/node-opcua-variant-2.184.1.tgz", + "integrity": "sha512-1M7vLybHI/HxxgQWPtswFUi0Y1Js63mn6FfNR0giBIxSkOZDpt/QfHGbh/v7/hdVX3H5syuKKBVpr9zO1jYzcQ==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.184.0", + "node-opcua-basic-types": "2.184.1", + "node-opcua-binary-stream": "2.184.1", + "node-opcua-data-model": "2.184.1", + "node-opcua-debug": "2.184.0", + "node-opcua-enum": "2.184.1", + "node-opcua-factory": "2.184.1", + "node-opcua-nodeid": "2.184.1", + "node-opcua-utils": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-vendor-diagnostic": { + "version": "2.184.4", + "resolved": "https://registry.npmjs.org/node-opcua-vendor-diagnostic/-/node-opcua-vendor-diagnostic-2.184.4.tgz", + "integrity": "sha512-e8URsIxS8ef+usvJ2xgtlX1aUGV1jhd7rA/68HUYtwCt+2VY3bMSPPVnHsVJDDgkR+pUaf+RviNguMgSlfgzeQ==", + "license": "MIT", + "dependencies": { + "humanize": "0.0.9", + "node-opcua-address-space": "2.184.4", + "node-opcua-assert": "2.184.0", + "node-opcua-constants": "2.184.0", + "node-opcua-debug": "2.184.0", + "node-opcua-server": "2.184.4", + "node-opcua-status-code": "2.184.1", + "node-opcua-variant": "2.184.1" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/node-opcua-xml2json": { + "version": "2.184.1", + "resolved": "https://registry.npmjs.org/node-opcua-xml2json/-/node-opcua-xml2json-2.184.1.tgz", + "integrity": "sha512-qqDEo5hcrSPbGiA6tztvCwcbVPjj1jgwbnvNI2KeB7Mr0AU295ej1cxEwHVrI1u8+fMVP0UX2fJSciwlnVRh5Q==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.184.0", + "node-opcua-utils": "2.184.1", + "xml-writer": "^1.7.0" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, + "node_modules/precond": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", + "integrity": "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.2.0.tgz", + "integrity": "sha512-BbubeCEyTuQjVMakvJQ/Sxbc93F2pwmbsxONT/ZRrwU7Ua38d8unYTwXpTVLAKJ4BDuH9IGztCjQcd/N/39Dvg==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sql-escaper": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/sql-escaper/-/sql-escaper-1.5.2.tgz", + "integrity": "sha512-6CKD38c31SENivxOADeMNLdukOnUxUcflKtzVWzace7Riv1v7cAEym5Cx9Q7gYZ3ezIJI7ZpqecQq8cqNeSSFg==", + "license": "MIT", + "engines": { + "bun": ">=1.0.0", + "deno": ">=2.0.0", + "node": ">=12.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/mysqljs/sql-escaper?sponsor=1" + } + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sterfive-bonjour-service": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sterfive-bonjour-service/-/sterfive-bonjour-service-1.1.4.tgz", + "integrity": "sha512-QqDpnBb3KLD6ytdY2KSxsynw1jJAvzfOloQt83GQNXO6CGf84ZY+37tpOEZo1FzgUkFiVsL7pYyg71olDppI/w==", + "license": "MIT", + "dependencies": { + "@types/multicast-dns": "^7.2.1", + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.4" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table-layout": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-4.1.1.tgz", + "integrity": "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==", + "license": "MIT", + "dependencies": { + "array-back": "^6.2.2", + "wordwrapjs": "^5.1.0" + }, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/thenify-ex": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/thenify-ex/-/thenify-ex-4.4.0.tgz", + "integrity": "sha512-YHA/2DlY1vWpqGLCc7BzdT9aTrqyHCbsX5J3zbW68LLeD4RPwd+2tMEWshMP+27ikuTnaeKbFDmjqc7fKWmDew==", + "license": "MIT" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsyringe": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", + "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", + "license": "MIT", + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/tsyringe/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "license": "Unlicense" + }, + "node_modules/typical": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz", + "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==", + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/underscore": { + "version": "1.13.8", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", + "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/webcrypto-core": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.9.2.tgz", + "integrity": "sha512-gsXecm82UQNlTBURJGuqOWy1Ww08S3kZUcr3aOJS02Pk0xLtkfeUAVC0u0xhgdonFme80edSJUIJyuvL/7250Q==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/json-schema": "^1.1.12", + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/wordwrapjs": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.1.tgz", + "integrity": "sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg==", + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/xml-writer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/xml-writer/-/xml-writer-1.7.0.tgz", + "integrity": "sha512-elFVMRiV5jb59fbc87zzVa0C01QLBEWP909mRuWqFqrYC5wNTH5QW4AaKMNv7d6zAsuOulkD7wnztZNLQW0Nfg==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/yauzl": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.4.0.tgz", + "integrity": "sha512-jIH9yLR9wqr0wOS0TpBvo/g/2UgZH5qePVbjgRliiF0BYvOZyaBknKsF+x9Iht0O6sqgnB93rCICdOZFecJuDw==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + }, + "engines": { + "node": ">=12" + } + } + } +} diff --git a/collector/package.json b/collector/package.json index 7f7f871..0f2a775 100644 --- a/collector/package.json +++ b/collector/package.json @@ -1,15 +1,19 @@ { - "name": "seltd-collector", - "version": "1.0.0", - "private": true, - "type": "module", - "scripts": { - "start": "node src/index.js" - }, - "dependencies": { - "mysql2": "^3.12.0", - "node-opcua": "latest", - "node-bacnet": "latest", - "knx": "latest" - } + "name": "seltd-collector", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "start": "node src/index.js", + "check": "node --check src/index.js" + }, + "dependencies": { + "mysql2": "^3.12.0", + "node-opcua": "2.184.4", + "node-bacnet": "0.2.4", + "knx": "2.5.4" + }, + "overrides": { + "binary-parser": "2.3.0" + } } diff --git a/collector/src/index.js b/collector/src/index.js index d9705a5..f26d2f1 100644 --- a/collector/src/index.js +++ b/collector/src/index.js @@ -1,5 +1,5 @@ import { createServer } from "node:http"; -import { mkdirSync, readFileSync, writeFileSync, existsSync } from "node:fs"; +import { mkdirSync, readFileSync, writeFileSync, renameSync, unlinkSync, existsSync } from "node:fs"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; import { Buffer } from "node:buffer"; @@ -15,6 +15,7 @@ const bacnetCollectorUrl = String(process.env.BACNET_COLLECTOR_URL || "").replac const LOCAL_POINT_LIMIT = 2000; let transactionId = 1; let polling = false; +let lastKnownGoodStore = null; const db = mysql.createPool({ host: process.env.DB_HOST || "localhost", @@ -38,27 +39,41 @@ function baseStore() { }; } +function normalizeStore(parsed) { + return { + ...baseStore(), + ...parsed, + scans: { ...baseStore().scans, ...(parsed.scans || {}) }, + sources: Array.isArray(parsed.sources) ? parsed.sources : [], + datapoints: Array.isArray(parsed.datapoints) ? parsed.datapoints : [], + }; +} + function readStore() { if (!existsSync(storeFile)) { - return baseStore(); + return structuredClone(lastKnownGoodStore || baseStore()); } try { - const parsed = JSON.parse(readFileSync(storeFile, "utf8")); - return { - ...baseStore(), - ...parsed, - scans: { ...baseStore().scans, ...(parsed.scans || {}) }, - sources: Array.isArray(parsed.sources) ? parsed.sources : [], - datapoints: Array.isArray(parsed.datapoints) ? parsed.datapoints : [], - }; - } catch { - return baseStore(); + const store = normalizeStore(JSON.parse(readFileSync(storeFile, "utf8"))); + lastKnownGoodStore = store; + return structuredClone(store); + } catch (error) { + console.warn("Quellenkonfiguration konnte nicht gelesen werden, letzter gültiger Stand wird verwendet:", error.message); + return structuredClone(lastKnownGoodStore || baseStore()); } } function writeStore(payload) { - writeFileSync(storeFile, JSON.stringify(payload, null, 2), "utf8"); + const temporaryFile = `${storeFile}.${process.pid}.${Date.now()}.tmp`; + try { + writeFileSync(temporaryFile, JSON.stringify(payload, null, 2), "utf8"); + renameSync(temporaryFile, storeFile); + lastKnownGoodStore = normalizeStore(payload); + } catch (error) { + try { unlinkSync(temporaryFile); } catch {} + throw error; + } } function touchStore(mutator) { diff --git a/docker-compose.yml b/docker-compose.yml index f9bdf59..57ce38d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -24,14 +24,14 @@ services: image: redis:7.4-alpine container_name: seltd-redis restart: unless-stopped - command: ["redis-server", "/usr/local/etc/redis/redis.conf"] - ports: - - "6379:6379" + environment: + REDIS_PASSWORD: ${REDIS_PASSWORD:?Set REDIS_PASSWORD in .env} + command: ["sh", "-c", "exec redis-server /usr/local/etc/redis/redis.conf --requirepass \"$$REDIS_PASSWORD\""] volumes: - redis_data:/data - ./docker/redis/redis.conf:/usr/local/etc/redis/redis.conf:ro healthcheck: - test: ["CMD", "redis-cli", "ping"] + test: ["CMD-SHELL", "redis-cli -a \"$$REDIS_PASSWORD\" ping | grep -q PONG"] interval: 10s timeout: 5s retries: 10 @@ -49,7 +49,7 @@ services: DB_USER: root DB_PASSWORD: ${MARIADB_ROOT_PASSWORD:-SE3112} DB_PASSWORD_FALLBACK: ${DB_PASSWORD_FALLBACK:-root} - REDIS_URL: redis://redis:6379 + REDIS_URL: redis://:${REDIS_PASSWORD:?Set REDIS_PASSWORD in .env}@redis:6379/0 JWT_SECRET: ${JWT_SECRET:-change-me} ADMIN_USERNAME: ${ADMIN_USERNAME:-admin} ADMIN_EMAIL: ${ADMIN_EMAIL:-admin@example.com} @@ -63,6 +63,11 @@ services: condition: service_healthy redis: condition: service_healthy + healthcheck: + test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:8080/api/health > /dev/null || exit 1"] + interval: 15s + timeout: 5s + retries: 5 web: build: @@ -74,7 +79,13 @@ services: ports: - "5173:5173" depends_on: - - api + api: + condition: service_healthy + healthcheck: + test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:5173/ > /dev/null || exit 1"] + interval: 15s + timeout: 5s + retries: 5 collector: build: @@ -101,6 +112,11 @@ services: condition: service_healthy bacnet-collector: condition: service_started + healthcheck: + test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:18110/health > /dev/null || exit 1"] + interval: 15s + timeout: 5s + retries: 5 symcon-collector: build: @@ -136,6 +152,11 @@ services: BACNET_BROADCAST_FALLBACKS: ${BACNET_BROADCAST_FALLBACKS:-} BACNET_UNICAST_DELAY_MS: ${BACNET_UNICAST_DELAY_MS:-120} network_mode: "host" + healthcheck: + test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:18111/health > /dev/null || exit 1"] + interval: 15s + timeout: 5s + retries: 5 runner: build: @@ -143,7 +164,7 @@ services: container_name: seltd-runner restart: unless-stopped environment: - REDIS_URL: redis://redis:6379 + REDIS_URL: redis://:${REDIS_PASSWORD:?Set REDIS_PASSWORD in .env}@redis:6379/0 DB_HOST: mariadb DB_PORT: 3306 DB_NAME: wago @@ -197,6 +218,3 @@ volumes: - - - diff --git a/runner/Dockerfile b/runner/Dockerfile index 92231e4..2ae2592 100644 --- a/runner/Dockerfile +++ b/runner/Dockerfile @@ -1,4 +1,4 @@ -FROM node:20-alpine +FROM node:22-alpine WORKDIR /app COPY package*.json ./ RUN npm install diff --git a/runner/package.json b/runner/package.json index e286053..98e6f96 100644 --- a/runner/package.json +++ b/runner/package.json @@ -1,13 +1,14 @@ -{ +{ "name": "seltd-runner", "version": "1.0.0", "private": true, "type": "module", "scripts": { - "start": "node src/index.js" + "start": "node src/index.js", + "check": "node --check src/index.js" }, "dependencies": { "ioredis": "^5.6.1", "mysql2": "^3.12.0" } -} +} \ No newline at end of file diff --git a/symcon-collector/Dockerfile b/symcon-collector/Dockerfile index da6fccf..be47e12 100644 --- a/symcon-collector/Dockerfile +++ b/symcon-collector/Dockerfile @@ -1,4 +1,4 @@ -FROM node:20-alpine +FROM node:22-alpine WORKDIR /app @@ -7,4 +7,4 @@ RUN npm install COPY src ./src -CMD ["npm", "start"] \ No newline at end of file +CMD ["npm", "start"] diff --git a/symcon-collector/package.json b/symcon-collector/package.json index 0010238..57e2aad 100644 --- a/symcon-collector/package.json +++ b/symcon-collector/package.json @@ -4,7 +4,8 @@ "private": true, "type": "module", "scripts": { - "start": "node src/index.js" + "start": "node src/index.js", + "check": "node --check src/index.js" }, "dependencies": { "mysql2": "^3.12.0" diff --git a/symcon-collector/src/index.js b/symcon-collector/src/index.js index caec383..c9fcdb1 100644 --- a/symcon-collector/src/index.js +++ b/symcon-collector/src/index.js @@ -7,6 +7,7 @@ const maxConcurrency = Math.max(1, Math.min(16, Number(process.env.SYMCON_MAX_CO const sourcePollState = new Map(); const valueCache = new Map(); let polling = false; +let lastKnownGoodStore = { sources: [], datapoints: [] }; const db = mysql.createPool({ host: process.env.DB_HOST || "mariadb", @@ -67,17 +68,18 @@ async function updateWorkerState(source, status, error = "") { function readStore() { if (!existsSync(sourcesFile)) { - return { sources: [], datapoints: [] }; + return structuredClone(lastKnownGoodStore); } try { const store = JSON.parse(readFileSync(sourcesFile, "utf8")); - return { + lastKnownGoodStore = { sources: Array.isArray(store.sources) ? store.sources : [], datapoints: Array.isArray(store.datapoints) ? store.datapoints : [], }; + return structuredClone(lastKnownGoodStore); } catch (error) { - console.warn("Quellenkonfiguration konnte nicht gelesen werden:", error.message); - return { sources: [], datapoints: [] }; + console.warn("Quellenkonfiguration konnte nicht gelesen werden, letzter gültiger Stand wird verwendet:", error.message); + return structuredClone(lastKnownGoodStore); } } @@ -262,4 +264,4 @@ setInterval(() => pollDueSources().catch((error) => console.error("IP-Symcon Pol ensureWorkerStateTable() .then(() => pollDueSources()) .catch((error) => console.error("IP-Symcon Start-Polling fehlgeschlagen:", error.message)); -console.log(`SE LTD Symcon Collector gestartet (Intervall-Prüfung ${pollTickMs} ms, Parallelität ${maxConcurrency}).`); \ No newline at end of file +console.log(`SE LTD Symcon Collector gestartet (Intervall-Prüfung ${pollTickMs} ms, Parallelität ${maxConcurrency}).`); diff --git a/web/Dockerfile b/web/Dockerfile index 550e308..2e02921 100644 --- a/web/Dockerfile +++ b/web/Dockerfile @@ -1,13 +1,12 @@ -FROM node:20-alpine +FROM node:22-alpine WORKDIR /app COPY package*.json ./ -RUN npm install +RUN npm ci COPY . . EXPOSE 5173 CMD ["npm", "run", "dev"] - diff --git a/web/package.json b/web/package.json index f78e642..757d535 100644 --- a/web/package.json +++ b/web/package.json @@ -6,7 +6,8 @@ "scripts": { "dev": "vite --host 0.0.0.0 --port 5173", "build": "vite build", - "preview": "vite preview --host 0.0.0.0 --port 4173" + "preview": "vite preview --host 0.0.0.0 --port 4173", + "check": "vite build" }, "dependencies": { "cors": "^2.8.6", @@ -20,4 +21,4 @@ "@vitejs/plugin-react": "^4.4.1", "vite": "^6.0.7" } -} +} \ No newline at end of file diff --git a/web/src/App.jsx b/web/src/App.jsx index ae11f0d..a1beb06 100644 --- a/web/src/App.jsx +++ b/web/src/App.jsx @@ -741,7 +741,8 @@ export default function App() { const [manualDatapointDraft, setManualDatapointDraft] = useState(emptyManualDatapointDraft()); const [scanResults, setScanResults] = useState({ opcua: null, bacnet: null, ipsymcon: null }); const [debugSnapshot, setDebugSnapshot] = useState(null); - const [integrationSettings, setIntegrationSettings] = useState({ mailApiKey: "", whatsappApiKey: "", phoneApiKey: "" }); + const [integrationSettings, setIntegrationSettings] = useState({ mailUrl: "https://mailapi.se-inno.de", whatsappUrl: "https://whatsappapi.se-inno.de", voipUrl: "https://voipapi.se-inno.de", mailApiKey: "", whatsappApiKey: "", voipApiKey: "" }); + const [integrationStatus, setIntegrationStatus] = useState({ mailConfigured: false, whatsappConfigured: false, voipConfigured: false }); const [runnerJobs, setRunnerJobs] = useState([]); const [runnerQueue, setRunnerQueue] = useState([]); const [runnerDraft, setRunnerDraft] = useState({ name: "", selectionId: "", enabled: true, time: "06:00", rangeHours: "24", delimiter: ";", mailEnabled: false, mailTo: "", mailSubject: "Trenddaten", mailMessage: "Automatischer Export aus SE Local Trenddata." }); @@ -1137,12 +1138,16 @@ export default function App() { }, [canEditAliases, canManageSources, token]); useEffect(() => { if (!token || !canManageIntegrations) { - setIntegrationSettings({ mailApiKey: "", whatsappApiKey: "", phoneApiKey: "" }); + setIntegrationSettings({ mailUrl: "https://mailapi.se-inno.de", whatsappUrl: "https://whatsappapi.se-inno.de", voipUrl: "https://voipapi.se-inno.de", mailApiKey: "", whatsappApiKey: "", voipApiKey: "" }); + setIntegrationStatus({ mailConfigured: false, whatsappConfigured: false, voipConfigured: false }); return; } api.getIntegrations(token) - .then((result) => setIntegrationSettings(result.settings || { mailApiKey: "", whatsappApiKey: "", phoneApiKey: "" })) + .then((result) => { + setIntegrationSettings({ mailApiKey: "", whatsappApiKey: "", voipApiKey: "", ...(result.settings || {}) }); + setIntegrationStatus({ mailConfigured: Boolean(result.mailConfigured), whatsappConfigured: Boolean(result.whatsappConfigured), voipConfigured: Boolean(result.voipConfigured) }); + }) .catch((error) => setBootError(error.message)); }, [canManageIntegrations, token]); @@ -2086,17 +2091,36 @@ export default function App() { } }; + const applyIntegrationResult = (result) => { + setIntegrationSettings({ mailApiKey: "", whatsappApiKey: "", voipApiKey: "", ...(result.settings || {}) }); + setIntegrationStatus({ mailConfigured: Boolean(result.mailConfigured), whatsappConfigured: Boolean(result.whatsappConfigured), voipConfigured: Boolean(result.voipConfigured) }); + }; + const saveIntegrationSettings = async () => { resetFlash(); try { const result = await api.saveIntegrations(token, integrationSettings); - setIntegrationSettings(result.settings || integrationSettings); + applyIntegrationResult(result); setSuccessMessage("API-Verbindungen gespeichert."); } catch (error) { setBootError(error.message); } }; + const clearIntegrationKey = async (channel) => { + const labels = { mail: "Mail", whatsapp: "WhatsApp", voip: "Telefon" }; + if (!window.confirm(`${labels[channel]} API-Key wirklich entfernen?`)) return; + resetFlash(); + try { + const clearField = channel === "mail" ? "clearMailApiKey" : channel === "whatsapp" ? "clearWhatsappApiKey" : "clearVoipApiKey"; + const result = await api.saveIntegrations(token, { ...integrationSettings, [clearField]: true }); + applyIntegrationResult(result); + setSuccessMessage(`${labels[channel]} API-Key entfernt.`); + } catch (error) { + setBootError(error.message); + } + }; + const resetRunnerDraft = () => { setRunnerDraft({ name: "", selectionId: "", enabled: true, time: "06:00", rangeHours: "24", delimiter: ";", mailEnabled: false, mailTo: "", mailSubject: "Trenddaten", mailMessage: "Automatischer Export aus SE Local Trenddata." }); }; @@ -3484,18 +3508,21 @@ export default function App() {
@@ -3554,7 +3581,7 @@ export default function App() { aktiv