if (process.env.DD_APM_ENABLED) { require("./ddApm") } // need to load environment first import env from "./environment" import Application from "koa" import { bootstrap } from "global-agent" import * as db from "./db" import { sdk as proSdk } from "@budibase/pro" import { auth, logging, events, middleware, queue, env as coreEnv, timers, redis, } from "@budibase/backend-core" db.init() import Koa from "koa" import koaBody from "koa-body" import http from "http" import api from "./api" const koaSession = require("koa-session") import { userAgent } from "koa-useragent" import destroyable from "server-destroy" import { initPro } from "./initPro" import { handleScimBody } from "./middleware/handleScimBody" if (coreEnv.ENABLE_SSO_MAINTENANCE_MODE) { console.warn( "Warning: ENABLE_SSO_MAINTENANCE_MODE is set. It is recommended this flag is disabled if maintenance is not in progress" ) } // this will setup http and https proxies form env variables bootstrap() const app: Application = new Koa() app.keys = ["secret", "key"] // set up top level koa middleware app.use(handleScimBody) app.use(koaBody({ multipart: true })) app.use(koaSession(app)) app.use(middleware.correlation) app.use(middleware.pino) app.use(userAgent) // authentication app.use(auth.passport.initialize()) app.use(auth.passport.session()) // api routes app.use(api.routes()) const server = http.createServer(app.callback()) destroyable(server) let shuttingDown = false, errCode = 0 server.on("close", async () => { if (shuttingDown) { return } shuttingDown = true console.log("Server Closed") timers.cleanup() await redis.invite.shutdown() await redis.passwordReset.shutdown() await events.shutdown() await queue.shutdown() if (!env.isTest()) { process.exit(errCode) } }) const shutdown = () => { server.close() server.destroy() } export default server.listen(parseInt(env.PORT || "4002"), async () => { console.log(`Worker running on ${JSON.stringify(server.address())}`) await initPro() await redis.invite.init() await redis.passwordReset.init() // configure events to use the pro audit log write // can't integrate directly into backend-core due to cyclic issues await events.processors.init(proSdk.auditLogs.write) }) process.on("uncaughtException", err => { errCode = -1 logging.logAlert("Uncaught exception.", err) shutdown() }) process.on("SIGTERM", () => { shutdown() }) process.on("SIGINT", () => { shutdown() })