From b705e968897239b3ad9ed83eef4103959664b7ee Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Thu, 8 Aug 2024 12:52:01 +0200 Subject: [PATCH] test: run tests with web standard `WebSocket` and `EventSource` (#67) --- package.json | 7 +- pnpm-lock.yaml | 308 ++++++++++++++++++++----------------- test/_utils.ts | 91 ++++++----- test/adapters/node.test.ts | 4 +- test/adapters/sse.test.ts | 3 +- test/tests.ts | 26 ++-- 6 files changed, 242 insertions(+), 197 deletions(-) diff --git a/package.json b/package.json index a7c32a4..cd9826c 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "uncrypto": "^0.1.3" }, "devDependencies": { - "@cloudflare/workers-types": "^4.20240729.0", + "@cloudflare/workers-types": "^4.20240806.0", "@deno/types": "^0.0.1", "@types/bun": "^1.1.6", "@types/eventsource": "^1.1.15", @@ -105,9 +105,10 @@ "prettier": "^3.3.3", "typescript": "^5.5.4", "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.44.0", - "unbuild": "^3.0.0-rc.7", + "unbuild": "3.0.0-rc.7", + "undici": "^6.19.5", "vitest": "^2.0.5", - "wrangler": "^3.68.0", + "wrangler": "^3.69.1", "ws": "^8.18.0" }, "packageManager": "pnpm@9.6.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 345105d..bfaa417 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,8 +16,8 @@ importers: version: 0.1.3 devDependencies: '@cloudflare/workers-types': - specifier: ^4.20240729.0 - version: 4.20240729.0 + specifier: ^4.20240806.0 + version: 4.20240806.0 '@deno/types': specifier: ^0.0.1 version: 0.0.1 @@ -82,14 +82,17 @@ importers: specifier: github:uNetworking/uWebSockets.js#v20.44.0 version: https://codeload.github.com/uNetworking/uWebSockets.js/tar.gz/8fa05571bf6ea95be8966ad313d9d39453e381ae unbuild: - specifier: ^3.0.0-rc.7 + specifier: 3.0.0-rc.7 version: 3.0.0-rc.7(typescript@5.5.4) + undici: + specifier: ^6.19.5 + version: 6.19.5 vitest: specifier: ^2.0.5 version: 2.0.5(@types/node@22.1.0) wrangler: - specifier: ^3.68.0 - version: 3.68.0(@cloudflare/workers-types@4.20240729.0) + specifier: ^3.69.1 + version: 3.69.1(@cloudflare/workers-types@4.20240806.0) ws: specifier: ^8.18.0 version: 8.18.0 @@ -228,8 +231,11 @@ packages: cpu: [x64] os: [win32] - '@cloudflare/workers-types@4.20240729.0': - resolution: {integrity: sha512-wfe44YQkv5T9aBr/z95P706r2/Ydg32weJYyBOhvge7FqtdY6mM7l39rybNiJrbJoyN16dd0xxyQMf23aJNC6Q==} + '@cloudflare/workers-shared@0.1.0': + resolution: {integrity: sha512-SyD4iw6jM4anZaG+ujgVETV4fulF2KHBOW31eavbVN7TNpk2l4aJgwY1YSPK00IKSWsoQuH2TigR446KuT5lqQ==} + + '@cloudflare/workers-types@4.20240806.0': + resolution: {integrity: sha512-8lvgrwXGTZEBsUQJ8YUnMk72Anh9omwr6fqWLw/EwVgcw1nQxs/bfdadBEbdP48l9fWXjE4E5XERLUrrFuEpsg==} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} @@ -1233,8 +1239,8 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-lite@1.0.30001649: - resolution: {integrity: sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==} + caniuse-lite@1.0.30001651: + resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} capnp-ts@0.7.0: resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} @@ -1472,8 +1478,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.4: - resolution: {integrity: sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==} + electron-to-chromium@1.5.5: + resolution: {integrity: sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1650,8 +1656,8 @@ packages: flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - foreground-child@3.2.1: - resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} fraction.js@4.3.7: @@ -2300,8 +2306,8 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - postcss-calc@10.0.0: - resolution: {integrity: sha512-OmjhudoNTP0QleZCwl1i6NeBwN+5MZbY5ersLZz69mjJiDVv/p57RjRuKDkHeDWr4T+S97wQfsqRTNoDHB2e3g==} + postcss-calc@10.0.1: + resolution: {integrity: sha512-pp1Z3FxtxA+xHAoWXcOXgnBN1WPu4ZiJ5LWGjKyf9MMreagAsaTUtnqFK1y1sHhyJddAkYTPu6XSuLgb3oYCjw==} engines: {node: ^18.12 || ^20.9 || >=22.0} peerDependencies: postcss: ^8.4.38 @@ -2475,8 +2481,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.40: - resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==} + postcss@8.4.41: + resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -2833,6 +2839,10 @@ packages: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} + undici@6.19.5: + resolution: {integrity: sha512-LryC15SWzqQsREHIOUybavaIHF5IoL0dJ9aWWxL/PgT1KfqAW5225FZpDUFlt9xiDMS2/S7DOKhFWA7RLksWdg==} + engines: {node: '>=18.17'} + unenv-nightly@1.10.0-1717606461.a117952: resolution: {integrity: sha512-u3TfBX02WzbHTpaEfWEKwDijDSFAHcgXkayUZ+MVDrjhLFvgAJzFGTSTmwlEhwWi2exyRQey23ah9wELMM6etg==} @@ -2881,8 +2891,8 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite@5.3.5: - resolution: {integrity: sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==} + vite@5.4.0: + resolution: {integrity: sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -2890,6 +2900,7 @@ packages: less: '*' lightningcss: ^1.21.0 sass: '*' + sass-embedded: '*' stylus: '*' sugarss: '*' terser: ^5.4.0 @@ -2902,6 +2913,8 @@ packages: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: @@ -2953,8 +2966,8 @@ packages: engines: {node: '>=16'} hasBin: true - wrangler@3.68.0: - resolution: {integrity: sha512-gsIeglkh5nOn1mHJs0bf1pOq/DvIt+umjO/5a867IYYXaN4j/ar5cRR1+F5ue3S7uEjYCLIZZjs8ESiPTSEt+Q==} + wrangler@3.69.1: + resolution: {integrity: sha512-lqgPsaxIP564OJE6f7RIS/iLy+WaY0EN89p2g83nkrPN6PjuC6vB3eC7jgeVZO1ntWjD0X+mEU5ggbERHr899w==} engines: {node: '>=16.17.0'} hasBin: true peerDependencies: @@ -3157,7 +3170,9 @@ snapshots: '@cloudflare/workerd-windows-64@1.20240725.0': optional: true - '@cloudflare/workers-types@4.20240729.0': {} + '@cloudflare/workers-shared@0.1.0': {} + + '@cloudflare/workers-types@4.20240806.0': {} '@cspotcode/source-map-support@0.8.1': dependencies: @@ -3872,14 +3887,14 @@ snapshots: - magicast - supports-color - autoprefixer@10.4.20(postcss@8.4.40): + autoprefixer@10.4.20(postcss@8.4.41): dependencies: browserslist: 4.23.3 - caniuse-lite: 1.0.30001649 + caniuse-lite: 1.0.30001651 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.1 - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 balanced-match@1.0.2: {} @@ -3911,8 +3926,8 @@ snapshots: browserslist@4.23.3: dependencies: - caniuse-lite: 1.0.30001649 - electron-to-chromium: 1.5.4 + caniuse-lite: 1.0.30001651 + electron-to-chromium: 1.5.5 node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.3) @@ -3968,11 +3983,11 @@ snapshots: caniuse-api@3.0.0: dependencies: browserslist: 4.23.3 - caniuse-lite: 1.0.30001649 + caniuse-lite: 1.0.30001651 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-lite@1.0.30001649: {} + caniuse-lite@1.0.30001651: {} capnp-ts@0.7.0: dependencies: @@ -4102,9 +4117,9 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - css-declaration-sorter@7.2.0(postcss@8.4.40): + css-declaration-sorter@7.2.0(postcss@8.4.41): dependencies: - postcss: 8.4.40 + postcss: 8.4.41 css-select@5.1.0: dependencies: @@ -4128,49 +4143,49 @@ snapshots: cssesc@3.0.0: {} - cssnano-preset-default@7.0.4(postcss@8.4.40): + cssnano-preset-default@7.0.4(postcss@8.4.41): dependencies: browserslist: 4.23.3 - css-declaration-sorter: 7.2.0(postcss@8.4.40) - cssnano-utils: 5.0.0(postcss@8.4.40) - postcss: 8.4.40 - postcss-calc: 10.0.0(postcss@8.4.40) - postcss-colormin: 7.0.1(postcss@8.4.40) - postcss-convert-values: 7.0.2(postcss@8.4.40) - postcss-discard-comments: 7.0.1(postcss@8.4.40) - postcss-discard-duplicates: 7.0.0(postcss@8.4.40) - postcss-discard-empty: 7.0.0(postcss@8.4.40) - postcss-discard-overridden: 7.0.0(postcss@8.4.40) - postcss-merge-longhand: 7.0.2(postcss@8.4.40) - postcss-merge-rules: 7.0.2(postcss@8.4.40) - postcss-minify-font-values: 7.0.0(postcss@8.4.40) - postcss-minify-gradients: 7.0.0(postcss@8.4.40) - postcss-minify-params: 7.0.1(postcss@8.4.40) - postcss-minify-selectors: 7.0.2(postcss@8.4.40) - postcss-normalize-charset: 7.0.0(postcss@8.4.40) - postcss-normalize-display-values: 7.0.0(postcss@8.4.40) - postcss-normalize-positions: 7.0.0(postcss@8.4.40) - postcss-normalize-repeat-style: 7.0.0(postcss@8.4.40) - postcss-normalize-string: 7.0.0(postcss@8.4.40) - postcss-normalize-timing-functions: 7.0.0(postcss@8.4.40) - postcss-normalize-unicode: 7.0.1(postcss@8.4.40) - postcss-normalize-url: 7.0.0(postcss@8.4.40) - postcss-normalize-whitespace: 7.0.0(postcss@8.4.40) - postcss-ordered-values: 7.0.1(postcss@8.4.40) - postcss-reduce-initial: 7.0.1(postcss@8.4.40) - postcss-reduce-transforms: 7.0.0(postcss@8.4.40) - postcss-svgo: 7.0.1(postcss@8.4.40) - postcss-unique-selectors: 7.0.1(postcss@8.4.40) + css-declaration-sorter: 7.2.0(postcss@8.4.41) + cssnano-utils: 5.0.0(postcss@8.4.41) + postcss: 8.4.41 + postcss-calc: 10.0.1(postcss@8.4.41) + postcss-colormin: 7.0.1(postcss@8.4.41) + postcss-convert-values: 7.0.2(postcss@8.4.41) + postcss-discard-comments: 7.0.1(postcss@8.4.41) + postcss-discard-duplicates: 7.0.0(postcss@8.4.41) + postcss-discard-empty: 7.0.0(postcss@8.4.41) + postcss-discard-overridden: 7.0.0(postcss@8.4.41) + postcss-merge-longhand: 7.0.2(postcss@8.4.41) + postcss-merge-rules: 7.0.2(postcss@8.4.41) + postcss-minify-font-values: 7.0.0(postcss@8.4.41) + postcss-minify-gradients: 7.0.0(postcss@8.4.41) + postcss-minify-params: 7.0.1(postcss@8.4.41) + postcss-minify-selectors: 7.0.2(postcss@8.4.41) + postcss-normalize-charset: 7.0.0(postcss@8.4.41) + postcss-normalize-display-values: 7.0.0(postcss@8.4.41) + postcss-normalize-positions: 7.0.0(postcss@8.4.41) + postcss-normalize-repeat-style: 7.0.0(postcss@8.4.41) + postcss-normalize-string: 7.0.0(postcss@8.4.41) + postcss-normalize-timing-functions: 7.0.0(postcss@8.4.41) + postcss-normalize-unicode: 7.0.1(postcss@8.4.41) + postcss-normalize-url: 7.0.0(postcss@8.4.41) + postcss-normalize-whitespace: 7.0.0(postcss@8.4.41) + postcss-ordered-values: 7.0.1(postcss@8.4.41) + postcss-reduce-initial: 7.0.1(postcss@8.4.41) + postcss-reduce-transforms: 7.0.0(postcss@8.4.41) + postcss-svgo: 7.0.1(postcss@8.4.41) + postcss-unique-selectors: 7.0.1(postcss@8.4.41) - cssnano-utils@5.0.0(postcss@8.4.40): + cssnano-utils@5.0.0(postcss@8.4.41): dependencies: - postcss: 8.4.40 + postcss: 8.4.41 - cssnano@7.0.4(postcss@8.4.40): + cssnano@7.0.4(postcss@8.4.41): dependencies: - cssnano-preset-default: 7.0.4(postcss@8.4.40) + cssnano-preset-default: 7.0.4(postcss@8.4.41) lilconfig: 3.1.2 - postcss: 8.4.40 + postcss: 8.4.41 csso@5.0.5: dependencies: @@ -4242,7 +4257,7 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.4: {} + electron-to-chromium@1.5.5: {} emoji-regex@8.0.0: {} @@ -4557,7 +4572,7 @@ snapshots: flatted@3.3.1: {} - foreground-child@3.2.1: + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 @@ -4616,7 +4631,7 @@ snapshots: glob@10.4.5: dependencies: - foreground-child: 3.2.1 + foreground-child: 3.3.0 jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 @@ -4995,9 +5010,9 @@ snapshots: mkdist@1.5.4(typescript@5.5.4): dependencies: - autoprefixer: 10.4.20(postcss@8.4.40) + autoprefixer: 10.4.20(postcss@8.4.41) citty: 0.1.6 - cssnano: 7.0.4(postcss@8.4.40) + cssnano: 7.0.4(postcss@8.4.41) defu: 6.1.4 esbuild: 0.23.0 fast-glob: 3.3.2 @@ -5005,8 +5020,8 @@ snapshots: mlly: 1.7.1 pathe: 1.1.2 pkg-types: 1.1.3 - postcss: 8.4.40 - postcss-nested: 6.2.0(postcss@8.4.40) + postcss: 8.4.41 + postcss-nested: 6.2.0(postcss@8.4.41) semver: 7.6.3 optionalDependencies: typescript: 5.5.4 @@ -5179,147 +5194,147 @@ snapshots: pluralize@8.0.0: {} - postcss-calc@10.0.0(postcss@8.4.40): + postcss-calc@10.0.1(postcss@8.4.41): dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-selector-parser: 6.1.1 postcss-value-parser: 4.2.0 - postcss-colormin@7.0.1(postcss@8.4.40): + postcss-colormin@7.0.1(postcss@8.4.41): dependencies: browserslist: 4.23.3 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 - postcss-convert-values@7.0.2(postcss@8.4.40): + postcss-convert-values@7.0.2(postcss@8.4.41): dependencies: browserslist: 4.23.3 - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 - postcss-discard-comments@7.0.1(postcss@8.4.40): + postcss-discard-comments@7.0.1(postcss@8.4.41): dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-selector-parser: 6.1.1 - postcss-discard-duplicates@7.0.0(postcss@8.4.40): + postcss-discard-duplicates@7.0.0(postcss@8.4.41): dependencies: - postcss: 8.4.40 + postcss: 8.4.41 - postcss-discard-empty@7.0.0(postcss@8.4.40): + postcss-discard-empty@7.0.0(postcss@8.4.41): dependencies: - postcss: 8.4.40 + postcss: 8.4.41 - postcss-discard-overridden@7.0.0(postcss@8.4.40): + postcss-discard-overridden@7.0.0(postcss@8.4.41): dependencies: - postcss: 8.4.40 + postcss: 8.4.41 - postcss-merge-longhand@7.0.2(postcss@8.4.40): + postcss-merge-longhand@7.0.2(postcss@8.4.41): dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 - stylehacks: 7.0.2(postcss@8.4.40) + stylehacks: 7.0.2(postcss@8.4.41) - postcss-merge-rules@7.0.2(postcss@8.4.40): + postcss-merge-rules@7.0.2(postcss@8.4.41): dependencies: browserslist: 4.23.3 caniuse-api: 3.0.0 - cssnano-utils: 5.0.0(postcss@8.4.40) - postcss: 8.4.40 + cssnano-utils: 5.0.0(postcss@8.4.41) + postcss: 8.4.41 postcss-selector-parser: 6.1.1 - postcss-minify-font-values@7.0.0(postcss@8.4.40): + postcss-minify-font-values@7.0.0(postcss@8.4.41): dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 - postcss-minify-gradients@7.0.0(postcss@8.4.40): + postcss-minify-gradients@7.0.0(postcss@8.4.41): dependencies: colord: 2.9.3 - cssnano-utils: 5.0.0(postcss@8.4.40) - postcss: 8.4.40 + cssnano-utils: 5.0.0(postcss@8.4.41) + postcss: 8.4.41 postcss-value-parser: 4.2.0 - postcss-minify-params@7.0.1(postcss@8.4.40): + postcss-minify-params@7.0.1(postcss@8.4.41): dependencies: browserslist: 4.23.3 - cssnano-utils: 5.0.0(postcss@8.4.40) - postcss: 8.4.40 + cssnano-utils: 5.0.0(postcss@8.4.41) + postcss: 8.4.41 postcss-value-parser: 4.2.0 - postcss-minify-selectors@7.0.2(postcss@8.4.40): + postcss-minify-selectors@7.0.2(postcss@8.4.41): dependencies: cssesc: 3.0.0 - postcss: 8.4.40 + postcss: 8.4.41 postcss-selector-parser: 6.1.1 - postcss-nested@6.2.0(postcss@8.4.40): + postcss-nested@6.2.0(postcss@8.4.41): dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-selector-parser: 6.1.1 - postcss-normalize-charset@7.0.0(postcss@8.4.40): + postcss-normalize-charset@7.0.0(postcss@8.4.41): dependencies: - postcss: 8.4.40 + postcss: 8.4.41 - postcss-normalize-display-values@7.0.0(postcss@8.4.40): + postcss-normalize-display-values@7.0.0(postcss@8.4.41): dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 - postcss-normalize-positions@7.0.0(postcss@8.4.40): + postcss-normalize-positions@7.0.0(postcss@8.4.41): dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 - postcss-normalize-repeat-style@7.0.0(postcss@8.4.40): + postcss-normalize-repeat-style@7.0.0(postcss@8.4.41): dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 - postcss-normalize-string@7.0.0(postcss@8.4.40): + postcss-normalize-string@7.0.0(postcss@8.4.41): dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 - postcss-normalize-timing-functions@7.0.0(postcss@8.4.40): + postcss-normalize-timing-functions@7.0.0(postcss@8.4.41): dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 - postcss-normalize-unicode@7.0.1(postcss@8.4.40): + postcss-normalize-unicode@7.0.1(postcss@8.4.41): dependencies: browserslist: 4.23.3 - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 - postcss-normalize-url@7.0.0(postcss@8.4.40): + postcss-normalize-url@7.0.0(postcss@8.4.41): dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 - postcss-normalize-whitespace@7.0.0(postcss@8.4.40): + postcss-normalize-whitespace@7.0.0(postcss@8.4.41): dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 - postcss-ordered-values@7.0.1(postcss@8.4.40): + postcss-ordered-values@7.0.1(postcss@8.4.41): dependencies: - cssnano-utils: 5.0.0(postcss@8.4.40) - postcss: 8.4.40 + cssnano-utils: 5.0.0(postcss@8.4.41) + postcss: 8.4.41 postcss-value-parser: 4.2.0 - postcss-reduce-initial@7.0.1(postcss@8.4.40): + postcss-reduce-initial@7.0.1(postcss@8.4.41): dependencies: browserslist: 4.23.3 caniuse-api: 3.0.0 - postcss: 8.4.40 + postcss: 8.4.41 - postcss-reduce-transforms@7.0.0(postcss@8.4.40): + postcss-reduce-transforms@7.0.0(postcss@8.4.41): dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 postcss-selector-parser@6.1.1: @@ -5327,20 +5342,20 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-svgo@7.0.1(postcss@8.4.40): + postcss-svgo@7.0.1(postcss@8.4.41): dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 svgo: 3.3.2 - postcss-unique-selectors@7.0.1(postcss@8.4.40): + postcss-unique-selectors@7.0.1(postcss@8.4.41): dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-selector-parser: 6.1.1 postcss-value-parser@4.2.0: {} - postcss@8.4.40: + postcss@8.4.41: dependencies: nanoid: 3.3.7 picocolors: 1.0.1 @@ -5552,10 +5567,10 @@ snapshots: strip-json-comments@3.1.1: {} - stylehacks@7.0.2(postcss@8.4.40): + stylehacks@7.0.2(postcss@8.4.41): dependencies: browserslist: 4.23.3 - postcss: 8.4.40 + postcss: 8.4.41 postcss-selector-parser: 6.1.1 supports-color@5.5.0: @@ -5687,6 +5702,8 @@ snapshots: dependencies: '@fastify/busboy': 2.1.1 + undici@6.19.5: {} + unenv-nightly@1.10.0-1717606461.a117952: dependencies: consola: 3.2.3 @@ -5755,21 +5772,22 @@ snapshots: debug: 4.3.6 pathe: 1.1.2 tinyrainbow: 1.2.0 - vite: 5.3.5(@types/node@22.1.0) + vite: 5.4.0(@types/node@22.1.0) transitivePeerDependencies: - '@types/node' - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser - vite@5.3.5(@types/node@22.1.0): + vite@5.4.0(@types/node@22.1.0): dependencies: esbuild: 0.21.5 - postcss: 8.4.40 + postcss: 8.4.41 rollup: 4.20.0 optionalDependencies: '@types/node': 22.1.0 @@ -5793,7 +5811,7 @@ snapshots: tinybench: 2.9.0 tinypool: 1.0.0 tinyrainbow: 1.2.0 - vite: 5.3.5(@types/node@22.1.0) + vite: 5.4.0(@types/node@22.1.0) vite-node: 2.0.5(@types/node@22.1.0) why-is-node-running: 2.3.0 optionalDependencies: @@ -5802,6 +5820,7 @@ snapshots: - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color @@ -5826,9 +5845,10 @@ snapshots: '@cloudflare/workerd-linux-arm64': 1.20240725.0 '@cloudflare/workerd-windows-64': 1.20240725.0 - wrangler@3.68.0(@cloudflare/workers-types@4.20240729.0): + wrangler@3.69.1(@cloudflare/workers-types@4.20240806.0): dependencies: '@cloudflare/kv-asset-handler': 0.3.4 + '@cloudflare/workers-shared': 0.1.0 '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) '@esbuild-plugins/node-modules-polyfill': 0.2.2(esbuild@0.17.19) blake3-wasm: 2.1.5 @@ -5846,7 +5866,7 @@ snapshots: workerd: 1.20240725.0 xxhash-wasm: 1.0.2 optionalDependencies: - '@cloudflare/workers-types': 4.20240729.0 + '@cloudflare/workers-types': 4.20240806.0 fsevents: 2.3.3 transitivePeerDependencies: - bufferutil diff --git a/test/_utils.ts b/test/_utils.ts index e534bfc..9fe80ed 100644 --- a/test/_utils.ts +++ b/test/_utils.ts @@ -1,9 +1,8 @@ -import type { OutgoingHttpHeaders } from "node:http"; +import { Agent, WebSocket } from "undici"; import { afterAll, beforeAll, afterEach } from "vitest"; import { execa, ResultPromise as ExecaRes } from "execa"; import { fileURLToPath } from "node:url"; import { getRandomPort, waitForPort } from "get-port-please"; -import { WebSocket } from "ws"; import { wsTests } from "./tests"; const fixtureDir = fileURLToPath(new URL("fixture", import.meta.url)); @@ -18,13 +17,15 @@ afterEach(() => { export function wsConnect( url: string, - opts?: { skip?: number; headers?: OutgoingHttpHeaders }, + opts?: { skip?: number; headers?: HeadersInit }, ) { - const ws = new WebSocket(url, { headers: opts?.headers }); + const inspector = new WebSocketInspector(); + const ws = new WebSocket(url, { + headers: opts?.headers, + dispatcher: inspector, + }); websockets.add(ws); - const upgradeHeaders: Record = Object.create(null); - const send = async (data: any): Promise => { ws.send( typeof data === "string" ? data : JSON.stringify({ message: data }), @@ -48,13 +49,11 @@ export function wsConnect( nextIndex += count; }; - ws.once("upgrade", (req) => { - Object.assign(upgradeHeaders, req.headers); - }); - - ws.on("message", (data: any) => { + ws.addEventListener("message", (event) => { const str = - typeof data === "string" ? data : new TextDecoder().decode(data); + typeof event.data === "string" + ? event.data + : new TextDecoder().decode(event.data); const payload = str[0] === "{" ? JSON.parse(str) : str; messages.push(payload); const index = messages.length - 1; @@ -70,39 +69,59 @@ export function wsConnect( next, skip, messages, - upgradeHeaders, + inspector, + error: undefined as Error | undefined, }; const connectPromise = new Promise((resolve, reject) => { - ws.once("open", () => resolve(res)); - ws.once("error", reject); - ws.once("unexpected-response", (_req, res) => { - const bodyChunks: any[] = []; - res.on("data", (chunk) => { - bodyChunks.push(chunk); - }); - res.once("end", () => { - const body = Buffer.concat(bodyChunks).toString(); - reject( - new Error( - `Unexpected response: ${res.statusCode} ${res.statusMessage} (body:${body})`, - { - cause: { - status: res.statusCode!, - statusText: res.statusMessage!, - headers: res.headers, - body, - }, - }, - ), - ); - }); + ws.addEventListener("open", () => resolve(res)); + ws.addEventListener("error", (error) => { + res.error = error; + resolve(res); }); }); return Object.assign(connectPromise, res) as Promise; } +class WebSocketInspector extends Agent { + status?: number; + statusText?: string; + headers?: Record; + error?: Error; + + _normalizeHeaders(rawHeaders: string[] | Buffer[] | null) { + const headerEntries: [string, string][] = []; + for (let i = 0; i < rawHeaders!.length; i += 2) { + headerEntries.push([ + decodeURIComponent(rawHeaders![i].toString()).toLowerCase(), + decodeURIComponent(rawHeaders![i + 1].toString()), + ]); + } + return Object.fromEntries(headerEntries); + } + + dispatch(opts: any, handler: any) { + return super.dispatch(opts, { + ...handler, + onHeaders: (statusCode, headers, resume, statusText) => { + this.status = statusCode; + this.statusText = statusText; + this.headers = this._normalizeHeaders(headers); + return handler.onHeaders(statusCode, headers, resume, statusText); + }, + onError: (error) => { + this.error = error; + return handler.onError(error); + }, + onUpgrade: (statusCode, rawHeaders = [], socket) => { + this.headers = this._normalizeHeaders(rawHeaders); + return handler.onUpgrade(statusCode, rawHeaders, socket); + }, + }); + } +} + export function wsTestsExec( cmd: string, opts: Parameters[1], diff --git a/test/adapters/node.test.ts b/test/adapters/node.test.ts index bd5b4b5..0114c88 100644 --- a/test/adapters/node.test.ts +++ b/test/adapters/node.test.ts @@ -37,9 +37,9 @@ describe("node", () => { await waitForPort(port); }); - afterAll(async () => { + afterAll(() => { ws.closeAll(); - await new Promise((resolve) => server.close(() => resolve())); + server.close(); }); wsTests(() => url, { diff --git a/test/adapters/sse.test.ts b/test/adapters/sse.test.ts index 4a649cf..2c63b33 100644 --- a/test/adapters/sse.test.ts +++ b/test/adapters/sse.test.ts @@ -1,6 +1,6 @@ import { describe, test, expect } from "vitest"; import { wsTestsExec } from "../_utils"; -import EventSource from "eventsource"; +import { EventSource } from "undici"; describe("sse", () => { wsTestsExec( @@ -15,6 +15,7 @@ describe("sse", () => { messages.push(event.data); }); await new Promise((resolve) => ev.addEventListener("open", resolve)); + await new Promise((resolve) => ev.addEventListener("message", resolve)); ev.close(); expect(messages[0]).toMatch(/Welcome to the server \w+/); expect(messages.length).toBe(1); diff --git a/test/tests.ts b/test/tests.ts index 6a03abb..be3497f 100644 --- a/test/tests.ts +++ b/test/tests.ts @@ -51,10 +51,12 @@ export function wsTests( "upgrade response headers", async () => { const ws = await wsConnect(getURL()); - expect(ws.upgradeHeaders["x-powered-by"]).toBe("cross-ws"); - expect(ws.upgradeHeaders["set-cookie"]).toMatchObject([ - "cross-ws=1; SameSite=None; Secure", - ]); + expect(ws.inspector.headers).toMatchObject({ + connection: expect.stringMatching(/^upgrade$/i), + "sec-websocket-accept": expect.any(String), + "set-cookie": "cross-ws=1; SameSite=None; Secure", + "x-powered-by": "cross-ws", + }); }, ); @@ -65,7 +67,7 @@ export function wsTests( }); await ws.send("debug"); const { headers } = await ws.next(); - expect(headers["connection"]).toBe("Upgrade"); + expect(headers["connection"]).toMatch(/^upgrade$/i); expect(headers["x-test"]).toBe("1"); }); @@ -79,12 +81,14 @@ export function wsTests( }); test("upgrade fail response", async () => { - await expect(wsConnect(getURL() + "?unauthorized")).rejects.toMatchObject({ - cause: { - status: 401, - statusText: "Unauthorized", - body: "unauthorized", - headers: { "x-error": "unauthorized" }, + const ws = await wsConnect(getURL() + "?unauthorized"); + expect(ws.error).toBeDefined(); + expect(ws.inspector).toMatchObject({ + status: 401, + statusText: "Unauthorized", + headers: { + "content-type": expect.stringMatching(/^text\/plain/), + "x-error": "unauthorized", }, }); });