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()