export function isPromise (value: T | Promise): value is Promise { return value && typeof (value as Promise).then === 'function' } export function isCatchable (value: any) { return value && typeof value.catch === 'function' } export function timeoutPromise (promise: Promise, timeoutMs: number) { let timer: ReturnType return Promise.race([ promise, new Promise((_res, rej) => { timer = setTimeout(() => rej(new Error('Timeout')), timeoutMs) }) ]).finally(() => clearTimeout(timer)) } export function promisify0 (func: (cb: (err: any, result: A) => void) => void): () => Promise { return function promisified (): Promise { return new Promise((resolve: (arg: A) => void, reject: (err: any) => void) => { // eslint-disable-next-line no-useless-call func.apply(null, [ (err: any, res: A) => err ? reject(err) : resolve(res) ]) }) } } // Thanks to https://gist.github.com/kumasento/617daa7e46f13ecdd9b2 export function promisify1 (func: (arg: T, cb: (err: any, result: A) => void) => void): (arg: T) => Promise { return function promisified (arg: T): Promise { return new Promise((resolve: (arg: A) => void, reject: (err: any) => void) => { // eslint-disable-next-line no-useless-call func.apply(null, [ arg, (err: any, res: A) => err ? reject(err) : resolve(res) ]) }) } } // eslint-disable-next-line max-len export function promisify2 (func: (arg1: T, arg2: U, cb: (err: any, result: A) => void) => void): (arg1: T, arg2: U) => Promise { return function promisified (arg1: T, arg2: U): Promise { return new Promise((resolve: (arg: A) => void, reject: (err: any) => void) => { // eslint-disable-next-line no-useless-call func.apply(null, [ arg1, arg2, (err: any, res: A) => err ? reject(err) : resolve(res) ]) }) } } // eslint-disable-next-line max-len export function promisify3 (func: (arg1: T, arg2: U, arg3: V, cb: (err: any, result: A) => void) => void): (arg1: T, arg2: U, arg3: V) => Promise { return function promisified (arg1: T, arg2: U, arg3: V): Promise { return new Promise((resolve: (arg: A) => void, reject: (err: any) => void) => { // eslint-disable-next-line no-useless-call func.apply(null, [ arg1, arg2, arg3, (err: any, res: A) => err ? reject(err) : resolve(res) ]) }) } }