add Client Hints for browser detection #6899

Signed-off-by: si458 <simonsmith5521@gmail.com>

si458 committed Mar 23, 2025 at 15:02 UTC af8947e4163ac17c8658120c8803d4ee55b6a85f
5 files changed +356 -304
dependencies.txt
+2 -1
@@ -11,6 +11,7 @@
11 "minimist": "1.2.8",
12 "multiparty": "4.2.3",
13 "node-forge": "1.3.1",
14 - "ua-parser-js": "1.0.39",
14 + "ua-parser-js": "1.0.40",
15 + "ua-client-hints-js": "0.1.2",
16 "ws": "8.18.0",
17 "yauzl": "2.10.0"
\ No newline at end of file
meshcentral.js
+1 -1
@@ -4252,7 +4252,7 @@ function mainStart() {
4252
4253 // Build the list of required modules
4254 // NOTE: ALL MODULES MUST HAVE A VERSION NUMBER AND THE VERSION MUST MATCH THAT USED IN Dockerfile
4255 - var modules = ['archiver@7.0.1', 'body-parser@1.20.3', 'cbor@5.2.0', 'compression@1.7.5', 'cookie-session@2.1.0', 'express@4.21.2', 'express-handlebars@7.1.3', 'express-ws@5.0.2', 'ipcheck@0.1.0', 'minimist@1.2.8', 'multiparty@4.2.3', '@seald-io/nedb', 'node-forge@1.3.1', 'ua-parser-js@1.0.39', 'ws@8.18.0', 'yauzl@2.10.0'];
4255 + var modules = ['archiver@7.0.1', 'body-parser@1.20.3', 'cbor@5.2.0', 'compression@1.7.5', 'cookie-session@2.1.0', 'express@4.21.2', 'express-handlebars@7.1.3', 'express-ws@5.0.2', 'ipcheck@0.1.0', 'minimist@1.2.8', 'multiparty@4.2.3', '@seald-io/nedb', 'node-forge@1.3.1', 'ua-parser-js@1.0.40', 'ua-client-hints-js@0.1.2', 'ws@8.18.0', 'yauzl@2.10.0'];
4256 if (require('os').platform() == 'win32') { modules.push('node-windows@0.1.14'); modules.push('loadavg-windows@1.1.1'); if (sspi == true) { modules.push('node-sspi@0.2.10'); } } // Add Windows modules
4257 if (ldap == true) { modules.push('ldapauth-fork@5.0.5'); }
4258 if (ssh == true) { modules.push('ssh2@1.16.0'); }
package-lock.json
+324 -300
@@ -1,12 +1,12 @@
1 {
2 "name": "meshcentral",
3 - "version": "1.1.35",
3 + "version": "1.1.42",
4 "lockfileVersion": 3,
5 "requires": true,
6 "packages": {
7 "": {
8 "name": "meshcentral",
9 - "version": "1.1.35",
9 + "version": "1.1.42",
10 "license": "Apache-2.0",
11 "dependencies": {
12 "@seald-io/nedb": "4.0.4",
@@ -22,7 +22,8 @@
22 "minimist": "1.2.8",
23 "multiparty": "4.2.3",
24 "node-forge": "1.3.1",
25 - "ua-parser-js": "1.0.39",
25 + "ua-client-hints-js": "0.1.2",
26 + "ua-parser-js": "1.0.40",
27 "ws": "8.18.0",
28 "yauzl": "2.10.0"
29 },
@@ -33,6 +34,23 @@
34 "node": ">=16.0.0"
35 }
36 },
37 + "node_modules/@isaacs/cliui": {
38 + "version": "8.0.2",
39 + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
40 + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
41 + "license": "ISC",
42 + "dependencies": {
43 + "string-width": "^5.1.2",
44 + "string-width-cjs": "npm:string-width@^4.2.0",
45 + "strip-ansi": "^7.0.1",
46 + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
47 + "wrap-ansi": "^8.1.0",
48 + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
49 + },
50 + "engines": {
51 + "node": ">=12"
52 + }
53 + },
54 "node_modules/@pkgjs/parseargs": {
55 "version": "0.11.0",
56 "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
@@ -153,101 +171,6 @@
171 "node": ">= 14"
172 }
173 },
156 - "node_modules/archiver-utils/node_modules/lazystream": {
157 - "version": "1.0.1",
158 - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz",
159 - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
160 - "license": "MIT",
161 - "dependencies": {
162 - "readable-stream": "^2.0.5"
163 - },
164 - "engines": {
165 - "node": ">= 0.6.3"
166 - }
167 - },
168 - "node_modules/archiver-utils/node_modules/lazystream/node_modules/readable-stream": {
169 - "version": "2.3.8",
170 - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
171 - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
172 - "license": "MIT",
173 - "dependencies": {
174 - "core-util-is": "~1.0.0",
175 - "inherits": "~2.0.3",
176 - "isarray": "~1.0.0",
177 - "process-nextick-args": "~2.0.0",
178 - "safe-buffer": "~5.1.1",
179 - "string_decoder": "~1.1.1",
180 - "util-deprecate": "~1.0.1"
181 - }
182 - },
183 - "node_modules/archiver-utils/node_modules/lazystream/node_modules/string_decoder": {
184 - "version": "1.1.1",
185 - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
186 - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
187 - "license": "MIT",
188 - "dependencies": {
189 - "safe-buffer": "~5.1.0"
190 - }
191 - },
192 - "node_modules/archiver-utils/node_modules/readable-stream": {
193 - "version": "4.6.0",
194 - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.6.0.tgz",
195 - "integrity": "sha512-cbAdYt0VcnpN2Bekq7PU+k363ZRsPwJoEEJOEtSJQlJXzwaxt3FIo/uL+KeDSGIjJqtkwyge4KQgD2S2kd+CQw==",
196 - "license": "MIT",
197 - "dependencies": {
198 - "abort-controller": "^3.0.0",
199 - "buffer": "^6.0.3",
200 - "events": "^3.3.0",
201 - "process": "^0.11.10",
202 - "string_decoder": "^1.3.0"
203 - },
204 - "engines": {
205 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
206 - }
207 - },
208 - "node_modules/archiver-utils/node_modules/safe-buffer": {
209 - "version": "5.1.2",
210 - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
211 - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
212 - "license": "MIT"
213 - },
214 - "node_modules/archiver/node_modules/minimatch": {
215 - "version": "5.1.6",
216 - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
217 - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
218 - "license": "ISC",
219 - "dependencies": {
220 - "brace-expansion": "^2.0.1"
221 - },
222 - "engines": {
223 - "node": ">=10"
224 - }
225 - },
226 - "node_modules/archiver/node_modules/readable-stream": {
227 - "version": "4.6.0",
228 - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.6.0.tgz",
229 - "integrity": "sha512-cbAdYt0VcnpN2Bekq7PU+k363ZRsPwJoEEJOEtSJQlJXzwaxt3FIo/uL+KeDSGIjJqtkwyge4KQgD2S2kd+CQw==",
230 - "license": "MIT",
231 - "dependencies": {
232 - "abort-controller": "^3.0.0",
233 - "buffer": "^6.0.3",
234 - "events": "^3.3.0",
235 - "process": "^0.11.10",
236 - "string_decoder": "^1.3.0"
237 - },
238 - "engines": {
239 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
240 - }
241 - },
242 - "node_modules/archiver/node_modules/readdir-glob": {
243 - "version": "1.1.3",
244 - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz",
245 - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==",
246 - "license": "Apache-2.0",
247 - "dependencies": {
248 - "minimatch": "^5.1.0"
249 - }
250 - },
174 "node_modules/array-flatten": {
175 "version": "1.1.1",
176 "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
@@ -288,9 +211,9 @@
211 "license": "MIT"
212 },
213 "node_modules/bare-events": {
291 - "version": "2.5.0",
292 - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz",
293 - "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==",
214 + "version": "2.5.4",
215 + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz",
216 + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==",
217 "license": "Apache-2.0",
218 "optional": true
219 },
@@ -417,9 +340,9 @@
340 }
341 },
342 "node_modules/call-bind-apply-helpers": {
420 - "version": "1.0.1",
421 - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz",
422 - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==",
343 + "version": "1.0.2",
344 + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
345 + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
346 "license": "MIT",
347 "dependencies": {
348 "es-errors": "^1.3.0",
@@ -430,13 +353,13 @@
353 }
354 },
355 "node_modules/call-bound": {
433 - "version": "1.0.3",
434 - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz",
435 - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
356 + "version": "1.0.4",
357 + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
358 + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
359 "license": "MIT",
360 "dependencies": {
438 - "call-bind-apply-helpers": "^1.0.1",
439 - "get-intrinsic": "^1.2.6"
361 + "call-bind-apply-helpers": "^1.0.2",
362 + "get-intrinsic": "^1.3.0"
363 },
364 "engines": {
365 "node": ">= 0.4"
@@ -476,6 +399,22 @@
399 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
400 "license": "MIT"
401 },
402 + "node_modules/compress-commons": {
403 + "version": "6.0.2",
404 + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz",
405 + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==",
406 + "license": "MIT",
407 + "dependencies": {
408 + "crc-32": "^1.2.0",
409 + "crc32-stream": "^6.0.0",
410 + "is-stream": "^2.0.1",
411 + "normalize-path": "^3.0.0",
412 + "readable-stream": "^4.0.0"
413 + },
414 + "engines": {
415 + "node": ">= 14"
416 + }
417 + },
418 "node_modules/compressible": {
419 "version": "2.0.18",
420 "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@@ -616,22 +555,6 @@
555 "node": ">= 14"
556 }
557 },
619 - "node_modules/crc32-stream/node_modules/readable-stream": {
620 - "version": "4.6.0",
621 - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.6.0.tgz",
622 - "integrity": "sha512-cbAdYt0VcnpN2Bekq7PU+k363ZRsPwJoEEJOEtSJQlJXzwaxt3FIo/uL+KeDSGIjJqtkwyge4KQgD2S2kd+CQw==",
623 - "license": "MIT",
624 - "dependencies": {
625 - "abort-controller": "^3.0.0",
626 - "buffer": "^6.0.3",
627 - "events": "^3.3.0",
628 - "process": "^0.11.10",
629 - "string_decoder": "^1.3.0"
630 - },
631 - "engines": {
632 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
633 - }
634 - },
558 "node_modules/cross-spawn": {
559 "version": "7.0.6",
560 "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
@@ -751,9 +674,9 @@
674 }
675 },
676 "node_modules/es-object-atoms": {
754 - "version": "1.0.0",
755 - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
756 - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
677 + "version": "1.1.1",
678 + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
679 + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
680 "license": "MIT",
681 "dependencies": {
682 "es-errors": "^1.3.0"
@@ -925,35 +848,29 @@
848 }
849 },
850 "node_modules/for-each": {
928 - "version": "0.3.3",
929 - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
930 - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
851 + "version": "0.3.5",
852 + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
853 + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
854 "license": "MIT",
855 "dependencies": {
933 - "is-callable": "^1.1.3"
934 - }
935 - },
936 - "node_modules/foreground-child": {
937 - "version": "3.3.0",
938 - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
939 - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
940 - "license": "ISC",
941 - "dependencies": {
942 - "cross-spawn": "^7.0.0",
943 - "signal-exit": "^4.0.1"
856 + "is-callable": "^1.2.7"
857 },
858 "engines": {
946 - "node": ">=14"
859 + "node": ">= 0.4"
860 },
861 "funding": {
949 - "url": "https://github.com/sponsors/isaacs"
862 + "url": "https://github.com/sponsors/ljharb"
863 }
864 },
952 - "node_modules/foreground-child/node_modules/signal-exit": {
953 - "version": "4.1.0",
954 - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
955 - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
865 + "node_modules/foreground-child": {
866 + "version": "3.3.1",
867 + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
868 + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
869 "license": "ISC",
870 + "dependencies": {
871 + "cross-spawn": "^7.0.6",
872 + "signal-exit": "^4.0.1"
873 + },
874 "engines": {
875 "node": ">=14"
876 },
@@ -989,21 +906,21 @@
906 }
907 },
908 "node_modules/get-intrinsic": {
992 - "version": "1.2.6",
993 - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz",
994 - "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==",
909 + "version": "1.3.0",
910 + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
911 + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
912 "license": "MIT",
913 "dependencies": {
997 - "call-bind-apply-helpers": "^1.0.1",
998 - "dunder-proto": "^1.0.0",
914 + "call-bind-apply-helpers": "^1.0.2",
915 "es-define-property": "^1.0.1",
916 "es-errors": "^1.3.0",
1001 - "es-object-atoms": "^1.0.0",
917 + "es-object-atoms": "^1.1.1",
918 "function-bind": "^1.1.2",
919 + "get-proto": "^1.0.1",
920 "gopd": "^1.2.0",
921 "has-symbols": "^1.1.0",
922 "hasown": "^2.0.2",
1006 - "math-intrinsics": "^1.0.0"
923 + "math-intrinsics": "^1.1.0"
924 },
925 "engines": {
926 "node": ">= 0.4"
@@ -1012,6 +929,19 @@
929 "url": "https://github.com/sponsors/ljharb"
930 }
931 },
932 + "node_modules/get-proto": {
933 + "version": "1.0.1",
934 + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
935 + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
936 + "license": "MIT",
937 + "dependencies": {
938 + "dunder-proto": "^1.0.1",
939 + "es-object-atoms": "^1.0.0"
940 + },
941 + "engines": {
942 + "node": ">= 0.4"
943 + }
944 + },
945 "node_modules/glob": {
946 "version": "10.4.5",
947 "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
@@ -1235,12 +1165,33 @@
1165 }
1166 },
1167 "node_modules/is-generator-function": {
1238 - "version": "1.0.10",
1239 - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
1240 - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
1168 + "version": "1.1.0",
1169 + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz",
1170 + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==",
1171 + "license": "MIT",
1172 + "dependencies": {
1173 + "call-bound": "^1.0.3",
1174 + "get-proto": "^1.0.0",
1175 + "has-tostringtag": "^1.0.2",
1176 + "safe-regex-test": "^1.1.0"
1177 + },
1178 + "engines": {
1179 + "node": ">= 0.4"
1180 + },
1181 + "funding": {
1182 + "url": "https://github.com/sponsors/ljharb"
1183 + }
1184 + },
1185 + "node_modules/is-regex": {
1186 + "version": "1.2.1",
1187 + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
1188 + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
1189 "license": "MIT",
1190 "dependencies": {
1243 - "has-tostringtag": "^1.0.0"
1191 + "call-bound": "^1.0.2",
1192 + "gopd": "^1.2.0",
1193 + "has-tostringtag": "^1.0.2",
1194 + "hasown": "^2.0.2"
1195 },
1196 "engines": {
1197 "node": ">= 0.4"
@@ -1303,107 +1254,58 @@
1254 "@pkgjs/parseargs": "^0.11.0"
1255 }
1256 },
1306 - "node_modules/jackspeak/node_modules/@isaacs/cliui": {
1307 - "version": "8.0.2",
1308 - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
1309 - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
1310 - "license": "ISC",
1311 - "dependencies": {
1312 - "string-width": "^5.1.2",
1313 - "string-width-cjs": "npm:string-width@^4.2.0",
1314 - "strip-ansi": "^7.0.1",
1315 - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
1316 - "wrap-ansi": "^8.1.0",
1317 - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
1318 - },
1319 - "engines": {
1320 - "node": ">=12"
1321 - }
1322 - },
1323 - "node_modules/jackspeak/node_modules/ansi-regex": {
1324 - "version": "5.0.1",
1325 - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
1326 - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
1327 - "license": "MIT",
1328 - "engines": {
1329 - "node": ">=8"
1330 - }
1331 - },
1332 - "node_modules/jackspeak/node_modules/ansi-styles": {
1333 - "version": "4.3.0",
1334 - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
1335 - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
1257 + "node_modules/keygrip": {
1258 + "version": "1.1.0",
1259 + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz",
1260 + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==",
1261 "license": "MIT",
1262 "dependencies": {
1338 - "color-convert": "^2.0.1"
1263 + "tsscmp": "1.0.6"
1264 },
1265 "engines": {
1341 - "node": ">=8"
1342 - },
1343 - "funding": {
1344 - "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1266 + "node": ">= 0.6"
1267 }
1268 },
1347 - "node_modules/jackspeak/node_modules/emoji-regex": {
1348 - "version": "8.0.0",
1349 - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
1350 - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
1351 - "license": "MIT"
1352 - },
1353 - "node_modules/jackspeak/node_modules/wrap-ansi-cjs": {
1354 - "name": "wrap-ansi",
1355 - "version": "7.0.0",
1356 - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
1357 - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
1269 + "node_modules/lazystream": {
1270 + "version": "1.0.1",
1271 + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz",
1272 + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
1273 "license": "MIT",
1274 "dependencies": {
1360 - "ansi-styles": "^4.0.0",
1361 - "string-width": "^4.1.0",
1362 - "strip-ansi": "^6.0.0"
1275 + "readable-stream": "^2.0.5"
1276 },
1277 "engines": {
1365 - "node": ">=10"
1366 - },
1367 - "funding": {
1368 - "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
1278 + "node": ">= 0.6.3"
1279 }
1280 },
1371 - "node_modules/jackspeak/node_modules/wrap-ansi-cjs/node_modules/string-width": {
1372 - "version": "4.2.3",
1373 - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
1374 - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
1281 + "node_modules/lazystream/node_modules/readable-stream": {
1282 + "version": "2.3.8",
1283 + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
1284 + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
1285 "license": "MIT",
1286 "dependencies": {
1377 - "emoji-regex": "^8.0.0",
1378 - "is-fullwidth-code-point": "^3.0.0",
1379 - "strip-ansi": "^6.0.1"
1380 - },
1381 - "engines": {
1382 - "node": ">=8"
1287 + "core-util-is": "~1.0.0",
1288 + "inherits": "~2.0.3",
1289 + "isarray": "~1.0.0",
1290 + "process-nextick-args": "~2.0.0",
1291 + "safe-buffer": "~5.1.1",
1292 + "string_decoder": "~1.1.1",
1293 + "util-deprecate": "~1.0.1"
1294 }
1295 },
1385 - "node_modules/jackspeak/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
1386 - "version": "6.0.1",
1387 - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1388 - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1389 - "license": "MIT",
1390 - "dependencies": {
1391 - "ansi-regex": "^5.0.1"
1392 - },
1393 - "engines": {
1394 - "node": ">=8"
1395 - }
1296 + "node_modules/lazystream/node_modules/safe-buffer": {
1297 + "version": "5.1.2",
1298 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1299 + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1300 + "license": "MIT"
1301 },
1397 - "node_modules/keygrip": {
1398 - "version": "1.1.0",
1399 - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz",
1400 - "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==",
1302 + "node_modules/lazystream/node_modules/string_decoder": {
1303 + "version": "1.1.1",
1304 + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1305 + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1306 "license": "MIT",
1307 "dependencies": {
1403 - "tsscmp": "1.0.6"
1404 - },
1405 - "engines": {
1406 - "node": ">= 0.6"
1308 + "safe-buffer": "~5.1.0"
1309 }
1310 },
1311 "node_modules/lie": {
@@ -1485,9 +1387,9 @@
1387 }
1388 },
1389 "node_modules/mime-db": {
1488 - "version": "1.53.0",
1489 - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz",
1490 - "integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==",
1390 + "version": "1.54.0",
1391 + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
1392 + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
1393 "license": "MIT",
1394 "engines": {
1395 "node": ">= 0.6"
@@ -1644,9 +1546,9 @@
1546 }
1547 },
1548 "node_modules/object-inspect": {
1647 - "version": "1.13.3",
1648 - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz",
1649 - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==",
1549 + "version": "1.13.4",
1550 + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
1551 + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
1552 "license": "MIT",
1553 "engines": {
1554 "node": ">= 0.4"
@@ -1729,9 +1631,9 @@
1631 "license": "MIT"
1632 },
1633 "node_modules/possible-typed-array-names": {
1732 - "version": "1.0.0",
1733 - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
1734 - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
1634 + "version": "1.1.0",
1635 + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
1636 + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
1637 "license": "MIT",
1638 "engines": {
1639 "node": ">= 0.4"
@@ -1780,12 +1682,6 @@
1682 "url": "https://github.com/sponsors/ljharb"
1683 }
1684 },
1783 - "node_modules/queue-tick": {
1784 - "version": "1.0.1",
1785 - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz",
1786 - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==",
1787 - "license": "MIT"
1788 - },
1685 "node_modules/random-bytes": {
1686 "version": "1.0.0",
1687 "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
@@ -1819,6 +1715,43 @@
1715 "node": ">= 0.8"
1716 }
1717 },
1718 + "node_modules/readable-stream": {
1719 + "version": "4.7.0",
1720 + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz",
1721 + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==",
1722 + "license": "MIT",
1723 + "dependencies": {
1724 + "abort-controller": "^3.0.0",
1725 + "buffer": "^6.0.3",
1726 + "events": "^3.3.0",
1727 + "process": "^0.11.10",
1728 + "string_decoder": "^1.3.0"
1729 + },
1730 + "engines": {
1731 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
1732 + }
1733 + },
1734 + "node_modules/readdir-glob": {
1735 + "version": "1.1.3",
1736 + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz",
1737 + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==",
1738 + "license": "Apache-2.0",
1739 + "dependencies": {
1740 + "minimatch": "^5.1.0"
1741 + }
1742 + },
1743 + "node_modules/readdir-glob/node_modules/minimatch": {
1744 + "version": "5.1.6",
1745 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
1746 + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
1747 + "license": "ISC",
1748 + "dependencies": {
1749 + "brace-expansion": "^2.0.1"
1750 + },
1751 + "engines": {
1752 + "node": ">=10"
1753 + }
1754 + },
1755 "node_modules/safe-buffer": {
1756 "version": "5.2.1",
1757 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -1839,6 +1772,23 @@
1772 ],
1773 "license": "MIT"
1774 },
1775 + "node_modules/safe-regex-test": {
1776 + "version": "1.1.0",
1777 + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
1778 + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
1779 + "license": "MIT",
1780 + "dependencies": {
1781 + "call-bound": "^1.0.2",
1782 + "es-errors": "^1.3.0",
1783 + "is-regex": "^1.2.1"
1784 + },
1785 + "engines": {
1786 + "node": ">= 0.4"
1787 + },
1788 + "funding": {
1789 + "url": "https://github.com/sponsors/ljharb"
1790 + }
1791 + },
1792 "node_modules/safer-buffer": {
1793 "version": "2.1.2",
1794 "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
@@ -2015,6 +1965,18 @@
1965 "url": "https://github.com/sponsors/ljharb"
1966 }
1967 },
1968 + "node_modules/signal-exit": {
1969 + "version": "4.1.0",
1970 + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
1971 + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
1972 + "license": "ISC",
1973 + "engines": {
1974 + "node": ">=14"
1975 + },
1976 + "funding": {
1977 + "url": "https://github.com/sponsors/isaacs"
1978 + }
1979 + },
1980 "node_modules/source-map": {
1981 "version": "0.6.1",
1982 "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -2034,13 +1996,12 @@
1996 }
1997 },
1998 "node_modules/streamx": {
2037 - "version": "2.21.1",
2038 - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.21.1.tgz",
2039 - "integrity": "sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==",
1999 + "version": "2.22.0",
2000 + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz",
2001 + "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==",
2002 "license": "MIT",
2003 "dependencies": {
2004 "fast-fifo": "^1.3.2",
2043 - "queue-tick": "^1.0.1",
2005 "text-decoder": "^1.1.0"
2006 },
2007 "optionalDependencies": {
@@ -2203,10 +2164,30 @@
2164 "node": ">= 0.6"
2165 }
2166 },
2167 + "node_modules/ua-client-hints-js": {
2168 + "version": "0.1.2",
2169 + "resolved": "https://registry.npmjs.org/ua-client-hints-js/-/ua-client-hints-js-0.1.2.tgz",
2170 + "integrity": "sha512-cYqD5p9PPCsNYpBJRYcU7s5QuZS3pdWpskOJl+QE7elbOrFzctLs5H9ppH10v7Tk0Kholzo9VIyjoTlh0B8XXg==",
2171 + "funding": [
2172 + {
2173 + "type": "github",
2174 + "url": "https://github.com/sponsors/faisalman"
2175 + },
2176 + {
2177 + "type": "opencollective",
2178 + "url": "https://opencollective.com/ua-parser-js"
2179 + },
2180 + {
2181 + "type": "paypal",
2182 + "url": "https://paypal.me/faisalman"
2183 + }
2184 + ],
2185 + "license": "MIT"
2186 + },
2187 "node_modules/ua-parser-js": {
2207 - "version": "1.0.39",
2208 - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.39.tgz",
2209 - "integrity": "sha512-k24RCVWlEcjkdOxYmVJgeD/0a1TiSpqLg+ZalVGV9lsnr4yqu0w7tX/x2xX6G4zpkgQnRf89lxuZ1wsbjXM8lw==",
2188 + "version": "1.0.40",
2189 + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.40.tgz",
2190 + "integrity": "sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==",
2191 "funding": [
2192 {
2193 "type": "opencollective",
@@ -2316,15 +2297,16 @@
2297 }
2298 },
2299 "node_modules/which-typed-array": {
2319 - "version": "1.1.18",
2320 - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz",
2321 - "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==",
2300 + "version": "1.1.19",
2301 + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz",
2302 + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
2303 "license": "MIT",
2304 "dependencies": {
2305 "available-typed-arrays": "^1.0.7",
2306 "call-bind": "^1.0.8",
2326 - "call-bound": "^1.0.3",
2327 - "for-each": "^0.3.3",
2307 + "call-bound": "^1.0.4",
2308 + "for-each": "^0.3.5",
2309 + "get-proto": "^1.0.1",
2310 "gopd": "^1.2.0",
2311 "has-tostringtag": "^1.0.2"
2312 },
@@ -2358,6 +2340,80 @@
2340 "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
2341 }
2342 },
2343 + "node_modules/wrap-ansi-cjs": {
2344 + "name": "wrap-ansi",
2345 + "version": "7.0.0",
2346 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
2347 + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
2348 + "license": "MIT",
2349 + "dependencies": {
2350 + "ansi-styles": "^4.0.0",
2351 + "string-width": "^4.1.0",
2352 + "strip-ansi": "^6.0.0"
2353 + },
2354 + "engines": {
2355 + "node": ">=10"
2356 + },
2357 + "funding": {
2358 + "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
2359 + }
2360 + },
2361 + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
2362 + "version": "5.0.1",
2363 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2364 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
2365 + "license": "MIT",
2366 + "engines": {
2367 + "node": ">=8"
2368 + }
2369 + },
2370 + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
2371 + "version": "4.3.0",
2372 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2373 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
2374 + "license": "MIT",
2375 + "dependencies": {
2376 + "color-convert": "^2.0.1"
2377 + },
2378 + "engines": {
2379 + "node": ">=8"
2380 + },
2381 + "funding": {
2382 + "url": "https://github.com/chalk/ansi-styles?sponsor=1"
2383 + }
2384 + },
2385 + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
2386 + "version": "8.0.0",
2387 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
2388 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
2389 + "license": "MIT"
2390 + },
2391 + "node_modules/wrap-ansi-cjs/node_modules/string-width": {
2392 + "version": "4.2.3",
2393 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
2394 + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
2395 + "license": "MIT",
2396 + "dependencies": {
2397 + "emoji-regex": "^8.0.0",
2398 + "is-fullwidth-code-point": "^3.0.0",
2399 + "strip-ansi": "^6.0.1"
2400 + },
2401 + "engines": {
2402 + "node": ">=8"
2403 + }
2404 + },
2405 + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
2406 + "version": "6.0.1",
2407 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2408 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2409 + "license": "MIT",
2410 + "dependencies": {
2411 + "ansi-regex": "^5.0.1"
2412 + },
2413 + "engines": {
2414 + "node": ">=8"
2415 + }
2416 + },
2417 "node_modules/ws": {
2418 "version": "8.18.0",
2419 "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
@@ -2411,38 +2467,6 @@
2467 "engines": {
2468 "node": ">= 14"
2469 }
2414 - },
2415 - "node_modules/zip-stream/node_modules/compress-commons": {
2416 - "version": "6.0.2",
2417 - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz",
2418 - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==",
2419 - "license": "MIT",
2420 - "dependencies": {
2421 - "crc-32": "^1.2.0",
2422 - "crc32-stream": "^6.0.0",
2423 - "is-stream": "^2.0.1",
2424 - "normalize-path": "^3.0.0",
2425 - "readable-stream": "^4.0.0"
2426 - },
2427 - "engines": {
2428 - "node": ">= 14"
2429 - }
2430 - },
2431 - "node_modules/zip-stream/node_modules/readable-stream": {
2432 - "version": "4.6.0",
2433 - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.6.0.tgz",
2434 - "integrity": "sha512-cbAdYt0VcnpN2Bekq7PU+k363ZRsPwJoEEJOEtSJQlJXzwaxt3FIo/uL+KeDSGIjJqtkwyge4KQgD2S2kd+CQw==",
2435 - "license": "MIT",
2436 - "dependencies": {
2437 - "abort-controller": "^3.0.0",
2438 - "buffer": "^6.0.3",
2439 - "events": "^3.3.0",
2440 - "process": "^0.11.10",
2441 - "string_decoder": "^1.3.0"
2442 - },
2443 - "engines": {
2444 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
2445 - }
2470 }
2471 }
2472 }
package.json
+2 -1
@@ -50,7 +50,8 @@
50 "minimist": "1.2.8",
51 "multiparty": "4.2.3",
52 "node-forge": "1.3.1",
53 - "ua-parser-js": "1.0.39",
53 + "ua-client-hints-js": "0.1.2",
54 + "ua-parser-js": "1.0.40",
55 "ws": "8.18.0",
56 "yauzl": "2.10.0"
57 },
webserver.js
+27 -1
@@ -52,6 +52,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF
52 obj.meshUserHandler = require('./meshuser.js');
53 obj.interceptor = require('./interceptor');
54 obj.uaparser = require('ua-parser-js');
55 + obj.uaclienthints = require('ua-client-hints-js');
56 const constants = (obj.crypto.constants ? obj.crypto.constants : require('constants')); // require('constants') is deprecated in Node 11.10, use require('crypto').constants instead.
57
58 // Setup WebAuthn / FIDO2
@@ -6402,7 +6403,16 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF
6403 cb()
6404 }
6405 }
6405 - next()
6406 + // Special Client Hint Headers for Browser Detection on every request - https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers#client_hints
6407 + // note: only works in a secure context (localhost or https://)
6408 + const secCH = [
6409 + 'Sec-CH-UA-Arch', 'Sec-CH-UA-Bitness', 'Sec-CH-UA-Form-Factors', 'Sec-CH-UA-Full-Version',
6410 + 'Sec-CH-UA-Full-Version-List', 'Sec-CH-UA-Mobile', 'Sec-CH-UA-Model', 'Sec-CH-UA-Platform',
6411 + 'Sec-CH-UA-Platform-Version', 'Sec-CH-UA-WoW64'
6412 + ];
6413 + response.setHeader('Accept-CH', secCH.join(', '));
6414 + response.setHeader('Critical-CH', secCH.join(', '));
6415 + next();
6416 });
6417
6418 // Handle all incoming web sockets, see if some need to be handled as web relays
@@ -9490,8 +9500,24 @@ module.exports.CreateWebServer = function (parent, db, args, certificates, doneF
9500 var browser = 'Unknown', os = 'Unknown';
9501 try {
9502 const ua = obj.uaparser((typeof req == 'string') ? req : req.headers['user-agent']);
9503 + // Add client hints if available
9504 + if((typeof req != 'string')){
9505 + const ch = new obj.uaclienthints.UAClientHints().setValuesFromHeaders(req.headers);
9506 + Object.assign(ua, ch);
9507 + }
9508 if (ua.browser && ua.browser.name) { ua.browserStr = ua.browser.name; if (ua.browser.version) { ua.browserStr += '/' + ua.browser.version } }
9509 if (ua.os && ua.os.name) { ua.osStr = ua.os.name; if (ua.os.version) { ua.osStr += '/' + ua.os.version } }
9510 + // If the platform is set, use that instead of the OS
9511 + if (ua.platform) {
9512 + ua.osStr = ua.platform;
9513 + // Special case for Windows 11
9514 + if (ua.platformVersion) {
9515 + if (ua.platform == 'Windows' && parseInt(ua.platformVersion) >= 13) {
9516 + ua.platformVersion = '11';
9517 + }
9518 + ua.osStr += '/' + ua.platformVersion
9519 + }
9520 + }
9521 return ua;
9522 } catch (ex) { return { browserStr: browser, osStr: os } }
9523 }