@augment-vir/common 20.0.1 → 21.0.1

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.
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.executeAndReturnError = exports.wrapInTry = exports.ensureErrorAndPrependMessage = exports.ensureError = exports.extractErrorMessage = exports.combineErrorMessages = exports.combineErrors = void 0;
4
- const __1 = require("..");
4
+ const boolean_1 = require("./boolean");
5
+ const typed_has_property_1 = require("./object/typed-has-property");
6
+ const promise_1 = require("./promise/promise");
5
7
  function combineErrors(errors) {
6
8
  if (!errors || errors.length === 0) {
7
9
  return undefined;
@@ -17,7 +19,7 @@ function combineErrorMessages(errors) {
17
19
  if (!errors) {
18
20
  return '';
19
21
  }
20
- return errors.map(extractErrorMessage).filter(__1.isTruthy).join('\n');
22
+ return errors.map(extractErrorMessage).filter(boolean_1.isTruthy).join('\n');
21
23
  }
22
24
  exports.combineErrorMessages = combineErrorMessages;
23
25
  function extractErrorMessage(maybeError) {
@@ -27,7 +29,7 @@ function extractErrorMessage(maybeError) {
27
29
  if (maybeError instanceof Error) {
28
30
  return maybeError.message;
29
31
  }
30
- else if ((0, __1.typedHasProperty)(maybeError, 'message')) {
32
+ else if ((0, typed_has_property_1.typedHasProperty)(maybeError, 'message')) {
31
33
  return String(maybeError.message);
32
34
  }
33
35
  else {
@@ -68,7 +70,7 @@ function executeAndReturnError(callback) {
68
70
  let caughtError;
69
71
  try {
70
72
  const result = callback();
71
- if ((0, __1.isPromiseLike)(result)) {
73
+ if ((0, promise_1.isPromiseLike)(result)) {
72
74
  return new Promise(async (resolve) => {
73
75
  try {
74
76
  const output = await result;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createDeferredPromiseWrapper = void 0;
4
+ function createDeferredPromiseWrapper() {
5
+ let resolve;
6
+ let reject;
7
+ let settled = false;
8
+ const promise = new Promise((resolveCallback, rejectCallback) => {
9
+ resolve = (value) => {
10
+ settled = true;
11
+ return resolveCallback(value);
12
+ };
13
+ reject = (reason) => {
14
+ settled = true;
15
+ rejectCallback(reason);
16
+ };
17
+ });
18
+ // no way to test this edge case
19
+ // istanbul ignore next
20
+ if (!resolve || !reject) {
21
+ throw new Error(`Reject and resolve callbacks were not set by the promise constructor for ${createDeferredPromiseWrapper.name}.`);
22
+ }
23
+ return {
24
+ promise,
25
+ resolve,
26
+ reject,
27
+ isSettled() {
28
+ return settled;
29
+ },
30
+ };
31
+ }
32
+ exports.createDeferredPromiseWrapper = createDeferredPromiseWrapper;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.callAsynchronously = exports.wrapPromiseInTimeout = exports.PromiseTimeoutError = exports.isPromiseLike = void 0;
4
+ const typed_has_property_1 = require("../object/typed-has-property");
5
+ function isPromiseLike(input) {
6
+ if ((0, typed_has_property_1.typedHasProperty)(input, 'then') && typeof input.then === 'function') {
7
+ return true;
8
+ }
9
+ else {
10
+ return false;
11
+ }
12
+ }
13
+ exports.isPromiseLike = isPromiseLike;
14
+ class PromiseTimeoutError extends Error {
15
+ constructor(durationMs, message = `Promised timed out after ${durationMs} ms.`) {
16
+ super(message);
17
+ this.durationMs = durationMs;
18
+ this.message = message;
19
+ this.name = 'PromiseTimeoutError';
20
+ }
21
+ }
22
+ exports.PromiseTimeoutError = PromiseTimeoutError;
23
+ function wrapPromiseInTimeout(durationMs, originalPromise) {
24
+ return new Promise(async (resolve, reject) => {
25
+ const timeoutId = durationMs === Infinity
26
+ ? undefined
27
+ : setTimeout(() => {
28
+ reject(new PromiseTimeoutError(durationMs));
29
+ }, durationMs);
30
+ try {
31
+ const result = await originalPromise;
32
+ resolve(result);
33
+ }
34
+ catch (error) {
35
+ reject(error);
36
+ }
37
+ finally {
38
+ clearTimeout(timeoutId);
39
+ }
40
+ });
41
+ }
42
+ exports.wrapPromiseInTimeout = wrapPromiseInTimeout;
43
+ /**
44
+ * Call a function asynchronously without interrupting current synchronous execution, even if the
45
+ * function was originally synchronous.
46
+ */
47
+ async function callAsynchronously(callback) {
48
+ return await Promise.resolve().then(() => callback());
49
+ }
50
+ exports.callAsynchronously = callAsynchronously;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.waitForCondition = exports.waitValue = exports.wait = void 0;
4
+ const error_1 = require("../error");
5
+ const deferred_promise_1 = require("./deferred-promise");
6
+ function wait(delayMs) {
7
+ const deferredPromiseWrapper = (0, deferred_promise_1.createDeferredPromiseWrapper)();
8
+ if (delayMs !== Infinity) {
9
+ setTimeout(() => {
10
+ deferredPromiseWrapper.resolve();
11
+ }, delayMs <= 0 ? 0 : delayMs);
12
+ }
13
+ return deferredPromiseWrapper.promise;
14
+ }
15
+ exports.wait = wait;
16
+ async function waitValue(delayMs, returnValue) {
17
+ return wait(delayMs).then(() => returnValue);
18
+ }
19
+ exports.waitValue = waitValue;
20
+ async function waitForCondition({ conditionCallback, timeoutMs = 10000, intervalMs = 100, timeoutMessage = '', }) {
21
+ let condition = false;
22
+ let lastError;
23
+ async function checkCondition() {
24
+ try {
25
+ condition = !!(await conditionCallback());
26
+ }
27
+ catch (error) {
28
+ condition = false;
29
+ lastError = error;
30
+ }
31
+ }
32
+ const startTime = Date.now();
33
+ await checkCondition();
34
+ while (!condition) {
35
+ await wait(intervalMs);
36
+ if (Date.now() - startTime >= timeoutMs) {
37
+ const message = timeoutMessage ? `${timeoutMessage}: ` : '';
38
+ throw new Error(`${message}Timeout of "${timeoutMs}" exceeded waiting for condition to be true${(0, error_1.extractErrorMessage)(lastError)}`);
39
+ }
40
+ await checkCondition();
41
+ }
42
+ }
43
+ exports.waitForCondition = waitForCondition;
package/dist/cjs/index.js CHANGED
@@ -40,7 +40,9 @@ __exportStar(require("./augments/object/object-entries"), exports);
40
40
  __exportStar(require("./augments/object/old-union-to-intersection"), exports);
41
41
  __exportStar(require("./augments/object/pick-deep"), exports);
42
42
  __exportStar(require("./augments/object/typed-has-property"), exports);
43
- __exportStar(require("./augments/promise"), exports);
43
+ __exportStar(require("./augments/promise/deferred-promise"), exports);
44
+ __exportStar(require("./augments/promise/promise"), exports);
45
+ __exportStar(require("./augments/promise/wait"), exports);
44
46
  __exportStar(require("./augments/random"), exports);
45
47
  __exportStar(require("./augments/regexp"), exports);
46
48
  __exportStar(require("./augments/runtime-type-of"), exports);
@@ -1,4 +1,6 @@
1
- import { isPromiseLike, isTruthy, typedHasProperty } from '..';
1
+ import { isTruthy } from './boolean';
2
+ import { typedHasProperty } from './object/typed-has-property';
3
+ import { isPromiseLike } from './promise/promise';
2
4
  export function combineErrors(errors) {
3
5
  if (!errors || errors.length === 0) {
4
6
  return undefined;
@@ -0,0 +1,28 @@
1
+ export function createDeferredPromiseWrapper() {
2
+ let resolve;
3
+ let reject;
4
+ let settled = false;
5
+ const promise = new Promise((resolveCallback, rejectCallback) => {
6
+ resolve = (value) => {
7
+ settled = true;
8
+ return resolveCallback(value);
9
+ };
10
+ reject = (reason) => {
11
+ settled = true;
12
+ rejectCallback(reason);
13
+ };
14
+ });
15
+ // no way to test this edge case
16
+ // istanbul ignore next
17
+ if (!resolve || !reject) {
18
+ throw new Error(`Reject and resolve callbacks were not set by the promise constructor for ${createDeferredPromiseWrapper.name}.`);
19
+ }
20
+ return {
21
+ promise,
22
+ resolve,
23
+ reject,
24
+ isSettled() {
25
+ return settled;
26
+ },
27
+ };
28
+ }
@@ -0,0 +1,43 @@
1
+ import { typedHasProperty } from '../object/typed-has-property';
2
+ export function isPromiseLike(input) {
3
+ if (typedHasProperty(input, 'then') && typeof input.then === 'function') {
4
+ return true;
5
+ }
6
+ else {
7
+ return false;
8
+ }
9
+ }
10
+ export class PromiseTimeoutError extends Error {
11
+ constructor(durationMs, message = `Promised timed out after ${durationMs} ms.`) {
12
+ super(message);
13
+ this.durationMs = durationMs;
14
+ this.message = message;
15
+ this.name = 'PromiseTimeoutError';
16
+ }
17
+ }
18
+ export function wrapPromiseInTimeout(durationMs, originalPromise) {
19
+ return new Promise(async (resolve, reject) => {
20
+ const timeoutId = durationMs === Infinity
21
+ ? undefined
22
+ : setTimeout(() => {
23
+ reject(new PromiseTimeoutError(durationMs));
24
+ }, durationMs);
25
+ try {
26
+ const result = await originalPromise;
27
+ resolve(result);
28
+ }
29
+ catch (error) {
30
+ reject(error);
31
+ }
32
+ finally {
33
+ clearTimeout(timeoutId);
34
+ }
35
+ });
36
+ }
37
+ /**
38
+ * Call a function asynchronously without interrupting current synchronous execution, even if the
39
+ * function was originally synchronous.
40
+ */
41
+ export async function callAsynchronously(callback) {
42
+ return await Promise.resolve().then(() => callback());
43
+ }
@@ -0,0 +1,37 @@
1
+ import { extractErrorMessage } from '../error';
2
+ import { createDeferredPromiseWrapper } from './deferred-promise';
3
+ export function wait(delayMs) {
4
+ const deferredPromiseWrapper = createDeferredPromiseWrapper();
5
+ if (delayMs !== Infinity) {
6
+ setTimeout(() => {
7
+ deferredPromiseWrapper.resolve();
8
+ }, delayMs <= 0 ? 0 : delayMs);
9
+ }
10
+ return deferredPromiseWrapper.promise;
11
+ }
12
+ export async function waitValue(delayMs, returnValue) {
13
+ return wait(delayMs).then(() => returnValue);
14
+ }
15
+ export async function waitForCondition({ conditionCallback, timeoutMs = 10000, intervalMs = 100, timeoutMessage = '', }) {
16
+ let condition = false;
17
+ let lastError;
18
+ async function checkCondition() {
19
+ try {
20
+ condition = !!(await conditionCallback());
21
+ }
22
+ catch (error) {
23
+ condition = false;
24
+ lastError = error;
25
+ }
26
+ }
27
+ const startTime = Date.now();
28
+ await checkCondition();
29
+ while (!condition) {
30
+ await wait(intervalMs);
31
+ if (Date.now() - startTime >= timeoutMs) {
32
+ const message = timeoutMessage ? `${timeoutMessage}: ` : '';
33
+ throw new Error(`${message}Timeout of "${timeoutMs}" exceeded waiting for condition to be true${extractErrorMessage(lastError)}`);
34
+ }
35
+ await checkCondition();
36
+ }
37
+ }
package/dist/esm/index.js CHANGED
@@ -24,7 +24,9 @@ export * from './augments/object/object-entries';
24
24
  export * from './augments/object/old-union-to-intersection';
25
25
  export * from './augments/object/pick-deep';
26
26
  export * from './augments/object/typed-has-property';
27
- export * from './augments/promise';
27
+ export * from './augments/promise/deferred-promise';
28
+ export * from './augments/promise/promise';
29
+ export * from './augments/promise/wait';
28
30
  export * from './augments/random';
29
31
  export * from './augments/regexp';
30
32
  export * from './augments/runtime-type-of';
@@ -1,5 +1,6 @@
1
1
  import { RequireExactlyOne } from 'type-fest';
2
- import { AtLeastTuple, NoInputsFunction } from '..';
2
+ import { NoInputsFunction } from './function';
3
+ import { AtLeastTuple } from './tuple';
3
4
  export declare function combineErrors(errors: AtLeastTuple<Error, 1>): Error;
4
5
  export declare function combineErrors(errors: ReadonlyArray<never>): undefined;
5
6
  export declare function combineErrors(errors: ReadonlyArray<Error>): Error | undefined;
@@ -1,6 +1,13 @@
1
+ import { AnyFunction } from '../function';
1
2
  import { NestedKeys } from './nested-keys';
2
3
  type InnerPickDeep<OriginalObjectGeneric extends object, DeepKeys extends any[]> = DeepKeys extends [infer CurrentLevelPick, ...infer RemainingKeys] ? {
3
- [CurrentProp in Extract<CurrentLevelPick, keyof OriginalObjectGeneric>]: OriginalObjectGeneric[CurrentProp] extends object ? InnerPickDeep<OriginalObjectGeneric[CurrentProp], RemainingKeys> : OriginalObjectGeneric[CurrentProp];
4
+ [CurrentProp in Extract<CurrentLevelPick, keyof OriginalObjectGeneric>]: OriginalObjectGeneric[CurrentProp] extends AnyFunction ? OriginalObjectGeneric[CurrentProp] : OriginalObjectGeneric[CurrentProp] extends Array<any> ? OriginalObjectGeneric[CurrentProp] : OriginalObjectGeneric[CurrentProp] extends object ? InnerPickDeep<OriginalObjectGeneric[CurrentProp], RemainingKeys> : OriginalObjectGeneric[CurrentProp];
4
5
  } : DeepKeys extends [] ? OriginalObjectGeneric : DeepKeys extends [infer CurrentLevelPick] ? CurrentLevelPick extends keyof OriginalObjectGeneric ? Pick<OriginalObjectGeneric, CurrentLevelPick> : never : never;
5
- export type PickDeep<OriginalObjectGeneric extends object, DeepKeys extends NestedKeys<OriginalObjectGeneric>> = InnerPickDeep<OriginalObjectGeneric, DeepKeys>;
6
+ /**
7
+ * Pick nested keys with more strict type parameter requirements. However, these stricter type
8
+ * parameter requirements often lead to "excessively deep" TS compiler errors.
9
+ */
10
+ export type PickDeepStrict<OriginalObjectGeneric extends object, DeepKeys extends NestedKeys<OriginalObjectGeneric>> = InnerPickDeep<OriginalObjectGeneric, DeepKeys>;
11
+ /** Pick nested keys. */
12
+ export type PickDeep<OriginalObjectGeneric extends object, DeepKeys extends PropertyKey[]> = InnerPickDeep<OriginalObjectGeneric, DeepKeys>;
6
13
  export {};
@@ -0,0 +1,8 @@
1
+ /** A promise which can be resolved or rejected by external code. */
2
+ export type DeferredPromiseWrapper<T> = {
3
+ promise: Promise<T>;
4
+ resolve: (value: T | PromiseLike<T>) => void;
5
+ reject: (reason?: any) => void;
6
+ isSettled: () => boolean;
7
+ };
8
+ export declare function createDeferredPromiseWrapper<T = void>(): DeferredPromiseWrapper<T>;
@@ -0,0 +1,14 @@
1
+ export declare function isPromiseLike<T>(input: T | unknown): input is T extends PromiseLike<infer ValueType> ? PromiseLike<ValueType> : PromiseLike<unknown>;
2
+ export type MaybePromise<T> = Promise<T> | T;
3
+ export declare class PromiseTimeoutError extends Error {
4
+ readonly durationMs: number;
5
+ readonly message: string;
6
+ readonly name = "PromiseTimeoutError";
7
+ constructor(durationMs: number, message?: string);
8
+ }
9
+ export declare function wrapPromiseInTimeout<PromiseValueType>(durationMs: number, originalPromise: PromiseLike<PromiseValueType>): Promise<PromiseValueType>;
10
+ /**
11
+ * Call a function asynchronously without interrupting current synchronous execution, even if the
12
+ * function was originally synchronous.
13
+ */
14
+ export declare function callAsynchronously<T>(callback: () => MaybePromise<T>): Promise<T>;
@@ -0,0 +1,9 @@
1
+ export declare function wait(delayMs: number): Promise<void>;
2
+ export declare function waitValue<ResolutionValue>(delayMs: number, returnValue: ResolutionValue): Promise<ResolutionValue>;
3
+ export type WaitForConditionInputs = {
4
+ conditionCallback: () => boolean | Promise<boolean>;
5
+ timeoutMs?: number;
6
+ intervalMs?: number;
7
+ timeoutMessage?: string;
8
+ };
9
+ export declare function waitForCondition({ conditionCallback, timeoutMs, intervalMs, timeoutMessage, }: WaitForConditionInputs): Promise<void>;
@@ -24,7 +24,9 @@ export * from './augments/object/object-entries';
24
24
  export * from './augments/object/old-union-to-intersection';
25
25
  export * from './augments/object/pick-deep';
26
26
  export * from './augments/object/typed-has-property';
27
- export * from './augments/promise';
27
+ export * from './augments/promise/deferred-promise';
28
+ export * from './augments/promise/promise';
29
+ export * from './augments/promise/wait';
28
30
  export * from './augments/random';
29
31
  export * from './augments/regexp';
30
32
  export * from './augments/runtime-type-of';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@augment-vir/common",
3
- "version": "20.0.1",
3
+ "version": "21.0.1",
4
4
  "homepage": "https://github.com/electrovir/augment-vir/tree/main/packages/common",
5
5
  "bugs": {
6
6
  "url": "https://github.com/electrovir/augment-vir/issues"
@@ -1,118 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.waitForCondition = exports.callAsynchronously = exports.createDeferredPromiseWrapper = exports.wrapPromiseInTimeout = exports.PromiseTimeoutError = exports.isPromiseLike = exports.waitValue = exports.wait = void 0;
4
- const error_1 = require("./error");
5
- const typed_has_property_1 = require("./object/typed-has-property");
6
- function wait(delayMs) {
7
- const deferredPromiseWrapper = createDeferredPromiseWrapper();
8
- if (delayMs !== Infinity) {
9
- setTimeout(() => {
10
- deferredPromiseWrapper.resolve();
11
- }, delayMs <= 0 ? 0 : delayMs);
12
- }
13
- return deferredPromiseWrapper.promise;
14
- }
15
- exports.wait = wait;
16
- async function waitValue(delayMs, returnValue) {
17
- return wait(delayMs).then(() => returnValue);
18
- }
19
- exports.waitValue = waitValue;
20
- function isPromiseLike(input) {
21
- if ((0, typed_has_property_1.typedHasProperty)(input, 'then') && typeof input.then === 'function') {
22
- return true;
23
- }
24
- else {
25
- return false;
26
- }
27
- }
28
- exports.isPromiseLike = isPromiseLike;
29
- class PromiseTimeoutError extends Error {
30
- constructor(durationMs, message = `Promised timed out after ${durationMs} ms.`) {
31
- super(message);
32
- this.durationMs = durationMs;
33
- this.message = message;
34
- this.name = 'PromiseTimeoutError';
35
- }
36
- }
37
- exports.PromiseTimeoutError = PromiseTimeoutError;
38
- function wrapPromiseInTimeout(durationMs, originalPromise) {
39
- return new Promise(async (resolve, reject) => {
40
- const timeoutId = durationMs === Infinity
41
- ? undefined
42
- : setTimeout(() => {
43
- reject(new PromiseTimeoutError(durationMs));
44
- }, durationMs);
45
- try {
46
- const result = await originalPromise;
47
- resolve(result);
48
- }
49
- catch (error) {
50
- reject(error);
51
- }
52
- finally {
53
- clearTimeout(timeoutId);
54
- }
55
- });
56
- }
57
- exports.wrapPromiseInTimeout = wrapPromiseInTimeout;
58
- function createDeferredPromiseWrapper() {
59
- let resolve;
60
- let reject;
61
- let settled = false;
62
- const promise = new Promise((resolveCallback, rejectCallback) => {
63
- resolve = (value) => {
64
- settled = true;
65
- return resolveCallback(value);
66
- };
67
- reject = (reason) => {
68
- settled = true;
69
- rejectCallback(reason);
70
- };
71
- });
72
- // no way to test this edge case
73
- // istanbul ignore next
74
- if (!resolve || !reject) {
75
- throw new Error(`Reject and resolve callbacks were not set by the promise constructor for ${createDeferredPromiseWrapper.name}.`);
76
- }
77
- return {
78
- promise,
79
- resolve,
80
- reject,
81
- isSettled() {
82
- return settled;
83
- },
84
- };
85
- }
86
- exports.createDeferredPromiseWrapper = createDeferredPromiseWrapper;
87
- /**
88
- * Call a function asynchronously without interrupting current synchronous execution, even if the
89
- * function was originally synchronous.
90
- */
91
- async function callAsynchronously(callback) {
92
- return await Promise.resolve().then(() => callback());
93
- }
94
- exports.callAsynchronously = callAsynchronously;
95
- async function waitForCondition({ conditionCallback, timeoutMs = 10000, intervalMs = 100, timeoutMessage = '', }) {
96
- let condition = false;
97
- let lastError;
98
- async function checkCondition() {
99
- try {
100
- condition = !!(await conditionCallback());
101
- }
102
- catch (error) {
103
- condition = false;
104
- lastError = error;
105
- }
106
- }
107
- const startTime = Date.now();
108
- await checkCondition();
109
- while (!condition) {
110
- await wait(intervalMs);
111
- if (Date.now() - startTime >= timeoutMs) {
112
- const message = timeoutMessage ? `${timeoutMessage}: ` : '';
113
- throw new Error(`${message}Timeout of "${timeoutMs}" exceeded waiting for condition to be true${(0, error_1.extractErrorMessage)(lastError)}`);
114
- }
115
- await checkCondition();
116
- }
117
- }
118
- exports.waitForCondition = waitForCondition;
@@ -1,107 +0,0 @@
1
- import { extractErrorMessage } from './error';
2
- import { typedHasProperty } from './object/typed-has-property';
3
- export function wait(delayMs) {
4
- const deferredPromiseWrapper = createDeferredPromiseWrapper();
5
- if (delayMs !== Infinity) {
6
- setTimeout(() => {
7
- deferredPromiseWrapper.resolve();
8
- }, delayMs <= 0 ? 0 : delayMs);
9
- }
10
- return deferredPromiseWrapper.promise;
11
- }
12
- export async function waitValue(delayMs, returnValue) {
13
- return wait(delayMs).then(() => returnValue);
14
- }
15
- export function isPromiseLike(input) {
16
- if (typedHasProperty(input, 'then') && typeof input.then === 'function') {
17
- return true;
18
- }
19
- else {
20
- return false;
21
- }
22
- }
23
- export class PromiseTimeoutError extends Error {
24
- constructor(durationMs, message = `Promised timed out after ${durationMs} ms.`) {
25
- super(message);
26
- this.durationMs = durationMs;
27
- this.message = message;
28
- this.name = 'PromiseTimeoutError';
29
- }
30
- }
31
- export function wrapPromiseInTimeout(durationMs, originalPromise) {
32
- return new Promise(async (resolve, reject) => {
33
- const timeoutId = durationMs === Infinity
34
- ? undefined
35
- : setTimeout(() => {
36
- reject(new PromiseTimeoutError(durationMs));
37
- }, durationMs);
38
- try {
39
- const result = await originalPromise;
40
- resolve(result);
41
- }
42
- catch (error) {
43
- reject(error);
44
- }
45
- finally {
46
- clearTimeout(timeoutId);
47
- }
48
- });
49
- }
50
- export function createDeferredPromiseWrapper() {
51
- let resolve;
52
- let reject;
53
- let settled = false;
54
- const promise = new Promise((resolveCallback, rejectCallback) => {
55
- resolve = (value) => {
56
- settled = true;
57
- return resolveCallback(value);
58
- };
59
- reject = (reason) => {
60
- settled = true;
61
- rejectCallback(reason);
62
- };
63
- });
64
- // no way to test this edge case
65
- // istanbul ignore next
66
- if (!resolve || !reject) {
67
- throw new Error(`Reject and resolve callbacks were not set by the promise constructor for ${createDeferredPromiseWrapper.name}.`);
68
- }
69
- return {
70
- promise,
71
- resolve,
72
- reject,
73
- isSettled() {
74
- return settled;
75
- },
76
- };
77
- }
78
- /**
79
- * Call a function asynchronously without interrupting current synchronous execution, even if the
80
- * function was originally synchronous.
81
- */
82
- export async function callAsynchronously(callback) {
83
- return await Promise.resolve().then(() => callback());
84
- }
85
- export async function waitForCondition({ conditionCallback, timeoutMs = 10000, intervalMs = 100, timeoutMessage = '', }) {
86
- let condition = false;
87
- let lastError;
88
- async function checkCondition() {
89
- try {
90
- condition = !!(await conditionCallback());
91
- }
92
- catch (error) {
93
- condition = false;
94
- lastError = error;
95
- }
96
- }
97
- const startTime = Date.now();
98
- await checkCondition();
99
- while (!condition) {
100
- await wait(intervalMs);
101
- if (Date.now() - startTime >= timeoutMs) {
102
- const message = timeoutMessage ? `${timeoutMessage}: ` : '';
103
- throw new Error(`${message}Timeout of "${timeoutMs}" exceeded waiting for condition to be true${extractErrorMessage(lastError)}`);
104
- }
105
- await checkCondition();
106
- }
107
- }
@@ -1,31 +0,0 @@
1
- export declare function wait(delayMs: number): Promise<void>;
2
- export declare function waitValue<ResolutionValue>(delayMs: number, returnValue: ResolutionValue): Promise<ResolutionValue>;
3
- export declare function isPromiseLike<T>(input: T | unknown): input is T extends PromiseLike<infer ValueType> ? PromiseLike<ValueType> : PromiseLike<unknown>;
4
- export type MaybePromise<T> = Promise<T> | T;
5
- export declare class PromiseTimeoutError extends Error {
6
- readonly durationMs: number;
7
- readonly message: string;
8
- readonly name = "PromiseTimeoutError";
9
- constructor(durationMs: number, message?: string);
10
- }
11
- export declare function wrapPromiseInTimeout<PromiseValueType>(durationMs: number, originalPromise: PromiseLike<PromiseValueType>): Promise<PromiseValueType>;
12
- /** A promise which can be resolved or rejected by external code. */
13
- export type DeferredPromiseWrapper<T> = {
14
- promise: Promise<T>;
15
- resolve: (value: T | PromiseLike<T>) => void;
16
- reject: (reason?: any) => void;
17
- isSettled: () => boolean;
18
- };
19
- export declare function createDeferredPromiseWrapper<T = void>(): DeferredPromiseWrapper<T>;
20
- export type WaitForConditionInputs = {
21
- conditionCallback: () => boolean | Promise<boolean>;
22
- timeoutMs?: number;
23
- intervalMs?: number;
24
- timeoutMessage?: string;
25
- };
26
- /**
27
- * Call a function asynchronously without interrupting current synchronous execution, even if the
28
- * function was originally synchronous.
29
- */
30
- export declare function callAsynchronously<T>(callback: () => MaybePromise<T>): Promise<T>;
31
- export declare function waitForCondition({ conditionCallback, timeoutMs, intervalMs, timeoutMessage, }: WaitForConditionInputs): Promise<void>;