From f2e051d9350bb52cd8a5a419f9569beb6903d49d Mon Sep 17 00:00:00 2001 From: hidetak Date: Sat, 6 Jan 2024 23:52:10 +0900 Subject: [PATCH 01/23] try to make server side property node --- .gitignore | 2 + package-lock.json | 5229 ++++++++++++++++++++ package.json | 40 +- src/locales/en-US/wot-server-config.html | 19 + src/locales/en-US/wot-server-config.json | 11 + src/locales/en-US/wot-server-end.html | 36 + src/locales/en-US/wot-server-end.json | 32 + src/locales/en-US/wot-server-property.html | 36 + src/locales/en-US/wot-server-property.json | 24 + src/locales/ja/wot-server-config.html | 19 + src/locales/ja/wot-server-config.json | 7 + src/locales/ja/wot-server-end.html | 36 + src/locales/ja/wot-server-end.json | 32 + src/locales/ja/wot-server-property.html | 36 + src/locales/ja/wot-server-property.json | 31 + src/servients/http-servient-wrapper.ts | 210 + src/servients/servient-manager.ts | 68 + src/wot-property.js | 195 +- src/wot-server-config.html | 70 + src/wot-server-config.ts | 103 + src/wot-server-end.html | 190 + src/wot-server-end.ts | 84 + src/wot-server-property.html | 214 + src/wot-server-property.ts | 118 + tsconfig.json | 21 + 25 files changed, 6763 insertions(+), 100 deletions(-) create mode 100644 package-lock.json create mode 100644 src/locales/en-US/wot-server-config.html create mode 100644 src/locales/en-US/wot-server-config.json create mode 100644 src/locales/en-US/wot-server-end.html create mode 100644 src/locales/en-US/wot-server-end.json create mode 100644 src/locales/en-US/wot-server-property.html create mode 100644 src/locales/en-US/wot-server-property.json create mode 100644 src/locales/ja/wot-server-config.html create mode 100644 src/locales/ja/wot-server-config.json create mode 100644 src/locales/ja/wot-server-end.html create mode 100644 src/locales/ja/wot-server-end.json create mode 100644 src/locales/ja/wot-server-property.html create mode 100644 src/locales/ja/wot-server-property.json create mode 100644 src/servients/http-servient-wrapper.ts create mode 100644 src/servients/servient-manager.ts create mode 100644 src/wot-server-config.html create mode 100644 src/wot-server-config.ts create mode 100644 src/wot-server-end.html create mode 100644 src/wot-server-end.ts create mode 100644 src/wot-server-property.html create mode 100644 src/wot-server-property.ts create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore index 311c4b3..3333032 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ .idea/ .vscode/settings.json .DS_Store +/dist + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..a3d9471 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5229 @@ +{ + "name": "node-red-contrib-web-of-things", + "version": "1.3.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "node-red-contrib-web-of-things", + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "@node-wot/binding-coap": "^0.8.10", + "@node-wot/binding-http": "^0.8.10", + "@node-wot/binding-modbus": "^0.8.10", + "@node-wot/binding-mqtt": "^0.8.10", + "@node-wot/binding-opcua": "^0.8.10", + "@node-wot/binding-websockets": "^0.8.10", + "@node-wot/core": "^0.8.10" + }, + "devDependencies": { + "fs-extra": "^11.2.0", + "typescript": "^4.9.5" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.7.tgz", + "integrity": "sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + }, + "node_modules/@node-wot/binding-coap": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@node-wot/binding-coap/-/binding-coap-0.8.11.tgz", + "integrity": "sha512-mbn1vkMZ05a1YWLqRZPWQi/ihbGJW/V8dud9eW36nz8TJAqeKRbYUYLao1JDCUFLWTz5V1Rc5dzGqOeghibu4w==", + "dependencies": { + "@node-wot/core": "0.8.11", + "@node-wot/td-tools": "0.8.11", + "@types/node": "16.18.35", + "coap": "^1.3.0", + "multicast-dns": "^7.2.5", + "node-coap-client": "1.0.8", + "rxjs": "5.5.11", + "slugify": "^1.4.5", + "wot-typescript-definitions": "0.8.0-SNAPSHOT.29" + } + }, + "node_modules/@node-wot/binding-http": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@node-wot/binding-http/-/binding-http-0.8.11.tgz", + "integrity": "sha512-Ixdyv0vQtzmZKMAP7hURl60OoI19sIDAjx4zFiK+YUXaafz45BI9ZBOZyWt42xk7TM9+BCeLii+Dqxi0CqYdJg==", + "dependencies": { + "@node-wot/core": "0.8.11", + "@node-wot/td-tools": "0.8.11", + "@types/eventsource": "1.1.10", + "accept-language-parser": "1.5.0", + "basic-auth": "2.0.1", + "client-oauth2": "^4.2.5", + "eventsource": "^2.0.2", + "find-my-way": "^7.6.2", + "node-fetch": "^2.6.7", + "query-string": "^7.1.1", + "rxjs": "5.5.11", + "slugify": "^1.4.5" + } + }, + "node_modules/@node-wot/binding-modbus": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@node-wot/binding-modbus/-/binding-modbus-0.8.11.tgz", + "integrity": "sha512-4a3oLEGn1BDudsm5XPdwoIRqLDltzzkWBCsctgSaKEvcwiCII74IGFxGQRt86FoiKNvXSQXO0gVKA/+Ey1KE1A==", + "dependencies": { + "@node-wot/core": "0.8.11", + "@node-wot/td-tools": "0.8.11", + "modbus-serial": "8.0.3", + "rxjs": "5.5.11", + "wot-typescript-definitions": "0.8.0-SNAPSHOT.29" + } + }, + "node_modules/@node-wot/binding-mqtt": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@node-wot/binding-mqtt/-/binding-mqtt-0.8.11.tgz", + "integrity": "sha512-dTPlwk48bs/6ZaLDt3SZsOD7gguXIu0Y3/LWgcIcELDPwsnQuiX+V0VCParzk4AClqE7I7HXjrnUgMKN8WGYkw==", + "dependencies": { + "@node-wot/core": "0.8.11", + "@node-wot/td-tools": "0.8.11", + "aedes": "^0.46.2", + "mqtt": "^5.3.2", + "rxjs": "5.5.11" + } + }, + "node_modules/@node-wot/binding-opcua": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@node-wot/binding-opcua/-/binding-opcua-0.8.11.tgz", + "integrity": "sha512-1EAjnrfTs/jM/AQ+ZDgGm1teqHWBEGcN7kuTiIqzQD2Efu2qECW2hzvvtWBP/9AeqA1fqQH/Wmib+pTcECosxg==", + "dependencies": { + "@node-wot/core": "0.8.11", + "@node-wot/td-tools": "0.8.11", + "ajv": "^8.11.0", + "ajv-formats": "^2.1.1", + "node-opcua": "2.113.0", + "node-opcua-address-space": "2.113.0", + "node-opcua-basic-types": "2.113.0", + "node-opcua-binary-stream": "2.110.0", + "node-opcua-buffer-utils": "2.110.0", + "node-opcua-client": "2.113.0", + "node-opcua-constants": "2.98.1", + "node-opcua-data-model": "2.113.0", + "node-opcua-data-value": "2.113.0", + "node-opcua-date-time": "2.113.0", + "node-opcua-debug": "2.113.0", + "node-opcua-extension-object": "2.113.0", + "node-opcua-factory": "2.113.0", + "node-opcua-json": "0.50.0", + "node-opcua-nodeid": "2.113.0", + "node-opcua-numeric-range": "2.113.0", + "node-opcua-pseudo-session": "2.113.0", + "node-opcua-pubsub-client": "0.19.1", + "node-opcua-service-browse": "2.113.0", + "node-opcua-service-translate-browse-path": "2.113.0", + "node-opcua-status-code": "2.110.0", + "node-opcua-types": "2.113.0", + "node-opcua-variant": "2.113.0", + "rxjs": "5.5.11" + } + }, + "node_modules/@node-wot/binding-websockets": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@node-wot/binding-websockets/-/binding-websockets-0.8.11.tgz", + "integrity": "sha512-aEvVH+DG7TYQyuLE6P1++NnDCsvhb//9VFon4ibEQrIb3wD4vsleWUUr8sjVechwW4mTlNKjeSuzd7DBWid8JQ==", + "dependencies": { + "@node-wot/binding-http": "0.8.11", + "@node-wot/core": "0.8.11", + "@node-wot/td-tools": "0.8.11", + "slugify": "^1.4.5", + "ws": "^7.5.4" + } + }, + "node_modules/@node-wot/core": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@node-wot/core/-/core-0.8.11.tgz", + "integrity": "sha512-MaJi5h3vvlyaRIp38L1vTyTUQOBPyLrQQN9VZxssG1q2IRf7Mk+iv72RchqrILGryNubK2O+SMb+fKJl2QggQQ==", + "dependencies": { + "@node-wot/td-tools": "0.8.11", + "@petamoriken/float16": "^3.1.1", + "ajv": "^8.11.0", + "cbor": "^8.1.0", + "debug": "^4.3.4", + "uritemplate": "0.3.4", + "uuid": "^7.0.3", + "web-streams-polyfill": "^3.0.1" + } + }, + "node_modules/@node-wot/td-tools": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@node-wot/td-tools/-/td-tools-0.8.11.tgz", + "integrity": "sha512-fyHjLn6lDT0nI1pn15o+AwiL+n21Ayw523N2NUXawKQDxdxLbbhZjUGwLnMcQWVynFIVBdgeNgsicHsruBnh1A==", + "dependencies": { + "ajv": "^8.11.0", + "debug": "^4.3.4", + "is-absolute-url": "3.0.3", + "json-placeholder-replacer": "^1.0.35", + "url-toolkit": "2.1.6", + "wot-thing-model-types": "1.1.0-09-November-2023", + "wot-typescript-definitions": "0.8.0-SNAPSHOT.29" + } + }, + "node_modules/@peculiar/asn1-cms": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.3.8.tgz", + "integrity": "sha512-Wtk9R7yQxGaIaawHorWKP2OOOm/RZzamOmSWwaqGphIuU6TcKYih0slL6asZlSSZtVoYTrBfrddSOD/jTu9vuQ==", + "dependencies": { + "@peculiar/asn1-schema": "^2.3.8", + "@peculiar/asn1-x509": "^2.3.8", + "@peculiar/asn1-x509-attr": "^2.3.8", + "asn1js": "^3.0.5", + "tslib": "^2.6.2" + } + }, + "node_modules/@peculiar/asn1-csr": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.3.8.tgz", + "integrity": "sha512-ZmAaP2hfzgIGdMLcot8gHTykzoI+X/S53x1xoGbTmratETIaAbSWMiPGvZmXRA0SNEIydpMkzYtq4fQBxN1u1w==", + "dependencies": { + "@peculiar/asn1-schema": "^2.3.8", + "@peculiar/asn1-x509": "^2.3.8", + "asn1js": "^3.0.5", + "tslib": "^2.6.2" + } + }, + "node_modules/@peculiar/asn1-ecc": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.3.8.tgz", + "integrity": "sha512-Ah/Q15y3A/CtxbPibiLM/LKcMbnLTdUdLHUgdpB5f60sSvGkXzxJCu5ezGTFHogZXWNX3KSmYqilCrfdmBc6pQ==", + "dependencies": { + "@peculiar/asn1-schema": "^2.3.8", + "@peculiar/asn1-x509": "^2.3.8", + "asn1js": "^3.0.5", + "tslib": "^2.6.2" + } + }, + "node_modules/@peculiar/asn1-pfx": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.3.8.tgz", + "integrity": "sha512-XhdnCVznMmSmgy68B9pVxiZ1XkKoE1BjO4Hv+eUGiY1pM14msLsFZ3N7K46SoITIVZLq92kKkXpGiTfRjlNLyg==", + "dependencies": { + "@peculiar/asn1-cms": "^2.3.8", + "@peculiar/asn1-pkcs8": "^2.3.8", + "@peculiar/asn1-rsa": "^2.3.8", + "@peculiar/asn1-schema": "^2.3.8", + "asn1js": "^3.0.5", + "tslib": "^2.6.2" + } + }, + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.3.8.tgz", + "integrity": "sha512-rL8k2x59v8lZiwLRqdMMmOJ30GHt6yuHISFIuuWivWjAJjnxzZBVzMTQ72sknX5MeTSSvGwPmEFk2/N8+UztFQ==", + "dependencies": { + "@peculiar/asn1-schema": "^2.3.8", + "@peculiar/asn1-x509": "^2.3.8", + "asn1js": "^3.0.5", + "tslib": "^2.6.2" + } + }, + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.3.8.tgz", + "integrity": "sha512-+nONq5tcK7vm3qdY7ZKoSQGQjhJYMJbwJGbXLFOhmqsFIxEWyQPHyV99+wshOjpOjg0wUSSkEEzX2hx5P6EKeQ==", + "dependencies": { + "@peculiar/asn1-cms": "^2.3.8", + "@peculiar/asn1-pfx": "^2.3.8", + "@peculiar/asn1-pkcs8": "^2.3.8", + "@peculiar/asn1-schema": "^2.3.8", + "@peculiar/asn1-x509": "^2.3.8", + "@peculiar/asn1-x509-attr": "^2.3.8", + "asn1js": "^3.0.5", + "tslib": "^2.6.2" + } + }, + "node_modules/@peculiar/asn1-rsa": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.3.8.tgz", + "integrity": "sha512-ES/RVEHu8VMYXgrg3gjb1m/XG0KJWnV4qyZZ7mAg7rrF3VTmRbLxO8mk+uy0Hme7geSMebp+Wvi2U6RLLEs12Q==", + "dependencies": { + "@peculiar/asn1-schema": "^2.3.8", + "@peculiar/asn1-x509": "^2.3.8", + "asn1js": "^3.0.5", + "tslib": "^2.6.2" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.8.tgz", + "integrity": "sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==", + "dependencies": { + "asn1js": "^3.0.5", + "pvtsutils": "^1.3.5", + "tslib": "^2.6.2" + } + }, + "node_modules/@peculiar/asn1-x509": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.3.8.tgz", + "integrity": "sha512-voKxGfDU1c6r9mKiN5ZUsZWh3Dy1BABvTM3cimf0tztNwyMJPhiXY94eRTgsMQe6ViLfT6EoXxkWVzcm3mFAFw==", + "dependencies": { + "@peculiar/asn1-schema": "^2.3.8", + "asn1js": "^3.0.5", + "ipaddr.js": "^2.1.0", + "pvtsutils": "^1.3.5", + "tslib": "^2.6.2" + } + }, + "node_modules/@peculiar/asn1-x509-attr": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.3.8.tgz", + "integrity": "sha512-4Z8mSN95MOuX04Aku9BUyMdsMKtVQUqWnr627IheiWnwFoheUhX3R4Y2zh23M7m80r4/WG8MOAckRKc77IRv6g==", + "dependencies": { + "@peculiar/asn1-schema": "^2.3.8", + "@peculiar/asn1-x509": "^2.3.8", + "asn1js": "^3.0.5", + "tslib": "^2.6.2" + } + }, + "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==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@peculiar/webcrypto": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.4.3.tgz", + "integrity": "sha512-VtaY4spKTdN5LjJ04im/d/joXuvLbQdgy5Z4DXF4MFZhQ+MTrejbNMkfZBp1Bs3O5+bFqnJgyGdPuZQflvIa5A==", + "dependencies": { + "@peculiar/asn1-schema": "^2.3.6", + "@peculiar/json-schema": "^1.1.12", + "pvtsutils": "^1.3.2", + "tslib": "^2.5.0", + "webcrypto-core": "^1.7.7" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@peculiar/x509": { + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.9.6.tgz", + "integrity": "sha512-BQhsxZa8SMJ8rwKJMb6VrdZk3XXE/5ab+JRr9psxHI9dw9gZrR3BsWrL3EgLoxrqOd2nP/mWVSSJGlA76aAbRw==", + "dependencies": { + "@peculiar/asn1-cms": "^2.3.8", + "@peculiar/asn1-csr": "^2.3.8", + "@peculiar/asn1-ecc": "^2.3.8", + "@peculiar/asn1-pkcs9": "^2.3.8", + "@peculiar/asn1-rsa": "^2.3.8", + "@peculiar/asn1-schema": "^2.3.8", + "@peculiar/asn1-x509": "^2.3.8", + "pvtsutils": "^1.3.5", + "reflect-metadata": "^0.2.1", + "tslib": "^2.6.2", + "tsyringe": "^4.8.0" + } + }, + "node_modules/@petamoriken/float16": { + "version": "3.8.4", + "resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.8.4.tgz", + "integrity": "sha512-kB+NJ5Br56ZhElKsf0pM7/PQfrDdDVMRz8f0JM6eVOGE+L89z9hwcst9QvWBBnazzuqGTGtPsJNZoQ1JdNiGSQ==" + }, + "node_modules/@serialport/binding-abstract": { + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/@serialport/binding-abstract/-/binding-abstract-9.2.3.tgz", + "integrity": "sha512-cQs9tbIlG3P0IrOWyVirqlhWuJ7Ms2Zh9m2108z6Y5UW/iVj6wEOiW8EmK9QX9jmJXYllE7wgGgvVozP5oCj3w==", + "dependencies": { + "debug": "^4.3.2" + }, + "engines": { + "node": ">=10.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/@serialport/binding-mock": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/@serialport/binding-mock/-/binding-mock-9.2.4.tgz", + "integrity": "sha512-dpEhACCs44oQhh6ajJfJdvQdK38Vq0N4W6iD/gdplglDCK7qXRQCMUjJIeKdS/HSEiWkC3bwumUhUufdsOyT4g==", + "dependencies": { + "@serialport/binding-abstract": "9.2.3", + "debug": "^4.3.2" + }, + "engines": { + "node": ">=10.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/@serialport/bindings": { + "version": "9.2.8", + "resolved": "https://registry.npmjs.org/@serialport/bindings/-/bindings-9.2.8.tgz", + "integrity": "sha512-hSLxTe0tADZ3LMMGwvEJWOC/TaFQTyPeFalUCsJ1lSQ0k6bPF04JwrtB/C81GetmDBTNRY0GlD0SNtKCc7Dr5g==", + "hasInstallScript": true, + "dependencies": { + "@serialport/binding-abstract": "9.2.3", + "@serialport/parser-readline": "9.2.4", + "bindings": "^1.5.0", + "debug": "^4.3.2", + "nan": "^2.15.0", + "prebuild-install": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/@serialport/bindings/node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@serialport/bindings/node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@serialport/bindings/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@serialport/bindings/node_modules/nan": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==" + }, + "node_modules/@serialport/bindings/node_modules/node-abi": { + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.54.0.tgz", + "integrity": "sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@serialport/bindings/node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@serialport/bindings/node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/@serialport/parser-byte-length": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/@serialport/parser-byte-length/-/parser-byte-length-9.2.4.tgz", + "integrity": "sha512-sQD/iw4ZMU3xW9PLi0/GlvU6Y623jGeWecbMkO7izUo/6P7gtfv1c9ikd5h0kwL8AoAOpQA1lxdHIKox+umBUg==", + "engines": { + "node": ">=10.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/@serialport/parser-cctalk": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/@serialport/parser-cctalk/-/parser-cctalk-9.2.4.tgz", + "integrity": "sha512-T4TU5vQMwmo9AB3gQLFDWbfJXlW5jd9guEsB/nqKjFHTv0FXPdZ7DQ2TpSp8RnHWxU3GX6kYTaDO20BKzc8GPQ==", + "engines": { + "node": ">=10.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/@serialport/parser-delimiter": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-9.2.4.tgz", + "integrity": "sha512-4nvTAoYAgkxFiXrkI+3CA49Yd43CODjeszh89EK+I9c8wOZ+etZduRCzINYPiy26g7zO+GRAb9FoPCsY+sYcbQ==", + "engines": { + "node": ">=10.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/@serialport/parser-inter-byte-timeout": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/@serialport/parser-inter-byte-timeout/-/parser-inter-byte-timeout-9.2.4.tgz", + "integrity": "sha512-SOAdvr0oBQIOCXX198hiTlxs4JTKg9j5piapw5tNq52fwDOWdbYrFneT/wN04UTMKaDrJuEvXq6T4rv4j7nJ5A==", + "engines": { + "node": ">=10.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/@serialport/parser-readline": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-9.2.4.tgz", + "integrity": "sha512-Z1/qrZTQUVhNSJP1hd9YfDvq0o7d87rNwAjjRKbVpa7Qi51tG5BnKt43IV3NFMyBlVcRe0rnIb3tJu57E0SOwg==", + "dependencies": { + "@serialport/parser-delimiter": "9.2.4" + }, + "engines": { + "node": ">=10.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/@serialport/parser-ready": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/@serialport/parser-ready/-/parser-ready-9.2.4.tgz", + "integrity": "sha512-Pyi94Itjl6qAURwIZr/gmZpMAyTmKXThm6vL5DoAWGQjcRHWB0gwv2TY2v7N+mQLJYUKU3cMnvnATXxHm7xjxw==", + "engines": { + "node": ">=10.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/@serialport/parser-regex": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/@serialport/parser-regex/-/parser-regex-9.2.4.tgz", + "integrity": "sha512-sI/cVvPOYz+Dbv4ZdnW16qAwvXiFf/1pGASQdbveRTlgJDdz7sRNlCBifzfTN2xljwvCTZYqiudKvDdC1TepRQ==", + "engines": { + "node": ">=10.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/@serialport/stream": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/@serialport/stream/-/stream-9.2.4.tgz", + "integrity": "sha512-bLye8Ub4vUFQGmkh8qEqehr7SE7EJs2yDs0h9jzuL5oKi+F34CFmWkEErO8GAOQ8YNn7p6b3GxUgs+0BrHHDZQ==", + "dependencies": { + "debug": "^4.3.2" + }, + "engines": { + "node": ">=10.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/@servie/events": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@servie/events/-/events-1.0.0.tgz", + "integrity": "sha512-sBSO19KzdrJCM3gdx6eIxV8M9Gxfgg6iDQmH5TIAGaUu+X9VDdsINXJOnoiZ1Kx3TrHdH4bt5UVglkjsEGBcvw==" + }, + "node_modules/@ster5/global-mutex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ster5/global-mutex/-/global-mutex-2.0.0.tgz", + "integrity": "sha512-nlp5BM4E7ybkGt6ouZsohSnliWtXgRoUWHMl8uzi64gKwZSONsssEstfBGnQ0OpdQlE0HBP0qq9RDxP0JTW57w==", + "dependencies": { + "@types/proper-lockfile": "^4.1.2", + "proper-lockfile": "^4.1.2" + } + }, + "node_modules/@types/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@types/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-V91DSJ2l0h0gRhVP4oBfBzRBN9lAbPUkGDMCnwedqPKX2d84aAMc9CulOvxdw1f7DfEYx99afab+Rsm3e52jhA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/async": { + "version": "3.2.24", + "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.24.tgz", + "integrity": "sha512-8iHVLHsCCOBKjCF2KwFe0p9Z3rfM9mL+sSP8btyR5vTjJRAqpBYD28/ZLgXPf0pjG1VxOvtCV/BgXkQbpSe8Hw==" + }, + "node_modules/@types/aws-iot-device-sdk": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@types/aws-iot-device-sdk/-/aws-iot-device-sdk-2.2.8.tgz", + "integrity": "sha512-l7JWoN1vHDpvm13kppPSmfnIQbQrJK7kvG95LIKf3qYF+WJjaUDOTdMn8BA8djHWb7ASRu2D4jtuVzSTj2We6Q==", + "dependencies": { + "@types/node": "*", + "@types/ws": "*", + "mqtt": "^4.2.8" + } + }, + "node_modules/@types/aws-iot-device-sdk/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/@types/aws-iot-device-sdk/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@types/aws-iot-device-sdk/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/@types/aws-iot-device-sdk/node_modules/commist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", + "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", + "dependencies": { + "leven": "^2.1.0", + "minimist": "^1.1.0" + } + }, + "node_modules/@types/aws-iot-device-sdk/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@types/aws-iot-device-sdk/node_modules/help-me": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-3.0.0.tgz", + "integrity": "sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==", + "dependencies": { + "glob": "^7.1.6", + "readable-stream": "^3.6.0" + } + }, + "node_modules/@types/aws-iot-device-sdk/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@types/aws-iot-device-sdk/node_modules/mqtt": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.3.8.tgz", + "integrity": "sha512-2xT75uYa0kiPEF/PE0VPdavmEkoBzMT/UL9moid0rAvlCtV48qBwxD62m7Ld/4j8tSkIO1E/iqRl/S72SEOhOw==", + "dependencies": { + "commist": "^1.0.0", + "concat-stream": "^2.0.0", + "debug": "^4.1.1", + "duplexify": "^4.1.1", + "help-me": "^3.0.0", + "inherits": "^2.0.3", + "lru-cache": "^6.0.0", + "minimist": "^1.2.5", + "mqtt-packet": "^6.8.0", + "number-allocator": "^1.0.9", + "pump": "^3.0.0", + "readable-stream": "^3.6.0", + "reinterval": "^1.1.0", + "rfdc": "^1.3.0", + "split2": "^3.1.0", + "ws": "^7.5.5", + "xtend": "^4.0.2" + }, + "bin": { + "mqtt": "bin/mqtt.js", + "mqtt_pub": "bin/pub.js", + "mqtt_sub": "bin/sub.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@types/aws-iot-device-sdk/node_modules/mqtt-packet": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.10.0.tgz", + "integrity": "sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==", + "dependencies": { + "bl": "^4.0.2", + "debug": "^4.1.1", + "process-nextick-args": "^2.0.1" + } + }, + "node_modules/@types/aws-iot-device-sdk/node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/@types/dns-packet": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/@types/dns-packet/-/dns-packet-5.6.4.tgz", + "integrity": "sha512-R0ORTvCCeujG+upKfV4JlvozKLdQWlpsducXGd1L6ezBChwpjSj9K84F+KoMDsZQ9RhOLTR1hnNrwJHWagY24g==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/eventsource": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@types/eventsource/-/eventsource-1.1.10.tgz", + "integrity": "sha512-rYzRmJSnm44Xb7FICRXEjwe/26ZiiS+VMGmuD17PevMP56cGgLEsaM955sYQW0S+K7h+mPOL70vGf1hi4WDjVA==" + }, + "node_modules/@types/jsrsasign": { + "version": "10.5.12", + "resolved": "https://registry.npmjs.org/@types/jsrsasign/-/jsrsasign-10.5.12.tgz", + "integrity": "sha512-sOA+eVnHU+FziThpMhuqs/tjFKe5gHVJKIS7g1BzhXP+e2FS8OvtzM0K3IzFxVksDOr98Gz5FJiZVxZ9uFoHhw==" + }, + "node_modules/@types/lodash": { + "version": "4.14.198", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.198.tgz", + "integrity": "sha512-trNJ/vtMZYMLhfN45uLq4ShQSw0/S7xCTLLVM+WM1rmFpba/VS42jVUgaO3w/NOLiWR/09lnYk0yMaA/atdIsg==" + }, + "node_modules/@types/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==" + }, + "node_modules/@types/mkdirp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.2.tgz", + "integrity": "sha512-o0K1tSO0Dx5X6xlU5F1D6625FawhC3dU3iqr25lluNv/+/QIVH8RLNEiVokgIZo+mz+87w/3Mkg/VvQS+J51fQ==", + "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==", + "dependencies": { + "@types/dns-packet": "*", + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "16.18.35", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.35.tgz", + "integrity": "sha512-yqU2Rf94HFZqgHf6Tuyc/IqVD0l3U91KjvypSr1GtJKyrnl6L/kfnxVqN4QOwcF5Zx9tO/HKK+fozGr5AtqA+g==" + }, + "node_modules/@types/proper-lockfile": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/proper-lockfile/-/proper-lockfile-4.1.4.tgz", + "integrity": "sha512-uo2ABllncSqg9F1D4nugVl9v93RmjxF6LJzQLMLDdPaXCUIDPeOJ21Gbqi43xNKzBi/WQ0Q0dICqufzQbMjipQ==", + "dependencies": { + "@types/retry": "*" + } + }, + "node_modules/@types/readable-stream": { + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", + "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", + "dependencies": { + "@types/node": "*", + "safe-buffer": "~5.1.1" + } + }, + "node_modules/@types/retry": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.5.tgz", + "integrity": "sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==" + }, + "node_modules/@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==" + }, + "node_modules/@types/sshpk": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/@types/sshpk/-/sshpk-1.17.4.tgz", + "integrity": "sha512-5gI/7eJn6wmkuIuFY8JZJ1g5b30H9K5U5vKrvOuYu+hoZLb2xcVEgxhYZ2Vhbs0w/ACyzyfkJq0hQtBfSCugjw==", + "dependencies": { + "@types/asn1": "*", + "@types/node": "*" + } + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==" + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accept-language-parser": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/accept-language-parser/-/accept-language-parser-1.5.0.tgz", + "integrity": "sha512-QhyTbMLYo0BBGg1aWbeMG4ekWtds/31BrEU+DONOg/7ax23vxpL03Pb7/zBmha2v7vdD3AyzZVWBVGEZxKOXWw==" + }, + "node_modules/aedes": { + "version": "0.46.3", + "resolved": "https://registry.npmjs.org/aedes/-/aedes-0.46.3.tgz", + "integrity": "sha512-i3B+H74uNRhlqcs/JdrMp7e3daz4Cwls0x4yLcfjGXz2tIwnxhF6od4m86O6yyNdz/Gg3jfY3q0sc/Cz8qzg6g==", + "dependencies": { + "aedes-packet": "^2.3.1", + "aedes-persistence": "^8.1.3", + "bulk-write-stream": "^2.0.1", + "end-of-stream": "^1.4.4", + "fastfall": "^1.5.1", + "fastparallel": "^2.4.1", + "fastseries": "^2.0.0", + "hyperid": "^3.0.0", + "mqemitter": "^4.5.0", + "mqtt-packet": "^7.1.2", + "readable-stream": "^3.6.0", + "retimer": "^3.0.0", + "reusify": "^1.0.4", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/aedes-packet": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/aedes-packet/-/aedes-packet-2.3.1.tgz", + "integrity": "sha512-LqBd57uc2rui2RbjycW17dylglejG26mM4ewVXGNDnVp/SUHFVEgm7d1HTmYrnSkSCNoHti042qgcTwv/F+BtQ==", + "dependencies": { + "mqtt-packet": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aedes-packet/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/aedes-packet/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/aedes-packet/node_modules/mqtt-packet": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.10.0.tgz", + "integrity": "sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==", + "dependencies": { + "bl": "^4.0.2", + "debug": "^4.1.1", + "process-nextick-args": "^2.0.1" + } + }, + "node_modules/aedes-persistence": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/aedes-persistence/-/aedes-persistence-8.1.3.tgz", + "integrity": "sha512-VMCjEV+2g1TNJb/IlDEUy6SP9crT+QUhe2xc6UjyqrFNBNgTvHmOefXY7FxWrwmR2QA02vwg3+5p/JXkyg/Dkw==", + "dependencies": { + "aedes-packet": "^2.3.1", + "from2": "^2.3.0", + "qlobber": "^5.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aedes/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "optional": true + }, + "node_modules/are-we-there-yet": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "optional": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/are-we-there-yet/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optional": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "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==" + }, + "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==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1js": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.5.tgz", + "integrity": "sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==", + "dependencies": { + "pvtsutils": "^1.3.2", + "pvutils": "^1.1.3", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "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==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "precond": "0.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha512-bYeph2DFlpK1XmGs6fvlLRUN29QISM3GBuUwSFsMY2XRx4AvC0WNCS57j4c/xGrK2RS24C1w3YoBOsw9fT46tQ==", + "dependencies": { + "callsite": "1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/bl/-/bl-6.0.10.tgz", + "integrity": "sha512-F14DFhDZfxtVm2FY0k9kG2lWAwzZkO9+jX3Ytuoy/V0E1/5LBuBzzQHXAjqpxXEDIpmTPZZf5GVIGPQcLxFpaA==", + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^4.2.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/bulk-write-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bulk-write-stream/-/bulk-write-stream-2.0.1.tgz", + "integrity": "sha512-XWOLjgHtpDasHfwM8oO4df1JoZwa7/OwTsXDzh4rUTo+9CowzeOFBZz43w+H14h1fyq+xl28tVIBrdjcjj4Gug==", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/byte-length/-/byte-length-1.0.2.tgz", + "integrity": "sha512-ovBpjmsgd/teRmgcPh23d4gJvxDoXtAzEL9xTfMU8Yc2kqCDb7L9jAG0XHl1nzuGl+h3ebCIF1i62UFyA9V/2Q==" + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==", + "engines": { + "node": "*" + } + }, + "node_modules/capitalize": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/capitalize/-/capitalize-2.0.4.tgz", + "integrity": "sha512-wcSyiFqXRYyCoqu0o0ekXzJAKCLMkqWS5QWGlgTJFJKwRmI6pzcN2hBl5VPq9RzLW5Uf4FF/V/lcFfjCtVak2w==" + }, + "node_modules/cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "dependencies": { + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=12.19" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/cli-table": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", + "integrity": "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==", + "dependencies": { + "colors": "1.0.3" + }, + "engines": { + "node": ">= 0.2.0" + } + }, + "node_modules/client-oauth2": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/client-oauth2/-/client-oauth2-4.3.3.tgz", + "integrity": "sha512-k8AvUYJon0vv75ufoVo4nALYb/qwFFicO3I0+39C6xEdflqVtr+f9cy+0ZxAduoVSTfhP5DX2tY2XICAd5hy6Q==", + "dependencies": { + "popsicle": "^12.0.5", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/client-oauth2/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/coap": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/coap/-/coap-1.3.0.tgz", + "integrity": "sha512-vRi1x4z0iCfez3fy9JCiH3Kwkt0wPmRZxeRfr9lQeWTrBSevkKZ458N3ZrwieD9vulcVODJr4SQP4cigIO150A==", + "dependencies": { + "@types/lru-cache": "^5.1.1", + "@types/readable-stream": "^2.3.15", + "bl": "^6.0.0", + "capitalize": "^2.0.4", + "coap-packet": "^1.1.1", + "debug": "^4.3.4", + "fastseries": "^2.0.0", + "lru-cache": "^6.0.0", + "readable-stream": "^4.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/coap-packet": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/coap-packet/-/coap-packet-1.1.1.tgz", + "integrity": "sha512-Bkz2ZKI/7hU2gm6nUuo5l+MBSkdFJx7My1ZgNEhKUC7K2yYfQYVbBPRa64BBYLcEcYgaSlau4A1Uw5xfM2I0zw==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/coap/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "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==" + }, + "node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/commist": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/commist/-/commist-3.2.0.tgz", + "integrity": "sha512-4PIMoPniho+LqXmpS5d3NuGYncG6XWlkBSVGiWycL22dd42OYdUGil2CWuzklaJoNxyxUSpO4MKIBU94viWNAw==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "optional": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "optional": true, + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "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/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "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==" + }, + "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==", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/duplexify": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", + "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, + "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==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" + }, + "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==" + }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-unique-numbers": { + "version": "8.0.12", + "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-8.0.12.tgz", + "integrity": "sha512-Z4AJueNDnuC/sLxeQqrHP4zgqcBIeQQLbQ0hEx1a7m6Wf7ERrdAyR7CkGfoEFWm9Qla7dpLt0eWPyiO18gqj0A==", + "dependencies": { + "@babel/runtime": "^7.23.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.1.0" + } + }, + "node_modules/fastfall": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/fastfall/-/fastfall-1.5.1.tgz", + "integrity": "sha512-KH6p+Z8AKPXnmA7+Iz2Lh8ARCMr+8WNPVludm1LGkZoD2MjY6LVnRMtTKhkdzI+jr0RzQWXKzKyBJm1zoHEL4Q==", + "dependencies": { + "reusify": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fastparallel": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/fastparallel/-/fastparallel-2.4.1.tgz", + "integrity": "sha512-qUmhxPgNHmvRjZKBFUNI0oZuuH9OlSIOXmJ98lhKPxMZZ7zS/Fi0wRHOihDSz0R1YiIOjxzOY4bq65YTcdBi2Q==", + "dependencies": { + "reusify": "^1.0.4", + "xtend": "^4.0.2" + } + }, + "node_modules/fastseries": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fastseries/-/fastseries-2.0.0.tgz", + "integrity": "sha512-XBU9RXeoYc2/VnvMhplAxEmZLfIk7cvTBu+xwoBuTI8pL19E03cmca17QQycKIdxgwCeFA/a4u27gv1h3ya5LQ==" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/find-my-way": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.7.0.tgz", + "integrity": "sha512-+SrHpvQ52Q6W9f3wJoJBbAQULJuNEEQwBvlvYwACDhBTLOTMiQ0HYWh4+vC3OivGP2ENcTI1oKlFA2OepJNjhQ==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^2.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", + "optional": true, + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "optional": true + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/help-me": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-4.2.0.tgz", + "integrity": "sha512-TAOnTB8Tz5Dw8penUuzHVrKNKlCIbwwbHnXraNJxPwf8LRtE2HlM84RYuezMFcwOJmoYOCWVDyJ8TQGxn9PgxA==", + "dependencies": { + "glob": "^8.0.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/hexy": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/hexy/-/hexy-0.3.5.tgz", + "integrity": "sha512-UCP7TIZPXz5kxYJnNOym+9xaenxCLor/JyhKieo8y8/bJWunGh9xbhy3YrgYJUQ87WwfXGm05X330DszOfINZw==", + "bin": { + "hexy": "bin/hexy_cmd.js" + }, + "engines": { + "node": ">=10.4" + } + }, + "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/hyperid": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/hyperid/-/hyperid-3.1.1.tgz", + "integrity": "sha512-RveV33kIksycSf7HLkq1sHB5wW0OwuX8ot8MYnY++gaaPXGFfKpBncHrAWxdpuEeRlazUMGWefwP1w6o6GaumA==", + "dependencies": { + "uuid": "^8.3.2", + "uuid-parse": "^1.1.0" + } + }, + "node_modules/hyperid/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "optional": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/js-sdsl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/json-placeholder-replacer": { + "version": "1.0.37", + "resolved": "https://registry.npmjs.org/json-placeholder-replacer/-/json-placeholder-replacer-1.0.37.tgz", + "integrity": "sha512-Ix9Rpcp3UvkCULHrS2Wu58Op+oDLD0ubjlmXDMIKQwvvztvEV6diyaB+Duuuvb6lDHav9PISyRaO9dzzt8tOAQ==", + "bin": { + "jpr": "dist/index.js", + "json-placeholder-replacer": "dist/index.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsrsasign": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/jsrsasign/-/jsrsasign-10.9.0.tgz", + "integrity": "sha512-QWLUikj1SBJGuyGK8tjKSx3K7Y69KYJnrs/pQ1KZ6wvZIkHkWjZ1PJDpuvc1/28c1uP0KW9qn1eI1LzHQqDOwQ==", + "funding": { + "url": "https://github.com/kjur/jsrsasign#donations" + } + }, + "node_modules/leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ltx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ltx/-/ltx-3.0.0.tgz", + "integrity": "sha512-bu3/4/ApUmMqVNuIkHaRhqVtEi6didYcBDIF56xhPRCzVpdztCipZ62CUuaxMlMBUzaVL93+4LZRqe02fuAG6A==", + "engines": { + "node": ">= 12.4.0" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/make-error-cause": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-2.3.0.tgz", + "integrity": "sha512-etgt+n4LlOkGSJbBTV9VROHA5R7ekIPS4vfh+bCAoJgRrJWdqJCBbpS3osRJ/HrT7R68MzMiY3L3sDJ/Fd8aBg==", + "dependencies": { + "make-error": "^1.3.5" + } + }, + "node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "optional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/modbus-serial": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/modbus-serial/-/modbus-serial-8.0.3.tgz", + "integrity": "sha512-ozrTOVPHEjof1JdVSwvtIe+qrkexoU4Xz/FiEcss81W1dngqfZqwnHu9WS+GOgM0Hu8I/nu08TFKbCefVUDh0w==", + "dependencies": { + "debug": "^4.1.1", + "serialport": "^9.0.0" + } + }, + "node_modules/mqemitter": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/mqemitter/-/mqemitter-4.5.0.tgz", + "integrity": "sha512-Mp/zytFeIv6piJQkEKnncHcP4R/ErJc5C7dfonkhkNUT2LA/nTayrfNxbipp3M5iCJUTQSUtzfQAQA3XVcKz6w==", + "dependencies": { + "fastparallel": "^2.3.0", + "qlobber": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mqtt": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-5.3.4.tgz", + "integrity": "sha512-nyhr2bnFtyiv68jV3yfR6eQtGcGs/jr2l3ETKXYc0amttsasXa1KgvETHRNRjfeDt/yc68IqoEjFzKkHpoQUPQ==", + "dependencies": { + "@types/readable-stream": "^4.0.5", + "@types/ws": "^8.5.9", + "commist": "^3.2.0", + "concat-stream": "^2.0.0", + "debug": "^4.3.4", + "help-me": "^4.2.0", + "lru-cache": "^10.0.1", + "minimist": "^1.2.8", + "mqtt": "^5.2.0", + "mqtt-packet": "^9.0.0", + "number-allocator": "^1.0.14", + "readable-stream": "^4.4.2", + "reinterval": "^1.1.0", + "rfdc": "^1.3.0", + "split2": "^4.2.0", + "worker-timers": "^7.0.78", + "ws": "^8.14.2" + }, + "bin": { + "mqtt": "build/bin/mqtt.js", + "mqtt_pub": "build/bin/pub.js", + "mqtt_sub": "build/bin/sub.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/mqtt-packet": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-7.1.2.tgz", + "integrity": "sha512-FFZbcZ2omsf4c5TxEQfcX9hI+JzDpDKPT46OmeIBpVA7+t32ey25UNqlqNXTmeZOr5BLsSIERpQQLsFWJS94SQ==", + "dependencies": { + "bl": "^4.0.2", + "debug": "^4.1.1", + "process-nextick-args": "^2.0.1" + } + }, + "node_modules/mqtt-packet/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/mqtt-packet/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/mqtt/node_modules/@types/readable-stream": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.10.tgz", + "integrity": "sha512-AbUKBjcC8SHmImNi4yK2bbjogQlkFSg7shZCcicxPQapniOlajG8GCc39lvXzCWX4lLRRs7DM3VAeSlqmEVZUA==", + "dependencies": { + "@types/node": "*", + "safe-buffer": "~5.1.1" + } + }, + "node_modules/mqtt/node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/mqtt/node_modules/mqtt-packet": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-9.0.0.tgz", + "integrity": "sha512-8v+HkX+fwbodsWAZIZTI074XIoxVBOmPeggQuDFCGg1SqNcC+uoRMWu7J6QlJPqIUIJXmjNYYHxBBLr1Y/Df4w==", + "dependencies": { + "bl": "^6.0.8", + "debug": "^4.3.4", + "process-nextick-args": "^2.0.1" + } + }, + "node_modules/mqtt/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/mqtt/node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "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==", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "optional": true + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "node_modules/node-abi": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz", + "integrity": "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==", + "optional": true, + "dependencies": { + "semver": "^5.4.1" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/node-aead-crypto": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/node-aead-crypto/-/node-aead-crypto-2.2.2.tgz", + "integrity": "sha512-EtCLL1FmVjj2GlBNcLRn75ea+y6yGuEdoTpqc9zIiRkIKk1ucTsOPoKaHYYxHfMAXWqHu2Dw8a44VSSKz45UTg==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "bindings": "^1.5.0", + "nan": "2.14.x", + "prebuild-install": "^6.1.3" + }, + "engines": { + "node": ">4" + } + }, + "node_modules/node-coap-client": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/node-coap-client/-/node-coap-client-1.0.8.tgz", + "integrity": "sha512-ADki3zyiITRkKVKKa33OsE6Kkr8lMRdURvNgz+ozAuBFPY867BAq8AAsKL5MqlIaFMfW3b2Dq27gaDiRFH4T6w==", + "dependencies": { + "debug": "^4.1.1", + "node-dtls-client": "^0.6.0" + }, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-dtls-client": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/node-dtls-client/-/node-dtls-client-0.6.0.tgz", + "integrity": "sha512-TApzfBpbTkJOVouhgy9qJJB1Oui6sZz/1yNs1VNXTBWkF2ZgO594k58Y1moabAuTHzTUEc0XfwWmoz1yl8sx9Q==", + "dependencies": { + "debug": "^4.1.1", + "semver": "^7.0.0" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "node-aead-crypto": "^2.0.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-opcua": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua/-/node-opcua-2.113.0.tgz", + "integrity": "sha512-05XJie63Qr0klN+NmQAGSC/ZIVZQQKbY7ZhkeypDbT96NfZfPglhsPW7yng5gTe0U5WHOrtRogvZl1+rjfhdXQ==", + "dependencies": { + "@types/semver": "^7.5.1", + "chalk": "4.1.2", + "node-opcua-address-space": "2.113.0", + "node-opcua-address-space-for-conformance-testing": "2.113.0", + "node-opcua-aggregates": "2.113.0", + "node-opcua-assert": "2.105.0", + "node-opcua-basic-types": "2.113.0", + "node-opcua-binary-stream": "2.110.0", + "node-opcua-certificate-manager": "2.113.0", + "node-opcua-client": "2.113.0", + "node-opcua-client-crawler": "2.113.0", + "node-opcua-client-proxy": "2.113.0", + "node-opcua-common": "2.113.0", + "node-opcua-constants": "2.98.1", + "node-opcua-crypto": "4.5.0", + "node-opcua-data-access": "2.113.0", + "node-opcua-data-model": "2.113.0", + "node-opcua-data-value": "2.113.0", + "node-opcua-debug": "2.113.0", + "node-opcua-enum": "2.110.0", + "node-opcua-factory": "2.113.0", + "node-opcua-hostname": "2.105.0", + "node-opcua-nodeid": "2.113.0", + "node-opcua-nodesets": "2.110.0", + "node-opcua-numeric-range": "2.113.0", + "node-opcua-packet-analyzer": "2.113.0", + "node-opcua-secure-channel": "2.113.0", + "node-opcua-server": "2.113.0", + "node-opcua-server-discovery": "2.113.0", + "node-opcua-service-browse": "2.113.0", + "node-opcua-service-call": "2.113.0", + "node-opcua-service-discovery": "2.113.0", + "node-opcua-service-endpoints": "2.113.0", + "node-opcua-service-filter": "2.113.0", + "node-opcua-service-history": "2.113.0", + "node-opcua-service-node-management": "2.113.0", + "node-opcua-service-query": "2.113.0", + "node-opcua-service-read": "2.113.0", + "node-opcua-service-register-node": "2.113.0", + "node-opcua-service-secure-channel": "2.113.0", + "node-opcua-service-session": "2.113.0", + "node-opcua-service-subscription": "2.113.0", + "node-opcua-service-translate-browse-path": "2.113.0", + "node-opcua-service-write": "2.113.0", + "node-opcua-status-code": "2.110.0", + "node-opcua-transport": "2.113.0", + "node-opcua-types": "2.113.0", + "node-opcua-utils": "2.110.0", + "node-opcua-variant": "2.113.0", + "node-opcua-vendor-diagnostic": "2.113.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=8.10" + }, + "funding": { + "url": "https://github.com/sponsors/erossignon" + } + }, + "node_modules/node-opcua-address-space": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-address-space/-/node-opcua-address-space-2.113.0.tgz", + "integrity": "sha512-rUrWb60z19LcXVnwl3n0ro2nGdP4V5Wxql8VJFSiNx94OqLaJt5hyhXjOKtk5jPLKUxWRf+N9R1POrWe7fOsfA==", + "dependencies": { + "@types/lodash": "4.14.198", + "@types/semver": "^7.5.1", + "async": "^3.2.4", + "chalk": "4.1.2", + "dequeue": "^1.0.5", + "lodash": "4.17.21", + "node-opcua-address-space-base": "2.113.0", + "node-opcua-assert": "2.105.0", + "node-opcua-basic-types": "2.113.0", + "node-opcua-binary-stream": "2.110.0", + "node-opcua-client-dynamic-extension-object": "2.113.0", + "node-opcua-constants": "2.98.1", + "node-opcua-crypto": "4.5.0", + "node-opcua-data-access": "2.113.0", + "node-opcua-data-model": "2.113.0", + "node-opcua-data-value": "2.113.0", + "node-opcua-date-time": "2.113.0", + "node-opcua-debug": "2.113.0", + "node-opcua-enum": "2.110.0", + "node-opcua-extension-object": "2.113.0", + "node-opcua-factory": "2.113.0", + "node-opcua-nodeid": "2.113.0", + "node-opcua-nodeset-ua": "2.113.0", + "node-opcua-numeric-range": "2.113.0", + "node-opcua-object-registry": "2.113.0", + "node-opcua-pseudo-session": "2.113.0", + "node-opcua-service-browse": "2.113.0", + "node-opcua-service-call": "2.113.0", + "node-opcua-service-history": "2.113.0", + "node-opcua-service-translate-browse-path": "2.113.0", + "node-opcua-service-write": "2.113.0", + "node-opcua-status-code": "2.110.0", + "node-opcua-types": "2.113.0", + "node-opcua-utils": "2.110.0", + "node-opcua-variant": "2.113.0", + "node-opcua-xml2json": "2.113.0", + "semver": "^7.5.4", + "set-prototype-of": "^1.0.0", + "thenify": "^3.3.1", + "xml-writer": "^1.7.0" + }, + "engines": { + "node": ">=6.10" + } + }, + "node_modules/node-opcua-address-space-base": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-address-space-base/-/node-opcua-address-space-base-2.113.0.tgz", + "integrity": "sha512-0R7IukPQiWY2y3vzJe6AVxDsFE7R0lvUJhDpEfmMYcvmRyPOp3+m5ib2jWn/ubiiovzmOulL81SXkZzwtWbBeQ==", + "dependencies": { + "node-opcua-assert": "2.105.0", + "node-opcua-basic-types": "2.113.0", + "node-opcua-constants": "2.98.1", + "node-opcua-crypto": "4.5.0", + "node-opcua-data-model": "2.113.0", + "node-opcua-data-value": "2.113.0", + "node-opcua-date-time": "2.113.0", + "node-opcua-debug": "2.113.0", + "node-opcua-extension-object": "2.113.0", + "node-opcua-nodeid": "2.113.0", + "node-opcua-numeric-range": "2.113.0", + "node-opcua-schemas": "2.113.0", + "node-opcua-status-code": "2.110.0", + "node-opcua-types": "2.113.0", + "node-opcua-variant": "2.113.0" + }, + "engines": { + "node": ">=6.10" + } + }, + "node_modules/node-opcua-address-space-for-conformance-testing": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-address-space-for-conformance-testing/-/node-opcua-address-space-for-conformance-testing-2.113.0.tgz", + "integrity": "sha512-ft1oy39/+KLUWQEhUifSHd064Me9N5xdPwnxS80xQvQohCCfzMK0HYKMFDwtmsJxiQFLRLyWiLL6Vt9uNXtUUQ==", + "dependencies": { + "node-opcua-address-space": "2.113.0", + "node-opcua-assert": "2.105.0", + "node-opcua-basic-types": "2.113.0", + "node-opcua-data-access": "2.113.0", + "node-opcua-data-model": "2.113.0", + "node-opcua-data-value": "2.113.0", + "node-opcua-debug": "2.113.0", + "node-opcua-factory": "2.113.0", + "node-opcua-nodeid": "2.113.0", + "node-opcua-status-code": "2.110.0", + "node-opcua-variant": "2.113.0" + } + }, + "node_modules/node-opcua-aggregates": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-aggregates/-/node-opcua-aggregates-2.113.0.tgz", + "integrity": "sha512-3CC9uBzyOrnoLPo/RI3olj1XUS81q29c1u1ReY2Jl3yTG2A28T5Xfq4/730W0CfZYIv1hO0KtxHxmJgp6fFO1w==", + "dependencies": { + "node-opcua-address-space": "2.113.0", + "node-opcua-assert": "2.105.0", + "node-opcua-constants": "2.98.1", + "node-opcua-data-model": "2.113.0", + "node-opcua-data-value": "2.113.0", + "node-opcua-nodeid": "2.113.0", + "node-opcua-numeric-range": "2.113.0", + "node-opcua-server": "2.113.0", + "node-opcua-service-history": "2.113.0", + "node-opcua-status-code": "2.110.0", + "node-opcua-types": "2.113.0", + "node-opcua-utils": "2.110.0", + "node-opcua-variant": "2.113.0" + } + }, + "node_modules/node-opcua-assert": { + "version": "2.105.0", + "resolved": "https://registry.npmjs.org/node-opcua-assert/-/node-opcua-assert-2.105.0.tgz", + "integrity": "sha512-q4VVsbfeXdXarTRga8d100NxkALvhEeAeN/YMBUsOkDIHh/VjrozknSSUT1c0h406QRZdmcoz7MnHCLG0+Rwxw==", + "dependencies": { + "chalk": "4.1.2" + } + }, + "node_modules/node-opcua-basic-types": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-basic-types/-/node-opcua-basic-types-2.113.0.tgz", + "integrity": "sha512-F+7vSGXddiCq+ZsL6bEmZaeHpeUCKknqbmp1vWHC+tdtHjhliTrVfIc8FkdjJepmEKdObzbQLPJnw3q0Ow1fOg==", + "dependencies": { + "node-opcua-assert": "2.105.0", + "node-opcua-binary-stream": "2.110.0", + "node-opcua-buffer-utils": "2.110.0", + "node-opcua-date-time": "2.113.0", + "node-opcua-guid": "2.98.1", + "node-opcua-nodeid": "2.113.0", + "node-opcua-status-code": "2.110.0" + } + }, + "node_modules/node-opcua-binary-stream": { + "version": "2.110.0", + "resolved": "https://registry.npmjs.org/node-opcua-binary-stream/-/node-opcua-binary-stream-2.110.0.tgz", + "integrity": "sha512-Cj7Klnh2kBzoyAEZmS5XTMImptVqWa/6WdV+j5hXgeFplljR5vsWA3j0W328Jjal+HczrSSqGM8zNLpGkRc4og==", + "dependencies": { + "node-opcua-assert": "2.105.0", + "node-opcua-buffer-utils": "2.110.0" + } + }, + "node_modules/node-opcua-buffer-utils": { + "version": "2.110.0", + "resolved": "https://registry.npmjs.org/node-opcua-buffer-utils/-/node-opcua-buffer-utils-2.110.0.tgz", + "integrity": "sha512-BkmPyX8G+0FVJqRIHdWtC3m4GE6wMl1mP5csSJg83iSEz1eY99cN0TbAZ0jGMM5AAlEABBnDotCKkdbyO3lJEQ==" + }, + "node_modules/node-opcua-certificate-manager": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-certificate-manager/-/node-opcua-certificate-manager-2.113.0.tgz", + "integrity": "sha512-s17D+rsnvaA1GxDVf64UdW036hs58YOzOaSBJ6lwb4lrL/BTTVXLD/5zoV0WkagB25ddPyrMsAm/kGzDJPd5mA==", + "dependencies": { + "@types/mkdirp": "1.0.2", + "env-paths": "2.2.1", + "mkdirp": "1.0.4", + "node-opcua-assert": "2.105.0", + "node-opcua-crypto": "4.5.0", + "node-opcua-debug": "2.113.0", + "node-opcua-object-registry": "2.113.0", + "node-opcua-pki": "4.7.0", + "node-opcua-status-code": "2.110.0", + "thenify": "^3.3.1" + } + }, + "node_modules/node-opcua-chunkmanager": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-chunkmanager/-/node-opcua-chunkmanager-2.113.0.tgz", + "integrity": "sha512-R21RiTAPCrmHC1sVTBLDmGq4dh8r1546tGF907TNUCSMNglb7xm0TGvasGjJjv6bBPqQczVjuygzaRsXBPWHVQ==", + "dependencies": { + "node-opcua-assert": "2.105.0", + "node-opcua-basic-types": "2.113.0", + "node-opcua-binary-stream": "2.110.0", + "node-opcua-buffer-utils": "2.110.0", + "node-opcua-factory": "2.113.0", + "node-opcua-packet-assembler": "2.113.0" + } + }, + "node_modules/node-opcua-client": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-client/-/node-opcua-client-2.113.0.tgz", + "integrity": "sha512-PyopaOvo37LJg4OQHR79cRwz1fCamkv5sHQdWiBvt9epeYEn57+7GvhZWdgQLyUv6afZ/qqBfFIru1SN/qa3Ew==", + "dependencies": { + "@ster5/global-mutex": "^2.0.0", + "@types/async": "^3.2.20", + "async": "^3.2.4", + "chalk": "4.1.2", + "node-opcua-assert": "2.105.0", + "node-opcua-basic-types": "2.113.0", + "node-opcua-buffer-utils": "2.110.0", + "node-opcua-certificate-manager": "2.113.0", + "node-opcua-client-dynamic-extension-object": "2.113.0", + "node-opcua-common": "2.113.0", + "node-opcua-constants": "2.98.1", + "node-opcua-crypto": "4.5.0", + "node-opcua-data-model": "2.113.0", + "node-opcua-data-value": "2.113.0", + "node-opcua-date-time": "2.113.0", + "node-opcua-debug": "2.113.0", + "node-opcua-extension-object": "2.113.0", + "node-opcua-hostname": "2.105.0", + "node-opcua-nodeid": "2.113.0", + "node-opcua-object-registry": "2.113.0", + "node-opcua-pki": "4.7.0", + "node-opcua-pseudo-session": "2.113.0", + "node-opcua-schemas": "2.113.0", + "node-opcua-secure-channel": "2.113.0", + "node-opcua-service-browse": "2.113.0", + "node-opcua-service-call": "2.113.0", + "node-opcua-service-discovery": "2.113.0", + "node-opcua-service-endpoints": "2.113.0", + "node-opcua-service-filter": "2.113.0", + "node-opcua-service-history": "2.113.0", + "node-opcua-service-query": "2.113.0", + "node-opcua-service-read": "2.113.0", + "node-opcua-service-register-node": "2.113.0", + "node-opcua-service-secure-channel": "2.113.0", + "node-opcua-service-session": "2.113.0", + "node-opcua-service-subscription": "2.113.0", + "node-opcua-service-translate-browse-path": "2.113.0", + "node-opcua-service-write": "2.113.0", + "node-opcua-status-code": "2.110.0", + "node-opcua-types": "2.113.0", + "node-opcua-utils": "2.110.0", + "node-opcua-variant": "2.113.0", + "thenify": "^3.3.1" + } + }, + "node_modules/node-opcua-client-crawler": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-client-crawler/-/node-opcua-client-crawler-2.113.0.tgz", + "integrity": "sha512-8wFkAc9ALtnH7ugaq/1BBPIv4OURI3CO8D1JomMWdZUN7lW/3LRIHRij0ajHDzx0SUPFwWT05tC3KD4S3vY1WQ==", + "dependencies": { + "async": "^3.2.4", + "chalk": "4.1.2", + "node-opcua-address-space": "2.113.0", + "node-opcua-assert": "2.105.0", + "node-opcua-client": "2.113.0", + "node-opcua-constants": "2.98.1", + "node-opcua-data-model": "2.113.0", + "node-opcua-data-value": "2.113.0", + "node-opcua-debug": "2.113.0", + "node-opcua-nodeid": "2.113.0", + "node-opcua-service-browse": "2.113.0", + "node-opcua-status-code": "2.110.0", + "node-opcua-types": "2.113.0", + "node-opcua-utils": "2.110.0", + "thenify": "^3.3.1" + } + }, + "node_modules/node-opcua-client-dynamic-extension-object": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-client-dynamic-extension-object/-/node-opcua-client-dynamic-extension-object-2.113.0.tgz", + "integrity": "sha512-sNgWtyxQgmf1Ix1jQ4kp96FHxH27AU9lflvCMabB+emd9Xh7XLSJnLH11UfPuEHkXPLMNAQE718dRxTD48tuHA==", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.105.0", + "node-opcua-binary-stream": "2.110.0", + "node-opcua-constants": "2.98.1", + "node-opcua-data-model": "2.113.0", + "node-opcua-data-value": "2.113.0", + "node-opcua-debug": "2.113.0", + "node-opcua-extension-object": "2.113.0", + "node-opcua-factory": "2.113.0", + "node-opcua-nodeid": "2.113.0", + "node-opcua-pseudo-session": "2.113.0", + "node-opcua-schemas": "2.113.0", + "node-opcua-service-browse": "2.113.0", + "node-opcua-service-translate-browse-path": "2.113.0", + "node-opcua-status-code": "2.110.0", + "node-opcua-types": "2.113.0", + "node-opcua-variant": "2.113.0" + } + }, + "node_modules/node-opcua-client-proxy": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-client-proxy/-/node-opcua-client-proxy-2.113.0.tgz", + "integrity": "sha512-/W+tfHYK1+Uxqk7OvmvL0WolaPfsEH7PtsAETSOFhhxe0gSUyTEGOx6NVo/+1YCMF3G7z8veMoXuVwTTicCSbA==", + "dependencies": { + "async": "^3.2.4", + "node-opcua-assert": "2.105.0", + "node-opcua-constants": "2.98.1", + "node-opcua-data-model": "2.113.0", + "node-opcua-data-value": "2.113.0", + "node-opcua-debug": "2.113.0", + "node-opcua-nodeid": "2.113.0", + "node-opcua-pseudo-session": "2.113.0", + "node-opcua-service-browse": "2.113.0", + "node-opcua-service-call": "2.113.0", + "node-opcua-service-read": "2.113.0", + "node-opcua-service-subscription": "2.113.0", + "node-opcua-service-write": "2.113.0", + "node-opcua-status-code": "2.110.0", + "node-opcua-utils": "2.110.0", + "node-opcua-variant": "2.113.0", + "thenify": "^3.3.1" + } + }, + "node_modules/node-opcua-common": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-common/-/node-opcua-common-2.113.0.tgz", + "integrity": "sha512-U8O3Ke9+IQstFVtv22xsZCap1hBvXBo9YLfPYt9TQFCKlDQragJd/yYWZZpcx3LfY0ppjRQsOzSgsxckTLb7Dg==", + "dependencies": { + "node-opcua-assert": "2.105.0", + "node-opcua-crypto": "4.5.0", + "node-opcua-types": "2.113.0" + } + }, + "node_modules/node-opcua-constants": { + "version": "2.98.1", + "resolved": "https://registry.npmjs.org/node-opcua-constants/-/node-opcua-constants-2.98.1.tgz", + "integrity": "sha512-7RDmofF6vajYmmsbm/t0obqZlL0K7KKgYe4V+QT8qSGdNFrmDANHiAUhgPljur8e8taaDUXFcaOhS4fYjMN1WQ==" + }, + "node_modules/node-opcua-crypto": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/node-opcua-crypto/-/node-opcua-crypto-4.5.0.tgz", + "integrity": "sha512-ydeXsU3B1IV2hvVb74Kuttwcy5pcxyALS/r7bgNFedb9Ca5btiUUP9VCCKq3O/sNfW9tFllfeCzN7Zbxifk4Cw==", + "dependencies": { + "@peculiar/webcrypto": "^1.4.3", + "@peculiar/x509": "^1.9.5", + "@types/jsrsasign": "^10.5.8", + "@types/sshpk": "^1.17.1", + "assert": "^2.0.0", + "better-assert": "^1.0.2", + "chalk": "^4.1.2", + "hexy": "0.3.5", + "jsrsasign": "^10.8.6", + "sshpk": "^1.17.0" + } + }, + "node_modules/node-opcua-data-access": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-data-access/-/node-opcua-data-access-2.113.0.tgz", + "integrity": "sha512-bodMVwiqCOwZvwrRk1+xf1BGIjhnks0vi0itIY4tVRK2WpbVwUnZ7oO5zzjimGw/DC4Wwz/CeWj38wNsOm63Rg==", + "dependencies": { + "node-opcua-data-model": "2.113.0", + "node-opcua-types": "2.113.0" + } + }, + "node_modules/node-opcua-data-model": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-data-model/-/node-opcua-data-model-2.113.0.tgz", + "integrity": "sha512-BoHU6JiSvRQ4nXQ74PJag5nyeHQdczXZdzsDcK8NAajH1zCr5T3L0t/2QMbt0rgSL8JNL+5ZhXCOofVbsJ1XVA==", + "dependencies": { + "node-opcua-assert": "2.105.0", + "node-opcua-basic-types": "2.113.0", + "node-opcua-binary-stream": "2.110.0", + "node-opcua-enum": "2.110.0", + "node-opcua-factory": "2.113.0", + "node-opcua-nodeid": "2.113.0", + "node-opcua-status-code": "2.110.0" + } + }, + "node_modules/node-opcua-data-value": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-data-value/-/node-opcua-data-value-2.113.0.tgz", + "integrity": "sha512-nOTejK412JvTerhDLSaYgAmsbvBt4heH+mavqg4PO5hRY8fVXIWro1jOP2WYNplCUR4G9a8K9sbYHpkpnmQ3wg==", + "dependencies": { + "node-opcua-assert": "2.105.0", + "node-opcua-basic-types": "2.113.0", + "node-opcua-binary-stream": "2.110.0", + "node-opcua-data-model": "2.113.0", + "node-opcua-date-time": "2.113.0", + "node-opcua-enum": "2.110.0", + "node-opcua-factory": "2.113.0", + "node-opcua-status-code": "2.110.0", + "node-opcua-variant": "2.113.0" + } + }, + "node_modules/node-opcua-date-time": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-date-time/-/node-opcua-date-time-2.113.0.tgz", + "integrity": "sha512-Gk/8t18Tjf+g+RIGFpOd6lCG5eScxE8PJWvOxQ7NjZRU0uGB/+Xxmy/2iRx5I9VKmyWxAj/ehzeBfvAec7PrVA==", + "dependencies": { + "long": "^4.0.0", + "node-opcua-assert": "2.105.0", + "node-opcua-binary-stream": "2.110.0", + "node-opcua-utils": "2.110.0" + } + }, + "node_modules/node-opcua-debug": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-debug/-/node-opcua-debug-2.113.0.tgz", + "integrity": "sha512-+0NDhyIvupWwCSZgPfvMLHxIPlWFmUKUMkOeRurIEezKfH2m+ZFeIVyCsl8sBiaNozhjFpFv0iRtNe9LoZ78CA==", + "dependencies": { + "chalk": "4.1.2", + "hexy": "0.3.5", + "node-opcua-assert": "2.105.0", + "node-opcua-buffer-utils": "2.110.0" + } + }, + "node_modules/node-opcua-enum": { + "version": "2.110.0", + "resolved": "https://registry.npmjs.org/node-opcua-enum/-/node-opcua-enum-2.110.0.tgz", + "integrity": "sha512-SX3oS7Q8cGaSHCX0Y9bluD2s0NzQ+aLEbj4i7i8rgE9Tl1Msj1dIIvRoUmn5MIdHlx58UyGAYfik/4mSiLKi1w==" + }, + "node_modules/node-opcua-extension-object": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-extension-object/-/node-opcua-extension-object-2.113.0.tgz", + "integrity": "sha512-iWhoJEmXnyiR/pltDVnKmQ9S/X1o6h/BiEGhJVPADjmjQrk+lV49L5IcpkG+RhMU8kUfPZWr4NzBHmnJU0jGmw==", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-basic-types": "2.113.0", + "node-opcua-binary-stream": "2.110.0", + "node-opcua-debug": "2.113.0", + "node-opcua-factory": "2.113.0", + "node-opcua-nodeid": "2.113.0" + } + }, + "node_modules/node-opcua-factory": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-factory/-/node-opcua-factory-2.113.0.tgz", + "integrity": "sha512-IgkhQ9pxsBUbrFpWsl0gpDt57xlU/fXK9VzSORMlIOdvnT3H6h+IN/uOazw16KXZ0smsTFDz2VebxpJOOSrXEQ==", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.105.0", + "node-opcua-basic-types": "2.113.0", + "node-opcua-binary-stream": "2.110.0", + "node-opcua-constants": "2.98.1", + "node-opcua-debug": "2.113.0", + "node-opcua-enum": "2.110.0", + "node-opcua-guid": "2.98.1", + "node-opcua-nodeid": "2.113.0", + "node-opcua-status-code": "2.110.0", + "node-opcua-utils": "2.110.0" + } + }, + "node_modules/node-opcua-generator": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-generator/-/node-opcua-generator-2.113.0.tgz", + "integrity": "sha512-/2ElUHZH07mk+rBZo24qEjrFplMadVnRLpWHajvNLTCEthDbR4gRK+55RMVtppG/L/xn1uDtXUXyISqxExg5LA==", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.105.0", + "node-opcua-constants": "2.98.1", + "node-opcua-debug": "2.113.0", + "node-opcua-factory": "2.113.0", + "node-opcua-nodeid": "2.113.0", + "node-opcua-schemas": "2.113.0", + "node-opcua-utils": "2.110.0" + } + }, + "node_modules/node-opcua-guid": { + "version": "2.98.1", + "resolved": "https://registry.npmjs.org/node-opcua-guid/-/node-opcua-guid-2.98.1.tgz", + "integrity": "sha512-09hWgnEUhq6t0QPrCIklAa4/x2aNhp1te0l2IkFQdNkJ8iYEBEKk0lJG7+nA+fNyys0ccUohvHdvuFae2fSGTw==" + }, + "node_modules/node-opcua-hostname": { + "version": "2.105.0", + "resolved": "https://registry.npmjs.org/node-opcua-hostname/-/node-opcua-hostname-2.105.0.tgz", + "integrity": "sha512-nb55yjaaRaxxyypcy3QQ1brml1eK1lBTECy6+36v9v/gs0Kuv9rtdQbu4sZ089qOeuvsWNCFHPDULlLyfDMgeQ==" + }, + "node_modules/node-opcua-json": { + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/node-opcua-json/-/node-opcua-json-0.50.0.tgz", + "integrity": "sha512-h0bhbxHjzCcyDg1CrpLKIdRPh94QjupiytVk7WdZCnTZ4uuxvJJnnW+sfZ1id9pnAFchFEpI4sFgn7TCljegpg==", + "peerDependencies": { + "node-opcua-address-space": ">=2.110.0", + "node-opcua-basic-types": ">=2.110.0", + "node-opcua-binary-stream": ">=2.110.0", + "node-opcua-buffer-utils": ">=2.110.0", + "node-opcua-data-model": ">=2.110.0", + "node-opcua-data-value": ">=2.110.0", + "node-opcua-date-time": ">=2.110.0", + "node-opcua-debug": ">=2.110.0", + "node-opcua-extension-object": ">=2.110.0", + "node-opcua-factory": ">=2.110.0", + "node-opcua-nodeid": ">=2.110.0", + "node-opcua-numeric-range": ">=2.110.0", + "node-opcua-status-code": ">=2.110.0", + "node-opcua-types": ">=2.110.0", + "node-opcua-variant": ">=2.110.0" + } + }, + "node_modules/node-opcua-nodeid": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-nodeid/-/node-opcua-nodeid-2.113.0.tgz", + "integrity": "sha512-XkgKMcQoQ6omm8sw3156kUj9nFK/BbdyaGHEk/Hu10AvP2OE9B5OcG0YpYLXFqhLfr2R3BaifWDqf4RU3R7c/A==", + "dependencies": { + "node-opcua-assert": "2.105.0", + "node-opcua-constants": "2.98.1", + "node-opcua-guid": "2.98.1" + } + }, + "node_modules/node-opcua-nodeset-ua": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-nodeset-ua/-/node-opcua-nodeset-ua-2.113.0.tgz", + "integrity": "sha512-OqIY7rWXfo9EhCJqZCfqm7ie1hq7xz7d65pwB5tKvGUGMqUsG8xLCU+cfxCCW1pHkR0DJaPhBhuZxlS0UmRB3Q==", + "dependencies": { + "node-opcua-address-space-base": "2.113.0", + "node-opcua-basic-types": "2.113.0", + "node-opcua-data-access": "2.113.0", + "node-opcua-data-model": "2.113.0", + "node-opcua-data-value": "2.113.0", + "node-opcua-extension-object": "2.113.0", + "node-opcua-nodeid": "2.113.0", + "node-opcua-status-code": "2.110.0", + "node-opcua-variant": "2.113.0" + } + }, + "node_modules/node-opcua-nodesets": { + "version": "2.110.0", + "resolved": "https://registry.npmjs.org/node-opcua-nodesets/-/node-opcua-nodesets-2.110.0.tgz", + "integrity": "sha512-ELd0d0VFbf9QoWRzv+WsqbqWHikoF9l2SikEP3VyPc6H4j8/TH4QbKHf5Rt1LjJbM6mPyVX0fQIidqRKg1fDEg==" + }, + "node_modules/node-opcua-numeric-range": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-numeric-range/-/node-opcua-numeric-range-2.113.0.tgz", + "integrity": "sha512-HoV/zCqD/I0fmUQw/mw8w4TlChKljK4/19ydGYpO+9UzGgtug1BriXR4IBY4B5d22yc+YZ25fbekV/zjNznhvA==", + "dependencies": { + "node-opcua-assert": "2.105.0", + "node-opcua-basic-types": "2.113.0", + "node-opcua-binary-stream": "2.110.0", + "node-opcua-factory": "2.113.0", + "node-opcua-status-code": "2.110.0" + } + }, + "node_modules/node-opcua-object-registry": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-object-registry/-/node-opcua-object-registry-2.113.0.tgz", + "integrity": "sha512-qNSC+3+a0xKDm6v/YgMaizxBHna19o9SJuxTZVUOD9jCUEZxpHmvmrGcsfar4wFyXCsAw00PwFjYLs9+CJ8QMw==", + "dependencies": { + "node-opcua-assert": "2.105.0", + "node-opcua-debug": "2.113.0" + } + }, + "node_modules/node-opcua-packet-analyzer": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-packet-analyzer/-/node-opcua-packet-analyzer-2.113.0.tgz", + "integrity": "sha512-HwScO02t9Bk88gg4D79OKbmL3NPxJzbj93nmClD4709aLKzi6XshJbhH62nDh7zHvRUu3DqsJFbOcJMvj5CggQ==", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.105.0", + "node-opcua-basic-types": "2.113.0", + "node-opcua-binary-stream": "2.110.0", + "node-opcua-debug": "2.113.0", + "node-opcua-factory": "2.113.0", + "node-opcua-utils": "2.110.0" + } + }, + "node_modules/node-opcua-packet-assembler": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-packet-assembler/-/node-opcua-packet-assembler-2.113.0.tgz", + "integrity": "sha512-uLYiKz1Kj6CCx3GnOIiNACt3c3vQc4UUTTN+96kOF8pXLQm7XxWcDdQJB2p7SHI8Yo3n55rkRUYYlarxzqib9Q==", + "dependencies": { + "node-opcua-assert": "2.105.0", + "node-opcua-debug": "2.113.0" + } + }, + "node_modules/node-opcua-pki": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/node-opcua-pki/-/node-opcua-pki-4.7.0.tgz", + "integrity": "sha512-Ur5hNlpnsV7KMW4E30VnajZ+SdKCAfIWf/+GUu2hZEoKptE3zYGNT+lTGEnmWHi07trsxmURfNCJM5QUKXrWwg==", + "dependencies": { + "@ster5/global-mutex": "^2.0.0", + "async": "^3.2.4", + "byline": "^5.0.0", + "chalk": "4.1.2", + "chokidar": "^3.5.3", + "cli-table": "^0.3.11", + "minimist": "^1.2.8", + "node-opcua-crypto": "4.5.0", + "progress": "^2.0.3", + "rimraf": "3.0.2", + "thenify": "^3.3.1", + "wget-improved-2": "^3.3.0", + "yargs": "17.7.2", + "yauzl": "^2.10.0" + }, + "bin": { + "pki": "bin/crypto_create_CA.js" + } + }, + "node_modules/node-opcua-pseudo-session": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-pseudo-session/-/node-opcua-pseudo-session-2.113.0.tgz", + "integrity": "sha512-DU1McAtb9w1JB0b6wqm2ZfOu5sQODqRqfKkP/mlrqLBe780k1ysWr77TEPkdklQaXGqr9HUkXsRMIC2Zg2KBIg==", + "dependencies": { + "node-opcua-assert": "2.105.0", + "node-opcua-basic-types": "2.113.0", + "node-opcua-constants": "2.98.1", + "node-opcua-data-model": "2.113.0", + "node-opcua-data-value": "2.113.0", + "node-opcua-debug": "2.113.0", + "node-opcua-nodeid": "2.113.0", + "node-opcua-service-browse": "2.113.0", + "node-opcua-service-call": "2.113.0", + "node-opcua-service-read": "2.113.0", + "node-opcua-service-subscription": "2.113.0", + "node-opcua-service-translate-browse-path": "2.113.0", + "node-opcua-service-write": "2.113.0", + "node-opcua-status-code": "2.110.0", + "node-opcua-types": "2.113.0", + "node-opcua-variant": "2.113.0", + "thenify": "^3.3.1" + } + }, + "node_modules/node-opcua-pubsub-client": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/node-opcua-pubsub-client/-/node-opcua-pubsub-client-0.19.1.tgz", + "integrity": "sha512-TVqgMum+GF9Wlq1L4N5F5ZrSpLoPnreWs7zwxebSBDyCtKmF5giNGqvtJLs6yPHXLiCpKviC+cLgRWh0+gdxyQ==", + "dependencies": { + "@types/aws-iot-device-sdk": "^2.2.4" + }, + "peerDependencies": { + "node-opcua-basic-types": ">=2.64.0", + "node-opcua-client": ">=2.64.0", + "node-opcua-constants": ">=2.64.0", + "node-opcua-data-model": ">=2.64.0", + "node-opcua-debug": ">=2.64.0", + "node-opcua-nodeid": ">=2.64.0", + "node-opcua-pseudo-session": ">=2.64.0", + "node-opcua-service-browse": ">=2.64.0", + "node-opcua-service-translate-browse-path": ">=2.64.0", + "node-opcua-status-code": ">=2.64.0", + "node-opcua-types": ">=2.64.0", + "node-opcua-variant": ">=2.64.0" + } + }, + "node_modules/node-opcua-schemas": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-schemas/-/node-opcua-schemas-2.113.0.tgz", + "integrity": "sha512-louJxttAhpVuvfENVzx60q/zoWthdmxo55c7qToy/cq/P9mp3fLHIJzc3tWGMR1iqzAoW/NwGFqab3oGI/U18A==", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.105.0", + "node-opcua-binary-stream": "2.110.0", + "node-opcua-debug": "2.113.0", + "node-opcua-extension-object": "2.113.0", + "node-opcua-factory": "2.113.0", + "node-opcua-nodeid": "2.113.0", + "node-opcua-variant": "2.113.0", + "node-opcua-xml2json": "2.113.0" + } + }, + "node_modules/node-opcua-secure-channel": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-secure-channel/-/node-opcua-secure-channel-2.113.0.tgz", + "integrity": "sha512-UqmWk2hvD2Kv0Cw4qIyut4z7794RIfiFPRHCv4QINewYTtjLeTgDhpbixMzcLqtE9TSJdyyWZTWR2gHriYh2yA==", + "dependencies": { + "async": "^3.2.4", + "backoff": "^2.5.0", + "chalk": "4.1.2", + "node-opcua-assert": "2.105.0", + "node-opcua-basic-types": "2.113.0", + "node-opcua-binary-stream": "2.110.0", + "node-opcua-certificate-manager": "2.113.0", + "node-opcua-chunkmanager": "2.113.0", + "node-opcua-common": "2.113.0", + "node-opcua-crypto": "4.5.0", + "node-opcua-debug": "2.113.0", + "node-opcua-factory": "2.113.0", + "node-opcua-nodeid": "2.113.0", + "node-opcua-object-registry": "2.113.0", + "node-opcua-packet-analyzer": "2.113.0", + "node-opcua-service-endpoints": "2.113.0", + "node-opcua-service-secure-channel": "2.113.0", + "node-opcua-status-code": "2.110.0", + "node-opcua-transport": "2.113.0", + "node-opcua-types": "2.113.0", + "node-opcua-utils": "2.110.0" + } + }, + "node_modules/node-opcua-server": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-server/-/node-opcua-server-2.113.0.tgz", + "integrity": "sha512-hdFmTST51npCneVYR6d0qzYN+qIf4LDDallLoffg0qbcLIE2JKxrdZADkfX37RNM/iTfMbHyDHB4XLE/A64/wg==", + "dependencies": { + "@ster5/global-mutex": "^2.0.0", + "async": "^3.2.4", + "chalk": "4.1.2", + "dequeue": "^1.0.5", + "lodash": "4.17.21", + "node-opcua-address-space": "2.113.0", + "node-opcua-address-space-base": "2.113.0", + "node-opcua-assert": "2.105.0", + "node-opcua-basic-types": "2.113.0", + "node-opcua-binary-stream": "2.110.0", + "node-opcua-certificate-manager": "2.113.0", + "node-opcua-client": "2.113.0", + "node-opcua-client-dynamic-extension-object": "2.113.0", + "node-opcua-common": "2.113.0", + "node-opcua-constants": "2.98.1", + "node-opcua-crypto": "4.5.0", + "node-opcua-data-model": "2.113.0", + "node-opcua-data-value": "2.113.0", + "node-opcua-date-time": "2.113.0", + "node-opcua-debug": "2.113.0", + "node-opcua-extension-object": "2.113.0", + "node-opcua-factory": "2.113.0", + "node-opcua-hostname": "2.105.0", + "node-opcua-nodeid": "2.113.0", + "node-opcua-nodesets": "2.110.0", + "node-opcua-numeric-range": "2.113.0", + "node-opcua-object-registry": "2.113.0", + "node-opcua-secure-channel": "2.113.0", + "node-opcua-service-browse": "2.113.0", + "node-opcua-service-call": "2.113.0", + "node-opcua-service-discovery": "2.113.0", + "node-opcua-service-endpoints": "2.113.0", + "node-opcua-service-filter": "2.113.0", + "node-opcua-service-history": "2.113.0", + "node-opcua-service-node-management": "2.113.0", + "node-opcua-service-query": "2.113.0", + "node-opcua-service-read": "2.113.0", + "node-opcua-service-register-node": "2.113.0", + "node-opcua-service-secure-channel": "2.113.0", + "node-opcua-service-session": "2.113.0", + "node-opcua-service-subscription": "2.113.0", + "node-opcua-service-translate-browse-path": "2.113.0", + "node-opcua-service-write": "2.113.0", + "node-opcua-status-code": "2.110.0", + "node-opcua-types": "2.113.0", + "node-opcua-utils": "2.110.0", + "node-opcua-variant": "2.113.0", + "thenify": "^3.3.1" + } + }, + "node_modules/node-opcua-server-discovery": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-server-discovery/-/node-opcua-server-discovery-2.113.0.tgz", + "integrity": "sha512-Tf2dzwVIm0IZu4U6mks+nBJ8V9Bi0hX/JIwkC0FNFbwbk2auBjcUOGP8lp9WzmmuIbYZMeM9E1j101Mg8HhDnQ==", + "dependencies": { + "chalk": "4.1.2", + "env-paths": "2.2.1", + "node-opcua-assert": "2.105.0", + "node-opcua-basic-types": "2.113.0", + "node-opcua-certificate-manager": "2.113.0", + "node-opcua-common": "2.113.0", + "node-opcua-debug": "2.113.0", + "node-opcua-hostname": "2.105.0", + "node-opcua-object-registry": "2.113.0", + "node-opcua-secure-channel": "2.113.0", + "node-opcua-server": "2.113.0", + "node-opcua-service-discovery": "2.113.0", + "node-opcua-service-endpoints": "2.113.0", + "node-opcua-status-code": "2.110.0", + "sterfive-bonjour-service": "1.1.4", + "thenify": "^3.3.1" + } + }, + "node_modules/node-opcua-service-browse": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-browse/-/node-opcua-service-browse-2.113.0.tgz", + "integrity": "sha512-89A2ujS30BX/yE3PQ53MmZeFHkSPHnZwqt/RkGuT28DvOYWkhq5knhNHEf6k1UzEhDfNM/4ifXx/Ep314uK8Pg==", + "dependencies": { + "node-opcua-data-model": "2.113.0", + "node-opcua-types": "2.113.0" + } + }, + "node_modules/node-opcua-service-call": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-call/-/node-opcua-service-call-2.113.0.tgz", + "integrity": "sha512-xpjOTs7JI0ifZvrocGLRWxQJg4Lkz0Z7qsnacNMHKA5Ny5GQXrU2y0Avm4gnAg5XS2oB3HfDVcpXRq8cegeriQ==", + "dependencies": { + "node-opcua-assert": "2.105.0", + "node-opcua-nodeid": "2.113.0", + "node-opcua-types": "2.113.0", + "node-opcua-variant": "2.113.0" + } + }, + "node_modules/node-opcua-service-discovery": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-discovery/-/node-opcua-service-discovery-2.113.0.tgz", + "integrity": "sha512-OHoIXHIco68p2TtDZSB11Z+J2KdGj1BwLb53DS8uyhwchy+Fg4UIprdLS2J9iAeO3VJygbI5SOEQOejH8bu2yA==", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.105.0", + "node-opcua-debug": "2.113.0", + "node-opcua-object-registry": "2.113.0", + "node-opcua-types": "2.113.0", + "sterfive-bonjour-service": "1.1.4" + } + }, + "node_modules/node-opcua-service-endpoints": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-endpoints/-/node-opcua-service-endpoints-2.113.0.tgz", + "integrity": "sha512-jPIphZ8xNuAECkW+F3l5FCkrqECswipz6M4iwQHTe8doResv6z2mM4nhf8MOLnmdh1nGtSD29AMd9gzaTDSSpg==", + "dependencies": { + "node-opcua-types": "2.113.0" + } + }, + "node_modules/node-opcua-service-filter": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-filter/-/node-opcua-service-filter-2.113.0.tgz", + "integrity": "sha512-lk4574gHEMzg+gC359lSIgphfbUVV3N8mRzX/tMyd/sZQPuUoNbustID8k/H+uh2gLnQD0e2aSsrHL82y6+K7g==", + "dependencies": { + "node-opcua-address-space-base": "2.113.0", + "node-opcua-assert": "2.105.0", + "node-opcua-basic-types": "2.113.0", + "node-opcua-constants": "2.98.1", + "node-opcua-data-model": "2.113.0", + "node-opcua-data-value": "2.113.0", + "node-opcua-debug": "2.113.0", + "node-opcua-extension-object": "2.113.0", + "node-opcua-nodeid": "2.113.0", + "node-opcua-service-translate-browse-path": "2.113.0", + "node-opcua-status-code": "2.110.0", + "node-opcua-types": "2.113.0", + "node-opcua-variant": "2.113.0" + } + }, + "node_modules/node-opcua-service-history": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-history/-/node-opcua-service-history-2.113.0.tgz", + "integrity": "sha512-LkGjpAtSL/STXx8KpzRGKdhuQ7f5j1dhPTKKAS5i+oDjiNfEjIrhLJexoGYKxIFLI//awpemD3SOH1l7d1i72g==", + "dependencies": { + "node-opcua-assert": "2.105.0", + "node-opcua-data-value": "2.113.0", + "node-opcua-types": "2.113.0" + } + }, + "node_modules/node-opcua-service-node-management": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-node-management/-/node-opcua-service-node-management-2.113.0.tgz", + "integrity": "sha512-tp3WhUOrjM/NJ6yEfgbvaIXSj/Nd4Kh1rw/q/cQsYrs9uIOTq2B/q0XoGlNj0CLIiXUTtPx62CZWEZxR11oL2Q==", + "dependencies": { + "node-opcua-types": "2.113.0" + } + }, + "node_modules/node-opcua-service-query": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-query/-/node-opcua-service-query-2.113.0.tgz", + "integrity": "sha512-5MEuwn3hYZWkjXVdz1m9GxIB2iAh2hXMK1AirjiTKWaN7J5U6tUBU+I4C5zCnpjJqYo+7jATSpXGEN7suOSxdQ==", + "dependencies": { + "node-opcua-types": "2.113.0" + } + }, + "node_modules/node-opcua-service-read": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-read/-/node-opcua-service-read-2.113.0.tgz", + "integrity": "sha512-+fEfKZ+gbgv2RVMDyGheQ9gJ8NhW01VEotaZQFczP3RNnwCTz5km7hr7iOY/9KXALBTKYsDmFO2rjPntz54daw==", + "dependencies": { + "node-opcua-assert": "2.105.0", + "node-opcua-data-model": "2.113.0", + "node-opcua-data-value": "2.113.0", + "node-opcua-service-secure-channel": "2.113.0", + "node-opcua-types": "2.113.0" + } + }, + "node_modules/node-opcua-service-register-node": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-register-node/-/node-opcua-service-register-node-2.113.0.tgz", + "integrity": "sha512-2nDvSi2DEMDXPvy5YFFD/rjhlWb4etZO/Ak09OkMnzZg+9ZNdpzpozpLtB0r4Sfhq62yY4eoVx+o4EUmvYF4NQ==", + "dependencies": { + "node-opcua-types": "2.113.0" + } + }, + "node_modules/node-opcua-service-secure-channel": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-secure-channel/-/node-opcua-service-secure-channel-2.113.0.tgz", + "integrity": "sha512-rD/7An36GrQBgBD1RAcvrWmN1JZPDxlWoRR4P/x+DzdvCPvZKrWukbXfrZRqxu1+zYBB9bnFmS+wXz0oDp2y/A==", + "dependencies": { + "node-opcua-assert": "2.105.0", + "node-opcua-basic-types": "2.113.0", + "node-opcua-binary-stream": "2.110.0", + "node-opcua-factory": "2.113.0", + "node-opcua-types": "2.113.0" + } + }, + "node_modules/node-opcua-service-session": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-session/-/node-opcua-service-session-2.113.0.tgz", + "integrity": "sha512-Jc5oh7y5NKsNt6CiJGaoufE34irkpFk7WNpnyZ0xxtuT2/GFasry4yPCiKo5dtNm+rS4bWtaNTJBMKmbeCMUjQ==", + "dependencies": { + "node-opcua-factory": "2.113.0", + "node-opcua-types": "2.113.0" + } + }, + "node_modules/node-opcua-service-subscription": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-subscription/-/node-opcua-service-subscription-2.113.0.tgz", + "integrity": "sha512-6CK5wC6427UUUNtYJRUC0CGyK+d1KFF+ZHLVuIWJVnHczxmXYtB57QBbElZidc9XPBl5dJZvFYxxz5xFgK9sSg==", + "dependencies": { + "node-opcua-assert": "2.105.0", + "node-opcua-types": "2.113.0", + "node-opcua-variant": "2.113.0" + } + }, + "node_modules/node-opcua-service-translate-browse-path": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-translate-browse-path/-/node-opcua-service-translate-browse-path-2.113.0.tgz", + "integrity": "sha512-2Q+jhwUFpOmsl88ohNIodoNfU5hJunKkwslbqhIoa5p573HzfNtnBXqNmRWe3QFhRt2L4qNV4h1SfybJGTjDlQ==", + "dependencies": { + "node-opcua-assert": "2.105.0", + "node-opcua-constants": "2.98.1", + "node-opcua-data-model": "2.113.0", + "node-opcua-nodeid": "2.113.0", + "node-opcua-types": "2.113.0" + } + }, + "node_modules/node-opcua-service-write": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-write/-/node-opcua-service-write-2.113.0.tgz", + "integrity": "sha512-vmkcvZgXT3rq6lm058syh+mFGIjiwbp6Cq+5o//fbsibH5MYLQn5VL/c9LklhH1lPyyy0v9UDp9+4s7dmmZNaA==", + "dependencies": { + "node-opcua-types": "2.113.0" + } + }, + "node_modules/node-opcua-status-code": { + "version": "2.110.0", + "resolved": "https://registry.npmjs.org/node-opcua-status-code/-/node-opcua-status-code-2.110.0.tgz", + "integrity": "sha512-35iSc6SW8S4FyMdU6BfhtYD/2TJWemQb1quMXBJnR97/OzkS+uBOOSbP8NNBxbcT0rXMC4B3EqC2psYALIy9Fw==", + "dependencies": { + "node-opcua-assert": "2.105.0", + "node-opcua-binary-stream": "2.110.0" + } + }, + "node_modules/node-opcua-transport": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-transport/-/node-opcua-transport-2.113.0.tgz", + "integrity": "sha512-xg5pBiYPT5zbQlT79xeKmeNyQjdRBP1VRcK+bdRZVARM34SRfLgUCY7//Z5CNyijeqbFwyuhthHKD8ae5pUbvw==", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.105.0", + "node-opcua-basic-types": "2.113.0", + "node-opcua-binary-stream": "2.110.0", + "node-opcua-buffer-utils": "2.110.0", + "node-opcua-chunkmanager": "2.113.0", + "node-opcua-debug": "2.113.0", + "node-opcua-factory": "2.113.0", + "node-opcua-object-registry": "2.113.0", + "node-opcua-packet-assembler": "2.113.0", + "node-opcua-status-code": "2.110.0", + "node-opcua-utils": "2.110.0" + } + }, + "node_modules/node-opcua-types": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-types/-/node-opcua-types-2.113.0.tgz", + "integrity": "sha512-htUgU8/Zrp2zR3cFocnEgwgyJpu0xoplSFDwx685l3Xu9Hy8migbohsg8kDiOXjm86mgCCjkcVS55YaMhuEbuQ==", + "dependencies": { + "node-opcua-assert": "2.105.0", + "node-opcua-basic-types": "2.113.0", + "node-opcua-binary-stream": "2.110.0", + "node-opcua-data-model": "2.113.0", + "node-opcua-data-value": "2.113.0", + "node-opcua-enum": "2.110.0", + "node-opcua-extension-object": "2.113.0", + "node-opcua-factory": "2.113.0", + "node-opcua-generator": "2.113.0", + "node-opcua-nodeid": "2.113.0", + "node-opcua-numeric-range": "2.113.0", + "node-opcua-status-code": "2.110.0", + "node-opcua-variant": "2.113.0" + } + }, + "node_modules/node-opcua-utils": { + "version": "2.110.0", + "resolved": "https://registry.npmjs.org/node-opcua-utils/-/node-opcua-utils-2.110.0.tgz", + "integrity": "sha512-Va0An8sZUoYsoJxkjRxaPIFK2LWQuzd3p342tb5TQBKIKcnXcJeMZK8gzupJQ96u9nwVfvJcOWATvWRj1OyRhw==", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.105.0" + } + }, + "node_modules/node-opcua-variant": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-variant/-/node-opcua-variant-2.113.0.tgz", + "integrity": "sha512-fLBi4x2W16259poqBlybJUHrB/z/0DpWtDs5aZ7xZT9tlkSCxtva30gnlMjnGruNEdvSKGN68GJduEAYYBROIQ==", + "dependencies": { + "node-opcua-assert": "2.105.0", + "node-opcua-basic-types": "2.113.0", + "node-opcua-binary-stream": "2.110.0", + "node-opcua-data-model": "2.113.0", + "node-opcua-enum": "2.110.0", + "node-opcua-factory": "2.113.0", + "node-opcua-nodeid": "2.113.0", + "node-opcua-utils": "2.110.0" + } + }, + "node_modules/node-opcua-vendor-diagnostic": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-vendor-diagnostic/-/node-opcua-vendor-diagnostic-2.113.0.tgz", + "integrity": "sha512-sN6SlCq13HUkTdhSEIiJWEJ82dEtKc3hjElDrfR1jn4l24tl5E4FohQMItgF4m4bZxXZu4DKtD2ZmMeb043PYw==", + "dependencies": { + "humanize": "0.0.9", + "node-opcua-address-space": "2.113.0", + "node-opcua-assert": "2.105.0", + "node-opcua-constants": "2.98.1", + "node-opcua-debug": "2.113.0", + "node-opcua-server": "2.113.0", + "node-opcua-status-code": "2.110.0", + "node-opcua-variant": "2.113.0" + } + }, + "node_modules/node-opcua-xml2json": { + "version": "2.113.0", + "resolved": "https://registry.npmjs.org/node-opcua-xml2json/-/node-opcua-xml2json-2.113.0.tgz", + "integrity": "sha512-BMJI7yuK3BakzbCW1SuzuATlbCHtxKb596g4FLwC/cIxr25F4GRc1bl9ZrfmQBVvCt/Denk8pT66NfcKeGB8ZQ==", + "dependencies": { + "ltx": "^3.0.0", + "node-opcua-assert": "2.105.0", + "node-opcua-utils": "2.110.0", + "thenify": "^3.3.1", + "xml-writer": "^1.7.0" + } + }, + "node_modules/nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "engines": { + "node": ">=12.19" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "optional": true, + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/number-allocator": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.14.tgz", + "integrity": "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==", + "dependencies": { + "debug": "^4.3.1", + "js-sdsl": "4.3.0" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.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==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/popsicle": { + "version": "12.1.2", + "resolved": "https://registry.npmjs.org/popsicle/-/popsicle-12.1.2.tgz", + "integrity": "sha512-xE2vEUa15TiHvFhGmKTtdKk9aSLL5CHX8Vw5kHfVM3R0YHiaTon6Ybsamw0XYqMR+Ng2RijX88iYUKPBMpLBww==", + "dependencies": { + "popsicle-content-encoding": "^1.0.0", + "popsicle-cookie-jar": "^1.0.1", + "popsicle-redirects": "^1.1.0", + "popsicle-transport-http": "^1.1.0", + "popsicle-transport-xhr": "^2.0.0", + "popsicle-user-agent": "^1.0.0", + "servie": "^4.3.3", + "throwback": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/popsicle-content-encoding": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/popsicle-content-encoding/-/popsicle-content-encoding-1.0.0.tgz", + "integrity": "sha512-4Df+vTfM8wCCJVTzPujiI6eOl3SiWQkcZg0AMrOkD1enMXsF3glIkFUZGvour1Sj7jOWCsNSEhBxpbbhclHhzw==", + "peerDependencies": { + "servie": "^4.0.0" + } + }, + "node_modules/popsicle-cookie-jar": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/popsicle-cookie-jar/-/popsicle-cookie-jar-1.0.1.tgz", + "integrity": "sha512-QVIZhADP8nDbXIQW6wq8GU9IOSE8INUACO/9KD9TFKQ7qq8r/y3qUDz59xIi6p6TH19lCJJyBAPSXP1liIoySw==", + "dependencies": { + "@types/tough-cookie": "^4.0.2", + "tough-cookie": "^4.1.3" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "servie": "^4.0.0" + } + }, + "node_modules/popsicle-redirects": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/popsicle-redirects/-/popsicle-redirects-1.1.1.tgz", + "integrity": "sha512-mC2HrKjdTAWDalOjGxlXw9j6Qxrz/Yd2ui6bPxpi2IQDYWpF4gUAMxbA8EpSWJhLi0PuWKDwTHHPrUPGutAoIA==", + "peerDependencies": { + "servie": "^4.1.0" + } + }, + "node_modules/popsicle-transport-http": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/popsicle-transport-http/-/popsicle-transport-http-1.2.1.tgz", + "integrity": "sha512-i5r3IGHkGiBDm1oPFvOfEeSGWR0lQJcsdTqwvvDjXqcTHYJJi4iSi3ecXIttDiTBoBtRAFAE9nF91fspQr63FQ==", + "dependencies": { + "make-error-cause": "^2.2.0" + }, + "peerDependencies": { + "servie": "^4.2.0" + } + }, + "node_modules/popsicle-transport-xhr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/popsicle-transport-xhr/-/popsicle-transport-xhr-2.0.0.tgz", + "integrity": "sha512-5Sbud4Widngf1dodJE5cjEYXkzEUIl8CzyYRYR57t6vpy9a9KPGQX6KBKdPjmBZlR5A06pOBXuJnVr23l27rtA==", + "peerDependencies": { + "servie": "^4.2.0" + } + }, + "node_modules/popsicle-user-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/popsicle-user-agent/-/popsicle-user-agent-1.0.0.tgz", + "integrity": "sha512-epKaq3TTfTzXcxBxjpoKYMcTTcAX8Rykus6QZu77XNhJuRHSRxMd+JJrbX/3PFI0opFGSN0BabbAYCbGxbu0mA==", + "peerDependencies": { + "servie": "^4.0.0" + } + }, + "node_modules/prebuild-install": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz", + "integrity": "sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^2.21.0", + "npmlog": "^4.0.1", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^3.0.3", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=6" + } + }, + "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/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pvtsutils": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.5.tgz", + "integrity": "sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==", + "dependencies": { + "tslib": "^2.6.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz", + "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/qlobber": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/qlobber/-/qlobber-5.0.3.tgz", + "integrity": "sha512-wW4GTZPePyh0RgOsM18oDyOUlXfurVRgoNyJfS+y7VWPyd0GYhQp5T2tycZFZjonH+hngxIfklGJhTP/ghidgQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/query-string": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", + "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", + "dependencies": { + "decode-uri-component": "^0.2.2", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.1.tgz", + "integrity": "sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==" + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/reinterval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", + "integrity": "sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/retimer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/retimer/-/retimer-3.0.0.tgz", + "integrity": "sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==" + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/rxjs": { + "version": "5.5.11", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", + "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", + "dependencies": { + "symbol-observable": "1.0.1" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-regex2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", + "integrity": "sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==", + "dependencies": { + "ret": "~0.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==" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialport": { + "version": "9.2.8", + "resolved": "https://registry.npmjs.org/serialport/-/serialport-9.2.8.tgz", + "integrity": "sha512-FsWpMQgSJxi93JgWl5xM1f9/Z8IjRJuaUEoHqLf8FPBLw7gMhInuHOBhI2onQufWIYPGTz3H3oGcu1nCaK1EfA==", + "dependencies": { + "@serialport/binding-mock": "9.2.4", + "@serialport/bindings": "9.2.8", + "@serialport/parser-byte-length": "9.2.4", + "@serialport/parser-cctalk": "9.2.4", + "@serialport/parser-delimiter": "9.2.4", + "@serialport/parser-inter-byte-timeout": "9.2.4", + "@serialport/parser-readline": "9.2.4", + "@serialport/parser-ready": "9.2.4", + "@serialport/parser-regex": "9.2.4", + "@serialport/stream": "9.2.4", + "debug": "^4.3.2" + }, + "engines": { + "node": ">=10.0.0" + }, + "funding": { + "url": "https://opencollective.com/serialport/donate" + } + }, + "node_modules/servie": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/servie/-/servie-4.3.3.tgz", + "integrity": "sha512-b0IrY3b1gVMsWvJppCf19g1p3JSnS0hQi6xu4Hi40CIhf0Lx8pQHcvBL+xunShpmOiQzg1NOia812NAWdSaShw==", + "dependencies": { + "@servie/events": "^1.0.0", + "byte-length": "^1.0.2", + "ts-expect": "^1.1.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "optional": true + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-prototype-of": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-prototype-of/-/set-prototype-of-1.0.0.tgz", + "integrity": "sha512-OeTRSF+prexqa0ZOjfYR2pdGG/9nyzoXhsDj9M/0R8cgK1r9SkiQiqGdQQcObmnalKVPaTLrF8P71OacYqcYGw==" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "optional": true, + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/slugify": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", + "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "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==", + "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==", + "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/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "node_modules/strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "optional": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "optional": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/tar-stream/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/throwback": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throwback/-/throwback-4.1.0.tgz", + "integrity": "sha512-dLFe8bU8SeH0xeqeKL7BNo8XoPC/o91nz9/ooeplZPiso+DZukhoyZcSz9TFnUNScm+cA9qjU1m1853M6sPOng==" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-expect": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-expect/-/ts-expect-1.3.0.tgz", + "integrity": "sha512-e4g0EJtAjk64xgnFPD6kTBUtpnMVzDrMb12N1YZV0VvSlhnVT3SGxiYTLdGy8Q5cYHOIC/FAHmZ10eGrAguicQ==" + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/tsyringe": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.8.0.tgz", + "integrity": "sha512-YB1FG+axdxADa3ncEtRnQCFq/M0lALGLxSZeVNbTU8NqhOVc51nnv2CISTcvc1kyv6EGPtXVr0v6lWeDxiijOA==", + "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==" + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uritemplate": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/uritemplate/-/uritemplate-0.3.4.tgz", + "integrity": "sha512-enADBvHfhjrwxFMTVWeIIYz51SZ91uC6o2MR/NQTVljJB6HTZ8eQL3Q7JBj3RxNISA14MOwJaU3vpf5R6dyxHA==" + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url-toolkit": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/url-toolkit/-/url-toolkit-2.1.6.tgz", + "integrity": "sha512-UaZ2+50am4HwrV2crR/JAf63Q4VvPYphe63WGeoJxeu8gmOm0qxPt+KsukfakPNrX9aymGNEkkaoICwn+OuvBw==" + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/uuid-parse": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/uuid-parse/-/uuid-parse-1.1.0.tgz", + "integrity": "sha512-OdmXxA8rDsQ7YpNVbKSJkNzTw2I+S5WsbMDnCtIWSQaosNAcWtFuI/YK1TjzUI6nbkgiqEyh8gWngfcv8Asd9A==" + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz", + "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webcrypto-core": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.7.7.tgz", + "integrity": "sha512-7FjigXNsBfopEj+5DV2nhNpfic2vumtjjgPmeDKk45z+MJwXKKfhPB7118Pfzrmh4jqOMST6Ch37iPAHoImg5g==", + "dependencies": { + "@peculiar/asn1-schema": "^2.3.6", + "@peculiar/json-schema": "^1.1.12", + "asn1js": "^3.0.1", + "pvtsutils": "^1.3.2", + "tslib": "^2.4.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/wget-improved-2": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/wget-improved-2/-/wget-improved-2-3.3.0.tgz", + "integrity": "sha512-NSPde/8mUqgmznPhO7oB5gS8IVUlR7GOlY857IaAf3PkkHbx/6FwZxUhW+GRP1GQbZDnCMF5fPieWXFng8Z43A==", + "dependencies": { + "minimist": "1.2.6", + "tunnel": "0.0.6" + }, + "bin": { + "nwget": "bin/nwget" + }, + "engines": { + "node": ">= 0.6.18" + } + }, + "node_modules/wget-improved-2/node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "optional": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/worker-timers": { + "version": "7.0.80", + "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-7.0.80.tgz", + "integrity": "sha512-bYSAPNVR0Nrm7hTM3hQOxM3x+D9dXFG6kZ0BBqFyRu0BUGC5+DLLK5Sx281hCaNzOGMNcUMEaoeErx3Yuf7XIw==", + "dependencies": { + "@babel/runtime": "^7.23.6", + "tslib": "^2.6.2", + "worker-timers-broker": "^6.0.100", + "worker-timers-worker": "^7.0.64" + } + }, + "node_modules/worker-timers-broker": { + "version": "6.0.100", + "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-6.0.100.tgz", + "integrity": "sha512-sXF1NpuT+FlJvONSbdZ6wNB15oNGg/P6PvCZDMHWmI6s7bHEb0zQ7cTnk9k+96/3pd8SpbXFuM0/HcHVc2alDQ==", + "dependencies": { + "@babel/runtime": "^7.23.6", + "fast-unique-numbers": "^8.0.12", + "tslib": "^2.6.2", + "worker-timers-worker": "^7.0.64" + } + }, + "node_modules/worker-timers-worker": { + "version": "7.0.64", + "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-7.0.64.tgz", + "integrity": "sha512-bzBO7rVibSYFKu5NBYfjKBKHujaA/AJzJTuEEqaOGfzcTdJv15raDuGhtDoMjcNPvt3IylfLph6AK92kuifnXA==", + "dependencies": { + "@babel/runtime": "^7.23.6", + "tslib": "^2.6.2" + } + }, + "node_modules/wot-thing-description-types": { + "version": "1.1.0-09-November-2023", + "resolved": "https://registry.npmjs.org/wot-thing-description-types/-/wot-thing-description-types-1.1.0-09-November-2023.tgz", + "integrity": "sha512-qgZ1Khg/L3SkIRSm4POVoj0P5MU4GIwxWdyQz2ckZzhnXesgPqe+AUzGxK37ArlxvaMytyjo0Cx2yfKoDHtlkA==" + }, + "node_modules/wot-thing-model-types": { + "version": "1.1.0-09-November-2023", + "resolved": "https://registry.npmjs.org/wot-thing-model-types/-/wot-thing-model-types-1.1.0-09-November-2023.tgz", + "integrity": "sha512-BwmZGEG5VCth34RwXbQutFre7dcSanm1OhYve6lTxuGyqeRAQsj33CUrN5PjU5LSs68Xubm0FbKJZPvWGFa6LA==" + }, + "node_modules/wot-typescript-definitions": { + "version": "0.8.0-SNAPSHOT.29", + "resolved": "https://registry.npmjs.org/wot-typescript-definitions/-/wot-typescript-definitions-0.8.0-SNAPSHOT.29.tgz", + "integrity": "sha512-V5r/JSbFs/eaWgQavEEvaldjYoMuucJ9Ae0BDfUbSm6d9rJJYLEwfrwFKxBCD25Kdroea+kNlQMrYKk783OREQ==", + "dependencies": { + "wot-thing-description-types": "1.1.0-09-November-2023" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-writer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/xml-writer/-/xml-writer-1.7.0.tgz", + "integrity": "sha512-elFVMRiV5jb59fbc87zzVa0C01QLBEWP909mRuWqFqrYC5wNTH5QW4AaKMNv7d6zAsuOulkD7wnztZNLQW0Nfg==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/package.json b/package.json index 52eff84..dee6e0f 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,12 @@ { "name": "node-red-contrib-web-of-things", - "version": "1.2.4", + "version": "1.3.0", "description": "Web of Things node for node-RED.", "author": "hassib.belhaj_hassine@siemens.com", - "contributors": ["Adel Fatkhutdinov "], + "contributors": [ + "Adel Fatkhutdinov ", + "hidetak" + ], "license": "MIT", "keywords": [ "wot", @@ -19,19 +22,30 @@ "homepage": "https://github.com/thingweb/node-red-contrib-web-of-things/blob/master/README.md", "node-red": { "nodes": { - "wot-thing": "src/wot-thing.js", - "wot-property": "src/wot-property.js", - "wot-action": "src/wot-action.js", - "wot-event": "src/wot-event.js" + "wot-thing": "dist/wot-thing.js", + "wot-property": "dist/wot-property.js", + "wot-action": "dist/wot-action.js", + "wot-event": "dist/wot-event.js", + "wot-server-config": "dist/wot-server-config.js", + "wot-server-end": "dist/wot-server-end.js", + "wot-server-property": "dist/wot-server-property.js" } }, + "scripts": { + "build": "npm run copy:src2dist && tsc", + "copy:src2dist": "node -e \"require('fs-extra').copySync('./src', './dist')\"" + }, "dependencies": { - "@node-wot/core": "0.7.7", - "@node-wot/binding-http": "0.7.7", - "@node-wot/binding-websockets": "0.7.7", - "@node-wot/binding-coap": "0.7.7", - "@node-wot/binding-mqtt": "0.7.7", - "@node-wot/binding-opcua": "0.7.7", - "@node-wot/binding-modbus": "0.7.7" + "@node-wot/binding-coap": "^0.8.10", + "@node-wot/binding-http": "^0.8.10", + "@node-wot/binding-modbus": "^0.8.10", + "@node-wot/binding-mqtt": "^0.8.10", + "@node-wot/binding-opcua": "^0.8.10", + "@node-wot/binding-websockets": "^0.8.10", + "@node-wot/core": "^0.8.10" + }, + "devDependencies": { + "fs-extra": "^11.2.0", + "typescript": "^4.9.5" } } diff --git a/src/locales/en-US/wot-server-config.html b/src/locales/en-US/wot-server-config.html new file mode 100644 index 0000000..6423cef --- /dev/null +++ b/src/locales/en-US/wot-server-config.html @@ -0,0 +1,19 @@ + diff --git a/src/locales/en-US/wot-server-config.json b/src/locales/en-US/wot-server-config.json new file mode 100644 index 0000000..0a6bc50 --- /dev/null +++ b/src/locales/en-US/wot-server-config.json @@ -0,0 +1,11 @@ +{ + "editor": { + "nameLabel": "Name", + "configLabel": "thing config", + "bindingType":{ + "label":"binding", + "description":"binding type description.", + "placeholder":"binding type" + } + } +} diff --git a/src/locales/en-US/wot-server-end.html b/src/locales/en-US/wot-server-end.html new file mode 100644 index 0000000..0ca685c --- /dev/null +++ b/src/locales/en-US/wot-server-end.html @@ -0,0 +1,36 @@ + diff --git a/src/locales/en-US/wot-server-end.json b/src/locales/en-US/wot-server-end.json new file mode 100644 index 0000000..a84df61 --- /dev/null +++ b/src/locales/en-US/wot-server-end.json @@ -0,0 +1,32 @@ +{ + "editor": { + "nameLabel": "Name", + "configLabel": "thing config", + "paletteLabel": "WoT End", + "thingConfig": { + "tabLabel": "Config", + "thingName": { + "label": "Thing Name", + "description": "Thing Name Description.", + "placeholder": "Thing Name" + } + }, + "inParams": { + "tabLabel": "Input", + "propertyName": { + "label": "Thing Name", + "description": "Thing Name Description.", + "placeholder": "Thing Name" + } + }, + "outParams1": { + "tabLabel": "Output", + "outputLabel": "Output", + "output1": { + "label": "Output Parameter1", + "description": "Output Parameter1 description.", + "placeholder": "Output Parameter1" + } + } + } +} diff --git a/src/locales/en-US/wot-server-property.html b/src/locales/en-US/wot-server-property.html new file mode 100644 index 0000000..ada512d --- /dev/null +++ b/src/locales/en-US/wot-server-property.html @@ -0,0 +1,36 @@ + diff --git a/src/locales/en-US/wot-server-property.json b/src/locales/en-US/wot-server-property.json new file mode 100644 index 0000000..2071c44 --- /dev/null +++ b/src/locales/en-US/wot-server-property.json @@ -0,0 +1,24 @@ +{ + "editor": { + "nameLabel": "Name", + "configLabel": "thing config", + "paletteLabel": "WoT Property", + "inParams": { + "tabLabel":"Input", + "propertyName":{ + "label":"Property Name", + "description":"Property Name Description.", + "placeholder":"Property Name" + } + }, + "outParams1": { + "tabLabel":"Output", + "outputLabel":"Output", + "output1":{ + "label":"Output Parameter1", + "description":"Output Parameter1 description.", + "placeholder":"Output Parameter1" + } + } + } +} \ No newline at end of file diff --git a/src/locales/ja/wot-server-config.html b/src/locales/ja/wot-server-config.html new file mode 100644 index 0000000..004eab5 --- /dev/null +++ b/src/locales/ja/wot-server-config.html @@ -0,0 +1,19 @@ + diff --git a/src/locales/ja/wot-server-config.json b/src/locales/ja/wot-server-config.json new file mode 100644 index 0000000..6c1e2ea --- /dev/null +++ b/src/locales/ja/wot-server-config.json @@ -0,0 +1,7 @@ +{ + "editor": { + "nameLabel": "Thing名", + "bindingTypeLabel": "Binding種別", + "configLabel": "Thing設定" + } +} diff --git a/src/locales/ja/wot-server-end.html b/src/locales/ja/wot-server-end.html new file mode 100644 index 0000000..74035ea --- /dev/null +++ b/src/locales/ja/wot-server-end.html @@ -0,0 +1,36 @@ + diff --git a/src/locales/ja/wot-server-end.json b/src/locales/ja/wot-server-end.json new file mode 100644 index 0000000..349ed7f --- /dev/null +++ b/src/locales/ja/wot-server-end.json @@ -0,0 +1,32 @@ +{ + "editor": { + "nameLabel": "名前", + "configLabel": "Thing設定", + "paletteLabel": "Server-End", + "thingConfig": { + "tabLabel": "設定", + "thingName": { + "label": "Thing名", + "description": "Thing名の説明。", + "placeholder": "Thing名" + } + }, + "inParams": { + "tabLabel": "入力", + "propertyName": { + "label": "Thing名", + "description": "Thing名の説明。", + "placeholder": "Thing名" + } + }, + "outParams1": { + "tabLabel": "出力", + "outputLabel": "出力", + "output1": { + "label": "出力パラメータ1", + "description": "出力パラメータ1の説明。", + "placeholder": "出力パラメータ1" + } + } + } +} diff --git a/src/locales/ja/wot-server-property.html b/src/locales/ja/wot-server-property.html new file mode 100644 index 0000000..79e6f29 --- /dev/null +++ b/src/locales/ja/wot-server-property.html @@ -0,0 +1,36 @@ + diff --git a/src/locales/ja/wot-server-property.json b/src/locales/ja/wot-server-property.json new file mode 100644 index 0000000..9e5c89a --- /dev/null +++ b/src/locales/ja/wot-server-property.json @@ -0,0 +1,31 @@ +{ + "editor": { + "nameLabel": "名前", + "propertyNameLabel": "プロパティ名", + "propertyDataTypeLabel": "データ型", + "propertyReadOnlyFlagLabel": "読み込みのみ", + "propertyObservableFlagLabel": "観測可能", + "configLabel": "Thing設定", + "paletteLabel": "Server-Property", + "inParams": { + "tabLabel":"入力", + "propertyValue":{ + "label":"プロパティ値", + "description":"プロパティ値。", + "placeholder":"プロパティ値" + } + }, + "outParams1": { + "outputLabel":"読み込み要求" + }, + "outParams2": { + "tabLabel":"書き込み要求", + "outputLabel":"書き込み要求", + "writingValue":{ + "label":"書き込む値", + "description":"プロパティに書き込む値。", + "placeholder":"プロパティに書き込む値" + } + } + } +} \ No newline at end of file diff --git a/src/servients/http-servient-wrapper.ts b/src/servients/http-servient-wrapper.ts new file mode 100644 index 0000000..055accb --- /dev/null +++ b/src/servients/http-servient-wrapper.ts @@ -0,0 +1,210 @@ +/** + * ***************************************************************************** + * Copyright (c) 2022 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0, or the W3C Software Notice and + * Document License (2015-05-13) which is available at + * https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document. + * + * SPDX-License-Identifier: EPL-2.0 OR W3C-20150513 + * ****************************************************************************** + * + * @format + */ + +import { Servient } from '@node-wot/core' +import { HttpServer } from '@node-wot/binding-http' +import ServientManager, { ServientWrapper } from './servient-manager' + +export default class HttpServientWrapper implements ServientWrapper { + private servient + private userNodes = [] + private started = false + private server + private thing + private nodeId + public constructor(id: string, params: any) { + console.log('***** servient constructor called', params) + // create Servient add HTTP binding with port configuration + this.servient = new Servient() + this.server = new HttpServer({ + port: params.port // (default 8080) + }) + this.servient.addServer(this.server) + this.nodeId = id + } + public addUserNode(node) { + console.log('*** addUserNode', node) + const foundUserNodes = this.userNodes.filter( + (userNode) => userNode.id === node.id + ) + console.log('*** foundUserNodes.length', foundUserNodes.length) + if (foundUserNodes.length === 0) { + console.log('*** addUserNode executed') + this.userNodes.push(node) + } + } + public isRunning() { + return this.started + } + + public async startServient( + title: string, + description: string, + userNodeIds: string[] + ) { + console.log('*** started', this.started) + if (this.started === true) { + // 起動状態であればservientを終わらせてfalseを返す + return false + } + console.log('*** userNodeIds', userNodeIds) + console.log('*** userNodes', this.userNodes) + // 全てのユーザノードがそろっているか確認 + for (const id of userNodeIds) { + let foundFlg = false + for (const node of this.userNodes) { + if (node.id === id) { + foundFlg = true + } + } + if (!foundFlg) { + // ユーザノードに一致するノードが存在していなければfalseを返す + console.log('*** foundFlg', foundFlg) + return false + } + } + // TDを作成 + let td = { title, description } + for (const userNode of this.userNodes) { + const props = userNode.getProps() + console.log('*** props', props) + td[props.attrType] = { + ...td[props.attrType], + [props.name]: props.content + } + } + console.log('*** created td', td) + const wot = await this.servient.start() + this.thing = await wot.produce(td) + console.log('*** thing', this.thing) + // 処理を行うために対応するノードにメッセージ送信 + for (const userNode of this.userNodes) { + const props = userNode.getProps() + console.log('*** props', props) + if (props.attrType === 'properties') { + this.thing.setPropertyReadHandler(props.name, () => { + console.log('*** call propertyReadHandler') + console.log('*** userNodes.length', this.userNodes.length) + return new Promise((resolve, reject) => { + const finish = (payload) => { + console.log('*** finish', payload) + resolve(payload) + } + userNode.send([ + { + wot: { finish } + }, + null + ]) + }) + }) + if (!props.content.readOnly) { + this.thing.setPropertyWriteHandler(props.name, async (value: any) => { + const v = await value.value() + console.log('*** call propertyWriteHandler', v) + console.log('*** userNodes.length', this.userNodes.length) + return new Promise((resolve, reject) => { + const finish = (payload) => { + console.log('*** finish', props) + if (props.content.observable) { + console.log('*** emitPropertyChange', props.name) + this.thing.emitPropertyChange(props.name) + } + resolve() + } + console.log('*** userNode', userNode) + userNode.send([ + null, + { + wot: { finish }, + [props.outputAttr]: v + } + ]) + }) + }) + } + } else if (props.attrType === 'actions') { + //TODO: implements + } else if (props.attrType === 'events') { + //TODO: implements + } + } + //TODO: このThingを、このConfigノードに関連するノードに渡して処理を追加する + // 以下ダミー + + /* + // init property value + let count = 0 + + console.log('Produced ' + thing.getThingDescription().title) + + // set property handlers (using async-await) + thing.setPropertyReadHandler('count', async () => count) + thing.setPropertyWriteHandler('count', async (intOutput) => { + const value = await intOutput.value() + if (typeof value === 'number') { + count = value + } + }) + thing.setPropertyReadHandler('count2', async () => count + 1) + thing.setPropertyWriteHandler('count2', async (intOutput) => { + const value = await intOutput.value() + if (typeof value === 'number') { + count = value + } + }) + + await thing.expose() + console.info(thing.getThingDescription().title + ' ready') + console.info('TD : ' + JSON.stringify(thing.getThingDescription())) + */ + await this.thing.expose() + this.started = true + console.log('*** servient started') + return true + } + public async endServient() { + return new Promise(async (resolve, reject) => { + console.log('*** call endServient') + this.userNodes = [] + ServientManager.getInstance().removeServientWrapper(this.nodeId) + const timeoutId = setTimeout(() => { + console.warn('timeout happend while servient ending.') + this.started = false + resolve() + }, 1000) // 1秒経っても終わらなければ終了扱いとする + if (this.server && this.thing) { + console.log('*** call server.destroy') + await this.server.destroy(this.thing.id) + console.log('*** call server.stop') + await this.server.stop() + console.log('*** call servient.shutdown') + await this.servient.shutdown() + } + console.log('*** servient finished') + this.started = false + clearTimeout(timeoutId) + resolve() + }) + } + // 新規に作成するConfigノードが競合するか調べる + public isConflict(): boolean { + throw new Error('Method not implemented.') + } +} diff --git a/src/servients/servient-manager.ts b/src/servients/servient-manager.ts new file mode 100644 index 0000000..8422c24 --- /dev/null +++ b/src/servients/servient-manager.ts @@ -0,0 +1,68 @@ +/** @format */ + +import HttpServientWrapper from './http-servient-wrapper' + +// servient type +export interface ServientWrapper { + // Servientを作成できるか確認する + isConflict(type: string, params: any): boolean + addUserNode(node: any): void + startServient(title: string, description: string, userNodeIds: string[]): void + endServient(): void +} + +// servientのインスタンスを管理する +export default class ServientManager { + private servientWrappers: { [key: string]: ServientWrapper } = {} + private static instance: ServientManager + public static getInstance(): ServientManager { + if (!ServientManager.instance) { + ServientManager.instance = new ServientManager() + } + return ServientManager.instance + } + private constructor() { + console.log('*** ServientManager constructor called') + } + public createServientWrapper( + id: string, + type: string, + params: any + ): ServientWrapper { + console.log('*** createServientWrapper', id, type, params) + if (!this.canCreateServient(type, params)) { + throw new Error( + `servient wrapper conflicted. type: ${type} params: ${JSON.stringify( + params + )}` + ) + } + if (type === 'http') { + this.servientWrappers[id] = new HttpServientWrapper(id, params) + } else if (type === 'coap') { + //TODO + } + return this.servientWrappers[id] + } + public getServientWrapper(id: string): ServientWrapper { + console.log('*** getServientWrapper', id) + console.log('*** this.servientWrappers', this.servientWrappers) + return this.servientWrappers[id] + } + public canCreateServient(type: string, params: any) { + console.log( + '*** canCreateServient this.servientWrappers', + this.servientWrappers + ) + for (const id in this.servientWrappers) { + if (this.servientWrappers[id].isConflict(type, params)) { + return false + } + } + return true + } + public removeServientWrapper(id: string) { + console.log('*** removeServientWrapper') + delete this.servientWrappers[id] + } +} diff --git a/src/wot-property.js b/src/wot-property.js index 78c4b00..f3bb714 100644 --- a/src/wot-property.js +++ b/src/wot-property.js @@ -1,98 +1,119 @@ -"use strict" +/** @format */ -module.exports = function(RED) { - function readPropertyNode(config) { - RED.nodes.createNode(this,config); - let node = this; +'use strict' - this.interval_id = null; - this.status({}); +module.exports = function (RED) { + function readPropertyNode(config) { + RED.nodes.createNode(this, config) + let node = this - if (!config.thing) { - this.status({fill:"red",shape:"dot",text:"Error: Thing undefined"}); - return; - } else if (!config.property) { - this.status({fill:"red",shape:"dot",text:"Error: Choose a property"}); - return; - } else if (!config.interval) { - this.status({fill:"red",shape:"dot",text:"Error: Choose an interval"}); - return; - }; - - RED.nodes.getNode(config.thing).consumedThing.then((consumedThing) => { - this.interval_id = setInterval( - function readProperty() { - const uriVariables = (config.uriVariables)? JSON.parse(config.uriVariables) : undefined; - consumedThing.readProperty(config.property, {"uriVariables": uriVariables}) - .then((resp) => { - node.send({payload: resp, topic: config.topic}) - node.status({ - fill:"green", - shape:"dot", - text:"connected" - }); - }) - .catch((err) => { - node.warn(err); - node.status({ - fill:"red", - shape:"ring", - text: "Response error" - }); - }) - return readProperty; - }(), - config.interval * 1000 - ); - }); - - node.on("close", function() { - if (node.interval_id != null) { - clearInterval(node.interval_id); - } - }); + this.interval_id = null + this.status({}) + if (!config.thing) { + this.status({ fill: 'red', shape: 'dot', text: 'Error: Thing undefined' }) + return + } else if (!config.property) { + this.status({ + fill: 'red', + shape: 'dot', + text: 'Error: Choose a property' + }) + return + } else if (!config.interval) { + this.status({ + fill: 'red', + shape: 'dot', + text: 'Error: Choose an interval' + }) + return } - RED.nodes.registerType("read-property",readPropertyNode); + RED.nodes.getNode(config.thing).consumedThing.then((consumedThing) => { + this.interval_id = setInterval( + (function readProperty() { + const uriVariables = config.uriVariables + ? JSON.parse(config.uriVariables) + : undefined + consumedThing + .readProperty(config.property, { uriVariables: uriVariables }) + .then((resp) => { + resp.value().then((value) => { + node.send({ payload: value, topic: config.topic }) + node.status({ + fill: 'green', + shape: 'dot', + text: 'connected' + }) + }) + }) + .catch((err) => { + node.warn(err) + node.status({ + fill: 'red', + shape: 'ring', + text: 'Response error' + }) + }) + return readProperty + })(), + config.interval * 1000 + ) + }) - function writePropertyNode(config) { - RED.nodes.createNode(this,config); - let node = this; + node.on('close', function () { + if (node.interval_id != null) { + clearInterval(node.interval_id) + } + }) + } + RED.nodes.registerType('read-property', readPropertyNode) - this.status({}); + function writePropertyNode(config) { + RED.nodes.createNode(this, config) + let node = this - if (!config.thing) { - this.status({fill:"red",shape:"dot",text:"Error: Thing undefined"}); - return; - } else if (!config.property) { - this.status({fill:"red",shape:"dot",text:"Error: Choose a property"}); - return; - }; - - RED.nodes.getNode(config.thing).consumedThing.then((consumedThing) => { - node.on('input', function(msg) { - const uriVariables = (config.uriVariables)? JSON.parse(config.uriVariables) : undefined; - consumedThing.writeProperty(config.property, msg.payload, {"uriVariables": uriVariables}) - .then((resp) => { - if (resp) node.send({payload: resp, topic: config.topic}) - node.status({ - fill:"green", - shape:"dot", - text:"connected" - }); - }) - .catch((err) => { - node.warn(err); - node.status({ - fill:"red", - shape:"ring", - text: err.message - }); - }) - }); - }) + this.status({}) + if (!config.thing) { + this.status({ fill: 'red', shape: 'dot', text: 'Error: Thing undefined' }) + return + } else if (!config.property) { + this.status({ + fill: 'red', + shape: 'dot', + text: 'Error: Choose a property' + }) + return } - RED.nodes.registerType("write-property",writePropertyNode); -} \ No newline at end of file + + RED.nodes.getNode(config.thing).consumedThing.then((consumedThing) => { + node.on('input', function (msg) { + const uriVariables = config.uriVariables + ? JSON.parse(config.uriVariables) + : undefined + consumedThing + .writeProperty(config.property, msg.payload, { + uriVariables: uriVariables + }) + .then((resp) => { + if (resp) node.send({ payload: resp, topic: config.topic }) + node.status({ + fill: 'green', + shape: 'dot', + text: 'connected' + }) + }) + .catch((err) => { + node.warn(err) + node.status({ + fill: 'red', + shape: 'ring', + text: err.message + }) + }) + }) + }) + } + RED.nodes.registerType('write-property', writePropertyNode) +} diff --git a/src/wot-server-config.html b/src/wot-server-config.html new file mode 100644 index 0000000..b3f85fb --- /dev/null +++ b/src/wot-server-config.html @@ -0,0 +1,70 @@ + + + diff --git a/src/wot-server-config.ts b/src/wot-server-config.ts new file mode 100644 index 0000000..703ce4f --- /dev/null +++ b/src/wot-server-config.ts @@ -0,0 +1,103 @@ +/** @format */ + +import ServientManager from './servients/servient-manager' + +module.exports = function (RED) { + function WoTServerConfig(config) { + RED.nodes.createNode(this, config) + const node = this + + function launchServient() { + node.bindingType = node.credentials.bindingType + console.log('***** thing config', config) + console.log('***** thing node', node) + if (node.bindingTypeConstValue && node.bindingTypeType) { + node.bindingType = RED.util.evaluateNodeProperty( + config.bindingTypeConstValue, + config.bindingTypeType, + node + ) + } + + // Thingの生成 + const bindingType = config.bindingType + let type: string, params: any + if (bindingType.indexOf('http-') === 0) { + const port = Number(bindingType.replace('http-', '')) + type = 'http' + params = { port } + } else if (bindingType === 'coap') { + //TODO + } + console.log('*** createServient', node.id, type, params) + const servientManager = ServientManager.getInstance() + //console.log('*** servientManager', servientManager) + node.servientWrapper = servientManager.getServientWrapper(node.id) + if (!node.servientWrapper) { + node.servientWrapper = servientManager.createServientWrapper( + node.id, + type, + params + ) + } + const MAX_COUNT = 100 + let count = 0 + return new Promise((resolve, reject) => { + const start = ( + title: string, + description: string, + userNodeIds: string[], + c: number + ) => { + c = c + 1 + setTimeout(async () => { + // Servientの起動が成功するまで繰り返す + console.log('*** startServient', c) + const success = await node.servientWrapper.startServient( + title, + description, + userNodeIds + ) + console.log('*** success', success) + if (success) { + resolve() + } else { + if (c > MAX_COUNT) { + console.error('[error] Not enough WoT Nodes settings.') + reject(new Error('Not enough WoT Nodes settings.')) + } + start(title, description, userNodeIds, c) + } + }, 100) + } + start(config.name, '', config._users, count) + }) + } + + // すでにservientがあれば終了する + console.log('*** endServient') + node.servientWrapper = ServientManager.getInstance().getServientWrapper( + node.id + ) + if (node.servientWrapper) { + node.servientWrapper.endServient().then(() => { + // servient終了 + console.log('*** servient ended. config node id: ', config.id) + launchServient().then(() => { + console.log('*** launched 1') + }) + }) + } else { + console.log('*** launch servient.') + launchServient().then(() => { + console.log('*** launched 2') + }) + } + } + + RED.nodes.registerType('wot-server-config', WoTServerConfig, { + credentials: { + bindingType: { type: 'text' } + } + }) +} diff --git a/src/wot-server-end.html b/src/wot-server-end.html new file mode 100644 index 0000000..b09213a --- /dev/null +++ b/src/wot-server-end.html @@ -0,0 +1,190 @@ + + + + + + diff --git a/src/wot-server-end.ts b/src/wot-server-end.ts new file mode 100644 index 0000000..3f40527 --- /dev/null +++ b/src/wot-server-end.ts @@ -0,0 +1,84 @@ +/** @format */ + +module.exports = function (RED) { + function WoTServerEnd(config) { + RED.nodes.createNode(this, config) + const node = this + + // inputイベント + node.on('input', async (msg, send, done) => { + console.log('*** wot-server-end input msg', msg) + msg.wot?.finish(msg.payload) + return + + // configノードを取得 + const woTServerConfig = RED.nodes.getNode(config.woTServerConfig) + // 入力パラメータを取得 + node.inParams_propertyName = node.credentials.inParams_propertyName + if ( + config.inParams_propertyNameConstValue && + config.inParams_propertyNameType + ) { + node.inParams_propertyName = RED.util.evaluateNodeProperty( + config.inParams_propertyNameConstValue, + config.inParams_propertyNameType, + node, + msg + ) + } + console.log('node.inParams_propertyName:', node.inParams_propertyName) + + // 出力の作成 + // 出力の出力を返す場合 + setOutput( + config.outParams1_output1Type, + config.outParams1_output1ConstValue, + msg, + this.context(), + '[value of outParams1_output1]' + ) + // ここまで + + send(msg) + done() + }) + // closeイベント + node.on('close', function (removed, done) { + if (removed) { + // This node has been disabled/deleted + } else { + // This node is being restarted + } + // 処理終了通知 + done() + }) + } + RED.nodes.registerType('wot-server-end', WoTServerEnd, { + credentials: { + inParams_propertyName: { type: 'text' } + } + }) + + const setOutput = (type, valueName, msg, context, value) => { + if (type === 'msg') { + const names = valueName.split('.') + let target = msg + for (let i = 0; i < names.length - 1; i++) { + let n = names[i] + if (target[n] && target[n] instanceof Object) { + target = target[n] + } else { + target[n] = {} + target = target[n] + } + } + target[names[names.length - 1]] = value + } else if (type === 'node') { + context.set(valueName, value) + } else if (type === 'flow') { + context.flow.set(valueName, value) + } else if (type === 'global') { + context.global.set(valueName, value) + } + } +} diff --git a/src/wot-server-property.html b/src/wot-server-property.html new file mode 100644 index 0000000..9fa5b07 --- /dev/null +++ b/src/wot-server-property.html @@ -0,0 +1,214 @@ + + + + + + diff --git a/src/wot-server-property.ts b/src/wot-server-property.ts new file mode 100644 index 0000000..4add7c2 --- /dev/null +++ b/src/wot-server-property.ts @@ -0,0 +1,118 @@ +/** @format */ +import ServientManager from './servients/servient-manager' + +module.exports = function (RED) { + function WoTServerProperty(config) { + RED.nodes.createNode(this, config) + const node = this + console.log('*** this', this) + console.log('*** config', config) + const woTServerConfig = RED.nodes.getNode(config.woTServerConfig) //test + //console.log('*** RED', RED) + //console.log('*** RED.nodes', RED.nodes) + //console.log('*** servientWrapper', woTServerConfig.servientWrapper) + function addNodeToServientWrapper() { + const servientWrapper = ServientManager.getInstance().getServientWrapper( + woTServerConfig.id + ) + if (servientWrapper) { + servientWrapper.addUserNode(node) + } else { + console.log('*** waiting to prepare servient') + setTimeout(() => { + addNodeToServientWrapper() + }, 100) + } + } + addNodeToServientWrapper() + + // WoTServerConfigノードからプロパティを取得する + node.getProps = () => { + return { + attrType: 'properties', + name: config.propertyName, + outputAttr: config.outParams2_writingValueConstValue, + content: { + description: config.propertyDescription, + type: config.propertyDataType, + readOnly: config.propertyReadOnlyFlag, + observable: config.propertyObservableFlag + } + } + } + + // inputイベント + node.on('input', async (msg, send, done) => { + // configノードを取得 + const woTServerConfig = RED.nodes.getNode(config.woTServerConfig) + console.log('*** servientWrapper', woTServerConfig.servientWrapper) + + // 入力パラメータを取得 + node.inParams_propertyName = node.credentials.inParams_propertyName + if ( + config.inParams_propertyNameConstValue && + config.inParams_propertyNameType + ) { + node.inParams_propertyName = RED.util.evaluateNodeProperty( + config.inParams_propertyNameConstValue, + config.inParams_propertyNameType, + node, + msg + ) + } + console.log('node.inParams_propertyName:', node.inParams_propertyName) + + // 出力の作成 + // 出力の出力を返す場合 + setOutput( + config.outParams1_output1Type, + config.outParams1_output1ConstValue, + msg, + this.context(), + '[value of outParams1_output1]' + ) + // ここまで + + send(msg) + done() + }) + // closeイベント + node.on('close', function (removed, done) { + if (removed) { + // This node has been disabled/deleted + } else { + // This node is being restarted + } + // 処理終了通知 + done() + }) + } + RED.nodes.registerType('wot-server-property', WoTServerProperty, { + credentials: { + inParams_propertyName: { type: 'text' } + } + }) + + const setOutput = (type, valueName, msg, context, value) => { + if (type === 'msg') { + const names = valueName.split('.') + let target = msg + for (let i = 0; i < names.length - 1; i++) { + let n = names[i] + if (target[n] && target[n] instanceof Object) { + target = target[n] + } else { + target[n] = {} + target = target[n] + } + } + target[names[names.length - 1]] = value + } else if (type === 'node') { + context.set(valueName, value) + } else if (type === 'flow') { + context.flow.set(valueName, value) + } else if (type === 'global') { + context.global.set(valueName, value) + } + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..8902121 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "jsx": "react", + "target": "es2017", + "module": "commonjs", + "outDir": "./dist", + "rootDir": "src", + "lib": ["es6", "dom"], + "typeRoots": [ + "node_modules/@types", + "../../node_modules/@types" + ], + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": false, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "moduleResolution": "node" + }, + "include": ["src/**/*"] +} From 46c41555ed0be8b11cd99e668a3b6abf324f14aa Mon Sep 17 00:00:00 2001 From: hidetak Date: Tue, 9 Jan 2024 03:25:20 +0900 Subject: [PATCH 02/23] add emit property change feature for property node --- src/locales/ja/wot-server-property.json | 10 +++---- src/servients/http-servient-wrapper.ts | 8 +++++- src/servients/servient-manager.ts | 9 +++++-- src/wot-server-property.html | 20 +++++++------- src/wot-server-property.ts | 35 ++++++++++++++++--------- 5 files changed, 52 insertions(+), 30 deletions(-) diff --git a/src/locales/ja/wot-server-property.json b/src/locales/ja/wot-server-property.json index 9e5c89a..e8c70fa 100644 --- a/src/locales/ja/wot-server-property.json +++ b/src/locales/ja/wot-server-property.json @@ -8,11 +8,11 @@ "configLabel": "Thing設定", "paletteLabel": "Server-Property", "inParams": { - "tabLabel":"入力", - "propertyValue":{ - "label":"プロパティ値", - "description":"プロパティ値。", - "placeholder":"プロパティ値" + "tabLabel":"変更された値の入力", + "changedValue":{ + "label":"変更された値", + "description":"変更されたプロパティ値。", + "placeholder":"変更されたプロパティ値" } }, "outParams1": { diff --git a/src/servients/http-servient-wrapper.ts b/src/servients/http-servient-wrapper.ts index 055accb..5ad9f9e 100644 --- a/src/servients/http-servient-wrapper.ts +++ b/src/servients/http-servient-wrapper.ts @@ -188,7 +188,7 @@ export default class HttpServientWrapper implements ServientWrapper { console.warn('timeout happend while servient ending.') this.started = false resolve() - }, 1000) // 1秒経っても終わらなければ終了扱いとする + }, 3000) // 3秒経っても終わらなければ終了扱いとする if (this.server && this.thing) { console.log('*** call server.destroy') await this.server.destroy(this.thing.id) @@ -203,6 +203,12 @@ export default class HttpServientWrapper implements ServientWrapper { resolve() }) } + + // プロパティ変更を通知 + public async emitPropertyChange(propertyName: string) { + await this.thing.emitPropertyChange(propertyName) + } + // 新規に作成するConfigノードが競合するか調べる public isConflict(): boolean { throw new Error('Method not implemented.') diff --git a/src/servients/servient-manager.ts b/src/servients/servient-manager.ts index 8422c24..a90a90e 100644 --- a/src/servients/servient-manager.ts +++ b/src/servients/servient-manager.ts @@ -7,8 +7,13 @@ export interface ServientWrapper { // Servientを作成できるか確認する isConflict(type: string, params: any): boolean addUserNode(node: any): void - startServient(title: string, description: string, userNodeIds: string[]): void - endServient(): void + startServient( + title: string, + description: string, + userNodeIds: string[] + ): Promise + endServient(): Promise + emitPropertyChange(propertyName: string): Promise } // servientのインスタンスを管理する diff --git a/src/wot-server-property.html b/src/wot-server-property.html index 9fa5b07..0b70568 100644 --- a/src/wot-server-property.html +++ b/src/wot-server-property.html @@ -10,10 +10,10 @@ propertyDataType: {value:"string"}, propertyReadOnlyFlag: {value:true}, propertyObservableFlag: {value:true}, - inParams_propertyValueType: { + inParams_changedValueType: { value: "msg" }, - inParams_propertyValueConstValue: { + inParams_changedValueConstValue: { value: "payload" }, outParams2_writingValueType: { @@ -28,10 +28,10 @@ } }, credentials: { - inParams_propertyValue: {type: "text"}, + inParams_changedValue: {type: "text"}, outParams2_writingValue: {type: "text"}, }, - inputs:0, + inputs:1, outputs:2, outputLabels: function(index) { return [ @@ -69,7 +69,7 @@ // 入力パラメータの指定項目作成 prepareInOutParamSetting("inParams", { - name:"propertyValue", + name:"changedValue", types: ["msg","str","num","env"], defaultType: "msg", defaultValue: "payload", @@ -91,7 +91,7 @@ }, oneditsave: function() { saveInOutParamSetting("inParams", { - name:"propertyValue", + name:"changedValue", types: ["msg","str","num","env"], defaultType: "msg", defaultValue: "payload", @@ -191,10 +191,10 @@
- - - - + + + +
diff --git a/src/wot-server-property.ts b/src/wot-server-property.ts index 4add7c2..f684ade 100644 --- a/src/wot-server-property.ts +++ b/src/wot-server-property.ts @@ -48,32 +48,43 @@ module.exports = function (RED) { console.log('*** servientWrapper', woTServerConfig.servientWrapper) // 入力パラメータを取得 - node.inParams_propertyName = node.credentials.inParams_propertyName + /*node.inParams_changedValue = node.credentials.inParams_changedValue if ( - config.inParams_propertyNameConstValue && - config.inParams_propertyNameType + config.inParams_changedValueConstValue && + config.inParams_changedValueType ) { - node.inParams_propertyName = RED.util.evaluateNodeProperty( - config.inParams_propertyNameConstValue, - config.inParams_propertyNameType, + node.inParams_changedValue = RED.util.evaluateNodeProperty( + config.inParams_changedValueConstValue, + config.inParams_changedValueType, node, msg ) } - console.log('node.inParams_propertyName:', node.inParams_propertyName) + console.log('node.inParams_changedValue:', node.inParams_changedValue)*/ + console.log( + '*** woTServerConfig.emitPropertyChange:', + config.propertyName + ) + const servientWrapper = ServientManager.getInstance().getServientWrapper( + woTServerConfig.id + ) + await servientWrapper.emitPropertyChange(config.propertyName) + console.log('*** woTServerConfig.emitPropertyChange finished') // 出力の作成 // 出力の出力を返す場合 - setOutput( - config.outParams1_output1Type, - config.outParams1_output1ConstValue, + /*setOutput( + config.outParams2_wriitingValueType, + config.outParams2_wriitingValueConstValue, msg, this.context(), - '[value of outParams1_output1]' + '[value of outParams1_wriitingValue]' ) // ここまで - send(msg) + send(msg)*/ + + // 変更されたプロパティ値を入力された場合は出力なし done() }) // closeイベント From 5bec95de0b47c2ba04b59d82c88cec27284fd152 Mon Sep 17 00:00:00 2001 From: hidetak Date: Thu, 11 Jan 2024 03:32:47 +0900 Subject: [PATCH 03/23] improve launch processing and add action node(WIP) --- package.json | 3 +- src/locales/en-US/wot-server-action.html | 36 +++ src/locales/en-US/wot-server-action.json | 24 ++ src/locales/ja/wot-server-action.html | 36 +++ src/locales/ja/wot-server-action.json | 19 ++ src/servients/http-servient-wrapper.ts | 313 ++++++++++++----------- src/servients/servient-manager.ts | 58 ++++- src/wot-server-action.html | 176 +++++++++++++ src/wot-server-action.ts | 56 ++++ src/wot-server-config.ts | 196 ++++++++++---- src/wot-server-property.ts | 28 +- 11 files changed, 709 insertions(+), 236 deletions(-) create mode 100644 src/locales/en-US/wot-server-action.html create mode 100644 src/locales/en-US/wot-server-action.json create mode 100644 src/locales/ja/wot-server-action.html create mode 100644 src/locales/ja/wot-server-action.json create mode 100644 src/wot-server-action.html create mode 100644 src/wot-server-action.ts diff --git a/package.json b/package.json index dee6e0f..3908078 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,8 @@ "wot-event": "dist/wot-event.js", "wot-server-config": "dist/wot-server-config.js", "wot-server-end": "dist/wot-server-end.js", - "wot-server-property": "dist/wot-server-property.js" + "wot-server-property": "dist/wot-server-property.js", + "wot-server-action": "dist/wot-server-action.js" } }, "scripts": { diff --git a/src/locales/en-US/wot-server-action.html b/src/locales/en-US/wot-server-action.html new file mode 100644 index 0000000..ada512d --- /dev/null +++ b/src/locales/en-US/wot-server-action.html @@ -0,0 +1,36 @@ + diff --git a/src/locales/en-US/wot-server-action.json b/src/locales/en-US/wot-server-action.json new file mode 100644 index 0000000..2071c44 --- /dev/null +++ b/src/locales/en-US/wot-server-action.json @@ -0,0 +1,24 @@ +{ + "editor": { + "nameLabel": "Name", + "configLabel": "thing config", + "paletteLabel": "WoT Property", + "inParams": { + "tabLabel":"Input", + "propertyName":{ + "label":"Property Name", + "description":"Property Name Description.", + "placeholder":"Property Name" + } + }, + "outParams1": { + "tabLabel":"Output", + "outputLabel":"Output", + "output1":{ + "label":"Output Parameter1", + "description":"Output Parameter1 description.", + "placeholder":"Output Parameter1" + } + } + } +} \ No newline at end of file diff --git a/src/locales/ja/wot-server-action.html b/src/locales/ja/wot-server-action.html new file mode 100644 index 0000000..79e6f29 --- /dev/null +++ b/src/locales/ja/wot-server-action.html @@ -0,0 +1,36 @@ + diff --git a/src/locales/ja/wot-server-action.json b/src/locales/ja/wot-server-action.json new file mode 100644 index 0000000..8258bff --- /dev/null +++ b/src/locales/ja/wot-server-action.json @@ -0,0 +1,19 @@ +{ + "editor": { + "nameLabel": "名前", + "actionNameLabel": "アクション名", + "actionInputDataTypeLabel": "引数のデータ型", + "actionOutputDataTypeLabel": "戻り値のデータ型", + "configLabel": "Thing設定", + "paletteLabel": "Server-Action", + "outParams1": { + "tabLabel":"アクション呼び出し", + "outputLabel":"アクションの引数", + "actionArgs":{ + "label":"引数の格納先", + "description":"アクションの引数の格納先。", + "placeholder":"引数の格納先" + } + } + } +} \ No newline at end of file diff --git a/src/servients/http-servient-wrapper.ts b/src/servients/http-servient-wrapper.ts index 5ad9f9e..8a3c61e 100644 --- a/src/servients/http-servient-wrapper.ts +++ b/src/servients/http-servient-wrapper.ts @@ -38,176 +38,179 @@ export default class HttpServientWrapper implements ServientWrapper { this.servient.addServer(this.server) this.nodeId = id } - public addUserNode(node) { - console.log('*** addUserNode', node) - const foundUserNodes = this.userNodes.filter( - (userNode) => userNode.id === node.id - ) - console.log('*** foundUserNodes.length', foundUserNodes.length) - if (foundUserNodes.length === 0) { - console.log('*** addUserNode executed') - this.userNodes.push(node) - } - } + // public addUserNode(node) { + // console.log('*** addUserNode', node) + // const foundUserNodes = this.userNodes.filter( + // (userNode) => userNode.id === node.id + // ) + // console.log('*** foundUserNodes.length', foundUserNodes.length) + // if (foundUserNodes.length === 0) { + // console.log('*** addUserNode executed') + // this.userNodes.push(node) + // } + // } public isRunning() { return this.started } - public async startServient( - title: string, - description: string, - userNodeIds: string[] - ) { - console.log('*** started', this.started) - if (this.started === true) { - // 起動状態であればservientを終わらせてfalseを返す - return false - } - console.log('*** userNodeIds', userNodeIds) - console.log('*** userNodes', this.userNodes) - // 全てのユーザノードがそろっているか確認 - for (const id of userNodeIds) { - let foundFlg = false - for (const node of this.userNodes) { - if (node.id === id) { - foundFlg = true - } - } - if (!foundFlg) { - // ユーザノードに一致するノードが存在していなければfalseを返す - console.log('*** foundFlg', foundFlg) - return false - } - } - // TDを作成 - let td = { title, description } - for (const userNode of this.userNodes) { - const props = userNode.getProps() - console.log('*** props', props) - td[props.attrType] = { - ...td[props.attrType], - [props.name]: props.content - } - } - console.log('*** created td', td) + public async createThing(td) { const wot = await this.servient.start() this.thing = await wot.produce(td) - console.log('*** thing', this.thing) - // 処理を行うために対応するノードにメッセージ送信 - for (const userNode of this.userNodes) { - const props = userNode.getProps() - console.log('*** props', props) - if (props.attrType === 'properties') { - this.thing.setPropertyReadHandler(props.name, () => { - console.log('*** call propertyReadHandler') - console.log('*** userNodes.length', this.userNodes.length) - return new Promise((resolve, reject) => { - const finish = (payload) => { - console.log('*** finish', payload) - resolve(payload) - } - userNode.send([ - { - wot: { finish } - }, - null - ]) - }) - }) - if (!props.content.readOnly) { - this.thing.setPropertyWriteHandler(props.name, async (value: any) => { - const v = await value.value() - console.log('*** call propertyWriteHandler', v) - console.log('*** userNodes.length', this.userNodes.length) - return new Promise((resolve, reject) => { - const finish = (payload) => { - console.log('*** finish', props) - if (props.content.observable) { - console.log('*** emitPropertyChange', props.name) - this.thing.emitPropertyChange(props.name) - } - resolve() - } - console.log('*** userNode', userNode) - userNode.send([ - null, - { - wot: { finish }, - [props.outputAttr]: v - } - ]) - }) - }) - } - } else if (props.attrType === 'actions') { - //TODO: implements - } else if (props.attrType === 'events') { - //TODO: implements - } - } - //TODO: このThingを、このConfigノードに関連するノードに渡して処理を追加する - // 以下ダミー + return this.thing + } - /* - // init property value - let count = 0 + public async exposeThing() { + await this.thing.expose() + this.started = true + console.log('*** exposed') + } - console.log('Produced ' + thing.getThingDescription().title) + // public async startServient( + // title: string, + // description: string, + // userNodeIds: string[] + // ) { + // console.log('*** started', this.started) + // if (this.started === true) { + // // 起動状態であればservientを終わらせてfalseを返す + // return false + // } + // console.log('*** userNodeIds', userNodeIds) + // console.log('*** userNodes', this.userNodes) + // // 全てのユーザノードがそろっているか確認 + // for (const id of userNodeIds) { + // let foundFlg = false + // for (const node of this.userNodes) { + // if (node.id === id) { + // foundFlg = true + // } + // } + // if (!foundFlg) { + // // ユーザノードに一致するノードが存在していなければfalseを返す + // console.log('*** foundFlg', foundFlg) + // return false + // } + // } + // // TDを作成 + // let td = { title, description } + // for (const userNode of this.userNodes) { + // const props = userNode.getProps() + // console.log('*** props', props) + // td[props.attrType] = { + // ...td[props.attrType], + // [props.name]: props.content + // } + // } + // console.log('*** created td', td) + // const wot = await this.servient.start() + // this.thing = await wot.produce(td) + // console.log('*** thing', this.thing) + // // 処理を行うために対応するノードにメッセージ送信 + // for (const userNode of this.userNodes) { + // const props = userNode.getProps() + // console.log('*** props', props) + // if (props.attrType === 'properties') { + // this.thing.setPropertyReadHandler(props.name, () => { + // console.log('*** call propertyReadHandler') + // console.log('*** userNodes.length', this.userNodes.length) + // return new Promise((resolve, reject) => { + // const finish = (payload) => { + // console.log('*** finish', payload) + // resolve(payload) + // } + // userNode.send([ + // { + // wot: { finish } + // }, + // null + // ]) + // }) + // }) + // if (!props.content.readOnly) { + // this.thing.setPropertyWriteHandler(props.name, async (value: any) => { + // const v = await value.value() + // console.log('*** call propertyWriteHandler', v) + // console.log('*** userNodes.length', this.userNodes.length) + // return new Promise((resolve, reject) => { + // const finish = (payload) => { + // console.log('*** finish', props) + // if (props.content.observable) { + // console.log('*** emitPropertyChange', props.name) + // this.thing.emitPropertyChange(props.name) + // } + // resolve() + // } + // console.log('*** userNode', userNode) + // userNode.send([ + // null, + // { + // wot: { finish }, + // [props.outputAttr]: v + // } + // ]) + // }) + // }) + // } + // } else if (props.attrType === 'actions') { + // //TODO: implements + // } else if (props.attrType === 'events') { + // //TODO: implements + // } + // } + // //TODO: このThingを、このConfigノードに関連するノードに渡して処理を追加する + // // 以下ダミー - // set property handlers (using async-await) - thing.setPropertyReadHandler('count', async () => count) - thing.setPropertyWriteHandler('count', async (intOutput) => { - const value = await intOutput.value() - if (typeof value === 'number') { - count = value - } - }) - thing.setPropertyReadHandler('count2', async () => count + 1) - thing.setPropertyWriteHandler('count2', async (intOutput) => { - const value = await intOutput.value() - if (typeof value === 'number') { - count = value - } - }) + // /* + // // init property value + // let count = 0 - await thing.expose() - console.info(thing.getThingDescription().title + ' ready') - console.info('TD : ' + JSON.stringify(thing.getThingDescription())) - */ - await this.thing.expose() - this.started = true - console.log('*** servient started') - return true + // console.log('Produced ' + thing.getThingDescription().title) + + // // set property handlers (using async-await) + // thing.setPropertyReadHandler('count', async () => count) + // thing.setPropertyWriteHandler('count', async (intOutput) => { + // const value = await intOutput.value() + // if (typeof value === 'number') { + // count = value + // } + // }) + // thing.setPropertyReadHandler('count2', async () => count + 1) + // thing.setPropertyWriteHandler('count2', async (intOutput) => { + // const value = await intOutput.value() + // if (typeof value === 'number') { + // count = value + // } + // }) + + // await thing.expose() + // console.info(thing.getThingDescription().title + ' ready') + // console.info('TD : ' + JSON.stringify(thing.getThingDescription())) + // */ + // await this.thing.expose() + // this.started = true + // console.log('*** servient started') + // return true + // } + + public getThing() { + return this.thing } + public async endServient() { - return new Promise(async (resolve, reject) => { - console.log('*** call endServient') - this.userNodes = [] - ServientManager.getInstance().removeServientWrapper(this.nodeId) - const timeoutId = setTimeout(() => { - console.warn('timeout happend while servient ending.') - this.started = false - resolve() - }, 3000) // 3秒経っても終わらなければ終了扱いとする - if (this.server && this.thing) { - console.log('*** call server.destroy') - await this.server.destroy(this.thing.id) - console.log('*** call server.stop') - await this.server.stop() - console.log('*** call servient.shutdown') - await this.servient.shutdown() - } - console.log('*** servient finished') - this.started = false - clearTimeout(timeoutId) - resolve() - }) + if (this.server && this.thing) { + console.log('*** call server.destroy') + await this.server.destroy(this.thing.id) + console.log('*** call server.stop') + await this.server.stop() + console.log('*** call servient.shutdown') + await this.servient.shutdown() + } } // プロパティ変更を通知 - public async emitPropertyChange(propertyName: string) { - await this.thing.emitPropertyChange(propertyName) - } + // public async emitPropertyChange(propertyName: string) { + // await this.thing.emitPropertyChange(propertyName) + // } // 新規に作成するConfigノードが競合するか調べる public isConflict(): boolean { diff --git a/src/servients/servient-manager.ts b/src/servients/servient-manager.ts index a90a90e..bc33cab 100644 --- a/src/servients/servient-manager.ts +++ b/src/servients/servient-manager.ts @@ -6,14 +6,17 @@ import HttpServientWrapper from './http-servient-wrapper' export interface ServientWrapper { // Servientを作成できるか確認する isConflict(type: string, params: any): boolean - addUserNode(node: any): void - startServient( - title: string, - description: string, - userNodeIds: string[] - ): Promise + //addUserNode(node: any): void + createThing(td: any): Promise + exposeThing(): Promise + getThing(): any + // startServient( + // title: string, + // description: string, + // userNodeIds: string[] + // ): Promise endServient(): Promise - emitPropertyChange(propertyName: string): Promise + //emitPropertyChange(propertyName: string): Promise } // servientのインスタンスを管理する @@ -49,12 +52,18 @@ export default class ServientManager { } return this.servientWrappers[id] } - public getServientWrapper(id: string): ServientWrapper { - console.log('*** getServientWrapper', id) - console.log('*** this.servientWrappers', this.servientWrappers) - return this.servientWrappers[id] + public existServienetWrapper(id: string) { + if (this.servientWrappers[id]) { + return true + } + return false } - public canCreateServient(type: string, params: any) { + // public getServientWrapper(id: string): ServientWrapper { + // console.log('*** getServientWrapper', id) + // console.log('*** this.servientWrappers', this.servientWrappers) + // return this.servientWrappers[id] + // } + private canCreateServient(type: string, params: any) { console.log( '*** canCreateServient this.servientWrappers', this.servientWrappers @@ -66,8 +75,31 @@ export default class ServientManager { } return true } - public removeServientWrapper(id: string) { + public async removeServientWrapper(id: string) { console.log('*** removeServientWrapper') + this.endServient(id) delete this.servientWrappers[id] } + + private async endServient(id: string) { + return new Promise(async (resolve, reject) => { + console.log('*** call endServient') + const servientWrapper = this.servientWrappers[id] + const timeoutId = setTimeout(() => { + console.warn('timeout happend while servient ending.') + delete this.servientWrappers[id] + resolve() + }, 3000) // 3秒経っても終わらなければ終了扱いとする + servientWrapper.endServient() + console.log('*** servient finished') + delete this.servientWrappers[id] + clearTimeout(timeoutId) + resolve() + }) + } + + public getThing(id: string) { + const servientWrapper = this.servientWrappers[id] + return servientWrapper?.getThing() + } } diff --git a/src/wot-server-action.html b/src/wot-server-action.html new file mode 100644 index 0000000..aa49f8a --- /dev/null +++ b/src/wot-server-action.html @@ -0,0 +1,176 @@ + + + + + + diff --git a/src/wot-server-action.ts b/src/wot-server-action.ts new file mode 100644 index 0000000..a056287 --- /dev/null +++ b/src/wot-server-action.ts @@ -0,0 +1,56 @@ +/** @format */ +import ServientManager from './servients/servient-manager' + +module.exports = function (RED) { + function WoTServerAction(config) { + RED.nodes.createNode(this, config) + const node = this + this.status({ fill: 'red', shape: 'dot', text: 'not prepared' }) + console.log('*** this', this) + console.log('*** config', config) + const woTServerConfig = RED.nodes.getNode(config.woTServerConfig) //test + //console.log('*** RED', RED) + //console.log('*** RED.nodes', RED.nodes) + woTServerConfig.addUserNode(node) + console.log('*** addUserNode finished.', node.id) + this.status({ fill: 'green', shape: 'dot', text: 'running' }) + + // WoTServerConfigノードからプロパティを取得する際に呼び出す + node.getProps = () => { + return { + attrType: 'actions', + name: config.actionName, + outputArgs: config.outParams1_actionArgsConstValue, + content: { + description: config.actionDescription, + input: { + type: config.actionInputDataType + }, + output: { + type: config.actionOutputDataType + } + } + } + } + + // inputイベント(インプットなし) + /*node.on('input', async (msg, send, done) => { + done() + })*/ + // closeイベント + node.on('close', function (removed, done) { + if (removed) { + // This node has been disabled/deleted + } else { + // This node is being restarted + } + // 処理終了通知 + done() + }) + } + RED.nodes.registerType('wot-server-action', WoTServerAction, { + credentials: { + inParams_actionName: { type: 'text' } + } + }) +} diff --git a/src/wot-server-config.ts b/src/wot-server-config.ts index 703ce4f..fe08942 100644 --- a/src/wot-server-config.ts +++ b/src/wot-server-config.ts @@ -1,13 +1,143 @@ /** @format */ -import ServientManager from './servients/servient-manager' +import ServientManager, { ServientWrapper } from './servients/servient-manager' module.exports = function (RED) { function WoTServerConfig(config) { RED.nodes.createNode(this, config) const node = this + const userNodes = [] + const servientManager = ServientManager.getInstance() - function launchServient() { + node.addUserNode = (n) => { + console.log('*** addUserNode', n) + const foundUserNodes = userNodes.filter( + (userNode) => userNode.id === n.id + ) + console.log('*** foundUserNodes.length', foundUserNodes.length) + if (foundUserNodes.length === 0) { + console.log('*** addUserNode executed') + userNodes.push(n) + } + } + + async function waitForFinishPrepareRelatedNodes( + userNodes: any[], + userNodeIds: string[] + ) { + console.log('*** userNodeIds', userNodeIds) + console.log('*** userNodes', userNodes) + const MAX_CHECK_COUNT = 50 + const WAIT_MILLI_SEC = 100 //ms + for (let i = 0; i < MAX_CHECK_COUNT; i++) { + // 全てのユーザノードがそろっているか確認 + let prepareAllNodesFlg = true + for (const id of userNodeIds) { + let foundFlg = false + for (const node of userNodes) { + if (node.id === id) { + foundFlg = true + } + } + if (!foundFlg) { + // ユーザノードに一致するノードが存在していなければfalseを返す + console.log('*** foundFlg', foundFlg) + prepareAllNodesFlg = false + break + } + } + if (prepareAllNodesFlg) { + // ノードが揃ったため処理終了 + return + } + // wait + await ((sec) => { + return new Promise((resolve, reject) => { + setTimeout(() => { + resolve() + }, sec) + }) + })(WAIT_MILLI_SEC) + } + throw new Error('Not enough WoT Nodes settings.') + } + + async function createWoTScriptAndStart( + title: string, + description: string, + servientWrapper: ServientWrapper, + userNodes: any[] + ) { + // TDを作成 + let td = { title, description } + for (const userNode of userNodes) { + const props = userNode.getProps() + console.log('*** props', props) + td[props.attrType] = { + ...td[props.attrType], + [props.name]: props.content + } + } + console.log('*** created td', td) + const thing = await servientWrapper.createThing(td) + console.log('*** thing', thing) + // 処理を行うために対応するノードにメッセージ送信 + for (const userNode of userNodes) { + const props = userNode.getProps() + console.log('*** props', props) + if (props.attrType === 'properties') { + thing.setPropertyReadHandler(props.name, () => { + console.log('*** call propertyReadHandler') + console.log('*** userNodes.length', userNodes.length) + return new Promise((resolve, reject) => { + const finish = (payload) => { + console.log('*** finish', payload) + resolve(payload) + } + userNode.send([ + { + wot: { finish } + }, + null + ]) + }) + }) + if (!props.content.readOnly) { + thing.setPropertyWriteHandler(props.name, async (value: any) => { + const v = await value.value() + console.log('*** call propertyWriteHandler', v) + console.log('*** userNodes.length', userNodes.length) + return new Promise((resolve, reject) => { + const finish = (payload) => { + console.log('*** finish', props) + if (props.content.observable) { + console.log('*** emitPropertyChange', props.name) + thing.emitPropertyChange(props.name) + } + resolve() + } + console.log('*** userNode', userNode) + userNode.send([ + null, + { + wot: { finish }, + [props.outputAttr]: v + } + ]) + }) + }) + } + } else if (props.attrType === 'actions') { + //TODO: implements + } else if (props.attrType === 'events') { + //TODO: implements + } + } + await servientWrapper.exposeThing() + console.log('*** servient started') + } + + async function launchServient() { node.bindingType = node.credentials.bindingType console.log('***** thing config', config) console.log('***** thing node', node) @@ -30,57 +160,29 @@ module.exports = function (RED) { //TODO } console.log('*** createServient', node.id, type, params) - const servientManager = ServientManager.getInstance() //console.log('*** servientManager', servientManager) - node.servientWrapper = servientManager.getServientWrapper(node.id) - if (!node.servientWrapper) { - node.servientWrapper = servientManager.createServientWrapper( - node.id, - type, - params + const servientWrapper = servientManager.createServientWrapper( + node.id, + type, + params + ) + try { + await waitForFinishPrepareRelatedNodes(userNodes, config._users) + await createWoTScriptAndStart( + config.name, + '', + servientWrapper, + userNodes ) + } catch (err) { + console.error('[error] ' + err) } - const MAX_COUNT = 100 - let count = 0 - return new Promise((resolve, reject) => { - const start = ( - title: string, - description: string, - userNodeIds: string[], - c: number - ) => { - c = c + 1 - setTimeout(async () => { - // Servientの起動が成功するまで繰り返す - console.log('*** startServient', c) - const success = await node.servientWrapper.startServient( - title, - description, - userNodeIds - ) - console.log('*** success', success) - if (success) { - resolve() - } else { - if (c > MAX_COUNT) { - console.error('[error] Not enough WoT Nodes settings.') - reject(new Error('Not enough WoT Nodes settings.')) - } - start(title, description, userNodeIds, c) - } - }, 100) - } - start(config.name, '', config._users, count) - }) } - // すでにservientがあれば終了する console.log('*** endServient') - node.servientWrapper = ServientManager.getInstance().getServientWrapper( - node.id - ) - if (node.servientWrapper) { - node.servientWrapper.endServient().then(() => { + if (servientManager.existServienetWrapper(node.id)) { + // すでにservientがあれば終了する + servientManager.removeServientWrapper(node.id).then(() => { // servient終了 console.log('*** servient ended. config node id: ', config.id) launchServient().then(() => { diff --git a/src/wot-server-property.ts b/src/wot-server-property.ts index f684ade..d925d82 100644 --- a/src/wot-server-property.ts +++ b/src/wot-server-property.ts @@ -5,28 +5,17 @@ module.exports = function (RED) { function WoTServerProperty(config) { RED.nodes.createNode(this, config) const node = this + this.status({ fill: 'red', shape: 'dot', text: 'not prepared' }) console.log('*** this', this) console.log('*** config', config) const woTServerConfig = RED.nodes.getNode(config.woTServerConfig) //test //console.log('*** RED', RED) //console.log('*** RED.nodes', RED.nodes) - //console.log('*** servientWrapper', woTServerConfig.servientWrapper) - function addNodeToServientWrapper() { - const servientWrapper = ServientManager.getInstance().getServientWrapper( - woTServerConfig.id - ) - if (servientWrapper) { - servientWrapper.addUserNode(node) - } else { - console.log('*** waiting to prepare servient') - setTimeout(() => { - addNodeToServientWrapper() - }, 100) - } - } - addNodeToServientWrapper() + woTServerConfig?.addUserNode(node) + console.log('*** addUserNode finished.', node.id) + this.status({ fill: 'green', shape: 'dot', text: 'running' }) - // WoTServerConfigノードからプロパティを取得する + // WoTServerConfigノードからプロパティを取得する際に呼び出す node.getProps = () => { return { attrType: 'properties', @@ -65,10 +54,9 @@ module.exports = function (RED) { '*** woTServerConfig.emitPropertyChange:', config.propertyName ) - const servientWrapper = ServientManager.getInstance().getServientWrapper( - woTServerConfig.id - ) - await servientWrapper.emitPropertyChange(config.propertyName) + await ServientManager.getInstance() + .getThing(woTServerConfig.id) + .emitPropertyChange(config.propertyName) console.log('*** woTServerConfig.emitPropertyChange finished') // 出力の作成 From 32f6f0f60838001e324b149f53ac73266cff8b7d Mon Sep 17 00:00:00 2001 From: hidetak Date: Fri, 12 Jan 2024 00:46:56 +0900 Subject: [PATCH 04/23] implements server-property, server-action, server-event nodes --- package.json | 3 +- src/locales/ja/wot-server-end.json | 17 +-- src/locales/ja/wot-server-event.html | 36 ++++++ src/locales/ja/wot-server-event.json | 17 +++ src/locales/ja/wot-server-property.json | 14 +- src/wot-action.js | 101 ++++++++------- src/wot-event.js | 141 ++++++++++++--------- src/wot-property.js | 16 +-- src/wot-server-action.ts | 2 +- src/wot-server-config.ts | 121 +++++++++++------- src/wot-server-end.html | 77 ++--------- src/wot-server-end.ts | 33 ++--- src/wot-server-event.html | 162 ++++++++++++++++++++++++ src/wot-server-event.ts | 98 ++++++++++++++ src/wot-server-property.html | 39 +----- src/wot-server-property.ts | 31 +---- 16 files changed, 572 insertions(+), 336 deletions(-) create mode 100644 src/locales/ja/wot-server-event.html create mode 100644 src/locales/ja/wot-server-event.json create mode 100644 src/wot-server-event.html create mode 100644 src/wot-server-event.ts diff --git a/package.json b/package.json index 3908078..036d0db 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,8 @@ "wot-server-config": "dist/wot-server-config.js", "wot-server-end": "dist/wot-server-end.js", "wot-server-property": "dist/wot-server-property.js", - "wot-server-action": "dist/wot-server-action.js" + "wot-server-action": "dist/wot-server-action.js", + "wot-server-event": "dist/wot-server-event.js" } }, "scripts": { diff --git a/src/locales/ja/wot-server-end.json b/src/locales/ja/wot-server-end.json index 349ed7f..9361a97 100644 --- a/src/locales/ja/wot-server-end.json +++ b/src/locales/ja/wot-server-end.json @@ -13,19 +13,10 @@ }, "inParams": { "tabLabel": "入力", - "propertyName": { - "label": "Thing名", - "description": "Thing名の説明。", - "placeholder": "Thing名" - } - }, - "outParams1": { - "tabLabel": "出力", - "outputLabel": "出力", - "output1": { - "label": "出力パラメータ1", - "description": "出力パラメータ1の説明。", - "placeholder": "出力パラメータ1" + "returnValue": { + "label": "戻り値の格納元", + "description": "戻り値の格納元", + "placeholder": "戻り値の格納元" } } } diff --git a/src/locales/ja/wot-server-event.html b/src/locales/ja/wot-server-event.html new file mode 100644 index 0000000..79e6f29 --- /dev/null +++ b/src/locales/ja/wot-server-event.html @@ -0,0 +1,36 @@ + diff --git a/src/locales/ja/wot-server-event.json b/src/locales/ja/wot-server-event.json new file mode 100644 index 0000000..d4a8024 --- /dev/null +++ b/src/locales/ja/wot-server-event.json @@ -0,0 +1,17 @@ +{ + "editor": { + "nameLabel": "名前", + "eventNameLabel": "イベント名", + "eventDataTypeLabel": "データ型", + "configLabel": "Thing設定", + "paletteLabel": "Server-Event", + "inParams": { + "tabLabel":"イベントの入力", + "eventValue":{ + "label":"イベント値", + "description":"イベント値。", + "placeholder":"イベント値" + } + } + } +} \ No newline at end of file diff --git a/src/locales/ja/wot-server-property.json b/src/locales/ja/wot-server-property.json index e8c70fa..f00a6b9 100644 --- a/src/locales/ja/wot-server-property.json +++ b/src/locales/ja/wot-server-property.json @@ -7,14 +7,6 @@ "propertyObservableFlagLabel": "観測可能", "configLabel": "Thing設定", "paletteLabel": "Server-Property", - "inParams": { - "tabLabel":"変更された値の入力", - "changedValue":{ - "label":"変更された値", - "description":"変更されたプロパティ値。", - "placeholder":"変更されたプロパティ値" - } - }, "outParams1": { "outputLabel":"読み込み要求" }, @@ -22,9 +14,9 @@ "tabLabel":"書き込み要求", "outputLabel":"書き込み要求", "writingValue":{ - "label":"書き込む値", - "description":"プロパティに書き込む値。", - "placeholder":"プロパティに書き込む値" + "label":"書き込む値の格納元", + "description":"プロパティに書き込む値の格納元。", + "placeholder":"プロパティに書き込む値の格納元" } } } diff --git a/src/wot-action.js b/src/wot-action.js index 3235f10..44cca61 100644 --- a/src/wot-action.js +++ b/src/wot-action.js @@ -1,50 +1,61 @@ -"use strict" +/** @format */ -module.exports = function(RED) { - function invokeActionNode(config) { - RED.nodes.createNode(this, config); - let node = this; +'use strict' - if (!config.thing) { - this.status({fill:"red",shape:"dot",text:"Error: Thing undefined"}); - return; - } else if (!config.action) { - this.status({fill:"red",shape:"dot",text:"Error: Choose an action"}); - return; - }; +module.exports = function (RED) { + function invokeActionNode(config) { + RED.nodes.createNode(this, config) + let node = this - this.on('input', function(msg) { - RED.nodes.getNode(config.thing).consumedThing.then((consumedThing) => { - const uriVariables = (config.uriVariables)? JSON.parse(config.uriVariables) : undefined; - consumedThing.invokeAction(config.action, msg.payload, {"uriVariables": uriVariables}) - .then((resp) => { - const payload = (resp)? resp : ""; - node.send({payload: payload, topic: config.topic}); - node.status({ - fill:"green", - shape:"dot", - text:"invoked" - }); - }) - .catch((err) => { - node.warn(err); - node.status({ - fill:"red", - shape:"ring", - text: err.message - }); - }) + if (!config.thing) { + this.status({ fill: 'red', shape: 'dot', text: 'Error: Thing undefined' }) + return + } else if (!config.action) { + this.status({ + fill: 'red', + shape: 'dot', + text: 'Error: Choose an action' + }) + return + } + + this.on('input', function (msg) { + RED.nodes.getNode(config.thing).consumedThing.then((consumedThing) => { + const uriVariables = config.uriVariables + ? JSON.parse(config.uriVariables) + : undefined + consumedThing + .invokeAction(config.action, msg.payload, { + uriVariables: uriVariables + }) + .then(async (resp) => { + const payload = resp ? await resp.value() : '' + node.send({ payload: payload, topic: config.topic }) + node.status({ + fill: 'green', + shape: 'dot', + text: 'invoked' }) - }); + }) + .catch((err) => { + node.warn(err) + node.status({ + fill: 'red', + shape: 'ring', + text: err.message + }) + }) + }) + }) - this.on('close', function(removed, done) { - if (removed) { - // This node has been deleted - } else { - // This node is being restarted - } - done(); - }); - } - RED.nodes.registerType("invoke-action", invokeActionNode); -} \ No newline at end of file + this.on('close', function (removed, done) { + if (removed) { + // This node has been deleted + } else { + // This node is being restarted + } + done() + }) + } + RED.nodes.registerType('invoke-action', invokeActionNode) +} diff --git a/src/wot-event.js b/src/wot-event.js index 4228c34..bb19f86 100644 --- a/src/wot-event.js +++ b/src/wot-event.js @@ -1,65 +1,92 @@ -"use strict" +/** @format */ -module.exports = function(RED) { - function subscribeEventNode(config) { - RED.nodes.createNode(this,config); - let node = this; +'use strict' - this.subscription = undefined; - this.status({}); +module.exports = function (RED) { + function subscribeEventNode(config) { + RED.nodes.createNode(this, config) + let node = this - if (!config.thing) { - this.status({fill:"red",shape:"dot",text:"Error: Thing undefined"}); - return; - } else if (!config.event) { - this.status({fill:"red",shape:"dot",text:"Error: Choose an event"}); - return; - }; + this.subscription = undefined + this.status({}) - - RED.nodes.getNode(config.thing).consumedThing.then((consumedThing) => { - node.subscription = consumedThing.subscribeEvent(config.event, - (resp) => { - if (resp) node.send({payload: resp, topic: config.topic}) - node.status({ - fill:"green", - shape:"dot", - text:"Subscribed" - }); - }, - (err) => { - node.warn(err); - node.status({ - fill:"red", - shape:"ring", - text: "Subscription error" - }); - }, - () => { - node.warn("Subscription ended."); - node.status({}); - node.subscription = undefined; - } - ) + if (!config.thing) { + this.status({ fill: 'red', shape: 'dot', text: 'Error: Thing undefined' }) + return + } else if (!config.event) { + this.status({ fill: 'red', shape: 'dot', text: 'Error: Choose an event' }) + return + } - if (node.subscription) { + RED.nodes + .getNode(config.thing) + .consumedThing.then(async (consumedThing) => { + let subscription + // イベントのサブスクリプションが成功するまで繰り返す + while (true) { + subscription = await consumedThing + .subscribeEvent( + config.event, + async (resp) => { + if (resp) { + const payload = await resp.value() + node.send({ payload, topic: config.topic }) + } node.status({ - fill:"green", - shape:"dot", - text:"Subscribed" - }); - } - }); + fill: 'green', + shape: 'dot', + text: 'Subscribed' + }) + }, + (err) => { + node.warn(err) + node.status({ + fill: 'red', + shape: 'ring', + text: 'Subscription error' + }) + }, + () => { + node.warn('Subscription ended.') + node.status({}) + node.subscription = undefined + } + ) + .catch((err) => { + console.warn( + '[warn] event subscribe error. try again. error: ' + err + ) + }) + if (subscription) { + break + } + await (() => { + return new Promise((resolve, reject) => { + setTimeout(() => { + resolve() + }, 500) + }) + })() + } + node.subscription = subscription - this.on('close', function(removed, done) { - if (removed) { - // This node has been deleted - } else { - // This node is being restarted - } - done(); - }); + if (node.subscription) { + node.status({ + fill: 'green', + shape: 'dot', + text: 'Subscribed' + }) + } + }) - } - RED.nodes.registerType("subscribe-event",subscribeEventNode); -} \ No newline at end of file + this.on('close', function (removed, done) { + if (removed) { + // This node has been deleted + } else { + // This node is being restarted + } + done() + }) + } + RED.nodes.registerType('subscribe-event', subscribeEventNode) +} diff --git a/src/wot-property.js b/src/wot-property.js index f3bb714..d70fa02 100644 --- a/src/wot-property.js +++ b/src/wot-property.js @@ -29,6 +29,7 @@ module.exports = function (RED) { return } + //TODO: impleement observeProperty RED.nodes.getNode(config.thing).consumedThing.then((consumedThing) => { this.interval_id = setInterval( (function readProperty() { @@ -37,14 +38,13 @@ module.exports = function (RED) { : undefined consumedThing .readProperty(config.property, { uriVariables: uriVariables }) - .then((resp) => { - resp.value().then((value) => { - node.send({ payload: value, topic: config.topic }) - node.status({ - fill: 'green', - shape: 'dot', - text: 'connected' - }) + .then(async (resp) => { + const payload = await resp.value() + node.send({ payload, topic: config.topic }) + node.status({ + fill: 'green', + shape: 'dot', + text: 'connected' }) }) .catch((err) => { diff --git a/src/wot-server-action.ts b/src/wot-server-action.ts index a056287..b0afa7b 100644 --- a/src/wot-server-action.ts +++ b/src/wot-server-action.ts @@ -15,7 +15,7 @@ module.exports = function (RED) { console.log('*** addUserNode finished.', node.id) this.status({ fill: 'green', shape: 'dot', text: 'running' }) - // WoTServerConfigノードからプロパティを取得する際に呼び出す + // WoTServerConfigノードからアクションの定義を取得する際に呼び出す node.getProps = () => { return { attrType: 'actions', diff --git a/src/wot-server-config.ts b/src/wot-server-config.ts index fe08942..4f43a52 100644 --- a/src/wot-server-config.ts +++ b/src/wot-server-config.ts @@ -62,6 +62,77 @@ module.exports = function (RED) { throw new Error('Not enough WoT Nodes settings.') } + async function registerPropertiesProcess( + userNode: any, + thing: any, + props: any + ) { + thing.setPropertyReadHandler(props.name, () => { + console.log('*** call propertyReadHandler') + console.log('*** userNodes.length', userNodes.length) + return new Promise((resolve, reject) => { + const finish = (payload) => { + console.log('*** finish', payload) + resolve(payload) + } + userNode.send([ + { + wot: { finish } + }, + null + ]) + }) + }) + if (!props.content.readOnly) { + thing.setPropertyWriteHandler(props.name, async (value: any) => { + const v = await value.value() + console.log('*** call propertyWriteHandler', v) + console.log('*** userNodes.length', userNodes.length) + return new Promise((resolve, reject) => { + const finish = (payload) => { + console.log('*** finish', props) + if (props.content.observable) { + console.log('*** emitPropertyChange', props.name) + thing.emitPropertyChange(props.name) + } + resolve() + } + console.log('*** userNode', userNode) + userNode.send([ + null, + { + wot: { finish }, + [props.outputAttr]: v + } + ]) + }) + }) + } + } + + async function registerActionsProcess( + userNode: any, + thing: any, + props: any + ) { + thing.setActionHandler(props.name, async (params) => { + const args = await params.value() + console.log('*** call actionHandler') + console.log('*** actionHandler userNodes.length', userNodes.length) + return new Promise((resolve, reject) => { + const finish = (payload) => { + console.log('*** actionHandler finish', props, payload) + resolve(payload) + } + console.log('*** actionHandler userNode', userNode) + userNode.send({ + wot: { finish }, + [props.outputArgs]: args + }) + }) + }) + } + async function createWoTScriptAndStart( title: string, description: string, @@ -85,52 +156,16 @@ module.exports = function (RED) { for (const userNode of userNodes) { const props = userNode.getProps() console.log('*** props', props) + if (!props.name) { + console.warn('[warn] Not enough settings for td. props: ', props) + continue + } if (props.attrType === 'properties') { - thing.setPropertyReadHandler(props.name, () => { - console.log('*** call propertyReadHandler') - console.log('*** userNodes.length', userNodes.length) - return new Promise((resolve, reject) => { - const finish = (payload) => { - console.log('*** finish', payload) - resolve(payload) - } - userNode.send([ - { - wot: { finish } - }, - null - ]) - }) - }) - if (!props.content.readOnly) { - thing.setPropertyWriteHandler(props.name, async (value: any) => { - const v = await value.value() - console.log('*** call propertyWriteHandler', v) - console.log('*** userNodes.length', userNodes.length) - return new Promise((resolve, reject) => { - const finish = (payload) => { - console.log('*** finish', props) - if (props.content.observable) { - console.log('*** emitPropertyChange', props.name) - thing.emitPropertyChange(props.name) - } - resolve() - } - console.log('*** userNode', userNode) - userNode.send([ - null, - { - wot: { finish }, - [props.outputAttr]: v - } - ]) - }) - }) - } + registerPropertiesProcess(userNode, thing, props) } else if (props.attrType === 'actions') { - //TODO: implements + registerActionsProcess(userNode, thing, props) } else if (props.attrType === 'events') { - //TODO: implements + // Nothing to do } } await servientWrapper.exposeThing() diff --git a/src/wot-server-end.html b/src/wot-server-end.html index b09213a..5714bd0 100644 --- a/src/wot-server-end.html +++ b/src/wot-server-end.html @@ -6,29 +6,18 @@ color: "#d7d7a0", defaults: { name: {value:""}, - inParams_propertyNameType: { - value: "str" - }, - inParams_propertyNameConstValue: { - value: "payload" - }, - outParams1_output1Type: { + inParams_returnValueType: { value: "msg" }, - outParams1_output1ConstValue: { - value: "payload1_1" + inParams_returnValueConstValue: { + value: "payload" } }, credentials: { - inParams_propertyName: {type: "text"}, + inParams_returnValue: {type: "text"}, }, inputs:1, outputs:0, - outputLabels: function(index) { - return [ - this._("editor.outParams1.outputLabel") - ][index] - }, icon: "arrow.png", label: function() { return this.name||this._("editor.paletteLabel")||"wot-server-end"; @@ -52,10 +41,6 @@ $("#red-tabs").resize(); }, }); - tabs.addTab({ - id: 'tab-thingConfig-settings', - label: this._('editor.thingConfig.tabLabel'), - }); tabs.addTab({ id: 'tab-inParams-settings', @@ -64,41 +49,22 @@ // 入力パラメータの指定項目作成 prepareInOutParamSetting("inParams", { - name:"propertyName", - types: ["msg","str","num","env"], - defaultType: "str", + name:"returnValue", + types: ["msg"], + defaultType: "msg", defaultValue: "payload", required: true }, this) - tabs.addTab({ - id: 'tab-outParams1-settings', - label: this._('editor.outParams1.tabLabel'), - }); - // 出力パラメータの指定項目作成 - prepareInOutParamSetting("outParams1", { - name: "output1", - types: ["msg","flow"], - defaultType: "msg", - defaultValue: "payload1_1", - required: true - }, this) }, oneditsave: function() { saveInOutParamSetting("inParams", { - name:"propertyName", + name:"returnValue", types: ["msg","str","num","env"], defaultType: "str", defaultValue: "payload", required: true }, this) - saveInOutParamSetting("outParams1", { - name: "output1", - types: ["msg","flow"], - defaultType: "msg", - defaultValue: "payload1_1", - required: true - }, this) } }); const prepareInOutParamSetting = (inOrOutParams, params, _this) => { @@ -154,32 +120,13 @@
- -
-
- - - - -
-
-
- - - - -
-
- -
-
- - - - + + + +
diff --git a/src/wot-server-end.ts b/src/wot-server-end.ts index 3f40527..b0e4659 100644 --- a/src/wot-server-end.ts +++ b/src/wot-server-end.ts @@ -8,38 +8,21 @@ module.exports = function (RED) { // inputイベント node.on('input', async (msg, send, done) => { console.log('*** wot-server-end input msg', msg) - msg.wot?.finish(msg.payload) - return - - // configノードを取得 - const woTServerConfig = RED.nodes.getNode(config.woTServerConfig) // 入力パラメータを取得 - node.inParams_propertyName = node.credentials.inParams_propertyName + node.inParams_returnValue = node.credentials.inParams_returnValue if ( - config.inParams_propertyNameConstValue && - config.inParams_propertyNameType + config.inParams_returnValueConstValue && + config.inParams_returnValueType ) { - node.inParams_propertyName = RED.util.evaluateNodeProperty( - config.inParams_propertyNameConstValue, - config.inParams_propertyNameType, + node.inParams_returnValue = RED.util.evaluateNodeProperty( + config.inParams_returnValueConstValue, + config.inParams_returnValueType, node, msg ) } - console.log('node.inParams_propertyName:', node.inParams_propertyName) - - // 出力の作成 - // 出力の出力を返す場合 - setOutput( - config.outParams1_output1Type, - config.outParams1_output1ConstValue, - msg, - this.context(), - '[value of outParams1_output1]' - ) - // ここまで - - send(msg) + console.log('node.inParams_returnValue:', node.inParams_returnValue) + msg.wot?.finish(node.inParams_returnValue) done() }) // closeイベント diff --git a/src/wot-server-event.html b/src/wot-server-event.html new file mode 100644 index 0000000..7fc2841 --- /dev/null +++ b/src/wot-server-event.html @@ -0,0 +1,162 @@ + + + + + + diff --git a/src/wot-server-event.ts b/src/wot-server-event.ts new file mode 100644 index 0000000..4aad7b3 --- /dev/null +++ b/src/wot-server-event.ts @@ -0,0 +1,98 @@ +/** @format */ +import ServientManager from './servients/servient-manager' + +module.exports = function (RED) { + function WoTServerEvent(config) { + RED.nodes.createNode(this, config) + const node = this + this.status({ fill: 'red', shape: 'dot', text: 'not prepared' }) + console.log('*** this', this) + console.log('*** config', config) + const woTServerConfig = RED.nodes.getNode(config.woTServerConfig) //test + //console.log('*** RED', RED) + //console.log('*** RED.nodes', RED.nodes) + woTServerConfig?.addUserNode(node) + console.log('*** addUserNode finished.', node.id) + this.status({ fill: 'green', shape: 'dot', text: 'running' }) + + // WoTServerConfigノードからイベントの定義を取得する際に呼び出す + node.getProps = () => { + return { + attrType: 'events', + name: config.eventName, + outputAttr: config.inParams_eventValueConstValue, + content: { + description: config.eventDescription, + data: { type: config.eventDataType } + } + } + } + + // inputイベント + node.on('input', async (msg, send, done) => { + // configノードを取得 + const woTServerConfig = RED.nodes.getNode(config.woTServerConfig) + console.log('*** servientWrapper', woTServerConfig.servientWrapper) + + // 入力パラメータを取得 + node.inParams_eventValue = node.credentials.inParams_eventValue + if ( + config.inParams_eventValueConstValue && + config.inParams_eventValueType + ) { + node.inParams_eventValue = RED.util.evaluateNodeProperty( + config.inParams_eventValueConstValue, + config.inParams_eventValueType, + node, + msg + ) + } + console.log('node.inParams_eventValue:', node.inParams_eventValue) + await ServientManager.getInstance() + .getThing(woTServerConfig.id) + .emitEvent(config.eventName, node.inParams_eventValue) + console.log('*** emitEvent finished') + + // イベント通知の場合は出力なし + done() + }) + // closeイベント + node.on('close', function (removed, done) { + if (removed) { + // This node has been disabled/deleted + } else { + // This node is being restarted + } + // 処理終了通知 + done() + }) + } + RED.nodes.registerType('wot-server-event', WoTServerEvent, { + credentials: { + inParams_propertyName: { type: 'text' } + } + }) + + const setOutput = (type, valueName, msg, context, value) => { + if (type === 'msg') { + const names = valueName.split('.') + let target = msg + for (let i = 0; i < names.length - 1; i++) { + let n = names[i] + if (target[n] && target[n] instanceof Object) { + target = target[n] + } else { + target[n] = {} + target = target[n] + } + } + target[names[names.length - 1]] = value + } else if (type === 'node') { + context.set(valueName, value) + } else if (type === 'flow') { + context.flow.set(valueName, value) + } else if (type === 'global') { + context.global.set(valueName, value) + } + } +} diff --git a/src/wot-server-property.html b/src/wot-server-property.html index 0b70568..55b4d85 100644 --- a/src/wot-server-property.html +++ b/src/wot-server-property.html @@ -10,12 +10,6 @@ propertyDataType: {value:"string"}, propertyReadOnlyFlag: {value:true}, propertyObservableFlag: {value:true}, - inParams_changedValueType: { - value: "msg" - }, - inParams_changedValueConstValue: { - value: "payload" - }, outParams2_writingValueType: { value: "msg" }, @@ -28,8 +22,7 @@ } }, credentials: { - inParams_changedValue: {type: "text"}, - outParams2_writingValue: {type: "text"}, + outParams2_writingValue: {type: "text"} }, inputs:1, outputs:2, @@ -62,20 +55,6 @@ $("#red-tabs").resize(); }, }); - tabs.addTab({ - id: 'tab-inParams-settings', - label: this._('editor.inParams.tabLabel')+"(削除予定)", - }); - - // 入力パラメータの指定項目作成 - prepareInOutParamSetting("inParams", { - name:"changedValue", - types: ["msg","str","num","env"], - defaultType: "msg", - defaultValue: "payload", - required: true - }, this) - tabs.addTab({ id: 'tab-outParams2-settings', label: this._('editor.outParams2.tabLabel'), @@ -90,13 +69,6 @@ }, this) }, oneditsave: function() { - saveInOutParamSetting("inParams", { - name:"changedValue", - types: ["msg","str","num","env"], - defaultType: "msg", - defaultValue: "payload", - required: true - }, this) saveInOutParamSetting("outParams2", { name: "writingValue", types: ["msg"], @@ -188,15 +160,6 @@
- -
-
- - - - -
-
diff --git a/src/wot-server-property.ts b/src/wot-server-property.ts index d925d82..86d99ad 100644 --- a/src/wot-server-property.ts +++ b/src/wot-server-property.ts @@ -15,7 +15,7 @@ module.exports = function (RED) { console.log('*** addUserNode finished.', node.id) this.status({ fill: 'green', shape: 'dot', text: 'running' }) - // WoTServerConfigノードからプロパティを取得する際に呼び出す + // WoTServerConfigノードからプロパティの定義を取得する際に呼び出す node.getProps = () => { return { attrType: 'properties', @@ -36,20 +36,6 @@ module.exports = function (RED) { const woTServerConfig = RED.nodes.getNode(config.woTServerConfig) console.log('*** servientWrapper', woTServerConfig.servientWrapper) - // 入力パラメータを取得 - /*node.inParams_changedValue = node.credentials.inParams_changedValue - if ( - config.inParams_changedValueConstValue && - config.inParams_changedValueType - ) { - node.inParams_changedValue = RED.util.evaluateNodeProperty( - config.inParams_changedValueConstValue, - config.inParams_changedValueType, - node, - msg - ) - } - console.log('node.inParams_changedValue:', node.inParams_changedValue)*/ console.log( '*** woTServerConfig.emitPropertyChange:', config.propertyName @@ -57,20 +43,7 @@ module.exports = function (RED) { await ServientManager.getInstance() .getThing(woTServerConfig.id) .emitPropertyChange(config.propertyName) - console.log('*** woTServerConfig.emitPropertyChange finished') - - // 出力の作成 - // 出力の出力を返す場合 - /*setOutput( - config.outParams2_wriitingValueType, - config.outParams2_wriitingValueConstValue, - msg, - this.context(), - '[value of outParams1_wriitingValue]' - ) - // ここまで - - send(msg)*/ + console.log('*** emitPropertyChange finished', config.propertyName) // 変更されたプロパティ値を入力された場合は出力なし done() From af05c309b5a4367676b00c7d7f8ca4a527acdfba Mon Sep 17 00:00:00 2001 From: hidetak Date: Sun, 14 Jan 2024 01:06:45 +0900 Subject: [PATCH 05/23] add observe feature to read-property node --- src/wot-property.js | 91 ++++++++++++++++++++++++++---------- src/wot-server-action.html | 2 +- src/wot-server-end.html | 2 +- src/wot-server-event.html | 2 +- src/wot-server-property.html | 2 +- 5 files changed, 70 insertions(+), 29 deletions(-) diff --git a/src/wot-property.js b/src/wot-property.js index d70fa02..1ca12ed 100644 --- a/src/wot-property.js +++ b/src/wot-property.js @@ -29,37 +29,78 @@ module.exports = function (RED) { return } - //TODO: impleement observeProperty - RED.nodes.getNode(config.thing).consumedThing.then((consumedThing) => { - this.interval_id = setInterval( - (function readProperty() { - const uriVariables = config.uriVariables - ? JSON.parse(config.uriVariables) - : undefined - consumedThing - .readProperty(config.property, { uriVariables: uriVariables }) - .then(async (resp) => { - const payload = await resp.value() - node.send({ payload, topic: config.topic }) + RED.nodes + .getNode(config.thing) + .consumedThing.then(async (consumedThing) => { + if (config.observe === true) { + // observePropertyが成功するまで繰り返す + let ob + while (true) { + try { + ob = await consumedThing.observeProperty( + config.property, + async (resp) => { + const payload = await resp.value() + node.send({ payload, topic: config.topic }) + } + ) + } catch (err) { + console.warn( + '[warn] property observe error. try again. error: ' + err + ) + node.status({ + fill: 'red', + shape: 'ring', + text: 'Observe error' + }) + } + if (ob) { node.status({ fill: 'green', shape: 'dot', text: 'connected' }) - }) - .catch((err) => { - node.warn(err) - node.status({ - fill: 'red', - shape: 'ring', - text: 'Response error' + break + } + await (() => { + return new Promise((resolve, reject) => { + setTimeout(() => { + resolve() + }, 500) }) - }) - return readProperty - })(), - config.interval * 1000 - ) - }) + })() + } + } else { + this.interval_id = setInterval( + (function readProperty() { + const uriVariables = config.uriVariables + ? JSON.parse(config.uriVariables) + : undefined + consumedThing + .readProperty(config.property, { uriVariables: uriVariables }) + .then(async (resp) => { + const payload = await resp.value() + node.send({ payload, topic: config.topic }) + node.status({ + fill: 'green', + shape: 'dot', + text: 'connected' + }) + }) + .catch((err) => { + node.warn(err) + node.status({ + fill: 'red', + shape: 'ring', + text: 'Response error' + }) + }) + return readProperty + })(), + config.interval * 1000 + ) + } + }) node.on('close', function () { if (node.interval_id != null) { diff --git a/src/wot-server-action.html b/src/wot-server-action.html index aa49f8a..af0ad47 100644 --- a/src/wot-server-action.html +++ b/src/wot-server-action.html @@ -2,7 +2,7 @@ (() => { RED.nodes.registerType('wot-server-action', { category: "Web of Things", - color: "#d7d7a0", + color: "#a2dea0", defaults: { name: {value:""}, actionName: {value:""}, diff --git a/src/wot-server-end.html b/src/wot-server-end.html index 5714bd0..5ac7264 100644 --- a/src/wot-server-end.html +++ b/src/wot-server-end.html @@ -3,7 +3,7 @@ RED.nodes.registerType('wot-server-end', { category: "Web of Things", - color: "#d7d7a0", + color: "#a2dea0", defaults: { name: {value:""}, inParams_returnValueType: { diff --git a/src/wot-server-event.html b/src/wot-server-event.html index 7fc2841..ce6850f 100644 --- a/src/wot-server-event.html +++ b/src/wot-server-event.html @@ -2,7 +2,7 @@ (() => { RED.nodes.registerType('wot-server-event', { category: "Web of Things", - color: "#d7d7a0", + color: "#a2dea0", defaults: { name: {value:""}, eventName: {value:""}, diff --git a/src/wot-server-property.html b/src/wot-server-property.html index 55b4d85..1ddef0d 100644 --- a/src/wot-server-property.html +++ b/src/wot-server-property.html @@ -2,7 +2,7 @@ (() => { RED.nodes.registerType('wot-server-property', { category: "Web of Things", - color: "#d7d7a0", + color: "#a2dea0", defaults: { name: {value:""}, propertyName: {value:""}, From 8cf62d1d5fcd310e8f002c0ac0dfb9de9cf25f47 Mon Sep 17 00:00:00 2001 From: hidetak Date: Tue, 16 Jan 2024 23:47:31 +0900 Subject: [PATCH 06/23] add binding setting feature and format codes --- .prettierignore | 2 + .prettierrc.json | 8 ++ src/locales/ja/wot-server-config.json | 2 + src/servients/http-servient-wrapper.ts | 3 +- src/servients/servient-manager.ts | 34 ++---- src/wot-action.js | 14 +-- src/wot-event.js | 112 +++++++++---------- src/wot-property.js | 147 +++++++++++-------------- src/wot-server-action.ts | 15 +-- src/wot-server-config.html | 61 +++++++++- src/wot-server-config.ts | 103 ++++++++--------- src/wot-server-end.ts | 13 +-- src/wot-server-event.ts | 14 +-- src/wot-server-property.html | 1 - src/wot-server-property.ts | 18 +-- src/wot-thing.js | 95 ++++++++-------- 16 files changed, 315 insertions(+), 327 deletions(-) create mode 100644 .prettierignore create mode 100644 .prettierrc.json diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..ebcc9db --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +*.md +*.json diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..deceac7 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,8 @@ +{ + "trailingComma": "es5", + "printWidth": 120, + "singleQuote": true, + "tabWidth": 2, + "semi": false, + "endOfLine": "lf" +} diff --git a/src/locales/ja/wot-server-config.json b/src/locales/ja/wot-server-config.json index 6c1e2ea..19c1fda 100644 --- a/src/locales/ja/wot-server-config.json +++ b/src/locales/ja/wot-server-config.json @@ -2,6 +2,8 @@ "editor": { "nameLabel": "Thing名", "bindingTypeLabel": "Binding種別", + "bindingConfigLabel": "Binding設定", + "bindingConfigPlaceholder": "Binding設定", "configLabel": "Thing設定" } } diff --git a/src/servients/http-servient-wrapper.ts b/src/servients/http-servient-wrapper.ts index 8a3c61e..5472878 100644 --- a/src/servients/http-servient-wrapper.ts +++ b/src/servients/http-servient-wrapper.ts @@ -33,7 +33,7 @@ export default class HttpServientWrapper implements ServientWrapper { // create Servient add HTTP binding with port configuration this.servient = new Servient() this.server = new HttpServer({ - port: params.port // (default 8080) + port: params.port, // (default 8080) }) this.servient.addServer(this.server) this.nodeId = id @@ -214,6 +214,7 @@ export default class HttpServientWrapper implements ServientWrapper { // 新規に作成するConfigノードが競合するか調べる public isConflict(): boolean { + return false throw new Error('Method not implemented.') } } diff --git a/src/servients/servient-manager.ts b/src/servients/servient-manager.ts index bc33cab..d306d43 100644 --- a/src/servients/servient-manager.ts +++ b/src/servients/servient-manager.ts @@ -1,22 +1,13 @@ -/** @format */ - import HttpServientWrapper from './http-servient-wrapper' // servient type export interface ServientWrapper { // Servientを作成できるか確認する isConflict(type: string, params: any): boolean - //addUserNode(node: any): void createThing(td: any): Promise exposeThing(): Promise getThing(): any - // startServient( - // title: string, - // description: string, - // userNodeIds: string[] - // ): Promise endServient(): Promise - //emitPropertyChange(propertyName: string): Promise } // servientのインスタンスを管理する @@ -32,22 +23,14 @@ export default class ServientManager { private constructor() { console.log('*** ServientManager constructor called') } - public createServientWrapper( - id: string, - type: string, - params: any - ): ServientWrapper { - console.log('*** createServientWrapper', id, type, params) - if (!this.canCreateServient(type, params)) { - throw new Error( - `servient wrapper conflicted. type: ${type} params: ${JSON.stringify( - params - )}` - ) + public createServientWrapper(id: string, bindingType: string, params: any): ServientWrapper { + console.log('*** createServientWrapper', id, bindingType, params) + if (!this.canCreateServient(bindingType, params)) { + throw new Error(`servient wrapper conflicted. type: ${bindingType} params: ${JSON.stringify(params)}`) } - if (type === 'http') { + if (bindingType === 'http') { this.servientWrappers[id] = new HttpServientWrapper(id, params) - } else if (type === 'coap') { + } else if (bindingType === 'coap') { //TODO } return this.servientWrappers[id] @@ -64,10 +47,7 @@ export default class ServientManager { // return this.servientWrappers[id] // } private canCreateServient(type: string, params: any) { - console.log( - '*** canCreateServient this.servientWrappers', - this.servientWrappers - ) + console.log('*** canCreateServient this.servientWrappers', this.servientWrappers) for (const id in this.servientWrappers) { if (this.servientWrappers[id].isConflict(type, params)) { return false diff --git a/src/wot-action.js b/src/wot-action.js index 44cca61..b5cad46 100644 --- a/src/wot-action.js +++ b/src/wot-action.js @@ -1,5 +1,3 @@ -/** @format */ - 'use strict' module.exports = function (RED) { @@ -14,19 +12,17 @@ module.exports = function (RED) { this.status({ fill: 'red', shape: 'dot', - text: 'Error: Choose an action' + text: 'Error: Choose an action', }) return } this.on('input', function (msg) { RED.nodes.getNode(config.thing).consumedThing.then((consumedThing) => { - const uriVariables = config.uriVariables - ? JSON.parse(config.uriVariables) - : undefined + const uriVariables = config.uriVariables ? JSON.parse(config.uriVariables) : undefined consumedThing .invokeAction(config.action, msg.payload, { - uriVariables: uriVariables + uriVariables: uriVariables, }) .then(async (resp) => { const payload = resp ? await resp.value() : '' @@ -34,7 +30,7 @@ module.exports = function (RED) { node.status({ fill: 'green', shape: 'dot', - text: 'invoked' + text: 'invoked', }) }) .catch((err) => { @@ -42,7 +38,7 @@ module.exports = function (RED) { node.status({ fill: 'red', shape: 'ring', - text: err.message + text: err.message, }) }) }) diff --git a/src/wot-event.js b/src/wot-event.js index bb19f86..e7ee65c 100644 --- a/src/wot-event.js +++ b/src/wot-event.js @@ -1,5 +1,3 @@ -/** @format */ - 'use strict' module.exports = function (RED) { @@ -18,66 +16,62 @@ module.exports = function (RED) { return } - RED.nodes - .getNode(config.thing) - .consumedThing.then(async (consumedThing) => { - let subscription - // イベントのサブスクリプションが成功するまで繰り返す - while (true) { - subscription = await consumedThing - .subscribeEvent( - config.event, - async (resp) => { - if (resp) { - const payload = await resp.value() - node.send({ payload, topic: config.topic }) - } - node.status({ - fill: 'green', - shape: 'dot', - text: 'Subscribed' - }) - }, - (err) => { - node.warn(err) - node.status({ - fill: 'red', - shape: 'ring', - text: 'Subscription error' - }) - }, - () => { - node.warn('Subscription ended.') - node.status({}) - node.subscription = undefined + RED.nodes.getNode(config.thing).consumedThing.then(async (consumedThing) => { + let subscription + // イベントのサブスクリプションが成功するまで繰り返す + while (true) { + subscription = await consumedThing + .subscribeEvent( + config.event, + async (resp) => { + if (resp) { + const payload = await resp.value() + node.send({ payload, topic: config.topic }) } - ) - .catch((err) => { - console.warn( - '[warn] event subscribe error. try again. error: ' + err - ) - }) - if (subscription) { - break - } - await (() => { - return new Promise((resolve, reject) => { - setTimeout(() => { - resolve() - }, 500) - }) - })() - } - node.subscription = subscription - - if (node.subscription) { - node.status({ - fill: 'green', - shape: 'dot', - text: 'Subscribed' + node.status({ + fill: 'green', + shape: 'dot', + text: 'Subscribed', + }) + }, + (err) => { + node.warn(err) + node.status({ + fill: 'red', + shape: 'ring', + text: 'Subscription error', + }) + }, + () => { + node.warn('Subscription ended.') + node.status({}) + node.subscription = undefined + } + ) + .catch((err) => { + console.warn('[warn] event subscribe error. try again. error: ' + err) }) + if (subscription) { + break } - }) + await (() => { + return new Promise((resolve, reject) => { + setTimeout(() => { + resolve() + }, 500) + }) + })() + } + node.subscription = subscription + + if (node.subscription) { + node.status({ + fill: 'green', + shape: 'dot', + text: 'Subscribed', + }) + } + }) this.on('close', function (removed, done) { if (removed) { diff --git a/src/wot-property.js b/src/wot-property.js index 1ca12ed..70adb99 100644 --- a/src/wot-property.js +++ b/src/wot-property.js @@ -1,5 +1,3 @@ -/** @format */ - 'use strict' module.exports = function (RED) { @@ -17,90 +15,81 @@ module.exports = function (RED) { this.status({ fill: 'red', shape: 'dot', - text: 'Error: Choose a property' + text: 'Error: Choose a property', }) return } else if (!config.interval) { this.status({ fill: 'red', shape: 'dot', - text: 'Error: Choose an interval' + text: 'Error: Choose an interval', }) return } - RED.nodes - .getNode(config.thing) - .consumedThing.then(async (consumedThing) => { - if (config.observe === true) { - // observePropertyが成功するまで繰り返す - let ob - while (true) { - try { - ob = await consumedThing.observeProperty( - config.property, - async (resp) => { - const payload = await resp.value() - node.send({ payload, topic: config.topic }) - } - ) - } catch (err) { - console.warn( - '[warn] property observe error. try again. error: ' + err - ) - node.status({ - fill: 'red', - shape: 'ring', - text: 'Observe error' - }) - } - if (ob) { - node.status({ - fill: 'green', - shape: 'dot', - text: 'connected' - }) - break - } - await (() => { - return new Promise((resolve, reject) => { - setTimeout(() => { - resolve() - }, 500) - }) - })() + RED.nodes.getNode(config.thing).consumedThing.then(async (consumedThing) => { + if (config.observe === true) { + // observePropertyが成功するまで繰り返す + let ob + while (true) { + try { + ob = await consumedThing.observeProperty(config.property, async (resp) => { + const payload = await resp.value() + node.send({ payload, topic: config.topic }) + }) + } catch (err) { + console.warn('[warn] property observe error. try again. error: ' + err) + node.status({ + fill: 'red', + shape: 'ring', + text: 'Observe error', + }) + } + if (ob) { + node.status({ + fill: 'green', + shape: 'dot', + text: 'connected', + }) + break } - } else { - this.interval_id = setInterval( - (function readProperty() { - const uriVariables = config.uriVariables - ? JSON.parse(config.uriVariables) - : undefined - consumedThing - .readProperty(config.property, { uriVariables: uriVariables }) - .then(async (resp) => { - const payload = await resp.value() - node.send({ payload, topic: config.topic }) - node.status({ - fill: 'green', - shape: 'dot', - text: 'connected' - }) + await (() => { + return new Promise((resolve, reject) => { + setTimeout(() => { + resolve() + }, 500) + }) + })() + } + } else { + this.interval_id = setInterval( + (function readProperty() { + const uriVariables = config.uriVariables ? JSON.parse(config.uriVariables) : undefined + consumedThing + .readProperty(config.property, { uriVariables: uriVariables }) + .then(async (resp) => { + const payload = await resp.value() + node.send({ payload, topic: config.topic }) + node.status({ + fill: 'green', + shape: 'dot', + text: 'connected', }) - .catch((err) => { - node.warn(err) - node.status({ - fill: 'red', - shape: 'ring', - text: 'Response error' - }) + }) + .catch((err) => { + node.warn(err) + node.status({ + fill: 'red', + shape: 'ring', + text: 'Response error', }) - return readProperty - })(), - config.interval * 1000 - ) - } - }) + }) + return readProperty + })(), + config.interval * 1000 + ) + } + }) node.on('close', function () { if (node.interval_id != null) { @@ -123,26 +112,24 @@ module.exports = function (RED) { this.status({ fill: 'red', shape: 'dot', - text: 'Error: Choose a property' + text: 'Error: Choose a property', }) return } RED.nodes.getNode(config.thing).consumedThing.then((consumedThing) => { node.on('input', function (msg) { - const uriVariables = config.uriVariables - ? JSON.parse(config.uriVariables) - : undefined + const uriVariables = config.uriVariables ? JSON.parse(config.uriVariables) : undefined consumedThing .writeProperty(config.property, msg.payload, { - uriVariables: uriVariables + uriVariables: uriVariables, }) .then((resp) => { if (resp) node.send({ payload: resp, topic: config.topic }) node.status({ fill: 'green', shape: 'dot', - text: 'connected' + text: 'connected', }) }) .catch((err) => { @@ -150,7 +137,7 @@ module.exports = function (RED) { node.status({ fill: 'red', shape: 'ring', - text: err.message + text: err.message, }) }) }) diff --git a/src/wot-server-action.ts b/src/wot-server-action.ts index b0afa7b..6580ffa 100644 --- a/src/wot-server-action.ts +++ b/src/wot-server-action.ts @@ -1,6 +1,3 @@ -/** @format */ -import ServientManager from './servients/servient-manager' - module.exports = function (RED) { function WoTServerAction(config) { RED.nodes.createNode(this, config) @@ -24,12 +21,12 @@ module.exports = function (RED) { content: { description: config.actionDescription, input: { - type: config.actionInputDataType + type: config.actionInputDataType, }, output: { - type: config.actionOutputDataType - } - } + type: config.actionOutputDataType, + }, + }, } } @@ -50,7 +47,7 @@ module.exports = function (RED) { } RED.nodes.registerType('wot-server-action', WoTServerAction, { credentials: { - inParams_actionName: { type: 'text' } - } + inParams_actionName: { type: 'text' }, + }, }) } diff --git a/src/wot-server-config.html b/src/wot-server-config.html index b3f85fb..1a1dce8 100644 --- a/src/wot-server-config.html +++ b/src/wot-server-config.html @@ -1,10 +1,25 @@ @@ -62,9 +110,12 @@
+
+ + + + +
diff --git a/src/wot-server-config.ts b/src/wot-server-config.ts index 4f43a52..8f03b30 100644 --- a/src/wot-server-config.ts +++ b/src/wot-server-config.ts @@ -1,5 +1,4 @@ -/** @format */ - +import { ExposedThing } from '@node-wot/core' import ServientManager, { ServientWrapper } from './servients/servient-manager' module.exports = function (RED) { @@ -11,9 +10,7 @@ module.exports = function (RED) { node.addUserNode = (n) => { console.log('*** addUserNode', n) - const foundUserNodes = userNodes.filter( - (userNode) => userNode.id === n.id - ) + const foundUserNodes = userNodes.filter((userNode) => userNode.id === n.id) console.log('*** foundUserNodes.length', foundUserNodes.length) if (foundUserNodes.length === 0) { console.log('*** addUserNode executed') @@ -21,10 +18,7 @@ module.exports = function (RED) { } } - async function waitForFinishPrepareRelatedNodes( - userNodes: any[], - userNodeIds: string[] - ) { + async function waitForFinishPrepareRelatedNodes(userNodes: any[], userNodeIds: string[]) { console.log('*** userNodeIds', userNodeIds) console.log('*** userNodes', userNodes) const MAX_CHECK_COUNT = 50 @@ -62,11 +56,7 @@ module.exports = function (RED) { throw new Error('Not enough WoT Nodes settings.') } - async function registerPropertiesProcess( - userNode: any, - thing: any, - props: any - ) { + async function registerPropertiesProcess(userNode: any, thing: ExposedThing, props: any) { thing.setPropertyReadHandler(props.name, () => { console.log('*** call propertyReadHandler') console.log('*** userNodes.length', userNodes.length) @@ -77,9 +67,9 @@ module.exports = function (RED) { } userNode.send([ { - wot: { finish } + _wot: { finish }, }, - null + null, ]) }) }) @@ -101,33 +91,29 @@ module.exports = function (RED) { userNode.send([ null, { - wot: { finish }, - [props.outputAttr]: v - } + _wot: { finish }, + [props.outputAttr]: v, + }, ]) }) }) } } - async function registerActionsProcess( - userNode: any, - thing: any, - props: any - ) { + async function registerActionsProcess(userNode: any, thing: ExposedThing, props: any) { thing.setActionHandler(props.name, async (params) => { const args = await params.value() console.log('*** call actionHandler') console.log('*** actionHandler userNodes.length', userNodes.length) - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { const finish = (payload) => { console.log('*** actionHandler finish', props, payload) resolve(payload) } console.log('*** actionHandler userNode', userNode) userNode.send({ - wot: { finish }, - [props.outputArgs]: args + _wot: { finish }, + [props.outputArgs]: args, }) }) }) @@ -146,7 +132,7 @@ module.exports = function (RED) { console.log('*** props', props) td[props.attrType] = { ...td[props.attrType], - [props.name]: props.content + [props.name]: props.content, } } console.log('*** created td', td) @@ -176,39 +162,32 @@ module.exports = function (RED) { node.bindingType = node.credentials.bindingType console.log('***** thing config', config) console.log('***** thing node', node) - if (node.bindingTypeConstValue && node.bindingTypeType) { - node.bindingType = RED.util.evaluateNodeProperty( - config.bindingTypeConstValue, - config.bindingTypeType, + // if (node.bindingTypeConstValue && node.bindingTypeType) { + // node.bindingType = RED.util.evaluateNodeProperty(config.bindingTypeConstValue, config.bindingTypeType, node) + // } + if (config.bindingConfigConstValue && config.bindingConfigType) { + node.bindingConfig = RED.util.evaluateNodeProperty( + config.bindingConfigConstValue, + config.bindingConfigType, node ) } // Thingの生成 const bindingType = config.bindingType - let type: string, params: any - if (bindingType.indexOf('http-') === 0) { - const port = Number(bindingType.replace('http-', '')) - type = 'http' - params = { port } + const bindingConfig = node.bindingConfig + /*let type: string, params: any + if (bindingType === 'http') { } else if (bindingType === 'coap') { //TODO - } - console.log('*** createServient', node.id, type, params) + }*/ + console.log('*** createServient', node.id, bindingType, bindingConfig) //console.log('*** servientManager', servientManager) - const servientWrapper = servientManager.createServientWrapper( - node.id, - type, - params - ) + if (bindingType !== 'http') return //test + const servientWrapper = servientManager.createServientWrapper(node.id, bindingType, bindingConfig) try { await waitForFinishPrepareRelatedNodes(userNodes, config._users) - await createWoTScriptAndStart( - config.name, - '', - servientWrapper, - userNodes - ) + await createWoTScriptAndStart(config.name, '', servientWrapper, userNodes) } catch (err) { console.error('[error] ' + err) } @@ -220,21 +199,29 @@ module.exports = function (RED) { servientManager.removeServientWrapper(node.id).then(() => { // servient終了 console.log('*** servient ended. config node id: ', config.id) - launchServient().then(() => { - console.log('*** launched 1') - }) + launchServient() + .then(() => { + node.log('[info] success to end and launch thing. name: ' + config.name + ' id: ' + config.id) + }) + .catch((err) => { + node.error('[error] Failed to launch thing. name: ' + config.name + ' id: ' + config.id + ' err:' + err) + }) }) } else { console.log('*** launch servient.') - launchServient().then(() => { - console.log('*** launched 2') - }) + launchServient() + .then(() => { + node.log('[info] success to launch thing. name: ' + config.name + ' id: ' + config.id) + }) + .catch((err) => { + node.error('[error] Failed to launch thing. name: ' + config.name + ' id: ' + config.id + ' err:' + err) + }) } } RED.nodes.registerType('wot-server-config', WoTServerConfig, { credentials: { - bindingType: { type: 'text' } - } + bindingConfig: { type: 'object' }, + }, }) } diff --git a/src/wot-server-end.ts b/src/wot-server-end.ts index b0e4659..209e486 100644 --- a/src/wot-server-end.ts +++ b/src/wot-server-end.ts @@ -1,5 +1,3 @@ -/** @format */ - module.exports = function (RED) { function WoTServerEnd(config) { RED.nodes.createNode(this, config) @@ -10,10 +8,7 @@ module.exports = function (RED) { console.log('*** wot-server-end input msg', msg) // 入力パラメータを取得 node.inParams_returnValue = node.credentials.inParams_returnValue - if ( - config.inParams_returnValueConstValue && - config.inParams_returnValueType - ) { + if (config.inParams_returnValueConstValue && config.inParams_returnValueType) { node.inParams_returnValue = RED.util.evaluateNodeProperty( config.inParams_returnValueConstValue, config.inParams_returnValueType, @@ -22,7 +17,7 @@ module.exports = function (RED) { ) } console.log('node.inParams_returnValue:', node.inParams_returnValue) - msg.wot?.finish(node.inParams_returnValue) + msg._wot?.finish(node.inParams_returnValue) done() }) // closeイベント @@ -38,8 +33,8 @@ module.exports = function (RED) { } RED.nodes.registerType('wot-server-end', WoTServerEnd, { credentials: { - inParams_propertyName: { type: 'text' } - } + inParams_propertyName: { type: 'text' }, + }, }) const setOutput = (type, valueName, msg, context, value) => { diff --git a/src/wot-server-event.ts b/src/wot-server-event.ts index 4aad7b3..cc61654 100644 --- a/src/wot-server-event.ts +++ b/src/wot-server-event.ts @@ -1,4 +1,3 @@ -/** @format */ import ServientManager from './servients/servient-manager' module.exports = function (RED) { @@ -23,8 +22,8 @@ module.exports = function (RED) { outputAttr: config.inParams_eventValueConstValue, content: { description: config.eventDescription, - data: { type: config.eventDataType } - } + data: { type: config.eventDataType }, + }, } } @@ -36,10 +35,7 @@ module.exports = function (RED) { // 入力パラメータを取得 node.inParams_eventValue = node.credentials.inParams_eventValue - if ( - config.inParams_eventValueConstValue && - config.inParams_eventValueType - ) { + if (config.inParams_eventValueConstValue && config.inParams_eventValueType) { node.inParams_eventValue = RED.util.evaluateNodeProperty( config.inParams_eventValueConstValue, config.inParams_eventValueType, @@ -69,8 +65,8 @@ module.exports = function (RED) { } RED.nodes.registerType('wot-server-event', WoTServerEvent, { credentials: { - inParams_propertyName: { type: 'text' } - } + inParams_propertyName: { type: 'text' }, + }, }) const setOutput = (type, valueName, msg, context, value) => { diff --git a/src/wot-server-property.html b/src/wot-server-property.html index 1ddef0d..a85bf03 100644 --- a/src/wot-server-property.html +++ b/src/wot-server-property.html @@ -113,7 +113,6 @@ } } })(); - diff --git a/src/wot-server-property.ts b/src/wot-server-property.ts index 86d99ad..2c68e2a 100644 --- a/src/wot-server-property.ts +++ b/src/wot-server-property.ts @@ -1,4 +1,3 @@ -/** @format */ import ServientManager from './servients/servient-manager' module.exports = function (RED) { @@ -25,8 +24,8 @@ module.exports = function (RED) { description: config.propertyDescription, type: config.propertyDataType, readOnly: config.propertyReadOnlyFlag, - observable: config.propertyObservableFlag - } + observable: config.propertyObservableFlag, + }, } } @@ -36,13 +35,8 @@ module.exports = function (RED) { const woTServerConfig = RED.nodes.getNode(config.woTServerConfig) console.log('*** servientWrapper', woTServerConfig.servientWrapper) - console.log( - '*** woTServerConfig.emitPropertyChange:', - config.propertyName - ) - await ServientManager.getInstance() - .getThing(woTServerConfig.id) - .emitPropertyChange(config.propertyName) + console.log('*** woTServerConfig.emitPropertyChange:', config.propertyName) + await ServientManager.getInstance().getThing(woTServerConfig.id).emitPropertyChange(config.propertyName) console.log('*** emitPropertyChange finished', config.propertyName) // 変更されたプロパティ値を入力された場合は出力なし @@ -61,8 +55,8 @@ module.exports = function (RED) { } RED.nodes.registerType('wot-server-property', WoTServerProperty, { credentials: { - inParams_propertyName: { type: 'text' } - } + inParams_propertyName: { type: 'text' }, + }, }) const setOutput = (type, valueName, msg, context, value) => { diff --git a/src/wot-thing.js b/src/wot-thing.js index 8d785ab..edca209 100644 --- a/src/wot-thing.js +++ b/src/wot-thing.js @@ -1,55 +1,54 @@ -"use strict" -const Servient = require("@node-wot/core").Servient; -const HttpClientFactory = require("@node-wot/binding-http").HttpClientFactory; -const HttpsClientFactory = require("@node-wot/binding-http").HttpsClientFactory; -const WSClientFactory = require("@node-wot/binding-websockets").WebSocketClientFactory; -const CoapClientFactory = require("@node-wot/binding-coap").CoapClientFactory; -const CoapsClientFactory = require("@node-wot/binding-coap").CoapsClientFactory; -const MqttClientFactory = require("@node-wot/binding-mqtt").MqttClientFactory; -const OpcuaClientFactory = require("@node-wot/binding-opcua").OpcuaClientFactory; -const ModbusClientFactory = require("@node-wot/binding-modbus").ModbusClientFactory; +'use strict' +const Servient = require('@node-wot/core').Servient +const HttpClientFactory = require('@node-wot/binding-http').HttpClientFactory +const HttpsClientFactory = require('@node-wot/binding-http').HttpsClientFactory +const WSClientFactory = require('@node-wot/binding-websockets').WebSocketClientFactory +const CoapClientFactory = require('@node-wot/binding-coap').CoapClientFactory +const CoapsClientFactory = require('@node-wot/binding-coap').CoapsClientFactory +const MqttClientFactory = require('@node-wot/binding-mqtt').MqttClientFactory +const OpcuaClientFactory = require('@node-wot/binding-opcua').OpcuaClientFactory +const ModbusClientFactory = require('@node-wot/binding-modbus').ModbusClientFactory +module.exports = function (RED) { + function consumedThingNode(config) { + RED.nodes.createNode(this, config) -module.exports = function(RED) { - function consumedThingNode(config) { - RED.nodes.createNode(this, config); + this.tdLink = config.tdLink + this.td = JSON.parse(config.td) - this.tdLink = config.tdLink; - this.td = JSON.parse(config.td); + this.consumedThing = new Promise((resolve, reject) => { + let servient = new Servient() - this.consumedThing = new Promise((resolve, reject) => { - let servient = new Servient(); + if (config.basicAuth) { + servient.addCredentials({ [this.td.id]: { username: config.username.trim(), password: config.password } }) + } - if (config.basicAuth) { - servient.addCredentials({[this.td.id]: {username: config.username.trim(), password: config.password}}); - } + if (config.http) { + servient.addClientFactory(new HttpClientFactory()) + servient.addClientFactory(new HttpsClientFactory()) + } + if (config.ws) { + servient.addClientFactory(new WSClientFactory()) + } + if (config.coap) { + servient.addClientFactory(new CoapClientFactory()) + servient.addClientFactory(new CoapsClientFactory()) + } + if (config.mqtt) { + servient.addClientFactory(new MqttClientFactory()) + } + if (config.opcua) { + servient.addClientFactory(new OpcuaClientFactory()) + } + if (config.modbus) { + servient.addClientFactory(new ModbusClientFactory()) + } - if (config.http) { - servient.addClientFactory(new HttpClientFactory()); - servient.addClientFactory(new HttpsClientFactory()); - } - if (config.ws) { - servient.addClientFactory(new WSClientFactory); - } - if (config.coap) { - servient.addClientFactory(new CoapClientFactory()); - servient.addClientFactory(new CoapsClientFactory()); - } - if (config.mqtt) { - servient.addClientFactory(new MqttClientFactory()); - } - if (config.opcua) { - servient.addClientFactory(new OpcuaClientFactory()); - } - if (config.modbus) { - servient.addClientFactory(new ModbusClientFactory()); - } - - servient.start().then((thingFactory) => { - let consumedThing = thingFactory.consume(this.td); - resolve(consumedThing); - }) - }) - } - RED.nodes.registerType("consumed-thing",consumedThingNode); + servient.start().then((thingFactory) => { + let consumedThing = thingFactory.consume(this.td) + resolve(consumedThing) + }) + }) + } + RED.nodes.registerType('consumed-thing', consumedThingNode) } From 55f8612a7cb3ddb3d5443cad642041fe262f64a7 Mon Sep 17 00:00:00 2001 From: hidetak Date: Fri, 19 Jan 2024 02:13:22 +0900 Subject: [PATCH 07/23] remove unnecessary comment outs and modified showing status feature --- src/servients/http-servient-wrapper.ts | 155 +------------------------ src/servients/servient-manager.ts | 5 - src/wot-server-action.ts | 21 +++- src/wot-server-config.ts | 17 ++- src/wot-server-end.html | 1 - src/wot-server-event.ts | 21 +++- src/wot-server-property.ts | 23 ++-- 7 files changed, 58 insertions(+), 185 deletions(-) diff --git a/src/servients/http-servient-wrapper.ts b/src/servients/http-servient-wrapper.ts index 5472878..e99140c 100644 --- a/src/servients/http-servient-wrapper.ts +++ b/src/servients/http-servient-wrapper.ts @@ -12,22 +12,17 @@ * https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document. * * SPDX-License-Identifier: EPL-2.0 OR W3C-20150513 - * ****************************************************************************** - * - * @format - */ + * ******************************************************************************/ import { Servient } from '@node-wot/core' import { HttpServer } from '@node-wot/binding-http' -import ServientManager, { ServientWrapper } from './servient-manager' +import { ServientWrapper } from './servient-manager' export default class HttpServientWrapper implements ServientWrapper { private servient - private userNodes = [] private started = false private server private thing - private nodeId public constructor(id: string, params: any) { console.log('***** servient constructor called', params) // create Servient add HTTP binding with port configuration @@ -36,19 +31,8 @@ export default class HttpServientWrapper implements ServientWrapper { port: params.port, // (default 8080) }) this.servient.addServer(this.server) - this.nodeId = id } - // public addUserNode(node) { - // console.log('*** addUserNode', node) - // const foundUserNodes = this.userNodes.filter( - // (userNode) => userNode.id === node.id - // ) - // console.log('*** foundUserNodes.length', foundUserNodes.length) - // if (foundUserNodes.length === 0) { - // console.log('*** addUserNode executed') - // this.userNodes.push(node) - // } - // } + public isRunning() { return this.started } @@ -65,133 +49,6 @@ export default class HttpServientWrapper implements ServientWrapper { console.log('*** exposed') } - // public async startServient( - // title: string, - // description: string, - // userNodeIds: string[] - // ) { - // console.log('*** started', this.started) - // if (this.started === true) { - // // 起動状態であればservientを終わらせてfalseを返す - // return false - // } - // console.log('*** userNodeIds', userNodeIds) - // console.log('*** userNodes', this.userNodes) - // // 全てのユーザノードがそろっているか確認 - // for (const id of userNodeIds) { - // let foundFlg = false - // for (const node of this.userNodes) { - // if (node.id === id) { - // foundFlg = true - // } - // } - // if (!foundFlg) { - // // ユーザノードに一致するノードが存在していなければfalseを返す - // console.log('*** foundFlg', foundFlg) - // return false - // } - // } - // // TDを作成 - // let td = { title, description } - // for (const userNode of this.userNodes) { - // const props = userNode.getProps() - // console.log('*** props', props) - // td[props.attrType] = { - // ...td[props.attrType], - // [props.name]: props.content - // } - // } - // console.log('*** created td', td) - // const wot = await this.servient.start() - // this.thing = await wot.produce(td) - // console.log('*** thing', this.thing) - // // 処理を行うために対応するノードにメッセージ送信 - // for (const userNode of this.userNodes) { - // const props = userNode.getProps() - // console.log('*** props', props) - // if (props.attrType === 'properties') { - // this.thing.setPropertyReadHandler(props.name, () => { - // console.log('*** call propertyReadHandler') - // console.log('*** userNodes.length', this.userNodes.length) - // return new Promise((resolve, reject) => { - // const finish = (payload) => { - // console.log('*** finish', payload) - // resolve(payload) - // } - // userNode.send([ - // { - // wot: { finish } - // }, - // null - // ]) - // }) - // }) - // if (!props.content.readOnly) { - // this.thing.setPropertyWriteHandler(props.name, async (value: any) => { - // const v = await value.value() - // console.log('*** call propertyWriteHandler', v) - // console.log('*** userNodes.length', this.userNodes.length) - // return new Promise((resolve, reject) => { - // const finish = (payload) => { - // console.log('*** finish', props) - // if (props.content.observable) { - // console.log('*** emitPropertyChange', props.name) - // this.thing.emitPropertyChange(props.name) - // } - // resolve() - // } - // console.log('*** userNode', userNode) - // userNode.send([ - // null, - // { - // wot: { finish }, - // [props.outputAttr]: v - // } - // ]) - // }) - // }) - // } - // } else if (props.attrType === 'actions') { - // //TODO: implements - // } else if (props.attrType === 'events') { - // //TODO: implements - // } - // } - // //TODO: このThingを、このConfigノードに関連するノードに渡して処理を追加する - // // 以下ダミー - - // /* - // // init property value - // let count = 0 - - // console.log('Produced ' + thing.getThingDescription().title) - - // // set property handlers (using async-await) - // thing.setPropertyReadHandler('count', async () => count) - // thing.setPropertyWriteHandler('count', async (intOutput) => { - // const value = await intOutput.value() - // if (typeof value === 'number') { - // count = value - // } - // }) - // thing.setPropertyReadHandler('count2', async () => count + 1) - // thing.setPropertyWriteHandler('count2', async (intOutput) => { - // const value = await intOutput.value() - // if (typeof value === 'number') { - // count = value - // } - // }) - - // await thing.expose() - // console.info(thing.getThingDescription().title + ' ready') - // console.info('TD : ' + JSON.stringify(thing.getThingDescription())) - // */ - // await this.thing.expose() - // this.started = true - // console.log('*** servient started') - // return true - // } - public getThing() { return this.thing } @@ -207,13 +64,9 @@ export default class HttpServientWrapper implements ServientWrapper { } } - // プロパティ変更を通知 - // public async emitPropertyChange(propertyName: string) { - // await this.thing.emitPropertyChange(propertyName) - // } - // 新規に作成するConfigノードが競合するか調べる public isConflict(): boolean { + //TODO: 実装 return false throw new Error('Method not implemented.') } diff --git a/src/servients/servient-manager.ts b/src/servients/servient-manager.ts index d306d43..67669ed 100644 --- a/src/servients/servient-manager.ts +++ b/src/servients/servient-manager.ts @@ -41,11 +41,6 @@ export default class ServientManager { } return false } - // public getServientWrapper(id: string): ServientWrapper { - // console.log('*** getServientWrapper', id) - // console.log('*** this.servientWrappers', this.servientWrappers) - // return this.servientWrappers[id] - // } private canCreateServient(type: string, params: any) { console.log('*** canCreateServient this.servientWrappers', this.servientWrappers) for (const id in this.servientWrappers) { diff --git a/src/wot-server-action.ts b/src/wot-server-action.ts index 6580ffa..943a73b 100644 --- a/src/wot-server-action.ts +++ b/src/wot-server-action.ts @@ -5,12 +5,6 @@ module.exports = function (RED) { this.status({ fill: 'red', shape: 'dot', text: 'not prepared' }) console.log('*** this', this) console.log('*** config', config) - const woTServerConfig = RED.nodes.getNode(config.woTServerConfig) //test - //console.log('*** RED', RED) - //console.log('*** RED.nodes', RED.nodes) - woTServerConfig.addUserNode(node) - console.log('*** addUserNode finished.', node.id) - this.status({ fill: 'green', shape: 'dot', text: 'running' }) // WoTServerConfigノードからアクションの定義を取得する際に呼び出す node.getProps = () => { @@ -30,6 +24,15 @@ module.exports = function (RED) { } } + // statusを変更 + node.setServientStatus = (running: boolean) => { + if (running) { + node.status({ fill: 'green', shape: 'dot', text: 'running' }) + } else { + node.status({ fill: 'red', shape: 'dot', text: 'not prepared' }) + } + } + // inputイベント(インプットなし) /*node.on('input', async (msg, send, done) => { done() @@ -44,6 +47,12 @@ module.exports = function (RED) { // 処理終了通知 done() }) + + const woTServerConfig = RED.nodes.getNode(config.woTServerConfig) //test + //console.log('*** RED', RED) + //console.log('*** RED.nodes', RED.nodes) + woTServerConfig.addUserNode(node) + console.log('*** addUserNode finished.', node.id) } RED.nodes.registerType('wot-server-action', WoTServerAction, { credentials: { diff --git a/src/wot-server-config.ts b/src/wot-server-config.ts index 8f03b30..e60704c 100644 --- a/src/wot-server-config.ts +++ b/src/wot-server-config.ts @@ -7,9 +7,11 @@ module.exports = function (RED) { const node = this const userNodes = [] const servientManager = ServientManager.getInstance() + node.running = false node.addUserNode = (n) => { console.log('*** addUserNode', n) + n.setServientStatus(node.running) const foundUserNodes = userNodes.filter((userNode) => userNode.id === n.id) console.log('*** foundUserNodes.length', foundUserNodes.length) if (foundUserNodes.length === 0) { @@ -162,9 +164,6 @@ module.exports = function (RED) { node.bindingType = node.credentials.bindingType console.log('***** thing config', config) console.log('***** thing node', node) - // if (node.bindingTypeConstValue && node.bindingTypeType) { - // node.bindingType = RED.util.evaluateNodeProperty(config.bindingTypeConstValue, config.bindingTypeType, node) - // } if (config.bindingConfigConstValue && config.bindingConfigType) { node.bindingConfig = RED.util.evaluateNodeProperty( config.bindingConfigConstValue, @@ -176,11 +175,6 @@ module.exports = function (RED) { // Thingの生成 const bindingType = config.bindingType const bindingConfig = node.bindingConfig - /*let type: string, params: any - if (bindingType === 'http') { - } else if (bindingType === 'coap') { - //TODO - }*/ console.log('*** createServient', node.id, bindingType, bindingConfig) //console.log('*** servientManager', servientManager) if (bindingType !== 'http') return //test @@ -188,8 +182,13 @@ module.exports = function (RED) { try { await waitForFinishPrepareRelatedNodes(userNodes, config._users) await createWoTScriptAndStart(config.name, '', servientWrapper, userNodes) + node.running = true + userNodes.forEach((n) => { + n.setServientStatus(node.running) + }) } catch (err) { - console.error('[error] ' + err) + //console.error('[error] ' + err) + throw err } } diff --git a/src/wot-server-end.html b/src/wot-server-end.html index 5ac7264..657bdda 100644 --- a/src/wot-server-end.html +++ b/src/wot-server-end.html @@ -1,6 +1,5 @@ diff --git a/src/locales/en-US/wot-thing-config.json b/src/locales/en-US/wot-thing-config.json new file mode 100644 index 0000000..0a6bc50 --- /dev/null +++ b/src/locales/en-US/wot-thing-config.json @@ -0,0 +1,11 @@ +{ + "editor": { + "nameLabel": "Name", + "configLabel": "thing config", + "bindingType":{ + "label":"binding", + "description":"binding type description.", + "placeholder":"binding type" + } + } +} diff --git a/src/locales/ja/wot-server-action.json b/src/locales/ja/wot-server-action.json index 8258bff..50c8028 100644 --- a/src/locales/ja/wot-server-action.json +++ b/src/locales/ja/wot-server-action.json @@ -1,19 +1,20 @@ { - "editor": { - "nameLabel": "名前", - "actionNameLabel": "アクション名", - "actionInputDataTypeLabel": "引数のデータ型", - "actionOutputDataTypeLabel": "戻り値のデータ型", - "configLabel": "Thing設定", - "paletteLabel": "Server-Action", - "outParams1": { - "tabLabel":"アクション呼び出し", - "outputLabel":"アクションの引数", - "actionArgs":{ - "label":"引数の格納先", - "description":"アクションの引数の格納先。", - "placeholder":"引数の格納先" - } - } + "editor": { + "nameLabel": "名前", + "actionNameLabel": "アクション名", + "actionInputDataTypeLabel": "引数のデータ型", + "actionOutputDataTypeLabel": "戻り値のデータ型", + "serverConfigLabel": "サーバ設定", + "thingConfigLabel": "Thing設定", + "paletteLabel": "Server-Action", + "outParams1": { + "tabLabel": "アクション呼び出し", + "outputLabel": "アクションの引数", + "actionArgs": { + "label": "引数の格納先", + "description": "アクションの引数の格納先。", + "placeholder": "引数の格納先" + } } -} \ No newline at end of file + } +} diff --git a/src/locales/ja/wot-server-config.json b/src/locales/ja/wot-server-config.json index 19c1fda..a311354 100644 --- a/src/locales/ja/wot-server-config.json +++ b/src/locales/ja/wot-server-config.json @@ -1,9 +1,9 @@ { - "editor": { - "nameLabel": "Thing名", - "bindingTypeLabel": "Binding種別", - "bindingConfigLabel": "Binding設定", - "bindingConfigPlaceholder": "Binding設定", - "configLabel": "Thing設定" - } + "editor": { + "nameLabel": "サーバ名", + "bindingTypeLabel": "Binding種別", + "bindingConfigLabel": "Binding設定", + "bindingConfigPlaceholder": "Binding設定", + "configLabel": "サーバ設定" + } } diff --git a/src/locales/ja/wot-server-event.json b/src/locales/ja/wot-server-event.json index d4a8024..e9522dd 100644 --- a/src/locales/ja/wot-server-event.json +++ b/src/locales/ja/wot-server-event.json @@ -1,17 +1,18 @@ { - "editor": { - "nameLabel": "名前", - "eventNameLabel": "イベント名", - "eventDataTypeLabel": "データ型", - "configLabel": "Thing設定", - "paletteLabel": "Server-Event", - "inParams": { - "tabLabel":"イベントの入力", - "eventValue":{ - "label":"イベント値", - "description":"イベント値。", - "placeholder":"イベント値" - } - } + "editor": { + "nameLabel": "名前", + "eventNameLabel": "イベント名", + "eventDataTypeLabel": "データ型", + "serverConfigLabel": "サーバ設定", + "thingConfigLabel": "Thing設定", + "paletteLabel": "Server-Event", + "inParams": { + "tabLabel": "イベントの入力", + "eventValue": { + "label": "イベント値", + "description": "イベント値。", + "placeholder": "イベント値" + } } -} \ No newline at end of file + } +} diff --git a/src/locales/ja/wot-server-property.json b/src/locales/ja/wot-server-property.json index f00a6b9..41e7b4b 100644 --- a/src/locales/ja/wot-server-property.json +++ b/src/locales/ja/wot-server-property.json @@ -1,23 +1,24 @@ { - "editor": { - "nameLabel": "名前", - "propertyNameLabel": "プロパティ名", - "propertyDataTypeLabel": "データ型", - "propertyReadOnlyFlagLabel": "読み込みのみ", - "propertyObservableFlagLabel": "観測可能", - "configLabel": "Thing設定", - "paletteLabel": "Server-Property", - "outParams1": { - "outputLabel":"読み込み要求" - }, - "outParams2": { - "tabLabel":"書き込み要求", - "outputLabel":"書き込み要求", - "writingValue":{ - "label":"書き込む値の格納元", - "description":"プロパティに書き込む値の格納元。", - "placeholder":"プロパティに書き込む値の格納元" - } - } + "editor": { + "nameLabel": "名前", + "propertyNameLabel": "プロパティ名", + "propertyDataTypeLabel": "データ型", + "propertyReadOnlyFlagLabel": "読み込みのみ", + "propertyObservableFlagLabel": "観測可能", + "serverConfigLabel": "サーバ設定", + "thingConfigLabel": "Thing設定", + "paletteLabel": "Server-Property", + "outParams1": { + "outputLabel": "読み込み要求" + }, + "outParams2": { + "tabLabel": "書き込み要求", + "outputLabel": "書き込み要求", + "writingValue": { + "label": "書き込む値の格納元", + "description": "プロパティに書き込む値の格納元。", + "placeholder": "プロパティに書き込む値の格納元" + } } -} \ No newline at end of file + } +} diff --git a/src/locales/ja/wot-thing-config.html b/src/locales/ja/wot-thing-config.html new file mode 100644 index 0000000..004eab5 --- /dev/null +++ b/src/locales/ja/wot-thing-config.html @@ -0,0 +1,19 @@ + diff --git a/src/locales/ja/wot-thing-config.json b/src/locales/ja/wot-thing-config.json new file mode 100644 index 0000000..807f9c9 --- /dev/null +++ b/src/locales/ja/wot-thing-config.json @@ -0,0 +1,9 @@ +{ + "editor": { + "nameLabel": "Thing名", + "bindingTypeLabel": "Binding種別", + "bindingConfigLabel": "Binding設定", + "bindingConfigPlaceholder": "Binding設定", + "configLabel": "Thing設定" + } +} diff --git a/src/servients/servient-manager.ts b/src/servients/servient-manager.ts index 67669ed..453b167 100644 --- a/src/servients/servient-manager.ts +++ b/src/servients/servient-manager.ts @@ -1,14 +1,4 @@ -import HttpServientWrapper from './http-servient-wrapper' - -// servient type -export interface ServientWrapper { - // Servientを作成できるか確認する - isConflict(type: string, params: any): boolean - createThing(td: any): Promise - exposeThing(): Promise - getThing(): any - endServient(): Promise -} +import ServientWrapper from './servient-wrapper' // servientのインスタンスを管理する export default class ServientManager { @@ -25,14 +15,7 @@ export default class ServientManager { } public createServientWrapper(id: string, bindingType: string, params: any): ServientWrapper { console.log('*** createServientWrapper', id, bindingType, params) - if (!this.canCreateServient(bindingType, params)) { - throw new Error(`servient wrapper conflicted. type: ${bindingType} params: ${JSON.stringify(params)}`) - } - if (bindingType === 'http') { - this.servientWrappers[id] = new HttpServientWrapper(id, params) - } else if (bindingType === 'coap') { - //TODO - } + this.servientWrappers[id] = new ServientWrapper(bindingType, params) return this.servientWrappers[id] } public existServienetWrapper(id: string) { @@ -41,15 +24,6 @@ export default class ServientManager { } return false } - private canCreateServient(type: string, params: any) { - console.log('*** canCreateServient this.servientWrappers', this.servientWrappers) - for (const id in this.servientWrappers) { - if (this.servientWrappers[id].isConflict(type, params)) { - return false - } - } - return true - } public async removeServientWrapper(id: string) { console.log('*** removeServientWrapper') this.endServient(id) @@ -73,8 +47,8 @@ export default class ServientManager { }) } - public getThing(id: string) { + public getThing(id: string, thingName: string) { const servientWrapper = this.servientWrappers[id] - return servientWrapper?.getThing() + return servientWrapper?.getThing(thingName) } } diff --git a/src/servients/http-servient-wrapper.ts b/src/servients/servient-wrapper.ts similarity index 60% rename from src/servients/http-servient-wrapper.ts rename to src/servients/servient-wrapper.ts index e99140c..2ca3fc7 100644 --- a/src/servients/http-servient-wrapper.ts +++ b/src/servients/servient-wrapper.ts @@ -14,22 +14,24 @@ * SPDX-License-Identifier: EPL-2.0 OR W3C-20150513 * ******************************************************************************/ -import { Servient } from '@node-wot/core' +import { ExposedThing, Servient } from '@node-wot/core' import { HttpServer } from '@node-wot/binding-http' -import { ServientWrapper } from './servient-manager' -export default class HttpServientWrapper implements ServientWrapper { +export default class ServientWrapper { private servient + private wot private started = false private server - private thing - public constructor(id: string, params: any) { + private things: { [key: string]: ExposedThing } = {} + public constructor(bindingType: string, params: any) { console.log('***** servient constructor called', params) // create Servient add HTTP binding with port configuration this.servient = new Servient() - this.server = new HttpServer({ - port: params.port, // (default 8080) - }) + if (bindingType === 'http') { + this.server = new HttpServer(params) + } else if (bindingType === 'coap') { + //TODO + } this.servient.addServer(this.server) } @@ -37,37 +39,38 @@ export default class HttpServientWrapper implements ServientWrapper { return this.started } - public async createThing(td) { - const wot = await this.servient.start() - this.thing = await wot.produce(td) - return this.thing + public async startServient() { + this.wot = await this.servient.start() + console.log('*** wot in startServient', this.wot) + } + + public async createThing(td, thingName: string) { + console.log('*** wot in createThing', this.wot) + const thing = await this.wot.produce(td) + this.things[thingName] = thing + return thing } - public async exposeThing() { - await this.thing.expose() + public async exposeThing(thing: ExposedThing) { + await thing.expose() this.started = true console.log('*** exposed') } - public getThing() { - return this.thing + public getThing(thingName: string) { + return this.things[thingName] } public async endServient() { - if (this.server && this.thing) { + if (this.server) { console.log('*** call server.destroy') - await this.server.destroy(this.thing.id) + for (const key in this.things) { + await this.server.destroy(this.things[key].id) + } console.log('*** call server.stop') await this.server.stop() console.log('*** call servient.shutdown') await this.servient.shutdown() } } - - // 新規に作成するConfigノードが競合するか調べる - public isConflict(): boolean { - //TODO: 実装 - return false - throw new Error('Method not implemented.') - } } diff --git a/src/wot-server-action.html b/src/wot-server-action.html index af0ad47..cb8441f 100644 --- a/src/wot-server-action.html +++ b/src/wot-server-action.html @@ -18,6 +18,10 @@ woTServerConfig: { type: "wot-server-config", required: true + }, + woTThingConfig: { + type: "wot-thing-config", + required: true } }, credentials: { @@ -124,8 +128,12 @@
- - + + +
+
+ +
diff --git a/src/wot-server-action.ts b/src/wot-server-action.ts index 943a73b..3cb4c3e 100644 --- a/src/wot-server-action.ts +++ b/src/wot-server-action.ts @@ -33,6 +33,12 @@ module.exports = function (RED) { } } + // thing名の取得 + node.getThingName = () => { + const woTThingConfig = RED.nodes.getNode(config.woTThingConfig) + return woTThingConfig.getThingName() + } + // inputイベント(インプットなし) /*node.on('input', async (msg, send, done) => { done() diff --git a/src/wot-server-config.html b/src/wot-server-config.html index 1a1dce8..e5e724b 100644 --- a/src/wot-server-config.html +++ b/src/wot-server-config.html @@ -13,7 +13,7 @@ RED.nodes.registerType('wot-server-config', { category: 'config', defaults: { - name: { value: 'thing-name' }, + name: { value: 'server-name' }, bindingType: {value:'http'}, bindingConfigType: {value:'json'}, bindingConfigConstValue: {value:'{}'}, diff --git a/src/wot-server-config.ts b/src/wot-server-config.ts index e60704c..ed51396 100644 --- a/src/wot-server-config.ts +++ b/src/wot-server-config.ts @@ -1,5 +1,6 @@ import { ExposedThing } from '@node-wot/core' -import ServientManager, { ServientWrapper } from './servients/servient-manager' +import ServientManager from './servients/servient-manager' +import ServientWrapper from './servients/servient-wrapper' module.exports = function (RED) { function WoTServerConfig(config) { @@ -121,7 +122,7 @@ module.exports = function (RED) { }) } - async function createWoTScriptAndStart( + async function createWoTScriptAndExpose( title: string, description: string, servientWrapper: ServientWrapper, @@ -129,6 +130,7 @@ module.exports = function (RED) { ) { // TDを作成 let td = { title, description } + let thingName for (const userNode of userNodes) { const props = userNode.getProps() console.log('*** props', props) @@ -136,9 +138,11 @@ module.exports = function (RED) { ...td[props.attrType], [props.name]: props.content, } + thingName = userNode.getThingName() } + console.log('*** thingNamae', thingName) console.log('*** created td', td) - const thing = await servientWrapper.createThing(td) + const thing = await servientWrapper.createThing(td, thingName) console.log('*** thing', thing) // 処理を行うために対応するノードにメッセージ送信 for (const userNode of userNodes) { @@ -156,7 +160,7 @@ module.exports = function (RED) { // Nothing to do } } - await servientWrapper.exposeThing() + await servientWrapper.exposeThing(thing) console.log('*** servient started') } @@ -181,7 +185,22 @@ module.exports = function (RED) { const servientWrapper = servientManager.createServientWrapper(node.id, bindingType, bindingConfig) try { await waitForFinishPrepareRelatedNodes(userNodes, config._users) - await createWoTScriptAndStart(config.name, '', servientWrapper, userNodes) + // servientの起動 + await servientWrapper.startServient() + // ThingNameの一覧を作成 + const thingNamesObj = {} + console.log('*** userNodes', userNodes) + for (const userNode of userNodes) { + console.log('*** userNode.getThingName', userNode.getThingName()) + thingNamesObj[userNode.getThingName()] = true + } + const thingNames = Object.keys(thingNamesObj) + console.log('*** thingNames', thingNames) + // Thing名毎にThingの生成とExposeを実施 + for (const thingName of thingNames) { + const targetNodes = userNodes.filter((n) => n.getThingName() === thingName) + await createWoTScriptAndExpose(thingName, '', servientWrapper, targetNodes) + } node.running = true userNodes.forEach((n) => { n.setServientStatus(node.running) diff --git a/src/wot-server-event.html b/src/wot-server-event.html index ce6850f..7c2e5ea 100644 --- a/src/wot-server-event.html +++ b/src/wot-server-event.html @@ -17,6 +17,10 @@ woTServerConfig: { type: "wot-server-config", required: true + }, + woTThingConfig: { + type: "wot-thing-config", + required: true } }, credentials: { @@ -118,8 +122,12 @@
- - + + +
+
+ +
diff --git a/src/wot-server-event.ts b/src/wot-server-event.ts index e9a1c0a..4be9a67 100644 --- a/src/wot-server-event.ts +++ b/src/wot-server-event.ts @@ -30,6 +30,12 @@ module.exports = function (RED) { } } + // thing名の取得 + node.getThingName = () => { + const woTThingConfig = RED.nodes.getNode(config.woTThingConfig) + return woTThingConfig.getThingName() + } + // inputイベント node.on('input', async (msg, send, done) => { // configノードを取得 @@ -48,7 +54,7 @@ module.exports = function (RED) { } console.log('node.inParams_eventValue:', node.inParams_eventValue) await ServientManager.getInstance() - .getThing(woTServerConfig.id) + .getThing(woTServerConfig.id, node.getThingName()) .emitEvent(config.eventName, node.inParams_eventValue) console.log('*** emitEvent finished') diff --git a/src/wot-server-property.html b/src/wot-server-property.html index a85bf03..1390387 100644 --- a/src/wot-server-property.html +++ b/src/wot-server-property.html @@ -19,6 +19,10 @@ woTServerConfig: { type: "wot-server-config", required: true + }, + woTThingConfig: { + type: "wot-thing-config", + required: true } }, credentials: { @@ -124,8 +128,12 @@
- - + + +
+
+ +
diff --git a/src/wot-server-property.ts b/src/wot-server-property.ts index 7cc4946..af030d0 100644 --- a/src/wot-server-property.ts +++ b/src/wot-server-property.ts @@ -32,6 +32,12 @@ module.exports = function (RED) { } } + // thing名の取得 + node.getThingName = () => { + const woTThingConfig = RED.nodes.getNode(config.woTThingConfig) + return woTThingConfig.getThingName() + } + // inputイベント node.on('input', async (msg, send, done) => { // configノードを取得 @@ -39,7 +45,9 @@ module.exports = function (RED) { console.log('*** servientWrapper', woTServerConfig.servientWrapper) console.log('*** woTServerConfig.emitPropertyChange:', config.propertyName) - await ServientManager.getInstance().getThing(woTServerConfig.id).emitPropertyChange(config.propertyName) + await ServientManager.getInstance() + .getThing(woTServerConfig.id, node.getThingName()) + .emitPropertyChange(config.propertyName) console.log('*** emitPropertyChange finished', config.propertyName) // 変更されたプロパティ値を入力された場合は出力なし diff --git a/src/wot-thing-config.html b/src/wot-thing-config.html new file mode 100644 index 0000000..84b668e --- /dev/null +++ b/src/wot-thing-config.html @@ -0,0 +1,64 @@ + + + diff --git a/src/wot-thing-config.ts b/src/wot-thing-config.ts new file mode 100644 index 0000000..49d239c --- /dev/null +++ b/src/wot-thing-config.ts @@ -0,0 +1,13 @@ +module.exports = function (RED) { + function WoTThingConfig(config) { + RED.nodes.createNode(this, config) + const node = this + node.getThingName = () => { + return config.name + } + } + + RED.nodes.registerType('wot-thing-config', WoTThingConfig, { + credentials: {}, + }) +} From 4162ba08c3cb84e4351fcb99bb61b0edec681d97 Mon Sep 17 00:00:00 2001 From: hidetak Date: Sun, 21 Jan 2024 05:25:33 +0900 Subject: [PATCH 09/23] add fearute of getting thing descriptions from global context --- src/servients/servient-wrapper.ts | 4 +++- src/wot-server-config.ts | 10 +++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/servients/servient-wrapper.ts b/src/servients/servient-wrapper.ts index 2ca3fc7..b4dd192 100644 --- a/src/servients/servient-wrapper.ts +++ b/src/servients/servient-wrapper.ts @@ -54,7 +54,9 @@ export default class ServientWrapper { public async exposeThing(thing: ExposedThing) { await thing.expose() this.started = true - console.log('*** exposed') + const td = thing.getThingDescription() + console.log('*** exposed', td) + return td } public getThing(thingName: string) { diff --git a/src/wot-server-config.ts b/src/wot-server-config.ts index ed51396..f848216 100644 --- a/src/wot-server-config.ts +++ b/src/wot-server-config.ts @@ -9,6 +9,7 @@ module.exports = function (RED) { const userNodes = [] const servientManager = ServientManager.getInstance() node.running = false + node.thingDescriptions = {} node.addUserNode = (n) => { console.log('*** addUserNode', n) @@ -160,7 +161,10 @@ module.exports = function (RED) { // Nothing to do } } - await servientWrapper.exposeThing(thing) + const thingDescription = await servientWrapper.exposeThing(thing) + node.thingDescriptions[`${config.name}::${title}`] = thingDescription + node.context().global.set('thingDescriptions', node.thingDescriptions) + console.log('**** node.thingDescriptions', node.thingDescriptions) console.log('*** servient started') } @@ -219,7 +223,7 @@ module.exports = function (RED) { console.log('*** servient ended. config node id: ', config.id) launchServient() .then(() => { - node.log('[info] success to end and launch thing. name: ' + config.name + ' id: ' + config.id) + node.debug('[info] success to end and launch thing. name: ' + config.name + ' id: ' + config.id) }) .catch((err) => { node.error('[error] Failed to launch thing. name: ' + config.name + ' id: ' + config.id + ' err:' + err) @@ -229,7 +233,7 @@ module.exports = function (RED) { console.log('*** launch servient.') launchServient() .then(() => { - node.log('[info] success to launch thing. name: ' + config.name + ' id: ' + config.id) + node.debug('[info] success to launch thing. name: ' + config.name + ' id: ' + config.id) }) .catch((err) => { node.error('[error] Failed to launch thing. name: ' + config.name + ' id: ' + config.id + ' err:' + err) From 773bf3422c0a3b365f8b821ce1bf0def474d2cde Mon Sep 17 00:00:00 2001 From: hidetak Date: Tue, 23 Jan 2024 04:40:16 +0900 Subject: [PATCH 10/23] modified error handling --- src/servients/servient-manager.ts | 17 ++-- src/servients/servient-wrapper.ts | 15 +++- src/wot-action.html | 2 +- src/wot-action.js | 4 +- src/wot-event.html | 2 +- src/wot-event.js | 126 ++++++++++++++++++------------ src/wot-property.html | 6 +- src/wot-property.js | 14 +++- src/wot-server-action.html | 29 ++++--- src/wot-server-config.html | 22 ++++-- src/wot-server-config.ts | 41 +++++----- src/wot-server-end.ts | 26 +++--- src/wot-server-event.html | 16 ++-- src/wot-server-event.ts | 42 +++++----- src/wot-server-property.html | 20 +++-- src/wot-server-property.ts | 22 +++--- src/wot-thing-config.html | 2 +- src/wot-thing.js | 15 +++- 18 files changed, 264 insertions(+), 157 deletions(-) diff --git a/src/servients/servient-manager.ts b/src/servients/servient-manager.ts index 453b167..e0d469a 100644 --- a/src/servients/servient-manager.ts +++ b/src/servients/servient-manager.ts @@ -19,29 +19,30 @@ export default class ServientManager { return this.servientWrappers[id] } public existServienetWrapper(id: string) { + console.log('*** this.servientWrappers', this.servientWrappers) if (this.servientWrappers[id]) { return true } return false } public async removeServientWrapper(id: string) { - console.log('*** removeServientWrapper') - this.endServient(id) + console.log('*** removeServientWrapper', id) + await this.endServient(id) delete this.servientWrappers[id] } private async endServient(id: string) { return new Promise(async (resolve, reject) => { - console.log('*** call endServient') + console.log('*** call endServient', id) const servientWrapper = this.servientWrappers[id] const timeoutId = setTimeout(() => { - console.warn('timeout happend while servient ending.') - delete this.servientWrappers[id] + console.warn('timeout happend while servient ending.', id) + //delete this.servientWrappers[id] resolve() }, 3000) // 3秒経っても終わらなければ終了扱いとする - servientWrapper.endServient() - console.log('*** servient finished') - delete this.servientWrappers[id] + await servientWrapper.endServient() + console.log('*** servient finished', id) + //delete this.servientWrappers[id] clearTimeout(timeoutId) resolve() }) diff --git a/src/servients/servient-wrapper.ts b/src/servients/servient-wrapper.ts index b4dd192..cb15896 100644 --- a/src/servients/servient-wrapper.ts +++ b/src/servients/servient-wrapper.ts @@ -16,6 +16,9 @@ import { ExposedThing, Servient } from '@node-wot/core' import { HttpServer } from '@node-wot/binding-http' +import { CoapServer } from '@node-wot/binding-coap' +import { WebSocketServer } from '@node-wot/binding-websockets' +import { MqttBrokerServer } from '@node-wot/binding-mqtt' export default class ServientWrapper { private servient @@ -23,14 +26,18 @@ export default class ServientWrapper { private started = false private server private things: { [key: string]: ExposedThing } = {} - public constructor(bindingType: string, params: any) { - console.log('***** servient constructor called', params) + public constructor(bindingType: string, config: any) { + console.log('***** servient constructor called', config) // create Servient add HTTP binding with port configuration this.servient = new Servient() if (bindingType === 'http') { - this.server = new HttpServer(params) + this.server = new HttpServer(config) + } else if (bindingType === 'websocket') { + this.server = new WebSocketServer(config) } else if (bindingType === 'coap') { - //TODO + this.server = new CoapServer(config) + } else if (bindingType === 'mqtt') { + this.server = new MqttBrokerServer(config) } this.servient.addServer(this.server) } diff --git a/src/wot-action.html b/src/wot-action.html index fe9eb85..dd6ae29 100644 --- a/src/wot-action.html +++ b/src/wot-action.html @@ -53,7 +53,7 @@ while (select.firstChild) select.removeChild(select.firstChild); // Populate with new actions let indx = 0; - Object.keys(JSON.parse(config.td).actions).forEach(action => { + Object.keys(JSON.parse(config.td).actions || {}).forEach(action => { let opt = document.createElement('option'); opt.value = action; opt.innerHTML = action; diff --git a/src/wot-action.js b/src/wot-action.js index b5cad46..05d3a5f 100644 --- a/src/wot-action.js +++ b/src/wot-action.js @@ -17,7 +17,7 @@ module.exports = function (RED) { return } - this.on('input', function (msg) { + this.on('input', function (msg, send, done) { RED.nodes.getNode(config.thing).consumedThing.then((consumedThing) => { const uriVariables = config.uriVariables ? JSON.parse(config.uriVariables) : undefined consumedThing @@ -32,6 +32,7 @@ module.exports = function (RED) { shape: 'dot', text: 'invoked', }) + done() }) .catch((err) => { node.warn(err) @@ -40,6 +41,7 @@ module.exports = function (RED) { shape: 'ring', text: err.message, }) + done(err) }) }) }) diff --git a/src/wot-event.html b/src/wot-event.html index b8c6cd4..c7678f1 100644 --- a/src/wot-event.html +++ b/src/wot-event.html @@ -43,7 +43,7 @@ while (select.firstChild) select.removeChild(select.firstChild); // Populate with events let indx = 0; - Object.keys(JSON.parse(config.td).events).forEach(event => { + Object.keys(JSON.parse(config.td).events || {}).forEach(event => { let opt = document.createElement('option'); opt.value = event; opt.innerHTML = event; diff --git a/src/wot-event.js b/src/wot-event.js index e7ee65c..4b941e6 100644 --- a/src/wot-event.js +++ b/src/wot-event.js @@ -16,62 +16,90 @@ module.exports = function (RED) { return } - RED.nodes.getNode(config.thing).consumedThing.then(async (consumedThing) => { - let subscription - // イベントのサブスクリプションが成功するまで繰り返す - while (true) { - subscription = await consumedThing - .subscribeEvent( - config.event, - async (resp) => { - if (resp) { - const payload = await resp.value() - node.send({ payload, topic: config.topic }) - } - node.status({ - fill: 'green', - shape: 'dot', - text: 'Subscribed', + RED.nodes + .getNode(config.thing) + .consumedThing.then(async (consumedThing) => { + let subscription + // イベントのサブスクリプションが成功するまで繰り返す + try { + while (true) { + subscription = await consumedThing + .subscribeEvent( + config.event, + async (resp) => { + if (resp) { + let payload + try { + payload = await resp.value() + } catch (err) { + node.error(`[error] failed to get event. err: ${err.toString()}`) + console.error(`[error] failed to get event. err: ${err.toString()} resp: `, resp) + } + node.send({ payload, topic: config.topic }) + } + node.status({ + fill: 'green', + shape: 'dot', + text: 'Subscribed', + }) + }, + (err) => { + console.error('[warn] subscribe events.', err) + node.warn(err) + node.status({ + fill: 'red', + shape: 'ring', + text: 'Subscription error', + }) + }, + () => { + console.error('[warn] subscribe ended.') + node.warn('Subscription ended.') + node.status({}) + node.subscription = undefined + } + ) + .catch((err) => { + console.warn('[warn] event subscribe error. try again. error: ' + err) }) - }, - (err) => { - node.warn(err) - node.status({ - fill: 'red', - shape: 'ring', - text: 'Subscription error', - }) - }, - () => { - node.warn('Subscription ended.') - node.status({}) - node.subscription = undefined + console.log('*** subscription', subscription) + if (subscription) { + break } - ) - .catch((err) => { - console.warn('[warn] event subscribe error. try again. error: ' + err) + await (() => { + return new Promise((resolve, reject) => { + setTimeout(() => { + resolve() + }, 500) + }) + })() + } + } catch (err) { + node.status({ + fill: 'red', + shape: 'ring', + text: 'Subscription error', }) - if (subscription) { - break + node.error(`[error] failed to subscribe events. err: ${err.toString()}`) } - await (() => { - return new Promise((resolve, reject) => { - setTimeout(() => { - resolve() - }, 500) - }) - })() - } - node.subscription = subscription + node.subscription = subscription - if (node.subscription) { + if (node.subscription) { + node.status({ + fill: 'green', + shape: 'dot', + text: 'Subscribed', + }) + } + }) + .catch((err) => { node.status({ - fill: 'green', - shape: 'dot', - text: 'Subscribed', + fill: 'red', + shape: 'ring', + text: 'Subscription error', }) - } - }) + node.error(`[error] Failed to create consumed thing for enents. err: ${err.toString()}`) + }) this.on('close', function (removed, done) { if (removed) { diff --git a/src/wot-property.html b/src/wot-property.html index e547ad9..c9b7a71 100644 --- a/src/wot-property.html +++ b/src/wot-property.html @@ -62,7 +62,7 @@ if (thingID) { RED.nodes.eachConfig((config) => { if (config.id === thingID && config.td) { - let properties = JSON.parse(config.td).properties; + let properties = JSON.parse(config.td).properties || {}; if (properties[property] && properties[property].observable) { $("div#property-observe").show(); } else { @@ -86,7 +86,7 @@ RED.nodes.eachConfig((config) => { if (config.id === thingID && config.td) { // parse TD - let properties = JSON.parse(config.td).properties + let properties = JSON.parse(config.td).properties || {} // delete old properties let select = document.getElementById("node-input-property"); while (select.firstChild) select.removeChild(select.firstChild); @@ -208,7 +208,7 @@ RED.nodes.eachConfig((config) => { if (config.id === thingID && config.td) { // parse TD - let properties = JSON.parse(config.td).properties + let properties = JSON.parse(config.td).properties || {} // delete old properties let select = document.getElementById("node-input-property"); while (select.firstChild) select.removeChild(select.firstChild); diff --git a/src/wot-property.js b/src/wot-property.js index 70adb99..5198684 100644 --- a/src/wot-property.js +++ b/src/wot-property.js @@ -33,8 +33,16 @@ module.exports = function (RED) { let ob while (true) { try { + console.log('***** setup for observe property change') ob = await consumedThing.observeProperty(config.property, async (resp) => { - const payload = await resp.value() + console.log('***** property changed') + let payload + try { + payload = await resp.value() + } catch (err) { + node.error(`[error] failed to get property change. err: ${err.toString()}`) + console.error(`[error] failed to get property change. err: ${err.toString()} resp: `, resp) + } node.send({ payload, topic: config.topic }) }) } catch (err) { @@ -118,7 +126,7 @@ module.exports = function (RED) { } RED.nodes.getNode(config.thing).consumedThing.then((consumedThing) => { - node.on('input', function (msg) { + node.on('input', function (msg, send, done) { const uriVariables = config.uriVariables ? JSON.parse(config.uriVariables) : undefined consumedThing .writeProperty(config.property, msg.payload, { @@ -131,6 +139,7 @@ module.exports = function (RED) { shape: 'dot', text: 'connected', }) + done() }) .catch((err) => { node.warn(err) @@ -139,6 +148,7 @@ module.exports = function (RED) { shape: 'ring', text: err.message, }) + done(err) }) }) }) diff --git a/src/wot-server-action.html b/src/wot-server-action.html index cb8441f..e43033c 100644 --- a/src/wot-server-action.html +++ b/src/wot-server-action.html @@ -5,10 +5,11 @@ color: "#a2dea0", defaults: { name: {value:""}, - actionName: {value:""}, + + actionName: {value:"", required:true}, actionDescription: {value:""}, - actionInputDataType: {value:"string"}, - actionOutputDataType: {value:"string"}, + actionInputDataType: {value:"string", required:true}, + actionOutputDataType: {value:"string", required:true}, outParams1_actionArgsType: { value: "msg" }, @@ -17,10 +18,12 @@ }, woTServerConfig: { type: "wot-server-config", + value: "", required: true }, woTThingConfig: { type: "wot-thing-config", + value: "", required: true } }, @@ -145,17 +148,25 @@
diff --git a/src/wot-server-config.html b/src/wot-server-config.html index e5e724b..41db8bf 100644 --- a/src/wot-server-config.html +++ b/src/wot-server-config.html @@ -1,19 +1,31 @@ diff --git a/src/locales/en-US/wot-server-action.json b/src/locales/en-US/wot-server-action.json index 2071c44..0ff19a5 100644 --- a/src/locales/en-US/wot-server-action.json +++ b/src/locales/en-US/wot-server-action.json @@ -1,24 +1,20 @@ { - "editor": { - "nameLabel": "Name", - "configLabel": "thing config", - "paletteLabel": "WoT Property", - "inParams": { - "tabLabel":"Input", - "propertyName":{ - "label":"Property Name", - "description":"Property Name Description.", - "placeholder":"Property Name" - } - }, - "outParams1": { - "tabLabel":"Output", - "outputLabel":"Output", - "output1":{ - "label":"Output Parameter1", - "description":"Output Parameter1 description.", - "placeholder":"Output Parameter1" - } - } + "editor": { + "paletteLabel": "Server-Action", + "nameLabel": "Name", + "serverConfigLabel": "Server config", + "thingConfigLabel": "Thing config", + "actionNameLabel": "Action name", + "actionInputDataTypeLabel": "Argument data type", + "actionOutputDataTypeLabel": "Return value data type", + "outParams1": { + "tabLabel": "Calling action", + "outputLabel": "Argument of action", + "actionArgs": { + "label": "Argument destination", + "description": "Argument destination.", + "placeholder": "Argument destination" + } } -} \ No newline at end of file + } +} diff --git a/src/locales/en-US/wot-server-config.html b/src/locales/en-US/wot-server-config.html index 6423cef..f670a57 100644 --- a/src/locales/en-US/wot-server-config.html +++ b/src/locales/en-US/wot-server-config.html @@ -1,19 +1,22 @@ - diff --git a/src/locales/en-US/wot-server-config.json b/src/locales/en-US/wot-server-config.json index 0a6bc50..1e772f9 100644 --- a/src/locales/en-US/wot-server-config.json +++ b/src/locales/en-US/wot-server-config.json @@ -1,11 +1,8 @@ { - "editor": { - "nameLabel": "Name", - "configLabel": "thing config", - "bindingType":{ - "label":"binding", - "description":"binding type description.", - "placeholder":"binding type" - } - } + "editor": { + "nameLabel": "Server name", + "bindingTypeLabel": "Binding type", + "bindingConfigLabel": "Binding config", + "bindingConfigPlaceholder": "Binding config" + } } diff --git a/src/locales/en-US/wot-server-end.html b/src/locales/en-US/wot-server-end.html index 0ca685c..982a8d0 100644 --- a/src/locales/en-US/wot-server-end.html +++ b/src/locales/en-US/wot-server-end.html @@ -1,36 +1,29 @@ - diff --git a/src/locales/en-US/wot-server-end.json b/src/locales/en-US/wot-server-end.json index a84df61..dde67d3 100644 --- a/src/locales/en-US/wot-server-end.json +++ b/src/locales/en-US/wot-server-end.json @@ -1,31 +1,13 @@ { "editor": { + "paletteLabel": "Server-End", "nameLabel": "Name", - "configLabel": "thing config", - "paletteLabel": "WoT End", - "thingConfig": { - "tabLabel": "Config", - "thingName": { - "label": "Thing Name", - "description": "Thing Name Description.", - "placeholder": "Thing Name" - } - }, "inParams": { "tabLabel": "Input", - "propertyName": { - "label": "Thing Name", - "description": "Thing Name Description.", - "placeholder": "Thing Name" - } - }, - "outParams1": { - "tabLabel": "Output", - "outputLabel": "Output", - "output1": { - "label": "Output Parameter1", - "description": "Output Parameter1 description.", - "placeholder": "Output Parameter1" + "returnValue": { + "label": "Return value source", + "description": "Return value source.", + "placeholder": "Return value source" } } } diff --git a/src/locales/en-US/wot-server-event.html b/src/locales/en-US/wot-server-event.html new file mode 100644 index 0000000..162204c --- /dev/null +++ b/src/locales/en-US/wot-server-event.html @@ -0,0 +1,41 @@ + diff --git a/src/locales/en-US/wot-server-event.json b/src/locales/en-US/wot-server-event.json new file mode 100644 index 0000000..5e3dd42 --- /dev/null +++ b/src/locales/en-US/wot-server-event.json @@ -0,0 +1,18 @@ +{ + "editor": { + "paletteLabel": "Server-Event", + "nameLabel": "Name", + "serverConfigLabel": "Server config", + "thingConfigLabel": "Thing config", + "eventNameLabel": "Event name", + "eventDataTypeLabel": "Data type", + "inParams": { + "tabLabel": "Input", + "eventValue": { + "label": "Event value source", + "description": "Event value source.", + "placeholder": "Event value source" + } + } + } +} diff --git a/src/locales/en-US/wot-server-property.html b/src/locales/en-US/wot-server-property.html index ada512d..86bf62a 100644 --- a/src/locales/en-US/wot-server-property.html +++ b/src/locales/en-US/wot-server-property.html @@ -1,36 +1,68 @@ - diff --git a/src/locales/en-US/wot-server-property.json b/src/locales/en-US/wot-server-property.json index 2071c44..2118bac 100644 --- a/src/locales/en-US/wot-server-property.json +++ b/src/locales/en-US/wot-server-property.json @@ -1,24 +1,24 @@ { - "editor": { - "nameLabel": "Name", - "configLabel": "thing config", - "paletteLabel": "WoT Property", - "inParams": { - "tabLabel":"Input", - "propertyName":{ - "label":"Property Name", - "description":"Property Name Description.", - "placeholder":"Property Name" - } - }, - "outParams1": { - "tabLabel":"Output", - "outputLabel":"Output", - "output1":{ - "label":"Output Parameter1", - "description":"Output Parameter1 description.", - "placeholder":"Output Parameter1" - } - } + "editor": { + "paletteLabel": "Server-Property", + "nameLabel": "Name", + "serverConfigLabel": "Server config", + "thingConfigLabel": "Thing config", + "propertyNameLabel": "Property name", + "propertyDataTypeLabel": "Data type", + "propertyReadOnlyFlagLabel": "Read only", + "propertyObservableFlagLabel": "Observable", + "outParams1": { + "outputLabel": "Read request" + }, + "outParams2": { + "tabLabel": "Write request output", + "outputLabel": "Write request", + "writingValue": { + "label": "Writing value destination", + "description": "Writing value destination.", + "placeholder": "Writing value destination" + } } -} \ No newline at end of file + } +} diff --git a/src/locales/en-US/wot-thing-config.html b/src/locales/en-US/wot-thing-config.html index 6423cef..fa8f756 100644 --- a/src/locales/en-US/wot-thing-config.html +++ b/src/locales/en-US/wot-thing-config.html @@ -1,19 +1,16 @@ diff --git a/src/locales/en-US/wot-thing-config.json b/src/locales/en-US/wot-thing-config.json index 0a6bc50..97bff22 100644 --- a/src/locales/en-US/wot-thing-config.json +++ b/src/locales/en-US/wot-thing-config.json @@ -1,11 +1,5 @@ { - "editor": { - "nameLabel": "Name", - "configLabel": "thing config", - "bindingType":{ - "label":"binding", - "description":"binding type description.", - "placeholder":"binding type" - } - } + "editor": { + "nameLabel": "Thing name" + } } diff --git a/src/locales/ja/wot-server-action.html b/src/locales/ja/wot-server-action.html index 79e6f29..db82b49 100644 --- a/src/locales/ja/wot-server-action.html +++ b/src/locales/ja/wot-server-action.html @@ -1,36 +1,43 @@ - diff --git a/src/locales/ja/wot-server-action.json b/src/locales/ja/wot-server-action.json index 50c8028..b4a10d6 100644 --- a/src/locales/ja/wot-server-action.json +++ b/src/locales/ja/wot-server-action.json @@ -1,19 +1,19 @@ { "editor": { + "paletteLabel": "Server-Action", "nameLabel": "名前", + "serverConfigLabel": "サーバ設定", + "thingConfigLabel": "Thing設定", "actionNameLabel": "アクション名", "actionInputDataTypeLabel": "引数のデータ型", "actionOutputDataTypeLabel": "戻り値のデータ型", - "serverConfigLabel": "サーバ設定", - "thingConfigLabel": "Thing設定", - "paletteLabel": "Server-Action", "outParams1": { "tabLabel": "アクション呼び出し", "outputLabel": "アクションの引数", "actionArgs": { - "label": "引数の格納先", - "description": "アクションの引数の格納先。", - "placeholder": "引数の格納先" + "label": "引数の出力先", + "description": "アクションの引数の出力先。", + "placeholder": "引数の出力先" } } } diff --git a/src/locales/ja/wot-server-config.html b/src/locales/ja/wot-server-config.html index 004eab5..b5cd9f8 100644 --- a/src/locales/ja/wot-server-config.html +++ b/src/locales/ja/wot-server-config.html @@ -1,19 +1,22 @@ - diff --git a/src/locales/ja/wot-server-config.json b/src/locales/ja/wot-server-config.json index a311354..4b16e64 100644 --- a/src/locales/ja/wot-server-config.json +++ b/src/locales/ja/wot-server-config.json @@ -3,7 +3,6 @@ "nameLabel": "サーバ名", "bindingTypeLabel": "Binding種別", "bindingConfigLabel": "Binding設定", - "bindingConfigPlaceholder": "Binding設定", - "configLabel": "サーバ設定" + "bindingConfigPlaceholder": "Binding設定" } } diff --git a/src/locales/ja/wot-server-end.html b/src/locales/ja/wot-server-end.html index 74035ea..f1509f9 100644 --- a/src/locales/ja/wot-server-end.html +++ b/src/locales/ja/wot-server-end.html @@ -1,36 +1,29 @@ - diff --git a/src/locales/ja/wot-server-end.json b/src/locales/ja/wot-server-end.json index 9361a97..8d90e42 100644 --- a/src/locales/ja/wot-server-end.json +++ b/src/locales/ja/wot-server-end.json @@ -1,22 +1,13 @@ { "editor": { - "nameLabel": "名前", - "configLabel": "Thing設定", "paletteLabel": "Server-End", - "thingConfig": { - "tabLabel": "設定", - "thingName": { - "label": "Thing名", - "description": "Thing名の説明。", - "placeholder": "Thing名" - } - }, + "nameLabel": "名前", "inParams": { "tabLabel": "入力", "returnValue": { - "label": "戻り値の格納元", - "description": "戻り値の格納元", - "placeholder": "戻り値の格納元" + "label": "戻り値の入力元", + "description": "戻り値の入力元。", + "placeholder": "戻り値の入力元" } } } diff --git a/src/locales/ja/wot-server-event.html b/src/locales/ja/wot-server-event.html index 79e6f29..4fcb70c 100644 --- a/src/locales/ja/wot-server-event.html +++ b/src/locales/ja/wot-server-event.html @@ -1,36 +1,41 @@ - diff --git a/src/locales/ja/wot-server-event.json b/src/locales/ja/wot-server-event.json index e9522dd..c43ffa5 100644 --- a/src/locales/ja/wot-server-event.json +++ b/src/locales/ja/wot-server-event.json @@ -1,17 +1,17 @@ { "editor": { + "paletteLabel": "Server-Event", "nameLabel": "名前", - "eventNameLabel": "イベント名", - "eventDataTypeLabel": "データ型", "serverConfigLabel": "サーバ設定", "thingConfigLabel": "Thing設定", - "paletteLabel": "Server-Event", + "eventNameLabel": "イベント名", + "eventDataTypeLabel": "データ型", "inParams": { "tabLabel": "イベントの入力", "eventValue": { - "label": "イベント値", - "description": "イベント値。", - "placeholder": "イベント値" + "label": "イベント値の入力元", + "description": "イベント値の入力元。", + "placeholder": "イベント値の入力元" } } } diff --git a/src/locales/ja/wot-server-property.html b/src/locales/ja/wot-server-property.html index 79e6f29..98dad5c 100644 --- a/src/locales/ja/wot-server-property.html +++ b/src/locales/ja/wot-server-property.html @@ -1,36 +1,68 @@ - diff --git a/src/locales/ja/wot-server-property.json b/src/locales/ja/wot-server-property.json index 41e7b4b..6d624d4 100644 --- a/src/locales/ja/wot-server-property.json +++ b/src/locales/ja/wot-server-property.json @@ -1,13 +1,13 @@ { "editor": { + "paletteLabel": "Server-Property", "nameLabel": "名前", + "serverConfigLabel": "サーバ設定", + "thingConfigLabel": "Thing設定", "propertyNameLabel": "プロパティ名", "propertyDataTypeLabel": "データ型", "propertyReadOnlyFlagLabel": "読み込みのみ", "propertyObservableFlagLabel": "観測可能", - "serverConfigLabel": "サーバ設定", - "thingConfigLabel": "Thing設定", - "paletteLabel": "Server-Property", "outParams1": { "outputLabel": "読み込み要求" }, @@ -15,9 +15,9 @@ "tabLabel": "書き込み要求", "outputLabel": "書き込み要求", "writingValue": { - "label": "書き込む値の格納元", - "description": "プロパティに書き込む値の格納元。", - "placeholder": "プロパティに書き込む値の格納元" + "label": "書き込む値の出力先", + "description": "プロパティに書き込む値の出力先。", + "placeholder": "書き込む値の出力先" } } } diff --git a/src/locales/ja/wot-thing-config.html b/src/locales/ja/wot-thing-config.html index 004eab5..2bfa13c 100644 --- a/src/locales/ja/wot-thing-config.html +++ b/src/locales/ja/wot-thing-config.html @@ -1,19 +1,16 @@ diff --git a/src/locales/ja/wot-thing-config.json b/src/locales/ja/wot-thing-config.json index 807f9c9..def7490 100644 --- a/src/locales/ja/wot-thing-config.json +++ b/src/locales/ja/wot-thing-config.json @@ -1,9 +1,5 @@ { "editor": { - "nameLabel": "Thing名", - "bindingTypeLabel": "Binding種別", - "bindingConfigLabel": "Binding設定", - "bindingConfigPlaceholder": "Binding設定", - "configLabel": "Thing設定" + "nameLabel": "Thing名" } } diff --git a/src/wot-event.js b/src/wot-event.js index a9b52e9..7b816d9 100644 --- a/src/wot-event.js +++ b/src/wot-event.js @@ -44,8 +44,8 @@ module.exports = function (RED) { }) }, (err) => { - console.error('[warn] subscribe events.', err) - node.warn(err) + console.error('[error] subscribe events.', err) + node.error(`[error] subscribe events. err: ${err.toString()}`) node.status({ fill: 'red', shape: 'ring', diff --git a/src/wot-property.js b/src/wot-property.js index d402d61..6fc4d7c 100644 --- a/src/wot-property.js +++ b/src/wot-property.js @@ -30,17 +30,29 @@ module.exports = function (RED) { while (true) { try { console.log('***** setup for observe property change') - ob = await consumedThing.observeProperty(config.property, async (resp) => { - console.log('***** property changed') - let payload - try { - payload = await resp.value() - } catch (err) { - node.error(`[error] failed to get property change. err: ${err.toString()}`) - console.error(`[error] failed to get property change. err:`, err) + ob = await consumedThing.observeProperty( + config.property, + async (resp) => { + console.log('***** property changed') + let payload + try { + payload = await resp.value() + } catch (err) { + node.error(`[error] failed to get property change. err: ${err.toString()}`) + console.error(`[error] failed to get property change. err:`, err) + } + node.send({ payload, topic: config.topic }) + }, + (err) => { + node.error(`[error] property observe error. error: ${err.toString()}`) + console.error(`[error] property observe error. error: `, err) + node.status({ + fill: 'red', + shape: 'ring', + text: 'Observe error', + }) } - node.send({ payload, topic: config.topic }) - }) + ) } catch (err) { console.warn('[warn] property observe error. try again. error: ' + err) node.status({ diff --git a/src/wot-server-config.ts b/src/wot-server-config.ts index 802c7d0..71f287f 100644 --- a/src/wot-server-config.ts +++ b/src/wot-server-config.ts @@ -89,9 +89,19 @@ module.exports = function (RED) { console.log('*** finish', props) if (props.content.observable) { console.log('*** emitPropertyChange', props.name) - thing.emitPropertyChange(props.name) + thing + .emitPropertyChange(props.name) + .then(() => { + resolve() + }) + .catch((err) => { + node.error(`[error] emit property change error. error: ${err.toString()}`) + node.error(`[error] emit property change error. error: `, err) + reject(err) + }) + } else { + resolve() } - resolve() } console.log('*** userNode', userNode) userNode.send([ From 1e65c816ce7d1e5115bf1897ab54ee7e1a343b19 Mon Sep 17 00:00:00 2001 From: hidetak Date: Thu, 1 Feb 2024 02:47:46 +0900 Subject: [PATCH 14/23] review logs and comments --- package-lock.json | 4 +- package.json | 2 +- src/servients/servient-manager.ts | 18 +++----- src/servients/servient-wrapper.ts | 30 +++---------- src/wot-event.js | 9 ++-- src/wot-property.js | 5 +-- src/wot-server-action.html | 8 ---- src/wot-server-action.ts | 16 +------ src/wot-server-config.html | 2 - src/wot-server-config.ts | 75 +++++++++---------------------- src/wot-server-end.html | 3 -- src/wot-server-end.ts | 7 +-- src/wot-server-event.html | 7 --- src/wot-server-event.ts | 22 +++------ src/wot-server-property.html | 9 +--- src/wot-server-property.ts | 19 +++----- 16 files changed, 58 insertions(+), 178 deletions(-) diff --git a/package-lock.json b/package-lock.json index a26cc6b..e734fed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "node-red-contrib-web-of-things", - "version": "2.0.0", + "version": "2.0.0-beta.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "node-red-contrib-web-of-things", - "version": "2.0.0", + "version": "2.0.0-beta.0", "license": "MIT", "dependencies": { "@node-wot/binding-coap": "^0.8.10", diff --git a/package.json b/package.json index ddc6361..a0cb1b3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-red-contrib-web-of-things", - "version": "2.0.0", + "version": "2.0.0-beta.0", "description": "Web of Things node for node-RED.", "author": "hassib.belhaj_hassine@siemens.com", "contributors": [ diff --git a/src/servients/servient-manager.ts b/src/servients/servient-manager.ts index 29b9b7f..38155a2 100644 --- a/src/servients/servient-manager.ts +++ b/src/servients/servient-manager.ts @@ -1,6 +1,5 @@ import ServientWrapper from './servient-wrapper' -// servientのインスタンスを管理する export default class ServientManager { private servientWrappers: { [key: string]: ServientWrapper } = {} private static instance: ServientManager @@ -11,38 +10,35 @@ export default class ServientManager { return ServientManager.instance } private constructor() { - console.log('*** ServientManager constructor called') + console.debug('[debug] ServientManager constructor called.') } public createServientWrapper(id: string, bindingType: string, params: any): ServientWrapper { - console.log('*** createServientWrapper', id, bindingType, params) + console.debug('[debug] createServientWrapper. ', id, bindingType, params) this.servientWrappers[id] = new ServientWrapper(bindingType, params) return this.servientWrappers[id] } public existServienetWrapper(id: string) { - console.log('*** this.servientWrappers', this.servientWrappers) if (this.servientWrappers[id]) { return true } return false } public async removeServientWrapper(id: string) { - console.log('*** removeServientWrapper', id) + console.debug('[debug] removeServientWrapper. id: ', id) await this.endServient(id) delete this.servientWrappers[id] } private async endServient(id: string) { return new Promise(async (resolve, reject) => { - console.log('*** call endServient', id) + console.debug('[debug] call endServient. id: ', id) const servientWrapper = this.servientWrappers[id] const timeoutId = setTimeout(() => { - console.warn('timeout happend while servient ending.', id) - //delete this.servientWrappers[id] + console.warn('[warn] timeout happend while servient ending.', id) resolve() - }, 10000) // 10秒経っても終わらなければ終了扱いとする + }, 10000) // If it does not end after 10 seconds, it is considered to be finished. await servientWrapper.endServient() - console.log('*** servient finished', id) - //delete this.servientWrappers[id] + console.debug('[debug] servient ended. id: ', id) clearTimeout(timeoutId) resolve() }) diff --git a/src/servients/servient-wrapper.ts b/src/servients/servient-wrapper.ts index cb15896..d8a6bba 100644 --- a/src/servients/servient-wrapper.ts +++ b/src/servients/servient-wrapper.ts @@ -1,19 +1,3 @@ -/** - * ***************************************************************************** - * Copyright (c) 2022 Contributors to the Eclipse Foundation - * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v. 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0, or the W3C Software Notice and - * Document License (2015-05-13) which is available at - * https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document. - * - * SPDX-License-Identifier: EPL-2.0 OR W3C-20150513 - * ******************************************************************************/ - import { ExposedThing, Servient } from '@node-wot/core' import { HttpServer } from '@node-wot/binding-http' import { CoapServer } from '@node-wot/binding-coap' @@ -27,8 +11,7 @@ export default class ServientWrapper { private server private things: { [key: string]: ExposedThing } = {} public constructor(bindingType: string, config: any) { - console.log('***** servient constructor called', config) - // create Servient add HTTP binding with port configuration + console.debug('[debug] servient constructor called. config: ', config) this.servient = new Servient() if (bindingType === 'http') { this.server = new HttpServer(config) @@ -48,11 +31,9 @@ export default class ServientWrapper { public async startServient() { this.wot = await this.servient.start() - console.log('*** wot in startServient', this.wot) } public async createThing(td, thingName: string) { - console.log('*** wot in createThing', this.wot) const thing = await this.wot.produce(td) this.things[thingName] = thing return thing @@ -62,7 +43,7 @@ export default class ServientWrapper { await thing.expose() this.started = true const td = thing.getThingDescription() - console.log('*** exposed', td) + console.debug('[debug] thing exposed.', td) return td } @@ -72,14 +53,15 @@ export default class ServientWrapper { public async endServient() { if (this.server) { - console.log('*** call server.destroy') + console.debug('[debug] endServient called.') for (const key in this.things) { await this.server.destroy(this.things[key].id) } - console.log('*** call server.stop') + console.debug('[debug] server destroyed.') await this.server.stop() - console.log('*** call servient.shutdown') + console.debug('[debug] server stopped.') await this.servient.shutdown() + console.debug('[debug] servient shutdown.') } } } diff --git a/src/wot-event.js b/src/wot-event.js index 7b816d9..02dd1f9 100644 --- a/src/wot-event.js +++ b/src/wot-event.js @@ -20,7 +20,7 @@ module.exports = function (RED) { .getNode(config.thing) .consumedThing.then(async (consumedThing) => { let subscription - // イベントのサブスクリプションが成功するまで繰り返す + // Repeat until event subscription succeeds. try { while (true) { subscription = await consumedThing @@ -53,8 +53,8 @@ module.exports = function (RED) { }) }, () => { - console.error('[warn] subscribe ended.') - node.warn('Subscription ended.') + console.error('[warn] Subscription ended.') + node.warn('[warn] Subscription ended.') node.status({}) node.subscription = undefined } @@ -62,7 +62,6 @@ module.exports = function (RED) { .catch((err) => { console.warn('[warn] event subscribe error. try again. error: ' + err) }) - console.log('*** subscription', subscription) if (subscription) { break } @@ -80,7 +79,7 @@ module.exports = function (RED) { shape: 'ring', text: 'Subscription error', }) - node.error(`[error] failed to subscribe events. err: ${err.toString()}`) + node.error(`[error] failed to subscribe events. error: ${err.toString()}`) } node.subscription = subscription diff --git a/src/wot-property.js b/src/wot-property.js index 6fc4d7c..cea102b 100644 --- a/src/wot-property.js +++ b/src/wot-property.js @@ -25,15 +25,13 @@ module.exports = function (RED) { if (config.observe === false) { return } - // observePropertyが成功するまで繰り返す + // Repeat until observeProperty succeeds. let ob while (true) { try { - console.log('***** setup for observe property change') ob = await consumedThing.observeProperty( config.property, async (resp) => { - console.log('***** property changed') let payload try { payload = await resp.value() @@ -79,7 +77,6 @@ module.exports = function (RED) { } }) - // inputイベント node.on('input', async (msg, send, done) => { if (!consumedThing) { node.error('[error] consumedThing is not defined.') diff --git a/src/wot-server-action.html b/src/wot-server-action.html index e43033c..0912032 100644 --- a/src/wot-server-action.html +++ b/src/wot-server-action.html @@ -51,7 +51,6 @@ }, oneditprepare: function() { console.log("node oneditprepare") - // Tab const tabs = RED.tabs.create({ id: 'red-tabs', onchange(tab) { @@ -65,7 +64,6 @@ id: 'tab-outParams1-settings', label: this._('editor.outParams1.tabLabel'), }); - // 出力パラメータの指定項目作成 prepareInOutParamSetting("outParams1", { name: "actionArgs", types: ["msg"], @@ -122,14 +120,12 @@ - - - - diff --git a/src/locales/en-US/wot-server-config.html b/src/locales/en-US/wot-server-config.html index f670a57..620e161 100644 --- a/src/locales/en-US/wot-server-config.html +++ b/src/locales/en-US/wot-server-config.html @@ -2,7 +2,7 @@

This is a Config node that holds the settings for the server that publishes WoT's Thing.

Specify this setting in Server-Property, Server-Action, and Server-Event nodes.

The Thing Description, which defines the functions of the Thing to be published, is stored in the thingDescriptions variable of the global context with the key of <Server Name>::<Thing Name>.

-

You can check this in the context tab of the Node-RED editor. Press the refresh button to refer to the latest Thing Description.

+

You can check this in the Context Data tab of the Node-RED editor. Press the refresh button to refer to the latest Thing Description.

Details

The following items are specified on the node's properties screen:

diff --git a/src/locales/en-US/wot-server-event.html b/src/locales/en-US/wot-server-event.html index 162204c..cace789 100644 --- a/src/locales/en-US/wot-server-event.html +++ b/src/locales/en-US/wot-server-event.html @@ -35,7 +35,7 @@

Details

The Thing Description is stored in the thingDescriptions variable of the global context with the key of <Server Name>::<Thing Name>.

-

You can check this in the context tab of the Node-RED editor. Press the refresh button to refer to the latest Thing Description.

+

You can check this in the Context Data tab of the Node-RED editor. Press the refresh button to refer to the latest Thing Description.

This node uses eclipse-thingweb/node-wot for WoT implementation.

diff --git a/src/locales/en-US/wot-server-property.html b/src/locales/en-US/wot-server-property.html index 86bf62a..b2171ed 100644 --- a/src/locales/en-US/wot-server-property.html +++ b/src/locales/en-US/wot-server-property.html @@ -62,7 +62,7 @@

Details

The Thing Description is stored in the thingDescriptions variable of the global context with the key of <Server Name>::<Thing Name>.

-

You can check this in the context tab of the Node-RED editor. Press the refresh button to refer to the latest Thing Description.

+

You can check this in the Context Data tab of the Node-RED editor. Press the refresh button to refer to the latest Thing Description.

This node uses eclipse-thingweb/node-wot for WoT implementation.

diff --git a/src/locales/en-US/wot-thing-config.html b/src/locales/en-US/wot-thing-config.html index fa8f756..0dc2564 100644 --- a/src/locales/en-US/wot-thing-config.html +++ b/src/locales/en-US/wot-thing-config.html @@ -10,7 +10,7 @@

Details

The Thing Description is stored in the thingDescriptions variable of the global context with the key of <Server Name>::<Thing Name>.

-

You can check this in the context tab of the Node-RED editor. Press the refresh button to refer to the latest Thing Description.

+

You can check this in the Context Data tab of the Node-RED editor. Press the refresh button to refer to the latest Thing Description.

This node uses eclipse-thingweb/node-wot for WoT implementation.

From 4c2f04d92289ece12fd9379f29d5abb34127d447 Mon Sep 17 00:00:00 2001 From: hidetak Date: Thu, 1 Feb 2024 17:26:31 +0900 Subject: [PATCH 16/23] modified README little, change package version and add npm publish script --- README.md | 2 ++ package-lock.json | 8 ++++---- package.json | 7 ++++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index ebb1c3e..0bf870d 100644 --- a/README.md +++ b/README.md @@ -129,3 +129,5 @@ Currently, the supported binding types are http, coap, and mqtt. As shown in the |subscribe event|✓ *1|-|✓| *1: After the connection with the server times out after 1 hour, it is not reconnected + +Also, it is unclear how to define the flow when the data type is null. diff --git a/package-lock.json b/package-lock.json index e734fed..43f3a28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { - "name": "node-red-contrib-web-of-things", - "version": "2.0.0-beta.0", + "name": "@hidetak/node-red-contrib-web-of-things", + "version": "2.0.0-beta.1", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "node-red-contrib-web-of-things", - "version": "2.0.0-beta.0", + "name": "@hidetak/node-red-contrib-web-of-things", + "version": "2.0.0-beta.1", "license": "MIT", "dependencies": { "@node-wot/binding-coap": "^0.8.10", diff --git a/package.json b/package.json index a0cb1b3..8d499a3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "node-red-contrib-web-of-things", - "version": "2.0.0-beta.0", + "name": "@hidetak/node-red-contrib-web-of-things", + "version": "2.0.0-beta.1", "description": "Web of Things node for node-RED.", "author": "hassib.belhaj_hassine@siemens.com", "contributors": [ @@ -36,7 +36,8 @@ }, "scripts": { "build": "npm run copy:src2dist && tsc", - "copy:src2dist": "node -e \"require('fs-extra').copySync('./src', './dist')\"" + "copy:src2dist": "node -e \"require('fs-extra').copySync('./src', './dist')\"", + "publish:beta": "npm publish --tag beta --access=public" }, "dependencies": { "@node-wot/binding-coap": "^0.8.10", From bdf090139d6ca5344021d271b62c26f40a727a7c Mon Sep 17 00:00:00 2001 From: hidetak Date: Fri, 2 Feb 2024 03:21:52 +0900 Subject: [PATCH 17/23] modified for publishing to npmjs --- .gitignore | 1 + README.md | 18 +++++++++--------- package-lock.json | 4 ++-- package.json | 10 ++++++---- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/.gitignore b/.gitignore index 3333032..17d1a1b 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ .vscode/settings.json .DS_Store /dist +/memo diff --git a/README.md b/README.md index 0bf870d..d256c0f 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Those nodes are as follows and needed to interact with different interaction aff 7) Server-Action node; 8) Server-Event node. -![WoT nodes](./screenshots/nodes.png) +![WoT nodes](screenshots/nodes.png) ## Getting Started @@ -31,11 +31,11 @@ In order to consume a Thing and interact with it, drag and drop one of the inter Then double click on that node. Inside the opened window click the pencil icon next to "Add new consumed-thing..." dropdown. -![Add new consumed Thing](./screenshots/add-thing.png) +![Add new consumed Thing](screenshots/add-thing.png) A new window will appear. -![Add Thing Description](./screenshots/add-td.png) +![Add Thing Description](screenshots/add-td.png) Now either copy-paste/type in a Thing Description inside the TD JSON box or fetch a Thing Description from a URL. **Tip:** In case you choose the first option, click on the three dots to expand the JSON editor. @@ -69,7 +69,7 @@ Subscribing to an event is pretty much the same as reading a property. Overall, a basic flow may look like this. -![Flow Example](./screenshots/flow-example.png) +![Flow Example](screenshots/flow-example.png) ### Expose Things @@ -77,7 +77,7 @@ To expose a Thing, firstly, drag & drop one of the nodes belonging to the Thing, When you double-click on that node, a property screen appears. -![Property Screen](./screenshots/server-property-settings.png) +![Property Screen](screenshots/server-property-settings.png) On the properties screen, the `Server config` and `Thing config` must be configured. The roles of each configs are as follows: @@ -88,7 +88,7 @@ By performing `Server config` and `Thing config` in the Server-Property, Server- If you create a new server config on the properties screen, the following screen will appear. -![Server Config Screen](./screenshots/server-config-settings.png) +![Server Config Screen](screenshots/server-config-settings.png) Perform the following settings: @@ -98,7 +98,7 @@ Perform the following settings: If you create a new thing config on the properties screen, the following screen will appear. -![Thing Config Screen](./screenshots/thing-config-settings.png) +![Thing Config Screen](screenshots/thing-config-settings.png) Specify the Thing name. The Thing name will be included in the Thing Description. @@ -111,12 +111,12 @@ Flows connected to the two output terminals of the Server-Property node (read/wr Here's an example of a flow: -![Server Flow Example](./screenshots/server-flow-example.png) +![Server Flow Example](screenshots/server-flow-example.png) The Thing Description required when the client uses a Thing is set in the thingDescriptions object of the global context. The member name is `::`. If you want to check the Thing Description, open the Context Data tab of Node-RED editor and press the refresh icon of the Global context to display it. -![Reference TD](./screenshots/reference-td.png) +![Reference TD](screenshots/reference-td.png) Currently, the supported binding types are http, coap, and mqtt. As shown in the table below, each of these types of bindings has its own available/unavailable functions. Available functions are denoted by `✓` and unavailable functions are denoted by `-`. diff --git a/package-lock.json b/package-lock.json index 43f3a28..db7c5e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hidetak/node-red-contrib-web-of-things", - "version": "2.0.0-beta.1", + "version": "2.0.0-beta.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hidetak/node-red-contrib-web-of-things", - "version": "2.0.0-beta.1", + "version": "2.0.0-beta.2", "license": "MIT", "dependencies": { "@node-wot/binding-coap": "^0.8.10", diff --git a/package.json b/package.json index 8d499a3..35278b5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hidetak/node-red-contrib-web-of-things", - "version": "2.0.0-beta.1", + "version": "2.0.0-beta.2", "description": "Web of Things node for node-RED.", "author": "hassib.belhaj_hassine@siemens.com", "contributors": [ @@ -17,9 +17,9 @@ }, "repository": { "type": "git", - "url": "https://github.com/thingweb/node-red-contrib-web-of-things" + "url": "https://github.com/hidetak/node-red-contrib-web-of-things" }, - "homepage": "https://github.com/thingweb/node-red-contrib-web-of-things/blob/master/README.md", + "homepage": "https://github.com/hidetak/node-red-contrib-web-of-things/blob/master/README.md", "node-red": { "nodes": { "wot-thing": "dist/wot-thing.js", @@ -37,7 +37,9 @@ "scripts": { "build": "npm run copy:src2dist && tsc", "copy:src2dist": "node -e \"require('fs-extra').copySync('./src', './dist')\"", - "publish:beta": "npm publish --tag beta --access=public" + "publish": "npm publish --access=public", + "publish:beta": "npm publish --access=public --tag beta", + "publish:beta:latest": "npm publish --access=public --tag=beta --tag=latest" }, "dependencies": { "@node-wot/binding-coap": "^0.8.10", From 52feb6418fb42cca49ad47deb0e323b9ee5c027f Mon Sep 17 00:00:00 2001 From: hidetak Date: Tue, 6 Feb 2024 22:12:29 +0900 Subject: [PATCH 18/23] little changes for publish --- .npmignore | 5 +++++ package-lock.json | 4 ++-- package.json | 5 ++--- 3 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 .npmignore diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..a63c6f2 --- /dev/null +++ b/.npmignore @@ -0,0 +1,5 @@ +/node_modules +.idea/ +.vscode/settings.json +.DS_Store +/memo diff --git a/package-lock.json b/package-lock.json index db7c5e1..42eba77 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hidetak/node-red-contrib-web-of-things", - "version": "2.0.0-beta.2", + "version": "2.0.0-beta.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hidetak/node-red-contrib-web-of-things", - "version": "2.0.0-beta.2", + "version": "2.0.0-beta.5", "license": "MIT", "dependencies": { "@node-wot/binding-coap": "^0.8.10", diff --git a/package.json b/package.json index 35278b5..a988fca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hidetak/node-red-contrib-web-of-things", - "version": "2.0.0-beta.2", + "version": "2.0.0-beta.5", "description": "Web of Things node for node-RED.", "author": "hassib.belhaj_hassine@siemens.com", "contributors": [ @@ -38,8 +38,7 @@ "build": "npm run copy:src2dist && tsc", "copy:src2dist": "node -e \"require('fs-extra').copySync('./src', './dist')\"", "publish": "npm publish --access=public", - "publish:beta": "npm publish --access=public --tag beta", - "publish:beta:latest": "npm publish --access=public --tag=beta --tag=latest" + "publish:beta": "npm publish --access=public --tag=beta" }, "dependencies": { "@node-wot/binding-coap": "^0.8.10", From 5333c73211c57bc18f538ed0c592a46ce47202d8 Mon Sep 17 00:00:00 2001 From: hidetak Date: Tue, 6 Feb 2024 22:37:57 +0900 Subject: [PATCH 19/23] modified for making PR --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 42eba77..56d5b1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "@hidetak/node-red-contrib-web-of-things", + "name": "node-red-contrib-web-of-things", "version": "2.0.0-beta.5", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "@hidetak/node-red-contrib-web-of-things", + "name": "node-red-contrib-web-of-things", "version": "2.0.0-beta.5", "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index a988fca..b12ac5f 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "@hidetak/node-red-contrib-web-of-things", + "name": "node-red-contrib-web-of-things", "version": "2.0.0-beta.5", "description": "Web of Things node for node-RED.", "author": "hassib.belhaj_hassine@siemens.com", From 004bd4fac4a8064757b3190bdd3c209ad1fbd07e Mon Sep 17 00:00:00 2001 From: hidetak Date: Thu, 15 Feb 2024 02:17:06 +0900 Subject: [PATCH 20/23] add description in td --- src/locales/en-US/wot-server-action.html | 3 +++ src/locales/en-US/wot-server-action.json | 1 + src/locales/en-US/wot-server-event.html | 3 +++ src/locales/en-US/wot-server-event.json | 1 + src/locales/en-US/wot-server-property.html | 3 +++ src/locales/en-US/wot-server-property.json | 1 + src/locales/en-US/wot-thing-config.html | 3 +++ src/locales/en-US/wot-thing-config.json | 3 ++- src/locales/ja/wot-server-action.html | 3 +++ src/locales/ja/wot-server-action.json | 1 + src/locales/ja/wot-server-event.html | 3 +++ src/locales/ja/wot-server-event.json | 1 + src/locales/ja/wot-server-property.html | 3 +++ src/locales/ja/wot-server-property.json | 1 + src/locales/ja/wot-thing-config.html | 3 +++ src/locales/ja/wot-thing-config.json | 3 ++- src/servients/servient-wrapper.ts | 4 ++-- src/wot-server-action.html | 4 ++++ src/wot-server-action.ts | 4 ++-- src/wot-server-config.ts | 20 +++++++++----------- src/wot-server-event.html | 4 ++++ src/wot-server-event.ts | 6 +++--- src/wot-server-property.html | 4 ++++ src/wot-server-property.ts | 6 +++--- src/wot-thing-config.html | 5 +++++ src/wot-thing-config.ts | 7 +++++-- 26 files changed, 75 insertions(+), 25 deletions(-) diff --git a/src/locales/en-US/wot-server-action.html b/src/locales/en-US/wot-server-action.html index 9669ef1..f9d18be 100644 --- a/src/locales/en-US/wot-server-action.html +++ b/src/locales/en-US/wot-server-action.html @@ -26,6 +26,9 @@

Details

  • Action name: Specifies the action name.
  • +
  • + Action description: Specifies the action description. +
  • Argument data type: Specifies the data type of the action argument.
  • diff --git a/src/locales/en-US/wot-server-action.json b/src/locales/en-US/wot-server-action.json index 0ff19a5..1def61b 100644 --- a/src/locales/en-US/wot-server-action.json +++ b/src/locales/en-US/wot-server-action.json @@ -5,6 +5,7 @@ "serverConfigLabel": "Server config", "thingConfigLabel": "Thing config", "actionNameLabel": "Action name", + "actionDescriptionLabel": "Action description", "actionInputDataTypeLabel": "Argument data type", "actionOutputDataTypeLabel": "Return value data type", "outParams1": { diff --git a/src/locales/en-US/wot-server-event.html b/src/locales/en-US/wot-server-event.html index cace789..0b4d1a6 100644 --- a/src/locales/en-US/wot-server-event.html +++ b/src/locales/en-US/wot-server-event.html @@ -27,6 +27,9 @@

    Details

  • Event name: Specify the event name.
  • +
  • + Event description: Specify the event description. +
  • Data type: Specify the data type of the event.
  • diff --git a/src/locales/en-US/wot-server-event.json b/src/locales/en-US/wot-server-event.json index 5e3dd42..940a11f 100644 --- a/src/locales/en-US/wot-server-event.json +++ b/src/locales/en-US/wot-server-event.json @@ -5,6 +5,7 @@ "serverConfigLabel": "Server config", "thingConfigLabel": "Thing config", "eventNameLabel": "Event name", + "eventDescriptionLabel": "Event description", "eventDataTypeLabel": "Data type", "inParams": { "tabLabel": "Input", diff --git a/src/locales/en-US/wot-server-property.html b/src/locales/en-US/wot-server-property.html index b2171ed..d694251 100644 --- a/src/locales/en-US/wot-server-property.html +++ b/src/locales/en-US/wot-server-property.html @@ -48,6 +48,9 @@

    Details

  • Property name: Specify the property name.
  • +
  • + Property description: Specify the property description. +
  • Data type: Specify the data type of the property.
  • diff --git a/src/locales/en-US/wot-server-property.json b/src/locales/en-US/wot-server-property.json index 2118bac..9fa10bb 100644 --- a/src/locales/en-US/wot-server-property.json +++ b/src/locales/en-US/wot-server-property.json @@ -5,6 +5,7 @@ "serverConfigLabel": "Server config", "thingConfigLabel": "Thing config", "propertyNameLabel": "Property name", + "propertyDescriptionLabel": "Property description", "propertyDataTypeLabel": "Data type", "propertyReadOnlyFlagLabel": "Read only", "propertyObservableFlagLabel": "Observable", diff --git a/src/locales/en-US/wot-thing-config.html b/src/locales/en-US/wot-thing-config.html index 0dc2564..150c054 100644 --- a/src/locales/en-US/wot-thing-config.html +++ b/src/locales/en-US/wot-thing-config.html @@ -8,6 +8,9 @@

    Details

  • Thing name: Specify the name of the Thing. In Thing Description, properties, actions, and events that refer to this setting are published with the Thing name specified here.
  • +
  • + Ddescription: Specify the description of the Thing. +
  • The Thing Description is stored in the thingDescriptions variable of the global context with the key of <Server Name>::<Thing Name>.

    You can check this in the Context Data tab of the Node-RED editor. Press the refresh button to refer to the latest Thing Description.

    diff --git a/src/locales/en-US/wot-thing-config.json b/src/locales/en-US/wot-thing-config.json index 97bff22..dfcf13d 100644 --- a/src/locales/en-US/wot-thing-config.json +++ b/src/locales/en-US/wot-thing-config.json @@ -1,5 +1,6 @@ { "editor": { - "nameLabel": "Thing name" + "nameLabel": "Thing name", + "descriptionLabel": "Description" } } diff --git a/src/locales/ja/wot-server-action.html b/src/locales/ja/wot-server-action.html index db82b49..55caf74 100644 --- a/src/locales/ja/wot-server-action.html +++ b/src/locales/ja/wot-server-action.html @@ -26,6 +26,9 @@

    Details

  • アクション名: アクション名を指定します。
  • +
  • + アクションの説明: アクションの説明を指定します。 +
  • 引数のデータ型: アクションの引数のデータ型を指定します。
  • diff --git a/src/locales/ja/wot-server-action.json b/src/locales/ja/wot-server-action.json index b4a10d6..5ff3774 100644 --- a/src/locales/ja/wot-server-action.json +++ b/src/locales/ja/wot-server-action.json @@ -5,6 +5,7 @@ "serverConfigLabel": "サーバ設定", "thingConfigLabel": "Thing設定", "actionNameLabel": "アクション名", + "actionDescriptionLabel": "アクションの説明", "actionInputDataTypeLabel": "引数のデータ型", "actionOutputDataTypeLabel": "戻り値のデータ型", "outParams1": { diff --git a/src/locales/ja/wot-server-event.html b/src/locales/ja/wot-server-event.html index 4fcb70c..bb77501 100644 --- a/src/locales/ja/wot-server-event.html +++ b/src/locales/ja/wot-server-event.html @@ -27,6 +27,9 @@

    Details

  • イベント名: イベント名を指定します。
  • +
  • + イベントの説明: イベントの説明を指定します。 +
  • データ型: イベントのデータ型を指定します。
  • diff --git a/src/locales/ja/wot-server-event.json b/src/locales/ja/wot-server-event.json index c43ffa5..9d5755b 100644 --- a/src/locales/ja/wot-server-event.json +++ b/src/locales/ja/wot-server-event.json @@ -5,6 +5,7 @@ "serverConfigLabel": "サーバ設定", "thingConfigLabel": "Thing設定", "eventNameLabel": "イベント名", + "eventDescriptionLabel": "イベントの説明", "eventDataTypeLabel": "データ型", "inParams": { "tabLabel": "イベントの入力", diff --git a/src/locales/ja/wot-server-property.html b/src/locales/ja/wot-server-property.html index 98dad5c..31d5deb 100644 --- a/src/locales/ja/wot-server-property.html +++ b/src/locales/ja/wot-server-property.html @@ -48,6 +48,9 @@

    Details

  • プロパティ名: プロパティ名を指定します。
  • +
  • + プロパティの説明: プロパティの説明を指定します。 +
  • データ型: プロパティのデータ型を指定します。
  • diff --git a/src/locales/ja/wot-server-property.json b/src/locales/ja/wot-server-property.json index 6d624d4..8033167 100644 --- a/src/locales/ja/wot-server-property.json +++ b/src/locales/ja/wot-server-property.json @@ -5,6 +5,7 @@ "serverConfigLabel": "サーバ設定", "thingConfigLabel": "Thing設定", "propertyNameLabel": "プロパティ名", + "propertyDescriptionLabel": "プロパティの説明", "propertyDataTypeLabel": "データ型", "propertyReadOnlyFlagLabel": "読み込みのみ", "propertyObservableFlagLabel": "観測可能", diff --git a/src/locales/ja/wot-thing-config.html b/src/locales/ja/wot-thing-config.html index 2bfa13c..ce9f510 100644 --- a/src/locales/ja/wot-thing-config.html +++ b/src/locales/ja/wot-thing-config.html @@ -8,6 +8,9 @@

    Details

  • Thing名: Thing名を指定します。Thing Descriptionでは、ここで指定したThing名で、本設定を参照するプロパティ、アクション、イベントを公開します。
  • +
  • + 説明: Thingの説明を指定します。 +
  • Thing Descriptionは、グローバルコンテキストのthingDescriptions変数に<サーバ名>::<Thing名>のキーに格納します。

    Node-REDエディタのコンテキストデータタブで確認できます。グローバルの更新ボタンを押して最新のThing Descriptionを参照してください。

    diff --git a/src/locales/ja/wot-thing-config.json b/src/locales/ja/wot-thing-config.json index def7490..044e695 100644 --- a/src/locales/ja/wot-thing-config.json +++ b/src/locales/ja/wot-thing-config.json @@ -1,5 +1,6 @@ { "editor": { - "nameLabel": "Thing名" + "nameLabel": "Thing名", + "descriptionLabel": "説明" } } diff --git a/src/servients/servient-wrapper.ts b/src/servients/servient-wrapper.ts index d8a6bba..0a349c6 100644 --- a/src/servients/servient-wrapper.ts +++ b/src/servients/servient-wrapper.ts @@ -33,9 +33,9 @@ export default class ServientWrapper { this.wot = await this.servient.start() } - public async createThing(td, thingName: string) { + public async createThing(td) { const thing = await this.wot.produce(td) - this.things[thingName] = thing + this.things[td.title] = thing return thing } diff --git a/src/wot-server-action.html b/src/wot-server-action.html index 0912032..347d17e 100644 --- a/src/wot-server-action.html +++ b/src/wot-server-action.html @@ -139,6 +139,10 @@ +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    diff --git a/src/wot-thing-config.ts b/src/wot-thing-config.ts index 49d239c..ac010df 100644 --- a/src/wot-thing-config.ts +++ b/src/wot-thing-config.ts @@ -2,8 +2,11 @@ module.exports = function (RED) { function WoTThingConfig(config) { RED.nodes.createNode(this, config) const node = this - node.getThingName = () => { - return config.name + node.getProps = () => { + return { + title: config.name, + description: config.description, + } } } From b82fa2d9e09711ede9f4808a4b4408ad5dbe350e Mon Sep 17 00:00:00 2001 From: hidetak Date: Sat, 17 Feb 2024 02:32:47 +0900 Subject: [PATCH 21/23] modified node-wot version to 0.8.12 --- package-lock.json | 526 ++++++++++++++++++++++------------------------ package.json | 19 +- 2 files changed, 265 insertions(+), 280 deletions(-) diff --git a/package-lock.json b/package-lock.json index 56d5b1c..1cda7cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,21 +1,21 @@ { "name": "node-red-contrib-web-of-things", - "version": "2.0.0-beta.5", + "version": "2.0.0-beta.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "node-red-contrib-web-of-things", - "version": "2.0.0-beta.5", + "version": "2.0.0-beta.6", "license": "MIT", "dependencies": { - "@node-wot/binding-coap": "^0.8.10", - "@node-wot/binding-http": "^0.8.10", - "@node-wot/binding-modbus": "^0.8.10", - "@node-wot/binding-mqtt": "^0.8.10", - "@node-wot/binding-opcua": "^0.8.10", - "@node-wot/binding-websockets": "^0.8.10", - "@node-wot/core": "^0.8.10" + "@node-wot/binding-coap": "^0.8.12", + "@node-wot/binding-http": "^0.8.12", + "@node-wot/binding-modbus": "^0.8.12", + "@node-wot/binding-mqtt": "^0.8.12", + "@node-wot/binding-opcua": "^0.8.12", + "@node-wot/binding-websockets": "^0.8.12", + "@node-wot/core": "^0.8.12" }, "devDependencies": { "fs-extra": "^11.2.0", @@ -26,9 +26,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.7.tgz", - "integrity": "sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -42,12 +42,12 @@ "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" }, "node_modules/@node-wot/binding-coap": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@node-wot/binding-coap/-/binding-coap-0.8.11.tgz", - "integrity": "sha512-mbn1vkMZ05a1YWLqRZPWQi/ihbGJW/V8dud9eW36nz8TJAqeKRbYUYLao1JDCUFLWTz5V1Rc5dzGqOeghibu4w==", + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@node-wot/binding-coap/-/binding-coap-0.8.12.tgz", + "integrity": "sha512-UMOO1SWxeOE2Ek3TpWChsOUp+9vVttF2GVWEML2x3BlMPNgBuc8M9gEzze1hSzuFUp7XHQhdfATUJhGtTYWW1g==", "dependencies": { - "@node-wot/core": "0.8.11", - "@node-wot/td-tools": "0.8.11", + "@node-wot/core": "0.8.12", + "@node-wot/td-tools": "0.8.12", "@types/node": "16.18.35", "coap": "^1.3.0", "multicast-dns": "^7.2.5", @@ -58,12 +58,12 @@ } }, "node_modules/@node-wot/binding-http": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@node-wot/binding-http/-/binding-http-0.8.11.tgz", - "integrity": "sha512-Ixdyv0vQtzmZKMAP7hURl60OoI19sIDAjx4zFiK+YUXaafz45BI9ZBOZyWt42xk7TM9+BCeLii+Dqxi0CqYdJg==", + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@node-wot/binding-http/-/binding-http-0.8.12.tgz", + "integrity": "sha512-hlSLm/DtA4QpD0OEv2JLQJku1wPbWXc+ufnLtQa7FrCqYd2LM4tr/1aqiAsgVFx+fTeM8mZ48Lf9CbheMIc5vg==", "dependencies": { - "@node-wot/core": "0.8.11", - "@node-wot/td-tools": "0.8.11", + "@node-wot/core": "0.8.12", + "@node-wot/td-tools": "0.8.12", "@types/eventsource": "1.1.10", "accept-language-parser": "1.5.0", "basic-auth": "2.0.1", @@ -77,36 +77,36 @@ } }, "node_modules/@node-wot/binding-modbus": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@node-wot/binding-modbus/-/binding-modbus-0.8.11.tgz", - "integrity": "sha512-4a3oLEGn1BDudsm5XPdwoIRqLDltzzkWBCsctgSaKEvcwiCII74IGFxGQRt86FoiKNvXSQXO0gVKA/+Ey1KE1A==", + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@node-wot/binding-modbus/-/binding-modbus-0.8.12.tgz", + "integrity": "sha512-XpgOhpJDKWHLqWLeQB0cBxi35sX3sJVa92mTt/24WlmOxwmDQn+KNaqMUmsovS4/jmWaPRPCVO/3ysAF0KYYAQ==", "dependencies": { - "@node-wot/core": "0.8.11", - "@node-wot/td-tools": "0.8.11", + "@node-wot/core": "0.8.12", + "@node-wot/td-tools": "0.8.12", "modbus-serial": "8.0.3", "rxjs": "5.5.11", "wot-typescript-definitions": "0.8.0-SNAPSHOT.29" } }, "node_modules/@node-wot/binding-mqtt": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@node-wot/binding-mqtt/-/binding-mqtt-0.8.11.tgz", - "integrity": "sha512-dTPlwk48bs/6ZaLDt3SZsOD7gguXIu0Y3/LWgcIcELDPwsnQuiX+V0VCParzk4AClqE7I7HXjrnUgMKN8WGYkw==", + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@node-wot/binding-mqtt/-/binding-mqtt-0.8.12.tgz", + "integrity": "sha512-0UlFbENx4Y6YMji83p/e/o4oVKyYHeh46oaVEvGnToZPLzd45tjly5Cx78vhzbdKUtXTVen3LmfcXNp5c3SLaQ==", "dependencies": { - "@node-wot/core": "0.8.11", - "@node-wot/td-tools": "0.8.11", + "@node-wot/core": "0.8.12", + "@node-wot/td-tools": "0.8.12", "aedes": "^0.46.2", "mqtt": "^5.3.2", "rxjs": "5.5.11" } }, "node_modules/@node-wot/binding-opcua": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@node-wot/binding-opcua/-/binding-opcua-0.8.11.tgz", - "integrity": "sha512-1EAjnrfTs/jM/AQ+ZDgGm1teqHWBEGcN7kuTiIqzQD2Efu2qECW2hzvvtWBP/9AeqA1fqQH/Wmib+pTcECosxg==", + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@node-wot/binding-opcua/-/binding-opcua-0.8.12.tgz", + "integrity": "sha512-EyuNrPR1ku3HVBkyxfE7lrUJMpZ0ALszNF243fcmY2httJiKvHMU+piKtBQnbF6aBZc/4YO5MDOnESVjgY5T8A==", "dependencies": { - "@node-wot/core": "0.8.11", - "@node-wot/td-tools": "0.8.11", + "@node-wot/core": "0.8.12", + "@node-wot/td-tools": "0.8.12", "ajv": "^8.11.0", "ajv-formats": "^2.1.1", "node-opcua": "2.113.0", @@ -136,23 +136,23 @@ } }, "node_modules/@node-wot/binding-websockets": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@node-wot/binding-websockets/-/binding-websockets-0.8.11.tgz", - "integrity": "sha512-aEvVH+DG7TYQyuLE6P1++NnDCsvhb//9VFon4ibEQrIb3wD4vsleWUUr8sjVechwW4mTlNKjeSuzd7DBWid8JQ==", + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@node-wot/binding-websockets/-/binding-websockets-0.8.12.tgz", + "integrity": "sha512-fjMRALs9uwXISY1acNTN0oGx0snY4DbCwVTkagKxs3wPCaENEtyFWauJOja5jYHWnyY4Tej8noeVsdZ2Ws4oVA==", "dependencies": { - "@node-wot/binding-http": "0.8.11", - "@node-wot/core": "0.8.11", - "@node-wot/td-tools": "0.8.11", + "@node-wot/binding-http": "0.8.12", + "@node-wot/core": "0.8.12", + "@node-wot/td-tools": "0.8.12", "slugify": "^1.4.5", "ws": "^7.5.4" } }, "node_modules/@node-wot/core": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@node-wot/core/-/core-0.8.11.tgz", - "integrity": "sha512-MaJi5h3vvlyaRIp38L1vTyTUQOBPyLrQQN9VZxssG1q2IRf7Mk+iv72RchqrILGryNubK2O+SMb+fKJl2QggQQ==", + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@node-wot/core/-/core-0.8.12.tgz", + "integrity": "sha512-TF2gswWzem8HCunVz4vS1so6WA6FHGDqlhI+TcgHybgDeo7Uance22KWPKzTwB4UL90MItA+kUuloXpOmuv4Gw==", "dependencies": { - "@node-wot/td-tools": "0.8.11", + "@node-wot/td-tools": "0.8.12", "@petamoriken/float16": "^3.1.1", "ajv": "^8.11.0", "cbor": "^8.1.0", @@ -163,9 +163,9 @@ } }, "node_modules/@node-wot/td-tools": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@node-wot/td-tools/-/td-tools-0.8.11.tgz", - "integrity": "sha512-fyHjLn6lDT0nI1pn15o+AwiL+n21Ayw523N2NUXawKQDxdxLbbhZjUGwLnMcQWVynFIVBdgeNgsicHsruBnh1A==", + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@node-wot/td-tools/-/td-tools-0.8.12.tgz", + "integrity": "sha512-uqH4MEWCkB4V4/5y6gzbid3OCBR9/a6+VBMXxLt9F74YpF5K9KOhHM3VOGCpSlaIfK7bif1vS4RbzRIdN9viYA==", "dependencies": { "ajv": "^8.11.0", "debug": "^4.3.4", @@ -305,24 +305,24 @@ } }, "node_modules/@peculiar/webcrypto": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.4.3.tgz", - "integrity": "sha512-VtaY4spKTdN5LjJ04im/d/joXuvLbQdgy5Z4DXF4MFZhQ+MTrejbNMkfZBp1Bs3O5+bFqnJgyGdPuZQflvIa5A==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.4.5.tgz", + "integrity": "sha512-oDk93QCDGdxFRM8382Zdminzs44dg3M2+E5Np+JWkpqLDyJC9DviMh8F8mEJkYuUcUOGA5jHO5AJJ10MFWdbZw==", "dependencies": { - "@peculiar/asn1-schema": "^2.3.6", + "@peculiar/asn1-schema": "^2.3.8", "@peculiar/json-schema": "^1.1.12", - "pvtsutils": "^1.3.2", - "tslib": "^2.5.0", - "webcrypto-core": "^1.7.7" + "pvtsutils": "^1.3.5", + "tslib": "^2.6.2", + "webcrypto-core": "^1.7.8" }, "engines": { "node": ">=10.12.0" } }, "node_modules/@peculiar/x509": { - "version": "1.9.6", - "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.9.6.tgz", - "integrity": "sha512-BQhsxZa8SMJ8rwKJMb6VrdZk3XXE/5ab+JRr9psxHI9dw9gZrR3BsWrL3EgLoxrqOd2nP/mWVSSJGlA76aAbRw==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.9.7.tgz", + "integrity": "sha512-O+fR1ge6U8upO52q5b3d4tF4SxUdK4IQ0y++Z/Wlqq+ySZUf+deHnbMlDB1YZsIQ/DXU0i5M7Y1DyF5kwpXouQ==", "dependencies": { "@peculiar/asn1-cms": "^2.3.8", "@peculiar/asn1-csr": "^2.3.8", @@ -630,15 +630,6 @@ "readable-stream": "^3.4.0" } }, - "node_modules/@types/aws-iot-device-sdk/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/@types/aws-iot-device-sdk/node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -671,25 +662,6 @@ "minimist": "^1.1.0" } }, - "node_modules/@types/aws-iot-device-sdk/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@types/aws-iot-device-sdk/node_modules/help-me": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/help-me/-/help-me-3.0.0.tgz", @@ -699,17 +671,6 @@ "readable-stream": "^3.6.0" } }, - "node_modules/@types/aws-iot-device-sdk/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@types/aws-iot-device-sdk/node_modules/mqtt": { "version": "4.3.8", "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.3.8.tgz", @@ -761,9 +722,9 @@ } }, "node_modules/@types/dns-packet": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/@types/dns-packet/-/dns-packet-5.6.4.tgz", - "integrity": "sha512-R0ORTvCCeujG+upKfV4JlvozKLdQWlpsducXGd1L6ezBChwpjSj9K84F+KoMDsZQ9RhOLTR1hnNrwJHWagY24g==", + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/@types/dns-packet/-/dns-packet-5.6.5.tgz", + "integrity": "sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==", "dependencies": { "@types/node": "*" } @@ -833,9 +794,9 @@ "integrity": "sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==" }, "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==" + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.7.tgz", + "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==" }, "node_modules/@types/sshpk": { "version": "1.17.4", @@ -1137,9 +1098,9 @@ "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", + "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", "engines": { "node": ">= 0.4" }, @@ -1229,15 +1190,25 @@ } }, "node_modules/bl": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/bl/-/bl-6.0.10.tgz", - "integrity": "sha512-F14DFhDZfxtVm2FY0k9kG2lWAwzZkO9+jX3Ytuoy/V0E1/5LBuBzzQHXAjqpxXEDIpmTPZZf5GVIGPQcLxFpaA==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/bl/-/bl-6.0.11.tgz", + "integrity": "sha512-Ok/NWrEA0mlEEbWzckkZVLq6Nv1m2xZ+i9Jq5hZ9Ph/YEcP5dExqls9wUzpluhQRPzdeT8oZNOXAytta6YN8pQ==", "dependencies": { + "@types/readable-stream": "^4.0.0", "buffer": "^6.0.3", "inherits": "^2.0.4", "readable-stream": "^4.2.0" } }, + "node_modules/bl/node_modules/@types/readable-stream": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.10.tgz", + "integrity": "sha512-AbUKBjcC8SHmImNi4yK2bbjogQlkFSg7shZCcicxPQapniOlajG8GCc39lvXzCWX4lLRRs7DM3VAeSlqmEVZUA==", + "dependencies": { + "@types/node": "*", + "safe-buffer": "~5.1.1" + } + }, "node_modules/bl/node_modules/readable-stream": { "version": "4.5.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", @@ -1254,11 +1225,12 @@ } }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/braces": { @@ -1331,13 +1303,18 @@ "integrity": "sha512-ovBpjmsgd/teRmgcPh23d4gJvxDoXtAzEL9xTfMU8Yc2kqCDb7L9jAG0XHl1nzuGl+h3ebCIF1i62UFyA9V/2Q==" }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1383,15 +1360,9 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -1404,6 +1375,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -1674,16 +1648,19 @@ } }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { @@ -1785,10 +1762,29 @@ "node": ">=6" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } @@ -1844,15 +1840,15 @@ } }, "node_modules/fast-unique-numbers": { - "version": "8.0.12", - "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-8.0.12.tgz", - "integrity": "sha512-Z4AJueNDnuC/sLxeQqrHP4zgqcBIeQQLbQ0hEx1a7m6Wf7ERrdAyR7CkGfoEFWm9Qla7dpLt0eWPyiO18gqj0A==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-9.0.0.tgz", + "integrity": "sha512-lgIjiflW23W7qgagregmo5FFzM+m4/dWaDUVneRi2AV7o2k5npggeEX7srSKlYfJU9fKXvQV2Gzk3272fJT65w==", "dependencies": { - "@babel/runtime": "^7.23.5", + "@babel/runtime": "^7.23.9", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.1.0" + "node": ">=18.2.0" } }, "node_modules/fastfall": { @@ -2034,15 +2030,19 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2061,18 +2061,19 @@ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" }, "node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=12" + "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -2114,11 +2115,11 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2147,11 +2148,11 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -2167,9 +2168,9 @@ "optional": true }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", "dependencies": { "function-bind": "^1.1.2" }, @@ -2178,13 +2179,9 @@ } }, "node_modules/help-me": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/help-me/-/help-me-4.2.0.tgz", - "integrity": "sha512-TAOnTB8Tz5Dw8penUuzHVrKNKlCIbwwbHnXraNJxPwf8LRtE2HlM84RYuezMFcwOJmoYOCWVDyJ8TQGxn9PgxA==", - "dependencies": { - "glob": "^8.0.0", - "readable-stream": "^3.6.0" - } + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", + "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==" }, "node_modules/hexy": { "version": "0.3.5", @@ -2206,14 +2203,38 @@ } }, "node_modules/hyperid": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/hyperid/-/hyperid-3.1.1.tgz", - "integrity": "sha512-RveV33kIksycSf7HLkq1sHB5wW0OwuX8ot8MYnY++gaaPXGFfKpBncHrAWxdpuEeRlazUMGWefwP1w6o6GaumA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/hyperid/-/hyperid-3.2.0.tgz", + "integrity": "sha512-PdTtDo+Rmza9nEhTunaDSUKwbC69TIzLEpZUwiB6f+0oqmY0UPfhyHCPt6K1NQ4WFv5yJBTG5vELztVWP+nEVQ==", "dependencies": { + "buffer": "^5.2.1", "uuid": "^8.3.2", "uuid-parse": "^1.1.0" } }, + "node_modules/hyperid/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/hyperid/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -2382,11 +2403,11 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -2511,14 +2532,14 @@ } }, "node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=10" + "node": "*" } }, "node_modules/minimist": { @@ -2567,16 +2588,16 @@ } }, "node_modules/mqtt": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-5.3.4.tgz", - "integrity": "sha512-nyhr2bnFtyiv68jV3yfR6eQtGcGs/jr2l3ETKXYc0amttsasXa1KgvETHRNRjfeDt/yc68IqoEjFzKkHpoQUPQ==", + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-5.3.5.tgz", + "integrity": "sha512-xd7qt/LEM721U6yHQcqjlaAKXL1Fsqf/MXq6C2WPi/6OXK2jdSzL1eZ7ZUgjea7IY2yFLRWD5LNdT1mL0arPoA==", "dependencies": { "@types/readable-stream": "^4.0.5", "@types/ws": "^8.5.9", "commist": "^3.2.0", "concat-stream": "^2.0.0", "debug": "^4.3.4", - "help-me": "^4.2.0", + "help-me": "^5.0.0", "lru-cache": "^10.0.1", "minimist": "^1.2.8", "mqtt": "^5.2.0", @@ -2651,9 +2672,9 @@ } }, "node_modules/mqtt/node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "engines": { "node": "14 || >=16.14" } @@ -4315,9 +4336,9 @@ } }, "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==" }, "node_modules/rimraf": { "version": "3.0.2", @@ -4333,45 +4354,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/rxjs": { "version": "5.5.11", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", @@ -4402,9 +4384,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -4456,14 +4438,16 @@ "optional": true }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -4570,9 +4554,9 @@ } }, "node_modules/stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" }, "node_modules/strict-uri-encode": { "version": "2.0.0", @@ -4920,15 +4904,15 @@ } }, "node_modules/webcrypto-core": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.7.7.tgz", - "integrity": "sha512-7FjigXNsBfopEj+5DV2nhNpfic2vumtjjgPmeDKk45z+MJwXKKfhPB7118Pfzrmh4jqOMST6Ch37iPAHoImg5g==", + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.7.8.tgz", + "integrity": "sha512-eBR98r9nQXTqXt/yDRtInszPMjTaSAMJAFDg2AHsgrnczawT1asx9YNBX6k5p+MekbPF4+s/UJJrr88zsTqkSg==", "dependencies": { - "@peculiar/asn1-schema": "^2.3.6", + "@peculiar/asn1-schema": "^2.3.8", "@peculiar/json-schema": "^1.1.12", "asn1js": "^3.0.1", - "pvtsutils": "^1.3.2", - "tslib": "^2.4.0" + "pvtsutils": "^1.3.5", + "tslib": "^2.6.2" } }, "node_modules/webidl-conversions": { @@ -4966,15 +4950,15 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -4993,33 +4977,33 @@ } }, "node_modules/worker-timers": { - "version": "7.0.80", - "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-7.0.80.tgz", - "integrity": "sha512-bYSAPNVR0Nrm7hTM3hQOxM3x+D9dXFG6kZ0BBqFyRu0BUGC5+DLLK5Sx281hCaNzOGMNcUMEaoeErx3Yuf7XIw==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-7.1.2.tgz", + "integrity": "sha512-iqhXt5+Mc3u2nHj3G/w/E9pXqhlueniA2NlyelB/MQSHQuuW2fmmZGkveAv6yi4SSZvrpbveBBlqPSZ0MDCLww==", "dependencies": { - "@babel/runtime": "^7.23.6", + "@babel/runtime": "^7.23.9", "tslib": "^2.6.2", - "worker-timers-broker": "^6.0.100", - "worker-timers-worker": "^7.0.64" + "worker-timers-broker": "^6.1.2", + "worker-timers-worker": "^7.0.66" } }, "node_modules/worker-timers-broker": { - "version": "6.0.100", - "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-6.0.100.tgz", - "integrity": "sha512-sXF1NpuT+FlJvONSbdZ6wNB15oNGg/P6PvCZDMHWmI6s7bHEb0zQ7cTnk9k+96/3pd8SpbXFuM0/HcHVc2alDQ==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-6.1.2.tgz", + "integrity": "sha512-slFupigW5vtkGJ1VBCxYPwXFFRmvfioh02bCltBhbMkt3fFnkAbKBCg61pNTetlD0RAsP09mqx/FB0f4UMoHNw==", "dependencies": { - "@babel/runtime": "^7.23.6", - "fast-unique-numbers": "^8.0.12", + "@babel/runtime": "^7.23.9", + "fast-unique-numbers": "^9.0.0", "tslib": "^2.6.2", - "worker-timers-worker": "^7.0.64" + "worker-timers-worker": "^7.0.66" } }, "node_modules/worker-timers-worker": { - "version": "7.0.64", - "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-7.0.64.tgz", - "integrity": "sha512-bzBO7rVibSYFKu5NBYfjKBKHujaA/AJzJTuEEqaOGfzcTdJv15raDuGhtDoMjcNPvt3IylfLph6AK92kuifnXA==", + "version": "7.0.66", + "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-7.0.66.tgz", + "integrity": "sha512-VCLa0H5K9fE2DVI/9r5zDuFrMQIpNL3UD/h4Ui49fIiRBTgv1Sqe0RM12brr83anBsm103aUQkvKvCBL+KpNtg==", "dependencies": { - "@babel/runtime": "^7.23.6", + "@babel/runtime": "^7.23.9", "tslib": "^2.6.2" } }, diff --git a/package.json b/package.json index b12ac5f..a664167 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-red-contrib-web-of-things", - "version": "2.0.0-beta.5", + "version": "2.0.0-beta.6", "description": "Web of Things node for node-RED.", "author": "hassib.belhaj_hassine@siemens.com", "contributors": [ @@ -38,16 +38,17 @@ "build": "npm run copy:src2dist && tsc", "copy:src2dist": "node -e \"require('fs-extra').copySync('./src', './dist')\"", "publish": "npm publish --access=public", - "publish:beta": "npm publish --access=public --tag=beta" + "publish:beta": "npm publish --access=public --tag=beta", + "test": "mocha --require ts-node/register --extension ts" }, "dependencies": { - "@node-wot/binding-coap": "^0.8.10", - "@node-wot/binding-http": "^0.8.10", - "@node-wot/binding-modbus": "^0.8.10", - "@node-wot/binding-mqtt": "^0.8.10", - "@node-wot/binding-opcua": "^0.8.10", - "@node-wot/binding-websockets": "^0.8.10", - "@node-wot/core": "^0.8.10" + "@node-wot/binding-coap": "^0.8.12", + "@node-wot/binding-http": "^0.8.12", + "@node-wot/binding-modbus": "^0.8.12", + "@node-wot/binding-mqtt": "^0.8.12", + "@node-wot/binding-opcua": "^0.8.12", + "@node-wot/binding-websockets": "^0.8.12", + "@node-wot/core": "^0.8.12" }, "devDependencies": { "fs-extra": "^11.2.0", From 3eac14267a1190fa0f1a4b8e5ddf810930fc735a Mon Sep 17 00:00:00 2001 From: hidetak Date: Sat, 17 Feb 2024 02:44:35 +0900 Subject: [PATCH 22/23] modified repository and homepage url in package.json --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a664167..6fb3e6a 100644 --- a/package.json +++ b/package.json @@ -17,9 +17,9 @@ }, "repository": { "type": "git", - "url": "https://github.com/hidetak/node-red-contrib-web-of-things" + "url": "https://github.com/thingweb/node-red-contrib-web-of-things" }, - "homepage": "https://github.com/hidetak/node-red-contrib-web-of-things/blob/master/README.md", + "homepage": "https://github.com/thingweb/node-red-contrib-web-of-things/blob/master/README.md", "node-red": { "nodes": { "wot-thing": "dist/wot-thing.js", From cb53a83ae4023e764d7ba22ae560f65f7b5ab028 Mon Sep 17 00:00:00 2001 From: Ege Korkan Date: Fri, 16 Feb 2024 22:51:17 +0100 Subject: [PATCH 23/23] fix thing title and minor english issues --- README.md | 36 ++++++++++------------ src/locales/en-US/wot-server-action.html | 2 +- src/locales/en-US/wot-server-config.html | 2 +- src/locales/en-US/wot-server-event.html | 2 +- src/locales/en-US/wot-server-property.html | 2 +- src/locales/en-US/wot-thing-config.html | 6 ++-- src/locales/en-US/wot-thing-config.json | 2 +- src/wot-server-config.ts | 4 +-- 8 files changed, 27 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index d256c0f..95ea133 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,12 @@ A [Node-RED](https://nodered.org/) package of nodes for the [Web of Things](https://www.w3.org/WoT/). Can be installed from the Node-RED palette manager directly or via npm (see [the npm package](https://www.npmjs.com/package/node-red-contrib-web-of-things)). -The package provides nodes that can communicate with any HTTP/HTTPS, WebSocket, CoAP/CoAPS, MQTT, OPC UA and Modbus device based on its [W3C WoT Thing Description](https://www.w3.org/TR/wot-thing-description/). - -The package is build upon [node-wot](https://github.com/eclipse/thingweb.node-wot) runtime environment. +The package provides nodes that can communicate with any HTTP/HTTPS, WebSocket, CoAP/CoAPS, MQTT, OPC UA, and Modbus device based on its [W3C WoT Thing Description](https://www.w3.org/TR/wot-thing-description/). +The package is built upon [node-wot](https://github.com/eclipse-thingweb/node-wot) runtime environment. ## Provided Nodes -After installation the package adds 8 different nodes at the Node-RED palette, all together scoped under "Web of Things" title. +After installation, the package adds 8 different nodes at the Node-RED palette, all together scoped under the __Web of Things__ title. Those nodes are as follows and needed to interact with different interaction affordances of a Thing: 1) Read Property node; @@ -29,7 +28,7 @@ Those nodes are as follows and needed to interact with different interaction aff In order to consume a Thing and interact with it, drag and drop one of the interaction nodes to a flow. Then double click on that node. -Inside the opened window click the pencil icon next to "Add new consumed-thing..." dropdown. +Inside the opened window click the pencil icon next to _Add new consumed-thing_ dropdown. ![Add new consumed Thing](screenshots/add-thing.png) @@ -46,7 +45,7 @@ Or you can leave them all as they are. Anyway, this can be changed at any time. If a Thing needs basic authentication (i.e. using username and password) for any of its interaction affordances, you can enable that in the respective checkbox. -**Note:** Only basic type of authentication is currently supported by this package. +**Note:** Only basic authentication is currently supported by this package. If you enable security, the nodes will automatically infer whether to use authentication for this particular affordance or not based on the provided Thing Description. Finally, click on the red "Add" button on the top right corner. @@ -54,13 +53,12 @@ Finally, click on the red "Add" button on the top right corner. Now, for all WoT nodes you add to a flow, you will see all the respective interaction affordances populated from the Thing Description. You can also add more Things and choose a particular one for any node you add. - -In order to see a fetched property value you can wire it with the "debug" node of Node-RED, and see all the values inside the "Debug messages" tab of Node-RED. -In order to write to a property, wire an "inject" node with the "Write Property" node. +To see a fetched property value you can wire it with the "debug" node of Node-RED, and see all the values inside the "Debug messages" tab of Node-RED. +To write to a property, wire an "inject" node with the "Write Property" node. In the "inject" node, select JSON format as payload and plug in your value. To send an input for an action you can also wire it with the "inject" node as explained above. -**Tip:** In order to invoke an action that does not require any input, wire it with an empty "inject" node. +**Tip:** To invoke an action that does not require any input, wire it with an empty "inject" node. Properties and Actions also support uriVariables. They can be specified inside "Read Property"/"Write Property"/"Invoke Action" node properties. @@ -79,12 +77,12 @@ When you double-click on that node, a property screen appears. ![Property Screen](screenshots/server-property-settings.png) -On the properties screen, the `Server config` and `Thing config` must be configured. The roles of each configs are as follows: +On the properties screen, the `Server config` and `Thing config` must be configured. The roles of each config are as follows: * Server config: Set up the communication method between the client and the Thing. -* Thing config: Set the attributes of the Thing such as the Thing name. +* Thing config: Set the attributes of the Thing such as the Thing title. -By performing `Server config` and `Thing config` in the Server-Property, Server-Action, Server-Event nodes, you determine how to publish properties, actions, and events. +By performing `Server config` and `Thing config` in the Server-Property, Server-Action, and Server-Event nodes, you determine how to publish properties, actions, and events. If you create a new server config on the properties screen, the following screen will appear. @@ -100,11 +98,11 @@ If you create a new thing config on the properties screen, the following screen ![Thing Config Screen](screenshots/thing-config-settings.png) -Specify the Thing name. The Thing name will be included in the Thing Description. +Specify the Thing title. The Thing title will be included in the Thing Description. -Server config and Thing config can be shared across multiple Server-Property, Server-Action, Server-Event nodes. By sharing configs, you can publish one or more properties, actions, and events to the client as a single Thing. +Server config and Thing config can be shared across multiple Server-Property, Server-Action, and Server-Event nodes. By sharing configs, you can publish one or more properties, actions, and events to the client as a single Thing. -In addition to server config and Thing config, there are necessary settings for each Server-Property, Server-Action, Server-Event node. For the settings of each node, refer to the node help. Help can be viewed on the Node-RED editor's Help tab. +In addition to server config and Thing config, there are necessary settings for each Server-Property, Server-Action, and Server-Event node. For the settings of each node, refer to the node help. Help can be viewed on the Node-RED editor's Help tab. The Server-End node represents the end of a flow executed by a client request. Flows connected to the two output terminals of the Server-Property node (read/write requests) and the output terminal of the Server-Action node must end with the Server-End node. @@ -113,12 +111,12 @@ Here's an example of a flow: ![Server Flow Example](screenshots/server-flow-example.png) -The Thing Description required when the client uses a Thing is set in the thingDescriptions object of the global context. The member name is `::`. -If you want to check the Thing Description, open the Context Data tab of Node-RED editor and press the refresh icon of the Global context to display it. +The Thing Description required when the client uses a Thing is set in the thingDescriptions object of the global context. The member name is `::`. +If you want to check the Thing Description, open the Context Data tab of the Node-RED editor and press the refresh icon of the Global context to display it. ![Reference TD](screenshots/reference-td.png) -Currently, the supported binding types are http, coap, and mqtt. As shown in the table below, each of these types of bindings has its own available/unavailable functions. Available functions are denoted by `✓` and unavailable functions are denoted by `-`. +Currently, the supported binding types are HTTP, CoAP, and MQTT. As shown in the table below, each of these types of bindings has its own available/unavailable functions. Available functions are denoted by `✓` and unavailable functions are denoted by `-`. | |http|coap|mqtt| | :---: | :--- | :--- | :--- | diff --git a/src/locales/en-US/wot-server-action.html b/src/locales/en-US/wot-server-action.html index f9d18be..64b9107 100644 --- a/src/locales/en-US/wot-server-action.html +++ b/src/locales/en-US/wot-server-action.html @@ -39,7 +39,7 @@

    Details

    Argument destination: Specifies where to output the argument when the action call is received. -

    The Thing Description is stored in the thingDescriptions variable of the global context with the key of <Server Name>::<Thing Name>.

    +

    The Thing Description is stored in the thingDescriptions variable of the global context with the key of <Server Name>::<Thing Title>.

    You can check this in the Context Data tab of the Node-RED editor. Press the refresh button to refer to the latest Thing Description.

    This node uses eclipse-thingweb/node-wot for WoT implementation.

    diff --git a/src/locales/en-US/wot-server-config.html b/src/locales/en-US/wot-server-config.html index 620e161..3b466d8 100644 --- a/src/locales/en-US/wot-server-config.html +++ b/src/locales/en-US/wot-server-config.html @@ -1,7 +1,7 @@