import Koa from 'koa' import { logger } from './logging.js' import koaBody from 'koa-body' import cors from '@koa/cors' import { log } from '../config.js' import initRouter from './routers.js' import type Router from 'koa-router' import { startMongoose } from './mongo/index.js' const app = new Koa() let server: any function middleware (token: string) { return async (ctx: any, next: any) => { const authHeader = ctx.request.headers.authorization if (ctx.request.url.includes('/chat/file')) { await next() return } if (!authHeader) { ctx.throw(401, 'Authorization header missing') } const [ scheme, receivedToken ] = authHeader.split(' ') if (scheme.toLowerCase() !== 'bearer') { ctx.throw(401, 'Invalid authentication scheme') } const tokenId = token.split('_').pop() if (receivedToken !== tokenId) { ctx.throw(401, 'Invalid token') } await next() } } export async function initServer (port: number, token: string, mongoServer: string) { app.use(cors()) app.use(logger) app.use(koaBody()) app.use(middleware(token)) const router: Router = initRouter() app.use(router.routes()) server = app.listen(port) startMongoose(mongoServer) log.info('PuppetMini', `http listen on port: ${port}`) } export async function closeServer () { server.close() }