@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
JavaScript
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=