Scratch space for learning atproto app development
1import { NodeOAuthClient } from '@atproto/oauth-client-node'
2import { Firehose } from '@atproto/sync'
3import { pino } from 'pino'
4
5import { createOAuthClient } from '#/auth/client'
6import { createDb, Database, migrateToLatest } from '#/db'
7import { createIngester } from '#/ingester'
8import { env } from '#/env'
9import {
10 BidirectionalResolver,
11 createBidirectionalResolver,
12} from '#/id-resolver'
13
14/**
15 * Application state passed to the router and elsewhere
16 */
17export type AppContext = {
18 db: Database
19 ingester: Firehose
20 logger: pino.Logger
21 oauthClient: NodeOAuthClient
22 resolver: BidirectionalResolver
23 destroy: () => Promise<void>
24}
25
26export async function createAppContext(): Promise<AppContext> {
27 const db = createDb(env.DB_PATH)
28 await migrateToLatest(db)
29 const oauthClient = await createOAuthClient(db)
30 const ingester = createIngester(db)
31 const logger = pino({ name: 'server', level: env.LOG_LEVEL })
32 const resolver = createBidirectionalResolver(oauthClient)
33
34 return {
35 db,
36 ingester,
37 logger,
38 oauthClient,
39 resolver,
40
41 async destroy() {
42 await ingester.destroy()
43 await db.destroy()
44 },
45 }
46}