@adviser/cement 0.4.58 → 0.4.60

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 (131) hide show
  1. package/cjs/base-sys-abstraction.d.ts +1 -1
  2. package/cjs/base-sys-abstraction.d.ts.map +1 -1
  3. package/cjs/future.cjs +2 -0
  4. package/cjs/future.cjs.map +1 -1
  5. package/cjs/future.d.ts +1 -0
  6. package/cjs/future.d.ts.map +1 -1
  7. package/cjs/future.test.cjs +5 -0
  8. package/cjs/future.test.cjs.map +1 -1
  9. package/cjs/on-func.test.cjs +1 -1
  10. package/cjs/on-func.test.cjs.map +1 -1
  11. package/cjs/poller.cjs +107 -18
  12. package/cjs/poller.cjs.map +1 -1
  13. package/cjs/poller.d.ts +27 -5
  14. package/cjs/poller.d.ts.map +1 -1
  15. package/cjs/poller.test.cjs +46 -2
  16. package/cjs/poller.test.cjs.map +1 -1
  17. package/cjs/timeouted.cjs +119 -0
  18. package/cjs/timeouted.cjs.map +1 -0
  19. package/cjs/timeouted.d.ts +45 -0
  20. package/cjs/timeouted.d.ts.map +1 -0
  21. package/cjs/timeouted.test.cjs +581 -0
  22. package/cjs/timeouted.test.cjs.map +1 -0
  23. package/cjs/timeouted.test.d.ts +2 -0
  24. package/cjs/timeouted.test.d.ts.map +1 -0
  25. package/cjs/utils/promise-sleep.cjs +27 -26
  26. package/cjs/utils/promise-sleep.cjs.map +1 -1
  27. package/cjs/utils/promise-sleep.d.ts +28 -2
  28. package/cjs/utils/promise-sleep.d.ts.map +1 -1
  29. package/cjs/utils/promise-sleep.test.cjs +13 -13
  30. package/cjs/utils/promise-sleep.test.cjs.map +1 -1
  31. package/cjs/version.cjs +1 -1
  32. package/deno.json +1 -1
  33. package/esm/base-sys-abstraction.d.ts +1 -1
  34. package/esm/base-sys-abstraction.d.ts.map +1 -1
  35. package/esm/future.d.ts +1 -0
  36. package/esm/future.d.ts.map +1 -1
  37. package/esm/future.js +2 -0
  38. package/esm/future.js.map +1 -1
  39. package/esm/future.test.js +5 -0
  40. package/esm/future.test.js.map +1 -1
  41. package/esm/on-func.test.js +1 -1
  42. package/esm/on-func.test.js.map +1 -1
  43. package/esm/poller.d.ts +27 -5
  44. package/esm/poller.d.ts.map +1 -1
  45. package/esm/poller.js +107 -18
  46. package/esm/poller.js.map +1 -1
  47. package/esm/poller.test.js +46 -2
  48. package/esm/poller.test.js.map +1 -1
  49. package/esm/timeouted.d.ts +45 -0
  50. package/esm/timeouted.d.ts.map +1 -0
  51. package/esm/timeouted.js +110 -0
  52. package/esm/timeouted.js.map +1 -0
  53. package/esm/timeouted.test.d.ts +2 -0
  54. package/esm/timeouted.test.d.ts.map +1 -0
  55. package/esm/timeouted.test.js +579 -0
  56. package/esm/timeouted.test.js.map +1 -0
  57. package/esm/utils/promise-sleep.d.ts +28 -2
  58. package/esm/utils/promise-sleep.d.ts.map +1 -1
  59. package/esm/utils/promise-sleep.js +27 -26
  60. package/esm/utils/promise-sleep.js.map +1 -1
  61. package/esm/utils/promise-sleep.test.js +13 -13
  62. package/esm/utils/promise-sleep.test.js.map +1 -1
  63. package/esm/version.js +1 -1
  64. package/package.json +8 -8
  65. package/src/base-sys-abstraction.ts +1 -1
  66. package/src/future.ts +5 -0
  67. package/src/poller.ts +159 -23
  68. package/src/timeouted.ts +186 -0
  69. package/src/utils/promise-sleep.ts +61 -31
  70. package/ts/cjs/base-sys-abstraction.d.ts +1 -1
  71. package/ts/cjs/base-sys-abstraction.d.ts.map +1 -1
  72. package/ts/cjs/future.d.ts +1 -0
  73. package/ts/cjs/future.d.ts.map +1 -1
  74. package/ts/cjs/future.js +2 -0
  75. package/ts/cjs/future.js.map +1 -1
  76. package/ts/cjs/future.test.js +5 -0
  77. package/ts/cjs/future.test.js.map +1 -1
  78. package/ts/cjs/on-func.test.js +1 -1
  79. package/ts/cjs/on-func.test.js.map +1 -1
  80. package/ts/cjs/poller.d.ts +27 -5
  81. package/ts/cjs/poller.d.ts.map +1 -1
  82. package/ts/cjs/poller.js +107 -18
  83. package/ts/cjs/poller.js.map +1 -1
  84. package/ts/cjs/poller.test.js +46 -2
  85. package/ts/cjs/poller.test.js.map +1 -1
  86. package/ts/cjs/timeouted.d.ts +45 -0
  87. package/ts/cjs/timeouted.d.ts.map +1 -0
  88. package/ts/cjs/timeouted.js +119 -0
  89. package/ts/cjs/timeouted.js.map +1 -0
  90. package/ts/cjs/timeouted.test.d.ts +2 -0
  91. package/ts/cjs/timeouted.test.d.ts.map +1 -0
  92. package/ts/cjs/timeouted.test.js +581 -0
  93. package/ts/cjs/timeouted.test.js.map +1 -0
  94. package/ts/cjs/utils/promise-sleep.d.ts +28 -2
  95. package/ts/cjs/utils/promise-sleep.d.ts.map +1 -1
  96. package/ts/cjs/utils/promise-sleep.js +27 -26
  97. package/ts/cjs/utils/promise-sleep.js.map +1 -1
  98. package/ts/cjs/utils/promise-sleep.test.js +13 -13
  99. package/ts/cjs/utils/promise-sleep.test.js.map +1 -1
  100. package/ts/cjs/version.js +1 -1
  101. package/ts/esm/base-sys-abstraction.d.ts +1 -1
  102. package/ts/esm/base-sys-abstraction.d.ts.map +1 -1
  103. package/ts/esm/future.d.ts +1 -0
  104. package/ts/esm/future.d.ts.map +1 -1
  105. package/ts/esm/future.js +2 -0
  106. package/ts/esm/future.js.map +1 -1
  107. package/ts/esm/future.test.js +5 -0
  108. package/ts/esm/future.test.js.map +1 -1
  109. package/ts/esm/on-func.test.js +1 -1
  110. package/ts/esm/on-func.test.js.map +1 -1
  111. package/ts/esm/poller.d.ts +27 -5
  112. package/ts/esm/poller.d.ts.map +1 -1
  113. package/ts/esm/poller.js +107 -18
  114. package/ts/esm/poller.js.map +1 -1
  115. package/ts/esm/poller.test.js +46 -2
  116. package/ts/esm/poller.test.js.map +1 -1
  117. package/ts/esm/timeouted.d.ts +45 -0
  118. package/ts/esm/timeouted.d.ts.map +1 -0
  119. package/ts/esm/timeouted.js +110 -0
  120. package/ts/esm/timeouted.js.map +1 -0
  121. package/ts/esm/timeouted.test.d.ts +2 -0
  122. package/ts/esm/timeouted.test.d.ts.map +1 -0
  123. package/ts/esm/timeouted.test.js +579 -0
  124. package/ts/esm/timeouted.test.js.map +1 -0
  125. package/ts/esm/utils/promise-sleep.d.ts +28 -2
  126. package/ts/esm/utils/promise-sleep.d.ts.map +1 -1
  127. package/ts/esm/utils/promise-sleep.js +27 -26
  128. package/ts/esm/utils/promise-sleep.js.map +1 -1
  129. package/ts/esm/utils/promise-sleep.test.js +13 -13
  130. package/ts/esm/utils/promise-sleep.test.js.map +1 -1
  131. package/ts/esm/version.js +1 -1
@@ -0,0 +1,186 @@
1
+ import { Future } from "./future.js";
2
+ import { isPromise } from "./is-promise.js";
3
+ import { sleep } from "./utils/promise-sleep.js";
4
+
5
+ export interface PurTimeoutResultSuccess<T> {
6
+ readonly state: "success";
7
+ readonly value: T;
8
+ }
9
+
10
+ export interface PurTimeoutResultTimeout {
11
+ readonly state: "timeout";
12
+ }
13
+ export interface PurTimeoutResultAborted {
14
+ readonly state: "aborted";
15
+ readonly reason: unknown;
16
+ }
17
+ export interface PurTimeoutResultError {
18
+ readonly state: "error";
19
+ readonly error: Error;
20
+ }
21
+
22
+ export interface TimeoutState<CTX> {
23
+ readonly duration: number;
24
+ readonly ctx: CTX;
25
+ }
26
+
27
+ type PurTimeoutResult<T> = PurTimeoutResultSuccess<T> | PurTimeoutResultTimeout | PurTimeoutResultAborted | PurTimeoutResultError;
28
+
29
+ export type TimeoutResultSuccess<T, CTX = unknown> = PurTimeoutResultSuccess<T> & TimeoutState<CTX>;
30
+ export type TimeoutResultTimeout<CTX = unknown> = PurTimeoutResultTimeout & TimeoutState<CTX>;
31
+ export type TimeoutResultAborted<CTX = unknown> = PurTimeoutResultAborted & TimeoutState<CTX>;
32
+ export type TimeoutResultError<CTX = unknown> = PurTimeoutResultError & TimeoutState<CTX>;
33
+
34
+ export type TimeoutResult<T, CTX = unknown> =
35
+ | TimeoutResultSuccess<T, CTX>
36
+ | TimeoutResultTimeout<CTX>
37
+ | TimeoutResultAborted<CTX>
38
+ | TimeoutResultError<CTX>;
39
+
40
+ export type ActionFunc<T> = (controller: AbortController) => Promise<T>;
41
+
42
+ // Action item in arrays - can be function or promise
43
+ export type ActionItem<T> = ActionFunc<T> | Promise<T>;
44
+
45
+ // Main action type - function, promise, or mixed array
46
+ export type TimeoutAction<T> = ActionItem<T>;
47
+
48
+ // Configuration options
49
+ export interface TimeoutActionOptions<CTX> {
50
+ readonly timeout: number;
51
+ readonly signal: AbortSignal;
52
+ readonly controller: AbortController;
53
+ readonly ctx: CTX;
54
+ onTimeout: () => void;
55
+ onAbort: (reason: unknown) => void;
56
+ onError: (error: Error) => void;
57
+ onAbortAction: (reason: unknown) => void;
58
+ }
59
+
60
+ // ============================================================================
61
+ // TYPE GUARDS
62
+ // ============================================================================
63
+
64
+ export function isSuccess<T>(result: TimeoutResult<T>): result is TimeoutResultSuccess<T> {
65
+ return result.state === "success";
66
+ }
67
+
68
+ export function isTimeout<T>(result: TimeoutResult<T>): result is TimeoutResultTimeout<T> {
69
+ return result.state === "timeout";
70
+ }
71
+
72
+ export function isAborted<T>(result: TimeoutResult<T>): result is TimeoutResultAborted<T> {
73
+ return result.state === "aborted";
74
+ }
75
+
76
+ export function isError<T>(result: TimeoutResult<T>): result is TimeoutResultError<T> {
77
+ return result.state === "error";
78
+ }
79
+
80
+ export function unwrap<T>(result: TimeoutResult<T>): T {
81
+ if (isSuccess(result)) {
82
+ return result.value;
83
+ }
84
+ throw new Error(`TimeoutResult is not success: ${result.state}`);
85
+ }
86
+
87
+ export function unwrapOr<T>(result: TimeoutResult<T>, defaultValue: T): T {
88
+ return isSuccess(result) ? result.value : defaultValue;
89
+ }
90
+
91
+ export async function timeouted<T, CTX = void>(
92
+ action: TimeoutAction<T>,
93
+ options: Partial<TimeoutActionOptions<CTX>> = {},
94
+ ): Promise<TimeoutResult<T>> {
95
+ const { timeout = 30000, signal, controller: externalController, ctx, onTimeout, onAbort, onError, onAbortAction } = options;
96
+
97
+ const controller = externalController || new AbortController();
98
+ const startTime = Date.now();
99
+
100
+ const toRemoveEventListeners: (() => void)[] = [];
101
+
102
+ // Link external signal to internal controller
103
+ if (signal) {
104
+ function abortAction(): void {
105
+ controller.abort(signal?.reason);
106
+ }
107
+ toRemoveEventListeners.push(() => {
108
+ signal?.removeEventListener("abort", abortAction);
109
+ });
110
+ signal.addEventListener("abort", abortAction);
111
+ }
112
+ function cleanup<X extends PurTimeoutResult<T>>(result: X, skipCleanupAction = false): TimeoutResult<T, CTX> {
113
+ for (const evtFn of toRemoveEventListeners) {
114
+ evtFn();
115
+ }
116
+ toRemoveEventListeners.length = 0;
117
+ if (!skipCleanupAction) {
118
+ void onAbortAction?.(signal?.reason);
119
+ controller.abort(new Error("Timeouted Abort Action"));
120
+ }
121
+ return {
122
+ ...result,
123
+ duration: Date.now() - startTime,
124
+ ctx: ctx as CTX,
125
+ } as TimeoutResult<T, CTX>;
126
+ }
127
+
128
+ let toAwait: Promise<T>;
129
+ if (isPromise(action)) {
130
+ toAwait = action;
131
+ } else {
132
+ try {
133
+ toAwait = action(controller);
134
+ } catch (error) {
135
+ return cleanup({
136
+ state: "error",
137
+ error: error instanceof Error ? error : new Error(error as string),
138
+ });
139
+ }
140
+ }
141
+
142
+ const abortToAwait = new Future<PurTimeoutResultAborted>();
143
+ function onAbortHandler(): void {
144
+ abortToAwait.resolve({ state: "aborted" as const, reason: controller.signal.reason as unknown });
145
+ }
146
+ controller.signal.addEventListener("abort", onAbortHandler);
147
+ toRemoveEventListeners.push(() => {
148
+ controller.signal.removeEventListener("abort", onAbortHandler);
149
+ });
150
+
151
+ const toRace: Promise<PurTimeoutResult<T>>[] = [
152
+ toAwait.then((value) => ({ state: "success" as const, value })).catch((error: Error) => ({ state: "error" as const, error })),
153
+ abortToAwait.asPromise(),
154
+ ];
155
+ if (timeout > 0) {
156
+ toRace.push(
157
+ sleep(timeout, controller.signal).then((r): PurTimeoutResult<T> => {
158
+ switch (true) {
159
+ case r.isOk:
160
+ return { state: "timeout" as const };
161
+ case r.isErr:
162
+ return { state: "error" as const, error: r.error };
163
+ case r.isAborted:
164
+ return { state: "aborted" as const, reason: r.reason };
165
+ }
166
+ throw new Error("Unreachable code in timeoutAction");
167
+ }),
168
+ );
169
+ }
170
+
171
+ const res = await Promise.race(toRace);
172
+ switch (true) {
173
+ case res.state === "success":
174
+ return cleanup(res, true);
175
+ case res.state === "aborted":
176
+ onAbort?.(res.reason);
177
+ return cleanup(res);
178
+ case res.state === "error":
179
+ onError?.(res.error);
180
+ return cleanup(res);
181
+ case res.state === "timeout":
182
+ onTimeout?.();
183
+ return cleanup(res);
184
+ }
185
+ throw new Error("Unreachable code in timeoutAction");
186
+ }
@@ -1,4 +1,36 @@
1
- import { Result } from "../result.js";
1
+ import { Future } from "../future.js";
2
+
3
+ export interface SleepBase {
4
+ readonly state: "sleeped" | "error" | "aborted";
5
+ readonly isOk: boolean;
6
+ readonly isErr: boolean;
7
+ readonly isAborted: boolean;
8
+ }
9
+
10
+ export interface SleepOk extends SleepBase {
11
+ readonly state: "sleeped";
12
+ readonly isOk: true;
13
+ readonly isErr: false;
14
+ readonly isAborted: false;
15
+ }
16
+
17
+ export interface SleepErr extends SleepBase {
18
+ readonly state: "error";
19
+ readonly error: Error;
20
+ readonly isOk: false;
21
+ readonly isErr: true;
22
+ readonly isAborted: false;
23
+ }
24
+
25
+ export interface SleepAbort extends SleepBase {
26
+ readonly state: "aborted";
27
+ readonly reason: Error;
28
+ readonly isOk: false;
29
+ readonly isErr: false;
30
+ readonly isAborted: true;
31
+ }
32
+
33
+ export type SleepResult = SleepOk | SleepErr | SleepAbort;
2
34
 
3
35
  /**
4
36
  * Pause execution for the given number of milliseconds.
@@ -8,36 +40,34 @@ import { Result } from "../result.js";
8
40
  *
9
41
  * Optionally accepts an AbortSignal to cancel the sleep (will resolve with Result.Err on abort).
10
42
  */
11
- export function sleep(ms: number, signal?: AbortSignal): Promise<Result<void>> {
12
- return new Promise<Result<void>>((resolve) => {
13
- if (ms <= 0) {
14
- resolve(Result.Ok());
15
- return;
16
- }
17
- if (signal?.aborted) {
18
- const err = new Error("sleep aborted");
19
- // (err as { name: string }).name = "AbortError";
20
- resolve(Result.Err(err));
21
- return;
22
- }
23
-
24
- function cleanup(): void {
25
- clearTimeout(id);
26
- signal?.removeEventListener("abort", onAbort);
27
- }
28
-
29
- const id = setTimeout(() => {
30
- cleanup();
31
- resolve(Result.Ok());
32
- }, ms);
33
-
34
- const onAbort = (): void => {
35
- cleanup();
36
- const err = new Error("sleep aborted");
37
- // (err as { name: string }).name = "AbortError";
38
- resolve(Result.Err(err));
39
- };
43
+ export async function sleep(ms: number, signal?: AbortSignal): Promise<SleepResult> {
44
+ if (ms < 0) {
45
+ return { state: "sleeped", isOk: true, isErr: false, isAborted: false };
46
+ }
47
+ if (signal?.aborted) {
48
+ const err = new Error("sleep aborted");
49
+ // (err as { name: string }).name = "AbortError";
50
+ return { state: "aborted", reason: err, isOk: false, isErr: false, isAborted: true };
51
+ }
52
+ const sleepFuture = new Future<SleepOk>();
53
+ const id = setTimeout(() => {
54
+ // cleanup();
55
+ sleepFuture.resolve({ state: "sleeped", isOk: true, isErr: false, isAborted: false });
56
+ }, ms);
40
57
 
41
- signal?.addEventListener("abort", onAbort, { once: true });
58
+ const abortFuture = new Future<SleepAbort>();
59
+ function onAbort(): void {
60
+ abortFuture.resolve({
61
+ state: "aborted",
62
+ reason: new Error("sleep aborted"),
63
+ isOk: false,
64
+ isErr: false,
65
+ isAborted: true,
66
+ });
67
+ }
68
+ signal?.addEventListener("abort", onAbort, { once: true });
69
+ return Promise.race([abortFuture.asPromise(), sleepFuture.asPromise()]).finally(() => {
70
+ clearTimeout(id);
71
+ signal?.removeEventListener("abort", onAbort);
42
72
  });
43
73
  }
@@ -1,5 +1,5 @@
1
1
  import { FileService } from "./file-service.js";
2
- import { TimeMode, RandomMode, IDMode, SystemService, VoidFunc, BasicSysAbstraction, BasicRuntimeService } from "./sys-abstraction.js";
2
+ import { TimeMode, RandomMode, IDMode, SystemService, VoidFunc, BasicSysAbstraction, type BasicRuntimeService } from "./sys-abstraction.js";
3
3
  import { Time } from "./time.js";
4
4
  import { TxtEnDecoder } from "./txt-en-decoder.js";
5
5
  import { Env } from "./sys-env.js";
@@ -1 +1 @@
1
- {"version":3,"file":"base-sys-abstraction.d.ts","sourceRoot":"","sources":["../../../src/base-sys-abstraction.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base-sys-abstraction.d.ts","sourceRoot":"","sources":["../../../src/base-sys-abstraction.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ export declare class Future<T, CTX = void> {
2
2
  #private;
3
3
  readonly ctx?: CTX;
4
4
  constructor(ctx?: CTX);
5
+ readonly id: () => string;
5
6
  asPromise(): Promise<T>;
6
7
  resolve(value: T): void;
7
8
  reject(reason: unknown): void;
@@ -1 +1 @@
1
- {"version":3,"file":"future.d.ts","sourceRoot":"","sources":["../../../src/future.ts"],"names":[],"mappings":"AAAA,qBAAa,MAAM,CAAC,CAAC,EAAE,GAAG,GAAG,IAAI;;IAU/B,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IACnB,YAAY,GAAG,CAAC,EAAE,GAAG,EAMpB;IAED,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,CAEtB;IAED,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAEtB;IACD,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAE5B;CACF"}
1
+ {"version":3,"file":"future.d.ts","sourceRoot":"","sources":["../../../src/future.ts"],"names":[],"mappings":"AAEA,qBAAa,MAAM,CAAC,CAAC,EAAE,GAAG,GAAG,IAAI;;IAU/B,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IACnB,YAAY,GAAG,CAAC,EAAE,GAAG,EAMpB;IAGD,QAAQ,CAAC,EAAE,EAAE,MAAM,MAAM,CAAiF;IAE1G,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,CAEtB;IAED,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAEtB;IACD,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAE5B;CACF"}
package/ts/cjs/future.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Future = void 0;
4
+ const resolve_once_js_1 = require("./resolve-once.js");
4
5
  class Future {
5
6
  #promise;
6
7
  #resolveFn = () => {
@@ -17,6 +18,7 @@ class Future {
17
18
  this.#rejectFn = reject;
18
19
  });
19
20
  }
21
+ id = (0, resolve_once_js_1.Lazy)(() => Math.random().toString(36).substring(2) + Date.now().toString(36));
20
22
  asPromise() {
21
23
  return this.#promise;
22
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"future.js","sourceRoot":"","sources":["../../../src/future.ts"],"names":[],"mappings":";;;AAAA;IAEW,QAAQ,CAAa;IAC9B,UAAU,GAAuB,GAAG,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAAA,CAC7D,CAAC;IACF,SAAS,GAA8B,GAAG,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAAA,CAC7D,CAAC;IAEO,GAAG,CAAO;IACnB,YAAY,GAAS,EAAE;QACrB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,QAAQ,GAAG,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;YAClD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;YAC1B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QAAA,CACzB,CAAC,CAAC;IAAA,CACJ;IAED,SAAS,GAAe;QACtB,OAAO,IAAI,CAAC,QAAQ,CAAC;IAAA,CACtB;IAED,OAAO,CAAC,KAAQ,EAAQ;QACtB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAAA,CACxB;IACD,MAAM,CAAC,MAAe,EAAQ;QAC5B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAAA,CACxB;CACF"}
1
+ {"version":3,"file":"future.js","sourceRoot":"","sources":["../../../src/future.ts"],"names":[],"mappings":";;;AAAA,uDAAyC;AAEzC;IAEW,QAAQ,CAAa;IAC9B,UAAU,GAAuB,GAAG,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAAA,CAC7D,CAAC;IACF,SAAS,GAA8B,GAAG,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAAA,CAC7D,CAAC;IAEO,GAAG,CAAO;IACnB,YAAY,GAAS,EAAE;QACrB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,QAAQ,GAAG,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;YAClD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;YAC1B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QAAA,CACzB,CAAC,CAAC;IAAA,CACJ;IAGQ,EAAE,GAAiB,IAAA,sBAAI,EAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAE1G,SAAS,GAAe;QACtB,OAAO,IAAI,CAAC,QAAQ,CAAC;IAAA,CACtB;IAED,OAAO,CAAC,KAAQ,EAAQ;QACtB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAAA,CACxB;IACD,MAAM,CAAC,MAAe,EAAQ;QAC5B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAAA,CACxB;CACF"}
@@ -35,4 +35,9 @@ it("Create Future with Context", () => {
35
35
  const future = new cement_1.Future({ id: 42 });
36
36
  expect(future.ctx?.id).toBe(42);
37
37
  });
38
+ it("Future create a unique id per instance could be used as transaction id", () => {
39
+ const future1 = new cement_1.Future();
40
+ const future2 = new cement_1.Future();
41
+ expect(future1.id()).not.toBe(future2.id());
42
+ });
38
43
  //# sourceMappingURL=future.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"future.test.js","sourceRoot":"","sources":["../../../src/future.test.ts"],"names":[],"mappings":";;AAAA,4CAAyC;AAEzC,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,eAAM,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IACnC,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAExC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAAA,CACrC,CAAC,CAAC;IACH,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9B,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5B,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAE5B,MAAM,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAAA,CAC3C,CAAC,CAAC;AAEH,EAAE,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,eAAM,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IACnC,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAExC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAAA,CACrC,CAAC,CAAC;IACH,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3B,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3B,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAE3B,IAAI,CAAC;QACH,MAAM,OAAO,CAAC;QACd,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;AAAA,CACF,CAAC,CAAC;AAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,eAAM,CAAmC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACxE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAAA,CACjC,CAAC,CAAC"}
1
+ {"version":3,"file":"future.test.js","sourceRoot":"","sources":["../../../src/future.test.ts"],"names":[],"mappings":";;AAAA,4CAAyC;AAEzC,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,eAAM,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IACnC,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAExC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAAA,CACrC,CAAC,CAAC;IACH,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9B,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5B,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAE5B,MAAM,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAAA,CAC3C,CAAC,CAAC;AAEH,EAAE,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,eAAM,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IACnC,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAExC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAAA,CACrC,CAAC,CAAC;IACH,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3B,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3B,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAE3B,IAAI,CAAC;QACH,MAAM,OAAO,CAAC;QACd,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;AAAA,CACF,CAAC,CAAC;AAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,eAAM,CAAmC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACxE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAAA,CACjC,CAAC,CAAC;AAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE,CAAC;IACjF,MAAM,OAAO,GAAG,IAAI,eAAM,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI,eAAM,EAAE,CAAC;IAC7B,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;AAAA,CAC7C,CAAC,CAAC"}
@@ -34,7 +34,7 @@ it("OnFunctionTest", async () => {
34
34
  const start = performance.now();
35
35
  await test.onFunAction.invokeAsync(2, "34");
36
36
  const duration = performance.now() - start;
37
- expect(duration).toBeGreaterThanOrEqual(10);
37
+ expect(duration).toBeGreaterThanOrEqual(9);
38
38
  for (const fn of [...asyncFns, ...fns]) {
39
39
  expect(fn.mock.calls).toEqual([[2, "34"]]);
40
40
  fn.mock.calls.length = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"on-func.test.js","sourceRoot":"","sources":["../../../src/on-func.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"on-func.test.js","sourceRoot":"","sources":["../../../src/on-func.test.ts"],"names":[],"mappings":"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"}
@@ -1,22 +1,44 @@
1
- export interface PollWaitingActionResult {
1
+ export interface PollerStats {
2
+ readonly attempts: number;
3
+ readonly lastIntervalMs: number;
4
+ readonly totalElapsedMs: number;
5
+ }
6
+ interface PollWithStats {
7
+ readonly stats: PollerStats;
8
+ }
9
+ export interface PurPollWaitingActionResult {
2
10
  readonly state: "waiting";
3
11
  }
4
- export interface PollSuccessActionResult<T> {
12
+ export type PollWaitingActionResult = PurPollWaitingActionResult & PollWithStats;
13
+ export interface PurPollSuccessActionResult<T> {
5
14
  readonly state: "success";
6
15
  readonly result: T;
7
16
  }
8
- export interface PollErrorActionResult {
17
+ export type PollSuccessActionResult<T> = PurPollSuccessActionResult<T> & PollWithStats;
18
+ export interface PurPollErrorActionResult {
9
19
  readonly state: "error";
10
20
  readonly error: Error;
11
21
  }
12
- export type PollActionResult<T> = PollWaitingActionResult | PollSuccessActionResult<T> | PollErrorActionResult;
22
+ export type PollErrorActionResult = PurPollErrorActionResult & PollWithStats;
23
+ export interface PurPollTimeoutActionResult {
24
+ readonly state: "timeout";
25
+ }
26
+ export type PollTimeoutActionResult = PurPollTimeoutActionResult & PollWithStats;
27
+ export interface PurPollAbortActionResult {
28
+ readonly state: "aborted";
29
+ readonly reason: unknown;
30
+ }
31
+ export type PollAbortActionResult = PurPollAbortActionResult & PollWithStats;
32
+ export type PollActionResult<T> = PurPollWaitingActionResult | PurPollSuccessActionResult<T> | PurPollErrorActionResult | PurPollTimeoutActionResult | PurPollAbortActionResult;
13
33
  export declare const FOREVER = 2147483647;
14
34
  export interface PollerOptions {
15
35
  readonly intervalMs: number;
36
+ readonly actionTimeoutMs: number;
16
37
  readonly timeoutMs: number;
17
38
  readonly exponentialBackoff: boolean;
18
39
  readonly abortSignal?: AbortSignal;
19
40
  }
20
- export type PollerResult<T> = PollSuccessActionResult<T> | PollErrorActionResult;
41
+ export type PollerResult<T> = PollSuccessActionResult<T> | PollErrorActionResult | PollTimeoutActionResult | PollAbortActionResult;
21
42
  export declare function poller<T>(fn: () => Promise<PollActionResult<T>>, ioptions?: Partial<PollerOptions>): Promise<PollerResult<T>>;
43
+ export {};
22
44
  //# sourceMappingURL=poller.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"poller.d.ts","sourceRoot":"","sources":["../../../src/poller.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,uBAAuB,CAAC,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACvB;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,uBAAuB,GAAG,uBAAuB,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC;AAE/G,eAAO,MAAM,OAAO,aAAa,CAAC;AAClC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;CACpC;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,uBAAuB,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC;AAwCjF,wBAAsB,MAAM,CAAC,CAAC,EAC5B,EAAE,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EACtC,QAAQ,GAAE,OAAO,CAAC,aAAa,CAAM,GACpC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAc1B"}
1
+ {"version":3,"file":"poller.d.ts","sourceRoot":"","sources":["../../../src/poller.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,UAAU,aAAa;IACrB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;CAC7B;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;CAC3B;AAED,MAAM,MAAM,uBAAuB,GAAG,0BAA0B,GAAG,aAAa,CAAC;AAEjF,MAAM,WAAW,0BAA0B,CAAC,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;CACpB;AAED,MAAM,MAAM,uBAAuB,CAAC,CAAC,IAAI,0BAA0B,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;AAEvF,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACvB;AAED,MAAM,MAAM,qBAAqB,GAAG,wBAAwB,GAAG,aAAa,CAAC;AAE7E,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;CAC3B;AAED,MAAM,MAAM,uBAAuB,GAAG,0BAA0B,GAAG,aAAa,CAAC;AAEjF,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AACD,MAAM,MAAM,qBAAqB,GAAG,wBAAwB,GAAG,aAAa,CAAC;AAE7E,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAC1B,0BAA0B,GAC1B,0BAA0B,CAAC,CAAC,CAAC,GAC7B,wBAAwB,GACxB,0BAA0B,GAC1B,wBAAwB,CAAC;AAE7B,eAAO,MAAM,OAAO,aAAa,CAAC;AAClC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;CACpC;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,uBAAuB,CAAC,CAAC,CAAC,GAAG,qBAAqB,GAAG,uBAAuB,GAAG,qBAAqB,CAAC;AAiHnI,wBAAsB,MAAM,CAAC,CAAC,EAC5B,EAAE,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EACtC,QAAQ,GAAE,OAAO,CAAC,aAAa,CAAM,GACpC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CA0C1B"}
package/ts/cjs/poller.js CHANGED
@@ -2,38 +2,100 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.FOREVER = void 0;
4
4
  exports.poller = poller;
5
+ const future_js_1 = require("./future.js");
5
6
  const promise_sleep_js_1 = require("./utils/promise-sleep.js");
6
7
  exports.FOREVER = 2147483647;
7
- async function interPoller(fn, options) {
8
+ function doneStats(stats) {
9
+ stats.totalElapsedMs = Date.now() - stats.startTime;
10
+ return {
11
+ attempts: stats.attempts,
12
+ lastIntervalMs: stats.lastIntervalMs,
13
+ totalElapsedMs: stats.totalElapsedMs,
14
+ };
15
+ }
16
+ async function interPoller(fn, options, stats, abortController) {
8
17
  do {
9
- let result;
10
18
  try {
11
- result = await fn(options.abortSignal);
19
+ stats.attempts += 1;
20
+ const abortCheck = new future_js_1.Future();
21
+ function onAbort() {
22
+ abortCheck.resolve({
23
+ state: "aborted",
24
+ reason: abortController.signal.reason,
25
+ });
26
+ }
27
+ const fnAbortController = new AbortController();
28
+ fnAbortController.signal.addEventListener("abort", onAbort, { once: true });
29
+ const races = [
30
+ fn(fnAbortController.signal).finally(() => {
31
+ fnAbortController.abort();
32
+ }),
33
+ abortCheck.asPromise().finally(() => {
34
+ fnAbortController.abort();
35
+ }),
36
+ ];
37
+ if (options.actionTimeoutMs > 0) {
38
+ races.push((0, promise_sleep_js_1.sleep)(options.actionTimeoutMs, fnAbortController.signal).then((res) => {
39
+ fnAbortController.abort(new Error("poller action timeout"));
40
+ switch (res.state) {
41
+ case "sleeped":
42
+ return { state: "waiting" };
43
+ case "error":
44
+ return { state: "error", error: res.error };
45
+ case "aborted":
46
+ return { state: "aborted", reason: res.reason };
47
+ }
48
+ throw new Error("Unreachable code in poller action timeout");
49
+ }));
50
+ }
51
+ const result = await Promise.race(races).finally(() => {
52
+ fnAbortController.signal.removeEventListener("abort", onAbort);
53
+ });
12
54
  switch (result.state) {
13
55
  case "waiting":
14
56
  {
15
57
  if (options.exponentialBackoff) {
16
58
  options.intervalMs = Math.min(options.intervalMs * 2, exports.FOREVER);
17
59
  }
18
- const err = await (0, promise_sleep_js_1.sleep)(options.intervalMs, options.abortSignal);
19
- if (err.isErr()) {
20
- return {
21
- state: "error",
22
- error: err.Err(),
23
- };
60
+ stats.lastIntervalMs = options.intervalMs;
61
+ const res = await (0, promise_sleep_js_1.sleep)(options.intervalMs, abortController.signal);
62
+ switch (true) {
63
+ case res.isAborted:
64
+ return {
65
+ state: "aborted",
66
+ reason: res.reason,
67
+ stats: doneStats(stats),
68
+ };
69
+ case res.isOk:
70
+ break;
71
+ case res.isErr:
72
+ return {
73
+ state: "error",
74
+ error: res.error,
75
+ stats: doneStats(stats),
76
+ };
77
+ default:
78
+ throw new Error("poller interrupted during sleep");
24
79
  }
25
80
  }
26
81
  break;
82
+ case "aborted":
83
+ return {
84
+ state: "aborted",
85
+ reason: result.reason,
86
+ stats: doneStats(stats),
87
+ };
27
88
  case "success":
28
- return result;
89
+ return { ...result, stats: doneStats(stats) };
29
90
  case "error":
30
- return result;
91
+ return { ...result, stats: doneStats(stats) };
31
92
  }
32
93
  }
33
94
  catch (err) {
34
95
  return {
35
96
  state: "error",
36
97
  error: err,
98
+ stats: doneStats(stats),
37
99
  };
38
100
  }
39
101
  // eslint-disable-next-line no-constant-condition
@@ -42,15 +104,42 @@ async function interPoller(fn, options) {
42
104
  async function poller(fn, ioptions = {}) {
43
105
  const options = {
44
106
  intervalMs: 1000,
45
- timeoutMs: 30000,
107
+ timeoutMs: 30000, // -1 means forever
108
+ actionTimeoutMs: -1, // forever
46
109
  ...ioptions,
47
110
  exponentialBackoff: typeof ioptions.exponentialBackoff === "boolean" ? ioptions.exponentialBackoff : ioptions.timeoutMs === exports.FOREVER,
48
111
  };
49
- return Promise.race([
50
- interPoller(fn, options),
51
- (0, promise_sleep_js_1.sleep)(options.timeoutMs, options.abortSignal)
52
- .then(() => ({ state: "error", error: new Error("Polling timed out") }))
53
- .catch((e) => ({ state: "error", error: e })),
54
- ]);
112
+ const stats = {
113
+ attempts: 0,
114
+ startTime: Date.now(),
115
+ lastIntervalMs: 0,
116
+ totalElapsedMs: 0,
117
+ };
118
+ const abortController = new AbortController();
119
+ const toRemoveEventListeners = [];
120
+ if (options.abortSignal) {
121
+ if (options.abortSignal.aborted) {
122
+ abortController.abort(options.abortSignal.reason);
123
+ }
124
+ else {
125
+ function dispatchAbort() {
126
+ abortController.abort(options.abortSignal?.reason);
127
+ }
128
+ toRemoveEventListeners.push(() => {
129
+ options.abortSignal?.removeEventListener("abort", dispatchAbort);
130
+ });
131
+ options.abortSignal.addEventListener("abort", dispatchAbort, { once: true });
132
+ }
133
+ }
134
+ const races = [interPoller(fn, options, stats, abortController)];
135
+ if (options.timeoutMs > 0) {
136
+ races.push((0, promise_sleep_js_1.sleep)(options.timeoutMs, abortController.signal)
137
+ .then(() => ({ state: "timeout", stats: doneStats(stats) }))
138
+ .catch((e) => ({ state: "error", error: e, stats: doneStats(stats) })));
139
+ }
140
+ return Promise.race(races).finally(() => {
141
+ toRemoveEventListeners.forEach((fn) => fn());
142
+ toRemoveEventListeners.length = 0;
143
+ });
55
144
  }
56
145
  //# sourceMappingURL=poller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"poller.js","sourceRoot":"","sources":["../../../src/poller.ts"],"names":[],"mappings":";;;;AAAA,+DAAiD;AAmBpC,QAAA,OAAO,GAAG,UAAU,CAAC;AAUlC,KAAK,UAAU,WAAW,CACxB,EAA+D,EAC/D,OAAgC,EACN;IAC1B,GAAG,CAAC;QACF,IAAI,MAA2B,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACvC,QAAQ,MAAM,CAAC,KAAK,EAAE,CAAC;gBACrB,KAAK,SAAS;oBACZ,CAAC;wBACC,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;4BAC/B,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,EAAE,QAAA,OAAO,CAAC,CAAC;wBACjE,CAAC;wBACD,MAAM,GAAG,GAAG,MAAM,IAAA,wBAAK,EAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;wBACjE,IAAI,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;4BAChB,OAAO;gCACL,KAAK,EAAE,OAAO;gCACd,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE;6BACjB,CAAC;wBACJ,CAAC;oBACH,CAAC;oBACD,MAAM;gBACR,KAAK,SAAS;oBACZ,OAAO,MAAM,CAAC;gBAChB,KAAK,OAAO;oBACV,OAAO,MAAM,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,GAAY;aACpB,CAAC;QACJ,CAAC;QACD,iDAAiD;IACnD,CAAC,QAAQ,IAAI,EAAE;AAAA,CAChB;AAEM,KAAK,iBACV,EAAsC,EACtC,QAAQ,GAA2B,EAAE,EACX;IAC1B,MAAM,OAAO,GAAG;QACd,UAAU,EAAE,IAAI;QAChB,SAAS,EAAE,KAAK;QAChB,GAAG,QAAQ;QACX,kBAAkB,EAChB,OAAO,QAAQ,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,KAAK,QAAA,OAAO;KAClH,CAAC;IACF,OAAO,OAAO,CAAC,IAAI,CAAC;QAClB,WAAW,CAAC,EAAE,EAAE,OAAO,CAAC;QACxB,IAAA,wBAAK,EAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC;aAC1C,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,OAAgB,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;aAChF,KAAK,CAAC,CAAC,CAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,OAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;KAChE,CAAC,CAAC;AAAA,CACJ"}
1
+ {"version":3,"file":"poller.js","sourceRoot":"","sources":["../../../src/poller.ts"],"names":[],"mappings":"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"}