A simple AtProto app to read pet.mewsse.link records on my PDS.
at main 2.0 kB view raw
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()