lifecycleion 0.0.20 → 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 (72) 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 -10
  19. package/dist/lib/http-client-mock/index.cjs.map +1 -1
  20. package/dist/lib/http-client-mock/index.d.cts +50 -3
  21. package/dist/lib/http-client-mock/index.d.ts +50 -3
  22. package/dist/lib/http-client-mock/index.js +71 -10
  23. package/dist/lib/http-client-mock/index.js.map +1 -1
  24. package/dist/lib/http-client-node/index.cjs +98 -19
  25. package/dist/lib/http-client-node/index.cjs.map +1 -1
  26. package/dist/lib/http-client-node/index.d.cts +2 -2
  27. package/dist/lib/http-client-node/index.d.ts +2 -2
  28. package/dist/lib/http-client-node/index.js +98 -19
  29. package/dist/lib/http-client-node/index.js.map +1 -1
  30. package/dist/lib/http-client-xhr/index.cjs.map +1 -1
  31. package/dist/lib/http-client-xhr/index.d.cts +2 -2
  32. package/dist/lib/http-client-xhr/index.d.ts +2 -2
  33. package/dist/lib/http-client-xhr/index.js.map +1 -1
  34. package/dist/lib/lifecycle-manager/index.cjs +199 -13
  35. package/dist/lib/lifecycle-manager/index.cjs.map +1 -1
  36. package/dist/lib/lifecycle-manager/index.js +199 -13
  37. package/dist/lib/lifecycle-manager/index.js.map +1 -1
  38. package/dist/lib/logger/index.cjs +203 -21
  39. package/dist/lib/logger/index.cjs.map +1 -1
  40. package/dist/lib/logger/index.d.cts +5 -1
  41. package/dist/lib/logger/index.d.ts +5 -1
  42. package/dist/lib/logger/index.js +203 -21
  43. package/dist/lib/logger/index.js.map +1 -1
  44. package/dist/lib/lru-cache/index.cjs +195 -9
  45. package/dist/lib/lru-cache/index.cjs.map +1 -1
  46. package/dist/lib/lru-cache/index.js +195 -9
  47. package/dist/lib/lru-cache/index.js.map +1 -1
  48. package/dist/lib/process-signal-manager.cjs +199 -13
  49. package/dist/lib/process-signal-manager.cjs.map +1 -1
  50. package/dist/lib/process-signal-manager.js +199 -13
  51. package/dist/lib/process-signal-manager.js.map +1 -1
  52. package/dist/lib/promise-protected-resolver.cjs +195 -9
  53. package/dist/lib/promise-protected-resolver.cjs.map +1 -1
  54. package/dist/lib/promise-protected-resolver.js +195 -9
  55. package/dist/lib/promise-protected-resolver.js.map +1 -1
  56. package/dist/lib/retry-utils/index.cjs +195 -9
  57. package/dist/lib/retry-utils/index.cjs.map +1 -1
  58. package/dist/lib/retry-utils/index.js +195 -9
  59. package/dist/lib/retry-utils/index.js.map +1 -1
  60. package/dist/lib/safe-handle-callback.cjs +196 -18
  61. package/dist/lib/safe-handle-callback.cjs.map +1 -1
  62. package/dist/lib/safe-handle-callback.d.cts +14 -4
  63. package/dist/lib/safe-handle-callback.d.ts +14 -4
  64. package/dist/lib/safe-handle-callback.js +196 -18
  65. package/dist/lib/safe-handle-callback.js.map +1 -1
  66. package/dist/lib/single-event-observer.cjs +195 -9
  67. package/dist/lib/single-event-observer.cjs.map +1 -1
  68. package/dist/lib/single-event-observer.js +195 -9
  69. package/dist/lib/single-event-observer.js.map +1 -1
  70. package/dist/{types-6G59m8U9.d.cts → types-BFvpJPMt.d.cts} +71 -10
  71. package/dist/{types-CG10j6Lc.d.ts → types-BONtIhQ5.d.ts} +71 -10
  72. package/package.json +12 -2
@@ -757,18 +757,204 @@ function isFunction(value) {
757
757
  return typeof value === "function" || value instanceof Function;
758
758
  }
759
759
 
760
+ // src/lib/global-event-target.ts
761
+ var GLOBAL_KEY = "__lifecycleion_global_event_target__";
762
+ var METHOD_NAMES = [
763
+ "addEventListener",
764
+ "removeEventListener",
765
+ "dispatchEvent"
766
+ ];
767
+ var g = globalThis;
768
+ function getState() {
769
+ const value = readGlobal(GLOBAL_KEY);
770
+ return value === UNREADABLE ? void 0 : asUsableState(value);
771
+ }
772
+ function asUsableState(value) {
773
+ if (typeof value !== "object" || value === null) {
774
+ return void 0;
775
+ }
776
+ return asUsableTarget(readMember(value, "target")) === null ? void 0 : value;
777
+ }
778
+ function asUsableTarget(value) {
779
+ if (typeof value !== "object" || value === null) {
780
+ return null;
781
+ }
782
+ for (const name of METHOD_NAMES) {
783
+ if (typeof readMember(value, name) !== "function") {
784
+ return null;
785
+ }
786
+ }
787
+ return value;
788
+ }
789
+ function bindTargetMethods(target) {
790
+ const bound = {};
791
+ for (const name of METHOD_NAMES) {
792
+ const method = readMember(target, name);
793
+ if (typeof method !== "function") {
794
+ return null;
795
+ }
796
+ let boundMethod;
797
+ try {
798
+ boundMethod = method.bind(target);
799
+ } catch {
800
+ return null;
801
+ }
802
+ if (typeof boundMethod !== "function") {
803
+ return null;
804
+ }
805
+ bound[name] = boundMethod;
806
+ }
807
+ return bound;
808
+ }
809
+ function isStateInstalled(state) {
810
+ return state !== void 0 && readMember(state, "isInstalled") === true;
811
+ }
812
+ function readStateTarget(state) {
813
+ if (state === void 0) {
814
+ return null;
815
+ }
816
+ return asUsableTarget(readMember(state, "target"));
817
+ }
818
+ var UNREADABLE = /* @__PURE__ */ Symbol("lifecycleion.unreadable");
819
+ function readGlobal(name) {
820
+ try {
821
+ return g[name];
822
+ } catch {
823
+ return UNREADABLE;
824
+ }
825
+ }
826
+ function readMember(source, key) {
827
+ try {
828
+ return source[key];
829
+ } catch {
830
+ return UNREADABLE;
831
+ }
832
+ }
833
+ function probeMember(name) {
834
+ const value = readGlobal(name);
835
+ if (value === UNREADABLE) {
836
+ return "hostile";
837
+ }
838
+ if (typeof value === "function") {
839
+ return "usable";
840
+ }
841
+ return value === void 0 ? "absent" : "occupied";
842
+ }
843
+ function canDefineProperty(key) {
844
+ const descriptor = Object.getOwnPropertyDescriptor(g, key);
845
+ if (descriptor === void 0) {
846
+ return Object.isExtensible(g);
847
+ }
848
+ return descriptor.configurable === true;
849
+ }
850
+ function installGlobalEventTarget() {
851
+ const members = METHOD_NAMES.map((name) => probeMember(name));
852
+ if (members.every((member) => member === "usable")) {
853
+ return isStateInstalled(getState()) ? "already-installed" : "native";
854
+ }
855
+ if (members.some((member) => member !== "absent")) {
856
+ return "partial";
857
+ }
858
+ const eventTargetConstructor = readGlobal("EventTarget");
859
+ if (typeof eventTargetConstructor !== "function") {
860
+ return "unsupported";
861
+ }
862
+ const isDefinable = [...METHOD_NAMES, GLOBAL_KEY].every(
863
+ (key) => canDefineProperty(key)
864
+ );
865
+ if (!isDefinable) {
866
+ return "blocked";
867
+ }
868
+ const existingState = getState();
869
+ const defined = [];
870
+ const priorStateDescriptor = Object.getOwnPropertyDescriptor(g, GLOBAL_KEY);
871
+ const rollback = () => {
872
+ for (const key of defined) {
873
+ if (key === GLOBAL_KEY && priorStateDescriptor !== void 0) {
874
+ try {
875
+ Object.defineProperty(g, GLOBAL_KEY, priorStateDescriptor);
876
+ } catch {
877
+ }
878
+ continue;
879
+ }
880
+ try {
881
+ Reflect.deleteProperty(g, key);
882
+ } catch {
883
+ }
884
+ }
885
+ };
886
+ const reusableTarget = readStateTarget(existingState);
887
+ const reusableMethods = reusableTarget === null ? null : bindTargetMethods(reusableTarget);
888
+ let state;
889
+ let methods;
890
+ try {
891
+ if (existingState === void 0 || reusableMethods === null) {
892
+ let target;
893
+ try {
894
+ target = new eventTargetConstructor();
895
+ } catch {
896
+ return "unsupported";
897
+ }
898
+ const freshMethods = bindTargetMethods(target);
899
+ if (freshMethods === null) {
900
+ return "unsupported";
901
+ }
902
+ state = { target, isInstalled: false };
903
+ methods = freshMethods;
904
+ Object.defineProperty(g, GLOBAL_KEY, {
905
+ value: state,
906
+ enumerable: false,
907
+ writable: false,
908
+ configurable: true
909
+ });
910
+ defined.push(GLOBAL_KEY);
911
+ } else {
912
+ state = existingState;
913
+ methods = reusableMethods;
914
+ }
915
+ for (const name of METHOD_NAMES) {
916
+ Object.defineProperty(g, name, {
917
+ value: methods[name],
918
+ enumerable: false,
919
+ writable: true,
920
+ configurable: true
921
+ });
922
+ defined.push(name);
923
+ }
924
+ if (readMember(state, "isInstalled") !== true) {
925
+ state.isInstalled = true;
926
+ }
927
+ } catch {
928
+ rollback();
929
+ return "blocked";
930
+ }
931
+ return "installed";
932
+ }
933
+ function isGlobalEventTargetAvailable() {
934
+ return METHOD_NAMES.every((name) => probeMember(name) === "usable") && probeMember("ErrorEvent") === "usable";
935
+ }
936
+
760
937
  // src/lib/safe-handle-callback.ts
938
+ installGlobalEventTarget();
939
+ function reportCallbackError(callbackName, error) {
940
+ installGlobalEventTarget();
941
+ if (!isGlobalEventTargetAvailable()) {
942
+ return;
943
+ }
944
+ try {
945
+ globalThis.dispatchEvent(
946
+ new ErrorEvent("reportError", {
947
+ error: new Error(
948
+ `Error in a callback ${callbackName}: ${DOUBLE_EOL}${errorToString(error)}`
949
+ )
950
+ })
951
+ );
952
+ } catch {
953
+ }
954
+ }
761
955
  function safeHandleCallback(callbackName, callback, ...args) {
762
956
  const handleError = (error) => {
763
- if (typeof globalThis.dispatchEvent === "function") {
764
- globalThis.dispatchEvent(
765
- new ErrorEvent("reportError", {
766
- error: new Error(
767
- `Error in a callback ${callbackName}: ${DOUBLE_EOL}${errorToString(error)}`
768
- )
769
- })
770
- );
771
- }
957
+ reportCallbackError(callbackName, error);
772
958
  };
773
959
  if (isFunction(callback)) {
774
960
  try {
@@ -789,15 +975,7 @@ function safeHandleCallback(callbackName, callback, ...args) {
789
975
  }
790
976
  async function safeHandleCallbackAndWait(callbackName, callback, ...args) {
791
977
  const handleError = (error) => {
792
- if (typeof globalThis.dispatchEvent === "function") {
793
- globalThis.dispatchEvent(
794
- new ErrorEvent("reportError", {
795
- error: new Error(
796
- `Error in a callback ${callbackName}: ${DOUBLE_EOL}${errorToString(error)}`
797
- )
798
- })
799
- );
800
- }
978
+ reportCallbackError(callbackName, error);
801
979
  return { success: false, error };
802
980
  };
803
981
  if (isFunction(callback)) {
@@ -2344,6 +2522,7 @@ var Logger = class _Logger extends EventEmitter {
2344
2522
  if (this._reportErrorListenerRegistered) {
2345
2523
  return "already_registered";
2346
2524
  }
2525
+ installGlobalEventTarget();
2347
2526
  if (!this.isReportErrorAvailable()) {
2348
2527
  return "not_available";
2349
2528
  }
@@ -2386,13 +2565,16 @@ var Logger = class _Logger extends EventEmitter {
2386
2565
  return this._reportErrorListenerRegistered;
2387
2566
  }
2388
2567
  /**
2389
- * Check if the global event primitives used for `reportError` dispatch are available.
2568
+ * Check if the global event primitives used for `reportError` dispatch are available:
2569
+ * the `EventTarget` methods on `globalThis` plus the `ErrorEvent` constructor.
2570
+ *
2571
+ * On Node.js the event methods are supplied by Lifecycleion's `global-event-target`
2572
+ * polyfill, which is installed when this module is imported.
2390
2573
  *
2391
2574
  * @returns 'true' if the required global event primitives are available, 'false' otherwise.
2392
2575
  */
2393
2576
  isReportErrorAvailable() {
2394
- const globalRecord = globalThis;
2395
- return typeof globalRecord.addEventListener === "function" && typeof globalRecord.removeEventListener === "function" && typeof globalRecord.dispatchEvent === "function" && typeof globalRecord.ErrorEvent === "function";
2577
+ return isGlobalEventTargetAvailable();
2396
2578
  }
2397
2579
  /**
2398
2580
  * Add a sink to the logger