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