@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.
Files changed (2) hide show
  1. package/dist/index.mjs +51 -108
  2. 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
- await closeQueueDrivers(state.drivers.values());
882
- resetQueueRuntimeState(state);
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
- if (action === "release") {
1206
- await driver.release(reserved, typeof requestedReleaseDelay === "number" ? { delaySeconds: requestedReleaseDelay } : void 0);
1207
- if (options.onJobReleased) {
1208
- await runWorkerHook(envelope.name, "onJobReleased", async () => {
1209
- await options.onJobReleased?.({
1210
- ...event,
1211
- ...typeof requestedReleaseDelay === "number" ? { delaySeconds: requestedReleaseDelay } : {}
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
- if (action === "fail") {
1221
- const failure = requestedFailure;
1222
- await persistFailedQueueJob(reserved, failure);
1223
- await driver.delete(reserved);
1224
- await queueRuntimeInternals.executeRegisteredQueueJobFailedHook(envelope, failure, {
1225
- maxAttempts
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.16",
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.16",
32
- "@holo-js/kernel": "^0.3.16"
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",