sunrise-cms/bin/www.ts

113 lines
2.7 KiB
TypeScript

/* eslint-disable no-process-exit, unicorn/no-process-exit */
import { app } from "../app.js";
import http from "node:http";
import * as configFunctions from "../helpers/functions.config.js";
import exitHook from "exit-hook";
import ntfyPublish from "@cityssm/ntfy-publish";
import type * as ntfyTypes from "@cityssm/ntfy-publish/types";
import Debug from "debug";
const debug = Debug("lot-occupancy-system:www");
interface ServerError extends Error {
syscall: string;
code: string;
}
const onError = (error: ServerError) => {
if (error.syscall !== "listen") {
throw error;
}
// handle specific listen errors with friendly messages
switch (error.code) {
// eslint-disable-next-line no-fallthrough
case "EACCES": {
debug("Requires elevated privileges");
process.exit(1);
// break;
}
// eslint-disable-next-line no-fallthrough
case "EADDRINUSE": {
debug("Port is already in use.");
process.exit(1);
// break;
}
// eslint-disable-next-line no-fallthrough
default: {
throw error;
}
}
};
const onListening = (server: http.Server) => {
const addr = server.address();
if (addr) {
const bind = typeof addr === "string" ? "pipe " + addr : "port " + addr.port.toString();
debug("Listening on " + bind);
}
};
/*
* Initialize HTTP
*/
const ntfyStartupConfig = configFunctions.getProperty("application.ntfyStartup");
const httpPort = configFunctions.getProperty("application.httpPort");
const httpServer = http.createServer(app);
httpServer.listen(httpPort);
httpServer.on("error", onError);
httpServer.on("listening", () => {
onListening(httpServer);
});
debug("HTTP listening on " + httpPort.toString());
exitHook(() => {
debug("Closing HTTP");
httpServer.close();
});
if (ntfyStartupConfig) {
const topic = ntfyStartupConfig.topic;
const server = ntfyStartupConfig.server;
const ntfyStartupMessage: ntfyTypes.NtfyMessageOptions = {
topic,
title: configFunctions.getProperty("application.applicationName"),
message: "Application Started",
tags: ["arrow_up"]
};
const ntfyShutdownMessage: ntfyTypes.NtfyMessageOptions = {
topic,
title: configFunctions.getProperty("application.applicationName"),
message: "Application Shut Down",
tags: ["arrow_down"]
};
if (server) {
ntfyStartupMessage.server = server;
ntfyShutdownMessage.server = server;
}
await ntfyPublish(ntfyStartupMessage);
exitHook(() => {
debug("Sending ntfy notification");
ntfyPublish(ntfyShutdownMessage);
});
}