From c570c5b84ae542a88daaed9fa00cb0637eb5eb62 Mon Sep 17 00:00:00 2001 From: Justus Tumacder Date: Wed, 1 Mar 2023 14:17:11 +0800 Subject: [PATCH 01/12] Remove unused packages --- client/package-lock.json | 407 +++------------------------------------ client/package.json | 6 +- 2 files changed, 33 insertions(+), 380 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index 3c2858e1..f30cbe39 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -13,9 +13,6 @@ "@mantine/core": "^5.2.4", "@mantine/hooks": "^5.2.4", "@reduxjs/toolkit": "^1.9.1", - "@sentry/react": "^7.6.0", - "@sentry/tracing": "^7.6.0", - "@sentry/webpack-plugin": "^1.18.9", "bowser": "^2.11.0", "classnames": "^2.3.1", "fastest-levenshtein": "^1.0.12", @@ -32,8 +29,7 @@ "tabler-icons-react": "^1.51.0", "vue": "^3.0.0-0", "vue-router": "^4.0.0-0", - "web-streams-polyfill": "^2.0.2", - "worker-rpc": "^0.2.0" + "web-streams-polyfill": "^2.0.2" }, "devDependencies": { "@babel/core": "^7.18.5", @@ -4533,175 +4529,6 @@ "node": ">=14" } }, - "node_modules/@sentry/browser": { - "version": "7.38.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.38.0.tgz", - "integrity": "sha512-rPJr+2jRYL29PeMYA2JgzYKTZQx6bc3T9evbAdIh0n+popSjpVyOpOMV/3l6A7KZeeix3dpp6eUZUxTJukqriQ==", - "dependencies": { - "@sentry/core": "7.38.0", - "@sentry/replay": "7.38.0", - "@sentry/types": "7.38.0", - "@sentry/utils": "7.38.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/browser/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/cli": { - "version": "1.75.0", - "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-1.75.0.tgz", - "integrity": "sha512-vT8NurHy00GcN8dNqur4CMIYvFH3PaKdkX3qllVvi4syybKqjwoz+aWRCvprbYv0knweneFkLt1SmBWqazUMfA==", - "hasInstallScript": true, - "dependencies": { - "https-proxy-agent": "^5.0.0", - "mkdirp": "^0.5.5", - "node-fetch": "^2.6.7", - "progress": "^2.0.3", - "proxy-from-env": "^1.1.0", - "which": "^2.0.2" - }, - "bin": { - "sentry-cli": "bin/sentry-cli" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@sentry/cli/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/@sentry/core": { - "version": "7.38.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.38.0.tgz", - "integrity": "sha512-+hXh/SO3Ie6WC2b+wi01xLhyVREdkRXS5QBmCiv3z2ks2HvYXp7PoKSXJvNKiwCP+pBD+enOnM1YEzM2yEy5yw==", - "dependencies": { - "@sentry/types": "7.38.0", - "@sentry/utils": "7.38.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/core/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/react": { - "version": "7.38.0", - "resolved": "https://registry.npmjs.org/@sentry/react/-/react-7.38.0.tgz", - "integrity": "sha512-IZpQ0aptV3UPjvDj+xorrgPgnW2xIL6Zcy7B6wAgwTC81OUITE7YaShglGD0sJ8M1ReFuH9duwTysr/uv8AytQ==", - "dependencies": { - "@sentry/browser": "7.38.0", - "@sentry/types": "7.38.0", - "@sentry/utils": "7.38.0", - "hoist-non-react-statics": "^3.3.2", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": "15.x || 16.x || 17.x || 18.x" - } - }, - "node_modules/@sentry/react/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/replay": { - "version": "7.38.0", - "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.38.0.tgz", - "integrity": "sha512-Ai78/OIYedny605x8uS0n/a5uj7qnuevogGD6agLat9lGc8DFvC07m2iS+EFyGOwtQzyDlRYJvYkHL8peR3crQ==", - "dependencies": { - "@sentry/core": "7.38.0", - "@sentry/types": "7.38.0", - "@sentry/utils": "7.38.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@sentry/tracing": { - "version": "7.38.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.38.0.tgz", - "integrity": "sha512-ejXJp8oOT64MVtBzqdECUUaNzKbpu25St8Klub1i4Sm7xO+ZjDQDI4TIHvWojZvtkwQ3F4jcsCclc8KuyJunyQ==", - "dependencies": { - "@sentry/core": "7.38.0", - "@sentry/types": "7.38.0", - "@sentry/utils": "7.38.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/tracing/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/types": { - "version": "7.38.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.38.0.tgz", - "integrity": "sha512-NKOALR6pNUMzUrsk2m+dkPrO8uGNvNh1LD0BCPswKNjC2qHo1h1mDGCgBmF9+EWyii8ZoACTIsxvsda+MBf97Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/utils": { - "version": "7.38.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.38.0.tgz", - "integrity": "sha512-MgbI3YmYuyyhUtvcXkgGBqjOW+nuLLNGUdWCK+C4kObf8VbLt3dSE/7SEMT6TSHLYQmxs2BxFgx5Agn97m68kQ==", - "dependencies": { - "@sentry/types": "7.38.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/webpack-plugin": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-1.20.0.tgz", - "integrity": "sha512-Ssj1mJVFsfU6vMCOM2d+h+KQR7QHSfeIP16t4l20Uq/neqWXZUQ2yvQfe4S3BjdbJXz/X4Rw8Hfy1Sd0ocunYw==", - "dependencies": { - "@sentry/cli": "^1.74.6", - "webpack-sources": "^2.0.0 || ^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@sentry/webpack-plugin/node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/@sinonjs/commons": { "version": "1.8.6", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", @@ -11578,6 +11405,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, "dependencies": { "debug": "4" }, @@ -15505,6 +15333,7 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -19211,6 +19040,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -20281,7 +20111,8 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, "node_modules/isobject": { "version": "3.0.1", @@ -24676,11 +24507,6 @@ "node": ">= 0.6" } }, - "node_modules/microevent.ts": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.2.1.tgz", - "integrity": "sha512-YaOQr4V70QzTy3sTRkBUa7+clmN4rMdKs9L5wCCxYjo8gknO/FXhcEX5Pot4IWtAdiZqhxN7vskoywQbAOAkDQ==" - }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -24846,6 +24672,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -25060,7 +24887,8 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "node_modules/mute-stdout": { "version": "1.0.1", @@ -25252,6 +25080,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -25270,17 +25099,20 @@ "node_modules/node-fetch/node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "node_modules/node-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -26562,14 +26394,6 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -26662,11 +26486,6 @@ "node": ">= 0.10" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -31978,6 +31797,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -32090,14 +31910,6 @@ "errno": "~0.1.7" } }, - "node_modules/worker-rpc": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.2.0.tgz", - "integrity": "sha512-S74HnfAdmMlUYmr6+Lx6TmxvffM2vRZSk4RfI/Bxco4xZGw+FREzLRZhFxf8QIzI2/5NKNMn5+Pj69Bp+rweIg==", - "dependencies": { - "microevent.ts": "~0.2.1" - } - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -35744,149 +35556,6 @@ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.3.2.tgz", "integrity": "sha512-t54ONhl/h75X94SWsHGQ4G/ZrCEguKSRQr7DrjTciJXW0YU1QhlwYeycvK5JgkzlxmvrK7wq1NB/PLtHxoiDcA==" }, - "@sentry/browser": { - "version": "7.38.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.38.0.tgz", - "integrity": "sha512-rPJr+2jRYL29PeMYA2JgzYKTZQx6bc3T9evbAdIh0n+popSjpVyOpOMV/3l6A7KZeeix3dpp6eUZUxTJukqriQ==", - "requires": { - "@sentry/core": "7.38.0", - "@sentry/replay": "7.38.0", - "@sentry/types": "7.38.0", - "@sentry/utils": "7.38.0", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "@sentry/cli": { - "version": "1.75.0", - "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-1.75.0.tgz", - "integrity": "sha512-vT8NurHy00GcN8dNqur4CMIYvFH3PaKdkX3qllVvi4syybKqjwoz+aWRCvprbYv0knweneFkLt1SmBWqazUMfA==", - "requires": { - "https-proxy-agent": "^5.0.0", - "mkdirp": "^0.5.5", - "node-fetch": "^2.6.7", - "progress": "^2.0.3", - "proxy-from-env": "^1.1.0", - "which": "^2.0.2" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "requires": { - "minimist": "^1.2.6" - } - } - } - }, - "@sentry/core": { - "version": "7.38.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.38.0.tgz", - "integrity": "sha512-+hXh/SO3Ie6WC2b+wi01xLhyVREdkRXS5QBmCiv3z2ks2HvYXp7PoKSXJvNKiwCP+pBD+enOnM1YEzM2yEy5yw==", - "requires": { - "@sentry/types": "7.38.0", - "@sentry/utils": "7.38.0", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "@sentry/react": { - "version": "7.38.0", - "resolved": "https://registry.npmjs.org/@sentry/react/-/react-7.38.0.tgz", - "integrity": "sha512-IZpQ0aptV3UPjvDj+xorrgPgnW2xIL6Zcy7B6wAgwTC81OUITE7YaShglGD0sJ8M1ReFuH9duwTysr/uv8AytQ==", - "requires": { - "@sentry/browser": "7.38.0", - "@sentry/types": "7.38.0", - "@sentry/utils": "7.38.0", - "hoist-non-react-statics": "^3.3.2", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "@sentry/replay": { - "version": "7.38.0", - "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.38.0.tgz", - "integrity": "sha512-Ai78/OIYedny605x8uS0n/a5uj7qnuevogGD6agLat9lGc8DFvC07m2iS+EFyGOwtQzyDlRYJvYkHL8peR3crQ==", - "requires": { - "@sentry/core": "7.38.0", - "@sentry/types": "7.38.0", - "@sentry/utils": "7.38.0" - } - }, - "@sentry/tracing": { - "version": "7.38.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.38.0.tgz", - "integrity": "sha512-ejXJp8oOT64MVtBzqdECUUaNzKbpu25St8Klub1i4Sm7xO+ZjDQDI4TIHvWojZvtkwQ3F4jcsCclc8KuyJunyQ==", - "requires": { - "@sentry/core": "7.38.0", - "@sentry/types": "7.38.0", - "@sentry/utils": "7.38.0", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "@sentry/types": { - "version": "7.38.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.38.0.tgz", - "integrity": "sha512-NKOALR6pNUMzUrsk2m+dkPrO8uGNvNh1LD0BCPswKNjC2qHo1h1mDGCgBmF9+EWyii8ZoACTIsxvsda+MBf97Q==" - }, - "@sentry/utils": { - "version": "7.38.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.38.0.tgz", - "integrity": "sha512-MgbI3YmYuyyhUtvcXkgGBqjOW+nuLLNGUdWCK+C4kObf8VbLt3dSE/7SEMT6TSHLYQmxs2BxFgx5Agn97m68kQ==", - "requires": { - "@sentry/types": "7.38.0", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "@sentry/webpack-plugin": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-1.20.0.tgz", - "integrity": "sha512-Ssj1mJVFsfU6vMCOM2d+h+KQR7QHSfeIP16t4l20Uq/neqWXZUQ2yvQfe4S3BjdbJXz/X4Rw8Hfy1Sd0ocunYw==", - "requires": { - "@sentry/cli": "^1.74.6", - "webpack-sources": "^2.0.0 || ^3.0.0" - }, - "dependencies": { - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" - } - } - }, "@sinonjs/commons": { "version": "1.8.6", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", @@ -41283,6 +40952,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, "requires": { "debug": "4" } @@ -44341,6 +44011,7 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, "requires": { "ms": "2.1.2" } @@ -47278,6 +46949,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, "requires": { "agent-base": "6", "debug": "4" @@ -48034,7 +47706,8 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, "isobject": { "version": "3.0.1", @@ -51422,11 +51095,6 @@ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true }, - "microevent.ts": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.2.1.tgz", - "integrity": "sha512-YaOQr4V70QzTy3sTRkBUa7+clmN4rMdKs9L5wCCxYjo8gknO/FXhcEX5Pot4IWtAdiZqhxN7vskoywQbAOAkDQ==" - }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -51556,7 +51224,8 @@ "minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true }, "minipass": { "version": "3.3.6", @@ -51742,7 +51411,8 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "mute-stdout": { "version": "1.0.1", @@ -51900,6 +51570,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "dev": true, "requires": { "whatwg-url": "^5.0.0" }, @@ -51907,17 +51578,20 @@ "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "requires": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -52909,11 +52583,6 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" - }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -52984,11 +52653,6 @@ "ipaddr.js": "1.9.1" } }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -57126,6 +56790,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "requires": { "isexe": "^2.0.0" } @@ -57214,14 +56879,6 @@ "errno": "~0.1.7" } }, - "worker-rpc": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.2.0.tgz", - "integrity": "sha512-S74HnfAdmMlUYmr6+Lx6TmxvffM2vRZSk4RfI/Bxco4xZGw+FREzLRZhFxf8QIzI2/5NKNMn5+Pj69Bp+rweIg==", - "requires": { - "microevent.ts": "~0.2.1" - } - }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", diff --git a/client/package.json b/client/package.json index b3da631e..dae19eb9 100644 --- a/client/package.json +++ b/client/package.json @@ -15,9 +15,6 @@ "@mantine/core": "^5.2.4", "@mantine/hooks": "^5.2.4", "@reduxjs/toolkit": "^1.9.1", - "@sentry/react": "^7.6.0", - "@sentry/tracing": "^7.6.0", - "@sentry/webpack-plugin": "^1.18.9", "bowser": "^2.11.0", "classnames": "^2.3.1", "fastest-levenshtein": "^1.0.12", @@ -34,8 +31,7 @@ "tabler-icons-react": "^1.51.0", "vue": "^3.0.0-0", "vue-router": "^4.0.0-0", - "web-streams-polyfill": "^2.0.2", - "worker-rpc": "^0.2.0" + "web-streams-polyfill": "^2.0.2" }, "devDependencies": { "@babel/core": "^7.18.5", From ae3c09b24c066a045ac4a7a1681caf32d8b03da6 Mon Sep 17 00:00:00 2001 From: Justus Tumacder Date: Wed, 15 Feb 2023 12:47:18 +0800 Subject: [PATCH 02/12] Fix type error in CodeInput component --- client/src/app/components/CodeInput.tsx | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/client/src/app/components/CodeInput.tsx b/client/src/app/components/CodeInput.tsx index bec2693c..f9760234 100644 --- a/client/src/app/components/CodeInput.tsx +++ b/client/src/app/components/CodeInput.tsx @@ -9,7 +9,7 @@ import { } from "@mantine/core"; import React, { useEffect, useState } from "react"; import { useLocation } from "react-router-dom"; -import { useAppDispatch, useAppSelector } from "../hooks/redux"; +import { useAppSelector } from "../hooks/redux"; import { useNavigate } from "../hooks/useNavigate"; import { applyCodeSuggestion } from "../util/applyCodeSuggestion"; import { CODE_SEGMENT_DELIMITER } from "../util/constants"; @@ -17,11 +17,7 @@ import { getCodeSuggestion } from "../util/getCodeSuggestion"; import { makeProgressFunc } from "../util/makeProgressFunc"; import { spellCheckCodeWord } from "../util/spellCheckCodeWord"; import { CodeErrorType, validateCode } from "../util/validateCode"; -import { - requestTransfer, - selectWormholeStatus, - setTransferProgress, -} from "../wormholeSlice"; +import { selectWormholeStatus } from "../wormholeSlice"; type ContentProps = { code: string; @@ -152,7 +148,7 @@ export default function CodeInput(props: Props) { const [showError, setShowError] = useState(false); const codeSuggestion = getCodeSuggestion(code || ""); const error = validateCode(code); - const location = useLocation(); + const location = useLocation() as { state?: { code?: string } }; const navigate = useNavigate(); const wormholeStatus = useAppSelector(selectWormholeStatus); From b6bf87f5ec1d616df74af457152dc3829eb11743 Mon Sep 17 00:00:00 2001 From: Justus Tumacder Date: Fri, 10 Feb 2023 14:07:39 +0800 Subject: [PATCH 03/12] Replace go with rust --- .github/workflows/integrate.yml | 1 - .gitignore | 2 +- .gitmodules | 6 +- client/.prettierignore | 3 +- client/Dockerfile | 9 +- client/gulpfile.js | 71 +- client/package-lock.json | 37 + client/package.json | 1 + client/src/app/components/CodeInput.tsx | 1 - .../screens/receive/ReceiveBeginScreen.tsx | 6 - .../screens/send/SendBeginScreen.tsx | 6 - client/src/app/index.tsx | 1 - client/src/app/loadAndRunWasm.ts | 14 - client/src/app/sagas.ts | 115 +- client/src/app/types/go.d.ts | 5 - client/src/app/types/wormhole.d.ts | 56 - client/src/app/util/errors.tsx | 74 +- client/src/app/util/makeProgressFunc.ts | 7 +- client/src/app/wormholeSlice.ts | 5 +- client/vendor/magic-wormhole.rs | 1 + client/vendor/wormhole-william | 1 - client/wasm/Cargo.lock | 2003 +++++++++++++++++ client/wasm/Cargo.toml | 22 + client/wasm/src/lib.rs | 423 ++++ 24 files changed, 2609 insertions(+), 261 deletions(-) delete mode 100644 client/src/app/loadAndRunWasm.ts delete mode 100644 client/src/app/types/go.d.ts delete mode 100644 client/src/app/types/wormhole.d.ts create mode 160000 client/vendor/magic-wormhole.rs delete mode 160000 client/vendor/wormhole-william create mode 100644 client/wasm/Cargo.lock create mode 100644 client/wasm/Cargo.toml create mode 100644 client/wasm/src/lib.rs diff --git a/.github/workflows/integrate.yml b/.github/workflows/integrate.yml index 95942443..1a8da269 100644 --- a/.github/workflows/integrate.yml +++ b/.github/workflows/integrate.yml @@ -29,7 +29,6 @@ jobs: timeout-minutes: 30 strategy: matrix: - go-version: [1.19.3] os: [ubuntu-latest] steps: - name: Checkout repository diff --git a/.gitignore b/.gitignore index 1877ccea..6d6cec70 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,4 @@ /client-e2e/test/files/sizes/ dist/ node_modules/ -wasm_exec.js \ No newline at end of file +/client/wasm/target/ \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index 4c513756..08235997 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ -[submodule "client/vendor/wormhole-william"] - path = client/vendor/wormhole-william - url = git@github.com:LeastAuthority/wormhole-william.git [submodule "feedback-api/feedback-api"] path = feedback-api url = git@github.com:LeastAuthority/feedback-api.git +[submodule "client/vendor/magic-wormhole.rs"] + path = client/vendor/magic-wormhole.rs + url = https://github.com/magic-wormhole/magic-wormhole.rs diff --git a/client/.prettierignore b/client/.prettierignore index 5963d770..6badd19a 100644 --- a/client/.prettierignore +++ b/client/.prettierignore @@ -1,5 +1,4 @@ dist node_modules src/public -vendor -wasm_exec.js \ No newline at end of file +vendor \ No newline at end of file diff --git a/client/Dockerfile b/client/Dockerfile index 22858d39..f1bc6399 100644 --- a/client/Dockerfile +++ b/client/Dockerfile @@ -2,18 +2,17 @@ FROM node:16-alpine WORKDIR /usr/src/app/client -RUN apk add git openssh lftp +RUN apk add git openssh lftp curl rust + +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y +ENV PATH="/root/.cargo/bin:${PATH}" RUN npm -g config set user root RUN npm install --global gulp-cli -COPY --from=golang:1.19.3-alpine /usr/local/go/ /usr/local/go/ RUN npm install --location=global @sentry/cli ENV SENTRYCLI_SKIP_DOWNLOAD=1 -ENV PATH="/usr/local/go/bin:${PATH}" -ENV GOROOT="/usr/local/go" - COPY package.json . COPY package-lock.json . ARG SENTRYCLI_USE_LOCAL=1 diff --git a/client/gulpfile.js b/client/gulpfile.js index 2f47ecb1..9e8b0e30 100644 --- a/client/gulpfile.js +++ b/client/gulpfile.js @@ -5,11 +5,12 @@ const log = require("fancy-log"); const connect = require("gulp-connect"); const replace = require("gulp-replace"); const gulpif = require("gulp-if"); -const webpack = require("webpack-stream"); +const webpackStream = require("webpack-stream"); const Dotenv = require("dotenv-webpack"); const fs = require("fs"); const path = require("path"); const proxy = require("http-proxy-middleware"); +const WasmPackPlugin = require("@wasm-tool/wasm-pack-plugin"); require("dotenv").config(); @@ -39,17 +40,26 @@ const webpackConfig = { }, ], }, - plugins: [new Dotenv()], + plugins: [ + new WasmPackPlugin({ + crateDirectory: path.resolve(__dirname, "./wasm"), + outDir: path.resolve(__dirname, "./pkg"), + }), + new Dotenv(), + ], optimization: { minimize: process.env.NODE_ENV === "production", }, + experiments: { + asyncWebAssembly: true, + }, }; const javascript = () => gulp .src(`src/app/index.tsx`) .pipe( - webpack({ + webpackStream({ ...webpackConfig, entry: ["web-streams-polyfill", `./src/app/index.tsx`], }) @@ -60,7 +70,7 @@ const javascriptWatch = () => gulp .src(`src/app/index.tsx`) .pipe( - webpack({ + webpackStream({ ...webpackConfig, watch: true, entry: ["web-streams-polyfill", `./src/app/index.tsx`], @@ -69,16 +79,9 @@ const javascriptWatch = () => .pipe(gulp.dest("dist/app")) .pipe(connect.reload()); -const prepWorker = (cb) => { - // cp wasm_exec.js to be glued - execSync('cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" src/app'); - cb(); -}; - const storybook = () => exec("npm run build-storybook"); -const publicClean = () => - del(["dist/*", "!dist/app", "!dist/storybook", "!dist/wormhole.wasm"]); +const publicClean = () => del(["dist/*", "!dist/app", "!dist/storybook"]); const publicCopy = () => gulp .src("src/public/**/*", { dot: true }) @@ -114,33 +117,6 @@ const public = gulp.series( allowRobots ); -// Set agent version in go library to identify as web app client -const setWasmVersion = async () => { - gulp - .src(["vendor/wormhole-william/version/version.go"]) - .pipe( - replace(new RegExp(`AgentString = "(.*)"`), 'AgentString = "winden.app"') - ) - .pipe( - replace( - new RegExp(`AgentVersion = "(.*)"`), - 'AgentVersion = "' + package.version + '"' - ) - ) - .pipe(gulp.dest("vendor/wormhole-william/version/")); -}; - -// added -buildvcs=false as it fails to build on Github actions with error obtaining VCS status: exit status 128 -const wasmBuild = () => - exec( - "cd vendor/wormhole-william && GOOS=js GOARCH=wasm go build -buildvcs=false -o ../../dist/wormhole.wasm ./wasm/module" - ); -// exec doesn't return a stream, but we need a non-empty stream to be able to reload. -// so we build a stream using gulpfile.js -const wasmReload = () => gulp.src("gulpfile.js").pipe(connect.reload()); - -const wasm = gulp.series(wasmBuild, wasmReload); - const start = () => { connect.server({ host: "0.0.0.0", @@ -165,7 +141,6 @@ const watch = () => { javascriptWatch ); gulp.watch("src/public/**/*", { ignoreInitial: false }, public); - gulp.watch("vendor/wormhole-william/**/*.go", { ignoreInitial: false }, wasm); start(); }; @@ -199,29 +174,17 @@ const deploySftp = (cb) => { exports.javascript = javascript; exports.public = public; -exports.wasm = wasm; exports.storybook = storybook; -exports.watch = gulp.series(prepWorker, watch); +exports.watch = gulp.series(watch); // for CI optimization without watch exports.start = start; exports.clean = clean; -exports.prepWorker = prepWorker; exports.deploy = gulp.series( - prepWorker, public, javascript, - setWasmVersion, - wasm, // storybook, deploySftp ); -exports.default = gulp.series( - prepWorker, - public, - javascript, - setWasmVersion, - wasm, - storybook -); +exports.default = gulp.series(public, javascript, storybook); diff --git a/client/package-lock.json b/client/package-lock.json index f30cbe39..312e1421 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -51,6 +51,7 @@ "@types/react-transition-group": "^4.4.5", "@types/streamsaver": "^2.0.1", "@types/testing-library__jest-dom": "^5.14.3", + "@wasm-tool/wasm-pack-plugin": "^1.6.0", "babel-loader": "^8.2.5", "css-loader": "^6.7.1", "del": "^6.0.0", @@ -11063,6 +11064,18 @@ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==" }, + "node_modules/@wasm-tool/wasm-pack-plugin": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@wasm-tool/wasm-pack-plugin/-/wasm-pack-plugin-1.6.0.tgz", + "integrity": "sha512-Iax4nEgIvVCZqrmuseJm7ln/muWpg7uT5fXMAT0crYo+k5JTuZE58DJvBQoeIAegA3IM9cZgfkcZjAOUCPsT1g==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "command-exists": "^1.2.7", + "watchpack": "^2.1.1", + "which": "^2.0.2" + } + }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -14289,6 +14302,12 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", + "dev": true + }, "node_modules/commander": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", @@ -40621,6 +40640,18 @@ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==" }, + "@wasm-tool/wasm-pack-plugin": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@wasm-tool/wasm-pack-plugin/-/wasm-pack-plugin-1.6.0.tgz", + "integrity": "sha512-Iax4nEgIvVCZqrmuseJm7ln/muWpg7uT5fXMAT0crYo+k5JTuZE58DJvBQoeIAegA3IM9cZgfkcZjAOUCPsT1g==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "command-exists": "^1.2.7", + "watchpack": "^2.1.1", + "which": "^2.0.2" + } + }, "@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -43178,6 +43209,12 @@ "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", "dev": true }, + "command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", + "dev": true + }, "commander": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", diff --git a/client/package.json b/client/package.json index dae19eb9..6fcf6afc 100644 --- a/client/package.json +++ b/client/package.json @@ -53,6 +53,7 @@ "@types/react-transition-group": "^4.4.5", "@types/streamsaver": "^2.0.1", "@types/testing-library__jest-dom": "^5.14.3", + "@wasm-tool/wasm-pack-plugin": "^1.6.0", "babel-loader": "^8.2.5", "css-loader": "^6.7.1", "del": "^6.0.0", diff --git a/client/src/app/components/CodeInput.tsx b/client/src/app/components/CodeInput.tsx index f9760234..4bb6234c 100644 --- a/client/src/app/components/CodeInput.tsx +++ b/client/src/app/components/CodeInput.tsx @@ -14,7 +14,6 @@ import { useNavigate } from "../hooks/useNavigate"; import { applyCodeSuggestion } from "../util/applyCodeSuggestion"; import { CODE_SEGMENT_DELIMITER } from "../util/constants"; import { getCodeSuggestion } from "../util/getCodeSuggestion"; -import { makeProgressFunc } from "../util/makeProgressFunc"; import { spellCheckCodeWord } from "../util/spellCheckCodeWord"; import { CodeErrorType, validateCode } from "../util/validateCode"; import { selectWormholeStatus } from "../wormholeSlice"; diff --git a/client/src/app/components/screens/receive/ReceiveBeginScreen.tsx b/client/src/app/components/screens/receive/ReceiveBeginScreen.tsx index 64e10ec2..47cb557f 100644 --- a/client/src/app/components/screens/receive/ReceiveBeginScreen.tsx +++ b/client/src/app/components/screens/receive/ReceiveBeginScreen.tsx @@ -3,7 +3,6 @@ import React from "react"; import { useAppDispatch } from "../../../hooks/redux"; import { useCommonStyles } from "../../../hooks/useCommonStyles"; import { NoSleep } from "../../../NoSleep"; -import { makeProgressFunc } from "../../../util/makeProgressFunc"; import { requestTransfer, setTransferProgress } from "../../../wormholeSlice"; import CodeInput from "../../CodeInput"; import Content from "../../Content"; @@ -45,11 +44,6 @@ export default function ReceiveBeginScreen({}: Props) { requestTransfer({ type: "receive", code, - opts: { - progressFunc: makeProgressFunc((sentBytes, totalBytes) => { - dispatch(setTransferProgress([sentBytes, totalBytes])); - }), - }, }) ); }} diff --git a/client/src/app/components/screens/send/SendBeginScreen.tsx b/client/src/app/components/screens/send/SendBeginScreen.tsx index 0d2ee4f8..92aa0b87 100644 --- a/client/src/app/components/screens/send/SendBeginScreen.tsx +++ b/client/src/app/components/screens/send/SendBeginScreen.tsx @@ -4,7 +4,6 @@ import { FileRejection } from "react-dropzone"; import { useAppDispatch } from "../../../hooks/redux"; import { useCommonStyles } from "../../../hooks/useCommonStyles"; import { NoSleep } from "../../../NoSleep"; -import { makeProgressFunc } from "../../../util/makeProgressFunc"; import { requestTransfer, setTransferProgress } from "../../../wormholeSlice"; import Content from "../../Content"; import Dropzone from "../../Dropzone"; @@ -118,11 +117,6 @@ export default function SendBeginScreen(props: Props) { type: "send", filename: files[0].name, file: files[0], - opts: { - progressFunc: makeProgressFunc((sentBytes, totalBytes) => { - dispatch(setTransferProgress([sentBytes, totalBytes])); - }), - }, }) ); }} diff --git a/client/src/app/index.tsx b/client/src/app/index.tsx index f3fdd4df..722ef782 100644 --- a/client/src/app/index.tsx +++ b/client/src/app/index.tsx @@ -1,5 +1,4 @@ import "@ionic/vue"; -import "./wasm_exec.js"; import React from "react"; import ReactDOM from "react-dom"; diff --git a/client/src/app/loadAndRunWasm.ts b/client/src/app/loadAndRunWasm.ts deleted file mode 100644 index 684b6761..00000000 --- a/client/src/app/loadAndRunWasm.ts +++ /dev/null @@ -1,14 +0,0 @@ -// TODO: error handling - -export async function loadAndRunWasm() { - const wasmPromise = fetch("/wormhole.wasm"); - const go = new Go(); - let wasm: { instance: WebAssembly.Instance; }; - if (typeof WebAssembly.instantiateStreaming === "undefined") { - const wasmData = await (await wasmPromise).arrayBuffer(); - wasm = await WebAssembly.instantiate(wasmData, go.importObject); - } else { - wasm = await WebAssembly.instantiateStreaming(wasmPromise, go.importObject); - } - go.run(wasm.instance); -} diff --git a/client/src/app/sagas.ts b/client/src/app/sagas.ts index fab7ef64..c5368d66 100644 --- a/client/src/app/sagas.ts +++ b/client/src/app/sagas.ts @@ -1,9 +1,10 @@ +import { channel } from "redux-saga"; import { cancel, cancelled, fork, put, select, take } from "redux-saga/effects"; import streamSaver from "streamsaver"; +import { Client, ReceiveResult, SendResult } from "../../pkg"; import { setError } from "./errorSlice"; -import { loadAndRunWasm } from "./loadAndRunWasm"; import { NoSleep } from "./NoSleep"; -import { FileStreamReader, TransferProgress } from "./types/wormhole"; +import { makeProgressFunc } from "./util/makeProgressFunc"; import { completeLoading, completeTransfer, @@ -13,8 +14,23 @@ import { setFileAndCode, setRequestingReceive, setRequestingSend, + setTransferProgress, } from "./wormholeSlice"; +function defer() { + var res, rej; + + var promise: any = new Promise((resolve, reject) => { + res = resolve; + rej = reject; + }); + + promise.resolve = res; + promise.reject = rej; + + return promise; +} + function* watchForNoSleepDisable() { while (true) { yield take("*"); @@ -46,44 +62,60 @@ export function* watchForTabExit() { } } -let client: number; +const downloadFileChannel = channel(); + +export function* watchDownloadFileChannel(): any { + while (true) { + const action = yield take(downloadFileChannel); + yield put(action); + } +} + +let pkg: typeof import("../../pkg"); +let client: Client; function* transfer(): any { - let cancellable: TransferProgress | FileStreamReader; + let cancel: any; try { while (true) { try { const { payload } = yield take("wormhole/requestTransfer"); if (payload.type === "send") { + cancel = defer(); yield put(setRequestingSend()); - cancellable = yield window.Wormhole.Client.sendFile( - client, - payload.filename, - payload.file, - payload.opts - ); + const sendResult: SendResult = yield pkg.send(client, payload.file); yield put( setFileAndCode({ file: { name: payload.filename, size: payload.file.size, }, - code: (cancellable as TransferProgress).code!, + code: sendResult.get_code(), }) ); - yield (cancellable as TransferProgress).done; + yield pkg.upload_file( + sendResult, + { + progress: makeProgressFunc((sentBytes, totalBytes) => { + downloadFileChannel.put( + setTransferProgress([sentBytes, totalBytes]) + ); + }), + }, + cancel + ); yield put(completeTransfer()); } else if (payload.type === "receive") { + cancel = defer(); yield put(setRequestingReceive()); - cancellable = yield window.Wormhole.Client.recvFile( + const receiveResult: ReceiveResult = yield pkg.receive( client, - payload.code, - payload.opts + payload.code ); yield put( setConsenting({ - name: (cancellable as FileStreamReader).name, - size: (cancellable as FileStreamReader).size, + name: receiveResult.get_file_name(), + size: Number(receiveResult.file_size), }) ); const { payload: consentPayload } = yield take( @@ -91,28 +123,28 @@ function* transfer(): any { ); if (consentPayload) { const fileStream = streamSaver.createWriteStream( - (cancellable as FileStreamReader).name, + receiveResult.get_file_name(), { - size: (cancellable as FileStreamReader).size, + size: Number(receiveResult.file_size), } ); const writer = fileStream.getWriter(); - - let n: number; - let done = false; - while (!done) { - const buffer = new Uint8Array( - (cancellable as FileStreamReader).bufferSizeBytes - ); - [n, done] = yield (cancellable as FileStreamReader).read(buffer); - - writer.write(new Uint8Array(buffer).slice(0, n)); - } - + yield pkg.download_file( + receiveResult, + { + write: (x: unknown) => writer.write(x), + progress: makeProgressFunc((sentBytes, totalBytes) => { + downloadFileChannel.put( + setTransferProgress([sentBytes, totalBytes]) + ); + }), + }, + cancel + ); yield writer.close(); yield put(completeTransfer()); } else { - (cancellable as FileStreamReader).reject(); + yield pkg.reject_file(receiveResult); } } else { continue; @@ -125,24 +157,25 @@ function* transfer(): any { } } finally { if (yield cancelled()) { - cancellable!.cancel(); + cancel.resolve(); yield put(reset()); } } } export function* wormholeSaga(): any { - yield loadAndRunWasm(); - client = window.Wormhole.Client.newClient({ - rendezvousURL: - process.env["MAILBOX_URL"] || `ws://${window.location.hostname}:4000/v1`, - transitRelayURL: - process.env["RELAY_URL"] || `ws://${window.location.hostname}:4002`, - passPhraseComponentLength: 2, - }); + const pkgImport = import("../../pkg").then((pkg) => pkg.default); + pkg = yield pkgImport; + client = pkg.Client.new( + "lothar.com/wormhole/text-or-file-xfer", + process.env["MAILBOX_URL"] || `ws://${window.location.hostname}:4000/v1`, + process.env["RELAY_URL"] || `ws://${window.location.hostname}:4002`, + 2 + ); yield put(completeLoading()); yield fork(watchForTabExit); yield fork(watchForNoSleepDisable); + yield fork(watchDownloadFileChannel); while (true) { const transferTask = yield fork(transfer); yield take("wormhole/requestCancelTransfer"); diff --git a/client/src/app/types/go.d.ts b/client/src/app/types/go.d.ts deleted file mode 100644 index 9a1252d6..00000000 --- a/client/src/app/types/go.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export {}; - -declare global { - let Go: any; -} diff --git a/client/src/app/types/wormhole.d.ts b/client/src/app/types/wormhole.d.ts deleted file mode 100644 index a6b9d7fd..00000000 --- a/client/src/app/types/wormhole.d.ts +++ /dev/null @@ -1,56 +0,0 @@ -export type TransferOptions = { - progressFunc?: (sentBytes: number, totalBytes: number) => void; - code?: string; - bufferSizeBytes?: number; - name?: string; - size?: number; -}; - -type TransferProgress = { - name?: string; - size?: number; - code?: string; - done: Promise; - accept?: () => Promise; - cancel: () => void; - reject?: () => Promise; -}; - -type FileStreamReader = { - readonly name: string; - readonly size: number; - readonly read: (buf: ArrayBuffer) => Promise<[number, boolean]>; - readonly bufferSizeBytes: number; - readonly cancel: () => void; - readonly reject: () => void; -}; - -type ClientConfig = { - rendezvousURL: string; - transitRelayURL: string; - passPhraseComponentLength: number; -}; - -declare global { - interface Window { - Wormhole: { - Client: { - newClient(config?: ClientConfig): number; - sendText(goClient: number, message: string): Promise; - sendFile( - goClient: number, - fileName: string, - file: File, - opts?: TransferOptions - ): Promise; - recvText(goClient: number, code: string): Promise; - recvFile( - goClient: number, - code: string, - opts?: TransferOptions - ): Promise; - free(goClient: number): string | undefined; - }; - }; - } -} diff --git a/client/src/app/util/errors.tsx b/client/src/app/util/errors.tsx index cd5d23ef..7ed2c137 100644 --- a/client/src/app/util/errors.tsx +++ b/client/src/app/util/errors.tsx @@ -3,46 +3,27 @@ import React, { ReactElement, ReactNode } from "react"; export const enum ErrorTypes { SENDER_CANCELLED, - RECEIVER_CANCELLED, - RECV_CONNECTION_TIMEOUT, SENDER_BAD_CODE, + RECEIVER_CANCELLED, + RECEIVER_BAD_CODE, RECEIVER_REJECTED, - BAD_CODE, MAILBOX_RELAY_CONNECTION, - INTERRUPT, - WASM_EXITED, + UNKNOWN, } -const ServerErrorMsg = - "Unfortunately, Winden cannot connect to the Least Authority servers. Please try again or let us know at contact@winden.app if the problem remains."; - export function detectErrorType(error: string) { - console.log("Error details: ", error); - if (error.includes("unexpected EOF")) { + if (error.match(/Failed to send.+Task has been cancelled/i)) { return ErrorTypes.SENDER_CANCELLED; - } else if (error.includes("failed to write")) { + } else if (error.match(/Failed to receive.+Task has been cancelled/i)) { return ErrorTypes.RECEIVER_CANCELLED; - } else if (/^SendErr: decrypt message failed$/.test(error)) { - return ErrorTypes.SENDER_BAD_CODE; - } else if (/(.*transfer rejected.*)/.test(error)) { + } else if (error.includes("transfer rejected")) { return ErrorTypes.RECEIVER_REJECTED; - } else if ( - /^decrypt message failed$/.test(error) || - error.startsWith("Nameplate is unclaimed") - ) { - return ErrorTypes.BAD_CODE; - // cases: this can happen before transfer, but also during the transfer. - // TODO: separate error messages depending when it happens - } else if ( - /(.*unclean connection close.*)|(.*websocket.Dial failed.*)|(failed to establish connection$)|(^WebSocket connection to.*failed.*)/.test( - error - ) - ) { + } else if (error.startsWith("Bad code:")) { + return ErrorTypes.RECEIVER_BAD_CODE; + } else if (error.startsWith("Failed to connect to")) { return ErrorTypes.MAILBOX_RELAY_CONNECTION; - } else if (/(.*unknown send result.*)/.test(error)) { - return ErrorTypes.INTERRUPT; } else { - return ErrorTypes.RECV_CONNECTION_TIMEOUT; + return ErrorTypes.UNKNOWN; } } @@ -89,20 +70,6 @@ export function errorContent(type: ErrorTypes): { ), }; } - case ErrorTypes.RECV_CONNECTION_TIMEOUT: { - return { - title: "Connection time-out", - description: ( - <> - - It looks like the connection between you and the sender was - briefly lost. - - Please ask the sender for a new code. - - ), - }; - } case ErrorTypes.RECEIVER_REJECTED: { return { title: "Transfer cancelled", @@ -130,7 +97,7 @@ export function errorContent(type: ErrorTypes): { ), }; } - case ErrorTypes.BAD_CODE: { + case ErrorTypes.RECEIVER_BAD_CODE: { return { title: "Oops...", description: ( @@ -153,23 +120,16 @@ export function errorContent(type: ErrorTypes): { case ErrorTypes.MAILBOX_RELAY_CONNECTION: { return { title: "Oops", - description: [ServerErrorMsg], - }; - } - case ErrorTypes.INTERRUPT: { - return { - title: "Transfer cancelled/interrupted", description: ( - <> - - The transfer was cancelled or interrupted. - - Please try again. - + + Unfortunately, Winden cannot connect to the Least Authority servers. + Please try again or let us know at contact@winden.app if the problem + remains. + ), }; } - case ErrorTypes.WASM_EXITED: { + case ErrorTypes.UNKNOWN: { return { title: "Something went wrong", description: [ diff --git a/client/src/app/util/makeProgressFunc.ts b/client/src/app/util/makeProgressFunc.ts index 99b7ac06..f0919a23 100644 --- a/client/src/app/util/makeProgressFunc.ts +++ b/client/src/app/util/makeProgressFunc.ts @@ -1,17 +1,16 @@ -import { TransferOptions } from "../types/wormhole"; import { PROGRESS_BAR_MS_PER_UPDATES } from "./constants"; export function makeProgressFunc( onProgress: (sentBytes: number, totalBytes: number) => void -): TransferOptions["progressFunc"] { +) { let lastProgressUpdate = Date.now(); - return (sentBytes, totalBytes) => { + return (sentBytes: bigint, totalBytes: bigint) => { const now = Date.now(); if ( sentBytes === totalBytes || now - lastProgressUpdate > PROGRESS_BAR_MS_PER_UPDATES ) { - onProgress(sentBytes, totalBytes); + onProgress(Number(sentBytes), Number(totalBytes)); lastProgressUpdate = now; } }; diff --git a/client/src/app/wormholeSlice.ts b/client/src/app/wormholeSlice.ts index 505a70be..e0d913b4 100644 --- a/client/src/app/wormholeSlice.ts +++ b/client/src/app/wormholeSlice.ts @@ -1,7 +1,6 @@ import { createAction, createSlice, SliceCaseReducers } from "@reduxjs/toolkit"; import { setError } from "./errorSlice"; import type { RootState } from "./store"; -import { TransferOptions } from "./types/wormhole"; type FileInfo = { name: string; @@ -58,8 +57,8 @@ export const completeLoading = createAction( "wormhole/completeLoading" ); export const requestTransfer = createAction< - | { type: "send"; filename: string; file: File; opts: TransferOptions } - | { type: "receive"; code: string; opts: TransferOptions }, + | { type: "send"; filename: string; file: File } + | { type: "receive"; code: string }, "wormhole/requestTransfer" >("wormhole/requestTransfer"); export const setFileAndCode = createAction< diff --git a/client/vendor/magic-wormhole.rs b/client/vendor/magic-wormhole.rs new file mode 160000 index 00000000..7c13ce88 --- /dev/null +++ b/client/vendor/magic-wormhole.rs @@ -0,0 +1 @@ +Subproject commit 7c13ce88b5ad5666ed084f9d1241159d0a1ad7d8 diff --git a/client/vendor/wormhole-william b/client/vendor/wormhole-william deleted file mode 160000 index 5c52629f..00000000 --- a/client/vendor/wormhole-william +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5c52629f26e98810f57b6a356fbba2fa5f955f9a diff --git a/client/wasm/Cargo.lock b/client/wasm/Cargo.lock new file mode 100644 index 00000000..512fbf36 --- /dev/null +++ b/client/wasm/Cargo.lock @@ -0,0 +1,2003 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aead" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" +dependencies = [ + "generic-array", + "rand_core 0.6.4", +] + +[[package]] +name = "aes" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", + "opaque-debug", +] + +[[package]] +name = "aes-gcm" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df5f85a83a7d8b0442b6aa7b504b8212c1733da07b98aae43d4bc21b2cb3cdf6" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + +[[package]] +name = "async-attributes" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "async-channel" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833" +dependencies = [ + "concurrent-queue", + "event-listener", + "futures-core", +] + +[[package]] +name = "async-executor" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17adb73da160dfb475c183343c8cccd80721ea5a605d3eb57125f0a7b7a92d0b" +dependencies = [ + "async-lock", + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "slab", +] + +[[package]] +name = "async-global-executor" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" +dependencies = [ + "async-channel", + "async-executor", + "async-io", + "async-lock", + "blocking", + "futures-lite", + "once_cell", +] + +[[package]] +name = "async-io" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c374dda1ed3e7d8f0d9ba58715f924862c63eae6849c92d3a18e7fbde9e2794" +dependencies = [ + "async-lock", + "autocfg", + "concurrent-queue", + "futures-lite", + "libc", + "log", + "parking", + "polling", + "slab", + "socket2", + "waker-fn", + "windows-sys", +] + +[[package]] +name = "async-lock" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8101efe8695a6c17e02911402145357e718ac92d3ff88ae8419e84b1707b685" +dependencies = [ + "event-listener", + "futures-lite", +] + +[[package]] +name = "async-process" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6381ead98388605d0d9ff86371043b5aa922a3905824244de40dc263a14fcba4" +dependencies = [ + "async-io", + "async-lock", + "autocfg", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "libc", + "signal-hook", + "windows-sys", +] + +[[package]] +name = "async-std" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" +dependencies = [ + "async-attributes", + "async-channel", + "async-global-executor", + "async-io", + "async-lock", + "async-process", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + +[[package]] +name = "async-tar" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c49359998a76e32ef6e870dbc079ebad8f1e53e8441c5dd39d27b44493fe331" +dependencies = [ + "async-std", + "filetime", + "libc", + "pin-project", + "redox_syscall", + "xattr", +] + +[[package]] +name = "async-task" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a40729d2133846d9ed0ea60a8b9541bccddab49cd30f0715a1da672fe9a2524" + +[[package]] +name = "async-tls" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f23d769dbf1838d5df5156e7b1ad404f4c463d1ac2c6aeb6cd943630f8a8400" +dependencies = [ + "futures-core", + "futures-io", + "rustls", + "webpki", + "webpki-roots", +] + +[[package]] +name = "async-trait" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd7fce9ba8c3c042128ce72d8b2ddbf3a05747efb67ea0313c635e10bda47a2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-tungstenite" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1b71b31561643aa8e7df3effe284fa83ab1a840e52294c5f4bd7bfd8b2becbb" +dependencies = [ + "async-std", + "async-tls", + "futures-io", + "futures-util", + "log", + "pin-project-lite", + "tungstenite", +] + +[[package]] +name = "async_io_stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" +dependencies = [ + "futures", + "pharos", + "rustc_version", +] + +[[package]] +name = "atomic-waker" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "debc29dde2e69f9e47506b525f639ed42300fc014a3e007832592448fa8e4599" + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ea22880d78093b0cbe17c89f64a7d457941e65759157ec6cb31a31d652b05e5" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest 0.10.6", +] + +[[package]] +name = "block-buffer" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blocking" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c67b173a56acffd6d2326fb7ab938ba0b00a71480e14902b2591c87bc5741e8" +dependencies = [ + "async-channel", + "async-lock", + "async-task", + "atomic-waker", + "fastrand", + "futures-lite", +] + +[[package]] +name = "bumpalo" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" + +[[package]] +name = "bytecodec" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adf4c9d0bbf32eea58d7c0f812058138ee8edaf0f2802b6d03561b504729a325" +dependencies = [ + "byteorder", + "trackable 0.2.24", +] + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + +[[package]] +name = "cache-padded" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chacha20" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c80e5460aa66fe3b91d40bcbdab953a597b60053e34d684ac6903f863b680a6" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", + "zeroize", +] + +[[package]] +name = "chacha20poly1305" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18446b09be63d457bbec447509e85f662f32952b035ce892290396bc0b0cff5" +dependencies = [ + "aead", + "chacha20", + "cipher", + "poly1305", + "zeroize", +] + +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array", +] + +[[package]] +name = "concurrent-queue" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c278839b831783b70278b14df4d45e1beb1aad306c07bb796637de9a0e323e8e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "cpufeatures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403" + +[[package]] +name = "crossbeam-utils" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "ctor" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "ctr" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" +dependencies = [ + "cipher", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "darling" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "fastrand" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" +dependencies = [ + "instant", +] + +[[package]] +name = "filetime" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e884668cd0c7480504233e951174ddc3b382f7c2666e3b7310b5c4e7b0c37f9" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "windows-sys", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13e2792b0ff0340399d58445b88fd9770e3489eff258a4cbc1523418f12abf84" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608" + +[[package]] +name = "futures-executor" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8de0a35a6ab97ec8869e32a2473f4b1324459e14c29275d14b10cb1fd19b50e" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfb8371b6fb2aeb2d280374607aeabfc99d95c72edfe51692e42d3d7f0d08531" + +[[package]] +name = "futures-lite" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-macro" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a73af87da33b5acf53acfebdc339fe592ecf5357ac7c0a7734ab9d8c876a70" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f310820bb3e8cfd46c80db4d7fb8353e15dfff853a127158425f31e0be6c8364" + +[[package]] +name = "futures-task" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366" + +[[package]] +name = "futures-util" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "futures_ringbuf" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b905098b5519bd63b2a1f9f4615198b0e38a473ce201ffdbd4dea6eb63087ddc" +dependencies = [ + "futures", + "log", + "log-derive", + "ringbuf", + "rustc_version", +] + +[[package]] +name = "generic-array" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "ghash" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1583cc1656d7839fd3732b80cf4f38850336cdb9b8ded1cd399ca62958de3c99" +dependencies = [ + "opaque-debug", + "polyval", +] + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] + +[[package]] +name = "hkdf" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.6", +] + +[[package]] +name = "hmac-sha1" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1333fad8d94b82cab989da428b0b36a3435db3870d85e971a1d6dc0a8576722" +dependencies = [ + "sha1", +] + +[[package]] +name = "http" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "if-addrs" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b24dd0826eee92c56edcda7ff190f2cf52115c49eadb2c2da8063e2673a8c2" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "itoa" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" + +[[package]] +name = "js-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + +[[package]] +name = "libc" +version = "0.2.139" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" + +[[package]] +name = "lock_api" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", + "value-bag", +] + +[[package]] +name = "log-derive" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a42526bb432bcd1b43571d5f163984effa25409a29f1a3242a54d0577d55bcf" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "magic-wormhole" +version = "0.6.0" +dependencies = [ + "async-io", + "async-std", + "async-tar", + "async-trait", + "async-tungstenite", + "base64 0.20.0", + "bytecodec", + "derive_more", + "futures", + "futures_ringbuf", + "getrandom 0.1.16", + "getrandom 0.2.8", + "hex", + "hkdf", + "if-addrs", + "instant", + "libc", + "log", + "noise-protocol", + "noise-rust-crypto", + "percent-encoding", + "rand", + "rmp-serde", + "serde", + "serde_derive", + "serde_json", + "sha-1", + "sha2", + "socket2", + "spake2", + "stun_codec", + "thiserror", + "time", + "url", + "wasm-timer", + "ws_stream_wasm", + "xsalsa20poly1305", +] + +[[package]] +name = "md5" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "noise-protocol" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb474d36dfe51bb4d7e733fee2b0dfd92ee1b95c716030a70e92737dea1a52b" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "noise-rust-crypto" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e7cfeb8e6a63b4a5ccef34ed7a22d084a129b1e53a000c080bbc54c0da6f8c" +dependencies = [ + "aes-gcm", + "blake2", + "chacha20poly1305", + "getrandom 0.2.8", + "noise-protocol", + "sha2", + "x25519-dalek", + "zeroize", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "parking" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall", + "smallvec", + "winapi", +] + +[[package]] +name = "paste" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d01a5bd0424d00070b0098dd17ebca6f961a959dead1dbcbbbc1d1cd8d3deeba" + +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version", +] + +[[package]] +name = "pin-project" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "polling" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22122d5ec4f9fe1b3916419b76be1e80bcb93f618d071d2edf841b137b2a2bd6" +dependencies = [ + "autocfg", + "cfg-if", + "libc", + "log", + "wepoll-ffi", + "windows-sys", +] + +[[package]] +name = "poly1305" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "048aeb476be11a4b6ca432ca569e375810de9294ae78f4774e78ea98a9246ede" +dependencies = [ + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "polyval" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro2" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.8", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi", +] + +[[package]] +name = "ringbuf" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f65af18d50f789e74aaf23bbb3f65dcd22a3cb6e029b5bced149f6bd57c5c2a2" +dependencies = [ + "cache-padded", +] + +[[package]] +name = "rmp" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44519172358fd6d58656c86ab8e7fbc9e1490c3e8f14d35ed78ca0dd07403c9f" +dependencies = [ + "byteorder", + "num-traits", + "paste", +] + +[[package]] +name = "rmp-serde" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5b13be192e0220b8afb7222aa5813cb62cc269ebb5cac346ca6487681d2913e" +dependencies = [ + "byteorder", + "rmp", + "serde", +] + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustls" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +dependencies = [ + "base64 0.13.1", + "log", + "ring", + "sct", + "webpki", +] + +[[package]] +name = "ryu" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" + +[[package]] +name = "salsa20" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0fbb5f676da676c260ba276a8f43a8dc67cf02d1438423aeb1c677a7212686" +dependencies = [ + "cipher", + "zeroize", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "sct" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "semver" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + +[[package]] +name = "serde" +version = "1.0.152" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde_derive" +version = "1.0.152" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha-1" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.6", +] + +[[package]] +name = "sha1" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc30b1e1e8c40c121ca33b86c23308a090d19974ef001b4bf6e61fd1a0fb095c" + +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.6", +] + +[[package]] +name = "signal-hook" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + +[[package]] +name = "socket2" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "spake2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7139ade210556eca57dfc299ec2454846ab6be09232eb1139a36e285ae7fd48e" +dependencies = [ + "curve25519-dalek", + "hkdf", + "rand_core 0.5.1", + "sha2", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "strsim" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" + +[[package]] +name = "stun_codec" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f1df6c4e592afc1ffed8f4bc50ab9f4d70cfccb42829662b7d276247cbef3b1" +dependencies = [ + "bytecodec", + "byteorder", + "crc", + "hmac-sha1", + "md5", + "trackable 1.2.0", +] + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "syn" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", +] + +[[package]] +name = "thiserror" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "time" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" +dependencies = [ + "itoa", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" + +[[package]] +name = "time-macros" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" +dependencies = [ + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "trackable" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98abb9e7300b9ac902cc04920945a874c1973e08c310627cc4458c04b70dd32" +dependencies = [ + "trackable 1.2.0", + "trackable_derive", +] + +[[package]] +name = "trackable" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "017e2a1a93718e4e8386d037cfb8add78f1d690467f4350fb582f55af1203167" +dependencies = [ + "trackable_derive", +] + +[[package]] +name = "trackable_derive" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebeb235c5847e2f82cfe0f07eb971d1e5f6804b18dac2ae16349cc604380f82f" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "tungstenite" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0" +dependencies = [ + "base64 0.13.1", + "byteorder", + "bytes", + "http", + "httparse", + "log", + "rand", + "sha-1", + "thiserror", + "url", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + +[[package]] +name = "unicode-bidi" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54675592c1dbefd78cbd98db9bacd89886e1ca50692a0692baefffdeb92dd58" + +[[package]] +name = "unicode-ident" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "universal-hash" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "value-bag" +version = "1.0.0-alpha.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2209b78d1249f7e6f3293657c9779fe31ced465df091bbd433a1cf88e916ec55" +dependencies = [ + "ctor", + "version_check", +] + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "waker-fn" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" + +[[package]] +name = "wasm-timer" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki" +version = "0.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" +dependencies = [ + "webpki", +] + +[[package]] +name = "wepoll-ffi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" +dependencies = [ + "cc", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" + +[[package]] +name = "wormhole-rs-wasm" +version = "0.4.0" +dependencies = [ + "console_error_panic_hook", + "futures", + "getrandom 0.1.16", + "js-sys", + "magic-wormhole", + "serde", + "serde-wasm-bindgen", + "serde_json", + "thiserror", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "ws_stream_wasm" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version", + "send_wrapper", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "x25519-dalek" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2392b6b94a576b4e2bf3c5b2757d63f10ada8020a2e4d08ac849ebcf6ea8e077" +dependencies = [ + "curve25519-dalek", + "rand_core 0.5.1", + "zeroize", +] + +[[package]] +name = "xattr" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" +dependencies = [ + "libc", +] + +[[package]] +name = "xsalsa20poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e68bcb965d6c650091450b95cea12f07dcd299a01c15e2f9433b0813ea3c0886" +dependencies = [ + "aead", + "poly1305", + "rand_core 0.6.4", + "salsa20", + "subtle", + "zeroize", +] + +[[package]] +name = "zeroize" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] diff --git a/client/wasm/Cargo.toml b/client/wasm/Cargo.toml new file mode 100644 index 00000000..a7b8773c --- /dev/null +++ b/client/wasm/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "wormhole-rs-wasm" +version = "0.4.0" +edition = "2021" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +console_error_panic_hook = "0.1.7" +futures = "0.3.26" +getrandom = { version = "0.1", features = ["wasm-bindgen"] } +js-sys = "0.3.61" +magic-wormhole = { path = "../vendor/magic-wormhole.rs" } +serde = "1.0.152" +serde_json = "1.0.91" +serde-wasm-bindgen = "0.4.5" +thiserror = "1.0.38" +url = { version = "2.3.1", features = ["serde"] } +wasm-bindgen = "0.2.83" +wasm-bindgen-futures = "0.4.33" +web-sys = { version = "0.3.61", features = ["File"] } diff --git a/client/wasm/src/lib.rs b/client/wasm/src/lib.rs new file mode 100644 index 00000000..135030b5 --- /dev/null +++ b/client/wasm/src/lib.rs @@ -0,0 +1,423 @@ +use futures::future::BoxFuture; +use futures::io::{AsyncRead, Error}; +use futures::AsyncWrite; +use magic_wormhole::rendezvous::RendezvousError; +use magic_wormhole::transfer::{ReceiveRequest, TransferError}; +use std::borrow::Cow; +use std::future::Future; +use std::panic; +use std::pin::Pin; +use std::task::{Context, Poll}; +use thiserror::Error; + +use magic_wormhole::{transfer, transit, AppID, Code, Wormhole, WormholeError}; +use wasm_bindgen::prelude::*; +use wasm_bindgen_futures::JsFuture; + +#[wasm_bindgen] +extern "C" { + fn alert(s: &str); + + #[wasm_bindgen(js_namespace = console)] + fn log(s: &str); +} + +macro_rules! console_log { + ($($t:tt)*) => (log(&format_args!($($t)*).to_string())) +} + +#[wasm_bindgen] +pub fn init() { + panic::set_hook(Box::new(console_error_panic_hook::hook)); +} + +struct NoOpFuture {} + +impl Future for NoOpFuture { + type Output = (); + + fn poll(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll { + Poll::Pending + } +} + +#[derive(Error, Debug)] +pub enum WasmWormholeError { + #[error("Failed to connect to wormhole")] + WormholeConnectionFailed(#[from] WormholeError), + #[error("Failed to connect to rendezvous")] + RendezvousConnectionFailed(#[from] RendezvousError), + #[error("Transfer failed")] + TransferFailed(#[from] TransferError), + #[error("Bad code: {0}")] + BadCode(WormholeError), + #[error("Request cancelled")] + RequestCancelled, + #[error("Failed to send: {0}")] + SendError(TransferError), + #[error("Failed to receive: {0}")] + ReceiveError(TransferError), + #[error("Failed to read file")] + FailedToReadFile, +} + +impl From for JsValue { + fn from(value: WasmWormholeError) -> Self { + value.to_string().into() + } +} + +#[wasm_bindgen] +pub struct Client { + appid: AppID, + rendezvous_url: String, + transit_server_url: String, + passphrase_component_len: usize, +} + +#[wasm_bindgen] +impl Client { + pub fn new( + appid: &str, + rendezvous_url: &str, + transit_server_url: &str, + passphrase_component_len: usize, + ) -> Self { + Self { + appid: appid.to_string().into(), + rendezvous_url: rendezvous_url.to_string(), + transit_server_url: transit_server_url.to_string(), + passphrase_component_len: passphrase_component_len, + } + } +} + +#[wasm_bindgen] +pub struct SendResult { + code: String, + f: Option>>, + transit_server_url: String, + file: web_sys::File, +} + +#[wasm_bindgen] +impl SendResult { + pub fn get_code(&self) -> String { + self.code.clone() + } +} + +/** + * Initializes a file transfer as a sender. + * After calling this function successfully, use [upload_file] to begin sending the file to the receiver. + */ +#[wasm_bindgen] +pub async fn send(client: &Client, file: web_sys::File) -> Result { + match wasm_bindgen_futures::JsFuture::from(file.array_buffer()).await { + Ok(_) => {} + Err(_) => return Err(WasmWormholeError::FailedToReadFile), + }; + + let rendezvous = Box::new(client.rendezvous_url.as_str()); + let config = transfer::APP_CONFIG.rendezvous_url(Cow::Owned(rendezvous.to_string())); + let (server_welcome, wormhole_future) = Wormhole::connect_without_code(config, 2).await?; + + Ok(SendResult { + code: server_welcome.code.0, + transit_server_url: client.transit_server_url.clone(), + f: Some(Box::pin(wormhole_future)), + file, + } + .into()) +} + +/** + * Begins transferring the file as a sender. + * Resolves once the file transfer is completed. + * + * See also: [send] + */ +#[wasm_bindgen] +pub async fn upload_file( + mut send_result: SendResult, + opts: JsValue, + promise: js_sys::Promise, +) -> Result { + let progress_func = js_sys::Reflect::get(&opts, &"progress".into()) + .expect("`opts.progress` should not be undefined"); + if !progress_func.is_function() { + panic!("`opts.progress` should be a function") + } + let progress_func = js_sys::Function::from(progress_func); + + let f = send_result.f.take().expect("f should not be empty"); + + let future = wasm_bindgen_futures::JsFuture::from(promise); + + let wormhole = f.await?; + + let file_name = send_result.file.name(); + let file_size = send_result.file.size() as u64; + let mut file_wrapper = FileWrapper::new(send_result.file); + match transfer::send_file( + wormhole, + vec![transit::RelayHint::new( + None, + vec![], + vec![url::Url::parse(&send_result.transit_server_url).unwrap()], + )], + &mut file_wrapper, + file_name, + file_size, + transit::Abilities::FORCE_RELAY, + |_info| {}, + move |cur, total| { + progress_func + .call2(&JsValue::UNDEFINED, &cur.into(), &total.into()) + .unwrap(); + }, + async { + match future.await { + _ => (), + } + }, + ) + .await + { + Ok(_) => Ok(JsValue::UNDEFINED), + Err(e) => Err(WasmWormholeError::SendError(e)), + } +} + +#[wasm_bindgen] +pub struct ReceiveResult { + req: Option, + file_name: String, + pub file_size: u64, +} + +#[wasm_bindgen] +impl ReceiveResult { + pub fn get_file_name(&self) -> String { + self.file_name.clone() + } +} + +/** + * Requests to receive a file from a sender. + * After successfully calling this function, use [download_file] to begin download, or [reject_file] to cancel download request. + */ +#[wasm_bindgen] +pub async fn receive(client: &Client, code: String) -> Result { + let rendezvous = Box::new(client.rendezvous_url.as_str()); + let config = transfer::APP_CONFIG.rendezvous_url(Cow::Owned(rendezvous.to_string())); + + let wormhole = match Wormhole::connect_with_code(config, Code(code), true).await { + Ok((_, x)) => x, + Err(e) => return Err(WasmWormholeError::BadCode(e)), + }; + + let req = transfer::request_file( + wormhole, + vec![transit::RelayHint::new( + None, + vec![], + vec![url::Url::parse(&client.transit_server_url).unwrap()], + )], + transit::Abilities::FORCE_RELAY, + NoOpFuture {}, + ) + .await?; + + match req { + Some(req) => { + let file_name = req.filename.clone(); + let file_size = req.filesize; + + Ok(ReceiveResult { + req: Some(req), + file_name: file_name.to_str().unwrap().to_owned(), + file_size, + } + .into()) + } + None => Err(WasmWormholeError::RequestCancelled), + } +} + +/** + * Begins downloading the file as a receiver. + * Resolves once the file transfer is completed. + * + * See also: [receive] + */ +#[wasm_bindgen] +pub async fn download_file( + mut receive_result: ReceiveResult, + opts: JsValue, + promise: js_sys::Promise, +) -> Result { + let progress_func = js_sys::Reflect::get(&opts, &"progress".into()) + .expect("`opts.progress` should not be undefined"); + if !progress_func.is_function() { + panic!("`opts.progress` should be a function") + } + let progress_func = js_sys::Function::from(progress_func); + let req = receive_result.req.take().expect("req should not be empty"); + let mut file_writer = FileWriter::new(opts); + + let future = wasm_bindgen_futures::JsFuture::from(promise); + + match req + .accept( + |_info| {}, + move |cur, total| { + progress_func + .call2(&JsValue::UNDEFINED, &cur.into(), &total.into()) + .unwrap(); + }, + &mut file_writer, + async { + match future.await { + _ => (), + } + }, + ) + .await + { + Ok(_) => Ok(JsValue::UNDEFINED), + Err(e) => Err(WasmWormholeError::ReceiveError(e)), + } +} + +/** + * Rejects the file as a receiver + * + * See also: [receive] + */ +#[wasm_bindgen] +pub async fn reject_file(mut receive_result: ReceiveResult) -> Result { + let req = receive_result.req.take().expect("req should not be empty"); + match req.reject().await { + Ok(_) => Ok(JsValue::UNDEFINED), + Err(_) => Err(JsValue::UNDEFINED), + } +} + +struct FileWriter { + writer: JsValue, + f: Box>, +} + +impl FileWriter { + fn new(writer: JsValue) -> Self { + FileWriter { + writer, + f: Box::new(None), + } + } +} + +impl AsyncWrite for FileWriter { + fn poll_close(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { + // closing should be handled on the client side + Poll::Ready(Ok(())) + } + fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { + // we don't buffer any data + Poll::Ready(Ok(())) + } + fn poll_write( + mut self: Pin<&mut Self>, + cx: &mut Context<'_>, + buf: &[u8], + ) -> Poll> { + let write = + js_sys::Reflect::get(&self.writer, &"write".into()).expect("writer.write is undefined"); + if !write.is_function() { + panic!("writer.write is not a function") + } + let write_fn = js_sys::Function::from(write); + if let Some(f) = &mut *self.f { + let p = Pin::new(&mut *f); + match p.poll(cx) { + Poll::Pending => Poll::Pending, + Poll::Ready(_) => { + self.f = Box::new(None); + Poll::Ready(Ok(buf.len())) + } + } + } else { + let abuf = js_sys::ArrayBuffer::new(buf.len() as u32); + let uarr = js_sys::Uint8Array::new(&abuf); + uarr.copy_from(buf); + let write_call = write_fn.call1(&JsValue::UNDEFINED, &uarr.into()); + let returned_promise: js_sys::Promise = write_call.unwrap().into(); + let mut returned_future: JsFuture = returned_promise.into(); + let p = Pin::new(&mut returned_future); + match p.poll(cx) { + _ => { + self.f = Box::new(Some(returned_future)); + Poll::Pending + } + } + } + } +} + +struct FileWrapper { + file: web_sys::File, + size: i32, + index: i32, + f: Box>, +} + +impl FileWrapper { + fn new(file: web_sys::File) -> Self { + let size = file.size(); + FileWrapper { + file, + size: size as i32, + index: 0, + f: Box::new(None), + } + } +} + +impl AsyncRead for FileWrapper { + fn poll_read( + mut self: Pin<&mut Self>, + cx: &mut Context<'_>, + buf: &mut [u8], + ) -> Poll> { + let start = self.index; + let end = i32::min(start + buf.len() as i32, self.size); + + if let Some(f) = &mut *self.f { + let p = Pin::new(&mut *f); + match p.poll(cx) { + Poll::Pending => Poll::Pending, + Poll::Ready(array_buffer) => { + let abuf: js_sys::ArrayBuffer = array_buffer.unwrap().into(); + let abuf_size = abuf.byte_length() as usize; + js_sys::Uint8Array::new(&abuf).copy_to(&mut buf[..abuf_size]); + self.f = Box::new(None); + let size = end - start; + self.index += size; + Poll::Ready(Ok(size as usize)) + } + } + } else { + let blob = self.file.slice_with_i32_and_i32(start, end).unwrap(); + + let mut array_buffer_future: JsFuture = blob.array_buffer().into(); + let p = Pin::new(&mut array_buffer_future); + match p.poll(cx) { + _ => { + self.f = Box::new(Some(array_buffer_future)); + Poll::Pending + } + } + } + } +} From b8a4823c277459e6e5fb33a3009b0895ce7b6b75 Mon Sep 17 00:00:00 2001 From: Justus Tumacder Date: Wed, 1 Mar 2023 14:10:37 +0800 Subject: [PATCH 04/12] Update README and ARCHITECTURE --- ARCHITECTURE.md | 28 ++++++++++------------------ README.md | 9 ++++++--- 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index e17139ea..b8ba9c50 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -9,16 +9,12 @@ The folder structure looks like so: ``` - client/ - client-e2e/ -- mailbox/ -- relay/ - docker-compose.yml ``` The codebase is meant to be run on docker containers through `docker-compose`. Each top-level folder is responsible for a particular container, so there's a `docker-compose.yml` file as well as a `Dockerfile` in each folder. -- `mailbox` runs the magic wormhole mailbox -- `relay` runs the magic wormhole transit relay -- `client` contains the code for the front-end. It uses `mailbox` and `relay` to achieve magic wormhole functionality. +- `client` contains the code for the front-end. - `client-e2e` is a project using [WebdriverIO](https://webdriver.io/) and [Selenium](https://www.selenium.dev/) to run end-to-end tests for `client`. ### Selenium docker containers @@ -43,11 +39,10 @@ The folder structure for `client` looks like this: - hooks - types - util - - wormhole - public - - worker - vendor - - wormhole-william + - magic-wormhole.rs +- wasm ``` ### `src` @@ -56,7 +51,11 @@ The folder structure for `client` looks like this: ### `vendor` -- `vendor` as of now only contains a submodule to `wormhole-william`. This is included to compile the wasm module (`wormhole.wasm`). The compilation is handled by Gulp. +- `vendor` as of now only contains a submodule to `magic-wormhole.rs`. This is included to compile the wasm module. + +### `wasm` + +- `wasm` contains the bindings that allow us to use `magic-wormhole.rs` in the browser via webassembly. ### `src/app` @@ -66,11 +65,6 @@ The react app code is located here. - `src/app/hooks` for React hooks. - `src/app/types` for type-only `.ts` files and `d.ts` files - `src/app/util` contain files that typically export a single pure function or several constant values. They are usually shared across multiple files -- `src/app/wormhole` contains bridge code to interact with the webworker code located at `src/worker` (see [src/worker](#srcworker)) - -### `src/worker` - -- `src/worker` contains code that compiles the webworker. The webworker is responsible for communication with the wasm module compiled from `vendor/wormhole-william/wasm` (see [vendor](#vendor)) ### `src/public` @@ -81,14 +75,12 @@ The react app code is located here. `gulp` builds the following parts of the application and outputs them to `client/dist`, which can be viewed in the browser. - the react app (`src/app`) -- the webworker (`src/worker`) -- the wasm module (`vendor/wormhole-william/wasm`) +- the wasm module (`wasm` and `src/vendor/magic-wormhole.rs`) - the static assets (`src/public`) ### Gulp task overview -- `gulp javascript` builds the react app to `dist/app`. The code is bundled by Webpack. -- `gulp worker` builds the webworker to `dist/worker`. The code is bundled by Webpack. +- `gulp javascript` builds the react app to `dist/app`. This includes the wasm module. The code is bundled by Webpack. - `gulp public` copies the files in `src/public` to `dist`. - `gulp` (the default task) will compile all parts at once. - `gulp watch` will run a development server at `localhost:8080` that serves the `dist/` folder, as well as recompile on any file changes. [gulp-connect](https://github.com/avevlad/gulp-connect) is used so that the browser will automatically refresh the page on file change. This is the default command when starting the `client` container. diff --git a/README.md b/README.md index b4e60e32..9f6f8875 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,9 @@ docker compose logs -f ``` #### Email from Feedback API + We use a dummy SMTP server to log emails sent from `feedback-api`. To view the emails, run the following command: + ```sh docker compose logs -f dummy-smtp-server ``` @@ -121,7 +123,7 @@ docker compose run client npm run test docker compose run client npm run test -- --watch # or run individual tests -docker compose run client npm run test -- -i client/src/worker/tests/streaming.test.ts +docker compose run client npm run test -- client/src/app/components/CodeInput.test.tsx ``` Run the end-to-end tests with the following @@ -134,9 +136,10 @@ docker-compose run --rm client-e2e docker-compose --profile e2e down ``` -*Note*: Run on ARM64 system, use different compose file: +_Note_: Run on ARM64 system, use different compose file: + ```sh -docker compose -f docker-compose-arm64.yml run --rm client-e2e +docker compose -f docker-compose-arm64.yml run --rm client-e2e ``` ### Debugging end-to-end tests From d247e83256321356ed38c5c81f43ce2da41e267d Mon Sep 17 00:00:00 2001 From: Justus Tumacder Date: Wed, 1 Mar 2023 14:12:06 +0800 Subject: [PATCH 05/12] Update FaqPage to refer to magic-wormhole.rs --- .../app/components/pages/static/FaqPage.tsx | 25 ++++++------------- 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/client/src/app/components/pages/static/FaqPage.tsx b/client/src/app/components/pages/static/FaqPage.tsx index 7f3b1656..d9b6caaf 100644 --- a/client/src/app/components/pages/static/FaqPage.tsx +++ b/client/src/app/components/pages/static/FaqPage.tsx @@ -330,9 +330,8 @@ export default function FaqPage({}: Props) { same code that you receive in your browser, as it could be manipulated by others on the way. That’s not us, this is any website or web-based application that you use. If you prefer code that you can - verify and only need to - trust on first use, you can rely on secure and open source - downloadable applications, such as{" "} + verify and only need to trust on first use, you can rely on + secure and open source downloadable applications, such as{" "}
  • Transit relay URL: tcp://relay.mw.leastauthority.com:4001{" "} - and - wss://relay.mw.leastauthority.com + and wss://relay.mw.leastauthority.com
  • AppID: lothar.com/wormhole/text-or-file-xfer @@ -434,21 +432,12 @@ export default function FaqPage({}: Props) {
  • - Wormhole-william + magic-wormhole.rs {" "} - (Go implementation, forked from - - original code - - - )
  • @@ -463,7 +452,7 @@ export default function FaqPage({}: Props) { protocol - , + ,{" "} - and + , and{" "} Date: Tue, 14 Mar 2023 11:35:49 +0800 Subject: [PATCH 06/12] Add receiver connection status indicator (#150) --- .../screens/send/SendInstructionsScreen.tsx | 27 ++++++++++++++++++- client/src/app/sagas.ts | 17 +++++++----- client/src/app/wormholeSlice.ts | 16 +++++++++++ client/wasm/src/lib.rs | 7 +++++ 4 files changed, 60 insertions(+), 7 deletions(-) diff --git a/client/src/app/components/screens/send/SendInstructionsScreen.tsx b/client/src/app/components/screens/send/SendInstructionsScreen.tsx index 35a738ed..63700545 100644 --- a/client/src/app/components/screens/send/SendInstructionsScreen.tsx +++ b/client/src/app/components/screens/send/SendInstructionsScreen.tsx @@ -1,4 +1,11 @@ -import { Button, createStyles, Group, Stack, Text } from "@mantine/core"; +import { + Button, + createStyles, + Group, + Loader, + Stack, + Text, +} from "@mantine/core"; import { useClipboard, useViewportSize } from "@mantine/hooks"; import React from "react"; import { Files, X } from "tabler-icons-react"; @@ -6,6 +13,7 @@ import { useAppDispatch, useAppSelector } from "../../../hooks/redux"; import { useCommonStyles } from "../../../hooks/useCommonStyles"; import { requestCancelTransfer, + selectIsPeerConnected, selectWormholeCode, } from "../../../wormholeSlice"; import Content from "../../Content"; @@ -13,6 +21,7 @@ import FileLabel from "../../FileLabel"; type ContentProps = { code: string; + isPeerConnected: boolean; copied: boolean; onCopy: () => void; onCancel: () => void; @@ -90,6 +99,20 @@ export function SendInstructionsScreenContent(props: ContentProps) { {props.copied ? "Link copied!" : "Copy link"} + + + + {props.isPeerConnected + ? "Receiver connected. Waiting for receiver to start transfer..." + : "Waiting for receiver to connect..."} + +