tangled
alpha
login
or
join now
danabra.mov
/
statusphere-react
forked from
samuel.fm/statusphere-react
0
fork
atom
the statusphere demo reworked into a vite/react app in a monorepo
0
fork
atom
overview
issues
pulls
pipelines
compat w/ oauth dev preview. update deps.
Devin Ivy
2 years ago
7c50fba4
74dc0f96
+107
-138
5 changed files
expand all
collapse all
unified
split
package-lock.json
package.json
src
auth
client.ts
session.ts
routes.ts
+85
-123
package-lock.json
···
9
"version": "0.0.1",
10
"license": "MIT",
11
"dependencies": {
0
12
"@atproto/identity": "^0.4.0",
13
-
"@atproto/lexicon": "0.4.1-rc.0",
14
-
"@atproto/oauth-client-node": "0.0.2-rc.2",
15
-
"@atproto/repo": "0.4.2-rc.0",
16
"@atproto/syntax": "^0.3.0",
17
-
"@atproto/xrpc-server": "0.5.4-rc.0",
18
"better-sqlite3": "^11.1.2",
19
"dotenv": "^16.4.5",
20
"envalid": "^8.0.0",
···
23
"kysely": "^0.27.4",
24
"multiformats": "^9.9.0",
25
"pino": "^9.3.2",
26
-
"pino-http": "^10.0.0",
27
"uhtml": "^4.5.9"
28
},
29
"devDependencies": {
···
39
}
40
},
41
"node_modules/@atproto-labs/did-resolver": {
42
-
"version": "0.1.2-rc.0",
43
-
"resolved": "https://registry.npmjs.org/@atproto-labs/did-resolver/-/did-resolver-0.1.2-rc.0.tgz",
44
-
"integrity": "sha512-5lVxhLG9P1G1XjGXQr7fhk6mBM5vpbCalrfuVXqU5xQADvObLjEtpxpJuLheAacaV2pUMFDml+53ZLYWXCgFIg==",
45
"dependencies": {
46
"@atproto-labs/fetch": "0.1.0",
47
"@atproto-labs/pipe": "0.1.0",
48
"@atproto-labs/simple-store": "0.1.1",
49
"@atproto-labs/simple-store-memory": "0.1.1",
50
-
"@atproto/did": "0.1.1-rc.0",
51
"zod": "^3.23.8"
52
}
53
},
···
75
}
76
},
77
"node_modules/@atproto-labs/handle-resolver": {
78
-
"version": "0.1.2-rc.0",
79
-
"resolved": "https://registry.npmjs.org/@atproto-labs/handle-resolver/-/handle-resolver-0.1.2-rc.0.tgz",
80
-
"integrity": "sha512-sxk/Zr1hWyBBcg1HhZ8N/Tw1Iue/6+V6bzu2c8zYhO9VfKgCBp3FFU1/i3MpgR2AlsEqZpcjv6zj4KAnMHiLUg==",
81
"dependencies": {
82
"@atproto-labs/simple-store": "0.1.1",
83
"@atproto-labs/simple-store-memory": "0.1.1",
84
-
"@atproto/did": "0.1.1-rc.0",
85
"zod": "^3.23.8"
86
}
87
},
88
"node_modules/@atproto-labs/handle-resolver-node": {
89
-
"version": "0.1.2-rc.0",
90
-
"resolved": "https://registry.npmjs.org/@atproto-labs/handle-resolver-node/-/handle-resolver-node-0.1.2-rc.0.tgz",
91
-
"integrity": "sha512-wP1c0fqxdhnIQVxFgD3Z6fiToq1ri9ECTCSPoy/1zbNJ+KWrr0V6BSONF/I5MytEbQaICBh8bvZuurvX0OjbNw==",
92
"dependencies": {
93
"@atproto-labs/fetch-node": "0.1.0",
94
-
"@atproto-labs/handle-resolver": "0.1.2-rc.0",
95
-
"@atproto/did": "0.1.1-rc.0"
96
}
97
},
98
"node_modules/@atproto-labs/identity-resolver": {
99
-
"version": "0.1.2-rc.0",
100
-
"resolved": "https://registry.npmjs.org/@atproto-labs/identity-resolver/-/identity-resolver-0.1.2-rc.0.tgz",
101
-
"integrity": "sha512-4TLjNRbufeGduac3c/No4teJ411qNgyBQck7eY5e2K8XrzS2a/xX/bq3JP91DrvERHiP3yE22PB6ATQkuALgXA==",
102
"dependencies": {
103
-
"@atproto-labs/did-resolver": "0.1.2-rc.0",
104
-
"@atproto-labs/handle-resolver": "0.1.2-rc.0",
105
"@atproto/syntax": "0.3.0"
106
}
107
},
···
125
}
126
},
127
"node_modules/@atproto/api": {
128
-
"version": "0.13.0-rc.1",
129
-
"resolved": "https://registry.npmjs.org/@atproto/api/-/api-0.13.0-rc.1.tgz",
130
-
"integrity": "sha512-h2+M6OoMLnNzqf2KDxsbRkg3/1k2IMWH33PQI31GkiQHIdt3B+MIXvJwXePu0KnMUL/Lvv2Zk01BKiDnjd4LEw==",
131
"dependencies": {
132
"@atproto/common-web": "^0.3.0",
133
-
"@atproto/lexicon": "^0.4.1-rc.0",
134
"@atproto/syntax": "^0.3.0",
135
-
"@atproto/xrpc": "^0.6.0-rc.0",
136
"await-lock": "^2.2.2",
137
"multiformats": "^9.9.0",
138
"tlds": "^1.234.0"
···
210
}
211
},
212
"node_modules/@atproto/crypto": {
213
-
"version": "0.4.0",
214
-
"resolved": "https://registry.npmjs.org/@atproto/crypto/-/crypto-0.4.0.tgz",
215
-
"integrity": "sha512-Kj/4VgJ7hzzXvE42L0rjzP6lM0tai+OfPnP1rxJ+UZg/YUDtuewL4uapnVoWXvlNceKgaLZH98g5n9gXBVTe5Q==",
216
"dependencies": {
217
"@noble/curves": "^1.1.0",
218
"@noble/hashes": "^1.3.1",
···
220
}
221
},
222
"node_modules/@atproto/did": {
223
-
"version": "0.1.1-rc.0",
224
-
"resolved": "https://registry.npmjs.org/@atproto/did/-/did-0.1.1-rc.0.tgz",
225
-
"integrity": "sha512-rbO6kQv/bKsMGqAqr1M4o7cmJf893gYzabr1CmJ0rr/FNdXHfr0b9s2lRphA6zCS0wPdT4/mw6/LWiCrnBmi9w==",
226
"dependencies": {
227
"zod": "^3.23.8"
228
}
···
247
}
248
},
249
"node_modules/@atproto/jwk-jose": {
250
-
"version": "0.1.2-rc.0",
251
-
"resolved": "https://registry.npmjs.org/@atproto/jwk-jose/-/jwk-jose-0.1.2-rc.0.tgz",
252
-
"integrity": "sha512-guqGhgQjOx6OxxDWBENRa30G3CJ91Rqw+5NEwiv4GfhmmM/szS983kZIydmXpySpyyZhGAPZfkOfHai+HrLsXg==",
253
"dependencies": {
254
"@atproto/jwk": "0.1.1",
255
"jose": "^5.2.0"
256
}
257
},
258
"node_modules/@atproto/jwk-webcrypto": {
259
-
"version": "0.1.2-rc.0",
260
-
"resolved": "https://registry.npmjs.org/@atproto/jwk-webcrypto/-/jwk-webcrypto-0.1.2-rc.0.tgz",
261
-
"integrity": "sha512-TlLaJulKDWDhXQ8Wujte4l2RPe/Ym+jAnFR/+lwZbcGQHAUsatBMCKzvYVv3TtqXL3B5gIC9ry12+C7oQ5yE/Q==",
262
"dependencies": {
263
"@atproto/jwk": "0.1.1",
264
-
"@atproto/jwk-jose": "0.1.2-rc.0"
265
}
266
},
267
"node_modules/@atproto/lex-cli": {
···
283
"lex": "dist/index.js"
284
}
285
},
286
-
"node_modules/@atproto/lex-cli/node_modules/@atproto/lexicon": {
287
"version": "0.4.1",
288
"resolved": "https://registry.npmjs.org/@atproto/lexicon/-/lexicon-0.4.1.tgz",
289
"integrity": "sha512-bzyr+/VHXLQWbumViX5L7h1NKQObfs8Z+XZJl43OUK8nYFUI4e/sW1IZKRNfw7Wvi5YVNK+J+yP3DWIBZhkCYA==",
290
-
"dev": true,
291
-
"dependencies": {
292
-
"@atproto/common-web": "^0.3.0",
293
-
"@atproto/syntax": "^0.3.0",
294
-
"iso-datestring-validator": "^2.2.2",
295
-
"multiformats": "^9.9.0",
296
-
"zod": "^3.23.8"
297
-
}
298
-
},
299
-
"node_modules/@atproto/lexicon": {
300
-
"version": "0.4.1-rc.0",
301
-
"resolved": "https://registry.npmjs.org/@atproto/lexicon/-/lexicon-0.4.1-rc.0.tgz",
302
-
"integrity": "sha512-CSYO8MWbxTXTLQMEJ1mTXD2pDxIXO2oCK/FVw9T/BeXLMcvwmeVgKAaytd1AGFkapX8IMAAtjBB3cnaltuHwbg==",
303
"dependencies": {
304
"@atproto/common-web": "^0.3.0",
305
"@atproto/syntax": "^0.3.0",
···
309
}
310
},
311
"node_modules/@atproto/oauth-client": {
312
-
"version": "0.1.2-rc.2",
313
-
"resolved": "https://registry.npmjs.org/@atproto/oauth-client/-/oauth-client-0.1.2-rc.2.tgz",
314
-
"integrity": "sha512-FBYyEKEU1BFoW1ASFzsmw1oOpVPj/nkoR753OZItgNwl9i+Tr4kAA9TqeXGa6Ol3dh7K67oaxHw7DChdEqbtSg==",
315
"dependencies": {
316
-
"@atproto-labs/did-resolver": "0.1.2-rc.0",
317
"@atproto-labs/fetch": "0.1.0",
318
-
"@atproto-labs/handle-resolver": "0.1.2-rc.0",
319
-
"@atproto-labs/identity-resolver": "0.1.2-rc.0",
320
"@atproto-labs/simple-store": "0.1.1",
321
"@atproto-labs/simple-store-memory": "0.1.1",
322
-
"@atproto/api": "0.13.0-rc.1",
323
-
"@atproto/did": "0.1.1-rc.0",
324
"@atproto/jwk": "0.1.1",
325
-
"@atproto/oauth-types": "0.1.2-rc.0",
326
-
"@atproto/xrpc": "0.6.0-rc.0",
327
"multiformats": "^9.9.0",
328
"zod": "^3.23.8"
329
}
330
},
331
"node_modules/@atproto/oauth-client-node": {
332
-
"version": "0.0.2-rc.2",
333
-
"resolved": "https://registry.npmjs.org/@atproto/oauth-client-node/-/oauth-client-node-0.0.2-rc.2.tgz",
334
-
"integrity": "sha512-MxR2C84h6XjTB28RpXfctKLvB6Ot68tiOlsOSigeSTKnNJ5SRD2wISz2647P8dxOec81ugMu8wa5BKcZ5Ry7nw==",
335
"dependencies": {
336
-
"@atproto-labs/did-resolver": "0.1.2-rc.0",
337
-
"@atproto-labs/handle-resolver-node": "0.1.2-rc.0",
338
"@atproto-labs/simple-store": "0.1.1",
339
-
"@atproto/did": "0.1.1-rc.0",
340
"@atproto/jwk": "0.1.1",
341
-
"@atproto/jwk-jose": "0.1.2-rc.0",
342
-
"@atproto/jwk-webcrypto": "0.1.2-rc.0",
343
-
"@atproto/oauth-client": "0.1.2-rc.2",
344
-
"@atproto/oauth-types": "0.1.2-rc.0"
345
}
346
},
347
"node_modules/@atproto/oauth-types": {
348
-
"version": "0.1.2-rc.0",
349
-
"resolved": "https://registry.npmjs.org/@atproto/oauth-types/-/oauth-types-0.1.2-rc.0.tgz",
350
-
"integrity": "sha512-q/AxPSdLf2xTgC4K1cU35HVl6T4T0LJ/QJmvqXwjpbiNWEqooIQIP9sTp2CqqSLsWpe26z3fIoA3R+oTR1EJsA==",
351
"dependencies": {
352
"@atproto/jwk": "0.1.1",
353
"zod": "^3.23.8"
354
}
355
},
356
"node_modules/@atproto/repo": {
357
-
"version": "0.4.2-rc.0",
358
-
"resolved": "https://registry.npmjs.org/@atproto/repo/-/repo-0.4.2-rc.0.tgz",
359
-
"integrity": "sha512-y8zXAR23r6qlsTmbzXaBEHYjvlgeNlAKj9eJ6V17JtT+4FVdW246alhsgSsglJ2Uv/e24RC1r90yNJNRxqDzXw==",
360
"dependencies": {
361
"@atproto/common": "^0.4.1",
362
"@atproto/common-web": "^0.3.0",
363
-
"@atproto/crypto": "^0.4.0",
364
-
"@atproto/lexicon": "^0.4.1-rc.0",
365
"@ipld/car": "^3.2.3",
366
"@ipld/dag-cbor": "^7.0.0",
367
"multiformats": "^9.9.0",
···
375
"integrity": "sha512-Weq0ZBxffGHDXHl9U7BQc2BFJi/e23AL+k+i5+D9hUq/bzT4yjGsrCejkjq0xt82xXDjmhhvQSZ0LqxyZ5woxA=="
376
},
377
"node_modules/@atproto/xrpc": {
378
-
"version": "0.6.0-rc.0",
379
-
"resolved": "https://registry.npmjs.org/@atproto/xrpc/-/xrpc-0.6.0-rc.0.tgz",
380
-
"integrity": "sha512-TOmynXvbA57Y6KR050UeiDfdzQoAnmgB0zu0qrvhYiu7oeg64fYzvOa7stWxSIP1nhrGqgexxICR1CnOnCEHjg==",
381
"dependencies": {
382
-
"@atproto/lexicon": "^0.4.1-rc.0",
383
"zod": "^3.23.8"
384
}
385
},
386
"node_modules/@atproto/xrpc-server": {
387
-
"version": "0.5.4-rc.0",
388
-
"resolved": "https://registry.npmjs.org/@atproto/xrpc-server/-/xrpc-server-0.5.4-rc.0.tgz",
389
-
"integrity": "sha512-Vrx1gEoZfJtYoZhSxkbWQsU2r0DuJO/BuvMQGw9Nd66owmF5nPDVvYVd0pJhIDoaSxImTTIEeDWlNNl3WCSBPA==",
390
"dependencies": {
391
"@atproto/common": "^0.4.1",
392
-
"@atproto/crypto": "^0.4.0",
393
-
"@atproto/lexicon": "^0.4.1-rc.0",
394
-
"@atproto/xrpc": "^0.6.0-rc.0",
395
"cbor-x": "^1.5.1",
396
"express": "^4.17.2",
397
"http-errors": "^2.0.0",
···
1944
"resolved": "https://registry.npmjs.org/gc-hook/-/gc-hook-0.3.1.tgz",
1945
"integrity": "sha512-E5M+O/h2o7eZzGhzRZGex6hbB3k4NWqO0eA+OzLRLXxhdbYPajZnynPwAtphnh+cRHPwsj5Z80dqZlfI4eK55A=="
1946
},
1947
-
"node_modules/get-caller-file": {
1948
-
"version": "2.0.5",
1949
-
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
1950
-
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
1951
-
"engines": {
1952
-
"node": "6.* || 8.* || >= 10.*"
1953
-
}
1954
-
},
1955
"node_modules/get-intrinsic": {
1956
"version": "1.2.4",
1957
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
···
2300
}
2301
},
2302
"node_modules/jose": {
2303
-
"version": "5.6.3",
2304
-
"resolved": "https://registry.npmjs.org/jose/-/jose-5.6.3.tgz",
2305
-
"integrity": "sha512-1Jh//hEEwMhNYPDDLwXHa2ePWgWiFNNUadVmguAAw2IJ6sj9mNxV5tGXJNqlMkJAybF6Lgw1mISDxTePP/187g==",
2306
"funding": {
2307
"url": "https://github.com/sponsors/panva"
2308
}
···
2748
"readable-stream": "^4.0.0",
2749
"split2": "^4.0.0"
2750
}
2751
-
},
2752
-
"node_modules/pino-http": {
2753
-
"version": "10.2.0",
2754
-
"resolved": "https://registry.npmjs.org/pino-http/-/pino-http-10.2.0.tgz",
2755
-
"integrity": "sha512-am03BxnV3Ckx68OkbH0iZs3indsrH78wncQ6w1w51KroIbvJZNImBKX2X1wjdY8lSyaJ0UrX/dnO2DY3cTeCRw==",
2756
-
"dependencies": {
2757
-
"get-caller-file": "^2.0.5",
2758
-
"pino": "^9.0.0",
2759
-
"pino-std-serializers": "^7.0.0",
2760
-
"process-warning": "^3.0.0"
2761
-
}
2762
-
},
2763
-
"node_modules/pino-http/node_modules/process-warning": {
2764
-
"version": "3.0.0",
2765
-
"resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz",
2766
-
"integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ=="
2767
},
2768
"node_modules/pino-pretty": {
2769
"version": "11.2.2",
···
4059
"integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="
4060
},
4061
"node_modules/undici": {
4062
-
"version": "6.19.7",
4063
-
"resolved": "https://registry.npmjs.org/undici/-/undici-6.19.7.tgz",
4064
-
"integrity": "sha512-HR3W/bMGPSr90i8AAp2C4DM3wChFdJPLrWYpIS++LxS8K+W535qftjt+4MyjNYHeWabMj1nvtmLIi7l++iq91A==",
4065
"engines": {
4066
"node": ">=18.17"
4067
}
···
9
"version": "0.0.1",
10
"license": "MIT",
11
"dependencies": {
12
+
"@atproto/api": "^0.13.4",
13
"@atproto/identity": "^0.4.0",
14
+
"@atproto/lexicon": "^0.4.1",
15
+
"@atproto/oauth-client-node": "^0.1.0",
16
+
"@atproto/repo": "^0.4.3",
17
"@atproto/syntax": "^0.3.0",
18
+
"@atproto/xrpc-server": "^0.6.3",
19
"better-sqlite3": "^11.1.2",
20
"dotenv": "^16.4.5",
21
"envalid": "^8.0.0",
···
24
"kysely": "^0.27.4",
25
"multiformats": "^9.9.0",
26
"pino": "^9.3.2",
0
27
"uhtml": "^4.5.9"
28
},
29
"devDependencies": {
···
39
}
40
},
41
"node_modules/@atproto-labs/did-resolver": {
42
+
"version": "0.1.2",
43
+
"resolved": "https://registry.npmjs.org/@atproto-labs/did-resolver/-/did-resolver-0.1.2.tgz",
44
+
"integrity": "sha512-d/nQHoieDo0tf0OX45LJcLQlSuyzVOV5lND7krlSxeAyD3pO5Fx1G8FtmkoPlMt4LT1OCIIQNmjh42pOcGH3WA==",
45
"dependencies": {
46
"@atproto-labs/fetch": "0.1.0",
47
"@atproto-labs/pipe": "0.1.0",
48
"@atproto-labs/simple-store": "0.1.1",
49
"@atproto-labs/simple-store-memory": "0.1.1",
50
+
"@atproto/did": "0.1.1",
51
"zod": "^3.23.8"
52
}
53
},
···
75
}
76
},
77
"node_modules/@atproto-labs/handle-resolver": {
78
+
"version": "0.1.2",
79
+
"resolved": "https://registry.npmjs.org/@atproto-labs/handle-resolver/-/handle-resolver-0.1.2.tgz",
80
+
"integrity": "sha512-0D8d1QpGqyp0DLYnKpAFJ5YaIgiRUHMqKnbd1d0reOuJoa7ebwxMolNhP3RnKlOQ/9gaL3Y3ORZFeEjXK+eRqg==",
81
"dependencies": {
82
"@atproto-labs/simple-store": "0.1.1",
83
"@atproto-labs/simple-store-memory": "0.1.1",
84
+
"@atproto/did": "0.1.1",
85
"zod": "^3.23.8"
86
}
87
},
88
"node_modules/@atproto-labs/handle-resolver-node": {
89
+
"version": "0.1.2",
90
+
"resolved": "https://registry.npmjs.org/@atproto-labs/handle-resolver-node/-/handle-resolver-node-0.1.2.tgz",
91
+
"integrity": "sha512-T+QApSezlb71+VLUua3bEmaDN4umvfzEzw/iS1BAZC7BwmGxOg/MBRdE9n6fPU4ul0ekG+6vRhpW4owCS20x3Q==",
92
"dependencies": {
93
"@atproto-labs/fetch-node": "0.1.0",
94
+
"@atproto-labs/handle-resolver": "0.1.2",
95
+
"@atproto/did": "0.1.1"
96
}
97
},
98
"node_modules/@atproto-labs/identity-resolver": {
99
+
"version": "0.1.2",
100
+
"resolved": "https://registry.npmjs.org/@atproto-labs/identity-resolver/-/identity-resolver-0.1.2.tgz",
101
+
"integrity": "sha512-166XTfq/gvdzmJT6tMvMvsT4h9yVyse8yJVn534j5GPGTqPtyky57/SNyO+R8QbOr4ffG0NQRO+OAazsVR0mVw==",
102
"dependencies": {
103
+
"@atproto-labs/did-resolver": "0.1.2",
104
+
"@atproto-labs/handle-resolver": "0.1.2",
105
"@atproto/syntax": "0.3.0"
106
}
107
},
···
125
}
126
},
127
"node_modules/@atproto/api": {
128
+
"version": "0.13.4",
129
+
"resolved": "https://registry.npmjs.org/@atproto/api/-/api-0.13.4.tgz",
130
+
"integrity": "sha512-Fwn37hP+Xr9YjA/hadvn7ZKbUPQhJiUus1+govgNKF3/jNdyk2ICoEe0z+hxaO3xX8LCU5yARbgt3SRoXbIwrg==",
131
"dependencies": {
132
"@atproto/common-web": "^0.3.0",
133
+
"@atproto/lexicon": "^0.4.1",
134
"@atproto/syntax": "^0.3.0",
135
+
"@atproto/xrpc": "^0.6.1",
136
"await-lock": "^2.2.2",
137
"multiformats": "^9.9.0",
138
"tlds": "^1.234.0"
···
210
}
211
},
212
"node_modules/@atproto/crypto": {
213
+
"version": "0.4.1",
214
+
"resolved": "https://registry.npmjs.org/@atproto/crypto/-/crypto-0.4.1.tgz",
215
+
"integrity": "sha512-7pQNHWYyx8jGhYdPbmcuPD9W73nd/5v3mfBlncO0sBzxnPbmA6aXAWOz+fNVZwHwBJPeb/Gzf/FT/uDx7/eYFg==",
216
"dependencies": {
217
"@noble/curves": "^1.1.0",
218
"@noble/hashes": "^1.3.1",
···
220
}
221
},
222
"node_modules/@atproto/did": {
223
+
"version": "0.1.1",
224
+
"resolved": "https://registry.npmjs.org/@atproto/did/-/did-0.1.1.tgz",
225
+
"integrity": "sha512-FA+U8C8ACQLjG/TSgtaQyjvXxzOYzwK0+T6FJ1oj2BtKUixq4t8zpvo4zdIrnVimXeGQWo1/U1ghke58SmRpmQ==",
226
"dependencies": {
227
"zod": "^3.23.8"
228
}
···
247
}
248
},
249
"node_modules/@atproto/jwk-jose": {
250
+
"version": "0.1.2",
251
+
"resolved": "https://registry.npmjs.org/@atproto/jwk-jose/-/jwk-jose-0.1.2.tgz",
252
+
"integrity": "sha512-lDwc/6lLn2aZ/JpyyggyjLFsJPMntrVzryyGUx5aNpuTS8SIuc4Ky0REhxqfLopQXJJZCuRRjagHG3uP05/moQ==",
253
"dependencies": {
254
"@atproto/jwk": "0.1.1",
255
"jose": "^5.2.0"
256
}
257
},
258
"node_modules/@atproto/jwk-webcrypto": {
259
+
"version": "0.1.2",
260
+
"resolved": "https://registry.npmjs.org/@atproto/jwk-webcrypto/-/jwk-webcrypto-0.1.2.tgz",
261
+
"integrity": "sha512-vTBUbUZXh0GI+6KJiPGukmI4BQEHFAij8fJJ4WnReF/hefAs3ISZtrWZHGBebz+q2EcExYlnhhlmxvDzV7veGw==",
262
"dependencies": {
263
"@atproto/jwk": "0.1.1",
264
+
"@atproto/jwk-jose": "0.1.2"
265
}
266
},
267
"node_modules/@atproto/lex-cli": {
···
283
"lex": "dist/index.js"
284
}
285
},
286
+
"node_modules/@atproto/lexicon": {
287
"version": "0.4.1",
288
"resolved": "https://registry.npmjs.org/@atproto/lexicon/-/lexicon-0.4.1.tgz",
289
"integrity": "sha512-bzyr+/VHXLQWbumViX5L7h1NKQObfs8Z+XZJl43OUK8nYFUI4e/sW1IZKRNfw7Wvi5YVNK+J+yP3DWIBZhkCYA==",
0
0
0
0
0
0
0
0
0
0
0
0
0
290
"dependencies": {
291
"@atproto/common-web": "^0.3.0",
292
"@atproto/syntax": "^0.3.0",
···
296
}
297
},
298
"node_modules/@atproto/oauth-client": {
299
+
"version": "0.2.0",
300
+
"resolved": "https://registry.npmjs.org/@atproto/oauth-client/-/oauth-client-0.2.0.tgz",
301
+
"integrity": "sha512-J8NaQ45jIa7e/VXKUwtGnW91p8mM8yWvqhlBxNvVXQ2t5yo6rxYdIVam+2Ffy3SANxqe+sl5QFmCdaJQGX0yNQ==",
302
"dependencies": {
303
+
"@atproto-labs/did-resolver": "0.1.2",
304
"@atproto-labs/fetch": "0.1.0",
305
+
"@atproto-labs/handle-resolver": "0.1.2",
306
+
"@atproto-labs/identity-resolver": "0.1.2",
307
"@atproto-labs/simple-store": "0.1.1",
308
"@atproto-labs/simple-store-memory": "0.1.1",
309
+
"@atproto/did": "0.1.1",
0
310
"@atproto/jwk": "0.1.1",
311
+
"@atproto/oauth-types": "0.1.4",
312
+
"@atproto/xrpc": "0.6.1",
313
"multiformats": "^9.9.0",
314
"zod": "^3.23.8"
315
}
316
},
317
"node_modules/@atproto/oauth-client-node": {
318
+
"version": "0.1.0",
319
+
"resolved": "https://registry.npmjs.org/@atproto/oauth-client-node/-/oauth-client-node-0.1.0.tgz",
320
+
"integrity": "sha512-F+bhXBaTAQuOViVjr9I+9iVVPTgnXh4EbquMazhoyAcH1T+v8oPkzV7tqVBvsbolgRDILJTAgRCtF140fC2wAg==",
321
"dependencies": {
322
+
"@atproto-labs/did-resolver": "0.1.2",
323
+
"@atproto-labs/handle-resolver-node": "0.1.2",
324
"@atproto-labs/simple-store": "0.1.1",
325
+
"@atproto/did": "0.1.1",
326
"@atproto/jwk": "0.1.1",
327
+
"@atproto/jwk-jose": "0.1.2",
328
+
"@atproto/jwk-webcrypto": "0.1.2",
329
+
"@atproto/oauth-client": "0.2.0",
330
+
"@atproto/oauth-types": "0.1.4"
331
}
332
},
333
"node_modules/@atproto/oauth-types": {
334
+
"version": "0.1.4",
335
+
"resolved": "https://registry.npmjs.org/@atproto/oauth-types/-/oauth-types-0.1.4.tgz",
336
+
"integrity": "sha512-B5lFXMvsx9PtO0wwCqwaoRVG8vKxvB742vO4Ze5OMJJsps6ebGskaYmkFHP9DnvDSLRzIHpJJ7jN6ri71V+xng==",
337
"dependencies": {
338
"@atproto/jwk": "0.1.1",
339
"zod": "^3.23.8"
340
}
341
},
342
"node_modules/@atproto/repo": {
343
+
"version": "0.4.3",
344
+
"resolved": "https://registry.npmjs.org/@atproto/repo/-/repo-0.4.3.tgz",
345
+
"integrity": "sha512-9w4TlyxExLfFL9BysvXq4vhIsYsnmGi0uelmxJjlRXBICgLpqjqQVqhS8OBqE25ZTYvgXUi7nNqpo2llCHhOvQ==",
346
"dependencies": {
347
"@atproto/common": "^0.4.1",
348
"@atproto/common-web": "^0.3.0",
349
+
"@atproto/crypto": "^0.4.1",
350
+
"@atproto/lexicon": "^0.4.1",
351
"@ipld/car": "^3.2.3",
352
"@ipld/dag-cbor": "^7.0.0",
353
"multiformats": "^9.9.0",
···
361
"integrity": "sha512-Weq0ZBxffGHDXHl9U7BQc2BFJi/e23AL+k+i5+D9hUq/bzT4yjGsrCejkjq0xt82xXDjmhhvQSZ0LqxyZ5woxA=="
362
},
363
"node_modules/@atproto/xrpc": {
364
+
"version": "0.6.1",
365
+
"resolved": "https://registry.npmjs.org/@atproto/xrpc/-/xrpc-0.6.1.tgz",
366
+
"integrity": "sha512-Zy5ydXEdk6sY7FDUZcEVfCL1jvbL4tXu5CcdPqbEaW6LQtk9GLds/DK1bCX9kswTGaBC88EMuqQMfkxOhp2t4A==",
367
"dependencies": {
368
+
"@atproto/lexicon": "^0.4.1",
369
"zod": "^3.23.8"
370
}
371
},
372
"node_modules/@atproto/xrpc-server": {
373
+
"version": "0.6.3",
374
+
"resolved": "https://registry.npmjs.org/@atproto/xrpc-server/-/xrpc-server-0.6.3.tgz",
375
+
"integrity": "sha512-0YXeBM9NjiIlR5eXWo8qzArRcBOKhwVimpH+ajKgZzlncPO53brVZ9+3BUnD5J1PG8mEQFRERi+Jt77QyF89qA==",
376
"dependencies": {
377
"@atproto/common": "^0.4.1",
378
+
"@atproto/crypto": "^0.4.1",
379
+
"@atproto/lexicon": "^0.4.1",
380
+
"@atproto/xrpc": "^0.6.1",
381
"cbor-x": "^1.5.1",
382
"express": "^4.17.2",
383
"http-errors": "^2.0.0",
···
1930
"resolved": "https://registry.npmjs.org/gc-hook/-/gc-hook-0.3.1.tgz",
1931
"integrity": "sha512-E5M+O/h2o7eZzGhzRZGex6hbB3k4NWqO0eA+OzLRLXxhdbYPajZnynPwAtphnh+cRHPwsj5Z80dqZlfI4eK55A=="
1932
},
0
0
0
0
0
0
0
0
1933
"node_modules/get-intrinsic": {
1934
"version": "1.2.4",
1935
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
···
2278
}
2279
},
2280
"node_modules/jose": {
2281
+
"version": "5.8.0",
2282
+
"resolved": "https://registry.npmjs.org/jose/-/jose-5.8.0.tgz",
2283
+
"integrity": "sha512-E7CqYpL/t7MMnfGnK/eg416OsFCVUrU/Y3Vwe7QjKhu/BkS1Ms455+2xsqZQVN57/U2MHMBvEb5SrmAZWAIntA==",
2284
"funding": {
2285
"url": "https://github.com/sponsors/panva"
2286
}
···
2726
"readable-stream": "^4.0.0",
2727
"split2": "^4.0.0"
2728
}
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
2729
},
2730
"node_modules/pino-pretty": {
2731
"version": "11.2.2",
···
4021
"integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="
4022
},
4023
"node_modules/undici": {
4024
+
"version": "6.19.8",
4025
+
"resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz",
4026
+
"integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==",
4027
"engines": {
4028
"node": ">=18.17"
4029
}
+5
-4
package.json
···
14
"clean": "rimraf dist coverage"
15
},
16
"dependencies": {
0
17
"@atproto/identity": "^0.4.0",
18
-
"@atproto/lexicon": "0.4.1-rc.0",
19
-
"@atproto/oauth-client-node": "0.0.2-rc.2",
20
-
"@atproto/repo": "0.4.2-rc.0",
21
"@atproto/syntax": "^0.3.0",
22
-
"@atproto/xrpc-server": "0.5.4-rc.0",
23
"better-sqlite3": "^11.1.2",
24
"dotenv": "^16.4.5",
25
"envalid": "^8.0.0",
···
14
"clean": "rimraf dist coverage"
15
},
16
"dependencies": {
17
+
"@atproto/api": "^0.13.4",
18
"@atproto/identity": "^0.4.0",
19
+
"@atproto/lexicon": "^0.4.1",
20
+
"@atproto/oauth-client-node": "^0.1.0",
21
+
"@atproto/repo": "^0.4.3",
22
"@atproto/syntax": "^0.3.0",
23
+
"@atproto/xrpc-server": "^0.6.3",
24
"better-sqlite3": "^11.1.2",
25
"dotenv": "^16.4.5",
26
"envalid": "^8.0.0",
+1
-1
src/auth/client.ts
···
14
: `http://localhost?redirect_uri=${encodeURIComponent(`${url}/oauth/callback`)}`,
15
client_uri: url,
16
redirect_uris: [`${url}/oauth/callback`],
17
-
scope: 'profile offline_access',
18
grant_types: ['authorization_code', 'refresh_token'],
19
response_types: ['code'],
20
application_type: 'web',
···
14
: `http://localhost?redirect_uri=${encodeURIComponent(`${url}/oauth/callback`)}`,
15
client_uri: url,
16
redirect_uris: [`${url}/oauth/callback`],
17
+
scope: 'atproto transition:generic',
18
grant_types: ['authorization_code', 'refresh_token'],
19
response_types: ['code'],
20
application_type: 'web',
+6
-2
src/auth/session.ts
···
1
import assert from 'node:assert'
2
import type { IncomingMessage, ServerResponse } from 'node:http'
3
import { getIronSession } from 'iron-session'
0
4
import { env } from '#/lib/env'
5
import { AppContext } from '#/index'
6
···
43
) {
44
const session = await getSessionRaw(req, res)
45
if (!session.did) return null
46
-
return await ctx.oauthClient.restore(session.did).catch(async (err) => {
0
0
0
47
ctx.logger.warn({ err }, 'oauth restore failed')
48
await destroySession(req, res)
49
return null
50
-
})
51
}
52
53
async function getSessionRaw(
···
1
import assert from 'node:assert'
2
import type { IncomingMessage, ServerResponse } from 'node:http'
3
import { getIronSession } from 'iron-session'
4
+
import { Agent } from '@atproto/api'
5
import { env } from '#/lib/env'
6
import { AppContext } from '#/index'
7
···
44
) {
45
const session = await getSessionRaw(req, res)
46
if (!session.did) return null
47
+
try {
48
+
const oauthSession = await ctx.oauthClient.restore(session.did)
49
+
return oauthSession ? new Agent(oauthSession) : null
50
+
} catch (err) {
51
ctx.logger.warn({ err }, 'oauth restore failed')
52
await destroySession(req, res)
53
return null
54
+
}
55
}
56
57
async function getSessionRaw(
+10
-8
src/routes.ts
···
44
handler(async (req, res) => {
45
const params = new URLSearchParams(req.originalUrl.split('?')[1])
46
try {
47
-
const { agent } = await ctx.oauthClient.callback(params)
48
-
await createSession(req, res, agent.accountDid)
49
} catch (err) {
50
ctx.logger.error({ err }, 'oauth callback failed')
51
return res.redirect('/?error')
···
74
75
// Initiate the OAuth flow
76
try {
77
-
const url = await ctx.oauthClient.authorize(handle)
0
0
78
return res.redirect(url.toString())
79
} catch (err) {
80
ctx.logger.error({ err }, 'oauth authorize failed')
···
119
? await ctx.db
120
.selectFrom('status')
121
.selectAll()
122
-
.where('authorDid', '=', agent.accountDid)
123
.executeTakeFirst()
124
: undefined
125
···
135
136
// Fetch additional information about the logged-in user
137
const { data: profile } = await agent.getProfile({
138
-
actor: agent.accountDid,
139
})
140
-
didHandleMap[profile.handle] = agent.accountDid
141
142
// Serve the logged-in view
143
return res
···
169
try {
170
// Write the status record to the user's repository
171
await agent.com.atproto.repo.putRecord({
172
-
repo: agent.accountDid,
173
collection: 'com.example.status',
174
rkey: 'self',
175
record,
···
188
await ctx.db
189
.insertInto('status')
190
.values({
191
-
authorDid: agent.accountDid,
192
status: record.status,
193
updatedAt: record.updatedAt,
194
indexedAt: new Date().toISOString(),
···
44
handler(async (req, res) => {
45
const params = new URLSearchParams(req.originalUrl.split('?')[1])
46
try {
47
+
const { session } = await ctx.oauthClient.callback(params)
48
+
await createSession(req, res, session.did)
49
} catch (err) {
50
ctx.logger.error({ err }, 'oauth callback failed')
51
return res.redirect('/?error')
···
74
75
// Initiate the OAuth flow
76
try {
77
+
const url = await ctx.oauthClient.authorize(handle, {
78
+
scope: 'atproto transition:generic'
79
+
})
80
return res.redirect(url.toString())
81
} catch (err) {
82
ctx.logger.error({ err }, 'oauth authorize failed')
···
121
? await ctx.db
122
.selectFrom('status')
123
.selectAll()
124
+
.where('authorDid', '=', agent.assertDid)
125
.executeTakeFirst()
126
: undefined
127
···
137
138
// Fetch additional information about the logged-in user
139
const { data: profile } = await agent.getProfile({
140
+
actor: agent.assertDid,
141
})
142
+
didHandleMap[profile.handle] = agent.assertDid
143
144
// Serve the logged-in view
145
return res
···
171
try {
172
// Write the status record to the user's repository
173
await agent.com.atproto.repo.putRecord({
174
+
repo: agent.assertDid,
175
collection: 'com.example.status',
176
rkey: 'self',
177
record,
···
190
await ctx.db
191
.insertInto('status')
192
.values({
193
+
authorDid: agent.assertDid,
194
status: record.status,
195
updatedAt: record.updatedAt,
196
indexedAt: new Date().toISOString(),