UNPKG

@ethereum-sourcify/compilers

Version:

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

97 lines 6.74 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CompilerError = void 0; 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) { // Vyper compilers <0.4.0 outputs warnings to stderr // we handle this by checking if the stderr starts with "Warning:" if (stderr.startsWith('Warning:')) { resolve(stdout); } else { 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(); }); } class CompilerError extends Error { constructor(message, errors) { super(message); this.errors = errors; } } exports.CompilerError = CompilerError; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBWUEsNENBNENDO0FBRUQsOEJBdUNDO0FBakdELGlEQUFxQztBQUNyQyxzQ0FBeUQ7QUFHekQ7Ozs7Ozs7R0FPRztBQUNJLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsUUFBZ0IsRUFDaEIsVUFBa0IsS0FBSyxFQUN2QixVQUFrQixDQUFDO0lBRW5CLElBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUV0QixLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLElBQUksT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDO1lBQ0gsSUFBQSxpQkFBUSxFQUFDLHdCQUF3QixFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ25FLE1BQU0sVUFBVSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7WUFDekMsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDekIsSUFBQSxpQkFBUSxFQUFDLGtCQUFrQixFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUM3RCxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckIsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ1osTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsUUFBUSxFQUFFO2dCQUNyQyxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07YUFDMUIsQ0FBQyxDQUFDO1lBQ0gsSUFBQSxpQkFBUSxFQUFDLDBCQUEwQixFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3JFLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqQixPQUFPLFFBQVEsQ0FBQztR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