@neohm/nestend 3.0.6 → 3.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.
Files changed (107) hide show
  1. package/README.md +160 -36
  2. package/dist/admin/controllers/admin.scheduled.task.controller.d.ts +1 -1
  3. package/dist/admin/controllers/admin.scheduled.task.controller.d.ts.map +1 -1
  4. package/dist/admin/controllers/admin.scheduled.task.controller.js +4 -4
  5. package/dist/admin/controllers/admin.scheduled.task.controller.js.map +1 -1
  6. package/dist/admin/controllers/admin.tenant.controller.d.ts.map +1 -1
  7. package/dist/admin/controllers/admin.tenant.controller.js +2 -2
  8. package/dist/admin/controllers/admin.tenant.controller.js.map +1 -1
  9. package/dist/admin/dtos/add.admin.user.dto.d.ts +2 -1
  10. package/dist/admin/dtos/add.admin.user.dto.d.ts.map +1 -1
  11. package/dist/admin/dtos/add.admin.user.dto.js +2 -1
  12. package/dist/admin/dtos/add.admin.user.dto.js.map +1 -1
  13. package/dist/admin/dtos/add.scheduled.task.dto.d.ts +14 -3
  14. package/dist/admin/dtos/add.scheduled.task.dto.d.ts.map +1 -1
  15. package/dist/admin/dtos/add.scheduled.task.dto.js +109 -14
  16. package/dist/admin/dtos/add.scheduled.task.dto.js.map +1 -1
  17. package/dist/admin/dtos/add.tenant.dto.d.ts +2 -1
  18. package/dist/admin/dtos/add.tenant.dto.d.ts.map +1 -1
  19. package/dist/admin/dtos/add.tenant.dto.js +4 -1
  20. package/dist/admin/dtos/add.tenant.dto.js.map +1 -1
  21. package/dist/admin/dtos/base.user.dto.d.ts +2 -1
  22. package/dist/admin/dtos/base.user.dto.d.ts.map +1 -1
  23. package/dist/admin/dtos/base.user.dto.js +2 -1
  24. package/dist/admin/dtos/base.user.dto.js.map +1 -1
  25. package/dist/admin/es6.classes.d.ts +2 -2
  26. package/dist/admin/es6.classes.d.ts.map +1 -1
  27. package/dist/admin/es6.classes.js +1 -1
  28. package/dist/admin/es6.classes.js.map +1 -1
  29. package/dist/admin/libraries/scheduled.task.data.processor.d.ts +6 -1
  30. package/dist/admin/libraries/scheduled.task.data.processor.d.ts.map +1 -1
  31. package/dist/admin/libraries/scheduled.task.data.processor.js +98 -20
  32. package/dist/admin/libraries/scheduled.task.data.processor.js.map +1 -1
  33. package/dist/admin/libraries/scheduled.task.list.processor.d.ts.map +1 -1
  34. package/dist/admin/libraries/scheduled.task.list.processor.js +3 -0
  35. package/dist/admin/libraries/scheduled.task.list.processor.js.map +1 -1
  36. package/dist/admin/libraries/tenant.data.processor.d.ts +1 -1
  37. package/dist/admin/libraries/tenant.data.processor.d.ts.map +1 -1
  38. package/dist/admin/libraries/tenant.data.processor.js +36 -24
  39. package/dist/admin/libraries/tenant.data.processor.js.map +1 -1
  40. package/dist/admin/libraries/tenant.list.processor.d.ts.map +1 -1
  41. package/dist/admin/libraries/tenant.list.processor.js +1 -0
  42. package/dist/admin/libraries/tenant.list.processor.js.map +1 -1
  43. package/dist/common/entities/scheduled.event.entity.d.ts +3 -0
  44. package/dist/common/entities/scheduled.event.entity.d.ts.map +1 -1
  45. package/dist/common/entities/scheduled.event.entity.js +9 -0
  46. package/dist/common/entities/scheduled.event.entity.js.map +1 -1
  47. package/dist/common/entities/system.scheduled.task.entity.d.ts +9 -2
  48. package/dist/common/entities/system.scheduled.task.entity.d.ts.map +1 -1
  49. package/dist/common/entities/system.scheduled.task.entity.js +26 -1
  50. package/dist/common/entities/system.scheduled.task.entity.js.map +1 -1
  51. package/dist/common/enums/schedule.enum.d.ts +32 -0
  52. package/dist/common/enums/schedule.enum.d.ts.map +1 -0
  53. package/dist/common/enums/schedule.enum.js +40 -0
  54. package/dist/common/enums/schedule.enum.js.map +1 -0
  55. package/dist/common/es6.classes.d.ts +5 -2
  56. package/dist/common/es6.classes.d.ts.map +1 -1
  57. package/dist/common/es6.classes.js +10 -1
  58. package/dist/common/es6.classes.js.map +1 -1
  59. package/dist/common/jobs/dispatch.scheduled.event.job.d.ts +3 -0
  60. package/dist/common/jobs/dispatch.scheduled.event.job.d.ts.map +1 -1
  61. package/dist/common/jobs/dispatch.scheduled.event.job.js +40 -11
  62. package/dist/common/jobs/dispatch.scheduled.event.job.js.map +1 -1
  63. package/dist/common/jobs/set.scheduled.event.job.d.ts +7 -1
  64. package/dist/common/jobs/set.scheduled.event.job.d.ts.map +1 -1
  65. package/dist/common/jobs/set.scheduled.event.job.js +117 -15
  66. package/dist/common/jobs/set.scheduled.event.job.js.map +1 -1
  67. package/dist/common/libraries/cron.schedule.resolver.d.ts +8 -0
  68. package/dist/common/libraries/cron.schedule.resolver.d.ts.map +1 -0
  69. package/dist/common/libraries/cron.schedule.resolver.js +36 -0
  70. package/dist/common/libraries/cron.schedule.resolver.js.map +1 -0
  71. package/dist/common/libraries/interval.schedule.resolver.d.ts +7 -0
  72. package/dist/common/libraries/interval.schedule.resolver.d.ts.map +1 -0
  73. package/dist/common/libraries/interval.schedule.resolver.js +20 -0
  74. package/dist/common/libraries/interval.schedule.resolver.js.map +1 -0
  75. package/dist/common/libraries/once.schedule.resolver.d.ts +7 -0
  76. package/dist/common/libraries/once.schedule.resolver.d.ts.map +1 -0
  77. package/dist/common/libraries/once.schedule.resolver.js +14 -0
  78. package/dist/common/libraries/once.schedule.resolver.js.map +1 -0
  79. package/dist/common/types/queue.types.d.ts +0 -5
  80. package/dist/common/types/queue.types.d.ts.map +1 -1
  81. package/dist/common/types/schedule.types.d.ts +30 -0
  82. package/dist/common/types/schedule.types.d.ts.map +1 -0
  83. package/dist/common/types/schedule.types.js +3 -0
  84. package/dist/common/types/schedule.types.js.map +1 -0
  85. package/dist/common/validators/schedule.validator.d.ts +4 -0
  86. package/dist/common/validators/schedule.validator.d.ts.map +1 -0
  87. package/dist/common/validators/schedule.validator.js +51 -0
  88. package/dist/common/validators/schedule.validator.js.map +1 -0
  89. package/dist/constants/schedule.maps.d.ts +6 -0
  90. package/dist/constants/schedule.maps.d.ts.map +1 -0
  91. package/dist/constants/schedule.maps.js +30 -0
  92. package/dist/constants/schedule.maps.js.map +1 -0
  93. package/dist/global/utilities/schedule.utility.d.ts +8 -2
  94. package/dist/global/utilities/schedule.utility.d.ts.map +1 -1
  95. package/dist/global/utilities/schedule.utility.js +33 -2
  96. package/dist/global/utilities/schedule.utility.js.map +1 -1
  97. package/dist/index.d.ts +9 -2
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +24 -5
  100. package/dist/index.js.map +1 -1
  101. package/dist/migrations/1749600000018.CreateSysScheduledTasksTable.d.ts.map +1 -1
  102. package/dist/migrations/1749600000018.CreateSysScheduledTasksTable.js +24 -2
  103. package/dist/migrations/1749600000018.CreateSysScheduledTasksTable.js.map +1 -1
  104. package/dist/migrations/1749600000019.CreateSysScheduledEventsTable.d.ts.map +1 -1
  105. package/dist/migrations/1749600000019.CreateSysScheduledEventsTable.js +8 -1
  106. package/dist/migrations/1749600000019.CreateSysScheduledEventsTable.js.map +1 -1
  107. package/package.json +2 -1
@@ -0,0 +1,32 @@
1
+ export declare enum ScheduleKind {
2
+ INTERVAL = "interval",
3
+ CRON = "cron",
4
+ ONCE = "once"
5
+ }
6
+ export declare enum CatchUpPolicy {
7
+ SKIP_MISSED = "skip_missed",
8
+ FIRE_ONCE = "fire_once",
9
+ FIRE_ALL = "fire_all"
10
+ }
11
+ export declare enum OverlapPolicy {
12
+ ALLOW = "allow",
13
+ SKIP_WHEN_DUE_PENDING = "skip_when_due_pending"
14
+ }
15
+ export declare enum ScheduledEventStatus {
16
+ PENDING = "pending",
17
+ CLAIMED = "claimed",
18
+ ENQUEUED = "enqueued",
19
+ FAILED = "failed",
20
+ ABANDONED = "abandoned"
21
+ }
22
+ export declare enum ScheduleDefault {
23
+ TIMEZONE = "UTC",
24
+ MAX_CATCHUP = 50,
25
+ HORIZON_FACTOR = 2,
26
+ MIN_HORIZON_MS = 60000,
27
+ MAX_SCAN = 10000,
28
+ DISPATCH_BATCH = 500,
29
+ RETRY_BACKOFF_SEC = 60,
30
+ MAX_BACKOFF_SEC = 3600
31
+ }
32
+ //# sourceMappingURL=schedule.enum.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.enum.d.ts","sourceRoot":"","sources":["../../../src/common/enums/schedule.enum.ts"],"names":[],"mappings":"AACA,oBAAY,YAAY;IAEtB,QAAQ,aAAa;IAErB,IAAI,SAAS;IAEb,IAAI,SAAS;CACd;AAGD,oBAAY,aAAa;IAEvB,WAAW,gBAAgB;IAE3B,SAAS,cAAc;IAEvB,QAAQ,aAAa;CACtB;AAGD,oBAAY,aAAa;IACvB,KAAK,UAAU;IAMf,qBAAqB,0BAA0B;CAChD;AAGD,oBAAY,oBAAoB;IAE9B,OAAO,YAAY;IAEnB,OAAO,YAAY;IAEnB,QAAQ,aAAa;IAErB,MAAM,WAAW;IAEjB,SAAS,cAAc;CACxB;AAED,oBAAY,eAAe;IAEzB,QAAQ,QAAQ;IAEhB,WAAW,KAAK;IAEhB,cAAc,IAAI;IAElB,cAAc,QAAQ;IAEtB,QAAQ,QAAQ;IAEhB,cAAc,MAAM;IAEpB,iBAAiB,KAAK;IAEtB,eAAe,OAAO;CACvB"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScheduleDefault = exports.ScheduledEventStatus = exports.OverlapPolicy = exports.CatchUpPolicy = exports.ScheduleKind = void 0;
4
+ var ScheduleKind;
5
+ (function (ScheduleKind) {
6
+ ScheduleKind["INTERVAL"] = "interval";
7
+ ScheduleKind["CRON"] = "cron";
8
+ ScheduleKind["ONCE"] = "once";
9
+ })(ScheduleKind || (exports.ScheduleKind = ScheduleKind = {}));
10
+ var CatchUpPolicy;
11
+ (function (CatchUpPolicy) {
12
+ CatchUpPolicy["SKIP_MISSED"] = "skip_missed";
13
+ CatchUpPolicy["FIRE_ONCE"] = "fire_once";
14
+ CatchUpPolicy["FIRE_ALL"] = "fire_all";
15
+ })(CatchUpPolicy || (exports.CatchUpPolicy = CatchUpPolicy = {}));
16
+ var OverlapPolicy;
17
+ (function (OverlapPolicy) {
18
+ OverlapPolicy["ALLOW"] = "allow";
19
+ OverlapPolicy["SKIP_WHEN_DUE_PENDING"] = "skip_when_due_pending";
20
+ })(OverlapPolicy || (exports.OverlapPolicy = OverlapPolicy = {}));
21
+ var ScheduledEventStatus;
22
+ (function (ScheduledEventStatus) {
23
+ ScheduledEventStatus["PENDING"] = "pending";
24
+ ScheduledEventStatus["CLAIMED"] = "claimed";
25
+ ScheduledEventStatus["ENQUEUED"] = "enqueued";
26
+ ScheduledEventStatus["FAILED"] = "failed";
27
+ ScheduledEventStatus["ABANDONED"] = "abandoned";
28
+ })(ScheduledEventStatus || (exports.ScheduledEventStatus = ScheduledEventStatus = {}));
29
+ var ScheduleDefault;
30
+ (function (ScheduleDefault) {
31
+ ScheduleDefault["TIMEZONE"] = "UTC";
32
+ ScheduleDefault[ScheduleDefault["MAX_CATCHUP"] = 50] = "MAX_CATCHUP";
33
+ ScheduleDefault[ScheduleDefault["HORIZON_FACTOR"] = 2] = "HORIZON_FACTOR";
34
+ ScheduleDefault[ScheduleDefault["MIN_HORIZON_MS"] = 60000] = "MIN_HORIZON_MS";
35
+ ScheduleDefault[ScheduleDefault["MAX_SCAN"] = 10000] = "MAX_SCAN";
36
+ ScheduleDefault[ScheduleDefault["DISPATCH_BATCH"] = 500] = "DISPATCH_BATCH";
37
+ ScheduleDefault[ScheduleDefault["RETRY_BACKOFF_SEC"] = 60] = "RETRY_BACKOFF_SEC";
38
+ ScheduleDefault[ScheduleDefault["MAX_BACKOFF_SEC"] = 3600] = "MAX_BACKOFF_SEC";
39
+ })(ScheduleDefault || (exports.ScheduleDefault = ScheduleDefault = {}));
40
+ //# sourceMappingURL=schedule.enum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.enum.js","sourceRoot":"","sources":["../../../src/common/enums/schedule.enum.ts"],"names":[],"mappings":";;;AACA,IAAY,YAOX;AAPD,WAAY,YAAY;IAEtB,qCAAqB,CAAA;IAErB,6BAAa,CAAA;IAEb,6BAAa,CAAA;AACf,CAAC,EAPW,YAAY,4BAAZ,YAAY,QAOvB;AAGD,IAAY,aAOX;AAPD,WAAY,aAAa;IAEvB,4CAA2B,CAAA;IAE3B,wCAAuB,CAAA;IAEvB,sCAAqB,CAAA;AACvB,CAAC,EAPW,aAAa,6BAAb,aAAa,QAOxB;AAGD,IAAY,aAQX;AARD,WAAY,aAAa;IACvB,gCAAe,CAAA;IAMf,gEAA+C,CAAA;AACjD,CAAC,EARW,aAAa,6BAAb,aAAa,QAQxB;AAGD,IAAY,oBAWX;AAXD,WAAY,oBAAoB;IAE9B,2CAAmB,CAAA;IAEnB,2CAAmB,CAAA;IAEnB,6CAAqB,CAAA;IAErB,yCAAiB,CAAA;IAEjB,+CAAuB,CAAA;AACzB,CAAC,EAXW,oBAAoB,oCAApB,oBAAoB,QAW/B;AAED,IAAY,eAiBX;AAjBD,WAAY,eAAe;IAEzB,mCAAgB,CAAA;IAEhB,oEAAgB,CAAA;IAEhB,yEAAkB,CAAA;IAElB,6EAAsB,CAAA;IAEtB,iEAAgB,CAAA;IAEhB,2EAAoB,CAAA;IAEpB,gFAAsB,CAAA;IAEtB,8EAAsB,CAAA;AACxB,CAAC,EAjBW,eAAe,+BAAf,eAAe,QAiB1B"}
@@ -9,6 +9,9 @@ import { SqlService } from './services/sql.service';
9
9
  import { SystemPropertyService } from './services/system.property.service';
10
10
  import { CommonDataProcessor } from './libraries/common.data.processor';
11
11
  import { CommonListProcessor } from './libraries/common.list.processor';
12
+ import { CronScheduleResolver } from './libraries/cron.schedule.resolver';
13
+ import { IntervalScheduleResolver } from './libraries/interval.schedule.resolver';
14
+ import { OnceScheduleResolver } from './libraries/once.schedule.resolver';
12
15
  import { CommonListFilterDto } from './dtos/common.list.filter.dto';
13
16
  import { CommonPayloadDto } from './dtos/common.payload.dto';
14
17
  import { DatabaseEventDto } from './dtos/database.event.dto';
@@ -21,8 +24,8 @@ import { SystemScheduledTaskSubscriber } from './subscribers/system.scheduled.ta
21
24
  export declare const es6Classes: {
22
25
  controllers: any[];
23
26
  services: readonly [typeof AuditService, typeof CacheService, typeof EncryptionService, typeof FeatureFlagService, typeof MonitoringService, typeof QueueService, typeof RemoteRequestService, typeof SqlService, typeof SystemPropertyService];
24
- libraries: (typeof CommonDataProcessor | typeof CommonListProcessor)[];
25
- dtos: (typeof FilterDto | typeof SortDto | typeof CommonListFilterDto | typeof CommonPayloadDto | typeof DatabaseEventDto)[];
27
+ libraries: (typeof CommonDataProcessor | typeof CronScheduleResolver | typeof IntervalScheduleResolver | typeof OnceScheduleResolver | typeof CommonListProcessor)[];
28
+ dtos: (typeof CommonPayloadDto | typeof FilterDto | typeof SortDto | typeof CommonListFilterDto | typeof DatabaseEventDto)[];
26
29
  jobs: (typeof DispatchScheduledEventJob | typeof SetScheduledEventJob | typeof SystemScheduledTaskJob)[];
27
30
  subscribers: (typeof SystemScheduledTaskSubscriber)[];
28
31
  };
@@ -1 +1 @@
1
- {"version":3,"file":"es6.classes.d.ts","sourceRoot":"","sources":["../../src/common/es6.classes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,6BAA6B,EAAE,MAAM,gDAAgD,CAAC;AAE/F,eAAO,MAAM,UAAU;;;;;;;CA4BtB,CAAC"}
1
+ {"version":3,"file":"es6.classes.d.ts","sourceRoot":"","sources":["../../src/common/es6.classes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,6BAA6B,EAAE,MAAM,gDAAgD,CAAC;AAE/F,eAAO,MAAM,UAAU;;;;;;;CAkCtB,CAAC"}
@@ -12,6 +12,9 @@ const sql_service_1 = require("./services/sql.service");
12
12
  const system_property_service_1 = require("./services/system.property.service");
13
13
  const common_data_processor_1 = require("./libraries/common.data.processor");
14
14
  const common_list_processor_1 = require("./libraries/common.list.processor");
15
+ const cron_schedule_resolver_1 = require("./libraries/cron.schedule.resolver");
16
+ const interval_schedule_resolver_1 = require("./libraries/interval.schedule.resolver");
17
+ const once_schedule_resolver_1 = require("./libraries/once.schedule.resolver");
15
18
  const common_list_filter_dto_1 = require("./dtos/common.list.filter.dto");
16
19
  const common_params_dto_1 = require("./dtos/common.params.dto");
17
20
  const common_payload_dto_1 = require("./dtos/common.payload.dto");
@@ -35,7 +38,13 @@ exports.es6Classes = {
35
38
  sql_service_1.SqlService,
36
39
  system_property_service_1.SystemPropertyService,
37
40
  ],
38
- libraries: [common_data_processor_1.CommonDataProcessor, common_list_processor_1.CommonListProcessor],
41
+ libraries: [
42
+ common_data_processor_1.CommonDataProcessor,
43
+ common_list_processor_1.CommonListProcessor,
44
+ interval_schedule_resolver_1.IntervalScheduleResolver,
45
+ cron_schedule_resolver_1.CronScheduleResolver,
46
+ once_schedule_resolver_1.OnceScheduleResolver,
47
+ ],
39
48
  dtos: [
40
49
  common_list_filter_dto_1.CommonListFilterDto,
41
50
  common_params_dto_1.CommonParamsDto,
@@ -1 +1 @@
1
- {"version":3,"file":"es6.classes.js","sourceRoot":"","sources":["../../src/common/es6.classes.ts"],"names":[],"mappings":";;;AAAA,4DAAwD;AACxD,4DAAwD;AACxD,sEAAkE;AAClE,0EAAqE;AACrE,sEAAkE;AAClE,4DAAwD;AACxD,8EAAyE;AACzE,wDAAoD;AACpD,gFAA2E;AAC3E,6EAAwE;AACxE,6EAAwE;AACxE,0EAAoE;AACpE,gEAA2D;AAC3D,kEAA6D;AAC7D,kEAA6D;AAC7D,kDAA8C;AAC9C,8CAA0C;AAC1C,sFAAgF;AAChF,4EAAsE;AACtE,gFAA0E;AAC1E,qGAA+F;AAElF,QAAA,UAAU,GAAG;IACxB,WAAW,EAAE,EAAE;IACf,QAAQ,EAAE;QACR,4BAAY;QACZ,4BAAY;QACZ,sCAAiB;QACjB,yCAAkB;QAClB,sCAAiB;QACjB,4BAAY;QACZ,6CAAoB;QACpB,wBAAU;QACV,+CAAqB;KACb;IACV,SAAS,EAAE,CAAC,2CAAmB,EAAE,2CAAmB,CAAC;IACrD,IAAI,EAAE;QACJ,4CAAmB;QACnB,mCAAe;QACf,qCAAgB;QAChB,qCAAgB;QAChB,sBAAS;QACT,kBAAO;KACR;IACD,IAAI,EAAE;QACJ,wDAAyB;QACzB,8CAAoB;QACpB,kDAAsB;KACvB;IACD,WAAW,EAAE,CAAC,gEAA6B,CAAC;CAC7C,CAAC"}
1
+ {"version":3,"file":"es6.classes.js","sourceRoot":"","sources":["../../src/common/es6.classes.ts"],"names":[],"mappings":";;;AAAA,4DAAwD;AACxD,4DAAwD;AACxD,sEAAkE;AAClE,0EAAqE;AACrE,sEAAkE;AAClE,4DAAwD;AACxD,8EAAyE;AACzE,wDAAoD;AACpD,gFAA2E;AAC3E,6EAAwE;AACxE,6EAAwE;AACxE,+EAA0E;AAC1E,uFAAkF;AAClF,+EAA0E;AAC1E,0EAAoE;AACpE,gEAA2D;AAC3D,kEAA6D;AAC7D,kEAA6D;AAC7D,kDAA8C;AAC9C,8CAA0C;AAC1C,sFAAgF;AAChF,4EAAsE;AACtE,gFAA0E;AAC1E,qGAA+F;AAElF,QAAA,UAAU,GAAG;IACxB,WAAW,EAAE,EAAE;IACf,QAAQ,EAAE;QACR,4BAAY;QACZ,4BAAY;QACZ,sCAAiB;QACjB,yCAAkB;QAClB,sCAAiB;QACjB,4BAAY;QACZ,6CAAoB;QACpB,wBAAU;QACV,+CAAqB;KACb;IACV,SAAS,EAAE;QACT,2CAAmB;QACnB,2CAAmB;QACnB,qDAAwB;QACxB,6CAAoB;QACpB,6CAAoB;KACrB;IACD,IAAI,EAAE;QACJ,4CAAmB;QACnB,mCAAe;QACf,qCAAgB;QAChB,qCAAgB;QAChB,sBAAS;QACT,kBAAO;KACR;IACD,IAAI,EAAE;QACJ,wDAAyB;QACzB,8CAAoB;QACpB,kDAAsB;KACvB;IACD,WAAW,EAAE,CAAC,gEAA6B,CAAC;CAC7C,CAAC"}
@@ -6,8 +6,11 @@ export declare class DispatchScheduledEventJob extends CommonJob {
6
6
  handle(): Promise<void>;
7
7
  private fetchDueEvents;
8
8
  private processScheduledEvent;
9
+ private jobPayload;
9
10
  private claimEvent;
11
+ private completeEvent;
10
12
  private releaseEvent;
13
+ private abandonEvent;
11
14
  private dispatchEvents;
12
15
  }
13
16
  //# sourceMappingURL=dispatch.scheduled.event.job.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch.scheduled.event.job.d.ts","sourceRoot":"","sources":["../../../src/common/jobs/dispatch.scheduled.event.job.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAMzD,qBACa,yBAA0B,SAAQ,SAAS;IAC1C,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,YAAY;gBAA1B,YAAY,EAAE,YAAY;IAInD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;YAIf,cAAc;YAqBd,qBAAqB;YA6BrB,UAAU;YAkBV,YAAY;YAgBZ,cAAc;CAO7B"}
1
+ {"version":3,"file":"dispatch.scheduled.event.job.d.ts","sourceRoot":"","sources":["../../../src/common/jobs/dispatch.scheduled.event.job.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAYzD,qBACa,yBAA0B,SAAQ,SAAS;IAC1C,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,YAAY;gBAA1B,YAAY,EAAE,YAAY;IAInD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;YAUf,cAAc;YAcd,qBAAqB;IAkCnC,OAAO,CAAC,UAAU;YAqBJ,UAAU;YAeV,aAAa;YAgBb,YAAY;YAoBZ,YAAY;YAaZ,cAAc;CAO7B"}
@@ -11,12 +11,17 @@ var __metadata = (this && this.__metadata) || function (k, v) {
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.DispatchScheduledEventJob = void 0;
13
13
  const common_1 = require("@nestjs/common");
14
+ const typeorm_1 = require("typeorm");
14
15
  const common_job_1 = require("./common.job");
15
16
  const queue_service_1 = require("../services/queue.service");
16
17
  const job_constants_1 = require("../../constants/job.constants");
18
+ const schedule_utility_1 = require("../../global/utilities/schedule.utility");
19
+ const schedule_enum_1 = require("../enums/schedule.enum");
17
20
  const scheduled_event_entity_1 = require("../entities/scheduled.event.entity");
18
- const typeorm_1 = require("typeorm");
19
- const queue_enum_1 = require("../enums/queue.enum");
21
+ const DISPATCHABLE = [
22
+ schedule_enum_1.ScheduledEventStatus.PENDING,
23
+ schedule_enum_1.ScheduledEventStatus.FAILED,
24
+ ];
20
25
  let DispatchScheduledEventJob = class DispatchScheduledEventJob extends common_job_1.CommonJob {
21
26
  constructor(queueService) {
22
27
  super(job_constants_1.baseJobConstants.dispatchScheduledEventJob);
@@ -25,45 +30,69 @@ let DispatchScheduledEventJob = class DispatchScheduledEventJob extends common_j
25
30
  async handle() {
26
31
  await this.dispatchEvents();
27
32
  }
28
- async fetchDueEvents() {
29
- const maxRetries = parseInt(process.env.MAX_JOB_RETRIES, 10) || queue_enum_1.QueueDefault.MAX_JOB_RETRIES;
33
+ async fetchDueEvents(now) {
30
34
  return scheduled_event_entity_1.ScheduledEventEntity.find({
31
35
  where: {
32
- scheduled_at: (0, typeorm_1.LessThan)(new Date()),
36
+ scheduled_at: (0, typeorm_1.LessThanOrEqual)(now),
37
+ next_attempt_at: (0, typeorm_1.LessThanOrEqual)(now),
33
38
  active: true,
34
- started_at: (0, typeorm_1.IsNull)(),
35
- total_attempts: (0, typeorm_1.LessThan)(maxRetries),
39
+ status: (0, typeorm_1.In)(DISPATCHABLE),
36
40
  },
41
+ order: { scheduled_at: 'ASC' },
42
+ take: schedule_utility_1.ScheduleUtility.dispatchBatchSize(),
37
43
  relations: { job: true },
38
44
  });
39
45
  }
40
46
  async processScheduledEvent(scheduledEvent) {
47
+ if (scheduledEvent.total_attempts >= schedule_utility_1.ScheduleUtility.maxRetries()) {
48
+ await this.abandonEvent(scheduledEvent);
49
+ return;
50
+ }
41
51
  if (!(await this.claimEvent(scheduledEvent)))
42
52
  return;
43
53
  try {
44
- await this.queueService.addJob(scheduledEvent.job.identifier);
54
+ await this.queueService.addJob(scheduledEvent.job.identifier, this.jobPayload(scheduledEvent));
55
+ await this.completeEvent(scheduledEvent);
45
56
  }
46
57
  catch (error) {
47
58
  await this.releaseEvent(scheduledEvent, error instanceof Error ? error.message : String(error));
48
59
  }
49
60
  }
61
+ jobPayload(scheduledEvent) {
62
+ const payload = scheduledEvent.job.payload;
63
+ if (!payload || !Object.keys(payload).length)
64
+ return undefined;
65
+ return payload;
66
+ }
50
67
  async claimEvent(scheduledEvent) {
51
- const claim = await scheduled_event_entity_1.ScheduledEventEntity.update({ id: scheduledEvent.id, active: true, started_at: (0, typeorm_1.IsNull)() }, {
68
+ const claim = await scheduled_event_entity_1.ScheduledEventEntity.update({ id: scheduledEvent.id, active: true, status: (0, typeorm_1.In)(DISPATCHABLE) }, {
69
+ status: schedule_enum_1.ScheduledEventStatus.CLAIMED,
52
70
  started_at: new Date(),
53
71
  total_attempts: () => '"total_attempts" + 1',
54
72
  });
55
73
  return (claim.affected ?? 0) > 0;
56
74
  }
75
+ async completeEvent(scheduledEvent) {
76
+ await scheduled_event_entity_1.ScheduledEventEntity.update({ id: scheduledEvent.id }, { status: schedule_enum_1.ScheduledEventStatus.ENQUEUED });
77
+ }
57
78
  async releaseEvent(scheduledEvent, reason) {
58
79
  await scheduled_event_entity_1.ScheduledEventEntity.update({ id: scheduledEvent.id }, {
80
+ status: schedule_enum_1.ScheduledEventStatus.FAILED,
59
81
  started_at: () => 'NULL',
60
82
  failed_at: new Date(),
61
83
  error: reason,
84
+ next_attempt_at: schedule_utility_1.ScheduleUtility.nextAttemptAt(scheduledEvent.total_attempts + 1),
62
85
  });
63
86
  }
87
+ async abandonEvent(scheduledEvent) {
88
+ const abandoned = await scheduled_event_entity_1.ScheduledEventEntity.update({ id: scheduledEvent.id, status: (0, typeorm_1.In)(DISPATCHABLE) }, { status: schedule_enum_1.ScheduledEventStatus.ABANDONED });
89
+ if (!abandoned.affected)
90
+ return;
91
+ this.logger.error(`Scheduled event ${scheduledEvent.id} for "${scheduledEvent.job?.identifier}" abandoned after ${scheduledEvent.total_attempts} attempt(s): ${scheduledEvent.error}`);
92
+ }
64
93
  async dispatchEvents() {
65
- const scheduledEvents = await this.fetchDueEvents();
66
- for (const scheduledEvent of scheduledEvents) {
94
+ const now = new Date();
95
+ for (const scheduledEvent of await this.fetchDueEvents(now)) {
67
96
  await this.processScheduledEvent(scheduledEvent);
68
97
  }
69
98
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch.scheduled.event.job.js","sourceRoot":"","sources":["../../../src/common/jobs/dispatch.scheduled.event.job.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6CAAyC;AACzC,6DAAyD;AACzD,iEAAiE;AACjE,+EAA0E;AAC1E,qCAA2C;AAC3C,oDAAmD;AAG5C,IAAM,yBAAyB,GAA/B,MAAM,yBAA0B,SAAQ,sBAAS;IACtD,YAA+B,YAA0B;QACvD,KAAK,CAAC,gCAAgB,CAAC,yBAAyB,CAAC,CAAC;QADrB,iBAAY,GAAZ,YAAY,CAAc;IAEzD,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;IAC9B,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,MAAM,UAAU,GACd,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,IAAI,yBAAY,CAAC,eAAe,CAAC;QAE5E,OAAO,6CAAoB,CAAC,IAAI,CAAC;YAC/B,KAAK,EAAE;gBACL,YAAY,EAAE,IAAA,kBAAQ,EAAC,IAAI,IAAI,EAAE,CAAC;gBAClC,MAAM,EAAE,IAAI;gBAOZ,UAAU,EAAE,IAAA,gBAAM,GAAE;gBACpB,cAAc,EAAE,IAAA,kBAAQ,EAAC,UAAU,CAAC;aACrC;YACD,SAAS,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE;SACzB,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,qBAAqB,CACjC,cAAoC;QAKpC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YAAE,OAAO;QACrD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,YAAY,CACrB,cAAc,EACd,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACJ,CAAC;IACH,CAAC;IAcO,KAAK,CAAC,UAAU,CACtB,cAAoC;QAEpC,MAAM,KAAK,GAAG,MAAM,6CAAoB,CAAC,MAAM,CAC7C,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAA,gBAAM,GAAE,EAAE,EAC7D;YACE,UAAU,EAAE,IAAI,IAAI,EAAE;YACtB,cAAc,EAAE,GAAG,EAAE,CAAC,sBAAsB;SAC7C,CACF,CAAC;QACF,OAAO,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAOO,KAAK,CAAC,YAAY,CACxB,cAAoC,EACpC,MAAc;QAEd,MAAM,6CAAoB,CAAC,MAAM,CAC/B,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,EAAE,EACzB;YAGE,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM;YACxB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,KAAK,EAAE,MAAM;SACd,CACF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAEpD,KAAK,MAAM,cAAc,IAAI,eAAe,EAAE,CAAC;YAC7C,MAAM,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;CACF,CAAA;AApGY,8DAAyB;oCAAzB,yBAAyB;IADrC,IAAA,mBAAU,GAAE;qCAEkC,4BAAY;GAD9C,yBAAyB,CAoGrC"}
1
+ {"version":3,"file":"dispatch.scheduled.event.job.js","sourceRoot":"","sources":["../../../src/common/jobs/dispatch.scheduled.event.job.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,13 @@ export declare class SetScheduledEventJob extends CommonJob {
7
7
  constructor(queueService: QueueService, dispatchScheduledEventJob: DispatchScheduledEventJob);
8
8
  handle(): Promise<void>;
9
9
  private upsertScheduledEvents;
10
- private materialiseOccurrence;
10
+ private materialiseOccurrences;
11
+ private planSlots;
12
+ private missedSlotsToKeep;
13
+ private advance;
14
+ private withJitter;
15
+ private isSuppressedByBacklog;
16
+ private reportPlan;
11
17
  private getScheduledJobs;
12
18
  private dispatchScheduledEvents;
13
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"set.scheduled.event.job.d.ts","sourceRoot":"","sources":["../../../src/common/jobs/set.scheduled.event.job.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAMzC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAS3E,qBACa,oBAAqB,SAAQ,SAAS;IAE/C,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,YAAY;IAC7C,OAAO,CAAC,QAAQ,CAAC,yBAAyB;gBADvB,YAAY,EAAE,YAAY,EAC5B,yBAAyB,EAAE,yBAAyB;IAMjE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;YASf,qBAAqB;YA2BrB,qBAAqB;YAgCrB,gBAAgB;YAYhB,uBAAuB;CAKtC"}
1
+ {"version":3,"file":"set.scheduled.event.job.d.ts","sourceRoot":"","sources":["../../../src/common/jobs/set.scheduled.event.job.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAczC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAS3E,qBACa,oBAAqB,SAAQ,SAAS;IAE/C,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,YAAY;IAC7C,OAAO,CAAC,QAAQ,CAAC,yBAAyB;gBADvB,YAAY,EAAE,YAAY,EAC5B,yBAAyB,EAAE,yBAAyB;IAMjE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;YAgBf,qBAAqB;YAmCrB,sBAAsB;IA6DpC,OAAO,CAAC,SAAS;IAoDjB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,OAAO;IAef,OAAO,CAAC,UAAU;YAWJ,qBAAqB;IAuBnC,OAAO,CAAC,UAAU;YAWJ,gBAAgB;YAYhB,uBAAuB;CAKtC"}
@@ -11,12 +11,15 @@ var __metadata = (this && this.__metadata) || function (k, v) {
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.SetScheduledEventJob = void 0;
13
13
  const common_1 = require("@nestjs/common");
14
+ const typeorm_1 = require("typeorm");
14
15
  const queue_service_1 = require("../services/queue.service");
15
16
  const common_job_1 = require("./common.job");
16
17
  const job_constants_1 = require("../../constants/job.constants");
18
+ const schedule_maps_1 = require("../../constants/schedule.maps");
17
19
  const schedule_utility_1 = require("../../global/utilities/schedule.utility");
20
+ const operation_exception_1 = require("../../global/exceptions/operation.exception");
21
+ const schedule_enum_1 = require("../enums/schedule.enum");
18
22
  const system_scheduled_task_entity_1 = require("../entities/system.scheduled.task.entity");
19
- const typeorm_1 = require("typeorm");
20
23
  const scheduled_event_entity_1 = require("../entities/scheduled.event.entity");
21
24
  const dispatch_scheduled_event_job_1 = require("./dispatch.scheduled.event.job");
22
25
  let SetScheduledEventJob = class SetScheduledEventJob extends common_job_1.CommonJob {
@@ -33,32 +36,131 @@ let SetScheduledEventJob = class SetScheduledEventJob extends common_job_1.Commo
33
36
  }
34
37
  async upsertScheduledEvents() {
35
38
  const now = new Date();
36
- for (const scheduledJob of await this.getScheduledJobs(now)) {
37
- await this.materialiseOccurrence(scheduledJob, now);
39
+ const horizonEnd = new Date(now.getTime() + schedule_utility_1.ScheduleUtility.horizonMs());
40
+ for (const task of await this.getScheduledJobs(horizonEnd)) {
41
+ try {
42
+ await this.materialiseOccurrences(task, now, horizonEnd);
43
+ }
44
+ catch (error) {
45
+ this.logger.error(`Scheduled task "${task.identifier}" could not be materialised: ${error instanceof Error ? error.message : String(error)}`);
46
+ }
38
47
  }
39
48
  }
40
- async materialiseOccurrence(scheduledJob, dueBefore) {
41
- const scheduledAt = schedule_utility_1.ScheduleUtility.addInterval(scheduledJob.schedule_interval, dueBefore);
49
+ async materialiseOccurrences(task, now, horizonEnd) {
50
+ if (await this.isSuppressedByBacklog(task, now)) {
51
+ this.logger.debug(`Scheduled task "${task.identifier}" held: an earlier occurrence is still undispatched.`);
52
+ return;
53
+ }
54
+ const spec = schedule_utility_1.ScheduleUtility.normalise(task.schedule);
55
+ const plan = this.planSlots(task, spec, now, horizonEnd);
56
+ this.reportPlan(task, plan);
42
57
  await system_scheduled_task_entity_1.SystemScheduledTaskEntity.getRepository().manager.transaction(async (trx) => {
43
58
  const claim = await trx.update(system_scheduled_task_entity_1.SystemScheduledTaskEntity, {
44
- id: scheduledJob.id,
59
+ id: task.id,
45
60
  enabled: true,
46
- next_upsert_at: (0, typeorm_1.LessThan)(dueBefore),
47
- }, { next_upsert_at: scheduledAt });
61
+ next_upsert_at: (0, typeorm_1.LessThan)(horizonEnd),
62
+ }, { next_upsert_at: plan.cursor ?? (() => 'NULL') });
48
63
  if (!claim.affected)
49
64
  return;
50
- await trx.insert(scheduled_event_entity_1.ScheduledEventEntity, {
51
- job_id: scheduledJob.id,
52
- scheduled_at: scheduledAt,
65
+ if (!plan.slots.length)
66
+ return;
67
+ await trx.insert(scheduled_event_entity_1.ScheduledEventEntity, plan.slots.map((slot) => {
68
+ const scheduledAt = this.withJitter(slot, task.jitter_sec);
69
+ return {
70
+ job_id: task.id,
71
+ scheduled_at: scheduledAt,
72
+ next_attempt_at: scheduledAt,
73
+ status: schedule_enum_1.ScheduledEventStatus.PENDING,
74
+ active: true,
75
+ };
76
+ }));
77
+ });
78
+ }
79
+ planSlots(task, spec, now, horizonEnd) {
80
+ const timezone = task.timezone || schedule_enum_1.ScheduleDefault.TIMEZONE;
81
+ const limit = task.max_catchup > 0 ? task.max_catchup : schedule_enum_1.ScheduleDefault.MAX_CATCHUP;
82
+ const maxScan = schedule_enum_1.ScheduleDefault.MAX_SCAN;
83
+ const keep = this.missedSlotsToKeep(task.catch_up_policy, limit);
84
+ const missed = [];
85
+ let dropped = 0;
86
+ let truncated = false;
87
+ let scanned = 0;
88
+ let cursor = task.next_upsert_at;
89
+ while (cursor !== null && cursor.getTime() <= now.getTime()) {
90
+ if (keep > 0) {
91
+ missed.push(cursor);
92
+ if (missed.length > keep) {
93
+ missed.shift();
94
+ dropped++;
95
+ }
96
+ }
97
+ else {
98
+ dropped++;
99
+ }
100
+ if (++scanned >= maxScan) {
101
+ truncated = true;
102
+ cursor = this.advance(spec, now, timezone);
103
+ break;
104
+ }
105
+ cursor = this.advance(spec, cursor, timezone);
106
+ }
107
+ const slots = [...missed];
108
+ while (cursor !== null &&
109
+ cursor.getTime() <= horizonEnd.getTime() &&
110
+ slots.length < limit) {
111
+ slots.push(cursor);
112
+ cursor = this.advance(spec, cursor, timezone);
113
+ }
114
+ return { slots, cursor, dropped, truncated };
115
+ }
116
+ missedSlotsToKeep(policy, limit) {
117
+ if (policy === schedule_enum_1.CatchUpPolicy.FIRE_ALL)
118
+ return limit;
119
+ if (policy === schedule_enum_1.CatchUpPolicy.SKIP_MISSED)
120
+ return 0;
121
+ return 1;
122
+ }
123
+ advance(spec, from, timezone) {
124
+ const next = (0, schedule_maps_1.resolveScheduleSlot)(spec, from, timezone);
125
+ if (next === null)
126
+ return null;
127
+ if (next.getTime() <= from.getTime())
128
+ throw new operation_exception_1.OperationException(`Schedule resolver for kind "${spec.kind}" did not advance past ${from.toISOString()}.`);
129
+ return next;
130
+ }
131
+ withJitter(slot, jitterSec) {
132
+ if (!jitterSec || jitterSec <= 0)
133
+ return slot;
134
+ return new Date(slot.getTime() + Math.random() * jitterSec * 1000);
135
+ }
136
+ async isSuppressedByBacklog(task, now) {
137
+ if (task.overlap_policy !== schedule_enum_1.OverlapPolicy.SKIP_WHEN_DUE_PENDING)
138
+ return false;
139
+ const outstanding = await scheduled_event_entity_1.ScheduledEventEntity.count({
140
+ where: {
141
+ job_id: task.id,
53
142
  active: true,
54
- });
143
+ scheduled_at: (0, typeorm_1.LessThanOrEqual)(now),
144
+ status: (0, typeorm_1.In)([
145
+ schedule_enum_1.ScheduledEventStatus.PENDING,
146
+ schedule_enum_1.ScheduledEventStatus.CLAIMED,
147
+ schedule_enum_1.ScheduledEventStatus.FAILED,
148
+ ]),
149
+ },
55
150
  });
151
+ return outstanding > 0;
152
+ }
153
+ reportPlan(task, plan) {
154
+ if (plan.dropped)
155
+ this.logger.warn(`Scheduled task "${task.identifier}": ${plan.dropped} elapsed occurrence(s) discarded under the "${task.catch_up_policy}" catch-up policy.`);
156
+ if (plan.truncated)
157
+ this.logger.warn(`Scheduled task "${task.identifier}": elapsed-slot walk hit ${schedule_enum_1.ScheduleDefault.MAX_SCAN}; the cursor was fast-forwarded to now.`);
56
158
  }
57
- async getScheduledJobs(dueBefore) {
159
+ async getScheduledJobs(horizonEnd) {
58
160
  return system_scheduled_task_entity_1.SystemScheduledTaskEntity.find({
59
161
  where: {
60
- start_from: (0, typeorm_1.LessThan)(dueBefore),
61
- next_upsert_at: (0, typeorm_1.LessThan)(dueBefore),
162
+ start_from: (0, typeorm_1.LessThan)(horizonEnd),
163
+ next_upsert_at: (0, typeorm_1.LessThan)(horizonEnd),
62
164
  enabled: true,
63
165
  },
64
166
  });
@@ -1 +1 @@
1
- {"version":3,"file":"set.scheduled.event.job.js","sourceRoot":"","sources":["../../../src/common/jobs/set.scheduled.event.job.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6DAAyD;AACzD,6CAAyC;AACzC,iEAAiE;AACjE,8EAA0E;AAC1E,2FAAqF;AACrF,qCAAmC;AACnC,+EAA0E;AAC1E,iFAA2E;AAUpE,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,sBAAS;IACjD,YACqB,YAA0B,EAC5B,yBAAoD;QAErE,KAAK,CAAC,gCAAgB,CAAC,oBAAoB,CAAC,CAAC;QAH1B,iBAAY,GAAZ,YAAY,CAAc;QAC5B,8BAAyB,GAAzB,yBAAyB,CAA2B;IAGvE,CAAC;IAGD,KAAK,CAAC,MAAM;QAGV,IAAI,OAAO,CAAC,GAAG,CAAC,iCAAiC,KAAK,MAAM;YAAE,OAAO;QAErE,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACnC,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACvC,CAAC;IAEO,KAAK,CAAC,qBAAqB;QAGjC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QAEvB,KAAK,MAAM,YAAY,IAAI,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAmBO,KAAK,CAAC,qBAAqB,CACjC,YAAuC,EACvC,SAAe;QAEf,MAAM,WAAW,GAAG,kCAAe,CAAC,WAAW,CAC7C,YAAY,CAAC,iBAAiB,EAC9B,SAAS,CACV,CAAC;QAEF,MAAM,wDAAyB,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,WAAW,CACjE,KAAK,EAAE,GAAG,EAAE,EAAE;YACZ,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,MAAM,CAC5B,wDAAyB,EACzB;gBACE,EAAE,EAAE,YAAY,CAAC,EAAE;gBACnB,OAAO,EAAE,IAAI;gBACb,cAAc,EAAE,IAAA,kBAAQ,EAAC,SAAS,CAAC;aACpC,EACD,EAAE,cAAc,EAAE,WAAW,EAAE,CAChC,CAAC;YAEF,IAAI,CAAC,KAAK,CAAC,QAAQ;gBAAE,OAAO;YAE5B,MAAM,GAAG,CAAC,MAAM,CAAC,6CAAoB,EAAE;gBACrC,MAAM,EAAE,YAAY,CAAC,EAAE;gBACvB,YAAY,EAAE,WAAW;gBACzB,MAAM,EAAE,IAAI;aACb,CAAC,CAAC;QACL,CAAC,CACF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC5B,SAAe;QAEf,OAAO,wDAAyB,CAAC,IAAI,CAAC;YACpC,KAAK,EAAE;gBACL,UAAU,EAAE,IAAA,kBAAQ,EAAC,SAAS,CAAC;gBAC/B,cAAc,EAAE,IAAA,kBAAQ,EAAC,SAAS,CAAC;gBACnC,OAAO,EAAE,IAAI;aACd;SACF,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,uBAAuB;QACnC,MAAM,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,CAAC;QAEhD,OAAO;IACT,CAAC;CACF,CAAA;AA9FY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;qCAGwB,4BAAY;QACD,wDAAyB;GAH5D,oBAAoB,CA8FhC"}
1
+ {"version":3,"file":"set.scheduled.event.job.js","sourceRoot":"","sources":["../../../src/common/jobs/set.scheduled.event.job.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { ScheduleKind } from '../enums/schedule.enum';
2
+ import { ScheduleResolver, ScheduleSpec } from '../types/schedule.types';
3
+ export declare class CronScheduleResolver implements ScheduleResolver {
4
+ readonly kind = ScheduleKind.CRON;
5
+ next(spec: ScheduleSpec, after: Date, timezone: string): Date | null;
6
+ static isValid(expression: string, timezone?: string): boolean;
7
+ }
8
+ //# sourceMappingURL=cron.schedule.resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron.schedule.resolver.d.ts","sourceRoot":"","sources":["../../../src/common/libraries/cron.schedule.resolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,EAEL,gBAAgB,EAChB,YAAY,EACb,MAAM,yBAAyB,CAAC;AAGjC,qBAAa,oBAAqB,YAAW,gBAAgB;IAC3D,QAAQ,CAAC,IAAI,qBAAqB;IAElC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAmBpE,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;CAW/D"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CronScheduleResolver = void 0;
4
+ const cron_parser_1 = require("cron-parser");
5
+ const schedule_enum_1 = require("../enums/schedule.enum");
6
+ const operation_exception_1 = require("../../global/exceptions/operation.exception");
7
+ class CronScheduleResolver {
8
+ constructor() {
9
+ this.kind = schedule_enum_1.ScheduleKind.CRON;
10
+ }
11
+ next(spec, after, timezone) {
12
+ const { expression } = spec;
13
+ try {
14
+ return cron_parser_1.CronExpressionParser.parse(expression, {
15
+ currentDate: after,
16
+ tz: timezone,
17
+ })
18
+ .next()
19
+ .toDate();
20
+ }
21
+ catch (error) {
22
+ throw new operation_exception_1.OperationException(`Cron expression "${expression}" (${timezone}) could not be advanced: ${error instanceof Error ? error.message : String(error)}`);
23
+ }
24
+ }
25
+ static isValid(expression, timezone) {
26
+ try {
27
+ cron_parser_1.CronExpressionParser.parse(expression, timezone ? { tz: timezone } : undefined);
28
+ return true;
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ }
34
+ }
35
+ exports.CronScheduleResolver = CronScheduleResolver;
36
+ //# sourceMappingURL=cron.schedule.resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron.schedule.resolver.js","sourceRoot":"","sources":["../../../src/common/libraries/cron.schedule.resolver.ts"],"names":[],"mappings":";;;AAAA,6CAAmD;AACnD,0DAAsD;AACtD,qFAAiF;AAQjF,MAAa,oBAAoB;IAAjC;QACW,SAAI,GAAG,4BAAY,CAAC,IAAI,CAAC;IAgCpC,CAAC;IA9BC,IAAI,CAAC,IAAkB,EAAE,KAAW,EAAE,QAAgB;QACpD,MAAM,EAAE,UAAU,EAAE,GAAG,IAAoB,CAAC;QAC5C,IAAI,CAAC;YACH,OAAO,kCAAoB,CAAC,KAAK,CAAC,UAAU,EAAE;gBAC5C,WAAW,EAAE,KAAK;gBAClB,EAAE,EAAE,QAAQ;aACb,CAAC;iBACC,IAAI,EAAE;iBACN,MAAM,EAAE,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,wCAAkB,CAC1B,oBAAoB,UAAU,MAAM,QAAQ,4BAC1C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IAGD,MAAM,CAAC,OAAO,CAAC,UAAkB,EAAE,QAAiB;QAClD,IAAI,CAAC;YACH,kCAAoB,CAAC,KAAK,CACxB,UAAU,EACV,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CACxC,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF;AAjCD,oDAiCC"}
@@ -0,0 +1,7 @@
1
+ import { ScheduleKind } from '../enums/schedule.enum';
2
+ import { ScheduleResolver, ScheduleSpec } from '../types/schedule.types';
3
+ export declare class IntervalScheduleResolver implements ScheduleResolver {
4
+ readonly kind = ScheduleKind.INTERVAL;
5
+ next(spec: ScheduleSpec, after: Date): Date | null;
6
+ }
7
+ //# sourceMappingURL=interval.schedule.resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interval.schedule.resolver.d.ts","sourceRoot":"","sources":["../../../src/common/libraries/interval.schedule.resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAGtD,OAAO,EAEL,gBAAgB,EAChB,YAAY,EACb,MAAM,yBAAyB,CAAC;AAGjC,qBAAa,wBAAyB,YAAW,gBAAgB;IAC/D,QAAQ,CAAC,IAAI,yBAAyB;IAEtC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI;CAYnD"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IntervalScheduleResolver = void 0;
4
+ const schedule_enum_1 = require("../enums/schedule.enum");
5
+ const schedule_utility_1 = require("../../global/utilities/schedule.utility");
6
+ const operation_exception_1 = require("../../global/exceptions/operation.exception");
7
+ class IntervalScheduleResolver {
8
+ constructor() {
9
+ this.kind = schedule_enum_1.ScheduleKind.INTERVAL;
10
+ }
11
+ next(spec, after) {
12
+ const interval = spec;
13
+ const step = schedule_utility_1.ScheduleUtility.intervalToMs(interval);
14
+ if (step <= 0)
15
+ throw new operation_exception_1.OperationException('Interval schedule must sum to more than zero.');
16
+ return new Date(after.getTime() + step);
17
+ }
18
+ }
19
+ exports.IntervalScheduleResolver = IntervalScheduleResolver;
20
+ //# sourceMappingURL=interval.schedule.resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interval.schedule.resolver.js","sourceRoot":"","sources":["../../../src/common/libraries/interval.schedule.resolver.ts"],"names":[],"mappings":";;;AAAA,0DAAsD;AACtD,8EAA0E;AAC1E,qFAAiF;AAQjF,MAAa,wBAAwB;IAArC;QACW,SAAI,GAAG,4BAAY,CAAC,QAAQ,CAAC;IAcxC,CAAC;IAZC,IAAI,CAAC,IAAkB,EAAE,KAAW;QAClC,MAAM,QAAQ,GAAG,IAAwB,CAAC;QAC1C,MAAM,IAAI,GAAG,kCAAe,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAIpD,IAAI,IAAI,IAAI,CAAC;YACX,MAAM,IAAI,wCAAkB,CAC1B,+CAA+C,CAChD,CAAC;QACJ,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF;AAfD,4DAeC"}
@@ -0,0 +1,7 @@
1
+ import { ScheduleKind } from '../enums/schedule.enum';
2
+ import { ScheduleResolver } from '../types/schedule.types';
3
+ export declare class OnceScheduleResolver implements ScheduleResolver {
4
+ readonly kind = ScheduleKind.ONCE;
5
+ next(): Date | null;
6
+ }
7
+ //# sourceMappingURL=once.schedule.resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"once.schedule.resolver.d.ts","sourceRoot":"","sources":["../../../src/common/libraries/once.schedule.resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAO3D,qBAAa,oBAAqB,YAAW,gBAAgB;IAC3D,QAAQ,CAAC,IAAI,qBAAqB;IAElC,IAAI,IAAI,IAAI,GAAG,IAAI;CAGpB"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OnceScheduleResolver = void 0;
4
+ const schedule_enum_1 = require("../enums/schedule.enum");
5
+ class OnceScheduleResolver {
6
+ constructor() {
7
+ this.kind = schedule_enum_1.ScheduleKind.ONCE;
8
+ }
9
+ next() {
10
+ return null;
11
+ }
12
+ }
13
+ exports.OnceScheduleResolver = OnceScheduleResolver;
14
+ //# sourceMappingURL=once.schedule.resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"once.schedule.resolver.js","sourceRoot":"","sources":["../../../src/common/libraries/once.schedule.resolver.ts"],"names":[],"mappings":";;;AAAA,0DAAsD;AAQtD,MAAa,oBAAoB;IAAjC;QACW,SAAI,GAAG,4BAAY,CAAC,IAAI,CAAC;IAKpC,CAAC;IAHC,IAAI;QACF,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAND,oDAMC"}