import { Server } from 'http' import Koa, { ParameterizedContext } from 'koa' import koaBody from 'koa-body' import cors from '@koa/cors' import { Obj } from 'src/type' import log from 'src/log' import { getPort } from 'src/port' import { LogPrefixConeAuth } from 'src/util' import { enableDestroyServer } from 'src/server' import { createRouter } from './router' // function cors(ctx: ParameterizedContext) { // ctx.set('access-control-allow-origin', '*') // ctx.set('access-control-allow-methods', '*') // ctx.set('access-control-allow-headers', '*') // } function onError(ctx: ParameterizedContext, err: Obj) { log.error(LogPrefixConeAuth, '\nserver error') log.error(LogPrefixConeAuth, '', err) ctx.body = { success: false, msg: err.message || 'server error', query: ctx.query, body: ctx.request.body as string, clue: err.clue || undefined, } } export async function createAuthServer(): Promise<{ port: number url: string server: Server destroyServer: () => void }> { const port = await getPort() let url = '' let server: Server const app = new Koa() app.use(async (ctx, next) => { log.verbose('cone-auth', 'request', ctx.url) await next() }) app.use(cors()) app.use(koaBody({ jsonLimit: '1000mb' })) app.use(async (ctx, next) => { try { // cors(ctx) ctx.port = port await next() } catch (err: unknown) { onError(ctx, err as Obj) } }) app.use(createRouter()) server = await new Promise((resolve) => { server = app.listen(port, () => { url = `http://localhost:${port}` log.verbose('cone-auth', `server started at ${url}`) resolve(server) }) }) const destroyServer = enableDestroyServer(server) return { port, url, server, destroyServer } }