@punks/backend-entity-manager 0.0.368 → 0.0.370

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.
Files changed (32) hide show
  1. package/dist/cjs/index.js +99 -26
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/types/abstractions/index.d.ts +1 -1
  4. package/dist/cjs/types/platforms/nest/__test__/tests/tasks/manual-task.test.d.ts +1 -0
  5. package/dist/cjs/types/platforms/nest/__test__/tests/tasks/tasks.d.ts +5 -0
  6. package/dist/cjs/types/platforms/nest/decorators/tasks.d.ts +1 -1
  7. package/dist/cjs/types/platforms/nest/extensions/tasks/index.d.ts +1 -0
  8. package/dist/cjs/types/platforms/nest/extensions/tasks/initializer.d.ts +4 -2
  9. package/dist/cjs/types/platforms/nest/extensions/tasks/module.d.ts +1 -1
  10. package/dist/cjs/types/platforms/nest/extensions/tasks/providers/index.d.ts +4 -0
  11. package/dist/cjs/types/platforms/nest/extensions/tasks/providers/registry/index.d.ts +10 -0
  12. package/dist/cjs/types/platforms/nest/extensions/tasks/{task-scheduler → providers/scheduler}/index.d.ts +5 -5
  13. package/dist/cjs/types/platforms/nest/extensions/tasks/{task-shell → providers/shell}/index.d.ts +5 -4
  14. package/dist/cjs/types/platforms/nest/extensions/tasks/services/index.d.ts +2 -0
  15. package/dist/cjs/types/platforms/nest/extensions/tasks/services/tasks-service/index.d.ts +10 -0
  16. package/dist/esm/index.js +100 -27
  17. package/dist/esm/index.js.map +1 -1
  18. package/dist/esm/types/abstractions/index.d.ts +1 -1
  19. package/dist/esm/types/platforms/nest/__test__/tests/tasks/manual-task.test.d.ts +1 -0
  20. package/dist/esm/types/platforms/nest/__test__/tests/tasks/tasks.d.ts +5 -0
  21. package/dist/esm/types/platforms/nest/decorators/tasks.d.ts +1 -1
  22. package/dist/esm/types/platforms/nest/extensions/tasks/index.d.ts +1 -0
  23. package/dist/esm/types/platforms/nest/extensions/tasks/initializer.d.ts +4 -2
  24. package/dist/esm/types/platforms/nest/extensions/tasks/module.d.ts +1 -1
  25. package/dist/esm/types/platforms/nest/extensions/tasks/providers/index.d.ts +4 -0
  26. package/dist/esm/types/platforms/nest/extensions/tasks/providers/registry/index.d.ts +10 -0
  27. package/dist/esm/types/platforms/nest/extensions/tasks/{task-scheduler → providers/scheduler}/index.d.ts +5 -5
  28. package/dist/esm/types/platforms/nest/extensions/tasks/{task-shell → providers/shell}/index.d.ts +5 -4
  29. package/dist/esm/types/platforms/nest/extensions/tasks/services/index.d.ts +2 -0
  30. package/dist/esm/types/platforms/nest/extensions/tasks/services/tasks-service/index.d.ts +10 -0
  31. package/dist/index.d.ts +37 -19
  32. package/package.json +1 -1
package/dist/cjs/index.js CHANGED
@@ -165,6 +165,12 @@ exports.EntitySerializationFormat = void 0;
165
165
  EntitySerializationFormat["Xlsx"] = "xlsx";
166
166
  })(exports.EntitySerializationFormat || (exports.EntitySerializationFormat = {}));
167
167
 
168
+ exports.TaskRunType = void 0;
169
+ (function (TaskRunType) {
170
+ TaskRunType["Scheduled"] = "Scheduled";
171
+ TaskRunType["OnDemand"] = "OnDemand";
172
+ })(exports.TaskRunType || (exports.TaskRunType = {}));
173
+
168
174
  exports.EntityVersionOperation = void 0;
169
175
  (function (EntityVersionOperation) {
170
176
  EntityVersionOperation["Create"] = "create";
@@ -34794,12 +34800,6 @@ exports.JobsModule = JobsModule_1 = __decorate([
34794
34800
  JobsProviderFactory])
34795
34801
  ], exports.JobsModule);
34796
34802
 
34797
- var TaskRunType;
34798
- (function (TaskRunType) {
34799
- TaskRunType["Scheduled"] = "Scheduled";
34800
- TaskRunType["OnDemand"] = "OnDemand";
34801
- })(TaskRunType || (TaskRunType = {}));
34802
-
34803
34803
  const getCronCurrentSchedule = (cronExpression, ref) => {
34804
34804
  const interval = parser$1.parseExpression(cronExpression, {
34805
34805
  currentDate: ref,
@@ -34820,40 +34820,42 @@ let TaskShell = TaskShell_1 = class TaskShell {
34820
34820
  this.operations = operations;
34821
34821
  this.logger = backendCore.Log.getLogger(TaskShell_1.name);
34822
34822
  }
34823
- async executeTask(instance, settings) {
34823
+ async executeTask(instance, settings, runType) {
34824
34824
  switch (settings.concurrency) {
34825
34825
  case exports.TaskConcurrency.Single:
34826
- return await this.executeTaskSequential(instance, settings);
34826
+ return await this.executeTaskSequential(instance, settings, runType);
34827
34827
  case exports.TaskConcurrency.Multiple:
34828
- return await this.executeTaskParallel(instance, settings);
34828
+ return await this.executeTaskParallel(instance, settings, runType);
34829
34829
  default:
34830
34830
  throw new Error(`Unknown task concurrency: ${settings.concurrency}`);
34831
34831
  }
34832
34832
  }
34833
- async executeTaskParallel(instance, settings) {
34834
- await this.invokeTask(instance, settings);
34833
+ async executeTaskParallel(instance, settings, runType) {
34834
+ await this.invokeTask(instance, settings, runType);
34835
34835
  }
34836
- async executeTaskSequential(instance, settings) {
34837
- const currentSchedule = getCronCurrentSchedule(settings.cronExpression, new Date());
34836
+ async executeTaskSequential(instance, settings, runType) {
34837
+ const currentSchedule = settings.cronExpression && runType === exports.TaskRunType.Scheduled
34838
+ ? getCronCurrentSchedule(settings.cronExpression, new Date())
34839
+ : undefined;
34838
34840
  const lockKey = this.getTaskLockKey(settings, currentSchedule);
34839
34841
  const lock = await this.operations.acquireLock({
34840
34842
  lockUid: lockKey,
34841
34843
  });
34842
34844
  if (lock.available) {
34843
- await this.invokeTask(instance, settings);
34845
+ await this.invokeTask(instance, settings, runType);
34844
34846
  }
34845
34847
  }
34846
34848
  getTaskLockKey(settings, cronSchedule) {
34847
- return `task:${settings.name}:${floorDateToSecond(cronSchedule).toISOString()}`;
34849
+ return `task:${settings.name}:${cronSchedule ? floorDateToSecond(cronSchedule).toISOString() : backendCore.newUuid()}`;
34848
34850
  }
34849
- async invokeTask(instance, settings) {
34851
+ async invokeTask(instance, settings, runType) {
34850
34852
  try {
34851
34853
  this.logger.info(`Task ${settings.name} -> starting`);
34852
34854
  await instance.execute({
34853
34855
  name: settings.name,
34854
34856
  startedAt: new Date(),
34855
34857
  runId: backendCore.newUuid(),
34856
- runType: TaskRunType.Scheduled,
34858
+ runType,
34857
34859
  });
34858
34860
  this.logger.info(`Task ${settings.name} -> completed`);
34859
34861
  }
@@ -34880,19 +34882,22 @@ let TaskScheduler = TaskScheduler_1 = class TaskScheduler {
34880
34882
  this.schedulerRegistry = schedulerRegistry;
34881
34883
  this.jobShell = jobShell;
34882
34884
  this.logger = new common.Logger(TaskScheduler_1.name);
34883
- this.jobs = [];
34885
+ this.cronJobs = [];
34884
34886
  }
34885
- async registerTask(job, instance) {
34887
+ async scheduleTask(job, instance) {
34888
+ if (!job.cronExpression) {
34889
+ throw new Error(`Task ${job.name} has no cron expression`);
34890
+ }
34886
34891
  const cronJob = new dist.CronJob(job.cronExpression, async (context) => {
34887
- await this.jobShell.executeTask(instance, job);
34892
+ await this.jobShell.executeTask(instance, job, exports.TaskRunType.Scheduled);
34888
34893
  });
34889
34894
  this.schedulerRegistry.addCronJob(job.name, cronJob);
34890
34895
  cronJob.start();
34891
- this.jobs.push(cronJob);
34896
+ this.cronJobs.push(cronJob);
34892
34897
  this.logger.log(`Jobs ${job.name} registered`);
34893
34898
  }
34894
34899
  stopAllTasks() {
34895
- this.jobs.forEach((job) => {
34900
+ this.cronJobs.forEach((job) => {
34896
34901
  job.stop();
34897
34902
  });
34898
34903
  }
@@ -34903,11 +34908,37 @@ TaskScheduler = TaskScheduler_1 = __decorate([
34903
34908
  TaskShell])
34904
34909
  ], TaskScheduler);
34905
34910
 
34911
+ let TasksRegistry = class TasksRegistry {
34912
+ constructor() {
34913
+ this.tasks = new Map();
34914
+ }
34915
+ registerTask(props, instance) {
34916
+ if (this.tasks.has(props.name)) {
34917
+ throw new Error(`Task with name ${props.name} already registered`);
34918
+ }
34919
+ this.tasks.set(props.name, {
34920
+ instance,
34921
+ props,
34922
+ });
34923
+ }
34924
+ getTask(name) {
34925
+ const task = this.tasks.get(name);
34926
+ if (!task) {
34927
+ throw new Error(`Task with name ${name} not found`);
34928
+ }
34929
+ return task;
34930
+ }
34931
+ };
34932
+ TasksRegistry = __decorate([
34933
+ common.Injectable()
34934
+ ], TasksRegistry);
34935
+
34906
34936
  var TasksInitializer_1;
34907
34937
  let TasksInitializer = TasksInitializer_1 = class TasksInitializer {
34908
- constructor(discover, scheduler) {
34938
+ constructor(discover, scheduler, registry) {
34909
34939
  this.discover = discover;
34910
34940
  this.scheduler = scheduler;
34941
+ this.registry = registry;
34911
34942
  this.logger = new common.Logger(TasksInitializer_1.name);
34912
34943
  }
34913
34944
  async initialize(app) {
@@ -34923,7 +34954,10 @@ let TasksInitializer = TasksInitializer_1 = class TasksInitializer {
34923
34954
  .join(", ")}`);
34924
34955
  }
34925
34956
  for (const task of tasks) {
34926
- await this.scheduler.registerTask(task.meta, task.discoveredClass.instance);
34957
+ this.registry.registerTask(task.meta, task.discoveredClass.instance);
34958
+ if (task.meta.cronExpression) {
34959
+ await this.scheduler.scheduleTask(task.meta, task.discoveredClass.instance);
34960
+ }
34927
34961
  }
34928
34962
  }
34929
34963
  async discoverTasks() {
@@ -34933,9 +34967,47 @@ let TasksInitializer = TasksInitializer_1 = class TasksInitializer {
34933
34967
  TasksInitializer = TasksInitializer_1 = __decorate([
34934
34968
  WpAppInitializer(),
34935
34969
  __metadata("design:paramtypes", [exports.CustomDiscoveryService,
34936
- TaskScheduler])
34970
+ TaskScheduler,
34971
+ TasksRegistry])
34937
34972
  ], TasksInitializer);
34938
34973
 
34974
+ const TasksModuleProviders = [TaskScheduler, TaskShell, TasksRegistry];
34975
+
34976
+ var TasksService_1;
34977
+ exports.TasksService = TasksService_1 = class TasksService {
34978
+ constructor(jobShell, registry) {
34979
+ this.jobShell = jobShell;
34980
+ this.registry = registry;
34981
+ this.logger = new common.Logger(TasksService_1.name);
34982
+ }
34983
+ async triggerTask(name) {
34984
+ this.logger.log(`Manual task ${name} -> trigger`);
34985
+ const task = this.registry.getTask(name);
34986
+ this.jobShell
34987
+ .executeTask(task.instance, task.props, exports.TaskRunType.OnDemand)
34988
+ .then(() => {
34989
+ this.logger.log(`Manual task ${name} -> completed`);
34990
+ })
34991
+ .catch((e) => {
34992
+ this.logger.error(`Manual task ${name} -> error: ${e.message}`);
34993
+ });
34994
+ this.logger.log(`Manual task ${name} -> triggered`);
34995
+ }
34996
+ async invokeTask(name) {
34997
+ this.logger.log(`Manual task ${name} -> invoke`);
34998
+ const task = this.registry.getTask(name);
34999
+ await this.jobShell.executeTask(task.instance, task.props, exports.TaskRunType.OnDemand);
35000
+ this.logger.log(`Manual task ${name} -> completed`);
35001
+ }
35002
+ };
35003
+ exports.TasksService = TasksService_1 = __decorate([
35004
+ common.Injectable(),
35005
+ __metadata("design:paramtypes", [TaskShell,
35006
+ TasksRegistry])
35007
+ ], exports.TasksService);
35008
+
35009
+ const TaskModuleServices = [exports.TasksService];
35010
+
34939
35011
  exports.TasksModule = class TasksModule {
34940
35012
  constructor(scheduler) {
34941
35013
  this.scheduler = scheduler;
@@ -34947,7 +35019,8 @@ exports.TasksModule = class TasksModule {
34947
35019
  exports.TasksModule = __decorate([
34948
35020
  common.Module({
34949
35021
  imports: [exports.EntityManagerModule],
34950
- providers: [TasksInitializer, TaskScheduler, TaskShell],
35022
+ providers: [TasksInitializer, ...TasksModuleProviders, ...TaskModuleServices],
35023
+ exports: [...TaskModuleServices],
34951
35024
  }),
34952
35025
  __metadata("design:paramtypes", [TaskScheduler])
34953
35026
  ], exports.TasksModule);