@penkov/tasks_queue
Version:
A lightweight PostgreSQL-backed task queue system with scheduling, retries, backoff strategies, and priority handling. Designed for efficiency and observability in modern Node.js applications.
87 lines (86 loc) • 3.21 kB
JavaScript
var TasksQueueModule_1;
import { __decorate, __metadata } from "tslib";
import { Module, } from "@nestjs/common";
import { TasksQueueDao } from "./tasks-queue.dao.js";
import { TasksPoolsService } from "./tasks-pools.service.js";
import { TASKS_QUEUE_OPTIONS, } from "./tasks-queue-async-options.js";
import { ModuleRef } from "@nestjs/core";
import { TimeUtils } from "./time-utils.js";
import { ManageTasksQueueService } from "./manage-tasks-queue.service.js";
import { identity, option } from "scats";
let TasksQueueModule = TasksQueueModule_1 = class TasksQueueModule {
moduleRef;
constructor(moduleRef) {
this.moduleRef = moduleRef;
}
static forRootAsync(options) {
const asyncProviders = this.createAsyncProviders(options);
return {
module: TasksQueueModule_1,
imports: options.imports,
providers: [
...asyncProviders,
{
provide: TasksQueueDao,
inject: [TASKS_QUEUE_OPTIONS],
useFactory: (opts) => new TasksQueueDao(opts.db),
},
{
provide: ManageTasksQueueService,
inject: [TASKS_QUEUE_OPTIONS],
useFactory: (opts) => new ManageTasksQueueService(opts.db),
},
{
provide: TasksPoolsService,
inject: [TasksQueueDao, ManageTasksQueueService, TASKS_QUEUE_OPTIONS],
useFactory: (dao, manageService, opts) => new TasksPoolsService(dao, manageService, option(opts.runAuxiliaryWorker).forall(identity), opts.pools),
},
],
exports: [TasksPoolsService, ManageTasksQueueService],
};
}
static createAsyncProviders(options) {
if (options.useExisting || options.useFactory) {
return [this.createAsyncOptionsProvider(options)];
}
const useClass = options.useClass;
return [
this.createAsyncOptionsProvider(options),
{
provide: useClass,
useClass,
},
];
}
static createAsyncOptionsProvider(options) {
if (options.useFactory) {
return {
provide: TASKS_QUEUE_OPTIONS,
useFactory: options.useFactory,
inject: options.inject || [],
};
}
const inject = [
(options.useClass ||
options.useExisting),
];
return {
provide: TASKS_QUEUE_OPTIONS,
useFactory: async (optionsFactory) => await optionsFactory.createTelegrafOptions(),
inject,
};
}
onApplicationBootstrap() {
const poolsService = this.moduleRef.get(TasksPoolsService);
poolsService.start();
}
async onApplicationShutdown() {
const poolsService = this.moduleRef.get(TasksPoolsService);
await poolsService.stop(TimeUtils.minute);
}
};
TasksQueueModule = TasksQueueModule_1 = __decorate([
Module({}),
__metadata("design:paramtypes", [ModuleRef])
], TasksQueueModule);
export { TasksQueueModule };