@ethereum-sourcify/compilers
Version:
Wrapper around multiple compilers to download the right version and invoke the compilation with a common interface.
90 lines • 6.24 kB
JavaScript
;
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) {
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBWUEsNENBNENDO0FBRUQsOEJBaUNDO0FBM0ZELGlEQUFxQztBQUNyQyxzQ0FBeUQ7QUFHekQ7Ozs7Ozs7R0FPRztBQUNJLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsUUFBZ0IsRUFDaEIsVUFBa0IsS0FBSyxFQUN2QixVQUFrQixDQUFDO0lBRW5CLElBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUV0QixLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLElBQUksT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDO1lBQ0gsSUFBQSxpQkFBUSxFQUFDLHdCQUF3QixFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ25FLE1BQU0sVUFBVSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7WUFDekMsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDekIsSUFBQSxpQkFBUSxFQUFDLGtCQUFrQixFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUM3RCxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckIsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ1osTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsUUFBUSxFQUFFO2dCQUNyQyxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07YUFDMUIsQ0FBQyxDQUFDO1lBQ0gsSUFBQSxpQkFBUSxFQUFDLDBCQUEwQixFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3JFLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqQixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksT0FBTyxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUN4QixJQUFBLGlCQUFRLEVBQUMseUJBQXlCLEVBQUU7b0JBQ2xDLFFBQVE7b0JBQ1IsT0FBTztvQkFDUCxPQUFPO29CQUNQLE9BQU87b0JBQ1AsS0FBSztpQkFDTixDQUFDLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsUUFBUSxLQUFLLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDM0QsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxzQkFBc0I7Z0JBQ3BDLElBQUEsaUJBQVEsRUFBQywyQkFBMkIsRUFBRTtvQkFDcEMsUUFBUTtvQkFDUixPQUFPO29CQUNQLE9BQU87b0JBQ1AsS0FBSztpQkFDTixDQUFDLENBQUM7Z0JBQ0gsU0FBUztZQUNYLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLFFBQVEsRUFBRSxDQUFDLENBQUM7QUFDakQsQ0FBQztBQUVELFNBQWdCLFNBQVMsQ0FDdkIsT0FBZSxFQUNmLGdCQUF3QixFQUN4QixTQUFpQjtJQUVqQixrR0FBa0c7SUFDbEcsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRTdCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDckMsTUFBTSxLQUFLLEdBQUcsSUFBQSxvQkFBSSxFQUNoQixPQUFPLEVBQ1A7WUFDRSxTQUFTO1NBQ1YsRUFDRCxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDeEIsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDVixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEIsQ0FBQztpQkFBTSxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNsQixNQUFNLENBQ0osSUFBSSxLQUFLLENBQUMsNENBQTRDLE1BQU0sRUFBRSxDQUFDLENBQ2hFLENBQUM7WUFDSixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xCLENBQUM7UUFDSCxDQUFDLENBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFDRCx1Q0FBdUM7UUFDdkMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNwQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQWEsYUFBYyxTQUFRLEtBQUs7SUFDdEMsWUFDRSxPQUFlLEVBQ1IsTUFBcUI7UUFFNUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRlIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtJQUc5QixDQUFDO0NBQ0Y7QUFQRCxzQ0FPQyJ9