@haskou/ddd-kernel 0.1.0
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/LICENSE +21 -0
- package/README.md +143 -0
- package/dist/Constructor-fyZLLIh8.d.cts +5 -0
- package/dist/Constructor-fyZLLIh8.d.ts +5 -0
- package/dist/Consumer-CC8ZRCsd.d.cts +17 -0
- package/dist/Consumer-CeT0Wbxb.d.ts +17 -0
- package/dist/DomainEvent-mXWEtr_J.d.cts +26 -0
- package/dist/DomainEvent-mXWEtr_J.d.ts +26 -0
- package/dist/DomainEventConsumer-3WBMSSr2.d.cts +7 -0
- package/dist/DomainEventConsumer-B4hkIUmP.d.ts +7 -0
- package/dist/DomainEventPublisher-8G0lvmdy.d.cts +7 -0
- package/dist/DomainEventPublisher-DhGgM3f2.d.ts +7 -0
- package/dist/HandlerContext-DUUExVo3.d.ts +20 -0
- package/dist/HandlerContext-Lm89pSeG.d.cts +20 -0
- package/dist/Kernel-BWUOUWWI.d.cts +70 -0
- package/dist/Kernel-CUaqHa1s.d.ts +70 -0
- package/dist/KernelLogger-BESOFrpW.d.cts +8 -0
- package/dist/KernelLogger-BESOFrpW.d.ts +8 -0
- package/dist/Log-36L3Z84a.d.cts +8 -0
- package/dist/Log-36L3Z84a.d.ts +8 -0
- package/dist/NoFailedMessagesError-0YJKRWPF.d.ts +45 -0
- package/dist/NoFailedMessagesError-Kz7CYWpT.d.cts +45 -0
- package/dist/Repository-D9CuAyCV.d.cts +7 -0
- package/dist/Repository-D9CuAyCV.d.ts +7 -0
- package/dist/Scheduler-oigqNOUJ.d.cts +27 -0
- package/dist/Scheduler-oigqNOUJ.d.ts +27 -0
- package/dist/ServiceClass-BmNw8fJj.d.cts +37 -0
- package/dist/ServiceClass-C7NCKdSS.d.ts +37 -0
- package/dist/ServiceResolver-D2Jz-l_Z.d.cts +5 -0
- package/dist/ServiceResolver-D2Jz-l_Z.d.ts +5 -0
- package/dist/ShutdownHook-BGskq2-q.d.ts +9 -0
- package/dist/ShutdownHook-Dib5uNKB.d.cts +9 -0
- package/dist/Subscription-Bwkb_did.d.ts +9 -0
- package/dist/Subscription-P9WROD_6.d.cts +9 -0
- package/dist/adapters/db/in-memory/index.cjs +46 -0
- package/dist/adapters/db/in-memory/index.cjs.map +1 -0
- package/dist/adapters/db/in-memory/index.d.cts +12 -0
- package/dist/adapters/db/in-memory/index.d.ts +12 -0
- package/dist/adapters/db/in-memory/index.js +19 -0
- package/dist/adapters/db/in-memory/index.js.map +1 -0
- package/dist/adapters/db/index.cjs +80 -0
- package/dist/adapters/db/index.cjs.map +1 -0
- package/dist/adapters/db/index.d.cts +4 -0
- package/dist/adapters/db/index.d.ts +4 -0
- package/dist/adapters/db/index.js +52 -0
- package/dist/adapters/db/index.js.map +1 -0
- package/dist/adapters/db/mongo/index.cjs +62 -0
- package/dist/adapters/db/mongo/index.cjs.map +1 -0
- package/dist/adapters/db/mongo/index.d.cts +22 -0
- package/dist/adapters/db/mongo/index.d.ts +22 -0
- package/dist/adapters/db/mongo/index.js +35 -0
- package/dist/adapters/db/mongo/index.js.map +1 -0
- package/dist/adapters/index.cjs +651 -0
- package/dist/adapters/index.cjs.map +1 -0
- package/dist/adapters/index.d.cts +26 -0
- package/dist/adapters/index.d.ts +26 -0
- package/dist/adapters/index.js +609 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/kernel/console/index.cjs +46 -0
- package/dist/adapters/kernel/console/index.cjs.map +1 -0
- package/dist/adapters/kernel/console/index.d.cts +10 -0
- package/dist/adapters/kernel/console/index.d.ts +10 -0
- package/dist/adapters/kernel/console/index.js +19 -0
- package/dist/adapters/kernel/console/index.js.map +1 -0
- package/dist/adapters/kernel/index.cjs +46 -0
- package/dist/adapters/kernel/index.cjs.map +1 -0
- package/dist/adapters/kernel/index.d.cts +2 -0
- package/dist/adapters/kernel/index.d.ts +2 -0
- package/dist/adapters/kernel/index.js +19 -0
- package/dist/adapters/kernel/index.js.map +1 -0
- package/dist/adapters/pubsub/amqp/index.cjs +724 -0
- package/dist/adapters/pubsub/amqp/index.cjs.map +1 -0
- package/dist/adapters/pubsub/amqp/index.d.cts +42 -0
- package/dist/adapters/pubsub/amqp/index.d.ts +42 -0
- package/dist/adapters/pubsub/amqp/index.js +691 -0
- package/dist/adapters/pubsub/amqp/index.js.map +1 -0
- package/dist/adapters/pubsub/in-memory/index.cjs +79 -0
- package/dist/adapters/pubsub/in-memory/index.cjs.map +1 -0
- package/dist/adapters/pubsub/in-memory/index.d.cts +21 -0
- package/dist/adapters/pubsub/in-memory/index.d.ts +21 -0
- package/dist/adapters/pubsub/in-memory/index.js +51 -0
- package/dist/adapters/pubsub/in-memory/index.js.map +1 -0
- package/dist/adapters/pubsub/index.cjs +492 -0
- package/dist/adapters/pubsub/index.cjs.map +1 -0
- package/dist/adapters/pubsub/index.d.cts +11 -0
- package/dist/adapters/pubsub/index.d.ts +11 -0
- package/dist/adapters/pubsub/index.js +456 -0
- package/dist/adapters/pubsub/index.js.map +1 -0
- package/dist/adapters/ui/express/index.cjs +126 -0
- package/dist/adapters/ui/express/index.cjs.map +1 -0
- package/dist/adapters/ui/express/index.d.cts +49 -0
- package/dist/adapters/ui/express/index.d.ts +49 -0
- package/dist/adapters/ui/express/index.js +98 -0
- package/dist/adapters/ui/express/index.js.map +1 -0
- package/dist/adapters/ui/index.cjs +489 -0
- package/dist/adapters/ui/index.cjs.map +1 -0
- package/dist/adapters/ui/index.d.cts +14 -0
- package/dist/adapters/ui/index.d.ts +14 -0
- package/dist/adapters/ui/index.js +455 -0
- package/dist/adapters/ui/index.js.map +1 -0
- package/dist/adapters/ui/routes/index.cjs +393 -0
- package/dist/adapters/ui/routes/index.cjs.map +1 -0
- package/dist/adapters/ui/routes/index.d.cts +5 -0
- package/dist/adapters/ui/routes/index.d.ts +5 -0
- package/dist/adapters/ui/routes/index.js +361 -0
- package/dist/adapters/ui/routes/index.js.map +1 -0
- package/dist/contracts/db/index.cjs +19 -0
- package/dist/contracts/db/index.cjs.map +1 -0
- package/dist/contracts/db/index.d.cts +7 -0
- package/dist/contracts/db/index.d.ts +7 -0
- package/dist/contracts/db/index.js +1 -0
- package/dist/contracts/db/index.js.map +1 -0
- package/dist/contracts/index.cjs +49 -0
- package/dist/contracts/index.cjs.map +1 -0
- package/dist/contracts/index.d.cts +11 -0
- package/dist/contracts/index.d.ts +11 -0
- package/dist/contracts/index.js +22 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/kernel/index.cjs +19 -0
- package/dist/contracts/kernel/index.cjs.map +1 -0
- package/dist/contracts/kernel/index.d.cts +9 -0
- package/dist/contracts/kernel/index.d.ts +9 -0
- package/dist/contracts/kernel/index.js +1 -0
- package/dist/contracts/kernel/index.js.map +1 -0
- package/dist/contracts/pubsub/index.cjs +19 -0
- package/dist/contracts/pubsub/index.cjs.map +1 -0
- package/dist/contracts/pubsub/index.d.cts +26 -0
- package/dist/contracts/pubsub/index.d.ts +26 -0
- package/dist/contracts/pubsub/index.js +1 -0
- package/dist/contracts/pubsub/index.js.map +1 -0
- package/dist/contracts/ui/index.cjs +49 -0
- package/dist/contracts/ui/index.cjs.map +1 -0
- package/dist/contracts/ui/index.d.cts +29 -0
- package/dist/contracts/ui/index.d.ts +29 -0
- package/dist/contracts/ui/index.js +22 -0
- package/dist/contracts/ui/index.js.map +1 -0
- package/dist/domain/index.cjs +121 -0
- package/dist/domain/index.cjs.map +1 -0
- package/dist/domain/index.d.cts +26 -0
- package/dist/domain/index.d.ts +26 -0
- package/dist/domain/index.js +89 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/errors/index.cjs +58 -0
- package/dist/errors/index.cjs.map +1 -0
- package/dist/errors/index.d.cts +13 -0
- package/dist/errors/index.d.ts +13 -0
- package/dist/errors/index.js +29 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.cjs +442 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +19 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +405 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/dependency-injection/index.cjs +169 -0
- package/dist/infrastructure/dependency-injection/index.cjs.map +1 -0
- package/dist/infrastructure/dependency-injection/index.d.cts +30 -0
- package/dist/infrastructure/dependency-injection/index.d.ts +30 -0
- package/dist/infrastructure/dependency-injection/index.js +137 -0
- package/dist/infrastructure/dependency-injection/index.js.map +1 -0
- package/dist/infrastructure/express/index.cjs +126 -0
- package/dist/infrastructure/express/index.cjs.map +1 -0
- package/dist/infrastructure/express/index.d.cts +14 -0
- package/dist/infrastructure/express/index.d.ts +14 -0
- package/dist/infrastructure/express/index.js +98 -0
- package/dist/infrastructure/express/index.js.map +1 -0
- package/dist/infrastructure/lifecycle/index.cjs +19 -0
- package/dist/infrastructure/lifecycle/index.cjs.map +1 -0
- package/dist/infrastructure/lifecycle/index.d.cts +9 -0
- package/dist/infrastructure/lifecycle/index.d.ts +9 -0
- package/dist/infrastructure/lifecycle/index.js +1 -0
- package/dist/infrastructure/lifecycle/index.js.map +1 -0
- package/dist/infrastructure/logs/index.cjs +144 -0
- package/dist/infrastructure/logs/index.cjs.map +1 -0
- package/dist/infrastructure/logs/index.d.cts +30 -0
- package/dist/infrastructure/logs/index.d.ts +30 -0
- package/dist/infrastructure/logs/index.js +107 -0
- package/dist/infrastructure/logs/index.js.map +1 -0
- package/dist/infrastructure/scheduler/index.cjs +461 -0
- package/dist/infrastructure/scheduler/index.cjs.map +1 -0
- package/dist/infrastructure/scheduler/index.d.cts +17 -0
- package/dist/infrastructure/scheduler/index.d.ts +17 -0
- package/dist/infrastructure/scheduler/index.js +426 -0
- package/dist/infrastructure/scheduler/index.js.map +1 -0
- package/dist/infrastructure/websocket/index.cjs +131 -0
- package/dist/infrastructure/websocket/index.cjs.map +1 -0
- package/dist/infrastructure/websocket/index.d.cts +56 -0
- package/dist/infrastructure/websocket/index.d.ts +56 -0
- package/dist/infrastructure/websocket/index.js +103 -0
- package/dist/infrastructure/websocket/index.js.map +1 -0
- package/package.json +248 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/infrastructure/scheduler/index.ts","../../../src/Kernel.ts","../../../src/adapters/kernel/console/ConsoleKernelLogger.ts","../../../src/infrastructure/dependency-injection/DependencyInjection.ts","../../../src/infrastructure/scheduler/ScheduledExecutionError.ts","../../../src/infrastructure/scheduler/DefaultSchedulerErrorPolicy.ts","../../../src/infrastructure/scheduler/InvalidParseCronExpressionError.ts","../../../src/infrastructure/scheduler/Scheduler.ts"],"sourcesContent":["export * from './CronExpression.js';\nexport * from './DefaultSchedulerErrorPolicy.js';\nexport * from './InvalidParseCronExpressionError.js';\nexport * from './ScheduledExecutionError.js';\nexport * from './Scheduler.js';\nexport * from './SchedulerErrorPolicy.js';\nexport { default } from './Scheduler.js';\n","import path from 'node:path';\n\nimport type { Consumer } from './adapters/pubsub/index.js';\nimport type { Route } from './adapters/ui/routes/index.js';\nimport type {\n ConsumerMiddleware,\n KernelLogger,\n ShutdownHook,\n} from './contracts/index.js';\nimport type { ServiceClass } from './infrastructure/dependency-injection/index.js';\nimport type { Initializer, Runtime } from './infrastructure/lifecycle/index.js';\nimport type { Scheduler } from './infrastructure/scheduler/index.js';\nimport type { KernelOptions } from './kernel/KernelOptions.js';\nimport type { ShutdownCandidate } from './kernel/ShutdownCandidate.js';\n\nimport { ConsoleKernelLogger } from './adapters/kernel/index.js';\nimport { DependencyInjection } from './infrastructure/dependency-injection/index.js';\n\nexport type { KernelOptions } from './kernel/KernelOptions.js';\n\nexport class Kernel {\n private static readonly stateKey = Symbol.for(\n '@haskou/ddd-kernel/kernel-state',\n );\n\n private readonly consumerMiddlewares: ConsumerMiddleware[] = [];\n private readonly consumersList: Consumer[] = [];\n private readonly loggerInstance: KernelLogger;\n private readonly routesList: ServiceClass<Route>[] = [];\n private readonly schedulersList: Scheduler[] = [];\n private readonly shutdownHooks: ShutdownHook[] = [];\n private dependencyInjectionInstance: DependencyInjection | undefined;\n\n private static get state(): { activeKernel?: Kernel } {\n const stateContainer = globalThis as typeof globalThis & {\n [Kernel.stateKey]?: { activeKernel?: Kernel };\n };\n\n stateContainer[Kernel.stateKey] = stateContainer[Kernel.stateKey] ?? {};\n\n return stateContainer[Kernel.stateKey] as { activeKernel?: Kernel };\n }\n\n public static get configDirectory(): string {\n return path.resolve(Kernel.rootDirectory, 'config');\n }\n\n public static get consumers(): Consumer[] {\n return Kernel.getActiveKernel().consumers;\n }\n\n public static get consumerMiddleware(): ConsumerMiddleware[] {\n return Kernel.getActiveKernel().consumerMiddleware;\n }\n\n public static get di(): DependencyInjection {\n return Kernel.getActiveKernel().di;\n }\n\n public static get logger(): KernelLogger {\n return Kernel.getActiveKernel().logger;\n }\n\n public static get rootDirectory(): string {\n return process.cwd();\n }\n\n public static get routes(): ServiceClass<Route>[] {\n return Kernel.getActiveKernel().routes;\n }\n\n public static get schedulers(): Scheduler[] {\n return Kernel.getActiveKernel().schedulers;\n }\n\n public static get sourceDirectory(): string {\n return path.resolve(Kernel.rootDirectory, 'src');\n }\n\n private static getActiveKernel(): Kernel {\n if (!Kernel.state.activeKernel) {\n Kernel.state.activeKernel = new Kernel();\n }\n\n return Kernel.state.activeKernel;\n }\n\n constructor(private readonly options: KernelOptions = {}) {\n this.loggerInstance = options.logger ?? new ConsoleKernelLogger();\n this.dependencyInjectionInstance = options.di;\n Kernel.state.activeKernel = this;\n }\n\n private async closeCandidate(candidate: ShutdownCandidate): Promise<void> {\n if (candidate.shutdown) {\n await candidate.shutdown();\n\n return;\n }\n\n if (candidate.close) {\n await candidate.close();\n\n return;\n }\n\n if (candidate.stop) {\n await candidate.stop();\n\n return;\n }\n\n if (candidate.flush) {\n await candidate.flush();\n }\n }\n\n private getConsumerFromClass(\n ClassDefinition: ServiceClass<Consumer>,\n ): Consumer {\n return this.di.getService<Consumer>(ClassDefinition);\n }\n\n private getInitializerFromClass(\n ClassDefinition: ServiceClass<Initializer>,\n ): Initializer {\n return this.di.getService<Initializer>(ClassDefinition);\n }\n\n private getRuntimeFromClass(ClassDefinition: ServiceClass<Runtime>): Runtime {\n return this.di.getService<Runtime>(ClassDefinition);\n }\n\n private getSchedulerFromClass(\n ClassDefinition: ServiceClass<Scheduler>,\n ): Scheduler {\n return this.di.getService<Scheduler>(ClassDefinition);\n }\n\n public get consumers(): Consumer[] {\n return this.consumersList;\n }\n\n public get consumerMiddleware(): ConsumerMiddleware[] {\n return this.consumerMiddlewares;\n }\n\n public get di(): DependencyInjection {\n if (!this.dependencyInjectionInstance) {\n throw new Error('Kernel dependency injection has not been initialized.');\n }\n\n return this.dependencyInjectionInstance;\n }\n\n public get logger(): KernelLogger {\n return this.loggerInstance;\n }\n\n public get routes(): ServiceClass<Route>[] {\n return this.routesList;\n }\n\n public get schedulers(): Scheduler[] {\n return this.schedulersList;\n }\n\n public async dependencyInjection(): Promise<void> {\n this.dependencyInjectionInstance =\n this.dependencyInjectionInstance ??\n DependencyInjection.configure({\n containerBuild: process.env.CONTAINER_BUILD === 'true',\n servicesYamlPath:\n this.options.servicesYamlPath ??\n path.resolve(Kernel.configDirectory, 'container', 'services.yaml'),\n sourceDirectory: this.options.sourceDirectory ?? Kernel.sourceDirectory,\n });\n\n await this.dependencyInjectionInstance.compile();\n }\n\n public getRoutes(): ServiceClass<Route>[] {\n return this.routes;\n }\n\n public registerConsumerMiddleware(\n ...middlewares: ConsumerMiddleware[]\n ): void {\n this.consumerMiddlewares.push(...middlewares);\n }\n\n public registerConsumers(\n ...ClassDefinitions: ServiceClass<Consumer>[]\n ): void {\n for (const ClassDefinition of ClassDefinitions) {\n this.consumersList.push(this.getConsumerFromClass(ClassDefinition));\n }\n }\n\n public registerConsumerInstances(...consumers: Consumer[]): void {\n this.consumersList.push(...consumers);\n }\n\n public registerRoutes(...ClassDefinitions: ServiceClass<Route>[]): void {\n this.routesList.push(...ClassDefinitions);\n }\n\n public registerSchedulers(\n ...ClassDefinitions: ServiceClass<Scheduler>[]\n ): void {\n for (const ClassDefinition of ClassDefinitions) {\n this.schedulersList.push(this.getSchedulerFromClass(ClassDefinition));\n }\n }\n\n public registerSchedulerInstances(...schedulers: Scheduler[]): void {\n this.schedulersList.push(...schedulers);\n }\n\n public registerShutdownHook(hook: ShutdownHook): void {\n this.shutdownHooks.push(hook);\n }\n\n public removeConsumers(): void {\n this.consumersList.length = 0;\n }\n\n public removeRoutes(): void {\n this.routesList.length = 0;\n }\n\n public removeSchedulers(): void {\n this.schedulersList.length = 0;\n }\n\n public async runConsumers(): Promise<void> {\n for (const consumer of this.consumersList) {\n await consumer.init();\n }\n }\n\n public async runInitializers(\n ...ClassDefinitions: ServiceClass<Initializer>[]\n ): Promise<void> {\n for (const ClassDefinition of ClassDefinitions) {\n await this.getInitializerFromClass(ClassDefinition).ensure();\n }\n }\n\n public async runRuntimes(\n ...ClassDefinitions: ServiceClass<Runtime>[]\n ): Promise<void> {\n for (const ClassDefinition of ClassDefinitions) {\n const runtime = this.getRuntimeFromClass(ClassDefinition);\n\n await runtime.run();\n this.registerShutdownHook(() =>\n this.closeCandidate(runtime as ShutdownCandidate),\n );\n }\n }\n\n public async runSchedulerNowAndSchedule(\n ClassDefinition: ServiceClass<Scheduler>,\n ): Promise<void> {\n const scheduler = this.getSchedulerFromClass(ClassDefinition);\n\n await scheduler.runOnce();\n await scheduler.init();\n this.schedulersList.push(scheduler);\n }\n\n public async runSchedulers(): Promise<void> {\n for (const scheduler of this.schedulersList) {\n await scheduler.init();\n }\n }\n\n public async shutdown(): Promise<void> {\n for (const consumer of [...this.consumersList].reverse()) {\n await this.closeCandidate(consumer as ShutdownCandidate);\n }\n\n for (const scheduler of [...this.schedulersList].reverse()) {\n await this.closeCandidate(scheduler as ShutdownCandidate);\n }\n\n for (const hook of [...this.shutdownHooks].reverse()) {\n await hook();\n }\n\n await this.closeCandidate(this.loggerInstance as ShutdownCandidate);\n }\n}\n\nexport function createKernel(options?: KernelOptions): Kernel {\n return new Kernel(options);\n}\n\nexport default Kernel;\n","import type { KernelLogger } from '../../../contracts/index.js';\n\nexport class ConsoleKernelLogger implements KernelLogger {\n public debug(message: string): void {\n // eslint-disable-next-line no-console\n console.debug(message);\n }\n\n public error(message: string): void {\n // eslint-disable-next-line no-console\n console.error(message);\n }\n\n public info(message: string): void {\n // eslint-disable-next-line no-console\n console.info(message);\n }\n\n public warn(message: string): void {\n // eslint-disable-next-line no-console\n console.warn(message);\n }\n}\n","import fs from 'fs-extra';\nimport {\n Autowire,\n ContainerBuilder,\n ServiceFile,\n YamlFileLoader,\n} from 'node-dependency-injection';\nimport path from 'node:path';\n\nimport type { ServiceResolver } from '../../contracts/index.js';\nimport type { ContainerInternals } from './ContainerInternals.js';\nimport type { DefinitionMetadata } from './DefinitionMetadata.js';\nimport type { DependencyInjectionOptions } from './DependencyInjectionOptions.js';\n\nexport class DependencyInjection implements ServiceResolver {\n private static configuredInstance: DependencyInjection | undefined;\n private autowire: Autowire | undefined;\n private loader: YamlFileLoader | undefined;\n private readonly container: ContainerBuilder;\n\n public static configure(\n options: DependencyInjectionOptions,\n ): DependencyInjection {\n DependencyInjection.configuredInstance = new DependencyInjection(options);\n\n return DependencyInjection.configuredInstance;\n }\n\n public static get instance(): DependencyInjection {\n if (!DependencyInjection.configuredInstance) {\n throw new Error('DependencyInjection has not been configured.');\n }\n\n return DependencyInjection.configuredInstance;\n }\n\n constructor(\n private readonly options: DependencyInjectionOptions = {\n containerBuild: process.env.CONTAINER_BUILD === 'true',\n servicesYamlPath: path.resolve(\n process.cwd(),\n 'config',\n 'container',\n 'services.yaml',\n ),\n sourceDirectory: path.resolve(process.cwd(), 'src'),\n },\n ) {\n this.container = new ContainerBuilder(false, this.options.sourceDirectory);\n }\n\n private get definitions(): Map<string, DefinitionMetadata> {\n const container = this.container as unknown as ContainerInternals;\n\n return container._definitions || new Map();\n }\n\n private get aliases(): Map<string, string> {\n const container = this.container as unknown as ContainerInternals;\n\n return container._alias || new Map();\n }\n\n private async ensureFolderExists(filePath: string): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n }\n\n private getServiceClassName(serviceName: unknown): string | undefined {\n return typeof serviceName === 'function' ? serviceName.name : undefined;\n }\n\n private parentMatchesService(\n parentId: string | null | undefined,\n serviceClassName: string,\n ): boolean {\n if (!parentId) {\n return false;\n }\n\n const parentName = Buffer.from(parentId, 'base64').toString('utf8');\n\n return parentName.endsWith(`__${serviceClassName}__${serviceClassName}`);\n }\n\n private serviceIdMatchesService(\n serviceId: string,\n serviceClassName: string,\n ): boolean {\n const serviceName = Buffer.from(serviceId, 'base64').toString('utf8');\n\n return serviceName.endsWith(`__${serviceClassName}__${serviceClassName}`);\n }\n\n private findConcreteChildServiceId(serviceName: unknown): string | undefined {\n const serviceClassName = this.getServiceClassName(serviceName);\n\n if (!serviceClassName) {\n return undefined;\n }\n\n const matches = [...this.definitions.entries()]\n .filter(([, definition]) => definition._abstract !== true)\n .filter(([, definition]) =>\n this.parentMatchesService(definition._parent, serviceClassName),\n )\n .map(([id]) => id);\n\n return matches[matches.length - 1];\n }\n\n private findRegisteredServiceId(serviceName: unknown): string | undefined {\n const serviceClassName = this.getServiceClassName(serviceName);\n\n if (!serviceClassName) {\n return undefined;\n }\n\n const matches = [...this.definitions.keys()].filter((id) =>\n this.serviceIdMatchesService(id, serviceClassName),\n );\n\n return matches[matches.length - 1];\n }\n\n private findAliasServiceId(serviceName: unknown): string | undefined {\n const serviceClassName = this.getServiceClassName(serviceName);\n\n if (!serviceClassName) {\n return undefined;\n }\n\n const matches = [...this.aliases.keys()].filter((id) =>\n this.serviceIdMatchesService(id, serviceClassName),\n );\n\n return matches[matches.length - 1];\n }\n\n private registerParentAliases(): void {\n for (const [id, definition] of this.definitions.entries()) {\n if (definition._abstract === true || !definition._parent) {\n continue;\n }\n\n this.container.setAlias(definition._parent, id);\n }\n }\n\n public async compile(): Promise<void> {\n if (this.options.containerBuild) {\n await this.ensureFolderExists(this.options.servicesYamlPath);\n this.autowire = new Autowire(this.container);\n this.autowire.serviceFile = new ServiceFile(\n this.options.servicesYamlPath,\n false,\n );\n await this.autowire.process();\n } else {\n this.loader = new YamlFileLoader(this.container);\n await this.loader.load(this.options.servicesYamlPath);\n }\n\n this.registerParentAliases();\n await this.container.compile();\n }\n\n public getService<T>(serviceName: unknown): T {\n const childServiceId = this.findConcreteChildServiceId(serviceName);\n\n if (childServiceId) {\n return this.container.get<T>(childServiceId);\n }\n\n const aliasServiceId = this.findAliasServiceId(serviceName);\n\n if (aliasServiceId) {\n return this.container.get<T>(aliasServiceId);\n }\n\n const registeredServiceId = this.findRegisteredServiceId(serviceName);\n\n if (registeredServiceId) {\n return this.container.get<T>(registeredServiceId);\n }\n\n return this.container.get<T>(serviceName);\n }\n}\n\nexport default DependencyInjection;\n","export class ScheduledExecutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ScheduledExecutionError';\n }\n}\n","import type { Scheduler } from './Scheduler.js';\nimport type { SchedulerErrorPolicy } from './SchedulerErrorPolicy.js';\n\nimport { Kernel } from '../../Kernel.js';\nimport { ScheduledExecutionError } from './ScheduledExecutionError.js';\n\nexport class DefaultSchedulerErrorPolicy implements SchedulerErrorPolicy {\n public handle(error: unknown, scheduler: Scheduler): void {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const scheduledError = new ScheduledExecutionError(\n `Error on ${scheduler.getProcessName()}: ${errorMessage}`,\n );\n\n Kernel.logger.error(scheduledError.message);\n }\n\n public shouldSkip(): boolean {\n return false;\n }\n}\n\nexport default DefaultSchedulerErrorPolicy;\n","export class InvalidParseCronExpressionError extends Error {\n constructor(processName: string) {\n super(`Invalid cron expression for scheduler \"${processName}\".`);\n this.name = 'InvalidParseCronExpressionError';\n }\n}\n","import cron from 'node-cron';\n\nimport type { CronExpression } from './CronExpression.js';\nimport type { SchedulerErrorPolicy } from './SchedulerErrorPolicy.js';\n\nimport { Kernel } from '../../Kernel.js';\nimport { DefaultSchedulerErrorPolicy } from './DefaultSchedulerErrorPolicy.js';\nimport { InvalidParseCronExpressionError } from './InvalidParseCronExpressionError.js';\n\nexport abstract class Scheduler {\n constructor(\n private readonly errorPolicy: SchedulerErrorPolicy = new DefaultSchedulerErrorPolicy(),\n ) {}\n\n private parseCronExpression(): string {\n const expression = this.getCronExpression();\n\n return (\n '' +\n `${expression.second ?? '*'} ` +\n `${expression.minute ?? '*'} ` +\n `${expression.hour ?? '*'} ` +\n `${expression.dayOfMonth ?? '*'} ` +\n `${expression.month ?? '*'} ` +\n `${expression.dayOfWeek ?? '*'}`\n );\n }\n\n public abstract execute(): Promise<void>;\n\n public abstract getCronExpression(): CronExpression;\n\n public abstract getProcessName(): string;\n\n public async runOnce(): Promise<void> {\n try {\n Kernel.logger?.debug?.(`Scheduler: Executing ${this.getProcessName()}`);\n await this.execute();\n } catch (error: unknown) {\n if (this.errorPolicy.shouldSkip(error)) {\n return;\n }\n\n await this.errorPolicy.handle(error, this);\n }\n }\n\n public get<T>(service: unknown): T {\n return Kernel.di.getService<T>(service);\n }\n\n public init(): Promise<void> {\n let parsedCronExpression: string;\n\n try {\n parsedCronExpression = this.parseCronExpression();\n } catch {\n throw new InvalidParseCronExpressionError(this.getProcessName());\n }\n\n cron.schedule(parsedCronExpression, () => {\n void this.runOnce();\n });\n\n return Promise.resolve();\n }\n}\n\nexport default Scheduler;\n"],"mappings":"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","names":["import_node_path","path","fs","path","cron"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { a as SchedulerErrorPolicy, S as Scheduler } from '../../Scheduler-oigqNOUJ.cjs';
|
|
2
|
+
export { C as CronExpression } from '../../Scheduler-oigqNOUJ.cjs';
|
|
3
|
+
|
|
4
|
+
declare class DefaultSchedulerErrorPolicy implements SchedulerErrorPolicy {
|
|
5
|
+
handle(error: unknown, scheduler: Scheduler): void;
|
|
6
|
+
shouldSkip(): boolean;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
declare class InvalidParseCronExpressionError extends Error {
|
|
10
|
+
constructor(processName: string);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
declare class ScheduledExecutionError extends Error {
|
|
14
|
+
constructor(message: string);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export { DefaultSchedulerErrorPolicy, InvalidParseCronExpressionError, ScheduledExecutionError, Scheduler, SchedulerErrorPolicy, Scheduler as default };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { a as SchedulerErrorPolicy, S as Scheduler } from '../../Scheduler-oigqNOUJ.js';
|
|
2
|
+
export { C as CronExpression } from '../../Scheduler-oigqNOUJ.js';
|
|
3
|
+
|
|
4
|
+
declare class DefaultSchedulerErrorPolicy implements SchedulerErrorPolicy {
|
|
5
|
+
handle(error: unknown, scheduler: Scheduler): void;
|
|
6
|
+
shouldSkip(): boolean;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
declare class InvalidParseCronExpressionError extends Error {
|
|
10
|
+
constructor(processName: string);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
declare class ScheduledExecutionError extends Error {
|
|
14
|
+
constructor(message: string);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export { DefaultSchedulerErrorPolicy, InvalidParseCronExpressionError, ScheduledExecutionError, Scheduler, SchedulerErrorPolicy, Scheduler as default };
|
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
// src/Kernel.ts
|
|
2
|
+
import path2 from "path";
|
|
3
|
+
|
|
4
|
+
// src/adapters/kernel/console/ConsoleKernelLogger.ts
|
|
5
|
+
var ConsoleKernelLogger = class {
|
|
6
|
+
debug(message) {
|
|
7
|
+
console.debug(message);
|
|
8
|
+
}
|
|
9
|
+
error(message) {
|
|
10
|
+
console.error(message);
|
|
11
|
+
}
|
|
12
|
+
info(message) {
|
|
13
|
+
console.info(message);
|
|
14
|
+
}
|
|
15
|
+
warn(message) {
|
|
16
|
+
console.warn(message);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// src/infrastructure/dependency-injection/DependencyInjection.ts
|
|
21
|
+
import fs from "fs-extra";
|
|
22
|
+
import {
|
|
23
|
+
Autowire,
|
|
24
|
+
ContainerBuilder,
|
|
25
|
+
ServiceFile,
|
|
26
|
+
YamlFileLoader
|
|
27
|
+
} from "node-dependency-injection";
|
|
28
|
+
import path from "path";
|
|
29
|
+
var DependencyInjection = class _DependencyInjection {
|
|
30
|
+
constructor(options = {
|
|
31
|
+
containerBuild: process.env.CONTAINER_BUILD === "true",
|
|
32
|
+
servicesYamlPath: path.resolve(
|
|
33
|
+
process.cwd(),
|
|
34
|
+
"config",
|
|
35
|
+
"container",
|
|
36
|
+
"services.yaml"
|
|
37
|
+
),
|
|
38
|
+
sourceDirectory: path.resolve(process.cwd(), "src")
|
|
39
|
+
}) {
|
|
40
|
+
this.options = options;
|
|
41
|
+
this.container = new ContainerBuilder(false, this.options.sourceDirectory);
|
|
42
|
+
}
|
|
43
|
+
options;
|
|
44
|
+
static configuredInstance;
|
|
45
|
+
autowire;
|
|
46
|
+
loader;
|
|
47
|
+
container;
|
|
48
|
+
static configure(options) {
|
|
49
|
+
_DependencyInjection.configuredInstance = new _DependencyInjection(options);
|
|
50
|
+
return _DependencyInjection.configuredInstance;
|
|
51
|
+
}
|
|
52
|
+
static get instance() {
|
|
53
|
+
if (!_DependencyInjection.configuredInstance) {
|
|
54
|
+
throw new Error("DependencyInjection has not been configured.");
|
|
55
|
+
}
|
|
56
|
+
return _DependencyInjection.configuredInstance;
|
|
57
|
+
}
|
|
58
|
+
get definitions() {
|
|
59
|
+
const container = this.container;
|
|
60
|
+
return container._definitions || /* @__PURE__ */ new Map();
|
|
61
|
+
}
|
|
62
|
+
get aliases() {
|
|
63
|
+
const container = this.container;
|
|
64
|
+
return container._alias || /* @__PURE__ */ new Map();
|
|
65
|
+
}
|
|
66
|
+
async ensureFolderExists(filePath) {
|
|
67
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
68
|
+
}
|
|
69
|
+
getServiceClassName(serviceName) {
|
|
70
|
+
return typeof serviceName === "function" ? serviceName.name : void 0;
|
|
71
|
+
}
|
|
72
|
+
parentMatchesService(parentId, serviceClassName) {
|
|
73
|
+
if (!parentId) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
const parentName = Buffer.from(parentId, "base64").toString("utf8");
|
|
77
|
+
return parentName.endsWith(`__${serviceClassName}__${serviceClassName}`);
|
|
78
|
+
}
|
|
79
|
+
serviceIdMatchesService(serviceId, serviceClassName) {
|
|
80
|
+
const serviceName = Buffer.from(serviceId, "base64").toString("utf8");
|
|
81
|
+
return serviceName.endsWith(`__${serviceClassName}__${serviceClassName}`);
|
|
82
|
+
}
|
|
83
|
+
findConcreteChildServiceId(serviceName) {
|
|
84
|
+
const serviceClassName = this.getServiceClassName(serviceName);
|
|
85
|
+
if (!serviceClassName) {
|
|
86
|
+
return void 0;
|
|
87
|
+
}
|
|
88
|
+
const matches = [...this.definitions.entries()].filter(([, definition]) => definition._abstract !== true).filter(
|
|
89
|
+
([, definition]) => this.parentMatchesService(definition._parent, serviceClassName)
|
|
90
|
+
).map(([id]) => id);
|
|
91
|
+
return matches[matches.length - 1];
|
|
92
|
+
}
|
|
93
|
+
findRegisteredServiceId(serviceName) {
|
|
94
|
+
const serviceClassName = this.getServiceClassName(serviceName);
|
|
95
|
+
if (!serviceClassName) {
|
|
96
|
+
return void 0;
|
|
97
|
+
}
|
|
98
|
+
const matches = [...this.definitions.keys()].filter(
|
|
99
|
+
(id) => this.serviceIdMatchesService(id, serviceClassName)
|
|
100
|
+
);
|
|
101
|
+
return matches[matches.length - 1];
|
|
102
|
+
}
|
|
103
|
+
findAliasServiceId(serviceName) {
|
|
104
|
+
const serviceClassName = this.getServiceClassName(serviceName);
|
|
105
|
+
if (!serviceClassName) {
|
|
106
|
+
return void 0;
|
|
107
|
+
}
|
|
108
|
+
const matches = [...this.aliases.keys()].filter(
|
|
109
|
+
(id) => this.serviceIdMatchesService(id, serviceClassName)
|
|
110
|
+
);
|
|
111
|
+
return matches[matches.length - 1];
|
|
112
|
+
}
|
|
113
|
+
registerParentAliases() {
|
|
114
|
+
for (const [id, definition] of this.definitions.entries()) {
|
|
115
|
+
if (definition._abstract === true || !definition._parent) {
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
this.container.setAlias(definition._parent, id);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async compile() {
|
|
122
|
+
if (this.options.containerBuild) {
|
|
123
|
+
await this.ensureFolderExists(this.options.servicesYamlPath);
|
|
124
|
+
this.autowire = new Autowire(this.container);
|
|
125
|
+
this.autowire.serviceFile = new ServiceFile(
|
|
126
|
+
this.options.servicesYamlPath,
|
|
127
|
+
false
|
|
128
|
+
);
|
|
129
|
+
await this.autowire.process();
|
|
130
|
+
} else {
|
|
131
|
+
this.loader = new YamlFileLoader(this.container);
|
|
132
|
+
await this.loader.load(this.options.servicesYamlPath);
|
|
133
|
+
}
|
|
134
|
+
this.registerParentAliases();
|
|
135
|
+
await this.container.compile();
|
|
136
|
+
}
|
|
137
|
+
getService(serviceName) {
|
|
138
|
+
const childServiceId = this.findConcreteChildServiceId(serviceName);
|
|
139
|
+
if (childServiceId) {
|
|
140
|
+
return this.container.get(childServiceId);
|
|
141
|
+
}
|
|
142
|
+
const aliasServiceId = this.findAliasServiceId(serviceName);
|
|
143
|
+
if (aliasServiceId) {
|
|
144
|
+
return this.container.get(aliasServiceId);
|
|
145
|
+
}
|
|
146
|
+
const registeredServiceId = this.findRegisteredServiceId(serviceName);
|
|
147
|
+
if (registeredServiceId) {
|
|
148
|
+
return this.container.get(registeredServiceId);
|
|
149
|
+
}
|
|
150
|
+
return this.container.get(serviceName);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
// src/Kernel.ts
|
|
155
|
+
var Kernel = class _Kernel {
|
|
156
|
+
constructor(options = {}) {
|
|
157
|
+
this.options = options;
|
|
158
|
+
this.loggerInstance = options.logger ?? new ConsoleKernelLogger();
|
|
159
|
+
this.dependencyInjectionInstance = options.di;
|
|
160
|
+
_Kernel.state.activeKernel = this;
|
|
161
|
+
}
|
|
162
|
+
options;
|
|
163
|
+
static stateKey = /* @__PURE__ */ Symbol.for(
|
|
164
|
+
"@haskou/ddd-kernel/kernel-state"
|
|
165
|
+
);
|
|
166
|
+
consumerMiddlewares = [];
|
|
167
|
+
consumersList = [];
|
|
168
|
+
loggerInstance;
|
|
169
|
+
routesList = [];
|
|
170
|
+
schedulersList = [];
|
|
171
|
+
shutdownHooks = [];
|
|
172
|
+
dependencyInjectionInstance;
|
|
173
|
+
static get state() {
|
|
174
|
+
const stateContainer = globalThis;
|
|
175
|
+
stateContainer[_Kernel.stateKey] = stateContainer[_Kernel.stateKey] ?? {};
|
|
176
|
+
return stateContainer[_Kernel.stateKey];
|
|
177
|
+
}
|
|
178
|
+
static get configDirectory() {
|
|
179
|
+
return path2.resolve(_Kernel.rootDirectory, "config");
|
|
180
|
+
}
|
|
181
|
+
static get consumers() {
|
|
182
|
+
return _Kernel.getActiveKernel().consumers;
|
|
183
|
+
}
|
|
184
|
+
static get consumerMiddleware() {
|
|
185
|
+
return _Kernel.getActiveKernel().consumerMiddleware;
|
|
186
|
+
}
|
|
187
|
+
static get di() {
|
|
188
|
+
return _Kernel.getActiveKernel().di;
|
|
189
|
+
}
|
|
190
|
+
static get logger() {
|
|
191
|
+
return _Kernel.getActiveKernel().logger;
|
|
192
|
+
}
|
|
193
|
+
static get rootDirectory() {
|
|
194
|
+
return process.cwd();
|
|
195
|
+
}
|
|
196
|
+
static get routes() {
|
|
197
|
+
return _Kernel.getActiveKernel().routes;
|
|
198
|
+
}
|
|
199
|
+
static get schedulers() {
|
|
200
|
+
return _Kernel.getActiveKernel().schedulers;
|
|
201
|
+
}
|
|
202
|
+
static get sourceDirectory() {
|
|
203
|
+
return path2.resolve(_Kernel.rootDirectory, "src");
|
|
204
|
+
}
|
|
205
|
+
static getActiveKernel() {
|
|
206
|
+
if (!_Kernel.state.activeKernel) {
|
|
207
|
+
_Kernel.state.activeKernel = new _Kernel();
|
|
208
|
+
}
|
|
209
|
+
return _Kernel.state.activeKernel;
|
|
210
|
+
}
|
|
211
|
+
async closeCandidate(candidate) {
|
|
212
|
+
if (candidate.shutdown) {
|
|
213
|
+
await candidate.shutdown();
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
if (candidate.close) {
|
|
217
|
+
await candidate.close();
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
if (candidate.stop) {
|
|
221
|
+
await candidate.stop();
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
if (candidate.flush) {
|
|
225
|
+
await candidate.flush();
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
getConsumerFromClass(ClassDefinition) {
|
|
229
|
+
return this.di.getService(ClassDefinition);
|
|
230
|
+
}
|
|
231
|
+
getInitializerFromClass(ClassDefinition) {
|
|
232
|
+
return this.di.getService(ClassDefinition);
|
|
233
|
+
}
|
|
234
|
+
getRuntimeFromClass(ClassDefinition) {
|
|
235
|
+
return this.di.getService(ClassDefinition);
|
|
236
|
+
}
|
|
237
|
+
getSchedulerFromClass(ClassDefinition) {
|
|
238
|
+
return this.di.getService(ClassDefinition);
|
|
239
|
+
}
|
|
240
|
+
get consumers() {
|
|
241
|
+
return this.consumersList;
|
|
242
|
+
}
|
|
243
|
+
get consumerMiddleware() {
|
|
244
|
+
return this.consumerMiddlewares;
|
|
245
|
+
}
|
|
246
|
+
get di() {
|
|
247
|
+
if (!this.dependencyInjectionInstance) {
|
|
248
|
+
throw new Error("Kernel dependency injection has not been initialized.");
|
|
249
|
+
}
|
|
250
|
+
return this.dependencyInjectionInstance;
|
|
251
|
+
}
|
|
252
|
+
get logger() {
|
|
253
|
+
return this.loggerInstance;
|
|
254
|
+
}
|
|
255
|
+
get routes() {
|
|
256
|
+
return this.routesList;
|
|
257
|
+
}
|
|
258
|
+
get schedulers() {
|
|
259
|
+
return this.schedulersList;
|
|
260
|
+
}
|
|
261
|
+
async dependencyInjection() {
|
|
262
|
+
this.dependencyInjectionInstance = this.dependencyInjectionInstance ?? DependencyInjection.configure({
|
|
263
|
+
containerBuild: process.env.CONTAINER_BUILD === "true",
|
|
264
|
+
servicesYamlPath: this.options.servicesYamlPath ?? path2.resolve(_Kernel.configDirectory, "container", "services.yaml"),
|
|
265
|
+
sourceDirectory: this.options.sourceDirectory ?? _Kernel.sourceDirectory
|
|
266
|
+
});
|
|
267
|
+
await this.dependencyInjectionInstance.compile();
|
|
268
|
+
}
|
|
269
|
+
getRoutes() {
|
|
270
|
+
return this.routes;
|
|
271
|
+
}
|
|
272
|
+
registerConsumerMiddleware(...middlewares) {
|
|
273
|
+
this.consumerMiddlewares.push(...middlewares);
|
|
274
|
+
}
|
|
275
|
+
registerConsumers(...ClassDefinitions) {
|
|
276
|
+
for (const ClassDefinition of ClassDefinitions) {
|
|
277
|
+
this.consumersList.push(this.getConsumerFromClass(ClassDefinition));
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
registerConsumerInstances(...consumers) {
|
|
281
|
+
this.consumersList.push(...consumers);
|
|
282
|
+
}
|
|
283
|
+
registerRoutes(...ClassDefinitions) {
|
|
284
|
+
this.routesList.push(...ClassDefinitions);
|
|
285
|
+
}
|
|
286
|
+
registerSchedulers(...ClassDefinitions) {
|
|
287
|
+
for (const ClassDefinition of ClassDefinitions) {
|
|
288
|
+
this.schedulersList.push(this.getSchedulerFromClass(ClassDefinition));
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
registerSchedulerInstances(...schedulers) {
|
|
292
|
+
this.schedulersList.push(...schedulers);
|
|
293
|
+
}
|
|
294
|
+
registerShutdownHook(hook) {
|
|
295
|
+
this.shutdownHooks.push(hook);
|
|
296
|
+
}
|
|
297
|
+
removeConsumers() {
|
|
298
|
+
this.consumersList.length = 0;
|
|
299
|
+
}
|
|
300
|
+
removeRoutes() {
|
|
301
|
+
this.routesList.length = 0;
|
|
302
|
+
}
|
|
303
|
+
removeSchedulers() {
|
|
304
|
+
this.schedulersList.length = 0;
|
|
305
|
+
}
|
|
306
|
+
async runConsumers() {
|
|
307
|
+
for (const consumer of this.consumersList) {
|
|
308
|
+
await consumer.init();
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
async runInitializers(...ClassDefinitions) {
|
|
312
|
+
for (const ClassDefinition of ClassDefinitions) {
|
|
313
|
+
await this.getInitializerFromClass(ClassDefinition).ensure();
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
async runRuntimes(...ClassDefinitions) {
|
|
317
|
+
for (const ClassDefinition of ClassDefinitions) {
|
|
318
|
+
const runtime = this.getRuntimeFromClass(ClassDefinition);
|
|
319
|
+
await runtime.run();
|
|
320
|
+
this.registerShutdownHook(
|
|
321
|
+
() => this.closeCandidate(runtime)
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
async runSchedulerNowAndSchedule(ClassDefinition) {
|
|
326
|
+
const scheduler = this.getSchedulerFromClass(ClassDefinition);
|
|
327
|
+
await scheduler.runOnce();
|
|
328
|
+
await scheduler.init();
|
|
329
|
+
this.schedulersList.push(scheduler);
|
|
330
|
+
}
|
|
331
|
+
async runSchedulers() {
|
|
332
|
+
for (const scheduler of this.schedulersList) {
|
|
333
|
+
await scheduler.init();
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
async shutdown() {
|
|
337
|
+
for (const consumer of [...this.consumersList].reverse()) {
|
|
338
|
+
await this.closeCandidate(consumer);
|
|
339
|
+
}
|
|
340
|
+
for (const scheduler of [...this.schedulersList].reverse()) {
|
|
341
|
+
await this.closeCandidate(scheduler);
|
|
342
|
+
}
|
|
343
|
+
for (const hook of [...this.shutdownHooks].reverse()) {
|
|
344
|
+
await hook();
|
|
345
|
+
}
|
|
346
|
+
await this.closeCandidate(this.loggerInstance);
|
|
347
|
+
}
|
|
348
|
+
};
|
|
349
|
+
|
|
350
|
+
// src/infrastructure/scheduler/ScheduledExecutionError.ts
|
|
351
|
+
var ScheduledExecutionError = class extends Error {
|
|
352
|
+
constructor(message) {
|
|
353
|
+
super(message);
|
|
354
|
+
this.name = "ScheduledExecutionError";
|
|
355
|
+
}
|
|
356
|
+
};
|
|
357
|
+
|
|
358
|
+
// src/infrastructure/scheduler/DefaultSchedulerErrorPolicy.ts
|
|
359
|
+
var DefaultSchedulerErrorPolicy = class {
|
|
360
|
+
handle(error, scheduler) {
|
|
361
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
362
|
+
const scheduledError = new ScheduledExecutionError(
|
|
363
|
+
`Error on ${scheduler.getProcessName()}: ${errorMessage}`
|
|
364
|
+
);
|
|
365
|
+
Kernel.logger.error(scheduledError.message);
|
|
366
|
+
}
|
|
367
|
+
shouldSkip() {
|
|
368
|
+
return false;
|
|
369
|
+
}
|
|
370
|
+
};
|
|
371
|
+
|
|
372
|
+
// src/infrastructure/scheduler/InvalidParseCronExpressionError.ts
|
|
373
|
+
var InvalidParseCronExpressionError = class extends Error {
|
|
374
|
+
constructor(processName) {
|
|
375
|
+
super(`Invalid cron expression for scheduler "${processName}".`);
|
|
376
|
+
this.name = "InvalidParseCronExpressionError";
|
|
377
|
+
}
|
|
378
|
+
};
|
|
379
|
+
|
|
380
|
+
// src/infrastructure/scheduler/Scheduler.ts
|
|
381
|
+
import cron from "node-cron";
|
|
382
|
+
var Scheduler = class {
|
|
383
|
+
constructor(errorPolicy = new DefaultSchedulerErrorPolicy()) {
|
|
384
|
+
this.errorPolicy = errorPolicy;
|
|
385
|
+
}
|
|
386
|
+
errorPolicy;
|
|
387
|
+
parseCronExpression() {
|
|
388
|
+
const expression = this.getCronExpression();
|
|
389
|
+
return `${expression.second ?? "*"} ${expression.minute ?? "*"} ${expression.hour ?? "*"} ${expression.dayOfMonth ?? "*"} ${expression.month ?? "*"} ${expression.dayOfWeek ?? "*"}`;
|
|
390
|
+
}
|
|
391
|
+
async runOnce() {
|
|
392
|
+
try {
|
|
393
|
+
Kernel.logger?.debug?.(`Scheduler: Executing ${this.getProcessName()}`);
|
|
394
|
+
await this.execute();
|
|
395
|
+
} catch (error) {
|
|
396
|
+
if (this.errorPolicy.shouldSkip(error)) {
|
|
397
|
+
return;
|
|
398
|
+
}
|
|
399
|
+
await this.errorPolicy.handle(error, this);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
get(service) {
|
|
403
|
+
return Kernel.di.getService(service);
|
|
404
|
+
}
|
|
405
|
+
init() {
|
|
406
|
+
let parsedCronExpression;
|
|
407
|
+
try {
|
|
408
|
+
parsedCronExpression = this.parseCronExpression();
|
|
409
|
+
} catch {
|
|
410
|
+
throw new InvalidParseCronExpressionError(this.getProcessName());
|
|
411
|
+
}
|
|
412
|
+
cron.schedule(parsedCronExpression, () => {
|
|
413
|
+
void this.runOnce();
|
|
414
|
+
});
|
|
415
|
+
return Promise.resolve();
|
|
416
|
+
}
|
|
417
|
+
};
|
|
418
|
+
var Scheduler_default = Scheduler;
|
|
419
|
+
export {
|
|
420
|
+
DefaultSchedulerErrorPolicy,
|
|
421
|
+
InvalidParseCronExpressionError,
|
|
422
|
+
ScheduledExecutionError,
|
|
423
|
+
Scheduler,
|
|
424
|
+
Scheduler_default as default
|
|
425
|
+
};
|
|
426
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/Kernel.ts","../../../src/adapters/kernel/console/ConsoleKernelLogger.ts","../../../src/infrastructure/dependency-injection/DependencyInjection.ts","../../../src/infrastructure/scheduler/ScheduledExecutionError.ts","../../../src/infrastructure/scheduler/DefaultSchedulerErrorPolicy.ts","../../../src/infrastructure/scheduler/InvalidParseCronExpressionError.ts","../../../src/infrastructure/scheduler/Scheduler.ts"],"sourcesContent":["import path from 'node:path';\n\nimport type { Consumer } from './adapters/pubsub/index.js';\nimport type { Route } from './adapters/ui/routes/index.js';\nimport type {\n ConsumerMiddleware,\n KernelLogger,\n ShutdownHook,\n} from './contracts/index.js';\nimport type { ServiceClass } from './infrastructure/dependency-injection/index.js';\nimport type { Initializer, Runtime } from './infrastructure/lifecycle/index.js';\nimport type { Scheduler } from './infrastructure/scheduler/index.js';\nimport type { KernelOptions } from './kernel/KernelOptions.js';\nimport type { ShutdownCandidate } from './kernel/ShutdownCandidate.js';\n\nimport { ConsoleKernelLogger } from './adapters/kernel/index.js';\nimport { DependencyInjection } from './infrastructure/dependency-injection/index.js';\n\nexport type { KernelOptions } from './kernel/KernelOptions.js';\n\nexport class Kernel {\n private static readonly stateKey = Symbol.for(\n '@haskou/ddd-kernel/kernel-state',\n );\n\n private readonly consumerMiddlewares: ConsumerMiddleware[] = [];\n private readonly consumersList: Consumer[] = [];\n private readonly loggerInstance: KernelLogger;\n private readonly routesList: ServiceClass<Route>[] = [];\n private readonly schedulersList: Scheduler[] = [];\n private readonly shutdownHooks: ShutdownHook[] = [];\n private dependencyInjectionInstance: DependencyInjection | undefined;\n\n private static get state(): { activeKernel?: Kernel } {\n const stateContainer = globalThis as typeof globalThis & {\n [Kernel.stateKey]?: { activeKernel?: Kernel };\n };\n\n stateContainer[Kernel.stateKey] = stateContainer[Kernel.stateKey] ?? {};\n\n return stateContainer[Kernel.stateKey] as { activeKernel?: Kernel };\n }\n\n public static get configDirectory(): string {\n return path.resolve(Kernel.rootDirectory, 'config');\n }\n\n public static get consumers(): Consumer[] {\n return Kernel.getActiveKernel().consumers;\n }\n\n public static get consumerMiddleware(): ConsumerMiddleware[] {\n return Kernel.getActiveKernel().consumerMiddleware;\n }\n\n public static get di(): DependencyInjection {\n return Kernel.getActiveKernel().di;\n }\n\n public static get logger(): KernelLogger {\n return Kernel.getActiveKernel().logger;\n }\n\n public static get rootDirectory(): string {\n return process.cwd();\n }\n\n public static get routes(): ServiceClass<Route>[] {\n return Kernel.getActiveKernel().routes;\n }\n\n public static get schedulers(): Scheduler[] {\n return Kernel.getActiveKernel().schedulers;\n }\n\n public static get sourceDirectory(): string {\n return path.resolve(Kernel.rootDirectory, 'src');\n }\n\n private static getActiveKernel(): Kernel {\n if (!Kernel.state.activeKernel) {\n Kernel.state.activeKernel = new Kernel();\n }\n\n return Kernel.state.activeKernel;\n }\n\n constructor(private readonly options: KernelOptions = {}) {\n this.loggerInstance = options.logger ?? new ConsoleKernelLogger();\n this.dependencyInjectionInstance = options.di;\n Kernel.state.activeKernel = this;\n }\n\n private async closeCandidate(candidate: ShutdownCandidate): Promise<void> {\n if (candidate.shutdown) {\n await candidate.shutdown();\n\n return;\n }\n\n if (candidate.close) {\n await candidate.close();\n\n return;\n }\n\n if (candidate.stop) {\n await candidate.stop();\n\n return;\n }\n\n if (candidate.flush) {\n await candidate.flush();\n }\n }\n\n private getConsumerFromClass(\n ClassDefinition: ServiceClass<Consumer>,\n ): Consumer {\n return this.di.getService<Consumer>(ClassDefinition);\n }\n\n private getInitializerFromClass(\n ClassDefinition: ServiceClass<Initializer>,\n ): Initializer {\n return this.di.getService<Initializer>(ClassDefinition);\n }\n\n private getRuntimeFromClass(ClassDefinition: ServiceClass<Runtime>): Runtime {\n return this.di.getService<Runtime>(ClassDefinition);\n }\n\n private getSchedulerFromClass(\n ClassDefinition: ServiceClass<Scheduler>,\n ): Scheduler {\n return this.di.getService<Scheduler>(ClassDefinition);\n }\n\n public get consumers(): Consumer[] {\n return this.consumersList;\n }\n\n public get consumerMiddleware(): ConsumerMiddleware[] {\n return this.consumerMiddlewares;\n }\n\n public get di(): DependencyInjection {\n if (!this.dependencyInjectionInstance) {\n throw new Error('Kernel dependency injection has not been initialized.');\n }\n\n return this.dependencyInjectionInstance;\n }\n\n public get logger(): KernelLogger {\n return this.loggerInstance;\n }\n\n public get routes(): ServiceClass<Route>[] {\n return this.routesList;\n }\n\n public get schedulers(): Scheduler[] {\n return this.schedulersList;\n }\n\n public async dependencyInjection(): Promise<void> {\n this.dependencyInjectionInstance =\n this.dependencyInjectionInstance ??\n DependencyInjection.configure({\n containerBuild: process.env.CONTAINER_BUILD === 'true',\n servicesYamlPath:\n this.options.servicesYamlPath ??\n path.resolve(Kernel.configDirectory, 'container', 'services.yaml'),\n sourceDirectory: this.options.sourceDirectory ?? Kernel.sourceDirectory,\n });\n\n await this.dependencyInjectionInstance.compile();\n }\n\n public getRoutes(): ServiceClass<Route>[] {\n return this.routes;\n }\n\n public registerConsumerMiddleware(\n ...middlewares: ConsumerMiddleware[]\n ): void {\n this.consumerMiddlewares.push(...middlewares);\n }\n\n public registerConsumers(\n ...ClassDefinitions: ServiceClass<Consumer>[]\n ): void {\n for (const ClassDefinition of ClassDefinitions) {\n this.consumersList.push(this.getConsumerFromClass(ClassDefinition));\n }\n }\n\n public registerConsumerInstances(...consumers: Consumer[]): void {\n this.consumersList.push(...consumers);\n }\n\n public registerRoutes(...ClassDefinitions: ServiceClass<Route>[]): void {\n this.routesList.push(...ClassDefinitions);\n }\n\n public registerSchedulers(\n ...ClassDefinitions: ServiceClass<Scheduler>[]\n ): void {\n for (const ClassDefinition of ClassDefinitions) {\n this.schedulersList.push(this.getSchedulerFromClass(ClassDefinition));\n }\n }\n\n public registerSchedulerInstances(...schedulers: Scheduler[]): void {\n this.schedulersList.push(...schedulers);\n }\n\n public registerShutdownHook(hook: ShutdownHook): void {\n this.shutdownHooks.push(hook);\n }\n\n public removeConsumers(): void {\n this.consumersList.length = 0;\n }\n\n public removeRoutes(): void {\n this.routesList.length = 0;\n }\n\n public removeSchedulers(): void {\n this.schedulersList.length = 0;\n }\n\n public async runConsumers(): Promise<void> {\n for (const consumer of this.consumersList) {\n await consumer.init();\n }\n }\n\n public async runInitializers(\n ...ClassDefinitions: ServiceClass<Initializer>[]\n ): Promise<void> {\n for (const ClassDefinition of ClassDefinitions) {\n await this.getInitializerFromClass(ClassDefinition).ensure();\n }\n }\n\n public async runRuntimes(\n ...ClassDefinitions: ServiceClass<Runtime>[]\n ): Promise<void> {\n for (const ClassDefinition of ClassDefinitions) {\n const runtime = this.getRuntimeFromClass(ClassDefinition);\n\n await runtime.run();\n this.registerShutdownHook(() =>\n this.closeCandidate(runtime as ShutdownCandidate),\n );\n }\n }\n\n public async runSchedulerNowAndSchedule(\n ClassDefinition: ServiceClass<Scheduler>,\n ): Promise<void> {\n const scheduler = this.getSchedulerFromClass(ClassDefinition);\n\n await scheduler.runOnce();\n await scheduler.init();\n this.schedulersList.push(scheduler);\n }\n\n public async runSchedulers(): Promise<void> {\n for (const scheduler of this.schedulersList) {\n await scheduler.init();\n }\n }\n\n public async shutdown(): Promise<void> {\n for (const consumer of [...this.consumersList].reverse()) {\n await this.closeCandidate(consumer as ShutdownCandidate);\n }\n\n for (const scheduler of [...this.schedulersList].reverse()) {\n await this.closeCandidate(scheduler as ShutdownCandidate);\n }\n\n for (const hook of [...this.shutdownHooks].reverse()) {\n await hook();\n }\n\n await this.closeCandidate(this.loggerInstance as ShutdownCandidate);\n }\n}\n\nexport function createKernel(options?: KernelOptions): Kernel {\n return new Kernel(options);\n}\n\nexport default Kernel;\n","import type { KernelLogger } from '../../../contracts/index.js';\n\nexport class ConsoleKernelLogger implements KernelLogger {\n public debug(message: string): void {\n // eslint-disable-next-line no-console\n console.debug(message);\n }\n\n public error(message: string): void {\n // eslint-disable-next-line no-console\n console.error(message);\n }\n\n public info(message: string): void {\n // eslint-disable-next-line no-console\n console.info(message);\n }\n\n public warn(message: string): void {\n // eslint-disable-next-line no-console\n console.warn(message);\n }\n}\n","import fs from 'fs-extra';\nimport {\n Autowire,\n ContainerBuilder,\n ServiceFile,\n YamlFileLoader,\n} from 'node-dependency-injection';\nimport path from 'node:path';\n\nimport type { ServiceResolver } from '../../contracts/index.js';\nimport type { ContainerInternals } from './ContainerInternals.js';\nimport type { DefinitionMetadata } from './DefinitionMetadata.js';\nimport type { DependencyInjectionOptions } from './DependencyInjectionOptions.js';\n\nexport class DependencyInjection implements ServiceResolver {\n private static configuredInstance: DependencyInjection | undefined;\n private autowire: Autowire | undefined;\n private loader: YamlFileLoader | undefined;\n private readonly container: ContainerBuilder;\n\n public static configure(\n options: DependencyInjectionOptions,\n ): DependencyInjection {\n DependencyInjection.configuredInstance = new DependencyInjection(options);\n\n return DependencyInjection.configuredInstance;\n }\n\n public static get instance(): DependencyInjection {\n if (!DependencyInjection.configuredInstance) {\n throw new Error('DependencyInjection has not been configured.');\n }\n\n return DependencyInjection.configuredInstance;\n }\n\n constructor(\n private readonly options: DependencyInjectionOptions = {\n containerBuild: process.env.CONTAINER_BUILD === 'true',\n servicesYamlPath: path.resolve(\n process.cwd(),\n 'config',\n 'container',\n 'services.yaml',\n ),\n sourceDirectory: path.resolve(process.cwd(), 'src'),\n },\n ) {\n this.container = new ContainerBuilder(false, this.options.sourceDirectory);\n }\n\n private get definitions(): Map<string, DefinitionMetadata> {\n const container = this.container as unknown as ContainerInternals;\n\n return container._definitions || new Map();\n }\n\n private get aliases(): Map<string, string> {\n const container = this.container as unknown as ContainerInternals;\n\n return container._alias || new Map();\n }\n\n private async ensureFolderExists(filePath: string): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n }\n\n private getServiceClassName(serviceName: unknown): string | undefined {\n return typeof serviceName === 'function' ? serviceName.name : undefined;\n }\n\n private parentMatchesService(\n parentId: string | null | undefined,\n serviceClassName: string,\n ): boolean {\n if (!parentId) {\n return false;\n }\n\n const parentName = Buffer.from(parentId, 'base64').toString('utf8');\n\n return parentName.endsWith(`__${serviceClassName}__${serviceClassName}`);\n }\n\n private serviceIdMatchesService(\n serviceId: string,\n serviceClassName: string,\n ): boolean {\n const serviceName = Buffer.from(serviceId, 'base64').toString('utf8');\n\n return serviceName.endsWith(`__${serviceClassName}__${serviceClassName}`);\n }\n\n private findConcreteChildServiceId(serviceName: unknown): string | undefined {\n const serviceClassName = this.getServiceClassName(serviceName);\n\n if (!serviceClassName) {\n return undefined;\n }\n\n const matches = [...this.definitions.entries()]\n .filter(([, definition]) => definition._abstract !== true)\n .filter(([, definition]) =>\n this.parentMatchesService(definition._parent, serviceClassName),\n )\n .map(([id]) => id);\n\n return matches[matches.length - 1];\n }\n\n private findRegisteredServiceId(serviceName: unknown): string | undefined {\n const serviceClassName = this.getServiceClassName(serviceName);\n\n if (!serviceClassName) {\n return undefined;\n }\n\n const matches = [...this.definitions.keys()].filter((id) =>\n this.serviceIdMatchesService(id, serviceClassName),\n );\n\n return matches[matches.length - 1];\n }\n\n private findAliasServiceId(serviceName: unknown): string | undefined {\n const serviceClassName = this.getServiceClassName(serviceName);\n\n if (!serviceClassName) {\n return undefined;\n }\n\n const matches = [...this.aliases.keys()].filter((id) =>\n this.serviceIdMatchesService(id, serviceClassName),\n );\n\n return matches[matches.length - 1];\n }\n\n private registerParentAliases(): void {\n for (const [id, definition] of this.definitions.entries()) {\n if (definition._abstract === true || !definition._parent) {\n continue;\n }\n\n this.container.setAlias(definition._parent, id);\n }\n }\n\n public async compile(): Promise<void> {\n if (this.options.containerBuild) {\n await this.ensureFolderExists(this.options.servicesYamlPath);\n this.autowire = new Autowire(this.container);\n this.autowire.serviceFile = new ServiceFile(\n this.options.servicesYamlPath,\n false,\n );\n await this.autowire.process();\n } else {\n this.loader = new YamlFileLoader(this.container);\n await this.loader.load(this.options.servicesYamlPath);\n }\n\n this.registerParentAliases();\n await this.container.compile();\n }\n\n public getService<T>(serviceName: unknown): T {\n const childServiceId = this.findConcreteChildServiceId(serviceName);\n\n if (childServiceId) {\n return this.container.get<T>(childServiceId);\n }\n\n const aliasServiceId = this.findAliasServiceId(serviceName);\n\n if (aliasServiceId) {\n return this.container.get<T>(aliasServiceId);\n }\n\n const registeredServiceId = this.findRegisteredServiceId(serviceName);\n\n if (registeredServiceId) {\n return this.container.get<T>(registeredServiceId);\n }\n\n return this.container.get<T>(serviceName);\n }\n}\n\nexport default DependencyInjection;\n","export class ScheduledExecutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ScheduledExecutionError';\n }\n}\n","import type { Scheduler } from './Scheduler.js';\nimport type { SchedulerErrorPolicy } from './SchedulerErrorPolicy.js';\n\nimport { Kernel } from '../../Kernel.js';\nimport { ScheduledExecutionError } from './ScheduledExecutionError.js';\n\nexport class DefaultSchedulerErrorPolicy implements SchedulerErrorPolicy {\n public handle(error: unknown, scheduler: Scheduler): void {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const scheduledError = new ScheduledExecutionError(\n `Error on ${scheduler.getProcessName()}: ${errorMessage}`,\n );\n\n Kernel.logger.error(scheduledError.message);\n }\n\n public shouldSkip(): boolean {\n return false;\n }\n}\n\nexport default DefaultSchedulerErrorPolicy;\n","export class InvalidParseCronExpressionError extends Error {\n constructor(processName: string) {\n super(`Invalid cron expression for scheduler \"${processName}\".`);\n this.name = 'InvalidParseCronExpressionError';\n }\n}\n","import cron from 'node-cron';\n\nimport type { CronExpression } from './CronExpression.js';\nimport type { SchedulerErrorPolicy } from './SchedulerErrorPolicy.js';\n\nimport { Kernel } from '../../Kernel.js';\nimport { DefaultSchedulerErrorPolicy } from './DefaultSchedulerErrorPolicy.js';\nimport { InvalidParseCronExpressionError } from './InvalidParseCronExpressionError.js';\n\nexport abstract class Scheduler {\n constructor(\n private readonly errorPolicy: SchedulerErrorPolicy = new DefaultSchedulerErrorPolicy(),\n ) {}\n\n private parseCronExpression(): string {\n const expression = this.getCronExpression();\n\n return (\n '' +\n `${expression.second ?? '*'} ` +\n `${expression.minute ?? '*'} ` +\n `${expression.hour ?? '*'} ` +\n `${expression.dayOfMonth ?? '*'} ` +\n `${expression.month ?? '*'} ` +\n `${expression.dayOfWeek ?? '*'}`\n );\n }\n\n public abstract execute(): Promise<void>;\n\n public abstract getCronExpression(): CronExpression;\n\n public abstract getProcessName(): string;\n\n public async runOnce(): Promise<void> {\n try {\n Kernel.logger?.debug?.(`Scheduler: Executing ${this.getProcessName()}`);\n await this.execute();\n } catch (error: unknown) {\n if (this.errorPolicy.shouldSkip(error)) {\n return;\n }\n\n await this.errorPolicy.handle(error, this);\n }\n }\n\n public get<T>(service: unknown): T {\n return Kernel.di.getService<T>(service);\n }\n\n public init(): Promise<void> {\n let parsedCronExpression: string;\n\n try {\n parsedCronExpression = this.parseCronExpression();\n } catch {\n throw new InvalidParseCronExpressionError(this.getProcessName());\n }\n\n cron.schedule(parsedCronExpression, () => {\n void this.runOnce();\n });\n\n return Promise.resolve();\n }\n}\n\nexport default Scheduler;\n"],"mappings":"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","names":["path","path"]}
|