/**
 * Minified by jsDelivr using Terser v5.39.0.
 * Original file: /npm/ak-fetch@2.0.16/index.js
 *
 * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
 */
#! /usr/bin/env node
import RunQueue from"run-queue";import{json,isJSONStr,comma,makeExist}from"ak-tools";import cli from"./cli.js";import{execSync}from"child_process";import{Readable}from"stream";import path from"path";import{createReadStream,existsSync}from"fs";import{config as dotenvConfig}from"dotenv";dotenvConfig({debug:!1,override:!1});import HttpClient from"./lib/http-client.js";import CircularBuffer from"./lib/circular-buffer.js";import StreamProcessors from"./lib/stream-processors.js";import{createLogger}from"./lib/logger.js";import{getPresetTransform,applyPresetTransform}from"./lib/presets.js";import{AkFetchError,NetworkError,TimeoutError,RetryError,ValidationError,RateLimitError,ConfigurationError,SSLError,MemoryError}from"./lib/errors.js";async function invokeErrorHandler(e,r,t=void 0){if(e&&"function"==typeof e)try{const o=void 0!==t?e(r,t):e(r);o&&"function"==typeof o.then&&await o}catch(e){console.error("Error in errorHandler:",e)}}async function main(e){return validateInput(e),Array.isArray(e)?await processMultipleConfigs(e):await processSingleConfig(e)}function validateInput(e){if(!e)throw new ValidationError("No parameters provided");if(Array.isArray(e)){if(0===e.length)throw new ValidationError("Empty configuration array provided");e.forEach(((e,r)=>{if(!e.url)throw new ValidationError(`No URL provided for config at index ${r}`)}))}else if(!e.url)throw new ValidationError("No URL provided")}async function processMultipleConfigs(e){const r=Date.now(),t=e[0],o=t?.concurrency||10,a=t?.delay||0,n=!1!==t?.verbose,s=t?.logFile,i=t?.format||"json",c=t?.hook,l=createLogger({verbose:n,showThroughput:!0,logPrefix:"🌍"});l.start("Processing multiple endpoints",{count:e.length,concurrency:o,delay:a?`${a}ms`:"none"});const u=new RunQueue({maxConcurrency:o}),m=[];let f=0,d=0;const p=e.length;for(const r of e)u.add(0,(async()=>{a>0&&await new Promise((e=>setTimeout(e,a)));try{f++;const e=await processSingleConfig(r,!1);Array.isArray(e)?m.push(...e):m.push(e),l.progress(f,p)}catch(e){d++,l.error(`Config ${f} failed:`,e.message),m.push({error:e.message,config:sanitizeConfig(r)}),l.progress(f,p)}}));await u.run();const y=Date.now()-r,h="function"==typeof c?c(m):m;s&&(l.fileOperation("Writing",s,i),await writeLogFile(s,h,i,n));const g={responses:h,duration:y,clockTime:prettyTime(y),reqCount:f,rowCount:f,rps:Math.floor(f/(y/1e3)),errors:d,configCount:p};return l.complete(g),{responses:h,duration:y,clockTime:prettyTime(y),reqCount:f,rowCount:p,rps:Math.floor(f/(y/1e3)),errors:d,configCount:p}}async function processSingleConfig(e,r=!0){const t=Date.now(),o=setDefaults(e);validateConfig(o);const a=createLogger({verbose:o.verbose,showThroughput:!0,showMemory:o.verbose&&r});if(o.shell&&(o.headers=await executeShellCommand(o.shell,o.headers)),r&&a.start("Starting HTTP request job",sanitizeConfig(o)),o.dryRun)return"curl"===o.dryRun?await handleCurlGeneration(o,a,r):await handleDryRun(o,a,r);if(o.noBatch){const e=await executeSingleRequest(o,a);return r&&a.complete(e),e}const n=await createDataStream(o),[s,i,c,l]=await processDataStream(n,o,a),u=Date.now()-t,m=Math.floor(i/(u/1e3)),f={responses:s,duration:u,clockTime:prettyTime(u),reqCount:i,rowCount:c,rps:m,errors:l||0,stats:getMemoryStats()};return o.logFile&&r&&(a.fileOperation("Writing",o.logFile,o.format),void 0===o.verbose&&(o.verbose=!1),await writeLogFile(o.logFile,s,o.format,o.verbose)),r&&a.complete(f),f}function setDefaults(e){const r={batchSize:1,concurrency:10,maxTasks:25,delay:0,verbose:!1,retries:3,retryDelay:1e3,retryOn:[408,429,500,502,503,504,520,521,522,523,524],timeout:6e4,keepAlive:!0,method:"POST",debug:!1,highWaterMark:16384,storeResponses:!0,responseHeaders:!1,forceGC:!1,clone:!1,noBatch:!1,format:"json",enableCookies:!1,maxResponseBuffer:1e3,useStaticRetryDelay:!1,enableConnectionPooling:!0,dryRun:!1,headers:{},searchParams:null,bodyParams:null,transform:null,shell:null,...e};return null!==r.retries||e.hasOwnProperty("storeResponses")||(r.storeResponses=!1),r}function validateConfig(e){if(!e.url)throw new ConfigurationError("URL is required");const r=e.method||"POST",t=e.batchSize??1,o=e.concurrency??10,a=e.timeout??6e4;if(!e.data&&["POST","PUT","PATCH"].includes(r.toUpperCase()))throw new ConfigurationError(`${r} request requires data`);if(t<0)throw new ConfigurationError("batchSize must be non-negative");if(o<1)throw new ConfigurationError("concurrency must be at least 1");if(a<1e3)throw new ConfigurationError("timeout must be at least 1000ms");if(null!==e.transform&&void 0!==e.transform&&"function"!=typeof e.transform)throw new ConfigurationError("transform must be a function or null")}async function executeShellCommand(e,r={}){try{const t=execSync(e.command,{encoding:"utf8"}).trim(),o=e.header||"Authorization",a=e.prefix||"Bearer";return{...r,[o]:`${a} ${t}`}}catch(e){throw new ConfigurationError(`Shell command failed: ${e.message}`)}}async function executeSingleRequest(e,r){const t=createHttpClient({timeout:e.timeout??6e4,enableConnectionPooling:e.enableConnectionPooling??!0,keepAlive:e.keepAlive??!0,concurrency:e.concurrency??10,retries:e.retries??3,retryDelay:e.retryDelay??1e3,retryOn:e.retryOn??[408,429,500,502,503,504,520,521,522,523,524],retryHandler:e.retryHandler||void 0,useStaticRetryDelay:e.useStaticRetryDelay??!1,enableCookies:e.enableCookies??!1,maxFileSize:e.maxFileSize??void 0,url:e.url,data:e.data,method:e.method??"POST",headers:e.headers??{}});try{r&&r.isVerbose()&&r.info("Executing single request (no batching)");const o=await t.request(e),a=Date.now(),n=a-a;return{responses:[o],duration:n,clockTime:prettyTime(n),reqCount:1,rowCount:Array.isArray(e.data)?e.data.length:1,rps:0,errors:0,stats:getMemoryStats()}}catch(r){throw await invokeErrorHandler(e.errorHandler,r),r}finally{t.destroy()}}async function createDataStream(e){const{data:r,highWaterMark:t}=e,o=new StreamProcessors({highWaterMark:t});if(r instanceof Readable)return r.readableObjectMode?r:r.pipe(o.createJSONLTransform());if("string"==typeof r){if(existsSync(path.resolve(r))){const e=path.resolve(r);if(".json"===path.extname(e).toLowerCase()){const r=require("fs").readFileSync(e,"utf8"),t=JSON.parse(r);return Readable.from(Array.isArray(t)?t:[t])}return createReadStream(e,{highWaterMark:t}).pipe(o.createJSONLTransform())}if(isJSONStr(r)){const e=JSON.parse(r);return Readable.from(Array.isArray(e)?e:[e])}if(r.split("\n").every((e=>""===e.trim()||isJSONStr(e))))return Readable.from(r.split("\n").filter((e=>e.trim())).map((e=>JSON.parse(e))));throw new ValidationError("Invalid data format")}if(Array.isArray(r))return Readable.from(r);if("object"==typeof r&&null!==r)return Readable.from([r]);const a=e.method||"POST";if(["GET","HEAD","OPTIONS"].includes(a.toUpperCase()))return Readable.from([{}]);throw new ValidationError("No valid data source provided")}async function processDataStream(e,r,t){const{batchSize:o=1,concurrency:a=10,maxTasks:n=25,delay:s=0,maxResponseBuffer:i=1e3,maxMemoryUsage:c,storeResponses:l=!0,forceGC:u=!1}=r;let m=new RunQueue({maxConcurrency:a});const f=l?new CircularBuffer(i):null,d=new StreamProcessors({maxMemoryUsage:c}),p=createHttpClient({timeout:r.timeout??6e4,enableConnectionPooling:r.enableConnectionPooling??!0,keepAlive:r.keepAlive??!0,concurrency:r.concurrency??10,retries:r.retries??3,retryDelay:r.retryDelay??1e3,retryOn:r.retryOn??[408,429,500,502,503,504,520,521,522,523,524],retryHandler:r.retryHandler||void 0,useStaticRetryDelay:r.useStaticRetryDelay??!1,enableCookies:r.enableCookies??!1,maxFileSize:r.maxFileSize??void 0,url:r.url,data:r.data,method:r.method??"POST",headers:r.headers??{}});let y=0,h=0,g=0,w=[],S=!1;c&&(e=e.pipe(d.createMemoryMonitorTransform())),e.on("error",(e=>{t.error("Stream error:",e.message)})),e.on("end",(()=>{t.isVerbose()&&t.info(`Stream ended: processed ${comma(h)} records, ${comma(y)} requests`)}));for await(const s of e){const i=["GET","HEAD","OPTIONS"].includes((r.method||"POST").toUpperCase())&&"object"==typeof s&&null!==s&&0===Object.keys(s).length;if(null!==s&&!i){let e=s;if(r.clone&&(e="object"==typeof s&&null!==s?JSON.parse(JSON.stringify(s)):s),r.preset)try{e=applyPresetTransform(e,r.preset,r.errorHandler)}catch(o){if(t.error(`Preset transform error (${r.preset}): ${o.message}`),await invokeErrorHandler(r.errorHandler,o,e),!r.errorHandler)throw o}if("function"==typeof r.transform)try{const t=r.transform(e);void 0!==t&&(e=t,r.clone||"object"!=typeof s||null===s||Array.isArray(s)||"object"!=typeof t||Array.isArray(t)||Object.assign(s,t))}catch(o){if(t.error(`Transform error: ${o.message}`),await invokeErrorHandler(r.errorHandler,o,e),!r.errorHandler)throw o}w.push(e),h++}(w.length>=o||null===s&&w.length>0||i&&0===w.length)&&(i&&0===w.length?C([]):(C(w),w=[])),m.queued>=n&&!S&&(e.pause(),S=!0,await m.run(),m=new RunQueue({maxConcurrency:a}),e.resume(),S=!1)}w.length>0&&C(w),m.queued>0&&await m.run(),e&&"function"==typeof e.destroy&&(e.removeAllListeners(),e.destroy()),p.destroy();const b=f?f.toArray():[];return u&&global.gc&&global.gc(),[b,y,h,g];function C(e){const a=e.slice();m.add(0,(async()=>{try{const e={...r,data:0===a.length?void 0:1===a.length?a[0]:a},n=await p.request(e);f&&f.push(n),y++,s>0&&await new Promise((e=>setTimeout(e,s))),t.progress(y,Math.ceil(h/(o||1)),h),r.responseHandler&&"function"==typeof r.responseHandler&&r.responseHandler(n)}catch(e){if(g++,t.error("Batch processing failed:",e.message),await invokeErrorHandler(r.errorHandler,e),!r.errorHandler&&f){const r={error:e.message,batch:a};e.statusCode&&(r.statusCode=e.statusCode),e.body&&(r.body=e.body),e.url&&(r.url=e.url),e.method&&(r.method=e.method),e.timestamp&&(r.timestamp=e.timestamp),f.push(r)}}}))}}function createHttpClient(e){const r=e.concurrency??10,t={timeout:e.timeout,keepAlive:!!e.enableConnectionPooling&&e.keepAlive,maxSockets:2*r,maxFreeSockets:r,retry:{maxRetries:e.retries,baseDelay:e.retryDelay,retryOn:e.retryOn,retryHandler:e.retryHandler,useStaticDelay:e.useStaticRetryDelay,staticRetryDelay:e.retryDelay},cookies:{enabled:e.enableCookies},formData:{maxFileSize:e.maxFileSize}};return new HttpClient(t)}async function writeLogFile(e,r,t,o){try{await makeExist(e);const a=new StreamProcessors,n=Readable.from(Array.isArray(r)?r:[r]);if(await a.streamToFile(n,e,t),o){createLogger({verbose:o}).success(`Log written to ${e}`)}}catch(e){createLogger({verbose:!0}).error(`Failed to write log file: ${e.message}`)}}function sanitizeConfig(e){const r={...e};if(delete r.data,r.headers){const e=["authorization","cookie","x-api-key"];r.headers={...r.headers},Object.keys(r.headers).forEach((t=>{e.includes(t.toLowerCase())&&(r.headers[t]="[REDACTED]")}))}return r}function getMemoryStats(){const e=process.memoryUsage();return{heapUsed:Math.round(e.heapUsed/1024/1024*100)/100,heapTotal:Math.round(e.heapTotal/1024/1024*100)/100,external:Math.round(e.external/1024/1024*100)/100,rss:Math.round(e.rss/1024/1024*100)/100}}async function handleCurlGeneration(e,r,t){const o=Date.now();r.isVerbose()&&r.info("Generating curl commands - no actual requests will be made");const a=await createDataStream(e);let n=0;const s=[];for await(const t of a)if(null!==t){n++;let o=t;if("function"==typeof e.transform)try{e.clone&&(o="object"==typeof t&&null!==t?JSON.parse(JSON.stringify(t)):t);const r=e.transform(o);void 0!==r&&(o=r)}catch(e){throw r.error(`Transform error in curl generation: ${e.message}`),e}const a=generateCurlCommand(e,o);s.push(a)}const i=Date.now()-o,c={responses:s,duration:i,clockTime:prettyTime(i),reqCount:0,rowCount:n,rps:0,errors:0,stats:getMemoryStats()};return t&&r.complete(c),c}function generateCurlCommand(e,r){const t=["curl"];if(e.method&&"GET"!==e.method&&t.push(`-X ${e.method}`),e.headers&&Object.entries(e.headers).forEach((([e,r])=>{t.push(`-H "${e}: ${r}"`)})),["POST","PUT","PATCH","DELETE"].includes(e.method?.toUpperCase())&&r){const o="string"==typeof r?r:JSON.stringify(r);t.push(`-d '${o}'`);e.headers&&Object.keys(e.headers).some((e=>"content-type"===e.toLowerCase()))||t.push('-H "Content-Type: application/json"')}let o=e.url;if(e.searchParams){o+=`?${new URLSearchParams(e.searchParams).toString()}`}return t.push(`"${o}"`),t.join(" ")}async function handleDryRun(e,r,t){const o=Date.now();r.isVerbose()&&r.info("Running in dry run mode - no actual requests will be made");const a=await createDataStream(e);let n=0;const s=[];for await(const t of a)if(null!==t){n++;let o=t;if(e.clone&&(o="object"==typeof t&&null!==t?JSON.parse(JSON.stringify(t)):t),e.preset)try{o=applyPresetTransform(o,e.preset,e.errorHandler)}catch(t){if(r.error(`Preset transform error in dry run (${e.preset}): ${t.message}`),await invokeErrorHandler(e.errorHandler,t,o),!e.errorHandler)throw t}if("function"==typeof e.transform)try{const r=e.transform(o);void 0!==r&&(o=r,e.clone||"object"!=typeof t||null===t||Array.isArray(t)||"object"!=typeof r||Array.isArray(r)||Object.assign(t,r))}catch(t){if(r.error(`Transform error in dry run: ${t.message}`),await invokeErrorHandler(e.errorHandler,t,o),!e.errorHandler)throw t}if((e.preset||e.transform)&&(s.push(o),(e.showData||e.showSample)&&r.isVerbose())){const t=e.showSample?3:100;s.length<=t?r.info(`Transformed record ${s.length}:`,JSON.stringify(o,null,2)):s.length===t+1&&r.info(`... (showing only first ${t} transformed records)`)}}e.batchSize>0?Math.ceil(n/e.batchSize):Math.max(1,n);const i=Date.now()-o,c={responses:s,duration:i,clockTime:prettyTime(i),reqCount:0,rowCount:n,rps:0,errors:0,stats:getMemoryStats()};return t&&r.complete(c),c}function prettyTime(e){const r=e/1e3,t=[[Math.floor(r/31536e3),"years"],[Math.floor(r%31536e3/86400),"days"],[Math.floor(r%31536e3%86400/3600),"hours"],[Math.floor(r%31536e3%86400%3600/60),"minutes"]],o=parseFloat((r%60).toFixed(2));t.push([o,"seconds"]);let a="";for(let e=0;e<t.length;e++){if(0==t[e][0]||e===t.length-1&&0==t[e][0])continue;const r=1===t[e][0]?String(t[e][1]).slice(0,-1):t[e][1];a+=` ${t[e][0]} ${r}`}return a.trim()||"0 seconds"}import.meta.url===`file://${process.argv[1]}`&&cli().then((e=>main(e).then((r=>({params:e,results:r}))))).then((({params:e,results:r})=>{if(e.verbose){const e=createLogger({verbose:!0});e.log("\n📋 Final Results Summary:"),e.log(json(r))}})).catch((e=>{createLogger({verbose:!0}).error("Operation failed:",e.message),e.stack&&"development"===process.env.NODE_ENV&&(console.error("\nStack trace:"),console.error(e.stack)),process.exit(1)})).finally((()=>{process.exit(0)}));export default main;export{AkFetchError,NetworkError,TimeoutError,RetryError,ValidationError,RateLimitError,ConfigurationError,SSLError,MemoryError};
//# sourceMappingURL=/sm/3183bc26d4516ae31b96d70b427905ff1ffdf3f20ee3262bdb07784bb1adb8b7.map