113 lines
2.7 KiB
TypeScript
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);
|
|
});
|
|
}
|