@terreno/jobs 57.4.0 → 57.6.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.
@@ -1,204 +1,110 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __generator = (this && this.__generator) || function (thisArg, body) {
12
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
13
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
- function verb(n) { return function (v) { return step([n, v]); }; }
15
- function step(op) {
16
- if (f) throw new TypeError("Generator is already executing.");
17
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
- if (y = 0, t) op = [op[0] & 2, t.value];
20
- switch (op[0]) {
21
- case 0: case 1: t = op; break;
22
- case 4: _.label++; return { value: op[1], done: false };
23
- case 5: _.label++; y = op[1]; op = [0]; continue;
24
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
- default:
26
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
- if (t[2]) _.ops.pop();
31
- _.trys.pop(); continue;
32
- }
33
- op = body.call(thisArg, _);
34
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
- }
37
- };
38
2
  Object.defineProperty(exports, "__esModule", { value: true });
39
3
  exports.MongoJobRunner = exports.hasWorkerIdPrefix = exports.getWorkerId = void 0;
40
- var luxon_1 = require("luxon");
41
- var claimLock_1 = require("../claimLock");
42
- var jobExecutor_1 = require("../jobExecutor");
43
- var job_1 = require("../models/job");
44
- var DEFAULT_POLL_INTERVAL_MS = 1000;
4
+ const luxon_1 = require("luxon");
5
+ const claimLock_1 = require("../claimLock");
6
+ const jobExecutor_1 = require("../jobExecutor");
7
+ const job_1 = require("../models/job");
8
+ const DEFAULT_POLL_INTERVAL_MS = 1_000;
45
9
  /** @internal */
46
10
  var claimLock_2 = require("../claimLock");
47
11
  Object.defineProperty(exports, "getWorkerId", { enumerable: true, get: function () { return claimLock_2.getWorkerId; } });
48
12
  Object.defineProperty(exports, "hasWorkerIdPrefix", { enumerable: true, get: function () { return claimLock_2.hasWorkerIdPrefix; } });
49
- var buildLockExpiry = function (lockTtlMs) {
50
- return luxon_1.DateTime.utc().minus({ milliseconds: lockTtlMs }).toJSDate();
51
- };
52
- var waitForAbortOrTimeout = function (signal, timeoutMs) {
53
- return new Promise(function (resolve) {
54
- if (signal.aborted) {
55
- resolve();
56
- return;
57
- }
58
- var timer = setTimeout(function () {
59
- signal.removeEventListener("abort", onAbort);
60
- resolve();
61
- }, timeoutMs);
62
- var onAbort = function () {
63
- clearTimeout(timer);
64
- resolve();
65
- };
66
- signal.addEventListener("abort", onAbort, { once: true });
67
- });
68
- };
69
- var readClaimLock = function (job) {
13
+ const buildLockExpiry = (lockTtlMs) => luxon_1.DateTime.utc().minus({ milliseconds: lockTtlMs }).toJSDate();
14
+ const waitForAbortOrTimeout = (signal, timeoutMs) => new Promise((resolve) => {
15
+ if (signal.aborted) {
16
+ resolve();
17
+ return;
18
+ }
19
+ const timer = setTimeout(() => {
20
+ signal.removeEventListener("abort", onAbort);
21
+ resolve();
22
+ }, timeoutMs);
23
+ const onAbort = () => {
24
+ clearTimeout(timer);
25
+ resolve();
26
+ };
27
+ signal.addEventListener("abort", onAbort, { once: true });
28
+ });
29
+ const readClaimLock = (job) => {
70
30
  if (!job.lockedAt || !job.lockedBy) {
71
- throw new Error("Job ".concat(job._id.toString(), " is missing claim lock metadata"));
31
+ throw new Error(`Job ${job._id.toString()} is missing claim lock metadata`);
72
32
  }
73
33
  return {
74
34
  lockedAt: job.lockedAt,
75
35
  lockedBy: job.lockedBy,
76
36
  };
77
37
  };
78
- var MongoJobRunner = /** @class */ (function () {
79
- function MongoJobRunner() {
80
- this.id = "mongo";
81
- this.pollIntervalMs = DEFAULT_POLL_INTERVAL_MS;
82
- this.running = false;
38
+ class MongoJobRunner {
39
+ id = "mongo";
40
+ pollIntervalMs = DEFAULT_POLL_INTERVAL_MS;
41
+ running = false;
42
+ stopResolve;
43
+ async enqueue(_job) {
44
+ // Mongo persistence happens before dispatch; the poller picks up the row.
83
45
  }
84
- MongoJobRunner.prototype.enqueue = function (_job) {
85
- return __awaiter(this, void 0, void 0, function () {
86
- return __generator(this, function (_a) {
87
- return [2 /*return*/];
88
- });
89
- });
90
- };
91
- MongoJobRunner.prototype.start = function (options) {
92
- return __awaiter(this, void 0, void 0, function () {
93
- var processedAny, processed;
94
- var _a, _b;
95
- return __generator(this, function (_c) {
96
- switch (_c.label) {
97
- case 0:
98
- this.pollIntervalMs = (_a = options.pollIntervalMs) !== null && _a !== void 0 ? _a : DEFAULT_POLL_INTERVAL_MS;
99
- this.running = true;
100
- _c.label = 1;
101
- case 1:
102
- _c.trys.push([1, , 11, 12]);
103
- _c.label = 2;
104
- case 2:
105
- if (!!options.signal.aborted) return [3 /*break*/, 10];
106
- return [4 /*yield*/, options.jobs.reconcileSchedulesIfDirty()];
107
- case 3:
108
- _c.sent();
109
- return [4 /*yield*/, options.jobs.tickSchedules()];
110
- case 4:
111
- _c.sent();
112
- processedAny = false;
113
- _c.label = 5;
114
- case 5:
115
- if (!!options.signal.aborted) return [3 /*break*/, 7];
116
- return [4 /*yield*/, this.processNext(options)];
117
- case 6:
118
- processed = _c.sent();
119
- if (!processed) {
120
- return [3 /*break*/, 7];
121
- }
122
- processedAny = true;
123
- return [3 /*break*/, 5];
124
- case 7:
125
- if (options.signal.aborted) {
126
- return [3 /*break*/, 10];
127
- }
128
- if (!!processedAny) return [3 /*break*/, 9];
129
- return [4 /*yield*/, waitForAbortOrTimeout(options.signal, this.pollIntervalMs)];
130
- case 8:
131
- _c.sent();
132
- _c.label = 9;
133
- case 9: return [3 /*break*/, 2];
134
- case 10: return [3 /*break*/, 12];
135
- case 11:
136
- this.running = false;
137
- (_b = this.stopResolve) === null || _b === void 0 ? void 0 : _b.call(this);
138
- this.stopResolve = undefined;
139
- return [7 /*endfinally*/];
140
- case 12: return [2 /*return*/];
46
+ async start(options) {
47
+ this.pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
48
+ this.running = true;
49
+ try {
50
+ while (!options.signal.aborted) {
51
+ await options.jobs.reconcileSchedulesIfDirty();
52
+ await options.jobs.tickSchedules();
53
+ let processedAny = false;
54
+ while (!options.signal.aborted) {
55
+ const processed = await this.processNext(options);
56
+ if (!processed) {
57
+ break;
58
+ }
59
+ processedAny = true;
141
60
  }
142
- });
143
- });
144
- };
145
- MongoJobRunner.prototype.stop = function () {
146
- return __awaiter(this, void 0, void 0, function () {
147
- var _this = this;
148
- return __generator(this, function (_a) {
149
- switch (_a.label) {
150
- case 0:
151
- if (!this.running) {
152
- return [2 /*return*/];
153
- }
154
- return [4 /*yield*/, new Promise(function (resolve) {
155
- _this.stopResolve = resolve;
156
- })];
157
- case 1:
158
- _a.sent();
159
- return [2 /*return*/];
61
+ if (options.signal.aborted) {
62
+ break;
160
63
  }
161
- });
162
- });
163
- };
164
- MongoJobRunner.prototype.processNext = function (options) {
165
- return __awaiter(this, void 0, void 0, function () {
166
- var now, lockExpiry, claim, claimed;
167
- return __generator(this, function (_a) {
168
- switch (_a.label) {
169
- case 0:
170
- now = luxon_1.DateTime.utc().toJSDate();
171
- lockExpiry = buildLockExpiry(options.jobs.getLockTtlMs());
172
- claim = (0, claimLock_1.createClaimLock)(now);
173
- return [4 /*yield*/, job_1.Job.findOneAndUpdate({
174
- $or: [{ lockedAt: { $exists: false } }, { lockedAt: null }, { lockedAt: { $lte: lockExpiry } }],
175
- runAt: { $lte: now },
176
- status: { $in: ["pending", "running", "scheduled"] },
177
- }, {
178
- $set: {
179
- lockedAt: claim.lockedAt,
180
- lockedBy: claim.lockedBy,
181
- status: "running",
182
- },
183
- }, { returnDocument: "after", sort: { runAt: 1 } })];
184
- case 1:
185
- claimed = _a.sent();
186
- if (!claimed) {
187
- return [2 /*return*/, false];
188
- }
189
- return [4 /*yield*/, (0, jobExecutor_1.runClaimedJob)({
190
- claim: readClaimLock(claimed),
191
- host: options.jobs,
192
- job: claimed,
193
- signal: options.signal,
194
- })];
195
- case 2:
196
- _a.sent();
197
- return [2 /*return*/, true];
64
+ if (!processedAny) {
65
+ await waitForAbortOrTimeout(options.signal, this.pollIntervalMs);
198
66
  }
199
- });
67
+ }
68
+ }
69
+ finally {
70
+ this.running = false;
71
+ this.stopResolve?.();
72
+ this.stopResolve = undefined;
73
+ }
74
+ }
75
+ async stop() {
76
+ if (!this.running) {
77
+ return;
78
+ }
79
+ await new Promise((resolve) => {
80
+ this.stopResolve = resolve;
200
81
  });
201
- };
202
- return MongoJobRunner;
203
- }());
82
+ }
83
+ async processNext(options) {
84
+ const now = luxon_1.DateTime.utc().toJSDate();
85
+ const lockExpiry = buildLockExpiry(options.jobs.getLockTtlMs());
86
+ const claim = (0, claimLock_1.createClaimLock)(now);
87
+ const claimed = await job_1.Job.findOneAndUpdate({
88
+ $or: [{ lockedAt: { $exists: false } }, { lockedAt: null }, { lockedAt: { $lte: lockExpiry } }],
89
+ runAt: { $lte: now },
90
+ status: { $in: ["pending", "running", "scheduled"] },
91
+ }, {
92
+ $set: {
93
+ lockedAt: claim.lockedAt,
94
+ lockedBy: claim.lockedBy,
95
+ status: "running",
96
+ },
97
+ }, { returnDocument: "after", sort: { runAt: 1 } });
98
+ if (!claimed) {
99
+ return false;
100
+ }
101
+ await (0, jobExecutor_1.runClaimedJob)({
102
+ claim: readClaimLock(claimed),
103
+ host: options.jobs,
104
+ job: claimed,
105
+ signal: options.signal,
106
+ });
107
+ return true;
108
+ }
109
+ }
204
110
  exports.MongoJobRunner = MongoJobRunner;