UNPKG

@ethereum-sourcify/compilers

Version:

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

82 lines 5.86 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.fetchWithBackoff = fetchWithBackoff; exports.asyncExec = asyncExec; const child_process_1 = require("child_process"); const logger_1 = require("../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... * ... * ... */ async function fetchWithBackoff(resource, backoff = 10000, retries = 4) { let timeout = backoff; for (let attempt = 0; attempt <= retries; attempt++) { try { (0, logger_1.logSilly)('Start fetchWithBackoff', { resource, timeout, attempt }); const controller = new AbortController(); const id = setTimeout(() => { (0, logger_1.logDebug)('Aborting request', { resource, timeout, attempt }); controller.abort(); }, timeout); const response = await fetch(resource, { signal: controller.signal, }); (0, logger_1.logSilly)('Success fetchWithBackoff', { resource, timeout, attempt }); clearTimeout(id); return response; } catch (error) { if (attempt === retries) { (0, logger_1.logError)('Failed fetchWithBackoff', { resource, attempt, retries, timeout, error, }); throw new Error(`Failed fetching ${resource}: ${error}`); } else { timeout *= 2; // exponential backoff (0, logger_1.logDebug)('Retrying fetchWithBackoff', { resource, attempt, timeout, error, }); continue; } } } throw new Error(`Failed fetching ${resource}`); } 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 = (0, child_process_1.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFXQSw0Q0E0Q0M7QUFFRCw4QkFpQ0M7QUExRkQsaURBQXFDO0FBQ3JDLHNDQUF5RDtBQUV6RDs7Ozs7OztHQU9HO0FBQ0ksS0FBSyxVQUFVLGdCQUFnQixDQUNwQyxRQUFnQixFQUNoQixVQUFrQixLQUFLLEVBQ3ZCLFVBQWtCLENBQUM7SUFFbkIsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBRXRCLEtBQUssSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sSUFBSSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUNwRCxJQUFJLENBQUM7WUFDSCxJQUFBLGlCQUFRLEVBQUMsd0JBQXdCLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDbkUsTUFBTSxVQUFVLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUN6QyxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUN6QixJQUFBLGlCQUFRLEVBQUMsa0JBQWtCLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQzdELFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNyQixDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDWixNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxRQUFRLEVBQUU7Z0JBQ3JDLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTthQUMxQixDQUFDLENBQUM7WUFDSCxJQUFBLGlCQUFRLEVBQUMsMEJBQTBCLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDckUsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2pCLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxPQUFPLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQ3hCLElBQUEsaUJBQVEsRUFBQyx5QkFBeUIsRUFBRTtvQkFDbEMsUUFBUTtvQkFDUixPQUFPO29CQUNQLE9BQU87b0JBQ1AsT0FBTztvQkFDUCxLQUFLO2lCQUNOLENBQUMsQ0FBQztnQkFDSCxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixRQUFRLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQztZQUMzRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLHNCQUFzQjtnQkFDcEMsSUFBQSxpQkFBUSxFQUFDLDJCQUEyQixFQUFFO29CQUNwQyxRQUFRO29CQUNSLE9BQU87b0JBQ1AsT0FBTztvQkFDUCxLQUFLO2lCQUNOLENBQUMsQ0FBQztnQkFDSCxTQUFTO1lBQ1gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsUUFBUSxFQUFFLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQsU0FBZ0IsU0FBUyxDQUN2QixPQUFlLEVBQ2YsZ0JBQXdCLEVBQ3hCLFNBQWlCO0lBRWpCLGtHQUFrRztJQUNsRyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFFN0IsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyxNQUFNLEtBQUssR0FBRyxJQUFBLG9CQUFJLEVBQ2hCLE9BQU8sRUFDUDtZQUNFLFNBQVM7U0FDVixFQUNELENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN4QixJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQixDQUFDO2lCQUFNLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ2xCLE1BQU0sQ0FDSixJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsTUFBTSxFQUFFLENBQUMsQ0FDaEUsQ0FBQztZQUNKLENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEIsQ0FBQztRQUNILENBQUMsQ0FDRixDQUFDO1FBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUNELHVDQUF1QztRQUN2QyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3BDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDcEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIn0=