UNPKG

faastjs

Version:

Serverless batch computing made simple.

91 lines 11.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.synthesizeFaastError = exports.FaastError = exports.FaastErrorNames = void 0; const verror_1 = require("verror"); const log_1 = require("./log"); /** * Possible FaastError names. See {@link FaastError}. To test for errors * matching these names, use the static method * {@link FaastError}.hasCauseWithName(). * @public */ var FaastErrorNames; (function (FaastErrorNames) { /** Generic error. See {@link FaastError}. */ FaastErrorNames["EGENERIC"] = "VError"; /** The arguments passed to the cloud function could not be serialized without losing information. */ FaastErrorNames["ESERIALIZE"] = "FaastSerializationError"; /** The remote cloud function timed out. */ FaastErrorNames["ETIMEOUT"] = "FaastTimeoutError"; /** The remote cloud function exceeded memory limits. */ FaastErrorNames["EMEMORY"] = "FaastOutOfMemoryError"; /** The function invocation was cancelled by user request. */ FaastErrorNames["ECANCEL"] = "FaastCancelError"; /** The exception was thrown by user's remote code, not by faast.js or the cloud provider. */ FaastErrorNames["EEXCEPTION"] = "UserException"; /** Could not create the remote cloud function or supporting infrastructure. */ FaastErrorNames["ECREATE"] = "FaastCreateFunctionError"; /** The remote cloud function failed to execute because of limited concurrency. */ FaastErrorNames["ECONCURRENCY"] = "FaastConcurrencyError"; })(FaastErrorNames || (exports.FaastErrorNames = FaastErrorNames = {})); /** * FaastError is a subclass of VError (https://github.com/joyent/node-verror). * that is thrown by faast.js APIs and cloud function invocations. * @remarks * `FaastError` is a subclass of * {@link https://github.com/joyent/node-verror | VError}, which provides an API * for nested error handling. The main API is the same as the standard Error * class, namely the err.message, err.name, and err.stack properties. * * Several static methods on {@link FaastError} are inherited from VError: * * FaastError.fullStack(err) - property provides a more detailed stack trace * that include stack traces of causes in the causal chain. * * FaastError.info(err) - returns an object with fields `functionName`, `args`, * and `logUrl`. The `logUrl` property is a URL pointing to the logs for a * specific invocation that caused the error.`logUrl` will be surrounded by * whitespace on both sides to ease parsing as a URL by IDEs. * * FaastError.hasCauseWithName(err, cause) - returns true if the FaastError or * any of its causes includes an error with the given name, otherwise false. All * of the available names are in the enum {@link FaastErrorNames}. For example, * to detect if a FaastError was caused by a cloud function timeout: * * ```typescript * FaastError.hasCauseWithName(err, FaastErrorNames.ETIMEOUT) * ``` * * FaastError.findCauseByName(err, cause) - like FaastError.hasCauseWithName() * except it returns the Error in the causal chain with the given name instead * of a boolean, otherwise null. * * @public */ class FaastError extends verror_1.VError { } exports.FaastError = FaastError; function synthesizeFaastError({ errObj, logUrl, functionName, args }) { let underlying; if (logUrl || functionName || args) { underlying = new FaastError({ name: FaastErrorNames.EEXCEPTION, info: { logUrl, functionName, args } }, "%s", logUrl ?? "user exception"); underlying.stack = `${underlying} at ${functionName} (faast.js cloud function invocation)`; } const error = new FaastError({ cause: underlying, info: errObj, name: errObj.name }, "%s", errObj.message); if (errObj.stack) { error.stack = errObj.stack; } // Surround the logUrl with spaces because URL links are broken in vscode if // there's no whitespace surrounding the URL. if (Object.keys(errObj).length === 0 && !(errObj instanceof Error)) { log_1.log.warn(`Error response object has no keys, likely a bug in faast (not serializing error objects)`); } return error; } exports.synthesizeFaastError = synthesizeFaastError; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQWdDO0FBQ2hDLCtCQUE0QjtBQUU1Qjs7Ozs7R0FLRztBQUNILElBQVksZUFpQlg7QUFqQkQsV0FBWSxlQUFlO0lBQ3ZCLDZDQUE2QztJQUM3QyxzQ0FBbUIsQ0FBQTtJQUNuQixzR0FBc0c7SUFDdEcseURBQXNDLENBQUE7SUFDdEMsMkNBQTJDO0lBQzNDLGlEQUE4QixDQUFBO0lBQzlCLHdEQUF3RDtJQUN4RCxvREFBaUMsQ0FBQTtJQUNqQyw2REFBNkQ7SUFDN0QsK0NBQTRCLENBQUE7SUFDNUIsNkZBQTZGO0lBQzdGLCtDQUE0QixDQUFBO0lBQzVCLCtFQUErRTtJQUMvRSx1REFBb0MsQ0FBQTtJQUNwQyxrRkFBa0Y7SUFDbEYseURBQXNDLENBQUE7QUFDMUMsQ0FBQyxFQWpCVyxlQUFlLCtCQUFmLGVBQWUsUUFpQjFCO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlDRztBQUNILE1BQWEsVUFBVyxTQUFRLGVBQU07Q0FBRztBQUF6QyxnQ0FBeUM7QUFFekMsU0FBZ0Isb0JBQW9CLENBQUMsRUFDakMsTUFBTSxFQUNOLE1BQU0sRUFDTixZQUFZLEVBQ1osSUFBSSxFQU1QO0lBQ0csSUFBSSxVQUFVLENBQUM7SUFDZixJQUFJLE1BQU0sSUFBSSxZQUFZLElBQUksSUFBSSxFQUFFLENBQUM7UUFDakMsVUFBVSxHQUFHLElBQUksVUFBVSxDQUN2QixFQUFFLElBQUksRUFBRSxlQUFlLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFDMUUsSUFBSSxFQUNKLE1BQU0sSUFBSSxnQkFBZ0IsQ0FDN0IsQ0FBQztRQUNGLFVBQVUsQ0FBQyxLQUFLLEdBQUcsR0FBRyxVQUFVO1NBQy9CLFlBQVksdUNBQXVDLENBQUM7SUFDekQsQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUN4QjtRQUNJLEtBQUssRUFBRSxVQUFVO1FBQ2pCLElBQUksRUFBRSxNQUFNO1FBQ1osSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO0tBQ3BCLEVBQ0QsSUFBSSxFQUNKLE1BQU0sQ0FBQyxPQUFPLENBQ2pCLENBQUM7SUFDRixJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNmLEtBQUssQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUMvQixDQUFDO0lBQ0QsNEVBQTRFO0lBQzVFLDZDQUE2QztJQUM3QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxZQUFZLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDakUsU0FBRyxDQUFDLElBQUksQ0FDSiwwRkFBMEYsQ0FDN0YsQ0FBQztJQUNOLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBekNELG9EQXlDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZFcnJvciB9IGZyb20gXCJ2ZXJyb3JcIjtcbmltcG9ydCB7IGxvZyB9IGZyb20gXCIuL2xvZ1wiO1xuXG4vKipcbiAqIFBvc3NpYmxlIEZhYXN0RXJyb3IgbmFtZXMuIFNlZSB7QGxpbmsgRmFhc3RFcnJvcn0uIFRvIHRlc3QgZm9yIGVycm9yc1xuICogbWF0Y2hpbmcgdGhlc2UgbmFtZXMsIHVzZSB0aGUgc3RhdGljIG1ldGhvZFxuICoge0BsaW5rIEZhYXN0RXJyb3J9Lmhhc0NhdXNlV2l0aE5hbWUoKS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGVudW0gRmFhc3RFcnJvck5hbWVzIHtcbiAgICAvKiogR2VuZXJpYyBlcnJvci4gU2VlIHtAbGluayBGYWFzdEVycm9yfS4gKi9cbiAgICBFR0VORVJJQyA9IFwiVkVycm9yXCIsXG4gICAgLyoqIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBjbG91ZCBmdW5jdGlvbiBjb3VsZCBub3QgYmUgc2VyaWFsaXplZCB3aXRob3V0IGxvc2luZyBpbmZvcm1hdGlvbi4gICovXG4gICAgRVNFUklBTElaRSA9IFwiRmFhc3RTZXJpYWxpemF0aW9uRXJyb3JcIixcbiAgICAvKiogVGhlIHJlbW90ZSBjbG91ZCBmdW5jdGlvbiB0aW1lZCBvdXQuICovXG4gICAgRVRJTUVPVVQgPSBcIkZhYXN0VGltZW91dEVycm9yXCIsXG4gICAgLyoqIFRoZSByZW1vdGUgY2xvdWQgZnVuY3Rpb24gZXhjZWVkZWQgbWVtb3J5IGxpbWl0cy4gKi9cbiAgICBFTUVNT1JZID0gXCJGYWFzdE91dE9mTWVtb3J5RXJyb3JcIixcbiAgICAvKiogVGhlIGZ1bmN0aW9uIGludm9jYXRpb24gd2FzIGNhbmNlbGxlZCBieSB1c2VyIHJlcXVlc3QuICovXG4gICAgRUNBTkNFTCA9IFwiRmFhc3RDYW5jZWxFcnJvclwiLFxuICAgIC8qKiBUaGUgZXhjZXB0aW9uIHdhcyB0aHJvd24gYnkgdXNlcidzIHJlbW90ZSBjb2RlLCBub3QgYnkgZmFhc3QuanMgb3IgdGhlIGNsb3VkIHByb3ZpZGVyLiAqL1xuICAgIEVFWENFUFRJT04gPSBcIlVzZXJFeGNlcHRpb25cIixcbiAgICAvKiogQ291bGQgbm90IGNyZWF0ZSB0aGUgcmVtb3RlIGNsb3VkIGZ1bmN0aW9uIG9yIHN1cHBvcnRpbmcgaW5mcmFzdHJ1Y3R1cmUuICovXG4gICAgRUNSRUFURSA9IFwiRmFhc3RDcmVhdGVGdW5jdGlvbkVycm9yXCIsXG4gICAgLyoqIFRoZSByZW1vdGUgY2xvdWQgZnVuY3Rpb24gZmFpbGVkIHRvIGV4ZWN1dGUgYmVjYXVzZSBvZiBsaW1pdGVkIGNvbmN1cnJlbmN5LiAqL1xuICAgIEVDT05DVVJSRU5DWSA9IFwiRmFhc3RDb25jdXJyZW5jeUVycm9yXCJcbn1cblxuLyoqXG4gKiBGYWFzdEVycm9yIGlzIGEgc3ViY2xhc3Mgb2YgVkVycm9yIChodHRwczovL2dpdGh1Yi5jb20vam95ZW50L25vZGUtdmVycm9yKS5cbiAqIHRoYXQgaXMgdGhyb3duIGJ5IGZhYXN0LmpzIEFQSXMgYW5kIGNsb3VkIGZ1bmN0aW9uIGludm9jYXRpb25zLlxuICogQHJlbWFya3NcbiAqIGBGYWFzdEVycm9yYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2pveWVudC9ub2RlLXZlcnJvciB8IFZFcnJvcn0sIHdoaWNoIHByb3ZpZGVzIGFuIEFQSVxuICogZm9yIG5lc3RlZCBlcnJvciBoYW5kbGluZy4gVGhlIG1haW4gQVBJIGlzIHRoZSBzYW1lIGFzIHRoZSBzdGFuZGFyZCBFcnJvclxuICogY2xhc3MsIG5hbWVseSB0aGUgZXJyLm1lc3NhZ2UsIGVyci5uYW1lLCBhbmQgZXJyLnN0YWNrIHByb3BlcnRpZXMuXG4gKlxuICogU2V2ZXJhbCBzdGF0aWMgbWV0aG9kcyBvbiB7QGxpbmsgRmFhc3RFcnJvcn0gYXJlIGluaGVyaXRlZCBmcm9tIFZFcnJvcjpcbiAqXG4gKiBGYWFzdEVycm9yLmZ1bGxTdGFjayhlcnIpIC0gcHJvcGVydHkgcHJvdmlkZXMgYSBtb3JlIGRldGFpbGVkIHN0YWNrIHRyYWNlXG4gKiB0aGF0IGluY2x1ZGUgc3RhY2sgdHJhY2VzIG9mIGNhdXNlcyBpbiB0aGUgY2F1c2FsIGNoYWluLlxuICpcbiAqIEZhYXN0RXJyb3IuaW5mbyhlcnIpIC0gcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBmaWVsZHMgYGZ1bmN0aW9uTmFtZWAsIGBhcmdzYCxcbiAqIGFuZCBgbG9nVXJsYC4gVGhlIGBsb2dVcmxgIHByb3BlcnR5IGlzIGEgVVJMIHBvaW50aW5nIHRvIHRoZSBsb2dzIGZvciBhXG4gKiBzcGVjaWZpYyBpbnZvY2F0aW9uIHRoYXQgY2F1c2VkIHRoZSBlcnJvci5gbG9nVXJsYCB3aWxsIGJlIHN1cnJvdW5kZWQgYnlcbiAqIHdoaXRlc3BhY2Ugb24gYm90aCBzaWRlcyB0byBlYXNlIHBhcnNpbmcgYXMgYSBVUkwgYnkgSURFcy5cbiAqXG4gKiBGYWFzdEVycm9yLmhhc0NhdXNlV2l0aE5hbWUoZXJyLCBjYXVzZSkgLSByZXR1cm5zIHRydWUgaWYgdGhlIEZhYXN0RXJyb3Igb3JcbiAqIGFueSBvZiBpdHMgY2F1c2VzIGluY2x1ZGVzIGFuIGVycm9yIHdpdGggdGhlIGdpdmVuIG5hbWUsIG90aGVyd2lzZSBmYWxzZS4gQWxsXG4gKiBvZiB0aGUgYXZhaWxhYmxlIG5hbWVzIGFyZSBpbiB0aGUgZW51bSB7QGxpbmsgRmFhc3RFcnJvck5hbWVzfS4gRm9yIGV4YW1wbGUsXG4gKiB0byBkZXRlY3QgaWYgYSBGYWFzdEVycm9yIHdhcyBjYXVzZWQgYnkgYSBjbG91ZCBmdW5jdGlvbiB0aW1lb3V0OlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqICAgRmFhc3RFcnJvci5oYXNDYXVzZVdpdGhOYW1lKGVyciwgRmFhc3RFcnJvck5hbWVzLkVUSU1FT1VUKVxuICogYGBgXG4gKlxuICogRmFhc3RFcnJvci5maW5kQ2F1c2VCeU5hbWUoZXJyLCBjYXVzZSkgLSBsaWtlIEZhYXN0RXJyb3IuaGFzQ2F1c2VXaXRoTmFtZSgpXG4gKiBleGNlcHQgaXQgcmV0dXJucyB0aGUgRXJyb3IgaW4gdGhlIGNhdXNhbCBjaGFpbiB3aXRoIHRoZSBnaXZlbiBuYW1lIGluc3RlYWRcbiAqIG9mIGEgYm9vbGVhbiwgb3RoZXJ3aXNlIG51bGwuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgRmFhc3RFcnJvciBleHRlbmRzIFZFcnJvciB7fVxuXG5leHBvcnQgZnVuY3Rpb24gc3ludGhlc2l6ZUZhYXN0RXJyb3Ioe1xuICAgIGVyck9iaixcbiAgICBsb2dVcmwsXG4gICAgZnVuY3Rpb25OYW1lLFxuICAgIGFyZ3Ncbn06IHtcbiAgICBlcnJPYmo6IGFueTtcbiAgICBsb2dVcmw/OiBzdHJpbmc7XG4gICAgZnVuY3Rpb25OYW1lPzogc3RyaW5nO1xuICAgIGFyZ3M/OiBhbnlbXTtcbn0pIHtcbiAgICBsZXQgdW5kZXJseWluZztcbiAgICBpZiAobG9nVXJsIHx8IGZ1bmN0aW9uTmFtZSB8fCBhcmdzKSB7XG4gICAgICAgIHVuZGVybHlpbmcgPSBuZXcgRmFhc3RFcnJvcihcbiAgICAgICAgICAgIHsgbmFtZTogRmFhc3RFcnJvck5hbWVzLkVFWENFUFRJT04sIGluZm86IHsgbG9nVXJsLCBmdW5jdGlvbk5hbWUsIGFyZ3MgfSB9LFxuICAgICAgICAgICAgXCIlc1wiLFxuICAgICAgICAgICAgbG9nVXJsID8/IFwidXNlciBleGNlcHRpb25cIlxuICAgICAgICApO1xuICAgICAgICB1bmRlcmx5aW5nLnN0YWNrID0gYCR7dW5kZXJseWluZ31cbiAgICBhdCAke2Z1bmN0aW9uTmFtZX0gKGZhYXN0LmpzIGNsb3VkIGZ1bmN0aW9uIGludm9jYXRpb24pYDtcbiAgICB9XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRmFhc3RFcnJvcihcbiAgICAgICAge1xuICAgICAgICAgICAgY2F1c2U6IHVuZGVybHlpbmcsXG4gICAgICAgICAgICBpbmZvOiBlcnJPYmosXG4gICAgICAgICAgICBuYW1lOiBlcnJPYmoubmFtZVxuICAgICAgICB9LFxuICAgICAgICBcIiVzXCIsXG4gICAgICAgIGVyck9iai5tZXNzYWdlXG4gICAgKTtcbiAgICBpZiAoZXJyT2JqLnN0YWNrKSB7XG4gICAgICAgIGVycm9yLnN0YWNrID0gZXJyT2JqLnN0YWNrO1xuICAgIH1cbiAgICAvLyBTdXJyb3VuZCB0aGUgbG9nVXJsIHdpdGggc3BhY2VzIGJlY2F1c2UgVVJMIGxpbmtzIGFyZSBicm9rZW4gaW4gdnNjb2RlIGlmXG4gICAgLy8gdGhlcmUncyBubyB3aGl0ZXNwYWNlIHN1cnJvdW5kaW5nIHRoZSBVUkwuXG4gICAgaWYgKE9iamVjdC5rZXlzKGVyck9iaikubGVuZ3RoID09PSAwICYmICEoZXJyT2JqIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgIGxvZy53YXJuKFxuICAgICAgICAgICAgYEVycm9yIHJlc3BvbnNlIG9iamVjdCBoYXMgbm8ga2V5cywgbGlrZWx5IGEgYnVnIGluIGZhYXN0IChub3Qgc2VyaWFsaXppbmcgZXJyb3Igb2JqZWN0cylgXG4gICAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBlcnJvcjtcbn1cbiJdfQ==