From 71b71842d2809c9d2e4cc2355d37a33f43622eec Mon Sep 17 00:00:00 2001 From: Jason Caldwell Date: Tue, 5 Mar 2024 13:34:05 -0500 Subject: [PATCH] Project update. [p][robotic] --- .browserslistrc | 12 ++--- .dockerignore | 2 +- .env.vault | 8 +-- .gitattributes | 2 +- .gitignore | 2 +- .npmignore | 2 +- .prettierignore | 2 +- .vscode/settings.json | 2 +- .vscodeignore | 2 +- package-lock.json | 74 +++++++++++++-------------- package.json | 9 +++- src/cfw.ts | 3 ++ src/index.ts | 1 + src/proxy.ts | 37 ++++++++------ src/root.ts | 116 ++++++++++++++++++++++++++++++++++++++++++ tsconfig.json | 2 +- wrangler.toml | 2 +- 17 files changed, 204 insertions(+), 74 deletions(-) create mode 100644 src/root.ts diff --git a/.browserslistrc b/.browserslistrc index aa3cd4f..291b6b3 100644 --- a/.browserslistrc +++ b/.browserslistrc @@ -17,14 +17,14 @@ # Generated data. # -# Last generated Mar 4, 2024 9:04 AM UTC. +# Last generated Mar 5, 2024 6:33 PM UTC. [production] node >= 20.9.0 and_chr >= 92 chrome >= 92 and_ff >= 90 -android >= 121 +android >= 122 edge >= 92 samsung >= 16.0 safari >= 15.4 @@ -48,7 +48,7 @@ node >= 20.9.0 and_chr >= 92 chrome >= 92 and_ff >= 90 -android >= 121 +android >= 122 edge >= 92 samsung >= 16.0 safari >= 15.4 @@ -72,7 +72,7 @@ node >= 20.9.0 and_chr >= 92 chrome >= 92 and_ff >= 90 -android >= 121 +android >= 122 edge >= 92 samsung >= 16.0 safari >= 15.4 @@ -107,7 +107,7 @@ not dead and_chr >= 92 chrome >= 92 and_ff >= 90 -android >= 121 +android >= 122 edge >= 92 samsung >= 16.0 safari >= 15.4 @@ -130,7 +130,7 @@ not dead and_chr >= 92 chrome >= 92 and_ff >= 90 -android >= 121 +android >= 122 edge >= 92 samsung >= 16.0 safari >= 15.4 diff --git a/.dockerignore b/.dockerignore index 82f34bd..eb22db8 100644 --- a/.dockerignore +++ b/.dockerignore @@ -17,7 +17,7 @@ # Generated data. # -# Last generated Mar 4, 2024 9:04 AM UTC. +# Last generated Mar 5, 2024 6:33 PM UTC. # Locals diff --git a/.env.vault b/.env.vault index 1f1dd90..c94c226 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="HJY3c0SQVGax+z41vwUBxzXK2AJMOZmb9nEqjgJ0toQandfCxiHNuJ9HhasnhEN1zp7k0tk2Ug5k/Xk4R/bZ85yZR2D9l6tSKQE6zpWnHwiLUwif4K0KAFL6ZQub/xRM42hh9T9iw1pTXlOagXn7PDLLlvgR2cFcyb+xXuTRpiApPKW8RkjkrODu9h0IW8k9hPlE7tIxBZPvJREyxddRxn5Rze2Um0lEeEgu+Wre0WIQcGeSmIs+8Bh42Kj+nbBrfl20qTsM3bIGLa8a7BQNC48JUKPAoWqJUq3NEdmfkR+39EMz2nZRURV7GDRoNQzKrp/Be62ZwsWAmDOY+0dJbm2Wd+QWMczk/Vlbe0HH8OlXa6lcvfIiDNErxNim+5QbhzhESrE/liALBKEyfLFdFsoxocuk2h0c5xXucQcMWfdd2HgT8roSvyTeYso8Yx9YUTpBcMh7Gk5apBcN+ia159mg/FUL4Q4Sxnwa44D5hL+gqZLlXsHuAmisr7FhUg9Hm1noRYw8k5ttbbxWceB8UiNK8QhDCIuSfnjl6agjcG3TbK3fX50/nxPupZJWCUWVJVqdFU/Te8UOa1y5PIA7xvHn4cXbEH0z0w2SgWqOsBtInrUEZXjGUgErWBMj33GSQBDhHkuAHr/teMvwsQm5iqWzpyj4K1a37F/wyIufhpsFPxZMKhe0GfTaDXIXL1SjwDrfELbEJxWSAhZkgKz18CtqKLoZK44mdme1zlhJFw0gceKpC3Acd1Fh8jmAUyUnkerpN0IyJFbaVZPibUoe5xemEZXdTw/5OvupeFywug2wy6gbIUJpPOk9O5etx2AUOeIBvtmz/dmvnrD7SYYzxSsHz+c6eNkik7zXeVpDygm2+4VOuVQIPueoQtRO" -DOTENV_VAULT_DEV_VERSION=233 +DOTENV_VAULT_DEV="a3bVmJ+WUFOs+Dy+D7eelQDQ9VtkM/idZ2GhuKuaSF+hzZf3LBRzr1LepbP95LkIpPrGa4FGcTV+o8ExXk1ksymZVPbY83ceAodas0Stsh5ADg22AMcj/YF+tC0Jlns6ahiLUMf3badW5jwR0nqPcYWI4/FwI67XcwLROHwP1dKviPpSigEYBkN4AiAi6dFai2t1y9bgddfxmwz2tDQ8IdzuBWvZutIqRMIDDtw97H3T9WhAp+Y6zoeRhqc4lDp0oNmQgzXDkfvrx6R8ohDs2InJK+e0PZjtrnPjXLM0csuk09CVBoDhkpYfpJHWkQlM+BOWbl80Zv0N5GXxpl4sM1obQHif/DuwCcwireUt8BcVfw1W39x7jQcxjlMSQJZljplcOcR8iXfxUSGulHnk5KUth7x+QQom/vkLRGBQqK0SylxIcUaMWGmpITha+tXeAk0CLNOZ0E1QWvMW4WDhUh7THfuN/9vwQr8IpbQGGoRpE233L/Wjowdk3wPlS5b0ry5bWWIjuAnSCMBhGjUdyde8/9ZDRiqKuvIrf4l0MMwCxfaVEkeHjUAU57su96jPvNylrvAW7WenrbB8T7p81Qzw6hMi8gZbZVsj5hopJWrjndbqfFqMW7dva83E0qsyva6RotXyA55XDAPD5+SEnSWSLmD55aP7JMP016FXe2pl7KlsUbdoKwpmbW/3VQpBzxzx6FNLqrFbwNGscQNPg/1uLvp+B3mI7FqnBVDX77JEPuQxfkuf82wXMLHvOIj8YQWg3A3I+hgWuCfPToGcXveECyJFnd3UtjnwGWbkwU4DwbYwdVBCoxtRk8WOCs839Y4oWhSnJPCvdlHLhER8nDMW7Vlfb1y/BtDGGsAWQLgYuNeyZ4A1jmR9vo2A" +DOTENV_VAULT_DEV_VERSION=235 # ci -DOTENV_VAULT_CI="yUHPnLOSodIcQ20cfwl80wihKYaMhbMDYdt40Ipu/xA8ZbO8SjvNIVf7vApOFj/3i3I2ewv+HpISKEz0UimBIEwnd/MCXWZe+BMudauI88PcT5LyODBqKHq+bQ2qW/juhIUSBoSRKNZ/RbC5dNxHlrPR5ZsGS9mlD35+rCn0GlK2Cr+mC6mPUdlKkxlFm7Ij7/MIE+fyNs0ATEpjb1hKutN/XDyi6tiA5uBXljjJeEMH60J+g0pzaJZ7bf20oVIRPAFU+SlSsgtZVvp101mn71+377F1kqrAzUSPfDidK4GJhqe1tikJTEJnzWvXH8bCnydkL3QkDJLZ1Mr9QuL14UMFnu9ImRocP6TJT1UFStdSWp1JKr5kzf1Z56+QW268Kq+Lg5OKlRs5PqMdnBBeUwowwQcKeE6LFEArBzB1+UhoaeM/34C7OBU2weTEJQ31NKJ5s48A/mozGmANalod/vAWJp9d8QQfFVpvwQVBlbCzeyj3MfFH0T5yOmcrmTieX8oHlyYhsrN1gh4YOAMI2PkhNFhQdz2+bIJJ0W/oDv/qnOgXORiKPq92zphRMhg5yxHeK8n1e7G93TcWWoEgZrkJjVMlrjMyD9v1nrOTpHNToIcpRxUJ0fYJashXV38Vs2ZNOk3osewMgWZr6aLhMh/DSiM/TQYWyhoh9OJzjYxjaxZG+7N32bcPL/uGIFtVRtK/B1LTbOKoMWhs2m66n6JW+3gUpwXQyX/d3tl0NpVdLdP+2YiqPYH4eAJTfngMVmuomuoeyfzezacJcGlGhOOi8yUNWnkqUFwb8mZmzohayejfa5hchi2nC5xtUH2tSfe24RzwRwsovpkTiXnsp/mS5XHXiSQ8pble6lTSbbJRCAavV1hrT+JqknMw" -DOTENV_VAULT_CI_VERSION=233 +DOTENV_VAULT_CI="AYUdpAj6fh6R9oNt9hHyyRA8IIw8bQidERWQcogNQxPGoxGQt/34+wnPIxC6FVoNo9WQXUB149A+htmv3T2HqqdUenWtLzUwHs/BpqRJ8t1LPCHFR+RA2hbscy+oS6Qy/GgvrrGvhSCbVmN/z3rXLNR620Oo+SRstVYacI/+UxzyQ+SlzpVp8THLg0kyiDydCNfSfh7ahMkWRfLYof7yyqVkr/TWm7/yCb/SWWaKR54S9Jj4IDgTLf6A04IAtamz7Rc9wv0xl+8XiP42NfEMoODS+nJWvEq8yG9PZyBF/1j285SP7lQULDC335vGkjwIB4s14R9VT2swy4efdmHgzbscf4+ksXY55h8gDaZuSH/0wrIoiXnIh3D1pZPPG3Pcbyr/74BdPC1nzKMdJIdTGhcgxnZQk5id/BVmEQI0MPgn0mWLJ2Or6LqLSiNWpH9ISGIWjn1DkqxC3fShaQe6dKoS+InVXeTTve53+z78+MQMcsT5213aFrY/Tddfa7HUpq4GuemB+lAvTp9TAZcDcGG5WZYMb16jkm44TVvE2Nv3OKRMQQiu24Mq5Rucq0HmYkdYSN5Wdy7I8/k770j1PuweAwpJFPIthC2Fzm98YV2gPBY/zi+NxGED1T79BvACYU9nK+2aqk1fxmvKLICRBYz0OBCvh6CVG7Kmz32MhhwjI2Yarow7UCdZH8iRXlYW5vssKEUHD1wfPPRbYlMJVW3D4wHnjkoqJyKZQMCSgVmR/bVpSeFu4mL5Z3jsPt6CCDUi+a6T4YhGnjAi8G5m/+4P7EzCrZHNPzoskXz2WN3fDKApFg6r19Zn7eZrRIDFTzTQy5qlmhlLfvjjxRGwR702yH/G1pbc0DsDmHB29pdOt5JyslL2H+eCKS6S" +DOTENV_VAULT_CI_VERSION=235 # stage DOTENV_VAULT_STAGE="bfqZYD8oVLWMZ0JR5LICV+sB/btaXavszxZLxTfwSH8U5fg=" diff --git a/.gitattributes b/.gitattributes index 2ca840a..1a1f2aa 100644 --- a/.gitattributes +++ b/.gitattributes @@ -17,7 +17,7 @@ # Generated data. # -# Last generated Mar 4, 2024 9:04 AM UTC. +# Last generated Mar 5, 2024 6:33 PM UTC. # Default diff --git a/.gitignore b/.gitignore index 775d930..ac75b0f 100644 --- a/.gitignore +++ b/.gitignore @@ -17,7 +17,7 @@ # Generated data. # -# Last generated Mar 4, 2024 9:04 AM UTC. +# Last generated Mar 5, 2024 6:33 PM UTC. # Locals diff --git a/.npmignore b/.npmignore index 9723d29..ff66777 100644 --- a/.npmignore +++ b/.npmignore @@ -25,7 +25,7 @@ # Generated data. # -# Last generated Mar 4, 2024 9:04 AM UTC. +# Last generated Mar 5, 2024 6:33 PM UTC. # Locals diff --git a/.prettierignore b/.prettierignore index 5421da9..1183bb4 100644 --- a/.prettierignore +++ b/.prettierignore @@ -17,7 +17,7 @@ # Generated data. # -# Last generated Mar 4, 2024 9:04 AM UTC. +# Last generated Mar 5, 2024 6:33 PM UTC. # Packages diff --git a/.vscode/settings.json b/.vscode/settings.json index 965306d..5d7e531 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` Mar 4, 2024 9:04 AM UTC. + * Last generated using `./settings.mjs` Mar 5, 2024 6:33 PM UTC. */ { "editor.formatOnType": false, diff --git a/.vscodeignore b/.vscodeignore index 8e65a65..5540f6e 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -17,7 +17,7 @@ # Generated data. # -# Last generated Mar 4, 2024 9:04 AM UTC. +# Last generated Mar 5, 2024 6:33 PM UTC. # Locals diff --git a/package-lock.json b/package-lock.json index 00a1317..c9d4964 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@clevercanyon/utilities.cfw", - "version": "1.0.269", + "version": "1.0.270", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@clevercanyon/utilities.cfw", - "version": "1.0.269", + "version": "1.0.270", "cpu": [ "x64", "arm64" @@ -27,7 +27,7 @@ "url": "https://github.com/sponsors/clevercanyon" }, "peerDependencies": { - "@clevercanyon/utilities": "^1.0.882", + "@clevercanyon/utilities": "^1.0.884", "@cloudflare/ai": "1.0.53", "@upstash/ratelimit": "1.0.0", "@upstash/redis": "1.28.0" @@ -1017,9 +1017,9 @@ } }, "node_modules/@clevercanyon/utilities": { - "version": "1.0.882", - "resolved": "https://registry.npmjs.org/@clevercanyon/utilities/-/utilities-1.0.882.tgz", - "integrity": "sha512-5g0spmnUAeVTObkqAnMAk9cpTWL8aTSaYVjCd3tstGDMI9ZdnKtG1PMUcTvDUSAZONhdoC2V86Xo4YoGyPGhYw==", + "version": "1.0.884", + "resolved": "https://registry.npmjs.org/@clevercanyon/utilities/-/utilities-1.0.884.tgz", + "integrity": "sha512-3U0yvaUj6hmB8uHs0fQwkXI5TPLQ78Y2ikjykaoJGCtPipiZSKG6nboI0djhqreNyJdYxIHx15F/NroPobOXKA==", "cpu": [ "x64", "arm64" @@ -1052,9 +1052,9 @@ } }, "node_modules/@clevercanyon/utilities.bash": { - "version": "1.0.202", - "resolved": "https://registry.npmjs.org/@clevercanyon/utilities.bash/-/utilities.bash-1.0.202.tgz", - "integrity": "sha512-hGgm/f5ZufrKTrVjAj/GYGySMHOEe+hojZFAH1cRnW3hjz3qqte4Z21qiTzF6prVv/AOZYONAL2cZFqE8zrtKw==", + "version": "1.0.203", + "resolved": "https://registry.npmjs.org/@clevercanyon/utilities.bash/-/utilities.bash-1.0.203.tgz", + "integrity": "sha512-Ivsg3ciHLdLfAL+6WUJRSqrnsaL9uAcKkmVbqU1jGSHQ8JnDeu227GueCdZ1A+1YzCZhnWA2qEr0r5hg6ESYVA==", "cpu": [ "x64", "arm64" @@ -1072,14 +1072,14 @@ "url": "https://github.com/sponsors/clevercanyon" }, "peerDependencies": { - "@clevercanyon/utilities": "^1.0.880", - "@clevercanyon/utilities.node": "^1.0.197" + "@clevercanyon/utilities": "^1.0.882", + "@clevercanyon/utilities.node": "^1.0.198" } }, "node_modules/@clevercanyon/utilities.cfp": { - "version": "1.0.225", - "resolved": "https://registry.npmjs.org/@clevercanyon/utilities.cfp/-/utilities.cfp-1.0.225.tgz", - "integrity": "sha512-KGYjCwa+P3YglDGA9PiLG/ZwLKGiT6dR1JGK9L3Kxh1dnuxYBdCNL7bzbTO6Y7B9zgvYDERpl9zkmL1Lb78ygQ==", + "version": "1.0.226", + "resolved": "https://registry.npmjs.org/@clevercanyon/utilities.cfp/-/utilities.cfp-1.0.226.tgz", + "integrity": "sha512-RTIlWDsvqZX+ZU52URNe1vTN90dMJRrfoIICWaFVD4u0tiJ3dfVFdkidOXCyuGvwbcWlxrQ6fQuqJUpjY6kC1A==", "cpu": [ "x64", "arm64" @@ -1097,15 +1097,15 @@ "url": "https://github.com/sponsors/clevercanyon" }, "peerDependencies": { - "@clevercanyon/utilities": "^1.0.880", - "@clevercanyon/utilities.cfw": "^1.0.268", - "@clevercanyon/utilities.web": "^1.0.150" + "@clevercanyon/utilities": "^1.0.882", + "@clevercanyon/utilities.cfw": "^1.0.270", + "@clevercanyon/utilities.web": "^1.0.151" } }, "node_modules/@clevercanyon/utilities.cfw": { - "version": "1.0.269", - "resolved": "https://registry.npmjs.org/@clevercanyon/utilities.cfw/-/utilities.cfw-1.0.269.tgz", - "integrity": "sha512-70T5zwDw4T9yTrwnLmNLY4SeirdR4DOdmmEn13DUVYqAGSW9bNTH5twhP4VHL2RG02AXtK2Cj3aHC/yPOGn9Mg==", + "version": "1.0.270", + "resolved": "https://registry.npmjs.org/@clevercanyon/utilities.cfw/-/utilities.cfw-1.0.270.tgz", + "integrity": "sha512-d/XkLia3P+aR5YBiyko4mhrlrbg0EY08fua9XAsTCOMgg4oenwGzUR0fuwGXBMDfXFF9iKGZ6cOP6Dji8fDVKg==", "cpu": [ "x64", "arm64" @@ -1124,7 +1124,7 @@ "url": "https://github.com/sponsors/clevercanyon" }, "peerDependencies": { - "@clevercanyon/utilities": "^1.0.880", + "@clevercanyon/utilities": "^1.0.882", "@cloudflare/ai": "1.0.53", "@upstash/ratelimit": "1.0.0", "@upstash/redis": "1.28.0" @@ -1172,9 +1172,9 @@ } }, "node_modules/@clevercanyon/utilities.web": { - "version": "1.0.151", - "resolved": "https://registry.npmjs.org/@clevercanyon/utilities.web/-/utilities.web-1.0.151.tgz", - "integrity": "sha512-Hvo7b0hbhMt/lAcOP4zZnVHjZ1rtNfm5mqY+EwYfVNvPplF96cWfnyMG+9iwEf19rrW8fqIvAhTnWMF0pSdk2g==", + "version": "1.0.152", + "resolved": "https://registry.npmjs.org/@clevercanyon/utilities.web/-/utilities.web-1.0.152.tgz", + "integrity": "sha512-VTGM2uqScH9Z+xaUtGpW8MeTrEilFkaN1aZf7Iut/lN2PKjd1kZVdUy1sK1AtlQug8/n3pclq0O+VtJT+ZmwJQ==", "cpu": [ "x64", "arm64" @@ -1193,7 +1193,7 @@ "url": "https://github.com/sponsors/clevercanyon" }, "peerDependencies": { - "@clevercanyon/utilities": "^1.0.880" + "@clevercanyon/utilities": "^1.0.882" } }, "node_modules/@cloudflare/ai": { @@ -4145,9 +4145,9 @@ } }, "node_modules/@npmcli/config/node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", + "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -8140,9 +8140,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001593", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001593.tgz", - "integrity": "sha512-UWM1zlo3cZfkpBysd7AS+z+v007q9G1+fLTUU42rQnY6t2axoogPW/xol6T7juU5EUoOhML4WgBIdG+9yYqAjQ==", + "version": "1.0.30001594", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001594.tgz", + "integrity": "sha512-VblSX6nYqyJVs8DKFMldE2IVCJjZ225LW00ydtUWwh5hk9IfkTOffO6r8gJNsH0qqqeAF8KrbMYA2VEwTlGW5g==", "dev": true, "funding": [ { @@ -9518,9 +9518,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.690", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.690.tgz", - "integrity": "sha512-+2OAGjUx68xElQhydpcbqH50hE8Vs2K6TkAeLhICYfndb67CVH0UsZaijmRUE3rHlIxU1u0jxwhgVe6fK3YANA==", + "version": "1.4.692", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.692.tgz", + "integrity": "sha512-d5rZRka9n2Y3MkWRN74IoAsxR0HK3yaAt7T50e3iT9VZmCCQDT3geXUO5ZRMhDToa1pkCeQXuNo+0g+NfDOVPA==", "dev": true }, "node_modules/emittery": { @@ -29905,9 +29905,9 @@ } }, "node_modules/unplugin": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.8.0.tgz", - "integrity": "sha512-yGEQsodWICmgt7asHF7QzqDZYeEP9h14vyd9Lul98UnYf29pLZZLwI09z2QdTjwU/FCkum1SRvsK7cx232X8NA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.8.1.tgz", + "integrity": "sha512-NDAvOEnZmeSRRmjfD0FoLzfve2/9lqceO5bR4J/2V72zphnFdq7UYo3fg6F1y1HfZEaSHa+7bZgbEN+z5x8ZDQ==", "dev": true, "dependencies": { "acorn": "^8.11.3", diff --git a/package.json b/package.json index 53b4a1c..68fcccb 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "publishConfig": { "access": "public" }, - "version": "1.0.270", + "version": "1.0.271", "license": "GPL-3.0-or-later", "name": "@clevercanyon/utilities.cfw", "description": "Utilities for JavaScript apps running in a Cloudflare Worker environment.", @@ -44,6 +44,11 @@ "types": "./dist/types/redis.d.ts", "import": "./dist/redis.js", "default": "./dist/redis.js" + }, + "./root": { + "types": "./dist/types/root.d.ts", + "import": "./dist/root.js", + "default": "./dist/root.js" } }, "sideEffects": ["**/*.{css,scss,less}", "./src/resources/initialize.ts"], @@ -59,7 +64,7 @@ }, "dependencies": {}, "peerDependencies": { - "@clevercanyon/utilities": "^1.0.882", + "@clevercanyon/utilities": "^1.0.884", "@cloudflare/ai": "1.0.53", "@upstash/ratelimit": "1.0.0", "@upstash/redis": "1.28.0" diff --git a/src/cfw.ts b/src/cfw.ts index 4331d0a..28bd0e2 100644 --- a/src/cfw.ts +++ b/src/cfw.ts @@ -50,7 +50,10 @@ export type StdExecutionContext = Readonly< >; export type StdEnvironment = Readonly<{ RT: $type.cfw.Fetcher; + RT_D1: $type.cfw.D1Database; + RT_R2: $type.cfw.R2Bucket; RT_KV: $type.cfw.KVNamespace; + AI: $type.cfw.Fetcher; D1: $type.cfw.D1Database; R2: $type.cfw.R2Bucket; diff --git a/src/index.ts b/src/index.ts index 3007515..354b72c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -9,3 +9,4 @@ export { cfw } from '#cfw.ts'; export * as $cfw from '#cfw.ts'; export * as $proxy from '#proxy.ts'; export * as $redis from '#redis.ts'; +export * as $root from '#root.ts'; diff --git a/src/proxy.ts b/src/proxy.ts index 86fa72a..591a136 100644 --- a/src/proxy.ts +++ b/src/proxy.ts @@ -4,8 +4,8 @@ import '#@initialize.ts'; -import { $cfw, cfw } from '#index.ts'; -import { $app, $arr, $crypto, $env, $gzip, $http, $is, $mime, $obj, $str, $time, $to, $url, type $type } from '@clevercanyon/utilities'; +import { $cfw, $root, cfw } from '#index.ts'; +import { $arr, $crypto, $env, $gzip, $http, $is, $mime, $obj, $str, $time, $to, $url, type $type } from '@clevercanyon/utilities'; /** * Defines types. @@ -271,7 +271,7 @@ const fetchꓺviaSocket = async (rcData: $cfw.StdRequestContextData, url: $type. */ export const uaHeaders = async (rcData: $cfw.StdRequestContextData, options?: UAHeaderOptions): Promise => { const { fetch } = cfw, - { url, env, auditLogger } = rcData, + { url, auditLogger } = rcData, // opts = $obj.defaults({}, options || {}, { randomIndex: $crypto.randomNumber(1, 100), @@ -294,9 +294,9 @@ export const uaHeaders = async (rcData: $cfw.StdRequestContextData, options?: UA 'accept-encoding': 'gzip, deflate', 'accept-language': 'en-US,en;q=0.9', }; - if (env.RT_KV || ('@clevercanyon/workers.hop.gdn' === $app.pkgName() && env.KV)) { + if ($root.kv.isAvailable(rcData)) { const kvKey = 'ua-headers:' + String(opts.randomIndex), - headers = (await (env.RT_KV || env.KV).get(kvKey, { type: 'json' })) as UAHeaders; + headers = (await $root.kv(rcData).get(kvKey, { type: 'json' })) as UAHeaders; if (!$is.plainObject(headers)) { void auditLogger.warn('UA headers failure.', { headers, error: Error('q9UTub4N') }); @@ -304,30 +304,35 @@ export const uaHeaders = async (rcData: $cfw.StdRequestContextData, options?: UA } return headers; } - if (env.RT /* Root worker service binding exists? */) { - const payload = await env.RT.fetch(await $cfw.serviceBindingRequest(rcData, apiRoute)) + if ($root.fetch.isAvailable(rcData)) { + let thrown: unknown; + + const payload = await $root + .fetch(rcData, apiRoute) .then(async (response): Promise => { return $to.plainObject(await response.json()) as UAHeadersResponsePayload; }) - .catch((thrown: unknown): void => { - void auditLogger.warn('UA headers error thrown.', { thrown }); + .catch((unknownThrown: unknown): void => { + thrown = unknownThrown; }); - if (!payload?.ok || !$is.plainObject(payload.data)) { - void auditLogger.warn('UA headers failure.', { payload, error: Error('DkkbNUJr') }); + if (!payload?.ok || !$is.plainObject(payload.data) || thrown) { + void auditLogger.warn('UA headers failure.', { payload, error: Error('DkkbNUJr'), thrown }); return defaultHeaders; } return payload.data; } - if (url.hostname !== apiRoute.hostname /* Worker-to-worker possible? */) { + if (url.hostname !== apiRoute.hostname) { + let thrown: unknown; + const payload = await fetch(apiRoute) .then(async (response): Promise => { return $to.plainObject(await response.json()) as UAHeadersResponsePayload; }) - .catch((thrown: unknown): void => { - void auditLogger.warn('UA headers error thrown.', { thrown }); + .catch((unknownThrown: unknown): void => { + thrown = unknownThrown; }); - if (!payload?.ok || !$is.plainObject(payload.data)) { - void auditLogger.warn('UA headers failure.', { payload, error: Error('hMG9q7P5') }); + if (!payload?.ok || !$is.plainObject(payload.data) || thrown) { + void auditLogger.warn('UA headers failure.', { payload, error: Error('hMG9q7P5'), thrown }); return defaultHeaders; } return payload.data; diff --git a/src/root.ts b/src/root.ts new file mode 100644 index 0000000..de4a3a9 --- /dev/null +++ b/src/root.ts @@ -0,0 +1,116 @@ +/** + * RT utilities. + */ + +import '#@initialize.ts'; + +import { $cfw } from '#index.ts'; +import { $app, type $type } from '@clevercanyon/utilities'; + +/** + * Defines root package name. + */ +const rootPkgName = '@clevercanyon/workers.hop.gdn'; + +/** + * Fetches using root service binding. + * + * @param rcData Request context data; {@see $cfw.StdRequestContextData}. + * @param requestInfo New request info; {@see $type.cfw.RequestInfo}. + * @param requestInit New request init; {@see $type.cfw.RequestInit}. + * + * @returns Promise of response from root service binding. + */ +export const fetch = async ( + rcData: $cfw.StdRequestContextData, // + requestInfo: $type.cfw.RequestInfo, + requestInit?: $type.cfw.RequestInit, +): Promise<$type.cfw.Response> => { + const { env } = rcData, + rt = env.RT; + + if (!rt) throw Error('Root service binding unavailable.'); + return rt.fetch(await $cfw.serviceBindingRequest(rcData, requestInfo, requestInit)); +}; +fetch.isAvailable = (rcData: $cfw.StdRequestContextData): boolean => { + return rcData.env.RT ? true : false; +}; + +/** + * Gets root D1 binding. + * + * @param rcData Request context data; {@see $cfw.StdRequestContextData}. + * + * @returns Root D1 binding. + */ +export const d1 = (rcData: $cfw.StdRequestContextData): $type.cfw.D1Database => { + const { env } = rcData, + d1 = env.RT_D1 || (rootPkgName === $app.pkgName() && env.D1); + + if (!d1) throw Error('Root D1 binding unavailable.'); + + return d1; +}; +d1.isAvailable = (rcData: $cfw.StdRequestContextData): boolean => { + return rcData.env.RT_D1 || (rootPkgName === $app.pkgName() && rcData.env.D1) ? true : false; +}; + +/** + * Gets root R2 binding. + * + * @param rcData Request context data; {@see $cfw.StdRequestContextData}. + * + * @returns Root R2 binding. + */ +export const r2 = (rcData: $cfw.StdRequestContextData): $type.cfw.R2Bucket => { + const { env } = rcData, + r2 = env.RT_R2 || (rootPkgName === $app.pkgName() && env.R2); + + if (!r2) throw Error('Root R2 binding unavailable.'); + + return r2; +}; +r2.isAvailable = (rcData: $cfw.StdRequestContextData): boolean => { + return rcData.env.RT_R2 || (rootPkgName === $app.pkgName() && rcData.env.R2) ? true : false; +}; + +/** + * Gets root KV binding. + * + * @param rcData Request context data; {@see $cfw.StdRequestContextData}. + * + * @returns Root KV binding. + */ +export const kv = (rcData: $cfw.StdRequestContextData): $type.cfw.KVNamespace => { + const { env } = rcData, + kv = env.RT_KV || (rootPkgName === $app.pkgName() && env.KV); + + if (!kv) throw Error('Root KV binding unavailable.'); + + return kv; +}; +kv.isAvailable = (rcData: $cfw.StdRequestContextData): boolean => { + return rcData.env.RT_KV || (rootPkgName === $app.pkgName() && rcData.env.KV) ? true : false; +}; + +/** + * Gets counter value. + * + * @param key Counter key. + * + * @returns Promise of counter value. + */ +export const counter = async (rcData: $cfw.StdRequestContextData, key: string): Promise => { + return ((await d1(rcData).prepare('SELECT `value` FROM `counters` WHERE `key` = ?1 LIMIT 1').bind(key).first('value')) as number) || 0; +}; +counter.isAvailable = d1.isAvailable; + +/** + * Bumps counter value. + * + * @param key Counter key. + * @param by By; default is `1`. + */ +export const bumpCounter = async (rcData: $cfw.StdRequestContextData, key: string, by: number = 1): Promise => { + await d1(rcData).prepare('INSERT INTO `counters` (`key`, `value`) VALUES(?1, ?2) ON CONFLICT(`key`) DO UPDATE SET `value` = `value` + ?2').bind(key, by).run(); +}; diff --git a/tsconfig.json b/tsconfig.json index b6fce6c..df429cf 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` Mar 4, 2024 9:04 AM UTC. + * Last generated using `./tsconfig.mjs` Mar 5, 2024 6:33 PM UTC. */ { "include": ["./src/**/*", "./dev-types.d.ts"], diff --git a/wrangler.toml b/wrangler.toml index 6461405..2a3c68a 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` Mar 4, 2024 9:04 AM UTC. +# Last generated using `./wrangler.mjs` Mar 5, 2024 6:33 PM UTC. ## send_metrics = false