diff --git a/package-lock.json b/package-lock.json index 7e817b4c..9b9772e6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,6 @@ "compression": "^1.7.4", "cookie-parser": "^1.4.5", "crypto-js": "^4.2.0", - "isolated-vm": "^4.6.0", "kafkajs": "^2.2.4", "lodash": "^4.17.20", "mqtt": "^4.3.7", @@ -4362,20 +4361,6 @@ } } }, - "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/dedent": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", @@ -4390,14 +4375,6 @@ } } }, - "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/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -4957,14 +4934,6 @@ "node": ">= 0.8.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/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", @@ -5367,11 +5336,6 @@ "node": ">= 0.6" } }, - "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": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -5516,11 +5480,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "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": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -5863,11 +5822,6 @@ "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/inquirer": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", @@ -6045,18 +5999,6 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, - "node_modules/isolated-vm": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/isolated-vm/-/isolated-vm-4.7.2.tgz", - "integrity": "sha512-JVEs5gzWObzZK5+OlBplCdYSpokMcdhLSs/xWYYxmYWVfOOFF4oZJsYh7E/FmfX8e7gMioXMpMMeEyX1afuKrg==", - "hasInstallScript": true, - "dependencies": { - "prebuild-install": "^7.1.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -7230,17 +7172,6 @@ "node": ">=6" } }, - "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/minimatch": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", @@ -7305,11 +7236,6 @@ "mkdirp": "bin/cmd.js" } }, - "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/moment": { "version": "2.30.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", @@ -7446,11 +7372,6 @@ "thenify-all": "^1.0.0" } }, - "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/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -7489,17 +7410,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-15.14.9.tgz", "integrity": "sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==" }, - "node_modules/node-abi": { - "version": "3.57.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.57.0.tgz", - "integrity": "sha512-Dp+A9JWxRaKuHP35H77I4kCKesDy5HUDEmScia2FyncMTOXASMyg251F5PhFoDA5uqBrDDffiLpbqnrZmNXW+g==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", @@ -8209,31 +8119,6 @@ "node": ">=0.10.0" } }, - "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "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/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -8447,28 +8332,6 @@ "node": ">= 0.8" } }, - "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/rc/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/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -8882,49 +8745,6 @@ "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": "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/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -9266,37 +9086,6 @@ "node": ">=10" } }, - "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-fs/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/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/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -9663,17 +9452,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" }, - "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/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -13742,14 +13520,6 @@ "ms": "2.1.2" } }, - "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==", - "requires": { - "mimic-response": "^3.1.0" - } - }, "dedent": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", @@ -13757,11 +13527,6 @@ "dev": true, "requires": {} }, - "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==" - }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -14172,11 +13937,6 @@ "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true }, - "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==" - }, "expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", @@ -14482,11 +14242,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, - "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==" - }, "fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -14590,11 +14345,6 @@ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, - "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==" - }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -14838,11 +14588,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, "inquirer": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", @@ -14972,14 +14717,6 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, - "isolated-vm": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/isolated-vm/-/isolated-vm-4.7.2.tgz", - "integrity": "sha512-JVEs5gzWObzZK5+OlBplCdYSpokMcdhLSs/xWYYxmYWVfOOFF4oZJsYh7E/FmfX8e7gMioXMpMMeEyX1afuKrg==", - "requires": { - "prebuild-install": "^7.1.1" - } - }, "istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -15888,11 +15625,6 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "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==" - }, "minimatch": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", @@ -15938,11 +15670,6 @@ "minimist": "^1.2.6" } }, - "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==" - }, "moment": { "version": "2.30.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", @@ -16063,11 +15790,6 @@ "thenify-all": "^1.0.0" } }, - "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==" - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -16102,14 +15824,6 @@ } } }, - "node-abi": { - "version": "3.57.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.57.0.tgz", - "integrity": "sha512-Dp+A9JWxRaKuHP35H77I4kCKesDy5HUDEmScia2FyncMTOXASMyg251F5PhFoDA5uqBrDDffiLpbqnrZmNXW+g==", - "requires": { - "semver": "^7.3.5" - } - }, "node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", @@ -16631,25 +16345,6 @@ "xtend": "^4.0.0" } }, - "prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "requires": { - "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" - } - }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -16796,24 +16491,6 @@ "unpipe": "1.0.0" } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "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==" - } - } - }, "react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -17124,21 +16801,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, - "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==" - }, - "simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "requires": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -17395,36 +17057,6 @@ } } }, - "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==", - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - }, - "dependencies": { - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - } - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, "terser": { "version": "5.30.3", "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.3.tgz", @@ -17665,14 +17297,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", diff --git a/package.json b/package.json index d4cf4a59..fb69f124 100644 --- a/package.json +++ b/package.json @@ -29,9 +29,9 @@ "typeorm-e2e": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js --config ./ormconfig-e2e.json" }, "dependencies": { - "@nestjs/axios": "^3.0.2", "@chirpstack/chirpstack-api": "4.6.0", "@grpc/grpc-js": "^1.9.13", + "@nestjs/axios": "^3.0.2", "@nestjs/common": "^9.1.2", "@nestjs/config": "^2.2.0", "@nestjs/core": "^9.1.2", @@ -61,7 +61,6 @@ "compression": "^1.7.4", "cookie-parser": "^1.4.5", "crypto-js": "^4.2.0", - "isolated-vm": "^4.6.0", "kafkajs": "^2.2.4", "lodash": "^4.17.20", "mqtt": "^4.3.7", diff --git a/src/controllers/admin-controller/test-payload-decoder.controller.ts b/src/controllers/admin-controller/test-payload-decoder.controller.ts index 7359e41b..eded6e1a 100644 --- a/src/controllers/admin-controller/test-payload-decoder.controller.ts +++ b/src/controllers/admin-controller/test-payload-decoder.controller.ts @@ -14,7 +14,7 @@ export class TestPayloadDecoderController { }) async decode(@Body() body: TestPayloadDecoderDto): Promise { try { - return this.payloadDecoderExecutorService.allUntrustedCodeWithJsonStrings( + return await this.payloadDecoderExecutorService.allUntrustedCodeWithJsonStrings( body.code, body.iotDeviceJsonString, body.rawPayloadJsonString diff --git a/src/services/data-management/open-data-dk-sharing.service.ts b/src/services/data-management/open-data-dk-sharing.service.ts index 6f9f6bfd..1a79c1cb 100644 --- a/src/services/data-management/open-data-dk-sharing.service.ts +++ b/src/services/data-management/open-data-dk-sharing.service.ts @@ -3,12 +3,7 @@ import { Injectable, Logger } from "@nestjs/common"; import { InjectRepository } from "@nestjs/typeorm"; import { Repository } from "typeorm"; -import { - DCATRootObject, - Dataset, - ContactPoint, - Distribution, -} from "@dto/open-data-dk-dcat.dto"; +import { DCATRootObject, Dataset, ContactPoint, Distribution } from "@dto/open-data-dk-dcat.dto"; import { OpenDataDkDataset } from "@entities/open-data-dk-dataset.entity"; import { Organization } from "@entities/organization.entity"; import { PayloadDecoderExecutorService } from "./payload-decoder-executor.service"; @@ -29,9 +24,7 @@ export class OpenDataDkSharingService { private readonly BACKEND_BASE_URL = configuration()["backend"]["baseurl"]; private readonly logger = new Logger(OpenDataDkSharingService.name); - async getDecodedDataInDataset( - dataset: OpenDataDkDataset - ): Promise { + async getDecodedDataInDataset(dataset: OpenDataDkDataset): Promise { const rawData = await this.repository .createQueryBuilder("dataset") .innerJoinAndSelect("dataset.dataTarget", "dt") @@ -55,28 +48,26 @@ export class OpenDataDkSharingService { const results: any[] = []; rawData.dataTarget.connections.forEach(connection => { this.logger.debug(`Got connection(${connection.id})`); - connection.iotDevices.forEach(device => { - this.decodeDevice(device, connection, results); + connection.iotDevices.forEach(async device => { + await this.decodeDevice(device, connection, results); }); }); return results; } - private decodeDevice( + private async decodeDevice( device: IoTDevice, connection: IoTDevicePayloadDecoderDataTargetConnection, results: any[] ) { this.logger.debug(`Doing device ${device.name} / ${device.id}`); if (!device.latestReceivedMessage) { - this.logger.debug( - `Device ${device.name} / ${device.id} has no data ... skipping` - ); + this.logger.debug(`Device ${device.name} / ${device.id} has no data ... skipping`); return; } try { if (connection.payloadDecoder != null) { - const decoded = this.payloadDecoderExecutorService.callUntrustedCode( + const decoded = await this.payloadDecoderExecutorService.callUntrustedCode( connection.payloadDecoder.decodingFunction, device, device.latestReceivedMessage.rawData @@ -110,12 +101,8 @@ export class OpenDataDkSharingService { .getOne(); } - async getAllOpenDataDkSharesForOrganization( - organization: Organization - ): Promise { - return this.findDatasetWithRelations() - .where("org.id = :orgId", { orgId: organization.id }) - .getMany(); + async getAllOpenDataDkSharesForOrganization(organization: Organization): Promise { + return this.findDatasetWithRelations().where("org.id = :orgId", { orgId: organization.id }).getMany(); } private findDatasetWithRelations() { @@ -126,10 +113,7 @@ export class OpenDataDkSharingService { .innerJoin("app.belongsTo", "org"); } - private mapToDCAT( - organization: Organization, - datasets: OpenDataDkDataset[] - ): DCATRootObject { + private mapToDCAT(organization: Organization, datasets: OpenDataDkDataset[]): DCATRootObject { const root = new DCATRootObject(); root["@context"] = "https://project-open-data.cio.gov/v1.1/schema/catalog.jsonld"; root["@type"] = "dcat:Catalog"; @@ -181,10 +165,7 @@ export class OpenDataDkSharingService { } private generateUrl(organization: Organization, dataset: OpenDataDkDataset): string { - const controllerUrl = Reflect.getMetadata( - PATH_METADATA, - OpenDataDkSharingController - ); + const controllerUrl = Reflect.getMetadata(PATH_METADATA, OpenDataDkSharingController); const organizationId = organization.id; return `${this.BACKEND_BASE_URL}/api/v1/${controllerUrl}/${organizationId}/data/${dataset.id}`; } diff --git a/src/services/data-management/payload-decoder-executor.service.ts b/src/services/data-management/payload-decoder-executor.service.ts index 1ac5fd11..b475c4f4 100644 --- a/src/services/data-management/payload-decoder-executor.service.ts +++ b/src/services/data-management/payload-decoder-executor.service.ts @@ -1,40 +1,63 @@ import { IoTDevice } from "@entities/iot-device.entity"; import { Injectable, Logger } from "@nestjs/common"; -import { Copy, ExternalCopy, Isolate } from "isolated-vm"; +import * as worker_threads from "node:worker_threads"; @Injectable() export class PayloadDecoderExecutorService { private readonly logger = new Logger(PayloadDecoderExecutorService.name); - allUntrustedCodeWithJsonStrings(code: string, iotDeviceString: string, rawPayloadString: string): string { + async allUntrustedCodeWithJsonStrings( + code: string, + iotDeviceString: string, + rawPayloadString: string + ): Promise { const iotDevice = JSON.parse(iotDeviceString); const rawPayload = JSON.parse(rawPayloadString); const parsedCode = JSON.parse(code); - return this.callUntrustedCode(parsedCode, iotDevice, rawPayload); + return await this.callUntrustedCode(parsedCode, iotDevice, rawPayload); } - callUntrustedCode(code: string, iotDevice: IoTDevice | any, rawPayload: JSON): string { - const isolate = new Isolate(); - const context = isolate.createContextSync(); - const jail = context.global; - - jail.setSync("global", jail.derefInto()); - - //Isolated can not read atob. Therefore change to Buffer.From() - jail.setSync("atob", function (str: string): Copy { - return new ExternalCopy(Buffer.from(str, "base64").toString("binary")).copyInto(); + async callUntrustedCode(code: string, iotDevice: IoTDevice | any, rawPayload: JSON): Promise { + // Left as check of surrounding code for worker function + // const workerFunction = () => { + // const { parentPort, workerData } = require("worker_threads"); + // const innerPayload = workerData.innerPayload; + // const innerIotDevice = workerData.innerIotDevice; + // + // code; + // + // const result = decode(innerPayload, innerIotDevice); + // parentPort.postMessage(result); + // }; + + const workerCode = ` + const { parentPort, workerData } = require("worker_threads"); + const innerPayload = workerData.innerPayload; + const innerIotDevice = workerData.innerIotDevice; + + ${code} + + const result = decode(innerPayload, innerIotDevice); + parentPort.postMessage(result);`; + + const workerFunction = new Promise((resolve, reject) => { + const worker = new worker_threads.Worker(workerCode, { + eval: true, + workerData: { innerPayload: rawPayload, innerIotDevice: iotDevice }, + }); + + worker.on("message", message => { + resolve(message); + worker.terminate(); + }); + + worker.on("error", err => { + reject(err); + worker.terminate(); + }); }); - jail.setSync("innerIotDevice", new ExternalCopy(iotDevice).copyInto()); - jail.setSync("innerPayload", new ExternalCopy(rawPayload).copyInto()); - jail.setSync("reply", function (result: object) { - return new ExternalCopy(result); - }); - - const callingCode = `\n\nconst res = decode(innerPayload, innerIotDevice); \n reply(res);`; - const combinedCode = code + callingCode; - const result: ExternalCopy = context.evalSync(combinedCode); - return JSON.stringify(result.copy()); + return JSON.stringify(await workerFunction); } } diff --git a/src/services/data-management/payload-decoder-listener.service.ts b/src/services/data-management/payload-decoder-listener.service.ts index 4bf46e9f..20a3e07c 100644 --- a/src/services/data-management/payload-decoder-listener.service.ts +++ b/src/services/data-management/payload-decoder-listener.service.ts @@ -39,33 +39,20 @@ export class PayloadDecoderListenerService extends AbstractKafkaConsumer { // Fetch related objects const dto = payload.body as RawIoTDeviceRequestDto; - const connections = await this.connectionService.findAllByIoTDeviceIdWithDeviceModel( - dto.iotDeviceId - ); - this.logger.debug( - `Found ${connections.count} connections for IoT-Device ${dto.iotDeviceId}` - ); + const connections = await this.connectionService.findAllByIoTDeviceIdWithDeviceModel(dto.iotDeviceId); + this.logger.debug(`Found ${connections.count} connections for IoT-Device ${dto.iotDeviceId}`); // Find Unique payloadDecoders await this.doTransformationsAndSend(connections, dto); } - private async doTransformationsAndSend( - connections: ListAllConnectionsResponseDto, - dto: RawIoTDeviceRequestDto - ) { + private async doTransformationsAndSend(connections: ListAllConnectionsResponseDto, dto: RawIoTDeviceRequestDto) { const uniqueCombinations = _.uniqBy(connections.data, x => x.payloadDecoder?.id); for (const connection of uniqueCombinations) { try { - const iotDevice = connection.iotDevices.find( - x => x.id === dto.iotDeviceId - ); - - await this.decodeAndSendTransformed( - connection.payloadDecoder, - iotDevice, - dto.rawPayload - ); + const iotDevice = connection.iotDevices.find(x => x.id === dto.iotDeviceId); + + await this.decodeAndSendTransformed(connection.payloadDecoder, iotDevice, dto.rawPayload); } catch (err) { this.logger.error(err); } @@ -77,26 +64,14 @@ export class PayloadDecoderListenerService extends AbstractKafkaConsumer { relatedIoTDevice: IoTDevice, rawPayload: JSON ) { - const payloadToSend = await this.decodeIfNeeded( - payloadDecoder, - relatedIoTDevice, - rawPayload - ); + const payloadToSend = await this.decodeIfNeeded(payloadDecoder, relatedIoTDevice, rawPayload); // Add transformed request to Kafka - await this.sendTransformedRequest( - relatedIoTDevice, - payloadDecoder, - payloadToSend - ); + await this.sendTransformedRequest(relatedIoTDevice, payloadDecoder, payloadToSend); } - private async decodeIfNeeded( - payloadDecoder: PayloadDecoder, - relatedIoTDevice: IoTDevice, - rawPayload: JSON - ) { - let res; + private async decodeIfNeeded(payloadDecoder: PayloadDecoder, relatedIoTDevice: IoTDevice, rawPayload: JSON) { + let res: string; if (payloadDecoder != undefined) { this.logger.debug( `Decoding payload of IoT-Device ${relatedIoTDevice.id} with decoder ${payloadDecoder?.id}` @@ -108,17 +83,11 @@ export class PayloadDecoderListenerService extends AbstractKafkaConsumer { relatedIoTDevice.type === IoTDeviceType.LoRaWAN && payloadDecoder.decodingFunction.includes("lorawanSettings") ) { - localDevice = await this.chirpstackDeviceService.enrichLoRaWANDevice( - relatedIoTDevice - ); + localDevice = await this.chirpstackDeviceService.enrichLoRaWANDevice(relatedIoTDevice); } // Decode the payload - res = this.executor.callUntrustedCode( - payloadDecoder.decodingFunction, - localDevice, - rawPayload - ); + res = await this.executor.callUntrustedCode(payloadDecoder.decodingFunction, localDevice, rawPayload); this.logger.debug(`Decoded payload to: '${res}'`); } else { @@ -146,10 +115,7 @@ export class PayloadDecoderListenerService extends AbstractKafkaConsumer { topicName: KafkaTopic.TRANSFORMED_REQUEST, }; - const rawStatus = await this.kafkaService.sendMessage( - KafkaTopic.TRANSFORMED_REQUEST, - kafkapayload - ); + const rawStatus = await this.kafkaService.sendMessage(KafkaTopic.TRANSFORMED_REQUEST, kafkapayload); if (rawStatus) { const metadata = rawStatus as RecordMetadata[];