diff --git a/.browserslistrc b/.browserslistrc index 25b45f3..2ba40f5 100644 --- a/.browserslistrc +++ b/.browserslistrc @@ -17,7 +17,7 @@ # Generated data. # -# Last generated Feb 27, 2024 1:41 PM UTC. +# Last generated Feb 27, 2024 5:27 PM UTC. [production] node >= 20.9.0 diff --git a/.dockerignore b/.dockerignore index 3809e8e..d87cd84 100644 --- a/.dockerignore +++ b/.dockerignore @@ -17,7 +17,7 @@ # Generated data. # -# Last generated Feb 27, 2024 1:41 PM UTC. +# Last generated Feb 27, 2024 5:27 PM UTC. # Locals diff --git a/.env.vault b/.env.vault index e7ccaa0..fe58e84 100644 --- a/.env.vault +++ b/.env.vault @@ -8,12 +8,12 @@ DOTENV_VAULT_MAIN="3rfi+ClkONvfHPiU9FTBcC1+Um/L8QeM9dRw1jFzEqzZXw==" DOTENV_VAULT_MAIN_VERSION=1 # dev -DOTENV_VAULT_DEV="s1IviSwIEdo6sP0RL1yV7QPJLYs5NR5dh2TL1MCs9WtX1a71kA3DfthSqXVp0PJc4tLeUKDtm1ixIgZboNBVa6RPGG1rI4q223lz73qc2pieCG993L4dDAehely9DNld+nGzJZeNxLh5ztsDbk6iwG8mYZMJHpmEQH4m74QuLMgxL4t/zv0E/sJs54giUI9FGPqf1jqYa7zkFQibmVZNcYGXn8a7+rPtLtd704eYQQVkBO4H4dOsf1v/43vWrx7isu2gERlgyGi9QnPmWkVIpYxrqN+oQU6Q/MZmBB8AMTphzjInwJadyaQ0mTPHG3kKejudNhsbqGd1ONu8t7Pv1GN5I01eiVtsRBmUmapD6CGFWwNSsyzMZBmBQnwZSN9HDMK9/VW+oH2nKWICbitEOuN1O9eLDHVXzB03qzNuODbi85AMhY9zyxpFDgs1E+T3m1ADCWJt347FGFzkPMcYRoF7IzGxfC0wLLgErSzGSdHDfoUZVzZIENNEkYyW8eV6dMHtHchbwq5waDmzY8ETLCWLGxuJeqJIBBw90B6E/XLkO3SGJW8MUOdHKz/ANoA1IfTYjT6mZU6tbOBSAgirVQ8NwzqKCcwQFtPXfmnaRAVejHvb52v2ZPFHf5Tl00ycXhGs0WhbAFi/pwx63leKPEsmH3zIZYDTZZwKTyJ9OwSnmLt9etsT9bGs2GHl0hdjaFg64EJnWCDo7v5ZgrpS4tctYWDRQfIErXlxCIwO34P644t46pIIctCbL1SoZh01A1SGb5iSzXeVK8z9LgEtXzRnF69Wlg1SqHBzWClD033QnuNQzus61Qsq0O8f+p5i2VJFT02e6xzVa/CJqAbxQqfuFfmdDWdPbiTXuF9vTofebWc0qS3g5sAeXUtg" -DOTENV_VAULT_DEV_VERSION=213 +DOTENV_VAULT_DEV="F9WqYxN07Ales1C03JLcfCAJ57F36DjZsAANM2r3KjKa/A+N184P1HbXXmOfl4rc7rqyVbmH7JswHDD/kl7Y5cOcJSxzkYhuBOwuz49t+ePG9NMSofYI1OY4A5lcngT2WkxT+JMVNfPB9154Ubopns+oDa5c5ddTb2/G0BG65WqbDhQ22WChd8GQvWCTJVModGpriDvmYEZ0Inr5RB8D3Rck8OTGj36XDF4GTK+5DS1kBvJiM1sO5BUg86z6tICg2mzaEwkd2a+Viu9o8vxLvIaG6JGW/GVERtpGCLN9JO1uTEw/Uku0B9Wh4noEMyzKQZ6hDS2mBouBReXmUBlZWiyC+NG0OkFI8W6IkC3FFuXx+0CmxG5ugNRCPSektPxFbRXoSMhEb6Hf+VOZowJNlc8X+i/GegZoxmbHEQMHdC7O5z1Wzs67QvYWphU2S9/70Yko49iHXPceg+fwSX1PEFN7fE32+ESSvMRqTvBmLuhmCPc9PCFWvbDObKU35hzQ0dGliX/Egv0i5k60Y3zFELBh+m3jyR/Gpn5wSR5dOrDy6P+fyxTpJvLMsUFSZcFIzy+sM8odcnLX2JqmhWbJyxESl+XH9SAPL2CO1DM36waSPwBEXJXnuHU/5yFfrcQqYqYLimUre7c2Ce7nFDdcA9lLPAcNH0c5ari8peoyy2AlP72roqNGUDaJc9iJ979j1ngAygMO7Mjl/Xjb7wVloWJJdMTv6ET/GkNdlpDbUUctKiazPsqDK+k3fHtleRuHjIV/wxi0UpSdnpjDmXHxg58gN/jua9DlRGWwaW3MzNgW+fbTrzCQEb1u5DfX5ZfAG39S7xAHlSkpZsnQ/1t2Yuf2auoDrRFSaGQr4jTjjpv9qbWBx8eXLPUKdFMS" +DOTENV_VAULT_DEV_VERSION=215 # ci -DOTENV_VAULT_CI="bZziShewSDBDCcc5tIm/HMclhTznz/6lOODSlHDcvcT1SiVaNS34EBpoFsJFuLMMbU4IAkOddOgU7niWRj0+ZKyBAx9mj3KODt9SgvvrpqhcGeR0aJ1U1p2PCm6C+2MIXGhGTfB+8HQojwAGyai8k3fSNchtOhj103a3FF21kwvHkh2NaxgkBhZXRi6J/QgxRKTVgcbtl+CKrnN6YzavwwTRawhpI5fGrqdGGQ9l4Dv6pMONCzS0+JWPCo7HWibKNi67Q1yJOXk/L/9m/9sigPLCtbZPf2gYkI0u0y93gOfVCJdYNTkoqDfiF+KUVRN2/yQcDe9+VJhaOHuz+uDDrxOPxgwz/TtYS32nzLjUWo5wHKBrlvT9NUTPlKgl1FWQzWc8nstigSz1fObPaWlnzk2zx7/cOmi2IRk/Dj50iGX6q+r55VQbluFEqlpDs4FFQuWuu3kCiRmbE8dhpMUc02IU9NcGS4YtskLMioJqzZUEABYksi+tESNpIKg2XSZRUuZzpgQh6won7obeLlPXRfgbUL/ezV+GWWG3wUbilW3ViBBRgR6lhigmF30wlZVLoCAgrr2ACfDpI2v/PjHL751opJNLy25SPqVwRMJyrT6DdeszdJbbyIAIZaFYyLsc6JDZPgz4z+otQl3T0r3erD47st6Gtr1jpIvieJNVfN5TgHsY+2JJWLuKU2X/hNIduJfl0ZYQ5lYcEn3bPs9Nv4msrs5pGS6GgRSkrPsIPHhE8vRD4W14UfWM1LDG2zw4RMDhf8Cr/mbwbVz+L7MWGPTmToEi+30SWsroX4MUF5EREnY4kDAoNh60Om/7dqDAjxCIvZXufgj5KFIWKRPPOsFy+sD2UXprPwMswUMn8KfzLeK7esjkg7zAHQl8" -DOTENV_VAULT_CI_VERSION=213 +DOTENV_VAULT_CI="eGzJk4jPmy3uRv9AAUGsbr31hVl5zUsbK7jFjVxI8FFnJdTye0pv22G36UN9+1WC4Msx1r4MN8pcy3ep3VWA6EmrjM+iZDvZChs4g1APGW+PB+e4PhLCeA7cCjsQhqvDOSnKA+suRp2Sbdvy4W75tNKFAHfyGlQlOZ9Dt6+QD8cp13AuKGzpwtgjfMkjey2aRHtAJOKri6DnNDTTqVFCpbOzUEkJxl5sZhO0DuzN/4LdKpaOMGPyDPtp5d71cuW/jJrFUtlMActais+A3tNy79xmW3Ie0KTgeVoVP7RFv50CAz3wItf8DMPTUHvzalakZ6FMFQ3adE4p155fHEJYBdIjVICubTXGsUY7rbtO1hvAhD8RabYqJMA0r6FB0DVulcmrxcAq1W1zz+zTyNBiHxIlwChJkeZdC1yydxRk1SnB76rIqNGkvl6sJAU/E20eEFErAzEKMUHlGsnOSrIw6tnqgkMUtKfeJrlXlYvVEhHr70SRAmS3YLGqNrVDm9Rx44JpZ04a1oaL4sR7FqVmMDz3WG/Yt+socRgMoy93t4M20gYJSEzj/uOMRpaWNpbf/aUt3wLWdc7Rc7Z/OCLYLv4T453jf5TiWRYBTY0VsKeWvqGU+5iQQyV06GhJgqSYQkUipC5dpamx6xj/JCWHH3FrEIXPFMtGl9aVNMp81mqo/Sy3G5Dwzi02OxVth2jdqRayFjwwVVOBBFB184LeqWoj0uo7Zzh1wj1+KCZw8TbCMyev8lvx/qvrFqd+QWJnpQgl3KIQ6XxopUoeMkolSbLnjou2kYZFuJCl8jmC6VB3QsHDOKYrVzC5Q0cGuW/Lxf4rdvn1+AGSRKRdRPqgKrebg9KOC1EloDS3K5t6vHwWvfsAElVhIWBoj35e" +DOTENV_VAULT_CI_VERSION=215 # stage DOTENV_VAULT_STAGE="bfqZYD8oVLWMZ0JR5LICV+sB/btaXavszxZLxTfwSH8U5fg=" diff --git a/.gitattributes b/.gitattributes index 6cc793f..753934a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -17,7 +17,7 @@ # Generated data. # -# Last generated Feb 27, 2024 1:41 PM UTC. +# Last generated Feb 27, 2024 5:27 PM UTC. # Default diff --git a/.gitignore b/.gitignore index c4773cd..8efd081 100644 --- a/.gitignore +++ b/.gitignore @@ -17,7 +17,7 @@ # Generated data. # -# Last generated Feb 27, 2024 1:41 PM UTC. +# Last generated Feb 27, 2024 5:27 PM UTC. # Locals diff --git a/.npmignore b/.npmignore index baade29..0f7eb22 100644 --- a/.npmignore +++ b/.npmignore @@ -25,7 +25,7 @@ # Generated data. # -# Last generated Feb 27, 2024 1:41 PM UTC. +# Last generated Feb 27, 2024 5:27 PM UTC. # Locals diff --git a/.prettierignore b/.prettierignore index 05c08d0..4d04aba 100644 --- a/.prettierignore +++ b/.prettierignore @@ -17,7 +17,7 @@ # Generated data. # -# Last generated Feb 27, 2024 1:41 PM UTC. +# Last generated Feb 27, 2024 5:27 PM UTC. # Packages diff --git a/.vscode/settings.json b/.vscode/settings.json index 6ae5c39..b1049db 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,7 +7,7 @@ * @note This entire file will be updated automatically. * @note Instead of editing here, please review `./settings.mjs`. * - * Last generated using `./settings.mjs` Feb 27, 2024 1:41 PM UTC. + * Last generated using `./settings.mjs` Feb 27, 2024 5:27 PM UTC. */ { "editor.formatOnType": false, diff --git a/.vscodeignore b/.vscodeignore index 5757e50..235b164 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -17,7 +17,7 @@ # Generated data. # -# Last generated Feb 27, 2024 1:41 PM UTC. +# Last generated Feb 27, 2024 5:27 PM UTC. # Locals diff --git a/dev/.files/vite/includes/vitest/config.mjs b/dev/.files/vite/includes/vitest/config.mjs index f41e5f6..60f9053 100644 --- a/dev/.files/vite/includes/vitest/config.mjs +++ b/dev/.files/vite/includes/vitest/config.mjs @@ -152,6 +152,8 @@ export default async ({ projDir, srcDir, logsDir, targetEnv, vitestSandboxEnable : ['node', 'any'].includes(targetEnv) ? 'node' // . : /* fallback */ 'node', // prettier-ignore + ...(['cfp', 'cfw'].includes(targetEnv) ? { environmentOptions: { kvNamespaces: ['KV'] } } : {}), + // See: for `environment`, `environmentMatchGlobs` precedence. environmentMatchGlobs: [ ['**/*.{cfp,web}.{test,tests,spec,specs}.' + extensions.asBracedGlob([...extensions.byDevGroup.allJavaScript, ...extensions.byDevGroup.allTypeScript]), 'jsdom'], diff --git a/package-lock.json b/package-lock.json index 0fe7039..e0cbd65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@clevercanyon/utilities.cfw", - "version": "1.0.259", + "version": "1.0.260", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@clevercanyon/utilities.cfw", - "version": "1.0.259", + "version": "1.0.260", "cpu": [ "x64", "arm64" @@ -27,7 +27,7 @@ "url": "https://github.com/sponsors/clevercanyon" }, "peerDependencies": { - "@clevercanyon/utilities": "^1.0.871", + "@clevercanyon/utilities": "^1.0.873", "@upstash/ratelimit": "1.0.0", "@upstash/redis": "1.28.0" } @@ -1016,9 +1016,9 @@ } }, "node_modules/@clevercanyon/utilities": { - "version": "1.0.871", - "resolved": "https://registry.npmjs.org/@clevercanyon/utilities/-/utilities-1.0.871.tgz", - "integrity": "sha512-dV8iRWKGcivkZ2Sj51lOxS5orD6CvGUOxq9sBvOO936x6x2LFeca7coRvfB34kFVJLMs/VAj199NFGj0Qkc+gA==", + "version": "1.0.873", + "resolved": "https://registry.npmjs.org/@clevercanyon/utilities/-/utilities-1.0.873.tgz", + "integrity": "sha512-ZJJoX3wKUa/KHbUiQkl4OxfjzuZeLYLY+bB1Y/2G5xm8lBGxBmgyJ31vU1UztwMqWmODWBXrr+bt2YdfCyhXoA==", "cpu": [ "x64", "arm64" @@ -1102,9 +1102,9 @@ } }, "node_modules/@clevercanyon/utilities.cfw": { - "version": "1.0.259", - "resolved": "https://registry.npmjs.org/@clevercanyon/utilities.cfw/-/utilities.cfw-1.0.259.tgz", - "integrity": "sha512-yB8XwkLgJyoMQAr6l/Poc9nhRFem5oC/5skCov5VxKDjhRGFse/YOp1NR2Qj+NHowK4CDwcYs8p83TqQ4pn8Sw==", + "version": "1.0.260", + "resolved": "https://registry.npmjs.org/@clevercanyon/utilities.cfw/-/utilities.cfw-1.0.260.tgz", + "integrity": "sha512-Epbh7Ey9oPJd6i58v9c1PW8UgJwDf0ABnF1sga9OoyxmrJk5gEpq92351MMYD+KQYXhG+KC4+1PTArn9avxBcA==", "cpu": [ "x64", "arm64" diff --git a/package.json b/package.json index 1423145..4adc38b 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "publishConfig": { "access": "public" }, - "version": "1.0.260", + "version": "1.0.261", "license": "GPL-3.0-or-later", "name": "@clevercanyon/utilities.cfw", "description": "Utilities for JavaScript apps running in a Cloudflare Worker environment.", @@ -59,7 +59,7 @@ }, "dependencies": {}, "peerDependencies": { - "@clevercanyon/utilities": "^1.0.871", + "@clevercanyon/utilities": "^1.0.873", "@upstash/ratelimit": "1.0.0", "@upstash/redis": "1.28.0" }, diff --git a/src/proxy.ts b/src/proxy.ts index 48f3b60..3a7536b 100644 --- a/src/proxy.ts +++ b/src/proxy.ts @@ -5,7 +5,7 @@ import '#@initialize.ts'; import { $cfw, cfw } from '#index.ts'; -import { $app, $arr, $crypto, $env, $http, $is, $mime, $obj, $str, $time, $to, $url, type $type } from '@clevercanyon/utilities'; +import { $app, $arr, $crypto, $env, $gzip, $http, $is, $mime, $obj, $str, $time, $to, $url, type $type } from '@clevercanyon/utilities'; /** * Defines types. @@ -181,7 +181,8 @@ const fetchꓺviaSocket = async (rcData: $cfw.StdRequestContextData, url: $type. // responseStatus: undefined | number, responseHeaders: undefined | $type.cfw.Headers, - responseBody: undefined | string | $type.cfw.Blob; + responseBody: undefined | string | $type.cfw.Blob, + responseBodyDecodingError: undefined | Error; while (reader /* Stops when `done`. */) { const { done, value: chunk } = await reader.read(); @@ -198,15 +199,33 @@ const fetchꓺviaSocket = async (rcData: $cfw.StdRequestContextData, url: $type. responseStatus = Number(rawHTTPResponseHeaders.match(/^HTTP\/[0-9.]+\s+([0-9]+)/iu)?.[1]) || 500; responseHeaders = $http.parseHeaders(rawHTTPResponseHeaders) as $type.cfw.Headers; - if (-1 !== rawHTTPResponseCRLFByteIndex && $mime.typeIsBinary(responseHeaders.get('content-type') || '')) { - responseBody = new Blob([rawHTTPResponseBytes.slice(rawHTTPResponseCRLFByteIndex + crlfBytes.length)]); - // - } else if (-1 !== rawHTTPResponseCRLFByteIndex) { - responseBody = $str.textDecode(rawHTTPResponseBytes.slice(rawHTTPResponseCRLFByteIndex + crlfBytes.length)); + if (-1 !== rawHTTPResponseCRLFByteIndex) { + const rawResponseBodyBytes = rawHTTPResponseBytes.slice(rawHTTPResponseCRLFByteIndex + crlfBytes.length); + + if ($http.contentIsBinary(responseHeaders)) { + responseBody = new Blob([rawResponseBodyBytes]); + // + } else if ($http.contentIsEncoded(responseHeaders)) { + switch (responseHeaders.get('content-encoding')?.toLowerCase()) { + case 'gzip': { + responseBody = await $gzip.decode(rawResponseBodyBytes); + break; + } + case 'deflate': { + responseBody = await $gzip.decode(rawResponseBodyBytes, { deflate: true }); + break; + } + default: { + responseBodyDecodingError = Error('Unknown encoding.'); + } + } + } else { + responseBody = $str.textDecode(rawResponseBodyBytes); + } } await socket.close(); // Closes socket and streams. - if (!responseStatus || !responseHeaders) + if (!responseStatus || !responseHeaders || responseBodyDecodingError) return new Response(null, { status: 421, statusText: $http.responseStatusText(421), diff --git a/tsconfig.json b/tsconfig.json index 269e641..53c6425 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,7 @@ * @note This entire file will be updated automatically. * @note Instead of editing here, please review `./tsconfig.mjs`. * - * Last generated using `./tsconfig.mjs` Feb 27, 2024 1:41 PM UTC. + * Last generated using `./tsconfig.mjs` Feb 27, 2024 5:27 PM UTC. */ { "include": ["./src/**/*", "./dev-types.d.ts"], diff --git a/wrangler.toml b/wrangler.toml index 98faa06..47b3e81 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -7,7 +7,7 @@ # @note This entire file will be updated automatically. # @note Instead of editing here, please review `./wrangler.mjs`. # -# Last generated using `./wrangler.mjs` Feb 27, 2024 1:41 PM UTC. +# Last generated using `./wrangler.mjs` Feb 27, 2024 5:27 PM UTC. ## send_metrics = false