@medflyt/test-db-service
Version:
Developer tool to instantly provision test PostgreSQL databases from a template
138 lines • 5.36 kB
JavaScript
;
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