import {GreedyPromise, greedySetTimeout} from '../../libraries/greedy/greedyPromise.js'; import {getGlobal} from '../prebidGlobal.js'; declare module '../prebidGlobal' { interface PrebidJS { /** * The setTimeout implementation Prebid should use. */ setTimeout?: typeof setTimeout; /** * The Promise constructor Prebid should use. */ Promise?: typeof Promise } } export const pbSetTimeout: typeof setTimeout = getGlobal().setTimeout ?? (FEATURES.GREEDY ? greedySetTimeout : setTimeout) export const PbPromise: typeof Promise = getGlobal().Promise ?? (FEATURES.GREEDY ? GreedyPromise : Promise) as any; export function delay(delayMs = 0): Promise { return new PbPromise((resolve) => { pbSetTimeout(resolve, delayMs); }); } export interface Defer { promise: Promise; resolve: Parameters>[0]>[0], reject: Parameters>[0]>[1], } export type UnwrapPromise = T extends PromiseLike ? R : T; export type ToPromise = Promise>; /** * @returns a {promise, resolve, reject} trio where `promise` is resolved by calling `resolve` or `reject`. */ export function defer({promiseFactory = (resolver) => new PbPromise(resolver) as Promise}: { promiseFactory?: (...args: ConstructorParameters>) => Promise } = {}): Defer { function invoker(delegate) { return (val) => delegate(val); } let resolveFn, rejectFn; return { promise: promiseFactory((resolve, reject) => { resolveFn = resolve; rejectFn = reject; }), resolve: invoker(resolveFn), reject: invoker(rejectFn) } }