@punks/backend-entity-manager 0.0.366 → 0.0.367
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/dist/cjs/index.js +172 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types/abstractions/index.d.ts +1 -0
- package/dist/cjs/types/abstractions/tasks.d.ts +13 -0
- package/dist/cjs/types/platforms/nest/__test__/tests/tasks/parallel-task.test.d.ts +1 -0
- package/dist/cjs/types/platforms/nest/__test__/tests/tasks/single-task.test.d.ts +1 -0
- package/dist/cjs/types/platforms/nest/__test__/tests/tasks/tasks.d.ts +12 -0
- package/dist/cjs/types/platforms/nest/decorators/index.d.ts +1 -0
- package/dist/cjs/types/platforms/nest/decorators/tasks.d.ts +13 -0
- package/dist/cjs/types/platforms/nest/extensions/index.d.ts +1 -0
- package/dist/cjs/types/platforms/nest/extensions/tasks/index.d.ts +1 -0
- package/dist/cjs/types/platforms/nest/extensions/tasks/initializer.d.ts +13 -0
- package/dist/cjs/types/platforms/nest/extensions/tasks/module.d.ts +7 -0
- package/dist/cjs/types/platforms/nest/extensions/tasks/task-scheduler/index.d.ts +13 -0
- package/dist/cjs/types/platforms/nest/extensions/tasks/task-shell/index.d.ts +15 -0
- package/dist/cjs/types/utils/cron.d.ts +1 -0
- package/dist/cjs/types/utils/dates.d.ts +1 -0
- package/dist/esm/index.js +172 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/abstractions/index.d.ts +1 -0
- package/dist/esm/types/abstractions/tasks.d.ts +13 -0
- package/dist/esm/types/platforms/nest/__test__/tests/tasks/parallel-task.test.d.ts +1 -0
- package/dist/esm/types/platforms/nest/__test__/tests/tasks/single-task.test.d.ts +1 -0
- package/dist/esm/types/platforms/nest/__test__/tests/tasks/tasks.d.ts +12 -0
- package/dist/esm/types/platforms/nest/decorators/index.d.ts +1 -0
- package/dist/esm/types/platforms/nest/decorators/tasks.d.ts +13 -0
- package/dist/esm/types/platforms/nest/extensions/index.d.ts +1 -0
- package/dist/esm/types/platforms/nest/extensions/tasks/index.d.ts +1 -0
- package/dist/esm/types/platforms/nest/extensions/tasks/initializer.d.ts +13 -0
- package/dist/esm/types/platforms/nest/extensions/tasks/module.d.ts +7 -0
- package/dist/esm/types/platforms/nest/extensions/tasks/task-scheduler/index.d.ts +13 -0
- package/dist/esm/types/platforms/nest/extensions/tasks/task-shell/index.d.ts +15 -0
- package/dist/esm/types/utils/cron.d.ts +1 -0
- package/dist/esm/types/utils/dates.d.ts +1 -0
- package/dist/index.d.ts +58 -2
- package/package.json +14 -14
package/dist/cjs/index.js
CHANGED
|
@@ -4262,6 +4262,19 @@ const WpEntitySnapshotService = (entityName, props = {}) => common.applyDecorato
|
|
|
4262
4262
|
...props,
|
|
4263
4263
|
}));
|
|
4264
4264
|
|
|
4265
|
+
const TASK_KEY = "wp_task";
|
|
4266
|
+
var TaskConcurrency;
|
|
4267
|
+
(function (TaskConcurrency) {
|
|
4268
|
+
TaskConcurrency["Single"] = "single";
|
|
4269
|
+
TaskConcurrency["Multiple"] = "multiple";
|
|
4270
|
+
})(TaskConcurrency || (TaskConcurrency = {}));
|
|
4271
|
+
function WpTask(name, settings) {
|
|
4272
|
+
return common.applyDecorators(common.Injectable(), common.SetMetadata(TASK_KEY, {
|
|
4273
|
+
name,
|
|
4274
|
+
...settings,
|
|
4275
|
+
}));
|
|
4276
|
+
}
|
|
4277
|
+
|
|
4265
4278
|
const WpEventsTracker = (props = {}) => common.applyDecorators(common.Injectable(), common.SetMetadata(EntityManagerSymbols.EventsTracker, {
|
|
4266
4279
|
...props,
|
|
4267
4280
|
}));
|
|
@@ -34781,6 +34794,164 @@ exports.JobsModule = JobsModule_1 = __decorate([
|
|
|
34781
34794
|
JobsProviderFactory])
|
|
34782
34795
|
], exports.JobsModule);
|
|
34783
34796
|
|
|
34797
|
+
var TaskRunType;
|
|
34798
|
+
(function (TaskRunType) {
|
|
34799
|
+
TaskRunType["Scheduled"] = "Scheduled";
|
|
34800
|
+
TaskRunType["OnDemand"] = "OnDemand";
|
|
34801
|
+
})(TaskRunType || (TaskRunType = {}));
|
|
34802
|
+
|
|
34803
|
+
const getCronCurrentSchedule = (cronExpression, ref) => {
|
|
34804
|
+
const interval = parser$1.parseExpression(cronExpression, {
|
|
34805
|
+
currentDate: ref,
|
|
34806
|
+
});
|
|
34807
|
+
return interval.prev().toDate();
|
|
34808
|
+
};
|
|
34809
|
+
|
|
34810
|
+
function floorDateToSecond(date) {
|
|
34811
|
+
const flooredDate = new Date(date);
|
|
34812
|
+
flooredDate.setMilliseconds(0);
|
|
34813
|
+
return flooredDate;
|
|
34814
|
+
}
|
|
34815
|
+
|
|
34816
|
+
var TaskShell_1;
|
|
34817
|
+
let TaskShell = TaskShell_1 = class TaskShell {
|
|
34818
|
+
constructor(registry, operations) {
|
|
34819
|
+
this.registry = registry;
|
|
34820
|
+
this.operations = operations;
|
|
34821
|
+
this.logger = backendCore.Log.getLogger(TaskShell_1.name);
|
|
34822
|
+
}
|
|
34823
|
+
async executeTask(instance, settings) {
|
|
34824
|
+
switch (settings.concurrency) {
|
|
34825
|
+
case TaskConcurrency.Single:
|
|
34826
|
+
return await this.executeTaskSequential(instance, settings);
|
|
34827
|
+
case TaskConcurrency.Multiple:
|
|
34828
|
+
return await this.executeTaskParallel(instance, settings);
|
|
34829
|
+
default:
|
|
34830
|
+
throw new Error(`Unknown task concurrency: ${settings.concurrency}`);
|
|
34831
|
+
}
|
|
34832
|
+
}
|
|
34833
|
+
async executeTaskParallel(instance, settings) {
|
|
34834
|
+
await this.invokeTask(instance, settings);
|
|
34835
|
+
}
|
|
34836
|
+
async executeTaskSequential(instance, settings) {
|
|
34837
|
+
const currentSchedule = getCronCurrentSchedule(settings.cronExpression, new Date());
|
|
34838
|
+
const lockKey = this.getTaskLockKey(settings, currentSchedule);
|
|
34839
|
+
const lock = await this.operations.acquireLock({
|
|
34840
|
+
lockUid: lockKey,
|
|
34841
|
+
});
|
|
34842
|
+
if (lock.available) {
|
|
34843
|
+
await this.invokeTask(instance, settings);
|
|
34844
|
+
}
|
|
34845
|
+
}
|
|
34846
|
+
getTaskLockKey(settings, cronSchedule) {
|
|
34847
|
+
return `task:${settings.name}:${floorDateToSecond(cronSchedule).toISOString()}`;
|
|
34848
|
+
}
|
|
34849
|
+
async invokeTask(instance, settings) {
|
|
34850
|
+
try {
|
|
34851
|
+
this.logger.info(`Task ${settings.name} -> starting`);
|
|
34852
|
+
await instance.execute({
|
|
34853
|
+
name: settings.name,
|
|
34854
|
+
startedAt: new Date(),
|
|
34855
|
+
runId: backendCore.newUuid(),
|
|
34856
|
+
runType: TaskRunType.Scheduled,
|
|
34857
|
+
});
|
|
34858
|
+
this.logger.info(`Task ${settings.name} -> completed`);
|
|
34859
|
+
}
|
|
34860
|
+
catch (error) {
|
|
34861
|
+
this.logger.exception(`Task ${settings.name} -> failed`, error);
|
|
34862
|
+
}
|
|
34863
|
+
}
|
|
34864
|
+
get operationsLockService() {
|
|
34865
|
+
return this.registry
|
|
34866
|
+
.getContainer()
|
|
34867
|
+
.getEntitiesServicesLocator()
|
|
34868
|
+
.resolveOperationLockService();
|
|
34869
|
+
}
|
|
34870
|
+
};
|
|
34871
|
+
TaskShell = TaskShell_1 = __decorate([
|
|
34872
|
+
common.Injectable(),
|
|
34873
|
+
__param(1, common.Inject(getEntityManagerProviderToken("OperationsLockRepository"))),
|
|
34874
|
+
__metadata("design:paramtypes", [exports.EntityManagerRegistry, Object])
|
|
34875
|
+
], TaskShell);
|
|
34876
|
+
|
|
34877
|
+
var TaskScheduler_1;
|
|
34878
|
+
let TaskScheduler = TaskScheduler_1 = class TaskScheduler {
|
|
34879
|
+
constructor(schedulerRegistry, jobShell) {
|
|
34880
|
+
this.schedulerRegistry = schedulerRegistry;
|
|
34881
|
+
this.jobShell = jobShell;
|
|
34882
|
+
this.logger = new common.Logger(TaskScheduler_1.name);
|
|
34883
|
+
this.jobs = [];
|
|
34884
|
+
}
|
|
34885
|
+
async registerTask(job, instance) {
|
|
34886
|
+
const cronJob = new dist.CronJob(job.cronExpression, async (context) => {
|
|
34887
|
+
await this.jobShell.executeTask(instance, job);
|
|
34888
|
+
});
|
|
34889
|
+
this.schedulerRegistry.addCronJob(job.name, cronJob);
|
|
34890
|
+
cronJob.start();
|
|
34891
|
+
this.jobs.push(cronJob);
|
|
34892
|
+
this.logger.log(`Jobs ${job.name} registered`);
|
|
34893
|
+
}
|
|
34894
|
+
stopAllTasks() {
|
|
34895
|
+
this.jobs.forEach((job) => {
|
|
34896
|
+
job.stop();
|
|
34897
|
+
});
|
|
34898
|
+
}
|
|
34899
|
+
};
|
|
34900
|
+
TaskScheduler = TaskScheduler_1 = __decorate([
|
|
34901
|
+
common.Injectable(),
|
|
34902
|
+
__metadata("design:paramtypes", [schedule.SchedulerRegistry,
|
|
34903
|
+
TaskShell])
|
|
34904
|
+
], TaskScheduler);
|
|
34905
|
+
|
|
34906
|
+
var TasksInitializer_1;
|
|
34907
|
+
let TasksInitializer = TasksInitializer_1 = class TasksInitializer {
|
|
34908
|
+
constructor(discover, scheduler) {
|
|
34909
|
+
this.discover = discover;
|
|
34910
|
+
this.scheduler = scheduler;
|
|
34911
|
+
this.logger = new common.Logger(TasksInitializer_1.name);
|
|
34912
|
+
}
|
|
34913
|
+
async initialize(app) {
|
|
34914
|
+
await this.registerCronJobs();
|
|
34915
|
+
this.logger.log("Tasks initialized 🎰");
|
|
34916
|
+
}
|
|
34917
|
+
async registerCronJobs() {
|
|
34918
|
+
const tasks = await this.discoverTasks();
|
|
34919
|
+
const duplicatedJobs = tasks.filter((job, index, self) => index !== self.findIndex((t) => t.meta.name === job.meta.name));
|
|
34920
|
+
if (duplicatedJobs.length) {
|
|
34921
|
+
throw new Error(`Duplicated jobs found: ${duplicatedJobs
|
|
34922
|
+
.map((j) => j.meta.name)
|
|
34923
|
+
.join(", ")}`);
|
|
34924
|
+
}
|
|
34925
|
+
for (const task of tasks) {
|
|
34926
|
+
await this.scheduler.registerTask(task.meta, task.discoveredClass.instance);
|
|
34927
|
+
}
|
|
34928
|
+
}
|
|
34929
|
+
async discoverTasks() {
|
|
34930
|
+
return await this.discover.providersWithMetaAtKey(TASK_KEY);
|
|
34931
|
+
}
|
|
34932
|
+
};
|
|
34933
|
+
TasksInitializer = TasksInitializer_1 = __decorate([
|
|
34934
|
+
WpAppInitializer(),
|
|
34935
|
+
__metadata("design:paramtypes", [exports.CustomDiscoveryService,
|
|
34936
|
+
TaskScheduler])
|
|
34937
|
+
], TasksInitializer);
|
|
34938
|
+
|
|
34939
|
+
exports.TasksModule = class TasksModule {
|
|
34940
|
+
constructor(scheduler) {
|
|
34941
|
+
this.scheduler = scheduler;
|
|
34942
|
+
}
|
|
34943
|
+
onModuleDestroy() {
|
|
34944
|
+
this.scheduler.stopAllTasks();
|
|
34945
|
+
}
|
|
34946
|
+
};
|
|
34947
|
+
exports.TasksModule = __decorate([
|
|
34948
|
+
common.Module({
|
|
34949
|
+
imports: [exports.EntityManagerModule],
|
|
34950
|
+
providers: [TasksInitializer, TaskScheduler, TaskShell],
|
|
34951
|
+
}),
|
|
34952
|
+
__metadata("design:paramtypes", [TaskScheduler])
|
|
34953
|
+
], exports.TasksModule);
|
|
34954
|
+
|
|
34784
34955
|
const createExpressFileResponse = (res, file) => {
|
|
34785
34956
|
res.set({
|
|
34786
34957
|
"Content-Type": file.contentType,
|
|
@@ -44556,6 +44727,7 @@ exports.WpPermissionsService = WpPermissionsService;
|
|
|
44556
44727
|
exports.WpPipeline = WpPipeline;
|
|
44557
44728
|
exports.WpRolesService = WpRolesService;
|
|
44558
44729
|
exports.WpSendgridEmailTemplate = WpSendgridEmailTemplate;
|
|
44730
|
+
exports.WpTask = WpTask;
|
|
44559
44731
|
exports.WpUserRolesService = WpUserRolesService;
|
|
44560
44732
|
exports.WpUserService = WpUserService;
|
|
44561
44733
|
exports.awsBatchSettings = awsBatchSettings;
|