test: run tests with web standard WebSocket and EventSource (#67)

This commit is contained in:
Pooya Parsa
2024-08-08 12:52:01 +02:00
committed by GitHub
parent 8bd94c5e09
commit b705e96889
6 changed files with 242 additions and 197 deletions

View File

@@ -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"

308
pnpm-lock.yaml generated
View File

@@ -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

View File

@@ -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<string, string> = Object.create(null);
const send = async (data: any): Promise<any> => {
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<typeof res>;
}
class WebSocketInspector extends Agent {
status?: number;
statusText?: string;
headers?: Record<string, string>;
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<typeof wsTests>[1],

View File

@@ -37,9 +37,9 @@ describe("node", () => {
await waitForPort(port);
});
afterAll(async () => {
afterAll(() => {
ws.closeAll();
await new Promise<void>((resolve) => server.close(() => resolve()));
server.close();
});
wsTests(() => url, {

View File

@@ -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);

View File

@@ -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",
},
});
});