@n8n/scheduler 0.2.3 → 0.3.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 (166) hide show
  1. package/README.md +60 -23
  2. package/dist/build.tsbuildinfo +1 -1
  3. package/dist/core/errors.d.ts +6 -0
  4. package/dist/core/errors.js +15 -1
  5. package/dist/core/errors.js.map +1 -1
  6. package/dist/core/executor/backoff.js.map +1 -0
  7. package/dist/core/executor/executor.d.ts +38 -0
  8. package/dist/core/executor/executor.js +137 -0
  9. package/dist/core/executor/executor.js.map +1 -0
  10. package/dist/core/executor/index.d.ts +8 -0
  11. package/dist/core/executor/index.js +16 -0
  12. package/dist/core/executor/index.js.map +1 -0
  13. package/dist/core/executor/options.d.ts +6 -0
  14. package/dist/core/executor/options.js +10 -0
  15. package/dist/core/executor/options.js.map +1 -0
  16. package/dist/{executor → core/executor}/precision-timer.d.ts +1 -0
  17. package/dist/{executor → core/executor}/precision-timer.js +3 -0
  18. package/dist/core/executor/precision-timer.js.map +1 -0
  19. package/dist/core/executor/store.d.ts +21 -0
  20. package/dist/core/executor/store.js +3 -0
  21. package/dist/core/executor/store.js.map +1 -0
  22. package/dist/{executor → core/executor}/task-handler.d.ts +1 -1
  23. package/dist/{executor → core/executor}/task-handler.js +2 -2
  24. package/dist/core/executor/task-handler.js.map +1 -0
  25. package/dist/core/executor/tracing.d.ts +11 -0
  26. package/dist/core/executor/tracing.js +7 -0
  27. package/dist/core/executor/tracing.js.map +1 -0
  28. package/dist/core/factory.d.ts +29 -0
  29. package/dist/core/factory.js +254 -0
  30. package/dist/core/factory.js.map +1 -0
  31. package/dist/core/index.d.ts +17 -9
  32. package/dist/core/index.js +15 -17
  33. package/dist/core/index.js.map +1 -1
  34. package/dist/core/lifecycle/alarm.d.ts +8 -0
  35. package/dist/core/lifecycle/alarm.js +32 -0
  36. package/dist/core/lifecycle/alarm.js.map +1 -0
  37. package/dist/core/lifecycle/index.d.ts +5 -0
  38. package/dist/core/lifecycle/index.js +11 -0
  39. package/dist/core/lifecycle/index.js.map +1 -0
  40. package/dist/core/lifecycle/lookahead.d.ts +1 -0
  41. package/dist/core/lifecycle/lookahead.js +7 -0
  42. package/dist/core/lifecycle/lookahead.js.map +1 -0
  43. package/dist/core/lifecycle/loop.d.ts +39 -0
  44. package/dist/core/lifecycle/loop.js +86 -0
  45. package/dist/core/lifecycle/loop.js.map +1 -0
  46. package/dist/core/lifecycle/options.d.ts +15 -0
  47. package/dist/core/lifecycle/options.js +18 -0
  48. package/dist/core/lifecycle/options.js.map +1 -0
  49. package/dist/core/lifecycle/timeline.d.ts +9 -0
  50. package/dist/core/lifecycle/timeline.js +22 -0
  51. package/dist/core/lifecycle/timeline.js.map +1 -0
  52. package/dist/core/materializer/index.d.ts +2 -2
  53. package/dist/core/materializer/index.js.map +1 -1
  54. package/dist/core/materializer/materialize.d.ts +10 -2
  55. package/dist/core/materializer/materialize.js +32 -6
  56. package/dist/core/materializer/materialize.js.map +1 -1
  57. package/dist/core/materializer/options.d.ts +1 -0
  58. package/dist/core/materializer/options.js +1 -0
  59. package/dist/core/materializer/options.js.map +1 -1
  60. package/dist/core/materializer/plan.d.ts +1 -0
  61. package/dist/core/materializer/plan.js +12 -6
  62. package/dist/core/materializer/plan.js.map +1 -1
  63. package/dist/core/materializer/transaction.d.ts +18 -1
  64. package/dist/core/provisioning/index.d.ts +5 -0
  65. package/dist/core/provisioning/index.js +9 -0
  66. package/dist/core/provisioning/index.js.map +1 -0
  67. package/dist/core/provisioning/provision.d.ts +6 -0
  68. package/dist/core/provisioning/provision.js +64 -0
  69. package/dist/core/provisioning/provision.js.map +1 -0
  70. package/dist/core/provisioning/provisioner.d.ts +15 -0
  71. package/dist/core/provisioning/provisioner.js +18 -0
  72. package/dist/core/provisioning/provisioner.js.map +1 -0
  73. package/dist/core/provisioning/transaction.d.ts +13 -0
  74. package/dist/core/provisioning/transaction.js +3 -0
  75. package/dist/core/provisioning/transaction.js.map +1 -0
  76. package/dist/core/provisioning/types.d.ts +43 -0
  77. package/dist/core/provisioning/types.js +3 -0
  78. package/dist/core/provisioning/types.js.map +1 -0
  79. package/dist/core/reaper/index.d.ts +1 -0
  80. package/dist/core/reaper/index.js +7 -0
  81. package/dist/core/reaper/index.js.map +1 -0
  82. package/dist/{reaper/reaper.d.ts → core/reaper/reap.d.ts} +13 -8
  83. package/dist/core/reaper/reap.js +51 -0
  84. package/dist/core/reaper/reap.js.map +1 -0
  85. package/dist/core/recurrence/field.d.ts +2 -0
  86. package/dist/core/recurrence/field.js +12 -0
  87. package/dist/core/recurrence/field.js.map +1 -0
  88. package/dist/core/recurrence/kinds/cron.d.ts +10 -0
  89. package/dist/core/recurrence/kinds/cron.js +64 -0
  90. package/dist/core/recurrence/kinds/cron.js.map +1 -0
  91. package/dist/core/recurrence/kinds/interval.d.ts +5 -0
  92. package/dist/core/recurrence/kinds/interval.js +29 -0
  93. package/dist/core/recurrence/kinds/interval.js.map +1 -0
  94. package/dist/core/recurrence/kinds/one-off.d.ts +5 -0
  95. package/dist/core/recurrence/kinds/one-off.js +24 -0
  96. package/dist/core/recurrence/kinds/one-off.js.map +1 -0
  97. package/dist/core/recurrence/kinds/recurring-cron.d.ts +7 -0
  98. package/dist/core/recurrence/kinds/recurring-cron.js +64 -0
  99. package/dist/core/recurrence/kinds/recurring-cron.js.map +1 -0
  100. package/dist/core/recurrence/next-run.d.ts +2 -0
  101. package/dist/core/recurrence/next-run.js +37 -24
  102. package/dist/core/recurrence/next-run.js.map +1 -1
  103. package/dist/core/recurrence/periods.d.ts +2 -0
  104. package/dist/core/recurrence/periods.js +30 -0
  105. package/dist/core/recurrence/periods.js.map +1 -0
  106. package/dist/core/recurrence/resolve.d.ts +2 -0
  107. package/dist/core/recurrence/resolve.js +25 -0
  108. package/dist/core/recurrence/resolve.js.map +1 -0
  109. package/dist/core/recurrence/validate.js +9 -38
  110. package/dist/core/recurrence/validate.js.map +1 -1
  111. package/dist/core/retention/prune.d.ts +1 -1
  112. package/dist/core/retention/prune.js +11 -9
  113. package/dist/core/retention/prune.js.map +1 -1
  114. package/dist/core/retention/store.d.ts +1 -1
  115. package/dist/core/scheduler.d.ts +16 -0
  116. package/dist/core/scheduler.js +3 -0
  117. package/dist/core/scheduler.js.map +1 -0
  118. package/dist/core/types/schedule.d.ts +17 -4
  119. package/dist/core/types/task.d.ts +2 -5
  120. package/dist/observability/attributes.d.ts +41 -0
  121. package/dist/observability/attributes.js +56 -0
  122. package/dist/observability/attributes.js.map +1 -0
  123. package/dist/observability/executor-tracing.d.ts +4 -0
  124. package/dist/observability/executor-tracing.js +61 -0
  125. package/dist/observability/executor-tracing.js.map +1 -0
  126. package/dist/observability/materializer-tracing.d.ts +3 -0
  127. package/dist/observability/materializer-tracing.js +22 -0
  128. package/dist/observability/materializer-tracing.js.map +1 -0
  129. package/dist/observability/metrics.d.ts +11 -0
  130. package/dist/observability/metrics.js +14 -0
  131. package/dist/observability/metrics.js.map +1 -0
  132. package/dist/observability/pass-tracing.d.ts +2 -0
  133. package/dist/observability/pass-tracing.js +24 -0
  134. package/dist/observability/pass-tracing.js.map +1 -0
  135. package/dist/observability/provisioner-tracing.d.ts +11 -0
  136. package/dist/observability/provisioner-tracing.js +51 -0
  137. package/dist/observability/provisioner-tracing.js.map +1 -0
  138. package/dist/observability/tracer.d.ts +21 -0
  139. package/dist/observability/tracer.js +10 -0
  140. package/dist/observability/tracer.js.map +1 -0
  141. package/package.json +11 -22
  142. package/dist/core/enums.d.ts +0 -1
  143. package/dist/core/enums.js +0 -10
  144. package/dist/core/enums.js.map +0 -1
  145. package/dist/executor/backoff.js.map +0 -1
  146. package/dist/executor/executor.d.ts +0 -23
  147. package/dist/executor/executor.js +0 -133
  148. package/dist/executor/executor.js.map +0 -1
  149. package/dist/executor/precision-timer.js.map +0 -1
  150. package/dist/executor/task-handler.js.map +0 -1
  151. package/dist/reaper/reaper.js +0 -37
  152. package/dist/reaper/reaper.js.map +0 -1
  153. package/dist/storage/index.d.ts +0 -3
  154. package/dist/storage/index.js +0 -12
  155. package/dist/storage/index.js.map +0 -1
  156. package/dist/storage/mappers.d.ts +0 -6
  157. package/dist/storage/mappers.js +0 -72
  158. package/dist/storage/mappers.js.map +0 -1
  159. package/dist/storage/materializer-store.d.ts +0 -14
  160. package/dist/storage/materializer-store.js +0 -83
  161. package/dist/storage/materializer-store.js.map +0 -1
  162. package/dist/storage/scheduler.service.d.ts +0 -16
  163. package/dist/storage/scheduler.service.js +0 -70
  164. package/dist/storage/scheduler.service.js.map +0 -1
  165. /package/dist/{executor → core/executor}/backoff.d.ts +0 -0
  166. /package/dist/{executor → core/executor}/backoff.js +0 -0
@@ -1,133 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Executor = void 0;
4
- const constants_1 = require("@n8n/constants");
5
- const ensure_error_1 = require("@n8n/utils/errors/ensure-error");
6
- const backoff_1 = require("./backoff");
7
- const mappers_1 = require("../storage/mappers");
8
- class Executor {
9
- constructor(taskRepository, registry, timer, logger, config) {
10
- this.taskRepository = taskRepository;
11
- this.registry = registry;
12
- this.timer = timer;
13
- this.claimedTaskById = new Map();
14
- this.logger = logger.scoped('scheduler');
15
- this.leaseMs = config.leaseDurationSeconds * constants_1.Time.seconds.toMilliseconds;
16
- this.lookaheadMs = config.executorIntervalSeconds * constants_1.Time.seconds.toMilliseconds;
17
- this.batchSize = config.claimBatchSize;
18
- if (this.lookaheadMs >= this.leaseMs) {
19
- this.logger.warn('Scheduler executorInterval >= leaseDuration: a claimed task may lose its lease before firing; set executorInterval below leaseDuration', {
20
- executorIntervalSeconds: config.executorIntervalSeconds,
21
- leaseDurationSeconds: config.leaseDurationSeconds,
22
- });
23
- }
24
- }
25
- async claimAndSchedule(host) {
26
- const taskTypes = this.registry.registeredTypes();
27
- if (taskTypes.length === 0)
28
- return [];
29
- const claim = {
30
- host,
31
- taskTypes,
32
- lookaheadMs: this.lookaheadMs,
33
- leaseMs: this.leaseMs,
34
- batchSize: this.batchSize,
35
- };
36
- const rows = await this.taskRepository.claimDueTasks(claim);
37
- const tasks = [];
38
- for (const row of rows) {
39
- let task;
40
- try {
41
- task = (0, mappers_1.entityToClaimedTask)(row);
42
- }
43
- catch (error) {
44
- await this.releaseUnmappableRow(host, row, error);
45
- continue;
46
- }
47
- tasks.push(task);
48
- this.scheduleClaimed(host, task);
49
- }
50
- return tasks;
51
- }
52
- scheduleClaimed(host, task) {
53
- this.claimedTaskById.set(task.id, { host, task });
54
- this.timer.schedule(task.runAt, () => {
55
- this.claimedTaskById.delete(task.id);
56
- this.fire(host, task).catch((error) => {
57
- this.logger.error('Scheduler executor failed to fire task', {
58
- taskId: task.id,
59
- taskType: task.taskType,
60
- error,
61
- });
62
- });
63
- });
64
- }
65
- async fire(host, task) {
66
- const claim = { host, id: task.id, claimedEpoch: task.leaseEpoch };
67
- const handler = this.registry.resolve(task.taskType);
68
- if (handler === undefined) {
69
- this.logger.warn('Scheduler executor found no handler for claimed task; releasing it', {
70
- taskId: task.id,
71
- taskType: task.taskType,
72
- });
73
- await this.releaseClaimBestEffort(claim);
74
- return;
75
- }
76
- const started = await this.taskRepository.markStarted(claim);
77
- if (started === 0)
78
- return;
79
- try {
80
- await handler.execute(task);
81
- }
82
- catch (error) {
83
- const message = (0, ensure_error_1.ensureError)(error).message;
84
- const nextAttempts = task.attempts + 1;
85
- if (nextAttempts >= task.maxAttempts) {
86
- await this.taskRepository.failTaskTerminal(claim, message);
87
- }
88
- else {
89
- await this.taskRepository.rescheduleTask(claim, (0, backoff_1.backoff)(nextAttempts), message);
90
- }
91
- return;
92
- }
93
- await this.taskRepository.completeTask(claim);
94
- }
95
- async releaseUnmappableRow(host, row, error) {
96
- this.logger.error('Scheduler executor could not map claimed task; releasing it', {
97
- taskId: row.id,
98
- error,
99
- });
100
- await this.releaseClaimBestEffort({ host, id: row.id, claimedEpoch: row.leaseEpoch });
101
- }
102
- async releaseClaimBestEffort(claim) {
103
- try {
104
- await this.taskRepository.releaseClaim(claim);
105
- }
106
- catch (error) {
107
- this.logger.error('Scheduler executor failed to release claim', {
108
- taskId: claim.id,
109
- error,
110
- });
111
- }
112
- }
113
- async stop() {
114
- this.timer.cancelAll();
115
- const entries = [...this.claimedTaskById.values()];
116
- const results = await Promise.allSettled(entries.map(async ({ host, task }) => await this.taskRepository.releaseClaim({
117
- host,
118
- id: task.id,
119
- claimedEpoch: task.leaseEpoch,
120
- })));
121
- results.forEach((result, index) => {
122
- if (result.status === 'rejected') {
123
- this.logger.error('Scheduler executor failed to release claim on shutdown', {
124
- taskId: entries[index].task.id,
125
- error: result.reason,
126
- });
127
- }
128
- });
129
- this.claimedTaskById.clear();
130
- }
131
- }
132
- exports.Executor = Executor;
133
- //# sourceMappingURL=executor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/executor/executor.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"precision-timer.js","sourceRoot":"","sources":["../../src/executor/precision-timer.ts"],"names":[],"mappings":";;;AAAA,8CAA2D;AAY3D,MAAM,cAAc,GAAiB;IACpC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;IACrB,QAAQ,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC;IAClD,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC;CAC5C,CAAC;AAGF,MAAM,YAAY,GAAG,qCAAyB,CAAC;AAY/C,MAAa,cAAc;IAG1B,YAA6B,UAAwB,cAAc;QAAtC,YAAO,GAAP,OAAO,CAA+B;QAFlD,YAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEiB,CAAC;IAGvE,QAAQ,CAAC,KAAW,EAAE,EAAc;QAInC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;QAGxF,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE;YACzC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5B,EAAE,EAAE,CAAC;QACN,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAGD,SAAS;QAGR,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,YAAY;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC1B,CAAC;CACD;AAhCD,wCAgCC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"task-handler.js","sourceRoot":"","sources":["../../src/executor/task-handler.ts"],"names":[],"mappings":";;;AAAA,+CAA+C;AAkB/C,MAAa,mBAAmB;IAAhC;QACkB,aAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IAkB5D,CAAC;IAfA,QAAQ,CAAC,QAAgB,EAAE,OAAoB;QAC9C,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,8BAAe,CAAC,4BAA4B,QAAQ,yBAAyB,CAAC,CAAC;QAC1F,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,CAAC,QAAgB;QACvB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAGD,eAAe;QACd,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;CACD;AAnBD,kDAmBC"}
@@ -1,37 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.reap = reap;
4
- const backoff_1 = require("../executor/backoff");
5
- const LEASE_EXPIRED_MESSAGE = 'Lease expired before completion';
6
- async function reap({ store, logger, batchSize }) {
7
- const expired = await store.findExpiredLeases(batchSize);
8
- if (expired.length === 0)
9
- return { reclaimed: 0, deadLettered: 0 };
10
- let reclaimed = 0;
11
- let deadLettered = 0;
12
- for (const task of expired) {
13
- try {
14
- const nextAttempts = task.attempts + 1;
15
- if (nextAttempts >= task.maxAttempts) {
16
- deadLettered += await store.deadLetterExpired({ id: task.id, claimedEpoch: task.leaseEpoch }, LEASE_EXPIRED_MESSAGE);
17
- }
18
- else {
19
- reclaimed += await store.reclaimExpired({ id: task.id, claimedEpoch: task.leaseEpoch }, (0, backoff_1.backoff)(nextAttempts), LEASE_EXPIRED_MESSAGE);
20
- }
21
- }
22
- catch (error) {
23
- logger.error('Scheduler reaper failed to recover an expired-lease task', {
24
- taskId: task.id,
25
- error,
26
- });
27
- }
28
- }
29
- if (reclaimed > 0 || deadLettered > 0) {
30
- logger.info('Scheduler reaper recovered expired-lease tasks', {
31
- reclaimed,
32
- deadLettered,
33
- });
34
- }
35
- return { reclaimed, deadLettered };
36
- }
37
- //# sourceMappingURL=reaper.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reaper.js","sourceRoot":"","sources":["../../src/reaper/reaper.ts"],"names":[],"mappings":";;AAwEA,oBAwCC;AA9GD,iDAA8C;AAG9C,MAAM,qBAAqB,GAAG,iCAAiC,CAAC;AAmEzD,KAAK,UAAU,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAY;IAChE,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACzD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IAEnE,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAG5B,IAAI,CAAC;YAGJ,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvC,IAAI,YAAY,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtC,YAAY,IAAI,MAAM,KAAK,CAAC,iBAAiB,CAC5C,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,UAAU,EAAE,EAC9C,qBAAqB,CACrB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACP,SAAS,IAAI,MAAM,KAAK,CAAC,cAAc,CACtC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,UAAU,EAAE,EAC9C,IAAA,iBAAO,EAAC,YAAY,CAAC,EACrB,qBAAqB,CACrB,CAAC;YACH,CAAC;QACF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,0DAA0D,EAAE;gBACxE,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,KAAK;aACL,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAED,IAAI,SAAS,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,gDAAgD,EAAE;YAC7D,SAAS;YACT,YAAY;SACZ,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AACpC,CAAC"}
@@ -1,3 +0,0 @@
1
- export { MaterializerStore } from './materializer-store';
2
- export { SchedulerService } from './scheduler.service';
3
- export { entityToScheduledJob, entityToClaimedTask, scheduledTaskToRow } from './mappers';
@@ -1,12 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.scheduledTaskToRow = exports.entityToClaimedTask = exports.entityToScheduledJob = exports.SchedulerService = exports.MaterializerStore = void 0;
4
- var materializer_store_1 = require("./materializer-store");
5
- Object.defineProperty(exports, "MaterializerStore", { enumerable: true, get: function () { return materializer_store_1.MaterializerStore; } });
6
- var scheduler_service_1 = require("./scheduler.service");
7
- Object.defineProperty(exports, "SchedulerService", { enumerable: true, get: function () { return scheduler_service_1.SchedulerService; } });
8
- var mappers_1 = require("./mappers");
9
- Object.defineProperty(exports, "entityToScheduledJob", { enumerable: true, get: function () { return mappers_1.entityToScheduledJob; } });
10
- Object.defineProperty(exports, "entityToClaimedTask", { enumerable: true, get: function () { return mappers_1.entityToClaimedTask; } });
11
- Object.defineProperty(exports, "scheduledTaskToRow", { enumerable: true, get: function () { return mappers_1.scheduledTaskToRow; } });
12
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":";;;AAAA,2DAAyD;AAAhD,uHAAA,iBAAiB,OAAA;AAC1B,yDAAuD;AAA9C,qHAAA,gBAAgB,OAAA;AACzB,qCAA0F;AAAjF,+GAAA,oBAAoB,OAAA;AAAE,8GAAA,mBAAmB,OAAA;AAAE,6GAAA,kBAAkB,OAAA"}
@@ -1,6 +0,0 @@
1
- import type { ScheduledJob as ScheduledJobEntity, ScheduledTask as ScheduledTaskEntity } from '@n8n/db';
2
- import type { QueryDeepPartialEntity } from '@n8n/typeorm/query-builder/QueryPartialEntity';
3
- import type { ClaimedTask, ScheduledJob, ScheduledTask } from '../core/types';
4
- export declare function entityToScheduledJob(entity: ScheduledJobEntity, instanceTimezone: string): ScheduledJob;
5
- export declare function scheduledTaskToRow(task: ScheduledTask): QueryDeepPartialEntity<ScheduledTaskEntity>;
6
- export declare function entityToClaimedTask(entity: ScheduledTaskEntity): ClaimedTask;
@@ -1,72 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.entityToScheduledJob = entityToScheduledJob;
4
- exports.scheduledTaskToRow = scheduledTaskToRow;
5
- exports.entityToClaimedTask = entityToClaimedTask;
6
- const errors_1 = require("../core/errors");
7
- function toSchedule(entity, instanceTimezone) {
8
- switch (entity.kind) {
9
- case 'cron':
10
- return {
11
- kind: 'cron',
12
- cronExpression: required(entity, 'cronExpression'),
13
- timezone: entity.timezone ?? instanceTimezone,
14
- };
15
- case 'interval':
16
- return { kind: 'interval', intervalSeconds: required(entity, 'intervalSeconds') };
17
- case 'one_off':
18
- return { kind: 'one_off', fireAt: required(entity, 'fireAt') };
19
- }
20
- }
21
- function required(entity, key) {
22
- const value = entity[key];
23
- if (value === null || value === undefined) {
24
- throw new errors_1.CorruptStorageRowError(`scheduled_job ${entity.id} of kind '${entity.kind}' is missing '${String(key)}'`);
25
- }
26
- return value;
27
- }
28
- function entityToScheduledJob(entity, instanceTimezone) {
29
- return {
30
- id: String(entity.id),
31
- schedule: toSchedule(entity, instanceTimezone),
32
- enabled: entity.enabled,
33
- nextRunAt: entity.nextRunAt,
34
- lastFiredAt: entity.lastFiredAt,
35
- taskType: entity.taskType,
36
- payload: entity.payload,
37
- maxAttempts: entity.maxAttempts,
38
- };
39
- }
40
- function scheduledTaskToRow(task) {
41
- return {
42
- jobId: Number(task.jobId),
43
- taskType: task.taskType,
44
- payload: task.payload,
45
- scheduledFor: task.scheduledFor,
46
- runAt: task.runAt,
47
- status: task.status,
48
- attempts: task.attempts,
49
- maxAttempts: task.maxAttempts,
50
- };
51
- }
52
- function entityToClaimedTask(entity) {
53
- if (entity.claimedBy === null || entity.leaseExpiresAt === null) {
54
- throw new errors_1.CorruptStorageRowError(`scheduled_task ${entity.id} was claimed but is missing 'claimedBy' or 'leaseExpiresAt'`);
55
- }
56
- return {
57
- id: String(entity.id),
58
- jobId: String(entity.jobId),
59
- taskType: entity.taskType,
60
- payload: entity.payload,
61
- scheduledFor: entity.scheduledFor,
62
- runAt: entity.runAt,
63
- status: entity.status,
64
- attempts: entity.attempts,
65
- maxAttempts: entity.maxAttempts,
66
- claimedBy: entity.claimedBy,
67
- leaseExpiresAt: entity.leaseExpiresAt,
68
- leaseEpoch: entity.leaseEpoch,
69
- startedAt: entity.startedAt,
70
- };
71
- }
72
- //# sourceMappingURL=mappers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mappers.js","sourceRoot":"","sources":["../../src/storage/mappers.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- import { Logger } from '@n8n/backend-common';
2
- import { GlobalConfig } from '@n8n/config';
3
- import { ScheduledJobRepository, ScheduledTaskRepository } from '@n8n/db';
4
- import { DataSource } from '@n8n/typeorm';
5
- import type { RunInTransaction } from '../core/materializer';
6
- export declare class MaterializerStore {
7
- private readonly dataSource;
8
- private readonly jobs;
9
- private readonly tasks;
10
- private readonly logger;
11
- private readonly globalConfig;
12
- constructor(dataSource: DataSource, jobs: ScheduledJobRepository, tasks: ScheduledTaskRepository, logger: Logger, globalConfig: GlobalConfig);
13
- readonly runInTransaction: RunInTransaction;
14
- }
@@ -1,83 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.MaterializerStore = void 0;
13
- const backend_common_1 = require("@n8n/backend-common");
14
- const config_1 = require("@n8n/config");
15
- const db_1 = require("@n8n/db");
16
- const di_1 = require("@n8n/di");
17
- const typeorm_1 = require("@n8n/typeorm");
18
- const mappers_1 = require("./mappers");
19
- class DatabaseMaterializerTransaction {
20
- constructor(manager, jobs, tasks, logger, instanceTimezone) {
21
- this.manager = manager;
22
- this.jobs = jobs;
23
- this.tasks = tasks;
24
- this.logger = logger;
25
- this.instanceTimezone = instanceTimezone;
26
- }
27
- async claimDueJobs(limit) {
28
- const claimed = await this.jobs.claimDue(this.manager, limit);
29
- if (claimed === undefined) {
30
- return undefined;
31
- }
32
- return {
33
- now: claimed.now,
34
- jobs: claimed.jobs.map((entity) => (0, mappers_1.entityToScheduledJob)(entity, this.instanceTimezone)),
35
- };
36
- }
37
- async recordOccurrences(planned) {
38
- const occurrences = planned.flatMap(({ job, plan }) => plan.occurrences.map((when) => ({
39
- jobId: Number(job.id),
40
- taskType: job.taskType,
41
- payload: job.payload,
42
- scheduledFor: when,
43
- runAt: when,
44
- maxAttempts: job.maxAttempts,
45
- })));
46
- const recorded = await this.tasks.insertIgnoringDuplicates(this.manager, occurrences);
47
- if (recorded < occurrences.length) {
48
- this.logger.debug('Materializer skipped occurrences that were already recorded', {
49
- jobs: planned.length,
50
- planned: occurrences.length,
51
- recorded,
52
- });
53
- }
54
- return recorded;
55
- }
56
- async advanceJobs(planned) {
57
- await this.jobs.advanceMany(this.manager, planned.map(({ job, plan }) => ({
58
- id: Number(job.id),
59
- nextRunAt: plan.nextRunAt,
60
- lastFiredAt: plan.lastFiredAt,
61
- })));
62
- }
63
- }
64
- let MaterializerStore = class MaterializerStore {
65
- constructor(dataSource, jobs, tasks, logger, globalConfig) {
66
- this.dataSource = dataSource;
67
- this.jobs = jobs;
68
- this.tasks = tasks;
69
- this.logger = logger;
70
- this.globalConfig = globalConfig;
71
- this.runInTransaction = async (work) => await this.dataSource.transaction(async (manager) => await work(new DatabaseMaterializerTransaction(manager, this.jobs, this.tasks, this.logger, this.globalConfig.generic.timezone)));
72
- }
73
- };
74
- exports.MaterializerStore = MaterializerStore;
75
- exports.MaterializerStore = MaterializerStore = __decorate([
76
- (0, di_1.Service)(),
77
- __metadata("design:paramtypes", [typeorm_1.DataSource,
78
- db_1.ScheduledJobRepository,
79
- db_1.ScheduledTaskRepository,
80
- backend_common_1.Logger,
81
- config_1.GlobalConfig])
82
- ], MaterializerStore);
83
- //# sourceMappingURL=materializer-store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"materializer-store.js","sourceRoot":"","sources":["../../src/storage/materializer-store.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wDAA6C;AAC7C,wCAA2C;AAC3C,gCAA0E;AAC1E,gCAAkC;AAClC,0CAA8D;AAE9D,uCAAiD;AAYjD,MAAM,+BAA+B;IACpC,YACkB,OAAsB,EACtB,IAA4B,EAC5B,KAA8B,EAC9B,MAAc,EACd,gBAAwB;QAJxB,YAAO,GAAP,OAAO,CAAe;QACtB,SAAI,GAAJ,IAAI,CAAwB;QAC5B,UAAK,GAAL,KAAK,CAAyB;QAC9B,WAAM,GAAN,MAAM,CAAQ;QACd,qBAAgB,GAAhB,gBAAgB,CAAQ;IACvC,CAAC;IAEJ,KAAK,CAAC,YAAY,CAAC,KAAa;QAC/B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,OAAO;YACN,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,8BAAoB,EAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;SACvF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,OAAqB;QAC5C,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CACrD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC/B,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,YAAY,EAAE,IAAI;YAClB,KAAK,EAAE,IAAI;YACX,WAAW,EAAE,GAAG,CAAC,WAAW;SAC5B,CAAC,CAAC,CACH,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAEtF,IAAI,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6DAA6D,EAAE;gBAChF,IAAI,EAAE,OAAO,CAAC,MAAM;gBACpB,OAAO,EAAE,WAAW,CAAC,MAAM;gBAC3B,QAAQ;aACR,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAqB;QACtC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAC1B,IAAI,CAAC,OAAO,EACZ,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAC/B,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC7B,CAAC,CAAC,CACH,CAAC;IACH,CAAC;CACD;AAQM,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAC7B,YACkB,UAAsB,EACtB,IAA4B,EAC5B,KAA8B,EAC9B,MAAc,EACd,YAA0B;QAJ1B,eAAU,GAAV,UAAU,CAAY;QACtB,SAAI,GAAJ,IAAI,CAAwB;QAC5B,UAAK,GAAL,KAAK,CAAyB;QAC9B,WAAM,GAAN,MAAM,CAAQ;QACd,iBAAY,GAAZ,YAAY,CAAc;QAGnC,qBAAgB,GAAqB,KAAK,EAAE,IAAI,EAAE,EAAE,CAC5D,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAChC,KAAK,EAAE,OAAO,EAAE,EAAE,CACjB,MAAM,IAAI,CACT,IAAI,+BAA+B,CAClC,OAAO,EACP,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,CAClC,CACD,CACF,CAAC;IAdA,CAAC;CAeJ,CAAA;AAtBY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,YAAO,GAAE;qCAGqB,oBAAU;QAChB,2BAAsB;QACrB,4BAAuB;QACtB,uBAAM;QACA,qBAAY;GANhC,iBAAiB,CAsB7B"}
@@ -1,16 +0,0 @@
1
- import { Logger } from '@n8n/backend-common';
2
- import { SchedulerConfig } from '@n8n/config';
3
- import { ScheduledTaskRepository } from '@n8n/db';
4
- import { MaterializerStore } from './materializer-store';
5
- import type { MaterializerSummary } from '../core/materializer';
6
- import type { RetentionSummary } from '../core/retention';
7
- export declare class SchedulerService {
8
- private readonly store;
9
- private readonly tasks;
10
- private readonly logger;
11
- private readonly materializerOptions;
12
- private readonly retentionOptions;
13
- constructor(store: MaterializerStore, tasks: ScheduledTaskRepository, logger: Logger, config: SchedulerConfig);
14
- materialize(): Promise<MaterializerSummary>;
15
- prune(): Promise<RetentionSummary>;
16
- }
@@ -1,70 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.SchedulerService = void 0;
13
- const backend_common_1 = require("@n8n/backend-common");
14
- const config_1 = require("@n8n/config");
15
- const db_1 = require("@n8n/db");
16
- const di_1 = require("@n8n/di");
17
- const materializer_store_1 = require("./materializer-store");
18
- const materializer_1 = require("../core/materializer");
19
- const retention_1 = require("../core/retention");
20
- let SchedulerService = class SchedulerService {
21
- constructor(store, tasks, logger, config) {
22
- this.store = store;
23
- this.tasks = tasks;
24
- this.logger = logger;
25
- this.materializerOptions = {
26
- ...materializer_1.DEFAULT_MATERIALIZER_OPTIONS,
27
- windowSeconds: config.materializationWindowSeconds,
28
- };
29
- this.retentionOptions = {
30
- ...retention_1.DEFAULT_RETENTION_OPTIONS,
31
- retentionSeconds: config.retentionSeconds,
32
- failedRetentionSeconds: config.failedRetentionSeconds,
33
- };
34
- if (config.failedRetentionSeconds < config.retentionSeconds) {
35
- this.logger.warn('Scheduler retention keeps failed runs shorter than succeeded ones; failure evidence will be deleted first', {
36
- retentionSeconds: config.retentionSeconds,
37
- failedRetentionSeconds: config.failedRetentionSeconds,
38
- });
39
- }
40
- }
41
- async materialize() {
42
- return await (0, materializer_1.materialize)(this.store.runInTransaction, this.materializerOptions, (job, error) => {
43
- this.logger.error('Scheduler could not plan a job schedule; deferred for retry', {
44
- jobId: job.id,
45
- error: error instanceof Error ? error.message : String(error),
46
- });
47
- });
48
- }
49
- async prune() {
50
- const summary = await (0, retention_1.prune)(this.tasks, this.retentionOptions);
51
- if (!summary.drained) {
52
- this.logger.warn('Scheduler retention pass hit its batch budget; backlog remains', {
53
- ...summary,
54
- });
55
- }
56
- else if (summary.deleted > 0) {
57
- this.logger.debug('Scheduler retention deleted finished tasks', { ...summary });
58
- }
59
- return summary;
60
- }
61
- };
62
- exports.SchedulerService = SchedulerService;
63
- exports.SchedulerService = SchedulerService = __decorate([
64
- (0, di_1.Service)(),
65
- __metadata("design:paramtypes", [materializer_store_1.MaterializerStore,
66
- db_1.ScheduledTaskRepository,
67
- backend_common_1.Logger,
68
- config_1.SchedulerConfig])
69
- ], SchedulerService);
70
- //# sourceMappingURL=scheduler.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scheduler.service.js","sourceRoot":"","sources":["../../src/storage/scheduler.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wDAA6C;AAC7C,wCAA8C;AAC9C,gCAAkD;AAClD,gCAAkC;AAElC,6DAAyD;AACzD,uDAAiF;AAEjF,iDAAqE;AAQ9D,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAK5B,YACkB,KAAwB,EACxB,KAA8B,EAC9B,MAAc,EAC/B,MAAuB;QAHN,UAAK,GAAL,KAAK,CAAmB;QACxB,UAAK,GAAL,KAAK,CAAyB;QAC9B,WAAM,GAAN,MAAM,CAAQ;QAG/B,IAAI,CAAC,mBAAmB,GAAG;YAC1B,GAAG,2CAA4B;YAC/B,aAAa,EAAE,MAAM,CAAC,4BAA4B;SAClD,CAAC;QACF,IAAI,CAAC,gBAAgB,GAAG;YACvB,GAAG,qCAAyB;YAC5B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;YACzC,sBAAsB,EAAE,MAAM,CAAC,sBAAsB;SACrD,CAAC;QACF,IAAI,MAAM,CAAC,sBAAsB,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC7D,IAAI,CAAC,MAAM,CAAC,IAAI,CACf,2GAA2G,EAC3G;gBACC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;gBACzC,sBAAsB,EAAE,MAAM,CAAC,sBAAsB;aACrD,CACD,CAAC;QACH,CAAC;IACF,CAAC;IAED,KAAK,CAAC,WAAW;QAChB,OAAO,MAAM,IAAA,0BAAW,EACvB,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAC3B,IAAI,CAAC,mBAAmB,EACxB,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6DAA6D,EAAE;gBAChF,KAAK,EAAE,GAAG,CAAC,EAAE;gBACb,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC7D,CAAC,CAAC;QACJ,CAAC,CACD,CAAC;IACH,CAAC;IAKD,KAAK,CAAC,KAAK;QACV,MAAM,OAAO,GAAG,MAAM,IAAA,iBAAK,EAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gEAAgE,EAAE;gBAClF,GAAG,OAAO;aACV,CAAC,CAAC;QACJ,CAAC;aAAM,IAAI,OAAO,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4CAA4C,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,OAAO,CAAC;IAChB,CAAC;CACD,CAAA;AA1DY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,YAAO,GAAE;qCAOgB,sCAAiB;QACjB,4BAAuB;QACtB,uBAAM;QACvB,wBAAe;GATZ,gBAAgB,CA0D5B"}
File without changes
File without changes