@zintrust/core 0.1.42 → 0.1.43
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.
- package/app/Controllers/AuthController.d.ts +10 -0
- package/app/Controllers/AuthController.d.ts.map +1 -0
- package/app/Controllers/AuthController.js +201 -0
- package/app/Controllers/UserController.d.ts +9 -0
- package/app/Controllers/UserController.d.ts.map +1 -0
- package/app/Controllers/UserController.js +8 -0
- package/app/Controllers/UserQueryBuilderController.d.ts +16 -0
- package/app/Controllers/UserQueryBuilderController.d.ts.map +1 -0
- package/app/Controllers/UserQueryBuilderController.js +404 -0
- package/app/Middleware/ProfilerMiddleware.d.ts +12 -0
- package/app/Middleware/ProfilerMiddleware.d.ts.map +1 -0
- package/app/Middleware/ProfilerMiddleware.js +47 -0
- package/app/Middleware/index.d.ts +59 -0
- package/app/Middleware/index.d.ts.map +1 -0
- package/app/Middleware/index.js +215 -0
- package/app/Models/Post.d.ts +14 -0
- package/app/Models/Post.d.ts.map +1 -0
- package/app/Models/Post.js +27 -0
- package/app/Models/User.d.ts +14 -0
- package/app/Models/User.d.ts.map +1 -0
- package/app/Models/User.js +44 -0
- package/app/Schedules/JobTracking.d.ts +3 -0
- package/app/Schedules/JobTracking.d.ts.map +1 -0
- package/app/Schedules/JobTracking.js +13 -0
- package/app/Schedules/index.d.ts +2 -0
- package/app/Schedules/index.d.ts.map +1 -0
- package/app/Schedules/index.js +1 -0
- package/app/Toolkit/Broadcast/sendBroadcast.d.ts +6 -0
- package/app/Toolkit/Broadcast/sendBroadcast.d.ts.map +1 -0
- package/app/Toolkit/Broadcast/sendBroadcast.js +5 -0
- package/app/Toolkit/Mail/sendWelcomeEmail.d.ts +6 -0
- package/app/Toolkit/Mail/sendWelcomeEmail.d.ts.map +1 -0
- package/app/Toolkit/Mail/sendWelcomeEmail.js +20 -0
- package/app/Toolkit/Notification/sendSlackNotification.d.ts +8 -0
- package/app/Toolkit/Notification/sendSlackNotification.d.ts.map +1 -0
- package/app/Toolkit/Notification/sendSlackNotification.js +5 -0
- package/app/Toolkit/Notification/sendSms.d.ts +6 -0
- package/app/Toolkit/Notification/sendSms.d.ts.map +1 -0
- package/app/Toolkit/Notification/sendSms.js +5 -0
- package/app/Types/controller.d.ts +42 -0
- package/app/Types/controller.d.ts.map +1 -0
- package/app/Types/controller.js +1 -0
- package/config/broadcast.d.ts +38 -0
- package/config/broadcast.d.ts.map +1 -0
- package/config/broadcast.js +37 -0
- package/config/cache.d.ts +40 -0
- package/config/cache.d.ts.map +1 -0
- package/config/cache.js +39 -0
- package/config/database.d.ts +58 -0
- package/config/database.d.ts.map +1 -0
- package/config/database.js +65 -0
- package/config/mail.d.ts +51 -0
- package/config/mail.d.ts.map +1 -0
- package/config/mail.js +69 -0
- package/config/middleware.d.ts +11 -0
- package/config/middleware.d.ts.map +1 -0
- package/config/middleware.js +30 -0
- package/config/notification.d.ts +33 -0
- package/config/notification.d.ts.map +1 -0
- package/config/notification.js +33 -0
- package/config/queue.d.ts +55 -0
- package/config/queue.d.ts.map +1 -0
- package/config/queue.js +87 -0
- package/config/storage.d.ts +59 -0
- package/config/storage.d.ts.map +1 -0
- package/config/storage.js +59 -0
- package/config/workers.d.ts +54 -0
- package/config/workers.d.ts.map +1 -0
- package/config/workers.js +83 -0
- package/package.json +11 -5
- package/packages/cloudflare-d1-proxy/src/index.d.ts +48 -0
- package/packages/cloudflare-d1-proxy/src/index.d.ts.map +1 -0
- package/packages/cloudflare-d1-proxy/src/index.js +387 -0
- package/packages/cloudflare-kv-proxy/src/index.d.ts +44 -0
- package/packages/cloudflare-kv-proxy/src/index.d.ts.map +1 -0
- package/packages/cloudflare-kv-proxy/src/index.js +325 -0
- package/packages/queue-monitor/src/QueueMonitoringService.d.ts +35 -0
- package/packages/queue-monitor/src/QueueMonitoringService.d.ts.map +1 -0
- package/packages/queue-monitor/src/QueueMonitoringService.js +194 -0
- package/packages/queue-monitor/src/connection.d.ts +3 -0
- package/packages/queue-monitor/src/connection.d.ts.map +1 -0
- package/packages/queue-monitor/src/connection.js +1 -0
- package/packages/queue-monitor/src/dashboard-ui.d.ts +7 -0
- package/packages/queue-monitor/src/dashboard-ui.d.ts.map +1 -0
- package/packages/queue-monitor/src/dashboard-ui.js +997 -0
- package/packages/queue-monitor/src/driver.d.ts +15 -0
- package/packages/queue-monitor/src/driver.d.ts.map +1 -0
- package/packages/queue-monitor/src/driver.js +115 -0
- package/packages/queue-monitor/src/index.d.ts +71 -0
- package/packages/queue-monitor/src/index.d.ts.map +1 -0
- package/packages/queue-monitor/src/index.js +296 -0
- package/packages/queue-monitor/src/metrics.d.ts +27 -0
- package/packages/queue-monitor/src/metrics.d.ts.map +1 -0
- package/packages/queue-monitor/src/metrics.js +92 -0
- package/packages/queue-monitor/src/worker.d.ts +8 -0
- package/packages/queue-monitor/src/worker.d.ts.map +1 -0
- package/packages/queue-monitor/src/worker.js +35 -0
- package/packages/queue-redis/src/BullMQRedisQueue.d.ts +26 -0
- package/packages/queue-redis/src/BullMQRedisQueue.d.ts.map +1 -0
- package/packages/queue-redis/src/BullMQRedisQueue.js +463 -0
- package/packages/queue-redis/src/HttpQueueDriver.d.ts +18 -0
- package/packages/queue-redis/src/HttpQueueDriver.d.ts.map +1 -0
- package/packages/queue-redis/src/HttpQueueDriver.js +249 -0
- package/packages/queue-redis/src/QueueHttpGateway.d.ts +16 -0
- package/packages/queue-redis/src/QueueHttpGateway.d.ts.map +1 -0
- package/packages/queue-redis/src/QueueHttpGateway.js +217 -0
- package/packages/queue-redis/src/RedisPublishClient.d.ts +14 -0
- package/packages/queue-redis/src/RedisPublishClient.d.ts.map +1 -0
- package/packages/queue-redis/src/RedisPublishClient.js +251 -0
- package/packages/queue-redis/src/index.d.ts +12 -0
- package/packages/queue-redis/src/index.d.ts.map +1 -0
- package/packages/queue-redis/src/index.js +10 -0
- package/packages/queue-redis/src/register.d.ts +6 -0
- package/packages/queue-redis/src/register.d.ts.map +1 -0
- package/packages/queue-redis/src/register.js +21 -0
- package/packages/workers/migrations/20260119100000_create_zintrust_workers_table.d.ts +11 -0
- package/packages/workers/migrations/20260119100000_create_zintrust_workers_table.d.ts.map +1 -0
- package/packages/workers/migrations/20260119100000_create_zintrust_workers_table.js +32 -0
- package/packages/workers/migrations/20260123180000_create_queue_jobs_table.d.ts +11 -0
- package/packages/workers/migrations/20260123180000_create_queue_jobs_table.d.ts.map +1 -0
- package/packages/workers/migrations/20260123180000_create_queue_jobs_table.js +46 -0
- package/packages/workers/migrations/20260213142000_create_zintrust_job_tracking_tables.d.ts +7 -0
- package/packages/workers/migrations/20260213142000_create_zintrust_job_tracking_tables.d.ts.map +1 -0
- package/packages/workers/migrations/20260213142000_create_zintrust_job_tracking_tables.js +44 -0
- package/packages/workers/migrations/20260213183000_expand_zintrust_job_tracking_reliability_tables.d.ts +7 -0
- package/packages/workers/migrations/20260213183000_expand_zintrust_job_tracking_reliability_tables.d.ts.map +1 -0
- package/packages/workers/migrations/20260213183000_expand_zintrust_job_tracking_reliability_tables.js +104 -0
- package/packages/workers/src/AnomalyDetection.d.ts +107 -0
- package/packages/workers/src/AnomalyDetection.d.ts.map +1 -0
- package/packages/workers/src/AnomalyDetection.js +329 -0
- package/packages/workers/src/AutoScaler.d.ts +128 -0
- package/packages/workers/src/AutoScaler.d.ts.map +1 -0
- package/packages/workers/src/AutoScaler.js +425 -0
- package/packages/workers/src/BroadcastWorker.d.ts +24 -0
- package/packages/workers/src/BroadcastWorker.d.ts.map +1 -0
- package/packages/workers/src/BroadcastWorker.js +24 -0
- package/packages/workers/src/CanaryController.d.ts +104 -0
- package/packages/workers/src/CanaryController.d.ts.map +1 -0
- package/packages/workers/src/CanaryController.js +424 -0
- package/packages/workers/src/ChaosEngineering.d.ts +80 -0
- package/packages/workers/src/ChaosEngineering.d.ts.map +1 -0
- package/packages/workers/src/ChaosEngineering.js +229 -0
- package/packages/workers/src/CircuitBreaker.d.ts +107 -0
- package/packages/workers/src/CircuitBreaker.d.ts.map +1 -0
- package/packages/workers/src/CircuitBreaker.js +374 -0
- package/packages/workers/src/ClusterLock.d.ts +91 -0
- package/packages/workers/src/ClusterLock.d.ts.map +1 -0
- package/packages/workers/src/ClusterLock.js +397 -0
- package/packages/workers/src/ComplianceManager.d.ts +178 -0
- package/packages/workers/src/ComplianceManager.d.ts.map +1 -0
- package/packages/workers/src/ComplianceManager.js +556 -0
- package/packages/workers/src/DatacenterOrchestrator.d.ts +134 -0
- package/packages/workers/src/DatacenterOrchestrator.d.ts.map +1 -0
- package/packages/workers/src/DatacenterOrchestrator.js +404 -0
- package/packages/workers/src/DeadLetterQueue.d.ts +123 -0
- package/packages/workers/src/DeadLetterQueue.d.ts.map +1 -0
- package/packages/workers/src/DeadLetterQueue.js +544 -0
- package/packages/workers/src/HealthMonitor.d.ts +43 -0
- package/packages/workers/src/HealthMonitor.d.ts.map +1 -0
- package/packages/workers/src/HealthMonitor.js +312 -0
- package/packages/workers/src/MultiQueueWorker.d.ts +90 -0
- package/packages/workers/src/MultiQueueWorker.d.ts.map +1 -0
- package/packages/workers/src/MultiQueueWorker.js +282 -0
- package/packages/workers/src/NotificationWorker.d.ts +24 -0
- package/packages/workers/src/NotificationWorker.d.ts.map +1 -0
- package/packages/workers/src/NotificationWorker.js +23 -0
- package/packages/workers/src/Observability.d.ts +154 -0
- package/packages/workers/src/Observability.d.ts.map +1 -0
- package/packages/workers/src/Observability.js +538 -0
- package/packages/workers/src/PluginManager.d.ts +124 -0
- package/packages/workers/src/PluginManager.d.ts.map +1 -0
- package/packages/workers/src/PluginManager.js +392 -0
- package/packages/workers/src/PriorityQueue.d.ts +118 -0
- package/packages/workers/src/PriorityQueue.d.ts.map +1 -0
- package/packages/workers/src/PriorityQueue.js +276 -0
- package/packages/workers/src/ResourceMonitor.d.ts +165 -0
- package/packages/workers/src/ResourceMonitor.d.ts.map +1 -0
- package/packages/workers/src/ResourceMonitor.js +632 -0
- package/packages/workers/src/SLAMonitor.d.ts +111 -0
- package/packages/workers/src/SLAMonitor.d.ts.map +1 -0
- package/packages/workers/src/SLAMonitor.js +274 -0
- package/packages/workers/src/WorkerFactory.d.ts +218 -0
- package/packages/workers/src/WorkerFactory.d.ts.map +1 -0
- package/packages/workers/src/WorkerFactory.js +2253 -0
- package/packages/workers/src/WorkerInit.d.ts +86 -0
- package/packages/workers/src/WorkerInit.d.ts.map +1 -0
- package/packages/workers/src/WorkerInit.js +307 -0
- package/packages/workers/src/WorkerMetrics.d.ts +116 -0
- package/packages/workers/src/WorkerMetrics.d.ts.map +1 -0
- package/packages/workers/src/WorkerMetrics.js +570 -0
- package/packages/workers/src/WorkerRegistry.d.ts +152 -0
- package/packages/workers/src/WorkerRegistry.d.ts.map +1 -0
- package/packages/workers/src/WorkerRegistry.js +396 -0
- package/packages/workers/src/WorkerShutdown.d.ts +70 -0
- package/packages/workers/src/WorkerShutdown.d.ts.map +1 -0
- package/packages/workers/src/WorkerShutdown.js +185 -0
- package/packages/workers/src/WorkerVersioning.d.ts +108 -0
- package/packages/workers/src/WorkerVersioning.d.ts.map +1 -0
- package/packages/workers/src/WorkerVersioning.js +300 -0
- package/packages/workers/src/config/workerConfig.d.ts +5 -0
- package/packages/workers/src/config/workerConfig.d.ts.map +1 -0
- package/packages/workers/src/config/workerConfig.js +25 -0
- package/packages/workers/src/createQueueWorker.d.ts +26 -0
- package/packages/workers/src/createQueueWorker.d.ts.map +1 -0
- package/packages/workers/src/createQueueWorker.js +367 -0
- package/packages/workers/src/dashboard/index.d.ts +2 -0
- package/packages/workers/src/dashboard/index.d.ts.map +1 -0
- package/packages/workers/src/dashboard/index.js +1 -0
- package/packages/workers/src/dashboard/types.d.ts +123 -0
- package/packages/workers/src/dashboard/types.d.ts.map +1 -0
- package/packages/workers/src/dashboard/types.js +1 -0
- package/packages/workers/src/dashboard/workers-api.d.ts +5 -0
- package/packages/workers/src/dashboard/workers-api.d.ts.map +1 -0
- package/packages/workers/src/dashboard/workers-api.js +738 -0
- package/packages/workers/src/helper/index.d.ts +6 -0
- package/packages/workers/src/helper/index.d.ts.map +1 -0
- package/packages/workers/src/helper/index.js +10 -0
- package/packages/workers/src/http/WorkerApiController.d.ts +39 -0
- package/packages/workers/src/http/WorkerApiController.d.ts.map +1 -0
- package/packages/workers/src/http/WorkerApiController.js +313 -0
- package/packages/workers/src/http/WorkerController.d.ts +375 -0
- package/packages/workers/src/http/WorkerController.d.ts.map +1 -0
- package/packages/workers/src/http/WorkerController.js +1454 -0
- package/packages/workers/src/http/WorkerMonitoringService.d.ts +12 -0
- package/packages/workers/src/http/WorkerMonitoringService.d.ts.map +1 -0
- package/packages/workers/src/http/WorkerMonitoringService.js +89 -0
- package/packages/workers/src/http/middleware/CustomValidation.d.ts +93 -0
- package/packages/workers/src/http/middleware/CustomValidation.d.ts.map +1 -0
- package/packages/workers/src/http/middleware/CustomValidation.js +270 -0
- package/packages/workers/src/http/middleware/DatacenterValidator.d.ts +4 -0
- package/packages/workers/src/http/middleware/DatacenterValidator.d.ts.map +1 -0
- package/packages/workers/src/http/middleware/DatacenterValidator.js +94 -0
- package/packages/workers/src/http/middleware/EditWorkerValidation.d.ts +8 -0
- package/packages/workers/src/http/middleware/EditWorkerValidation.d.ts.map +1 -0
- package/packages/workers/src/http/middleware/EditWorkerValidation.js +56 -0
- package/packages/workers/src/http/middleware/FeaturesValidator.d.ts +4 -0
- package/packages/workers/src/http/middleware/FeaturesValidator.d.ts.map +1 -0
- package/packages/workers/src/http/middleware/FeaturesValidator.js +60 -0
- package/packages/workers/src/http/middleware/InfrastructureValidator.d.ts +32 -0
- package/packages/workers/src/http/middleware/InfrastructureValidator.d.ts.map +1 -0
- package/packages/workers/src/http/middleware/InfrastructureValidator.js +226 -0
- package/packages/workers/src/http/middleware/OptionsValidator.d.ts +4 -0
- package/packages/workers/src/http/middleware/OptionsValidator.d.ts.map +1 -0
- package/packages/workers/src/http/middleware/OptionsValidator.js +112 -0
- package/packages/workers/src/http/middleware/PayloadSanitizer.d.ts +8 -0
- package/packages/workers/src/http/middleware/PayloadSanitizer.d.ts.map +1 -0
- package/packages/workers/src/http/middleware/PayloadSanitizer.js +42 -0
- package/packages/workers/src/http/middleware/ProcessorPathSanitizer.d.ts +4 -0
- package/packages/workers/src/http/middleware/ProcessorPathSanitizer.d.ts.map +1 -0
- package/packages/workers/src/http/middleware/ProcessorPathSanitizer.js +140 -0
- package/packages/workers/src/http/middleware/QueueNameSanitizer.d.ts +4 -0
- package/packages/workers/src/http/middleware/QueueNameSanitizer.d.ts.map +1 -0
- package/packages/workers/src/http/middleware/QueueNameSanitizer.js +45 -0
- package/packages/workers/src/http/middleware/ValidateDriver.d.ts +8 -0
- package/packages/workers/src/http/middleware/ValidateDriver.d.ts.map +1 -0
- package/packages/workers/src/http/middleware/ValidateDriver.js +20 -0
- package/packages/workers/src/http/middleware/VersionSanitizer.d.ts +4 -0
- package/packages/workers/src/http/middleware/VersionSanitizer.d.ts.map +1 -0
- package/packages/workers/src/http/middleware/VersionSanitizer.js +25 -0
- package/packages/workers/src/http/middleware/WorkerNameSanitizer.d.ts +4 -0
- package/packages/workers/src/http/middleware/WorkerNameSanitizer.d.ts.map +1 -0
- package/packages/workers/src/http/middleware/WorkerNameSanitizer.js +46 -0
- package/packages/workers/src/http/middleware/WorkerValidationChain.d.ts +28 -0
- package/packages/workers/src/http/middleware/WorkerValidationChain.d.ts.map +1 -0
- package/packages/workers/src/http/middleware/WorkerValidationChain.js +186 -0
- package/packages/workers/src/index.d.ts +47 -0
- package/packages/workers/src/index.d.ts.map +1 -0
- package/packages/workers/src/index.js +48 -0
- package/packages/workers/src/routes/workers.d.ts +13 -0
- package/packages/workers/src/routes/workers.d.ts.map +1 -0
- package/packages/workers/src/routes/workers.js +126 -0
- package/packages/workers/src/storage/WorkerStore.d.ts +52 -0
- package/packages/workers/src/storage/WorkerStore.d.ts.map +1 -0
- package/packages/workers/src/storage/WorkerStore.js +259 -0
- package/packages/workers/src/telemetry/api/TelemetryAPI.d.ts +47 -0
- package/packages/workers/src/telemetry/api/TelemetryAPI.d.ts.map +1 -0
- package/packages/workers/src/telemetry/api/TelemetryAPI.js +219 -0
- package/packages/workers/src/telemetry/api/TelemetryMonitoringService.d.ts +18 -0
- package/packages/workers/src/telemetry/api/TelemetryMonitoringService.d.ts.map +1 -0
- package/packages/workers/src/telemetry/api/TelemetryMonitoringService.js +140 -0
- package/packages/workers/src/telemetry/components/AlertPanel.d.ts +2 -0
- package/packages/workers/src/telemetry/components/AlertPanel.d.ts.map +1 -0
- package/packages/workers/src/telemetry/components/AlertPanel.js +13 -0
- package/packages/workers/src/telemetry/components/CostTracking.d.ts +2 -0
- package/packages/workers/src/telemetry/components/CostTracking.d.ts.map +1 -0
- package/packages/workers/src/telemetry/components/CostTracking.js +14 -0
- package/packages/workers/src/telemetry/components/ResourceUsageChart.d.ts +2 -0
- package/packages/workers/src/telemetry/components/ResourceUsageChart.d.ts.map +1 -0
- package/packages/workers/src/telemetry/components/ResourceUsageChart.js +11 -0
- package/packages/workers/src/telemetry/components/WorkerHealthChart.d.ts +2 -0
- package/packages/workers/src/telemetry/components/WorkerHealthChart.d.ts.map +1 -0
- package/packages/workers/src/telemetry/components/WorkerHealthChart.js +11 -0
- package/packages/workers/src/telemetry/index.d.ts +16 -0
- package/packages/workers/src/telemetry/index.d.ts.map +1 -0
- package/packages/workers/src/telemetry/index.js +60 -0
- package/packages/workers/src/telemetry/routes/dashboard.d.ts +7 -0
- package/packages/workers/src/telemetry/routes/dashboard.d.ts.map +1 -0
- package/packages/workers/src/telemetry/routes/dashboard.js +608 -0
- package/packages/workers/src/type.d.ts +77 -0
- package/packages/workers/src/type.d.ts.map +1 -0
- package/packages/workers/src/type.js +1 -0
- package/packages/workers/src/ui/router/EmbeddedAssets.d.ts +5 -0
- package/packages/workers/src/ui/router/EmbeddedAssets.d.ts.map +1 -0
- package/packages/workers/src/ui/router/EmbeddedAssets.js +13 -0
- package/packages/workers/src/ui/router/ui.d.ts +4 -0
- package/packages/workers/src/ui/router/ui.d.ts.map +1 -0
- package/packages/workers/src/ui/router/ui.js +208 -0
- package/packages/workers/src/ui/types/worker-ui.d.ts +230 -0
- package/packages/workers/src/ui/types/worker-ui.d.ts.map +1 -0
- package/packages/workers/src/ui/types/worker-ui.js +5 -0
- package/routes/api.d.ts +7 -0
- package/routes/api.d.ts.map +1 -0
- package/routes/api.js +129 -0
- package/routes/broadcast.d.ts +9 -0
- package/routes/broadcast.d.ts.map +1 -0
- package/routes/broadcast.js +27 -0
- package/routes/storage.d.ts +4 -0
- package/routes/storage.d.ts.map +1 -0
- package/routes/storage.js +35 -0
- package/src/cache/Cache.d.ts.map +1 -1
- package/src/cache/Cache.js +40 -8
- package/src/cache/drivers/KVRemoteDriver.d.ts +1 -1
- package/src/cache/drivers/KVRemoteDriver.d.ts.map +1 -1
- package/src/cache/drivers/KVRemoteDriver.js +259 -44
- package/src/cache/drivers/MemoryDriver.d.ts.map +1 -1
- package/src/cache/drivers/MemoryDriver.js +10 -2
- package/src/cache/drivers/RedisDriver.d.ts.map +1 -1
- package/src/cache/drivers/RedisDriver.js +256 -33
- package/src/cli/commands/InitContainerCommand.js +10 -10
- package/src/cli/commands/NewCommand.d.ts.map +1 -1
- package/src/cli/commands/NewCommand.js +33 -0
- package/src/cli/commands/StartCommand.d.ts.map +1 -1
- package/src/cli/commands/StartCommand.js +23 -1
- package/src/cli/scaffolding/ProjectScaffolder.d.ts.map +1 -1
- package/src/cli/scaffolding/ProjectScaffolder.js +65 -73
- package/src/cli/utils/DistPackager.d.ts.map +1 -1
- package/src/cli/utils/DistPackager.js +25 -0
- package/src/cli/utils/EnvFileLoader.d.ts +1 -0
- package/src/cli/utils/EnvFileLoader.d.ts.map +1 -1
- package/src/cli/utils/EnvFileLoader.js +14 -0
- package/src/common/RemoteSignedJson.d.ts.map +1 -1
- package/src/common/RemoteSignedJson.js +9 -2
- package/src/config/cache.js +1 -1
- package/src/config/env.d.ts +7 -0
- package/src/config/env.d.ts.map +1 -1
- package/src/config/env.js +8 -0
- package/src/config/queue.js +1 -1
- package/src/functions/cloudflare.d.ts.map +1 -1
- package/src/functions/cloudflare.js +4 -2
- package/src/index.js +3 -3
- package/src/middleware/JwtAuthMiddleware.d.ts.map +1 -1
- package/src/middleware/JwtAuthMiddleware.js +11 -5
- package/src/runtime/RuntimeAdapter.d.ts.map +1 -1
- package/src/runtime/RuntimeAdapter.js +30 -12
- package/src/runtime/adapters/CloudflareAdapter.d.ts.map +1 -1
- package/src/runtime/adapters/CloudflareAdapter.js +15 -4
- package/src/scheduler/Schedule.js +1 -1
- package/src/scheduler/leader/SchedulerLeader.js +1 -1
- package/src/schedules/job-tracking-cleanup.js +1 -1
- package/src/security/TokenRevocation.d.ts +19 -2
- package/src/security/TokenRevocation.d.ts.map +1 -1
- package/src/security/TokenRevocation.js +558 -30
- package/src/templates/project/basic/app/Controllers/AuthController.ts.tpl +11 -3
- package/src/templates/project/basic/config/middleware.ts.tpl +23 -22
- package/src/templates/project/basic/wrangler.jsonc.tpl +28 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker Registry
|
|
3
|
+
* Central registry for all background workers with lifecycle management
|
|
4
|
+
* Sealed namespace for immutability
|
|
5
|
+
*/
|
|
6
|
+
import { type WorkerConfig, type WorkerStatus } from '../../../src/index.js';
|
|
7
|
+
export type WorkerMetadata = {
|
|
8
|
+
name: string;
|
|
9
|
+
status: WorkerStatus;
|
|
10
|
+
version: string;
|
|
11
|
+
region: string;
|
|
12
|
+
queueName: string;
|
|
13
|
+
concurrency: number;
|
|
14
|
+
activeStatus?: boolean;
|
|
15
|
+
startedAt: Date | null;
|
|
16
|
+
stoppedAt: Date | null;
|
|
17
|
+
lastProcessedAt: Date | null;
|
|
18
|
+
restartCount: number;
|
|
19
|
+
processedCount: number;
|
|
20
|
+
errorCount: number;
|
|
21
|
+
lockKey: string | null;
|
|
22
|
+
priority: number;
|
|
23
|
+
memoryUsage: number;
|
|
24
|
+
cpuUsage: number;
|
|
25
|
+
circuitState: 'closed' | 'open' | 'half-open';
|
|
26
|
+
queues: ReadonlyArray<string>;
|
|
27
|
+
plugins: ReadonlyArray<string>;
|
|
28
|
+
datacenter: string;
|
|
29
|
+
canaryPercentage: number;
|
|
30
|
+
config: Partial<WorkerConfig>;
|
|
31
|
+
};
|
|
32
|
+
export type WorkerInstance = {
|
|
33
|
+
metadata: WorkerMetadata;
|
|
34
|
+
instance: unknown;
|
|
35
|
+
start: () => void;
|
|
36
|
+
stop: () => Promise<void>;
|
|
37
|
+
drain: () => Promise<void>;
|
|
38
|
+
sleep: () => Promise<void>;
|
|
39
|
+
wakeup: () => void;
|
|
40
|
+
getStatus: () => WorkerStatus;
|
|
41
|
+
getHealth: () => 'green' | 'yellow' | 'red';
|
|
42
|
+
};
|
|
43
|
+
export type RegisterWorkerOptions = {
|
|
44
|
+
name: string;
|
|
45
|
+
config: Partial<WorkerConfig>;
|
|
46
|
+
activeStatus?: boolean;
|
|
47
|
+
version?: string;
|
|
48
|
+
region?: string;
|
|
49
|
+
queues?: ReadonlyArray<string>;
|
|
50
|
+
factory: () => Promise<WorkerInstance>;
|
|
51
|
+
};
|
|
52
|
+
export type WorkerRegistrySnapshot = {
|
|
53
|
+
timestamp: Date;
|
|
54
|
+
totalWorkers: number;
|
|
55
|
+
runningWorkers: number;
|
|
56
|
+
stoppedWorkers: number;
|
|
57
|
+
sleepingWorkers: number;
|
|
58
|
+
unhealthyWorkers: number;
|
|
59
|
+
workers: ReadonlyArray<{
|
|
60
|
+
name: string;
|
|
61
|
+
status: WorkerStatus;
|
|
62
|
+
health: 'green' | 'yellow' | 'red';
|
|
63
|
+
uptime: number | null;
|
|
64
|
+
processedCount: number;
|
|
65
|
+
errorCount: number;
|
|
66
|
+
}>;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Worker Registry - Sealed namespace
|
|
70
|
+
*/
|
|
71
|
+
export declare const WorkerRegistry: Readonly<{
|
|
72
|
+
/**
|
|
73
|
+
* Register a worker with the registry
|
|
74
|
+
*/
|
|
75
|
+
register(options: RegisterWorkerOptions): void;
|
|
76
|
+
/**
|
|
77
|
+
* Start a worker
|
|
78
|
+
*/
|
|
79
|
+
start(name: string, version?: string): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Stop a worker
|
|
82
|
+
*/
|
|
83
|
+
stop(name: string): Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* Restart a worker (stop + start)
|
|
86
|
+
*/
|
|
87
|
+
restart(name: string): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* Sleep a worker (pause processing but keep lock)
|
|
90
|
+
*/
|
|
91
|
+
sleep(name: string): Promise<void>;
|
|
92
|
+
/**
|
|
93
|
+
* Wakeup a worker (resume from sleep)
|
|
94
|
+
*/
|
|
95
|
+
wakeup(name: string): Promise<void>;
|
|
96
|
+
/**
|
|
97
|
+
* Get worker status
|
|
98
|
+
*/
|
|
99
|
+
status(name: string): WorkerMetadata | null;
|
|
100
|
+
/**
|
|
101
|
+
* List all registered workers
|
|
102
|
+
*/
|
|
103
|
+
list(): ReadonlyArray<string>;
|
|
104
|
+
/**
|
|
105
|
+
* Update active status for a registered worker
|
|
106
|
+
*/
|
|
107
|
+
setActiveStatus(name: string, activeStatus: boolean): void;
|
|
108
|
+
/**
|
|
109
|
+
* List all running workers
|
|
110
|
+
*/
|
|
111
|
+
listRunning(): ReadonlyArray<string>;
|
|
112
|
+
/**
|
|
113
|
+
* Stop all running workers
|
|
114
|
+
*/
|
|
115
|
+
stopAll(): Promise<void>;
|
|
116
|
+
/**
|
|
117
|
+
* Get worker metrics
|
|
118
|
+
*/
|
|
119
|
+
getMetrics(name: string): Pick<WorkerMetadata, "processedCount" | "errorCount" | "memoryUsage" | "cpuUsage"> | null;
|
|
120
|
+
/**
|
|
121
|
+
* Get worker health status
|
|
122
|
+
*/
|
|
123
|
+
getHealth(name: string): "green" | "yellow" | "red" | null;
|
|
124
|
+
/**
|
|
125
|
+
* Get registry snapshot
|
|
126
|
+
*/
|
|
127
|
+
getSnapshot(): WorkerRegistrySnapshot;
|
|
128
|
+
/**
|
|
129
|
+
* Get worker topology (cluster view)
|
|
130
|
+
*/
|
|
131
|
+
getTopology(): Record<string, {
|
|
132
|
+
workers: string[];
|
|
133
|
+
count: number;
|
|
134
|
+
}>;
|
|
135
|
+
/**
|
|
136
|
+
* Unregister a worker and clear its instance
|
|
137
|
+
*/
|
|
138
|
+
unregister(name: string): void;
|
|
139
|
+
/**
|
|
140
|
+
* Check if worker is registered
|
|
141
|
+
*/
|
|
142
|
+
isRegistered(name: string): boolean;
|
|
143
|
+
/**
|
|
144
|
+
* Check if worker is running
|
|
145
|
+
*/
|
|
146
|
+
isRunning(name: string): boolean;
|
|
147
|
+
/**
|
|
148
|
+
* Get worker instance (internal use)
|
|
149
|
+
*/
|
|
150
|
+
getInstance(name: string): WorkerInstance | null;
|
|
151
|
+
}>;
|
|
152
|
+
//# sourceMappingURL=WorkerRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkerRegistry.d.ts","sourceRoot":"","sources":["../../../../packages/workers/src/WorkerRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker Registry
|
|
3
|
+
* Central registry for all background workers with lifecycle management
|
|
4
|
+
* Sealed namespace for immutability
|
|
5
|
+
*/
|
|
6
|
+
import { ErrorFactory, Logger } from '../../../src/index.js';
|
|
7
|
+
import { AnomalyDetection } from './AnomalyDetection.js';
|
|
8
|
+
// Internal storage
|
|
9
|
+
const workers = new Map();
|
|
10
|
+
const registrations = new Map();
|
|
11
|
+
// Cleanup configuration
|
|
12
|
+
const STOPPED_WORKER_CLEANUP_DELAY = 5 * 60 * 1000; // 5 minutes
|
|
13
|
+
const cleanupTimers = new Map();
|
|
14
|
+
const isUnrefableTimer = (value) => {
|
|
15
|
+
if (typeof value !== 'object' || value === null)
|
|
16
|
+
return false;
|
|
17
|
+
return 'unref' in value && typeof value.unref === 'function';
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Helper: Schedule cleanup of stopped worker
|
|
21
|
+
*/
|
|
22
|
+
const scheduleStoppedWorkerCleanup = (name) => {
|
|
23
|
+
// Clear existing timer if any
|
|
24
|
+
const existingTimer = cleanupTimers.get(name);
|
|
25
|
+
if (existingTimer) {
|
|
26
|
+
clearTimeout(existingTimer);
|
|
27
|
+
}
|
|
28
|
+
// Schedule new cleanup with proper cleanup handling
|
|
29
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
30
|
+
const timer = setTimeout(() => {
|
|
31
|
+
try {
|
|
32
|
+
const instance = workers.get(name);
|
|
33
|
+
if (instance && instance.metadata.status === 'stopped') {
|
|
34
|
+
Logger.info(`Auto-cleaning up stopped worker: ${name}`);
|
|
35
|
+
workers.delete(name);
|
|
36
|
+
registrations.delete(name);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
Logger.error(`Error during auto-cleanup of worker ${name}`, error);
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
cleanupTimers.delete(name);
|
|
44
|
+
}
|
|
45
|
+
}, STOPPED_WORKER_CLEANUP_DELAY);
|
|
46
|
+
if (isUnrefableTimer(timer)) {
|
|
47
|
+
timer.unref();
|
|
48
|
+
}
|
|
49
|
+
cleanupTimers.set(name, timer);
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Helper: Cancel cleanup timer
|
|
53
|
+
*/
|
|
54
|
+
const cancelCleanupTimer = (name) => {
|
|
55
|
+
const timer = cleanupTimers.get(name);
|
|
56
|
+
if (timer) {
|
|
57
|
+
clearTimeout(timer);
|
|
58
|
+
cleanupTimers.delete(name);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Helper: Calculate uptime in seconds
|
|
63
|
+
*/
|
|
64
|
+
const calculateUptime = (startedAt) => {
|
|
65
|
+
if (!startedAt)
|
|
66
|
+
return null;
|
|
67
|
+
return Math.floor((Date.now() - startedAt.getTime()) / 1000);
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Helper: Validate worker name
|
|
71
|
+
*/
|
|
72
|
+
const validateWorkerName = (name) => {
|
|
73
|
+
if (!name || typeof name !== 'string') {
|
|
74
|
+
throw ErrorFactory.createWorkerError('Worker name must be a non-empty string');
|
|
75
|
+
}
|
|
76
|
+
if (!/^[a-z0-9-]+$/.test(name)) {
|
|
77
|
+
throw ErrorFactory.createWorkerError('Worker name must contain only lowercase letters, numbers, and hyphens');
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Worker Registry - Sealed namespace
|
|
82
|
+
*/
|
|
83
|
+
export const WorkerRegistry = Object.freeze({
|
|
84
|
+
/**
|
|
85
|
+
* Register a worker with the registry
|
|
86
|
+
*/
|
|
87
|
+
register(options) {
|
|
88
|
+
validateWorkerName(options.name);
|
|
89
|
+
if (registrations.has(options.name)) {
|
|
90
|
+
Logger.warn(`Worker "${options.name}" is already registered. Skipping.`);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
registrations.set(options.name, options);
|
|
94
|
+
Logger.info(`Worker "${options.name}" registered successfully`);
|
|
95
|
+
},
|
|
96
|
+
/**
|
|
97
|
+
* Start a worker
|
|
98
|
+
*/
|
|
99
|
+
async start(name, version) {
|
|
100
|
+
validateWorkerName(name);
|
|
101
|
+
const registration = registrations.get(name);
|
|
102
|
+
if (!registration) {
|
|
103
|
+
throw ErrorFactory.createWorkerError(`Worker "${name}" is not registered`);
|
|
104
|
+
}
|
|
105
|
+
if (registration.activeStatus === false) {
|
|
106
|
+
throw ErrorFactory.createWorkerError(`Worker "${name}" is inactive`);
|
|
107
|
+
}
|
|
108
|
+
if (workers.has(name)) {
|
|
109
|
+
const existing = workers.get(name);
|
|
110
|
+
if (existing?.metadata.status === 'running') {
|
|
111
|
+
Logger.warn(`Worker "${name}" is already running`);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const versionSuffix = version === undefined ? '' : ` version ${version}`;
|
|
116
|
+
Logger.info(`Starting worker "${name}"${versionSuffix}...`);
|
|
117
|
+
try {
|
|
118
|
+
const instance = await registration.factory();
|
|
119
|
+
instance.metadata.status = 'starting';
|
|
120
|
+
instance.metadata.version = version ?? '1.0.0';
|
|
121
|
+
// Cancel any pending cleanup timer when worker restarts
|
|
122
|
+
cancelCleanupTimer(name);
|
|
123
|
+
workers.set(name, instance);
|
|
124
|
+
instance.start();
|
|
125
|
+
instance.metadata.status = 'running';
|
|
126
|
+
instance.metadata.startedAt = new Date();
|
|
127
|
+
instance.metadata.stoppedAt = null;
|
|
128
|
+
Logger.info(`Worker "${name}" started successfully`);
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
Logger.error(`Failed to start worker "${name}"`, error);
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
/**
|
|
136
|
+
* Stop a worker
|
|
137
|
+
*/
|
|
138
|
+
async stop(name) {
|
|
139
|
+
validateWorkerName(name);
|
|
140
|
+
const instance = workers.get(name);
|
|
141
|
+
if (!instance) {
|
|
142
|
+
Logger.warn(`Worker "${name}" is not running`);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
if (instance.metadata.status === 'stopped') {
|
|
146
|
+
Logger.warn(`Worker "${name}" is already stopped`);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
Logger.info(`Stopping worker "${name}"...`);
|
|
150
|
+
try {
|
|
151
|
+
instance.metadata.status = 'stopping';
|
|
152
|
+
await instance.stop();
|
|
153
|
+
instance.metadata.status = 'stopped';
|
|
154
|
+
instance.metadata.stoppedAt = new Date();
|
|
155
|
+
AnomalyDetection.cleanup(name);
|
|
156
|
+
// Schedule automatic cleanup for stopped worker
|
|
157
|
+
scheduleStoppedWorkerCleanup(name);
|
|
158
|
+
Logger.info(`Worker "${name}" stopped successfully`);
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
Logger.error(`Failed to stop worker "${name}"`, error);
|
|
162
|
+
throw error;
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
/**
|
|
166
|
+
* Restart a worker (stop + start)
|
|
167
|
+
*/
|
|
168
|
+
async restart(name) {
|
|
169
|
+
validateWorkerName(name);
|
|
170
|
+
const instance = workers.get(name);
|
|
171
|
+
if (instance) {
|
|
172
|
+
await WorkerRegistry.stop(name);
|
|
173
|
+
instance.metadata.restartCount += 1;
|
|
174
|
+
}
|
|
175
|
+
await WorkerRegistry.start(name);
|
|
176
|
+
Logger.info(`Worker "${name}" restarted successfully`);
|
|
177
|
+
},
|
|
178
|
+
/**
|
|
179
|
+
* Sleep a worker (pause processing but keep lock)
|
|
180
|
+
*/
|
|
181
|
+
async sleep(name) {
|
|
182
|
+
validateWorkerName(name);
|
|
183
|
+
const instance = workers.get(name);
|
|
184
|
+
if (!instance) {
|
|
185
|
+
throw ErrorFactory.createWorkerError(`Worker "${name}" is not running`);
|
|
186
|
+
}
|
|
187
|
+
if (instance.metadata.status === 'sleeping') {
|
|
188
|
+
Logger.warn(`Worker "${name}" is already sleeping`);
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
Logger.info(`Putting worker "${name}" to sleep...`);
|
|
192
|
+
try {
|
|
193
|
+
await instance.sleep();
|
|
194
|
+
instance.metadata.status = 'sleeping';
|
|
195
|
+
Logger.info(`Worker "${name}" is now sleeping`);
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
Logger.error(`Failed to sleep worker "${name}"`, error);
|
|
199
|
+
throw error;
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
/**
|
|
203
|
+
* Wakeup a worker (resume from sleep)
|
|
204
|
+
*/
|
|
205
|
+
async wakeup(name) {
|
|
206
|
+
validateWorkerName(name);
|
|
207
|
+
const instance = workers.get(name);
|
|
208
|
+
if (!instance) {
|
|
209
|
+
throw ErrorFactory.createWorkerError(`Worker "${name}" is not found`);
|
|
210
|
+
}
|
|
211
|
+
if (instance.metadata.status !== 'sleeping') {
|
|
212
|
+
Logger.warn(`Worker "${name}" is not sleeping (status: ${instance.metadata.status})`);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
Logger.info(`Waking up worker "${name}"...`);
|
|
216
|
+
try {
|
|
217
|
+
instance.wakeup();
|
|
218
|
+
instance.metadata.status = 'running';
|
|
219
|
+
Logger.info(`Worker "${name}" is now awake and running`);
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
Logger.error(`Failed to wake up worker "${name}"`, error);
|
|
223
|
+
throw error;
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
/**
|
|
227
|
+
* Get worker status
|
|
228
|
+
*/
|
|
229
|
+
status(name) {
|
|
230
|
+
validateWorkerName(name);
|
|
231
|
+
const instance = workers.get(name);
|
|
232
|
+
if (!instance) {
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
return { ...instance.metadata };
|
|
236
|
+
},
|
|
237
|
+
/**
|
|
238
|
+
* List all registered workers
|
|
239
|
+
*/
|
|
240
|
+
list() {
|
|
241
|
+
const names = [];
|
|
242
|
+
for (const [name, registration] of registrations.entries()) {
|
|
243
|
+
if (registration.activeStatus === false)
|
|
244
|
+
continue;
|
|
245
|
+
names.push(name);
|
|
246
|
+
}
|
|
247
|
+
return names;
|
|
248
|
+
},
|
|
249
|
+
/**
|
|
250
|
+
* Update active status for a registered worker
|
|
251
|
+
*/
|
|
252
|
+
setActiveStatus(name, activeStatus) {
|
|
253
|
+
const registration = registrations.get(name);
|
|
254
|
+
if (!registration)
|
|
255
|
+
return;
|
|
256
|
+
registrations.set(name, { ...registration, activeStatus });
|
|
257
|
+
},
|
|
258
|
+
/**
|
|
259
|
+
* List all running workers
|
|
260
|
+
*/
|
|
261
|
+
listRunning() {
|
|
262
|
+
const running = [];
|
|
263
|
+
for (const [name, instance] of workers.entries()) {
|
|
264
|
+
if (instance.metadata.status === 'running') {
|
|
265
|
+
running.push(name);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return running;
|
|
269
|
+
},
|
|
270
|
+
/**
|
|
271
|
+
* Stop all running workers
|
|
272
|
+
*/
|
|
273
|
+
async stopAll() {
|
|
274
|
+
Logger.info('Stopping all running workers...');
|
|
275
|
+
const running = WorkerRegistry.listRunning();
|
|
276
|
+
const tasks = running.map(async (name) => WorkerRegistry.stop(name));
|
|
277
|
+
try {
|
|
278
|
+
await Promise.all(tasks);
|
|
279
|
+
Logger.info(`Stopped ${running.length} workers successfully`);
|
|
280
|
+
}
|
|
281
|
+
catch (error) {
|
|
282
|
+
Logger.error('Failed to stop some workers', error);
|
|
283
|
+
throw error;
|
|
284
|
+
}
|
|
285
|
+
},
|
|
286
|
+
/**
|
|
287
|
+
* Get worker metrics
|
|
288
|
+
*/
|
|
289
|
+
getMetrics(name) {
|
|
290
|
+
validateWorkerName(name);
|
|
291
|
+
const instance = workers.get(name);
|
|
292
|
+
if (!instance) {
|
|
293
|
+
return null;
|
|
294
|
+
}
|
|
295
|
+
return {
|
|
296
|
+
processedCount: instance.metadata.processedCount,
|
|
297
|
+
errorCount: instance.metadata.errorCount,
|
|
298
|
+
memoryUsage: instance.metadata.memoryUsage,
|
|
299
|
+
cpuUsage: instance.metadata.cpuUsage,
|
|
300
|
+
};
|
|
301
|
+
},
|
|
302
|
+
/**
|
|
303
|
+
* Get worker health status
|
|
304
|
+
*/
|
|
305
|
+
getHealth(name) {
|
|
306
|
+
validateWorkerName(name);
|
|
307
|
+
const instance = workers.get(name);
|
|
308
|
+
if (!instance) {
|
|
309
|
+
return null;
|
|
310
|
+
}
|
|
311
|
+
return instance.getHealth();
|
|
312
|
+
},
|
|
313
|
+
/**
|
|
314
|
+
* Get registry snapshot
|
|
315
|
+
*/
|
|
316
|
+
getSnapshot() {
|
|
317
|
+
const allWorkers = Array.from(workers.entries()).map(([name, instance]) => ({
|
|
318
|
+
name,
|
|
319
|
+
status: instance.metadata.status,
|
|
320
|
+
health: instance.getHealth(),
|
|
321
|
+
uptime: calculateUptime(instance.metadata.startedAt),
|
|
322
|
+
processedCount: instance.metadata.processedCount,
|
|
323
|
+
errorCount: instance.metadata.errorCount,
|
|
324
|
+
}));
|
|
325
|
+
const statusCounts = allWorkers.reduce((acc, w) => {
|
|
326
|
+
if (w.status === 'running')
|
|
327
|
+
acc.running++;
|
|
328
|
+
else if (w.status === 'stopped')
|
|
329
|
+
acc.stopped++;
|
|
330
|
+
else if (w.status === 'sleeping')
|
|
331
|
+
acc.sleeping++;
|
|
332
|
+
if (w.health === 'red')
|
|
333
|
+
acc.unhealthy++;
|
|
334
|
+
return acc;
|
|
335
|
+
}, { running: 0, stopped: 0, sleeping: 0, unhealthy: 0 });
|
|
336
|
+
return {
|
|
337
|
+
timestamp: new Date(),
|
|
338
|
+
totalWorkers: registrations.size,
|
|
339
|
+
runningWorkers: statusCounts.running,
|
|
340
|
+
stoppedWorkers: statusCounts.stopped,
|
|
341
|
+
sleepingWorkers: statusCounts.sleeping,
|
|
342
|
+
unhealthyWorkers: statusCounts.unhealthy,
|
|
343
|
+
workers: allWorkers,
|
|
344
|
+
};
|
|
345
|
+
},
|
|
346
|
+
/**
|
|
347
|
+
* Get worker topology (cluster view)
|
|
348
|
+
*/
|
|
349
|
+
getTopology() {
|
|
350
|
+
const topology = {};
|
|
351
|
+
for (const [name, instance] of workers.entries()) {
|
|
352
|
+
const region = instance.metadata.region;
|
|
353
|
+
if (topology[region].count <= 0) {
|
|
354
|
+
topology[region] = { workers: [], count: 0 };
|
|
355
|
+
}
|
|
356
|
+
topology[region].workers.push(name);
|
|
357
|
+
topology[region].count++;
|
|
358
|
+
}
|
|
359
|
+
return topology;
|
|
360
|
+
},
|
|
361
|
+
/**
|
|
362
|
+
* Unregister a worker and clear its instance
|
|
363
|
+
*/
|
|
364
|
+
unregister(name) {
|
|
365
|
+
validateWorkerName(name);
|
|
366
|
+
const instance = workers.get(name);
|
|
367
|
+
if (instance?.metadata.status === 'running') {
|
|
368
|
+
Logger.warn(`Worker "${name}" is still running during unregister`);
|
|
369
|
+
}
|
|
370
|
+
// Cancel any pending cleanup timer
|
|
371
|
+
cancelCleanupTimer(name);
|
|
372
|
+
workers.delete(name);
|
|
373
|
+
registrations.delete(name);
|
|
374
|
+
AnomalyDetection.cleanup(name);
|
|
375
|
+
Logger.info(`Worker "${name}" unregistered`);
|
|
376
|
+
},
|
|
377
|
+
/**
|
|
378
|
+
* Check if worker is registered
|
|
379
|
+
*/
|
|
380
|
+
isRegistered(name) {
|
|
381
|
+
return registrations.has(name);
|
|
382
|
+
},
|
|
383
|
+
/**
|
|
384
|
+
* Check if worker is running
|
|
385
|
+
*/
|
|
386
|
+
isRunning(name) {
|
|
387
|
+
const instance = workers.get(name);
|
|
388
|
+
return instance?.metadata.status === 'running';
|
|
389
|
+
},
|
|
390
|
+
/**
|
|
391
|
+
* Get worker instance (internal use)
|
|
392
|
+
*/
|
|
393
|
+
getInstance(name) {
|
|
394
|
+
return workers.get(name) ?? null;
|
|
395
|
+
},
|
|
396
|
+
});
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker Shutdown Coordinator
|
|
3
|
+
*
|
|
4
|
+
* Centralized graceful shutdown handling for the worker management system.
|
|
5
|
+
* Coordinates orderly shutdown of all worker modules and the WorkerFactory.
|
|
6
|
+
*/
|
|
7
|
+
export interface IShutdownOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Timeout for graceful shutdown in milliseconds
|
|
10
|
+
*/
|
|
11
|
+
timeout?: number;
|
|
12
|
+
/**
|
|
13
|
+
* Whether to force exit after timeout
|
|
14
|
+
*/
|
|
15
|
+
forceExit?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Signal that triggered shutdown (SIGTERM, SIGINT, etc.)
|
|
18
|
+
*/
|
|
19
|
+
signal?: string;
|
|
20
|
+
}
|
|
21
|
+
interface IShutdownState {
|
|
22
|
+
isShuttingDown: boolean;
|
|
23
|
+
completedAt: Date | null;
|
|
24
|
+
startedAt: Date | null;
|
|
25
|
+
reason: string | null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Perform graceful shutdown of all worker modules
|
|
29
|
+
*/
|
|
30
|
+
declare function shutdown(options?: IShutdownOptions): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Register process signal handlers for graceful shutdown
|
|
33
|
+
*/
|
|
34
|
+
declare function registerShutdownHandlers(): void;
|
|
35
|
+
/**
|
|
36
|
+
* Unregister process signal handlers (for hot reload/testing)
|
|
37
|
+
*/
|
|
38
|
+
declare function unregisterShutdownHandlers(): void;
|
|
39
|
+
/**
|
|
40
|
+
* Check if system is currently shutting down
|
|
41
|
+
*/
|
|
42
|
+
declare function isShuttingDown(): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Get current shutdown state
|
|
45
|
+
*/
|
|
46
|
+
declare function getShutdownState(): Readonly<IShutdownState>;
|
|
47
|
+
export declare const WorkerShutdown: Readonly<{
|
|
48
|
+
/**
|
|
49
|
+
* Perform graceful shutdown of all worker modules
|
|
50
|
+
*/
|
|
51
|
+
shutdown: typeof shutdown;
|
|
52
|
+
/**
|
|
53
|
+
* Register process signal handlers for graceful shutdown
|
|
54
|
+
*/
|
|
55
|
+
registerShutdownHandlers: typeof registerShutdownHandlers;
|
|
56
|
+
/**
|
|
57
|
+
* Unregister process signal handlers (for hot reload/testing)
|
|
58
|
+
*/
|
|
59
|
+
unregisterShutdownHandlers: typeof unregisterShutdownHandlers;
|
|
60
|
+
/**
|
|
61
|
+
* Check if system is currently shutting down
|
|
62
|
+
*/
|
|
63
|
+
isShuttingDown: typeof isShuttingDown;
|
|
64
|
+
/**
|
|
65
|
+
* Get current shutdown state
|
|
66
|
+
*/
|
|
67
|
+
getShutdownState: typeof getShutdownState;
|
|
68
|
+
}>;
|
|
69
|
+
export {};
|
|
70
|
+
//# sourceMappingURL=WorkerShutdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkerShutdown.d.ts","sourceRoot":"","sources":["../../../../packages/workers/src/WorkerShutdown.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,cAAc;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAsBD;;GAEG;AACH,iBAAe,QAAQ,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDrE;AAED;;GAEG;AACH,iBAAS,wBAAwB,IAAI,IAAI,CA8DxC;AAED;;GAEG;AACH,iBAAS,0BAA0B,IAAI,IAAI,CAiB1C;AAED;;GAEG;AACH,iBAAS,cAAc,IAAI,OAAO,CAEjC;AAED;;GAEG;AACH,iBAAS,gBAAgB,IAAI,QAAQ,CAAC,cAAc,CAAC,CAEpD;AAMD,eAAO,MAAM,cAAc;IACzB;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;EAEH,CAAC"}
|