diff --git a/docs/docs/help/operator-faq.md b/docs/docs/help/operator-faq.md index 3a7bbc98ad..7f0c82c343 100644 --- a/docs/docs/help/operator-faq.md +++ b/docs/docs/help/operator-faq.md @@ -179,10 +179,10 @@ Recheck operator address from the hub & reconfigure your node to use the correct I’m receiving the following warning message. ```JSON -WARN [2023-11-10T10:01:42.418] (NodeWebRtcConnection): Failed to set remote descriptor for peer 0a3849076d8a43b19b876fbc6eba935f -WARN [2023-11-10T10:01:42.421] (NodeWebRtcConnection): Failed to set remote candidate for peer 0a3849076d8a43b19b876fbc6eba935f -WARN [2023-11-10T10:01:42.622] (NodeWebRtcConnection): Failed to set remote candidate for peer 0a3849076d8a43b19b876fbc6eba935f -WARN [2023-11-10T10:01:42.867] (NodeWebRtcConnection): Failed to set remote candidate for peer 0a3849076d8a43b19b876fbc6eba935f +WARN [2023-11-10T10:01:42.418] (WebRtcConnection): Failed to set remote descriptor for peer 0a3849076d8a43b19b876fbc6eba935f +WARN [2023-11-10T10:01:42.421] (WebRtcConnection): Failed to set remote candidate for peer 0a3849076d8a43b19b876fbc6eba935f +WARN [2023-11-10T10:01:42.622] (WebRtcConnection): Failed to set remote candidate for peer 0a3849076d8a43b19b876fbc6eba935f +WARN [2023-11-10T10:01:42.867] (WebRtcConnection): Failed to set remote candidate for peer 0a3849076d8a43b19b876fbc6eba935f ``` **Explanation:** @@ -332,4 +332,4 @@ You'll need to pay the early exit fee of 5k DATA. The unwithdrawn earnings from #### What are some tips for staying safe on Streamr? - Consider starting small with your stake amount and use common sense to never stake more than you can afford to lose. A professional audit of the incentive layer has been completed by Cyfrin, but nothing can be guaranteed of course. - If you want to stake on a sponsorship, DO NOT click on the "Sponsor". That's for funding the sponsorship, not staking! Instead, go to the sponsorship you want to stake on and click "Join as an operator” and enter the amount. -- There may be an increase in activity by scammers. A common approach is to pretend to offer help or tech support in direct messages (something we never do). Report any account that is asking you to sign transactions or asking for any sort of credentials such as your private key. These accounts are trying to steal your tokens. It’s advised you disable DMs on Discord. More tips can be found in #server-safety-guide. \ No newline at end of file +- There may be an increase in activity by scammers. A common approach is to pretend to offer help or tech support in direct messages (something we never do). Report any account that is asking you to sign transactions or asking for any sort of credentials such as your private key. These accounts are trying to steal your tokens. It’s advised you disable DMs on Discord. More tips can be found in #server-safety-guide. diff --git a/package-lock.json b/package-lock.json index 0dfe0c753d..d0dff6dded 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7312,6 +7312,27 @@ } } }, + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", + "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, "node_modules/@rollup/plugin-node-resolve": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.3.tgz", @@ -7361,9 +7382,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", - "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.54.0.tgz", + "integrity": "sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng==", "cpu": [ "arm" ], @@ -7375,9 +7396,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", - "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.54.0.tgz", + "integrity": "sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw==", "cpu": [ "arm64" ], @@ -7389,9 +7410,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", - "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.54.0.tgz", + "integrity": "sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw==", "cpu": [ "arm64" ], @@ -7403,9 +7424,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", - "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.54.0.tgz", + "integrity": "sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A==", "cpu": [ "x64" ], @@ -7417,9 +7438,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", - "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.54.0.tgz", + "integrity": "sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA==", "cpu": [ "arm64" ], @@ -7431,9 +7452,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", - "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.54.0.tgz", + "integrity": "sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ==", "cpu": [ "x64" ], @@ -7445,9 +7466,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", - "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.54.0.tgz", + "integrity": "sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==", "cpu": [ "arm" ], @@ -7459,9 +7480,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", - "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.54.0.tgz", + "integrity": "sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==", "cpu": [ "arm" ], @@ -7473,9 +7494,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", - "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.54.0.tgz", + "integrity": "sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==", "cpu": [ "arm64" ], @@ -7487,9 +7508,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", - "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.54.0.tgz", + "integrity": "sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==", "cpu": [ "arm64" ], @@ -7501,9 +7522,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", - "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.54.0.tgz", + "integrity": "sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==", "cpu": [ "loong64" ], @@ -7515,9 +7536,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", - "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.54.0.tgz", + "integrity": "sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==", "cpu": [ "ppc64" ], @@ -7529,9 +7550,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", - "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.54.0.tgz", + "integrity": "sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==", "cpu": [ "riscv64" ], @@ -7543,9 +7564,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", - "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.54.0.tgz", + "integrity": "sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==", "cpu": [ "riscv64" ], @@ -7557,9 +7578,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", - "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.54.0.tgz", + "integrity": "sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==", "cpu": [ "s390x" ], @@ -7571,9 +7592,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", - "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.54.0.tgz", + "integrity": "sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==", "cpu": [ "x64" ], @@ -7585,9 +7606,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", - "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.54.0.tgz", + "integrity": "sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==", "cpu": [ "x64" ], @@ -7599,9 +7620,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", - "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.54.0.tgz", + "integrity": "sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==", "cpu": [ "arm64" ], @@ -7613,9 +7634,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", - "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.54.0.tgz", + "integrity": "sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw==", "cpu": [ "arm64" ], @@ -7627,9 +7648,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", - "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.54.0.tgz", + "integrity": "sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ==", "cpu": [ "ia32" ], @@ -7641,9 +7662,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", - "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.54.0.tgz", + "integrity": "sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ==", "cpu": [ "x64" ], @@ -7655,9 +7676,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", - "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.54.0.tgz", + "integrity": "sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg==", "cpu": [ "x64" ], @@ -25318,9 +25339,9 @@ } }, "node_modules/rollup": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", - "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.54.0.tgz", + "integrity": "sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==", "dev": true, "license": "MIT", "dependencies": { @@ -25334,28 +25355,28 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.53.3", - "@rollup/rollup-android-arm64": "4.53.3", - "@rollup/rollup-darwin-arm64": "4.53.3", - "@rollup/rollup-darwin-x64": "4.53.3", - "@rollup/rollup-freebsd-arm64": "4.53.3", - "@rollup/rollup-freebsd-x64": "4.53.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", - "@rollup/rollup-linux-arm-musleabihf": "4.53.3", - "@rollup/rollup-linux-arm64-gnu": "4.53.3", - "@rollup/rollup-linux-arm64-musl": "4.53.3", - "@rollup/rollup-linux-loong64-gnu": "4.53.3", - "@rollup/rollup-linux-ppc64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-musl": "4.53.3", - "@rollup/rollup-linux-s390x-gnu": "4.53.3", - "@rollup/rollup-linux-x64-gnu": "4.53.3", - "@rollup/rollup-linux-x64-musl": "4.53.3", - "@rollup/rollup-openharmony-arm64": "4.53.3", - "@rollup/rollup-win32-arm64-msvc": "4.53.3", - "@rollup/rollup-win32-ia32-msvc": "4.53.3", - "@rollup/rollup-win32-x64-gnu": "4.53.3", - "@rollup/rollup-win32-x64-msvc": "4.53.3", + "@rollup/rollup-android-arm-eabi": "4.54.0", + "@rollup/rollup-android-arm64": "4.54.0", + "@rollup/rollup-darwin-arm64": "4.54.0", + "@rollup/rollup-darwin-x64": "4.54.0", + "@rollup/rollup-freebsd-arm64": "4.54.0", + "@rollup/rollup-freebsd-x64": "4.54.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.54.0", + "@rollup/rollup-linux-arm-musleabihf": "4.54.0", + "@rollup/rollup-linux-arm64-gnu": "4.54.0", + "@rollup/rollup-linux-arm64-musl": "4.54.0", + "@rollup/rollup-linux-loong64-gnu": "4.54.0", + "@rollup/rollup-linux-ppc64-gnu": "4.54.0", + "@rollup/rollup-linux-riscv64-gnu": "4.54.0", + "@rollup/rollup-linux-riscv64-musl": "4.54.0", + "@rollup/rollup-linux-s390x-gnu": "4.54.0", + "@rollup/rollup-linux-x64-gnu": "4.54.0", + "@rollup/rollup-linux-x64-musl": "4.54.0", + "@rollup/rollup-openharmony-arm64": "4.54.0", + "@rollup/rollup-win32-arm64-msvc": "4.54.0", + "@rollup/rollup-win32-ia32-msvc": "4.54.0", + "@rollup/rollup-win32-x64-gnu": "4.54.0", + "@rollup/rollup-win32-x64-msvc": "4.54.0", "fsevents": "~2.3.2" } }, @@ -29817,7 +29838,93 @@ "node-forge": "^1.3.2" }, "devDependencies": { - "@types/node-forge": "^1.3.14" + "@rollup/plugin-node-resolve": "^16.0.3", + "@types/node-forge": "^1.3.14", + "rimraf": "^6.1.2", + "rollup": "^4.53.5", + "rollup-plugin-dts": "^6.3.0", + "tsx": "^4.21.0" + } + }, + "packages/autocertifier-client/node_modules/glob": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/autocertifier-client/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/autocertifier-client/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "packages/autocertifier-client/node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/autocertifier-client/node_modules/rimraf": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz", + "integrity": "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "glob": "^13.0.0", + "package-json-from-dist": "^1.0.1" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "packages/autocertifier-server": { @@ -29856,6 +29963,7 @@ "devDependencies": { "@electron/rebuild": "^4.0.1", "@jest/fake-timers": "^30.0.5", + "@rollup/plugin-node-resolve": "^16.0.3", "buffer": "^6.0.3", "electron": "^34.0.0", "expect": "^30.0.5", @@ -29869,10 +29977,95 @@ "karma-spec-reporter": "^0.0.36", "karma-webpack": "^5.0.1", "node-polyfill-webpack-plugin": "^4.1.0", + "rimraf": "^6.1.2", + "rollup": "^4.53.5", + "rollup-plugin-dts": "^6.3.0", + "tsx": "^4.21.0", "webpack": "^5.103.0", "webpack-cli": "^6.0.1" } }, + "packages/browser-test-runner/node_modules/glob": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/browser-test-runner/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/browser-test-runner/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "packages/browser-test-runner/node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/browser-test-runner/node_modules/rimraf": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz", + "integrity": "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "glob": "^13.0.0", + "package-json-from-dist": "^1.0.1" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "packages/cdn-location": { "name": "@streamr/cdn-location", "version": "103.2.0", @@ -29882,7 +30075,93 @@ "haversine": "^1.1.1" }, "devDependencies": { - "@types/haversine": "^1.1.8" + "@rollup/plugin-node-resolve": "^16.0.3", + "@types/haversine": "^1.1.8", + "rimraf": "^6.1.2", + "rollup": "^4.53.5", + "rollup-plugin-dts": "^6.3.0", + "tsx": "^4.21.0" + } + }, + "packages/cdn-location/node_modules/glob": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/cdn-location/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/cdn-location/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "packages/cdn-location/node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/cdn-location/node_modules/rimraf": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz", + "integrity": "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "glob": "^13.0.0", + "package-json-from-dist": "^1.0.1" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "packages/cli-tools": { @@ -29940,6 +30219,8 @@ "ws": "^8.18.3" }, "devDependencies": { + "@rollup/plugin-alias": "^6.0.0", + "@rollup/plugin-json": "^6.1.0", "@streamr/browser-test-runner": "^0.0.1", "@streamr/test-utils": "103.2.0", "@types/heap": "^0.2.35", @@ -29949,14 +30230,51 @@ "@types/ws": "^8.18.1", "jest-leak-detector": "^27.3.1", "jest-matcher-utils": "^30.0.5", + "rimraf": "^6.1.2", "ts-essentials": "^10.1.1", - "ts-node": "^10.9.2" + "tsx": "^4.21.0" }, "optionalDependencies": { "bufferutil": "^4.0.9", "utf-8-validate": "^6.0.5" } }, + "packages/dht/node_modules/@rollup/plugin-alias": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-6.0.0.tgz", + "integrity": "sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "rollup": ">=4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "packages/dht/node_modules/glob": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "packages/dht/node_modules/ipaddr.js": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", @@ -29966,6 +30284,69 @@ "node": ">= 10" } }, + "packages/dht/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/dht/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "packages/dht/node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/dht/node_modules/rimraf": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz", + "integrity": "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "glob": "^13.0.0", + "package-json-from-dist": "^1.0.1" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "packages/geoip-location": { "name": "@streamr/geoip-location", "version": "103.2.0", @@ -29979,9 +30360,95 @@ "uuid": "^11.1.0" }, "devDependencies": { + "@rollup/plugin-node-resolve": "^16.0.3", "@types/long-timeout": "^0.1.2", "@types/tar": "^6.1.11", - "express": "^5.2.0" + "express": "^5.2.0", + "rimraf": "^6.1.2", + "rollup": "^4.53.5", + "rollup-plugin-dts": "^6.3.0", + "tsx": "^4.21.0" + } + }, + "packages/geoip-location/node_modules/glob": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/geoip-location/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/geoip-location/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "packages/geoip-location/node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/geoip-location/node_modules/rimraf": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz", + "integrity": "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "glob": "^13.0.0", + "package-json-from-dist": "^1.0.1" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "packages/node": { @@ -30066,15 +30533,101 @@ "uuid": "^11.1.0" }, "devDependencies": { + "@rollup/plugin-node-resolve": "^16.0.3", "@streamr/browser-test-runner": "^0.0.1", "@streamr/test-utils": "103.2.0", - "@types/lodash": "^4.17.21" + "@types/lodash": "^4.17.21", + "rimraf": "^6.1.2", + "rollup": "^4.53.5", + "rollup-plugin-dts": "^6.3.0", + "tsx": "^4.21.0" }, "optionalDependencies": { "bufferutil": "^4.0.9", "utf-8-validate": "^6.0.5" } }, + "packages/proto-rpc/node_modules/glob": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/proto-rpc/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/proto-rpc/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "packages/proto-rpc/node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/proto-rpc/node_modules/rimraf": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz", + "integrity": "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "glob": "^13.0.0", + "package-json-from-dist": "^1.0.1" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "packages/sdk": { "name": "@streamr/sdk", "version": "103.2.0", @@ -30184,8 +30737,94 @@ "lodash": "^4.17.21" }, "devDependencies": { + "@rollup/plugin-node-resolve": "^16.0.3", "@types/cors": "^2.8.19", - "@types/express": "^5.0.1" + "@types/express": "^5.0.1", + "rimraf": "^6.1.2", + "rollup": "^4.53.5", + "rollup-plugin-dts": "^6.3.0", + "tsx": "^4.21.0" + } + }, + "packages/test-utils/node_modules/glob": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/test-utils/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/test-utils/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "packages/test-utils/node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/test-utils/node_modules/rimraf": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz", + "integrity": "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "glob": "^13.0.0", + "package-json-from-dist": "^1.0.1" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "packages/trackerless-network": { @@ -30205,12 +30844,99 @@ "yallist": "^5.0.0" }, "devDependencies": { + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^16.0.3", "@streamr/browser-test-runner": "^0.0.1", "@streamr/test-utils": "103.2.0", "@types/lodash": "^4.17.21", "@types/yallist": "^5.0.0", "expect": "^30.0.5", - "ts-node": "^10.9.2" + "rimraf": "^6.1.2", + "rollup": "^4.54.0", + "rollup-plugin-dts": "^6.3.0", + "ts-node": "^10.9.2", + "tsx": "^4.21.0" + } + }, + "packages/trackerless-network/node_modules/glob": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/trackerless-network/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/trackerless-network/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "packages/trackerless-network/node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/trackerless-network/node_modules/rimraf": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz", + "integrity": "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "glob": "^13.0.0", + "package-json-from-dist": "^1.0.1" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "packages/trackerless-network/node_modules/yallist": { @@ -30228,6 +30954,7 @@ "license": "Apache-2.0", "dependencies": { "@noble/curves": "^1.9.7", + "@noble/hashes": "^2.0.1", "@noble/post-quantum": "^0.4.1", "buffer": "^6.0.3", "buffer-shim": "^1.0.1", @@ -30254,6 +30981,18 @@ "tsx": "^4.21.0" } }, + "packages/utils/node_modules/@noble/hashes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz", + "integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "packages/utils/node_modules/glob": { "version": "13.0.0", "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", diff --git a/packages/autocertifier-client/package.json b/packages/autocertifier-client/package.json index 6fbebb0aee..c98784b879 100644 --- a/packages/autocertifier-client/package.json +++ b/packages/autocertifier-client/package.json @@ -7,18 +7,27 @@ "url": "git+https://github.com/streamr-dev/network.git", "directory": "packages/autocertifier-client" }, - "main": "dist/src/exports.js", - "types": "dist/src/exports.d.ts", + "exports": { + ".": { + "default": { + "types": "./dist/src/exports.d.ts", + "import": "./dist/src/exports.js", + "require": "./dist/src/exports.cjs" + } + } + }, "files": [ - "dist", + "dist/src/exports.*", "!*.tsbuildinfo" ], "license": "STREAMR NETWORK OPEN SOURCE LICENSE", "author": "Streamr Network AG ", "scripts": { - "prebuild": "./proto.sh", + "prebuild": "npm run reset-self && ./proto.sh", "build": "tsc -b", + "postbuild": "NODE_OPTIONS='--import tsx' rollup -c rollup.config.mts", "check": "tsc --noEmit", + "reset-self": "rimraf --glob '**/*.tsbuildinfo'", "clean": "rm -rf dist generated *.tsbuildinfo node_modules/.cache || true", "eslint": "eslint --cache --cache-location=node_modules/.cache/.eslintcache/ '*/**/*.{js,ts}'" }, @@ -29,6 +38,11 @@ "node-forge": "^1.3.2" }, "devDependencies": { - "@types/node-forge": "^1.3.14" + "@rollup/plugin-node-resolve": "^16.0.3", + "@types/node-forge": "^1.3.14", + "rimraf": "^6.1.2", + "rollup": "^4.53.5", + "rollup-plugin-dts": "^6.3.0", + "tsx": "^4.21.0" } } diff --git a/packages/autocertifier-client/rollup.config.mts b/packages/autocertifier-client/rollup.config.mts new file mode 100644 index 0000000000..54215f8ccb --- /dev/null +++ b/packages/autocertifier-client/rollup.config.mts @@ -0,0 +1,54 @@ +import { defineConfig, type RollupOptions } from 'rollup' +import { dts } from 'rollup-plugin-dts' +import { nodeResolve } from '@rollup/plugin-node-resolve' + +export default defineConfig([ + nodejs(), + nodejsTypes(), +]) + +function nodejs(): RollupOptions { + return { + input: './dist/src/exports.js', + output: [ + { + format: 'es', + file: './dist/src/exports.js', + sourcemap: true, + }, + { + format: 'cjs', + file: './dist/src/exports.cjs', + sourcemap: true, + }, + ], + plugins: [ + nodeResolve({ + preferBuiltins: true, + }), + ], + external: [ + /node_modules/, + /@streamr\//, + ], + } +} + +function nodejsTypes(): RollupOptions { + return { + input: './dist/src/exports.d.ts', + output: [ + { + file: './dist/src/exports.d.ts', + }, + ], + plugins: [ + nodeResolve(), + dts(), + ], + external: [ + /node_modules/, + /@streamr\//, + ], + } +} diff --git a/packages/autocertifier-client/tsconfig.json b/packages/autocertifier-client/tsconfig.json index ce0f5b1ea2..2c8034fcda 100644 --- a/packages/autocertifier-client/tsconfig.json +++ b/packages/autocertifier-client/tsconfig.json @@ -2,7 +2,12 @@ "extends": "../../tsconfig.node.json", "compilerOptions": { "outDir": "dist", - "noImplicitOverride": false + "noImplicitOverride": false, + + /* Resolution */ + "module": "preserve", + "moduleResolution": "bundler", + "baseUrl": "." }, "include": [ "src", diff --git a/packages/browser-test-runner/package.json b/packages/browser-test-runner/package.json index bdf09514a4..dfaa6f05d3 100644 --- a/packages/browser-test-runner/package.json +++ b/packages/browser-test-runner/package.json @@ -8,18 +8,27 @@ "url": "git+https://github.com/streamr-dev/network.git", "directory": "packages/browser-test-runner" }, - "main": "./dist/src/exports.js", - "browser": { - "./dist/src/exports.js": false + "exports": { + ".": { + "default": { + "types": "./dist/src/exports.d.ts", + "import": "./dist/src/exports.js", + "require": "./dist/src/exports.cjs" + } + } }, "files": [ - "dist", + "dist/src/exports.*", + "dist/src/preload.cjs", "!*.tsbuildinfo", "LICENSE" ], "scripts": { + "prebuild": "npm run reset-self", "build": "tsc -b", + "postbuild": "NODE_OPTIONS='--import tsx' rollup -c rollup.config.mts", "check": "tsc --noEmit", + "reset-self": "rimraf --glob '**/*.tsbuildinfo'", "eslint": "eslint --cache --cache-location=node_modules/.cache/.eslintcache/ '**/*.{js,ts}'" }, "author": "Streamr Network AG ", @@ -27,6 +36,7 @@ "devDependencies": { "@electron/rebuild": "^4.0.1", "@jest/fake-timers": "^30.0.5", + "@rollup/plugin-node-resolve": "^16.0.3", "buffer": "^6.0.3", "electron": "^34.0.0", "expect": "^30.0.5", @@ -40,6 +50,10 @@ "karma-spec-reporter": "^0.0.36", "karma-webpack": "^5.0.1", "node-polyfill-webpack-plugin": "^4.1.0", + "rimraf": "^6.1.2", + "rollup": "^4.53.5", + "rollup-plugin-dts": "^6.3.0", + "tsx": "^4.21.0", "webpack": "^5.103.0", "webpack-cli": "^6.0.1" } diff --git a/packages/browser-test-runner/rollup.config.mts b/packages/browser-test-runner/rollup.config.mts new file mode 100644 index 0000000000..7f1a5c815a --- /dev/null +++ b/packages/browser-test-runner/rollup.config.mts @@ -0,0 +1,68 @@ +import { defineConfig, type RollupOptions } from 'rollup' +import { dts } from 'rollup-plugin-dts' +import { nodeResolve } from '@rollup/plugin-node-resolve' + +export default defineConfig([ + ...nodejs(), + nodejsTypes(), +]) + +function nodejs(): RollupOptions[] { + return [ + { + input: './dist/src/exports.js', + output: [ + { + format: 'es', + file: './dist/src/exports.js', + sourcemap: true, + }, + { + format: 'cjs', + file: './dist/src/exports.cjs', + sourcemap: true, + }, + ], + plugins: [ + nodeResolve({ + preferBuiltins: true, + }), + ], + external: [ + /node_modules/, + /@streamr\//, + ], + }, + { + /** + * We need a CJS preload file for Electron apps - that's the only format they support. + */ + input: './dist/src/preload.js', + output: [ + { + format: 'cjs', + file: './dist/src/preload.cjs', + }, + ], + }, + ] +} + +function nodejsTypes(): RollupOptions { + return { + input: './dist/src/exports.d.ts', + output: [ + { + file: './dist/src/exports.d.ts', + }, + ], + plugins: [ + nodeResolve(), + dts(), + ], + external: [ + /node_modules/, + /@streamr\//, + ], + } +} diff --git a/packages/browser-test-runner/src/createKarmaConfig.ts b/packages/browser-test-runner/src/createKarmaConfig.ts index 38d09d8285..dd169dd8cf 100644 --- a/packages/browser-test-runner/src/createKarmaConfig.ts +++ b/packages/browser-test-runner/src/createKarmaConfig.ts @@ -1,4 +1,5 @@ import fs from 'fs' +import { fileURLToPath } from 'url' import type { Configuration, ExternalItem } from 'webpack' const DEBUG_MODE = process.env.BROWSER_TEST_DEBUG_MODE ?? false @@ -6,7 +7,7 @@ const DEBUG_MODE = process.env.BROWSER_TEST_DEBUG_MODE ?? false export const createKarmaConfig = ( testPaths: string[], webpackConfig: () => Configuration, localDirectory?: string ): (config: any) => any => { - const setupFiles = [__dirname + '/karma-setup.js'] + const setupFiles = [fileURLToPath(new URL('./karma-setup.js', import.meta.url))] if (localDirectory !== undefined) { const localSetupFile = localDirectory + '/karma-setup.js' @@ -58,7 +59,7 @@ export const createKarmaConfig = ( browserWindowOptions: { webPreferences: { contextIsolation: false, - preload: __dirname + '/preload.js', + preload: fileURLToPath(new URL('./preload.cjs', import.meta.url)), webSecurity: false, sandbox: false, nodeIntegration: true diff --git a/packages/browser-test-runner/tsconfig.json b/packages/browser-test-runner/tsconfig.json index 126cae2a06..9544356da2 100644 --- a/packages/browser-test-runner/tsconfig.json +++ b/packages/browser-test-runner/tsconfig.json @@ -1,7 +1,12 @@ { "extends": "../../tsconfig.node.json", "compilerOptions": { - "outDir": "dist" + "outDir": "dist", + + /* Resolution */ + "module": "preserve", + "moduleResolution": "bundler", + "baseUrl": "." }, "include": [ "src" diff --git a/packages/cdn-location/package.json b/packages/cdn-location/package.json index e23265e26c..86006646da 100644 --- a/packages/cdn-location/package.json +++ b/packages/cdn-location/package.json @@ -7,10 +7,17 @@ "url": "git+https://github.com/streamr-dev/network.git", "directory": "packages/cdn-location" }, - "main": "dist/src/exports.js", - "types": "dist/src/exports.d.ts", + "exports": { + ".": { + "default": { + "types": "./dist/src/exports.d.ts", + "import": "./dist/src/exports.js", + "require": "./dist/src/exports.cjs" + } + } + }, "files": [ - "dist", + "dist/src/exports.*", "!*.tsbuildinfo", "README.md", "LICENSE" @@ -18,8 +25,11 @@ "license": "Apache-2.0", "author": "Streamr Network AG ", "scripts": { + "prebuild": "npm run reset-self", "build": "tsc -b", + "postbuild": "NODE_OPTIONS='--import tsx' rollup -c rollup.config.mts", "check": "tsc -p tsconfig.jest.json", + "reset-self": "rimraf --glob '**/*.tsbuildinfo'", "clean": "jest --clearCache --config '{}' || true; rm -rf dist *.tsbuildinfo node_modules/.cache || true", "eslint": "eslint --cache --cache-location=node_modules/.cache/.eslintcache/ '*/**/*.{js,ts}'", "test": "jest test/integration", @@ -32,6 +42,11 @@ "haversine": "^1.1.1" }, "devDependencies": { - "@types/haversine": "^1.1.8" + "@rollup/plugin-node-resolve": "^16.0.3", + "@types/haversine": "^1.1.8", + "rimraf": "^6.1.2", + "rollup": "^4.53.5", + "rollup-plugin-dts": "^6.3.0", + "tsx": "^4.21.0" } } diff --git a/packages/cdn-location/rollup.config.mts b/packages/cdn-location/rollup.config.mts new file mode 100644 index 0000000000..54215f8ccb --- /dev/null +++ b/packages/cdn-location/rollup.config.mts @@ -0,0 +1,54 @@ +import { defineConfig, type RollupOptions } from 'rollup' +import { dts } from 'rollup-plugin-dts' +import { nodeResolve } from '@rollup/plugin-node-resolve' + +export default defineConfig([ + nodejs(), + nodejsTypes(), +]) + +function nodejs(): RollupOptions { + return { + input: './dist/src/exports.js', + output: [ + { + format: 'es', + file: './dist/src/exports.js', + sourcemap: true, + }, + { + format: 'cjs', + file: './dist/src/exports.cjs', + sourcemap: true, + }, + ], + plugins: [ + nodeResolve({ + preferBuiltins: true, + }), + ], + external: [ + /node_modules/, + /@streamr\//, + ], + } +} + +function nodejsTypes(): RollupOptions { + return { + input: './dist/src/exports.d.ts', + output: [ + { + file: './dist/src/exports.d.ts', + }, + ], + plugins: [ + nodeResolve(), + dts(), + ], + external: [ + /node_modules/, + /@streamr\//, + ], + } +} diff --git a/packages/cdn-location/tsconfig.json b/packages/cdn-location/tsconfig.json index 5621ed82fc..6ad637ddb1 100644 --- a/packages/cdn-location/tsconfig.json +++ b/packages/cdn-location/tsconfig.json @@ -1,7 +1,12 @@ { "extends": "../../tsconfig.node.json", "compilerOptions": { - "outDir": "dist" + "outDir": "dist", + + /* Resolution */ + "module": "preserve", + "moduleResolution": "bundler", + "baseUrl": "." }, "include": [ "src" diff --git a/packages/dht/jest.config.ts b/packages/dht/jest.config.ts index 829ec460e5..330629096c 100644 --- a/packages/dht/jest.config.ts +++ b/packages/dht/jest.config.ts @@ -3,6 +3,9 @@ import defaultConfig from '../../jest.config' const config: Config.InitialOptions = { ...defaultConfig, + moduleNameMapper: { + '^@/(.*)$': '/src/nodejs/$1' + }, setupFilesAfterEnv: [ ...defaultConfig.setupFilesAfterEnv, './test/utils/customMatchers.ts', diff --git a/packages/dht/karma.config.ts b/packages/dht/karma.config.ts index 505d61e569..1f71497e0a 100644 --- a/packages/dht/karma.config.ts +++ b/packages/dht/karma.config.ts @@ -7,18 +7,12 @@ const TEST_PATHS = [ './test/end-to-end/**/!(RecoveryFromFailedAutoCertification*|memory-leak*|GeoIpLayer0*).ts' ] -const NodeWebrtcConnection = resolve(__dirname, 'src/connection/webrtc/NodeWebrtcConnection.ts') -const BrowserWebrtcConnection = resolve(__dirname, 'src/connection/webrtc/BrowserWebrtcConnection.ts') -const NodeWebsocketClientConnection = resolve(__dirname, 'src/connection/websocket/NodeWebsocketClientConnection.ts') -const BrowserWebsocketClientConnection = resolve(__dirname, 'src/connection/websocket/BrowserWebsocketClientConnection.ts') - export default createKarmaConfig( TEST_PATHS, createWebpackConfig({ libraryName: 'dht', alias: { - [NodeWebrtcConnection]: BrowserWebrtcConnection, - [NodeWebsocketClientConnection]: BrowserWebsocketClientConnection + '@': resolve(__dirname, 'src/browser'), }, fallback: { module: false diff --git a/packages/dht/package.json b/packages/dht/package.json index 5865f3baf1..662d3a216b 100644 --- a/packages/dht/package.json +++ b/packages/dht/package.json @@ -7,26 +7,34 @@ "url": "git+https://github.com/streamr-dev/network.git", "directory": "packages/dht" }, - "main": "./dist/src/exports.js", - "types": "./dist/src/exports.d.ts", - "browser": { - "./dist/src/connection/webrtc/NodeWebrtcConnection.js": "./dist/src/connection/webrtc/BrowserWebrtcConnection.js", - "./dist/src/connection/websocket/NodeWebsocketClientConnection.js": "./dist/src/connection/websocket/BrowserWebsocketClientConnection.js", - "./dist/src/helpers/browser/isBrowserEnvironment.js": "./dist/src/helpers/browser/isBrowserEnvironment_override.js" + "exports": { + ".": { + "browser": { + "types": "./dist/browser/src/exports.d.ts", + "import": "./dist/browser/src/exports.js", + "require": "./dist/browser/src/exports.cjs" + }, + "default": { + "types": "./dist/nodejs/src/exports.d.ts", + "import": "./dist/nodejs/src/exports.js", + "require": "./dist/nodejs/src/exports.cjs" + } + } }, - "license": "STREAMR NETWORK OPEN SOURCE LICENSE", - "author": "Streamr Network AG ", "files": [ - "dist", + "dist/nodejs/src/exports.*", + "dist/browser/src/exports.*", "!*.tsbuildinfo", "README.md" ], + "license": "STREAMR NETWORK OPEN SOURCE LICENSE", + "author": "Streamr Network AG ", "scripts": { - "prebuild": "./proto.sh", - "postbuild": "./scripts/postbuild.sh", + "prebuild": "npm run reset-self && ./proto.sh", "build": "tsc -b", - "build-browser": "webpack --mode=development --progress", + "postbuild": "NODE_OPTIONS='--import tsx' rollup -c rollup.config.mts", "check": "tsc -p tsconfig.jest.json", + "reset-self": "rimraf --glob '**/*.tsbuildinfo'", "clean": "jest --clearCache --config '{}' || true; rm -rf dist generated *.tsbuildinfo node_modules/.cache || true", "eslint": "eslint --cache --cache-location=node_modules/.cache/.eslintcache/ '*/**/*.{js,ts}'", "test": "npm run test-unit && npm run test-integration && npm run test-end-to-end", @@ -57,6 +65,8 @@ "ws": "^8.18.3" }, "devDependencies": { + "@rollup/plugin-alias": "^6.0.0", + "@rollup/plugin-json": "^6.1.0", "@streamr/browser-test-runner": "^0.0.1", "@streamr/test-utils": "103.2.0", "@types/heap": "^0.2.35", @@ -66,8 +76,9 @@ "@types/ws": "^8.18.1", "jest-leak-detector": "^27.3.1", "jest-matcher-utils": "^30.0.5", + "rimraf": "^6.1.2", "ts-essentials": "^10.1.1", - "ts-node": "^10.9.2" + "tsx": "^4.21.0" }, "optionalDependencies": { "bufferutil": "^4.0.9", diff --git a/packages/dht/rollup.config.mts b/packages/dht/rollup.config.mts new file mode 100644 index 0000000000..45ae74c6f3 --- /dev/null +++ b/packages/dht/rollup.config.mts @@ -0,0 +1,142 @@ +import { defineConfig, type RollupOptions } from 'rollup' +import { dts } from 'rollup-plugin-dts' +import alias, { type Alias } from '@rollup/plugin-alias' +import { nodeResolve } from '@rollup/plugin-node-resolve' +import json from '@rollup/plugin-json' +import { fileURLToPath } from 'url' + +const nodejsAliases: Alias[] = [ + { + find: /^@\//, + replacement: fileURLToPath( + new URL('./dist/nodejs/src/nodejs/', import.meta.url) + ), + }, +] + +const browserAliases: Alias[] = [ + { + find: /^@\//, + replacement: fileURLToPath( + new URL('./dist/browser/src/browser/', import.meta.url) + ), + }, +] + +export default defineConfig([ + nodejs(), + nodejsTypes(), + browser(), + browserTypes(), +]) + +function nodejs(): RollupOptions { + return { + input: './dist/nodejs/src/exports.js', + output: [ + { + format: 'es', + file: './dist/nodejs/src/exports.js', + sourcemap: true, + }, + { + format: 'cjs', + file: './dist/nodejs/src/exports.cjs', + sourcemap: true, + }, + ], + plugins: [ + json(), + alias({ + entries: nodejsAliases, + }), + nodeResolve({ + preferBuiltins: true, + }), + ], + external: [ + /node_modules/, + /@streamr\//, + ], + + } +} + +function nodejsTypes(): RollupOptions { + return { + input: './dist/nodejs/src/exports.d.ts', + output: [ + { + file: './dist/nodejs/src/exports.d.ts', + }, + ], + plugins: [ + alias({ + entries: nodejsAliases, + }), + nodeResolve(), + dts(), + ], + external: [ + /node_modules/, + /@streamr\//, + ], + + } +} + +function browser(): RollupOptions { + return { + input: './dist/browser/src/exports.js', + output: [ + { + format: 'es', + file: './dist/browser/src/exports.js', + sourcemap: true, + }, + { + format: 'cjs', + file: './dist/browser/src/exports.cjs', + sourcemap: true, + }, + ], + plugins: [ + json(), + alias({ + entries: browserAliases, + }), + nodeResolve({ + preferBuiltins: false, + browser: true, + }), + ], + external: [ + /node_modules/, + /@streamr\//, + ], + + } +} + +function browserTypes(): RollupOptions { + return { + input: './dist/browser/src/exports.d.ts', + output: [ + { file: './dist/browser/src/exports.d.ts' }, + ], + plugins: [ + alias({ + entries: browserAliases, + }), + nodeResolve({ + preferBuiltins: false, + browser: true, + }), + dts(), + ], + external: [ + /node_modules/, + /@streamr\//, + ], + } +} diff --git a/packages/dht/scripts/postbuild.sh b/packages/dht/scripts/postbuild.sh deleted file mode 100755 index 70efe8acad..0000000000 --- a/packages/dht/scripts/postbuild.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -mkdir -p dist - -SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) - -cd "${SCRIPT_DIR}/.." - -# Sanitize the final package.json -npx ts-node scripts/rewrite-package.ts diff --git a/packages/dht/scripts/rewrite-package.ts b/packages/dht/scripts/rewrite-package.ts deleted file mode 100644 index 9069678779..0000000000 --- a/packages/dht/scripts/rewrite-package.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * This script overwrites the package.json file inside the dist folder while - * adjusting relative pathnames for exports. Since the compiled output is inside - * "dist", but the original package.json references paths as if it's in the root, - * we need to strip "dist" from all export fields (main, types, …). - * - * This ensures that consumers of the package (incl. bundlers like Webpack) import - * the correct files without referencing "dist" in their paths, maintaining proper - * module resolution. - */ - -import pkg from '../package.json' -import * as fs from 'node:fs' -import path from 'node:path' - -function fixPathname(pathname: string): string { - return pathname.startsWith('./dist') - ? `./${path.relative('./dist', pathname)}` - : pathname -} - -const { main, types, browser, scripts: _scripts, ...rest } = pkg - -const newPkg = { - ...rest, - main: fixPathname(main), - types: fixPathname(types), - browser: Object.entries(browser).reduce( - (memo, [fromPathname, toPathname]) => ({ - ...memo, - [fixPathname(fromPathname)]: - typeof toPathname === 'string' - ? fixPathname(toPathname) - : toPathname, - }), - {} - ), -} - -const dist = path.resolve(__dirname, '../dist/package.json') - -fs.writeFileSync(dist, JSON.stringify(newPkg, null, 2)) diff --git a/packages/dht/scripts/tsconfig.json b/packages/dht/scripts/tsconfig.json deleted file mode 100644 index 5a03dbdeb8..0000000000 --- a/packages/dht/scripts/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "..", - "include": [ - "**/*" - ] -} diff --git a/packages/dht/src/connection/webrtc/BrowserWebrtcConnection.ts b/packages/dht/src/browser/WebrtcConnection.ts similarity index 92% rename from packages/dht/src/connection/webrtc/BrowserWebrtcConnection.ts rename to packages/dht/src/browser/WebrtcConnection.ts index 956fadc3cb..d4cb5a0acf 100644 --- a/packages/dht/src/connection/webrtc/BrowserWebrtcConnection.ts +++ b/packages/dht/src/browser/WebrtcConnection.ts @@ -1,11 +1,11 @@ -/// - -import EventEmitter from 'eventemitter3' -import { WebrtcConnectionEvents, IWebrtcConnection, RtcDescription } from './IWebrtcConnection' -import { IConnection, ConnectionID, ConnectionType } from '../IConnection' +import { EventEmitter } from 'eventemitter3' +import { WebrtcConnectionEvents, IWebrtcConnection, RtcDescription } from '../connection/webrtc/IWebrtcConnection' +import { IConnection, ConnectionID, ConnectionType } from '../connection/IConnection' import { Logger } from '@streamr/utils' -import { EARLY_TIMEOUT, IceServer } from './WebrtcConnector' -import { createRandomConnectionId } from '../Connection' +import { IceServer } from '../connection/webrtc/types' +import { EARLY_TIMEOUT } from '../connection/webrtc/consts' +import { createRandomConnectionId } from '../connection/Connection' +import type { WebrtcConnectionParams } from '../types/WebrtcConnectionParams' enum DisconnectedRtcPeerConnectionStateEnum { DISCONNECTED = 'disconnected', @@ -13,13 +13,9 @@ enum DisconnectedRtcPeerConnectionStateEnum { CLOSED = 'closed', } -const logger = new Logger('BrowserWebrtcConnection') - -interface Params { - iceServers?: IceServer[] -} +const logger = new Logger('WebrtcConnection (browser)') -export class NodeWebrtcConnection extends EventEmitter implements IWebrtcConnection, IConnection { +export class WebrtcConnection extends EventEmitter implements IWebrtcConnection, IConnection { public connectionId: ConnectionID public readonly connectionType: ConnectionType = ConnectionType.WEBRTC @@ -37,7 +33,7 @@ export class NodeWebrtcConnection extends EventEmitter i private earlyTimeout: NodeJS.Timeout private readonly messageQueue: Uint8Array[] = [] - constructor(params: Params) { + constructor(params: WebrtcConnectionParams) { super() this.connectionId = createRandomConnectionId() this.iceServers = params.iceServers ?? [] diff --git a/packages/dht/src/connection/websocket/BrowserWebsocketClientConnection.ts b/packages/dht/src/browser/WebsocketClientConnection.ts similarity index 90% rename from packages/dht/src/connection/websocket/BrowserWebsocketClientConnection.ts rename to packages/dht/src/browser/WebsocketClientConnection.ts index 4b0f01acb9..b0569991f9 100644 --- a/packages/dht/src/connection/websocket/BrowserWebsocketClientConnection.ts +++ b/packages/dht/src/browser/WebsocketClientConnection.ts @@ -1,8 +1,8 @@ import { Logger } from '@streamr/utils' import { ICloseEvent, IMessageEvent, w3cwebsocket as Websocket } from 'websocket' -import { AbstractWebsocketClientConnection } from './AbstractWebsocketClientConnection' +import { AbstractWebsocketClientConnection } from '../connection/websocket/AbstractWebsocketClientConnection' -const logger = new Logger('BrowserWebsocketClientConnection') +const logger = new Logger('WebsocketClientConnection (browser)') const BINARY_TYPE = 'arraybuffer' diff --git a/packages/dht/src/browser/WebsocketServer.ts b/packages/dht/src/browser/WebsocketServer.ts new file mode 100644 index 0000000000..034dda0818 --- /dev/null +++ b/packages/dht/src/browser/WebsocketServer.ts @@ -0,0 +1,29 @@ +/* eslint-disable class-methods-use-this */ +import { EventEmitter } from 'eventemitter3' +import type { + IWebsocketServer, + WebsocketServerEvents, +} from '../connection/websocket/types' + +/** + * A stub WebsocketServer for browser environment. + */ + +export class WebsocketServer extends EventEmitter implements IWebsocketServer { + constructor(_params: unknown) { + super() + } + + public async start(): Promise { + return 0 + } + + public async stop(): Promise { + // do nothing + } + + public updateCertificate(_cert: string, _key: string): void { + // do nothing + } +} + diff --git a/packages/dht/src/browser/createGeoipLocator.ts b/packages/dht/src/browser/createGeoipLocator.ts new file mode 100644 index 0000000000..4168594166 --- /dev/null +++ b/packages/dht/src/browser/createGeoipLocator.ts @@ -0,0 +1,5 @@ +import type { GeoIpLocator } from '@streamr/geoip-location' + +export const createGeoipLocator = (_geoIpDatabaseFolder: string): Promise => { + throw new Error('GeoIpLocator is not supported in browser environment') +} diff --git a/packages/dht/src/browser/defaultAutoCertifierClientFactory.ts b/packages/dht/src/browser/defaultAutoCertifierClientFactory.ts new file mode 100644 index 0000000000..773cafc3e7 --- /dev/null +++ b/packages/dht/src/browser/defaultAutoCertifierClientFactory.ts @@ -0,0 +1,13 @@ +import { AutoCertifierClient } from '@streamr/autocertifier-client' +import { ListeningRpcCommunicator } from '../transport/ListeningRpcCommunicator' + +export const defaultAutoCertifierClientFactory = ( + _configFile: string, + _autoCertifierUrl: string, + _autoCertifierRpcCommunicator: ListeningRpcCommunicator, + _wsServerPort: number +): AutoCertifierClient => { + throw new Error( + 'AutoCertifierClient is not supported in browser environment' + ) +} diff --git a/packages/dht/src/browser/isBrowserEnvironment.ts b/packages/dht/src/browser/isBrowserEnvironment.ts new file mode 100644 index 0000000000..ccc0a7d7af --- /dev/null +++ b/packages/dht/src/browser/isBrowserEnvironment.ts @@ -0,0 +1 @@ +export const isBrowserEnvironment = true diff --git a/packages/dht/src/connection/Connection.ts b/packages/dht/src/connection/Connection.ts index a0bf8a052e..4d3141ed8f 100644 --- a/packages/dht/src/connection/Connection.ts +++ b/packages/dht/src/connection/Connection.ts @@ -1,4 +1,4 @@ -import EventEmitter from 'eventemitter3' +import { EventEmitter } from 'eventemitter3' import { PeerDescriptor } from '../../generated/packages/dht/protos/DhtRpc' import { ConnectionID, ConnectionType, ConnectionEvents } from './IConnection' import { v4 as uuid } from 'uuid' diff --git a/packages/dht/src/connection/ConnectionLockRpcLocal.ts b/packages/dht/src/connection/ConnectionLockRpcLocal.ts index 2a09fc4212..48228fcdca 100644 --- a/packages/dht/src/connection/ConnectionLockRpcLocal.ts +++ b/packages/dht/src/connection/ConnectionLockRpcLocal.ts @@ -12,7 +12,7 @@ import { } from '../../generated/packages/dht/protos/DhtRpc' import { IConnectionLockRpc } from '../../generated/packages/dht/protos/DhtRpc.server' import { DhtCallContext } from '../rpc-protocol/DhtCallContext' -import { getNodeIdOrUnknownFromPeerDescriptor } from './ConnectionManager' +import { getNodeIdOrUnknownFromPeerDescriptor } from './helpers/getNodeIdOrUnknownFromPeerDescriptor' import { LockID } from './ConnectionLockStates' import { DhtAddress, areEqualPeerDescriptors, toNodeId } from '../identifiers' diff --git a/packages/dht/src/connection/ConnectionManager.ts b/packages/dht/src/connection/ConnectionManager.ts index a9023c3afa..763706cb64 100644 --- a/packages/dht/src/connection/ConnectionManager.ts +++ b/packages/dht/src/connection/ConnectionManager.ts @@ -28,6 +28,7 @@ import { ConnectionsView } from './ConnectionsView' import { OutputBuffer } from './OutputBuffer' import { IConnection } from './IConnection' import { PendingConnection } from './PendingConnection' +import { getNodeIdOrUnknownFromPeerDescriptor } from './helpers/getNodeIdOrUnknownFromPeerDescriptor' export interface ConnectionManagerOptions { maxConnections?: number @@ -99,23 +100,6 @@ type Endpoint = ConnectedEndpoint | ConnectingEndpoint const INTERNAL_SERVICE_ID = 'system/connection-manager' -// Form an string representation from a peer description which can be undefined. This output -// should only be used only for log output. TODO remove this method if we no longer use -// peerDescriptors which can be undefined, e.g. -// - if we refactor ConnectionManager so that it doesn't process handshake requests too early -// and therefore this.localPeerDescriptor can't be undefine (NET-1129) -// - if the peerDescriptor of ManagedConnection is always available -// - if we create stricter types for incoming messages (message.sourceDescriptor or -// disconnectNotice.peerDescriptor) -// - if ManagedConnection#peerDescriptor is never undefined -export const getNodeIdOrUnknownFromPeerDescriptor = (peerDescriptor: PeerDescriptor | undefined): string => { - if (peerDescriptor !== undefined) { - return toNodeId(peerDescriptor) - } else { - return 'unknown' - } -} - export class ConnectionManager extends EventEmitter implements ITransport, ConnectionsView, ConnectionLocker { private options: ConnectionManagerOptions diff --git a/packages/dht/src/connection/ConnectorFacade.ts b/packages/dht/src/connection/ConnectorFacade.ts index 58a3ad164f..50c38cabe9 100644 --- a/packages/dht/src/connection/ConnectorFacade.ts +++ b/packages/dht/src/connection/ConnectorFacade.ts @@ -7,7 +7,8 @@ import { ITransport } from '../transport/ITransport' import { PortRange, TlsCertificate } from './ConnectionManager' import { Simulator } from './simulator/Simulator' import { SimulatorConnector } from './simulator/SimulatorConnector' -import { IceServer, WebrtcConnector } from './webrtc/WebrtcConnector' +import { WebrtcConnector } from './webrtc/WebrtcConnector' +import type { IceServer } from './webrtc/types' import { WebsocketClientConnector } from './websocket/WebsocketClientConnector' import { DhtAddress } from '../identifiers' import { WebsocketServerConnector, WebsocketServerConnectorOptions } from './websocket/WebsocketServerConnector' diff --git a/packages/dht/src/connection/ManagedConnection.ts b/packages/dht/src/connection/ManagedConnection.ts index 36c15c1dae..b17d5f9d20 100644 --- a/packages/dht/src/connection/ManagedConnection.ts +++ b/packages/dht/src/connection/ManagedConnection.ts @@ -2,8 +2,8 @@ import { ConnectionID, IConnection } from './IConnection' import * as Err from '../helpers/errors' import { PeerDescriptor } from '../../generated/packages/dht/protos/DhtRpc' import { Logger } from '@streamr/utils' -import EventEmitter from 'eventemitter3' -import { getNodeIdOrUnknownFromPeerDescriptor } from './ConnectionManager' +import { EventEmitter } from 'eventemitter3' +import { getNodeIdOrUnknownFromPeerDescriptor } from './helpers/getNodeIdOrUnknownFromPeerDescriptor' import { DhtAddress, toNodeId } from '../identifiers' import { createRandomConnectionId } from './Connection' diff --git a/packages/dht/src/connection/PendingConnection.ts b/packages/dht/src/connection/PendingConnection.ts index b0c0c05bcd..d6bb7a0503 100644 --- a/packages/dht/src/connection/PendingConnection.ts +++ b/packages/dht/src/connection/PendingConnection.ts @@ -1,7 +1,7 @@ -import EventEmitter from 'eventemitter3' +import { EventEmitter } from 'eventemitter3' import { PeerDescriptor } from '../../generated/packages/dht/protos/DhtRpc' import { Logger, setAbortableTimeout } from '@streamr/utils' -import { getNodeIdOrUnknownFromPeerDescriptor } from './ConnectionManager' +import { getNodeIdOrUnknownFromPeerDescriptor } from './helpers/getNodeIdOrUnknownFromPeerDescriptor' import { IConnection } from './IConnection' export interface PendingConnectionEvents { diff --git a/packages/dht/src/connection/connectivityChecker.ts b/packages/dht/src/connection/connectivityChecker.ts index b924e4d923..23e144d603 100644 --- a/packages/dht/src/connection/connectivityChecker.ts +++ b/packages/dht/src/connection/connectivityChecker.ts @@ -6,7 +6,7 @@ import { Message, PeerDescriptor } from '../../generated/packages/dht/protos/DhtRpc' import { IConnection } from './IConnection' -import { WebsocketClientConnection } from './websocket/NodeWebsocketClientConnection' +import { WebsocketClientConnection } from '@/WebsocketClientConnection' import { connectivityMethodToWebsocketUrl } from './websocket/WebsocketClientConnector' import { isMaybeSupportedProtocolVersion } from '../helpers/version' diff --git a/packages/dht/src/connection/connectivityRequestHandler.ts b/packages/dht/src/connection/connectivityRequestHandler.ts index 1fdb5f8957..89baca0233 100644 --- a/packages/dht/src/connection/connectivityRequestHandler.ts +++ b/packages/dht/src/connection/connectivityRequestHandler.ts @@ -11,7 +11,7 @@ import { IConnection } from './IConnection' import { WebsocketServerConnection } from './websocket/WebsocketServerConnection' import { connectivityMethodToWebsocketUrl } from './websocket/WebsocketClientConnector' import { LOCAL_PROTOCOL_VERSION } from '../helpers/version' -import { GeoIpLocator } from '@streamr/geoip-location' +import type { GeoIpLocator } from '@streamr/geoip-location' export const DISABLE_CONNECTIVITY_PROBE = 0 diff --git a/packages/dht/src/connection/helpers/getNodeIdOrUnknownFromPeerDescriptor.ts b/packages/dht/src/connection/helpers/getNodeIdOrUnknownFromPeerDescriptor.ts new file mode 100644 index 0000000000..9b33c318a6 --- /dev/null +++ b/packages/dht/src/connection/helpers/getNodeIdOrUnknownFromPeerDescriptor.ts @@ -0,0 +1,27 @@ +import type { PeerDescriptor } from '../../../generated/packages/dht/protos/DhtRpc' +import { toNodeId } from '../../identifiers' + +/** + * Retrieves a string representation of a node ID from a given peer descriptor. + * If the peer descriptor is undefined, it returns 'unknown'. + * + * This function is intended for logging purposes only and should be removed + * if the conditions outlined in the TODO comment are met, such as: + * - Refactoring ConnectionManager to prevent early processing of handshake requests, + * ensuring this.localPeerDescriptor is never undefined (NET-1129). + * - Ensuring the peerDescriptor of ManagedConnection is always available. + * - Creating stricter types for incoming messages, such as message.sourceDescriptor + * or disconnectNotice.peerDescriptor. + * - Guaranteeing that ManagedConnection#peerDescriptor is never undefined. + * + * @param peerDescriptor - The peer descriptor from which to derive the node ID, + * or undefined if not available. + * @returns A string representation of the node ID or 'unknown' if the peer descriptor is undefined. + */ +export const getNodeIdOrUnknownFromPeerDescriptor = (peerDescriptor: PeerDescriptor | undefined): string => { + if (peerDescriptor !== undefined) { + return toNodeId(peerDescriptor) + } else { + return 'unknown' + } +} diff --git a/packages/dht/src/connection/webrtc/WebrtcConnector.ts b/packages/dht/src/connection/webrtc/WebrtcConnector.ts index d5ab1170ee..96dbe41cf9 100644 --- a/packages/dht/src/connection/webrtc/WebrtcConnector.ts +++ b/packages/dht/src/connection/webrtc/WebrtcConnector.ts @@ -7,7 +7,7 @@ import { } from '../../../generated/packages/dht/protos/DhtRpc' import { ITransport } from '../../transport/ITransport' import { ListeningRpcCommunicator } from '../../transport/ListeningRpcCommunicator' -import { NodeWebrtcConnection } from './NodeWebrtcConnection' +import { WebrtcConnection } from '@/WebrtcConnection' import { WebrtcConnectorRpcRemote } from './WebrtcConnectorRpcRemote' import { WebrtcConnectorRpcClient } from '../../../generated/packages/dht/protos/DhtRpc.client' import { Logger } from '@streamr/utils' @@ -20,8 +20,9 @@ import { getOfferer } from '../../helpers/offering' import { acceptHandshake, createIncomingHandshaker, createOutgoingHandshaker, rejectHandshake } from '../Handshaker' import { isMaybeSupportedProtocolVersion } from '../../helpers/version' import { PendingConnection } from '../PendingConnection' +import type { IceServer } from './types' -const logger = new Logger(module) +const logger = new Logger('WebrtcConnector') export const replaceInternalIpWithExternalIp = (candidate: string, ip: string): string => { const parsed = candidate.split(' ') @@ -32,8 +33,6 @@ export const replaceInternalIpWithExternalIp = (candidate: string, ip: string): return parsed.join(' ') } -export const EARLY_TIMEOUT = 5000 - export interface WebrtcConnectorOptions { onNewConnection: (connection: PendingConnection) => boolean transport: ITransport @@ -46,17 +45,9 @@ export interface WebrtcConnectorOptions { portRange?: PortRange } -export interface IceServer { - url: string - port: number - username?: string - password?: string - tcp?: boolean -} - export interface ConnectingConnection { managedConnection: PendingConnection - connection: NodeWebrtcConnection + connection: WebrtcConnection } export class WebrtcConnector { @@ -204,8 +195,8 @@ export class WebrtcConnector { return pendingConnection } - private createConnection(targetPeerDescriptor: PeerDescriptor): NodeWebrtcConnection { - return new NodeWebrtcConnection({ + private createConnection(targetPeerDescriptor: PeerDescriptor): WebrtcConnection { + return new WebrtcConnection({ remotePeerDescriptor: targetPeerDescriptor, iceServers: this.options.iceServers, bufferThresholdLow: this.options.bufferThresholdLow, diff --git a/packages/dht/src/connection/webrtc/WebrtcConnectorRpcLocal.ts b/packages/dht/src/connection/webrtc/WebrtcConnectorRpcLocal.ts index 84e18284a0..8c91b542bf 100644 --- a/packages/dht/src/connection/webrtc/WebrtcConnectorRpcLocal.ts +++ b/packages/dht/src/connection/webrtc/WebrtcConnectorRpcLocal.ts @@ -11,7 +11,7 @@ import { import { IWebrtcConnectorRpc } from '../../../generated/packages/dht/protos/DhtRpc.server' import { DhtCallContext } from '../../rpc-protocol/DhtCallContext' import { ListeningRpcCommunicator } from '../../transport/ListeningRpcCommunicator' -import { NodeWebrtcConnection } from './NodeWebrtcConnection' +import type { WebrtcConnection } from '@/WebrtcConnection' import { DhtAddress, toNodeId } from '../../identifiers' import { ConnectionID } from '../IConnection' import { ConnectingConnection } from './WebrtcConnector' @@ -50,7 +50,7 @@ export class WebrtcConnectorRpcLocal implements IWebrtcConnectorRpc { async rtcOffer(request: RtcOffer, context: ServerCallContext): Promise { const remotePeerDescriptor = (context as DhtCallContext).incomingSourceDescriptor! const nodeId = toNodeId(remotePeerDescriptor) - let connection: NodeWebrtcConnection + let connection: WebrtcConnection let pendingConnection: PendingConnection if (!this.options.ongoingConnectAttempts.has(nodeId)) { diff --git a/packages/dht/src/connection/webrtc/consts.ts b/packages/dht/src/connection/webrtc/consts.ts new file mode 100644 index 0000000000..c07acfd5eb --- /dev/null +++ b/packages/dht/src/connection/webrtc/consts.ts @@ -0,0 +1 @@ +export const EARLY_TIMEOUT = 5000 diff --git a/packages/dht/src/connection/webrtc/iceServerAsString.ts b/packages/dht/src/connection/webrtc/iceServerAsString.ts index c204464c07..4ffdb588e8 100644 --- a/packages/dht/src/connection/webrtc/iceServerAsString.ts +++ b/packages/dht/src/connection/webrtc/iceServerAsString.ts @@ -1,4 +1,4 @@ -import { IceServer } from './WebrtcConnector' +import { IceServer } from './types' export function iceServerAsString({ url, port, username, password, tcp }: IceServer): string { const [protocol, hostname] = url.split(':') diff --git a/packages/dht/src/connection/webrtc/types.ts b/packages/dht/src/connection/webrtc/types.ts new file mode 100644 index 0000000000..f0b1acb566 --- /dev/null +++ b/packages/dht/src/connection/webrtc/types.ts @@ -0,0 +1,7 @@ +export interface IceServer { + url: string + port: number + username?: string + password?: string + tcp?: boolean +} diff --git a/packages/dht/src/connection/websocket/AbstractWebsocketClientConnection.ts b/packages/dht/src/connection/websocket/AbstractWebsocketClientConnection.ts index 1db4e88e47..fdc2565ff7 100644 --- a/packages/dht/src/connection/websocket/AbstractWebsocketClientConnection.ts +++ b/packages/dht/src/connection/websocket/AbstractWebsocketClientConnection.ts @@ -1,4 +1,4 @@ -import EventEmitter from 'eventemitter3' +import { EventEmitter } from 'eventemitter3' import { createRandomConnectionId } from '../Connection' import { ConnectionEvents, ConnectionID, ConnectionType, IConnection } from '../IConnection' import { Logger } from '@streamr/utils' diff --git a/packages/dht/src/connection/websocket/AutoCertifierClientFacade.ts b/packages/dht/src/connection/websocket/AutoCertifierClientFacade.ts index e228801c17..28c0442f0e 100644 --- a/packages/dht/src/connection/websocket/AutoCertifierClientFacade.ts +++ b/packages/dht/src/connection/websocket/AutoCertifierClientFacade.ts @@ -1,36 +1,14 @@ import { - AutoCertifierClient, - HasSessionRequest, - HasSessionResponse, - CertifiedSubdomain, + type CertifiedSubdomain, SERVICE_ID as AUTO_CERTIFIER_SERVICE_ID, - HasSession } from '@streamr/autocertifier-client' import { ListeningRpcCommunicator } from '../../transport/ListeningRpcCommunicator' import { Logger, waitForEvent } from '@streamr/utils' import { ITransport } from '../../transport/ITransport' +import { defaultAutoCertifierClientFactory } from '@/defaultAutoCertifierClientFactory' const START_TIMEOUT = 60 * 1000 -const defaultAutoCertifierClientFactory = ( - configFile: string, - autoCertifierUrl: string, - autoCertifierRpcCommunicator: ListeningRpcCommunicator, - wsServerPort: number -) => new AutoCertifierClient( - configFile, - wsServerPort, - autoCertifierUrl, - (_serviceId: string, rpcMethodName: string, method: HasSession) => { - autoCertifierRpcCommunicator.registerRpcMethod( - HasSessionRequest, - HasSessionResponse, - rpcMethodName, - method - ) - } -) - export interface IAutoCertifierClient { start(): Promise stop(): void diff --git a/packages/dht/src/connection/websocket/WebsocketClientConnector.ts b/packages/dht/src/connection/websocket/WebsocketClientConnector.ts index 5dc5b0e573..4fb0b51178 100644 --- a/packages/dht/src/connection/websocket/WebsocketClientConnector.ts +++ b/packages/dht/src/connection/websocket/WebsocketClientConnector.ts @@ -1,4 +1,4 @@ -import { WebsocketClientConnection } from './NodeWebsocketClientConnection' +import { WebsocketClientConnection } from '@/WebsocketClientConnection' import { ConnectionType } from '../IConnection' import { ListeningRpcCommunicator } from '../../transport/ListeningRpcCommunicator' import { WebsocketClientConnectorRpcLocal } from './WebsocketClientConnectorRpcLocal' @@ -7,13 +7,13 @@ import { PeerDescriptor, WebsocketConnectionRequest } from '../../../generated/packages/dht/protos/DhtRpc' -import { WebsocketServer } from './WebsocketServer' +import type { IWebsocketServer } from './types' import { createOutgoingHandshaker } from '../Handshaker' import { ServerCallContext } from '@protobuf-ts/runtime-rpc' import { expectedConnectionType } from '../../helpers/Connectivity' import { Empty } from '../../../generated/google/protobuf/empty' import { DhtAddress, toNodeId } from '../../identifiers' -import { GeoIpLocator } from '@streamr/geoip-location' +import type { GeoIpLocator } from '@streamr/geoip-location' import { PendingConnection } from '../PendingConnection' export type Action = 'connectivityRequest' | 'connectivityProbe' @@ -31,7 +31,7 @@ export interface WebsocketClientConnectorOptions { export class WebsocketClientConnector { public static readonly WEBSOCKET_CONNECTOR_SERVICE_ID = 'system/websocket-connector' - private readonly websocketServer?: WebsocketServer + private readonly websocketServer?: IWebsocketServer private geoIpLocator?: GeoIpLocator private localPeerDescriptor?: PeerDescriptor diff --git a/packages/dht/src/connection/websocket/WebsocketServerConnection.ts b/packages/dht/src/connection/websocket/WebsocketServerConnection.ts index fe0378021f..4d7f599c0b 100644 --- a/packages/dht/src/connection/websocket/WebsocketServerConnection.ts +++ b/packages/dht/src/connection/websocket/WebsocketServerConnection.ts @@ -1,4 +1,4 @@ -import EventEmitter from 'eventemitter3' +import { EventEmitter } from 'eventemitter3' import { IConnection, ConnectionID, ConnectionEvents, ConnectionType } from '../IConnection' import WebSocket from 'ws' import { Logger } from '@streamr/utils' diff --git a/packages/dht/src/connection/websocket/WebsocketServerConnector.ts b/packages/dht/src/connection/websocket/WebsocketServerConnector.ts index 06f09dfc8b..7492f66c85 100644 --- a/packages/dht/src/connection/websocket/WebsocketServerConnector.ts +++ b/packages/dht/src/connection/websocket/WebsocketServerConnector.ts @@ -1,7 +1,8 @@ -import { GeoIpLocator } from '@streamr/geoip-location' +import type { GeoIpLocator } from '@streamr/geoip-location' +import { createGeoipLocator } from '@/createGeoipLocator' import { ListeningRpcCommunicator } from '../../transport/ListeningRpcCommunicator' import { Action, connectivityMethodToWebsocketUrl } from './WebsocketClientConnector' -import { WebsocketServer } from './WebsocketServer' +import { WebsocketServer } from '@/WebsocketServer' import { areEqualPeerDescriptors, DhtAddress, toNodeId } from '../../identifiers' import { AutoCertifierClientFacade } from './AutoCertifierClientFacade' import { ConnectivityResponse, HandshakeError, PeerDescriptor } from '../../../generated/packages/dht/protos/DhtRpc' @@ -96,10 +97,8 @@ export class WebsocketServerConnector { }) if (this.options.geoIpDatabaseFolder) { - const geoIpLocator = new GeoIpLocator(this.options.geoIpDatabaseFolder) try { - await geoIpLocator.start() - this.geoIpLocator = geoIpLocator + this.geoIpLocator = await createGeoipLocator(this.options.geoIpDatabaseFolder) } catch (err) { logger.error('Failed to start GeoIpLocator', { err }) } diff --git a/packages/dht/src/connection/websocket/types.ts b/packages/dht/src/connection/websocket/types.ts new file mode 100644 index 0000000000..974f21c32c --- /dev/null +++ b/packages/dht/src/connection/websocket/types.ts @@ -0,0 +1,20 @@ +import type { EventEmitter } from 'eventemitter3' +import type { PortRange, TlsCertificate } from '../ConnectionManager' +import type { IConnection } from '../IConnection' + +export interface WebsocketServerEvents { + connected: ((connection: IConnection) => void) +} + +export interface WebsocketServerOptions { + portRange: PortRange + enableTls: boolean + tlsCertificate?: TlsCertificate + maxMessageSize?: number +} + +export interface IWebsocketServer extends EventEmitter { + start(): Promise + stop(): Promise + updateCertificate(cert: string, key: string): void +} diff --git a/packages/dht/src/dht/DhtNode.ts b/packages/dht/src/dht/DhtNode.ts index 11f7f16bd1..9c632c4772 100644 --- a/packages/dht/src/dht/DhtNode.ts +++ b/packages/dht/src/dht/DhtNode.ts @@ -13,8 +13,7 @@ import type { MarkRequired } from 'ts-essentials' import { ConnectionLocker, ConnectionManager, PortRange, TlsCertificate } from '../connection/ConnectionManager' import { ConnectionsView } from '../connection/ConnectionsView' import { DefaultConnectorFacade, DefaultConnectorFacadeOptions } from '../connection/ConnectorFacade' -import { IceServer } from '../connection/webrtc/WebrtcConnector' -import { isBrowserEnvironment } from '../helpers/browser/isBrowserEnvironment' +import type { IceServer } from '../connection/webrtc/types' import { createPeerDescriptor } from '../helpers/createPeerDescriptor' import { DhtAddress, KADEMLIA_ID_LENGTH_IN_BYTES, toNodeId } from '../identifiers' import { Any } from '../../generated/google/protobuf/any' @@ -54,6 +53,8 @@ import { LocalDataStore } from './store/LocalDataStore' import { StoreManager } from './store/StoreManager' import { StoreRpcRemote } from './store/StoreRpcRemote' import { getLocalRegionByCoordinates, getLocalRegionWithCache } from '@streamr/cdn-location' +import { isBrowserEnvironment } from '@/isBrowserEnvironment' +import { CONTROL_LAYER_NODE_SERVICE_ID } from './consts' export interface DhtNodeEvents extends TransportEvents { nearbyContactAdded: (peerDescriptor: PeerDescriptor) => void @@ -132,9 +133,6 @@ const logger = new Logger('DhtNode') export const NUMBER_OF_NODES_PER_KBUCKET_DEFAULT = 8 const PERIODICAL_PING_INTERVAL = 60 * 1000 -// TODO move this to trackerless-network package and change serviceId to be a required paramater -export const CONTROL_LAYER_NODE_SERVICE_ID = 'layer0' - export class DhtNode extends EventEmitter implements ITransport { private readonly options: StrictDhtNodeOptions @@ -200,7 +198,7 @@ export class DhtNode extends EventEmitter implements ITransport { logger.trace(`Starting new Streamr Network DHT Node with serviceId ${this.options.serviceId}`) this.started = true - if (isBrowserEnvironment()) { + if (isBrowserEnvironment) { this.options.websocketPortRange = undefined if (this.options.peerDescriptor) { this.options.peerDescriptor.websocket = undefined diff --git a/packages/dht/src/dht/PeerManager.ts b/packages/dht/src/dht/PeerManager.ts index d05cfb92db..1039f58e84 100644 --- a/packages/dht/src/dht/PeerManager.ts +++ b/packages/dht/src/dht/PeerManager.ts @@ -1,11 +1,9 @@ -import { - Logger -} from '@streamr/utils' -import EventEmitter from 'eventemitter3' +import { Logger } from '@streamr/utils' +import { EventEmitter } from 'eventemitter3' import KBucket from 'k-bucket' import { LockID } from '../connection/ConnectionLockStates' import { ConnectionLocker } from '../connection/ConnectionManager' -import { DhtAddress, DhtAddressRaw, toNodeId, toDhtAddressRaw } from '../identifiers' +import { DhtAddress, toNodeId, toDhtAddressRaw } from '../identifiers' import { PeerDescriptor } from '../../generated/packages/dht/protos/DhtRpc' @@ -54,10 +52,6 @@ export interface PeerManagerEvents { kBucketEmpty: () => void } -export const getDistance = (nodeIdOrDataKeyRaw1: DhtAddressRaw, nodeIdOrDataKeyRaw2: DhtAddressRaw): number => { - return KBucket.distance(nodeIdOrDataKeyRaw1, nodeIdOrDataKeyRaw2) -} - export class PeerManager extends EventEmitter { // Glossary: diff --git a/packages/dht/src/dht/consts.ts b/packages/dht/src/dht/consts.ts new file mode 100644 index 0000000000..eee28b1fd8 --- /dev/null +++ b/packages/dht/src/dht/consts.ts @@ -0,0 +1,2 @@ +// TODO move this to trackerless-network package and change serviceId to be a required paramater +export const CONTROL_LAYER_NODE_SERVICE_ID = 'layer0' diff --git a/packages/dht/src/dht/contact/ContactList.ts b/packages/dht/src/dht/contact/ContactList.ts index 8e4e6a0ff5..05f6f41c99 100644 --- a/packages/dht/src/dht/contact/ContactList.ts +++ b/packages/dht/src/dht/contact/ContactList.ts @@ -1,4 +1,4 @@ -import EventEmitter from 'eventemitter3' +import { EventEmitter } from 'eventemitter3' import { DhtAddress } from '../../identifiers' export interface Events { diff --git a/packages/dht/src/dht/contact/RingContactList.ts b/packages/dht/src/dht/contact/RingContactList.ts index fea502e8a8..27bf9ebb65 100644 --- a/packages/dht/src/dht/contact/RingContactList.ts +++ b/packages/dht/src/dht/contact/RingContactList.ts @@ -2,7 +2,7 @@ import { PeerDescriptor } from '../../../generated/packages/dht/protos/DhtRpc' import { OrderedMap } from '@js-sdsl/ordered-map' import { RingDistance, RingId, RingIdRaw, getLeftDistance, getRightDistance, getRingIdFromPeerDescriptor, getRingIdFromRaw } from './ringIdentifiers' import { DhtAddress, toNodeId } from '../../identifiers' -import EventEmitter from 'eventemitter3' +import { EventEmitter } from 'eventemitter3' import { Events } from './ContactList' export interface RingContacts { diff --git a/packages/dht/src/dht/contact/SortedContactList.ts b/packages/dht/src/dht/contact/SortedContactList.ts index 73c0055022..f110ae014e 100755 --- a/packages/dht/src/dht/contact/SortedContactList.ts +++ b/packages/dht/src/dht/contact/SortedContactList.ts @@ -1,7 +1,7 @@ import { Events } from './ContactList' import sortedIndexBy from 'lodash/sortedIndexBy' -import EventEmitter from 'eventemitter3' -import { getDistance } from '../PeerManager' +import { EventEmitter } from 'eventemitter3' +import { getPeerDistance } from '../helpers/getPeerDistance' import { DhtAddress, toDhtAddressRaw } from '../../identifiers' // add other getters in the future if needed @@ -120,7 +120,7 @@ export class SortedContactList DhtAddress }> extend // TODO inline this method? private distanceToReferenceId(id: DhtAddress): number { // TODO maybe this class should store the referenceId also as DhtAddressRaw so that we don't need to convert it here? - return getDistance(toDhtAddressRaw(this.options.referenceId), toDhtAddressRaw(id)) + return getPeerDistance(toDhtAddressRaw(this.options.referenceId), toDhtAddressRaw(id)) } public removeContact(id: DhtAddress): boolean { diff --git a/packages/dht/src/dht/contact/getClosestNodes.ts b/packages/dht/src/dht/contact/getClosestNodes.ts index 864687b807..2266d1ee52 100644 --- a/packages/dht/src/dht/contact/getClosestNodes.ts +++ b/packages/dht/src/dht/contact/getClosestNodes.ts @@ -1,4 +1,4 @@ -import { PeerDescriptor } from '../../exports' +import { PeerDescriptor } from '../../../generated/packages/dht/protos/DhtRpc' import { DhtAddress } from '../../identifiers' import { Contact } from './Contact' import { SortedContactList } from './SortedContactList' diff --git a/packages/dht/src/dht/discovery/DiscoverySession.ts b/packages/dht/src/dht/discovery/DiscoverySession.ts index 700aaca223..940e039390 100644 --- a/packages/dht/src/dht/discovery/DiscoverySession.ts +++ b/packages/dht/src/dht/discovery/DiscoverySession.ts @@ -3,7 +3,8 @@ import { v4 } from 'uuid' import { DhtAddress, toNodeId, toDhtAddressRaw } from '../../identifiers' import { PeerDescriptor } from '../../../generated/packages/dht/protos/DhtRpc' import { DhtNodeRpcRemote } from '../DhtNodeRpcRemote' -import { PeerManager, getDistance } from '../PeerManager' +import { PeerManager } from '../PeerManager' +import { getPeerDistance } from '../helpers/getPeerDistance' import { getClosestNodes } from '../contact/getClosestNodes' const logger = new Logger('DiscoverySession') @@ -60,10 +61,10 @@ export class DiscoverySession { this.ongoingRequests.delete(nodeId) const targetId = toDhtAddressRaw(this.options.targetId) const oldClosestNeighbor = this.getClosestNeighbor() - const oldClosestDistance = getDistance(targetId, oldClosestNeighbor.nodeId) + const oldClosestDistance = getPeerDistance(targetId, oldClosestNeighbor.nodeId) this.addContacts(contacts) const newClosestNeighbor = this.getClosestNeighbor() - const newClosestDistance = getDistance(targetId, newClosestNeighbor.nodeId) + const newClosestDistance = getPeerDistance(targetId, newClosestNeighbor.nodeId) if (newClosestDistance >= oldClosestDistance) { this.noProgressCounter++ } diff --git a/packages/dht/src/dht/discovery/PeerDiscovery.ts b/packages/dht/src/dht/discovery/PeerDiscovery.ts index b1dd5d1663..42ea56e029 100644 --- a/packages/dht/src/dht/discovery/PeerDiscovery.ts +++ b/packages/dht/src/dht/discovery/PeerDiscovery.ts @@ -16,7 +16,7 @@ import { getClosestNodes } from '../contact/getClosestNodes' import { RingIdRaw, getRingIdRawFromPeerDescriptor } from '../contact/ringIdentifiers' import { DiscoverySession } from './DiscoverySession' import { RingDiscoverySession } from './RingDiscoverySession' -import { CONTROL_LAYER_NODE_SERVICE_ID } from '../DhtNode' +import { CONTROL_LAYER_NODE_SERVICE_ID } from '../consts' interface PeerDiscoveryOptions { localPeerDescriptor: PeerDescriptor diff --git a/packages/dht/src/dht/helpers/getPeerDistance.ts b/packages/dht/src/dht/helpers/getPeerDistance.ts new file mode 100644 index 0000000000..592619929d --- /dev/null +++ b/packages/dht/src/dht/helpers/getPeerDistance.ts @@ -0,0 +1,9 @@ +import KBucket from 'k-bucket' +import { DhtAddressRaw } from '../../identifiers' + +export const getPeerDistance = ( + nodeIdOrDataKeyRaw1: DhtAddressRaw, + nodeIdOrDataKeyRaw2: DhtAddressRaw +): number => { + return KBucket.distance(nodeIdOrDataKeyRaw1, nodeIdOrDataKeyRaw2) +} diff --git a/packages/dht/src/dht/recursive-operation/RecursiveOperationManager.ts b/packages/dht/src/dht/recursive-operation/RecursiveOperationManager.ts index bea14f6bc2..0cffa8b837 100644 --- a/packages/dht/src/dht/recursive-operation/RecursiveOperationManager.ts +++ b/packages/dht/src/dht/recursive-operation/RecursiveOperationManager.ts @@ -24,8 +24,8 @@ import { createRouteMessageAck } from '../routing/RouterRpcLocal' import { ServiceID } from '../../types/ServiceID' import { RecursiveOperationRpcLocal } from './RecursiveOperationRpcLocal' import { DhtAddress, areEqualPeerDescriptors, toDhtAddress, toNodeId, toDhtAddressRaw } from '../../identifiers' -import { getDistance } from '../PeerManager' -import { ConnectionsView } from '../../exports' +import { getPeerDistance } from '../helpers/getPeerDistance' +import { ConnectionsView } from '../../connection/ConnectionsView' interface RecursiveOperationManagerOptions { rpcCommunicator: RoutingRpcCommunicator @@ -233,8 +233,8 @@ export class RecursiveOperationManager { private isPeerCloserToIdThanSelf(peer: PeerDescriptor, nodeIdOrDataKey: DhtAddress): boolean { const nodeIdOrDataKeyRaw = toDhtAddressRaw(nodeIdOrDataKey) - const distance1 = getDistance(peer.nodeId, nodeIdOrDataKeyRaw) - const distance2 = getDistance(this.options.localPeerDescriptor.nodeId, nodeIdOrDataKeyRaw) + const distance1 = getPeerDistance(peer.nodeId, nodeIdOrDataKeyRaw) + const distance2 = getPeerDistance(this.options.localPeerDescriptor.nodeId, nodeIdOrDataKeyRaw) return distance1 < distance2 } diff --git a/packages/dht/src/dht/recursive-operation/RecursiveOperationSession.ts b/packages/dht/src/dht/recursive-operation/RecursiveOperationSession.ts index 18dfde8355..b23d98c055 100644 --- a/packages/dht/src/dht/recursive-operation/RecursiveOperationSession.ts +++ b/packages/dht/src/dht/recursive-operation/RecursiveOperationSession.ts @@ -1,4 +1,4 @@ -import EventEmitter from 'eventemitter3' +import { EventEmitter } from 'eventemitter3' import { v4 } from 'uuid' import { DataEntry, diff --git a/packages/dht/src/dht/routing/RoutingSession.ts b/packages/dht/src/dht/routing/RoutingSession.ts index 355078b3c2..4237d76849 100644 --- a/packages/dht/src/dht/routing/RoutingSession.ts +++ b/packages/dht/src/dht/routing/RoutingSession.ts @@ -1,6 +1,6 @@ import { SortedContactList } from '../contact/SortedContactList' import { Logger } from '@streamr/utils' -import EventEmitter from 'eventemitter3' +import { EventEmitter } from 'eventemitter3' import { v4 } from 'uuid' import { PeerDescriptor, RouteMessageWrapper } from '../../../generated/packages/dht/protos/DhtRpc' import { RouterRpcRemote, ROUTING_TIMEOUT } from './RouterRpcRemote' diff --git a/packages/dht/src/exports.ts b/packages/dht/src/exports.ts index 6fe245fe1e..bfc02b6260 100644 --- a/packages/dht/src/exports.ts +++ b/packages/dht/src/exports.ts @@ -12,9 +12,9 @@ export type { LockID } from './connection/ConnectionLockStates' export { DefaultConnectorFacade } from './connection/ConnectorFacade' export type { DhtRpcOptions } from './rpc-protocol/DhtRpcOptions' export { RpcRemote, EXISTING_CONNECTION_TIMEOUT } from './dht/contact/RpcRemote' -export type { IceServer } from './connection/webrtc/WebrtcConnector' +export type { IceServer } from './connection/webrtc/types' export { DhtCallContext } from './rpc-protocol/DhtCallContext' -export { WebsocketClientConnection } from './connection/websocket/NodeWebsocketClientConnection' +export { WebsocketClientConnection } from '@/WebsocketClientConnection' export { ManagedConnection } from './connection/ManagedConnection' export { PendingConnection } from './connection/PendingConnection' export type { IConnection } from './connection/IConnection' diff --git a/packages/dht/src/helpers/browser/isBrowserEnvironment.ts b/packages/dht/src/helpers/browser/isBrowserEnvironment.ts deleted file mode 100644 index ac3c121acb..0000000000 --- a/packages/dht/src/helpers/browser/isBrowserEnvironment.ts +++ /dev/null @@ -1 +0,0 @@ -export const isBrowserEnvironment = (): boolean => false diff --git a/packages/dht/src/helpers/browser/isBrowserEnvironment_override.ts b/packages/dht/src/helpers/browser/isBrowserEnvironment_override.ts deleted file mode 100644 index 38c7c9c2ac..0000000000 --- a/packages/dht/src/helpers/browser/isBrowserEnvironment_override.ts +++ /dev/null @@ -1,3 +0,0 @@ -// webpack overwrites the isBrowserEnvironment.ts with this file when it creates the browser bundle - -export const isBrowserEnvironment = (): boolean => true diff --git a/packages/dht/src/helpers/createPeerDescriptor.ts b/packages/dht/src/helpers/createPeerDescriptor.ts index f9c05f8a14..b7731d7e76 100644 --- a/packages/dht/src/helpers/createPeerDescriptor.ts +++ b/packages/dht/src/helpers/createPeerDescriptor.ts @@ -1,6 +1,5 @@ -import { EcdsaSecp256k1Evm } from '@streamr/utils' -import crypto from 'crypto' -import { isBrowserEnvironment } from '../helpers/browser/isBrowserEnvironment' +import { EcdsaSecp256k1Evm, randomBytes } from '@streamr/utils' +import { isBrowserEnvironment } from '@/isBrowserEnvironment' import { createPeerDescriptorSignaturePayload } from '../helpers/createPeerDescriptorSignaturePayload' import { DhtAddress, DhtAddressRaw, toDhtAddressRaw } from '../identifiers' import { @@ -30,8 +29,8 @@ const calculateNodeIdRaw = async (ipAddress: number, privateKey: Uint8Array): Pr export const createPeerDescriptor = async (connectivityResponse: ConnectivityResponse, region: number, nodeId?: DhtAddress): Promise => { - const privateKey = crypto.randomBytes(32) - const publicKey = crypto.randomBytes(20) // TODO calculate publicKey from privateKey + const privateKey = randomBytes(32) + const publicKey = randomBytes(20) // TODO calculate publicKey from privateKey let nodeIdRaw: DhtAddressRaw if (nodeId !== undefined) { nodeIdRaw = toDhtAddressRaw(nodeId) @@ -40,7 +39,7 @@ export const createPeerDescriptor = async (connectivityResponse: ConnectivityRes } const ret: PeerDescriptor = { nodeId: nodeIdRaw, - type: isBrowserEnvironment() ? NodeType.BROWSER : NodeType.NODEJS, + type: isBrowserEnvironment ? NodeType.BROWSER : NodeType.NODEJS, ipAddress: connectivityResponse.ipAddress, region, publicKey diff --git a/packages/dht/src/helpers/offering.ts b/packages/dht/src/helpers/offering.ts index fc103de7c0..297364f8b0 100644 --- a/packages/dht/src/helpers/offering.ts +++ b/packages/dht/src/helpers/offering.ts @@ -1,4 +1,4 @@ -import crypto from 'crypto' +import { computeMd5 } from '@streamr/utils' import { DhtAddress } from '../identifiers' type Offerer = 'local' | 'remote' @@ -10,6 +10,5 @@ export const getOfferer = (localNodeId: DhtAddress, remoteNodeId: DhtAddress): O } const getOfferingHash = (idPair: string): number => { - const buffer = crypto.createHash('md5').update(idPair).digest() - return buffer.readInt32LE(0) + return computeMd5(idPair).readInt32LE(0) } diff --git a/packages/dht/src/helpers/protoClasses.ts b/packages/dht/src/helpers/protoClasses.ts index 1af21d297e..7c42f7903f 100644 --- a/packages/dht/src/helpers/protoClasses.ts +++ b/packages/dht/src/helpers/protoClasses.ts @@ -25,7 +25,6 @@ import { LockRequest, UnlockRequest, LockResponse - } from '../../generated/packages/dht/protos/DhtRpc' export const protoClasses: IMessageType[] = [ diff --git a/packages/dht/src/helpers/protoToString.ts b/packages/dht/src/helpers/protoToString.ts index 0eb1d64e5b..9dc6e2cb40 100644 --- a/packages/dht/src/helpers/protoToString.ts +++ b/packages/dht/src/helpers/protoToString.ts @@ -1,5 +1,4 @@ import { IMessageType } from '@protobuf-ts/runtime' - import { protoClasses } from './protoClasses' import { protoClasses as rpcProtoClasses } from '@streamr/proto-rpc' diff --git a/packages/dht/src/identifiers.ts b/packages/dht/src/identifiers.ts index 1be870bb7d..5177ab7470 100644 --- a/packages/dht/src/identifiers.ts +++ b/packages/dht/src/identifiers.ts @@ -1,5 +1,4 @@ -import { BrandedString, areEqualBinaries, binaryToHex, hexToBinary } from '@streamr/utils' -import crypto from 'crypto' +import { BrandedString, areEqualBinaries, binaryToHex, hexToBinary, randomBytes } from '@streamr/utils' import { PeerDescriptor } from '../generated/packages/dht/protos/DhtRpc' // https://www.scs.stanford.edu/~dm/home/papers/kpos.pdf @@ -25,5 +24,5 @@ export const areEqualPeerDescriptors = (peerDescriptor1: PeerDescriptor, peerDes } export const randomDhtAddress = (): DhtAddress => { - return toDhtAddress(crypto.randomBytes(KADEMLIA_ID_LENGTH_IN_BYTES)) + return toDhtAddress(randomBytes(KADEMLIA_ID_LENGTH_IN_BYTES)) } diff --git a/packages/dht/src/connection/webrtc/NodeWebrtcConnection.ts b/packages/dht/src/nodejs/WebrtcConnection.ts similarity index 88% rename from packages/dht/src/connection/webrtc/NodeWebrtcConnection.ts rename to packages/dht/src/nodejs/WebrtcConnection.ts index 7d0434f50b..88dd2b0916 100644 --- a/packages/dht/src/connection/webrtc/NodeWebrtcConnection.ts +++ b/packages/dht/src/nodejs/WebrtcConnection.ts @@ -1,26 +1,19 @@ -import { IWebrtcConnection, WebrtcConnectionEvents } from './IWebrtcConnection' -import { ConnectionType, IConnection, ConnectionID } from '../IConnection' -import { PeerDescriptor } from '../../../generated/packages/dht/protos/DhtRpc' -import EventEmitter from 'eventemitter3' +import { IWebrtcConnection, WebrtcConnectionEvents } from '../connection/webrtc/IWebrtcConnection' +import { ConnectionType, IConnection, ConnectionID } from '../connection/IConnection' +import { PeerDescriptor } from '../../generated/packages/dht/protos/DhtRpc' +import { EventEmitter } from 'eventemitter3' import { DataChannel, DescriptionType, PeerConnection, initLogger } from 'node-datachannel' import { Logger } from '@streamr/utils' -import { IllegalRtcPeerConnectionState } from '../../helpers/errors' -import { iceServerAsString } from './iceServerAsString' -import { IceServer, EARLY_TIMEOUT } from './WebrtcConnector' -import { PortRange } from '../ConnectionManager' -import { toNodeId } from '../../identifiers' -import { createRandomConnectionId } from '../Connection' - -const logger = new Logger('NodeWebrtcConnection') - -export interface Params { - remotePeerDescriptor: PeerDescriptor - bufferThresholdHigh?: number - bufferThresholdLow?: number - maxMessageSize?: number - iceServers?: IceServer[] // TODO make this parameter required (empty array is a good fallback which can be set by the caller if needed) - portRange?: PortRange -} +import { IllegalRtcPeerConnectionState } from '../helpers/errors' +import { iceServerAsString } from '../connection/webrtc/iceServerAsString' +import { IceServer } from '../connection/webrtc/types' +import { EARLY_TIMEOUT } from '../connection/webrtc/consts' +import { PortRange } from '../connection/ConnectionManager' +import { toNodeId } from '../identifiers' +import { createRandomConnectionId } from '../connection/Connection' +import type { WebrtcConnectionParams } from '../types/WebrtcConnectionParams' + +const logger = new Logger('WebrtcConnection (Node)') // Re-defined accoring to https://github.com/microsoft/TypeScript/blob/main/src/lib/dom.generated.d.ts // because importing single dom definitions in not possible @@ -38,7 +31,7 @@ initLogger('Fatal') type RtcPeerConnectionState = keyof typeof RtcPeerConnectionStateEnum -export class NodeWebrtcConnection extends EventEmitter implements IConnection, IWebrtcConnection { +export class WebrtcConnection extends EventEmitter implements IConnection, IWebrtcConnection { public connectionId: ConnectionID private connection?: PeerConnection @@ -57,7 +50,7 @@ export class NodeWebrtcConnection extends EventEmitter i private offering?: boolean private readonly earlyTimeout: NodeJS.Timeout - constructor(params: Params) { + constructor(params: WebrtcConnectionParams) { super() this.connectionId = createRandomConnectionId() this.iceServers = params.iceServers ?? [] diff --git a/packages/dht/src/connection/websocket/NodeWebsocketClientConnection.ts b/packages/dht/src/nodejs/WebsocketClientConnection.ts similarity index 89% rename from packages/dht/src/connection/websocket/NodeWebsocketClientConnection.ts rename to packages/dht/src/nodejs/WebsocketClientConnection.ts index d0c15c33fd..98fd2263a5 100644 --- a/packages/dht/src/connection/websocket/NodeWebsocketClientConnection.ts +++ b/packages/dht/src/nodejs/WebsocketClientConnection.ts @@ -1,8 +1,8 @@ import { Logger, binaryToUtf8 } from '@streamr/utils' import { WebSocket } from 'ws' -import { AbstractWebsocketClientConnection } from './AbstractWebsocketClientConnection' +import { AbstractWebsocketClientConnection } from '../connection/websocket/AbstractWebsocketClientConnection' -const logger = new Logger('NodeWebsocketClientConnection') +const logger = new Logger('WebsocketClientConnection (Node)') const BINARY_TYPE = 'nodebuffer' diff --git a/packages/dht/src/connection/websocket/WebsocketServer.ts b/packages/dht/src/nodejs/WebsocketServer.ts similarity index 90% rename from packages/dht/src/connection/websocket/WebsocketServer.ts rename to packages/dht/src/nodejs/WebsocketServer.ts index 785de0e403..21cae994aa 100644 --- a/packages/dht/src/connection/websocket/WebsocketServer.ts +++ b/packages/dht/src/nodejs/WebsocketServer.ts @@ -1,32 +1,20 @@ import { createServer as createHttpServer, Server as HttpServer, IncomingMessage, ServerResponse } from 'http' import { createServer as createHttpsServer, Server as HttpsServer } from 'https' -import EventEmitter from 'eventemitter3' +import { EventEmitter } from 'eventemitter3' import WebSocket, { WebSocketServer } from 'ws' -import { WebsocketServerConnection } from './WebsocketServerConnection' +import { WebsocketServerConnection } from '../connection/websocket/WebsocketServerConnection' import { Logger, asAbortable } from '@streamr/utils' import { createSelfSignedCertificate } from '@streamr/autocertifier-client' -import { WebsocketServerStartError } from '../../helpers/errors' -import { PortRange, TlsCertificate } from '../ConnectionManager' +import { WebsocketServerStartError } from '../helpers/errors' import range from 'lodash/range' import fs from 'fs' import { v4 as uuid } from 'uuid' import { parse } from 'url' -import { IConnection } from '../IConnection' +import type { IWebsocketServer, WebsocketServerEvents, WebsocketServerOptions } from '../connection/websocket/types' -const logger = new Logger('WebsocketServer') +const logger = new Logger('WebsocketServer (Node)') -interface WebsocketServerOptions { - portRange: PortRange - enableTls: boolean - tlsCertificate?: TlsCertificate - maxMessageSize?: number -} - -interface Events { - connected: ((connection: IConnection) => void) -} - -export class WebsocketServer extends EventEmitter { +export class WebsocketServer extends EventEmitter implements IWebsocketServer { private httpServer?: HttpServer | HttpsServer private wsServer?: WebSocketServer diff --git a/packages/dht/src/nodejs/createGeoipLocator.ts b/packages/dht/src/nodejs/createGeoipLocator.ts new file mode 100644 index 0000000000..36f1eb8f13 --- /dev/null +++ b/packages/dht/src/nodejs/createGeoipLocator.ts @@ -0,0 +1,11 @@ +import { GeoIpLocator } from '@streamr/geoip-location' + +export const createGeoipLocator = async ( + geoIpDatabaseFolder: string +): Promise => { + const geoIpLocator = new GeoIpLocator(geoIpDatabaseFolder) + + await geoIpLocator.start() + + return geoIpLocator +} diff --git a/packages/dht/src/nodejs/defaultAutoCertifierClientFactory.ts b/packages/dht/src/nodejs/defaultAutoCertifierClientFactory.ts new file mode 100644 index 0000000000..50367d8c20 --- /dev/null +++ b/packages/dht/src/nodejs/defaultAutoCertifierClientFactory.ts @@ -0,0 +1,28 @@ +import { + AutoCertifierClient, + HasSessionRequest, + HasSessionResponse, + type HasSession, +} from '@streamr/autocertifier-client' +import { ListeningRpcCommunicator } from '../transport/ListeningRpcCommunicator' + +export const defaultAutoCertifierClientFactory = ( + configFile: string, + autoCertifierUrl: string, + autoCertifierRpcCommunicator: ListeningRpcCommunicator, + wsServerPort: number +): AutoCertifierClient => { + return new AutoCertifierClient( + configFile, + wsServerPort, + autoCertifierUrl, + (_serviceId: string, rpcMethodName: string, method: HasSession) => { + autoCertifierRpcCommunicator.registerRpcMethod( + HasSessionRequest, + HasSessionResponse, + rpcMethodName, + method + ) + } + ) +} diff --git a/packages/dht/src/nodejs/isBrowserEnvironment.ts b/packages/dht/src/nodejs/isBrowserEnvironment.ts new file mode 100644 index 0000000000..5f58603e88 --- /dev/null +++ b/packages/dht/src/nodejs/isBrowserEnvironment.ts @@ -0,0 +1 @@ +export const isBrowserEnvironment = false diff --git a/packages/dht/src/types/textencoding.d.ts b/packages/dht/src/nodejs/textencoding.d.ts similarity index 100% rename from packages/dht/src/types/textencoding.d.ts rename to packages/dht/src/nodejs/textencoding.d.ts diff --git a/packages/dht/src/types/WebrtcConnectionParams.ts b/packages/dht/src/types/WebrtcConnectionParams.ts new file mode 100644 index 0000000000..24eff16f79 --- /dev/null +++ b/packages/dht/src/types/WebrtcConnectionParams.ts @@ -0,0 +1,12 @@ +import { PeerDescriptor } from '../../generated/packages/dht/protos/DhtRpc' +import { PortRange } from '../connection/ConnectionManager' +import { IceServer } from '../connection/webrtc/types' + +export interface WebrtcConnectionParams { + remotePeerDescriptor: PeerDescriptor + bufferThresholdHigh?: number + bufferThresholdLow?: number + maxMessageSize?: number + iceServers?: IceServer[] // TODO make this parameter required (empty array is a good fallback which can be set by the caller if needed) + portRange?: PortRange +} diff --git a/packages/dht/test/benchmark/WebsocketServerMemoryLeak.test.ts b/packages/dht/test/benchmark/WebsocketServerMemoryLeak.test.ts index ef12daf395..ff1826f4b3 100644 --- a/packages/dht/test/benchmark/WebsocketServerMemoryLeak.test.ts +++ b/packages/dht/test/benchmark/WebsocketServerMemoryLeak.test.ts @@ -1,8 +1,8 @@ /* eslint-disable no-console */ import { wait } from '@streamr/utils' -import { WebsocketServer } from '../../src/connection/websocket/WebsocketServer' -import { WebsocketClientConnection } from '../../src/connection/websocket/NodeWebsocketClientConnection' +import { WebsocketServer } from '@/WebsocketServer' +import { WebsocketClientConnection } from '@/WebsocketClientConnection' // This 'test' is meant to be run manually using the following command: // node --inspect ../../../../node_modules/.bin/jest WebsocketServerMemoryLeak.test.ts diff --git a/packages/dht/test/end-to-end/Layer0Webrtc.test.ts b/packages/dht/test/end-to-end/Layer0Webrtc.test.ts index 73996badea..fa6bd42c7d 100644 --- a/packages/dht/test/end-to-end/Layer0Webrtc.test.ts +++ b/packages/dht/test/end-to-end/Layer0Webrtc.test.ts @@ -3,7 +3,7 @@ import { ConnectionManager } from '../../src/connection/ConnectionManager' import { DhtNode } from '../../src/dht/DhtNode' import { PeerDescriptor } from '../../generated/packages/dht/protos/DhtRpc' import { createMockPeerDescriptor } from '../utils/utils' -import { toNodeId } from '../../src/exports' +import { toNodeId } from './../../src/identifiers' describe('Layer0 with WebRTC connections', () => { diff --git a/packages/dht/test/integration/DhtNode.test.ts b/packages/dht/test/integration/DhtNode.test.ts index bfac847c1c..1822d5139d 100644 --- a/packages/dht/test/integration/DhtNode.test.ts +++ b/packages/dht/test/integration/DhtNode.test.ts @@ -2,7 +2,9 @@ import { until } from '@streamr/utils' import range from 'lodash/range' import without from 'lodash/without' import { DhtNodeRpcLocal } from '../../src/dht/DhtNodeRpcLocal' -import { DhtNode, ListeningRpcCommunicator, toNodeId } from '../../src/exports' +import { toNodeId } from '../../src/identifiers' +import { DhtNode } from '../../src/dht/DhtNode' +import { ListeningRpcCommunicator } from '../../src/transport/ListeningRpcCommunicator' import { ClosestPeersRequest, ClosestPeersResponse, PeerDescriptor, PingRequest, PingResponse } from '../../generated/packages/dht/protos/DhtRpc' import { FakeEnvironment } from '../utils/FakeTransport' import { createMockPeerDescriptor } from '../utils/utils' diff --git a/packages/dht/test/integration/Websocket.test.ts b/packages/dht/test/integration/Websocket.test.ts index de2a6e52c8..65901b93ff 100644 --- a/packages/dht/test/integration/Websocket.test.ts +++ b/packages/dht/test/integration/Websocket.test.ts @@ -1,6 +1,6 @@ -import { WebsocketServer } from '../../src/connection/websocket/WebsocketServer' +import { WebsocketServer } from '@/WebsocketServer' import { IConnection } from '../../src/connection/IConnection' -import { WebsocketClientConnection } from '../../src/connection/websocket/NodeWebsocketClientConnection' +import { WebsocketClientConnection } from '@/WebsocketClientConnection' import { Logger } from '@streamr/utils' const logger = new Logger('Websocket.test') diff --git a/packages/dht/test/unit/AutoCertifierClientFacade.test.ts b/packages/dht/test/unit/AutoCertifierClientFacade.test.ts index 280033d269..99b6da3587 100644 --- a/packages/dht/test/unit/AutoCertifierClientFacade.test.ts +++ b/packages/dht/test/unit/AutoCertifierClientFacade.test.ts @@ -1,4 +1,4 @@ -import EventEmitter from 'eventemitter3' +import { EventEmitter } from 'eventemitter3' import { AutoCertifierClientFacade, IAutoCertifierClient } from '../../src/connection/websocket/AutoCertifierClientFacade' import { MockTransport } from '../utils/mock/MockTransport' diff --git a/packages/dht/test/unit/ConnectionManager.test.ts b/packages/dht/test/unit/ConnectionManager.test.ts index df96e10f0c..ab768aa779 100644 --- a/packages/dht/test/unit/ConnectionManager.test.ts +++ b/packages/dht/test/unit/ConnectionManager.test.ts @@ -1,6 +1,7 @@ import { MetricsContext } from '@streamr/utils' import { ConnectionManager } from '../../src/connection/ConnectionManager' -import { toNodeId, PendingConnection } from '../../src/exports' +import { toNodeId } from '../../src/identifiers' +import { PendingConnection } from '../../src/connection/PendingConnection' import { FakeConnectorFacade } from '../utils/FakeConnectorFacade' import { MockConnection } from '../utils/mock/MockConnection' import { createMockPeerDescriptor } from '../utils/utils' diff --git a/packages/dht/test/unit/DiscoverySession.test.ts b/packages/dht/test/unit/DiscoverySession.test.ts index 2111eb3163..8e50d3feff 100644 --- a/packages/dht/test/unit/DiscoverySession.test.ts +++ b/packages/dht/test/unit/DiscoverySession.test.ts @@ -1,7 +1,8 @@ import { Multimap, wait } from '@streamr/utils' import sampleSize from 'lodash/sampleSize' import { DhtNodeRpcRemote } from '../../src/dht/DhtNodeRpcRemote' -import { PeerManager, getDistance } from '../../src/dht/PeerManager' +import { PeerManager } from '../../src/dht/PeerManager' +import { getPeerDistance } from '../../src/dht/helpers/getPeerDistance' import { DiscoverySession } from '../../src/dht/discovery/DiscoverySession' import { DhtAddress, toNodeId, toDhtAddressRaw } from '../../src/identifiers' import { NodeType, PeerDescriptor } from '../../generated/packages/dht/protos/DhtRpc' @@ -79,7 +80,7 @@ describe('DiscoverySession', () => { // Each queried node should closer to the target than the previous queried node, because we // use parallelism=1 and noProgressLimit=1 const distancesToTarget = queriedNodes - .map((nodeId) => getDistance(toDhtAddressRaw(nodeId), toDhtAddressRaw(targetId))) + .map((nodeId) => getPeerDistance(toDhtAddressRaw(nodeId), toDhtAddressRaw(targetId))) for (let i = 1; i < distancesToTarget.length ; i++) { expect(distancesToTarget[i]).toBeLessThan(distancesToTarget[i - 1]) } diff --git a/packages/dht/test/unit/Handshaker.test.ts b/packages/dht/test/unit/Handshaker.test.ts index d06dbcd32d..e51ec44226 100644 --- a/packages/dht/test/unit/Handshaker.test.ts +++ b/packages/dht/test/unit/Handshaker.test.ts @@ -1,4 +1,4 @@ -import EventEmitter from 'eventemitter3' +import { EventEmitter } from 'eventemitter3' import { acceptHandshake, createHandshakeRequest, diff --git a/packages/dht/test/unit/ManagedConnection.test.ts b/packages/dht/test/unit/ManagedConnection.test.ts index 76ba758255..e62cf9e947 100644 --- a/packages/dht/test/unit/ManagedConnection.test.ts +++ b/packages/dht/test/unit/ManagedConnection.test.ts @@ -1,5 +1,5 @@ import { wait } from '@streamr/utils' -import { ManagedConnection } from '../../src/exports' +import { ManagedConnection } from '../../src/connection/ManagedConnection' import { MockConnection } from '../utils/mock/MockConnection' import { createMockPeerDescriptor } from '../utils/utils' diff --git a/packages/dht/test/unit/PendingConnection.test.ts b/packages/dht/test/unit/PendingConnection.test.ts index df8ea9bfaa..f98628bcfa 100644 --- a/packages/dht/test/unit/PendingConnection.test.ts +++ b/packages/dht/test/unit/PendingConnection.test.ts @@ -1,5 +1,5 @@ import { wait, waitForEvent } from '@streamr/utils' -import { PendingConnection } from '../../src/exports' +import { PendingConnection } from '../../src/connection/PendingConnection' import { createMockPeerDescriptor } from '../utils/utils' import { MockConnection } from '../utils/mock/MockConnection' diff --git a/packages/dht/test/unit/WebrtcConnection.test.ts b/packages/dht/test/unit/WebrtcConnection.test.ts index 1b0ec560ea..2ad4a703e4 100644 --- a/packages/dht/test/unit/WebrtcConnection.test.ts +++ b/packages/dht/test/unit/WebrtcConnection.test.ts @@ -1,14 +1,14 @@ import { waitForEvent } from '@streamr/utils' -import { NodeWebrtcConnection } from '../../src/connection/webrtc/NodeWebrtcConnection' +import { WebrtcConnection } from '@/WebrtcConnection' import { createMockPeerDescriptor } from '../utils/utils' describe('WebrtcConnection', () => { - let connection: NodeWebrtcConnection + let connection: WebrtcConnection beforeEach(() => { const peerDescriptor = createMockPeerDescriptor() - connection = new NodeWebrtcConnection({ + connection = new WebrtcConnection({ remotePeerDescriptor: peerDescriptor }) }) diff --git a/packages/dht/test/unit/WebsocketServer.test.ts b/packages/dht/test/unit/WebsocketServer.test.ts index b389291f51..6b537d936f 100644 --- a/packages/dht/test/unit/WebsocketServer.test.ts +++ b/packages/dht/test/unit/WebsocketServer.test.ts @@ -1,4 +1,4 @@ -import { WebsocketServer } from '../../src/connection/websocket/WebsocketServer' +import { WebsocketServer } from '@/WebsocketServer' describe('WebsocketServer', () => { diff --git a/packages/dht/test/unit/createPeerDescriptor.test.ts b/packages/dht/test/unit/createPeerDescriptor.test.ts index 3b5fdf36bb..cc03e1dd71 100644 --- a/packages/dht/test/unit/createPeerDescriptor.test.ts +++ b/packages/dht/test/unit/createPeerDescriptor.test.ts @@ -1,6 +1,6 @@ import { ipv4ToNumber } from '@streamr/utils' import { createPeerDescriptor } from '../../src/helpers/createPeerDescriptor' -import { isBrowserEnvironment } from '../../src/helpers/browser/isBrowserEnvironment' +import { isBrowserEnvironment } from '@/isBrowserEnvironment' import { NodeType } from '../../generated/packages/dht/protos/DhtRpc' import { randomDhtAddress, toDhtAddressRaw } from '../../src/identifiers' import { getRandomRegion } from '../../src/connection/simulator/pings' @@ -18,7 +18,7 @@ describe('createPeerDescriptor', () => { const peerDescriptor = await createPeerDescriptor(connectivityResponse, region) expect(peerDescriptor).toEqual({ nodeId: expect.any(Uint8Array), - type: isBrowserEnvironment() ? NodeType.BROWSER : NodeType.NODEJS, + type: isBrowserEnvironment ? NodeType.BROWSER : NodeType.NODEJS, ipAddress: ipv4ToNumber(IP_ADDRESS), publicKey: expect.any(Uint8Array), signature: expect.any(Uint8Array), diff --git a/packages/dht/test/unit/getClosestNodes.test.ts b/packages/dht/test/unit/getClosestNodes.test.ts index f69003cb9e..4b196dc68f 100644 --- a/packages/dht/test/unit/getClosestNodes.test.ts +++ b/packages/dht/test/unit/getClosestNodes.test.ts @@ -1,11 +1,11 @@ import range from 'lodash/range' import sampleSize from 'lodash/sampleSize' import sortBy from 'lodash/sortBy' -import { getDistance } from '../../src/dht/PeerManager' +import { getPeerDistance } from '../../src/dht/helpers/getPeerDistance' import { getClosestNodes } from '../../src/dht/contact/getClosestNodes' import { DhtAddress, randomDhtAddress, toNodeId, toDhtAddressRaw } from '../../src/identifiers' import { createMockPeerDescriptor } from '../utils/utils' -import { PeerDescriptor } from '../../src/exports' +import { PeerDescriptor } from '../../generated/packages/dht/protos/DhtRpc' describe('getClosestNodes', () => { @@ -25,7 +25,7 @@ describe('getClosestNodes', () => { const expected = sortBy( peerDescriptors.filter((n) => !excluded.has(toNodeId(n))), - (peerDescriptor: PeerDescriptor) => getDistance(peerDescriptor.nodeId, toDhtAddressRaw(referenceId)) + (peerDescriptor: PeerDescriptor) => getPeerDistance(peerDescriptor.nodeId, toDhtAddressRaw(referenceId)) ).slice(0, 5) expect(actual).toEqual(expected) }) diff --git a/packages/dht/test/utils/FakeTransport.ts b/packages/dht/test/utils/FakeTransport.ts index c5796c153e..f736362826 100644 --- a/packages/dht/test/utils/FakeTransport.ts +++ b/packages/dht/test/utils/FakeTransport.ts @@ -2,7 +2,7 @@ import { EventEmitter } from 'eventemitter3' import { DhtAddress, toDhtAddress, toNodeId } from '../../src/identifiers' import { Message, PeerDescriptor } from '../../generated/packages/dht/protos/DhtRpc' import { DEFAULT_SEND_OPTIONS, ITransport, SendOptions, TransportEvents } from '../../src/transport/ITransport' -import { ConnectionsView } from '../../src/exports' +import { ConnectionsView } from '../../src/connection/ConnectionsView' // TODO extract ConnectionsView functionality to FakeConnectionsView class FakeTransport extends EventEmitter implements ITransport, ConnectionsView { diff --git a/packages/dht/test/utils/mock/MockConnection.ts b/packages/dht/test/utils/mock/MockConnection.ts index 126789ef5b..d84b5d1770 100644 --- a/packages/dht/test/utils/mock/MockConnection.ts +++ b/packages/dht/test/utils/mock/MockConnection.ts @@ -1,4 +1,4 @@ -import EventEmitter from 'eventemitter3' +import { EventEmitter } from 'eventemitter3' import { ConnectionEvents, IConnection } from '../../../src/connection/IConnection' export class MockConnection extends EventEmitter implements IConnection { diff --git a/packages/dht/test/utils/topology.ts b/packages/dht/test/utils/topology.ts index 4215a7842a..3f69460128 100644 --- a/packages/dht/test/utils/topology.ts +++ b/packages/dht/test/utils/topology.ts @@ -4,7 +4,7 @@ import minBy from 'lodash/minBy' import range from 'lodash/range' import without from 'lodash/without' import { SortedContactList } from '../../src/dht/contact/SortedContactList' -import { getDistance } from '../../src/dht/PeerManager' +import { getPeerDistance } from '../../src/dht/helpers/getPeerDistance' export const getTopologyPartitions = (topology: Multimap): Set[] => { let partitions: Set[] = [] @@ -72,7 +72,7 @@ export const createTestTopology = (nodeCount: number, minNeighorCount: number): const closestNodedId = getClosestNodes(nodeId, otherNodes, 1, false)[0] return [nodeId, closestNodedId] }) - const mergePair = minBy(closestPairs, (pair) => getDistance(toDhtAddressRaw(pair[0]), toDhtAddressRaw(pair[1])))! + const mergePair = minBy(closestPairs, (pair) => getPeerDistance(toDhtAddressRaw(pair[0]), toDhtAddressRaw(pair[1])))! topology.add(mergePair[0], mergePair[1]) topology.add(mergePair[1], mergePair[0]) } diff --git a/packages/dht/tsconfig.browser.json b/packages/dht/tsconfig.browser.json new file mode 100644 index 0000000000..069909d49c --- /dev/null +++ b/packages/dht/tsconfig.browser.json @@ -0,0 +1,45 @@ +{ + "extends": "../../tsconfig.browser.json", + "compilerOptions": { + "outDir": "dist/browser", + "baseUrl": ".", + + /* Mapping */ + "paths": { + "@/*": ["src/browser/*"] + }, + + /* @todo Make verbatimModuleSyntax (true) work. */ + "verbatimModuleSyntax": false, + + /* @todo Make useUnknownInCatchVariables (true) work. */ + "useUnknownInCatchVariables": false, + + /* @todo Make erasableSyntaxOnly (true) work. */ + "erasableSyntaxOnly": false, + + /* @todo Make noImplicitOverride (true) work. */ + "noImplicitOverride": false, + + /* @todo Make noUnusedLocals (true) work. */ + "noUnusedLocals": false, + + /* @todo Make noUnusedParameters (true) work. */ + "noUnusedParameters": false + }, + "include": [ + "src", + "generated", + "package.json" + ], + "exclude": [ + "src/nodejs" + ], + "references": [ + { "path": "../autocertifier-client" }, + { "path": "../cdn-location" }, + { "path": "../geoip-location" }, + { "path": "../proto-rpc" }, + { "path": "../utils" } + ] +} diff --git a/packages/dht/tsconfig.jest.json b/packages/dht/tsconfig.jest.json index 12d9bf6074..afc62c3e96 100644 --- a/packages/dht/tsconfig.jest.json +++ b/packages/dht/tsconfig.jest.json @@ -1,13 +1,20 @@ { "extends": "../../tsconfig.jest.json", "compilerOptions": { - "noImplicitOverride": false + "noImplicitOverride": false, + + /* Mapping */ + "paths": { + "@/*": ["src/nodejs/*"] + } }, "include": [ "src", "generated", "test", - "package.json", - "scripts" + "package.json" + ], + "exclude": [ + "src/browser" ] } diff --git a/packages/dht/tsconfig.json b/packages/dht/tsconfig.json index ce6ed8db32..9a557a2379 100644 --- a/packages/dht/tsconfig.json +++ b/packages/dht/tsconfig.json @@ -1,19 +1,10 @@ { - "extends": "../../tsconfig.node.json", + "files": [], "compilerOptions": { - "outDir": "dist", - "noImplicitOverride": false + "composite": true }, - "include": [ - "src", - "generated", - "package.json" - ], "references": [ - { "path": "../autocertifier-client" }, - { "path": "../cdn-location" }, - { "path": "../geoip-location" }, - { "path": "../proto-rpc" }, - { "path": "../utils" } + { "path": "./tsconfig.node.json" }, + { "path": "./tsconfig.browser.json" } ] } diff --git a/packages/dht/tsconfig.karma.json b/packages/dht/tsconfig.karma.json index 28bd6d922c..b75d889f0f 100644 --- a/packages/dht/tsconfig.karma.json +++ b/packages/dht/tsconfig.karma.json @@ -1,7 +1,12 @@ { "extends": "../../tsconfig.karma.json", "compilerOptions": { - "outDir": "dist" + "outDir": "dist", + + /* Mapping */ + "paths": { + "@/*": ["src/browser/*"] + } }, "include": [ "src", diff --git a/packages/dht/tsconfig.node.json b/packages/dht/tsconfig.node.json new file mode 100644 index 0000000000..47d3d3c917 --- /dev/null +++ b/packages/dht/tsconfig.node.json @@ -0,0 +1,32 @@ +{ + "extends": "../../tsconfig.node.json", + "compilerOptions": { + "outDir": "dist/nodejs", + "noImplicitOverride": false, + + /* Mapping */ + "paths": { + "@/*": ["src/nodejs/*"] + }, + + /* Resolution */ + "module": "preserve", + "moduleResolution": "bundler", + "baseUrl": "." + }, + "include": [ + "src", + "generated", + "package.json" + ], + "exclude": [ + "src/browser" + ], + "references": [ + { "path": "../autocertifier-client" }, + { "path": "../cdn-location" }, + { "path": "../geoip-location" }, + { "path": "../proto-rpc" }, + { "path": "../utils" } + ] +} diff --git a/packages/geoip-location/package.json b/packages/geoip-location/package.json index 5ee83e0e2c..9b0a5d4003 100644 --- a/packages/geoip-location/package.json +++ b/packages/geoip-location/package.json @@ -7,15 +7,17 @@ "url": "git+https://github.com/streamr-dev/network.git", "directory": "packages/geoip-location" }, - "main": "dist/src/exports.js", - "browser": { - "dist/src/exports.js": false, - "dist/src/GeoIpLocator.js": false, - "dist/src/downloadGeoIpDatabase.js": false + "exports": { + ".": { + "default": { + "types": "./dist/src/exports.d.ts", + "import": "./dist/src/exports.js", + "require": "./dist/src/exports.cjs" + } + } }, - "types": "dist/src/exports.d.ts", "files": [ - "dist", + "dist/src/exports.*", "!*.tsbuildinfo", "README.md", "LICENSE" @@ -23,8 +25,11 @@ "license": "Apache-2.0", "author": "Streamr Network AG ", "scripts": { + "prebuild": "npm run reset-self", "build": "tsc -b", + "postbuild": "NODE_OPTIONS='--import tsx' rollup -c rollup.config.mts", "check": "tsc -p tsconfig.jest.json", + "reset-self": "rimraf --glob '**/*.tsbuildinfo'", "clean": "jest --clearCache --config '{}' || true; rm -rf dist *.tsbuildinfo node_modules/.cache || true", "eslint": "eslint --cache --cache-location=node_modules/.cache/.eslintcache/ '*/**/*.{js,ts}'", "test": "jest test/unit", @@ -39,8 +44,13 @@ "uuid": "^11.1.0" }, "devDependencies": { + "@rollup/plugin-node-resolve": "^16.0.3", "@types/long-timeout": "^0.1.2", "@types/tar": "^6.1.11", - "express": "^5.2.0" + "express": "^5.2.0", + "rimraf": "^6.1.2", + "rollup": "^4.53.5", + "rollup-plugin-dts": "^6.3.0", + "tsx": "^4.21.0" } } diff --git a/packages/geoip-location/rollup.config.mts b/packages/geoip-location/rollup.config.mts new file mode 100644 index 0000000000..1fa1e5486f --- /dev/null +++ b/packages/geoip-location/rollup.config.mts @@ -0,0 +1,52 @@ +import { defineConfig, type RollupOptions } from 'rollup' +import { dts } from 'rollup-plugin-dts' +import { nodeResolve } from '@rollup/plugin-node-resolve' + +export default defineConfig([ + nodejs(), + nodejsTypes(), +]) + +function nodejs(): RollupOptions { + return { + input: './dist/src/exports.js', + output: [ + { + format: 'es', + file: './dist/src/exports.js', + sourcemap: true, + }, + { + format: 'cjs', + file: './dist/src/exports.cjs', + sourcemap: true, + }, + ], + plugins: [ + nodeResolve({ + preferBuiltins: true, + }), + ], + external: [ + /node_modules/, + /@streamr\//, + ], + } +} + +function nodejsTypes(): RollupOptions { + return { + input: './dist/src/exports.d.ts', + output: [ + { file: './dist/src/exports.d.ts' }, + ], + plugins: [ + nodeResolve(), + dts(), + ], + external: [ + /node_modules/, + /@streamr\//, + ], + } +} diff --git a/packages/geoip-location/tsconfig.json b/packages/geoip-location/tsconfig.json index 5621ed82fc..6ad637ddb1 100644 --- a/packages/geoip-location/tsconfig.json +++ b/packages/geoip-location/tsconfig.json @@ -1,7 +1,12 @@ { "extends": "../../tsconfig.node.json", "compilerOptions": { - "outDir": "dist" + "outDir": "dist", + + /* Resolution */ + "module": "preserve", + "moduleResolution": "bundler", + "baseUrl": "." }, "include": [ "src" diff --git a/packages/proto-rpc/package.json b/packages/proto-rpc/package.json index bc080573a2..822d855c31 100644 --- a/packages/proto-rpc/package.json +++ b/packages/proto-rpc/package.json @@ -7,10 +7,17 @@ "url": "git+https://github.com/streamr-dev/network.git", "directory": "packages/proto-rpc" }, - "main": "dist/src/exports.js", - "types": "dist/src/exports.d.ts", + "exports": { + ".": { + "default": { + "types": "./dist/src/exports.d.ts", + "import": "./dist/src/exports.js", + "require": "./dist/src/exports.cjs" + } + } + }, "files": [ - "dist", + "dist/src/exports.*", "!*.tsbuildinfo", "README.md", "LICENSE" @@ -18,10 +25,11 @@ "license": "(Apache-2.0 AND BSD-3-Clause)", "author": "Streamr Network AG ", "scripts": { - "prebuild": "./proto.sh", + "prebuild": "npm run reset-self && ./proto.sh", "build": "tsc -b", - "build-browser": "webpack --mode=development --progress", + "postbuild": "NODE_OPTIONS='--import tsx' rollup -c rollup.config.mts", "check": "./test-proto.sh && tsc -p tsconfig.jest.json", + "reset-self": "rimraf --glob '**/*.tsbuildinfo'", "clean": "jest --clearCache --config '{}' || true; rm -rf dist generated *.tsbuildinfo node_modules/.cache || true", "eslint": "./test-proto.sh && eslint --cache --cache-location=node_modules/.cache/.eslintcache/ '*/**/*.{js,ts}'", "test": "./test-proto.sh && npm run test-unit && npm run test-integration", @@ -38,9 +46,14 @@ "uuid": "^11.1.0" }, "devDependencies": { + "@rollup/plugin-node-resolve": "^16.0.3", "@streamr/browser-test-runner": "^0.0.1", "@streamr/test-utils": "103.2.0", - "@types/lodash": "^4.17.21" + "@types/lodash": "^4.17.21", + "rimraf": "^6.1.2", + "rollup": "^4.53.5", + "rollup-plugin-dts": "^6.3.0", + "tsx": "^4.21.0" }, "optionalDependencies": { "bufferutil": "^4.0.9", diff --git a/packages/proto-rpc/rollup.config.mts b/packages/proto-rpc/rollup.config.mts new file mode 100644 index 0000000000..1fa1e5486f --- /dev/null +++ b/packages/proto-rpc/rollup.config.mts @@ -0,0 +1,52 @@ +import { defineConfig, type RollupOptions } from 'rollup' +import { dts } from 'rollup-plugin-dts' +import { nodeResolve } from '@rollup/plugin-node-resolve' + +export default defineConfig([ + nodejs(), + nodejsTypes(), +]) + +function nodejs(): RollupOptions { + return { + input: './dist/src/exports.js', + output: [ + { + format: 'es', + file: './dist/src/exports.js', + sourcemap: true, + }, + { + format: 'cjs', + file: './dist/src/exports.cjs', + sourcemap: true, + }, + ], + plugins: [ + nodeResolve({ + preferBuiltins: true, + }), + ], + external: [ + /node_modules/, + /@streamr\//, + ], + } +} + +function nodejsTypes(): RollupOptions { + return { + input: './dist/src/exports.d.ts', + output: [ + { file: './dist/src/exports.d.ts' }, + ], + plugins: [ + nodeResolve(), + dts(), + ], + external: [ + /node_modules/, + /@streamr\//, + ], + } +} diff --git a/packages/proto-rpc/tsconfig.json b/packages/proto-rpc/tsconfig.json index ce0f5b1ea2..2c8034fcda 100644 --- a/packages/proto-rpc/tsconfig.json +++ b/packages/proto-rpc/tsconfig.json @@ -2,7 +2,12 @@ "extends": "../../tsconfig.node.json", "compilerOptions": { "outDir": "dist", - "noImplicitOverride": false + "noImplicitOverride": false, + + /* Resolution */ + "module": "preserve", + "moduleResolution": "bundler", + "baseUrl": "." }, "include": [ "src", diff --git a/packages/test-utils/customMatcherTypes.d.ts b/packages/test-utils/customMatcherTypes.d.ts deleted file mode 100644 index 6e4effea9e..0000000000 --- a/packages/test-utils/customMatcherTypes.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* - * This file injects custom matcher types into Jest. - * - * The actual type declarations are in "./dist/src/customMatcherTypes.d.ts", and this file serves - * as an alias. In a dependent library the type information is typically injected by adding - * an import statement to test/types/global.d.ts. Since this file is listed in package.json's - * "files" section, we can import the types like this: - * import '@streamr/test-utils/customMatcherTypes' - */ - -/// diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 1465ce1a1a..7642d1aa62 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -2,22 +2,49 @@ "name": "@streamr/test-utils", "version": "103.2.0", "description": "A collection of shared test utilities", + "type": "module", "repository": { "type": "git", "url": "git+https://github.com/streamr-dev/network.git", "directory": "packages/test-utils" }, - "main": "./dist/src/index.js", - "types": "./dist/src/index.d.ts", + "exports": { + ".": { + "default": { + "types": "./dist/src/index.d.ts", + "import": "./dist/src/index.js", + "require": "./dist/src/index.cjs" + } + }, + "./setupCustomMatchers": { + "default": { + "types": "./dist/src/setupCustomMatchers.d.ts", + "import": "./dist/src/setupCustomMatchers.js", + "require": "./dist/src/setupCustomMatchers.cjs" + } + }, + "./customMatcherTypes": { + "default": { + "types": "./dist/src/customMatchers.d.ts", + "import": "./dist/src/customMatchers.js", + "require": "./dist/src/customMatchers.cjs" + } + } + }, "files": [ - "dist", + "dist/src/index.*", + "dist/src/customMatchers.*", + "dist/src/setupCustomMatchers.*", "!*.tsbuildinfo", - "setupCustomMatchers.js", - "customMatcherTypes.d.ts" + "LICENSE", + "README.md" ], "scripts": { + "prebuild": "npm run reset-self", "build": "tsc -b", + "postbuild": "NODE_OPTIONS='--import tsx' rollup -c rollup.config.mts", "check": "tsc -p tsconfig.jest.json", + "reset-self": "rimraf --glob '**/*.tsbuildinfo'", "clean": "jest --clearCache --config '{}' || true; rm -rf dist *.tsbuildinfo node_modules/.cache || true", "test": "jest", "eslint": "eslint --cache --cache-location=node_modules/.cache/.eslintcache/ '*/**/*.{js,ts}'" @@ -36,7 +63,12 @@ "lodash": "^4.17.21" }, "devDependencies": { + "@rollup/plugin-node-resolve": "^16.0.3", "@types/cors": "^2.8.19", - "@types/express": "^5.0.1" + "@types/express": "^5.0.1", + "rimraf": "^6.1.2", + "rollup": "^4.53.5", + "rollup-plugin-dts": "^6.3.0", + "tsx": "^4.21.0" } } diff --git a/packages/test-utils/rollup.config.mts b/packages/test-utils/rollup.config.mts new file mode 100644 index 0000000000..82e8c93953 --- /dev/null +++ b/packages/test-utils/rollup.config.mts @@ -0,0 +1,63 @@ +import { defineConfig, type RollupOptions } from 'rollup' +import { dts } from 'rollup-plugin-dts' +import { nodeResolve } from '@rollup/plugin-node-resolve' + +export default defineConfig([ + nodejs(), + nodejsTypes(), +]) + +function nodejs(): RollupOptions { + return { + input: [ + './dist/src/index.js', + './dist/src/customMatchers.js', + './dist/src/setupCustomMatchers.js', + ], + output: [ + { + format: 'es', + dir: './dist/src', + entryFileNames: '[name].js', + chunkFileNames: '[name].[hash].js', + sourcemap: true, + }, + { + format: 'cjs', + dir: './dist/src', + entryFileNames: '[name].cjs', + chunkFileNames: '[name].[hash].cjs', + sourcemap: true, + }, + ], + plugins: [ + nodeResolve({ + preferBuiltins: true, + }), + ], + external: [ + /node_modules/, + /@streamr\//, + ], + } +} + +function nodejsTypes(): RollupOptions { + return { + input: [ + './dist/src/index.d.ts', + './dist/src/customMatchers.d.ts', + ], + output: [ + { dir: './dist/src' }, + ], + plugins: [ + nodeResolve(), + dts(), + ], + external: [ + /node_modules/, + /@streamr\//, + ], + } +} diff --git a/packages/test-utils/setupCustomMatchers.js b/packages/test-utils/setupCustomMatchers.js deleted file mode 100644 index d9832f05f7..0000000000 --- a/packages/test-utils/setupCustomMatchers.js +++ /dev/null @@ -1,10 +0,0 @@ -/* - * This file adds the custom matcher functionality to Jest. - * - * The actual setup is in "./dist/src/setupCustomMatchers.js", and this file serves as an alias. - * Since this file is listed in package.json's "files" section, we can setup the custom matchers - * like this: - * setupFilesAfterEnv: ['@streamr/test-utils/setupCustomMatchers'] - */ - -require('./dist/src/setupCustomMatchers') diff --git a/packages/test-utils/src/customMatcherTypes.ts b/packages/test-utils/src/customMatcherTypes.ts deleted file mode 100644 index 90b0653dc6..0000000000 --- a/packages/test-utils/src/customMatcherTypes.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { CustomMatchers } from './customMatchers' - -// we could ES2015 module syntax (https://jestjs.io/docs/expect#expectextendmatchers), -// but the IDE doesn't find custom matchers if we do that -declare global { - // eslint-disable-next-line @typescript-eslint/no-namespace - namespace jest { - // eslint-disable-next-line @typescript-eslint/no-empty-object-type - interface Expect extends CustomMatchers {} - // eslint-disable-next-line @typescript-eslint/no-empty-object-type - interface Matchers extends CustomMatchers {} - } -} diff --git a/packages/test-utils/src/customMatchers.ts b/packages/test-utils/src/customMatchers.ts index ea67328cec..075c570f48 100644 --- a/packages/test-utils/src/customMatchers.ts +++ b/packages/test-utils/src/customMatchers.ts @@ -47,4 +47,22 @@ const toEqualBinary = ( } } -export { toEqualBinary } +export const customMatchers = { + toEqualBinary +} + +declare global { + // eslint-disable-next-line @typescript-eslint/no-namespace + namespace jest { + // eslint-disable-next-line @typescript-eslint/no-empty-object-type + interface Matchers extends CustomMatchers {} + } +} + +declare module 'expect' { + // eslint-disable-next-line @typescript-eslint/no-empty-object-type + interface AsymmetricMatchers extends CustomMatchers {} + + // eslint-disable-next-line @typescript-eslint/no-empty-object-type + interface Matchers extends CustomMatchers {} +} diff --git a/packages/test-utils/src/setupCustomMatchers.ts b/packages/test-utils/src/setupCustomMatchers.ts index d2479902d0..3f6b11f567 100644 --- a/packages/test-utils/src/setupCustomMatchers.ts +++ b/packages/test-utils/src/setupCustomMatchers.ts @@ -1,3 +1,2 @@ -import * as customMatchers from './customMatchers' - +import { customMatchers } from './customMatchers' expect.extend(customMatchers) diff --git a/packages/test-utils/test/customMatchers.test.ts b/packages/test-utils/test/customMatchers.test.ts index 985b54cb2b..51388e96f5 100644 --- a/packages/test-utils/test/customMatchers.test.ts +++ b/packages/test-utils/test/customMatchers.test.ts @@ -1,4 +1,4 @@ -import {} from '../src/customMatcherTypes' +import '../src/customMatchers' describe('custom matchers', () => { it('happy path', () => { diff --git a/packages/test-utils/tsconfig.json b/packages/test-utils/tsconfig.json index 33cb004949..bc8bf7329e 100644 --- a/packages/test-utils/tsconfig.json +++ b/packages/test-utils/tsconfig.json @@ -5,7 +5,11 @@ "types": [ "node", "jest" - ] + ], + + /* Resolution */ + "moduleResolution": "bundler", + "module": "preserve" }, "include": [ "src" diff --git a/packages/trackerless-network/package.json b/packages/trackerless-network/package.json index 46c69f5baa..f5dec29dbf 100644 --- a/packages/trackerless-network/package.json +++ b/packages/trackerless-network/package.json @@ -7,20 +7,28 @@ "url": "git+https://github.com/streamr-dev/network-monorepo.git", "directory": "packages/trackerless-network" }, - "main": "dist/src/exports.js", - "types": "dist/src/exports.d.ts", + "exports": { + ".": { + "default": { + "types": "./dist/src/exports.d.ts", + "import": "./dist/src/exports.js", + "require": "./dist/src/exports.cjs" + } + } + }, "files": [ - "dist", + "dist/src/exports.*", "!*.tsbuildinfo", "README.md" ], "license": "STREAMR NETWORK OPEN SOURCE LICENSE", "author": "Streamr Network AG ", "scripts": { + "prebuild": "npm run reset-self && ./proto.sh", "build": "tsc -b", - "build-browser": "webpack --mode=development --progress", - "prebuild": "./proto.sh", + "postbuild": "NODE_OPTIONS='--import tsx' rollup -c rollup.config.mts", "check": "tsc -p tsconfig.jest.json", + "reset-self": "rimraf --glob '**/*.tsbuildinfo'", "clean": "jest --clearCache --config '{}' || true; rm -rf dist generated *.tsbuildinfo node_modules/.cache || true", "coverage": "jest --coverage", "eslint": "eslint --cache --cache-location=node_modules/.cache/.eslintcache/ '*/**/*.{js,ts}'", @@ -45,11 +53,17 @@ "yallist": "^5.0.0" }, "devDependencies": { + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^16.0.3", "@streamr/browser-test-runner": "^0.0.1", "@streamr/test-utils": "103.2.0", "@types/lodash": "^4.17.21", "@types/yallist": "^5.0.0", "expect": "^30.0.5", - "ts-node": "^10.9.2" + "rimraf": "^6.1.2", + "rollup": "^4.54.0", + "rollup-plugin-dts": "^6.3.0", + "ts-node": "^10.9.2", + "tsx": "^4.21.0" } } diff --git a/packages/trackerless-network/rollup.config.mts b/packages/trackerless-network/rollup.config.mts new file mode 100644 index 0000000000..748816b270 --- /dev/null +++ b/packages/trackerless-network/rollup.config.mts @@ -0,0 +1,54 @@ +import { defineConfig, type RollupOptions } from 'rollup' +import { dts } from 'rollup-plugin-dts' +import { nodeResolve } from '@rollup/plugin-node-resolve' +import json from '@rollup/plugin-json' + +export default defineConfig([ + nodejs(), + nodejsTypes(), +]) + +function nodejs(): RollupOptions { + return { + input: './dist/src/exports.js', + output: [ + { + format: 'es', + file: './dist/src/exports.js', + sourcemap: true, + }, + { + format: 'cjs', + file: './dist/src/exports.cjs', + sourcemap: true, + }, + ], + plugins: [ + json(), + nodeResolve({ + preferBuiltins: true, + }), + ], + external: [ + /node_modules/, + /@streamr\//, + ], + } +} + +function nodejsTypes(): RollupOptions { + return { + input: './dist/src/exports.d.ts', + output: [ + { file: './dist/src/exports.d.ts' }, + ], + plugins: [ + nodeResolve(), + dts(), + ], + external: [ + /node_modules/, + /@streamr\//, + ], + } +} diff --git a/packages/trackerless-network/src/ContentDeliveryManager.ts b/packages/trackerless-network/src/ContentDeliveryManager.ts index 7b8a48b12d..81d98697f6 100644 --- a/packages/trackerless-network/src/ContentDeliveryManager.ts +++ b/packages/trackerless-network/src/ContentDeliveryManager.ts @@ -10,6 +10,7 @@ import { toNodeId } from '@streamr/dht' import { + computeSha1, Logger, Metric, MetricsContext, @@ -18,7 +19,6 @@ import { UserID, toStreamPartID } from '@streamr/utils' -import { createHash } from 'crypto' import { EventEmitter } from 'eventemitter3' import sampleSize from 'lodash/sampleSize' import { ProxyDirection, StreamMessage } from '../generated/packages/trackerless-network/protos/NetworkRpc' @@ -85,7 +85,7 @@ export interface StreamPartDeliveryOptions { } export const streamPartIdToDataKey = (streamPartId: StreamPartID): DhtAddress => { - return toDhtAddress(new Uint8Array((createHash('sha1').update(streamPartId).digest()))) + return toDhtAddress(computeSha1(streamPartId)) } export class ContentDeliveryManager extends EventEmitter { diff --git a/packages/trackerless-network/src/content-delivery-layer/plumtree/PlumtreeManager.ts b/packages/trackerless-network/src/content-delivery-layer/plumtree/PlumtreeManager.ts index 27bc9ef607..a38b0d2e1f 100644 --- a/packages/trackerless-network/src/content-delivery-layer/plumtree/PlumtreeManager.ts +++ b/packages/trackerless-network/src/content-delivery-layer/plumtree/PlumtreeManager.ts @@ -9,7 +9,7 @@ import { NodeList } from '../NodeList' import { PlumtreeRpcLocal } from './PlumtreeRpcLocal' import { PlumtreeRpcRemote } from './PlumtreeRpcRemote' import { ContentDeliveryRpcClient, PlumtreeRpcClient } from '../../../generated/packages/trackerless-network/protos/NetworkRpc.client' -import EventEmitter from 'eventemitter3' +import { EventEmitter } from 'eventemitter3' import { Logger } from '@streamr/utils' import { ContentDeliveryRpcRemote } from '../ContentDeliveryRpcRemote' import { PausedNeighbors } from './PausedNeighbors' diff --git a/packages/trackerless-network/tsconfig.json b/packages/trackerless-network/tsconfig.json index 481b69e8de..4e16a5449e 100644 --- a/packages/trackerless-network/tsconfig.json +++ b/packages/trackerless-network/tsconfig.json @@ -2,7 +2,11 @@ "extends": "../../tsconfig.node.json", "compilerOptions": { "outDir": "dist", - "noImplicitOverride": false + "noImplicitOverride": false, + + /* Resolution */ + "moduleResolution": "bundler", + "module": "preserve" }, "include": [ "src", @@ -10,8 +14,8 @@ "package.json" ], "references": [ - { "path": "../dht" }, + { "path": "../utils" }, { "path": "../proto-rpc" }, - { "path": "../utils" } + { "path": "../dht" } ] } diff --git a/packages/utils/package.json b/packages/utils/package.json index 251cc715e2..ee02ecbc8a 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -43,6 +43,7 @@ "license": "Apache-2.0", "dependencies": { "@noble/curves": "^1.9.7", + "@noble/hashes": "^2.0.1", "@noble/post-quantum": "^0.4.1", "buffer": "^6.0.3", "buffer-shim": "^1.0.1", diff --git a/packages/utils/src/browser/crypto.ts b/packages/utils/src/browser/crypto.ts index 2afacd1136..65c220253c 100644 --- a/packages/utils/src/browser/crypto.ts +++ b/packages/utils/src/browser/crypto.ts @@ -1,4 +1,5 @@ import md5 from 'md5' +import { sha1 } from '@noble/hashes/legacy.js' export function getSubtle(): SubtleCrypto { const { crypto } = globalThis @@ -18,6 +19,10 @@ export function computeMd5(input: string): Buffer { return Buffer.from(md5(input), 'hex') } +export function computeSha1(input: string): Buffer { + return sha1(new TextEncoder().encode(input)) as Buffer +} + export type Jwk = JsonWebKey export type CryptoKey = globalThis.CryptoKey diff --git a/packages/utils/src/exports.ts b/packages/utils/src/exports.ts index d91d4cb134..1cf9d85ddc 100644 --- a/packages/utils/src/exports.ts +++ b/packages/utils/src/exports.ts @@ -53,5 +53,6 @@ export { type UserID, type UserIDRaw, toUserId, toUserIdRaw, isValidUserId, isEt export type { HexString } from './HexString' export type { ChangeFieldType, MapKey } from './types' export { type WeiAmount, multiplyWeiAmount } from './WeiAmount' -export { getSubtle, computeMd5 } from '@/crypto' +export { getSubtle, computeMd5, computeSha1 } from '@/crypto' export { SigningUtil, EcdsaSecp256k1Evm, EcdsaSecp256r1, MlDsa87, type KeyType, KEY_TYPES } from './SigningUtil' +export { randomBytes } from '@noble/post-quantum/utils' diff --git a/packages/utils/src/node/crypto.ts b/packages/utils/src/node/crypto.ts index 769931c1b1..72c5e5938c 100644 --- a/packages/utils/src/node/crypto.ts +++ b/packages/utils/src/node/crypto.ts @@ -21,3 +21,7 @@ export type CryptoKey = webcrypto.CryptoKey export function computeMd5(input: string): Buffer { return crypto.createHash('md5').update(input).digest() } + +export function computeSha1(input: string): Buffer { + return crypto.createHash('sha1').update(input).digest() +}