lifecycleion 0.0.19 → 0.0.21

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 (74) hide show
  1. package/README.md +39 -36
  2. package/dist/lib/event-emitter.cjs +195 -9
  3. package/dist/lib/event-emitter.cjs.map +1 -1
  4. package/dist/lib/event-emitter.js +195 -9
  5. package/dist/lib/event-emitter.js.map +1 -1
  6. package/dist/lib/global-event-target.cjs +217 -0
  7. package/dist/lib/global-event-target.cjs.map +1 -0
  8. package/dist/lib/global-event-target.d.cts +70 -0
  9. package/dist/lib/global-event-target.d.ts +70 -0
  10. package/dist/lib/global-event-target.js +189 -0
  11. package/dist/lib/global-event-target.js.map +1 -0
  12. package/dist/lib/http-client/index.cjs +554 -193
  13. package/dist/lib/http-client/index.cjs.map +1 -1
  14. package/dist/lib/http-client/index.d.cts +9 -3
  15. package/dist/lib/http-client/index.d.ts +9 -3
  16. package/dist/lib/http-client/index.js +554 -193
  17. package/dist/lib/http-client/index.js.map +1 -1
  18. package/dist/lib/http-client-mock/index.cjs +71 -24
  19. package/dist/lib/http-client-mock/index.cjs.map +1 -1
  20. package/dist/lib/http-client-mock/index.d.cts +50 -2
  21. package/dist/lib/http-client-mock/index.d.ts +50 -2
  22. package/dist/lib/http-client-mock/index.js +71 -24
  23. package/dist/lib/http-client-mock/index.js.map +1 -1
  24. package/dist/lib/http-client-node/index.cjs +135 -33
  25. package/dist/lib/http-client-node/index.cjs.map +1 -1
  26. package/dist/lib/http-client-node/index.d.cts +33 -2
  27. package/dist/lib/http-client-node/index.d.ts +33 -2
  28. package/dist/lib/http-client-node/index.js +135 -33
  29. package/dist/lib/http-client-node/index.js.map +1 -1
  30. package/dist/lib/http-client-xhr/index.cjs +0 -14
  31. package/dist/lib/http-client-xhr/index.cjs.map +1 -1
  32. package/dist/lib/http-client-xhr/index.d.cts +3 -2
  33. package/dist/lib/http-client-xhr/index.d.ts +3 -2
  34. package/dist/lib/http-client-xhr/index.js +0 -14
  35. package/dist/lib/http-client-xhr/index.js.map +1 -1
  36. package/dist/lib/lifecycle-manager/index.cjs +199 -13
  37. package/dist/lib/lifecycle-manager/index.cjs.map +1 -1
  38. package/dist/lib/lifecycle-manager/index.js +199 -13
  39. package/dist/lib/lifecycle-manager/index.js.map +1 -1
  40. package/dist/lib/logger/index.cjs +203 -21
  41. package/dist/lib/logger/index.cjs.map +1 -1
  42. package/dist/lib/logger/index.d.cts +5 -1
  43. package/dist/lib/logger/index.d.ts +5 -1
  44. package/dist/lib/logger/index.js +203 -21
  45. package/dist/lib/logger/index.js.map +1 -1
  46. package/dist/lib/lru-cache/index.cjs +195 -9
  47. package/dist/lib/lru-cache/index.cjs.map +1 -1
  48. package/dist/lib/lru-cache/index.js +195 -9
  49. package/dist/lib/lru-cache/index.js.map +1 -1
  50. package/dist/lib/process-signal-manager.cjs +199 -13
  51. package/dist/lib/process-signal-manager.cjs.map +1 -1
  52. package/dist/lib/process-signal-manager.js +199 -13
  53. package/dist/lib/process-signal-manager.js.map +1 -1
  54. package/dist/lib/promise-protected-resolver.cjs +195 -9
  55. package/dist/lib/promise-protected-resolver.cjs.map +1 -1
  56. package/dist/lib/promise-protected-resolver.js +195 -9
  57. package/dist/lib/promise-protected-resolver.js.map +1 -1
  58. package/dist/lib/retry-utils/index.cjs +195 -9
  59. package/dist/lib/retry-utils/index.cjs.map +1 -1
  60. package/dist/lib/retry-utils/index.js +195 -9
  61. package/dist/lib/retry-utils/index.js.map +1 -1
  62. package/dist/lib/safe-handle-callback.cjs +196 -18
  63. package/dist/lib/safe-handle-callback.cjs.map +1 -1
  64. package/dist/lib/safe-handle-callback.d.cts +14 -4
  65. package/dist/lib/safe-handle-callback.d.ts +14 -4
  66. package/dist/lib/safe-handle-callback.js +196 -18
  67. package/dist/lib/safe-handle-callback.js.map +1 -1
  68. package/dist/lib/single-event-observer.cjs +195 -9
  69. package/dist/lib/single-event-observer.cjs.map +1 -1
  70. package/dist/lib/single-event-observer.js +195 -9
  71. package/dist/lib/single-event-observer.js.map +1 -1
  72. package/dist/{types-CWw885iO.d.cts → types-BFvpJPMt.d.cts} +72 -11
  73. package/dist/{types-Mso0dYOS.d.ts → types-BONtIhQ5.d.ts} +72 -11
  74. package/package.json +31 -12
@@ -361,19 +361,63 @@ var CERT_ERROR_CODES = /* @__PURE__ */ new Set([
361
361
  "ERR_SSL_TLSV13_ALERT_CERTIFICATE_REQUIRED",
362
362
  "ERR_SSL_PEER_DID_NOT_RETURN_A_CERTIFICATE",
363
363
  "SELF_SIGNED_CERT_IN_CHAIN",
364
- "UNABLE_TO_GET_ISSUER_CERT_LOCALLY"
364
+ "UNABLE_TO_GET_ISSUER_CERT_LOCALLY",
365
+ "CERT_REVOKED"
365
366
  ]);
367
+ var CRL_CODE_PATTERN = /(?:^|_)CRLS?(?:_|$)/;
368
+ var TRANSPORT_ERROR_CODES = /* @__PURE__ */ new Set([
369
+ "ENOTFOUND",
370
+ "EAI_AGAIN",
371
+ "ECONNREFUSED",
372
+ "ECONNRESET",
373
+ "ECONNABORTED",
374
+ "ETIMEDOUT",
375
+ "EPIPE",
376
+ "EHOSTUNREACH",
377
+ "EHOSTDOWN",
378
+ "ENETUNREACH",
379
+ "ENETDOWN",
380
+ "EADDRNOTAVAIL"
381
+ ]);
382
+ var UNDICI_TRANSPORT_ERROR_PREFIX = "UND_ERR_";
366
383
  function isTLSCertificateError(error) {
367
- const code = error.code ?? "";
384
+ if (isTLSCertificateErrorSelf(error)) {
385
+ return true;
386
+ }
387
+ const cause = readMember(error, "cause");
388
+ return isErrorValue(cause) ? isTLSCertificateErrorSelf(cause) : false;
389
+ }
390
+ function isErrorValue(value) {
391
+ try {
392
+ return value instanceof Error;
393
+ } catch {
394
+ return false;
395
+ }
396
+ }
397
+ function isTLSCertificateErrorSelf(error) {
398
+ const rawCode = readMember(error, "code");
399
+ const code = typeof rawCode === "string" ? rawCode : "";
368
400
  if (CERT_ERROR_CODES.has(code)) {
369
401
  return true;
370
402
  }
403
+ if (CRL_CODE_PATTERN.test(code)) {
404
+ return true;
405
+ }
371
406
  if ((code.startsWith("ERR_TLS_") || code.startsWith("ERR_SSL_")) && code.includes("CERT")) {
372
407
  return true;
373
408
  }
374
- return /certificate|self signed|unable to verify|altname/i.test(
375
- error.message
376
- );
409
+ if (TRANSPORT_ERROR_CODES.has(code) || code.startsWith(UNDICI_TRANSPORT_ERROR_PREFIX)) {
410
+ return false;
411
+ }
412
+ const message = readMember(error, "message");
413
+ return typeof message === "string" ? /certificate|self signed|unable to verify|altname/i.test(message) : false;
414
+ }
415
+ function readMember(error, key) {
416
+ try {
417
+ return error[key];
418
+ } catch {
419
+ return void 0;
420
+ }
377
421
  }
378
422
 
379
423
  // src/lib/http-client/adapters/node-adapter-utils.ts
@@ -404,20 +448,6 @@ function materializeNodeRequestHeaders(headers) {
404
448
 
405
449
  // src/lib/http-client/utils.ts
406
450
  var import_qs = __toESM(require("qs"), 1);
407
-
408
- // src/lib/domain-utils/domain-utils.ts
409
- var import_tldts = require("tldts");
410
-
411
- // src/lib/domain-utils/helpers.ts
412
- var import_tr46 = require("tr46");
413
- var INTERNAL_PSEUDO_TLDS = Object.freeze(
414
- /* @__PURE__ */ new Set(["localhost", "local", "test", "internal"])
415
- );
416
-
417
- // src/lib/domain-utils/domain-utils.ts
418
- var import_tldts2 = require("tldts");
419
-
420
- // src/lib/http-client/utils.ts
421
451
  function resolveAbsoluteURL(url, baseURL) {
422
452
  if (!url) {
423
453
  return url;
@@ -507,6 +537,9 @@ var NodeAdapter = class {
507
537
  }
508
538
  httpsOptions.rejectUnauthorized = true;
509
539
  }
540
+ if (this._config.crl !== void 0) {
541
+ httpsOptions.crl = normalizeCRL(this._config.crl);
542
+ }
510
543
  if (this._config.rejectUnauthorized === false) {
511
544
  httpsOptions.rejectUnauthorized = false;
512
545
  }
@@ -515,7 +548,6 @@ var NodeAdapter = class {
515
548
  let activeResponseStream;
516
549
  let activeBufferedResponse;
517
550
  let isStreamFactoryPending = false;
518
- let uploadedBodyBytes = 0;
519
551
  let didFireUpload100 = false;
520
552
  const reportUploadProgress = (event) => {
521
553
  if (didFireUpload100) {
@@ -524,7 +556,6 @@ var NodeAdapter = class {
524
556
  if (event.progress === 1) {
525
557
  didFireUpload100 = true;
526
558
  }
527
- uploadedBodyBytes = Math.max(uploadedBodyBytes, event.loaded);
528
559
  request.onUploadProgress?.(event);
529
560
  };
530
561
  reportUploadProgress({ loaded: 0, total: 0, progress: 0 });
@@ -574,7 +605,7 @@ var NodeAdapter = class {
574
605
  return;
575
606
  }
576
607
  if (writable === null || isStreamResponseCancel(writable)) {
577
- const cancelReason = writable !== null ? writable.reason : void 0;
608
+ const cancelReason = writable !== null ? readObjectMember(writable, "reason") : void 0;
578
609
  streamAbort.abort();
579
610
  req.destroy();
580
611
  const abortErr = new Error(
@@ -746,7 +777,7 @@ var NodeAdapter = class {
746
777
  );
747
778
  });
748
779
  })().catch((error) => {
749
- reject(error instanceof Error ? error : new Error(String(error)));
780
+ reject(normalizeError(error));
750
781
  });
751
782
  });
752
783
  req.on("error", (error) => {
@@ -773,7 +804,7 @@ var NodeAdapter = class {
773
804
  );
774
805
  return;
775
806
  }
776
- const isRetryableTransportError = uploadedBodyBytes === 0;
807
+ const wasDefinitelyNotSent = isPreConnectionError(error);
777
808
  resolveAdapterResponse(
778
809
  resolve,
779
810
  req,
@@ -782,7 +813,7 @@ var NodeAdapter = class {
782
813
  {
783
814
  status: 0,
784
815
  isTransportError: true,
785
- isRetryable: isRetryableTransportError,
816
+ ...wasDefinitelyNotSent ? { wasDefinitelyNotSent: true } : {},
786
817
  headers: {},
787
818
  body: null,
788
819
  errorCause: error
@@ -873,12 +904,14 @@ var NodeAdapter = class {
873
904
  request.requestURL,
874
905
  request.headers,
875
906
  {
907
+ // No isRetryable veto: that would stop retrying an idempotent
908
+ // PUT or DELETE. Delivery is unproven rather than disproven, so
909
+ // nothing is claimed and the client's method rule decides.
876
910
  status: 0,
877
911
  isTransportError: true,
878
- isRetryable: false,
879
912
  headers: {},
880
913
  body: null,
881
- errorCause: error instanceof Error ? error : new Error(String(error))
914
+ errorCause: normalizeError(error)
882
915
  }
883
916
  );
884
917
  });
@@ -895,12 +928,14 @@ var NodeAdapter = class {
895
928
  request.requestURL,
896
929
  request.headers,
897
930
  {
931
+ // No isRetryable veto: that would stop retrying an idempotent
932
+ // PUT or DELETE. Delivery is unproven rather than disproven, so
933
+ // nothing is claimed and the client's method rule decides.
898
934
  status: 0,
899
935
  isTransportError: true,
900
- isRetryable: false,
901
936
  headers: {},
902
937
  body: null,
903
- errorCause: error instanceof Error ? error : new Error(String(error))
938
+ errorCause: normalizeError(error)
904
939
  }
905
940
  );
906
941
  });
@@ -970,7 +1005,7 @@ async function streamResponseBody(res, writable, totalBytes, onProgress) {
970
1005
  } catch (error) {
971
1006
  settle({
972
1007
  code: "stream_write_error",
973
- cause: error instanceof Error ? error : new Error(String(error))
1008
+ cause: normalizeError(error)
974
1009
  });
975
1010
  return;
976
1011
  }
@@ -1001,7 +1036,7 @@ async function streamResponseBody(res, writable, totalBytes, onProgress) {
1001
1036
  } catch (error) {
1002
1037
  settle({
1003
1038
  code: "stream_write_error",
1004
- cause: error instanceof Error ? error : new Error(String(error))
1039
+ cause: normalizeError(error)
1005
1040
  });
1006
1041
  }
1007
1042
  };
@@ -1030,6 +1065,36 @@ async function streamResponseBody(res, writable, totalBytes, onProgress) {
1030
1065
  res.on("close", onResponseClose);
1031
1066
  });
1032
1067
  }
1068
+ var PEM_CRL_HEADER = "-----BEGIN X509 CRL-----";
1069
+ var PEM_CRL_BLOCK = /-----BEGIN X509 CRL-----[\s\S]*?-----END X509 CRL-----/g;
1070
+ var RESIDUE_OUTSIDE_PEM_BLOCKS = /\S/;
1071
+ function normalizeCRL(crl) {
1072
+ if (Array.isArray(crl)) {
1073
+ return crl.flatMap((entry) => normalizeCRLEntry(entry));
1074
+ }
1075
+ return normalizeCRLEntry(crl);
1076
+ }
1077
+ function normalizeCRLEntry(entry) {
1078
+ if (typeof entry === "string") {
1079
+ return splitCRLString(entry);
1080
+ }
1081
+ const text = entry.toString("latin1");
1082
+ if (!text.includes(PEM_CRL_HEADER)) {
1083
+ return entry;
1084
+ }
1085
+ const split = splitCRLString(text);
1086
+ return Array.isArray(split) ? split : entry;
1087
+ }
1088
+ function splitCRLString(crl) {
1089
+ const blocks = crl.match(PEM_CRL_BLOCK) ?? [];
1090
+ const residue = crl.replace(PEM_CRL_BLOCK, "");
1091
+ if (RESIDUE_OUTSIDE_PEM_BLOCKS.test(residue)) {
1092
+ throw new Error(
1093
+ "NodeAdapter: the `crl` value contains content outside any complete -----BEGIN/END X509 CRL----- block. Only PEM CRL blocks separated by whitespace are accepted, because a truncated CRL and a line of commentary are indistinguishable \u2014 accepting the second would mean silently dropping the first and enforcing an incomplete revocation set. Common causes: a partial download, a clipped or mistyped delimiter, or decoded text from `openssl ... -text`, which must be stripped before the bundle is passed here."
1094
+ );
1095
+ }
1096
+ return blocks.length > 1 ? blocks : crl;
1097
+ }
1033
1098
  function normalizeResponseHeaders(headers) {
1034
1099
  const result = {};
1035
1100
  for (const [key, value] of Object.entries(headers)) {
@@ -1077,6 +1142,16 @@ function removeWritableListener(writable, event, listener) {
1077
1142
  const removable = writable;
1078
1143
  removable.off?.(event, listener);
1079
1144
  }
1145
+ var PRE_CONNECTION_ERROR_CODES = /* @__PURE__ */ new Set([
1146
+ "ECONNREFUSED",
1147
+ "ENOTFOUND",
1148
+ "EAI_AGAIN",
1149
+ "EADDRNOTAVAIL"
1150
+ ]);
1151
+ function isPreConnectionError(error) {
1152
+ const code = readObjectMember(error, "code");
1153
+ return typeof code === "string" && PRE_CONNECTION_ERROR_CODES.has(code);
1154
+ }
1080
1155
  function makeResponseStreamError(message, cause) {
1081
1156
  const error = new Error(message);
1082
1157
  if (cause) {
@@ -1085,7 +1160,7 @@ function makeResponseStreamError(message, cause) {
1085
1160
  return error;
1086
1161
  }
1087
1162
  function markStreamFactoryError(error, req, fallbackHeaders) {
1088
- const normalized = error instanceof Error ? error : new Error(String(error));
1163
+ const normalized = normalizeError(error);
1089
1164
  const tagged = normalized;
1090
1165
  tagged[NON_RETRYABLE_HTTP_CLIENT_CALLBACK_ERROR_FLAG] = true;
1091
1166
  Object.assign(normalized, { [STREAM_FACTORY_ERROR_FLAG]: true });
@@ -1109,7 +1184,34 @@ function markResponseStreamAbortError(error, req, fallbackHeaders, status, heade
1109
1184
  return error;
1110
1185
  }
1111
1186
  function isStreamResponseCancel(value) {
1112
- return value !== null && typeof value === "object" && value.cancel === true;
1187
+ return readObjectMember(value, "cancel") === true;
1188
+ }
1189
+ function readObjectMember(source, key) {
1190
+ if (source === null || typeof source !== "object" && typeof source !== "function") {
1191
+ return void 0;
1192
+ }
1193
+ try {
1194
+ return source[key];
1195
+ } catch {
1196
+ return void 0;
1197
+ }
1198
+ }
1199
+ function isErrorValue2(value) {
1200
+ try {
1201
+ return value instanceof Error;
1202
+ } catch {
1203
+ return false;
1204
+ }
1205
+ }
1206
+ function normalizeError(value) {
1207
+ if (isErrorValue2(value)) {
1208
+ return value;
1209
+ }
1210
+ try {
1211
+ return new Error(String(value));
1212
+ } catch {
1213
+ return new Error("Unknown error");
1214
+ }
1113
1215
  }
1114
1216
  // Annotate the CommonJS export names for ESM import in node:
1115
1217
  0 && (module.exports = {