{"version":3,"file":"promise.mjs","sources":["../../src/promise.ts"],"sourcesContent":["/**\n * @ Author: Hanrea\n * @ version: 2023-03-06 13:14:21\n * @ copyright: Vecmat (c) - <hi(at)vecmat.com>\n */\ninterface DeferObject {\n    promise: Promise<any>;\n    resolve: (res: any) => any;\n    reject: (err: any) => any;\n}\n\n/**\n * Get promise deffer object\n *\n * @returns {*}\n */\nexport function getDefer(): DeferObject {\n    const defer: any = {};\n    defer.promise = new Promise((resolve, reject) => {\n        defer.resolve = resolve;\n        defer.reject = reject;\n    });\n    return defer;\n}\n\n/**\n * Checks if fn is a GeneratorFunction\n *\n * @export\n * @param {*} fn\n * @returns {*}  {boolean}\n */\nexport function isGenerator(fn: any) {\n    return !!(fn && typeof fn === \"function\" && fn.constructor && fn.constructor.name === \"GeneratorFunction\");\n}\n\n/**\n * Checks if value is a Promise object\n *\n * @export\n * @param {*} value\n * @returns {*}  {boolean}\n */\nexport function isPromise(value: any) {\n    return !!(value && value.catch && typeof value.then === \"function\");\n}\n\n/**\n * Checks if value is a Async Function\n *\n * @export\n * @param {*} fn\n * @returns {*}  {boolean}\n */\nexport function isAsyncFunction(fn: any) {\n    return !!(fn && typeof fn === \"function\" && fn.constructor && fn.constructor.name === \"AsyncFunction\");\n}\n\n\n/**\n * Convert callback-style functions to Promises\n *\n * @export\n * @param {Function} fn\n * @param {*} [receiver]\n * @returns {*}\n */\nexport function promisify(fn: Function, receiver?: any) {\n    return function (...args: any[]) {\n        return new Promise((resolve, reject) => {\n            fn.apply(receiver, [\n                ...args,\n                function (err: Error, res: any) {\n                    return err ? reject(err) : resolve(res);\n                }\n            ]);\n        });\n    };\n}\n\n\n\n// 基于反射转义函数\n\n//  Build for Vecmat.\nexport type Callback<E extends Error, T extends any[]> = (err: E, ...args: T) => void;\n\n// 解析参数\nexport type PromisifyOne<T extends any[]> = T extends [Callback<Error, infer P>?]\n    ? () => Promise<[...P, Error]>\n    : T extends [infer T1, Callback<Error, infer P>?]\n    ? (arg: T1) => Promise<[...P, Error]>\n    : T extends [infer T1, infer T2, Callback<Error, infer P>?]\n    ? (arg1: T1, arg2: T2) => Promise<[...P, Error]>\n    : T extends [infer T1, infer T2, infer T3, Callback<Error, infer P>?]\n    ? (arg1: T1, arg2: T2, arg3: T3) => Promise<[...P, Error]>\n    : T extends [infer T1, infer T2, infer T3, infer T4, Callback<Error, infer P>?]\n    ? (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Promise<[...P, Error]>\n    : T extends [infer T1, infer T2, infer T3, infer T4, infer T5, Callback<Error, infer P>?]\n    ? (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Promise<[...P, Error]>\n    : T extends [infer T1, infer T2, infer T3, infer T4, infer T5, infer T6, Callback<Error, infer P>?]\n    ? (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Promise<[...P, Error]>\n    : T extends [infer T1, infer T2, infer T3, infer T4, infer T5, infer T6, infer T7, Callback<Error, infer P>?]\n    ? (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7) => Promise<[...P, Error]>\n    : T extends [infer T1, infer T2, infer T3, infer T4, infer T5, infer T6, infer T7, infer T8, Callback<Error, infer P>?]\n    ? (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8) => Promise<[...P, Error]>\n    : T extends [infer T1, infer T2, infer T3, infer T4, infer T5, infer T6, infer T7, infer T8, infer T9, Callback<Error, infer P>?]\n    ? (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9) => Promise<[...P, Error]>\n    : T;\n\n// 获取重载参数！\nexport type GetOverloadArgs<T> = T extends { (...o: infer U): void; (...o: infer U2): void; (...o: infer U3): void }\n    ? U | U2 | U3\n    : T extends { (...o: infer U): void; (...o: infer U2): void }\n    ? U | U2\n    : T extends { (...o: infer U): void }\n    ? U\n    : never;\n\ntype UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;\nexport type Promisify<T> = UnionToIntersection<PromisifyOne<GetOverloadArgs<T>>>;\n\n// Error first callback\nexport function VMAsyncifyWrap<T extends Function>(original: T) {\n    if (typeof original !== \"function\") {\n        throw new Error('The \"original\" argument must be of type Function. Received type undefined');\n    }\n    // Function\n    // AsyncFunction\n    // GeneratorFunction\n    // let ftype  = original.constructor.name;\n    // // 普通函数\n    // if(ftype == \"Function\"){\n    //     // 检测最后一个是否是函数\n    // }\n\n    // Names to create an object from in case the callback receives multiple\n    // arguments, e.g. ['bytesRead', 'buffer'] for fs.read.\n    async function asyncfun(...args: any[]) {\n        return new Promise((resolve: Function, reject: Function) => {\n            try {\n                Array.prototype.push(args, (err: Error, ...values: any[]) => {\n                    // can return err whith data\n                    resolve([err, ...values]);\n                });\n                Reflect.apply(original, this, args);\n            } catch (err) {\n                // 不丢给then第二个参数\n                throw err;\n            }\n        });\n    }\n    let prot = Object.getPrototypeOf(original);\n    prot.constructor.name = \"AsyncifyFunction\";\n    console.log(prot);\n    delete prot[\"constructor\"];\n    // Object.setPrototypeOf(fn, prot);\n    Object.defineProperties(asyncfun, Object.getOwnPropertyDescriptors(original));\n    // Object.setPrototypeOf(fn, Object.getPrototypeOf(original));\n\n    return asyncfun;\n}\n\n// refer\n\n// https://stackoverflow.com/questions/51650979/type-inference-with-overloaded-functions/51654917#51654917\n// https://github.com/wechaty/grpc/blob/58fa4006df93a6269194d682b0f988c1f3eb46c0/examples/promisify.ts\n// 需要参考 promisify 源码，改写 成VM 模式下的\n// https://github.com/nodejs/node/blob/42c0b2ae65e99e4774fe1d8a82a50b09b894adc7/lib/internal/util.js#L375\n// 泛型工具参考\n// https://github.com/sindresorhus/type-fest/blob/main/source/asyncify.d.ts\n// 直接转换 async 参数\n// https://github.com/sindresorhus/type-fest/blob/main/source/async-return-type.d.ts\n\n// 基于AST 处理 asyncify\n// https://github.com/SpitfireSatya/asyncify\n"],"names":[],"mappings":"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"}