Monorepo for Tangled
0

Configure Feed

Select the types of activity you want to include in your feed.

bobbin/worker: add ratelimit

Signed-off-by: dawn <dawn@tangled.org>

authored by

dawn and committed by
Tangled
(Jul 11, 2026, 11:27 AM +0300) 2adda573 593a3c74

+946
+912
bobbin/worker/pnpm-lock.yaml
··· 1 + lockfileVersion: '9.0' 2 + 3 + settings: 4 + autoInstallPeers: true 5 + excludeLinksFromLockfile: false 6 + 7 + importers: 8 + 9 + .: 10 + dependencies: 11 + '@cloudflare/containers': 12 + specifier: ^0.3.7 13 + version: 0.3.7 14 + devDependencies: 15 + '@cloudflare/workers-types': 16 + specifier: ^4.20260317.1 17 + version: 4.20260702.1 18 + '@types/node': 19 + specifier: ^25.5.0 20 + version: 25.9.5 21 + typescript: 22 + specifier: ^5.9.3 23 + version: 5.9.3 24 + wrangler: 25 + specifier: ^4.75.0 26 + version: 4.107.1(@cloudflare/workers-types@4.20260702.1) 27 + 28 + packages: 29 + 30 + '@cloudflare/containers@0.3.7': 31 + resolution: {integrity: sha512-DM9dm3FnIBSyiSJ1FLavKwl/lk3oAmTaynCzZQ9pZR0ncRPquSxkxd8Nu2MFILxmDDsPkxKsSNEh9mHHMty4Fw==} 32 + 33 + '@cloudflare/kv-asset-handler@0.5.0': 34 + resolution: {integrity: sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==} 35 + engines: {node: '>=22.0.0'} 36 + 37 + '@cloudflare/unenv-preset@2.16.1': 38 + resolution: {integrity: sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw==} 39 + peerDependencies: 40 + unenv: 2.0.0-rc.24 41 + workerd: '>1.20260305.0 <2.0.0-0' 42 + peerDependenciesMeta: 43 + workerd: 44 + optional: true 45 + 46 + '@cloudflare/workerd-darwin-64@1.20260702.1': 47 + resolution: {integrity: sha512-D5+vnLlvfkanyFpgyE+K8JtFGr9qcKEaMIv6iGus1bz7gegr8zWF5HLwJ5LbebdyeVWl+IzpT7m5LJQsHOcJ4Q==} 48 + engines: {node: '>=16'} 49 + cpu: [x64] 50 + os: [darwin] 51 + 52 + '@cloudflare/workerd-darwin-arm64@1.20260702.1': 53 + resolution: {integrity: sha512-CkJNyrOzuIWil87qztB5cE6b9z+0c2Ewc8yrkSfahsdATxmjD+mrLIpJ0IkW9bqCOS1JE1kDEtfx9D4/ZpKW6w==} 54 + engines: {node: '>=16'} 55 + cpu: [arm64] 56 + os: [darwin] 57 + 58 + '@cloudflare/workerd-linux-64@1.20260702.1': 59 + resolution: {integrity: sha512-FhJl4cZQNqlG5v7LQRvzTes2q8hHylf60ecQ4Es0YvJ0hvRO30FOU2f4WSEIkZahs1HNCYxf2EL9GJQ/vIx1Ig==} 60 + engines: {node: '>=16'} 61 + cpu: [x64] 62 + os: [linux] 63 + 64 + '@cloudflare/workerd-linux-arm64@1.20260702.1': 65 + resolution: {integrity: sha512-EuXdOgwE08sbfVJsI9JHXUxf2Xlqy51P1nQt+wIDN5kcLzfkW0hbKw/GVLupLBhivGdFRfSBM9SUn/+3uMneuQ==} 66 + engines: {node: '>=16'} 67 + cpu: [arm64] 68 + os: [linux] 69 + 70 + '@cloudflare/workerd-windows-64@1.20260702.1': 71 + resolution: {integrity: sha512-84X5kRiUo9vUEWAaj/vOamPqQJK21KOUWuQ48MccFbzG+LPCZP0EGb36dQZd1OmKoZ1dYHPWB0zBAoI7tygc2w==} 72 + engines: {node: '>=16'} 73 + cpu: [x64] 74 + os: [win32] 75 + 76 + '@cloudflare/workers-types@4.20260702.1': 77 + resolution: {integrity: sha512-mOhf5TUEB1m2vPrxtqoIGfz0fUC9xyxRDx5gWHy5s+OCo6dcV+g7wI1R7gYCMFohhqF/2y2xeKVwMwCJjfn/WA==} 78 + 79 + '@cspotcode/source-map-support@0.8.1': 80 + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 81 + engines: {node: '>=12'} 82 + 83 + '@emnapi/runtime@1.11.2': 84 + resolution: {integrity: sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==} 85 + 86 + '@esbuild/aix-ppc64@0.28.1': 87 + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} 88 + engines: {node: '>=18'} 89 + cpu: [ppc64] 90 + os: [aix] 91 + 92 + '@esbuild/android-arm64@0.28.1': 93 + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} 94 + engines: {node: '>=18'} 95 + cpu: [arm64] 96 + os: [android] 97 + 98 + '@esbuild/android-arm@0.28.1': 99 + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} 100 + engines: {node: '>=18'} 101 + cpu: [arm] 102 + os: [android] 103 + 104 + '@esbuild/android-x64@0.28.1': 105 + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} 106 + engines: {node: '>=18'} 107 + cpu: [x64] 108 + os: [android] 109 + 110 + '@esbuild/darwin-arm64@0.28.1': 111 + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} 112 + engines: {node: '>=18'} 113 + cpu: [arm64] 114 + os: [darwin] 115 + 116 + '@esbuild/darwin-x64@0.28.1': 117 + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} 118 + engines: {node: '>=18'} 119 + cpu: [x64] 120 + os: [darwin] 121 + 122 + '@esbuild/freebsd-arm64@0.28.1': 123 + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} 124 + engines: {node: '>=18'} 125 + cpu: [arm64] 126 + os: [freebsd] 127 + 128 + '@esbuild/freebsd-x64@0.28.1': 129 + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} 130 + engines: {node: '>=18'} 131 + cpu: [x64] 132 + os: [freebsd] 133 + 134 + '@esbuild/linux-arm64@0.28.1': 135 + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} 136 + engines: {node: '>=18'} 137 + cpu: [arm64] 138 + os: [linux] 139 + 140 + '@esbuild/linux-arm@0.28.1': 141 + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} 142 + engines: {node: '>=18'} 143 + cpu: [arm] 144 + os: [linux] 145 + 146 + '@esbuild/linux-ia32@0.28.1': 147 + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} 148 + engines: {node: '>=18'} 149 + cpu: [ia32] 150 + os: [linux] 151 + 152 + '@esbuild/linux-loong64@0.28.1': 153 + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} 154 + engines: {node: '>=18'} 155 + cpu: [loong64] 156 + os: [linux] 157 + 158 + '@esbuild/linux-mips64el@0.28.1': 159 + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} 160 + engines: {node: '>=18'} 161 + cpu: [mips64el] 162 + os: [linux] 163 + 164 + '@esbuild/linux-ppc64@0.28.1': 165 + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} 166 + engines: {node: '>=18'} 167 + cpu: [ppc64] 168 + os: [linux] 169 + 170 + '@esbuild/linux-riscv64@0.28.1': 171 + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} 172 + engines: {node: '>=18'} 173 + cpu: [riscv64] 174 + os: [linux] 175 + 176 + '@esbuild/linux-s390x@0.28.1': 177 + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} 178 + engines: {node: '>=18'} 179 + cpu: [s390x] 180 + os: [linux] 181 + 182 + '@esbuild/linux-x64@0.28.1': 183 + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} 184 + engines: {node: '>=18'} 185 + cpu: [x64] 186 + os: [linux] 187 + 188 + '@esbuild/netbsd-arm64@0.28.1': 189 + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} 190 + engines: {node: '>=18'} 191 + cpu: [arm64] 192 + os: [netbsd] 193 + 194 + '@esbuild/netbsd-x64@0.28.1': 195 + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} 196 + engines: {node: '>=18'} 197 + cpu: [x64] 198 + os: [netbsd] 199 + 200 + '@esbuild/openbsd-arm64@0.28.1': 201 + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} 202 + engines: {node: '>=18'} 203 + cpu: [arm64] 204 + os: [openbsd] 205 + 206 + '@esbuild/openbsd-x64@0.28.1': 207 + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} 208 + engines: {node: '>=18'} 209 + cpu: [x64] 210 + os: [openbsd] 211 + 212 + '@esbuild/openharmony-arm64@0.28.1': 213 + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} 214 + engines: {node: '>=18'} 215 + cpu: [arm64] 216 + os: [openharmony] 217 + 218 + '@esbuild/sunos-x64@0.28.1': 219 + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} 220 + engines: {node: '>=18'} 221 + cpu: [x64] 222 + os: [sunos] 223 + 224 + '@esbuild/win32-arm64@0.28.1': 225 + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} 226 + engines: {node: '>=18'} 227 + cpu: [arm64] 228 + os: [win32] 229 + 230 + '@esbuild/win32-ia32@0.28.1': 231 + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} 232 + engines: {node: '>=18'} 233 + cpu: [ia32] 234 + os: [win32] 235 + 236 + '@esbuild/win32-x64@0.28.1': 237 + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} 238 + engines: {node: '>=18'} 239 + cpu: [x64] 240 + os: [win32] 241 + 242 + '@img/colour@1.1.0': 243 + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} 244 + engines: {node: '>=18'} 245 + 246 + '@img/sharp-darwin-arm64@0.34.5': 247 + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} 248 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 249 + cpu: [arm64] 250 + os: [darwin] 251 + 252 + '@img/sharp-darwin-x64@0.34.5': 253 + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} 254 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 255 + cpu: [x64] 256 + os: [darwin] 257 + 258 + '@img/sharp-libvips-darwin-arm64@1.2.4': 259 + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} 260 + cpu: [arm64] 261 + os: [darwin] 262 + 263 + '@img/sharp-libvips-darwin-x64@1.2.4': 264 + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} 265 + cpu: [x64] 266 + os: [darwin] 267 + 268 + '@img/sharp-libvips-linux-arm64@1.2.4': 269 + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} 270 + cpu: [arm64] 271 + os: [linux] 272 + libc: [glibc] 273 + 274 + '@img/sharp-libvips-linux-arm@1.2.4': 275 + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} 276 + cpu: [arm] 277 + os: [linux] 278 + libc: [glibc] 279 + 280 + '@img/sharp-libvips-linux-ppc64@1.2.4': 281 + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} 282 + cpu: [ppc64] 283 + os: [linux] 284 + libc: [glibc] 285 + 286 + '@img/sharp-libvips-linux-riscv64@1.2.4': 287 + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} 288 + cpu: [riscv64] 289 + os: [linux] 290 + libc: [glibc] 291 + 292 + '@img/sharp-libvips-linux-s390x@1.2.4': 293 + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} 294 + cpu: [s390x] 295 + os: [linux] 296 + libc: [glibc] 297 + 298 + '@img/sharp-libvips-linux-x64@1.2.4': 299 + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} 300 + cpu: [x64] 301 + os: [linux] 302 + libc: [glibc] 303 + 304 + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': 305 + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} 306 + cpu: [arm64] 307 + os: [linux] 308 + libc: [musl] 309 + 310 + '@img/sharp-libvips-linuxmusl-x64@1.2.4': 311 + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} 312 + cpu: [x64] 313 + os: [linux] 314 + libc: [musl] 315 + 316 + '@img/sharp-linux-arm64@0.34.5': 317 + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} 318 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 319 + cpu: [arm64] 320 + os: [linux] 321 + libc: [glibc] 322 + 323 + '@img/sharp-linux-arm@0.34.5': 324 + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} 325 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 326 + cpu: [arm] 327 + os: [linux] 328 + libc: [glibc] 329 + 330 + '@img/sharp-linux-ppc64@0.34.5': 331 + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} 332 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 333 + cpu: [ppc64] 334 + os: [linux] 335 + libc: [glibc] 336 + 337 + '@img/sharp-linux-riscv64@0.34.5': 338 + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} 339 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 340 + cpu: [riscv64] 341 + os: [linux] 342 + libc: [glibc] 343 + 344 + '@img/sharp-linux-s390x@0.34.5': 345 + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} 346 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 347 + cpu: [s390x] 348 + os: [linux] 349 + libc: [glibc] 350 + 351 + '@img/sharp-linux-x64@0.34.5': 352 + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} 353 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 354 + cpu: [x64] 355 + os: [linux] 356 + libc: [glibc] 357 + 358 + '@img/sharp-linuxmusl-arm64@0.34.5': 359 + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} 360 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 361 + cpu: [arm64] 362 + os: [linux] 363 + libc: [musl] 364 + 365 + '@img/sharp-linuxmusl-x64@0.34.5': 366 + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} 367 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 368 + cpu: [x64] 369 + os: [linux] 370 + libc: [musl] 371 + 372 + '@img/sharp-wasm32@0.34.5': 373 + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} 374 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 375 + cpu: [wasm32] 376 + 377 + '@img/sharp-win32-arm64@0.34.5': 378 + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} 379 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 380 + cpu: [arm64] 381 + os: [win32] 382 + 383 + '@img/sharp-win32-ia32@0.34.5': 384 + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} 385 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 386 + cpu: [ia32] 387 + os: [win32] 388 + 389 + '@img/sharp-win32-x64@0.34.5': 390 + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} 391 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 392 + cpu: [x64] 393 + os: [win32] 394 + 395 + '@jridgewell/resolve-uri@3.1.2': 396 + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 397 + engines: {node: '>=6.0.0'} 398 + 399 + '@jridgewell/sourcemap-codec@1.5.5': 400 + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 401 + 402 + '@jridgewell/trace-mapping@0.3.9': 403 + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 404 + 405 + '@poppinss/colors@4.1.6': 406 + resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==} 407 + 408 + '@poppinss/dumper@0.6.5': 409 + resolution: {integrity: sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==} 410 + 411 + '@poppinss/exception@1.2.3': 412 + resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} 413 + 414 + '@sindresorhus/is@7.2.0': 415 + resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} 416 + engines: {node: '>=18'} 417 + 418 + '@speed-highlight/core@1.2.17': 419 + resolution: {integrity: sha512-Z92FwKpCtfaW1V0jTU/fh3QzYEZN8wDwrzRIBoADCJfn4mJCNcJN/XegifX7BDrQ8/h9Xh/JnbyMchL0FqXrkg==} 420 + 421 + '@types/node@25.9.5': 422 + resolution: {integrity: sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg==} 423 + 424 + blake3-wasm@2.1.5: 425 + resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} 426 + 427 + cookie@1.1.1: 428 + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} 429 + engines: {node: '>=18'} 430 + 431 + detect-libc@2.1.2: 432 + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} 433 + engines: {node: '>=8'} 434 + 435 + error-stack-parser-es@1.0.5: 436 + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} 437 + 438 + esbuild@0.28.1: 439 + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} 440 + engines: {node: '>=18'} 441 + hasBin: true 442 + 443 + fsevents@2.3.3: 444 + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 445 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 446 + os: [darwin] 447 + 448 + kleur@4.1.5: 449 + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 450 + engines: {node: '>=6'} 451 + 452 + miniflare@4.20260702.0: 453 + resolution: {integrity: sha512-OqX/HwWWu0JqLQ7aCQU0int9fmpMzRjVWDo0T1WJDTssYc7KlaMM3G8N8HUEunkBMflmgI8TiAqmZTISqcVmEw==} 454 + engines: {node: '>=22.0.0'} 455 + hasBin: true 456 + 457 + path-to-regexp@6.3.0: 458 + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} 459 + 460 + pathe@2.0.3: 461 + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 462 + 463 + semver@7.8.5: 464 + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} 465 + engines: {node: '>=10'} 466 + hasBin: true 467 + 468 + sharp@0.34.5: 469 + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} 470 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 471 + 472 + supports-color@10.2.2: 473 + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} 474 + engines: {node: '>=18'} 475 + 476 + tslib@2.8.1: 477 + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 478 + 479 + typescript@5.9.3: 480 + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 481 + engines: {node: '>=14.17'} 482 + hasBin: true 483 + 484 + undici-types@7.24.6: 485 + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} 486 + 487 + undici@7.28.0: 488 + resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} 489 + engines: {node: '>=20.18.1'} 490 + 491 + unenv@2.0.0-rc.24: 492 + resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} 493 + 494 + workerd@1.20260702.1: 495 + resolution: {integrity: sha512-rkIDTWQ7yhC0BjWBDuKj/q9JsOBzrGt/KdOeun+c4YlN47W4l0pa5aCyE1X6A47/ju3h6BEFhrO1CibZ5EgSpA==} 496 + engines: {node: '>=16'} 497 + hasBin: true 498 + 499 + wrangler@4.107.1: 500 + resolution: {integrity: sha512-HMulqgQtNvY9UKXu6nTRTqv5GhtN1RhZeG9cPX+kS8R6s7o7ct6rueoXiNe4MX8+88B7p4lq3RvSPzB205fexg==} 501 + engines: {node: '>=22.0.0'} 502 + hasBin: true 503 + peerDependencies: 504 + '@cloudflare/workers-types': ^4.20260702.1 505 + peerDependenciesMeta: 506 + '@cloudflare/workers-types': 507 + optional: true 508 + 509 + ws@8.21.0: 510 + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} 511 + engines: {node: '>=10.0.0'} 512 + peerDependencies: 513 + bufferutil: ^4.0.1 514 + utf-8-validate: '>=5.0.2' 515 + peerDependenciesMeta: 516 + bufferutil: 517 + optional: true 518 + utf-8-validate: 519 + optional: true 520 + 521 + youch-core@0.3.3: 522 + resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} 523 + 524 + youch@4.1.0-beta.10: 525 + resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} 526 + 527 + snapshots: 528 + 529 + '@cloudflare/containers@0.3.7': {} 530 + 531 + '@cloudflare/kv-asset-handler@0.5.0': {} 532 + 533 + '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260702.1)': 534 + dependencies: 535 + unenv: 2.0.0-rc.24 536 + optionalDependencies: 537 + workerd: 1.20260702.1 538 + 539 + '@cloudflare/workerd-darwin-64@1.20260702.1': 540 + optional: true 541 + 542 + '@cloudflare/workerd-darwin-arm64@1.20260702.1': 543 + optional: true 544 + 545 + '@cloudflare/workerd-linux-64@1.20260702.1': 546 + optional: true 547 + 548 + '@cloudflare/workerd-linux-arm64@1.20260702.1': 549 + optional: true 550 + 551 + '@cloudflare/workerd-windows-64@1.20260702.1': 552 + optional: true 553 + 554 + '@cloudflare/workers-types@4.20260702.1': {} 555 + 556 + '@cspotcode/source-map-support@0.8.1': 557 + dependencies: 558 + '@jridgewell/trace-mapping': 0.3.9 559 + 560 + '@emnapi/runtime@1.11.2': 561 + dependencies: 562 + tslib: 2.8.1 563 + optional: true 564 + 565 + '@esbuild/aix-ppc64@0.28.1': 566 + optional: true 567 + 568 + '@esbuild/android-arm64@0.28.1': 569 + optional: true 570 + 571 + '@esbuild/android-arm@0.28.1': 572 + optional: true 573 + 574 + '@esbuild/android-x64@0.28.1': 575 + optional: true 576 + 577 + '@esbuild/darwin-arm64@0.28.1': 578 + optional: true 579 + 580 + '@esbuild/darwin-x64@0.28.1': 581 + optional: true 582 + 583 + '@esbuild/freebsd-arm64@0.28.1': 584 + optional: true 585 + 586 + '@esbuild/freebsd-x64@0.28.1': 587 + optional: true 588 + 589 + '@esbuild/linux-arm64@0.28.1': 590 + optional: true 591 + 592 + '@esbuild/linux-arm@0.28.1': 593 + optional: true 594 + 595 + '@esbuild/linux-ia32@0.28.1': 596 + optional: true 597 + 598 + '@esbuild/linux-loong64@0.28.1': 599 + optional: true 600 + 601 + '@esbuild/linux-mips64el@0.28.1': 602 + optional: true 603 + 604 + '@esbuild/linux-ppc64@0.28.1': 605 + optional: true 606 + 607 + '@esbuild/linux-riscv64@0.28.1': 608 + optional: true 609 + 610 + '@esbuild/linux-s390x@0.28.1': 611 + optional: true 612 + 613 + '@esbuild/linux-x64@0.28.1': 614 + optional: true 615 + 616 + '@esbuild/netbsd-arm64@0.28.1': 617 + optional: true 618 + 619 + '@esbuild/netbsd-x64@0.28.1': 620 + optional: true 621 + 622 + '@esbuild/openbsd-arm64@0.28.1': 623 + optional: true 624 + 625 + '@esbuild/openbsd-x64@0.28.1': 626 + optional: true 627 + 628 + '@esbuild/openharmony-arm64@0.28.1': 629 + optional: true 630 + 631 + '@esbuild/sunos-x64@0.28.1': 632 + optional: true 633 + 634 + '@esbuild/win32-arm64@0.28.1': 635 + optional: true 636 + 637 + '@esbuild/win32-ia32@0.28.1': 638 + optional: true 639 + 640 + '@esbuild/win32-x64@0.28.1': 641 + optional: true 642 + 643 + '@img/colour@1.1.0': {} 644 + 645 + '@img/sharp-darwin-arm64@0.34.5': 646 + optionalDependencies: 647 + '@img/sharp-libvips-darwin-arm64': 1.2.4 648 + optional: true 649 + 650 + '@img/sharp-darwin-x64@0.34.5': 651 + optionalDependencies: 652 + '@img/sharp-libvips-darwin-x64': 1.2.4 653 + optional: true 654 + 655 + '@img/sharp-libvips-darwin-arm64@1.2.4': 656 + optional: true 657 + 658 + '@img/sharp-libvips-darwin-x64@1.2.4': 659 + optional: true 660 + 661 + '@img/sharp-libvips-linux-arm64@1.2.4': 662 + optional: true 663 + 664 + '@img/sharp-libvips-linux-arm@1.2.4': 665 + optional: true 666 + 667 + '@img/sharp-libvips-linux-ppc64@1.2.4': 668 + optional: true 669 + 670 + '@img/sharp-libvips-linux-riscv64@1.2.4': 671 + optional: true 672 + 673 + '@img/sharp-libvips-linux-s390x@1.2.4': 674 + optional: true 675 + 676 + '@img/sharp-libvips-linux-x64@1.2.4': 677 + optional: true 678 + 679 + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': 680 + optional: true 681 + 682 + '@img/sharp-libvips-linuxmusl-x64@1.2.4': 683 + optional: true 684 + 685 + '@img/sharp-linux-arm64@0.34.5': 686 + optionalDependencies: 687 + '@img/sharp-libvips-linux-arm64': 1.2.4 688 + optional: true 689 + 690 + '@img/sharp-linux-arm@0.34.5': 691 + optionalDependencies: 692 + '@img/sharp-libvips-linux-arm': 1.2.4 693 + optional: true 694 + 695 + '@img/sharp-linux-ppc64@0.34.5': 696 + optionalDependencies: 697 + '@img/sharp-libvips-linux-ppc64': 1.2.4 698 + optional: true 699 + 700 + '@img/sharp-linux-riscv64@0.34.5': 701 + optionalDependencies: 702 + '@img/sharp-libvips-linux-riscv64': 1.2.4 703 + optional: true 704 + 705 + '@img/sharp-linux-s390x@0.34.5': 706 + optionalDependencies: 707 + '@img/sharp-libvips-linux-s390x': 1.2.4 708 + optional: true 709 + 710 + '@img/sharp-linux-x64@0.34.5': 711 + optionalDependencies: 712 + '@img/sharp-libvips-linux-x64': 1.2.4 713 + optional: true 714 + 715 + '@img/sharp-linuxmusl-arm64@0.34.5': 716 + optionalDependencies: 717 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 718 + optional: true 719 + 720 + '@img/sharp-linuxmusl-x64@0.34.5': 721 + optionalDependencies: 722 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 723 + optional: true 724 + 725 + '@img/sharp-wasm32@0.34.5': 726 + dependencies: 727 + '@emnapi/runtime': 1.11.2 728 + optional: true 729 + 730 + '@img/sharp-win32-arm64@0.34.5': 731 + optional: true 732 + 733 + '@img/sharp-win32-ia32@0.34.5': 734 + optional: true 735 + 736 + '@img/sharp-win32-x64@0.34.5': 737 + optional: true 738 + 739 + '@jridgewell/resolve-uri@3.1.2': {} 740 + 741 + '@jridgewell/sourcemap-codec@1.5.5': {} 742 + 743 + '@jridgewell/trace-mapping@0.3.9': 744 + dependencies: 745 + '@jridgewell/resolve-uri': 3.1.2 746 + '@jridgewell/sourcemap-codec': 1.5.5 747 + 748 + '@poppinss/colors@4.1.6': 749 + dependencies: 750 + kleur: 4.1.5 751 + 752 + '@poppinss/dumper@0.6.5': 753 + dependencies: 754 + '@poppinss/colors': 4.1.6 755 + '@sindresorhus/is': 7.2.0 756 + supports-color: 10.2.2 757 + 758 + '@poppinss/exception@1.2.3': {} 759 + 760 + '@sindresorhus/is@7.2.0': {} 761 + 762 + '@speed-highlight/core@1.2.17': {} 763 + 764 + '@types/node@25.9.5': 765 + dependencies: 766 + undici-types: 7.24.6 767 + 768 + blake3-wasm@2.1.5: {} 769 + 770 + cookie@1.1.1: {} 771 + 772 + detect-libc@2.1.2: {} 773 + 774 + error-stack-parser-es@1.0.5: {} 775 + 776 + esbuild@0.28.1: 777 + optionalDependencies: 778 + '@esbuild/aix-ppc64': 0.28.1 779 + '@esbuild/android-arm': 0.28.1 780 + '@esbuild/android-arm64': 0.28.1 781 + '@esbuild/android-x64': 0.28.1 782 + '@esbuild/darwin-arm64': 0.28.1 783 + '@esbuild/darwin-x64': 0.28.1 784 + '@esbuild/freebsd-arm64': 0.28.1 785 + '@esbuild/freebsd-x64': 0.28.1 786 + '@esbuild/linux-arm': 0.28.1 787 + '@esbuild/linux-arm64': 0.28.1 788 + '@esbuild/linux-ia32': 0.28.1 789 + '@esbuild/linux-loong64': 0.28.1 790 + '@esbuild/linux-mips64el': 0.28.1 791 + '@esbuild/linux-ppc64': 0.28.1 792 + '@esbuild/linux-riscv64': 0.28.1 793 + '@esbuild/linux-s390x': 0.28.1 794 + '@esbuild/linux-x64': 0.28.1 795 + '@esbuild/netbsd-arm64': 0.28.1 796 + '@esbuild/netbsd-x64': 0.28.1 797 + '@esbuild/openbsd-arm64': 0.28.1 798 + '@esbuild/openbsd-x64': 0.28.1 799 + '@esbuild/openharmony-arm64': 0.28.1 800 + '@esbuild/sunos-x64': 0.28.1 801 + '@esbuild/win32-arm64': 0.28.1 802 + '@esbuild/win32-ia32': 0.28.1 803 + '@esbuild/win32-x64': 0.28.1 804 + 805 + fsevents@2.3.3: 806 + optional: true 807 + 808 + kleur@4.1.5: {} 809 + 810 + miniflare@4.20260702.0: 811 + dependencies: 812 + '@cspotcode/source-map-support': 0.8.1 813 + sharp: 0.34.5 814 + undici: 7.28.0 815 + workerd: 1.20260702.1 816 + ws: 8.21.0 817 + youch: 4.1.0-beta.10 818 + transitivePeerDependencies: 819 + - bufferutil 820 + - utf-8-validate 821 + 822 + path-to-regexp@6.3.0: {} 823 + 824 + pathe@2.0.3: {} 825 + 826 + semver@7.8.5: {} 827 + 828 + sharp@0.34.5: 829 + dependencies: 830 + '@img/colour': 1.1.0 831 + detect-libc: 2.1.2 832 + semver: 7.8.5 833 + optionalDependencies: 834 + '@img/sharp-darwin-arm64': 0.34.5 835 + '@img/sharp-darwin-x64': 0.34.5 836 + '@img/sharp-libvips-darwin-arm64': 1.2.4 837 + '@img/sharp-libvips-darwin-x64': 1.2.4 838 + '@img/sharp-libvips-linux-arm': 1.2.4 839 + '@img/sharp-libvips-linux-arm64': 1.2.4 840 + '@img/sharp-libvips-linux-ppc64': 1.2.4 841 + '@img/sharp-libvips-linux-riscv64': 1.2.4 842 + '@img/sharp-libvips-linux-s390x': 1.2.4 843 + '@img/sharp-libvips-linux-x64': 1.2.4 844 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 845 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 846 + '@img/sharp-linux-arm': 0.34.5 847 + '@img/sharp-linux-arm64': 0.34.5 848 + '@img/sharp-linux-ppc64': 0.34.5 849 + '@img/sharp-linux-riscv64': 0.34.5 850 + '@img/sharp-linux-s390x': 0.34.5 851 + '@img/sharp-linux-x64': 0.34.5 852 + '@img/sharp-linuxmusl-arm64': 0.34.5 853 + '@img/sharp-linuxmusl-x64': 0.34.5 854 + '@img/sharp-wasm32': 0.34.5 855 + '@img/sharp-win32-arm64': 0.34.5 856 + '@img/sharp-win32-ia32': 0.34.5 857 + '@img/sharp-win32-x64': 0.34.5 858 + 859 + supports-color@10.2.2: {} 860 + 861 + tslib@2.8.1: 862 + optional: true 863 + 864 + typescript@5.9.3: {} 865 + 866 + undici-types@7.24.6: {} 867 + 868 + undici@7.28.0: {} 869 + 870 + unenv@2.0.0-rc.24: 871 + dependencies: 872 + pathe: 2.0.3 873 + 874 + workerd@1.20260702.1: 875 + optionalDependencies: 876 + '@cloudflare/workerd-darwin-64': 1.20260702.1 877 + '@cloudflare/workerd-darwin-arm64': 1.20260702.1 878 + '@cloudflare/workerd-linux-64': 1.20260702.1 879 + '@cloudflare/workerd-linux-arm64': 1.20260702.1 880 + '@cloudflare/workerd-windows-64': 1.20260702.1 881 + 882 + wrangler@4.107.1(@cloudflare/workers-types@4.20260702.1): 883 + dependencies: 884 + '@cloudflare/kv-asset-handler': 0.5.0 885 + '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260702.1) 886 + blake3-wasm: 2.1.5 887 + esbuild: 0.28.1 888 + miniflare: 4.20260702.0 889 + path-to-regexp: 6.3.0 890 + unenv: 2.0.0-rc.24 891 + workerd: 1.20260702.1 892 + optionalDependencies: 893 + '@cloudflare/workers-types': 4.20260702.1 894 + fsevents: 2.3.3 895 + transitivePeerDependencies: 896 + - bufferutil 897 + - utf-8-validate 898 + 899 + ws@8.21.0: {} 900 + 901 + youch-core@0.3.3: 902 + dependencies: 903 + '@poppinss/exception': 1.2.3 904 + error-stack-parser-es: 1.0.5 905 + 906 + youch@4.1.0-beta.10: 907 + dependencies: 908 + '@poppinss/colors': 4.1.6 909 + '@poppinss/dumper': 0.6.5 910 + '@speed-highlight/core': 1.2.17 911 + cookie: 1.1.1 912 + youch-core: 0.3.3
+4
bobbin/worker/pnpm-workspace.yaml
··· 1 + allowBuilds: 2 + esbuild: true 3 + workerd: true 4 + sharp: false
+20
bobbin/worker/src/index.ts
··· 2 2 3 3 export interface Env { 4 4 BOBBIN: DurableObjectNamespace<BobbinContainer>; 5 + RATE_LIMITER: RateLimit; 5 6 BOBBIN_HYDRANT_URL: string; 6 7 BOBBIN_SLINGSHOT_URL: string; 7 8 BOBBIN_LOG: string; ··· 33 34 if (url.pathname === "/" || url.pathname === "") { 34 35 return new Response(INDEX, { headers: { "Content-Type": "text/plain" } }); 35 36 } 37 + 38 + const ip = request.headers.get("cf-connecting-ip") ?? "unknown"; 39 + const { success } = await env.RATE_LIMITER.limit({ key: ip }); 40 + if (!success) { 41 + return new Response( 42 + JSON.stringify({ 43 + error: "RateLimitExceeded", 44 + message: "too many requests, slow down", 45 + }), 46 + { 47 + status: 429, 48 + headers: { 49 + "Content-Type": "application/json", 50 + "Retry-After": "60", 51 + }, 52 + }, 53 + ); 54 + } 55 + 36 56 const container = env.BOBBIN.getByName("primary"); 37 57 await container.startAndWaitForPorts({ 38 58 startOptions: {
+10
bobbin/worker/wrangler.jsonc
··· 29 29 "new_sqlite_classes": ["BobbinContainer"], 30 30 }, 31 31 ], 32 + "ratelimits": [ 33 + { 34 + "name": "RATE_LIMITER", 35 + "namespace_id": "1001", 36 + "simple": { 37 + "limit": 300, 38 + "period": 60, 39 + }, 40 + }, 41 + ], 32 42 "custom_domains": [ 33 43 { 34 44 "pattern": "api.tangled.org",