experimental bluesky client
0
fork

Configure Feed

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

Working client-metadata

+465 -4
+358
package-lock.json
··· 6 6 "": { 7 7 "name": "dudesky", 8 8 "dependencies": { 9 + "@atproto/api": "^0.19.8", 10 + "@atproto/oauth-client-node": "^0.3.17", 9 11 "@tailwindcss/vite": "^4.1.18", 10 12 "@tanstack/react-devtools": "latest", 11 13 "@tanstack/react-router": "latest", ··· 87 89 "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", 88 90 "dev": true, 89 91 "license": "MIT" 92 + }, 93 + "node_modules/@atproto-labs/did-resolver": { 94 + "version": "0.2.6", 95 + "resolved": "https://registry.npmjs.org/@atproto-labs/did-resolver/-/did-resolver-0.2.6.tgz", 96 + "integrity": "sha512-2K1bC04nI2fmgNcvof+yA28IhGlpWn2JKYlPa7To9JTKI45FINCGkQSGiL2nyXlyzDJJ34fZ1aq6/IRFIOIiqg==", 97 + "license": "MIT", 98 + "dependencies": { 99 + "@atproto-labs/fetch": "0.2.3", 100 + "@atproto-labs/pipe": "0.1.1", 101 + "@atproto-labs/simple-store": "0.3.0", 102 + "@atproto-labs/simple-store-memory": "0.1.4", 103 + "@atproto/did": "0.3.0", 104 + "zod": "^3.23.8" 105 + } 106 + }, 107 + "node_modules/@atproto-labs/fetch": { 108 + "version": "0.2.3", 109 + "resolved": "https://registry.npmjs.org/@atproto-labs/fetch/-/fetch-0.2.3.tgz", 110 + "integrity": "sha512-NZtbJOCbxKUFRFKMpamT38PUQMY0hX0p7TG5AEYOPhZKZEP7dHZ1K2s1aB8MdVH0qxmqX7nQleNrrvLf09Zfdw==", 111 + "license": "MIT", 112 + "dependencies": { 113 + "@atproto-labs/pipe": "0.1.1" 114 + } 115 + }, 116 + "node_modules/@atproto-labs/fetch-node": { 117 + "version": "0.2.0", 118 + "resolved": "https://registry.npmjs.org/@atproto-labs/fetch-node/-/fetch-node-0.2.0.tgz", 119 + "integrity": "sha512-Krq09nH/aeoiU2s9xdHA0FjTEFWG9B5FFenipv1iRixCcPc7V3DhTNDawxG9gI8Ny0k4dBVS9WTRN/IDzBx86Q==", 120 + "license": "MIT", 121 + "dependencies": { 122 + "@atproto-labs/fetch": "0.2.3", 123 + "@atproto-labs/pipe": "0.1.1", 124 + "ipaddr.js": "^2.1.0", 125 + "undici": "^6.14.1" 126 + }, 127 + "engines": { 128 + "node": ">=18.7.0" 129 + } 130 + }, 131 + "node_modules/@atproto-labs/fetch-node/node_modules/undici": { 132 + "version": "6.24.1", 133 + "resolved": "https://registry.npmjs.org/undici/-/undici-6.24.1.tgz", 134 + "integrity": "sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA==", 135 + "license": "MIT", 136 + "engines": { 137 + "node": ">=18.17" 138 + } 139 + }, 140 + "node_modules/@atproto-labs/handle-resolver": { 141 + "version": "0.3.6", 142 + "resolved": "https://registry.npmjs.org/@atproto-labs/handle-resolver/-/handle-resolver-0.3.6.tgz", 143 + "integrity": "sha512-qnSTXvOBNj1EHhp2qTWSX8MS5q3AwYU5LKlt5fBvSbCjgmTr2j0URHCv+ydrwO55KvsojIkTMgeMOh4YuY4fCA==", 144 + "license": "MIT", 145 + "dependencies": { 146 + "@atproto-labs/simple-store": "0.3.0", 147 + "@atproto-labs/simple-store-memory": "0.1.4", 148 + "@atproto/did": "0.3.0", 149 + "zod": "^3.23.8" 150 + } 151 + }, 152 + "node_modules/@atproto-labs/handle-resolver-node": { 153 + "version": "0.1.25", 154 + "resolved": "https://registry.npmjs.org/@atproto-labs/handle-resolver-node/-/handle-resolver-node-0.1.25.tgz", 155 + "integrity": "sha512-NY9WYM2VLd3IuMGRkkmvGBg8xqVEaK/fitv1vD8SMXqFTekdpjOLCCyv7EFtqVHouzmDcL83VOvWRfHVa8V9Yw==", 156 + "license": "MIT", 157 + "dependencies": { 158 + "@atproto-labs/fetch-node": "0.2.0", 159 + "@atproto-labs/handle-resolver": "0.3.6", 160 + "@atproto/did": "0.3.0" 161 + }, 162 + "engines": { 163 + "node": ">=18.7.0" 164 + } 165 + }, 166 + "node_modules/@atproto-labs/identity-resolver": { 167 + "version": "0.3.6", 168 + "resolved": "https://registry.npmjs.org/@atproto-labs/identity-resolver/-/identity-resolver-0.3.6.tgz", 169 + "integrity": "sha512-qoWqBDRobln0NR8L8dQjSp79E0chGkBhibEgxQa2f9WD+JbJdjQ0YvwwO5yeQn05pJoJmAwmI2wyJ45zjU7aWg==", 170 + "license": "MIT", 171 + "dependencies": { 172 + "@atproto-labs/did-resolver": "0.2.6", 173 + "@atproto-labs/handle-resolver": "0.3.6" 174 + } 175 + }, 176 + "node_modules/@atproto-labs/pipe": { 177 + "version": "0.1.1", 178 + "resolved": "https://registry.npmjs.org/@atproto-labs/pipe/-/pipe-0.1.1.tgz", 179 + "integrity": "sha512-hdNw2oUs2B6BN1lp+32pF7cp8EMKuIN5Qok2Vvv/aOpG/3tNSJ9YkvfI0k6Zd188LeDDYRUpYpxcoFIcGH/FNg==", 180 + "license": "MIT" 181 + }, 182 + "node_modules/@atproto-labs/simple-store": { 183 + "version": "0.3.0", 184 + "resolved": "https://registry.npmjs.org/@atproto-labs/simple-store/-/simple-store-0.3.0.tgz", 185 + "integrity": "sha512-nOb6ONKBRJHRlukW1sVawUkBqReLlLx6hT35VS3imaNPwiXDxLnTK7lxw3Lrl9k5yugSBDQAkZAq3MPTEFSUBQ==", 186 + "license": "MIT" 187 + }, 188 + "node_modules/@atproto-labs/simple-store-memory": { 189 + "version": "0.1.4", 190 + "resolved": "https://registry.npmjs.org/@atproto-labs/simple-store-memory/-/simple-store-memory-0.1.4.tgz", 191 + "integrity": "sha512-3mKY4dP8I7yKPFj9VKpYyCRzGJOi5CEpOLPlRhoJyLmgs3J4RzDrjn323Oakjz2Aj2JzRU/AIvWRAZVhpYNJHw==", 192 + "license": "MIT", 193 + "dependencies": { 194 + "@atproto-labs/simple-store": "0.3.0", 195 + "lru-cache": "^10.2.0" 196 + } 197 + }, 198 + "node_modules/@atproto-labs/simple-store-memory/node_modules/lru-cache": { 199 + "version": "10.4.3", 200 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 201 + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 202 + "license": "ISC" 203 + }, 204 + "node_modules/@atproto/api": { 205 + "version": "0.19.8", 206 + "resolved": "https://registry.npmjs.org/@atproto/api/-/api-0.19.8.tgz", 207 + "integrity": "sha512-b79kuI3AzEmpLLi9afRNq6T0KFEEVL4d+vHFAtWxeDwS7lfwUOIIngMjAVvwmwC5nJRZIrK8L9d4y7LD8zdvsg==", 208 + "license": "MIT", 209 + "dependencies": { 210 + "@atproto/common-web": "^0.4.20", 211 + "@atproto/lexicon": "^0.6.2", 212 + "@atproto/syntax": "^0.5.3", 213 + "@atproto/xrpc": "^0.7.7", 214 + "await-lock": "^2.2.2", 215 + "multiformats": "^9.9.0", 216 + "tlds": "^1.234.0", 217 + "zod": "^3.23.8" 218 + } 219 + }, 220 + "node_modules/@atproto/common-web": { 221 + "version": "0.4.20", 222 + "resolved": "https://registry.npmjs.org/@atproto/common-web/-/common-web-0.4.20.tgz", 223 + "integrity": "sha512-RcsYT28yQgVi/Glb/hHPGpqpzIlKrbMLeldEd7PmmMLWDaJL2j3lb92qytvxjl1yhi2Ssq2TEuMZ2NlWaAbpow==", 224 + "license": "MIT", 225 + "dependencies": { 226 + "@atproto/lex-data": "^0.0.15", 227 + "@atproto/lex-json": "^0.0.15", 228 + "@atproto/syntax": "^0.5.3", 229 + "zod": "^3.23.8" 230 + } 231 + }, 232 + "node_modules/@atproto/did": { 233 + "version": "0.3.0", 234 + "resolved": "https://registry.npmjs.org/@atproto/did/-/did-0.3.0.tgz", 235 + "integrity": "sha512-raUPzUGegtW/6OxwCmM8bhZvuIMzxG5t9oWsth6Tp91Kb5fTnHV2h/KKNF1C82doeA4BdXCErTyg7ISwLbQkzA==", 236 + "license": "MIT", 237 + "dependencies": { 238 + "zod": "^3.23.8" 239 + } 240 + }, 241 + "node_modules/@atproto/jwk": { 242 + "version": "0.6.0", 243 + "resolved": "https://registry.npmjs.org/@atproto/jwk/-/jwk-0.6.0.tgz", 244 + "integrity": "sha512-bDoJPvt7TrQVi/rBfBrSSpGykhtIriKxeYCYQTiPRKFfyRhbgpElF0wPXADjIswnbzZdOwbY63az4E/CFVT3Tw==", 245 + "license": "MIT", 246 + "dependencies": { 247 + "multiformats": "^9.9.0", 248 + "zod": "^3.23.8" 249 + } 250 + }, 251 + "node_modules/@atproto/jwk-jose": { 252 + "version": "0.1.11", 253 + "resolved": "https://registry.npmjs.org/@atproto/jwk-jose/-/jwk-jose-0.1.11.tgz", 254 + "integrity": "sha512-i4Fnr2sTBYmMmHXl7NJh8GrCH+tDQEVWrcDMDnV5DjJfkgT17wIqvojIw9SNbSL4Uf0OtfEv6AgG0A+mgh8b5Q==", 255 + "license": "MIT", 256 + "dependencies": { 257 + "@atproto/jwk": "0.6.0", 258 + "jose": "^5.2.0" 259 + } 260 + }, 261 + "node_modules/@atproto/jwk-webcrypto": { 262 + "version": "0.2.0", 263 + "resolved": "https://registry.npmjs.org/@atproto/jwk-webcrypto/-/jwk-webcrypto-0.2.0.tgz", 264 + "integrity": "sha512-UmgRrrEAkWvxwhlwe30UmDOdTEFidlIzBC7C3cCbeJMcBN1x8B3KH+crXrsTqfWQBG58mXgt8wgSK3Kxs2LhFg==", 265 + "license": "MIT", 266 + "dependencies": { 267 + "@atproto/jwk": "0.6.0", 268 + "@atproto/jwk-jose": "0.1.11", 269 + "zod": "^3.23.8" 270 + } 271 + }, 272 + "node_modules/@atproto/lex-data": { 273 + "version": "0.0.15", 274 + "resolved": "https://registry.npmjs.org/@atproto/lex-data/-/lex-data-0.0.15.tgz", 275 + "integrity": "sha512-ZsbGiaM5S3CnGrcTMbDGON3bLZzCi/Mx9UvcMREKSRujnF68eHgMiXxJqvykP7+QpOX6tYCK93axZkuJVhtSEw==", 276 + "license": "MIT", 277 + "dependencies": { 278 + "multiformats": "^9.9.0", 279 + "tslib": "^2.8.1", 280 + "uint8arrays": "3.0.0", 281 + "unicode-segmenter": "^0.14.0" 282 + } 283 + }, 284 + "node_modules/@atproto/lex-json": { 285 + "version": "0.0.15", 286 + "resolved": "https://registry.npmjs.org/@atproto/lex-json/-/lex-json-0.0.15.tgz", 287 + "integrity": "sha512-kCLdP629H6GhgPjBTpZibUoqlpmW0hnVfZVwcD4s4Jch1KAqY/QcfL24Ih8wrW0Ok1YvtMIhjk98evdTA2OJcw==", 288 + "license": "MIT", 289 + "dependencies": { 290 + "@atproto/lex-data": "^0.0.15", 291 + "tslib": "^2.8.1" 292 + } 293 + }, 294 + "node_modules/@atproto/lexicon": { 295 + "version": "0.6.2", 296 + "resolved": "https://registry.npmjs.org/@atproto/lexicon/-/lexicon-0.6.2.tgz", 297 + "integrity": "sha512-p3Ly6hinVZW0ETuAXZMeUGwuMm3g8HvQMQ41yyEE6AL0hAkfeKFaZKos6BdBrr6CjkpbrDZqE8M+5+QOceysMw==", 298 + "license": "MIT", 299 + "dependencies": { 300 + "@atproto/common-web": "^0.4.18", 301 + "@atproto/syntax": "^0.5.0", 302 + "iso-datestring-validator": "^2.2.2", 303 + "multiformats": "^9.9.0", 304 + "zod": "^3.23.8" 305 + } 306 + }, 307 + "node_modules/@atproto/oauth-client": { 308 + "version": "0.6.0", 309 + "resolved": "https://registry.npmjs.org/@atproto/oauth-client/-/oauth-client-0.6.0.tgz", 310 + "integrity": "sha512-F7ZTKzFptXgyihMkd7QTdRSkrh4XqrS+qTw+V81k5Q6Bh3MB1L3ypvfSJ6v7SSUJa6XxoZYJTCahHC1e+ndE6Q==", 311 + "license": "MIT", 312 + "dependencies": { 313 + "@atproto-labs/did-resolver": "^0.2.6", 314 + "@atproto-labs/fetch": "^0.2.3", 315 + "@atproto-labs/handle-resolver": "^0.3.6", 316 + "@atproto-labs/identity-resolver": "^0.3.6", 317 + "@atproto-labs/simple-store": "^0.3.0", 318 + "@atproto-labs/simple-store-memory": "^0.1.4", 319 + "@atproto/did": "^0.3.0", 320 + "@atproto/jwk": "^0.6.0", 321 + "@atproto/oauth-types": "^0.6.3", 322 + "@atproto/xrpc": "^0.7.7", 323 + "core-js": "^3", 324 + "multiformats": "^9.9.0", 325 + "zod": "^3.23.8" 326 + } 327 + }, 328 + "node_modules/@atproto/oauth-client-node": { 329 + "version": "0.3.17", 330 + "resolved": "https://registry.npmjs.org/@atproto/oauth-client-node/-/oauth-client-node-0.3.17.tgz", 331 + "integrity": "sha512-67LNuKAlC35Exe7CB5S0QCAnEqr6fKV9Nvp64jAHFof1N+Vc9Ltt1K9oekE5Ctf7dvpGByrHRF0noUw9l9sWLA==", 332 + "license": "MIT", 333 + "dependencies": { 334 + "@atproto-labs/did-resolver": "^0.2.6", 335 + "@atproto-labs/handle-resolver-node": "^0.1.25", 336 + "@atproto-labs/simple-store": "^0.3.0", 337 + "@atproto/did": "^0.3.0", 338 + "@atproto/jwk": "^0.6.0", 339 + "@atproto/jwk-jose": "^0.1.11", 340 + "@atproto/jwk-webcrypto": "^0.2.0", 341 + "@atproto/oauth-client": "^0.6.0", 342 + "@atproto/oauth-types": "^0.6.3" 343 + }, 344 + "engines": { 345 + "node": ">=18.7.0" 346 + } 347 + }, 348 + "node_modules/@atproto/oauth-types": { 349 + "version": "0.6.3", 350 + "resolved": "https://registry.npmjs.org/@atproto/oauth-types/-/oauth-types-0.6.3.tgz", 351 + "integrity": "sha512-jdKuoPknJuh/WjI+mYk7agSbx9mNVMbS6Dr3k1z2YMY2oRiCQjxYBuo4MLKATbxj05nMQaZRWlHRUazoAu5Cng==", 352 + "license": "MIT", 353 + "dependencies": { 354 + "@atproto/did": "^0.3.0", 355 + "@atproto/jwk": "^0.6.0", 356 + "zod": "^3.23.8" 357 + } 358 + }, 359 + "node_modules/@atproto/syntax": { 360 + "version": "0.5.3", 361 + "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.5.3.tgz", 362 + "integrity": "sha512-gzhlHOJHm5KXdCc17fXi1fXM81ccs5jJfNgCui84ay9JGvczxegpYHNqdMlv+iBuhtBzFIjgx6ChjRxN/kO8kQ==", 363 + "license": "MIT", 364 + "dependencies": { 365 + "tslib": "^2.8.1" 366 + } 367 + }, 368 + "node_modules/@atproto/xrpc": { 369 + "version": "0.7.7", 370 + "resolved": "https://registry.npmjs.org/@atproto/xrpc/-/xrpc-0.7.7.tgz", 371 + "integrity": "sha512-K1ZyO/BU8JNtXX5dmPp7b5UrkLMMqpsIa/Lrj5D3Su+j1Xwq1m6QJ2XJ1AgjEjkI1v4Muzm7klianLE6XGxtmA==", 372 + "license": "MIT", 373 + "dependencies": { 374 + "@atproto/lexicon": "^0.6.0", 375 + "zod": "^3.23.8" 376 + } 90 377 }, 91 378 "node_modules/@babel/code-frame": { 92 379 "version": "7.29.0", ··· 2895 3182 "node": ">=4" 2896 3183 } 2897 3184 }, 3185 + "node_modules/await-lock": { 3186 + "version": "2.2.2", 3187 + "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", 3188 + "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==", 3189 + "license": "MIT" 3190 + }, 2898 3191 "node_modules/babel-dead-code-elimination": { 2899 3192 "version": "1.0.12", 2900 3193 "resolved": "https://registry.npmjs.org/babel-dead-code-elimination/-/babel-dead-code-elimination-1.0.12.tgz", ··· 3148 3441 "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-2.0.1.tgz", 3149 3442 "integrity": "sha512-aVf4A4hI2w70LnF7GG+7xDQUkliwiXWXFvTjkip4+b64ygDQ2sJPRSKFDHbxn8o0xu9QzPkMuuiWIXyFSE2slA==", 3150 3443 "license": "MIT" 3444 + }, 3445 + "node_modules/core-js": { 3446 + "version": "3.49.0", 3447 + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz", 3448 + "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==", 3449 + "hasInstallScript": true, 3450 + "license": "MIT", 3451 + "funding": { 3452 + "type": "opencollective", 3453 + "url": "https://opencollective.com/core-js" 3454 + } 3151 3455 }, 3152 3456 "node_modules/css-select": { 3153 3457 "version": "5.2.2", ··· 3737 4041 "node": ">=0.10.0" 3738 4042 } 3739 4043 }, 4044 + "node_modules/ipaddr.js": { 4045 + "version": "2.3.0", 4046 + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", 4047 + "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", 4048 + "license": "MIT", 4049 + "engines": { 4050 + "node": ">= 10" 4051 + } 4052 + }, 3740 4053 "node_modules/is-binary-path": { 3741 4054 "version": "2.1.0", 3742 4055 "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", ··· 3795 4108 "node": ">=18" 3796 4109 } 3797 4110 }, 4111 + "node_modules/iso-datestring-validator": { 4112 + "version": "2.2.2", 4113 + "resolved": "https://registry.npmjs.org/iso-datestring-validator/-/iso-datestring-validator-2.2.2.tgz", 4114 + "integrity": "sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==", 4115 + "license": "MIT" 4116 + }, 3798 4117 "node_modules/jiti": { 3799 4118 "version": "2.6.1", 3800 4119 "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", ··· 3804 4123 "jiti": "lib/jiti-cli.mjs" 3805 4124 } 3806 4125 }, 4126 + "node_modules/jose": { 4127 + "version": "5.10.0", 4128 + "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", 4129 + "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", 4130 + "license": "MIT", 4131 + "funding": { 4132 + "url": "https://github.com/sponsors/panva" 4133 + } 4134 + }, 3807 4135 "node_modules/js-tokens": { 3808 4136 "version": "4.0.0", 3809 4137 "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", ··· 4251 4579 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 4252 4580 "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 4253 4581 "license": "MIT" 4582 + }, 4583 + "node_modules/multiformats": { 4584 + "version": "9.9.0", 4585 + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", 4586 + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", 4587 + "license": "(Apache-2.0 AND MIT)" 4254 4588 }, 4255 4589 "node_modules/nanoid": { 4256 4590 "version": "3.3.11", ··· 4860 5194 "node": ">=14.0.0" 4861 5195 } 4862 5196 }, 5197 + "node_modules/tlds": { 5198 + "version": "1.261.0", 5199 + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.261.0.tgz", 5200 + "integrity": "sha512-QXqwfEl9ddlGBaRFXIvNKK6OhipSiLXuRuLJX5DErz0o0Q0rYxulWLdFryTkV5PkdZct5iMInwYEGe/eR++1AA==", 5201 + "license": "MIT", 5202 + "bin": { 5203 + "tlds": "bin.js" 5204 + } 5205 + }, 4863 5206 "node_modules/tldts": { 4864 5207 "version": "7.0.28", 4865 5208 "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.28.tgz", ··· 4984 5327 "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", 4985 5328 "license": "MIT" 4986 5329 }, 5330 + "node_modules/uint8arrays": { 5331 + "version": "3.0.0", 5332 + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.0.0.tgz", 5333 + "integrity": "sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==", 5334 + "license": "MIT", 5335 + "dependencies": { 5336 + "multiformats": "^9.4.2" 5337 + } 5338 + }, 4987 5339 "node_modules/undici": { 4988 5340 "version": "7.24.7", 4989 5341 "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.7.tgz", ··· 4998 5350 "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", 4999 5351 "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", 5000 5352 "devOptional": true, 5353 + "license": "MIT" 5354 + }, 5355 + "node_modules/unicode-segmenter": { 5356 + "version": "0.14.5", 5357 + "resolved": "https://registry.npmjs.org/unicode-segmenter/-/unicode-segmenter-0.14.5.tgz", 5358 + "integrity": "sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g==", 5001 5359 "license": "MIT" 5002 5360 }, 5003 5361 "node_modules/unplugin": {
+3 -1
package.json
··· 12 12 "test": "vitest run" 13 13 }, 14 14 "dependencies": { 15 + "@atproto/api": "^0.19.8", 16 + "@atproto/oauth-client-node": "^0.3.17", 15 17 "@tailwindcss/vite": "^4.1.18", 16 18 "@tanstack/react-devtools": "latest", 17 19 "@tanstack/react-router": "latest", ··· 45 47 "lightningcss" 46 48 ] 47 49 } 48 - } 50 + }
+21 -3
src/routeTree.gen.ts
··· 10 10 11 11 import { Route as rootRouteImport } from './routes/__root' 12 12 import { Route as FeedRouteImport } from './routes/feed' 13 + import { Route as ClientMetadataRouteImport } from './routes/client-metadata' 13 14 import { Route as AboutRouteImport } from './routes/about' 14 15 import { Route as IndexRouteImport } from './routes/index' 15 16 16 17 const FeedRoute = FeedRouteImport.update({ 17 18 id: '/feed', 18 19 path: '/feed', 20 + getParentRoute: () => rootRouteImport, 21 + } as any) 22 + const ClientMetadataRoute = ClientMetadataRouteImport.update({ 23 + id: '/client-metadata', 24 + path: '/client-metadata', 19 25 getParentRoute: () => rootRouteImport, 20 26 } as any) 21 27 const AboutRoute = AboutRouteImport.update({ ··· 32 38 export interface FileRoutesByFullPath { 33 39 '/': typeof IndexRoute 34 40 '/about': typeof AboutRoute 41 + '/client-metadata': typeof ClientMetadataRoute 35 42 '/feed': typeof FeedRoute 36 43 } 37 44 export interface FileRoutesByTo { 38 45 '/': typeof IndexRoute 39 46 '/about': typeof AboutRoute 47 + '/client-metadata': typeof ClientMetadataRoute 40 48 '/feed': typeof FeedRoute 41 49 } 42 50 export interface FileRoutesById { 43 51 __root__: typeof rootRouteImport 44 52 '/': typeof IndexRoute 45 53 '/about': typeof AboutRoute 54 + '/client-metadata': typeof ClientMetadataRoute 46 55 '/feed': typeof FeedRoute 47 56 } 48 57 export interface FileRouteTypes { 49 58 fileRoutesByFullPath: FileRoutesByFullPath 50 - fullPaths: '/' | '/about' | '/feed' 59 + fullPaths: '/' | '/about' | '/client-metadata' | '/feed' 51 60 fileRoutesByTo: FileRoutesByTo 52 - to: '/' | '/about' | '/feed' 53 - id: '__root__' | '/' | '/about' | '/feed' 61 + to: '/' | '/about' | '/client-metadata' | '/feed' 62 + id: '__root__' | '/' | '/about' | '/client-metadata' | '/feed' 54 63 fileRoutesById: FileRoutesById 55 64 } 56 65 export interface RootRouteChildren { 57 66 IndexRoute: typeof IndexRoute 58 67 AboutRoute: typeof AboutRoute 68 + ClientMetadataRoute: typeof ClientMetadataRoute 59 69 FeedRoute: typeof FeedRoute 60 70 } 61 71 ··· 68 78 preLoaderRoute: typeof FeedRouteImport 69 79 parentRoute: typeof rootRouteImport 70 80 } 81 + '/client-metadata': { 82 + id: '/client-metadata' 83 + path: '/client-metadata' 84 + fullPath: '/client-metadata' 85 + preLoaderRoute: typeof ClientMetadataRouteImport 86 + parentRoute: typeof rootRouteImport 87 + } 71 88 '/about': { 72 89 id: '/about' 73 90 path: '/about' ··· 88 105 const rootRouteChildren: RootRouteChildren = { 89 106 IndexRoute: IndexRoute, 90 107 AboutRoute: AboutRoute, 108 + ClientMetadataRoute: ClientMetadataRoute, 91 109 FeedRoute: FeedRoute, 92 110 } 93 111 export const routeTree = rootRouteImport
+72
src/routes/client-metadata.tsx
··· 1 + import { createFileRoute } from '@tanstack/react-router' 2 + import { JoseKey, NodeOAuthClient, type NodeSavedState, type NodeSavedSession } from '@atproto/oauth-client-node' 3 + 4 + interface SessionStore { 5 + [index: string]: NodeSavedSession; 6 + } 7 + 8 + interface StateStore { 9 + [index: string]: NodeSavedState; 10 + } 11 + 12 + let sessionStore: SessionStore = {}; 13 + let stateStore: StateStore = {}; 14 + 15 + let rootUrl = process.env.VITE_APP_URL; 16 + console.log(rootUrl); 17 + 18 + const client = new NodeOAuthClient({ 19 + clientMetadata: { 20 + client_id: `${rootUrl}/client-metadata`, 21 + client_name: "Dudesky", 22 + client_uri: rootUrl, 23 + redirect_uris: [`${rootUrl}/callback`], 24 + grant_types: ["authorization_code", "refresh_token"], 25 + scope: "atproto transition:generic", 26 + application_type: "web", 27 + token_endpoint_auth_method: "private_key_jwt", 28 + token_endpoint_auth_signing_alg: "ES256", 29 + dpop_bound_access_tokens: true, 30 + jwks_uri: `${rootUrl}/jwks`, 31 + }, 32 + 33 + keyset: await Promise.all([ 34 + JoseKey.fromImportable(process.env.PRIVATE_KEY_0!, 'key1'), 35 + JoseKey.fromImportable(process.env.PRIVATE_KEY_1!, 'key2'), 36 + JoseKey.fromImportable(process.env.PRIVATE_KEY_2!, 'key3'), 37 + ]), 38 + 39 + stateStore: { 40 + async set(key: string, internalState: NodeSavedState): Promise<void> { 41 + stateStore[key] = internalState; 42 + }, 43 + async get(key: string): Promise<NodeSavedState | undefined> { 44 + return stateStore[key]; 45 + }, 46 + async del(key: string): Promise<void> { 47 + delete stateStore[key]; 48 + }, 49 + }, 50 + 51 + sessionStore: { 52 + async set(sub: string, session: NodeSavedSession): Promise<void> { 53 + sessionStore[sub] = session; 54 + }, 55 + async get(sub: string): Promise<NodeSavedSession | undefined> { 56 + return sessionStore[sub]; 57 + }, 58 + async del(sub: string): Promise<void> { 59 + delete sessionStore[sub]; 60 + }, 61 + } 62 + }) 63 + 64 + export const Route = createFileRoute('/client-metadata')({ 65 + server: { 66 + handlers: { 67 + GET: async({ request }) => { 68 + return new Response(JSON.stringify(client.clientMetadata)); 69 + } 70 + } 71 + } 72 + })
+11
vite.config.ts
··· 15 15 tanstackStart(), 16 16 viteReact(), 17 17 ], 18 + server: { 19 + host: 'localhost', 20 + port: 3001, 21 + allowedHosts: ['local.dudesky.app'], 22 + proxy: { 23 + '/api': { 24 + target: 'http://localhost:4000', 25 + changeOrigin: true, 26 + }, 27 + }, 28 + }, 18 29 }) 19 30 20 31 export default config