{"version":3,"sources":["../src/func/promisify.ts"],"names":["buildNodejsArgs","args","callback","parseNodejsCallback","results","promisify","fn","options","buildArgs","parseCallback","resolve","reject","callArgs","result","e"],"mappings":";;;;AA+DA,IAAMA,CAAAA,CAAkB,CAACC,CAAAA,CAAWC,CACzB,GAAA,CAAC,GAAGD,CAAKC,CAAAA,CAAQ,CAEtBC,CAAAA,CAAAA,CAAuBC,CAAgB,EAAA,CACzC,GAAGA,CAAQ,CAAA,MAAA,GAAS,CACpB,CAAA,CAAA,GAAGA,CAAQ,CAAA,MAAA,CAAO,CAAKA,EAAAA,CAAAA,CAAQ,CAAC,CAAA,CAC5B,MAAMA,CAAAA,CAAQ,CAAC,CAAA,CAEf,OAAGA,CAAQ,CAAA,MAAA,EAAQ,CAAUA,CAAAA,CAAAA,CAAQ,CAAC,CAAA,CAC/BA,EAAQ,KAAM,CAAA,CAAC,CAE9B,CAAA,CAAA,CAWO,SAASC,CAAAA,CAAqEC,EAAsBC,CAAyC,CAAA,CAChJ,GAAM,CAAE,SAAAC,CAAAA,CAAAA,CAAU,aAAAC,CAAAA,CAAc,CAAI,CAAA,MAAA,CAAO,MAAO,CAAA,CAC9C,SAAUT,CAAAA,CAAAA,CACV,cAAcG,CAClB,CAAA,CAAEI,CAAO,CAAA,CAmBT,OAlBoB,SAAA,GAAYN,EAAW,CACvC,OAAO,IAAI,OAAA,CAAa,CAACS,CAAAA,CAAQC,IAAS,CACtC,IAAIC,CAAWJ,CAAAA,CAAAA,CAAUP,CAAY,CAAA,CAAA,GAAIG,CAAgB,GAAA,CACrD,GAAG,CACC,IAAMS,CAAAA,CAASJ,CAAcL,CAAAA,CAAO,EACpCM,CAAQG,CAAAA,CAAM,EAClB,CAAA,MAAOC,CAAE,CAAA,CACLH,CAAOG,CAAAA,CAAC,EACZ,CACJ,CAAC,CAAA,CACD,GAAG,CACCR,EAAG,GAAGM,CAAQ,EAClB,CAAA,MAAOE,CAAE,CAAA,CACLH,CAAOG,CAAAA,CAAC,EACZ,CACJ,CAAC,CACL,CAGJ","file":"chunk-IDRPOXQ6.mjs","sourcesContent":["/**\r\n * \r\n * 封装一个任意支持callback的同步函数为异步函数\r\n * \r\n * \r\n * \r\n * \r\n * promiseify(fs.readFile)('package.json', 'utf8').then().catch()\r\n * \r\n * \r\n * // 比如myFunc函数的第二个参数是callback，那么可以这样使用\r\n * function myfunc(a,callback,options){  \r\n * } \r\n * \r\n * promisedFunc(a,options).then().catch()\r\n * \r\n * \r\n * promisedFunc = promiseify(myfunc,{\r\n *      buildArgs:(...args:any[],callback)=>{  // 将callback放到最后一个参数\r\n *          return [args[0],callback,args[1]]\r\n *      }\r\n * })\r\n * \r\n *  如果myFunc函数的callback不是标准nodejs callback样式,签名是这样: (a,b,err,c)=>{}\r\n *  \r\n *  则需要自己实现handleCallback\r\n * \r\n * promisedFunc = promiseify(myfunc,{\r\n *      buildArgs:(...args:any[],callback)=>{  // 将callback放到最后一个参数\r\n *          return [args[0],callback,args[1]]\r\n *      },\r\n *      parseCallback:(results:any[])=>{\r\n *          return [results[2],results[0],results[1],results[3]]\r\n *      })\r\n * })\r\n * \r\n * \r\n * \r\n * \r\n * \r\n * \r\n * \r\n * \r\n */ \r\n\r\n import type { AsyncFunction } from '../types/asyncFunction';\r\n\r\nexport type BuildArgsFunction<Args> = (args:Args,callback:(...results:any[])=>void)=>any[] \r\n\r\nexport interface PromiseifyOptions<Func extends (...args: any) => any>{\r\n    // 处理输入参数，返回最终异步函数的入参，以及callback函数参数\r\n    // 例：nodejs的函数一般最后一个参数是callback,如fs.readFile(path,encoding,callback)\r\n    // buildArgs:(...args:any[])=>{\r\n    //     return [...args,callback]   // 将参数添加到最后一个\r\n    //}\r\n    buildArgs?:BuildArgsFunction<Parameters<Func>>\r\n    parseCallback?:(results:any[])=>any\r\n}\r\n\r\nexport interface IncludeCallbackFunction {\r\n\r\n}\r\n \r\nconst buildNodejsArgs = (args:any[],callback:Function)=>{\r\n    return [...args,callback]\r\n}\r\nconst parseNodejsCallback = (results:any[])=>{\r\n    if(results.length===0) return undefined\r\n    if(results.length>0 && results[0]){\r\n        throw results[0]\r\n    }else{\r\n        if(results.length==2) return results[1]\r\n        return results.slice(1)\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * \r\n * \r\n * @param fn  \r\n * @param options \r\n * @returns \r\n */\r\n\r\nexport function promisify<PromisedFunc extends (...args:any[])=>any = AsyncFunction>(fn:(...args:any)=>any,options?:PromiseifyOptions<PromisedFunc>){\r\n    const { buildArgs,parseCallback } = Object.assign({\r\n        buildArgs:buildNodejsArgs,\r\n        parseCallback:parseNodejsCallback\r\n    },options) as Required<PromiseifyOptions<PromisedFunc>>\r\n    const promisifyed = function(...args:any[]){\r\n        return new Promise<any>((resolve,reject)=>{\r\n            let callArgs = buildArgs(args as any,(...results:any[])=>{\r\n                try{\r\n                    const result = parseCallback(results)\r\n                    resolve(result)\r\n                }catch(e){\r\n                    reject(e)\r\n                }\r\n            }) \r\n            try{\r\n                fn(...callArgs)\r\n            }catch(e){\r\n                reject(e)\r\n            }\r\n        })\r\n    }\r\n    \r\n    return  promisifyed as PromisedFunc\r\n}\r\n \r\n\r\n// import fs from \"node:fs\"\r\n// const readFile = promisify<string>(fs.readFile)\r\n\r\n// readFile(\"./retry.ts\").then((content)=>{\r\n//     console.log(\"content:\",String(content))\r\n// })\r\n\r\n\r\n// function sum(callback:(x:number,y:number,z:number)=>void,a:number,b:number){\r\n//     if(a==0 && b==0) throw new Error(\"a and b can not be 0\")\r\n//     callback(a,b,a+b)\r\n// }\r\n\r\n// const promisifySum = promisify(sum,{\r\n//     buildArgs:(args:any[],callback)=>{\r\n//         return [callback,...args]\r\n//     },\r\n//     parseCallback:(results:any[])=>{\r\n//         return results\r\n//     }\r\n// })\r\n\r\n// promisifySum(1,2).then((result)=>{\r\n//     console.log(\"sum result:\",result)\r\n// })  \r\n\r\n\r\n// promisifySum(0,0).catch((e:Error)=>{\r\n//     console.log(\"sum error:\",e.message)\r\n// }) \r\n\r\n\r\n\r\n\r\n// import fs from \"node:fs\"\r\n// import path from \"node:path\"\r\n\r\n// const fileExists = promisify(fs.exists,{\r\n//     parseCallback(results) {\r\n//         return results[0]\r\n//     },\r\n// })\r\n// const readFile = promisify(fs.readFile)\r\n// const writeFile = promisify(fs.writeFile)\r\n// const mkdir = promisify(fs.mkdir)\r\n\r\n// async function main(){\r\n//     console.log(\"-------------------\")\r\n//     const file = path.join(__dirname,\"promisify.ts\")\r\n//     console.log(\"promisify.ts is exists: \",await fileExists(file))\r\n//     console.log(\"promisify.ts content: \",await readFile(file))\r\n//     console.log(\"mkdir: \",await mkdir(\"dir\"))\r\n\r\n// }\r\n\r\n// main().then(()=>{}).catch((e)=>{\r\n//     console.log(e.stack)\r\n// })\r\n\r\n"]}