@chromahq/core 1.0.44 → 1.0.45

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boot-PbJQqgzX.js","sources":["../src/di/Container.ts","../src/scheduler/core/IJob.ts","../src/internal/MiddlewareRegistry.ts","../src/internal/constants.ts","../src/runtime/BridgeRuntime.ts","../src/scheduler/scheduler/adapters/AlarmAdapter.ts","../src/scheduler/scheduler/adapters/TimeoutAdapter.ts","../src/scheduler/scheduler/JobRegistry.ts","../../../node_modules/.pnpm/cron-schedule@5.0.4/node_modules/cron-schedule/dist/utils.js","../../../node_modules/.pnpm/cron-schedule@5.0.4/node_modules/cron-schedule/dist/cron.js","../../../node_modules/.pnpm/cron-schedule@5.0.4/node_modules/cron-schedule/dist/cron-parser.js","../src/scheduler/support/cron.ts","../src/scheduler/services/Scheduler.service.ts","../src/Bootstrap.ts"],"sourcesContent":["import { Container as Di } from '@inversifyjs/container';\n\nexport const METADATA_KEY = {\n PARAM_TYPES: 'design:paramtypes',\n TYPE: 'design:type',\n RETURN_TYPE: 'design:returntype',\n};\n\nexport const container = new Di({\n defaultScope: 'Singleton',\n});\n\n(container as any).id = Math.random().toString(36).substring(2, 15);\n\nexport const bind = <T>(id: symbol | (new (...a: any[]) => T), cls: new (...a: any[]) => T) =>\n container\n .bind<T>(id as any)\n .to(cls)\n .inSingletonScope();\n\nexport const resolve = <T>(id: symbol | (new (...a: any[]) => T)): T => container.get<T>(id as any);\n\nexport function isInjectable(target: any): boolean {\n return !!Reflect.getMetadata(METADATA_KEY.PARAM_TYPES, target);\n}\n","import { JobOptions } from './JobOptions';\n\nexport interface IJob<T = unknown> {\n readonly data?: T;\n handle(context?: JobContext): Promise<void> | void;\n pause?(): Promise<void> | void;\n resume?(): Promise<void> | void;\n stop?(): Promise<void> | void;\n}\n\nexport enum JobState {\n SCHEDULED = 'scheduled',\n RUNNING = 'running',\n PAUSED = 'paused',\n STOPPED = 'stopped',\n COMPLETED = 'completed',\n FAILED = 'failed',\n}\n\nexport interface JobContext {\n id: string;\n options?: JobOptions;\n state: JobState;\n createdAt: Date;\n updatedAt: Date;\n startedAt?: Date;\n pausedAt?: Date;\n stoppedAt?: Date;\n completedAt?: Date;\n error?: Error;\n retryCount?: number;\n\n /**\n * Pause the job execution.\n * @returns Promise<void> | void\n */\n pause: () => Promise<void> | void;\n resume: () => Promise<void> | void;\n stop: () => Promise<void> | void;\n complete: () => Promise<void> | void;\n fail: (error: Error) => Promise<void> | void;\n retry: () => Promise<void> | void;\n\n isRunning: () => boolean;\n isPaused: () => boolean;\n isStopped: () => boolean;\n isCompleted: () => boolean;\n isFailed: () => boolean;\n isRetrying: () => boolean;\n isScheduled: () => boolean;\n isDelayed: () => boolean;\n isRecurring: () => boolean;\n isCron: () => boolean;\n isTimeout: () => boolean;\n isAlarm: () => boolean;\n}\n","export type MiddlewareFn = (ctx: any, next: () => Promise<any>) => Promise<any>;\n\n/**\n * Registry for middleware functions that can be applied globally or per handler.\n * Middleware functions can be used to modify the request context or handle errors.\n */\nclass MiddlewareRegistryClass {\n private global: MiddlewareFn[] = [];\n private perHandler = new Map<string, MiddlewareFn[]>();\n\n registerGlobal(fn: MiddlewareFn) {\n this.global.push(fn);\n }\n\n registerForKey(key: string, fn: MiddlewareFn) {\n const arr = this.perHandler.get(key) ?? [];\n arr.push(fn);\n this.perHandler.set(key, arr);\n }\n\n pipeline(key: string): MiddlewareFn[] {\n return [...this.global, ...(this.perHandler.get(key) ?? [])];\n }\n}\nexport const MiddlewareRegistry = new MiddlewareRegistryClass();\n","/**\n * Default port name used for chrome.runtime.connect.\n * Override via BridgeOptions when calling startBridgeRuntime.\n */\nexport const DEFAULT_PORT_NAME = 'chroma-bridge';\n","import type { Container } from '@inversifyjs/container';\nimport { MiddlewareFn, MiddlewareRegistry } from '../internal/MiddlewareRegistry';\nimport { DEFAULT_PORT_NAME } from '../internal/constants';\n\nconst DIRECT_MESSAGE_FLAG = '__CHROMA_BRIDGE_DIRECT_MESSAGE__' as const;\n\ninterface BridgeRuntimeDiagnosticsInternal {\n keepAliveIntervalPings: number;\n lastKeepAliveIntervalAt?: number;\n alarmPings: number;\n lastAlarmPingAt?: number;\n portDisconnects: number;\n lastPortDisconnectAt?: number;\n lastPortDisconnectError?: string;\n directMessageRequests: number;\n directMessageErrors: number;\n}\n\ninterface BridgeRuntimeDiagnostics extends BridgeRuntimeDiagnosticsInternal {\n connectedPorts: number;\n}\n\n/**\n * Configuration options for the Bridge Runtime\n */\ninterface BridgeRuntimeOptions {\n readonly container: Container;\n readonly portName?: string;\n readonly enableLogging?: boolean;\n readonly errorHandler?: ErrorHandler;\n readonly keepAlive?: boolean; // If true, keep service worker alive\n}\n\n/**\n * Message request structure for bridge communication\n */\ninterface BridgeRequest {\n readonly id: string;\n readonly key: string;\n readonly payload: unknown;\n readonly metadata?: Record<string, any>;\n readonly [DIRECT_MESSAGE_FLAG]?: true;\n}\n\n/**\n * Broadcast message structure for event communication\n */\ninterface BroadcastMessage {\n readonly type: 'broadcast';\n readonly key: string;\n readonly payload: unknown;\n readonly metadata?: Record<string, any>;\n}\n\n/**\n * Message response structure for bridge communication\n */\ninterface BridgeResponse {\n readonly id: string;\n readonly data?: unknown;\n readonly error?: string;\n readonly timestamp?: number;\n}\n\n/**\n * Handler interface for message processing\n */\ninterface MessageHandler {\n handle(payload: unknown): Promise<unknown>;\n}\n\n/**\n * Pipeline execution context\n */\ninterface PipelineContext {\n readonly request: BridgeRequest;\n readonly startTime: number;\n metadata: Record<string, any>;\n}\n\n/**\n * Error handler interface for custom error processing\n */\ninterface ErrorHandler {\n handle(error: Error, context: PipelineContext): Promise<BridgeResponse> | BridgeResponse;\n}\n\n/**\n * Default error handler implementation\n */\nclass DefaultErrorHandler implements ErrorHandler {\n handle(error: Error, context: PipelineContext): BridgeResponse {\n return {\n id: context.request.id,\n error: error?.message ?? 'UNKNOWN_ERROR',\n timestamp: Date.now(),\n };\n }\n}\n\n/**\n * Elegant Bridge Runtime Manager\n * Handles Chrome extension message bridge with middleware pipeline support\n */\nclass BridgeRuntimeManager {\n private readonly container: Container;\n private readonly portName: string;\n private readonly enableLogging: boolean;\n private readonly errorHandler: ErrorHandler;\n private readonly logger: BridgeLogger;\n private readonly keepAlive: boolean;\n private keepAliveTimer: ReturnType<typeof setInterval> | null = null;\n private static readonly KEEP_ALIVE_INTERVAL_MS = 25000;\n private static readonly KEEP_ALIVE_ALARM_NAME = 'chroma-bridge-keep-alive';\n private static readonly KEEP_ALIVE_ALARM_PERIOD_MINUTES = 1;\n private isInitialized = false;\n private connectedPorts = new Set<chrome.runtime.Port>();\n private keepAliveAlarmRegistered = false;\n private readonly diagnostics: BridgeRuntimeDiagnosticsInternal = {\n keepAliveIntervalPings: 0,\n alarmPings: 0,\n portDisconnects: 0,\n directMessageRequests: 0,\n directMessageErrors: 0,\n };\n\n constructor(options: BridgeRuntimeOptions) {\n this.container = options.container;\n this.portName = options.portName ?? DEFAULT_PORT_NAME;\n this.enableLogging = options.enableLogging ?? false;\n this.errorHandler = options.errorHandler ?? new DefaultErrorHandler();\n this.logger = new BridgeLogger(this.enableLogging);\n this.keepAlive = options.keepAlive ?? false;\n }\n\n /**\n * Initialize the bridge runtime and start listening for connections\n */\n public initialize(): void {\n if (this.isInitialized) {\n this.logger.warn('Bridge runtime already initialized');\n return;\n }\n\n this.setupPortListener();\n this.setupDirectMessageListener();\n this.initializeKeepAliveAlarm();\n\n // Note: keep-alive is started dynamically when first port connects\n // and stopped when all ports disconnect (see setupMessageHandler)\n\n this.isInitialized = true;\n }\n\n /**\n * Setup Chrome runtime port listener\n */\n private setupPortListener(): void {\n chrome.runtime.onConnect.addListener((port) => {\n try {\n if (!this.isValidPort(port)) {\n return;\n }\n\n this.logger.info(`📡 Port connected: ${port.name}`);\n this.setupMessageHandler(port);\n\n if (chrome.runtime.lastError) {\n this.logger.warn(`Runtime error during port setup: ${chrome.runtime.lastError.message}`);\n chrome.runtime.lastError;\n }\n } catch (error) {\n this.logger.error('Error setting up port listener:', error);\n\n if (chrome.runtime.lastError) {\n this.logger.warn(`Additional runtime error: ${chrome.runtime.lastError.message}`);\n chrome.runtime.lastError;\n }\n }\n });\n }\n\n private setupDirectMessageListener(): void {\n if (!chrome?.runtime?.onMessage?.addListener) {\n this.logger.warn('Chrome runtime messaging unavailable; skipping direct message listener');\n return;\n }\n\n chrome.runtime.onMessage.addListener((message, _sender, sendResponse) => {\n if (!this.isDirectBridgeMessage(message)) {\n return false;\n }\n\n const request = message as BridgeRequest;\n this.logger.debug('📮 Direct bridge message received:', {\n key: request.key,\n hasPayload: !!request.payload,\n });\n\n this.diagnostics.directMessageRequests++;\n\n const context = this.createPipelineContext(request);\n this.processMessage(context)\n .then((response) => {\n sendResponse(response);\n })\n .catch(async (error) => {\n this.diagnostics.directMessageErrors++;\n const errResponse = await this.handleError(error as Error, context);\n sendResponse(errResponse);\n });\n\n return true;\n });\n }\n\n private isDirectBridgeMessage(message: unknown): message is BridgeRequest {\n if (!message || typeof message !== 'object') {\n return false;\n }\n return (message as BridgeRequest)[DIRECT_MESSAGE_FLAG] === true;\n }\n\n private initializeKeepAliveAlarm(): void {\n if (!this.keepAlive || this.keepAliveAlarmRegistered) {\n return;\n }\n\n if (!chrome?.alarms?.create || !chrome.alarms.onAlarm?.addListener) {\n this.logger.warn('Chrome alarms API unavailable; keep-alive alarm disabled');\n return;\n }\n\n chrome.alarms.create(BridgeRuntimeManager.KEEP_ALIVE_ALARM_NAME, {\n periodInMinutes: BridgeRuntimeManager.KEEP_ALIVE_ALARM_PERIOD_MINUTES,\n });\n\n chrome.alarms.onAlarm.addListener(this.handleKeepAliveAlarm);\n this.keepAliveAlarmRegistered = true;\n this.logger.info('Registered keep-alive alarm for background wakeups');\n }\n\n private handleKeepAliveAlarm = (alarm: chrome.alarms.Alarm): void => {\n if (alarm.name !== BridgeRuntimeManager.KEEP_ALIVE_ALARM_NAME) {\n return;\n }\n\n chrome.runtime.getPlatformInfo(() => {\n this.recordKeepAlivePing('alarm');\n\n if (chrome.runtime.lastError) {\n this.logger.warn(\n `Chrome runtime error during keep-alive alarm: ${chrome.runtime.lastError.message}`,\n );\n chrome.runtime.lastError;\n }\n });\n };\n\n private recordKeepAlivePing(source: 'interval' | 'alarm'): void {\n const timestamp = Date.now();\n if (source === 'interval') {\n this.diagnostics.keepAliveIntervalPings++;\n this.diagnostics.lastKeepAliveIntervalAt = timestamp;\n } else {\n this.diagnostics.alarmPings++;\n this.diagnostics.lastAlarmPingAt = timestamp;\n }\n }\n\n /**\n * Validate incoming port connection\n */\n private isValidPort(port: chrome.runtime.Port): boolean {\n if (port.name !== this.portName) {\n this.logger.warn(`Ignoring port \"${port.name}\", expected \"${this.portName}\"`);\n return false;\n }\n const senderId = port.sender?.id;\n\n if (senderId !== chrome.runtime.id) {\n this.logger.warn(\n `Ignoring port from different extension (senderId: ${senderId}, expected: ${chrome.runtime.id})`,\n );\n\n return false;\n }\n\n return true;\n }\n\n /**\n * Setup message handler for connected port\n */\n private setupMessageHandler(port: chrome.runtime.Port): void {\n // Track connected ports for broadcasting\n this.connectedPorts.add(port);\n\n // Start keep-alive when first port connects\n if (this.keepAlive && this.connectedPorts.size === 1) {\n this.startKeepAlive();\n }\n\n port.onMessage.addListener(async (message: BridgeRequest | BroadcastMessage) => {\n try {\n // Handle broadcast messages\n if ('type' in message && message.type === 'broadcast') {\n this.logger.debug('📡 Received broadcast:', {\n key: message.key,\n hasPayload: !!message.payload,\n });\n\n this.handleBroadcast(message, port);\n return;\n }\n\n // Handle regular request/response messages\n const request = message as BridgeRequest;\n const context = this.createPipelineContext(request);\n\n this.logger.debug('📨 Received message:', {\n key: request.key,\n id: request.id,\n hasPayload: !!request.payload,\n });\n\n const response = await this.processMessage(context);\n this.sendResponse(port, response);\n } catch (error) {\n // Only send error response for regular requests, not broadcasts\n if (!('type' in message)) {\n const request = message as BridgeRequest;\n const context = this.createPipelineContext(request);\n const errorResponse = await this.handleError(error as Error, context);\n this.sendResponse(port, errorResponse);\n } else {\n this.logger.error('Error handling broadcast:', error);\n }\n }\n });\n\n port.onDisconnect.addListener(() => {\n // Remove from connected ports\n this.connectedPorts.delete(port);\n\n const runtimeErrorMessage = chrome.runtime.lastError?.message;\n\n if (runtimeErrorMessage) {\n this.logger.warn(`📴 Port disconnected with error: ${runtimeErrorMessage}`);\n void chrome.runtime.lastError;\n this.diagnostics.lastPortDisconnectError = runtimeErrorMessage;\n } else {\n this.logger.info(`📴 Port disconnected: ${port.name}`);\n }\n\n this.diagnostics.portDisconnects++;\n this.diagnostics.lastPortDisconnectAt = Date.now();\n\n // Stop keep-alive if no more connected ports (allow SW to sleep)\n if (this.keepAlive && this.connectedPorts.size === 0) {\n this.stopKeepAlive();\n }\n });\n }\n\n /**\n * Create pipeline context for request processing\n */\n private createPipelineContext(request: BridgeRequest): PipelineContext {\n return {\n request,\n startTime: Date.now(),\n metadata: { ...request.metadata },\n };\n }\n\n /**\n * Process message through middleware pipeline and handler\n */\n private async processMessage(context: PipelineContext): Promise<BridgeResponse> {\n const { request } = context;\n\n // Handle internal ping message for health checks\n if (request.key === '__ping__') {\n return {\n id: request.id,\n data: { pong: true, timestamp: Date.now() },\n timestamp: Date.now(),\n };\n }\n\n if (request.key === '__bridge_diagnostics__') {\n return {\n id: request.id,\n data: this.getDiagnosticsSnapshot(),\n timestamp: Date.now(),\n };\n }\n\n this.logger.debug(`Processing message: ${request.key} (id: ${request.id})`);\n\n const handler = this.resolveHandler(request.key);\n const middlewares = MiddlewareRegistry.pipeline(request.key);\n\n this.logger.debug(\n `Running pipeline for: ${request.key} with ${middlewares.length} middlewares`,\n );\n\n const data = await this.runPipeline(middlewares, context, async () => {\n this.logger.debug(`Executing handler for: ${request.key}`);\n const result = await handler.handle(request.payload);\n this.logger.debug(`Handler completed for: ${request.key}`, { resultType: typeof result });\n return result;\n });\n\n this.logger.debug(`Message processed: ${request.key} (id: ${request.id})`);\n\n return {\n id: request.id,\n data,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Resolve message handler from dependency injection container\n */\n private resolveHandler(key: string): MessageHandler {\n try {\n this.logger.debug(`Resolving handler for key: \"${key}\"`);\n\n if (!this.container.isBound(key)) {\n this.logger.error(`Handler \"${key}\" is not bound in container`);\n throw new Error(`Handler \"${key}\" is not registered`);\n }\n\n const handler = this.container.get(key) as MessageHandler;\n\n if (!handler || typeof handler.handle !== 'function') {\n this.logger.error(`Handler \"${key}\" does not have a handle method`, { handler });\n throw new Error(`Handler \"${key}\" does not implement MessageHandler interface`);\n }\n\n this.logger.debug(`Successfully resolved handler for key: \"${key}\"`);\n return handler;\n } catch (error) {\n this.logger.error(`Failed to resolve handler \"${key}\":`, error);\n throw new Error(`Failed to resolve handler \"${key}\": ${(error as Error).message}`);\n }\n }\n\n /**\n * Execute middleware pipeline with proper error handling\n */\n private async runPipeline(\n middlewares: readonly MiddlewareFn[],\n context: PipelineContext,\n finalHandler: () => Promise<unknown>,\n ): Promise<unknown> {\n let currentIndex = -1;\n\n const executeNext = async (): Promise<unknown> => {\n currentIndex++;\n\n if (currentIndex === middlewares.length) {\n return finalHandler();\n }\n\n if (currentIndex > middlewares.length) {\n throw new Error('next() called multiple times');\n }\n\n const middleware = middlewares[currentIndex];\n return middleware(context, executeNext);\n };\n\n return executeNext();\n }\n\n /**\n * Handle errors during message processing\n */\n private async handleError(error: Error, context: PipelineContext): Promise<BridgeResponse> {\n const duration = Date.now() - context.startTime;\n\n this.logger.error(`💥 Message processing failed after ${duration}ms:`, {\n key: context.request.key,\n id: context.request.id,\n error: error.message,\n });\n\n return this.errorHandler.handle(error, context);\n }\n\n /**\n * Handle broadcast messages from UI side\n */\n private handleBroadcast(message: BroadcastMessage, senderPort: chrome.runtime.Port): void {\n // Forward broadcast to all other connected ports (except sender)\n this.connectedPorts.forEach((port) => {\n if (port !== senderPort) {\n try {\n port.postMessage(message);\n } catch (error) {\n this.logger.error('Failed to forward broadcast to port', error);\n // Remove disconnected port\n this.connectedPorts.delete(port);\n }\n }\n });\n }\n\n private getDiagnosticsSnapshot(): BridgeRuntimeDiagnostics {\n return {\n ...this.diagnostics,\n connectedPorts: this.connectedPorts.size,\n };\n }\n\n /**\n * Broadcast message to all connected UI ports from service worker\n */\n public broadcast(key: string, payload: unknown): void {\n const message: BroadcastMessage = {\n type: 'broadcast',\n key,\n payload,\n };\n\n this.logger.debug('📡 Broadcasting from service worker:', {\n key,\n hasPayload: !!payload,\n connectedPorts: this.connectedPorts.size,\n });\n\n this.connectedPorts.forEach((port) => {\n try {\n port.postMessage(message);\n } catch (error) {\n this.logger.error('Failed to broadcast to port', error);\n // Remove disconnected port\n this.connectedPorts.delete(port);\n }\n });\n }\n\n /**\n * Send response back through the port\n */\n private sendResponse(port: chrome.runtime.Port, response: BridgeResponse): void {\n try {\n if (!port) {\n this.logger.warn(`Cannot send response: port is null (ID: ${response.id})`);\n return;\n }\n\n port.postMessage(response);\n\n if (chrome.runtime.lastError) {\n this.logger.warn(\n `Chrome runtime error during postMessage: ${chrome.runtime.lastError.message} (ID: ${response.id})`,\n );\n\n chrome.runtime.lastError;\n return;\n }\n\n this.logger.debug('📤 Response sent:', {\n id: response.id,\n hasData: !!response.data,\n hasError: !!response.error,\n data: response.data,\n });\n } catch (error) {\n this.logger.error('Failed to send response:', error);\n\n if (chrome.runtime.lastError) {\n this.logger.warn(`Additional Chrome runtime error: ${chrome.runtime.lastError.message}`);\n chrome.runtime.lastError;\n }\n }\n }\n\n /**\n * Get runtime statistics\n */\n public getStats(): { portName: string; initialized: boolean } {\n return {\n portName: this.portName,\n initialized: this.isInitialized,\n };\n }\n\n /**\n * Start keep-alive timer to keep service worker alive\n */\n private startKeepAlive(): void {\n if (this.keepAliveTimer) return;\n this.logger.info('Starting keep-alive timer to keep service worker alive');\n this.keepAliveTimer = setInterval(() => {\n chrome.runtime.getPlatformInfo(() => {\n this.recordKeepAlivePing('interval');\n if (chrome.runtime.lastError) {\n this.logger.warn(\n `Chrome runtime error during keep-alive ping: ${chrome.runtime.lastError.message}`,\n );\n chrome.runtime.lastError;\n }\n });\n }, BridgeRuntimeManager.KEEP_ALIVE_INTERVAL_MS);\n }\n\n /**\n * Stop keep-alive timer\n */\n private stopKeepAlive(): void {\n if (this.keepAliveTimer) {\n clearInterval(this.keepAliveTimer);\n this.keepAliveTimer = null;\n this.logger.info('Stopped keep-alive timer');\n }\n }\n}\n\nclass BridgeLogger {\n constructor(private readonly enabled: boolean = true) {}\n\n info(message: string, context?: Record<string, any>): void {\n if (!this.enabled) return;\n console.log(`[Bridge] ${message}`);\n if (context) console.log(' Context:', context);\n }\n\n success(message: string): void {\n if (!this.enabled) return;\n console.log(`[Bridge] ${message}`);\n }\n\n warn(message: string): void {\n if (!this.enabled) return;\n console.warn(`[Bridge] ${message}`);\n }\n\n error(message: string, error?: unknown): void {\n if (!this.enabled) return;\n console.error(`[Bridge] ${message}`);\n if (error) console.error(' Error:', error);\n }\n\n debug(message: string, context?: Record<string, any>): void {\n if (!this.enabled) return;\n console.debug(`[Bridge] ${message}`);\n if (context) console.debug(' Context:', context);\n }\n}\n\nexport function bootstrap(options: BridgeRuntimeOptions): BridgeRuntimeManager {\n const runtime = new BridgeRuntimeManager(options);\n runtime.initialize();\n return runtime;\n}\n\nexport {\n BridgeRuntimeManager,\n DefaultErrorHandler,\n type BridgeRuntimeOptions,\n type BridgeRequest,\n type BridgeResponse,\n type BroadcastMessage,\n type MessageHandler,\n type ErrorHandler,\n type PipelineContext,\n};\n","/**\n * Alarm Adapter for scheduling jobs using Chrome Alarms API\n *\n * Chrome Alarms API benefits for Service Workers:\n * - Alarms survive SW termination and wake it up when they fire\n * - Browser manages them independently of JS event loop\n * - More reliable for periodic tasks than setTimeout/setInterval\n *\n * Limitations:\n * - Minimum granularity is ~1 minute (delayInMinutes must be >= 0.5 in dev, >= 1 in prod)\n * - Falls back to setTimeout if Chrome Alarms API is unavailable\n */\nexport class AlarmAdapter {\n private static readonly ALARM_PREFIX = 'chroma_job_';\n private callbacks = new Map<string, () => void>();\n private listenerRegistered = false;\n private triggerCallback?: (id: string) => void;\n\n constructor() {\n this.initializeAlarmListener();\n }\n\n /**\n * Initialize the Chrome Alarms listener (once)\n */\n private initializeAlarmListener = (): void => {\n if (this.listenerRegistered) return;\n\n if (this.isChromeAlarmsAvailable()) {\n // Clear any stale alarms from previous SW instances before registering listener\n this.clearStaleAlarms();\n\n chrome.alarms.onAlarm.addListener(this.handleAlarm);\n this.listenerRegistered = true;\n console.log('[AlarmAdapter] ✅ Chrome Alarms API available and listener registered');\n } else {\n console.log(\n '[AlarmAdapter] ⚠️ Chrome Alarms API not available - will use setTimeout fallback',\n );\n }\n };\n\n /**\n * Clear any stale chroma alarms from previous SW instances\n */\n private clearStaleAlarms = (): void => {\n if (!this.isChromeAlarmsAvailable()) return;\n\n chrome.alarms.getAll((alarms) => {\n const staleAlarms = alarms.filter((a) => a.name.startsWith(AlarmAdapter.ALARM_PREFIX));\n if (staleAlarms.length > 0) {\n console.log(\n `[AlarmAdapter] 🧹 Clearing ${staleAlarms.length} stale alarms from previous session`,\n );\n staleAlarms.forEach((alarm) => {\n chrome.alarms.clear(alarm.name);\n });\n }\n });\n };\n\n /**\n * Check if Chrome Alarms API is available\n */\n private isChromeAlarmsAvailable = (): boolean => {\n return !!(\n typeof chrome !== 'undefined' &&\n chrome.alarms &&\n typeof chrome.alarms.create === 'function' &&\n typeof chrome.alarms.clear === 'function' &&\n chrome.alarms.onAlarm?.addListener\n );\n };\n\n /**\n * Handle alarm trigger from Chrome\n */\n private handleAlarm = (alarm: chrome.alarms.Alarm): void => {\n // Only handle our alarms (prefixed)\n if (!alarm.name.startsWith(AlarmAdapter.ALARM_PREFIX)) {\n return;\n }\n\n const jobId = alarm.name.slice(AlarmAdapter.ALARM_PREFIX.length);\n console.log(`[AlarmAdapter] 🔔 Chrome Alarm fired: ${jobId}`);\n this.callbacks.delete(jobId);\n this.triggerCallback?.(jobId);\n };\n\n onTrigger = (callback: (id: string) => void): void => {\n this.triggerCallback = callback;\n };\n\n schedule = (id: string, when: number): NodeJS.Timeout | null => {\n // Cancel any existing alarm for this id to prevent leaks\n this.cancel(id);\n\n const delay = Math.max(0, when - Date.now());\n const delayInMinutes = delay / 60000;\n\n // Use Chrome Alarms API if available and delay is at least 30 seconds\n // Chrome requires minimum ~0.5 minutes in dev, 1 minute in production\n if (this.isChromeAlarmsAvailable() && delayInMinutes >= 0.5) {\n const alarmName = `${AlarmAdapter.ALARM_PREFIX}${id}`;\n\n chrome.alarms.create(alarmName, {\n when,\n });\n\n console.log(\n `[AlarmAdapter] ⏰ Chrome Alarm scheduled: ${id} in ${Math.round(delay / 1000)}s`,\n );\n\n // Store a no-op callback just to track active alarms\n this.callbacks.set(id, () => {\n chrome.alarms.clear(alarmName);\n });\n\n return null; // No timeout ID for Chrome alarms\n }\n\n console.log(\n `[AlarmAdapter] ⏱️ setTimeout fallback: ${id} in ${Math.round(delay / 1000)}s (Chrome Alarms: ${this.isChromeAlarmsAvailable() ? 'available but delay too short' : 'unavailable'})`,\n );\n\n // Fall back to setTimeout for very short delays or if Chrome Alarms unavailable\n const timeoutId = setTimeout(() => {\n this.callbacks.delete(id);\n this.triggerCallback?.(id);\n }, delay);\n\n this.callbacks.set(id, () => clearTimeout(timeoutId));\n return timeoutId;\n };\n\n cancel = (id: string): void => {\n const callback = this.callbacks.get(id);\n if (callback) {\n callback();\n this.callbacks.delete(id);\n }\n\n // Also try to clear Chrome alarm directly (in case callback wasn't set)\n if (this.isChromeAlarmsAvailable()) {\n const alarmName = `${AlarmAdapter.ALARM_PREFIX}${id}`;\n chrome.alarms.clear(alarmName);\n }\n };\n\n /**\n * Get the number of active alarms (for debugging/monitoring)\n */\n size = (): number => {\n return this.callbacks.size;\n };\n\n /**\n * Clear all alarms (for shutdown)\n */\n clear = (): void => {\n for (const [id, callback] of this.callbacks.entries()) {\n callback();\n }\n this.callbacks.clear();\n\n // Clear all Chrome alarms with our prefix\n if (this.isChromeAlarmsAvailable()) {\n chrome.alarms.getAll((alarms) => {\n for (const alarm of alarms) {\n if (alarm.name.startsWith(AlarmAdapter.ALARM_PREFIX)) {\n chrome.alarms.clear(alarm.name);\n }\n }\n });\n }\n };\n\n /**\n * Get diagnostic info about active alarms\n */\n getDiagnostics = async (): Promise<{\n trackedAlarms: number;\n chromeAlarms: chrome.alarms.Alarm[];\n usingChromeApi: boolean;\n }> => {\n const chromeAlarms: chrome.alarms.Alarm[] = [];\n\n if (this.isChromeAlarmsAvailable()) {\n await new Promise<void>((resolve) => {\n chrome.alarms.getAll((alarms) => {\n chromeAlarms.push(...alarms.filter((a) => a.name.startsWith(AlarmAdapter.ALARM_PREFIX)));\n resolve();\n });\n });\n }\n\n return {\n trackedAlarms: this.callbacks.size,\n chromeAlarms,\n usingChromeApi: this.isChromeAlarmsAvailable(),\n };\n };\n}\n","export class TimeoutAdapter {\n private callbacks = new Map<string, () => void>();\n private triggerCallback?: (id: string) => void;\n\n onTrigger = (callback: (id: string) => void): void => {\n this.triggerCallback = callback;\n };\n\n schedule = (id: string, when: number): NodeJS.Timeout => {\n // Cancel any existing timer for this id to prevent leaks\n this.cancel(id);\n\n const delay = Math.max(0, when - Date.now());\n\n const timeoutId = setTimeout(() => {\n this.callbacks.delete(id);\n this.triggerCallback?.(id);\n }, delay);\n\n this.callbacks.set(id, () => clearTimeout(timeoutId));\n return timeoutId;\n };\n\n cancel = (id: string): void => {\n const callback = this.callbacks.get(id);\n if (callback) {\n callback();\n this.callbacks.delete(id);\n }\n };\n\n /**\n * Get the number of active timers (for debugging/monitoring)\n */\n size = (): number => {\n return this.callbacks.size;\n };\n\n /**\n * Clear all timers (for shutdown)\n */\n clear = (): void => {\n for (const callback of this.callbacks.values()) {\n callback();\n }\n this.callbacks.clear();\n };\n}\n","import { IJob } from '../core/IJob';\nimport { JobOptions } from '../core/JobOptions';\nimport { JobState, JobContext } from '../core/IJob';\n\ninterface JobEntry {\n job: IJob;\n context: JobContext;\n options: JobOptions;\n timeoutId?: NodeJS.Timeout;\n intervalId?: NodeJS.Timeout;\n}\n\nexport class JobRegistry {\n private static _instance: JobRegistry;\n private jobs = new Map<string, JobEntry>();\n\n static get instance(): JobRegistry {\n if (!JobRegistry._instance) {\n JobRegistry._instance = new JobRegistry();\n }\n return JobRegistry._instance;\n }\n\n /**\n * Remove a job from the registry (for cleanup after permanent stop)\n */\n remove(id: string): boolean {\n const entry = this.jobs.get(id);\n if (entry) {\n this.clearTimers(id);\n this.jobs.delete(id);\n return true;\n }\n return false;\n }\n\n /**\n * Get the number of registered jobs\n */\n size(): number {\n return this.jobs.size;\n }\n\n /**\n * Clear all jobs (useful for testing or shutdown)\n */\n clear(): void {\n for (const id of this.jobs.keys()) {\n this.clearTimers(id);\n }\n this.jobs.clear();\n }\n\n register(id: string, job: IJob, options: JobOptions) {\n const context = this.createJobContext(id, options);\n\n this.jobs.set(id, {\n job,\n context,\n options,\n });\n }\n\n resolve(id: string): IJob | undefined {\n const entry = this.jobs.get(id);\n return entry?.job;\n }\n\n meta(id: string): JobOptions | undefined {\n const entry = this.jobs.get(id);\n return entry?.options;\n }\n\n getContext(id: string): JobContext | undefined {\n const entry = this.jobs.get(id);\n return entry?.context;\n }\n\n updateState(id: string, state: JobState): void {\n const entry = this.jobs.get(id);\n\n if (entry) {\n entry.context.state = state;\n entry.context.updatedAt = new Date();\n\n switch (state) {\n case JobState.RUNNING:\n entry.context.startedAt = new Date();\n break;\n case JobState.PAUSED:\n entry.context.pausedAt = new Date();\n break;\n case JobState.STOPPED:\n entry.context.stoppedAt = new Date();\n break;\n case JobState.COMPLETED:\n entry.context.completedAt = new Date();\n break;\n }\n }\n }\n\n setTimeoutId(id: string, timeoutId: NodeJS.Timeout): void {\n const entry = this.jobs.get(id);\n if (entry) {\n entry.timeoutId = timeoutId;\n }\n }\n\n setIntervalId(id: string, intervalId: NodeJS.Timeout): void {\n const entry = this.jobs.get(id);\n if (entry) {\n entry.intervalId = intervalId;\n }\n }\n\n clearTimers(id: string): void {\n const entry = this.jobs.get(id);\n if (entry) {\n if (entry.timeoutId) {\n clearTimeout(entry.timeoutId);\n entry.timeoutId = undefined;\n }\n if (entry.intervalId) {\n clearInterval(entry.intervalId);\n entry.intervalId = undefined;\n }\n }\n }\n\n pause(id: string): void {\n const entry = this.jobs.get(id);\n if (entry && entry.context.state === JobState.RUNNING) {\n this.updateState(id, JobState.PAUSED);\n this.clearTimers(id);\n entry.job.pause?.();\n }\n }\n\n resume(id: string): void {\n const entry = this.jobs.get(id);\n if (entry && entry.context.state === JobState.PAUSED) {\n this.updateState(id, JobState.SCHEDULED);\n entry.job.resume?.();\n }\n }\n\n stop(id: string): void {\n const entry = this.jobs.get(id);\n if (entry && entry.context.state !== JobState.STOPPED) {\n this.updateState(id, JobState.STOPPED);\n this.clearTimers(id);\n entry.job.stop?.();\n }\n }\n\n listAll(): Array<{ id: string; state: JobState; options: JobOptions }> {\n const jobs: Array<{ id: string; state: JobState; options: JobOptions }> = [];\n this.jobs.forEach((entry, id) => {\n jobs.push({\n id,\n state: entry.context.state,\n options: entry.options,\n });\n });\n return jobs;\n }\n\n private createJobContext(id: string, options: JobOptions): JobContext {\n const now = new Date();\n\n return {\n id,\n options,\n state: JobState.SCHEDULED,\n createdAt: now,\n updatedAt: now,\n retryCount: 0,\n\n pause: () => this.pause(id),\n resume: () => this.resume(id),\n stop: () => this.stop(id),\n complete: () => this.updateState(id, JobState.COMPLETED),\n fail: (error: Error) => {\n this.updateState(id, JobState.FAILED);\n const entry = this.jobs.get(id);\n if (entry) entry.context.error = error;\n },\n retry: () => {\n const entry = this.jobs.get(id);\n if (entry) {\n entry.context.retryCount = (entry.context.retryCount || 0) + 1;\n this.updateState(id, JobState.SCHEDULED);\n }\n },\n\n isRunning: () => this.getContext(id)?.state === JobState.RUNNING,\n isPaused: () => this.getContext(id)?.state === JobState.PAUSED,\n isStopped: () => this.getContext(id)?.state === JobState.STOPPED,\n isCompleted: () => this.getContext(id)?.state === JobState.COMPLETED,\n isFailed: () => this.getContext(id)?.state === JobState.FAILED,\n isRetrying: () => (this.getContext(id)?.retryCount || 0) > 0,\n isScheduled: () => this.getContext(id)?.state === JobState.SCHEDULED,\n isDelayed: () => !!options.delay,\n isRecurring: () => !!options.cron || !!options.recurring,\n isCron: () => !!options.cron,\n isTimeout: () => !!options.delay && !options.cron && !options.recurring,\n isAlarm: () => !!options.cron || (!!options.delay && options.delay > 60000),\n };\n }\n}\n","export const TIMEOUT_MAX = 2147483647; // 2^31-1\n/**\n * Creates a new timeout, which can exceed the max timeout limit of 2^31-1.\n * Since multiple timeouts are used internally, the timeoutId used to clear the timeout\n * is returned as a handle (object) and changes whenever the max timeout limit is exceeded.\n * The handle parameter can be ignored, it is used internally for updating the timeoutId\n * in the handle after creating the next timeout.\n */\nexport function longTimeout(fn, timeout, previousHandle) {\n let nextTimeout = timeout;\n let remainingTimeout = 0;\n if (nextTimeout > TIMEOUT_MAX) {\n remainingTimeout = nextTimeout - TIMEOUT_MAX;\n nextTimeout = TIMEOUT_MAX;\n }\n const handle = previousHandle !== null && previousHandle !== void 0 ? previousHandle : {\n timeoutId: undefined,\n };\n handle.timeoutId = setTimeout(() => {\n if (remainingTimeout > 0) {\n longTimeout(fn, remainingTimeout, previousHandle);\n }\n else {\n fn();\n }\n }, nextTimeout);\n return handle;\n}\n/* Extracts second, minute, hour, date, month and the weekday from a date. */\nexport function extractDateElements(date) {\n return {\n second: date.getSeconds(),\n minute: date.getMinutes(),\n hour: date.getHours(),\n day: date.getDate(),\n month: date.getMonth(),\n weekday: date.getDay(),\n year: date.getFullYear(),\n };\n}\n/* Gets the amount of days in the given month (indexed by 0) of the given year. */\nexport function getDaysInMonth(year, month) {\n return new Date(year, month + 1, 0).getDate();\n}\n/* Gets the amount of days from weekday1 to weekday2. */\nexport function getDaysBetweenWeekdays(weekday1, weekday2) {\n if (weekday1 <= weekday2) {\n return weekday2 - weekday1;\n }\n return 6 - weekday1 + weekday2 + 1;\n}\nexport function wrapFunction(fn, errorHandler) {\n return () => {\n try {\n const res = fn();\n if (res instanceof Promise) {\n res.catch((err) => {\n if (errorHandler) {\n errorHandler(err);\n }\n });\n }\n }\n catch (err) {\n if (errorHandler) {\n errorHandler(err);\n }\n }\n };\n}\n//# sourceMappingURL=utils.js.map","import { extractDateElements, getDaysBetweenWeekdays, getDaysInMonth, } from './utils.js';\nexport class Cron {\n constructor({ seconds, minutes, hours, days, months, weekdays, }) {\n // Validate that there are values provided.\n if (!seconds || seconds.size === 0)\n throw new Error('There must be at least one allowed second.');\n if (!minutes || minutes.size === 0)\n throw new Error('There must be at least one allowed minute.');\n if (!hours || hours.size === 0)\n throw new Error('There must be at least one allowed hour.');\n if (!months || months.size === 0)\n throw new Error('There must be at least one allowed month.');\n if ((!weekdays || weekdays.size === 0) && (!days || days.size === 0))\n throw new Error('There must be at least one allowed day or weekday.');\n // Convert set to array and sort in ascending order.\n this.seconds = Array.from(seconds).sort((a, b) => a - b);\n this.minutes = Array.from(minutes).sort((a, b) => a - b);\n this.hours = Array.from(hours).sort((a, b) => a - b);\n this.days = Array.from(days).sort((a, b) => a - b);\n this.months = Array.from(months).sort((a, b) => a - b);\n this.weekdays = Array.from(weekdays).sort((a, b) => a - b);\n // Validate that all values are integers within the constraint.\n const validateData = (name, data, constraint) => {\n if (data.some((x) => typeof x !== 'number' ||\n x % 1 !== 0 ||\n x < constraint.min ||\n x > constraint.max)) {\n throw new Error(`${name} must only consist of integers which are within the range of ${constraint.min} and ${constraint.max}`);\n }\n };\n validateData('seconds', this.seconds, { min: 0, max: 59 });\n validateData('minutes', this.minutes, { min: 0, max: 59 });\n validateData('hours', this.hours, { min: 0, max: 23 });\n validateData('days', this.days, { min: 1, max: 31 });\n validateData('months', this.months, { min: 0, max: 11 });\n validateData('weekdays', this.weekdays, { min: 0, max: 6 });\n // For each element, store a reversed copy in the reversed attribute for finding prev dates.\n this.reversed = {\n seconds: this.seconds.map((x) => x).reverse(),\n minutes: this.minutes.map((x) => x).reverse(),\n hours: this.hours.map((x) => x).reverse(),\n days: this.days.map((x) => x).reverse(),\n months: this.months.map((x) => x).reverse(),\n weekdays: this.weekdays.map((x) => x).reverse(),\n };\n }\n /**\n * Find the next or previous hour, starting from the given start hour that matches the hour constraint.\n * startHour itself might also be allowed.\n */\n findAllowedHour(dir, startHour) {\n return dir === 'next'\n ? this.hours.find((x) => x >= startHour)\n : this.reversed.hours.find((x) => x <= startHour);\n }\n /**\n * Find the next or previous minute, starting from the given start minute that matches the minute constraint.\n * startMinute itself might also be allowed.\n */\n findAllowedMinute(dir, startMinute) {\n return dir === 'next'\n ? this.minutes.find((x) => x >= startMinute)\n : this.reversed.minutes.find((x) => x <= startMinute);\n }\n /**\n * Find the next or previous second, starting from the given start second that matches the second constraint.\n * startSecond itself IS NOT allowed.\n */\n findAllowedSecond(dir, startSecond) {\n return dir === 'next'\n ? this.seconds.find((x) => x > startSecond)\n : this.reversed.seconds.find((x) => x < startSecond);\n }\n /**\n * Find the next or previous time, starting from the given start time that matches the hour, minute\n * and second constraints. startTime itself might also be allowed.\n */\n findAllowedTime(dir, startTime) {\n // Try to find an allowed hour.\n let hour = this.findAllowedHour(dir, startTime.hour);\n if (hour !== undefined) {\n if (hour === startTime.hour) {\n // We found an hour that is the start hour. Try to find an allowed minute.\n let minute = this.findAllowedMinute(dir, startTime.minute);\n if (minute !== undefined) {\n if (minute === startTime.minute) {\n // We found a minute that is the start minute. Try to find an allowed second.\n const second = this.findAllowedSecond(dir, startTime.second);\n if (second !== undefined) {\n // We found a second within the start hour and minute.\n return { hour, minute, second };\n }\n // We did not find a valid second within the start minute. Try to find another minute.\n minute = this.findAllowedMinute(dir, dir === 'next' ? startTime.minute + 1 : startTime.minute - 1);\n if (minute !== undefined) {\n // We found a minute which is not the start minute. Return that minute together with the hour and the first / last allowed second.\n return {\n hour,\n minute,\n second: dir === 'next' ? this.seconds[0] : this.reversed.seconds[0],\n };\n }\n }\n else {\n // We found a minute which is not the start minute. Return that minute together with the hour and the first / last allowed second.\n return {\n hour,\n minute,\n second: dir === 'next' ? this.seconds[0] : this.reversed.seconds[0],\n };\n }\n }\n // We did not find an allowed minute / second combination inside the start hour. Try to find the next / previous allowed hour.\n hour = this.findAllowedHour(dir, dir === 'next' ? startTime.hour + 1 : startTime.hour - 1);\n if (hour !== undefined) {\n // We found an allowed hour which is not the start hour. Return that hour together with the first / last allowed minutes / seconds.\n return {\n hour,\n minute: dir === 'next' ? this.minutes[0] : this.reversed.minutes[0],\n second: dir === 'next' ? this.seconds[0] : this.reversed.seconds[0],\n };\n }\n }\n else {\n // We found an allowed hour which is not the start hour. Return that hour together with the first / last allowed minutes / seconds.\n return {\n hour,\n minute: dir === 'next' ? this.minutes[0] : this.reversed.minutes[0],\n second: dir === 'next' ? this.seconds[0] : this.reversed.seconds[0],\n };\n }\n }\n // No allowed time found.\n return undefined;\n }\n /**\n * Find the next or previous day in the given month, starting from the given startDay\n * that matches either the day or the weekday constraint. startDay itself might also be allowed.\n */\n findAllowedDayInMonth(dir, year, month, startDay) {\n var _a, _b;\n if (startDay < 1)\n throw new Error('startDay must not be smaller than 1.');\n // If only days are restricted: allow day based on day constraint only.\n // If only weekdays are restricted: allow day based on weekday constraint only.\n // If both are restricted: allow day based on both day and weekday constraint. pick day that is closer to startDay.\n // If none are restricted: return the day closest to startDay (respecting dir) that is allowed (or startDay itself).\n const daysInMonth = getDaysInMonth(year, month);\n const daysRestricted = this.days.length !== 31;\n const weekdaysRestricted = this.weekdays.length !== 7;\n if (!daysRestricted && !weekdaysRestricted) {\n if (startDay > daysInMonth) {\n return dir === 'next' ? undefined : daysInMonth;\n }\n return startDay;\n }\n // Try to find a day based on the days constraint.\n let allowedDayByDays;\n if (daysRestricted) {\n allowedDayByDays =\n dir === 'next'\n ? this.days.find((x) => x >= startDay)\n : this.reversed.days.find((x) => x <= startDay);\n // Make sure the day does not exceed the amount of days in month.\n if (allowedDayByDays !== undefined && allowedDayByDays > daysInMonth) {\n allowedDayByDays = undefined;\n }\n }\n // Try to find a day based on the weekday constraint.\n let allowedDayByWeekdays;\n if (weekdaysRestricted) {\n const startWeekday = new Date(year, month, startDay).getDay();\n const nearestAllowedWeekday = dir === 'next'\n ? (_a = this.weekdays.find((x) => x >= startWeekday)) !== null && _a !== void 0 ? _a : this.weekdays[0]\n : (_b = this.reversed.weekdays.find((x) => x <= startWeekday)) !== null && _b !== void 0 ? _b : this.reversed.weekdays[0];\n if (nearestAllowedWeekday !== undefined) {\n const daysBetweenWeekdays = dir === 'next'\n ? getDaysBetweenWeekdays(startWeekday, nearestAllowedWeekday)\n : getDaysBetweenWeekdays(nearestAllowedWeekday, startWeekday);\n allowedDayByWeekdays =\n dir === 'next'\n ? startDay + daysBetweenWeekdays\n : startDay - daysBetweenWeekdays;\n // Make sure the day does not exceed the month boundaries.\n if (allowedDayByWeekdays > daysInMonth || allowedDayByWeekdays < 1) {\n allowedDayByWeekdays = undefined;\n }\n }\n }\n if (allowedDayByDays !== undefined && allowedDayByWeekdays !== undefined) {\n // If a day is found both via the days and the weekdays constraint, pick the day\n // that is closer to start date.\n return dir === 'next'\n ? Math.min(allowedDayByDays, allowedDayByWeekdays)\n : Math.max(allowedDayByDays, allowedDayByWeekdays);\n }\n if (allowedDayByDays !== undefined) {\n return allowedDayByDays;\n }\n if (allowedDayByWeekdays !== undefined) {\n return allowedDayByWeekdays;\n }\n return undefined;\n }\n /** Gets the next date starting from the given start date or now. */\n getNextDate(startDate = new Date()) {\n const startDateElements = extractDateElements(startDate);\n let minYear = startDateElements.year;\n let startIndexMonth = this.months.findIndex((x) => x >= startDateElements.month);\n if (startIndexMonth === -1) {\n startIndexMonth = 0;\n minYear++;\n }\n // We try every month within the next 5 years to make sure that we tried to\n // find a matching date insidde a whole leap year.\n const maxIterations = this.months.length * 5;\n for (let i = 0; i < maxIterations; i++) {\n // Get the next year and month.\n const year = minYear + Math.floor((startIndexMonth + i) / this.months.length);\n const month = this.months[(startIndexMonth + i) % this.months.length];\n const isStartMonth = year === startDateElements.year && month === startDateElements.month;\n // Find the next day.\n let day = this.findAllowedDayInMonth('next', year, month, isStartMonth ? startDateElements.day : 1);\n let isStartDay = isStartMonth && day === startDateElements.day;\n // If we found a day and it is the start day, try to find a valid time beginning from the start date time.\n if (day !== undefined && isStartDay) {\n const nextTime = this.findAllowedTime('next', startDateElements);\n if (nextTime !== undefined) {\n return new Date(year, month, day, nextTime.hour, nextTime.minute, nextTime.second);\n }\n // If no valid time has been found for the start date, try the next day.\n day = this.findAllowedDayInMonth('next', year, month, day + 1);\n isStartDay = false;\n }\n // If we found a next day and it is not the start day, just use the next day with the first allowed values\n // for hours, minutes and seconds.\n if (day !== undefined && !isStartDay) {\n return new Date(year, month, day, this.hours[0], this.minutes[0], this.seconds[0]);\n }\n // No allowed day has been found for this month. Continue to search in next month.\n }\n throw new Error('No valid next date was found.');\n }\n /** Gets the specified amount of future dates starting from the given start date or now. */\n getNextDates(amount, startDate) {\n const dates = [];\n let nextDate;\n for (let i = 0; i < amount; i++) {\n nextDate = this.getNextDate(nextDate !== null && nextDate !== void 0 ? nextDate : startDate);\n dates.push(nextDate);\n }\n return dates;\n }\n /**\n * Get an ES6 compatible iterator which iterates over the next dates starting from startDate or now.\n * The iterator runs until the optional endDate is reached or forever.\n */\n *getNextDatesIterator(startDate, endDate) {\n let nextDate;\n while (true) {\n nextDate = this.getNextDate(nextDate !== null && nextDate !== void 0 ? nextDate : startDate);\n if (endDate && endDate.getTime() < nextDate.getTime()) {\n return;\n }\n yield nextDate;\n }\n }\n /** Gets the previous date starting from the given start date or now. */\n getPrevDate(startDate = new Date()) {\n const startDateElements = extractDateElements(startDate);\n let maxYear = startDateElements.year;\n let startIndexMonth = this.reversed.months.findIndex((x) => x <= startDateElements.month);\n if (startIndexMonth === -1) {\n startIndexMonth = 0;\n maxYear--;\n }\n // We try every month within the past 5 years to make sure that we tried to\n // find a matching date inside a whole leap year.\n const maxIterations = this.reversed.months.length * 5;\n for (let i = 0; i < maxIterations; i++) {\n // Get the next year and month.\n const year = maxYear -\n Math.floor((startIndexMonth + i) / this.reversed.months.length);\n const month = this.reversed.months[(startIndexMonth + i) % this.reversed.months.length];\n const isStartMonth = year === startDateElements.year && month === startDateElements.month;\n // Find the previous day.\n let day = this.findAllowedDayInMonth('prev', year, month, isStartMonth\n ? startDateElements.day\n : // Start searching from the last day of the month.\n getDaysInMonth(year, month));\n let isStartDay = isStartMonth && day === startDateElements.day;\n // If we found a day and it is the start day, try to find a valid time beginning from the start date time.\n if (day !== undefined && isStartDay) {\n const prevTime = this.findAllowedTime('prev', startDateElements);\n if (prevTime !== undefined) {\n return new Date(year, month, day, prevTime.hour, prevTime.minute, prevTime.second);\n }\n // If no valid time has been found for the start date, try the previous day.\n if (day > 1) {\n day = this.findAllowedDayInMonth('prev', year, month, day - 1);\n isStartDay = false;\n }\n }\n // If we found a previous day and it is not the start day, just use the previous day with the first allowed values\n // for hours, minutes and seconds (which will be the latest time due to using the reversed array).\n if (day !== undefined && !isStartDay) {\n return new Date(year, month, day, this.reversed.hours[0], this.reversed.minutes[0], this.reversed.seconds[0]);\n }\n // No allowed day has been found for this month. Continue to search in previous month.\n }\n throw new Error('No valid previous date was found.');\n }\n /** Gets the specified amount of previous dates starting from the given start date or now. */\n getPrevDates(amount, startDate) {\n const dates = [];\n let prevDate;\n for (let i = 0; i < amount; i++) {\n prevDate = this.getPrevDate(prevDate !== null && prevDate !== void 0 ? prevDate : startDate);\n dates.push(prevDate);\n }\n return dates;\n }\n /**\n * Get an ES6 compatible iterator which iterates over the previous dates starting from startDate or now.\n * The iterator runs until the optional endDate is reached or forever.\n */\n *getPrevDatesIterator(startDate, endDate) {\n let prevDate;\n while (true) {\n prevDate = this.getPrevDate(prevDate !== null && prevDate !== void 0 ? prevDate : startDate);\n if (endDate && endDate.getTime() > prevDate.getTime()) {\n return;\n }\n yield prevDate;\n }\n }\n /** Returns true when there is a cron date at the given date. */\n matchDate(date) {\n const { second, minute, hour, day, month, weekday } = extractDateElements(date);\n if (this.seconds.indexOf(second) === -1 ||\n this.minutes.indexOf(minute) === -1 ||\n this.hours.indexOf(hour) === -1 ||\n this.months.indexOf(month) === -1) {\n return false;\n }\n if (this.days.length !== 31 && this.weekdays.length !== 7) {\n return (this.days.indexOf(day) !== -1 || this.weekdays.indexOf(weekday) !== -1);\n }\n return (this.days.indexOf(day) !== -1 && this.weekdays.indexOf(weekday) !== -1);\n }\n}\n//# sourceMappingURL=cron.js.map","import { Cron } from './cron.js';\nconst secondConstraint = {\n min: 0,\n max: 59,\n};\nconst minuteConstraint = {\n min: 0,\n max: 59,\n};\nconst hourConstraint = {\n min: 0,\n max: 23,\n};\nconst dayConstraint = {\n min: 1,\n max: 31,\n};\nconst monthConstraint = {\n min: 1,\n max: 12,\n aliases: {\n jan: '1',\n feb: '2',\n mar: '3',\n apr: '4',\n may: '5',\n jun: '6',\n jul: '7',\n aug: '8',\n sep: '9',\n oct: '10',\n nov: '11',\n dec: '12',\n },\n};\nconst weekdayConstraint = {\n min: 0,\n max: 7,\n aliases: {\n mon: '1',\n tue: '2',\n wed: '3',\n thu: '4',\n fri: '5',\n sat: '6',\n sun: '7',\n },\n};\nconst timeNicknames = {\n '@yearly': '0 0 1 1 *',\n '@annually': '0 0 1 1 *',\n '@monthly': '0 0 1 * *',\n '@weekly': '0 0 * * 0',\n '@daily': '0 0 * * *',\n '@hourly': '0 * * * *',\n '@minutely': '* * * * *',\n};\nfunction parseElement(element, constraint) {\n const result = new Set();\n // If returned set of numbers is empty, the scheduler class interpretes the emtpy set of numbers as all valid values of the constraint\n if (element === '*') {\n for (let i = constraint.min; i <= constraint.max; i = i + 1) {\n result.add(i);\n }\n return result;\n }\n // If the element is a list, parse each element in the list.\n const listElements = element.split(',');\n if (listElements.length > 1) {\n for (const listElement of listElements) {\n const parsedListElement = parseElement(listElement, constraint);\n for (const x of parsedListElement) {\n result.add(x);\n }\n }\n return result;\n }\n // Helper function to parse a single element, which includes checking for alias, valid number and constraint min and max.\n const parseSingleElement = (singleElement) => {\n var _a, _b;\n // biome-ignore lint/style/noParameterAssign: adding another variable with a new name is more confusing\n singleElement =\n (_b = (_a = constraint.aliases) === null || _a === void 0 ? void 0 : _a[singleElement.toLowerCase()]) !== null && _b !== void 0 ? _b : singleElement;\n const parsedElement = Number.parseInt(singleElement, 10);\n if (Number.isNaN(parsedElement)) {\n throw new Error(`Failed to parse ${element}: ${singleElement} is NaN.`);\n }\n if (parsedElement < constraint.min || parsedElement > constraint.max) {\n throw new Error(`Failed to parse ${element}: ${singleElement} is outside of constraint range of ${constraint.min} - ${constraint.max}.`);\n }\n return parsedElement;\n };\n // Detect if the element is a range.\n // Possible range formats: 'start-end', 'start-end/step', '*', '*/step'.\n // Where start and end can be numbers or aliases.\n // Capture groups: 1: start-end, 2: start, 3: end, 4: /step, 5: step.\n const rangeSegments = /^(([0-9a-zA-Z]+)-([0-9a-zA-Z]+)|\\*)(\\/([0-9]+))?$/.exec(element);\n // If not, it must be a single element.\n if (rangeSegments === null) {\n result.add(parseSingleElement(element));\n return result;\n }\n // If it is a range, get start and end of the range.\n let parsedStart = rangeSegments[1] === '*'\n ? constraint.min\n : parseSingleElement(rangeSegments[2]);\n const parsedEnd = rangeSegments[1] === '*'\n ? constraint.max\n : parseSingleElement(rangeSegments[3]);\n // need to catch Sunday, which gets parsed here as 7, but is also legitimate at the start of a range as 0, to avoid the out of order error\n if (constraint === weekdayConstraint &&\n parsedStart === 7 &&\n // this check ensures that sun-sun is not incorrectly parsed as [0,1,2,3,4,5,6]\n parsedEnd !== 7) {\n parsedStart = 0;\n }\n if (parsedStart > parsedEnd) {\n throw new Error(`Failed to parse ${element}: Invalid range (start: ${parsedStart}, end: ${parsedEnd}).`);\n }\n // Check whether there is a custom step defined for the range, defaulting to 1.\n const step = rangeSegments[5];\n let parsedStep = 1;\n if (step !== undefined) {\n parsedStep = Number.parseInt(step, 10);\n if (Number.isNaN(parsedStep)) {\n throw new Error(`Failed to parse step: ${step} is NaN.`);\n }\n if (parsedStep < 1) {\n throw new Error(`Failed to parse step: Expected ${step} to be greater than 0.`);\n }\n }\n // Go from start to end of the range by the given steps.\n for (let i = parsedStart; i <= parsedEnd; i = i + parsedStep) {\n result.add(i);\n }\n return result;\n}\n/** Parses a cron expression into a Cron instance. */\nexport function parseCronExpression(cronExpression) {\n var _a;\n if (typeof cronExpression !== 'string') {\n throw new TypeError('Invalid cron expression: must be of type string.');\n }\n // Convert time nicknames.\n // biome-ignore lint/style/noParameterAssign: adding another variable with a new name is more confusing\n cronExpression = (_a = timeNicknames[cronExpression.toLowerCase()]) !== null && _a !== void 0 ? _a : cronExpression;\n // Split the cron expression into its elements, removing empty elements (extra whitespaces).\n const elements = cronExpression.split(' ').filter((elem) => elem.length > 0);\n if (elements.length < 5 || elements.length > 6) {\n throw new Error('Invalid cron expression: expected 5 or 6 elements.');\n }\n const rawSeconds = elements.length === 6 ? elements[0] : '0';\n const rawMinutes = elements.length === 6 ? elements[1] : elements[0];\n const rawHours = elements.length === 6 ? elements[2] : elements[1];\n const rawDays = elements.length === 6 ? elements[3] : elements[2];\n const rawMonths = elements.length === 6 ? elements[4] : elements[3];\n const rawWeekdays = elements.length === 6 ? elements[5] : elements[4];\n return new Cron({\n seconds: parseElement(rawSeconds, secondConstraint),\n minutes: parseElement(rawMinutes, minuteConstraint),\n hours: parseElement(rawHours, hourConstraint),\n days: parseElement(rawDays, dayConstraint),\n // months in cron are indexed by 1, but Cron expects indexes by 0, so we need to reduce all set values by one.\n months: new Set(Array.from(parseElement(rawMonths, monthConstraint)).map((x) => x - 1)),\n weekdays: new Set(Array.from(parseElement(rawWeekdays, weekdayConstraint)).map((x) => x % 7)),\n });\n}\n//# sourceMappingURL=cron-parser.js.map","import { parseCronExpression } from 'cron-schedule';\n\nexport function getNextCronDate(expr: string): Date {\n try {\n const interval = parseCronExpression(expr);\n return interval.getNextDate();\n } catch (error) {\n console.error('Invalid cron expression:', expr, error);\n throw new Error('Invalid cron expression');\n }\n}\n","import { AlarmAdapter } from '../scheduler/adapters/AlarmAdapter';\nimport { TimeoutAdapter } from '../scheduler/adapters/TimeoutAdapter';\nimport { JobRegistry } from '../scheduler/JobRegistry';\nimport { JobOptions } from '../core/JobOptions';\nimport { IJob, JobState } from '../core/IJob';\nimport { getNextCronDate } from '../support/cron';\nimport { container } from '../../di/Container';\nimport { Logger } from '../../interfaces/Logger';\n\nexport class Scheduler {\n private readonly registry = JobRegistry.instance;\n private readonly alarm = new AlarmAdapter();\n private readonly timeout = new TimeoutAdapter();\n private readonly logger: Logger;\n\n constructor(logger?: Logger) {\n this.logger = logger || {\n info: console.log,\n success: console.log,\n warn: console.warn,\n error: console.error,\n debug: console.debug,\n };\n\n this.logger.info('Scheduler initialized');\n this.alarm.onTrigger(this.execute.bind(this));\n this.timeout.onTrigger(this.execute.bind(this));\n }\n\n schedule(id: string, options: JobOptions): void {\n const context = this.registry.getContext(id);\n if (!context || context.isStopped()) {\n return;\n }\n\n const when = this.getScheduleTime(options);\n const now = Date.now();\n\n // Prevent scheduling in the past - must be at least 1 second in the future\n if (when <= now) {\n this.logger.warn(`Job ${id} scheduled time is in the past, recalculating...`);\n // For cron jobs, this shouldn't happen, but if it does, get next occurrence\n if (options.cron) {\n const nextWhen = this.getScheduleTime(options);\n if (nextWhen <= now) {\n this.logger.error(`Job ${id} cannot be scheduled - cron expression may be invalid`);\n return;\n }\n return this.schedule(id, options);\n }\n return;\n }\n\n // Cancel any existing timers before scheduling new ones to prevent duplicates\n this.alarm.cancel(id);\n this.timeout.cancel(id);\n this.registry.clearTimers(id);\n\n const delayMs = when - now;\n // Use AlarmAdapter for delays >= 30 seconds (Chrome Alarms minimum is ~0.5 minutes)\n // This ensures jobs with second offsets like \"50 */1 * * * *\" still use Chrome Alarms\n const adapter = delayMs < 30_000 ? this.timeout : this.alarm;\n const timerId = adapter.schedule(id, when);\n\n // Only store timeout ID if we got one (Chrome alarms return null)\n if (adapter === this.timeout && timerId) {\n this.registry.setTimeoutId(id, timerId as unknown as NodeJS.Timeout);\n }\n\n this.logger.info(\n `[Scheduler] Job \"${id}\" scheduled for ${new Date(when).toISOString()} (in ${Math.round(delayMs / 1000)}s) → ${adapter === this.alarm ? '⏰ AlarmAdapter' : '⏱️ TimeoutAdapter'}`,\n );\n }\n\n pause(id: string): void {\n this.logger.info(`Pausing job ${id}`);\n // Cancel timers in adapters before pausing\n this.alarm.cancel(id);\n this.timeout.cancel(id);\n this.registry.pause(id);\n }\n\n resume(id: string): void {\n this.logger.info(`Resuming job ${id}`);\n this.registry.resume(id);\n\n const options = this.registry.meta(id);\n\n if (options) {\n this.schedule(id, options);\n }\n }\n\n stop(id: string): void {\n this.logger.info(`Stopping job ${id}`);\n // Cancel timers in adapters before stopping\n this.alarm.cancel(id);\n this.timeout.cancel(id);\n this.registry.stop(id);\n }\n\n private async execute(id: string) {\n const job = this.registry.resolve(id);\n const context = this.registry.getContext(id);\n\n if (!job || !context) {\n this.logger.debug(`Job ${id} not found or no context`);\n return;\n }\n\n if (context.isPaused() || context.isStopped()) {\n this.logger.debug(`Job ${id} is paused or stopped, skipping execution`);\n return;\n }\n\n try {\n this.registry.updateState(id, JobState.RUNNING);\n this.logger.info(`Executing job ${id}`);\n\n // get job instance from container\n const jobInstance = container.get(id) as IJob;\n\n this.logger.debug('Job instance:', { jobInstance });\n await jobInstance.handle.bind(jobInstance).call(jobInstance, context);\n\n if (!context.isStopped() && !context.isPaused()) {\n this.registry.updateState(id, JobState.COMPLETED);\n\n const options = this.registry.meta(id);\n\n // Reschedule if it's a recurring job (cron or recurring delay)\n if (options?.cron || options?.recurring) {\n this.registry.updateState(id, JobState.SCHEDULED);\n this.schedule(id, options);\n }\n }\n } catch (error) {\n this.logger.error(`Job ${id} execution failed:`, error as Error);\n context.fail(error as Error);\n\n // Still reschedule recurring jobs even after failure\n const options = this.registry.meta(id);\n if (options?.cron || options?.recurring) {\n this.logger.info(`Rescheduling failed recurring job ${id}`);\n this.registry.updateState(id, JobState.SCHEDULED);\n this.schedule(id, options);\n }\n }\n }\n\n private getScheduleTime(options: JobOptions): number {\n if (options.delay) return Date.now() + options.delay;\n if (options.cron) {\n const date = getNextCronDate(options.cron);\n if (!date) {\n throw new Error('Invalid cron expression');\n }\n return date.getTime();\n }\n return Date.now();\n }\n\n // Public API for job control\n getJobState(id: string): JobState | undefined {\n return this.registry.getContext(id)?.state;\n }\n\n listJobs(): Array<{ id: string; state: JobState; options: JobOptions }> {\n return this.registry.listAll();\n }\n\n /**\n * Gracefully shutdown the scheduler, clearing all timers\n */\n shutdown(): void {\n this.logger.info('Shutting down scheduler...');\n this.alarm.clear();\n this.timeout.clear();\n this.registry.clear();\n this.logger.info('Scheduler shutdown complete');\n }\n\n /**\n * Get scheduler stats for monitoring\n */\n getStats(): { jobs: number; timeouts: number; alarms: number } {\n return {\n jobs: this.registry.size(),\n timeouts: this.timeout.size(),\n alarms: this.alarm.size(),\n };\n }\n}\n","import { container } from './di/Container';\nimport { bootstrap as bridgeBootstrap } from './runtime/BridgeRuntime';\nimport { JobRegistry, Scheduler } from './scheduler';\nimport { IJob } from './scheduler/core/IJob';\nimport { Logger } from './interfaces/Logger';\n\ntype Newable<T> = new (...args: any[]) => T;\n\ninterface ServiceMetadata {\n readonly service: Newable<any>;\n readonly dependencies: ReadonlyArray<Newable<any>>;\n registered: boolean;\n}\n\ninterface CircularDependency {\n readonly cycle: ReadonlyArray<string>;\n readonly services: ReadonlyArray<string>;\n}\n\ninterface RegistrationResult {\n readonly success: boolean;\n readonly message: string;\n readonly error?: Error;\n}\n\ninterface DependencyNode {\n readonly service: string;\n readonly dependencies: string[];\n readonly constructor: Newable<any>;\n}\n\ninterface CircularDependencyDetectionResult {\n readonly hasCircularDependencies: boolean;\n readonly cycles: CircularDependency[];\n readonly dependencyGraph: Map<string, DependencyNode>;\n}\n\n/**\n * Application Bootstrap Manager\n * Handles automatic service discovery, dependency resolution, and application initialization\n */\nclass ApplicationBootstrap {\n private readonly serviceDependencies = new Map<string, ServiceMetadata>();\n private readonly serviceRegistry = new Map<string, Newable<any>>();\n private logger: Logger = new BootstrapLogger();\n private readonly storeDefinitions: {\n def: any;\n store: any;\n classes: any;\n }[] = [];\n\n private scheduler: Scheduler | undefined;\n\n /**\n * Add a store definition to be initialized\n */\n public withStore(storeDefinition: { def: any; store: any; classes: any }): ApplicationBootstrap {\n if (storeDefinition && storeDefinition.def && storeDefinition.store) {\n this.storeDefinitions.push(storeDefinition);\n }\n return this;\n }\n\n /**\n * Add multiple store definitions to be initialized\n */\n public withStores(storeDefinitions: any[]): ApplicationBootstrap {\n storeDefinitions.forEach((store) => this.withStore(store));\n return this;\n }\n\n /**\n * Create and initialize a new Chroma application instance\n */\n public async create({\n keepPortAlive = true,\n portName,\n enableLogs = true,\n disableBootMethods = false,\n }: {\n keepPortAlive?: boolean;\n portName?: string;\n enableLogs?: boolean;\n disableBootMethods?: boolean;\n }): Promise<void> {\n try {\n this.logger = new BootstrapLogger(enableLogs);\n this.logger.info('🚀 Starting Chroma application bootstrap...');\n await this.discoverAndInitializeStores();\n await this.discoverServices();\n\n const store = this.storeDefinitions[0].store;\n\n if (!store.isReady()) {\n this.logger.debug('Waiting for store to be ready...');\n await new Promise((resolve) => store.onReady(resolve));\n }\n\n await this.registerMessages();\n await this.registerJobs();\n\n // Initialize bridge runtime for message handling\n const runtime = bridgeBootstrap({\n container,\n portName,\n enableLogging: enableLogs,\n keepAlive: keepPortAlive,\n });\n\n store.setBridge(runtime);\n\n if (!disableBootMethods) {\n await this.bootMessages();\n await this.bootServices();\n }\n\n this.logger.success('🎉 Chroma application initialization complete!');\n } catch (error) {\n this.logger.error('💥 Application bootstrap failed:', error as any);\n throw error;\n }\n }\n /**\n * Boot all registered services by calling their onBoot method if present\n */\n private async bootServices(): Promise<void> {\n this.logger.info('🚀 Booting services...');\n\n const bootPromises = Array.from(this.serviceRegistry.entries()).map(\n async ([serviceName, ServiceClass]) => {\n try {\n const instance = container.get(ServiceClass);\n\n if (typeof instance.onBoot === 'function') {\n await instance.onBoot();\n this.logger.success(`Booted service: ${serviceName}`);\n return { serviceName, success: true };\n }\n return { serviceName, success: true, skipped: true };\n } catch (error) {\n this.logger.error(`Failed to boot service ${serviceName}:`, error as any);\n return { serviceName, success: false, error };\n }\n },\n );\n\n await Promise.all(bootPromises);\n }\n\n /**\n * Discover all services in the application directory\n */\n private async discoverServices(): Promise<void> {\n this.logger.info('🔍 Discovering services...');\n\n const serviceModules = import.meta.glob<{ default?: Newable<any> }>(\n '/src/app/services/**/*.service.{ts,js}',\n { eager: true },\n );\n\n // First pass: collect all service classes\n const serviceClasses: Newable<any>[] = [];\n\n for (const module of Object.values(serviceModules)) {\n const ServiceClass = module?.default;\n if (ServiceClass) {\n serviceClasses.push(ServiceClass);\n this.serviceRegistry.set(ServiceClass.name, ServiceClass);\n }\n }\n\n // Second pass: detect circular dependencies before registration\n const circularDepsResult = this.detectCircularDependencies(serviceClasses);\n\n if (circularDepsResult.hasCircularDependencies) {\n this.logger.error('💥 Circular dependencies detected!');\n circularDepsResult.cycles.forEach((cycle, index) => {\n this.logger.error(`Cycle ${index + 1}: ${cycle.cycle.join(' → ')} → ${cycle.cycle[0]}`);\n });\n throw new Error(`Circular dependencies found. Cannot initialize services.`);\n }\n\n // Third pass: register services if no circular dependencies\n for (const ServiceClass of serviceClasses) {\n container.bind(ServiceClass).toSelf().inSingletonScope();\n this.logger.debug(`📦 Discovered service: ${ServiceClass.name}`);\n }\n\n this.logger.success(\n `✅ Registered ${serviceClasses.length} services without circular dependencies`,\n );\n }\n\n /**\n * Detect circular dependencies in service classes using reflection\n * Enhanced: logs all detected dependencies for debugging\n */\n private detectCircularDependencies(\n serviceClasses: Newable<any>[],\n ): CircularDependencyDetectionResult {\n const dependencyGraph = new Map<string, DependencyNode>();\n\n // Build dependency graph from constructor metadata\n for (const ServiceClass of serviceClasses) {\n const dependencies = this.extractDependencies(ServiceClass);\n // Debug: log what dependencies are detected for each service\n this.logger.debug(`[DependencyDetection] ${ServiceClass.name} dependencies:`, {\n dependencies: dependencies.map((dep) =>\n typeof dep === 'function' ? dep.name : typeof dep === 'string' ? dep : dep?.toString(),\n ),\n });\n const dependencyNames = dependencies.map((dep) =>\n typeof dep === 'function' ? dep.name : typeof dep === 'string' ? dep : dep?.toString(),\n );\n dependencyGraph.set(ServiceClass.name, {\n service: ServiceClass.name,\n dependencies: dependencyNames,\n constructor: ServiceClass,\n });\n }\n\n // Detect cycles using DFS\n const cycles: CircularDependency[] = [];\n const visited = new Set<string>();\n const recursionStack = new Set<string>();\n const currentPath: string[] = [];\n\n for (const serviceName of dependencyGraph.keys()) {\n if (!visited.has(serviceName)) {\n this.detectCycles(\n serviceName,\n dependencyGraph,\n visited,\n recursionStack,\n currentPath,\n cycles,\n );\n }\n }\n\n return {\n hasCircularDependencies: cycles.length > 0,\n cycles,\n dependencyGraph,\n };\n }\n\n /**\n * Extract dependencies from constructor using reflect-metadata\n * Fallback: parse constructor parameter names if metadata is missing\n */\n private extractDependencies(ServiceClass: Newable<any>): any[] {\n try {\n // Get constructor parameter types (preferred)\n const paramTypes = Reflect.getMetadata('design:paramtypes', ServiceClass) || [];\n // Get injected tokens from inversify metadata\n const injectMetadata = Reflect.getMetadata('inversify:tagged', ServiceClass) || new Map();\n const dependencies: any[] = [];\n\n // Process each constructor parameter\n for (let i = 0; i < paramTypes.length; i++) {\n const paramType = paramTypes[i];\n const paramMetadata = injectMetadata.get(i);\n if (paramMetadata && paramMetadata.length > 0) {\n // Use injected token if available\n const injectTag = paramMetadata.find((tag: any) => tag.key === 'inject');\n if (injectTag) {\n dependencies.push(injectTag.value);\n } else {\n dependencies.push(paramType);\n }\n } else {\n dependencies.push(paramType);\n }\n }\n\n // Fallback: If no dependencies found, try to parse constructor parameter names\n if (dependencies.length === 0) {\n const paramNames = this.getConstructorParamNames(ServiceClass);\n this.logger.debug(\n `[DependencyDetection:FALLBACK] ${ServiceClass.name} constructor param names:`,\n { paramNames },\n );\n return paramNames;\n }\n\n return dependencies.filter((dep) => dep && dep !== Object);\n } catch (error) {\n this.logger.debug(`Could not extract dependencies for ${ServiceClass.name}: ${error}`);\n return [];\n }\n }\n\n /**\n * Fallback: Parse constructor parameter names from function source\n */\n private getConstructorParamNames(ServiceClass: Newable<any>): string[] {\n const constructor = ServiceClass.prototype.constructor;\n const src = constructor.toString();\n // Match the constructor argument list\n const match = src.match(/constructor\\s*\\(([^)]*)\\)/);\n if (!match) return [];\n const params = match[1]\n .split(',')\n .map((p: string) => p.trim())\n .filter((p: string) => p.length > 0);\n return params;\n }\n\n /**\n * Perform DFS to detect cycles in dependency graph\n */\n private detectCycles(\n serviceName: string,\n graph: Map<string, DependencyNode>,\n visited: Set<string>,\n recursionStack: Set<string>,\n currentPath: string[],\n cycles: CircularDependency[],\n ): void {\n visited.add(serviceName);\n recursionStack.add(serviceName);\n currentPath.push(serviceName);\n\n const node = graph.get(serviceName);\n if (!node) {\n recursionStack.delete(serviceName);\n currentPath.pop();\n return;\n }\n\n for (const dependency of node.dependencies) {\n // Skip primitive dependencies and external libraries\n if (!graph.has(dependency)) {\n continue;\n }\n\n if (!visited.has(dependency)) {\n this.detectCycles(dependency, graph, visited, recursionStack, currentPath, cycles);\n } else if (recursionStack.has(dependency)) {\n // Found a cycle\n const cycleStartIndex = currentPath.indexOf(dependency);\n const cycle = currentPath.slice(cycleStartIndex);\n\n cycles.push({\n cycle: [...cycle],\n services: [...currentPath],\n });\n }\n }\n\n recursionStack.delete(serviceName);\n currentPath.pop();\n }\n\n /**\n * Debug method to visualize the dependency graph\n */\n public analyzeDependencies(): void {\n const serviceClasses = Array.from(this.serviceRegistry.values());\n const result = this.detectCircularDependencies(serviceClasses);\n\n this.logger.info('📊 Dependency Analysis Report:');\n this.logger.info(`Total Services: ${result.dependencyGraph.size}`);\n\n if (result.hasCircularDependencies) {\n this.logger.error(`🔄 Circular Dependencies Found: ${result.cycles.length}`);\n result.cycles.forEach((cycle, index) => {\n this.logger.error(` Cycle ${index + 1}: ${cycle.cycle.join(' → ')} → ${cycle.cycle[0]}`);\n });\n } else {\n this.logger.success('✅ No circular dependencies detected');\n }\n\n // Print dependency tree\n this.logger.info('🌳 Service Dependency Tree:');\n for (const [serviceName, node] of result.dependencyGraph) {\n if (node.dependencies.length > 0) {\n this.logger.info(` ${serviceName} depends on:`);\n node.dependencies.forEach((dep) => {\n this.logger.info(` - ${dep}`);\n });\n } else {\n this.logger.info(` ${serviceName} (no dependencies)`);\n }\n }\n }\n\n /**\n * Initialize stores from provided definitions\n */\n private async discoverAndInitializeStores(): Promise<void> {\n try {\n if (this.storeDefinitions.length === 0) {\n this.logger.debug('📭 No store definitions provided');\n return;\n }\n\n this.logger.info(`Initializing ${this.storeDefinitions.length} store(s)...`);\n\n let isFirstStore = true;\n\n for (const store of this.storeDefinitions) {\n // Bind store instance to DI container for injection\n const diKey = `CentralStore:${store.def.name}`;\n const storeInstance = store.store;\n const classes = store.classes;\n container.bind(diKey).toConstantValue(storeInstance);\n\n if (isFirstStore) {\n container.bind(Symbol.for('Store')).toConstantValue(storeInstance);\n isFirstStore = false;\n }\n\n await this.registerMessageClass(\n classes.GetStoreStateMessage,\n `store:${store.def.name}:getState`,\n );\n await this.registerMessageClass(\n classes.SetStoreStateMessage,\n `store:${store.def.name}:setState`,\n );\n\n // Register reset handler if available\n if (classes.ResetStoreMessage) {\n await this.registerMessageClass(\n classes.ResetStoreMessage,\n `store:${store.def.name}:reset`,\n );\n }\n\n this.logger.debug(`✅ Initialized store: ${store.def.name}`);\n }\n\n this.logger.success(`✅ Initialized ${this.storeDefinitions.length} store(s)`);\n } catch (error) {\n this.logger.error('❌ Failed to initialize stores:', error as any);\n }\n }\n\n /**\n * Register message handlers\n */\n private async registerMessages(): Promise<void> {\n this.logger.info('📨 Registering messages...');\n\n const messageModules = import.meta.glob<{ default?: Newable<any> }>(\n '/src/app/messages/**/*.message.{ts,js}',\n { eager: true },\n );\n\n // Collect all message classes\n const messageClasses: Newable<any>[] = [];\n for (const module of Object.values(messageModules)) {\n const MessageClass = module?.default;\n if (MessageClass) messageClasses.push(MessageClass);\n }\n\n // Detect circular dependencies in messages\n if (messageClasses.length > 0) {\n const circularDepsResult = this.detectCircularDependencies(messageClasses);\n if (circularDepsResult.hasCircularDependencies) {\n this.logger.error('💥 Circular dependencies detected in messages!');\n circularDepsResult.cycles.forEach((cycle, index) => {\n this.logger.error(\n `Message Cycle ${index + 1}: ${cycle.cycle.join(' → ')} → ${cycle.cycle[0]}`,\n );\n });\n throw new Error(`Circular dependencies found in messages. Cannot register messages.`);\n }\n }\n\n for (const module of Object.values(messageModules)) {\n const MessageClass = module?.default;\n if (!MessageClass) continue;\n\n try {\n // check all service registry is available\n for (const [name, ServiceClass] of this.serviceRegistry) {\n if (!ServiceClass) {\n this.logger.warn(`⚠️ Service not found in registry: ${name}`);\n }\n\n // check if in container\n if (!container.isBound(ServiceClass)) {\n this.logger.warn(`⚠️ Service not bound in container: ${name}`);\n }\n }\n\n const messageMetadata = Reflect.getMetadata('name', MessageClass);\n const messageName = messageMetadata || MessageClass.name;\n container.bind(messageName).to(MessageClass).inSingletonScope();\n\n this.logger.success(`✅ Registered message: ${messageName}`);\n } catch (error) {\n this.logger.error(`❌ Failed to register message ${MessageClass.name}:`, error as any);\n }\n }\n }\n\n private async registerMessageClass(MessageClass: Newable<any>, name: string): Promise<void> {\n container.bind(name).to(MessageClass).inSingletonScope();\n this.logger.success(`✅ Registered message: ${name}`);\n }\n\n /**\n * Boot all registered messages\n */\n private async bootMessages(): Promise<void> {\n this.logger.info('🚀 Booting messages...');\n\n const messageModules = import.meta.glob<{ default?: Newable<any> }>(\n '/src/app/messages/**/*.message.{ts,js}',\n { eager: true },\n );\n\n const bootPromises = Object.values(messageModules).map(async (module) => {\n const MessageClass = module?.default;\n\n if (!MessageClass || typeof MessageClass.prototype.boot !== 'function') {\n return { skipped: true };\n }\n\n try {\n const messageMetadata = Reflect.getMetadata('name', MessageClass);\n const messageName = messageMetadata || MessageClass.name;\n const messageInstance = container.get<any>(messageName);\n\n await messageInstance.boot();\n this.logger.success(`✅ Booted message: ${messageName}`);\n return { messageName, success: true };\n } catch (error) {\n this.logger.error(`❌ Failed to boot message ${MessageClass.name}:`, error as any);\n return { messageName: MessageClass.name, success: false, error };\n }\n });\n\n await Promise.all(bootPromises);\n }\n\n /**\n * Register jobs for scheduled execution\n */\n private async registerJobs(): Promise<void> {\n this.logger.info('🕒 Registering jobs...');\n\n const jobModules = import.meta.glob<{ default?: Newable<any> }>(\n '/src/app/jobs/**/*.job.{ts,js}',\n { eager: true },\n );\n\n // Register Scheduler with container and get instance from DI\n if (!container.isBound(Scheduler)) {\n container\n .bind(Scheduler)\n .toDynamicValue(() => new Scheduler(this.logger))\n .inSingletonScope();\n }\n\n this.logger.debug('container isBound(Scheduler)', { isBound: container.isBound(Scheduler) });\n\n // check all service registry is available\n for (const [name, ServiceClass] of this.serviceRegistry) {\n if (!ServiceClass) {\n this.logger.warn(`⚠️ Service not found in registry: ${name}`);\n }\n\n // check if in container\n if (!container.isBound(ServiceClass)) {\n this.logger.warn(`⚠️ Service not bound in container: ${name}`);\n } else {\n container.get(ServiceClass);\n }\n }\n\n this.scheduler = container.get(Scheduler);\n\n for (const module of Object.values(jobModules)) {\n const JobClass = module?.default;\n if (!JobClass) continue;\n\n try {\n const jobMetadata = Reflect.getMetadata('name', JobClass);\n const jobName = jobMetadata || JobClass.name;\n container.bind(JobClass).toSelf().inSingletonScope();\n\n // add to registry\n const id = `${jobName.toLowerCase()}:${JobClass.name.toLowerCase()} ${Math.random().toString(36).substring(2, 15)}`;\n container.bind(id).to(JobClass).inSingletonScope();\n\n const options = Reflect.getMetadata('job:options', JobClass) || {};\n\n const instance = container.get<typeof JobClass>(JobClass);\n\n JobRegistry.instance.register(id, instance as unknown as IJob<unknown>, options);\n this.scheduler.schedule(id, options);\n\n this.logger.success(`✅ Registered job: ${jobName}`);\n } catch (error) {\n this.logger.error(`❌ Failed to register job ${JobClass.name}:`, error as any);\n }\n }\n }\n}\n\nclass BootstrapLogger implements Logger {\n private enableLogs: boolean;\n\n constructor(enableLogs: boolean = true) {\n this.enableLogs = enableLogs;\n }\n\n info(message: string, context?: Record<string, any>): void {\n if (!this.enableLogs) return;\n console.log(message);\n if (context) console.log(' ', context);\n }\n\n success(message: string): void {\n if (!this.enableLogs) return;\n console.log(message);\n }\n\n warn(message: string): void {\n if (!this.enableLogs) return;\n console.warn(message);\n }\n\n error(message: string, error?: Error): void {\n if (!this.enableLogs) return;\n console.error(message);\n if (error) console.error(' ', error);\n }\n\n debug(message: string, context?: Record<string, any>): void {\n if (!this.enableLogs) return;\n console.debug(message);\n if (context) console.debug(' ', context);\n }\n\n divider(): void {\n if (!this.enableLogs) return;\n console.log('='.repeat(50));\n }\n}\n\n// Laravel-style facade for clean API\nexport async function create({\n keepPortAlive = true,\n portName,\n enableLogs = true,\n disableBootMethods = false,\n}: {\n keepPortAlive?: boolean;\n portName?: string;\n enableLogs?: boolean;\n disableBootMethods?: boolean;\n} = {}): Promise<void> {\n const bootstrap = new ApplicationBootstrap();\n await bootstrap.create({\n keepPortAlive,\n portName,\n enableLogs,\n disableBootMethods,\n });\n}\n\n// Fluent API for store configuration\nexport function bootstrap(): BootstrapBuilder {\n return new BootstrapBuilder();\n}\n\nclass BootstrapBuilder {\n private readonly app = new ApplicationBootstrap();\n\n /**\n * Add a store definition to be initialized\n */\n public withStore(storeDefinition: any): BootstrapBuilder {\n this.app.withStore(storeDefinition);\n return this;\n }\n\n /**\n * Add multiple store definitions to be initialized\n */\n public withStores(storeDefinitions: any[]): BootstrapBuilder {\n this.app.withStores(storeDefinitions);\n return this;\n }\n\n /**\n * Create and start the application\n */\n public async create({\n keepPortAlive = true,\n portName,\n enableLogs = true,\n disableBootMethods = false,\n }: {\n keepPortAlive?: boolean;\n portName?: string;\n enableLogs?: boolean;\n disableBootMethods?: boolean;\n } = {}): Promise<void> {\n await this.app.create({ keepPortAlive, portName, enableLogs, disableBootMethods });\n }\n}\n"],"names":["Di","JobState","bootstrap","bridgeBootstrap"],"mappings":"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","x_google_ignoreList":[8,9,10]}
package/dist/boot.cjs.js CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var boot = require('./boot-BzVib0b9.js');
3
+ var boot = require('./boot-PA1aK9w-.js');
4
4
  require('@inversifyjs/container');
5
5
 
6
6
 
package/dist/boot.es.js CHANGED
@@ -1,3 +1,3 @@
1
- export { b as bootstrap } from './boot-DCtKbI0C.js';
1
+ export { b as bootstrap } from './boot-PbJQqgzX.js';
2
2
  import '@inversifyjs/container';
3
3
  //# sourceMappingURL=boot.es.js.map
package/dist/index.cjs.js CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var core = require('@inversifyjs/core');
4
- var boot = require('./boot-BzVib0b9.js');
4
+ var boot = require('./boot-PA1aK9w-.js');
5
5
  require('@inversifyjs/container');
6
6
 
7
7
  function Service() {
package/dist/index.es.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { inject, injectable } from '@inversifyjs/core';
2
- export { J as JobState, b as bootstrap, c as container, a as create } from './boot-DCtKbI0C.js';
2
+ export { J as JobState, b as bootstrap, c as container, a as create } from './boot-PbJQqgzX.js';
3
3
  import '@inversifyjs/container';
4
4
 
5
5
  function Service() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chromahq/core",
3
- "version": "1.0.44",
3
+ "version": "1.0.45",
4
4
  "description": "Core library for building Chrome extensions with Chroma framework",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs.js",