node-server-engine 1.4.4 → 1.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -140,16 +140,13 @@ let Server = exports.Server = /*#__PURE__*/function () {
140
140
  }
141
141
  });
142
142
  process.on('beforeExit', code => console.error('process.beforeExit', code));
143
- process.on('exit', code => console.error('process.exit', code));
144
- process.on('SIGKILL', () => console.error('SIGKILL received')); // usually cannot catch SIGKILL
145
- process.on('SIGTERM', () => console.error('SIGTERM received'));
146
143
  }
147
144
 
148
145
  /** Start the server */
149
146
  }, {
150
147
  key: "init",
151
148
  value: async function init() {
152
- this.setupGlobalErrorLogging();
149
+ // this.setupGlobalErrorLogging();
153
150
  (0, _report.reportDebug)({
154
151
  namespace,
155
152
  message: `Starting Server`
@@ -1 +1 @@
1
- {"version":3,"file":"Server.js","names":["_fs","_interopRequireDefault","require","_path","_promises","_express","_cors","_ws","_SocketClient","_Server2","_Endpoint","_EngineError","_LifecycleController","_PubSub","_utils","_jwt","_report","_tlsConfig","namespace","Server","exports","config","_classCallCheck2","default","_defineProperty2","AbortController","validate","reportDebug","message","endpoints","globalMiddleware","errorMiddleware","initCallbacks","shutdownCallbacks","syncCallbacks","cron","auth","noFetch","checkEnvironment","process","env","RUN_MIGRATION","UNDO_MIGRATION","SQL_HOST","envAssert","isHost","SQL_USER","isString","SQL_PASSWORD","SQL_DB","NODE_ENV","PORT","isPort","SECONDARY_PORT","app","express","use","cors","origin","CORS_ORIGIN","methods","allowedHeaders","registerMiddleware","httpServer","createHttpServer","secondaryApp","secondaryMiddleware","defaultErrorMiddleware","forEach","middleware","secondaryHttpServer","disable","server","headersTimeout","keepAliveTimeout","webSocket","attachWebSocket","_createClass2","key","value","setupGlobalErrorLogging","on","err","console","error","stack","reason","Error","code","init","initKeySets","callback","runCallback","Promise","all","map","PubSub","job","runCronJob","resolve","listen","reportInfo","data","port","secondaryPort","nodeEnv","handleSignal","watchTlsCaFileChange","shutdown","listening","address","reportError","exit","close","wss","clients","socket","socketKillTimeout","WEBSOCKET_CLOSE_TIMEOUT","parseInt","setTimeout","readyState","CLOSING","OPEN","terminate","LifecycleController","shutdownRunningInstances","abortController","abort","shutdownKeySets","shutdownSignals","signal","removeAllListeners","getApp","getSecondaryApp","defaultMiddleware","path","endpoint","register","options","WebSocketServer","request","SocketClient","client","catch","file","fs","watch","event","loadTlsConfig","setSecureContext","tlsConfig","handler","name","interval","setTimeoutPromise","undefined","function","apply","parameters","some","Endpoint","EngineError","Object","values","validator","Array"],"sources":["../../../src/entities/Server/Server.ts"],"sourcesContent":["import fs from 'fs';\nimport http from 'http';\nimport https from 'https';\nimport { AddressInfo } from 'net';\nimport path from 'path';\nimport { setTimeout as setTimeoutPromise } from 'timers/promises';\nimport { ValidatorSpec } from 'envalid';\nimport express, { Application } from 'express';\nimport cors from 'cors';\nimport { Server as WebSocketServer } from 'ws';\nimport { SocketClient } from '../SocketClient';\nimport {\n defaultMiddleware,\n defaultErrorMiddleware,\n secondaryMiddleware,\n shutdownSignals\n} from './Server.const';\nimport {\n ServerOptions,\n ServerCronJon,\n ServerAuthConfig,\n ServerWebSocketConfig,\n ServerGlobalMiddleware,\n ServerErrorMiddleWare,\n ServerCallback\n} from './Server.types';\nimport { Endpoint } from 'entities/Endpoint';\nimport { EngineError } from 'entities/EngineError';\nimport { LifecycleController } from 'entities/LifecycleController';\nimport { PubSub } from 'entities/PubSub';\nimport { checkEnvironment, envAssert, createHttpServer } from 'utils';\nimport { initKeySets, shutdownKeySets } from 'utils/jwt';\nimport { reportInfo, reportError, reportDebug } from 'utils/report';\nimport { tlsConfig, loadTlsConfig, TlsConfig } from 'utils/tlsConfig';\n\nconst namespace = 'engine:Server';\n\n/** Main server class */\nexport class Server {\n /** The express application powering the main endpoints */\n private app: Application;\n /** The node HTTP(S) server, serving the main express application */\n private httpServer: http.Server | https.Server;\n /** The express application powering the support endpoints */\n private secondaryApp: Application;\n /** The node HTTP(S) server, serving the secondary express application */\n private secondaryHttpServer: http.Server | https.Server;\n /** List of endpoint instances that the server should handle */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private endpoints: Array<Endpoint<any>>;\n /** Mapping of env variable name with functions that should run to check their validity */\n private checkEnvironment: Record<string, ValidatorSpec<unknown>>;\n /** Middleware that should run on every request before the endpoint specific logic */\n private globalMiddleware: Array<ServerGlobalMiddleware>;\n /** Error middleware that should run on every request after the endpoint specific logic, but before the generic global middleware */\n private errorMiddleware: Array<\n ServerGlobalMiddleware | ServerErrorMiddleWare\n >;\n /** Functions that should be called on server startup */\n private initCallbacks: Array<ServerCallback>;\n /** Functions that should be called on server shutdown */\n private shutdownCallbacks: Array<ServerCallback>;\n /** When set to true, this indicates that init callbacks should run synchronously in the order they are declared. By default they all run in parallel */\n private syncCallbacks: boolean;\n /** Config to set regularly running jobs on the server */\n private cron?: Array<ServerCronJon>;\n /** Global auth related configuration */\n private auth: ServerAuthConfig;\n /** WebSocket server instance, if configured */\n private wss?: WebSocketServer;\n /** Abort controller that handles signals for the server */\n private abortController = new AbortController();\n\n /** Create a server */\n public constructor(config: ServerOptions) {\n this.validate(config);\n\n reportDebug({\n namespace,\n message: `Creating server`\n });\n\n this.endpoints = config.endpoints;\n this.globalMiddleware = config.globalMiddleware ?? [];\n this.errorMiddleware = config.errorMiddleware ?? [];\n this.initCallbacks = config.initCallbacks ?? [];\n this.shutdownCallbacks = config.shutdownCallbacks ?? [];\n this.syncCallbacks = config.syncCallbacks ?? false;\n this.cron = config.cron;\n this.auth = { noFetch: false, ...config.auth };\n\n // The minimal environment check is different between the migration modes of execution and the regular server execution mode\n // When running in migration mode, we only check that we have SQL related environment variables\n this.checkEnvironment =\n process.env.RUN_MIGRATION === 'true' ||\n process.env.UNDO_MIGRATION === 'true'\n ? {\n SQL_HOST: envAssert.isHost(),\n SQL_USER: envAssert.isString(),\n SQL_PASSWORD: envAssert.isString(),\n SQL_DB: envAssert.isString()\n }\n : {\n NODE_ENV: envAssert.isString(),\n PORT: envAssert.isPort(),\n SECONDARY_PORT: envAssert.isPort(),\n ...config.checkEnvironment\n };\n\n checkEnvironment(this.checkEnvironment);\n\n // Create the primary express core that serves the business logic\n this.app = express();\n this.app.use(\n cors({\n origin: process.env.CORS_ORIGIN ?? '*',\n methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],\n allowedHeaders: ['Content-Type', 'Authorization']\n })\n );\n this.registerMiddleware(this.app);\n this.httpServer = createHttpServer(this.app);\n\n // Create a secondary express core that servers metrics and analytics\n // This will be served on a different port, allowing to specify different firewall rules for these routes\n this.secondaryApp = express();\n [...secondaryMiddleware, ...defaultErrorMiddleware].forEach(\n (middleware) => {\n if (middleware) this.secondaryApp.use(middleware);\n }\n );\n this.secondaryHttpServer = createHttpServer(this.secondaryApp);\n\n // Remove the express headers\n this.app.disable('x-powered-by');\n this.secondaryApp.disable('x-powered-by');\n\n // We remove all node timeout on connections and requests\n // This responsibility is delegated to the front-facing load balancer\n [this.httpServer, this.secondaryHttpServer].forEach((server) => {\n server.headersTimeout = 0;\n server.keepAliveTimeout = 0;\n });\n\n if (config.webSocket) {\n this.attachWebSocket(config.webSocket);\n }\n }\n\n private setupGlobalErrorLogging(): void {\n process.on('uncaughtException', (err) => {\n console.error(\n '💥 uncaughtException:',\n err && err.stack ? err.stack : err\n );\n });\n process.on('unhandledRejection', (reason: unknown) => {\n if (reason instanceof Error) {\n console.error('💥 unhandledRejection:', reason.stack || reason.message);\n } else {\n console.error('💥 unhandledRejection:', reason);\n }\n });\n process.on('beforeExit', (code) =>\n console.error('process.beforeExit', code)\n );\n process.on('exit', (code) => console.error('process.exit', code));\n process.on('SIGKILL', () => console.error('SIGKILL received')); // usually cannot catch SIGKILL\n process.on('SIGTERM', () => console.error('SIGTERM received'));\n }\n\n /** Start the server */\n public async init(): Promise<void> {\n this.setupGlobalErrorLogging();\n reportDebug({ namespace, message: `Starting Server` });\n // Fetch the keys for JWT authentication\n // Ignore in test environment as we do symmetrical token signing\n if (process.env.NODE_ENV !== 'test' && !this.auth.noFetch)\n await initKeySets();\n // Run all the init callbacks\n // We can either run them all 1/1 synchronously or run them all in parallel (default)\n // Callback can either be direct function or an object with function and parameters attributes\n\n if (this.syncCallbacks) {\n for (const callback of this.initCallbacks) {\n await this.runCallback(callback);\n }\n } else {\n await Promise.all(\n this.initCallbacks.map((callback) => this.runCallback(callback))\n );\n }\n\n // Initialize the Pub/Sub module\n await PubSub.init();\n // Run all the cronjob\n if (this.cron) {\n this.cron.forEach((job) => {\n this.runCronJob(job);\n });\n }\n\n // Start listening to requests\n await Promise.all([\n new Promise<void>((resolve) =>\n this.httpServer.listen(process.env.PORT, () => {\n resolve();\n })\n ),\n new Promise<void>((resolve) =>\n this.secondaryHttpServer.listen(process.env.SECONDARY_PORT, () => {\n resolve();\n })\n )\n ]);\n reportInfo({\n message: 'SERVER_RUNNING',\n data: {\n port: process.env.PORT,\n secondaryPort: process.env.SECONDARY_PORT,\n nodeEnv: process.env.NODE_ENV\n }\n });\n\n this.handleSignal();\n\n // Watch TSL config files changing\n this.watchTlsCaFileChange();\n }\n\n /** Graceful shutdown */\n public async shutdown(): Promise<void> {\n reportDebug({ namespace, message: `Shutting down Server` });\n\n // Stop listening to HTTP requests\n await Promise.all(\n [this.httpServer, this.secondaryHttpServer].map((server) => {\n // Ignore if the server was already stopped\n // We have observed cases where SIGTERM was thrown multiple times\n if (!server.listening) return;\n const { port } = server.address() as AddressInfo;\n server.on('close', (error: unknown) => {\n if (error) {\n reportError(error);\n process.exit(1);\n } else {\n reportInfo({\n message: `Stopped listening to requests on port ${port}`\n });\n }\n });\n server.close();\n })\n );\n\n // Close all socket connections\n if (this.wss) {\n // First ask then to close gracefully\n this.wss.clients.forEach((socket) => {\n socket.close();\n });\n // Hard terminate all connections still open after a defined time\n const socketKillTimeout = process.env.WEBSOCKET_CLOSE_TIMEOUT\n ? parseInt(process.env.WEBSOCKET_CLOSE_TIMEOUT)\n : 5000;\n await new Promise<void>((resolve) => {\n setTimeout(() => {\n (this.wss as WebSocketServer).clients.forEach((socket) => {\n if (\n socket.readyState === socket.CLOSING ||\n socket.readyState === socket.OPEN\n ) {\n socket.terminate();\n }\n });\n resolve();\n }, socketKillTimeout);\n });\n }\n\n // Run all the shutdown callback\n if (this.syncCallbacks) {\n for (const callback of this.shutdownCallbacks) {\n await this.runCallback(callback);\n }\n } else {\n await Promise.all(\n this.shutdownCallbacks.map((callback) => this.runCallback(callback))\n );\n }\n\n // Shutdown all the running entities\n await LifecycleController.shutdownRunningInstances();\n\n // Abort all the cronjob\n if (this.abortController) this.abortController.abort();\n\n // Stop the keyset timers\n shutdownKeySets();\n\n shutdownSignals.forEach((signal) => process.removeAllListeners(signal));\n }\n\n /** Get the express app instance of the server */\n public getApp(): Application {\n return this.app;\n }\n\n /** Get the express app instance of the server */\n public getSecondaryApp(): Application {\n return this.secondaryApp;\n }\n\n /** Registers all the middleware with the express app */\n private registerMiddleware(app: Application): void {\n // Global middleware can specify a path to which they apply\n [...defaultMiddleware, ...this.globalMiddleware].forEach((middleware) => {\n if (typeof middleware === 'function') {\n app.use(middleware);\n } else {\n app.use(middleware.path, middleware.middleware);\n }\n });\n // Call the register method of each endpoint\n this.endpoints.forEach((endpoint) => {\n endpoint.register(app);\n });\n // Add error middleware\n [...this.errorMiddleware, ...defaultErrorMiddleware].forEach(\n (middleware) => {\n if (typeof middleware === 'function') {\n app.use(middleware);\n } else {\n app.use(middleware.path, middleware.middleware);\n }\n }\n );\n }\n\n /** Add a handler for WebSocket connections */\n private attachWebSocket(options: ServerWebSocketConfig): void {\n this.wss = new WebSocketServer({\n ...options.server,\n server: this.httpServer\n })\n .on('connection', (webSocket, request) => {\n new SocketClient(webSocket, request, options.client);\n })\n .on('error', (error) => {\n reportError(error);\n });\n }\n\n /** Call shutdown if signal gets sent to the process */\n private handleSignal(): void {\n shutdownSignals.forEach((signal) =>\n process.on(signal, () => {\n (async (): Promise<void> => {\n reportInfo(`Received shutdown signal [${signal}]`);\n await this.shutdown();\n })().catch((error) => {\n reportError(error);\n });\n })\n );\n }\n\n /** Watch the TLS certificate change event */\n private watchTlsCaFileChange(): void {\n [\n 'TLS_REQUEST_KEY',\n 'TLS_REQUEST_KEY_PASSPHRASE',\n 'TLS_REQUEST_CERT',\n 'TLS_REQUEST_CA',\n 'TLS_SERVER_KEY',\n 'TLS_SERVER_KEY_PASSPHRASE',\n 'TLS_SERVER_CERT',\n 'TLS_CA'\n ].forEach((key) => {\n const file = process.env[key];\n if (file)\n fs.watch(path.resolve(file), (event) => {\n if (event !== 'change') return;\n reportInfo(`Reloading TLS config [${file} changed]`);\n loadTlsConfig();\n (this.httpServer as https.Server).setSecureContext(\n tlsConfig as TlsConfig\n );\n });\n });\n }\n\n /** Executes a recurring job */\n private runCronJob(job: ServerCronJon): void {\n (async (): Promise<void> => {\n reportInfo({ message: `Starting scheduled job \"${job.handler.name}\"` });\n try {\n await job.handler();\n reportInfo({\n message: `Job \"${job.handler.name}\" finished, starting again in ${job.interval} seconds`\n });\n await setTimeoutPromise(job.interval * 1000, undefined, {\n signal: this.abortController.signal\n });\n this.runCronJob(job);\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n reportDebug({\n namespace,\n message: `Scheduled job \"${job.handler?.name}\" has been aborted`\n });\n } else {\n throw error;\n }\n }\n })().catch((error) => {\n reportError(error);\n });\n }\n\n /** Run a shutdown/init callback */\n private runCallback(callback: ServerCallback): unknown {\n return typeof callback === 'function'\n ? callback()\n : callback.function.apply(null, callback.parameters ?? []);\n }\n\n /**\n * Validate the Server constructor configuration\n */\n private validate(config: ServerOptions): void {\n if (\n !config.endpoints ||\n config.endpoints.some((endpoint) => !(endpoint instanceof Endpoint))\n )\n throw new EngineError(\n 'Server endpoints should be declared and all be Endpoint instances'\n );\n\n if (\n config.checkEnvironment &&\n Object.values(config.checkEnvironment).some(\n (validator) => typeof validator !== 'function'\n )\n )\n throw new EngineError(\n 'Some of the environment checks are not valid functions'\n );\n\n if (\n config.initCallbacks &&\n (!(config.initCallbacks instanceof Array) ||\n config.initCallbacks.some(\n (callback) =>\n !(\n typeof callback === 'function' ||\n typeof callback?.function === 'function'\n )\n ))\n )\n throw new EngineError('Init callbacks is not a list of functions');\n\n if (\n config.shutdownCallbacks &&\n (!(config.shutdownCallbacks instanceof Array) ||\n config.shutdownCallbacks.some(\n (callback) =>\n !(\n typeof callback === 'function' ||\n typeof callback?.function === 'function'\n )\n ))\n )\n throw new EngineError('Shutdown callbacks is not a list of functions');\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"Server.js","names":["_fs","_interopRequireDefault","require","_path","_promises","_express","_cors","_ws","_SocketClient","_Server2","_Endpoint","_EngineError","_LifecycleController","_PubSub","_utils","_jwt","_report","_tlsConfig","namespace","Server","exports","config","_classCallCheck2","default","_defineProperty2","AbortController","validate","reportDebug","message","endpoints","globalMiddleware","errorMiddleware","initCallbacks","shutdownCallbacks","syncCallbacks","cron","auth","noFetch","checkEnvironment","process","env","RUN_MIGRATION","UNDO_MIGRATION","SQL_HOST","envAssert","isHost","SQL_USER","isString","SQL_PASSWORD","SQL_DB","NODE_ENV","PORT","isPort","SECONDARY_PORT","app","express","use","cors","origin","CORS_ORIGIN","methods","allowedHeaders","registerMiddleware","httpServer","createHttpServer","secondaryApp","secondaryMiddleware","defaultErrorMiddleware","forEach","middleware","secondaryHttpServer","disable","server","headersTimeout","keepAliveTimeout","webSocket","attachWebSocket","_createClass2","key","value","setupGlobalErrorLogging","on","err","console","error","stack","reason","Error","code","init","initKeySets","callback","runCallback","Promise","all","map","PubSub","job","runCronJob","resolve","listen","reportInfo","data","port","secondaryPort","nodeEnv","handleSignal","watchTlsCaFileChange","shutdown","listening","address","reportError","exit","close","wss","clients","socket","socketKillTimeout","WEBSOCKET_CLOSE_TIMEOUT","parseInt","setTimeout","readyState","CLOSING","OPEN","terminate","LifecycleController","shutdownRunningInstances","abortController","abort","shutdownKeySets","shutdownSignals","signal","removeAllListeners","getApp","getSecondaryApp","defaultMiddleware","path","endpoint","register","options","WebSocketServer","request","SocketClient","client","catch","file","fs","watch","event","loadTlsConfig","setSecureContext","tlsConfig","handler","name","interval","setTimeoutPromise","undefined","function","apply","parameters","some","Endpoint","EngineError","Object","values","validator","Array"],"sources":["../../../src/entities/Server/Server.ts"],"sourcesContent":["import fs from 'fs';\nimport http from 'http';\nimport https from 'https';\nimport { AddressInfo } from 'net';\nimport path from 'path';\nimport { setTimeout as setTimeoutPromise } from 'timers/promises';\nimport { ValidatorSpec } from 'envalid';\nimport express, { Application } from 'express';\nimport cors from 'cors';\nimport { Server as WebSocketServer } from 'ws';\nimport { SocketClient } from '../SocketClient';\nimport {\n defaultMiddleware,\n defaultErrorMiddleware,\n secondaryMiddleware,\n shutdownSignals\n} from './Server.const';\nimport {\n ServerOptions,\n ServerCronJon,\n ServerAuthConfig,\n ServerWebSocketConfig,\n ServerGlobalMiddleware,\n ServerErrorMiddleWare,\n ServerCallback\n} from './Server.types';\nimport { Endpoint } from 'entities/Endpoint';\nimport { EngineError } from 'entities/EngineError';\nimport { LifecycleController } from 'entities/LifecycleController';\nimport { PubSub } from 'entities/PubSub';\nimport { checkEnvironment, envAssert, createHttpServer } from 'utils';\nimport { initKeySets, shutdownKeySets } from 'utils/jwt';\nimport { reportInfo, reportError, reportDebug } from 'utils/report';\nimport { tlsConfig, loadTlsConfig, TlsConfig } from 'utils/tlsConfig';\n\nconst namespace = 'engine:Server';\n\n/** Main server class */\nexport class Server {\n /** The express application powering the main endpoints */\n private app: Application;\n /** The node HTTP(S) server, serving the main express application */\n private httpServer: http.Server | https.Server;\n /** The express application powering the support endpoints */\n private secondaryApp: Application;\n /** The node HTTP(S) server, serving the secondary express application */\n private secondaryHttpServer: http.Server | https.Server;\n /** List of endpoint instances that the server should handle */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private endpoints: Array<Endpoint<any>>;\n /** Mapping of env variable name with functions that should run to check their validity */\n private checkEnvironment: Record<string, ValidatorSpec<unknown>>;\n /** Middleware that should run on every request before the endpoint specific logic */\n private globalMiddleware: Array<ServerGlobalMiddleware>;\n /** Error middleware that should run on every request after the endpoint specific logic, but before the generic global middleware */\n private errorMiddleware: Array<\n ServerGlobalMiddleware | ServerErrorMiddleWare\n >;\n /** Functions that should be called on server startup */\n private initCallbacks: Array<ServerCallback>;\n /** Functions that should be called on server shutdown */\n private shutdownCallbacks: Array<ServerCallback>;\n /** When set to true, this indicates that init callbacks should run synchronously in the order they are declared. By default they all run in parallel */\n private syncCallbacks: boolean;\n /** Config to set regularly running jobs on the server */\n private cron?: Array<ServerCronJon>;\n /** Global auth related configuration */\n private auth: ServerAuthConfig;\n /** WebSocket server instance, if configured */\n private wss?: WebSocketServer;\n /** Abort controller that handles signals for the server */\n private abortController = new AbortController();\n\n /** Create a server */\n public constructor(config: ServerOptions) {\n this.validate(config);\n\n reportDebug({\n namespace,\n message: `Creating server`\n });\n\n this.endpoints = config.endpoints;\n this.globalMiddleware = config.globalMiddleware ?? [];\n this.errorMiddleware = config.errorMiddleware ?? [];\n this.initCallbacks = config.initCallbacks ?? [];\n this.shutdownCallbacks = config.shutdownCallbacks ?? [];\n this.syncCallbacks = config.syncCallbacks ?? false;\n this.cron = config.cron;\n this.auth = { noFetch: false, ...config.auth };\n\n // The minimal environment check is different between the migration modes of execution and the regular server execution mode\n // When running in migration mode, we only check that we have SQL related environment variables\n this.checkEnvironment =\n process.env.RUN_MIGRATION === 'true' ||\n process.env.UNDO_MIGRATION === 'true'\n ? {\n SQL_HOST: envAssert.isHost(),\n SQL_USER: envAssert.isString(),\n SQL_PASSWORD: envAssert.isString(),\n SQL_DB: envAssert.isString()\n }\n : {\n NODE_ENV: envAssert.isString(),\n PORT: envAssert.isPort(),\n SECONDARY_PORT: envAssert.isPort(),\n ...config.checkEnvironment\n };\n\n checkEnvironment(this.checkEnvironment);\n\n // Create the primary express core that serves the business logic\n this.app = express();\n this.app.use(\n cors({\n origin: process.env.CORS_ORIGIN ?? '*',\n methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],\n allowedHeaders: ['Content-Type', 'Authorization']\n })\n );\n this.registerMiddleware(this.app);\n this.httpServer = createHttpServer(this.app);\n\n // Create a secondary express core that servers metrics and analytics\n // This will be served on a different port, allowing to specify different firewall rules for these routes\n this.secondaryApp = express();\n [...secondaryMiddleware, ...defaultErrorMiddleware].forEach(\n (middleware) => {\n if (middleware) this.secondaryApp.use(middleware);\n }\n );\n this.secondaryHttpServer = createHttpServer(this.secondaryApp);\n\n // Remove the express headers\n this.app.disable('x-powered-by');\n this.secondaryApp.disable('x-powered-by');\n\n // We remove all node timeout on connections and requests\n // This responsibility is delegated to the front-facing load balancer\n [this.httpServer, this.secondaryHttpServer].forEach((server) => {\n server.headersTimeout = 0;\n server.keepAliveTimeout = 0;\n });\n\n if (config.webSocket) {\n this.attachWebSocket(config.webSocket);\n }\n }\n\n private setupGlobalErrorLogging(): void {\n process.on('uncaughtException', (err) => {\n console.error(\n '💥 uncaughtException:',\n err && err.stack ? err.stack : err\n );\n });\n process.on('unhandledRejection', (reason: unknown) => {\n if (reason instanceof Error) {\n console.error('💥 unhandledRejection:', reason.stack || reason.message);\n } else {\n console.error('💥 unhandledRejection:', reason);\n }\n });\n process.on('beforeExit', (code) =>\n console.error('process.beforeExit', code)\n );\n }\n\n /** Start the server */\n public async init(): Promise<void> {\n // this.setupGlobalErrorLogging();\n reportDebug({ namespace, message: `Starting Server` });\n // Fetch the keys for JWT authentication\n // Ignore in test environment as we do symmetrical token signing\n if (process.env.NODE_ENV !== 'test' && !this.auth.noFetch)\n await initKeySets();\n // Run all the init callbacks\n // We can either run them all 1/1 synchronously or run them all in parallel (default)\n // Callback can either be direct function or an object with function and parameters attributes\n\n if (this.syncCallbacks) {\n for (const callback of this.initCallbacks) {\n await this.runCallback(callback);\n }\n } else {\n await Promise.all(\n this.initCallbacks.map((callback) => this.runCallback(callback))\n );\n }\n\n // Initialize the Pub/Sub module\n await PubSub.init();\n // Run all the cronjob\n if (this.cron) {\n this.cron.forEach((job) => {\n this.runCronJob(job);\n });\n }\n\n // Start listening to requests\n await Promise.all([\n new Promise<void>((resolve) =>\n this.httpServer.listen(process.env.PORT, () => {\n resolve();\n })\n ),\n new Promise<void>((resolve) =>\n this.secondaryHttpServer.listen(process.env.SECONDARY_PORT, () => {\n resolve();\n })\n )\n ]);\n reportInfo({\n message: 'SERVER_RUNNING',\n data: {\n port: process.env.PORT,\n secondaryPort: process.env.SECONDARY_PORT,\n nodeEnv: process.env.NODE_ENV\n }\n });\n\n this.handleSignal();\n\n // Watch TSL config files changing\n this.watchTlsCaFileChange();\n }\n\n /** Graceful shutdown */\n public async shutdown(): Promise<void> {\n reportDebug({ namespace, message: `Shutting down Server` });\n\n // Stop listening to HTTP requests\n await Promise.all(\n [this.httpServer, this.secondaryHttpServer].map((server) => {\n // Ignore if the server was already stopped\n // We have observed cases where SIGTERM was thrown multiple times\n if (!server.listening) return;\n const { port } = server.address() as AddressInfo;\n server.on('close', (error: unknown) => {\n if (error) {\n reportError(error);\n process.exit(1);\n } else {\n reportInfo({\n message: `Stopped listening to requests on port ${port}`\n });\n }\n });\n server.close();\n })\n );\n\n // Close all socket connections\n if (this.wss) {\n // First ask then to close gracefully\n this.wss.clients.forEach((socket) => {\n socket.close();\n });\n // Hard terminate all connections still open after a defined time\n const socketKillTimeout = process.env.WEBSOCKET_CLOSE_TIMEOUT\n ? parseInt(process.env.WEBSOCKET_CLOSE_TIMEOUT)\n : 5000;\n await new Promise<void>((resolve) => {\n setTimeout(() => {\n (this.wss as WebSocketServer).clients.forEach((socket) => {\n if (\n socket.readyState === socket.CLOSING ||\n socket.readyState === socket.OPEN\n ) {\n socket.terminate();\n }\n });\n resolve();\n }, socketKillTimeout);\n });\n }\n\n // Run all the shutdown callback\n if (this.syncCallbacks) {\n for (const callback of this.shutdownCallbacks) {\n await this.runCallback(callback);\n }\n } else {\n await Promise.all(\n this.shutdownCallbacks.map((callback) => this.runCallback(callback))\n );\n }\n\n // Shutdown all the running entities\n await LifecycleController.shutdownRunningInstances();\n\n // Abort all the cronjob\n if (this.abortController) this.abortController.abort();\n\n // Stop the keyset timers\n shutdownKeySets();\n\n shutdownSignals.forEach((signal) => process.removeAllListeners(signal));\n }\n\n /** Get the express app instance of the server */\n public getApp(): Application {\n return this.app;\n }\n\n /** Get the express app instance of the server */\n public getSecondaryApp(): Application {\n return this.secondaryApp;\n }\n\n /** Registers all the middleware with the express app */\n private registerMiddleware(app: Application): void {\n // Global middleware can specify a path to which they apply\n [...defaultMiddleware, ...this.globalMiddleware].forEach((middleware) => {\n if (typeof middleware === 'function') {\n app.use(middleware);\n } else {\n app.use(middleware.path, middleware.middleware);\n }\n });\n // Call the register method of each endpoint\n this.endpoints.forEach((endpoint) => {\n endpoint.register(app);\n });\n // Add error middleware\n [...this.errorMiddleware, ...defaultErrorMiddleware].forEach(\n (middleware) => {\n if (typeof middleware === 'function') {\n app.use(middleware);\n } else {\n app.use(middleware.path, middleware.middleware);\n }\n }\n );\n }\n\n /** Add a handler for WebSocket connections */\n private attachWebSocket(options: ServerWebSocketConfig): void {\n this.wss = new WebSocketServer({\n ...options.server,\n server: this.httpServer\n })\n .on('connection', (webSocket, request) => {\n new SocketClient(webSocket, request, options.client);\n })\n .on('error', (error) => {\n reportError(error);\n });\n }\n\n /** Call shutdown if signal gets sent to the process */\n private handleSignal(): void {\n shutdownSignals.forEach((signal) =>\n process.on(signal, () => {\n (async (): Promise<void> => {\n reportInfo(`Received shutdown signal [${signal}]`);\n await this.shutdown();\n })().catch((error) => {\n reportError(error);\n });\n })\n );\n }\n\n /** Watch the TLS certificate change event */\n private watchTlsCaFileChange(): void {\n [\n 'TLS_REQUEST_KEY',\n 'TLS_REQUEST_KEY_PASSPHRASE',\n 'TLS_REQUEST_CERT',\n 'TLS_REQUEST_CA',\n 'TLS_SERVER_KEY',\n 'TLS_SERVER_KEY_PASSPHRASE',\n 'TLS_SERVER_CERT',\n 'TLS_CA'\n ].forEach((key) => {\n const file = process.env[key];\n if (file)\n fs.watch(path.resolve(file), (event) => {\n if (event !== 'change') return;\n reportInfo(`Reloading TLS config [${file} changed]`);\n loadTlsConfig();\n (this.httpServer as https.Server).setSecureContext(\n tlsConfig as TlsConfig\n );\n });\n });\n }\n\n /** Executes a recurring job */\n private runCronJob(job: ServerCronJon): void {\n (async (): Promise<void> => {\n reportInfo({ message: `Starting scheduled job \"${job.handler.name}\"` });\n try {\n await job.handler();\n reportInfo({\n message: `Job \"${job.handler.name}\" finished, starting again in ${job.interval} seconds`\n });\n await setTimeoutPromise(job.interval * 1000, undefined, {\n signal: this.abortController.signal\n });\n this.runCronJob(job);\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n reportDebug({\n namespace,\n message: `Scheduled job \"${job.handler?.name}\" has been aborted`\n });\n } else {\n throw error;\n }\n }\n })().catch((error) => {\n reportError(error);\n });\n }\n\n /** Run a shutdown/init callback */\n private runCallback(callback: ServerCallback): unknown {\n return typeof callback === 'function'\n ? callback()\n : callback.function.apply(null, callback.parameters ?? []);\n }\n\n /**\n * Validate the Server constructor configuration\n */\n private validate(config: ServerOptions): void {\n if (\n !config.endpoints ||\n config.endpoints.some((endpoint) => !(endpoint instanceof Endpoint))\n )\n throw new EngineError(\n 'Server endpoints should be declared and all be Endpoint instances'\n );\n\n if (\n config.checkEnvironment &&\n Object.values(config.checkEnvironment).some(\n (validator) => typeof validator !== 'function'\n )\n )\n throw new EngineError(\n 'Some of the environment checks are not valid functions'\n );\n\n if (\n config.initCallbacks &&\n (!(config.initCallbacks instanceof Array) ||\n config.initCallbacks.some(\n (callback) =>\n !(\n typeof callback === 'function' ||\n typeof callback?.function === 'function'\n )\n ))\n )\n throw new EngineError('Init callbacks is not a list of functions');\n\n if (\n config.shutdownCallbacks &&\n (!(config.shutdownCallbacks instanceof Array) ||\n config.shutdownCallbacks.some(\n (callback) =>\n !(\n typeof callback === 'function' ||\n typeof callback?.function === 'function'\n )\n ))\n )\n throw new EngineError('Shutdown callbacks is not a list of functions');\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -14,10 +14,10 @@ function createHttpServer(handler) {
14
14
  // Validate the environment variables
15
15
  (0, _createHttpServer.validateHttpEnvironment)();
16
16
  // Create a https server if env var are specified
17
- if (process.env.TLS_SERVER_KEY && process.env.TLS_SERVER_CERT) {
17
+ if (process.env.TLS_SERVER_KEY && process.env.TLS_SERVER_CERT && process.env.TLS_SERVER_KEY_PASSPHRASE) {
18
18
  return (0, _https.createServer)({
19
19
  key: _fs.default.readFileSync(process.env.TLS_SERVER_KEY),
20
- passphrase: process.env.TLS_SERVER_KEY_PASSPHRASE,
20
+ passphrase: _fs.default.readFileSync(process.env.TLS_SERVER_KEY_PASSPHRASE, 'utf8').trim(),
21
21
  cert: _fs.default.readFileSync(process.env.TLS_SERVER_CERT),
22
22
  ca: process.env.TLS_CA ? _fs.default.readFileSync(process.env.TLS_CA) : undefined,
23
23
  requestCert: true,
@@ -1 +1 @@
1
- {"version":3,"file":"createHttpServer.js","names":["_fs","_interopRequireDefault","require","_http","_https","_createHttpServer","createHttpServer","handler","validateHttpEnvironment","process","env","TLS_SERVER_KEY","TLS_SERVER_CERT","createSecureServer","key","fs","readFileSync","passphrase","TLS_SERVER_KEY_PASSPHRASE","cert","ca","TLS_CA","undefined","requestCert","rejectUnauthorized","createServer"],"sources":["../../../src/utils/createHttpServer/createHttpServer.ts"],"sourcesContent":["import fs from 'fs';\nimport { createServer, RequestListener, Server } from 'http';\nimport {\n createServer as createSecureServer,\n Server as SecureServer\n} from 'https';\nimport { Application } from 'express';\nimport { validateHttpEnvironment } from './createHttpServer.validate';\n\n/** Create and configure an http/https server */\nexport function createHttpServer(\n handler?: Application | RequestListener\n): Server | SecureServer {\n // Validate the environment variables\n validateHttpEnvironment();\n // Create a https server if env var are specified\n if (process.env.TLS_SERVER_KEY && process.env.TLS_SERVER_CERT) {\n return createSecureServer(\n {\n key: fs.readFileSync(process.env.TLS_SERVER_KEY),\n passphrase: process.env.TLS_SERVER_KEY_PASSPHRASE,\n cert: fs.readFileSync(process.env.TLS_SERVER_CERT),\n ca: process.env.TLS_CA\n ? fs.readFileSync(process.env.TLS_CA)\n : undefined,\n requestCert: true,\n rejectUnauthorized: false\n },\n handler\n );\n } else {\n return createServer(handler);\n }\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,GAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AAKA,IAAAG,iBAAA,GAAAH,OAAA;AAEA;AACO,SAASI,gBAAgBA,CAC9BC,OAAuC,EAChB;EACvB;EACA,IAAAC,yCAAuB,EAAC,CAAC;EACzB;EACA,IAAIC,OAAO,CAACC,GAAG,CAACC,cAAc,IAAIF,OAAO,CAACC,GAAG,CAACE,eAAe,EAAE;IAC7D,OAAO,IAAAC,mBAAkB,EACvB;MACEC,GAAG,EAAEC,WAAE,CAACC,YAAY,CAACP,OAAO,CAACC,GAAG,CAACC,cAAc,CAAC;MAChDM,UAAU,EAAER,OAAO,CAACC,GAAG,CAACQ,yBAAyB;MACjDC,IAAI,EAAEJ,WAAE,CAACC,YAAY,CAACP,OAAO,CAACC,GAAG,CAACE,eAAe,CAAC;MAClDQ,EAAE,EAAEX,OAAO,CAACC,GAAG,CAACW,MAAM,GAClBN,WAAE,CAACC,YAAY,CAACP,OAAO,CAACC,GAAG,CAACW,MAAM,CAAC,GACnCC,SAAS;MACbC,WAAW,EAAE,IAAI;MACjBC,kBAAkB,EAAE;IACtB,CAAC,EACDjB,OACF,CAAC;EACH,CAAC,MAAM;IACL,OAAO,IAAAkB,kBAAY,EAAClB,OAAO,CAAC;EAC9B;AACF","ignoreList":[]}
1
+ {"version":3,"file":"createHttpServer.js","names":["_fs","_interopRequireDefault","require","_http","_https","_createHttpServer","createHttpServer","handler","validateHttpEnvironment","process","env","TLS_SERVER_KEY","TLS_SERVER_CERT","TLS_SERVER_KEY_PASSPHRASE","createSecureServer","key","fs","readFileSync","passphrase","trim","cert","ca","TLS_CA","undefined","requestCert","rejectUnauthorized","createServer"],"sources":["../../../src/utils/createHttpServer/createHttpServer.ts"],"sourcesContent":["import fs from 'fs';\nimport { createServer, RequestListener, Server } from 'http';\nimport {\n createServer as createSecureServer,\n Server as SecureServer\n} from 'https';\nimport { Application } from 'express';\nimport { validateHttpEnvironment } from './createHttpServer.validate';\n\n/** Create and configure an http/https server */\nexport function createHttpServer(\n handler?: Application | RequestListener\n): Server | SecureServer {\n // Validate the environment variables\n validateHttpEnvironment();\n // Create a https server if env var are specified\n if (\n process.env.TLS_SERVER_KEY &&\n process.env.TLS_SERVER_CERT &&\n process.env.TLS_SERVER_KEY_PASSPHRASE\n ) {\n return createSecureServer(\n {\n key: fs.readFileSync(process.env.TLS_SERVER_KEY),\n passphrase: fs\n .readFileSync(process.env.TLS_SERVER_KEY_PASSPHRASE, 'utf8')\n .trim(),\n cert: fs.readFileSync(process.env.TLS_SERVER_CERT),\n ca: process.env.TLS_CA\n ? fs.readFileSync(process.env.TLS_CA)\n : undefined,\n requestCert: true,\n rejectUnauthorized: false\n },\n handler\n );\n } else {\n return createServer(handler);\n }\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,GAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AAKA,IAAAG,iBAAA,GAAAH,OAAA;AAEA;AACO,SAASI,gBAAgBA,CAC9BC,OAAuC,EAChB;EACvB;EACA,IAAAC,yCAAuB,EAAC,CAAC;EACzB;EACA,IACEC,OAAO,CAACC,GAAG,CAACC,cAAc,IAC1BF,OAAO,CAACC,GAAG,CAACE,eAAe,IAC3BH,OAAO,CAACC,GAAG,CAACG,yBAAyB,EACrC;IACA,OAAO,IAAAC,mBAAkB,EACvB;MACEC,GAAG,EAAEC,WAAE,CAACC,YAAY,CAACR,OAAO,CAACC,GAAG,CAACC,cAAc,CAAC;MAChDO,UAAU,EAAEF,WAAE,CACXC,YAAY,CAACR,OAAO,CAACC,GAAG,CAACG,yBAAyB,EAAE,MAAM,CAAC,CAC3DM,IAAI,CAAC,CAAC;MACTC,IAAI,EAAEJ,WAAE,CAACC,YAAY,CAACR,OAAO,CAACC,GAAG,CAACE,eAAe,CAAC;MAClDS,EAAE,EAAEZ,OAAO,CAACC,GAAG,CAACY,MAAM,GAClBN,WAAE,CAACC,YAAY,CAACR,OAAO,CAACC,GAAG,CAACY,MAAM,CAAC,GACnCC,SAAS;MACbC,WAAW,EAAE,IAAI;MACjBC,kBAAkB,EAAE;IACtB,CAAC,EACDlB,OACF,CAAC;EACH,CAAC,MAAM;IACL,OAAO,IAAAmB,kBAAY,EAACnB,OAAO,CAAC;EAC9B;AACF","ignoreList":[]}
@@ -20,7 +20,7 @@ function validateHttpEnvironment() {
20
20
  // Optional variables
21
21
  if (process.env.TLS_SERVER_KEY_PASSPHRASE) {
22
22
  (0, _.assertEnvironment)({
23
- TLS_SERVER_KEY_PASSPHRASE: _.envAssert.isString()
23
+ TLS_SERVER_KEY_PASSPHRASE: _.envAssert.isPath()
24
24
  });
25
25
  }
26
26
  if (process.env.TLS_CA) (0, _.assertEnvironment)({
@@ -1 +1 @@
1
- {"version":3,"file":"createHttpServer.validate.js","names":["_","require","validateHttpEnvironment","process","env","TLS_SERVER_CERT","assertEnvironment","TLS_SERVER_KEY","envAssert","isPath","TLS_SERVER_KEY_PASSPHRASE","isString","TLS_CA"],"sources":["../../../src/utils/createHttpServer/createHttpServer.validate.ts"],"sourcesContent":["import { assertEnvironment, envAssert } from 'utils';\n\n/**\n * Environment variable validator for the creation of a HTTP(S) server\n */\nexport function validateHttpEnvironment(): void {\n // We only check if there is at least the host specified\n if (process.env.TLS_SERVER_CERT && process.env.TLS_SERVER_CERT) {\n assertEnvironment({ TLS_SERVER_KEY: envAssert.isPath() });\n assertEnvironment({ TLS_SERVER_CERT: envAssert.isPath() });\n // Optional variables\n if (process.env.TLS_SERVER_KEY_PASSPHRASE) {\n assertEnvironment({ TLS_SERVER_KEY_PASSPHRASE: envAssert.isString() });\n }\n if (process.env.TLS_CA) assertEnvironment({ TLS_CA: envAssert.isPath() });\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,CAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACO,SAASC,uBAAuBA,CAAA,EAAS;EAC9C;EACA,IAAIC,OAAO,CAACC,GAAG,CAACC,eAAe,IAAIF,OAAO,CAACC,GAAG,CAACC,eAAe,EAAE;IAC9D,IAAAC,mBAAiB,EAAC;MAAEC,cAAc,EAAEC,WAAS,CAACC,MAAM,CAAC;IAAE,CAAC,CAAC;IACzD,IAAAH,mBAAiB,EAAC;MAAED,eAAe,EAAEG,WAAS,CAACC,MAAM,CAAC;IAAE,CAAC,CAAC;IAC1D;IACA,IAAIN,OAAO,CAACC,GAAG,CAACM,yBAAyB,EAAE;MACzC,IAAAJ,mBAAiB,EAAC;QAAEI,yBAAyB,EAAEF,WAAS,CAACG,QAAQ,CAAC;MAAE,CAAC,CAAC;IACxE;IACA,IAAIR,OAAO,CAACC,GAAG,CAACQ,MAAM,EAAE,IAAAN,mBAAiB,EAAC;MAAEM,MAAM,EAAEJ,WAAS,CAACC,MAAM,CAAC;IAAE,CAAC,CAAC;EAC3E;AACF","ignoreList":[]}
1
+ {"version":3,"file":"createHttpServer.validate.js","names":["_","require","validateHttpEnvironment","process","env","TLS_SERVER_CERT","assertEnvironment","TLS_SERVER_KEY","envAssert","isPath","TLS_SERVER_KEY_PASSPHRASE","TLS_CA"],"sources":["../../../src/utils/createHttpServer/createHttpServer.validate.ts"],"sourcesContent":["import { assertEnvironment, envAssert } from 'utils';\n\n/**\n * Environment variable validator for the creation of a HTTP(S) server\n */\nexport function validateHttpEnvironment(): void {\n // We only check if there is at least the host specified\n if (process.env.TLS_SERVER_CERT && process.env.TLS_SERVER_CERT) {\n assertEnvironment({ TLS_SERVER_KEY: envAssert.isPath() });\n assertEnvironment({ TLS_SERVER_CERT: envAssert.isPath() });\n // Optional variables\n if (process.env.TLS_SERVER_KEY_PASSPHRASE) {\n assertEnvironment({ TLS_SERVER_KEY_PASSPHRASE: envAssert.isPath() });\n }\n if (process.env.TLS_CA) assertEnvironment({ TLS_CA: envAssert.isPath() });\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,CAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACO,SAASC,uBAAuBA,CAAA,EAAS;EAC9C;EACA,IAAIC,OAAO,CAACC,GAAG,CAACC,eAAe,IAAIF,OAAO,CAACC,GAAG,CAACC,eAAe,EAAE;IAC9D,IAAAC,mBAAiB,EAAC;MAAEC,cAAc,EAAEC,WAAS,CAACC,MAAM,CAAC;IAAE,CAAC,CAAC;IACzD,IAAAH,mBAAiB,EAAC;MAAED,eAAe,EAAEG,WAAS,CAACC,MAAM,CAAC;IAAE,CAAC,CAAC;IAC1D;IACA,IAAIN,OAAO,CAACC,GAAG,CAACM,yBAAyB,EAAE;MACzC,IAAAJ,mBAAiB,EAAC;QAAEI,yBAAyB,EAAEF,WAAS,CAACC,MAAM,CAAC;MAAE,CAAC,CAAC;IACtE;IACA,IAAIN,OAAO,CAACC,GAAG,CAACO,MAAM,EAAE,IAAAL,mBAAiB,EAAC;MAAEK,MAAM,EAAEH,WAAS,CAACC,MAAM,CAAC;IAAE,CAAC,CAAC;EAC3E;AACF","ignoreList":[]}
@@ -26,7 +26,7 @@ function loadTlsConfig() {
26
26
  key: _fs.default.readFileSync(process.env.TLS_REQUEST_KEY ?? process.env.TLS_SERVER_KEY, 'utf-8'),
27
27
  cert: _fs.default.readFileSync(process.env.TLS_REQUEST_CERT ?? process.env.TLS_SERVER_CERT, 'utf-8'),
28
28
  ca: _fs.default.readFileSync(process.env.TLS_REQUEST_CA ?? process.env.TLS_CA, 'utf-8'),
29
- passphrase: process.env.TLS_REQUEST_KEY_PASSPHRASE ?? process.env.TLS_SERVER_KEY_PASSPHRASE
29
+ passphrase: _fs.default.readFileSync(process.env.TLS_REQUEST_KEY_PASSPHRASE ?? process.env.TLS_SERVER_KEY_PASSPHRASE, 'utf-8')
30
30
  };
31
31
  exports.httpsAgent = httpsAgent = new _https.default.Agent({
32
32
  key: tlsConfig.key,
@@ -1 +1 @@
1
- {"version":3,"file":"tlsConfig.js","names":["_fs","_interopRequireDefault","require","_https","_tlsConfig","_EngineError","tlsConfig","exports","httpsAgent","loadTlsConfig","validateTlsConfig","undefined","process","env","TLS_REQUEST_KEY","TLS_SERVER_KEY","key","fs","readFileSync","cert","TLS_REQUEST_CERT","TLS_SERVER_CERT","ca","TLS_REQUEST_CA","TLS_CA","passphrase","TLS_REQUEST_KEY_PASSPHRASE","TLS_SERVER_KEY_PASSPHRASE","https","Agent","EngineError","message"],"sources":["../../../src/utils/tlsConfig/tlsConfig.ts"],"sourcesContent":["import fs from 'fs';\nimport https, { Agent } from 'https';\nimport { TlsConfig } from './tlsConfig.types';\nimport { validateTlsConfig } from './tlsConfig.validate';\nimport { EngineError } from 'entities/EngineError';\n\nexport let tlsConfig: undefined | TlsConfig;\nexport let httpsAgent: undefined | Agent;\n\n/**\n * Load TLS config by its Environment setting.\n */\nexport function loadTlsConfig(): void {\n // Check that environment variables are correctly set\n validateTlsConfig();\n tlsConfig = undefined;\n\n if (process.env.TLS_REQUEST_KEY || process.env.TLS_SERVER_KEY) {\n tlsConfig = {\n key: fs.readFileSync(\n (process.env.TLS_REQUEST_KEY ?? process.env.TLS_SERVER_KEY) as string,\n 'utf-8'\n ),\n cert: fs.readFileSync(\n (process.env.TLS_REQUEST_CERT ?? process.env.TLS_SERVER_CERT) as string,\n 'utf-8'\n ),\n ca: fs.readFileSync(\n (process.env.TLS_REQUEST_CA ?? process.env.TLS_CA) as string,\n 'utf-8'\n ),\n passphrase: (process.env.TLS_REQUEST_KEY_PASSPHRASE ??\n process.env.TLS_SERVER_KEY_PASSPHRASE) as string\n } as TlsConfig;\n httpsAgent = new https.Agent({\n key: tlsConfig.key,\n cert: tlsConfig.cert,\n ca: tlsConfig.ca,\n passphrase: tlsConfig.passphrase\n });\n }\n if (!tlsConfig || !(tlsConfig.ca && tlsConfig.cert && tlsConfig.key)) {\n throw new EngineError({\n message: 'TLS environment variables are not set correctly'\n });\n }\n}\n"],"mappings":";;;;;;;;;AAAA,IAAAA,GAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAF,sBAAA,CAAAC,OAAA;AAEA,IAAAE,UAAA,GAAAF,OAAA;AACA,IAAAG,YAAA,GAAAH,OAAA;AAEO,IAAII,SAAgC,GAAAC,OAAA,CAAAD,SAAA;AACpC,IAAIE,UAA6B,GAAAD,OAAA,CAAAC,UAAA;;AAExC;AACA;AACA;AACO,SAASC,aAAaA,CAAA,EAAS;EACpC;EACA,IAAAC,4BAAiB,EAAC,CAAC;EACnBH,OAAA,CAAAD,SAAA,GAAAA,SAAS,GAAGK,SAAS;EAErB,IAAIC,OAAO,CAACC,GAAG,CAACC,eAAe,IAAIF,OAAO,CAACC,GAAG,CAACE,cAAc,EAAE;IAC7DR,OAAA,CAAAD,SAAA,GAAAA,SAAS,GAAG;MACVU,GAAG,EAAEC,WAAE,CAACC,YAAY,CACjBN,OAAO,CAACC,GAAG,CAACC,eAAe,IAAIF,OAAO,CAACC,GAAG,CAACE,cAAc,EAC1D,OACF,CAAC;MACDI,IAAI,EAAEF,WAAE,CAACC,YAAY,CAClBN,OAAO,CAACC,GAAG,CAACO,gBAAgB,IAAIR,OAAO,CAACC,GAAG,CAACQ,eAAe,EAC5D,OACF,CAAC;MACDC,EAAE,EAAEL,WAAE,CAACC,YAAY,CAChBN,OAAO,CAACC,GAAG,CAACU,cAAc,IAAIX,OAAO,CAACC,GAAG,CAACW,MAAM,EACjD,OACF,CAAC;MACDC,UAAU,EAAGb,OAAO,CAACC,GAAG,CAACa,0BAA0B,IACjDd,OAAO,CAACC,GAAG,CAACc;IAChB,CAAc;IACdpB,OAAA,CAAAC,UAAA,GAAAA,UAAU,GAAG,IAAIoB,cAAK,CAACC,KAAK,CAAC;MAC3Bb,GAAG,EAAEV,SAAS,CAACU,GAAG;MAClBG,IAAI,EAAEb,SAAS,CAACa,IAAI;MACpBG,EAAE,EAAEhB,SAAS,CAACgB,EAAE;MAChBG,UAAU,EAAEnB,SAAS,CAACmB;IACxB,CAAC,CAAC;EACJ;EACA,IAAI,CAACnB,SAAS,IAAI,EAAEA,SAAS,CAACgB,EAAE,IAAIhB,SAAS,CAACa,IAAI,IAAIb,SAAS,CAACU,GAAG,CAAC,EAAE;IACpE,MAAM,IAAIc,wBAAW,CAAC;MACpBC,OAAO,EAAE;IACX,CAAC,CAAC;EACJ;AACF","ignoreList":[]}
1
+ {"version":3,"file":"tlsConfig.js","names":["_fs","_interopRequireDefault","require","_https","_tlsConfig","_EngineError","tlsConfig","exports","httpsAgent","loadTlsConfig","validateTlsConfig","undefined","process","env","TLS_REQUEST_KEY","TLS_SERVER_KEY","key","fs","readFileSync","cert","TLS_REQUEST_CERT","TLS_SERVER_CERT","ca","TLS_REQUEST_CA","TLS_CA","passphrase","TLS_REQUEST_KEY_PASSPHRASE","TLS_SERVER_KEY_PASSPHRASE","https","Agent","EngineError","message"],"sources":["../../../src/utils/tlsConfig/tlsConfig.ts"],"sourcesContent":["import fs from 'fs';\nimport https, { Agent } from 'https';\nimport { TlsConfig } from './tlsConfig.types';\nimport { validateTlsConfig } from './tlsConfig.validate';\nimport { EngineError } from 'entities/EngineError';\n\nexport let tlsConfig: undefined | TlsConfig;\nexport let httpsAgent: undefined | Agent;\n\n/**\n * Load TLS config by its Environment setting.\n */\nexport function loadTlsConfig(): void {\n // Check that environment variables are correctly set\n validateTlsConfig();\n tlsConfig = undefined;\n\n if (process.env.TLS_REQUEST_KEY || process.env.TLS_SERVER_KEY) {\n tlsConfig = {\n key: fs.readFileSync(\n (process.env.TLS_REQUEST_KEY ?? process.env.TLS_SERVER_KEY) as string,\n 'utf-8'\n ),\n cert: fs.readFileSync(\n (process.env.TLS_REQUEST_CERT ?? process.env.TLS_SERVER_CERT) as string,\n 'utf-8'\n ),\n ca: fs.readFileSync(\n (process.env.TLS_REQUEST_CA ?? process.env.TLS_CA) as string,\n 'utf-8'\n ),\n passphrase: fs.readFileSync(\n (process.env.TLS_REQUEST_KEY_PASSPHRASE ??\n process.env.TLS_SERVER_KEY_PASSPHRASE) as string,\n 'utf-8'\n )\n } as TlsConfig;\n httpsAgent = new https.Agent({\n key: tlsConfig.key,\n cert: tlsConfig.cert,\n ca: tlsConfig.ca,\n passphrase: tlsConfig.passphrase\n });\n }\n if (!tlsConfig || !(tlsConfig.ca && tlsConfig.cert && tlsConfig.key)) {\n throw new EngineError({\n message: 'TLS environment variables are not set correctly'\n });\n }\n}\n"],"mappings":";;;;;;;;;AAAA,IAAAA,GAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAF,sBAAA,CAAAC,OAAA;AAEA,IAAAE,UAAA,GAAAF,OAAA;AACA,IAAAG,YAAA,GAAAH,OAAA;AAEO,IAAII,SAAgC,GAAAC,OAAA,CAAAD,SAAA;AACpC,IAAIE,UAA6B,GAAAD,OAAA,CAAAC,UAAA;;AAExC;AACA;AACA;AACO,SAASC,aAAaA,CAAA,EAAS;EACpC;EACA,IAAAC,4BAAiB,EAAC,CAAC;EACnBH,OAAA,CAAAD,SAAA,GAAAA,SAAS,GAAGK,SAAS;EAErB,IAAIC,OAAO,CAACC,GAAG,CAACC,eAAe,IAAIF,OAAO,CAACC,GAAG,CAACE,cAAc,EAAE;IAC7DR,OAAA,CAAAD,SAAA,GAAAA,SAAS,GAAG;MACVU,GAAG,EAAEC,WAAE,CAACC,YAAY,CACjBN,OAAO,CAACC,GAAG,CAACC,eAAe,IAAIF,OAAO,CAACC,GAAG,CAACE,cAAc,EAC1D,OACF,CAAC;MACDI,IAAI,EAAEF,WAAE,CAACC,YAAY,CAClBN,OAAO,CAACC,GAAG,CAACO,gBAAgB,IAAIR,OAAO,CAACC,GAAG,CAACQ,eAAe,EAC5D,OACF,CAAC;MACDC,EAAE,EAAEL,WAAE,CAACC,YAAY,CAChBN,OAAO,CAACC,GAAG,CAACU,cAAc,IAAIX,OAAO,CAACC,GAAG,CAACW,MAAM,EACjD,OACF,CAAC;MACDC,UAAU,EAAER,WAAE,CAACC,YAAY,CACxBN,OAAO,CAACC,GAAG,CAACa,0BAA0B,IACrCd,OAAO,CAACC,GAAG,CAACc,yBAAyB,EACvC,OACF;IACF,CAAc;IACdpB,OAAA,CAAAC,UAAA,GAAAA,UAAU,GAAG,IAAIoB,cAAK,CAACC,KAAK,CAAC;MAC3Bb,GAAG,EAAEV,SAAS,CAACU,GAAG;MAClBG,IAAI,EAAEb,SAAS,CAACa,IAAI;MACpBG,EAAE,EAAEhB,SAAS,CAACgB,EAAE;MAChBG,UAAU,EAAEnB,SAAS,CAACmB;IACxB,CAAC,CAAC;EACJ;EACA,IAAI,CAACnB,SAAS,IAAI,EAAEA,SAAS,CAACgB,EAAE,IAAIhB,SAAS,CAACa,IAAI,IAAIb,SAAS,CAACU,GAAG,CAAC,EAAE;IACpE,MAAM,IAAIc,wBAAW,CAAC;MACpBC,OAAO,EAAE;IACX,CAAC,CAAC;EACJ;AACF","ignoreList":[]}
@@ -23,7 +23,7 @@ function validateTlsConfig() {
23
23
  // Optional variables
24
24
  if (process.env.TLS_REQUEST_KEY_PASSPHRASE) {
25
25
  (0, _.assertEnvironment)({
26
- TLS_REQUEST_KEY_PASSPHRASE: _.envAssert.isString()
26
+ TLS_REQUEST_KEY_PASSPHRASE: _.envAssert.isPath()
27
27
  });
28
28
  }
29
29
  } else if (process.env.TLS_SERVER_CERT) {
@@ -40,7 +40,7 @@ function validateTlsConfig() {
40
40
  // Optional variables
41
41
  if (process.env.TLS_SERVER_KEY_PASSPHRASE) {
42
42
  (0, _.assertEnvironment)({
43
- TLS_SERVER_KEY_PASSPHRASE: _.envAssert.isString()
43
+ TLS_SERVER_KEY_PASSPHRASE: _.envAssert.isPath()
44
44
  });
45
45
  }
46
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tlsConfig.validate.js","names":["_","require","validateTlsConfig","process","env","TLS_REQUEST_CERT","assertEnvironment","TLS_REQUEST_KEY","envAssert","isPath","TLS_REQUEST_CA","TLS_REQUEST_KEY_PASSPHRASE","isString","TLS_SERVER_CERT","TLS_SERVER_KEY","TLS_CA","TLS_SERVER_KEY_PASSPHRASE"],"sources":["../../../src/utils/tlsConfig/tlsConfig.validate.ts"],"sourcesContent":["import { assertEnvironment, envAssert } from 'utils';\n/**\n * Verify that the environment variables\n */\nexport function validateTlsConfig(): void {\n // We only check if there is at least the host specified\n if (process.env.TLS_REQUEST_CERT) {\n assertEnvironment({ TLS_REQUEST_KEY: envAssert.isPath() });\n assertEnvironment({ TLS_REQUEST_CERT: envAssert.isPath() });\n assertEnvironment({ TLS_REQUEST_CA: envAssert.isPath() });\n // Optional variables\n if (process.env.TLS_REQUEST_KEY_PASSPHRASE) {\n assertEnvironment({ TLS_REQUEST_KEY_PASSPHRASE: envAssert.isString() });\n }\n } else if (process.env.TLS_SERVER_CERT) {\n // if no TLS Request setting, TLS Server setting is essential.\n assertEnvironment({ TLS_SERVER_KEY: envAssert.isPath() });\n assertEnvironment({ TLS_SERVER_CERT: envAssert.isPath() });\n assertEnvironment({ TLS_CA: envAssert.isPath() });\n // Optional variables\n if (process.env.TLS_SERVER_KEY_PASSPHRASE) {\n assertEnvironment({ TLS_SERVER_KEY_PASSPHRASE: envAssert.isString() });\n }\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,CAAA,GAAAC,OAAA;AACA;AACA;AACA;AACO,SAASC,iBAAiBA,CAAA,EAAS;EACxC;EACA,IAAIC,OAAO,CAACC,GAAG,CAACC,gBAAgB,EAAE;IAChC,IAAAC,mBAAiB,EAAC;MAAEC,eAAe,EAAEC,WAAS,CAACC,MAAM,CAAC;IAAE,CAAC,CAAC;IAC1D,IAAAH,mBAAiB,EAAC;MAAED,gBAAgB,EAAEG,WAAS,CAACC,MAAM,CAAC;IAAE,CAAC,CAAC;IAC3D,IAAAH,mBAAiB,EAAC;MAAEI,cAAc,EAAEF,WAAS,CAACC,MAAM,CAAC;IAAE,CAAC,CAAC;IACzD;IACA,IAAIN,OAAO,CAACC,GAAG,CAACO,0BAA0B,EAAE;MAC1C,IAAAL,mBAAiB,EAAC;QAAEK,0BAA0B,EAAEH,WAAS,CAACI,QAAQ,CAAC;MAAE,CAAC,CAAC;IACzE;EACF,CAAC,MAAM,IAAIT,OAAO,CAACC,GAAG,CAACS,eAAe,EAAE;IACtC;IACA,IAAAP,mBAAiB,EAAC;MAAEQ,cAAc,EAAEN,WAAS,CAACC,MAAM,CAAC;IAAE,CAAC,CAAC;IACzD,IAAAH,mBAAiB,EAAC;MAAEO,eAAe,EAAEL,WAAS,CAACC,MAAM,CAAC;IAAE,CAAC,CAAC;IAC1D,IAAAH,mBAAiB,EAAC;MAAES,MAAM,EAAEP,WAAS,CAACC,MAAM,CAAC;IAAE,CAAC,CAAC;IACjD;IACA,IAAIN,OAAO,CAACC,GAAG,CAACY,yBAAyB,EAAE;MACzC,IAAAV,mBAAiB,EAAC;QAAEU,yBAAyB,EAAER,WAAS,CAACI,QAAQ,CAAC;MAAE,CAAC,CAAC;IACxE;EACF;AACF","ignoreList":[]}
1
+ {"version":3,"file":"tlsConfig.validate.js","names":["_","require","validateTlsConfig","process","env","TLS_REQUEST_CERT","assertEnvironment","TLS_REQUEST_KEY","envAssert","isPath","TLS_REQUEST_CA","TLS_REQUEST_KEY_PASSPHRASE","TLS_SERVER_CERT","TLS_SERVER_KEY","TLS_CA","TLS_SERVER_KEY_PASSPHRASE"],"sources":["../../../src/utils/tlsConfig/tlsConfig.validate.ts"],"sourcesContent":["import { assertEnvironment, envAssert } from 'utils';\n/**\n * Verify that the environment variables\n */\nexport function validateTlsConfig(): void {\n // We only check if there is at least the host specified\n if (process.env.TLS_REQUEST_CERT) {\n assertEnvironment({ TLS_REQUEST_KEY: envAssert.isPath() });\n assertEnvironment({ TLS_REQUEST_CERT: envAssert.isPath() });\n assertEnvironment({ TLS_REQUEST_CA: envAssert.isPath() });\n // Optional variables\n if (process.env.TLS_REQUEST_KEY_PASSPHRASE) {\n assertEnvironment({ TLS_REQUEST_KEY_PASSPHRASE: envAssert.isPath() });\n }\n } else if (process.env.TLS_SERVER_CERT) {\n // if no TLS Request setting, TLS Server setting is essential.\n assertEnvironment({ TLS_SERVER_KEY: envAssert.isPath() });\n assertEnvironment({ TLS_SERVER_CERT: envAssert.isPath() });\n assertEnvironment({ TLS_CA: envAssert.isPath() });\n // Optional variables\n if (process.env.TLS_SERVER_KEY_PASSPHRASE) {\n assertEnvironment({ TLS_SERVER_KEY_PASSPHRASE: envAssert.isPath() });\n }\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,CAAA,GAAAC,OAAA;AACA;AACA;AACA;AACO,SAASC,iBAAiBA,CAAA,EAAS;EACxC;EACA,IAAIC,OAAO,CAACC,GAAG,CAACC,gBAAgB,EAAE;IAChC,IAAAC,mBAAiB,EAAC;MAAEC,eAAe,EAAEC,WAAS,CAACC,MAAM,CAAC;IAAE,CAAC,CAAC;IAC1D,IAAAH,mBAAiB,EAAC;MAAED,gBAAgB,EAAEG,WAAS,CAACC,MAAM,CAAC;IAAE,CAAC,CAAC;IAC3D,IAAAH,mBAAiB,EAAC;MAAEI,cAAc,EAAEF,WAAS,CAACC,MAAM,CAAC;IAAE,CAAC,CAAC;IACzD;IACA,IAAIN,OAAO,CAACC,GAAG,CAACO,0BAA0B,EAAE;MAC1C,IAAAL,mBAAiB,EAAC;QAAEK,0BAA0B,EAAEH,WAAS,CAACC,MAAM,CAAC;MAAE,CAAC,CAAC;IACvE;EACF,CAAC,MAAM,IAAIN,OAAO,CAACC,GAAG,CAACQ,eAAe,EAAE;IACtC;IACA,IAAAN,mBAAiB,EAAC;MAAEO,cAAc,EAAEL,WAAS,CAACC,MAAM,CAAC;IAAE,CAAC,CAAC;IACzD,IAAAH,mBAAiB,EAAC;MAAEM,eAAe,EAAEJ,WAAS,CAACC,MAAM,CAAC;IAAE,CAAC,CAAC;IAC1D,IAAAH,mBAAiB,EAAC;MAAEQ,MAAM,EAAEN,WAAS,CAACC,MAAM,CAAC;IAAE,CAAC,CAAC;IACjD;IACA,IAAIN,OAAO,CAACC,GAAG,CAACW,yBAAyB,EAAE;MACzC,IAAAT,mBAAiB,EAAC;QAAES,yBAAyB,EAAEP,WAAS,CAACC,MAAM,CAAC;MAAE,CAAC,CAAC;IACtE;EACF;AACF","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-server-engine",
3
- "version": "1.4.4",
3
+ "version": "1.4.6",
4
4
  "description": "Framework used to develop backend services. This package ships with a lot of features to standardize the creation of services, letting you focus on the business logic.",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -164,14 +164,11 @@ export class Server {
164
164
  process.on('beforeExit', (code) =>
165
165
  console.error('process.beforeExit', code)
166
166
  );
167
- process.on('exit', (code) => console.error('process.exit', code));
168
- process.on('SIGKILL', () => console.error('SIGKILL received')); // usually cannot catch SIGKILL
169
- process.on('SIGTERM', () => console.error('SIGTERM received'));
170
167
  }
171
168
 
172
169
  /** Start the server */
173
170
  public async init(): Promise<void> {
174
- this.setupGlobalErrorLogging();
171
+ // this.setupGlobalErrorLogging();
175
172
  reportDebug({ namespace, message: `Starting Server` });
176
173
  // Fetch the keys for JWT authentication
177
174
  // Ignore in test environment as we do symmetrical token signing
@@ -14,11 +14,17 @@ export function createHttpServer(
14
14
  // Validate the environment variables
15
15
  validateHttpEnvironment();
16
16
  // Create a https server if env var are specified
17
- if (process.env.TLS_SERVER_KEY && process.env.TLS_SERVER_CERT) {
17
+ if (
18
+ process.env.TLS_SERVER_KEY &&
19
+ process.env.TLS_SERVER_CERT &&
20
+ process.env.TLS_SERVER_KEY_PASSPHRASE
21
+ ) {
18
22
  return createSecureServer(
19
23
  {
20
24
  key: fs.readFileSync(process.env.TLS_SERVER_KEY),
21
- passphrase: process.env.TLS_SERVER_KEY_PASSPHRASE,
25
+ passphrase: fs
26
+ .readFileSync(process.env.TLS_SERVER_KEY_PASSPHRASE, 'utf8')
27
+ .trim(),
22
28
  cert: fs.readFileSync(process.env.TLS_SERVER_CERT),
23
29
  ca: process.env.TLS_CA
24
30
  ? fs.readFileSync(process.env.TLS_CA)
@@ -10,7 +10,7 @@ export function validateHttpEnvironment(): void {
10
10
  assertEnvironment({ TLS_SERVER_CERT: envAssert.isPath() });
11
11
  // Optional variables
12
12
  if (process.env.TLS_SERVER_KEY_PASSPHRASE) {
13
- assertEnvironment({ TLS_SERVER_KEY_PASSPHRASE: envAssert.isString() });
13
+ assertEnvironment({ TLS_SERVER_KEY_PASSPHRASE: envAssert.isPath() });
14
14
  }
15
15
  if (process.env.TLS_CA) assertEnvironment({ TLS_CA: envAssert.isPath() });
16
16
  }
@@ -29,8 +29,11 @@ export function loadTlsConfig(): void {
29
29
  (process.env.TLS_REQUEST_CA ?? process.env.TLS_CA) as string,
30
30
  'utf-8'
31
31
  ),
32
- passphrase: (process.env.TLS_REQUEST_KEY_PASSPHRASE ??
33
- process.env.TLS_SERVER_KEY_PASSPHRASE) as string
32
+ passphrase: fs.readFileSync(
33
+ (process.env.TLS_REQUEST_KEY_PASSPHRASE ??
34
+ process.env.TLS_SERVER_KEY_PASSPHRASE) as string,
35
+ 'utf-8'
36
+ )
34
37
  } as TlsConfig;
35
38
  httpsAgent = new https.Agent({
36
39
  key: tlsConfig.key,
@@ -10,7 +10,7 @@ export function validateTlsConfig(): void {
10
10
  assertEnvironment({ TLS_REQUEST_CA: envAssert.isPath() });
11
11
  // Optional variables
12
12
  if (process.env.TLS_REQUEST_KEY_PASSPHRASE) {
13
- assertEnvironment({ TLS_REQUEST_KEY_PASSPHRASE: envAssert.isString() });
13
+ assertEnvironment({ TLS_REQUEST_KEY_PASSPHRASE: envAssert.isPath() });
14
14
  }
15
15
  } else if (process.env.TLS_SERVER_CERT) {
16
16
  // if no TLS Request setting, TLS Server setting is essential.
@@ -19,7 +19,7 @@ export function validateTlsConfig(): void {
19
19
  assertEnvironment({ TLS_CA: envAssert.isPath() });
20
20
  // Optional variables
21
21
  if (process.env.TLS_SERVER_KEY_PASSPHRASE) {
22
- assertEnvironment({ TLS_SERVER_KEY_PASSPHRASE: envAssert.isString() });
22
+ assertEnvironment({ TLS_SERVER_KEY_PASSPHRASE: envAssert.isPath() });
23
23
  }
24
24
  }
25
25
  }