@holo-js/queue 0.3.16 → 0.3.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +51 -108
- package/package.json +3 -3
package/dist/index.mjs
CHANGED
|
@@ -878,8 +878,16 @@ function resetQueueRuntimeState(state) {
|
|
|
878
878
|
}
|
|
879
879
|
async function shutdownQueueRuntime() {
|
|
880
880
|
const state = getQueueRuntimeState();
|
|
881
|
-
|
|
882
|
-
|
|
881
|
+
const drivers = [...new Set(state.drivers.values())];
|
|
882
|
+
state.drivers.clear();
|
|
883
|
+
try {
|
|
884
|
+
const results = await Promise.allSettled(drivers.map(async (driver) => driver.close()));
|
|
885
|
+
const failures = results.flatMap((result) => result.status === "rejected" ? [result.reason] : []);
|
|
886
|
+
if (failures.length === 1) throw failures[0];
|
|
887
|
+
if (failures.length > 1) throw new AggregateError(failures, "Queue drivers failed to close.");
|
|
888
|
+
} finally {
|
|
889
|
+
resetQueueRuntimeState(state);
|
|
890
|
+
}
|
|
883
891
|
}
|
|
884
892
|
function resetQueueRuntime() {
|
|
885
893
|
const state = getQueueRuntimeState();
|
|
@@ -1175,6 +1183,7 @@ async function processReservedJob(driver, reserved, options) {
|
|
|
1175
1183
|
let requestedReleaseDelay;
|
|
1176
1184
|
let requestedFailure;
|
|
1177
1185
|
let action;
|
|
1186
|
+
let handlerError;
|
|
1178
1187
|
try {
|
|
1179
1188
|
await runWithTimeout(
|
|
1180
1189
|
queueRuntimeInternals.executeRegisteredQueueJob(envelope, {
|
|
@@ -1202,123 +1211,57 @@ async function processReservedJob(driver, reserved, options) {
|
|
|
1202
1211
|
executionState.timedOut = true;
|
|
1203
1212
|
}
|
|
1204
1213
|
);
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1214
|
+
} catch (error) {
|
|
1215
|
+
handlerError = normalizeHookError(error);
|
|
1216
|
+
}
|
|
1217
|
+
const failure = handlerError instanceof QueueWorkerTimeoutError ? handlerError : requestedFailure ?? handlerError;
|
|
1218
|
+
let outcome;
|
|
1219
|
+
if (handlerError instanceof QueueWorkerTimeoutError) {
|
|
1220
|
+
outcome = { kind: "failed", error: handlerError };
|
|
1221
|
+
} else if (action === "release") {
|
|
1222
|
+
outcome = {
|
|
1223
|
+
kind: "released",
|
|
1224
|
+
...typeof requestedReleaseDelay === "number" ? { delaySeconds: requestedReleaseDelay } : {},
|
|
1225
|
+
...failure ? { error: failure } : {}
|
|
1226
|
+
};
|
|
1227
|
+
} else if (failure) {
|
|
1228
|
+
outcome = action === "fail" || event.attempt >= maxAttempts ? { kind: "failed", error: failure } : {
|
|
1229
|
+
kind: "released",
|
|
1230
|
+
delaySeconds: resolveRetryDelaySeconds(definition, event.attempt),
|
|
1231
|
+
error: failure
|
|
1232
|
+
};
|
|
1233
|
+
} else {
|
|
1234
|
+
outcome = { kind: "processed" };
|
|
1235
|
+
}
|
|
1236
|
+
if (outcome.kind === "released") {
|
|
1237
|
+
await driver.release(reserved, typeof outcome.delaySeconds === "number" ? { delaySeconds: outcome.delaySeconds } : void 0);
|
|
1238
|
+
if (options.onJobReleased) {
|
|
1239
|
+
await runWorkerHook(envelope.name, "onJobReleased", async () => {
|
|
1240
|
+
await options.onJobReleased?.({
|
|
1241
|
+
...event,
|
|
1242
|
+
...typeof outcome.delaySeconds === "number" ? { delaySeconds: outcome.delaySeconds } : {},
|
|
1243
|
+
...outcome.error ? { error: outcome.error } : {}
|
|
1213
1244
|
});
|
|
1214
|
-
}
|
|
1215
|
-
return {
|
|
1216
|
-
kind: "released",
|
|
1217
|
-
...typeof requestedReleaseDelay === "number" ? { delaySeconds: requestedReleaseDelay } : {}
|
|
1218
|
-
};
|
|
1245
|
+
});
|
|
1219
1246
|
}
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1247
|
+
} else if (outcome.kind === "failed") {
|
|
1248
|
+
await queueRuntimeInternals.getQueueRuntimeState().failedJobStore?.persistFailedJob(reserved, outcome.error);
|
|
1249
|
+
await driver.delete(reserved);
|
|
1250
|
+
await queueRuntimeInternals.executeRegisteredQueueJobFailedHook(envelope, outcome.error, { maxAttempts });
|
|
1251
|
+
if (options.onJobFailed) {
|
|
1252
|
+
await runWorkerHook(envelope.name, "onJobFailed", async () => {
|
|
1253
|
+
await options.onJobFailed?.({ ...event, error: outcome.error });
|
|
1226
1254
|
});
|
|
1227
|
-
if (options.onJobFailed) {
|
|
1228
|
-
await runWorkerHook(envelope.name, "onJobFailed", async () => {
|
|
1229
|
-
await options.onJobFailed?.({
|
|
1230
|
-
...event,
|
|
1231
|
-
error: failure
|
|
1232
|
-
});
|
|
1233
|
-
});
|
|
1234
|
-
}
|
|
1235
|
-
return {
|
|
1236
|
-
kind: "failed",
|
|
1237
|
-
error: failure
|
|
1238
|
-
};
|
|
1239
1255
|
}
|
|
1256
|
+
} else {
|
|
1240
1257
|
await driver.acknowledge(reserved);
|
|
1241
1258
|
if (options.onJobProcessed) {
|
|
1242
1259
|
await runWorkerHook(envelope.name, "onJobProcessed", async () => {
|
|
1243
1260
|
await options.onJobProcessed?.(event);
|
|
1244
1261
|
});
|
|
1245
1262
|
}
|
|
1246
|
-
return { kind: "processed" };
|
|
1247
|
-
} catch (error) {
|
|
1248
|
-
const resolvedError = error instanceof Error ? error : new Error(String(error));
|
|
1249
|
-
const failure = resolvedError instanceof QueueWorkerTimeoutError ? resolvedError : requestedFailure ?? resolvedError;
|
|
1250
|
-
if (resolvedError instanceof QueueWorkerTimeoutError) {
|
|
1251
|
-
await persistFailedQueueJob(reserved, failure);
|
|
1252
|
-
await driver.delete(reserved);
|
|
1253
|
-
await queueRuntimeInternals.executeRegisteredQueueJobFailedHook(envelope, failure, {
|
|
1254
|
-
maxAttempts
|
|
1255
|
-
});
|
|
1256
|
-
if (options.onJobFailed) {
|
|
1257
|
-
await runWorkerHook(envelope.name, "onJobFailed", async () => {
|
|
1258
|
-
await options.onJobFailed?.({
|
|
1259
|
-
...event,
|
|
1260
|
-
error: failure
|
|
1261
|
-
});
|
|
1262
|
-
});
|
|
1263
|
-
}
|
|
1264
|
-
return {
|
|
1265
|
-
kind: "failed",
|
|
1266
|
-
error: failure
|
|
1267
|
-
};
|
|
1268
|
-
}
|
|
1269
|
-
if (action === "release") {
|
|
1270
|
-
await driver.release(reserved, typeof requestedReleaseDelay === "number" ? { delaySeconds: requestedReleaseDelay } : void 0);
|
|
1271
|
-
if (options.onJobReleased) {
|
|
1272
|
-
await runWorkerHook(envelope.name, "onJobReleased", async () => {
|
|
1273
|
-
await options.onJobReleased?.({
|
|
1274
|
-
...event,
|
|
1275
|
-
...typeof requestedReleaseDelay === "number" ? { delaySeconds: requestedReleaseDelay } : {},
|
|
1276
|
-
error: failure
|
|
1277
|
-
});
|
|
1278
|
-
});
|
|
1279
|
-
}
|
|
1280
|
-
return {
|
|
1281
|
-
kind: "released",
|
|
1282
|
-
...typeof requestedReleaseDelay === "number" ? { delaySeconds: requestedReleaseDelay } : {},
|
|
1283
|
-
error: failure
|
|
1284
|
-
};
|
|
1285
|
-
}
|
|
1286
|
-
if (action === "fail" || event.attempt >= maxAttempts) {
|
|
1287
|
-
await persistFailedQueueJob(reserved, failure);
|
|
1288
|
-
await driver.delete(reserved);
|
|
1289
|
-
await queueRuntimeInternals.executeRegisteredQueueJobFailedHook(envelope, failure, {
|
|
1290
|
-
maxAttempts
|
|
1291
|
-
});
|
|
1292
|
-
if (options.onJobFailed) {
|
|
1293
|
-
await runWorkerHook(envelope.name, "onJobFailed", async () => {
|
|
1294
|
-
await options.onJobFailed?.({
|
|
1295
|
-
...event,
|
|
1296
|
-
error: failure
|
|
1297
|
-
});
|
|
1298
|
-
});
|
|
1299
|
-
}
|
|
1300
|
-
return {
|
|
1301
|
-
kind: "failed",
|
|
1302
|
-
error: failure
|
|
1303
|
-
};
|
|
1304
|
-
}
|
|
1305
|
-
const delaySeconds = resolveRetryDelaySeconds(definition, event.attempt);
|
|
1306
|
-
await driver.release(reserved, typeof delaySeconds === "number" ? { delaySeconds } : void 0);
|
|
1307
|
-
if (options.onJobReleased) {
|
|
1308
|
-
await runWorkerHook(envelope.name, "onJobReleased", async () => {
|
|
1309
|
-
await options.onJobReleased?.({
|
|
1310
|
-
...event,
|
|
1311
|
-
...typeof delaySeconds === "number" ? { delaySeconds } : {},
|
|
1312
|
-
error: failure
|
|
1313
|
-
});
|
|
1314
|
-
});
|
|
1315
|
-
}
|
|
1316
|
-
return {
|
|
1317
|
-
kind: "released",
|
|
1318
|
-
...typeof delaySeconds === "number" ? { delaySeconds } : {},
|
|
1319
|
-
error: failure
|
|
1320
|
-
};
|
|
1321
1263
|
}
|
|
1264
|
+
return outcome;
|
|
1322
1265
|
}
|
|
1323
1266
|
function resolveWorkerStopReason(options, state) {
|
|
1324
1267
|
const now = Date.now();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@holo-js/queue",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.17",
|
|
4
4
|
"description": "Holo-JS Framework - queue contracts and config helpers",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
"test": "vitest --run"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@holo-js/config": "^0.3.
|
|
32
|
-
"@holo-js/kernel": "^0.3.
|
|
31
|
+
"@holo-js/config": "^0.3.17",
|
|
32
|
+
"@holo-js/kernel": "^0.3.17"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@types/node": "^22.10.2",
|