A simple AtProto app to read pet.mewsse.link records on my PDS.
1import { findUserPDS, getUserDID } from './id-resolver.ts'
2import { createDb, migrateToLatest } from './db.ts'
3import { createIngester } from './ingester.ts'
4import { Jetstream } from '@skyware/jetstream'
5import { createRoutes } from './routes.ts'
6import { logger } from './lib/logger.ts'
7import { Router } from './lib/router.ts'
8import process from 'node:process'
9import dotenv from 'dotenv'
10
11import type { Did } from '@atcute/lexicons/syntax'
12import type { Database } from './db.ts'
13
14dotenv.config()
15
16export type Context = {
17 db: Database
18 jetstream: Jetstream,
19 httpServer: Router,
20 did: Did<"web"> | Did<"plc">,
21 pds: string
22}
23
24export class Server {
25 public ctx: Context
26
27 constructor(
28 ctx: Context
29 ) {
30 this.ctx = ctx
31 }
32
33 static async create() {
34 const port = process.env.PORT || "8080"
35 const dbPath = process.env.DB_PATH || ":memory"
36
37 const did = getUserDID()
38 const pds = await findUserPDS()
39
40 const db = createDb(dbPath)
41 await migrateToLatest(db)
42 logger.info('Migrating db to latest version')
43
44 const ingester = createIngester(db, did, pds)
45 await ingester.backfill()
46 const jetstream = await ingester.jetstream(did, pds)
47
48 const httpServer = new Router()
49
50 const ctx: Context = {
51 db,
52 jetstream,
53 httpServer,
54 did,
55 pds
56 }
57
58 jetstream.start()
59 logger.info("Starting jetstream client")
60
61 createRoutes(ctx)
62 httpServer.start(port)
63 logger.info(`Starting http server on port ${port}`)
64
65 return new Server(ctx)
66 }
67
68 async close() {
69 logger.info("Stopping jetstream client")
70 await this.ctx.jetstream.close()
71 await this.ctx.httpServer.close()
72
73 return new Promise<void>((resolve) => {
74 resolve()
75 })
76 }
77}
78
79
80const run = async () => {
81 const server = await Server.create()
82
83 const onClose = async () => {
84 setTimeout(() => process.exit(1), 10000).unref()
85 // await server.close()
86 process.exit()
87 }
88
89 process.on('SIGINT', onClose)
90 process.on('SIGTERM', onClose)
91}
92
93run()