UNPKG

@ethereum-sourcify/compilers

Version:

Wrapper around multiple compilers to download the right version and invoke the compilation with a common interface.

78 lines 5.67 kB
import { exec } from 'child_process'; import { logDebug, logError, logSilly } from '../logger'; /** * Fetches a resource with an exponential timeout. * 1) Send req, wait backoff * 2^0 ms, abort if doesn't resolve * 2) Send req, wait backoff * 2^1 ms, abort if doesn't resolve * 3) Send req, wait backoff * 2^2 ms, abort if doesn't resolve... * ... * ... */ export async function fetchWithBackoff(resource, backoff = 10000, retries = 4) { let timeout = backoff; for (let attempt = 0; attempt <= retries; attempt++) { try { logSilly('Start fetchWithBackoff', { resource, timeout, attempt }); const controller = new AbortController(); const id = setTimeout(() => { logDebug('Aborting request', { resource, timeout, attempt }); controller.abort(); }, timeout); const response = await fetch(resource, { signal: controller.signal, }); logSilly('Success fetchWithBackoff', { resource, timeout, attempt }); clearTimeout(id); return response; } catch (error) { if (attempt === retries) { logError('Failed fetchWithBackoff', { resource, attempt, retries, timeout, error, }); throw new Error(`Failed fetching ${resource}: ${error}`); } else { timeout *= 2; // exponential backoff logDebug('Retrying fetchWithBackoff', { resource, attempt, timeout, error, }); continue; } } } throw new Error(`Failed fetching ${resource}`); } export function asyncExec(command, inputStringified, maxBuffer) { // check if input is valid JSON. The input is untrusted and potentially cause arbitrary execution. JSON.parse(inputStringified); return new Promise((resolve, reject) => { const child = exec(command, { maxBuffer, }, (error, stdout, stderr) => { if (error) { reject(error); } else if (stderr) { reject(new Error(`Compiler process returned with errors:\n ${stderr}`)); } else { resolve(stdout); } }); if (!child.stdin) { throw new Error('No stdin on child process'); } // Write input to child process's stdin child.stdin.write(inputStringified); child.stdin.end(); }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFekQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0JBQWdCLENBQ3BDLFFBQWdCLEVBQ2hCLFVBQWtCLEtBQUssRUFDdkIsVUFBa0IsQ0FBQztJQUVuQixJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFFdEIsS0FBSyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxJQUFJLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQ3BELElBQUksQ0FBQztZQUNILFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNuRSxNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3pCLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDN0QsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3JCLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNaLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLFFBQVEsRUFBRTtnQkFDckMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO2FBQzFCLENBQUMsQ0FBQztZQUNILFFBQVEsQ0FBQywwQkFBMEIsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNyRSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakIsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLE9BQU8sS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDeEIsUUFBUSxDQUFDLHlCQUF5QixFQUFFO29CQUNsQyxRQUFRO29CQUNSLE9BQU87b0JBQ1AsT0FBTztvQkFDUCxPQUFPO29CQUNQLEtBQUs7aUJBQ04sQ0FBQyxDQUFDO2dCQUNILE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLFFBQVEsS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzNELENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsc0JBQXNCO2dCQUNwQyxRQUFRLENBQUMsMkJBQTJCLEVBQUU7b0JBQ3BDLFFBQVE7b0JBQ1IsT0FBTztvQkFDUCxPQUFPO29CQUNQLEtBQUs7aUJBQ04sQ0FBQyxDQUFDO2dCQUNILFNBQVM7WUFDWCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixRQUFRLEVBQUUsQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUN2QixPQUFlLEVBQ2YsZ0JBQXdCLEVBQ3hCLFNBQWlCO0lBRWpCLGtHQUFrRztJQUNsRyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFFN0IsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQ2hCLE9BQU8sRUFDUDtZQUNFLFNBQVM7U0FDVixFQUNELENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN4QixJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQixDQUFDO2lCQUFNLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ2xCLE1BQU0sQ0FDSixJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsTUFBTSxFQUFFLENBQUMsQ0FDaEUsQ0FBQztZQUNKLENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEIsQ0FBQztRQUNILENBQUMsQ0FDRixDQUFDO1FBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUNELHVDQUF1QztRQUN2QyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3BDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDcEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIn0=