A simple BlueSky profile labeler that can be ran on Cloudflare Workers github.com/SocksTheWolf/SimpleBSkyLabeler
cf bsky profile label bluesky cloudflare workers

Very simple hardcoded, but working implementation.

+1769 -15
+5
README.md
··· 1 + # Simple account-only Bluesky labelling service 2 + 3 + Can I create a labeller that only applies labels to accounts and save myself from 4 + the complexity of implementing the `com.atproto.label.subscribeLabels` and 5 + `/xrpc/com.atproto.label.queryLabels` endpoints?
+5
package.json
··· 15 15 "typescript": "^5.5.2", 16 16 "vitest": "2.1.8", 17 17 "wrangler": "^3.60.3" 18 + }, 19 + "dependencies": { 20 + "@atcute/cbor": "^1.0.6", 21 + "@atcute/client": "^2.0.6", 22 + "uint8arrays": "^5.1.0" 18 23 } 19 24 }
+1681
pnpm-lock.yaml
··· 1 + lockfileVersion: '9.0' 2 + 3 + settings: 4 + autoInstallPeers: true 5 + excludeLinksFromLockfile: false 6 + 7 + importers: 8 + 9 + .: 10 + dependencies: 11 + '@atcute/cbor': 12 + specifier: ^1.0.6 13 + version: 1.0.6 14 + '@atcute/client': 15 + specifier: ^2.0.6 16 + version: 2.0.6 17 + uint8arrays: 18 + specifier: ^5.1.0 19 + version: 5.1.0 20 + devDependencies: 21 + '@cloudflare/vitest-pool-workers': 22 + specifier: ^0.5.2 23 + version: 0.5.40(@cloudflare/workers-types@4.20241218.0)(@vitest/runner@2.1.8)(@vitest/snapshot@2.1.8)(vitest@2.1.8(@types/node@22.10.2)) 24 + '@cloudflare/workers-types': 25 + specifier: ^4.20241218.0 26 + version: 4.20241218.0 27 + typescript: 28 + specifier: ^5.5.2 29 + version: 5.7.2 30 + vitest: 31 + specifier: 2.1.8 32 + version: 2.1.8(@types/node@22.10.2) 33 + wrangler: 34 + specifier: ^3.60.3 35 + version: 3.99.0(@cloudflare/workers-types@4.20241218.0) 36 + 37 + packages: 38 + 39 + '@atcute/base32@1.0.1': 40 + resolution: {integrity: sha512-oHnrPXDlkLd4283rz5C4KLnL46/D9mjpFgK17iTPU7OooyNSz+elr8kXN9ReZgzgnjWZHIr8Dp2splEm9hjNhg==} 41 + 42 + '@atcute/cbor@1.0.6': 43 + resolution: {integrity: sha512-ONqrK37COOTkp92gzmxI5a3per9DLPJf60SSlK3Z9vIps7sYEnTq+mL5PLYzbP8l+/V3GVdzpULLphj37eNuXg==} 44 + 45 + '@atcute/cid@1.0.2': 46 + resolution: {integrity: sha512-aRtt4/5pHCpKVvqtuvxWC8Koet9A7mT8t3fWspOJSj6lcP2QyKKpSUx3z0jSZ+M1Kf2UZ25eo6btcM5zmmhK3g==} 47 + 48 + '@atcute/client@2.0.6': 49 + resolution: {integrity: sha512-mhdqEicGUx0s5HTFOLpz91rcLS9j/g63de0nmAqv7blhU3j+xBf4le54qr2YIXNfnReZI7EwLYLX/YIBez4LGA==} 50 + 51 + '@atcute/varint@1.0.1': 52 + resolution: {integrity: sha512-GXWu+CIfpQGSMSOSUskjwU/licxH8WcyX4t11mRKafQIE4Yi3v5GuchMYVOu89YX15tY93QzY/0zMQDCWoke8Q==} 53 + 54 + '@cloudflare/kv-asset-handler@0.3.4': 55 + resolution: {integrity: sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==} 56 + engines: {node: '>=16.13'} 57 + 58 + '@cloudflare/vitest-pool-workers@0.5.40': 59 + resolution: {integrity: sha512-aBHNj55l6G07+ZJuhJsuElDYOEKcGJ4nEdE+X7XmyCRxiw7eRjc1iPQOfEFqprzKQ/2tPEOO8hL0mgRIgt8K3g==} 60 + peerDependencies: 61 + '@vitest/runner': 2.0.x - 2.1.x 62 + '@vitest/snapshot': 2.0.x - 2.1.x 63 + vitest: 2.0.x - 2.1.x 64 + 65 + '@cloudflare/workerd-darwin-64@1.20241218.0': 66 + resolution: {integrity: sha512-8rveQoxtUvlmORKqTWgjv2ycM8uqWox0u9evn3zd2iWKdou5sncFwH517ZRLI3rq9P31ZLmCQBZ0gloFsTeY6w==} 67 + engines: {node: '>=16'} 68 + cpu: [x64] 69 + os: [darwin] 70 + 71 + '@cloudflare/workerd-darwin-arm64@1.20241218.0': 72 + resolution: {integrity: sha512-be59Ad9nmM9lCkhHqmTs/uZ3JVZt8NJ9Z0PY+B0xnc5z6WwmV2lj0RVLtq7xJhQsQJA189zt5rXqDP6J+2mu7Q==} 73 + engines: {node: '>=16'} 74 + cpu: [arm64] 75 + os: [darwin] 76 + 77 + '@cloudflare/workerd-linux-64@1.20241218.0': 78 + resolution: {integrity: sha512-MzpSBcfZXRxrYWxQ4pVDYDrUbkQuM62ssl4ZtHH8J35OAeGsWFAYji6MkS2SpVwVcvacPwJXIF4JSzp4xKImKw==} 79 + engines: {node: '>=16'} 80 + cpu: [x64] 81 + os: [linux] 82 + 83 + '@cloudflare/workerd-linux-arm64@1.20241218.0': 84 + resolution: {integrity: sha512-RIuJjPxpNqvwIs52vQsXeRMttvhIjgg9NLjjFa3jK8Ijnj8c3ZDru9Wqi48lJP07yDFIRr4uDMMqh/y29YQi2A==} 85 + engines: {node: '>=16'} 86 + cpu: [arm64] 87 + os: [linux] 88 + 89 + '@cloudflare/workerd-windows-64@1.20241218.0': 90 + resolution: {integrity: sha512-tO1VjlvK3F6Yb2d1jgEy/QBYl//9Pyv3K0j+lq8Eu7qdfm0IgKwSRgDWLept84/qmNsQfausZ4JdNGxTf9xsxQ==} 91 + engines: {node: '>=16'} 92 + cpu: [x64] 93 + os: [win32] 94 + 95 + '@cloudflare/workers-types@4.20241218.0': 96 + resolution: {integrity: sha512-Y0brjmJHcAZBXOPI7lU5hbiXglQWniA1kQjot2ata+HFimyjPPcz+4QWBRrmWcMPo0OadR2Vmac7WStDLpvz0w==} 97 + 98 + '@cspotcode/source-map-support@0.8.1': 99 + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 100 + engines: {node: '>=12'} 101 + 102 + '@esbuild-plugins/node-globals-polyfill@0.2.3': 103 + resolution: {integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==} 104 + peerDependencies: 105 + esbuild: '*' 106 + 107 + '@esbuild-plugins/node-modules-polyfill@0.2.2': 108 + resolution: {integrity: sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==} 109 + peerDependencies: 110 + esbuild: '*' 111 + 112 + '@esbuild/aix-ppc64@0.21.5': 113 + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} 114 + engines: {node: '>=12'} 115 + cpu: [ppc64] 116 + os: [aix] 117 + 118 + '@esbuild/android-arm64@0.17.19': 119 + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} 120 + engines: {node: '>=12'} 121 + cpu: [arm64] 122 + os: [android] 123 + 124 + '@esbuild/android-arm64@0.21.5': 125 + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} 126 + engines: {node: '>=12'} 127 + cpu: [arm64] 128 + os: [android] 129 + 130 + '@esbuild/android-arm@0.17.19': 131 + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} 132 + engines: {node: '>=12'} 133 + cpu: [arm] 134 + os: [android] 135 + 136 + '@esbuild/android-arm@0.21.5': 137 + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} 138 + engines: {node: '>=12'} 139 + cpu: [arm] 140 + os: [android] 141 + 142 + '@esbuild/android-x64@0.17.19': 143 + resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} 144 + engines: {node: '>=12'} 145 + cpu: [x64] 146 + os: [android] 147 + 148 + '@esbuild/android-x64@0.21.5': 149 + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} 150 + engines: {node: '>=12'} 151 + cpu: [x64] 152 + os: [android] 153 + 154 + '@esbuild/darwin-arm64@0.17.19': 155 + resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} 156 + engines: {node: '>=12'} 157 + cpu: [arm64] 158 + os: [darwin] 159 + 160 + '@esbuild/darwin-arm64@0.21.5': 161 + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} 162 + engines: {node: '>=12'} 163 + cpu: [arm64] 164 + os: [darwin] 165 + 166 + '@esbuild/darwin-x64@0.17.19': 167 + resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} 168 + engines: {node: '>=12'} 169 + cpu: [x64] 170 + os: [darwin] 171 + 172 + '@esbuild/darwin-x64@0.21.5': 173 + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} 174 + engines: {node: '>=12'} 175 + cpu: [x64] 176 + os: [darwin] 177 + 178 + '@esbuild/freebsd-arm64@0.17.19': 179 + resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} 180 + engines: {node: '>=12'} 181 + cpu: [arm64] 182 + os: [freebsd] 183 + 184 + '@esbuild/freebsd-arm64@0.21.5': 185 + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} 186 + engines: {node: '>=12'} 187 + cpu: [arm64] 188 + os: [freebsd] 189 + 190 + '@esbuild/freebsd-x64@0.17.19': 191 + resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} 192 + engines: {node: '>=12'} 193 + cpu: [x64] 194 + os: [freebsd] 195 + 196 + '@esbuild/freebsd-x64@0.21.5': 197 + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} 198 + engines: {node: '>=12'} 199 + cpu: [x64] 200 + os: [freebsd] 201 + 202 + '@esbuild/linux-arm64@0.17.19': 203 + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} 204 + engines: {node: '>=12'} 205 + cpu: [arm64] 206 + os: [linux] 207 + 208 + '@esbuild/linux-arm64@0.21.5': 209 + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} 210 + engines: {node: '>=12'} 211 + cpu: [arm64] 212 + os: [linux] 213 + 214 + '@esbuild/linux-arm@0.17.19': 215 + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} 216 + engines: {node: '>=12'} 217 + cpu: [arm] 218 + os: [linux] 219 + 220 + '@esbuild/linux-arm@0.21.5': 221 + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} 222 + engines: {node: '>=12'} 223 + cpu: [arm] 224 + os: [linux] 225 + 226 + '@esbuild/linux-ia32@0.17.19': 227 + resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} 228 + engines: {node: '>=12'} 229 + cpu: [ia32] 230 + os: [linux] 231 + 232 + '@esbuild/linux-ia32@0.21.5': 233 + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} 234 + engines: {node: '>=12'} 235 + cpu: [ia32] 236 + os: [linux] 237 + 238 + '@esbuild/linux-loong64@0.17.19': 239 + resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} 240 + engines: {node: '>=12'} 241 + cpu: [loong64] 242 + os: [linux] 243 + 244 + '@esbuild/linux-loong64@0.21.5': 245 + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} 246 + engines: {node: '>=12'} 247 + cpu: [loong64] 248 + os: [linux] 249 + 250 + '@esbuild/linux-mips64el@0.17.19': 251 + resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} 252 + engines: {node: '>=12'} 253 + cpu: [mips64el] 254 + os: [linux] 255 + 256 + '@esbuild/linux-mips64el@0.21.5': 257 + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} 258 + engines: {node: '>=12'} 259 + cpu: [mips64el] 260 + os: [linux] 261 + 262 + '@esbuild/linux-ppc64@0.17.19': 263 + resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} 264 + engines: {node: '>=12'} 265 + cpu: [ppc64] 266 + os: [linux] 267 + 268 + '@esbuild/linux-ppc64@0.21.5': 269 + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} 270 + engines: {node: '>=12'} 271 + cpu: [ppc64] 272 + os: [linux] 273 + 274 + '@esbuild/linux-riscv64@0.17.19': 275 + resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} 276 + engines: {node: '>=12'} 277 + cpu: [riscv64] 278 + os: [linux] 279 + 280 + '@esbuild/linux-riscv64@0.21.5': 281 + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} 282 + engines: {node: '>=12'} 283 + cpu: [riscv64] 284 + os: [linux] 285 + 286 + '@esbuild/linux-s390x@0.17.19': 287 + resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} 288 + engines: {node: '>=12'} 289 + cpu: [s390x] 290 + os: [linux] 291 + 292 + '@esbuild/linux-s390x@0.21.5': 293 + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} 294 + engines: {node: '>=12'} 295 + cpu: [s390x] 296 + os: [linux] 297 + 298 + '@esbuild/linux-x64@0.17.19': 299 + resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} 300 + engines: {node: '>=12'} 301 + cpu: [x64] 302 + os: [linux] 303 + 304 + '@esbuild/linux-x64@0.21.5': 305 + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} 306 + engines: {node: '>=12'} 307 + cpu: [x64] 308 + os: [linux] 309 + 310 + '@esbuild/netbsd-x64@0.17.19': 311 + resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} 312 + engines: {node: '>=12'} 313 + cpu: [x64] 314 + os: [netbsd] 315 + 316 + '@esbuild/netbsd-x64@0.21.5': 317 + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} 318 + engines: {node: '>=12'} 319 + cpu: [x64] 320 + os: [netbsd] 321 + 322 + '@esbuild/openbsd-x64@0.17.19': 323 + resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} 324 + engines: {node: '>=12'} 325 + cpu: [x64] 326 + os: [openbsd] 327 + 328 + '@esbuild/openbsd-x64@0.21.5': 329 + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} 330 + engines: {node: '>=12'} 331 + cpu: [x64] 332 + os: [openbsd] 333 + 334 + '@esbuild/sunos-x64@0.17.19': 335 + resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} 336 + engines: {node: '>=12'} 337 + cpu: [x64] 338 + os: [sunos] 339 + 340 + '@esbuild/sunos-x64@0.21.5': 341 + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} 342 + engines: {node: '>=12'} 343 + cpu: [x64] 344 + os: [sunos] 345 + 346 + '@esbuild/win32-arm64@0.17.19': 347 + resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} 348 + engines: {node: '>=12'} 349 + cpu: [arm64] 350 + os: [win32] 351 + 352 + '@esbuild/win32-arm64@0.21.5': 353 + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} 354 + engines: {node: '>=12'} 355 + cpu: [arm64] 356 + os: [win32] 357 + 358 + '@esbuild/win32-ia32@0.17.19': 359 + resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} 360 + engines: {node: '>=12'} 361 + cpu: [ia32] 362 + os: [win32] 363 + 364 + '@esbuild/win32-ia32@0.21.5': 365 + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} 366 + engines: {node: '>=12'} 367 + cpu: [ia32] 368 + os: [win32] 369 + 370 + '@esbuild/win32-x64@0.17.19': 371 + resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} 372 + engines: {node: '>=12'} 373 + cpu: [x64] 374 + os: [win32] 375 + 376 + '@esbuild/win32-x64@0.21.5': 377 + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} 378 + engines: {node: '>=12'} 379 + cpu: [x64] 380 + os: [win32] 381 + 382 + '@fastify/busboy@2.1.1': 383 + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} 384 + engines: {node: '>=14'} 385 + 386 + '@jridgewell/resolve-uri@3.1.2': 387 + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 388 + engines: {node: '>=6.0.0'} 389 + 390 + '@jridgewell/sourcemap-codec@1.5.0': 391 + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 392 + 393 + '@jridgewell/trace-mapping@0.3.9': 394 + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 395 + 396 + '@rollup/rollup-android-arm-eabi@4.29.1': 397 + resolution: {integrity: sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==} 398 + cpu: [arm] 399 + os: [android] 400 + 401 + '@rollup/rollup-android-arm64@4.29.1': 402 + resolution: {integrity: sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==} 403 + cpu: [arm64] 404 + os: [android] 405 + 406 + '@rollup/rollup-darwin-arm64@4.29.1': 407 + resolution: {integrity: sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==} 408 + cpu: [arm64] 409 + os: [darwin] 410 + 411 + '@rollup/rollup-darwin-x64@4.29.1': 412 + resolution: {integrity: sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==} 413 + cpu: [x64] 414 + os: [darwin] 415 + 416 + '@rollup/rollup-freebsd-arm64@4.29.1': 417 + resolution: {integrity: sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==} 418 + cpu: [arm64] 419 + os: [freebsd] 420 + 421 + '@rollup/rollup-freebsd-x64@4.29.1': 422 + resolution: {integrity: sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==} 423 + cpu: [x64] 424 + os: [freebsd] 425 + 426 + '@rollup/rollup-linux-arm-gnueabihf@4.29.1': 427 + resolution: {integrity: sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==} 428 + cpu: [arm] 429 + os: [linux] 430 + 431 + '@rollup/rollup-linux-arm-musleabihf@4.29.1': 432 + resolution: {integrity: sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==} 433 + cpu: [arm] 434 + os: [linux] 435 + 436 + '@rollup/rollup-linux-arm64-gnu@4.29.1': 437 + resolution: {integrity: sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==} 438 + cpu: [arm64] 439 + os: [linux] 440 + 441 + '@rollup/rollup-linux-arm64-musl@4.29.1': 442 + resolution: {integrity: sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==} 443 + cpu: [arm64] 444 + os: [linux] 445 + 446 + '@rollup/rollup-linux-loongarch64-gnu@4.29.1': 447 + resolution: {integrity: sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==} 448 + cpu: [loong64] 449 + os: [linux] 450 + 451 + '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': 452 + resolution: {integrity: sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==} 453 + cpu: [ppc64] 454 + os: [linux] 455 + 456 + '@rollup/rollup-linux-riscv64-gnu@4.29.1': 457 + resolution: {integrity: sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==} 458 + cpu: [riscv64] 459 + os: [linux] 460 + 461 + '@rollup/rollup-linux-s390x-gnu@4.29.1': 462 + resolution: {integrity: sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==} 463 + cpu: [s390x] 464 + os: [linux] 465 + 466 + '@rollup/rollup-linux-x64-gnu@4.29.1': 467 + resolution: {integrity: sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==} 468 + cpu: [x64] 469 + os: [linux] 470 + 471 + '@rollup/rollup-linux-x64-musl@4.29.1': 472 + resolution: {integrity: sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==} 473 + cpu: [x64] 474 + os: [linux] 475 + 476 + '@rollup/rollup-win32-arm64-msvc@4.29.1': 477 + resolution: {integrity: sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==} 478 + cpu: [arm64] 479 + os: [win32] 480 + 481 + '@rollup/rollup-win32-ia32-msvc@4.29.1': 482 + resolution: {integrity: sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==} 483 + cpu: [ia32] 484 + os: [win32] 485 + 486 + '@rollup/rollup-win32-x64-msvc@4.29.1': 487 + resolution: {integrity: sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==} 488 + cpu: [x64] 489 + os: [win32] 490 + 491 + '@types/estree@1.0.6': 492 + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 493 + 494 + '@types/node-forge@1.3.11': 495 + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} 496 + 497 + '@types/node@22.10.2': 498 + resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} 499 + 500 + '@vitest/expect@2.1.8': 501 + resolution: {integrity: sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==} 502 + 503 + '@vitest/mocker@2.1.8': 504 + resolution: {integrity: sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==} 505 + peerDependencies: 506 + msw: ^2.4.9 507 + vite: ^5.0.0 508 + peerDependenciesMeta: 509 + msw: 510 + optional: true 511 + vite: 512 + optional: true 513 + 514 + '@vitest/pretty-format@2.1.8': 515 + resolution: {integrity: sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==} 516 + 517 + '@vitest/runner@2.1.8': 518 + resolution: {integrity: sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==} 519 + 520 + '@vitest/snapshot@2.1.8': 521 + resolution: {integrity: sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==} 522 + 523 + '@vitest/spy@2.1.8': 524 + resolution: {integrity: sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==} 525 + 526 + '@vitest/utils@2.1.8': 527 + resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==} 528 + 529 + acorn-walk@8.3.4: 530 + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} 531 + engines: {node: '>=0.4.0'} 532 + 533 + acorn@8.14.0: 534 + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} 535 + engines: {node: '>=0.4.0'} 536 + hasBin: true 537 + 538 + as-table@1.0.55: 539 + resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} 540 + 541 + assertion-error@2.0.1: 542 + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 543 + engines: {node: '>=12'} 544 + 545 + birpc@0.2.14: 546 + resolution: {integrity: sha512-37FHE8rqsYM5JEKCnXFyHpBCzvgHEExwVVTq+nUmloInU7l8ezD1TpOhKpS8oe1DTYFqEK27rFZVKG43oTqXRA==} 547 + 548 + blake3-wasm@2.1.5: 549 + resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} 550 + 551 + cac@6.7.14: 552 + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 553 + engines: {node: '>=8'} 554 + 555 + capnp-ts@0.7.0: 556 + resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} 557 + 558 + chai@5.1.2: 559 + resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} 560 + engines: {node: '>=12'} 561 + 562 + check-error@2.1.1: 563 + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 564 + engines: {node: '>= 16'} 565 + 566 + chokidar@4.0.3: 567 + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 568 + engines: {node: '>= 14.16.0'} 569 + 570 + cjs-module-lexer@1.4.1: 571 + resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==} 572 + 573 + cookie@0.7.2: 574 + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} 575 + engines: {node: '>= 0.6'} 576 + 577 + data-uri-to-buffer@2.0.2: 578 + resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} 579 + 580 + date-fns@4.1.0: 581 + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} 582 + 583 + debug@4.4.0: 584 + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 585 + engines: {node: '>=6.0'} 586 + peerDependencies: 587 + supports-color: '*' 588 + peerDependenciesMeta: 589 + supports-color: 590 + optional: true 591 + 592 + deep-eql@5.0.2: 593 + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 594 + engines: {node: '>=6'} 595 + 596 + defu@6.1.4: 597 + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} 598 + 599 + devalue@4.3.3: 600 + resolution: {integrity: sha512-UH8EL6H2ifcY8TbD2QsxwCC/pr5xSwPvv85LrLXVihmHVC3T3YqTCIwnR5ak0yO1KYqlxrPVOA/JVZJYPy2ATg==} 601 + 602 + es-module-lexer@1.5.4: 603 + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} 604 + 605 + esbuild@0.17.19: 606 + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} 607 + engines: {node: '>=12'} 608 + hasBin: true 609 + 610 + esbuild@0.21.5: 611 + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} 612 + engines: {node: '>=12'} 613 + hasBin: true 614 + 615 + escape-string-regexp@4.0.0: 616 + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 617 + engines: {node: '>=10'} 618 + 619 + estree-walker@0.6.1: 620 + resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} 621 + 622 + estree-walker@3.0.3: 623 + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 624 + 625 + exit-hook@2.2.1: 626 + resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} 627 + engines: {node: '>=6'} 628 + 629 + expect-type@1.1.0: 630 + resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} 631 + engines: {node: '>=12.0.0'} 632 + 633 + fsevents@2.3.3: 634 + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 635 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 636 + os: [darwin] 637 + 638 + function-bind@1.1.2: 639 + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 640 + 641 + get-source@2.0.12: 642 + resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} 643 + 644 + glob-to-regexp@0.4.1: 645 + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} 646 + 647 + hasown@2.0.2: 648 + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 649 + engines: {node: '>= 0.4'} 650 + 651 + is-core-module@2.16.0: 652 + resolution: {integrity: sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==} 653 + engines: {node: '>= 0.4'} 654 + 655 + itty-time@1.0.6: 656 + resolution: {integrity: sha512-+P8IZaLLBtFv8hCkIjcymZOp4UJ+xW6bSlQsXGqrkmJh7vSiMFSlNne0mCYagEE0N7HDNR5jJBRxwN0oYv61Rw==} 657 + 658 + loupe@3.1.2: 659 + resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} 660 + 661 + magic-string@0.25.9: 662 + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} 663 + 664 + magic-string@0.30.17: 665 + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 666 + 667 + mime@3.0.0: 668 + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} 669 + engines: {node: '>=10.0.0'} 670 + hasBin: true 671 + 672 + miniflare@3.20241218.0: 673 + resolution: {integrity: sha512-spYFDArH0wd+wJSTrzBrWrXJrbyJhRMJa35mat947y1jYhVV8I5V8vnD3LwjfpLr0SaEilojz1OIW7ekmnRe+w==} 674 + engines: {node: '>=16.13'} 675 + hasBin: true 676 + 677 + ms@2.1.3: 678 + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 679 + 680 + multiformats@13.3.1: 681 + resolution: {integrity: sha512-QxowxTNwJ3r5RMctoGA5p13w5RbRT2QDkoM+yFlqfLiioBp78nhDjnRLvmSBI9+KAqN4VdgOVWM9c0CHd86m3g==} 682 + 683 + mustache@4.2.0: 684 + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} 685 + hasBin: true 686 + 687 + nanoid@3.3.8: 688 + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} 689 + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 690 + hasBin: true 691 + 692 + node-forge@1.3.1: 693 + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} 694 + engines: {node: '>= 6.13.0'} 695 + 696 + ohash@1.1.4: 697 + resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==} 698 + 699 + path-parse@1.0.7: 700 + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 701 + 702 + path-to-regexp@6.3.0: 703 + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} 704 + 705 + pathe@1.1.2: 706 + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} 707 + 708 + pathval@2.0.0: 709 + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} 710 + engines: {node: '>= 14.16'} 711 + 712 + picocolors@1.1.1: 713 + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 714 + 715 + postcss@8.4.49: 716 + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} 717 + engines: {node: ^10 || ^12 || >=14} 718 + 719 + printable-characters@1.0.42: 720 + resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} 721 + 722 + readdirp@4.0.2: 723 + resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} 724 + engines: {node: '>= 14.16.0'} 725 + 726 + resolve@1.22.10: 727 + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 728 + engines: {node: '>= 0.4'} 729 + hasBin: true 730 + 731 + rollup-plugin-inject@3.0.2: 732 + resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==} 733 + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject. 734 + 735 + rollup-plugin-node-polyfills@0.2.1: 736 + resolution: {integrity: sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==} 737 + 738 + rollup-pluginutils@2.8.2: 739 + resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} 740 + 741 + rollup@4.29.1: 742 + resolution: {integrity: sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==} 743 + engines: {node: '>=18.0.0', npm: '>=8.0.0'} 744 + hasBin: true 745 + 746 + selfsigned@2.4.1: 747 + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} 748 + engines: {node: '>=10'} 749 + 750 + semver@7.6.3: 751 + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 752 + engines: {node: '>=10'} 753 + hasBin: true 754 + 755 + siginfo@2.0.0: 756 + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 757 + 758 + source-map-js@1.2.1: 759 + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 760 + engines: {node: '>=0.10.0'} 761 + 762 + source-map@0.6.1: 763 + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 764 + engines: {node: '>=0.10.0'} 765 + 766 + sourcemap-codec@1.4.8: 767 + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 768 + deprecated: Please use @jridgewell/sourcemap-codec instead 769 + 770 + stackback@0.0.2: 771 + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 772 + 773 + stacktracey@2.1.8: 774 + resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} 775 + 776 + std-env@3.8.0: 777 + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} 778 + 779 + stoppable@1.1.0: 780 + resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} 781 + engines: {node: '>=4', npm: '>=6'} 782 + 783 + supports-preserve-symlinks-flag@1.0.0: 784 + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 785 + engines: {node: '>= 0.4'} 786 + 787 + tinybench@2.9.0: 788 + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 789 + 790 + tinyexec@0.3.1: 791 + resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} 792 + 793 + tinypool@1.0.2: 794 + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} 795 + engines: {node: ^18.0.0 || >=20.0.0} 796 + 797 + tinyrainbow@1.2.0: 798 + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} 799 + engines: {node: '>=14.0.0'} 800 + 801 + tinyspy@3.0.2: 802 + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} 803 + engines: {node: '>=14.0.0'} 804 + 805 + tslib@2.8.1: 806 + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 807 + 808 + typescript@5.7.2: 809 + resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} 810 + engines: {node: '>=14.17'} 811 + hasBin: true 812 + 813 + ufo@1.5.4: 814 + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} 815 + 816 + uint8arrays@5.1.0: 817 + resolution: {integrity: sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==} 818 + 819 + undici-types@6.20.0: 820 + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} 821 + 822 + undici@5.28.4: 823 + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} 824 + engines: {node: '>=14.0'} 825 + 826 + unenv-nightly@2.0.0-20241204-140205-a5d5190: 827 + resolution: {integrity: sha512-jpmAytLeiiW01pl5bhVn9wYJ4vtiLdhGe10oXlJBuQEX8mxjxO8BlEXGHU4vr4yEikjFP1wsomTHt/CLU8kUwg==} 828 + 829 + vite-node@2.1.8: 830 + resolution: {integrity: sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==} 831 + engines: {node: ^18.0.0 || >=20.0.0} 832 + hasBin: true 833 + 834 + vite@5.4.11: 835 + resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} 836 + engines: {node: ^18.0.0 || >=20.0.0} 837 + hasBin: true 838 + peerDependencies: 839 + '@types/node': ^18.0.0 || >=20.0.0 840 + less: '*' 841 + lightningcss: ^1.21.0 842 + sass: '*' 843 + sass-embedded: '*' 844 + stylus: '*' 845 + sugarss: '*' 846 + terser: ^5.4.0 847 + peerDependenciesMeta: 848 + '@types/node': 849 + optional: true 850 + less: 851 + optional: true 852 + lightningcss: 853 + optional: true 854 + sass: 855 + optional: true 856 + sass-embedded: 857 + optional: true 858 + stylus: 859 + optional: true 860 + sugarss: 861 + optional: true 862 + terser: 863 + optional: true 864 + 865 + vitest@2.1.8: 866 + resolution: {integrity: sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==} 867 + engines: {node: ^18.0.0 || >=20.0.0} 868 + hasBin: true 869 + peerDependencies: 870 + '@edge-runtime/vm': '*' 871 + '@types/node': ^18.0.0 || >=20.0.0 872 + '@vitest/browser': 2.1.8 873 + '@vitest/ui': 2.1.8 874 + happy-dom: '*' 875 + jsdom: '*' 876 + peerDependenciesMeta: 877 + '@edge-runtime/vm': 878 + optional: true 879 + '@types/node': 880 + optional: true 881 + '@vitest/browser': 882 + optional: true 883 + '@vitest/ui': 884 + optional: true 885 + happy-dom: 886 + optional: true 887 + jsdom: 888 + optional: true 889 + 890 + why-is-node-running@2.3.0: 891 + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 892 + engines: {node: '>=8'} 893 + hasBin: true 894 + 895 + workerd@1.20241218.0: 896 + resolution: {integrity: sha512-7Z3D4vOVChMz9mWDffE299oQxUWm/pbkeAWx1btVamPcAK/2IuoNBhwflWo3jyuKuxvYuFAdIucgYxc8ICqXiA==} 897 + engines: {node: '>=16'} 898 + hasBin: true 899 + 900 + wrangler@3.99.0: 901 + resolution: {integrity: sha512-k0x4rT3G/QCbxcoZY7CHRVlAIS8WMmKdga6lf4d2c3gXFqssh44vwlTDuARA9QANBxKJTcA7JPTJRfUDhd9QBA==} 902 + engines: {node: '>=16.17.0'} 903 + hasBin: true 904 + peerDependencies: 905 + '@cloudflare/workers-types': ^4.20241218.0 906 + peerDependenciesMeta: 907 + '@cloudflare/workers-types': 908 + optional: true 909 + 910 + ws@8.18.0: 911 + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} 912 + engines: {node: '>=10.0.0'} 913 + peerDependencies: 914 + bufferutil: ^4.0.1 915 + utf-8-validate: '>=5.0.2' 916 + peerDependenciesMeta: 917 + bufferutil: 918 + optional: true 919 + utf-8-validate: 920 + optional: true 921 + 922 + xxhash-wasm@1.1.0: 923 + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} 924 + 925 + youch@3.3.4: 926 + resolution: {integrity: sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==} 927 + 928 + zod@3.24.1: 929 + resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} 930 + 931 + snapshots: 932 + 933 + '@atcute/base32@1.0.1': {} 934 + 935 + '@atcute/cbor@1.0.6': 936 + dependencies: 937 + '@atcute/base32': 1.0.1 938 + '@atcute/cid': 1.0.2 939 + 940 + '@atcute/cid@1.0.2': 941 + dependencies: 942 + '@atcute/base32': 1.0.1 943 + '@atcute/varint': 1.0.1 944 + 945 + '@atcute/client@2.0.6': {} 946 + 947 + '@atcute/varint@1.0.1': {} 948 + 949 + '@cloudflare/kv-asset-handler@0.3.4': 950 + dependencies: 951 + mime: 3.0.0 952 + 953 + '@cloudflare/vitest-pool-workers@0.5.40(@cloudflare/workers-types@4.20241218.0)(@vitest/runner@2.1.8)(@vitest/snapshot@2.1.8)(vitest@2.1.8(@types/node@22.10.2))': 954 + dependencies: 955 + '@vitest/runner': 2.1.8 956 + '@vitest/snapshot': 2.1.8 957 + birpc: 0.2.14 958 + cjs-module-lexer: 1.4.1 959 + devalue: 4.3.3 960 + esbuild: 0.17.19 961 + miniflare: 3.20241218.0 962 + semver: 7.6.3 963 + vitest: 2.1.8(@types/node@22.10.2) 964 + wrangler: 3.99.0(@cloudflare/workers-types@4.20241218.0) 965 + zod: 3.24.1 966 + transitivePeerDependencies: 967 + - '@cloudflare/workers-types' 968 + - bufferutil 969 + - supports-color 970 + - utf-8-validate 971 + 972 + '@cloudflare/workerd-darwin-64@1.20241218.0': 973 + optional: true 974 + 975 + '@cloudflare/workerd-darwin-arm64@1.20241218.0': 976 + optional: true 977 + 978 + '@cloudflare/workerd-linux-64@1.20241218.0': 979 + optional: true 980 + 981 + '@cloudflare/workerd-linux-arm64@1.20241218.0': 982 + optional: true 983 + 984 + '@cloudflare/workerd-windows-64@1.20241218.0': 985 + optional: true 986 + 987 + '@cloudflare/workers-types@4.20241218.0': {} 988 + 989 + '@cspotcode/source-map-support@0.8.1': 990 + dependencies: 991 + '@jridgewell/trace-mapping': 0.3.9 992 + 993 + '@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.17.19)': 994 + dependencies: 995 + esbuild: 0.17.19 996 + 997 + '@esbuild-plugins/node-modules-polyfill@0.2.2(esbuild@0.17.19)': 998 + dependencies: 999 + esbuild: 0.17.19 1000 + escape-string-regexp: 4.0.0 1001 + rollup-plugin-node-polyfills: 0.2.1 1002 + 1003 + '@esbuild/aix-ppc64@0.21.5': 1004 + optional: true 1005 + 1006 + '@esbuild/android-arm64@0.17.19': 1007 + optional: true 1008 + 1009 + '@esbuild/android-arm64@0.21.5': 1010 + optional: true 1011 + 1012 + '@esbuild/android-arm@0.17.19': 1013 + optional: true 1014 + 1015 + '@esbuild/android-arm@0.21.5': 1016 + optional: true 1017 + 1018 + '@esbuild/android-x64@0.17.19': 1019 + optional: true 1020 + 1021 + '@esbuild/android-x64@0.21.5': 1022 + optional: true 1023 + 1024 + '@esbuild/darwin-arm64@0.17.19': 1025 + optional: true 1026 + 1027 + '@esbuild/darwin-arm64@0.21.5': 1028 + optional: true 1029 + 1030 + '@esbuild/darwin-x64@0.17.19': 1031 + optional: true 1032 + 1033 + '@esbuild/darwin-x64@0.21.5': 1034 + optional: true 1035 + 1036 + '@esbuild/freebsd-arm64@0.17.19': 1037 + optional: true 1038 + 1039 + '@esbuild/freebsd-arm64@0.21.5': 1040 + optional: true 1041 + 1042 + '@esbuild/freebsd-x64@0.17.19': 1043 + optional: true 1044 + 1045 + '@esbuild/freebsd-x64@0.21.5': 1046 + optional: true 1047 + 1048 + '@esbuild/linux-arm64@0.17.19': 1049 + optional: true 1050 + 1051 + '@esbuild/linux-arm64@0.21.5': 1052 + optional: true 1053 + 1054 + '@esbuild/linux-arm@0.17.19': 1055 + optional: true 1056 + 1057 + '@esbuild/linux-arm@0.21.5': 1058 + optional: true 1059 + 1060 + '@esbuild/linux-ia32@0.17.19': 1061 + optional: true 1062 + 1063 + '@esbuild/linux-ia32@0.21.5': 1064 + optional: true 1065 + 1066 + '@esbuild/linux-loong64@0.17.19': 1067 + optional: true 1068 + 1069 + '@esbuild/linux-loong64@0.21.5': 1070 + optional: true 1071 + 1072 + '@esbuild/linux-mips64el@0.17.19': 1073 + optional: true 1074 + 1075 + '@esbuild/linux-mips64el@0.21.5': 1076 + optional: true 1077 + 1078 + '@esbuild/linux-ppc64@0.17.19': 1079 + optional: true 1080 + 1081 + '@esbuild/linux-ppc64@0.21.5': 1082 + optional: true 1083 + 1084 + '@esbuild/linux-riscv64@0.17.19': 1085 + optional: true 1086 + 1087 + '@esbuild/linux-riscv64@0.21.5': 1088 + optional: true 1089 + 1090 + '@esbuild/linux-s390x@0.17.19': 1091 + optional: true 1092 + 1093 + '@esbuild/linux-s390x@0.21.5': 1094 + optional: true 1095 + 1096 + '@esbuild/linux-x64@0.17.19': 1097 + optional: true 1098 + 1099 + '@esbuild/linux-x64@0.21.5': 1100 + optional: true 1101 + 1102 + '@esbuild/netbsd-x64@0.17.19': 1103 + optional: true 1104 + 1105 + '@esbuild/netbsd-x64@0.21.5': 1106 + optional: true 1107 + 1108 + '@esbuild/openbsd-x64@0.17.19': 1109 + optional: true 1110 + 1111 + '@esbuild/openbsd-x64@0.21.5': 1112 + optional: true 1113 + 1114 + '@esbuild/sunos-x64@0.17.19': 1115 + optional: true 1116 + 1117 + '@esbuild/sunos-x64@0.21.5': 1118 + optional: true 1119 + 1120 + '@esbuild/win32-arm64@0.17.19': 1121 + optional: true 1122 + 1123 + '@esbuild/win32-arm64@0.21.5': 1124 + optional: true 1125 + 1126 + '@esbuild/win32-ia32@0.17.19': 1127 + optional: true 1128 + 1129 + '@esbuild/win32-ia32@0.21.5': 1130 + optional: true 1131 + 1132 + '@esbuild/win32-x64@0.17.19': 1133 + optional: true 1134 + 1135 + '@esbuild/win32-x64@0.21.5': 1136 + optional: true 1137 + 1138 + '@fastify/busboy@2.1.1': {} 1139 + 1140 + '@jridgewell/resolve-uri@3.1.2': {} 1141 + 1142 + '@jridgewell/sourcemap-codec@1.5.0': {} 1143 + 1144 + '@jridgewell/trace-mapping@0.3.9': 1145 + dependencies: 1146 + '@jridgewell/resolve-uri': 3.1.2 1147 + '@jridgewell/sourcemap-codec': 1.5.0 1148 + 1149 + '@rollup/rollup-android-arm-eabi@4.29.1': 1150 + optional: true 1151 + 1152 + '@rollup/rollup-android-arm64@4.29.1': 1153 + optional: true 1154 + 1155 + '@rollup/rollup-darwin-arm64@4.29.1': 1156 + optional: true 1157 + 1158 + '@rollup/rollup-darwin-x64@4.29.1': 1159 + optional: true 1160 + 1161 + '@rollup/rollup-freebsd-arm64@4.29.1': 1162 + optional: true 1163 + 1164 + '@rollup/rollup-freebsd-x64@4.29.1': 1165 + optional: true 1166 + 1167 + '@rollup/rollup-linux-arm-gnueabihf@4.29.1': 1168 + optional: true 1169 + 1170 + '@rollup/rollup-linux-arm-musleabihf@4.29.1': 1171 + optional: true 1172 + 1173 + '@rollup/rollup-linux-arm64-gnu@4.29.1': 1174 + optional: true 1175 + 1176 + '@rollup/rollup-linux-arm64-musl@4.29.1': 1177 + optional: true 1178 + 1179 + '@rollup/rollup-linux-loongarch64-gnu@4.29.1': 1180 + optional: true 1181 + 1182 + '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': 1183 + optional: true 1184 + 1185 + '@rollup/rollup-linux-riscv64-gnu@4.29.1': 1186 + optional: true 1187 + 1188 + '@rollup/rollup-linux-s390x-gnu@4.29.1': 1189 + optional: true 1190 + 1191 + '@rollup/rollup-linux-x64-gnu@4.29.1': 1192 + optional: true 1193 + 1194 + '@rollup/rollup-linux-x64-musl@4.29.1': 1195 + optional: true 1196 + 1197 + '@rollup/rollup-win32-arm64-msvc@4.29.1': 1198 + optional: true 1199 + 1200 + '@rollup/rollup-win32-ia32-msvc@4.29.1': 1201 + optional: true 1202 + 1203 + '@rollup/rollup-win32-x64-msvc@4.29.1': 1204 + optional: true 1205 + 1206 + '@types/estree@1.0.6': {} 1207 + 1208 + '@types/node-forge@1.3.11': 1209 + dependencies: 1210 + '@types/node': 22.10.2 1211 + 1212 + '@types/node@22.10.2': 1213 + dependencies: 1214 + undici-types: 6.20.0 1215 + 1216 + '@vitest/expect@2.1.8': 1217 + dependencies: 1218 + '@vitest/spy': 2.1.8 1219 + '@vitest/utils': 2.1.8 1220 + chai: 5.1.2 1221 + tinyrainbow: 1.2.0 1222 + 1223 + '@vitest/mocker@2.1.8(vite@5.4.11(@types/node@22.10.2))': 1224 + dependencies: 1225 + '@vitest/spy': 2.1.8 1226 + estree-walker: 3.0.3 1227 + magic-string: 0.30.17 1228 + optionalDependencies: 1229 + vite: 5.4.11(@types/node@22.10.2) 1230 + 1231 + '@vitest/pretty-format@2.1.8': 1232 + dependencies: 1233 + tinyrainbow: 1.2.0 1234 + 1235 + '@vitest/runner@2.1.8': 1236 + dependencies: 1237 + '@vitest/utils': 2.1.8 1238 + pathe: 1.1.2 1239 + 1240 + '@vitest/snapshot@2.1.8': 1241 + dependencies: 1242 + '@vitest/pretty-format': 2.1.8 1243 + magic-string: 0.30.17 1244 + pathe: 1.1.2 1245 + 1246 + '@vitest/spy@2.1.8': 1247 + dependencies: 1248 + tinyspy: 3.0.2 1249 + 1250 + '@vitest/utils@2.1.8': 1251 + dependencies: 1252 + '@vitest/pretty-format': 2.1.8 1253 + loupe: 3.1.2 1254 + tinyrainbow: 1.2.0 1255 + 1256 + acorn-walk@8.3.4: 1257 + dependencies: 1258 + acorn: 8.14.0 1259 + 1260 + acorn@8.14.0: {} 1261 + 1262 + as-table@1.0.55: 1263 + dependencies: 1264 + printable-characters: 1.0.42 1265 + 1266 + assertion-error@2.0.1: {} 1267 + 1268 + birpc@0.2.14: {} 1269 + 1270 + blake3-wasm@2.1.5: {} 1271 + 1272 + cac@6.7.14: {} 1273 + 1274 + capnp-ts@0.7.0: 1275 + dependencies: 1276 + debug: 4.4.0 1277 + tslib: 2.8.1 1278 + transitivePeerDependencies: 1279 + - supports-color 1280 + 1281 + chai@5.1.2: 1282 + dependencies: 1283 + assertion-error: 2.0.1 1284 + check-error: 2.1.1 1285 + deep-eql: 5.0.2 1286 + loupe: 3.1.2 1287 + pathval: 2.0.0 1288 + 1289 + check-error@2.1.1: {} 1290 + 1291 + chokidar@4.0.3: 1292 + dependencies: 1293 + readdirp: 4.0.2 1294 + 1295 + cjs-module-lexer@1.4.1: {} 1296 + 1297 + cookie@0.7.2: {} 1298 + 1299 + data-uri-to-buffer@2.0.2: {} 1300 + 1301 + date-fns@4.1.0: {} 1302 + 1303 + debug@4.4.0: 1304 + dependencies: 1305 + ms: 2.1.3 1306 + 1307 + deep-eql@5.0.2: {} 1308 + 1309 + defu@6.1.4: {} 1310 + 1311 + devalue@4.3.3: {} 1312 + 1313 + es-module-lexer@1.5.4: {} 1314 + 1315 + esbuild@0.17.19: 1316 + optionalDependencies: 1317 + '@esbuild/android-arm': 0.17.19 1318 + '@esbuild/android-arm64': 0.17.19 1319 + '@esbuild/android-x64': 0.17.19 1320 + '@esbuild/darwin-arm64': 0.17.19 1321 + '@esbuild/darwin-x64': 0.17.19 1322 + '@esbuild/freebsd-arm64': 0.17.19 1323 + '@esbuild/freebsd-x64': 0.17.19 1324 + '@esbuild/linux-arm': 0.17.19 1325 + '@esbuild/linux-arm64': 0.17.19 1326 + '@esbuild/linux-ia32': 0.17.19 1327 + '@esbuild/linux-loong64': 0.17.19 1328 + '@esbuild/linux-mips64el': 0.17.19 1329 + '@esbuild/linux-ppc64': 0.17.19 1330 + '@esbuild/linux-riscv64': 0.17.19 1331 + '@esbuild/linux-s390x': 0.17.19 1332 + '@esbuild/linux-x64': 0.17.19 1333 + '@esbuild/netbsd-x64': 0.17.19 1334 + '@esbuild/openbsd-x64': 0.17.19 1335 + '@esbuild/sunos-x64': 0.17.19 1336 + '@esbuild/win32-arm64': 0.17.19 1337 + '@esbuild/win32-ia32': 0.17.19 1338 + '@esbuild/win32-x64': 0.17.19 1339 + 1340 + esbuild@0.21.5: 1341 + optionalDependencies: 1342 + '@esbuild/aix-ppc64': 0.21.5 1343 + '@esbuild/android-arm': 0.21.5 1344 + '@esbuild/android-arm64': 0.21.5 1345 + '@esbuild/android-x64': 0.21.5 1346 + '@esbuild/darwin-arm64': 0.21.5 1347 + '@esbuild/darwin-x64': 0.21.5 1348 + '@esbuild/freebsd-arm64': 0.21.5 1349 + '@esbuild/freebsd-x64': 0.21.5 1350 + '@esbuild/linux-arm': 0.21.5 1351 + '@esbuild/linux-arm64': 0.21.5 1352 + '@esbuild/linux-ia32': 0.21.5 1353 + '@esbuild/linux-loong64': 0.21.5 1354 + '@esbuild/linux-mips64el': 0.21.5 1355 + '@esbuild/linux-ppc64': 0.21.5 1356 + '@esbuild/linux-riscv64': 0.21.5 1357 + '@esbuild/linux-s390x': 0.21.5 1358 + '@esbuild/linux-x64': 0.21.5 1359 + '@esbuild/netbsd-x64': 0.21.5 1360 + '@esbuild/openbsd-x64': 0.21.5 1361 + '@esbuild/sunos-x64': 0.21.5 1362 + '@esbuild/win32-arm64': 0.21.5 1363 + '@esbuild/win32-ia32': 0.21.5 1364 + '@esbuild/win32-x64': 0.21.5 1365 + 1366 + escape-string-regexp@4.0.0: {} 1367 + 1368 + estree-walker@0.6.1: {} 1369 + 1370 + estree-walker@3.0.3: 1371 + dependencies: 1372 + '@types/estree': 1.0.6 1373 + 1374 + exit-hook@2.2.1: {} 1375 + 1376 + expect-type@1.1.0: {} 1377 + 1378 + fsevents@2.3.3: 1379 + optional: true 1380 + 1381 + function-bind@1.1.2: {} 1382 + 1383 + get-source@2.0.12: 1384 + dependencies: 1385 + data-uri-to-buffer: 2.0.2 1386 + source-map: 0.6.1 1387 + 1388 + glob-to-regexp@0.4.1: {} 1389 + 1390 + hasown@2.0.2: 1391 + dependencies: 1392 + function-bind: 1.1.2 1393 + 1394 + is-core-module@2.16.0: 1395 + dependencies: 1396 + hasown: 2.0.2 1397 + 1398 + itty-time@1.0.6: {} 1399 + 1400 + loupe@3.1.2: {} 1401 + 1402 + magic-string@0.25.9: 1403 + dependencies: 1404 + sourcemap-codec: 1.4.8 1405 + 1406 + magic-string@0.30.17: 1407 + dependencies: 1408 + '@jridgewell/sourcemap-codec': 1.5.0 1409 + 1410 + mime@3.0.0: {} 1411 + 1412 + miniflare@3.20241218.0: 1413 + dependencies: 1414 + '@cspotcode/source-map-support': 0.8.1 1415 + acorn: 8.14.0 1416 + acorn-walk: 8.3.4 1417 + capnp-ts: 0.7.0 1418 + exit-hook: 2.2.1 1419 + glob-to-regexp: 0.4.1 1420 + stoppable: 1.1.0 1421 + undici: 5.28.4 1422 + workerd: 1.20241218.0 1423 + ws: 8.18.0 1424 + youch: 3.3.4 1425 + zod: 3.24.1 1426 + transitivePeerDependencies: 1427 + - bufferutil 1428 + - supports-color 1429 + - utf-8-validate 1430 + 1431 + ms@2.1.3: {} 1432 + 1433 + multiformats@13.3.1: {} 1434 + 1435 + mustache@4.2.0: {} 1436 + 1437 + nanoid@3.3.8: {} 1438 + 1439 + node-forge@1.3.1: {} 1440 + 1441 + ohash@1.1.4: {} 1442 + 1443 + path-parse@1.0.7: {} 1444 + 1445 + path-to-regexp@6.3.0: {} 1446 + 1447 + pathe@1.1.2: {} 1448 + 1449 + pathval@2.0.0: {} 1450 + 1451 + picocolors@1.1.1: {} 1452 + 1453 + postcss@8.4.49: 1454 + dependencies: 1455 + nanoid: 3.3.8 1456 + picocolors: 1.1.1 1457 + source-map-js: 1.2.1 1458 + 1459 + printable-characters@1.0.42: {} 1460 + 1461 + readdirp@4.0.2: {} 1462 + 1463 + resolve@1.22.10: 1464 + dependencies: 1465 + is-core-module: 2.16.0 1466 + path-parse: 1.0.7 1467 + supports-preserve-symlinks-flag: 1.0.0 1468 + 1469 + rollup-plugin-inject@3.0.2: 1470 + dependencies: 1471 + estree-walker: 0.6.1 1472 + magic-string: 0.25.9 1473 + rollup-pluginutils: 2.8.2 1474 + 1475 + rollup-plugin-node-polyfills@0.2.1: 1476 + dependencies: 1477 + rollup-plugin-inject: 3.0.2 1478 + 1479 + rollup-pluginutils@2.8.2: 1480 + dependencies: 1481 + estree-walker: 0.6.1 1482 + 1483 + rollup@4.29.1: 1484 + dependencies: 1485 + '@types/estree': 1.0.6 1486 + optionalDependencies: 1487 + '@rollup/rollup-android-arm-eabi': 4.29.1 1488 + '@rollup/rollup-android-arm64': 4.29.1 1489 + '@rollup/rollup-darwin-arm64': 4.29.1 1490 + '@rollup/rollup-darwin-x64': 4.29.1 1491 + '@rollup/rollup-freebsd-arm64': 4.29.1 1492 + '@rollup/rollup-freebsd-x64': 4.29.1 1493 + '@rollup/rollup-linux-arm-gnueabihf': 4.29.1 1494 + '@rollup/rollup-linux-arm-musleabihf': 4.29.1 1495 + '@rollup/rollup-linux-arm64-gnu': 4.29.1 1496 + '@rollup/rollup-linux-arm64-musl': 4.29.1 1497 + '@rollup/rollup-linux-loongarch64-gnu': 4.29.1 1498 + '@rollup/rollup-linux-powerpc64le-gnu': 4.29.1 1499 + '@rollup/rollup-linux-riscv64-gnu': 4.29.1 1500 + '@rollup/rollup-linux-s390x-gnu': 4.29.1 1501 + '@rollup/rollup-linux-x64-gnu': 4.29.1 1502 + '@rollup/rollup-linux-x64-musl': 4.29.1 1503 + '@rollup/rollup-win32-arm64-msvc': 4.29.1 1504 + '@rollup/rollup-win32-ia32-msvc': 4.29.1 1505 + '@rollup/rollup-win32-x64-msvc': 4.29.1 1506 + fsevents: 2.3.3 1507 + 1508 + selfsigned@2.4.1: 1509 + dependencies: 1510 + '@types/node-forge': 1.3.11 1511 + node-forge: 1.3.1 1512 + 1513 + semver@7.6.3: {} 1514 + 1515 + siginfo@2.0.0: {} 1516 + 1517 + source-map-js@1.2.1: {} 1518 + 1519 + source-map@0.6.1: {} 1520 + 1521 + sourcemap-codec@1.4.8: {} 1522 + 1523 + stackback@0.0.2: {} 1524 + 1525 + stacktracey@2.1.8: 1526 + dependencies: 1527 + as-table: 1.0.55 1528 + get-source: 2.0.12 1529 + 1530 + std-env@3.8.0: {} 1531 + 1532 + stoppable@1.1.0: {} 1533 + 1534 + supports-preserve-symlinks-flag@1.0.0: {} 1535 + 1536 + tinybench@2.9.0: {} 1537 + 1538 + tinyexec@0.3.1: {} 1539 + 1540 + tinypool@1.0.2: {} 1541 + 1542 + tinyrainbow@1.2.0: {} 1543 + 1544 + tinyspy@3.0.2: {} 1545 + 1546 + tslib@2.8.1: {} 1547 + 1548 + typescript@5.7.2: {} 1549 + 1550 + ufo@1.5.4: {} 1551 + 1552 + uint8arrays@5.1.0: 1553 + dependencies: 1554 + multiformats: 13.3.1 1555 + 1556 + undici-types@6.20.0: {} 1557 + 1558 + undici@5.28.4: 1559 + dependencies: 1560 + '@fastify/busboy': 2.1.1 1561 + 1562 + unenv-nightly@2.0.0-20241204-140205-a5d5190: 1563 + dependencies: 1564 + defu: 6.1.4 1565 + ohash: 1.1.4 1566 + pathe: 1.1.2 1567 + ufo: 1.5.4 1568 + 1569 + vite-node@2.1.8(@types/node@22.10.2): 1570 + dependencies: 1571 + cac: 6.7.14 1572 + debug: 4.4.0 1573 + es-module-lexer: 1.5.4 1574 + pathe: 1.1.2 1575 + vite: 5.4.11(@types/node@22.10.2) 1576 + transitivePeerDependencies: 1577 + - '@types/node' 1578 + - less 1579 + - lightningcss 1580 + - sass 1581 + - sass-embedded 1582 + - stylus 1583 + - sugarss 1584 + - supports-color 1585 + - terser 1586 + 1587 + vite@5.4.11(@types/node@22.10.2): 1588 + dependencies: 1589 + esbuild: 0.21.5 1590 + postcss: 8.4.49 1591 + rollup: 4.29.1 1592 + optionalDependencies: 1593 + '@types/node': 22.10.2 1594 + fsevents: 2.3.3 1595 + 1596 + vitest@2.1.8(@types/node@22.10.2): 1597 + dependencies: 1598 + '@vitest/expect': 2.1.8 1599 + '@vitest/mocker': 2.1.8(vite@5.4.11(@types/node@22.10.2)) 1600 + '@vitest/pretty-format': 2.1.8 1601 + '@vitest/runner': 2.1.8 1602 + '@vitest/snapshot': 2.1.8 1603 + '@vitest/spy': 2.1.8 1604 + '@vitest/utils': 2.1.8 1605 + chai: 5.1.2 1606 + debug: 4.4.0 1607 + expect-type: 1.1.0 1608 + magic-string: 0.30.17 1609 + pathe: 1.1.2 1610 + std-env: 3.8.0 1611 + tinybench: 2.9.0 1612 + tinyexec: 0.3.1 1613 + tinypool: 1.0.2 1614 + tinyrainbow: 1.2.0 1615 + vite: 5.4.11(@types/node@22.10.2) 1616 + vite-node: 2.1.8(@types/node@22.10.2) 1617 + why-is-node-running: 2.3.0 1618 + optionalDependencies: 1619 + '@types/node': 22.10.2 1620 + transitivePeerDependencies: 1621 + - less 1622 + - lightningcss 1623 + - msw 1624 + - sass 1625 + - sass-embedded 1626 + - stylus 1627 + - sugarss 1628 + - supports-color 1629 + - terser 1630 + 1631 + why-is-node-running@2.3.0: 1632 + dependencies: 1633 + siginfo: 2.0.0 1634 + stackback: 0.0.2 1635 + 1636 + workerd@1.20241218.0: 1637 + optionalDependencies: 1638 + '@cloudflare/workerd-darwin-64': 1.20241218.0 1639 + '@cloudflare/workerd-darwin-arm64': 1.20241218.0 1640 + '@cloudflare/workerd-linux-64': 1.20241218.0 1641 + '@cloudflare/workerd-linux-arm64': 1.20241218.0 1642 + '@cloudflare/workerd-windows-64': 1.20241218.0 1643 + 1644 + wrangler@3.99.0(@cloudflare/workers-types@4.20241218.0): 1645 + dependencies: 1646 + '@cloudflare/kv-asset-handler': 0.3.4 1647 + '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) 1648 + '@esbuild-plugins/node-modules-polyfill': 0.2.2(esbuild@0.17.19) 1649 + blake3-wasm: 2.1.5 1650 + chokidar: 4.0.3 1651 + date-fns: 4.1.0 1652 + esbuild: 0.17.19 1653 + itty-time: 1.0.6 1654 + miniflare: 3.20241218.0 1655 + nanoid: 3.3.8 1656 + path-to-regexp: 6.3.0 1657 + resolve: 1.22.10 1658 + selfsigned: 2.4.1 1659 + source-map: 0.6.1 1660 + unenv: unenv-nightly@2.0.0-20241204-140205-a5d5190 1661 + workerd: 1.20241218.0 1662 + xxhash-wasm: 1.1.0 1663 + optionalDependencies: 1664 + '@cloudflare/workers-types': 4.20241218.0 1665 + fsevents: 2.3.3 1666 + transitivePeerDependencies: 1667 + - bufferutil 1668 + - supports-color 1669 + - utf-8-validate 1670 + 1671 + ws@8.18.0: {} 1672 + 1673 + xxhash-wasm@1.1.0: {} 1674 + 1675 + youch@3.3.4: 1676 + dependencies: 1677 + cookie: 0.7.2 1678 + mustache: 4.2.0 1679 + stacktracey: 2.1.8 1680 + 1681 + zod@3.24.1: {}
+78 -15
src/index.ts
··· 1 - /** 2 - * Welcome to Cloudflare Workers! This is your first worker. 3 - * 4 - * - Run `npm run dev` in your terminal to start a development server 5 - * - Open a browser tab at http://localhost:8787/ to see your worker in action 6 - * - Run `npm run deploy` to publish your worker 7 - * 8 - * Bind resources to your worker in `wrangler.toml`. After adding bindings, a type definition for the 9 - * `Env` object can be regenerated with `npm run cf-typegen`. 10 - * 11 - * Learn more at https://developers.cloudflare.com/workers/ 12 - */ 1 + import { encode as cborEncode } from "@atcute/cbor"; 2 + import type { At } from "@atcute/client/lexicons"; 3 + import { concat as ui8Concat } from "uint8arrays"; 4 + 5 + function frameToBytes(type: "error", body: unknown): Uint8Array; 6 + function frameToBytes(type: "message", body: unknown, t: string): Uint8Array; 7 + function frameToBytes(type: "error" | "message", body: unknown, t?: string): Uint8Array { 8 + const header = type === "error" ? { op: -1 } : { op: 1, t }; 9 + return ui8Concat([cborEncode(header), cborEncode(body)]); 10 + } 11 + 12 + const LABEL_VERSION = 1; 13 + 14 + async function replay(sub: WebSocket, cursor: number | null) { 15 + // XXX: Read from your DB any rows after `cursor`. 16 + const rows = [ 17 + { 18 + 19 + } 20 + ]; 21 + 22 + for (const row of rows) { 23 + // https://atproto.com/specs/label#schema-and-data-model 24 + const label = { 25 + ver: LABEL_VERSION, 26 + src: "did:plc:3og4uthwqpnlasfb4hnlyysr" as At.DID, // @labelertest42.bsky.social 27 + uri: "did:plc:z72i7hdynmk6r22z27h6tvur", // @bsky.app 28 + val: "verified-human", 29 + neg: false, 30 + cts: "2024-12-21T19:45:01.398Z", 31 + }; 32 + const bytes = frameToBytes("message", { 33 + seq: 0, // XXX: Row ID 34 + labels: [/*formatLabel(*/label/*)*/], 35 + }, "#labels"); 36 + sub.send(bytes); 37 + } 38 + } 39 + 40 + let subscribers: WebSocket[] = []; 13 41 14 42 export default { 15 - async fetch(request, env, ctx): Promise<Response> { 16 - return new Response('Hello World!'); 17 - }, 43 + async fetch(request, env, ctx): Promise<Response> { 44 + const url = new URL(request.url); 45 + console.log("URL: ", request.url); 46 + console.log("Request: ", JSON.stringify(new Map(request.headers))); 47 + console.log("Text: ", await request.text()); 48 + 49 + if (url.pathname == "/init" && request.method == "POST") { 50 + // Set up labelling service and label defs. 51 + // 52 + // As an example, here is a labeller's service record https://api.bsky.app/xrpc/com.atproto.repo.getRecord?repo=skywatch.blue&collection=app.bsky.labeler.service&rkey=self 53 + // 54 + // Meh, it's just easier to run `npx @skyware/labeler setup` and it sets everything up for you. 55 + 56 + } else if (url.pathname == "/xrpc/com.atproto.label.subscribeLabels") { 57 + // Set up WS connection. 58 + const upgradeHeader = request.headers.get('Upgrade'); 59 + if (!upgradeHeader || upgradeHeader !== 'websocket') { 60 + return new Response('Expected Upgrade: websocket', { status: 426 }); 61 + } 62 + 63 + const cursor = parseInt(url.searchParams.get("cursor") ?? "0", 10); 64 + 65 + const webSocketPair = new WebSocketPair(); 66 + const [client, server] = Object.values(webSocketPair); 67 + 68 + server.accept(); 69 + subscribers.push(server); 70 + replay(server, cursor).catch(reason => console.error(reason)); 71 + 72 + return new Response(null, { 73 + status: 101, 74 + webSocket: client, 75 + }); 76 + } 77 + 78 + return new Response("404", { status: 404 }); 79 + 80 + }, 18 81 } satisfies ExportedHandler<Env>;