UNPKG

@medflyt/test-db-service

Version:

Developer tool to instantly provision test PostgreSQL databases from a template

138 lines 5.36 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.startHttpServer = exports.PORT = void 0; const assert_never_1 = require("assert-never"); const express = require("express"); const gracefulExit = require("express-graceful-exit"); const HttpRouter_1 = require("./HttpUtils/HttpRouter"); const TemporaryDatabaseService_1 = require("./TemporaryDatabaseService/TemporaryDatabaseService"); /** * This port is hardcoded because this needs to be standardized so many * different services can use the same shared server */ exports.PORT = 18543; async function startHttpServer(serverName) { // TODO Centralized logging (to streaming HTTP endpoint?) return await new Promise((resolve, reject) => { const temporaryDatabaseService = new TemporaryDatabaseService_1.TemporaryDatabaseService(); const app = express(); HttpRouter_1.GET(serverName, app, "/", async () => { const status = await temporaryDatabaseService.getStatus(); return { status: 200, body: { pid: process.pid, status: status } }; }); HttpRouter_1.POST(serverName, app, "/database", async (query) => { const pg = query["pg"]; const hash = query["hash"]; if (pg === undefined) { return { status: 400, body: { error: `Required query param': "pg"` } }; } if (hash === undefined) { return { status: 400, body: { error: `Required query param: "hash"` } }; } const result = await temporaryDatabaseService.getFreshDatabase(pg, hash); switch (result.type) { case "CreateTemplate": return { status: 202, body: { templateUrl: result.templateUrl, token: result.commitToken } }; case "Ready": return { status: 201, body: { url: result.url } }; default: return assert_never_1.assertNever(result); } }); HttpRouter_1.POST(serverName, app, "/database/commit", async (query) => { const token = query["token"]; if (token === undefined) { return { status: 400, body: { error: `Required query param: "token"` } }; } const commitResult = await temporaryDatabaseService.commitTemplate(token); if (commitResult === null) { return { status: 400, body: { error: "Invalid or expired commit token" } }; } else { return { status: 201, body: { url: commitResult } }; } }); HttpRouter_1.POST(serverName, app, "/database/drop", async (query) => { const url = query["url"]; if (url === undefined) { return { status: 400, body: { error: `Required query param: "url"` } }; } await temporaryDatabaseService.dropDatabase(url); return { status: 204, body: {} }; }); HttpRouter_1.POST(serverName, app, "/database/release", async (query) => { const url = query["url"]; const hash = query["hash"]; if (url === undefined) { return { status: 400, body: { error: `Required query param: "url"` } }; } if (hash === undefined) { return { status: 400, body: { error: `Required query param: "hash"` } }; } await temporaryDatabaseService.releaseDatabase(url, hash); return { status: 204, body: {} }; }); HttpRouter_1.POST(serverName, app, "/shutdown", async (query) => { shutdown(); return { status: 204, body: {} }; }); const server = app.listen(exports.PORT, () => { console.log(`Server is listening on: http://localhost:${exports.PORT}`); }).on("error", (err) => { reject(err); }); gracefulExit.init(server); server.on("connection", (socket) => { socket.setNoDelay(true); }); function shutdown() { gracefulExit.gracefulExitHandler(app, server, { exitProcess: false, performLastRequest: true, errorDuringExit: true, callback: () => { console.log("Closing TemporaryDatabaseService"); // eslint-disable-next-line @typescript-eslint/no-floating-promises temporaryDatabaseService.close().then(() => { resolve(); }); } }); } process.on("SIGINT", () => { shutdown(); }); process.on("SIGTERM", () => { shutdown(); }); }); } exports.startHttpServer = startHttpServer; //# sourceMappingURL=app_http_server.js.map