@scpxl/nodejs-framework 1.0.20 → 1.0.22

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 (276) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +530 -67
  3. package/dist/application/base-application.js +1 -1
  4. package/dist/application/base-application.js.map +2 -2
  5. package/dist/application/command-application.js.map +2 -2
  6. package/dist/application/web-application.js +1 -0
  7. package/dist/application/web-application.js.map +2 -2
  8. package/dist/command/command.js.map +1 -1
  9. package/dist/config/schema.js +17 -7
  10. package/dist/config/schema.js.map +2 -2
  11. package/dist/event/manager.js.map +2 -2
  12. package/dist/lifecycle/lifecycle-manager.js.map +2 -2
  13. package/dist/logger/logger.js +21 -1
  14. package/dist/logger/logger.js.map +2 -2
  15. package/dist/queue/index.js.map +1 -1
  16. package/dist/queue/manager.js +24 -12
  17. package/dist/queue/manager.js.map +2 -2
  18. package/dist/queue/processor/base.js.map +2 -2
  19. package/dist/services/aws/s3.js.map +2 -2
  20. package/dist/util/helper.js +1 -1
  21. package/dist/util/helper.js.map +2 -2
  22. package/dist/util/loader.js.map +2 -2
  23. package/dist/webserver/controller/base.js.map +2 -2
  24. package/dist/webserver/define-route.js +22 -0
  25. package/dist/webserver/define-route.js.map +7 -0
  26. package/dist/webserver/index.js +2 -0
  27. package/dist/webserver/index.js.map +2 -2
  28. package/dist/webserver/webserver.interface.js.map +2 -2
  29. package/dist/webserver/webserver.js +211 -56
  30. package/dist/webserver/webserver.js.map +2 -2
  31. package/dist/websocket/websocket-base.js.map +2 -2
  32. package/dist/websocket/websocket-client.js.map +1 -1
  33. package/dist/websocket/websocket-server.js +5 -5
  34. package/dist/websocket/websocket-server.js.map +2 -2
  35. package/dist/websocket/websocket.interface.js.map +2 -2
  36. package/package.json +3 -2
  37. package/dist/api-requester/api-requester.d.ts +0 -32
  38. package/dist/api-requester/api-requester.d.ts.map +0 -1
  39. package/dist/api-requester/index.d.ts +0 -3
  40. package/dist/api-requester/index.d.ts.map +0 -1
  41. package/dist/application/base-application.d.ts +0 -106
  42. package/dist/application/base-application.d.ts.map +0 -1
  43. package/dist/application/base-application.interface.d.ts +0 -161
  44. package/dist/application/base-application.interface.d.ts.map +0 -1
  45. package/dist/application/command-application.d.ts +0 -18
  46. package/dist/application/command-application.d.ts.map +0 -1
  47. package/dist/application/command-application.interface.d.ts +0 -26
  48. package/dist/application/command-application.interface.d.ts.map +0 -1
  49. package/dist/application/index.d.ts +0 -5
  50. package/dist/application/index.d.ts.map +0 -1
  51. package/dist/application/web-application.d.ts +0 -43
  52. package/dist/application/web-application.d.ts.map +0 -1
  53. package/dist/application/web-application.interface.d.ts +0 -21
  54. package/dist/application/web-application.interface.d.ts.map +0 -1
  55. package/dist/auth/index.d.ts +0 -2
  56. package/dist/auth/index.d.ts.map +0 -1
  57. package/dist/auth/jwt.d.ts +0 -25
  58. package/dist/auth/jwt.d.ts.map +0 -1
  59. package/dist/cache/index.d.ts +0 -2
  60. package/dist/cache/index.d.ts.map +0 -1
  61. package/dist/cache/manager.d.ts +0 -107
  62. package/dist/cache/manager.d.ts.map +0 -1
  63. package/dist/cluster/cluster-manager.d.ts +0 -15
  64. package/dist/cluster/cluster-manager.d.ts.map +0 -1
  65. package/dist/cluster/cluster-manager.interface.d.ts +0 -23
  66. package/dist/cluster/cluster-manager.interface.d.ts.map +0 -1
  67. package/dist/cluster/index.d.ts +0 -2
  68. package/dist/cluster/index.d.ts.map +0 -1
  69. package/dist/command/command-manager.d.ts +0 -19
  70. package/dist/command/command-manager.d.ts.map +0 -1
  71. package/dist/command/command.d.ts +0 -27
  72. package/dist/command/command.d.ts.map +0 -1
  73. package/dist/command/command.interface.d.ts +0 -11
  74. package/dist/command/command.interface.d.ts.map +0 -1
  75. package/dist/command/index.d.ts +0 -3
  76. package/dist/command/index.d.ts.map +0 -1
  77. package/dist/config/env.d.ts +0 -11
  78. package/dist/config/env.d.ts.map +0 -1
  79. package/dist/config/index.d.ts +0 -3
  80. package/dist/config/index.d.ts.map +0 -1
  81. package/dist/config/schema.d.ts +0 -408
  82. package/dist/config/schema.d.ts.map +0 -1
  83. package/dist/database/dynamic-entity-form-decorators.d.ts +0 -31
  84. package/dist/database/dynamic-entity-form-decorators.d.ts.map +0 -1
  85. package/dist/database/dynamic-entity.d.ts +0 -15
  86. package/dist/database/dynamic-entity.d.ts.map +0 -1
  87. package/dist/database/index.d.ts +0 -5
  88. package/dist/database/index.d.ts.map +0 -1
  89. package/dist/database/instance.d.ts +0 -36
  90. package/dist/database/instance.d.ts.map +0 -1
  91. package/dist/database/instance.interface.d.ts +0 -5
  92. package/dist/database/instance.interface.d.ts.map +0 -1
  93. package/dist/database/manager.d.ts +0 -27
  94. package/dist/database/manager.d.ts.map +0 -1
  95. package/dist/database/manager.interface.d.ts +0 -18
  96. package/dist/database/manager.interface.d.ts.map +0 -1
  97. package/dist/error/error-reporter.d.ts +0 -96
  98. package/dist/error/error-reporter.d.ts.map +0 -1
  99. package/dist/error/error.interface.d.ts +0 -126
  100. package/dist/error/error.interface.d.ts.map +0 -1
  101. package/dist/error/framework-errors.d.ts +0 -113
  102. package/dist/error/framework-errors.d.ts.map +0 -1
  103. package/dist/error/index.d.ts +0 -6
  104. package/dist/error/index.d.ts.map +0 -1
  105. package/dist/event/controller/base.d.ts +0 -23
  106. package/dist/event/controller/base.d.ts.map +0 -1
  107. package/dist/event/controller/base.interface.d.ts +0 -11
  108. package/dist/event/controller/base.interface.d.ts.map +0 -1
  109. package/dist/event/index.d.ts +0 -5
  110. package/dist/event/index.d.ts.map +0 -1
  111. package/dist/event/manager.d.ts +0 -21
  112. package/dist/event/manager.d.ts.map +0 -1
  113. package/dist/event/manager.interface.d.ts +0 -134
  114. package/dist/event/manager.interface.d.ts.map +0 -1
  115. package/dist/index.d.ts +0 -22
  116. package/dist/index.d.ts.map +0 -1
  117. package/dist/lifecycle/exit.d.ts +0 -11
  118. package/dist/lifecycle/exit.d.ts.map +0 -1
  119. package/dist/lifecycle/index.d.ts +0 -7
  120. package/dist/lifecycle/index.d.ts.map +0 -1
  121. package/dist/lifecycle/lifecycle-manager.d.ts +0 -66
  122. package/dist/lifecycle/lifecycle-manager.d.ts.map +0 -1
  123. package/dist/lifecycle/shutdown-controller.d.ts +0 -15
  124. package/dist/lifecycle/shutdown-controller.d.ts.map +0 -1
  125. package/dist/lifecycle/types.d.ts +0 -28
  126. package/dist/lifecycle/types.d.ts.map +0 -1
  127. package/dist/logger/index.d.ts +0 -2
  128. package/dist/logger/index.d.ts.map +0 -1
  129. package/dist/logger/logger.d.ts +0 -55
  130. package/dist/logger/logger.d.ts.map +0 -1
  131. package/dist/logger/logger.interface.d.ts +0 -2
  132. package/dist/logger/logger.interface.d.ts.map +0 -1
  133. package/dist/performance/cache-performance.d.ts +0 -64
  134. package/dist/performance/cache-performance.d.ts.map +0 -1
  135. package/dist/performance/database-performance.d.ts +0 -40
  136. package/dist/performance/database-performance.d.ts.map +0 -1
  137. package/dist/performance/index.d.ts +0 -8
  138. package/dist/performance/index.d.ts.map +0 -1
  139. package/dist/performance/performance-monitor.d.ts +0 -68
  140. package/dist/performance/performance-monitor.d.ts.map +0 -1
  141. package/dist/performance/performance-monitor.plugin.d.ts +0 -24
  142. package/dist/performance/performance-monitor.plugin.d.ts.map +0 -1
  143. package/dist/performance/queue-performance.d.ts +0 -46
  144. package/dist/performance/queue-performance.d.ts.map +0 -1
  145. package/dist/performance/webserver-performance.d.ts +0 -69
  146. package/dist/performance/webserver-performance.d.ts.map +0 -1
  147. package/dist/performance/websocket-performance.d.ts +0 -44
  148. package/dist/performance/websocket-performance.d.ts.map +0 -1
  149. package/dist/queue/index.d.ts +0 -6
  150. package/dist/queue/index.d.ts.map +0 -1
  151. package/dist/queue/index.interface.d.ts +0 -10
  152. package/dist/queue/index.interface.d.ts.map +0 -1
  153. package/dist/queue/job.interface.d.ts +0 -42
  154. package/dist/queue/job.interface.d.ts.map +0 -1
  155. package/dist/queue/manager.d.ts +0 -36
  156. package/dist/queue/manager.d.ts.map +0 -1
  157. package/dist/queue/manager.interface.d.ts +0 -18
  158. package/dist/queue/manager.interface.d.ts.map +0 -1
  159. package/dist/queue/processor/base.d.ts +0 -28
  160. package/dist/queue/processor/base.d.ts.map +0 -1
  161. package/dist/queue/processor/processor.interface.d.ts +0 -15
  162. package/dist/queue/processor/processor.interface.d.ts.map +0 -1
  163. package/dist/queue/worker.d.ts +0 -14
  164. package/dist/queue/worker.d.ts.map +0 -1
  165. package/dist/queue/worker.interface.d.ts +0 -13
  166. package/dist/queue/worker.interface.d.ts.map +0 -1
  167. package/dist/redis/index.d.ts +0 -3
  168. package/dist/redis/index.d.ts.map +0 -1
  169. package/dist/redis/instance.d.ts +0 -32
  170. package/dist/redis/instance.d.ts.map +0 -1
  171. package/dist/redis/instance.interface.d.ts +0 -9
  172. package/dist/redis/instance.interface.d.ts.map +0 -1
  173. package/dist/redis/manager.d.ts +0 -15
  174. package/dist/redis/manager.d.ts.map +0 -1
  175. package/dist/redis/manager.interface.d.ts +0 -8
  176. package/dist/redis/manager.interface.d.ts.map +0 -1
  177. package/dist/request-context/index.d.ts +0 -3
  178. package/dist/request-context/index.d.ts.map +0 -1
  179. package/dist/request-context/request-context.d.ts +0 -108
  180. package/dist/request-context/request-context.d.ts.map +0 -1
  181. package/dist/request-context/request-context.interface.d.ts +0 -46
  182. package/dist/request-context/request-context.interface.d.ts.map +0 -1
  183. package/dist/services/aws/index.d.ts +0 -2
  184. package/dist/services/aws/index.d.ts.map +0 -1
  185. package/dist/services/aws/s3.d.ts +0 -54
  186. package/dist/services/aws/s3.d.ts.map +0 -1
  187. package/dist/services/aws/s3.interface.d.ts +0 -14
  188. package/dist/services/aws/s3.interface.d.ts.map +0 -1
  189. package/dist/services/index.d.ts +0 -2
  190. package/dist/services/index.d.ts.map +0 -1
  191. package/dist/util/file.d.ts +0 -58
  192. package/dist/util/file.d.ts.map +0 -1
  193. package/dist/util/helper.d.ts +0 -52
  194. package/dist/util/helper.d.ts.map +0 -1
  195. package/dist/util/image.d.ts +0 -12
  196. package/dist/util/image.d.ts.map +0 -1
  197. package/dist/util/index.d.ts +0 -11
  198. package/dist/util/index.d.ts.map +0 -1
  199. package/dist/util/loader.d.ts +0 -19
  200. package/dist/util/loader.d.ts.map +0 -1
  201. package/dist/util/num.d.ts +0 -13
  202. package/dist/util/num.d.ts.map +0 -1
  203. package/dist/util/os.d.ts +0 -6
  204. package/dist/util/os.d.ts.map +0 -1
  205. package/dist/util/str.d.ts +0 -39
  206. package/dist/util/str.d.ts.map +0 -1
  207. package/dist/util/time.d.ts +0 -19
  208. package/dist/util/time.d.ts.map +0 -1
  209. package/dist/util/time.interface.d.ts +0 -12
  210. package/dist/util/time.interface.d.ts.map +0 -1
  211. package/dist/util/timing.d.ts +0 -36
  212. package/dist/util/timing.d.ts.map +0 -1
  213. package/dist/util/timing.interface.d.ts +0 -47
  214. package/dist/util/timing.interface.d.ts.map +0 -1
  215. package/dist/util/url.d.ts +0 -7
  216. package/dist/util/url.d.ts.map +0 -1
  217. package/dist/webserver/controller/auth-middleware.d.ts +0 -21
  218. package/dist/webserver/controller/auth-middleware.d.ts.map +0 -1
  219. package/dist/webserver/controller/base.d.ts +0 -41
  220. package/dist/webserver/controller/base.d.ts.map +0 -1
  221. package/dist/webserver/controller/base.interface.d.ts +0 -47
  222. package/dist/webserver/controller/base.interface.d.ts.map +0 -1
  223. package/dist/webserver/controller/entity.d.ts +0 -94
  224. package/dist/webserver/controller/entity.d.ts.map +0 -1
  225. package/dist/webserver/controller/example-auth.d.ts +0 -12
  226. package/dist/webserver/controller/example-auth.d.ts.map +0 -1
  227. package/dist/webserver/controller/health.d.ts +0 -15
  228. package/dist/webserver/controller/health.d.ts.map +0 -1
  229. package/dist/webserver/index.d.ts +0 -12
  230. package/dist/webserver/index.d.ts.map +0 -1
  231. package/dist/webserver/util.d.ts +0 -10
  232. package/dist/webserver/util.d.ts.map +0 -1
  233. package/dist/webserver/webserver.d.ts +0 -79
  234. package/dist/webserver/webserver.d.ts.map +0 -1
  235. package/dist/webserver/webserver.interface.d.ts +0 -155
  236. package/dist/webserver/webserver.interface.d.ts.map +0 -1
  237. package/dist/websocket/controller/client/base.d.ts +0 -12
  238. package/dist/websocket/controller/client/base.d.ts.map +0 -1
  239. package/dist/websocket/controller/client/base.interface.d.ts +0 -12
  240. package/dist/websocket/controller/client/base.interface.d.ts.map +0 -1
  241. package/dist/websocket/controller/server/base.d.ts +0 -13
  242. package/dist/websocket/controller/server/base.d.ts.map +0 -1
  243. package/dist/websocket/controller/server/base.interface.d.ts +0 -13
  244. package/dist/websocket/controller/server/base.interface.d.ts.map +0 -1
  245. package/dist/websocket/controllers/client/system.d.ts +0 -6
  246. package/dist/websocket/controllers/client/system.d.ts.map +0 -1
  247. package/dist/websocket/controllers/server/system.d.ts +0 -7
  248. package/dist/websocket/controllers/server/system.d.ts.map +0 -1
  249. package/dist/websocket/index.d.ts +0 -7
  250. package/dist/websocket/index.d.ts.map +0 -1
  251. package/dist/websocket/routes/client/system.d.ts +0 -3
  252. package/dist/websocket/routes/client/system.d.ts.map +0 -1
  253. package/dist/websocket/routes/server/system.d.ts +0 -3
  254. package/dist/websocket/routes/server/system.d.ts.map +0 -1
  255. package/dist/websocket/utils.d.ts +0 -9
  256. package/dist/websocket/utils.d.ts.map +0 -1
  257. package/dist/websocket/websocket-base.d.ts +0 -15
  258. package/dist/websocket/websocket-base.d.ts.map +0 -1
  259. package/dist/websocket/websocket-client-manager.d.ts +0 -53
  260. package/dist/websocket/websocket-client-manager.d.ts.map +0 -1
  261. package/dist/websocket/websocket-client-manager.interface.d.ts +0 -8
  262. package/dist/websocket/websocket-client-manager.interface.d.ts.map +0 -1
  263. package/dist/websocket/websocket-client.d.ts +0 -35
  264. package/dist/websocket/websocket-client.d.ts.map +0 -1
  265. package/dist/websocket/websocket-client.interface.d.ts +0 -14
  266. package/dist/websocket/websocket-client.interface.d.ts.map +0 -1
  267. package/dist/websocket/websocket-room-manager.d.ts +0 -32
  268. package/dist/websocket/websocket-room-manager.d.ts.map +0 -1
  269. package/dist/websocket/websocket-server.d.ts +0 -92
  270. package/dist/websocket/websocket-server.d.ts.map +0 -1
  271. package/dist/websocket/websocket-server.interface.d.ts +0 -16
  272. package/dist/websocket/websocket-server.interface.d.ts.map +0 -1
  273. package/dist/websocket/websocket-service.d.ts +0 -44
  274. package/dist/websocket/websocket-service.d.ts.map +0 -1
  275. package/dist/websocket/websocket.interface.d.ts +0 -119
  276. package/dist/websocket/websocket.interface.d.ts.map +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/application/base-application.ts"],
4
- "sourcesContent": ["import cluster from 'cluster';\nimport { existsSync, readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join, resolve } from 'path';\nimport { type DatabaseInstance, DatabaseManager } from '../database/index.js';\nimport QueueManager from '../queue/manager.js';\nimport RedisManager from '../redis/manager.js';\nimport type {\n ApplicationConfig,\n ApplicationStartInstanceOptions,\n ApplicationStopInstanceOptions,\n} from './base-application.interface.js';\nimport ClusterManager from '../cluster/cluster-manager.js';\nimport type RedisInstance from '../redis/instance.js';\nimport { OS, Time } from '../util/index.js';\nimport CacheManager from '../cache/manager.js';\nimport os from 'os';\nimport EventManager from '../event/manager.js';\nimport Logger from '../logger/logger.js';\nimport type { PerformanceMonitor } from '../performance/performance-monitor.js';\n// Performance monitoring now pluginized\nimport { PerformanceMonitorPlugin } from '../performance/performance-monitor.plugin.js';\nimport { type LifecycleConfig, LifecycleManager, ShutdownController } from '../lifecycle/index.js';\nimport { ConfigValidationError, formatConfigIssues, validateFrameworkConfig } from '../config/schema.js';\nimport { type ExitOutcome, requestExit } from '../lifecycle/exit.js';\n\n// Re-export types for external use\nexport type { ApplicationConfig } from './base-application.interface.js';\n\nexport default abstract class BaseApplication {\n /** Unique instance ID */\n public uniqueInstanceId: string;\n\n /** Application start time */\n protected startTime: number = 0;\n\n /** Shutdown timeout (30 seconds) */\n protected shutdownTimeout = 30000;\n\n /** Cache for application version to avoid repeated imports */\n private static applicationVersionCache: string | undefined;\n\n /** Cluster worker ID */\n protected workerId = cluster.isWorker && cluster.worker ? cluster.worker.id : null;\n\n /** Application config */\n protected config: ApplicationConfig;\n\n /** Application version */\n protected applicationVersion?: string;\n\n /** Redis manager */\n public redisManager: RedisManager;\n\n /** Cache manager */\n public cacheManager: CacheManager;\n\n /** Database manager */\n public databaseManager?: DatabaseManager;\n\n /** Queue manager */\n public queueManager?: QueueManager;\n\n /** Event manager */\n public eventManager?: EventManager;\n\n /** Performance monitor */\n public performanceMonitor?: PerformanceMonitor;\n\n /** Lifecycle manager */\n public lifecycle: LifecycleManager;\n\n /** Shutdown controller */\n public shutdownController: ShutdownController;\n\n public get Name() {\n return this.config.name;\n }\n\n /**\n * Application constructor\n */\n constructor(config: ApplicationConfig) {\n // Validate configuration early (fail-fast before side effects)\n try {\n const validated = validateFrameworkConfig(config as any);\n config = validated as unknown as ApplicationConfig;\n } catch (err) {\n if (err instanceof ConfigValidationError) {\n const formatted = formatConfigIssues(err.issues);\n throw new Error(`Configuration validation failed:\\n${formatted}`);\n }\n throw err;\n }\n const computerName = os.hostname();\n\n this.uniqueInstanceId = `${config.instanceId}-${computerName}-${OS.getUniqueComputerId()}`;\n this.config = config;\n\n // Initialize lifecycle management\n const lifecycleConfig: Partial<LifecycleConfig> = {\n gracefulShutdown: {\n timeoutMs: this.shutdownTimeout,\n },\n readiness: {\n timeoutMs: 30000,\n checkIntervalMs: 100,\n },\n };\n this.lifecycle = new LifecycleManager(lifecycleConfig);\n this.shutdownController = new ShutdownController(this.lifecycle);\n\n // Register shutdown hooks for cleanup\n this.registerShutdownHooks();\n\n // Initialize Redis manager\n this.redisManager = new RedisManager({\n applicationConfig: this.config,\n host: this.config.redis.host,\n port: this.config.redis.port,\n password: this.config.redis.password,\n });\n\n // Initialize cache manager\n this.cacheManager = new CacheManager({\n redisManager: this.redisManager,\n });\n\n // Register performance monitor plugin (idempotent & opt-in)\n PerformanceMonitorPlugin.register(this);\n\n // Set up global error handlers\n this.setupGlobalErrorHandlers();\n\n if (this.config.database && this.config.database.enabled === true) {\n const defaultEntitiesDirectory = join(this.config.rootDirectory, 'src', 'database', 'entities');\n\n if (!this.config.database.entitiesDirectory) {\n this.config.database.entitiesDirectory = defaultEntitiesDirectory;\n }\n\n if (!existsSync(this.config.database.entitiesDirectory)) {\n throw new Error(`Database entities directory not found (Path: ${this.config.database.entitiesDirectory})`);\n }\n\n // Initialize Database manager\n this.databaseManager = new DatabaseManager({\n applicationConfig: this.config,\n host: this.config.database.host,\n port: this.config.database.port,\n username: this.config.database.username,\n password: this.config.database.password,\n databaseName: this.config.database.databaseName,\n entitiesDirectory: this.config.database.entitiesDirectory,\n });\n }\n }\n\n /**\n * Get application version\n */\n public async getApplicationVersion(): Promise<string> {\n // Return cached version if available\n if (BaseApplication.applicationVersionCache !== undefined) {\n return BaseApplication.applicationVersionCache;\n }\n\n // Resolve the path to package.json\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const packageJsonPath = resolve(__dirname, '../../package.json');\n\n // Read and parse the file\n const fileContents = readFileSync(packageJsonPath, 'utf-8');\n const packageJson = JSON.parse(fileContents);\n\n if (!packageJson?.version) {\n throw new Error('Application version not found');\n }\n\n // Cache and return the version\n BaseApplication.applicationVersionCache = packageJson.version;\n\n return packageJson.version;\n }\n\n /**\n * Start application\n */\n public async start(): Promise<void> {\n // Start application timer\n this.startTime = Time.now();\n\n // Get application version`\n this.applicationVersion = await this.getApplicationVersion();\n\n const startInstanceOptions: ApplicationStartInstanceOptions = {\n onStarted: this.onStarted.bind(this),\n };\n\n const stopInstanceOptions: ApplicationStopInstanceOptions = {\n onStopped: this.onStopped.bind(this),\n };\n\n if (this.config.cluster?.enabled) {\n // Initialize clustered application\n const clusterManager = new ClusterManager({\n config: this.config.cluster,\n\n startApplicationCallback: () => this.startInstance(startInstanceOptions),\n stopApplicationCallback: () => this.stop(stopInstanceOptions),\n });\n\n // Start cluster\n clusterManager.start();\n } else {\n // Start standalone application\n await this.startInstance(startInstanceOptions);\n\n // Note: Signal handling should be implemented at the application launcher level\n // The lifecycle manager provides the stop() method for programmatic shutdown\n }\n }\n\n /**\n * Before application start\n */\n private async onBeforeStart(): Promise<{\n redisInstance: RedisInstance;\n databaseInstance: DatabaseInstance | null;\n queueManager: QueueManager;\n eventManager?: EventManager;\n }> {\n // Connect to Redis\n const redisInstance = await this.redisManager.connect();\n\n // Connect to database\n const databaseInstance = this.databaseManager ? await this.databaseManager.connect() : null;\n\n let eventManager: EventManager | undefined;\n\n if (this.config.event?.enabled) {\n eventManager = new EventManager({\n applicationConfig: this.config,\n options: this.config.event,\n events: this.config.event.events || [],\n redisInstance,\n databaseInstance,\n // queueManager,\n });\n\n eventManager.load();\n }\n\n // Initialize queue\n const queueManager = new QueueManager({\n applicationConfig: this.config,\n options: {\n processorsDirectory: this.config.queue.processorsDirectory,\n },\n queues: this.config.queue.queues,\n redisInstance,\n databaseInstance,\n eventManager,\n });\n\n // Register queues\n await queueManager.registerQueues({\n queues: this.config.queue.queues,\n });\n\n // Register readiness checks for key services\n this.lifecycle.addReadinessCheck('redis', async () => {\n try {\n return await redisInstance.isConnected();\n } catch {\n return false;\n }\n });\n\n if (databaseInstance) {\n this.lifecycle.addReadinessCheck('database', async () => {\n try {\n return await databaseInstance.isConnected();\n } catch {\n return false;\n }\n });\n }\n\n return {\n redisInstance,\n databaseInstance,\n queueManager,\n eventManager,\n };\n }\n\n /**\n * Application started event\n */\n protected onStarted({ startupTime: _startupTime }: { startupTime: number }): void {}\n\n /**\n * Application stopped event\n */\n protected onStopped({ runtime: _runtime }: { runtime: number }): void {}\n\n /**\n * Start application instance\n */\n private async startInstance(options: ApplicationStartInstanceOptions): Promise<void> {\n try {\n // Phase 1: Initialize (resource setup)\n const initResult = await this.lifecycle.initialize();\n if (initResult.errors.length > 0) {\n Logger.warn({\n message: 'Lifecycle init phase encountered errors',\n meta: { errors: initResult.errors.map(e => (e instanceof Error ? e.message : String(e))) },\n });\n }\n\n // Before application start\n const { redisInstance, databaseInstance, queueManager, eventManager } = await this.onBeforeStart();\n\n // Phase 2: Start (component startup)\n const startResult = await this.lifecycle.start();\n if (startResult.errors.length > 0) {\n Logger.warn({\n message: 'Lifecycle start phase encountered errors',\n meta: { errors: startResult.errors.map(e => (e instanceof Error ? e.message : String(e))) },\n });\n }\n\n // Start application\n await this.startHandler({\n redisInstance,\n databaseInstance,\n queueManager,\n eventManager,\n });\n\n // Phase 3: Ready (application accepting traffic)\n const readyResult = await this.lifecycle.ready();\n if (readyResult.errors.length > 0) {\n Logger.warn({\n message: 'Lifecycle ready phase encountered errors',\n meta: { errors: readyResult.errors.map(e => (e instanceof Error ? e.message : String(e))) },\n });\n }\n\n // Calculate application startup time\n const startupTime = Time.calculateElapsedTimeMs({\n startTime: this.startTime,\n });\n\n // On application started\n if (options.onStarted) {\n await options.onStarted({ startupTime });\n }\n } catch (error) {\n Logger.error({\n error: error instanceof Error ? error : new Error(String(error)),\n message: 'startInstance failure',\n });\n throw error;\n }\n }\n\n protected abstract startHandler({\n redisInstance,\n databaseInstance,\n queueManager,\n eventManager,\n }: {\n redisInstance: RedisInstance;\n databaseInstance?: DatabaseInstance | null;\n queueManager: QueueManager;\n eventManager?: EventManager | null;\n }): Promise<void>;\n\n protected abstract stopCallback(): void;\n\n /**\n * Set up global error handlers\n */\n /**\n * Initialize performance monitor\n */\n // initializePerformanceMonitor deprecated in favor of PerformanceMonitorPlugin\n // (left intentionally absent)\n\n private setupGlobalErrorHandlers(): void {\n // Handle uncaught exceptions\n process.on('uncaughtException', error => {\n Logger.error({ error, message: 'Uncaught Exception' });\n this.initiateGracefulShutdown();\n });\n\n // Handle unhandled promise rejections\n process.on('unhandledRejection', (reason, promise) => {\n Logger.error({\n error: reason instanceof Error ? reason : new Error(String(reason)),\n message: 'Unhandled Rejection',\n meta: { promise },\n });\n this.initiateGracefulShutdown();\n });\n }\n\n /**\n * Register shutdown hooks for proper cleanup\n */\n private registerShutdownHooks(): void {\n // Register shutdown hooks in reverse dependency order\n this.lifecycle.onShutdown(async () => {\n Logger.info({ message: 'Executing custom stop callback' });\n await this.stopCallback();\n });\n\n this.lifecycle.onShutdown(async () => {\n if (this.redisManager) {\n Logger.info({ message: 'Disconnecting from Redis' });\n await this.redisManager.disconnect();\n }\n });\n\n this.lifecycle.onShutdown(async () => {\n if (this.databaseManager) {\n Logger.info({ message: 'Disconnecting from database' });\n await this.databaseManager.disconnect();\n }\n });\n\n // Performance monitor is handled via trackInterval, so it will be cleaned up automatically\n }\n\n /**\n * Initiate graceful shutdown\n */\n private async initiateGracefulShutdown(): Promise<void> {\n if (this.shutdownController.isShuttingDown) {\n return;\n }\n\n Logger.info({ message: 'Initiating graceful shutdown due to error' });\n try {\n const result = await this.shutdownController.initiate('error-triggered');\n if (result.errors.length > 0) {\n Logger.error({\n message: 'Errors during shutdown',\n error: result.errors,\n });\n this.finalizeExit({ code: 1, reason: 'graceful-shutdown-error', error: result.errors });\n } else if (result.timedOut) {\n Logger.warn({ message: 'Shutdown timed out' });\n this.finalizeExit({ code: 1, reason: 'shutdown-timeout' });\n } else {\n this.finalizeExit({ code: 0, reason: 'error-shutdown-complete' });\n }\n } catch (error) {\n Logger.error({\n error: error instanceof Error ? error : new Error(String(error)),\n message: 'Error during graceful shutdown',\n });\n this.finalizeExit({ code: 1, reason: 'graceful-shutdown-error', error });\n }\n }\n\n /**\n * Stop application using lifecycle manager\n */\n public async stop({ onStopped }: ApplicationStopInstanceOptions = {}): Promise<void> {\n if (this.shutdownController.isShuttingDown) {\n return;\n }\n\n // Register the onStopped callback if provided\n if (onStopped) {\n this.lifecycle.onShutdown(() => {\n const runtime = process.uptime() * 1000;\n onStopped({ runtime });\n });\n }\n\n try {\n const result = await this.shutdownController.initiate('manual-stop');\n if (result.errors.length > 0) {\n Logger.error({\n message: 'Errors during shutdown',\n error: result.errors,\n });\n this.finalizeExit({ code: 1, reason: 'shutdown-error', error: result.errors });\n } else if (result.timedOut) {\n Logger.warn({ message: 'Shutdown timed out' });\n this.finalizeExit({ code: 1, reason: 'shutdown-timeout' });\n } else {\n this.finalizeExit({ code: 0, reason: 'shutdown-complete' });\n }\n } catch (error) {\n Logger.error({\n error: error instanceof Error ? error : new Error(String(error)),\n message: 'Error during shutdown',\n });\n this.finalizeExit({ code: 1, reason: 'shutdown-error', error });\n }\n }\n\n /**\n * Finalize exit: during tests, suppress actual process exit to avoid failing vitest runs.\n */\n private finalizeExit(outcome: ExitOutcome): void {\n const nodeEnv = process.env.NODE_ENV ?? '';\n const isTestEnv =\n nodeEnv.toLowerCase() === 'test' ||\n 'VITEST' in process.env ||\n 'VITEST_WORKER_ID' in process.env ||\n process.argv.some(a => a.includes('vitest')) ||\n typeof (globalThis as any).afterAll === 'function';\n\n if (isTestEnv) {\n Logger.info({ message: `Skipping process exit in test environment (${outcome.reason})`, code: outcome.code });\n return;\n }\n requestExit(outcome);\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import cluster from 'cluster';\nimport { existsSync, readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join, resolve } from 'path';\nimport { type DatabaseInstance, DatabaseManager } from '../database/index.js';\nimport QueueManager from '../queue/manager.js';\nimport RedisManager from '../redis/manager.js';\nimport type {\n ApplicationConfig,\n ApplicationStartInstanceOptions,\n ApplicationStopInstanceOptions,\n} from './base-application.interface.js';\nimport ClusterManager from '../cluster/cluster-manager.js';\nimport type RedisInstance from '../redis/instance.js';\nimport { OS, Time } from '../util/index.js';\nimport CacheManager from '../cache/manager.js';\nimport os from 'os';\nimport EventManager from '../event/manager.js';\nimport Logger from '../logger/logger.js';\nimport type { PerformanceMonitor } from '../performance/performance-monitor.js';\n// Performance monitoring now pluginized\nimport { PerformanceMonitorPlugin } from '../performance/performance-monitor.plugin.js';\nimport { type LifecycleConfig, LifecycleManager, ShutdownController } from '../lifecycle/index.js';\nimport { ConfigValidationError, formatConfigIssues, validateFrameworkConfig } from '../config/schema.js';\nimport { type ExitOutcome, requestExit } from '../lifecycle/exit.js';\n\n// Re-export types for external use\nexport type { ApplicationConfig } from './base-application.interface.js';\n\nexport default abstract class BaseApplication {\n /** Unique instance ID */\n public uniqueInstanceId: string;\n\n /** Application start time */\n protected startTime: number = 0;\n\n /** Shutdown timeout (30 seconds) */\n protected shutdownTimeout = 30000;\n\n /** Cache for application version to avoid repeated imports */\n private static applicationVersionCache: string | undefined;\n\n /** Cluster worker ID */\n protected workerId = cluster.isWorker && cluster.worker ? cluster.worker.id : null;\n\n /** Application config */\n protected config: ApplicationConfig;\n\n /** Application version */\n protected applicationVersion?: string;\n\n /** Redis manager */\n public redisManager: RedisManager;\n\n /** Cache manager */\n public cacheManager: CacheManager;\n\n /** Database manager */\n public databaseManager?: DatabaseManager;\n\n /** Queue manager */\n public queueManager?: QueueManager;\n\n /** Event manager */\n public eventManager?: EventManager;\n\n /** Performance monitor */\n public performanceMonitor?: PerformanceMonitor;\n\n /** Lifecycle manager */\n public lifecycle: LifecycleManager;\n\n /** Shutdown controller */\n public shutdownController: ShutdownController;\n\n public get Name() {\n return this.config.name;\n }\n\n /**\n * Application constructor\n */\n constructor(config: ApplicationConfig) {\n // Validate configuration early (fail-fast before side effects)\n try {\n const validated = validateFrameworkConfig(config as any);\n config = validated as unknown as ApplicationConfig;\n } catch (err) {\n if (err instanceof ConfigValidationError) {\n const formatted = formatConfigIssues(err.issues);\n throw new Error(`Configuration validation failed:\\n${formatted}`);\n }\n throw err;\n }\n const computerName = os.hostname();\n\n this.uniqueInstanceId = `${config.instanceId}-${computerName}-${OS.getUniqueComputerId()}`;\n this.config = config;\n\n // Initialize lifecycle management\n const lifecycleConfig: Partial<LifecycleConfig> = {\n gracefulShutdown: {\n timeoutMs: this.shutdownTimeout,\n },\n readiness: {\n timeoutMs: 30000,\n checkIntervalMs: 100,\n },\n };\n this.lifecycle = new LifecycleManager(lifecycleConfig);\n this.shutdownController = new ShutdownController(this.lifecycle);\n\n // Register shutdown hooks for cleanup\n this.registerShutdownHooks();\n\n // Initialize Redis manager\n this.redisManager = new RedisManager({\n applicationConfig: this.config,\n host: this.config.redis.host,\n port: this.config.redis.port,\n password: this.config.redis.password,\n });\n\n // Initialize cache manager\n this.cacheManager = new CacheManager({\n redisManager: this.redisManager,\n });\n\n // Register performance monitor plugin (idempotent & opt-in)\n PerformanceMonitorPlugin.register(this);\n\n // Set up global error handlers\n this.setupGlobalErrorHandlers();\n\n if (this.config.database && this.config.database.enabled === true) {\n const defaultEntitiesDirectory = join(this.config.rootDirectory, 'src', 'database', 'entities');\n\n if (!this.config.database.entitiesDirectory) {\n this.config.database.entitiesDirectory = defaultEntitiesDirectory;\n }\n\n if (!existsSync(this.config.database.entitiesDirectory)) {\n throw new Error(`Database entities directory not found (Path: ${this.config.database.entitiesDirectory})`);\n }\n\n // Initialize Database manager\n this.databaseManager = new DatabaseManager({\n applicationConfig: this.config,\n host: this.config.database.host,\n port: this.config.database.port,\n username: this.config.database.username,\n password: this.config.database.password,\n databaseName: this.config.database.databaseName,\n entitiesDirectory: this.config.database.entitiesDirectory,\n });\n }\n }\n\n /**\n * Get application version\n */\n public async getApplicationVersion(): Promise<string> {\n // Return cached version if available\n if (BaseApplication.applicationVersionCache !== undefined) {\n return BaseApplication.applicationVersionCache;\n }\n\n // Resolve the path to package.json\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const packageJsonPath = resolve(__dirname, '../../package.json');\n\n // Read and parse the file\n const fileContents = readFileSync(packageJsonPath, 'utf-8');\n const packageJson = JSON.parse(fileContents);\n\n if (!packageJson?.version) {\n throw new Error('Application version not found');\n }\n\n // Cache and return the version\n BaseApplication.applicationVersionCache = packageJson.version;\n\n return packageJson.version;\n }\n\n /**\n * Start application\n */\n public async start(): Promise<void> {\n // Start application timer\n this.startTime = Time.now();\n\n // Get application version`\n this.applicationVersion = await this.getApplicationVersion();\n\n const startInstanceOptions: ApplicationStartInstanceOptions = {\n onStarted: this.onStarted.bind(this),\n };\n\n const stopInstanceOptions: ApplicationStopInstanceOptions = {\n onStopped: this.onStopped.bind(this),\n };\n\n if (this.config.cluster?.enabled) {\n // Initialize clustered application\n const clusterManager = new ClusterManager({\n config: this.config.cluster,\n\n startApplicationCallback: () => this.startInstance(startInstanceOptions),\n stopApplicationCallback: () => this.stop(stopInstanceOptions),\n });\n\n // Start cluster\n clusterManager.start();\n } else {\n // Start standalone application\n await this.startInstance(startInstanceOptions);\n\n // Note: Signal handling should be implemented at the application launcher level\n // The lifecycle manager provides the stop() method for programmatic shutdown\n }\n }\n\n /**\n * Before application start\n */\n private async onBeforeStart(): Promise<{\n redisInstance: RedisInstance;\n databaseInstance: DatabaseInstance | null;\n queueManager: QueueManager;\n eventManager?: EventManager;\n }> {\n // Connect to Redis\n const redisInstance = await this.redisManager.connect();\n\n // Connect to database\n const databaseInstance = this.databaseManager ? await this.databaseManager.connect() : null;\n\n let eventManager: EventManager | undefined;\n\n if (this.config.event?.enabled) {\n eventManager = new EventManager({\n applicationConfig: this.config,\n options: this.config.event,\n events: this.config.event.events || [],\n redisInstance,\n databaseInstance,\n // queueManager,\n });\n\n eventManager.load();\n }\n\n // Initialize queue\n const queueManager = new QueueManager({\n applicationConfig: this.config,\n options: {\n processorsDirectory: this.config.queue.processorsDirectory,\n },\n queues: this.config.queue.queues,\n redisInstance,\n databaseInstance,\n eventManager,\n });\n\n // Register queues\n await queueManager.registerQueues({\n queues: this.config.queue.queues,\n });\n\n // Register readiness checks for key services\n this.lifecycle.addReadinessCheck('redis', async () => {\n try {\n return await redisInstance.isConnected();\n } catch {\n return false;\n }\n });\n\n if (databaseInstance) {\n this.lifecycle.addReadinessCheck('database', async () => {\n try {\n return await databaseInstance.isConnected();\n } catch {\n return false;\n }\n });\n }\n\n return {\n redisInstance,\n databaseInstance,\n queueManager,\n eventManager,\n };\n }\n\n /**\n * Application started event\n */\n protected onStarted({ startupTime: _startupTime }: { startupTime: number }): void {}\n\n /**\n * Application stopped event\n */\n protected onStopped({ runtime: _runtime }: { runtime: number }): void {}\n\n /**\n * Start application instance\n */\n private async startInstance(options: ApplicationStartInstanceOptions): Promise<void> {\n try {\n // Phase 1: Initialize (resource setup)\n const initResult = await this.lifecycle.initialize();\n if (initResult.errors.length > 0) {\n Logger.warn({\n message: 'Lifecycle init phase encountered errors',\n meta: { errors: initResult.errors.map(e => (e instanceof Error ? e.message : String(e))) },\n });\n }\n\n // Before application start\n const { redisInstance, databaseInstance, queueManager, eventManager } = await this.onBeforeStart();\n\n // Phase 2: Start (component startup)\n const startResult = await this.lifecycle.start();\n if (startResult.errors.length > 0) {\n Logger.warn({\n message: 'Lifecycle start phase encountered errors',\n meta: { errors: startResult.errors.map(e => (e instanceof Error ? e.message : String(e))) },\n });\n }\n\n // Start application\n await this.startHandler({\n redisInstance,\n databaseInstance,\n queueManager,\n eventManager,\n });\n\n // Phase 3: Ready (application accepting traffic)\n const readyResult = await this.lifecycle.ready();\n if (readyResult.errors.length > 0) {\n Logger.warn({\n message: 'Lifecycle ready phase encountered errors',\n meta: { errors: readyResult.errors.map(e => (e instanceof Error ? e.message : String(e))) },\n });\n }\n\n // Calculate application startup time\n const startupTime = Time.calculateElapsedTimeMs({\n startTime: this.startTime,\n });\n\n // On application started\n if (options.onStarted) {\n await options.onStarted({ startupTime });\n }\n } catch (error) {\n Logger.error({\n error: error instanceof Error ? error : new Error(String(error)),\n message: 'startInstance failure',\n });\n throw error;\n }\n }\n\n protected abstract startHandler({\n redisInstance,\n databaseInstance,\n queueManager,\n eventManager,\n }: {\n redisInstance: RedisInstance;\n databaseInstance?: DatabaseInstance | null;\n queueManager: QueueManager;\n eventManager?: EventManager | null;\n }): Promise<void>;\n\n protected abstract stopCallback(): void;\n\n /**\n * Set up global error handlers\n */\n /**\n * Initialize performance monitor\n */\n // initializePerformanceMonitor deprecated in favor of PerformanceMonitorPlugin\n // (left intentionally absent)\n\n private setupGlobalErrorHandlers(): void {\n // Handle uncaught exceptions\n process.on('uncaughtException', error => {\n Logger.error({ error, message: 'Uncaught Exception' });\n this.initiateGracefulShutdown();\n });\n\n // Handle unhandled promise rejections\n process.on('unhandledRejection', (reason, promise) => {\n Logger.error({\n error: reason instanceof Error ? reason : new Error(String(reason)),\n message: 'Unhandled Rejection',\n meta: { promise: String(promise) },\n });\n this.initiateGracefulShutdown();\n });\n }\n\n /**\n * Register shutdown hooks for proper cleanup\n */\n private registerShutdownHooks(): void {\n // Register shutdown hooks in reverse dependency order\n this.lifecycle.onShutdown(async () => {\n Logger.info({ message: 'Executing custom stop callback' });\n await this.stopCallback();\n });\n\n this.lifecycle.onShutdown(async () => {\n if (this.redisManager) {\n Logger.info({ message: 'Disconnecting from Redis' });\n await this.redisManager.disconnect();\n }\n });\n\n this.lifecycle.onShutdown(async () => {\n if (this.databaseManager) {\n Logger.info({ message: 'Disconnecting from database' });\n await this.databaseManager.disconnect();\n }\n });\n\n // Performance monitor is handled via trackInterval, so it will be cleaned up automatically\n }\n\n /**\n * Initiate graceful shutdown\n */\n private async initiateGracefulShutdown(): Promise<void> {\n if (this.shutdownController.isShuttingDown) {\n return;\n }\n\n Logger.info({ message: 'Initiating graceful shutdown due to error' });\n try {\n const result = await this.shutdownController.initiate('error-triggered');\n if (result.errors.length > 0) {\n Logger.error({\n message: 'Errors during shutdown',\n error: result.errors,\n });\n this.finalizeExit({ code: 1, reason: 'graceful-shutdown-error', error: result.errors });\n } else if (result.timedOut) {\n Logger.warn({ message: 'Shutdown timed out' });\n this.finalizeExit({ code: 1, reason: 'shutdown-timeout' });\n } else {\n this.finalizeExit({ code: 0, reason: 'error-shutdown-complete' });\n }\n } catch (error) {\n Logger.error({\n error: error instanceof Error ? error : new Error(String(error)),\n message: 'Error during graceful shutdown',\n });\n this.finalizeExit({ code: 1, reason: 'graceful-shutdown-error', error });\n }\n }\n\n /**\n * Stop application using lifecycle manager\n */\n public async stop({ onStopped }: ApplicationStopInstanceOptions = {}): Promise<void> {\n if (this.shutdownController.isShuttingDown) {\n return;\n }\n\n // Register the onStopped callback if provided\n if (onStopped) {\n this.lifecycle.onShutdown(() => {\n const runtime = process.uptime() * 1000;\n onStopped({ runtime });\n });\n }\n\n try {\n const result = await this.shutdownController.initiate('manual-stop');\n if (result.errors.length > 0) {\n Logger.error({\n message: 'Errors during shutdown',\n error: result.errors,\n });\n this.finalizeExit({ code: 1, reason: 'shutdown-error', error: result.errors });\n } else if (result.timedOut) {\n Logger.warn({ message: 'Shutdown timed out' });\n this.finalizeExit({ code: 1, reason: 'shutdown-timeout' });\n } else {\n this.finalizeExit({ code: 0, reason: 'shutdown-complete' });\n }\n } catch (error) {\n Logger.error({\n error: error instanceof Error ? error : new Error(String(error)),\n message: 'Error during shutdown',\n });\n this.finalizeExit({ code: 1, reason: 'shutdown-error', error });\n }\n }\n\n /**\n * Finalize exit: during tests, suppress actual process exit to avoid failing vitest runs.\n */\n private finalizeExit(outcome: ExitOutcome): void {\n const nodeEnv = process.env.NODE_ENV ?? '';\n const isTestEnv =\n nodeEnv.toLowerCase() === 'test' ||\n 'VITEST' in process.env ||\n 'VITEST_WORKER_ID' in process.env ||\n process.argv.some(a => a.includes('vitest')) ||\n typeof (globalThis as any).afterAll === 'function';\n\n if (isTestEnv) {\n Logger.info({ message: `Skipping process exit in test environment (${outcome.reason})`, code: outcome.code });\n return;\n }\n requestExit(outcome);\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/application/command-application.ts"],
4
- "sourcesContent": ["import type DatabaseInstance from '../database/instance.js';\nimport { Logger } from '../logger/index.js';\nimport type QueueManager from '../queue/manager.js';\nimport type RedisInstance from '../redis/instance.js';\nimport BaseApplication from './base-application.js';\nimport type { CommandApplicationConfig } from './command-application.interface.js';\nimport { File, Helper, Loader, Time } from '../util/index.js';\n\nexport default class CommandApplication extends BaseApplication {\n /** Command application config */\n protected config: CommandApplicationConfig;\n\n constructor(config: CommandApplicationConfig) {\n super(config);\n\n const defaultConfig: Partial<CommandApplicationConfig> = {\n cluster: {\n enabled: false,\n },\n\n log: {\n startUp: false,\n },\n\n debug: {\n measureExecutionTime: false,\n },\n };\n\n const mergedConfig: CommandApplicationConfig = Helper.defaultsDeep(config, defaultConfig);\n\n if (mergedConfig.cluster) {\n mergedConfig.cluster.enabled = false;\n }\n\n this.config = mergedConfig;\n }\n\n protected async startHandler({\n redisInstance,\n databaseInstance,\n queueManager,\n }: {\n redisInstance: RedisInstance;\n databaseInstance: DatabaseInstance;\n queueManager: QueueManager;\n }): Promise<void> {\n const startTime = performance.now();\n\n // get argv (yargs) input args\n const argv = this.config.commandManager.argv;\n\n const parsedArgv = argv.parseSync();\n\n if (parsedArgv._.length === 0) {\n Logger.warn({ message: 'No command provided' });\n\n this.stopCommand();\n\n return;\n }\n\n const inputCommandName = parsedArgv._[0];\n\n const commandsDirectoryExists = await File.pathExists(this.config.commandsDirectory);\n\n if (!commandsDirectoryExists) {\n Logger.warn({\n message: 'Commands directory not found',\n meta: {\n Directory: this.config.commandsDirectory,\n },\n });\n\n return;\n }\n\n // Load commands\n const commands = await Loader.loadModulesInDirectory({\n directory: this.config.commandsDirectory,\n extensions: ['.ts', '.js'],\n });\n\n // Find command by name - use safe property access to prevent object injection\n let CommandClass = null;\n if (Object.prototype.hasOwnProperty.call(commands, inputCommandName)) {\n CommandClass = Reflect.get(commands, inputCommandName);\n }\n\n if (!CommandClass) {\n Logger.warn({\n message: 'Command not found',\n meta: { Command: inputCommandName },\n });\n\n return;\n }\n\n // Initialize command\n const command = new CommandClass({\n applicationConfig: this.config,\n redisInstance,\n queueManager,\n databaseInstance,\n });\n\n Logger.info({\n message: 'Command started',\n meta: { Command: inputCommandName },\n });\n\n // Run command\n await command.run(parsedArgv);\n\n const commandCompletedLogParams: Record<string, unknown> = {\n Command: inputCommandName,\n };\n\n if (this.config.debug?.measureExecutionTime) {\n const endTime = performance.now();\n const executionTime = endTime - startTime;\n\n commandCompletedLogParams['Execution Time'] = Time.formatTime({\n time: executionTime,\n numDecimals: 2,\n showUnit: true,\n });\n }\n\n Logger.info({\n message: 'Command completed',\n meta: commandCompletedLogParams,\n });\n\n // Call shutdown signtal to stop the command\n this.stopCommand();\n }\n\n private stopCommand(): void {\n // Use modern lifecycle management for graceful shutdown\n void this.stop({ onStopped: this.onStopped.bind(this) });\n }\n\n protected stopCallback(): void {\n Logger.info({ message: 'Command stopped' });\n }\n}\n"],
5
- "mappings": ";;AACA,SAAS,cAAc;AAGvB,OAAO,qBAAqB;AAE5B,SAAS,MAAM,QAAQ,QAAQ,YAAY;AAE3C,MAAO,2BAAyC,gBAAgB;AAAA,EARhE,OAQgE;AAAA;AAAA;AAAA;AAAA,EAEpD;AAAA,EAEV,YAAY,QAAkC;AAC5C,UAAM,MAAM;AAEZ,UAAM,gBAAmD;AAAA,MACvD,SAAS;AAAA,QACP,SAAS;AAAA,MACX;AAAA,MAEA,KAAK;AAAA,QACH,SAAS;AAAA,MACX;AAAA,MAEA,OAAO;AAAA,QACL,sBAAsB;AAAA,MACxB;AAAA,IACF;AAEA,UAAM,eAAyC,OAAO,aAAa,QAAQ,aAAa;AAExF,QAAI,aAAa,SAAS;AACxB,mBAAa,QAAQ,UAAU;AAAA,IACjC;AAEA,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAgB,aAAa;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIkB;AAChB,UAAM,YAAY,YAAY,IAAI;AAGlC,UAAM,OAAO,KAAK,OAAO,eAAe;AAExC,UAAM,aAAa,KAAK,UAAU;AAElC,QAAI,WAAW,EAAE,WAAW,GAAG;AAC7B,aAAO,KAAK,EAAE,SAAS,sBAAsB,CAAC;AAE9C,WAAK,YAAY;AAEjB;AAAA,IACF;AAEA,UAAM,mBAAmB,WAAW,EAAE,CAAC;AAEvC,UAAM,0BAA0B,MAAM,KAAK,WAAW,KAAK,OAAO,iBAAiB;AAEnF,QAAI,CAAC,yBAAyB;AAC5B,aAAO,KAAK;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,UACJ,WAAW,KAAK,OAAO;AAAA,QACzB;AAAA,MACF,CAAC;AAED;AAAA,IACF;AAGA,UAAM,WAAW,MAAM,OAAO,uBAAuB;AAAA,MACnD,WAAW,KAAK,OAAO;AAAA,MACvB,YAAY,CAAC,OAAO,KAAK;AAAA,IAC3B,CAAC;AAGD,QAAI,eAAe;AACnB,QAAI,OAAO,UAAU,eAAe,KAAK,UAAU,gBAAgB,GAAG;AACpE,qBAAe,QAAQ,IAAI,UAAU,gBAAgB;AAAA,IACvD;AAEA,QAAI,CAAC,cAAc;AACjB,aAAO,KAAK;AAAA,QACV,SAAS;AAAA,QACT,MAAM,EAAE,SAAS,iBAAiB;AAAA,MACpC,CAAC;AAED;AAAA,IACF;AAGA,UAAM,UAAU,IAAI,aAAa;AAAA,MAC/B,mBAAmB,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO,KAAK;AAAA,MACV,SAAS;AAAA,MACT,MAAM,EAAE,SAAS,iBAAiB;AAAA,IACpC,CAAC;AAGD,UAAM,QAAQ,IAAI,UAAU;AAE5B,UAAM,4BAAqD;AAAA,MACzD,SAAS;AAAA,IACX;AAEA,QAAI,KAAK,OAAO,OAAO,sBAAsB;AAC3C,YAAM,UAAU,YAAY,IAAI;AAChC,YAAM,gBAAgB,UAAU;AAEhC,gCAA0B,gBAAgB,IAAI,KAAK,WAAW;AAAA,QAC5D,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,WAAO,KAAK;AAAA,MACV,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAGD,SAAK,YAAY;AAAA,EACnB;AAAA,EAEQ,cAAoB;AAE1B,SAAK,KAAK,KAAK,EAAE,WAAW,KAAK,UAAU,KAAK,IAAI,EAAE,CAAC;AAAA,EACzD;AAAA,EAEU,eAAqB;AAC7B,WAAO,KAAK,EAAE,SAAS,kBAAkB,CAAC;AAAA,EAC5C;AACF;",
4
+ "sourcesContent": ["import type DatabaseInstance from '../database/instance.js';\nimport { Logger } from '../logger/index.js';\nimport type QueueManager from '../queue/manager.js';\nimport type RedisInstance from '../redis/instance.js';\nimport BaseApplication from './base-application.js';\nimport type { CommandApplicationConfig } from './command-application.interface.js';\nimport { File, Helper, Loader, Time } from '../util/index.js';\nimport type Command from '../command/command.js';\nimport type { CommandConstructorParams } from '../command/command.interface.js';\n\nexport default class CommandApplication extends BaseApplication {\n /** Command application config */\n protected config: CommandApplicationConfig;\n\n constructor(config: CommandApplicationConfig) {\n super(config);\n\n const defaultConfig: Partial<CommandApplicationConfig> = {\n cluster: {\n enabled: false,\n },\n\n log: {\n startUp: false,\n },\n\n debug: {\n measureExecutionTime: false,\n },\n };\n\n const mergedConfig: CommandApplicationConfig = Helper.defaultsDeep(config, defaultConfig);\n\n if (mergedConfig.cluster) {\n mergedConfig.cluster.enabled = false;\n }\n\n this.config = mergedConfig;\n }\n\n protected async startHandler({\n redisInstance,\n databaseInstance,\n queueManager,\n }: {\n redisInstance: RedisInstance;\n databaseInstance: DatabaseInstance;\n queueManager: QueueManager;\n }): Promise<void> {\n const startTime = performance.now();\n\n // get argv (yargs) input args\n const argv = this.config.commandManager.argv;\n\n const parsedArgv = argv.parseSync();\n\n if (parsedArgv._.length === 0) {\n Logger.warn({ message: 'No command provided' });\n\n this.stopCommand();\n\n return;\n }\n\n const inputCommandName = parsedArgv._[0];\n\n const commandsDirectoryExists = await File.pathExists(this.config.commandsDirectory);\n\n if (!commandsDirectoryExists) {\n Logger.warn({\n message: 'Commands directory not found',\n meta: {\n Directory: this.config.commandsDirectory,\n },\n });\n\n return;\n }\n\n // Load commands\n const commands = await Loader.loadModulesInDirectory({\n directory: this.config.commandsDirectory,\n extensions: ['.ts', '.js'],\n });\n\n // Find command by name - use safe property access to prevent object injection\n let CommandClass: (new (params: CommandConstructorParams) => Command) | null = null;\n if (Object.prototype.hasOwnProperty.call(commands, inputCommandName)) {\n CommandClass = Reflect.get(commands, inputCommandName) as new (params: CommandConstructorParams) => Command;\n }\n\n if (!CommandClass) {\n Logger.warn({\n message: 'Command not found',\n meta: { Command: inputCommandName },\n });\n\n return;\n }\n\n // Initialize command\n const command = new CommandClass({\n applicationConfig: this.config,\n redisInstance,\n queueManager,\n databaseInstance,\n });\n\n Logger.info({\n message: 'Command started',\n meta: { Command: inputCommandName },\n });\n\n // Run command\n await command.run(parsedArgv);\n\n const commandCompletedLogParams: Record<string, unknown> = {\n Command: inputCommandName,\n };\n\n if (this.config.debug?.measureExecutionTime) {\n const endTime = performance.now();\n const executionTime = endTime - startTime;\n\n commandCompletedLogParams['Execution Time'] = Time.formatTime({\n time: executionTime,\n numDecimals: 2,\n showUnit: true,\n });\n }\n\n Logger.info({\n message: 'Command completed',\n meta: commandCompletedLogParams,\n });\n\n // Call shutdown signtal to stop the command\n this.stopCommand();\n }\n\n private stopCommand(): void {\n // Use modern lifecycle management for graceful shutdown\n void this.stop({ onStopped: this.onStopped.bind(this) });\n }\n\n protected stopCallback(): void {\n Logger.info({ message: 'Command stopped' });\n }\n}\n"],
5
+ "mappings": ";;AACA,SAAS,cAAc;AAGvB,OAAO,qBAAqB;AAE5B,SAAS,MAAM,QAAQ,QAAQ,YAAY;AAI3C,MAAO,2BAAyC,gBAAgB;AAAA,EAVhE,OAUgE;AAAA;AAAA;AAAA;AAAA,EAEpD;AAAA,EAEV,YAAY,QAAkC;AAC5C,UAAM,MAAM;AAEZ,UAAM,gBAAmD;AAAA,MACvD,SAAS;AAAA,QACP,SAAS;AAAA,MACX;AAAA,MAEA,KAAK;AAAA,QACH,SAAS;AAAA,MACX;AAAA,MAEA,OAAO;AAAA,QACL,sBAAsB;AAAA,MACxB;AAAA,IACF;AAEA,UAAM,eAAyC,OAAO,aAAa,QAAQ,aAAa;AAExF,QAAI,aAAa,SAAS;AACxB,mBAAa,QAAQ,UAAU;AAAA,IACjC;AAEA,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAgB,aAAa;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIkB;AAChB,UAAM,YAAY,YAAY,IAAI;AAGlC,UAAM,OAAO,KAAK,OAAO,eAAe;AAExC,UAAM,aAAa,KAAK,UAAU;AAElC,QAAI,WAAW,EAAE,WAAW,GAAG;AAC7B,aAAO,KAAK,EAAE,SAAS,sBAAsB,CAAC;AAE9C,WAAK,YAAY;AAEjB;AAAA,IACF;AAEA,UAAM,mBAAmB,WAAW,EAAE,CAAC;AAEvC,UAAM,0BAA0B,MAAM,KAAK,WAAW,KAAK,OAAO,iBAAiB;AAEnF,QAAI,CAAC,yBAAyB;AAC5B,aAAO,KAAK;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,UACJ,WAAW,KAAK,OAAO;AAAA,QACzB;AAAA,MACF,CAAC;AAED;AAAA,IACF;AAGA,UAAM,WAAW,MAAM,OAAO,uBAAuB;AAAA,MACnD,WAAW,KAAK,OAAO;AAAA,MACvB,YAAY,CAAC,OAAO,KAAK;AAAA,IAC3B,CAAC;AAGD,QAAI,eAA2E;AAC/E,QAAI,OAAO,UAAU,eAAe,KAAK,UAAU,gBAAgB,GAAG;AACpE,qBAAe,QAAQ,IAAI,UAAU,gBAAgB;AAAA,IACvD;AAEA,QAAI,CAAC,cAAc;AACjB,aAAO,KAAK;AAAA,QACV,SAAS;AAAA,QACT,MAAM,EAAE,SAAS,iBAAiB;AAAA,MACpC,CAAC;AAED;AAAA,IACF;AAGA,UAAM,UAAU,IAAI,aAAa;AAAA,MAC/B,mBAAmB,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO,KAAK;AAAA,MACV,SAAS;AAAA,MACT,MAAM,EAAE,SAAS,iBAAiB;AAAA,IACpC,CAAC;AAGD,UAAM,QAAQ,IAAI,UAAU;AAE5B,UAAM,4BAAqD;AAAA,MACzD,SAAS;AAAA,IACX;AAEA,QAAI,KAAK,OAAO,OAAO,sBAAsB;AAC3C,YAAM,UAAU,YAAY,IAAI;AAChC,YAAM,gBAAgB,UAAU;AAEhC,gCAA0B,gBAAgB,IAAI,KAAK,WAAW;AAAA,QAC5D,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,WAAO,KAAK;AAAA,MACV,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAGD,SAAK,YAAY;AAAA,EACnB;AAAA,EAEQ,cAAoB;AAE1B,SAAK,KAAK,KAAK,EAAE,WAAW,KAAK,UAAU,KAAK,IAAI,EAAE,CAAC;AAAA,EACzD;AAAA,EAEU,eAAqB;AAC7B,WAAO,KAAK,EAAE,SAAS,kBAAkB,CAAC;AAAA,EAC5C;AACF;",
6
6
  "names": []
7
7
  }
@@ -42,6 +42,7 @@ class WebApplication extends BaseApplication {
42
42
  host: this.config.webServer.host,
43
43
  port: this.config.webServer.port,
44
44
  controllersDirectory: this.config.webServer.controllersDirectory,
45
+ routesDirectory: this.config.webServer.routesDirectory,
45
46
  cors: this.config.webServer.cors,
46
47
  log: this.config.webServer.log,
47
48
  debug: this.config.webServer.debug
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/application/web-application.ts"],
4
- "sourcesContent": ["import type RedisInstance from '../redis/instance.js';\nimport type DatabaseInstance from '../database/instance.js';\nimport WebServer from '../webserver/webserver.js';\nimport type QueueManager from '../queue/manager.js';\nimport BaseApplication from './base-application.js';\nimport type { WebApplicationConfig } from './web-application.interface.js';\nimport { Helper, Time } from '../util/index.js';\nimport { Logger } from '../logger/index.js';\nimport WebSocketServer from '../websocket/websocket-server.js';\nimport WebSocketClient from '../websocket/websocket-client.js';\nimport type EventManager from '../event/manager.js';\nimport { WebServerPerformanceWrapper, WebSocketPerformanceWrapper } from '../performance/index.js';\n\n/**\n * Application\n */\nexport default class WebApplication extends BaseApplication {\n /** Web application config */\n protected config: WebApplicationConfig;\n\n /** Web server */\n public webServer?: WebServer;\n\n /** WebSocket server */\n public webSocketServer?: WebSocketServer;\n\n /** WebSocket client */\n public webSocketClient?: WebSocketClient;\n\n constructor(config: WebApplicationConfig) {\n super(config);\n\n const defaultConfig: Partial<WebApplicationConfig> = {\n log: {\n startUp: true,\n },\n };\n\n const mergedConfig = Helper.defaultsDeep(config, defaultConfig);\n\n this.config = mergedConfig;\n }\n\n protected async startHandler({\n redisInstance,\n databaseInstance,\n queueManager,\n eventManager,\n }: {\n redisInstance: RedisInstance;\n databaseInstance: DatabaseInstance;\n queueManager: QueueManager;\n eventManager: EventManager;\n }): Promise<void> {\n if (this.config.webServer?.enabled) {\n // Initialize web server\n this.webServer = new WebServer({\n applicationConfig: this.config,\n options: {\n host: this.config.webServer.host,\n port: this.config.webServer.port,\n controllersDirectory: this.config.webServer.controllersDirectory,\n cors: this.config.webServer.cors,\n log: this.config.webServer.log,\n debug: this.config.webServer.debug,\n },\n\n routes: this.config.webServer.routes,\n\n redisInstance,\n databaseInstance,\n queueManager,\n eventManager,\n lifecycleManager: this.lifecycle,\n });\n\n // Set up performance monitoring for web server\n if (this.performanceMonitor && this.config.performanceMonitoring?.monitorHttpRequests !== false) {\n WebServerPerformanceWrapper.setPerformanceMonitor(this.performanceMonitor);\n }\n\n // Load web server\n await this.webServer.load();\n\n // Start web server\n await this.webServer.start();\n\n // Register readiness check for web server\n this.lifecycle.addReadinessCheck('webserver', async () => {\n try {\n return this.webServer?.isReady() ?? false;\n } catch {\n return false;\n }\n });\n }\n\n if (this.config.webSocket?.enabled) {\n if (!this.webServer) {\n throw new Error('WebSocket requires web server to be enabled');\n }\n\n let webSocketServer: WebSocketServer | undefined;\n let webSocketClient: WebSocketClient | undefined;\n\n switch (this.config.webSocket.type) {\n case 'server': {\n // Initialize WebSocket server\n webSocketServer = new WebSocketServer({\n uniqueInstanceId: this.uniqueInstanceId,\n applicationConfig: this.config,\n options: this.config.webSocket,\n redisInstance,\n databaseInstance,\n queueManager,\n routes: this.config.webSocket.routes,\n workerId: this.workerId,\n });\n\n // Set up performance monitoring for WebSocket\n if (this.performanceMonitor && this.config.performanceMonitoring?.monitorWebSocketOperations !== false) {\n WebSocketPerformanceWrapper.setPerformanceMonitor(this.performanceMonitor);\n }\n\n // Load WebSocket client\n await webSocketServer.load();\n\n // Start WebSocket server\n await webSocketServer.start({\n fastifyServer: this.webServer.fastifyServer,\n });\n\n break;\n }\n case 'client': {\n // Initialize WebSocket client\n webSocketClient = new WebSocketClient({\n applicationConfig: this.config,\n options: this.config.webSocket,\n redisInstance,\n databaseInstance,\n queueManager,\n routes: this.config.webSocket.routes,\n });\n\n // Load WebSocket client\n await webSocketClient.load();\n\n // Connect to WebSocket server\n await webSocketClient.connectToServer();\n\n break;\n }\n default: {\n if (!this.config.webSocket.type) {\n throw new Error('WebSocket type is required');\n } else {\n throw new Error(`WebSocket type is not supported (Type: ${this.config.webSocket.type})`);\n }\n }\n }\n\n this.webSocketServer = webSocketServer;\n this.webSocketClient = webSocketClient;\n }\n }\n\n /**\n * Stop application callback\n */\n protected async stopCallback(): Promise<void> {\n if (this.webServer) {\n // Stop web server\n await this.webServer.stop();\n }\n\n if (this.webSocketServer) {\n // Stop WebSocket server\n await this.webSocketServer.stop();\n }\n }\n\n /**\n * Application started event\n */\n protected async onStarted({ startupTime }: { startupTime: number }): Promise<void> {\n if (this.config.log?.startUp) {\n Logger.info({\n message: 'Application started',\n meta: {\n Name: this.config.name,\n 'Instance ID': this.config.instanceId,\n 'PXL Framework Version': this.applicationVersion,\n 'Startup Time': Time.formatTime({\n time: startupTime,\n format: 's',\n numDecimals: 2,\n showUnit: true,\n }),\n },\n });\n }\n\n if (this.config.events?.onStarted) {\n this.config.events.onStarted({\n app: this,\n startupTime,\n });\n }\n }\n\n protected async onStopped({ runtime }: { runtime: number }): Promise<void> {\n if (this.config.log?.shutdown) {\n Logger.info({\n message: 'Application stopped',\n meta: {\n Name: this.config.name,\n 'Instance ID': this.config.instanceId,\n Runtime: Time.formatTime({\n time: runtime,\n format: 's',\n numDecimals: 2,\n showUnit: true,\n }),\n },\n });\n }\n\n if (this.config.events?.onStopped) {\n this.config.events.onStopped({ app: this, runtime });\n }\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type RedisInstance from '../redis/instance.js';\nimport type DatabaseInstance from '../database/instance.js';\nimport WebServer from '../webserver/webserver.js';\nimport type QueueManager from '../queue/manager.js';\nimport BaseApplication from './base-application.js';\nimport type { WebApplicationConfig } from './web-application.interface.js';\nimport { Helper, Time } from '../util/index.js';\nimport { Logger } from '../logger/index.js';\nimport WebSocketServer from '../websocket/websocket-server.js';\nimport WebSocketClient from '../websocket/websocket-client.js';\nimport type EventManager from '../event/manager.js';\nimport { WebServerPerformanceWrapper, WebSocketPerformanceWrapper } from '../performance/index.js';\n\n/**\n * Application\n */\nexport default class WebApplication extends BaseApplication {\n /** Web application config */\n protected config: WebApplicationConfig;\n\n /** Web server */\n public webServer?: WebServer;\n\n /** WebSocket server */\n public webSocketServer?: WebSocketServer;\n\n /** WebSocket client */\n public webSocketClient?: WebSocketClient;\n\n constructor(config: WebApplicationConfig) {\n super(config);\n\n const defaultConfig: Partial<WebApplicationConfig> = {\n log: {\n startUp: true,\n },\n };\n\n const mergedConfig = Helper.defaultsDeep(config, defaultConfig);\n\n this.config = mergedConfig;\n }\n\n protected async startHandler({\n redisInstance,\n databaseInstance,\n queueManager,\n eventManager,\n }: {\n redisInstance: RedisInstance;\n databaseInstance: DatabaseInstance;\n queueManager: QueueManager;\n eventManager: EventManager;\n }): Promise<void> {\n if (this.config.webServer?.enabled) {\n // Initialize web server\n this.webServer = new WebServer({\n applicationConfig: this.config,\n options: {\n host: this.config.webServer.host,\n port: this.config.webServer.port,\n controllersDirectory: this.config.webServer.controllersDirectory,\n routesDirectory: this.config.webServer.routesDirectory,\n cors: this.config.webServer.cors,\n log: this.config.webServer.log,\n debug: this.config.webServer.debug,\n },\n\n routes: this.config.webServer.routes,\n\n redisInstance,\n databaseInstance,\n queueManager,\n eventManager,\n lifecycleManager: this.lifecycle,\n });\n\n // Set up performance monitoring for web server\n if (this.performanceMonitor && this.config.performanceMonitoring?.monitorHttpRequests !== false) {\n WebServerPerformanceWrapper.setPerformanceMonitor(this.performanceMonitor);\n }\n\n // Load web server\n await this.webServer.load();\n\n // Start web server\n await this.webServer.start();\n\n // Register readiness check for web server\n this.lifecycle.addReadinessCheck('webserver', async () => {\n try {\n return this.webServer?.isReady() ?? false;\n } catch {\n return false;\n }\n });\n }\n\n if (this.config.webSocket?.enabled) {\n if (!this.webServer) {\n throw new Error('WebSocket requires web server to be enabled');\n }\n\n let webSocketServer: WebSocketServer | undefined;\n let webSocketClient: WebSocketClient | undefined;\n\n switch (this.config.webSocket.type) {\n case 'server': {\n // Initialize WebSocket server\n webSocketServer = new WebSocketServer({\n uniqueInstanceId: this.uniqueInstanceId,\n applicationConfig: this.config,\n options: this.config.webSocket,\n redisInstance,\n databaseInstance,\n queueManager,\n routes: this.config.webSocket.routes,\n workerId: this.workerId,\n });\n\n // Set up performance monitoring for WebSocket\n if (this.performanceMonitor && this.config.performanceMonitoring?.monitorWebSocketOperations !== false) {\n WebSocketPerformanceWrapper.setPerformanceMonitor(this.performanceMonitor);\n }\n\n // Load WebSocket client\n await webSocketServer.load();\n\n // Start WebSocket server\n await webSocketServer.start({\n fastifyServer: this.webServer.fastifyServer,\n });\n\n break;\n }\n case 'client': {\n // Initialize WebSocket client\n webSocketClient = new WebSocketClient({\n applicationConfig: this.config,\n options: this.config.webSocket,\n redisInstance,\n databaseInstance,\n queueManager,\n routes: this.config.webSocket.routes,\n });\n\n // Load WebSocket client\n await webSocketClient.load();\n\n // Connect to WebSocket server\n await webSocketClient.connectToServer();\n\n break;\n }\n default: {\n if (!this.config.webSocket.type) {\n throw new Error('WebSocket type is required');\n } else {\n throw new Error(`WebSocket type is not supported (Type: ${this.config.webSocket.type})`);\n }\n }\n }\n\n this.webSocketServer = webSocketServer;\n this.webSocketClient = webSocketClient;\n }\n }\n\n /**\n * Stop application callback\n */\n protected async stopCallback(): Promise<void> {\n if (this.webServer) {\n // Stop web server\n await this.webServer.stop();\n }\n\n if (this.webSocketServer) {\n // Stop WebSocket server\n await this.webSocketServer.stop();\n }\n }\n\n /**\n * Application started event\n */\n protected async onStarted({ startupTime }: { startupTime: number }): Promise<void> {\n if (this.config.log?.startUp) {\n Logger.info({\n message: 'Application started',\n meta: {\n Name: this.config.name,\n 'Instance ID': this.config.instanceId,\n 'PXL Framework Version': this.applicationVersion,\n 'Startup Time': Time.formatTime({\n time: startupTime,\n format: 's',\n numDecimals: 2,\n showUnit: true,\n }),\n },\n });\n }\n\n if (this.config.events?.onStarted) {\n this.config.events.onStarted({\n app: this,\n startupTime,\n });\n }\n }\n\n protected async onStopped({ runtime }: { runtime: number }): Promise<void> {\n if (this.config.log?.shutdown) {\n Logger.info({\n message: 'Application stopped',\n meta: {\n Name: this.config.name,\n 'Instance ID': this.config.instanceId,\n Runtime: Time.formatTime({\n time: runtime,\n format: 's',\n numDecimals: 2,\n showUnit: true,\n }),\n },\n });\n }\n\n if (this.config.events?.onStopped) {\n this.config.events.onStopped({ app: this, runtime });\n }\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/command/command.ts"],
4
- "sourcesContent": ["import type { ApplicationConfig } from '../application/base-application.interface.js';\nimport type DatabaseInstance from '../database/instance.js';\nimport type { QueueManager } from '../queue/index.js';\nimport type RedisInstance from '../redis/instance.js';\nimport type { CommandConstructorParams } from './command.interface.js';\nimport { Logger } from '../logger/index.js';\n\nexport default abstract class Command {\n /** Command name */\n public abstract name: string;\n\n /** Command description */\n public abstract description: string;\n\n protected applicationConfig: ApplicationConfig;\n\n protected redisInstance: RedisInstance;\n protected queueManager: QueueManager;\n protected databaseInstance: DatabaseInstance;\n\n protected logger: typeof Logger;\n\n constructor({ applicationConfig, redisInstance, queueManager, databaseInstance }: CommandConstructorParams) {\n this.applicationConfig = applicationConfig;\n\n this.redisInstance = redisInstance;\n this.queueManager = queueManager;\n this.databaseInstance = databaseInstance;\n\n this.logger = Logger;\n }\n\n /**\n * Run command\n */\n public abstract run(): Promise<void>;\n\n /**\n * Log command message\n */\n public log(message: string, meta?: Record<string, unknown>): void {\n this.logger.custom({\n level: 'command',\n message,\n meta: {\n Command: this.name,\n ...meta,\n },\n });\n }\n}\n"],
4
+ "sourcesContent": ["import type { ApplicationConfig } from '../application/base-application.interface.js';\nimport type DatabaseInstance from '../database/instance.js';\nimport type { QueueManager } from '../queue/index.js';\nimport type RedisInstance from '../redis/instance.js';\nimport type { CommandConstructorParams } from './command.interface.js';\nimport { Logger } from '../logger/index.js';\n\nexport default abstract class Command {\n /** Command name */\n public abstract name: string;\n\n /** Command description */\n public abstract description: string;\n\n protected applicationConfig: ApplicationConfig;\n\n protected redisInstance: RedisInstance;\n protected queueManager: QueueManager;\n protected databaseInstance: DatabaseInstance;\n\n protected logger: typeof Logger;\n\n constructor({ applicationConfig, redisInstance, queueManager, databaseInstance }: CommandConstructorParams) {\n this.applicationConfig = applicationConfig;\n\n this.redisInstance = redisInstance;\n this.queueManager = queueManager;\n this.databaseInstance = databaseInstance;\n\n this.logger = Logger;\n }\n\n /**\n * Run command\n */\n public abstract run(argv?: unknown): Promise<void>;\n\n /**\n * Log command message\n */\n public log(message: string, meta?: Record<string, unknown>): void {\n this.logger.custom({\n level: 'command',\n message,\n meta: {\n Command: this.name,\n ...meta,\n },\n });\n }\n}\n"],
5
5
  "mappings": ";;AAKA,SAAS,cAAc;AAEvB,MAAO,QAA+B;AAAA,EAPtC,OAOsC;AAAA;AAAA;AAAA,EAO1B;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EAEV,YAAY,EAAE,mBAAmB,eAAe,cAAc,iBAAiB,GAA6B;AAC1G,SAAK,oBAAoB;AAEzB,SAAK,gBAAgB;AACrB,SAAK,eAAe;AACpB,SAAK,mBAAmB;AAExB,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAUO,IAAI,SAAiB,MAAsC;AAChE,SAAK,OAAO,OAAO;AAAA,MACjB,OAAO;AAAA,MACP;AAAA,MACA,MAAM;AAAA,QACJ,SAAS,KAAK;AAAA,QACd,GAAG;AAAA,MACL;AAAA,IACF,CAAC;AAAA,EACH;AACF;",
6
6
  "names": []
7
7
  }
@@ -5,7 +5,7 @@ import crypto from "node:crypto";
5
5
  const RedisConfigSchema = z.object({
6
6
  host: z.string().min(1, "redis.host required"),
7
7
  port: z.number().int().positive().default(6379),
8
- password: z.preprocess((val) => val === "" ? void 0 : val, z.string().min(1).optional())
8
+ password: z.string().min(1).optional()
9
9
  });
10
10
  const DatabaseConfigSchema = z.object({
11
11
  enabled: z.boolean().default(false),
@@ -24,10 +24,14 @@ const QueueLogConfigSchema = z.object({
24
24
  queuesRegistered: z.boolean().optional(),
25
25
  queueWaiting: z.boolean().optional()
26
26
  }).optional();
27
+ const QueueJobSchema = z.object({
28
+ id: z.string().min(1),
29
+ maxConcurrency: z.number().int().positive().optional()
30
+ });
27
31
  const QueueItemSchema = z.object({
28
32
  name: z.string(),
29
33
  isExternal: z.boolean().optional(),
30
- jobs: z.array(z.any()).default([])
34
+ jobs: z.array(QueueJobSchema).default([])
31
35
  });
32
36
  const QueueConfigSchema = z.object({
33
37
  queues: z.array(QueueItemSchema).default([]),
@@ -102,12 +106,15 @@ const WebServerRouteSchema = z.object({
102
106
  path: z.string(),
103
107
  url: z.string().optional(),
104
108
  // Keep for backwards compatibility
105
- controller: z.any().optional(),
109
+ controller: z.unknown().optional(),
106
110
  // Controller class reference
107
111
  controllerName: z.string().optional(),
108
112
  action: z.string().optional(),
109
113
  entityName: z.string().optional(),
110
- validation: z.any().optional()
114
+ validation: z.unknown().optional(),
115
+ // Validation schema reference
116
+ handler: z.unknown().optional(),
117
+ schema: z.unknown().optional()
111
118
  }).passthrough();
112
119
  const WebServerConfigSchema = z.object({
113
120
  enabled: z.boolean().default(false),
@@ -120,6 +127,7 @@ const WebServerConfigSchema = z.object({
120
127
  routes: z.array(WebServerRouteSchema).default([]),
121
128
  controllersDirectory: z.string().optional(),
122
129
  // Controllers directory path
130
+ routesDirectory: z.string().optional(),
123
131
  cors: z.object({
124
132
  enabled: z.boolean().default(false),
125
133
  urls: z.array(z.string()).default([])
@@ -128,12 +136,13 @@ const WebServerConfigSchema = z.object({
128
136
  debug: z.object({
129
137
  logAllRegisteredRoutes: z.boolean().optional()
130
138
  }).default({}).optional()
131
- }).partial({ cors: true, debug: true, controllersDirectory: true, security: true });
139
+ }).partial({ cors: true, debug: true, controllersDirectory: true, routesDirectory: true, security: true });
132
140
  const WebSocketRouteSchema = z.object({
133
141
  type: z.string().min(1, "webSocket.routes.type required"),
134
142
  controllerName: z.string().min(1, "webSocket.routes.controllerName required"),
135
143
  action: z.string().min(1, "webSocket.routes.action required"),
136
- controller: z.any().optional()
144
+ controller: z.unknown().optional()
145
+ // Controller class reference
137
146
  });
138
147
  const WebSocketConfigSchema = z.object({
139
148
  type: z.string().default("native"),
@@ -178,7 +187,7 @@ function validateFrameworkConfig(raw, _options = {}) {
178
187
  const result = FrameworkConfigSchema.safeParse(raw);
179
188
  if (!result.success) {
180
189
  const issues = result.error.issues.map((i) => ({
181
- path: i.path.join(".") ?? "(root)",
190
+ path: i.path.join(".") || "(root)",
182
191
  message: i.message
183
192
  }));
184
193
  throw new ConfigValidationError("Invalid framework configuration", issues);
@@ -204,6 +213,7 @@ export {
204
213
  PerformanceThresholdsSchema,
205
214
  QueueConfigSchema,
206
215
  QueueItemSchema,
216
+ QueueJobSchema,
207
217
  QueueLogConfigSchema,
208
218
  RedisConfigSchema,
209
219
  SecurityConfigSchema,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/config/schema.ts"],
4
- "sourcesContent": ["import { z } from 'zod';\nimport crypto from 'node:crypto';\n\n// Redis configuration schema\nexport const RedisConfigSchema = z.object({\n host: z.string().min(1, 'redis.host required'),\n port: z.number().int().positive().default(6379),\n password: z.preprocess(val => (val === '' ? undefined : val), z.string().min(1).optional()),\n});\n\n// Database configuration schema\nexport const DatabaseConfigSchema = z\n .object({\n enabled: z.boolean().default(false),\n host: z.string().min(1, 'database.host required'),\n port: z.number().int().positive().default(5432),\n username: z.string().min(1, 'database.username required'),\n password: z.string().min(1, 'database.password required'),\n databaseName: z.string().min(1, 'database.databaseName required'),\n entitiesDirectory: z.string().min(1).optional(),\n })\n .partial({ entitiesDirectory: true });\n\n// Queue configuration schema\nexport const QueueLogConfigSchema = z\n .object({\n jobRegistered: z.boolean().optional(),\n jobAdded: z.boolean().optional(),\n jobCompleted: z.boolean().optional(),\n queueRegistered: z.boolean().optional(),\n queuesRegistered: z.boolean().optional(),\n queueWaiting: z.boolean().optional(),\n })\n .optional();\n\nexport const QueueItemSchema = z.object({\n name: z.string(),\n isExternal: z.boolean().optional(),\n jobs: z.array(z.any()).default([]),\n});\n\nexport const QueueConfigSchema = z.object({\n queues: z.array(QueueItemSchema).default([]),\n processorsDirectory: z.string().min(1, 'queue.processorsDirectory required'),\n log: QueueLogConfigSchema,\n});\n\n// Event configuration schema\nexport const EventDefinitionSchema = z.object({\n name: z.string().min(1),\n});\n\nexport const EventConfigSchema = z.object({\n enabled: z.boolean().default(false),\n controllersDirectory: z.string().min(1),\n events: z.array(EventDefinitionSchema).default([]),\n});\n\n// Log configuration schema\nexport const LogConfigSchema = z\n .object({\n startUp: z.boolean().optional(),\n shutdown: z.boolean().optional(),\n })\n .optional();\n\n// Performance monitoring schema\nexport const PerformanceThresholdsSchema = z\n .object({\n httpMs: z.number().int().positive().optional(),\n dbMs: z.number().int().positive().optional(),\n queueMs: z.number().int().positive().optional(),\n cacheMs: z.number().int().positive().optional(),\n wsMs: z.number().int().positive().optional(),\n })\n .partial();\n\nexport const PerformanceMonitoringSchema = z\n .object({\n enabled: z.boolean().default(false),\n thresholds: PerformanceThresholdsSchema.optional(),\n maxMetricsHistory: z.number().int().positive().optional(),\n logSlowOperations: z.boolean().optional(),\n logAllOperations: z.boolean().optional(),\n monitorHttpRequests: z.boolean().default(true).optional(),\n monitorDatabaseOperations: z.boolean().default(true).optional(),\n monitorWebSocketOperations: z.boolean().default(true).optional(),\n monitorQueueOperations: z.boolean().default(true).optional(),\n monitorCacheOperations: z.boolean().default(true).optional(),\n reportInterval: z.number().int().positive().default(60_000).optional(),\n reportFormat: z.enum(['simple', 'detailed']).default('simple').optional(),\n })\n .partial();\n\n// Auth configuration schema\nexport const AuthConfigSchema = z\n .object({\n jwtSecretKey: z.string().min(1, 'auth.jwtSecretKey required'),\n })\n .optional();\n\n// Security configuration schema\nexport const SecurityConfigSchema = z\n .object({\n helmet: z\n .object({\n enabled: z.boolean().optional(),\n contentSecurityPolicy: z.boolean().optional(),\n crossOriginEmbedderPolicy: z.boolean().optional(),\n crossOriginOpenerPolicy: z.boolean().optional(),\n crossOriginResourcePolicy: z.boolean().optional(),\n dnsPrefetchControl: z.boolean().optional(),\n frameguard: z.boolean().optional(),\n hidePoweredBy: z.boolean().optional(),\n hsts: z.boolean().optional(),\n ieNoOpen: z.boolean().optional(),\n noSniff: z.boolean().optional(),\n originAgentCluster: z.boolean().optional(),\n permittedCrossDomainPolicies: z.boolean().optional(),\n referrerPolicy: z.boolean().optional(),\n xssFilter: z.boolean().optional(),\n })\n .optional(),\n rateLimit: z\n .object({\n enabled: z.boolean().optional(),\n max: z.number().int().positive().optional(),\n timeWindow: z.string().optional(),\n ban: z.number().int().optional(),\n cache: z.number().int().optional(),\n })\n .optional(),\n })\n .optional();\n\n// Web server configuration schema\nexport const WebServerRouteSchema = z\n .object({\n type: z.string().optional(),\n method: z.union([z.string(), z.array(z.string())]).optional(),\n path: z.string(),\n url: z.string().optional(), // Keep for backwards compatibility\n controller: z.any().optional(), // Controller class reference\n controllerName: z.string().optional(),\n action: z.string().optional(),\n entityName: z.string().optional(),\n validation: z.any().optional(),\n })\n .passthrough(); // Allow additional properties to pass through\n\nexport const WebServerConfigSchema = z\n .object({\n enabled: z.boolean().default(false),\n host: z.string().default('0.0.0.0'),\n port: z.number().int().positive().default(3001),\n bodyLimit: z\n .number()\n .int()\n .positive()\n .default(25 * 1024 * 1024), // 25MB default (was 100MB)\n connectionTimeout: z\n .number()\n .int()\n .positive()\n .default(10 * 1000), // 10s default (was 30s)\n routes: z.array(WebServerRouteSchema).default([]),\n controllersDirectory: z.string().optional(), // Controllers directory path\n cors: z\n .object({\n enabled: z.boolean().default(false),\n urls: z.array(z.string()).default([]),\n })\n .optional(),\n security: SecurityConfigSchema.optional(),\n debug: z\n .object({\n logAllRegisteredRoutes: z.boolean().optional(),\n })\n .default({})\n .optional(),\n })\n .partial({ cors: true, debug: true, controllersDirectory: true, security: true });\n\n// WebSocket configuration schema\nexport const WebSocketRouteSchema = z.object({\n type: z.string().min(1, 'webSocket.routes.type required'),\n controllerName: z.string().min(1, 'webSocket.routes.controllerName required'),\n action: z.string().min(1, 'webSocket.routes.action required'),\n controller: z.any().optional(),\n});\n\nexport const WebSocketConfigSchema = z\n .object({\n type: z.string().default('native'),\n enabled: z.boolean().default(false),\n routes: z.array(WebSocketRouteSchema).default([]),\n })\n .partial();\n\n// Cluster configuration schema\nexport const ClusterConfigSchema = z\n .object({\n enabled: z.boolean().default(false),\n workers: z.number().int().positive().optional(),\n })\n .partial();\n\n// Top-level framework configuration schema\nexport const FrameworkConfigSchema = z.object({\n name: z.string().min(1, 'name required'),\n instanceId: z.string().default(() => crypto.randomUUID()),\n rootDirectory: z.string().min(1, 'rootDirectory required'),\n cluster: ClusterConfigSchema.optional(),\n redis: RedisConfigSchema,\n cache: z.object({}).optional(),\n database: DatabaseConfigSchema.optional(),\n queue: QueueConfigSchema,\n event: EventConfigSchema.optional(),\n log: LogConfigSchema,\n performanceMonitoring: PerformanceMonitoringSchema.optional(),\n email: z.object({}).optional(),\n auth: AuthConfigSchema,\n web: WebServerConfigSchema.optional(),\n webServer: WebServerConfigSchema.optional(), // Support both 'web' and 'webServer' for compatibility\n webSocket: WebSocketConfigSchema.optional(),\n});\n\nexport type InferFrameworkConfig = z.infer<typeof FrameworkConfigSchema>;\n\nexport interface ValidateConfigOptions {\n collectAllErrors?: boolean; // Reserved for future use; Zod currently throws aggregate anyway\n}\n\nexport interface ValidationIssueDetail {\n path: string;\n message: string;\n}\n\nexport class ConfigValidationError extends Error {\n public issues: ValidationIssueDetail[];\n constructor(message: string, issues: ValidationIssueDetail[]) {\n super(message);\n this.name = 'ConfigValidationError';\n this.issues = issues;\n }\n}\n\nexport function validateFrameworkConfig(raw: unknown, _options: ValidateConfigOptions = {}): InferFrameworkConfig {\n const result = FrameworkConfigSchema.safeParse(raw);\n if (!result.success) {\n const issues: ValidationIssueDetail[] = result.error.issues.map((i: any) => ({\n path: (i.path.join('.') ?? '(root)') as string,\n message: i.message as string,\n }));\n throw new ConfigValidationError('Invalid framework configuration', issues);\n }\n return result.data;\n}\n\nexport function formatConfigIssues(issues: ValidationIssueDetail[]): string {\n return issues.map(i => ` - ${i.path}: ${i.message}`).join('\\n');\n}\n\nexport default FrameworkConfigSchema;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { z } from 'zod';\nimport crypto from 'node:crypto';\n\n// Redis configuration schema\nexport const RedisConfigSchema = z.object({\n host: z.string().min(1, 'redis.host required'),\n port: z.number().int().positive().default(6379),\n password: z.string().min(1).optional(),\n});\n\n// Database configuration schema\nexport const DatabaseConfigSchema = z\n .object({\n enabled: z.boolean().default(false),\n host: z.string().min(1, 'database.host required'),\n port: z.number().int().positive().default(5432),\n username: z.string().min(1, 'database.username required'),\n password: z.string().min(1, 'database.password required'),\n databaseName: z.string().min(1, 'database.databaseName required'),\n entitiesDirectory: z.string().min(1).optional(),\n })\n .partial({ entitiesDirectory: true });\n\n// Queue configuration schema\nexport const QueueLogConfigSchema = z\n .object({\n jobRegistered: z.boolean().optional(),\n jobAdded: z.boolean().optional(),\n jobCompleted: z.boolean().optional(),\n queueRegistered: z.boolean().optional(),\n queuesRegistered: z.boolean().optional(),\n queueWaiting: z.boolean().optional(),\n })\n .optional();\n\nexport const QueueJobSchema = z.object({\n id: z.string().min(1),\n maxConcurrency: z.number().int().positive().optional(),\n});\n\nexport const QueueItemSchema = z.object({\n name: z.string(),\n isExternal: z.boolean().optional(),\n jobs: z.array(QueueJobSchema).default([]),\n});\n\nexport const QueueConfigSchema = z.object({\n queues: z.array(QueueItemSchema).default([]),\n processorsDirectory: z.string().min(1, 'queue.processorsDirectory required'),\n log: QueueLogConfigSchema,\n});\n\n// Event configuration schema\nexport const EventDefinitionSchema = z.object({\n name: z.string().min(1),\n});\n\nexport const EventConfigSchema = z.object({\n enabled: z.boolean().default(false),\n controllersDirectory: z.string().min(1),\n events: z.array(EventDefinitionSchema).default([]),\n});\n\n// Log configuration schema\nexport const LogConfigSchema = z\n .object({\n startUp: z.boolean().optional(),\n shutdown: z.boolean().optional(),\n })\n .optional();\n\n// Performance monitoring schema\nexport const PerformanceThresholdsSchema = z\n .object({\n httpMs: z.number().int().positive().optional(),\n dbMs: z.number().int().positive().optional(),\n queueMs: z.number().int().positive().optional(),\n cacheMs: z.number().int().positive().optional(),\n wsMs: z.number().int().positive().optional(),\n })\n .partial();\n\nexport const PerformanceMonitoringSchema = z\n .object({\n enabled: z.boolean().default(false),\n thresholds: PerformanceThresholdsSchema.optional(),\n maxMetricsHistory: z.number().int().positive().optional(),\n logSlowOperations: z.boolean().optional(),\n logAllOperations: z.boolean().optional(),\n monitorHttpRequests: z.boolean().default(true).optional(),\n monitorDatabaseOperations: z.boolean().default(true).optional(),\n monitorWebSocketOperations: z.boolean().default(true).optional(),\n monitorQueueOperations: z.boolean().default(true).optional(),\n monitorCacheOperations: z.boolean().default(true).optional(),\n reportInterval: z.number().int().positive().default(60_000).optional(),\n reportFormat: z.enum(['simple', 'detailed']).default('simple').optional(),\n })\n .partial();\n\n// Auth configuration schema\nexport const AuthConfigSchema = z\n .object({\n jwtSecretKey: z.string().min(1, 'auth.jwtSecretKey required'),\n })\n .optional();\n\n// Security configuration schema\nexport const SecurityConfigSchema = z\n .object({\n helmet: z\n .object({\n enabled: z.boolean().optional(),\n contentSecurityPolicy: z.boolean().optional(),\n crossOriginEmbedderPolicy: z.boolean().optional(),\n crossOriginOpenerPolicy: z.boolean().optional(),\n crossOriginResourcePolicy: z.boolean().optional(),\n dnsPrefetchControl: z.boolean().optional(),\n frameguard: z.boolean().optional(),\n hidePoweredBy: z.boolean().optional(),\n hsts: z.boolean().optional(),\n ieNoOpen: z.boolean().optional(),\n noSniff: z.boolean().optional(),\n originAgentCluster: z.boolean().optional(),\n permittedCrossDomainPolicies: z.boolean().optional(),\n referrerPolicy: z.boolean().optional(),\n xssFilter: z.boolean().optional(),\n })\n .optional(),\n rateLimit: z\n .object({\n enabled: z.boolean().optional(),\n max: z.number().int().positive().optional(),\n timeWindow: z.string().optional(),\n ban: z.number().int().optional(),\n cache: z.number().int().optional(),\n })\n .optional(),\n })\n .optional();\n\n// Web server configuration schema\nexport const WebServerRouteSchema = z\n .object({\n type: z.string().optional(),\n method: z.union([z.string(), z.array(z.string())]).optional(),\n path: z.string(),\n url: z.string().optional(), // Keep for backwards compatibility\n controller: z.unknown().optional(), // Controller class reference\n controllerName: z.string().optional(),\n action: z.string().optional(),\n entityName: z.string().optional(),\n validation: z.unknown().optional(), // Validation schema reference\n handler: z.unknown().optional(),\n schema: z.unknown().optional(),\n })\n .passthrough(); // Allow additional properties to pass through\n\nexport const WebServerConfigSchema = z\n .object({\n enabled: z.boolean().default(false),\n host: z.string().default('0.0.0.0'),\n port: z.number().int().positive().default(3001),\n bodyLimit: z\n .number()\n .int()\n .positive()\n .default(25 * 1024 * 1024), // 25MB default (was 100MB)\n connectionTimeout: z\n .number()\n .int()\n .positive()\n .default(10 * 1000), // 10s default (was 30s)\n routes: z.array(WebServerRouteSchema).default([]),\n controllersDirectory: z.string().optional(), // Controllers directory path\n routesDirectory: z.string().optional(),\n cors: z\n .object({\n enabled: z.boolean().default(false),\n urls: z.array(z.string()).default([]),\n })\n .optional(),\n security: SecurityConfigSchema.optional(),\n debug: z\n .object({\n logAllRegisteredRoutes: z.boolean().optional(),\n })\n .default({})\n .optional(),\n })\n .partial({ cors: true, debug: true, controllersDirectory: true, routesDirectory: true, security: true });\n\n// WebSocket configuration schema\nexport const WebSocketRouteSchema = z.object({\n type: z.string().min(1, 'webSocket.routes.type required'),\n controllerName: z.string().min(1, 'webSocket.routes.controllerName required'),\n action: z.string().min(1, 'webSocket.routes.action required'),\n controller: z.unknown().optional(), // Controller class reference\n});\n\nexport const WebSocketConfigSchema = z\n .object({\n type: z.string().default('native'),\n enabled: z.boolean().default(false),\n routes: z.array(WebSocketRouteSchema).default([]),\n })\n .partial();\n\n// Cluster configuration schema\nexport const ClusterConfigSchema = z\n .object({\n enabled: z.boolean().default(false),\n workers: z.number().int().positive().optional(),\n })\n .partial();\n\n// Top-level framework configuration schema\nexport const FrameworkConfigSchema = z.object({\n name: z.string().min(1, 'name required'),\n instanceId: z.string().default(() => crypto.randomUUID()),\n rootDirectory: z.string().min(1, 'rootDirectory required'),\n cluster: ClusterConfigSchema.optional(),\n redis: RedisConfigSchema,\n cache: z.object({}).optional(),\n database: DatabaseConfigSchema.optional(),\n queue: QueueConfigSchema,\n event: EventConfigSchema.optional(),\n log: LogConfigSchema,\n performanceMonitoring: PerformanceMonitoringSchema.optional(),\n email: z.object({}).optional(),\n auth: AuthConfigSchema,\n web: WebServerConfigSchema.optional(),\n webServer: WebServerConfigSchema.optional(), // Support both 'web' and 'webServer' for compatibility\n webSocket: WebSocketConfigSchema.optional(),\n});\n\nexport type InferFrameworkConfig = z.infer<typeof FrameworkConfigSchema>;\n\nexport interface ValidateConfigOptions {\n collectAllErrors?: boolean; // Reserved for future use; Zod currently throws aggregate anyway\n}\n\nexport interface ValidationIssueDetail {\n path: string;\n message: string;\n}\n\nexport class ConfigValidationError extends Error {\n public issues: ValidationIssueDetail[];\n constructor(message: string, issues: ValidationIssueDetail[]) {\n super(message);\n this.name = 'ConfigValidationError';\n this.issues = issues;\n }\n}\n\nexport function validateFrameworkConfig(raw: unknown, _options: ValidateConfigOptions = {}): InferFrameworkConfig {\n const result = FrameworkConfigSchema.safeParse(raw);\n if (!result.success) {\n const issues: ValidationIssueDetail[] = result.error.issues.map(i => ({\n path: i.path.join('.') || '(root)',\n message: i.message,\n }));\n throw new ConfigValidationError('Invalid framework configuration', issues);\n }\n return result.data;\n}\n\nexport function formatConfigIssues(issues: ValidationIssueDetail[]): string {\n return issues.map(i => ` - ${i.path}: ${i.message}`).join('\\n');\n}\n\nexport default FrameworkConfigSchema;\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/event/manager.ts"],
4
- "sourcesContent": ["// event-manager.ts\nimport { Logger } from '../logger/index.js';\nimport { File, Helper, Loader } from '../util/index.js';\nimport type { EventDefinition, EventManagerConstructorParams, EventManagerOptions } from './manager.interface.js';\nimport type { ApplicationConfig } from '../application/base-application.interface.js';\nimport type DatabaseInstance from '../database/instance.js';\nimport type { RedisInstance } from '../redis/index.js';\nimport type { EventControllerType } from './controller/base.interface.js';\n\nexport default class EventManager {\n private logger: typeof Logger = Logger;\n\n private applicationConfig: ApplicationConfig;\n private options: EventManagerOptions;\n private events: EventDefinition[];\n private redisInstance: RedisInstance;\n // private queueManager: QueueManager;\n private databaseInstance: DatabaseInstance | null;\n\n private eventHandlers: Map<string, Function>;\n\n constructor(params: EventManagerConstructorParams) {\n const defaultOptions: Partial<EventManagerOptions> = {\n log: {\n startUp: true,\n },\n debug: {\n printEvents: false,\n },\n };\n\n this.options = Helper.defaultsDeep(params.options, defaultOptions);\n\n this.applicationConfig = params.applicationConfig;\n this.events = params.events;\n this.redisInstance = params.redisInstance;\n // this.queueManager = params.queueManager;\n this.databaseInstance = params.databaseInstance;\n\n this.eventHandlers = new Map();\n }\n\n public async load(): Promise<void> {\n // Check if controllers directory exists\n const controllersDirectoryExists = await File.pathExists(this.options.controllersDirectory);\n\n if (!controllersDirectoryExists) {\n return;\n }\n\n // Load controllers\n const controllers = await Loader.loadModulesInDirectory({\n directory: this.options.controllersDirectory,\n extensions: ['.ts', '.js'],\n });\n\n // Load event handlers\n for (const event of this.events) {\n let ControllerClass: EventControllerType;\n let controllerName: string;\n\n if (event.controller) {\n ControllerClass = event.controller;\n controllerName = ControllerClass.name;\n } else if (event.controllerName) {\n ControllerClass = controllers[event.controllerName];\n controllerName = event.controllerName;\n } else {\n throw new Error('Event controller not specified');\n }\n\n if (typeof ControllerClass !== 'function') {\n const controllerPath = `${this.options.controllersDirectory}/${event.controllerName}.ts`;\n this.logger.warn({\n message: 'Event controller not found',\n meta: {\n Controller: event.controllerName,\n Path: controllerPath,\n Event: event.name,\n },\n });\n continue;\n }\n\n // Initialize controller instance\n const controllerInstance = new ControllerClass({\n applicationConfig: this.applicationConfig,\n redisInstance: this.redisInstance,\n // queueManager: this.queueManager,\n databaseInstance: this.databaseInstance,\n });\n\n const handler = controllerInstance[event.handlerName as keyof typeof controllerInstance];\n\n if (!handler || typeof handler !== 'function') {\n this.logger.warn({\n message: 'Event handler not found',\n meta: {\n Controller: controllerName,\n Handler: event.handlerName,\n Event: event.name,\n },\n });\n continue;\n }\n\n // Store the handler\n this.eventHandlers.set(event.name, (handler as Function).bind(controllerInstance));\n }\n\n // Log the list of registered events\n const registeredEvents = Array.from(this.eventHandlers.keys());\n\n this.log('Registered Events:', {\n Events: registeredEvents.length ? registeredEvents : '-',\n });\n\n if (this.options.debug?.printEvents) {\n this.log('Registered Events:');\n\n for (const eventName of registeredEvents) {\n console.log(`- ${eventName}`);\n }\n }\n }\n\n public async run({ name, data }: { name: string; data: any }): Promise<void> {\n try {\n const handler = this.eventHandlers.get(name);\n\n if (!handler) {\n const availableEvents = Array.from(this.eventHandlers.keys()).join(', ');\n\n this.logger.warn({\n message: 'Event handler not found for event',\n meta: {\n Event: name,\n AvailableEvents: availableEvents,\n },\n });\n\n throw new Error(`Event handler not found for event '${name}'. Available events are: ${availableEvents}`);\n }\n\n await handler(data);\n\n this.log('Event executed', { Event: name });\n } catch (error) {\n this.logger.error({ error });\n }\n }\n\n /**\n * Log event message\n */\n public log(message: string, meta?: Record<string, unknown>): void {\n this.logger.custom({ level: 'event', message, meta });\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// event-manager.ts\nimport { Logger } from '../logger/index.js';\nimport { File, Helper, Loader } from '../util/index.js';\nimport type {\n EventDefinition,\n EventHandler,\n EventManagerConstructorParams,\n EventManagerOptions,\n} from './manager.interface.js';\nimport type { ApplicationConfig } from '../application/base-application.interface.js';\nimport type DatabaseInstance from '../database/instance.js';\nimport type { RedisInstance } from '../redis/index.js';\nimport type { EventControllerType } from './controller/base.interface.js';\n\nexport default class EventManager {\n private logger: typeof Logger = Logger;\n\n private applicationConfig: ApplicationConfig;\n private options: EventManagerOptions;\n private events: EventDefinition[];\n private redisInstance: RedisInstance;\n // private queueManager: QueueManager;\n private databaseInstance: DatabaseInstance | null;\n\n private eventHandlers: Map<string, EventHandler>;\n\n constructor(params: EventManagerConstructorParams) {\n const defaultOptions: Partial<EventManagerOptions> = {\n log: {\n startUp: true,\n },\n debug: {\n printEvents: false,\n },\n };\n\n this.options = Helper.defaultsDeep(params.options, defaultOptions);\n\n this.applicationConfig = params.applicationConfig;\n this.events = params.events;\n this.redisInstance = params.redisInstance;\n // this.queueManager = params.queueManager;\n this.databaseInstance = params.databaseInstance;\n\n this.eventHandlers = new Map();\n }\n\n public async load(): Promise<void> {\n // Check if controllers directory exists\n const controllersDirectoryExists = await File.pathExists(this.options.controllersDirectory);\n\n if (!controllersDirectoryExists) {\n return;\n }\n\n // Load controllers\n const controllers = await Loader.loadModulesInDirectory({\n directory: this.options.controllersDirectory,\n extensions: ['.ts', '.js'],\n });\n\n // Load event handlers\n for (const event of this.events) {\n let ControllerClass: EventControllerType;\n let controllerName: string;\n\n if (event.controller) {\n ControllerClass = event.controller;\n controllerName = ControllerClass.name;\n } else if (event.controllerName) {\n ControllerClass = controllers[event.controllerName] as EventControllerType;\n controllerName = event.controllerName;\n } else {\n throw new Error('Event controller not specified');\n }\n\n if (typeof ControllerClass !== 'function') {\n const controllerPath = `${this.options.controllersDirectory}/${event.controllerName}.ts`;\n this.logger.warn({\n message: 'Event controller not found',\n meta: {\n Controller: event.controllerName,\n Path: controllerPath,\n Event: event.name,\n },\n });\n continue;\n }\n\n // Initialize controller instance\n const controllerInstance = new ControllerClass({\n applicationConfig: this.applicationConfig,\n redisInstance: this.redisInstance,\n // queueManager: this.queueManager,\n databaseInstance: this.databaseInstance,\n });\n\n const handler = controllerInstance[event.handlerName as keyof typeof controllerInstance];\n\n if (!handler || typeof handler !== 'function') {\n this.logger.warn({\n message: 'Event handler not found',\n meta: {\n Controller: controllerName,\n Handler: event.handlerName,\n Event: event.name,\n },\n });\n continue;\n }\n\n // Store the handler\n this.eventHandlers.set(event.name, (handler as EventHandler).bind(controllerInstance));\n }\n\n // Log the list of registered events\n const registeredEvents = Array.from(this.eventHandlers.keys());\n\n this.log('Registered Events:', {\n Events: registeredEvents.length ? registeredEvents : '-',\n });\n\n if (this.options.debug?.printEvents) {\n this.log('Registered Events:');\n\n for (const eventName of registeredEvents) {\n console.log(`- ${eventName}`);\n }\n }\n }\n\n public async run<TPayload = unknown>({ name, data }: { name: string; data: TPayload }): Promise<void> {\n try {\n const handler = this.eventHandlers.get(name);\n\n if (!handler) {\n const availableEvents = Array.from(this.eventHandlers.keys()).join(', ');\n\n this.logger.warn({\n message: 'Event handler not found for event',\n meta: {\n Event: name,\n AvailableEvents: availableEvents,\n },\n });\n\n throw new Error(`Event handler not found for event '${name}'. Available events are: ${availableEvents}`);\n }\n\n await handler(data);\n\n this.log('Event executed', { Event: name });\n } catch (error) {\n this.logger.error({ error });\n }\n }\n\n /**\n * Log event message\n */\n public log(message: string, meta?: Record<string, unknown>): void {\n this.logger.custom({ level: 'event', message, meta });\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/lifecycle/lifecycle-manager.ts"],
4
- "sourcesContent": ["import {\n type Disposable,\n type LifecycleConfig,\n type LifecycleHook,\n LifecyclePhase,\n type ReadinessCheck,\n type ReadinessCheckResult,\n} from './types.js';\n\nexport class LifecycleManager {\n private _phase: LifecyclePhase = LifecyclePhase.CREATED;\n private config: LifecycleConfig;\n\n private initHooks: LifecycleHook[] = [];\n private startHooks: LifecycleHook[] = [];\n private readyHooks: LifecycleHook[] = [];\n private beforeShutdownHooks: LifecycleHook[] = [];\n private shutdownHooks: LifecycleHook[] = [];\n\n private disposables = new Set<Disposable>();\n private intervals = new Set<NodeJS.Timeout>();\n private timeouts = new Set<NodeJS.Timeout>();\n private abortControllers = new Set<AbortController>();\n\n private readinessChecks = new Map<string, ReadinessCheck>();\n private _isReady = false;\n\n constructor(config: Partial<LifecycleConfig> = {}) {\n this.config = {\n gracefulShutdown: {\n timeoutMs: config.gracefulShutdown?.timeoutMs ?? 10000,\n },\n readiness: {\n timeoutMs: config.readiness?.timeoutMs ?? 30000,\n checkIntervalMs: config.readiness?.checkIntervalMs ?? 100,\n },\n };\n }\n\n get phase(): LifecyclePhase {\n return this._phase;\n }\n\n get isShuttingDown(): boolean {\n return this._phase === LifecyclePhase.STOPPING || this._phase === LifecyclePhase.STOPPED;\n }\n\n get isReady(): boolean {\n return this._isReady && this._phase === LifecyclePhase.RUNNING;\n }\n\n onInit(fn: LifecycleHook): () => void {\n this.initHooks.push(fn);\n return () => {\n const i = this.initHooks.indexOf(fn);\n if (i >= 0) this.initHooks.splice(i, 1);\n };\n }\n\n onStart(fn: LifecycleHook): () => void {\n this.startHooks.push(fn);\n return () => {\n const i = this.startHooks.indexOf(fn);\n if (i >= 0) this.startHooks.splice(i, 1);\n };\n }\n\n onReady(fn: LifecycleHook): () => void {\n this.readyHooks.push(fn);\n return () => {\n const i = this.readyHooks.indexOf(fn);\n if (i >= 0) this.readyHooks.splice(i, 1);\n };\n }\n\n onBeforeShutdown(fn: LifecycleHook): () => void {\n this.beforeShutdownHooks.push(fn);\n return () => {\n const i = this.beforeShutdownHooks.indexOf(fn);\n if (i >= 0) this.beforeShutdownHooks.splice(i, 1);\n };\n }\n\n onShutdown(fn: LifecycleHook): () => void {\n this.shutdownHooks.push(fn);\n return () => {\n const i = this.shutdownHooks.indexOf(fn);\n if (i >= 0) this.shutdownHooks.splice(i, 1);\n };\n }\n\n addReadinessCheck(name: string, check: ReadinessCheck): () => void {\n this.readinessChecks.set(name, check);\n return () => {\n this.readinessChecks.delete(name);\n };\n }\n\n trackDisposable(disposable: Disposable | { dispose: Function }): Disposable {\n const d: Disposable = 'dispose' in disposable ? { dispose: () => (disposable as any).dispose() } : disposable;\n this.disposables.add(d);\n return d;\n }\n\n trackInterval(id: NodeJS.Timeout): NodeJS.Timeout {\n this.intervals.add(id);\n return id;\n }\n\n trackTimeout(id: NodeJS.Timeout): NodeJS.Timeout {\n this.timeouts.add(id);\n return id;\n }\n\n /**\n * Track an AbortController for automatic cleanup on shutdown.\n * When the lifecycle manager shuts down, it will call abort() on all tracked controllers.\n * @param controller - The AbortController to track\n * @returns The same AbortController for chaining\n */\n trackAbortController(controller: AbortController): AbortController {\n this.abortControllers.add(controller);\n return controller;\n }\n\n /**\n * Create and track a new AbortController.\n * Convenience method that creates a new controller and automatically tracks it.\n * @returns A new tracked AbortController\n */\n createAbortController(): AbortController {\n const controller = new AbortController();\n return this.trackAbortController(controller);\n }\n\n async initialize(): Promise<{ errors: unknown[] }> {\n if (this._phase !== LifecyclePhase.CREATED) {\n return { errors: [] };\n }\n this._phase = LifecyclePhase.INITIALIZING;\n\n const errors = await this.executeHooks(this.initHooks, 'init');\n return { errors };\n }\n\n async start(): Promise<{ errors: unknown[] }> {\n if (this._phase !== LifecyclePhase.INITIALIZING) {\n return { errors: [] };\n }\n this._phase = LifecyclePhase.STARTING;\n\n const errors = await this.executeHooks(this.startHooks, 'start');\n return { errors };\n }\n\n async ready(): Promise<{ errors: unknown[] }> {\n if (this._phase !== LifecyclePhase.STARTING) {\n return { errors: [] };\n }\n this._phase = LifecyclePhase.RUNNING;\n\n const errors = await this.executeHooks(this.readyHooks, 'ready');\n\n // Wait for readiness checks to pass\n const readinessResult = await this.waitForReadiness();\n if (readinessResult.errors.length > 0) {\n errors.push(...readinessResult.errors);\n }\n this._isReady = readinessResult.ready;\n\n return { errors };\n }\n\n async shutdown(): Promise<{ errors: unknown[]; timedOut: boolean }> {\n if (this.isShuttingDown) {\n return { errors: [], timedOut: false };\n }\n this._phase = LifecyclePhase.STOPPING;\n\n const timeoutMs = this.config.gracefulShutdown.timeoutMs;\n if (timeoutMs > 0) {\n let completed = false;\n let timedOut = false;\n const shutdownPromise = this.performShutdown().then(result => {\n completed = true;\n return result;\n });\n const timeoutPromise = new Promise<{ errors: unknown[] }>(resolve => {\n setTimeout(() => {\n if (!completed) {\n timedOut = true;\n resolve({ errors: ['Shutdown timeout exceeded'] });\n }\n }, timeoutMs);\n });\n const result = await Promise.race([shutdownPromise, timeoutPromise]);\n this._phase = LifecyclePhase.STOPPED;\n return { errors: result.errors, timedOut };\n }\n\n const result = await this.performShutdown();\n this._phase = LifecyclePhase.STOPPED;\n return { errors: result.errors, timedOut: false };\n }\n\n private async performShutdown(): Promise<{ errors: unknown[] }> {\n const errors: unknown[] = [];\n\n // Execute before-shutdown hooks in registration order (FIFO)\n const beforeShutdownErrors = await this.executeHooks(this.beforeShutdownHooks, 'before-shutdown');\n errors.push(...beforeShutdownErrors);\n\n // Abort all tracked AbortControllers\n for (const controller of this.abortControllers) {\n try {\n controller.abort();\n } catch (e) {\n errors.push(e);\n }\n }\n this.abortControllers.clear();\n\n // Clear intervals and timeouts\n for (const id of this.intervals) {\n clearInterval(id);\n }\n for (const id of this.timeouts) {\n clearTimeout(id);\n }\n this.intervals.clear();\n this.timeouts.clear();\n\n // Dispose of tracked disposables\n for (const disposable of this.disposables) {\n try {\n await disposable.dispose();\n } catch (e) {\n errors.push(e);\n }\n }\n this.disposables.clear();\n\n // Execute shutdown hooks in reverse registration order (LIFO)\n const shutdownErrors = await this.executeHooks([...this.shutdownHooks].reverse(), 'shutdown');\n errors.push(...shutdownErrors);\n\n return { errors };\n }\n\n private async executeHooks(hooks: LifecycleHook[], _phase: string): Promise<unknown[]> {\n const errors: unknown[] = [];\n for (const hook of hooks) {\n try {\n await hook();\n } catch (e) {\n errors.push(e);\n }\n }\n return errors;\n }\n\n private async waitForReadiness(): Promise<{ ready: boolean; errors: unknown[] }> {\n if (this.readinessChecks.size === 0) {\n return { ready: true, errors: [] };\n }\n\n const timeoutMs = this.config.readiness?.timeoutMs ?? 30000;\n const checkIntervalMs = this.config.readiness?.checkIntervalMs ?? 100;\n const startTime = Date.now();\n const errors: unknown[] = [];\n\n while (Date.now() - startTime < timeoutMs) {\n const results = await this.executeReadinessChecks();\n const allReady = results.every(r => r.ready);\n\n if (allReady) {\n return { ready: true, errors };\n }\n\n // Collect unique errors from failed checks\n for (const result of results) {\n if (!result.ready && result.error) {\n const errorMessage = result.error.message;\n if (!errors.some(e => (e as Error)?.message === errorMessage)) {\n errors.push(result.error);\n }\n }\n }\n\n // Wait before next check\n await new Promise(resolve => setTimeout(resolve, checkIntervalMs));\n }\n\n return { ready: false, errors: [...errors, new Error('Readiness check timeout exceeded')] };\n }\n\n private async executeReadinessChecks(): Promise<ReadinessCheckResult[]> {\n const checkEntries = Array.from(this.readinessChecks.entries());\n\n const settledResults = await Promise.allSettled(\n checkEntries.map(async ([name, check]) => {\n try {\n const result = await check();\n return { name, ready: result };\n } catch (error) {\n return { name, ready: false, error: error as Error };\n }\n }),\n );\n\n return settledResults.map((settledResult, index) => {\n const checkEntry = checkEntries.at(index);\n if (!checkEntry) {\n throw new Error(`Missing check entry at index ${index}`);\n }\n const [name] = checkEntry;\n\n if (settledResult.status === 'fulfilled') {\n return settledResult.value;\n }\n\n return {\n name,\n ready: false,\n error: settledResult.reason as Error,\n };\n });\n }\n\n async getReadinessStatus(): Promise<{ ready: boolean; checks: ReadinessCheckResult[] }> {\n const checks = await this.executeReadinessChecks();\n const ready = this._isReady && this._phase === LifecyclePhase.RUNNING && checks.every(c => c.ready);\n return { ready, checks };\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n type Disposable,\n type LifecycleConfig,\n type LifecycleHook,\n LifecyclePhase,\n type ReadinessCheck,\n type ReadinessCheckResult,\n} from './types.js';\n\nexport class LifecycleManager {\n private _phase: LifecyclePhase = LifecyclePhase.CREATED;\n private config: LifecycleConfig;\n\n private initHooks: LifecycleHook[] = [];\n private startHooks: LifecycleHook[] = [];\n private readyHooks: LifecycleHook[] = [];\n private beforeShutdownHooks: LifecycleHook[] = [];\n private shutdownHooks: LifecycleHook[] = [];\n\n private disposables = new Set<Disposable>();\n private intervals = new Set<NodeJS.Timeout>();\n private timeouts = new Set<NodeJS.Timeout>();\n private abortControllers = new Set<AbortController>();\n\n private readinessChecks = new Map<string, ReadinessCheck>();\n private _isReady = false;\n\n constructor(config: Partial<LifecycleConfig> = {}) {\n this.config = {\n gracefulShutdown: {\n timeoutMs: config.gracefulShutdown?.timeoutMs ?? 10000,\n },\n readiness: {\n timeoutMs: config.readiness?.timeoutMs ?? 30000,\n checkIntervalMs: config.readiness?.checkIntervalMs ?? 100,\n },\n };\n }\n\n get phase(): LifecyclePhase {\n return this._phase;\n }\n\n get isShuttingDown(): boolean {\n return this._phase === LifecyclePhase.STOPPING || this._phase === LifecyclePhase.STOPPED;\n }\n\n get isReady(): boolean {\n return this._isReady && this._phase === LifecyclePhase.RUNNING;\n }\n\n onInit(fn: LifecycleHook): () => void {\n this.initHooks.push(fn);\n return () => {\n const i = this.initHooks.indexOf(fn);\n if (i >= 0) this.initHooks.splice(i, 1);\n };\n }\n\n onStart(fn: LifecycleHook): () => void {\n this.startHooks.push(fn);\n return () => {\n const i = this.startHooks.indexOf(fn);\n if (i >= 0) this.startHooks.splice(i, 1);\n };\n }\n\n onReady(fn: LifecycleHook): () => void {\n this.readyHooks.push(fn);\n return () => {\n const i = this.readyHooks.indexOf(fn);\n if (i >= 0) this.readyHooks.splice(i, 1);\n };\n }\n\n onBeforeShutdown(fn: LifecycleHook): () => void {\n this.beforeShutdownHooks.push(fn);\n return () => {\n const i = this.beforeShutdownHooks.indexOf(fn);\n if (i >= 0) this.beforeShutdownHooks.splice(i, 1);\n };\n }\n\n onShutdown(fn: LifecycleHook): () => void {\n this.shutdownHooks.push(fn);\n return () => {\n const i = this.shutdownHooks.indexOf(fn);\n if (i >= 0) this.shutdownHooks.splice(i, 1);\n };\n }\n\n addReadinessCheck(name: string, check: ReadinessCheck): () => void {\n this.readinessChecks.set(name, check);\n return () => {\n this.readinessChecks.delete(name);\n };\n }\n\n trackDisposable(disposable: Disposable | { dispose: () => void | Promise<void> }): Disposable {\n const d: Disposable =\n 'dispose' in disposable ? { dispose: () => (disposable as { dispose: () => void }).dispose() } : disposable;\n this.disposables.add(d);\n return d;\n }\n\n trackInterval(id: NodeJS.Timeout): NodeJS.Timeout {\n this.intervals.add(id);\n return id;\n }\n\n trackTimeout(id: NodeJS.Timeout): NodeJS.Timeout {\n this.timeouts.add(id);\n return id;\n }\n\n /**\n * Track an AbortController for automatic cleanup on shutdown.\n * When the lifecycle manager shuts down, it will call abort() on all tracked controllers.\n * @param controller - The AbortController to track\n * @returns The same AbortController for chaining\n */\n trackAbortController(controller: AbortController): AbortController {\n this.abortControllers.add(controller);\n return controller;\n }\n\n /**\n * Create and track a new AbortController.\n * Convenience method that creates a new controller and automatically tracks it.\n * @returns A new tracked AbortController\n */\n createAbortController(): AbortController {\n const controller = new AbortController();\n return this.trackAbortController(controller);\n }\n\n async initialize(): Promise<{ errors: unknown[] }> {\n if (this._phase !== LifecyclePhase.CREATED) {\n return { errors: [] };\n }\n this._phase = LifecyclePhase.INITIALIZING;\n\n const errors = await this.executeHooks(this.initHooks, 'init');\n return { errors };\n }\n\n async start(): Promise<{ errors: unknown[] }> {\n if (this._phase !== LifecyclePhase.INITIALIZING) {\n return { errors: [] };\n }\n this._phase = LifecyclePhase.STARTING;\n\n const errors = await this.executeHooks(this.startHooks, 'start');\n return { errors };\n }\n\n async ready(): Promise<{ errors: unknown[] }> {\n if (this._phase !== LifecyclePhase.STARTING) {\n return { errors: [] };\n }\n this._phase = LifecyclePhase.RUNNING;\n\n const errors = await this.executeHooks(this.readyHooks, 'ready');\n\n // Wait for readiness checks to pass\n const readinessResult = await this.waitForReadiness();\n if (readinessResult.errors.length > 0) {\n errors.push(...readinessResult.errors);\n }\n this._isReady = readinessResult.ready;\n\n return { errors };\n }\n\n async shutdown(): Promise<{ errors: unknown[]; timedOut: boolean }> {\n if (this.isShuttingDown) {\n return { errors: [], timedOut: false };\n }\n this._phase = LifecyclePhase.STOPPING;\n\n const timeoutMs = this.config.gracefulShutdown.timeoutMs;\n if (timeoutMs > 0) {\n let completed = false;\n let timedOut = false;\n const shutdownPromise = this.performShutdown().then(result => {\n completed = true;\n return result;\n });\n const timeoutPromise = new Promise<{ errors: unknown[] }>(resolve => {\n setTimeout(() => {\n if (!completed) {\n timedOut = true;\n resolve({ errors: ['Shutdown timeout exceeded'] });\n }\n }, timeoutMs);\n });\n const result = await Promise.race([shutdownPromise, timeoutPromise]);\n this._phase = LifecyclePhase.STOPPED;\n return { errors: result.errors, timedOut };\n }\n\n const result = await this.performShutdown();\n this._phase = LifecyclePhase.STOPPED;\n return { errors: result.errors, timedOut: false };\n }\n\n private async performShutdown(): Promise<{ errors: unknown[] }> {\n const errors: unknown[] = [];\n\n // Execute before-shutdown hooks in registration order (FIFO)\n const beforeShutdownErrors = await this.executeHooks(this.beforeShutdownHooks, 'before-shutdown');\n errors.push(...beforeShutdownErrors);\n\n // Abort all tracked AbortControllers\n for (const controller of this.abortControllers) {\n try {\n controller.abort();\n } catch (e) {\n errors.push(e);\n }\n }\n this.abortControllers.clear();\n\n // Clear intervals and timeouts\n for (const id of this.intervals) {\n clearInterval(id);\n }\n for (const id of this.timeouts) {\n clearTimeout(id);\n }\n this.intervals.clear();\n this.timeouts.clear();\n\n // Dispose of tracked disposables\n for (const disposable of this.disposables) {\n try {\n await disposable.dispose();\n } catch (e) {\n errors.push(e);\n }\n }\n this.disposables.clear();\n\n // Execute shutdown hooks in reverse registration order (LIFO)\n const shutdownErrors = await this.executeHooks([...this.shutdownHooks].reverse(), 'shutdown');\n errors.push(...shutdownErrors);\n\n return { errors };\n }\n\n private async executeHooks(hooks: LifecycleHook[], _phase: string): Promise<unknown[]> {\n const errors: unknown[] = [];\n for (const hook of hooks) {\n try {\n await hook();\n } catch (e) {\n errors.push(e);\n }\n }\n return errors;\n }\n\n private async waitForReadiness(): Promise<{ ready: boolean; errors: unknown[] }> {\n if (this.readinessChecks.size === 0) {\n return { ready: true, errors: [] };\n }\n\n const timeoutMs = this.config.readiness?.timeoutMs ?? 30000;\n const checkIntervalMs = this.config.readiness?.checkIntervalMs ?? 100;\n const startTime = Date.now();\n const errors: unknown[] = [];\n\n while (Date.now() - startTime < timeoutMs) {\n const results = await this.executeReadinessChecks();\n const allReady = results.every(r => r.ready);\n\n if (allReady) {\n return { ready: true, errors };\n }\n\n // Collect unique errors from failed checks\n for (const result of results) {\n if (!result.ready && result.error) {\n const errorMessage = result.error.message;\n if (!errors.some(e => (e as Error)?.message === errorMessage)) {\n errors.push(result.error);\n }\n }\n }\n\n // Wait before next check\n await new Promise(resolve => setTimeout(resolve, checkIntervalMs));\n }\n\n return { ready: false, errors: [...errors, new Error('Readiness check timeout exceeded')] };\n }\n\n private async executeReadinessChecks(): Promise<ReadinessCheckResult[]> {\n const checkEntries = Array.from(this.readinessChecks.entries());\n\n const settledResults = await Promise.allSettled(\n checkEntries.map(async ([name, check]) => {\n try {\n const result = await check();\n return { name, ready: result };\n } catch (error) {\n return { name, ready: false, error: error as Error };\n }\n }),\n );\n\n return settledResults.map((settledResult, index) => {\n const checkEntry = checkEntries.at(index);\n if (!checkEntry) {\n throw new Error(`Missing check entry at index ${index}`);\n }\n const [name] = checkEntry;\n\n if (settledResult.status === 'fulfilled') {\n return settledResult.value;\n }\n\n return {\n name,\n ready: false,\n error: settledResult.reason as Error,\n };\n });\n }\n\n async getReadinessStatus(): Promise<{ ready: boolean; checks: ReadinessCheckResult[] }> {\n const checks = await this.executeReadinessChecks();\n const ready = this._isReady && this._phase === LifecyclePhase.RUNNING && checks.every(c => c.ready);\n return { ready, checks };\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["result"]
7
7
  }
@@ -79,7 +79,27 @@ class Logger {
79
79
  meta["Worker"] = cluster.worker.id;
80
80
  }
81
81
  const metaString = Object.entries(meta).map(([key, value]) => {
82
- return `${key}: ${value}`;
82
+ let stringValue;
83
+ if (value === null) {
84
+ stringValue = "null";
85
+ } else if (value === void 0) {
86
+ stringValue = "undefined";
87
+ } else if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
88
+ stringValue = String(value);
89
+ } else if (value instanceof Error) {
90
+ stringValue = value.message;
91
+ } else if (value instanceof Promise) {
92
+ stringValue = "[Promise]";
93
+ } else if (typeof value === "object") {
94
+ try {
95
+ stringValue = JSON.stringify(value);
96
+ } catch {
97
+ stringValue = "[Object]";
98
+ }
99
+ } else {
100
+ stringValue = String(value);
101
+ }
102
+ return `${key}: ${stringValue}`;
83
103
  }).join(" | ");
84
104
  if (level === "error") {
85
105
  if (this.isSentryInitialized) {