node-server-engine 2.0.1 → 2.0.2

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.
Files changed (41) hide show
  1. package/.commitlintrc.js +10 -10
  2. package/.nycrc +1 -3
  3. package/.releaserc.js +2 -1
  4. package/README.md +194 -138
  5. package/dist/const/metrics.js.map +1 -1
  6. package/dist/db/models/index.js.map +1 -1
  7. package/dist/entities/AWSS3/AWSS3.js +12 -12
  8. package/dist/entities/AWSS3/AWSS3.js.map +1 -1
  9. package/dist/entities/ElasticSearch/ElasticSearch.js.map +1 -1
  10. package/dist/entities/Endpoint/Endpoint.types.js.map +1 -1
  11. package/dist/entities/GoogleCloudStorage/GoogleCloudStorage.js +11 -11
  12. package/dist/entities/GoogleCloudStorage/GoogleCloudStorage.js.map +1 -1
  13. package/dist/entities/KeySet/KeySet.js.map +1 -1
  14. package/dist/entities/PubSub/PubSub.js.map +1 -1
  15. package/dist/entities/PushNotification/PushNotification.js.map +1 -1
  16. package/dist/entities/Redis/Redis.js +3 -3
  17. package/dist/entities/Redis/Redis.js.map +1 -1
  18. package/dist/entities/SecretManager/SecretManager.js +3 -3
  19. package/dist/entities/SecretManager/SecretManager.js.map +1 -1
  20. package/dist/entities/Sequelize/Sequelize.config.js.map +1 -1
  21. package/dist/entities/Sequelize/Sequelize.js.map +1 -1
  22. package/dist/entities/Server/Server.js.map +1 -1
  23. package/dist/entities/Server/Server.types.js.map +1 -1
  24. package/dist/entities/index.js.map +1 -1
  25. package/dist/middleware/checkPermission/checkPermission.js.map +1 -1
  26. package/dist/middleware/checkPermission/index.js.map +1 -1
  27. package/dist/middleware/index.js.map +1 -1
  28. package/dist/middleware/multiPartFileUploader/multiPartFileUploader.js.map +1 -1
  29. package/dist/middleware/requestMetrics/requestMetrics.js.map +1 -1
  30. package/dist/middleware/swaggerDocs/swaggerDocs.js.map +1 -1
  31. package/dist/middleware/verificationToken/verificationToken.js.map +1 -1
  32. package/dist/utils/createSortedObject/createSortedObject.js.map +1 -1
  33. package/dist/utils/dbMigration/dbMigration.js.map +1 -1
  34. package/dist/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.js.map +1 -1
  35. package/dist/utils/jwt/jwt.js.map +1 -1
  36. package/dist/utils/jwt/jwt.types.js.map +1 -1
  37. package/dist/utils/report/output.js.map +1 -1
  38. package/dist/utils/report/report.js.map +1 -1
  39. package/dist/utils/semverCompare/semverCompare.js.map +1 -1
  40. package/dist/utils/verificationToken/verificationToken.js.map +1 -1
  41. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Server.js","names":["_fs","_interopRequireDefault","require","_path","_promises","_express","_cors","_ws","_SocketClient","_Server2","_Endpoint","_EngineError","_LifecycleController","_PubSub","_SecretManager","_utils","_jwt","_report","_tlsConfig","namespace","DEFAULT_WS_MAX_PAYLOAD","parseCorsOrigin","value","origins","split","map","origin","trim","filter","Boolean","length","Server","exports","config","_classCallCheck2","default","_defineProperty2","AbortController","validate","reportDebug","message","endpoints","globalMiddleware","errorMiddleware","initCallbacks","shutdownCallbacks","syncCallbacks","cron","auth","noFetch","secretManagerConfig","secretManager","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","CORS_ORIGIN","methods","allowedHeaders","exposedHeaders","registerMiddleware","httpServer","createHttpServer","secondaryApp","secondaryMiddleware","defaultErrorMiddleware","forEach","middleware","secondaryHttpServer","disable","server","headersTimeout","keepAliveTimeout","webSocket","attachWebSocket","_createClass2","key","setupGlobalErrorLogging","on","err","reportError","reportInfo","setTimeout","exit","reason","Error","String","init","SecretManager","initKeySets","callback","runCallback","Promise","all","PubSub","job","runCronJob","resolve","listen","data","port","secondaryPort","nodeEnv","handleSignal","watchTlsCaFileChange","shutdown","reject","listening","address","close","error","wss","clients","socket","socketKillTimeout","WEBSOCKET_CLOSE_TIMEOUT","parseInt","setTimeoutPromise","readyState","CLOSING","OPEN","terminate","LifecycleController","shutdownRunningInstances","abortController","abort","fileWatchers","watcher","shutdownKeySets","shutdownSignals","signal","removeAllListeners","getApp","getSecondaryApp","defaultMiddleware","path","endpoint","register","options","WebSocketServer","maxPayload","Number","WS_MAX_PAYLOAD","request","SocketClient","client","isShuttingDown","then","catch","file","fs","watch","event","loadTlsConfig","setSecureContext","tlsConfig","push","handler","name","interval","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 { SecretManager } from 'entities/SecretManager';\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/** Default maximum size (in bytes) of an incoming WebSocket message */\nconst DEFAULT_WS_MAX_PAYLOAD = 1024 * 1024;\n\n/** Parse the CORS_ORIGIN variable, which can hold a single origin or a comma separated list */\nexport function parseCorsOrigin(value?: string): string | Array<string> {\n if (!value) return '*';\n const origins = value\n .split(',')\n .map((origin) => origin.trim())\n .filter(Boolean);\n if (origins.length === 0) return '*';\n return origins.length === 1 ? origins[0] : origins;\n}\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 /** Secret Manager configuration */\n private secretManagerConfig?: ServerOptions['secretManager'];\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 /** File system watchers for TLS certificate changes */\n private fileWatchers: Array<fs.FSWatcher> = [];\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 this.secretManagerConfig = config.secretManager;\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: parseCorsOrigin(process.env.CORS_ORIGIN),\n methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],\n allowedHeaders: [\n 'Content-Type',\n 'Authorization',\n 'x-verification-token',\n 'x-verification-otp',\n 'Access-Control-Allow-Origin'\n ],\n exposedHeaders: ['Access-Control-Allow-Origin']\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 /**\n * Setup global error handlers for uncaught exceptions and unhandled rejections\n */\n private setupGlobalErrorLogging(): void {\n process.on('uncaughtException', (err) => {\n reportError(err);\n reportInfo('💥 Uncaught exception - process will exit');\n // Give time for logs to flush before exiting\n setTimeout(() => process.exit(1), 1000);\n });\n \n process.on('unhandledRejection', (reason: unknown) => {\n reportError(reason instanceof Error ? reason : new Error(String(reason)));\n reportInfo('💥 Unhandled rejection - process will exit');\n // Give time for logs to flush before exiting\n setTimeout(() => process.exit(1), 1000);\n });\n }\n\n /** Start the server */\n public async init(): Promise<void> {\n this.setupGlobalErrorLogging();\n reportDebug({ namespace, message: `Starting Server` });\n \n // Load secrets from Secret Manager FIRST (before anything else that might need them)\n if (this.secretManagerConfig) {\n await SecretManager.init(this.secretManagerConfig);\n }\n \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(\n (server) =>\n new Promise<void>((resolve, reject) => {\n // Ignore if the server was already stopped\n // We have observed cases where SIGTERM was thrown multiple times\n if (!server.listening) {\n resolve();\n return;\n }\n \n const { port } = server.address() as AddressInfo;\n \n server.close((error) => {\n if (error) {\n reportError(error);\n reject(error);\n } else {\n reportInfo({\n message: `Stopped listening to requests on port ${port}`\n });\n resolve();\n }\n });\n })\n )\n );\n\n // Close all socket connections\n if (this.wss) {\n // First ask them to close gracefully\n this.wss.clients.forEach((socket) => {\n socket.close();\n });\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, 10)\n : 5000;\n \n await setTimeoutPromise(socketKillTimeout);\n \n this.wss.clients.forEach((socket) => {\n if (\n socket.readyState === socket.CLOSING ||\n socket.readyState === socket.OPEN\n ) {\n socket.terminate();\n }\n });\n \n // Close the WebSocket server itself\n await new Promise<void>((resolve, reject) => {\n this.wss?.close((error) => {\n if (error) {\n reportError(error);\n reject(error);\n } else {\n reportInfo({ message: 'WebSocket server closed' });\n resolve();\n }\n });\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 // Close all file watchers\n this.fileWatchers.forEach((watcher) => watcher.close());\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 // Limit the size of incoming messages (ws defaults to 100MiB)\n maxPayload: Number(process.env.WS_MAX_PAYLOAD) || DEFAULT_WS_MAX_PAYLOAD,\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 let isShuttingDown = false;\n \n shutdownSignals.forEach((signal) =>\n process.on(signal, () => {\n // Prevent multiple shutdown attempts\n if (isShuttingDown) {\n reportInfo(`Already shutting down, ignoring ${signal}`);\n return;\n }\n \n isShuttingDown = true;\n reportInfo(`Received shutdown signal [${signal}]`);\n \n this.shutdown()\n .then(() => {\n reportInfo('Graceful shutdown completed successfully');\n process.exit(0);\n })\n .catch((error) => {\n reportError(error);\n process.exit(1);\n });\n })\n );\n }\n\n /** Watch the TLS certificate change event */\n private watchTlsCaFileChange(): void {\n [\n 'TLS_REQUEST_KEY',\n 'TLS_REQUEST_CERT',\n 'TLS_REQUEST_CA',\n 'TLS_SERVER_KEY',\n 'TLS_SERVER_CERT',\n 'TLS_CA'\n ].forEach((key) => {\n const file = process.env[key];\n if (file) {\n const watcher = 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 this.fileWatchers.push(watcher);\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","_SecretManager","_utils","_jwt","_report","_tlsConfig","namespace","DEFAULT_WS_MAX_PAYLOAD","parseCorsOrigin","value","origins","split","map","origin","trim","filter","Boolean","length","Server","exports","config","_classCallCheck2","default","_defineProperty2","AbortController","validate","reportDebug","message","endpoints","globalMiddleware","errorMiddleware","initCallbacks","shutdownCallbacks","syncCallbacks","cron","auth","noFetch","secretManagerConfig","secretManager","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","CORS_ORIGIN","methods","allowedHeaders","exposedHeaders","registerMiddleware","httpServer","createHttpServer","secondaryApp","secondaryMiddleware","defaultErrorMiddleware","forEach","middleware","secondaryHttpServer","disable","server","headersTimeout","keepAliveTimeout","webSocket","attachWebSocket","_createClass2","key","setupGlobalErrorLogging","on","err","reportError","reportInfo","setTimeout","exit","reason","Error","String","init","SecretManager","initKeySets","callback","runCallback","Promise","all","PubSub","job","runCronJob","resolve","listen","data","port","secondaryPort","nodeEnv","handleSignal","watchTlsCaFileChange","shutdown","reject","listening","address","close","error","wss","clients","socket","socketKillTimeout","WEBSOCKET_CLOSE_TIMEOUT","parseInt","setTimeoutPromise","readyState","CLOSING","OPEN","terminate","LifecycleController","shutdownRunningInstances","abortController","abort","fileWatchers","watcher","shutdownKeySets","shutdownSignals","signal","removeAllListeners","getApp","getSecondaryApp","defaultMiddleware","path","endpoint","register","options","WebSocketServer","maxPayload","Number","WS_MAX_PAYLOAD","request","SocketClient","client","isShuttingDown","then","catch","file","fs","watch","event","loadTlsConfig","setSecureContext","tlsConfig","push","handler","name","interval","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 { SecretManager } from 'entities/SecretManager';\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/** Default maximum size (in bytes) of an incoming WebSocket message */\nconst DEFAULT_WS_MAX_PAYLOAD = 1024 * 1024;\n\n/** Parse the CORS_ORIGIN variable, which can hold a single origin or a comma separated list */\nexport function parseCorsOrigin(value?: string): string | Array<string> {\n if (!value) return '*';\n const origins = value\n .split(',')\n .map((origin) => origin.trim())\n .filter(Boolean);\n if (origins.length === 0) return '*';\n return origins.length === 1 ? origins[0] : origins;\n}\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 /** Secret Manager configuration */\n private secretManagerConfig?: ServerOptions['secretManager'];\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 /** File system watchers for TLS certificate changes */\n private fileWatchers: Array<fs.FSWatcher> = [];\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 this.secretManagerConfig = config.secretManager;\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: parseCorsOrigin(process.env.CORS_ORIGIN),\n methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],\n allowedHeaders: [\n 'Content-Type',\n 'Authorization',\n 'x-verification-token',\n 'x-verification-otp',\n 'Access-Control-Allow-Origin'\n ],\n exposedHeaders: ['Access-Control-Allow-Origin']\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 /**\n * Setup global error handlers for uncaught exceptions and unhandled rejections\n */\n private setupGlobalErrorLogging(): void {\n process.on('uncaughtException', (err) => {\n reportError(err);\n reportInfo('💥 Uncaught exception - process will exit');\n // Give time for logs to flush before exiting\n setTimeout(() => process.exit(1), 1000);\n });\n\n process.on('unhandledRejection', (reason: unknown) => {\n reportError(reason instanceof Error ? reason : new Error(String(reason)));\n reportInfo('💥 Unhandled rejection - process will exit');\n // Give time for logs to flush before exiting\n setTimeout(() => process.exit(1), 1000);\n });\n }\n\n /** Start the server */\n public async init(): Promise<void> {\n this.setupGlobalErrorLogging();\n reportDebug({ namespace, message: `Starting Server` });\n\n // Load secrets from Secret Manager FIRST (before anything else that might need them)\n if (this.secretManagerConfig) {\n await SecretManager.init(this.secretManagerConfig);\n }\n\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(\n (server) =>\n new Promise<void>((resolve, reject) => {\n // Ignore if the server was already stopped\n // We have observed cases where SIGTERM was thrown multiple times\n if (!server.listening) {\n resolve();\n return;\n }\n\n const { port } = server.address() as AddressInfo;\n\n server.close((error) => {\n if (error) {\n reportError(error);\n reject(error);\n } else {\n reportInfo({\n message: `Stopped listening to requests on port ${port}`\n });\n resolve();\n }\n });\n })\n )\n );\n\n // Close all socket connections\n if (this.wss) {\n // First ask them to close gracefully\n this.wss.clients.forEach((socket) => {\n socket.close();\n });\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, 10)\n : 5000;\n\n await setTimeoutPromise(socketKillTimeout);\n\n this.wss.clients.forEach((socket) => {\n if (\n socket.readyState === socket.CLOSING ||\n socket.readyState === socket.OPEN\n ) {\n socket.terminate();\n }\n });\n\n // Close the WebSocket server itself\n await new Promise<void>((resolve, reject) => {\n this.wss?.close((error) => {\n if (error) {\n reportError(error);\n reject(error);\n } else {\n reportInfo({ message: 'WebSocket server closed' });\n resolve();\n }\n });\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 // Close all file watchers\n this.fileWatchers.forEach((watcher) => watcher.close());\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 // Limit the size of incoming messages (ws defaults to 100MiB)\n maxPayload: Number(process.env.WS_MAX_PAYLOAD) || DEFAULT_WS_MAX_PAYLOAD,\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 let isShuttingDown = false;\n\n shutdownSignals.forEach((signal) =>\n process.on(signal, () => {\n // Prevent multiple shutdown attempts\n if (isShuttingDown) {\n reportInfo(`Already shutting down, ignoring ${signal}`);\n return;\n }\n\n isShuttingDown = true;\n reportInfo(`Received shutdown signal [${signal}]`);\n\n this.shutdown()\n .then(() => {\n reportInfo('Graceful shutdown completed successfully');\n process.exit(0);\n })\n .catch((error) => {\n reportError(error);\n process.exit(1);\n });\n })\n );\n }\n\n /** Watch the TLS certificate change event */\n private watchTlsCaFileChange(): void {\n [\n 'TLS_REQUEST_KEY',\n 'TLS_REQUEST_CERT',\n 'TLS_REQUEST_CA',\n 'TLS_SERVER_KEY',\n 'TLS_SERVER_CERT',\n 'TLS_CA'\n ].forEach((key) => {\n const file = process.env[key];\n if (file) {\n const watcher = 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 this.fileWatchers.push(watcher);\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 +1 @@
1
- {"version":3,"file":"Server.types.js","names":[],"sources":["../../../src/entities/Server/Server.types.ts"],"sourcesContent":["import { ValidatorSpec } from 'envalid';\nimport { ErrorRequestHandler, RequestHandler } from 'express';\nimport { ServerOptions as WebSocketServerOptions } from 'ws';\nimport { Endpoint } from 'entities/Endpoint';\nimport { SocketClientOptions } from 'entities/SocketClient';\nimport { SecretManagerOptions } from 'entities/SecretManager';\n\n/** Options to create a server */\nexport interface ServerOptions {\n /** List of endpoint instances that the server should handle */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n endpoints: Array<Endpoint<any>>;\n /** Mapping of env variable name with functions that should run to check their validity */\n checkEnvironment?: Record<string, ValidatorSpec<unknown>>;\n /** Middleware that should run on every request before the endpoint specific logic */\n globalMiddleware?: Array<ServerGlobalMiddleware>;\n /** Error middleware that should run on every request after the endpoint specific logic, but before the generic global middleware */\n errorMiddleware?: Array<ServerGlobalMiddleware | ServerErrorMiddleWare>;\n /** Functions that should be called on server startup */\n initCallbacks?: Array<ServerCallback>;\n /** Functions that should be called on server shutdown */\n 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 syncCallbacks?: boolean;\n /** Config to set regularly running jobs on the server */\n cron?: Array<ServerCronJon>;\n /** Global auth related configuration */\n auth?: ServerAuthConfig;\n /** Configuration to enable webSocket connections to the server */\n webSocket?: ServerWebSocketConfig;\n /** Configuration for GCP Secret Manager to load secrets at startup */\n secretManager?: SecretManagerOptions;\n}\n\n/** Options for a CRON task on the server */\nexport interface ServerCronJon {\n /** Function that is called when the job needs to run */\n handler: () => unknown;\n /** Interval (in seconds) between each job execution. The interval starts after the previous execution finished */\n interval: number;\n /** When this is set, the job is only run on the instance that is that has been elected leader of the service */\n leaderOnly?: boolean;\n}\n\n/** Common server authentication related config */\nexport interface ServerAuthConfig {\n /** Do not fetch JWT authentication parameters, this should be used on servers that do not receive public requests and therefore do not need access to the authentication service */\n noFetch?: boolean;\n}\n\n/** Configuration for WebSocket on this server */\nexport interface ServerWebSocketConfig {\n /** Options to pass to create the webSocket server */\n server: WebSocketServerOptions;\n /** Options to pass when creating socket client instances */\n client: SocketClientOptions;\n}\n\n/** Middleware function definition with path */\nexport interface ServerObjectGlobalMiddleware {\n /** Path on which the middleware is used */\n path: string;\n /** Middleware function */\n middleware: RequestHandler;\n}\nexport type ServerGlobalMiddleware =\n | RequestHandler\n | ServerObjectGlobalMiddleware;\n\n/** Error middleware function definition with path */\nexport interface ServerObjectErrorMiddleware {\n /** Path on which the middleware is used */\n path: string;\n /** Middleware function */\n middleware: ErrorRequestHandler;\n}\nexport type ServerErrorMiddleWare =\n | ErrorRequestHandler\n | ServerObjectErrorMiddleware;\n\ntype ServerFunctionCallback = (...args: Array<unknown>) => unknown;\n\n/** Callback definition with parameters */\ninterface ServerObjectCallback {\n /** Callback function */\n function: ServerFunctionCallback;\n /** Parameters to pass to the callback function */\n parameters?: Parameters<ServerFunctionCallback>;\n}\n\nexport type ServerCallback = ServerFunctionCallback | ServerObjectCallback;\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"Server.types.js","names":[],"sources":["../../../src/entities/Server/Server.types.ts"],"sourcesContent":["import { ValidatorSpec } from 'envalid';\nimport { ErrorRequestHandler, RequestHandler } from 'express';\nimport { ServerOptions as WebSocketServerOptions } from 'ws';\nimport { Endpoint } from 'entities/Endpoint';\nimport { SocketClientOptions } from 'entities/SocketClient';\nimport { SecretManagerOptions } from 'entities/SecretManager';\n\n/** Options to create a server */\nexport interface ServerOptions {\n /** List of endpoint instances that the server should handle */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n endpoints: Array<Endpoint<any>>;\n /** Mapping of env variable name with functions that should run to check their validity */\n checkEnvironment?: Record<string, ValidatorSpec<unknown>>;\n /** Middleware that should run on every request before the endpoint specific logic */\n globalMiddleware?: Array<ServerGlobalMiddleware>;\n /** Error middleware that should run on every request after the endpoint specific logic, but before the generic global middleware */\n errorMiddleware?: Array<ServerGlobalMiddleware | ServerErrorMiddleWare>;\n /** Functions that should be called on server startup */\n initCallbacks?: Array<ServerCallback>;\n /** Functions that should be called on server shutdown */\n 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 syncCallbacks?: boolean;\n /** Config to set regularly running jobs on the server */\n cron?: Array<ServerCronJon>;\n /** Global auth related configuration */\n auth?: ServerAuthConfig;\n /** Configuration to enable webSocket connections to the server */\n webSocket?: ServerWebSocketConfig;\n /** Configuration for GCP Secret Manager to load secrets at startup */\n secretManager?: SecretManagerOptions;\n}\n\n/** Options for a CRON task on the server */\nexport interface ServerCronJon {\n /** Function that is called when the job needs to run */\n handler: () => unknown;\n /** Interval (in seconds) between each job execution. The interval starts after the previous execution finished */\n interval: number;\n /** When this is set, the job is only run on the instance that is that has been elected leader of the service */\n leaderOnly?: boolean;\n}\n\n/** Common server authentication related config */\nexport interface ServerAuthConfig {\n /** Do not fetch JWT authentication parameters, this should be used on servers that do not receive public requests and therefore do not need access to the authentication service */\n noFetch?: boolean;\n}\n\n/** Configuration for WebSocket on this server */\nexport interface ServerWebSocketConfig {\n /** Options to pass to create the webSocket server */\n server: WebSocketServerOptions;\n /** Options to pass when creating socket client instances */\n client: SocketClientOptions;\n}\n\n/** Middleware function definition with path */\nexport interface ServerObjectGlobalMiddleware {\n /** Path on which the middleware is used */\n path: string;\n /** Middleware function */\n middleware: RequestHandler;\n}\nexport type ServerGlobalMiddleware =\n RequestHandler | ServerObjectGlobalMiddleware;\n\n/** Error middleware function definition with path */\nexport interface ServerObjectErrorMiddleware {\n /** Path on which the middleware is used */\n path: string;\n /** Middleware function */\n middleware: ErrorRequestHandler;\n}\nexport type ServerErrorMiddleWare =\n ErrorRequestHandler | ServerObjectErrorMiddleware;\n\ntype ServerFunctionCallback = (...args: Array<unknown>) => unknown;\n\n/** Callback definition with parameters */\ninterface ServerObjectCallback {\n /** Callback function */\n function: ServerFunctionCallback;\n /** Parameters to pass to the callback function */\n parameters?: Parameters<ServerFunctionCallback>;\n}\n\nexport type ServerCallback = ServerFunctionCallback | ServerObjectCallback;\n"],"mappings":"","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_EngineError","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_WebError","_ValidationError","_KeySet","_Endpoint","_MessageHandler","_SocketClient","_Server","_Redis","_Localizator","_GoogleCloudStorage","_AWSS","_Sequelize","_ElasticSearch","_LifecycleController","_PubSub","_PushNotification","_SecretManager"],"sources":["../../src/entities/index.ts"],"sourcesContent":["export * from './EngineError';\nexport * from './WebError';\nexport * from './ValidationError';\nexport * from './KeySet';\nexport * from './Endpoint';\nexport * from './MessageHandler';\nexport * from './SocketClient';\nexport * from './Server';\nexport * from './Redis';\nexport * from './Localizator';\nexport * from './GoogleCloudStorage';\nexport * from './AWSS3';\nexport * from './Sequelize';\nexport * from './ElasticSearch';\nexport * from './LifecycleController';\nexport * from './PubSub';\nexport * from './PushNotification';\nexport * from './SecretManager';"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["_EngineError","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_WebError","_ValidationError","_KeySet","_Endpoint","_MessageHandler","_SocketClient","_Server","_Redis","_Localizator","_GoogleCloudStorage","_AWSS","_Sequelize","_ElasticSearch","_LifecycleController","_PubSub","_PushNotification","_SecretManager"],"sources":["../../src/entities/index.ts"],"sourcesContent":["export * from './EngineError';\nexport * from './WebError';\nexport * from './ValidationError';\nexport * from './KeySet';\nexport * from './Endpoint';\nexport * from './MessageHandler';\nexport * from './SocketClient';\nexport * from './Server';\nexport * from './Redis';\nexport * from './Localizator';\nexport * from './GoogleCloudStorage';\nexport * from './AWSS3';\nexport * from './Sequelize';\nexport * from './ElasticSearch';\nexport * from './LifecycleController';\nexport * from './PubSub';\nexport * from './PushNotification';\nexport * from './SecretManager';\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"checkPermission.js","names":["checkPermission","requiredActions","req","res","next","user","permissions","status","json","message","requiredActionsArray","Array","isArray","requiredActionsLower","map","action","toLowerCase","hasPermission","some","permission","includes"],"sources":["../../../src/middleware/checkPermission/checkPermission.ts"],"sourcesContent":["import { Request, Response, NextFunction } from 'express';\n\n/** Middleware to check if the user has at least one of the required permissions (case-insensitive). */\nfunction checkPermission(requiredActions: string | string[]) {\n return function (req: Request, res: Response, next: NextFunction) {\n const user = req.user;\n\n if (!user || !user.permissions) {\n res.status(403).json({ message: 'User does not have permissions' });\n return;\n }\n\n // Normalize input to an array of strings\n const requiredActionsArray = Array.isArray(requiredActions)\n ? requiredActions\n : [requiredActions];\n\n // Normalize required actions to lowercase\n const requiredActionsLower = requiredActionsArray.map(action => action.toLowerCase());\n\n // Check if the user has any of the required permissions (case-insensitive)\n const hasPermission = user.permissions.some((permission: string) =>\n requiredActionsLower.includes(permission.toLowerCase())\n );\n\n if (!hasPermission) {\n res.status(403).json({ message: 'Permission denied' });\n return;\n }\n\n next();\n };\n}\n\nexport { checkPermission };"],"mappings":";;;;;;AAEA;AACA,SAASA,eAAeA,CAACC,eAAkC,EAAE;EAC3D,OAAO,UAAUC,GAAY,EAAEC,GAAa,EAAEC,IAAkB,EAAE;IAChE,MAAMC,IAAI,GAAGH,GAAG,CAACG,IAAI;IAErB,IAAI,CAACA,IAAI,IAAI,CAACA,IAAI,CAACC,WAAW,EAAE;MAC9BH,GAAG,CAACI,MAAM,CAAC,GAAG,CAAC,CAACC,IAAI,CAAC;QAAEC,OAAO,EAAE;MAAiC,CAAC,CAAC;MACnE;IACF;;IAEA;IACA,MAAMC,oBAAoB,GAAGC,KAAK,CAACC,OAAO,CAACX,eAAe,CAAC,GACvDA,eAAe,GACf,CAACA,eAAe,CAAC;;IAErB;IACA,MAAMY,oBAAoB,GAAGH,oBAAoB,CAACI,GAAG,CAACC,MAAM,IAAIA,MAAM,CAACC,WAAW,CAAC,CAAC,CAAC;;IAErF;IACA,MAAMC,aAAa,GAAGZ,IAAI,CAACC,WAAW,CAACY,IAAI,CAAEC,UAAkB,IAC7DN,oBAAoB,CAACO,QAAQ,CAACD,UAAU,CAACH,WAAW,CAAC,CAAC,CACxD,CAAC;IAED,IAAI,CAACC,aAAa,EAAE;MAClBd,GAAG,CAACI,MAAM,CAAC,GAAG,CAAC,CAACC,IAAI,CAAC;QAAEC,OAAO,EAAE;MAAoB,CAAC,CAAC;MACtD;IACF;IAEAL,IAAI,CAAC,CAAC;EACR,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"file":"checkPermission.js","names":["checkPermission","requiredActions","req","res","next","user","permissions","status","json","message","requiredActionsArray","Array","isArray","requiredActionsLower","map","action","toLowerCase","hasPermission","some","permission","includes"],"sources":["../../../src/middleware/checkPermission/checkPermission.ts"],"sourcesContent":["import { Request, Response, NextFunction } from 'express';\n\n/** Middleware to check if the user has at least one of the required permissions (case-insensitive). */\nfunction checkPermission(requiredActions: string | string[]) {\n return function (req: Request, res: Response, next: NextFunction) {\n const user = req.user;\n\n if (!user || !user.permissions) {\n res.status(403).json({ message: 'User does not have permissions' });\n return;\n }\n\n // Normalize input to an array of strings\n const requiredActionsArray = Array.isArray(requiredActions)\n ? requiredActions\n : [requiredActions];\n\n // Normalize required actions to lowercase\n const requiredActionsLower = requiredActionsArray.map((action) =>\n action.toLowerCase()\n );\n\n // Check if the user has any of the required permissions (case-insensitive)\n const hasPermission = user.permissions.some((permission: string) =>\n requiredActionsLower.includes(permission.toLowerCase())\n );\n\n if (!hasPermission) {\n res.status(403).json({ message: 'Permission denied' });\n return;\n }\n\n next();\n };\n}\n\nexport { checkPermission };\n"],"mappings":";;;;;;AAEA;AACA,SAASA,eAAeA,CAACC,eAAkC,EAAE;EAC3D,OAAO,UAAUC,GAAY,EAAEC,GAAa,EAAEC,IAAkB,EAAE;IAChE,MAAMC,IAAI,GAAGH,GAAG,CAACG,IAAI;IAErB,IAAI,CAACA,IAAI,IAAI,CAACA,IAAI,CAACC,WAAW,EAAE;MAC9BH,GAAG,CAACI,MAAM,CAAC,GAAG,CAAC,CAACC,IAAI,CAAC;QAAEC,OAAO,EAAE;MAAiC,CAAC,CAAC;MACnE;IACF;;IAEA;IACA,MAAMC,oBAAoB,GAAGC,KAAK,CAACC,OAAO,CAACX,eAAe,CAAC,GACvDA,eAAe,GACf,CAACA,eAAe,CAAC;;IAErB;IACA,MAAMY,oBAAoB,GAAGH,oBAAoB,CAACI,GAAG,CAAEC,MAAM,IAC3DA,MAAM,CAACC,WAAW,CAAC,CACrB,CAAC;;IAED;IACA,MAAMC,aAAa,GAAGZ,IAAI,CAACC,WAAW,CAACY,IAAI,CAAEC,UAAkB,IAC7DN,oBAAoB,CAACO,QAAQ,CAACD,UAAU,CAACH,WAAW,CAAC,CAAC,CACxD,CAAC;IAED,IAAI,CAACC,aAAa,EAAE;MAClBd,GAAG,CAACI,MAAM,CAAC,GAAG,CAAC,CAACC,IAAI,CAAC;QAAEC,OAAO,EAAE;MAAoB,CAAC,CAAC;MACtD;IACF;IAEAL,IAAI,CAAC,CAAC;EACR,CAAC;AACH","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_checkPermission","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get"],"sources":["../../../src/middleware/checkPermission/index.ts"],"sourcesContent":["export * from './checkPermission';"],"mappings":";;;;;AAAA,IAAAA,gBAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,gBAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,gBAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAT,gBAAA,CAAAK,GAAA;IAAA;EAAA;AAAA","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["_checkPermission","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get"],"sources":["../../../src/middleware/checkPermission/index.ts"],"sourcesContent":["export * from './checkPermission';\n"],"mappings":";;;;;AAAA,IAAAA,gBAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,gBAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,gBAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAT,gBAAA,CAAAK,GAAA;IAAA;EAAA;AAAA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_error","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_healthCheck","_validate","_fourOhFour","_authJwt","_authHmac","_authStatic","_swaggerDocs","_authTls","_userResolver","_fileUploader","_metrics","_requestMetrics","_requestLogger","_version","_geminiFileUploader","_checkPermission","_multiPartFileUploader","_verificationToken"],"sources":["../../src/middleware/index.ts"],"sourcesContent":["export * from './error';\nexport * from './healthCheck';\nexport * from './validate';\nexport * from './fourOhFour';\nexport * from './authJwt';\nexport * from './authHmac';\nexport * from './authStatic';\nexport * from './swaggerDocs';\nexport * from './authTls';\nexport * from './userResolver';\nexport * from './fileUploader';\nexport * from './metrics';\nexport * from './requestMetrics';\nexport * from './requestLogger';\nexport * from './version';\nexport * from './geminiFileUploader';\nexport * from './checkPermission';\nexport * from './multiPartFileUploader';\nexport * from './verificationToken';"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["_error","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_healthCheck","_validate","_fourOhFour","_authJwt","_authHmac","_authStatic","_swaggerDocs","_authTls","_userResolver","_fileUploader","_metrics","_requestMetrics","_requestLogger","_version","_geminiFileUploader","_checkPermission","_multiPartFileUploader","_verificationToken"],"sources":["../../src/middleware/index.ts"],"sourcesContent":["export * from './error';\nexport * from './healthCheck';\nexport * from './validate';\nexport * from './fourOhFour';\nexport * from './authJwt';\nexport * from './authHmac';\nexport * from './authStatic';\nexport * from './swaggerDocs';\nexport * from './authTls';\nexport * from './userResolver';\nexport * from './fileUploader';\nexport * from './metrics';\nexport * from './requestMetrics';\nexport * from './requestLogger';\nexport * from './version';\nexport * from './geminiFileUploader';\nexport * from './checkPermission';\nexport * from './multiPartFileUploader';\nexport * from './verificationToken';\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"multiPartFileUploader.js","names":["_multer","_interopRequireDefault","require","_fsExtra","_path","_utils","_WebError","_validate","_bytes","namespace","TEMP_DIR","path","join","process","env","FILE_STORAGE_FOLDER","FILE_DIR","fs","ensureDirSync","storage","multer","memoryStorage","DEFAULT_MAX_CHUNK_SIZE","MAX_CHUNKS","Number","UPLOAD_MAX_CHUNKS","SAFE_ID_PATTERN","isSafeFilename","filename","length","test","basename","multiPartFileUploader","filesOption","validator","req","res","next","reportDebug","message","chunkSizeLimit","maxSize","bytes","UPLOAD_MAX_SIZE","uploadSingle","limits","fileSize","files","single","err","code","WebError","statusCode","errorCode","data","reportError","error","validate","totalChunks","chunkIndex","uniqueID","body","undefined","file","receivedChunk","chunkIndexNum","totalChunksNum","isInteger","size","receivedSize","sessionFolder","chunkPath","writeFile","buffer","writeErr","uploadedChunks","readdir","finalFilePath","mergeChunks","multipartFile","isPending","originalname","filePath","mergeErr","writeStream","createWriteStream","parseInt","chunks","i","partPath","chunkData","readFile","push","remove","catch","cleanupErr","write","end","Promise","resolve","reject","on","then"],"sources":["../../../src/middleware/multiPartFileUploader/multiPartFileUploader.ts"],"sourcesContent":["import { Request, Response, NextFunction } from 'express';\nimport multer from 'multer';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { Schema } from 'express-validator';\nimport { reportDebug, reportError } from 'utils';\nimport { WebError } from 'entities/WebError';\nimport { validate } from './validate';\nimport { MultiPartFileUploaderConfig } from './multiPartFileUploader.types';\nimport bytes from 'bytes';\n\nconst namespace = 'engine:middleware:multiPartFileUploader';\n\nconst TEMP_DIR: string = path.join(\n process.env.FILE_STORAGE_FOLDER || './uploads',\n 'temp_chunks'\n);\nconst FILE_DIR: string = path.join(\n process.env.FILE_STORAGE_FOLDER || './uploads',\n 'completed_files'\n);\n\nfs.ensureDirSync(FILE_DIR);\nfs.ensureDirSync(TEMP_DIR);\n\nconst storage = multer.memoryStorage();\n\n/** Default maximum size of a single chunk when no limit is configured */\nconst DEFAULT_MAX_CHUNK_SIZE = 32 * 1024 * 1024;\n/** Maximum number of chunks a single upload can be split into */\nconst MAX_CHUNKS = Number(process.env.UPLOAD_MAX_CHUNKS) || 10000;\n/** Upload session IDs are restricted to a safe charset so they can be used as a folder name */\nconst SAFE_ID_PATTERN = /^[A-Za-z0-9_-]{1,128}$/;\n\n/** Check that a client supplied file name cannot escape its destination folder */\nfunction isSafeFilename(filename: string): boolean {\n return (\n filename.length > 0 &&\n filename.length <= 255 &&\n filename !== '.' &&\n filename !== '..' &&\n !/[/\\\\\\0]/.test(filename) &&\n path.basename(filename) === filename\n );\n}\n\nexport function multiPartFileUploader(\n filesOption: MultiPartFileUploaderConfig,\n validator: Schema\n) {\n return async (\n req: Request,\n res: Response,\n next: NextFunction\n ): Promise<void> => {\n try {\n reportDebug({ namespace, message: 'Starting file upload middleware' });\n\n // Bound the size of a single chunk held in memory\n const chunkSizeLimit =\n (filesOption?.maxSize && bytes(filesOption.maxSize)) ||\n (process.env.UPLOAD_MAX_SIZE && bytes(process.env.UPLOAD_MAX_SIZE)) ||\n DEFAULT_MAX_CHUNK_SIZE;\n const uploadSingle = multer({\n storage,\n limits: { fileSize: chunkSizeLimit, files: 1 }\n }).single('file');\n uploadSingle(req, res, async (err) => {\n if ((err as { code?: string } | undefined)?.code === 'LIMIT_FILE_SIZE') {\n return next(\n new WebError({\n statusCode: 413,\n errorCode: 'chunk-too-large',\n message: 'Uploaded chunk exceeds the maximum allowed size',\n data: { maxSize: chunkSizeLimit }\n })\n );\n }\n if (err) {\n reportError('Error uploading chunk');\n return next(\n new WebError({\n statusCode: 500,\n errorCode: 'upload-failed',\n message: 'Error uploading file chunk',\n data: { error: err.message }\n })\n );\n }\n\n try {\n reportDebug({ namespace, message: 'Validating request' });\n await validate(req, validator);\n } catch (error) {\n reportDebug({\n namespace,\n message: 'Validation failed',\n data: { error }\n });\n return next(\n new WebError({\n statusCode: 400,\n errorCode: 'validation-failed',\n message: 'Validation failed for file upload',\n data: { error: (error as Error).message }\n })\n );\n }\n\n const { filename, totalChunks, chunkIndex, uniqueID } = req.body;\n reportDebug({\n namespace,\n message: 'Received chunk data',\n data: { filename, totalChunks, chunkIndex, uniqueID }\n });\n\n if (\n !filename ||\n !totalChunks ||\n chunkIndex === undefined ||\n !uniqueID ||\n !req.file\n ) {\n return next(\n new WebError({\n statusCode: 400,\n errorCode: 'missing-field',\n message: 'Missing required fields',\n data: {\n filename,\n totalChunks,\n chunkIndex,\n uniqueID,\n receivedChunk: !!req.file\n }\n })\n );\n }\n\n // Client supplied values are used to build file system paths, they must be strictly validated\n // to prevent path traversal (e.g. uniqueID=\"../../etc\") and resource exhaustion\n const chunkIndexNum = Number(chunkIndex);\n const totalChunksNum = Number(totalChunks);\n if (\n typeof uniqueID !== 'string' ||\n !SAFE_ID_PATTERN.test(uniqueID) ||\n typeof filename !== 'string' ||\n !isSafeFilename(filename) ||\n !Number.isInteger(totalChunksNum) ||\n totalChunksNum < 1 ||\n totalChunksNum > MAX_CHUNKS ||\n !Number.isInteger(chunkIndexNum) ||\n chunkIndexNum < 0 ||\n chunkIndexNum >= totalChunksNum\n ) {\n return next(\n new WebError({\n statusCode: 400,\n errorCode: 'invalid-field',\n message: 'Invalid chunk upload parameters',\n data: { filename, totalChunks, chunkIndex, uniqueID }\n })\n );\n }\n\n if (\n filesOption?.maxSize &&\n req.file.size > (bytes(filesOption.maxSize) || 0)\n ) {\n return next(\n new WebError({\n statusCode: 400,\n errorCode: 'chunk-too-large',\n message: 'Uploaded chunk exceeds the maximum allowed size',\n data: {\n maxSize: filesOption.maxSize,\n receivedSize: req.file.size\n }\n })\n );\n }\n\n const sessionFolder = path.join(TEMP_DIR, uniqueID);\n fs.ensureDirSync(sessionFolder);\n const chunkPath = path.join(\n sessionFolder,\n `${filename}.part${chunkIndexNum}`\n );\n\n try {\n reportDebug({\n namespace,\n message: 'Writing chunk to disk',\n data: { chunkPath }\n });\n await fs.writeFile(chunkPath, req.file.buffer);\n } catch (writeErr) {\n return next(\n new WebError({\n statusCode: 500,\n errorCode: 'chunk-write-failed',\n message: 'Failed to write chunk',\n data: { chunkIndex, error: (writeErr as Error).message }\n })\n );\n }\n\n const uploadedChunks = await fs.readdir(sessionFolder);\n reportDebug({\n namespace,\n message: 'Uploaded chunk count',\n data: { uploadedChunks: uploadedChunks.length, totalChunks }\n });\n\n if (uploadedChunks.length === totalChunksNum) {\n try {\n const finalFilePath = path.join(\n FILE_DIR,\n `${uniqueID}_${filename}`\n );\n await mergeChunks(\n filename,\n totalChunks,\n sessionFolder,\n finalFilePath\n );\n req.multipartFile = {\n isPending: false,\n originalname: filename,\n uniqueID,\n filePath: finalFilePath\n };\n } catch (mergeErr) {\n return next(\n new WebError({\n statusCode: 500,\n errorCode: 'file-merge-failed',\n message: 'Error merging file chunks',\n data: { error: (mergeErr as Error).message }\n })\n );\n }\n return next();\n }\n\n req.multipartFile = {\n isPending: true,\n originalname: filename,\n uniqueID,\n chunkIndex,\n totalChunks\n };\n next();\n });\n } catch (error) {\n next(\n new WebError({\n statusCode: 500,\n errorCode: 'unexpected-error',\n message: 'Unexpected error in file upload',\n data: { error: (error as Error).message }\n })\n );\n }\n };\n}\n\nasync function mergeChunks(\n filename: string,\n totalChunks: string | number,\n sessionFolder: string,\n finalFilePath: string\n): Promise<void> {\n const writeStream = fs.createWriteStream(finalFilePath);\n reportDebug({\n namespace,\n message: 'Merging file chunks',\n data: { finalFilePath }\n });\n\n const totalChunksNum = parseInt(totalChunks as string, 10);\n const chunks: Buffer[] = [];\n\n // Read all chunks into memory first\n for (let i = 0; i < totalChunksNum; i++) {\n const partPath = path.join(sessionFolder, `${filename}.part${i}`);\n try {\n const chunkData = await fs.readFile(partPath);\n chunks.push(chunkData);\n } catch (error) {\n // Cleanup on error\n await fs.remove(sessionFolder).catch((cleanupErr: Error) =>\n reportError(`Error cleaning up folder ${sessionFolder}: ${cleanupErr.message}`)\n );\n throw new WebError({\n statusCode: 500,\n errorCode: 'chunk-read-failed',\n message: `Error reading chunk ${i}`,\n data: { error: (error as Error).message }\n });\n }\n }\n\n // Write all chunks sequentially\n for (const chunkData of chunks) {\n writeStream.write(chunkData);\n }\n\n // Remove temp files\n for (let i = 0; i < totalChunksNum; i++) {\n const partPath = path.join(sessionFolder, `${filename}.part${i}`);\n fs.remove(partPath).catch((err: Error) =>\n reportError(`Error removing part ${partPath}: ${err.message}`)\n );\n }\n\n writeStream.end();\n return new Promise<void>((resolve, reject) => {\n writeStream.on('finish', () => {\n // Clean up temp folder after successful merge\n fs.remove(sessionFolder)\n .then(() => resolve(undefined))\n .catch((cleanupErr: Error) => {\n reportError(\n `Error cleaning up temp folder ${sessionFolder}: ${cleanupErr.message}`\n );\n resolve(undefined); // Don't fail the merge if cleanup fails\n });\n });\n writeStream.on('error', (error) => {\n // Cleanup on write error\n fs.remove(sessionFolder).catch((cleanupErr: Error) =>\n reportError(`Error cleaning up folder after write error: ${cleanupErr.message}`)\n );\n reject(\n new WebError({\n statusCode: 500,\n errorCode: 'file-merge-error',\n message: 'Error merging file chunks',\n data: { error: (error as Error).message }\n })\n );\n });\n });\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"multiPartFileUploader.js","names":["_multer","_interopRequireDefault","require","_fsExtra","_path","_utils","_WebError","_validate","_bytes","namespace","TEMP_DIR","path","join","process","env","FILE_STORAGE_FOLDER","FILE_DIR","fs","ensureDirSync","storage","multer","memoryStorage","DEFAULT_MAX_CHUNK_SIZE","MAX_CHUNKS","Number","UPLOAD_MAX_CHUNKS","SAFE_ID_PATTERN","isSafeFilename","filename","length","test","basename","multiPartFileUploader","filesOption","validator","req","res","next","reportDebug","message","chunkSizeLimit","maxSize","bytes","UPLOAD_MAX_SIZE","uploadSingle","limits","fileSize","files","single","err","code","WebError","statusCode","errorCode","data","reportError","error","validate","totalChunks","chunkIndex","uniqueID","body","undefined","file","receivedChunk","chunkIndexNum","totalChunksNum","isInteger","size","receivedSize","sessionFolder","chunkPath","writeFile","buffer","writeErr","uploadedChunks","readdir","finalFilePath","mergeChunks","multipartFile","isPending","originalname","filePath","mergeErr","writeStream","createWriteStream","parseInt","chunks","i","partPath","chunkData","readFile","push","remove","catch","cleanupErr","write","end","Promise","resolve","reject","on","then"],"sources":["../../../src/middleware/multiPartFileUploader/multiPartFileUploader.ts"],"sourcesContent":["import { Request, Response, NextFunction } from 'express';\nimport multer from 'multer';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { Schema } from 'express-validator';\nimport { reportDebug, reportError } from 'utils';\nimport { WebError } from 'entities/WebError';\nimport { validate } from './validate';\nimport { MultiPartFileUploaderConfig } from './multiPartFileUploader.types';\nimport bytes from 'bytes';\n\nconst namespace = 'engine:middleware:multiPartFileUploader';\n\nconst TEMP_DIR: string = path.join(\n process.env.FILE_STORAGE_FOLDER || './uploads',\n 'temp_chunks'\n);\nconst FILE_DIR: string = path.join(\n process.env.FILE_STORAGE_FOLDER || './uploads',\n 'completed_files'\n);\n\nfs.ensureDirSync(FILE_DIR);\nfs.ensureDirSync(TEMP_DIR);\n\nconst storage = multer.memoryStorage();\n\n/** Default maximum size of a single chunk when no limit is configured */\nconst DEFAULT_MAX_CHUNK_SIZE = 32 * 1024 * 1024;\n/** Maximum number of chunks a single upload can be split into */\nconst MAX_CHUNKS = Number(process.env.UPLOAD_MAX_CHUNKS) || 10000;\n/** Upload session IDs are restricted to a safe charset so they can be used as a folder name */\nconst SAFE_ID_PATTERN = /^[A-Za-z0-9_-]{1,128}$/;\n\n/** Check that a client supplied file name cannot escape its destination folder */\nfunction isSafeFilename(filename: string): boolean {\n return (\n filename.length > 0 &&\n filename.length <= 255 &&\n filename !== '.' &&\n filename !== '..' &&\n !/[/\\\\\\0]/.test(filename) &&\n path.basename(filename) === filename\n );\n}\n\nexport function multiPartFileUploader(\n filesOption: MultiPartFileUploaderConfig,\n validator: Schema\n) {\n return async (\n req: Request,\n res: Response,\n next: NextFunction\n ): Promise<void> => {\n try {\n reportDebug({ namespace, message: 'Starting file upload middleware' });\n\n // Bound the size of a single chunk held in memory\n const chunkSizeLimit =\n (filesOption?.maxSize && bytes(filesOption.maxSize)) ||\n (process.env.UPLOAD_MAX_SIZE && bytes(process.env.UPLOAD_MAX_SIZE)) ||\n DEFAULT_MAX_CHUNK_SIZE;\n const uploadSingle = multer({\n storage,\n limits: { fileSize: chunkSizeLimit, files: 1 }\n }).single('file');\n uploadSingle(req, res, async (err) => {\n if (\n (err as { code?: string } | undefined)?.code === 'LIMIT_FILE_SIZE'\n ) {\n return next(\n new WebError({\n statusCode: 413,\n errorCode: 'chunk-too-large',\n message: 'Uploaded chunk exceeds the maximum allowed size',\n data: { maxSize: chunkSizeLimit }\n })\n );\n }\n if (err) {\n reportError('Error uploading chunk');\n return next(\n new WebError({\n statusCode: 500,\n errorCode: 'upload-failed',\n message: 'Error uploading file chunk',\n data: { error: err.message }\n })\n );\n }\n\n try {\n reportDebug({ namespace, message: 'Validating request' });\n await validate(req, validator);\n } catch (error) {\n reportDebug({\n namespace,\n message: 'Validation failed',\n data: { error }\n });\n return next(\n new WebError({\n statusCode: 400,\n errorCode: 'validation-failed',\n message: 'Validation failed for file upload',\n data: { error: (error as Error).message }\n })\n );\n }\n\n const { filename, totalChunks, chunkIndex, uniqueID } = req.body;\n reportDebug({\n namespace,\n message: 'Received chunk data',\n data: { filename, totalChunks, chunkIndex, uniqueID }\n });\n\n if (\n !filename ||\n !totalChunks ||\n chunkIndex === undefined ||\n !uniqueID ||\n !req.file\n ) {\n return next(\n new WebError({\n statusCode: 400,\n errorCode: 'missing-field',\n message: 'Missing required fields',\n data: {\n filename,\n totalChunks,\n chunkIndex,\n uniqueID,\n receivedChunk: !!req.file\n }\n })\n );\n }\n\n // Client supplied values are used to build file system paths, they must be strictly validated\n // to prevent path traversal (e.g. uniqueID=\"../../etc\") and resource exhaustion\n const chunkIndexNum = Number(chunkIndex);\n const totalChunksNum = Number(totalChunks);\n if (\n typeof uniqueID !== 'string' ||\n !SAFE_ID_PATTERN.test(uniqueID) ||\n typeof filename !== 'string' ||\n !isSafeFilename(filename) ||\n !Number.isInteger(totalChunksNum) ||\n totalChunksNum < 1 ||\n totalChunksNum > MAX_CHUNKS ||\n !Number.isInteger(chunkIndexNum) ||\n chunkIndexNum < 0 ||\n chunkIndexNum >= totalChunksNum\n ) {\n return next(\n new WebError({\n statusCode: 400,\n errorCode: 'invalid-field',\n message: 'Invalid chunk upload parameters',\n data: { filename, totalChunks, chunkIndex, uniqueID }\n })\n );\n }\n\n if (\n filesOption?.maxSize &&\n req.file.size > (bytes(filesOption.maxSize) || 0)\n ) {\n return next(\n new WebError({\n statusCode: 400,\n errorCode: 'chunk-too-large',\n message: 'Uploaded chunk exceeds the maximum allowed size',\n data: {\n maxSize: filesOption.maxSize,\n receivedSize: req.file.size\n }\n })\n );\n }\n\n const sessionFolder = path.join(TEMP_DIR, uniqueID);\n fs.ensureDirSync(sessionFolder);\n const chunkPath = path.join(\n sessionFolder,\n `${filename}.part${chunkIndexNum}`\n );\n\n try {\n reportDebug({\n namespace,\n message: 'Writing chunk to disk',\n data: { chunkPath }\n });\n await fs.writeFile(chunkPath, req.file.buffer);\n } catch (writeErr) {\n return next(\n new WebError({\n statusCode: 500,\n errorCode: 'chunk-write-failed',\n message: 'Failed to write chunk',\n data: { chunkIndex, error: (writeErr as Error).message }\n })\n );\n }\n\n const uploadedChunks = await fs.readdir(sessionFolder);\n reportDebug({\n namespace,\n message: 'Uploaded chunk count',\n data: { uploadedChunks: uploadedChunks.length, totalChunks }\n });\n\n if (uploadedChunks.length === totalChunksNum) {\n try {\n const finalFilePath = path.join(\n FILE_DIR,\n `${uniqueID}_${filename}`\n );\n await mergeChunks(\n filename,\n totalChunks,\n sessionFolder,\n finalFilePath\n );\n req.multipartFile = {\n isPending: false,\n originalname: filename,\n uniqueID,\n filePath: finalFilePath\n };\n } catch (mergeErr) {\n return next(\n new WebError({\n statusCode: 500,\n errorCode: 'file-merge-failed',\n message: 'Error merging file chunks',\n data: { error: (mergeErr as Error).message }\n })\n );\n }\n return next();\n }\n\n req.multipartFile = {\n isPending: true,\n originalname: filename,\n uniqueID,\n chunkIndex,\n totalChunks\n };\n next();\n });\n } catch (error) {\n next(\n new WebError({\n statusCode: 500,\n errorCode: 'unexpected-error',\n message: 'Unexpected error in file upload',\n data: { error: (error as Error).message }\n })\n );\n }\n };\n}\n\nasync function mergeChunks(\n filename: string,\n totalChunks: string | number,\n sessionFolder: string,\n finalFilePath: string\n): Promise<void> {\n const writeStream = fs.createWriteStream(finalFilePath);\n reportDebug({\n namespace,\n message: 'Merging file chunks',\n data: { finalFilePath }\n });\n\n const totalChunksNum = parseInt(totalChunks as string, 10);\n const chunks: Buffer[] = [];\n\n // Read all chunks into memory first\n for (let i = 0; i < totalChunksNum; i++) {\n const partPath = path.join(sessionFolder, `${filename}.part${i}`);\n try {\n const chunkData = await fs.readFile(partPath);\n chunks.push(chunkData);\n } catch (error) {\n // Cleanup on error\n await fs\n .remove(sessionFolder)\n .catch((cleanupErr: Error) =>\n reportError(\n `Error cleaning up folder ${sessionFolder}: ${cleanupErr.message}`\n )\n );\n throw new WebError({\n statusCode: 500,\n errorCode: 'chunk-read-failed',\n message: `Error reading chunk ${i}`,\n data: { error: (error as Error).message }\n });\n }\n }\n\n // Write all chunks sequentially\n for (const chunkData of chunks) {\n writeStream.write(chunkData);\n }\n\n // Remove temp files\n for (let i = 0; i < totalChunksNum; i++) {\n const partPath = path.join(sessionFolder, `${filename}.part${i}`);\n fs.remove(partPath).catch((err: Error) =>\n reportError(`Error removing part ${partPath}: ${err.message}`)\n );\n }\n\n writeStream.end();\n return new Promise<void>((resolve, reject) => {\n writeStream.on('finish', () => {\n // Clean up temp folder after successful merge\n fs.remove(sessionFolder)\n .then(() => resolve(undefined))\n .catch((cleanupErr: Error) => {\n reportError(\n `Error cleaning up temp folder ${sessionFolder}: ${cleanupErr.message}`\n );\n resolve(undefined); // Don't fail the merge if cleanup fails\n });\n });\n writeStream.on('error', (error) => {\n // Cleanup on write error\n fs.remove(sessionFolder).catch((cleanupErr: Error) =>\n reportError(\n `Error cleaning up folder after write error: ${cleanupErr.message}`\n )\n );\n reject(\n new WebError({\n statusCode: 500,\n errorCode: 'file-merge-error',\n message: 'Error merging file chunks',\n data: { error: (error as Error).message }\n })\n );\n });\n });\n}\n"],"mappings":";;;;;;;AACA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,QAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,KAAA,GAAAH,sBAAA,CAAAC,OAAA;AAEA,IAAAG,MAAA,GAAAH,OAAA;AACA,IAAAI,SAAA,GAAAJ,OAAA;AACA,IAAAK,SAAA,GAAAL,OAAA;AAEA,IAAAM,MAAA,GAAAP,sBAAA,CAAAC,OAAA;AAEA,MAAMO,SAAS,GAAG,yCAAyC;AAE3D,MAAMC,QAAgB,GAAGC,aAAI,CAACC,IAAI,CAChCC,OAAO,CAACC,GAAG,CAACC,mBAAmB,IAAI,WAAW,EAC9C,aACF,CAAC;AACD,MAAMC,QAAgB,GAAGL,aAAI,CAACC,IAAI,CAChCC,OAAO,CAACC,GAAG,CAACC,mBAAmB,IAAI,WAAW,EAC9C,iBACF,CAAC;AAEDE,gBAAE,CAACC,aAAa,CAACF,QAAQ,CAAC;AAC1BC,gBAAE,CAACC,aAAa,CAACR,QAAQ,CAAC;AAE1B,MAAMS,OAAO,GAAGC,eAAM,CAACC,aAAa,CAAC,CAAC;;AAEtC;AACA,MAAMC,sBAAsB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;AAC/C;AACA,MAAMC,UAAU,GAAGC,MAAM,CAACX,OAAO,CAACC,GAAG,CAACW,iBAAiB,CAAC,IAAI,KAAK;AACjE;AACA,MAAMC,eAAe,GAAG,wBAAwB;;AAEhD;AACA,SAASC,cAAcA,CAACC,QAAgB,EAAW;EACjD,OACEA,QAAQ,CAACC,MAAM,GAAG,CAAC,IACnBD,QAAQ,CAACC,MAAM,IAAI,GAAG,IACtBD,QAAQ,KAAK,GAAG,IAChBA,QAAQ,KAAK,IAAI,IACjB,CAAC,SAAS,CAACE,IAAI,CAACF,QAAQ,CAAC,IACzBjB,aAAI,CAACoB,QAAQ,CAACH,QAAQ,CAAC,KAAKA,QAAQ;AAExC;AAEO,SAASI,qBAAqBA,CACnCC,WAAwC,EACxCC,SAAiB,EACjB;EACA,OAAO,OACLC,GAAY,EACZC,GAAa,EACbC,IAAkB,KACA;IAClB,IAAI;MACF,IAAAC,kBAAW,EAAC;QAAE7B,SAAS;QAAE8B,OAAO,EAAE;MAAkC,CAAC,CAAC;;MAEtE;MACA,MAAMC,cAAc,GACjBP,WAAW,EAAEQ,OAAO,IAAI,IAAAC,cAAK,EAACT,WAAW,CAACQ,OAAO,CAAC,IAClD5B,OAAO,CAACC,GAAG,CAAC6B,eAAe,IAAI,IAAAD,cAAK,EAAC7B,OAAO,CAACC,GAAG,CAAC6B,eAAe,CAAE,IACnErB,sBAAsB;MACxB,MAAMsB,YAAY,GAAG,IAAAxB,eAAM,EAAC;QAC1BD,OAAO;QACP0B,MAAM,EAAE;UAAEC,QAAQ,EAAEN,cAAc;UAAEO,KAAK,EAAE;QAAE;MAC/C,CAAC,CAAC,CAACC,MAAM,CAAC,MAAM,CAAC;MACjBJ,YAAY,CAACT,GAAG,EAAEC,GAAG,EAAE,MAAOa,GAAG,IAAK;QACpC,IACGA,GAAG,EAAoCC,IAAI,KAAK,iBAAiB,EAClE;UACA,OAAOb,IAAI,CACT,IAAIc,kBAAQ,CAAC;YACXC,UAAU,EAAE,GAAG;YACfC,SAAS,EAAE,iBAAiB;YAC5Bd,OAAO,EAAE,iDAAiD;YAC1De,IAAI,EAAE;cAAEb,OAAO,EAAED;YAAe;UAClC,CAAC,CACH,CAAC;QACH;QACA,IAAIS,GAAG,EAAE;UACP,IAAAM,kBAAW,EAAC,uBAAuB,CAAC;UACpC,OAAOlB,IAAI,CACT,IAAIc,kBAAQ,CAAC;YACXC,UAAU,EAAE,GAAG;YACfC,SAAS,EAAE,eAAe;YAC1Bd,OAAO,EAAE,4BAA4B;YACrCe,IAAI,EAAE;cAAEE,KAAK,EAAEP,GAAG,CAACV;YAAQ;UAC7B,CAAC,CACH,CAAC;QACH;QAEA,IAAI;UACF,IAAAD,kBAAW,EAAC;YAAE7B,SAAS;YAAE8B,OAAO,EAAE;UAAqB,CAAC,CAAC;UACzD,MAAM,IAAAkB,kBAAQ,EAACtB,GAAG,EAAED,SAAS,CAAC;QAChC,CAAC,CAAC,OAAOsB,KAAK,EAAE;UACd,IAAAlB,kBAAW,EAAC;YACV7B,SAAS;YACT8B,OAAO,EAAE,mBAAmB;YAC5Be,IAAI,EAAE;cAAEE;YAAM;UAChB,CAAC,CAAC;UACF,OAAOnB,IAAI,CACT,IAAIc,kBAAQ,CAAC;YACXC,UAAU,EAAE,GAAG;YACfC,SAAS,EAAE,mBAAmB;YAC9Bd,OAAO,EAAE,mCAAmC;YAC5Ce,IAAI,EAAE;cAAEE,KAAK,EAAGA,KAAK,CAAWjB;YAAQ;UAC1C,CAAC,CACH,CAAC;QACH;QAEA,MAAM;UAAEX,QAAQ;UAAE8B,WAAW;UAAEC,UAAU;UAAEC;QAAS,CAAC,GAAGzB,GAAG,CAAC0B,IAAI;QAChE,IAAAvB,kBAAW,EAAC;UACV7B,SAAS;UACT8B,OAAO,EAAE,qBAAqB;UAC9Be,IAAI,EAAE;YAAE1B,QAAQ;YAAE8B,WAAW;YAAEC,UAAU;YAAEC;UAAS;QACtD,CAAC,CAAC;QAEF,IACE,CAAChC,QAAQ,IACT,CAAC8B,WAAW,IACZC,UAAU,KAAKG,SAAS,IACxB,CAACF,QAAQ,IACT,CAACzB,GAAG,CAAC4B,IAAI,EACT;UACA,OAAO1B,IAAI,CACT,IAAIc,kBAAQ,CAAC;YACXC,UAAU,EAAE,GAAG;YACfC,SAAS,EAAE,eAAe;YAC1Bd,OAAO,EAAE,yBAAyB;YAClCe,IAAI,EAAE;cACJ1B,QAAQ;cACR8B,WAAW;cACXC,UAAU;cACVC,QAAQ;cACRI,aAAa,EAAE,CAAC,CAAC7B,GAAG,CAAC4B;YACvB;UACF,CAAC,CACH,CAAC;QACH;;QAEA;QACA;QACA,MAAME,aAAa,GAAGzC,MAAM,CAACmC,UAAU,CAAC;QACxC,MAAMO,cAAc,GAAG1C,MAAM,CAACkC,WAAW,CAAC;QAC1C,IACE,OAAOE,QAAQ,KAAK,QAAQ,IAC5B,CAAClC,eAAe,CAACI,IAAI,CAAC8B,QAAQ,CAAC,IAC/B,OAAOhC,QAAQ,KAAK,QAAQ,IAC5B,CAACD,cAAc,CAACC,QAAQ,CAAC,IACzB,CAACJ,MAAM,CAAC2C,SAAS,CAACD,cAAc,CAAC,IACjCA,cAAc,GAAG,CAAC,IAClBA,cAAc,GAAG3C,UAAU,IAC3B,CAACC,MAAM,CAAC2C,SAAS,CAACF,aAAa,CAAC,IAChCA,aAAa,GAAG,CAAC,IACjBA,aAAa,IAAIC,cAAc,EAC/B;UACA,OAAO7B,IAAI,CACT,IAAIc,kBAAQ,CAAC;YACXC,UAAU,EAAE,GAAG;YACfC,SAAS,EAAE,eAAe;YAC1Bd,OAAO,EAAE,iCAAiC;YAC1Ce,IAAI,EAAE;cAAE1B,QAAQ;cAAE8B,WAAW;cAAEC,UAAU;cAAEC;YAAS;UACtD,CAAC,CACH,CAAC;QACH;QAEA,IACE3B,WAAW,EAAEQ,OAAO,IACpBN,GAAG,CAAC4B,IAAI,CAACK,IAAI,IAAI,IAAA1B,cAAK,EAACT,WAAW,CAACQ,OAAO,CAAC,IAAI,CAAC,CAAC,EACjD;UACA,OAAOJ,IAAI,CACT,IAAIc,kBAAQ,CAAC;YACXC,UAAU,EAAE,GAAG;YACfC,SAAS,EAAE,iBAAiB;YAC5Bd,OAAO,EAAE,iDAAiD;YAC1De,IAAI,EAAE;cACJb,OAAO,EAAER,WAAW,CAACQ,OAAO;cAC5B4B,YAAY,EAAElC,GAAG,CAAC4B,IAAI,CAACK;YACzB;UACF,CAAC,CACH,CAAC;QACH;QAEA,MAAME,aAAa,GAAG3D,aAAI,CAACC,IAAI,CAACF,QAAQ,EAAEkD,QAAQ,CAAC;QACnD3C,gBAAE,CAACC,aAAa,CAACoD,aAAa,CAAC;QAC/B,MAAMC,SAAS,GAAG5D,aAAI,CAACC,IAAI,CACzB0D,aAAa,EACb,GAAG1C,QAAQ,QAAQqC,aAAa,EAClC,CAAC;QAED,IAAI;UACF,IAAA3B,kBAAW,EAAC;YACV7B,SAAS;YACT8B,OAAO,EAAE,uBAAuB;YAChCe,IAAI,EAAE;cAAEiB;YAAU;UACpB,CAAC,CAAC;UACF,MAAMtD,gBAAE,CAACuD,SAAS,CAACD,SAAS,EAAEpC,GAAG,CAAC4B,IAAI,CAACU,MAAM,CAAC;QAChD,CAAC,CAAC,OAAOC,QAAQ,EAAE;UACjB,OAAOrC,IAAI,CACT,IAAIc,kBAAQ,CAAC;YACXC,UAAU,EAAE,GAAG;YACfC,SAAS,EAAE,oBAAoB;YAC/Bd,OAAO,EAAE,uBAAuB;YAChCe,IAAI,EAAE;cAAEK,UAAU;cAAEH,KAAK,EAAGkB,QAAQ,CAAWnC;YAAQ;UACzD,CAAC,CACH,CAAC;QACH;QAEA,MAAMoC,cAAc,GAAG,MAAM1D,gBAAE,CAAC2D,OAAO,CAACN,aAAa,CAAC;QACtD,IAAAhC,kBAAW,EAAC;UACV7B,SAAS;UACT8B,OAAO,EAAE,sBAAsB;UAC/Be,IAAI,EAAE;YAAEqB,cAAc,EAAEA,cAAc,CAAC9C,MAAM;YAAE6B;UAAY;QAC7D,CAAC,CAAC;QAEF,IAAIiB,cAAc,CAAC9C,MAAM,KAAKqC,cAAc,EAAE;UAC5C,IAAI;YACF,MAAMW,aAAa,GAAGlE,aAAI,CAACC,IAAI,CAC7BI,QAAQ,EACR,GAAG4C,QAAQ,IAAIhC,QAAQ,EACzB,CAAC;YACD,MAAMkD,WAAW,CACflD,QAAQ,EACR8B,WAAW,EACXY,aAAa,EACbO,aACF,CAAC;YACD1C,GAAG,CAAC4C,aAAa,GAAG;cAClBC,SAAS,EAAE,KAAK;cAChBC,YAAY,EAAErD,QAAQ;cACtBgC,QAAQ;cACRsB,QAAQ,EAAEL;YACZ,CAAC;UACH,CAAC,CAAC,OAAOM,QAAQ,EAAE;YACjB,OAAO9C,IAAI,CACT,IAAIc,kBAAQ,CAAC;cACXC,UAAU,EAAE,GAAG;cACfC,SAAS,EAAE,mBAAmB;cAC9Bd,OAAO,EAAE,2BAA2B;cACpCe,IAAI,EAAE;gBAAEE,KAAK,EAAG2B,QAAQ,CAAW5C;cAAQ;YAC7C,CAAC,CACH,CAAC;UACH;UACA,OAAOF,IAAI,CAAC,CAAC;QACf;QAEAF,GAAG,CAAC4C,aAAa,GAAG;UAClBC,SAAS,EAAE,IAAI;UACfC,YAAY,EAAErD,QAAQ;UACtBgC,QAAQ;UACRD,UAAU;UACVD;QACF,CAAC;QACDrB,IAAI,CAAC,CAAC;MACR,CAAC,CAAC;IACJ,CAAC,CAAC,OAAOmB,KAAK,EAAE;MACdnB,IAAI,CACF,IAAIc,kBAAQ,CAAC;QACXC,UAAU,EAAE,GAAG;QACfC,SAAS,EAAE,kBAAkB;QAC7Bd,OAAO,EAAE,iCAAiC;QAC1Ce,IAAI,EAAE;UAAEE,KAAK,EAAGA,KAAK,CAAWjB;QAAQ;MAC1C,CAAC,CACH,CAAC;IACH;EACF,CAAC;AACH;AAEA,eAAeuC,WAAWA,CACxBlD,QAAgB,EAChB8B,WAA4B,EAC5BY,aAAqB,EACrBO,aAAqB,EACN;EACf,MAAMO,WAAW,GAAGnE,gBAAE,CAACoE,iBAAiB,CAACR,aAAa,CAAC;EACvD,IAAAvC,kBAAW,EAAC;IACV7B,SAAS;IACT8B,OAAO,EAAE,qBAAqB;IAC9Be,IAAI,EAAE;MAAEuB;IAAc;EACxB,CAAC,CAAC;EAEF,MAAMX,cAAc,GAAGoB,QAAQ,CAAC5B,WAAW,EAAY,EAAE,CAAC;EAC1D,MAAM6B,MAAgB,GAAG,EAAE;;EAE3B;EACA,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGtB,cAAc,EAAEsB,CAAC,EAAE,EAAE;IACvC,MAAMC,QAAQ,GAAG9E,aAAI,CAACC,IAAI,CAAC0D,aAAa,EAAE,GAAG1C,QAAQ,QAAQ4D,CAAC,EAAE,CAAC;IACjE,IAAI;MACF,MAAME,SAAS,GAAG,MAAMzE,gBAAE,CAAC0E,QAAQ,CAACF,QAAQ,CAAC;MAC7CF,MAAM,CAACK,IAAI,CAACF,SAAS,CAAC;IACxB,CAAC,CAAC,OAAOlC,KAAK,EAAE;MACd;MACA,MAAMvC,gBAAE,CACL4E,MAAM,CAACvB,aAAa,CAAC,CACrBwB,KAAK,CAAEC,UAAiB,IACvB,IAAAxC,kBAAW,EACT,4BAA4Be,aAAa,KAAKyB,UAAU,CAACxD,OAAO,EAClE,CACF,CAAC;MACH,MAAM,IAAIY,kBAAQ,CAAC;QACjBC,UAAU,EAAE,GAAG;QACfC,SAAS,EAAE,mBAAmB;QAC9Bd,OAAO,EAAE,uBAAuBiD,CAAC,EAAE;QACnClC,IAAI,EAAE;UAAEE,KAAK,EAAGA,KAAK,CAAWjB;QAAQ;MAC1C,CAAC,CAAC;IACJ;EACF;;EAEA;EACA,KAAK,MAAMmD,SAAS,IAAIH,MAAM,EAAE;IAC9BH,WAAW,CAACY,KAAK,CAACN,SAAS,CAAC;EAC9B;;EAEA;EACA,KAAK,IAAIF,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGtB,cAAc,EAAEsB,CAAC,EAAE,EAAE;IACvC,MAAMC,QAAQ,GAAG9E,aAAI,CAACC,IAAI,CAAC0D,aAAa,EAAE,GAAG1C,QAAQ,QAAQ4D,CAAC,EAAE,CAAC;IACjEvE,gBAAE,CAAC4E,MAAM,CAACJ,QAAQ,CAAC,CAACK,KAAK,CAAE7C,GAAU,IACnC,IAAAM,kBAAW,EAAC,uBAAuBkC,QAAQ,KAAKxC,GAAG,CAACV,OAAO,EAAE,CAC/D,CAAC;EACH;EAEA6C,WAAW,CAACa,GAAG,CAAC,CAAC;EACjB,OAAO,IAAIC,OAAO,CAAO,CAACC,OAAO,EAAEC,MAAM,KAAK;IAC5ChB,WAAW,CAACiB,EAAE,CAAC,QAAQ,EAAE,MAAM;MAC7B;MACApF,gBAAE,CAAC4E,MAAM,CAACvB,aAAa,CAAC,CACrBgC,IAAI,CAAC,MAAMH,OAAO,CAACrC,SAAS,CAAC,CAAC,CAC9BgC,KAAK,CAAEC,UAAiB,IAAK;QAC5B,IAAAxC,kBAAW,EACT,iCAAiCe,aAAa,KAAKyB,UAAU,CAACxD,OAAO,EACvE,CAAC;QACD4D,OAAO,CAACrC,SAAS,CAAC,CAAC,CAAC;MACtB,CAAC,CAAC;IACN,CAAC,CAAC;IACFsB,WAAW,CAACiB,EAAE,CAAC,OAAO,EAAG7C,KAAK,IAAK;MACjC;MACAvC,gBAAE,CAAC4E,MAAM,CAACvB,aAAa,CAAC,CAACwB,KAAK,CAAEC,UAAiB,IAC/C,IAAAxC,kBAAW,EACT,+CAA+CwC,UAAU,CAACxD,OAAO,EACnE,CACF,CAAC;MACD6D,MAAM,CACJ,IAAIjD,kBAAQ,CAAC;QACXC,UAAU,EAAE,GAAG;QACfC,SAAS,EAAE,kBAAkB;QAC7Bd,OAAO,EAAE,2BAA2B;QACpCe,IAAI,EAAE;UAAEE,KAAK,EAAGA,KAAK,CAAWjB;QAAQ;MAC1C,CAAC,CACH,CAAC;IACH,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"requestMetrics.js","names":["_responseTime","_interopRequireDefault","require","_metrics","excludedPrefixes","requestMetrics","request","response","next","path","route","prefix","startsWith","httpInFlight","inc","inflightDecremented","cleanup","dec","once","statusCode","statusClass","toString","substring","httpErrorCount","service","process","env","CHART","status","method","lenHeader","getHeader","len","parseInt","String","NaN","Number","isNaN","httpResponseSize","observe","rt","responseTime","req","res","time","labels","httpRequestCount","httpRequestDuration","exports"],"sources":["../../../src/middleware/requestMetrics/requestMetrics.ts"],"sourcesContent":["import { Request, Response, NextFunction } from 'express';\nimport responseTime from 'response-time';\nimport {\n httpRequestCount,\n httpRequestDuration,\n httpInFlight,\n httpErrorCount,\n httpResponseSize\n} from 'metrics';\n\nconst excludedPrefixes = ['/swagger', '/docs', '/api-docs', '/metrics', '/favicon.ico', '/.well-known'];\n\n/** Composite middleware that tracks in-flight requests, errors, response size and timings */\nexport const requestMetrics = (request: Request, response: Response, next: NextFunction) => {\n const path = (request.route?.path ?? request.path) as string;\n\n // Skip operational/static routes\n for (const prefix of excludedPrefixes) {\n if (path.startsWith(prefix)) return next();\n }\n\n // Increment in-flight\n try {\n httpInFlight.inc();\n } catch {\n // Ignore metric collection errors\n }\n\n // Ensure we decrement on finish/close (only once)\n let inflightDecremented = false;\n const cleanup = () => {\n if (inflightDecremented) return;\n inflightDecremented = true;\n try {\n httpInFlight.dec();\n } catch {\n // Ignore metric collection errors\n }\n };\n\n response.once('finish', () => {\n // record errors\n const statusCode = response.statusCode ?? 0;\n const statusClass = statusCode ? `${statusCode.toString().substring(0, 1)}XX` : '';\n if (statusCode >= 400) {\n try {\n httpErrorCount.inc({ service: process.env.CHART, status: statusClass, method: request.method });\n } catch {\n // Ignore metric collection errors\n }\n }\n\n // observe response size if content-length header available\n const lenHeader = response.getHeader('content-length');\n const len = lenHeader ? parseInt(String(lenHeader), 10) : NaN;\n if (!Number.isNaN(len)) {\n try {\n httpResponseSize.observe({ service: process.env.CHART, path, method: request.method, status: statusClass }, len);\n } catch {\n // Ignore metric collection errors\n }\n }\n\n cleanup();\n });\n\n response.once('close', cleanup);\n\n // Use response-time to record duration and request counts\n const rt = responseTime((req: Request, res: Response, time: number) => {\n const labels = {\n path,\n method: request.method,\n status: res.statusCode ? `${res.statusCode.toString().substring(0, 1)}XX` : '',\n service: process.env.CHART || 'unknown'\n };\n\n try {\n httpRequestCount.inc(labels);\n httpRequestDuration.observe(labels, time / 1000);\n } catch {\n // Ignore metric collection errors\n }\n });\n\n // Call the response-time middleware which will call next when done\n rt(request as Request, response as Response, next as NextFunction);\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"requestMetrics.js","names":["_responseTime","_interopRequireDefault","require","_metrics","excludedPrefixes","requestMetrics","request","response","next","path","route","prefix","startsWith","httpInFlight","inc","inflightDecremented","cleanup","dec","once","statusCode","statusClass","toString","substring","httpErrorCount","service","process","env","CHART","status","method","lenHeader","getHeader","len","parseInt","String","NaN","Number","isNaN","httpResponseSize","observe","rt","responseTime","req","res","time","labels","httpRequestCount","httpRequestDuration","exports"],"sources":["../../../src/middleware/requestMetrics/requestMetrics.ts"],"sourcesContent":["import { Request, Response, NextFunction } from 'express';\nimport responseTime from 'response-time';\nimport {\n httpRequestCount,\n httpRequestDuration,\n httpInFlight,\n httpErrorCount,\n httpResponseSize\n} from 'metrics';\n\nconst excludedPrefixes = [\n '/swagger',\n '/docs',\n '/api-docs',\n '/metrics',\n '/favicon.ico',\n '/.well-known'\n];\n\n/** Composite middleware that tracks in-flight requests, errors, response size and timings */\nexport const requestMetrics = (\n request: Request,\n response: Response,\n next: NextFunction\n) => {\n const path = (request.route?.path ?? request.path) as string;\n\n // Skip operational/static routes\n for (const prefix of excludedPrefixes) {\n if (path.startsWith(prefix)) return next();\n }\n\n // Increment in-flight\n try {\n httpInFlight.inc();\n } catch {\n // Ignore metric collection errors\n }\n\n // Ensure we decrement on finish/close (only once)\n let inflightDecremented = false;\n const cleanup = () => {\n if (inflightDecremented) return;\n inflightDecremented = true;\n try {\n httpInFlight.dec();\n } catch {\n // Ignore metric collection errors\n }\n };\n\n response.once('finish', () => {\n // record errors\n const statusCode = response.statusCode ?? 0;\n const statusClass = statusCode\n ? `${statusCode.toString().substring(0, 1)}XX`\n : '';\n if (statusCode >= 400) {\n try {\n httpErrorCount.inc({\n service: process.env.CHART,\n status: statusClass,\n method: request.method\n });\n } catch {\n // Ignore metric collection errors\n }\n }\n\n // observe response size if content-length header available\n const lenHeader = response.getHeader('content-length');\n const len = lenHeader ? parseInt(String(lenHeader), 10) : NaN;\n if (!Number.isNaN(len)) {\n try {\n httpResponseSize.observe(\n {\n service: process.env.CHART,\n path,\n method: request.method,\n status: statusClass\n },\n len\n );\n } catch {\n // Ignore metric collection errors\n }\n }\n\n cleanup();\n });\n\n response.once('close', cleanup);\n\n // Use response-time to record duration and request counts\n const rt = responseTime((req: Request, res: Response, time: number) => {\n const labels = {\n path,\n method: request.method,\n status: res.statusCode\n ? `${res.statusCode.toString().substring(0, 1)}XX`\n : '',\n service: process.env.CHART || 'unknown'\n };\n\n try {\n httpRequestCount.inc(labels);\n httpRequestDuration.observe(labels, time / 1000);\n } catch {\n // Ignore metric collection errors\n }\n });\n\n // Call the response-time middleware which will call next when done\n rt(request as Request, response as Response, next as NextFunction);\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"swaggerDocs.js","names":["_fs","_interopRequireDefault","require","_express","_glob","_yamljs","_swaggerUiExpress","getEndpointDocPaths","glob","sync","process","cwd","getSchemaPaths","getResponsePaths","loadAndMergeData","files","map","file","YAML","load","reduce","result","endpoint","path","Object","keys","loadEndpoints","paths","endpoints","loadSchemas","schemas","loadResponses","responses","loadConfig","indexPath","config","fs","existsSync","schemaConfig","responseConfig","endpointConfig","components","swaggerDocs","stringifiedDocumentation","JSON","stringify","placeholderRegex","overwrittenDocumentation","replace","match","p1","env","parse","Router","use","swaggerUi","serve","setup"],"sources":["../../../src/middleware/swaggerDocs/swaggerDocs.ts"],"sourcesContent":["import fs from 'fs';\nimport { Router } from 'express';\nimport { glob } from 'glob';\nimport YAML from 'yamljs';\nimport swaggerUi from 'swagger-ui-express';\nimport {\n EndpointDocumentation,\n IndexDocumentation,\n ResponsesConfig,\n EndpointConfig,\n SchemasConfig,\n SwaggerConfig\n} from './swaggerDocs.types';\n\n/** Get the paths of all the endpoint documentation files */\nfunction getEndpointDocPaths(): Array<string> {\n return [\n ...glob.sync(`${process.cwd()}/src/**/*.docs.yaml`),\n ...glob.sync(`${process.cwd()}/dist/**/*.docs.yaml`)\n ];\n}\n\n/** Get the paths of all the schema files */\nfunction getSchemaPaths(): Array<string> {\n return [\n ...glob.sync(`${process.cwd()}/src/docs/schemas/*.yaml`),\n ...glob.sync(`${process.cwd()}/dist/docs/schemas/*.yaml`)\n ];\n}\n\n/** Get the paths of all the response files */\nfunction getResponsePaths(): Array<string> {\n return [\n ...glob.sync(`${process.cwd()}/src/docs/responses/*.yaml`),\n ...glob.sync(`${process.cwd()}/dist/docs/responses/*.yaml`)\n ];\n}\n\n/**\n * Load all data files and merge them in a single object\n * @param files\n * @return {Object}\n */\nfunction loadAndMergeData(files: Array<string>): EndpointDocumentation {\n return files\n .map((file) => YAML.load(file) as EndpointDocumentation)\n .reduce((result, endpoint) => {\n for (const path of Object.keys(endpoint)) {\n if (!(path in result)) result[path] = {};\n result[path] = { ...result[path], ...endpoint[path] };\n }\n return result;\n }, {});\n}\n\n/** Load documentation files of all the endpoints */\nfunction loadEndpoints(): EndpointConfig {\n const paths = getEndpointDocPaths();\n const endpoints = loadAndMergeData(paths);\n return {\n paths: endpoints\n };\n}\n\n/** Load documentation files of all the schemas */\nfunction loadSchemas(): SchemasConfig {\n const paths = getSchemaPaths();\n const schemas = loadAndMergeData(paths);\n return { schemas };\n}\n\n/** Load documentation files of all the responses */\nfunction loadResponses(): ResponsesConfig {\n const paths = getResponsePaths();\n const responses = loadAndMergeData(paths);\n return { responses };\n}\n\n/** Load the whole Swagger config */\nfunction loadConfig(): SwaggerConfig {\n const indexPath = `${process.cwd()}/src/docs/index.yaml`;\n const config = (\n fs.existsSync(indexPath) ? YAML.load(indexPath) : {}\n ) as IndexDocumentation;\n const schemaConfig = loadSchemas();\n const responseConfig = loadResponses();\n const endpointConfig = loadEndpoints();\n return {\n ...config,\n ...endpointConfig,\n components: {\n ...config.components,\n ...schemaConfig,\n ...responseConfig\n }\n };\n}\n\n/**\n * Get a middleware that serves the documentation\n * @return {Router}\n */\nexport function swaggerDocs(): Router {\n // Stringify the result and replace any environment variable, then turn it again to an object\n const stringifiedDocumentation = JSON.stringify(loadConfig());\n const placeholderRegex = /##(.+?)##/g;\n const overwrittenDocumentation = stringifiedDocumentation.replace(\n placeholderRegex,\n (match: string, p1: string): string => process.env[p1] ?? ''\n );\n const config = JSON.parse(overwrittenDocumentation) as EndpointDocumentation;\n \n return Router().use('/docs', swaggerUi.serve, swaggerUi.setup(config));\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"swaggerDocs.js","names":["_fs","_interopRequireDefault","require","_express","_glob","_yamljs","_swaggerUiExpress","getEndpointDocPaths","glob","sync","process","cwd","getSchemaPaths","getResponsePaths","loadAndMergeData","files","map","file","YAML","load","reduce","result","endpoint","path","Object","keys","loadEndpoints","paths","endpoints","loadSchemas","schemas","loadResponses","responses","loadConfig","indexPath","config","fs","existsSync","schemaConfig","responseConfig","endpointConfig","components","swaggerDocs","stringifiedDocumentation","JSON","stringify","placeholderRegex","overwrittenDocumentation","replace","match","p1","env","parse","Router","use","swaggerUi","serve","setup"],"sources":["../../../src/middleware/swaggerDocs/swaggerDocs.ts"],"sourcesContent":["import fs from 'fs';\nimport { Router } from 'express';\nimport { glob } from 'glob';\nimport YAML from 'yamljs';\nimport swaggerUi from 'swagger-ui-express';\nimport {\n EndpointDocumentation,\n IndexDocumentation,\n ResponsesConfig,\n EndpointConfig,\n SchemasConfig,\n SwaggerConfig\n} from './swaggerDocs.types';\n\n/** Get the paths of all the endpoint documentation files */\nfunction getEndpointDocPaths(): Array<string> {\n return [\n ...glob.sync(`${process.cwd()}/src/**/*.docs.yaml`),\n ...glob.sync(`${process.cwd()}/dist/**/*.docs.yaml`)\n ];\n}\n\n/** Get the paths of all the schema files */\nfunction getSchemaPaths(): Array<string> {\n return [\n ...glob.sync(`${process.cwd()}/src/docs/schemas/*.yaml`),\n ...glob.sync(`${process.cwd()}/dist/docs/schemas/*.yaml`)\n ];\n}\n\n/** Get the paths of all the response files */\nfunction getResponsePaths(): Array<string> {\n return [\n ...glob.sync(`${process.cwd()}/src/docs/responses/*.yaml`),\n ...glob.sync(`${process.cwd()}/dist/docs/responses/*.yaml`)\n ];\n}\n\n/**\n * Load all data files and merge them in a single object\n * @param files\n * @return {Object}\n */\nfunction loadAndMergeData(files: Array<string>): EndpointDocumentation {\n return files\n .map((file) => YAML.load(file) as EndpointDocumentation)\n .reduce((result, endpoint) => {\n for (const path of Object.keys(endpoint)) {\n if (!(path in result)) result[path] = {};\n result[path] = { ...result[path], ...endpoint[path] };\n }\n return result;\n }, {});\n}\n\n/** Load documentation files of all the endpoints */\nfunction loadEndpoints(): EndpointConfig {\n const paths = getEndpointDocPaths();\n const endpoints = loadAndMergeData(paths);\n return {\n paths: endpoints\n };\n}\n\n/** Load documentation files of all the schemas */\nfunction loadSchemas(): SchemasConfig {\n const paths = getSchemaPaths();\n const schemas = loadAndMergeData(paths);\n return { schemas };\n}\n\n/** Load documentation files of all the responses */\nfunction loadResponses(): ResponsesConfig {\n const paths = getResponsePaths();\n const responses = loadAndMergeData(paths);\n return { responses };\n}\n\n/** Load the whole Swagger config */\nfunction loadConfig(): SwaggerConfig {\n const indexPath = `${process.cwd()}/src/docs/index.yaml`;\n const config = (\n fs.existsSync(indexPath) ? YAML.load(indexPath) : {}\n ) as IndexDocumentation;\n const schemaConfig = loadSchemas();\n const responseConfig = loadResponses();\n const endpointConfig = loadEndpoints();\n return {\n ...config,\n ...endpointConfig,\n components: {\n ...config.components,\n ...schemaConfig,\n ...responseConfig\n }\n };\n}\n\n/**\n * Get a middleware that serves the documentation\n * @return {Router}\n */\nexport function swaggerDocs(): Router {\n // Stringify the result and replace any environment variable, then turn it again to an object\n const stringifiedDocumentation = JSON.stringify(loadConfig());\n const placeholderRegex = /##(.+?)##/g;\n const overwrittenDocumentation = stringifiedDocumentation.replace(\n placeholderRegex,\n (match: string, p1: string): string => process.env[p1] ?? ''\n );\n const config = JSON.parse(overwrittenDocumentation) as EndpointDocumentation;\n\n return Router().use('/docs', swaggerUi.serve, swaggerUi.setup(config));\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"verificationToken.js","names":["_WebError","require","_report","_verificationToken","namespace","DEFAULT_TOKEN_HEADER","DEFAULT_OTP_HEADER","DEFAULT_TOKEN_FIELD","DEFAULT_OTP_FIELD","readString","request","headerName","fieldName","headerValue","headers","toLowerCase","Array","isArray","bodyValue","body","undefined","queryValue","query","verificationToken","action","options","_response","next","tokenHeader","otpHeader","tokenField","otpField","requireOtp","token","WebError","errorCode","statusCode","message","data","otp","resolvedSubject","subjectResolver","user","id","sub","payload","verifyVerificationToken","issuer","audience","requireSubject","expected","actual","verification","reportDebug","act","subject"],"sources":["../../../src/middleware/verificationToken/verificationToken.ts"],"sourcesContent":["import { Request, Response, NextFunction } from 'express';\nimport { WebError } from 'entities/WebError';\nimport { reportDebug } from 'utils/report';\nimport { verifyVerificationToken } from 'utils/verificationToken';\nimport { VerificationTokenMiddlewareOptions } from './verificationToken.types';\n\nconst namespace = 'engine:middleware:verificationToken';\n\nconst DEFAULT_TOKEN_HEADER = 'x-verification-token';\nconst DEFAULT_OTP_HEADER = 'x-verification-otp';\nconst DEFAULT_TOKEN_FIELD = 'verificationToken';\nconst DEFAULT_OTP_FIELD = 'verificationOtp';\n\nfunction readString(\n request: Request,\n headerName: string,\n fieldName: string\n): string | undefined {\n const headerValue = request.headers[headerName.toLowerCase()];\n if (typeof headerValue === 'string') return headerValue;\n if (Array.isArray(headerValue)) return headerValue[0];\n\n const bodyValue =\n request.body && typeof request.body === 'object'\n ? (request.body as Record<string, unknown>)[fieldName]\n : undefined;\n if (typeof bodyValue === 'string') return bodyValue;\n\n const queryValue =\n request.query && typeof request.query === 'object'\n ? (request.query as Record<string, unknown>)[fieldName]\n : undefined;\n if (typeof queryValue === 'string') return queryValue;\n if (Array.isArray(queryValue)) return queryValue[0];\n\n return undefined;\n}\n\nexport function verificationToken(\n action: string,\n options: VerificationTokenMiddlewareOptions = {}\n): (request: Request, response: Response, next: NextFunction) => void {\n return (request: Request, _response: Response, next: NextFunction): void => {\n const tokenHeader = options.tokenHeader ?? DEFAULT_TOKEN_HEADER;\n const otpHeader = options.otpHeader ?? DEFAULT_OTP_HEADER;\n const tokenField = options.tokenField ?? DEFAULT_TOKEN_FIELD;\n const otpField = options.otpField ?? DEFAULT_OTP_FIELD;\n const requireOtp = options.requireOtp !== false;\n\n const token = readString(request, tokenHeader, tokenField);\n if (!token) {\n throw new WebError({\n errorCode: 'verification_token_missing',\n statusCode: 400,\n message: 'Verification token is required',\n data: { tokenHeader, tokenField }\n });\n }\n\n const otp = readString(request, otpHeader, otpField);\n if (requireOtp && !otp) {\n throw new WebError({\n errorCode: 'verification_otp_missing',\n statusCode: 400,\n message: 'Verification OTP is required',\n data: { otpHeader, otpField }\n });\n }\n\n const resolvedSubject = options.subjectResolver\n ? options.subjectResolver(request)\n : (request.user?.id as string | undefined) ??\n (request.user?.sub as string | undefined);\n\n const payload = verifyVerificationToken(token, {\n action,\n otp: requireOtp ? otp : undefined,\n issuer: options.issuer,\n audience: options.audience\n });\n\n if (resolvedSubject) {\n if (!payload.sub && options.requireSubject) {\n throw new WebError({\n errorCode: 'verification_failed',\n statusCode: 403,\n message: 'Verification token missing subject'\n });\n }\n if (payload.sub && payload.sub !== resolvedSubject) {\n throw new WebError({\n errorCode: 'verification_failed',\n statusCode: 403,\n message: 'Verification subject mismatch',\n data: { expected: resolvedSubject, actual: payload.sub }\n });\n }\n }\n\n request.verification = payload;\n reportDebug({\n namespace,\n message: 'Verification token validated',\n data: { action: payload.act, subject: payload.sub }\n });\n\n next();\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"verificationToken.js","names":["_WebError","require","_report","_verificationToken","namespace","DEFAULT_TOKEN_HEADER","DEFAULT_OTP_HEADER","DEFAULT_TOKEN_FIELD","DEFAULT_OTP_FIELD","readString","request","headerName","fieldName","headerValue","headers","toLowerCase","Array","isArray","bodyValue","body","undefined","queryValue","query","verificationToken","action","options","_response","next","tokenHeader","otpHeader","tokenField","otpField","requireOtp","token","WebError","errorCode","statusCode","message","data","otp","resolvedSubject","subjectResolver","user","id","sub","payload","verifyVerificationToken","issuer","audience","requireSubject","expected","actual","verification","reportDebug","act","subject"],"sources":["../../../src/middleware/verificationToken/verificationToken.ts"],"sourcesContent":["import { Request, Response, NextFunction } from 'express';\nimport { WebError } from 'entities/WebError';\nimport { reportDebug } from 'utils/report';\nimport { verifyVerificationToken } from 'utils/verificationToken';\nimport { VerificationTokenMiddlewareOptions } from './verificationToken.types';\n\nconst namespace = 'engine:middleware:verificationToken';\n\nconst DEFAULT_TOKEN_HEADER = 'x-verification-token';\nconst DEFAULT_OTP_HEADER = 'x-verification-otp';\nconst DEFAULT_TOKEN_FIELD = 'verificationToken';\nconst DEFAULT_OTP_FIELD = 'verificationOtp';\n\nfunction readString(\n request: Request,\n headerName: string,\n fieldName: string\n): string | undefined {\n const headerValue = request.headers[headerName.toLowerCase()];\n if (typeof headerValue === 'string') return headerValue;\n if (Array.isArray(headerValue)) return headerValue[0];\n\n const bodyValue =\n request.body && typeof request.body === 'object'\n ? (request.body as Record<string, unknown>)[fieldName]\n : undefined;\n if (typeof bodyValue === 'string') return bodyValue;\n\n const queryValue =\n request.query && typeof request.query === 'object'\n ? (request.query as Record<string, unknown>)[fieldName]\n : undefined;\n if (typeof queryValue === 'string') return queryValue;\n if (Array.isArray(queryValue)) return queryValue[0];\n\n return undefined;\n}\n\nexport function verificationToken(\n action: string,\n options: VerificationTokenMiddlewareOptions = {}\n): (request: Request, response: Response, next: NextFunction) => void {\n return (request: Request, _response: Response, next: NextFunction): void => {\n const tokenHeader = options.tokenHeader ?? DEFAULT_TOKEN_HEADER;\n const otpHeader = options.otpHeader ?? DEFAULT_OTP_HEADER;\n const tokenField = options.tokenField ?? DEFAULT_TOKEN_FIELD;\n const otpField = options.otpField ?? DEFAULT_OTP_FIELD;\n const requireOtp = options.requireOtp !== false;\n\n const token = readString(request, tokenHeader, tokenField);\n if (!token) {\n throw new WebError({\n errorCode: 'verification_token_missing',\n statusCode: 400,\n message: 'Verification token is required',\n data: { tokenHeader, tokenField }\n });\n }\n\n const otp = readString(request, otpHeader, otpField);\n if (requireOtp && !otp) {\n throw new WebError({\n errorCode: 'verification_otp_missing',\n statusCode: 400,\n message: 'Verification OTP is required',\n data: { otpHeader, otpField }\n });\n }\n\n const resolvedSubject = options.subjectResolver\n ? options.subjectResolver(request)\n : ((request.user?.id as string | undefined) ??\n (request.user?.sub as string | undefined));\n\n const payload = verifyVerificationToken(token, {\n action,\n otp: requireOtp ? otp : undefined,\n issuer: options.issuer,\n audience: options.audience\n });\n\n if (resolvedSubject) {\n if (!payload.sub && options.requireSubject) {\n throw new WebError({\n errorCode: 'verification_failed',\n statusCode: 403,\n message: 'Verification token missing subject'\n });\n }\n if (payload.sub && payload.sub !== resolvedSubject) {\n throw new WebError({\n errorCode: 'verification_failed',\n statusCode: 403,\n message: 'Verification subject mismatch',\n data: { expected: resolvedSubject, actual: payload.sub }\n });\n }\n }\n\n request.verification = payload;\n reportDebug({\n namespace,\n message: 'Verification token validated',\n data: { action: payload.act, subject: payload.sub }\n });\n\n next();\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"createSortedObject.js","names":["createSortedObject","data","Error","Array","isArray","map","item","result","Object","keys","sort","forEach","key","value"],"sources":["../../../src/utils/createSortedObject/createSortedObject.ts"],"sourcesContent":["/**\n * Deep sort object keys alphabetically\n * @param data - The object to sort\n * @returns A new object with sorted keys\n */\nexport function createSortedObject<T>(data: T): T {\n if (typeof data !== 'object' || data === null) {\n throw new Error('Input must be a non-null object');\n }\n\n if (Array.isArray(data)) {\n return data.map((item) =>\n typeof item === 'object' && item !== null ? createSortedObject(item) : item\n ) as T;\n }\n\n const result: Record<string, unknown> = {};\n \n Object.keys(data)\n .sort()\n .forEach((key: string) => {\n const value = (data as Record<string, unknown>)[key];\n \n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n result[key] = Array.isArray(value)\n ? value.map((item) =>\n typeof item === 'object' && item !== null\n ? createSortedObject(item)\n : item\n )\n : value;\n } else {\n result[key] = createSortedObject(value);\n }\n });\n \n return result as T;\n}\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACO,SAASA,kBAAkBA,CAAIC,IAAO,EAAK;EAChD,IAAI,OAAOA,IAAI,KAAK,QAAQ,IAAIA,IAAI,KAAK,IAAI,EAAE;IAC7C,MAAM,IAAIC,KAAK,CAAC,iCAAiC,CAAC;EACpD;EAEA,IAAIC,KAAK,CAACC,OAAO,CAACH,IAAI,CAAC,EAAE;IACvB,OAAOA,IAAI,CAACI,GAAG,CAAEC,IAAI,IACnB,OAAOA,IAAI,KAAK,QAAQ,IAAIA,IAAI,KAAK,IAAI,GAAGN,kBAAkB,CAACM,IAAI,CAAC,GAAGA,IACzE,CAAC;EACH;EAEA,MAAMC,MAA+B,GAAG,CAAC,CAAC;EAE1CC,MAAM,CAACC,IAAI,CAACR,IAAI,CAAC,CACdS,IAAI,CAAC,CAAC,CACNC,OAAO,CAAEC,GAAW,IAAK;IACxB,MAAMC,KAAK,GAAIZ,IAAI,CAA6BW,GAAG,CAAC;IAEpD,IAAIC,KAAK,KAAK,IAAI,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAIV,KAAK,CAACC,OAAO,CAACS,KAAK,CAAC,EAAE;MACvEN,MAAM,CAACK,GAAG,CAAC,GAAGT,KAAK,CAACC,OAAO,CAACS,KAAK,CAAC,GAC9BA,KAAK,CAACR,GAAG,CAAEC,IAAI,IACb,OAAOA,IAAI,KAAK,QAAQ,IAAIA,IAAI,KAAK,IAAI,GACrCN,kBAAkB,CAACM,IAAI,CAAC,GACxBA,IACN,CAAC,GACDO,KAAK;IACX,CAAC,MAAM;MACLN,MAAM,CAACK,GAAG,CAAC,GAAGZ,kBAAkB,CAACa,KAAK,CAAC;IACzC;EACF,CAAC,CAAC;EAEJ,OAAON,MAAM;AACf","ignoreList":[]}
1
+ {"version":3,"file":"createSortedObject.js","names":["createSortedObject","data","Error","Array","isArray","map","item","result","Object","keys","sort","forEach","key","value"],"sources":["../../../src/utils/createSortedObject/createSortedObject.ts"],"sourcesContent":["/**\n * Deep sort object keys alphabetically\n * @param data - The object to sort\n * @returns A new object with sorted keys\n */\nexport function createSortedObject<T>(data: T): T {\n if (typeof data !== 'object' || data === null) {\n throw new Error('Input must be a non-null object');\n }\n\n if (Array.isArray(data)) {\n return data.map((item) =>\n typeof item === 'object' && item !== null\n ? createSortedObject(item)\n : item\n ) as T;\n }\n\n const result: Record<string, unknown> = {};\n\n Object.keys(data)\n .sort()\n .forEach((key: string) => {\n const value = (data as Record<string, unknown>)[key];\n\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n result[key] = Array.isArray(value)\n ? value.map((item) =>\n typeof item === 'object' && item !== null\n ? createSortedObject(item)\n : item\n )\n : value;\n } else {\n result[key] = createSortedObject(value);\n }\n });\n\n return result as T;\n}\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACO,SAASA,kBAAkBA,CAAIC,IAAO,EAAK;EAChD,IAAI,OAAOA,IAAI,KAAK,QAAQ,IAAIA,IAAI,KAAK,IAAI,EAAE;IAC7C,MAAM,IAAIC,KAAK,CAAC,iCAAiC,CAAC;EACpD;EAEA,IAAIC,KAAK,CAACC,OAAO,CAACH,IAAI,CAAC,EAAE;IACvB,OAAOA,IAAI,CAACI,GAAG,CAAEC,IAAI,IACnB,OAAOA,IAAI,KAAK,QAAQ,IAAIA,IAAI,KAAK,IAAI,GACrCN,kBAAkB,CAACM,IAAI,CAAC,GACxBA,IACN,CAAC;EACH;EAEA,MAAMC,MAA+B,GAAG,CAAC,CAAC;EAE1CC,MAAM,CAACC,IAAI,CAACR,IAAI,CAAC,CACdS,IAAI,CAAC,CAAC,CACNC,OAAO,CAAEC,GAAW,IAAK;IACxB,MAAMC,KAAK,GAAIZ,IAAI,CAA6BW,GAAG,CAAC;IAEpD,IAAIC,KAAK,KAAK,IAAI,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAIV,KAAK,CAACC,OAAO,CAACS,KAAK,CAAC,EAAE;MACvEN,MAAM,CAACK,GAAG,CAAC,GAAGT,KAAK,CAACC,OAAO,CAACS,KAAK,CAAC,GAC9BA,KAAK,CAACR,GAAG,CAAEC,IAAI,IACb,OAAOA,IAAI,KAAK,QAAQ,IAAIA,IAAI,KAAK,IAAI,GACrCN,kBAAkB,CAACM,IAAI,CAAC,GACxBA,IACN,CAAC,GACDO,KAAK;IACX,CAAC,MAAM;MACLN,MAAM,CAACK,GAAG,CAAC,GAAGZ,kBAAkB,CAACa,KAAK,CAAC;IACzC;EACF,CAAC,CAAC;EAEJ,OAAON,MAAM;AACf","ignoreList":[]}