+import util from 'node:util';
+
export default class Utils {
// STATE
public static isUndefined(value: unknown): boolean {
return value as T;
}
- public static isIterable(obj: any): boolean {
+ public static isIterable<T>(obj: T): boolean {
if (obj === null || obj === undefined) {
return false;
}
- return typeof obj[Symbol.iterator] === 'function';
+ return typeof (obj as any)[Symbol.iterator] === 'function';
}
// public static ifNotIterableDo<T>(obj: T, cb: () => void): void {
// if (this.isIterable(obj) === false) cb();
// }
+ public static isPromisePending(promise: Promise<unknown>): boolean {
+ return util.inspect(promise).includes('pending');
+ }
+
public static async promiseWithTimeout<T>(
promise: Promise<T>,
timeoutMs: number,
// Create a timeout promise that rejects in timeout milliseconds
const timeoutPromise = new Promise<never>((_, reject) => {
setTimeout(() => {
- timeoutCallback();
+ if (Utils.isPromisePending(promise)) {
+ timeoutCallback();
+ // FIXME: The original promise shall be canceled
+ }
reject(timeoutError);
}, timeoutMs);
});