faastjs
Version:
Serverless batch computing made simple.
91 lines • 11.6 kB
JavaScript
;
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 || (exports.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQXlDO0FBQ3pDLCtCQUE0QjtBQUU1Qjs7Ozs7R0FLRztBQUNILElBQVksZUFpQlg7QUFqQkQsV0FBWSxlQUFlO0lBQ3ZCLDZDQUE2QztJQUM3QyxzQ0FBbUIsQ0FBQTtJQUNuQixzR0FBc0c7SUFDdEcseURBQXNDLENBQUE7SUFDdEMsMkNBQTJDO0lBQzNDLGlEQUE4QixDQUFBO0lBQzlCLHdEQUF3RDtJQUN4RCxvREFBaUMsQ0FBQTtJQUNqQyw2REFBNkQ7SUFDN0QsK0NBQTRCLENBQUE7SUFDNUIsNkZBQTZGO0lBQzdGLCtDQUE0QixDQUFBO0lBQzVCLCtFQUErRTtJQUMvRSx1REFBb0MsQ0FBQTtJQUNwQyxrRkFBa0Y7SUFDbEYseURBQXNDLENBQUE7QUFDMUMsQ0FBQyxFQWpCVyxlQUFlLEdBQWYsdUJBQWUsS0FBZix1QkFBZSxRQWlCMUI7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUNHO0FBQ0gsTUFBYSxVQUFXLFNBQVEsZUFBTTtDQUFHO0FBQXpDLGdDQUF5QztBQUV6QyxTQUFnQixvQkFBb0IsQ0FBQyxFQUNqQyxNQUFNLEVBQ04sTUFBTSxFQUNOLFlBQVksRUFDWixJQUFJLEVBTVA7SUFDRyxJQUFJLFVBQVUsQ0FBQztJQUNmLElBQUksTUFBTSxJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUU7UUFDaEMsVUFBVSxHQUFHLElBQUksVUFBVSxDQUN2QixFQUFFLElBQUksRUFBRSxlQUFlLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFDMUUsSUFBSSxFQUNKLE1BQU0sSUFBSSxnQkFBZ0IsQ0FDN0IsQ0FBQztRQUNGLFVBQVUsQ0FBQyxLQUFLLEdBQUcsR0FBRyxVQUFVO1NBQy9CLFlBQVksdUNBQXVDLENBQUM7S0FDeEQ7SUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FDeEI7UUFDSSxLQUFLLEVBQUUsVUFBVTtRQUNqQixJQUFJLEVBQUUsTUFBTTtRQUNaLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtLQUNwQixFQUNELElBQUksRUFDSixNQUFNLENBQUMsT0FBTyxDQUNqQixDQUFDO0lBQ0YsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2QsS0FBSyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0tBQzlCO0lBQ0QsNEVBQTRFO0lBQzVFLDZDQUE2QztJQUM3QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxZQUFZLEtBQUssQ0FBQyxFQUFFO1FBQ2hFLFNBQUcsQ0FBQyxJQUFJLENBQ0osMEZBQTBGLENBQzdGLENBQUM7S0FDTDtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUM7QUF6Q0Qsb0RBeUNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVkVycm9yLCBPcHRpb25zIH0gZnJvbSBcInZlcnJvclwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIi4vbG9nXCI7XG5cbi8qKlxuICogUG9zc2libGUgRmFhc3RFcnJvciBuYW1lcy4gU2VlIHtAbGluayBGYWFzdEVycm9yfS4gVG8gdGVzdCBmb3IgZXJyb3JzXG4gKiBtYXRjaGluZyB0aGVzZSBuYW1lcywgdXNlIHRoZSBzdGF0aWMgbWV0aG9kXG4gKiB7QGxpbmsgRmFhc3RFcnJvcn0uaGFzQ2F1c2VXaXRoTmFtZSgpLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZW51bSBGYWFzdEVycm9yTmFtZXMge1xuICAgIC8qKiBHZW5lcmljIGVycm9yLiBTZWUge0BsaW5rIEZhYXN0RXJyb3J9LiAqL1xuICAgIEVHRU5FUklDID0gXCJWRXJyb3JcIixcbiAgICAvKiogVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGNsb3VkIGZ1bmN0aW9uIGNvdWxkIG5vdCBiZSBzZXJpYWxpemVkIHdpdGhvdXQgbG9zaW5nIGluZm9ybWF0aW9uLiAgKi9cbiAgICBFU0VSSUFMSVpFID0gXCJGYWFzdFNlcmlhbGl6YXRpb25FcnJvclwiLFxuICAgIC8qKiBUaGUgcmVtb3RlIGNsb3VkIGZ1bmN0aW9uIHRpbWVkIG91dC4gKi9cbiAgICBFVElNRU9VVCA9IFwiRmFhc3RUaW1lb3V0RXJyb3JcIixcbiAgICAvKiogVGhlIHJlbW90ZSBjbG91ZCBmdW5jdGlvbiBleGNlZWRlZCBtZW1vcnkgbGltaXRzLiAqL1xuICAgIEVNRU1PUlkgPSBcIkZhYXN0T3V0T2ZNZW1vcnlFcnJvclwiLFxuICAgIC8qKiBUaGUgZnVuY3Rpb24gaW52b2NhdGlvbiB3YXMgY2FuY2VsbGVkIGJ5IHVzZXIgcmVxdWVzdC4gKi9cbiAgICBFQ0FOQ0VMID0gXCJGYWFzdENhbmNlbEVycm9yXCIsXG4gICAgLyoqIFRoZSBleGNlcHRpb24gd2FzIHRocm93biBieSB1c2VyJ3MgcmVtb3RlIGNvZGUsIG5vdCBieSBmYWFzdC5qcyBvciB0aGUgY2xvdWQgcHJvdmlkZXIuICovXG4gICAgRUVYQ0VQVElPTiA9IFwiVXNlckV4Y2VwdGlvblwiLFxuICAgIC8qKiBDb3VsZCBub3QgY3JlYXRlIHRoZSByZW1vdGUgY2xvdWQgZnVuY3Rpb24gb3Igc3VwcG9ydGluZyBpbmZyYXN0cnVjdHVyZS4gKi9cbiAgICBFQ1JFQVRFID0gXCJGYWFzdENyZWF0ZUZ1bmN0aW9uRXJyb3JcIixcbiAgICAvKiogVGhlIHJlbW90ZSBjbG91ZCBmdW5jdGlvbiBmYWlsZWQgdG8gZXhlY3V0ZSBiZWNhdXNlIG9mIGxpbWl0ZWQgY29uY3VycmVuY3kuICovXG4gICAgRUNPTkNVUlJFTkNZID0gXCJGYWFzdENvbmN1cnJlbmN5RXJyb3JcIlxufVxuXG4vKipcbiAqIEZhYXN0RXJyb3IgaXMgYSBzdWJjbGFzcyBvZiBWRXJyb3IgKGh0dHBzOi8vZ2l0aHViLmNvbS9qb3llbnQvbm9kZS12ZXJyb3IpLlxuICogdGhhdCBpcyB0aHJvd24gYnkgZmFhc3QuanMgQVBJcyBhbmQgY2xvdWQgZnVuY3Rpb24gaW52b2NhdGlvbnMuXG4gKiBAcmVtYXJrc1xuICogYEZhYXN0RXJyb3JgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vam95ZW50L25vZGUtdmVycm9yIHwgVkVycm9yfSwgd2hpY2ggcHJvdmlkZXMgYW4gQVBJXG4gKiBmb3IgbmVzdGVkIGVycm9yIGhhbmRsaW5nLiBUaGUgbWFpbiBBUEkgaXMgdGhlIHNhbWUgYXMgdGhlIHN0YW5kYXJkIEVycm9yXG4gKiBjbGFzcywgbmFtZWx5IHRoZSBlcnIubWVzc2FnZSwgZXJyLm5hbWUsIGFuZCBlcnIuc3RhY2sgcHJvcGVydGllcy5cbiAqXG4gKiBTZXZlcmFsIHN0YXRpYyBtZXRob2RzIG9uIHtAbGluayBGYWFzdEVycm9yfSBhcmUgaW5oZXJpdGVkIGZyb20gVkVycm9yOlxuICpcbiAqIEZhYXN0RXJyb3IuZnVsbFN0YWNrKGVycikgLSBwcm9wZXJ0eSBwcm92aWRlcyBhIG1vcmUgZGV0YWlsZWQgc3RhY2sgdHJhY2VcbiAqIHRoYXQgaW5jbHVkZSBzdGFjayB0cmFjZXMgb2YgY2F1c2VzIGluIHRoZSBjYXVzYWwgY2hhaW4uXG4gKlxuICogRmFhc3RFcnJvci5pbmZvKGVycikgLSByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGZpZWxkcyBgZnVuY3Rpb25OYW1lYCwgYGFyZ3NgLFxuICogYW5kIGBsb2dVcmxgLiBUaGUgYGxvZ1VybGAgcHJvcGVydHkgaXMgYSBVUkwgcG9pbnRpbmcgdG8gdGhlIGxvZ3MgZm9yIGFcbiAqIHNwZWNpZmljIGludm9jYXRpb24gdGhhdCBjYXVzZWQgdGhlIGVycm9yLmBsb2dVcmxgIHdpbGwgYmUgc3Vycm91bmRlZCBieVxuICogd2hpdGVzcGFjZSBvbiBib3RoIHNpZGVzIHRvIGVhc2UgcGFyc2luZyBhcyBhIFVSTCBieSBJREVzLlxuICpcbiAqIEZhYXN0RXJyb3IuaGFzQ2F1c2VXaXRoTmFtZShlcnIsIGNhdXNlKSAtIHJldHVybnMgdHJ1ZSBpZiB0aGUgRmFhc3RFcnJvciBvclxuICogYW55IG9mIGl0cyBjYXVzZXMgaW5jbHVkZXMgYW4gZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3RoZXJ3aXNlIGZhbHNlLiBBbGxcbiAqIG9mIHRoZSBhdmFpbGFibGUgbmFtZXMgYXJlIGluIHRoZSBlbnVtIHtAbGluayBGYWFzdEVycm9yTmFtZXN9LiBGb3IgZXhhbXBsZSxcbiAqIHRvIGRldGVjdCBpZiBhIEZhYXN0RXJyb3Igd2FzIGNhdXNlZCBieSBhIGNsb3VkIGZ1bmN0aW9uIHRpbWVvdXQ6XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogICBGYWFzdEVycm9yLmhhc0NhdXNlV2l0aE5hbWUoZXJyLCBGYWFzdEVycm9yTmFtZXMuRVRJTUVPVVQpXG4gKiBgYGBcbiAqXG4gKiBGYWFzdEVycm9yLmZpbmRDYXVzZUJ5TmFtZShlcnIsIGNhdXNlKSAtIGxpa2UgRmFhc3RFcnJvci5oYXNDYXVzZVdpdGhOYW1lKClcbiAqIGV4Y2VwdCBpdCByZXR1cm5zIHRoZSBFcnJvciBpbiB0aGUgY2F1c2FsIGNoYWluIHdpdGggdGhlIGdpdmVuIG5hbWUgaW5zdGVhZFxuICogb2YgYSBib29sZWFuLCBvdGhlcndpc2UgbnVsbC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBGYWFzdEVycm9yIGV4dGVuZHMgVkVycm9yIHt9XG5cbmV4cG9ydCBmdW5jdGlvbiBzeW50aGVzaXplRmFhc3RFcnJvcih7XG4gICAgZXJyT2JqLFxuICAgIGxvZ1VybCxcbiAgICBmdW5jdGlvbk5hbWUsXG4gICAgYXJnc1xufToge1xuICAgIGVyck9iajogYW55O1xuICAgIGxvZ1VybD86IHN0cmluZztcbiAgICBmdW5jdGlvbk5hbWU/OiBzdHJpbmc7XG4gICAgYXJncz86IGFueVtdO1xufSkge1xuICAgIGxldCB1bmRlcmx5aW5nO1xuICAgIGlmIChsb2dVcmwgfHwgZnVuY3Rpb25OYW1lIHx8IGFyZ3MpIHtcbiAgICAgICAgdW5kZXJseWluZyA9IG5ldyBGYWFzdEVycm9yKFxuICAgICAgICAgICAgeyBuYW1lOiBGYWFzdEVycm9yTmFtZXMuRUVYQ0VQVElPTiwgaW5mbzogeyBsb2dVcmwsIGZ1bmN0aW9uTmFtZSwgYXJncyB9IH0sXG4gICAgICAgICAgICBcIiVzXCIsXG4gICAgICAgICAgICBsb2dVcmwgPz8gXCJ1c2VyIGV4Y2VwdGlvblwiXG4gICAgICAgICk7XG4gICAgICAgIHVuZGVybHlpbmcuc3RhY2sgPSBgJHt1bmRlcmx5aW5nfVxuICAgIGF0ICR7ZnVuY3Rpb25OYW1lfSAoZmFhc3QuanMgY2xvdWQgZnVuY3Rpb24gaW52b2NhdGlvbilgO1xuICAgIH1cbiAgICBjb25zdCBlcnJvciA9IG5ldyBGYWFzdEVycm9yKFxuICAgICAgICB7XG4gICAgICAgICAgICBjYXVzZTogdW5kZXJseWluZyxcbiAgICAgICAgICAgIGluZm86IGVyck9iaixcbiAgICAgICAgICAgIG5hbWU6IGVyck9iai5uYW1lXG4gICAgICAgIH0sXG4gICAgICAgIFwiJXNcIixcbiAgICAgICAgZXJyT2JqLm1lc3NhZ2VcbiAgICApO1xuICAgIGlmIChlcnJPYmouc3RhY2spIHtcbiAgICAgICAgZXJyb3Iuc3RhY2sgPSBlcnJPYmouc3RhY2s7XG4gICAgfVxuICAgIC8vIFN1cnJvdW5kIHRoZSBsb2dVcmwgd2l0aCBzcGFjZXMgYmVjYXVzZSBVUkwgbGlua3MgYXJlIGJyb2tlbiBpbiB2c2NvZGUgaWZcbiAgICAvLyB0aGVyZSdzIG5vIHdoaXRlc3BhY2Ugc3Vycm91bmRpbmcgdGhlIFVSTC5cbiAgICBpZiAoT2JqZWN0LmtleXMoZXJyT2JqKS5sZW5ndGggPT09IDAgJiYgIShlcnJPYmogaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgbG9nLndhcm4oXG4gICAgICAgICAgICBgRXJyb3IgcmVzcG9uc2Ugb2JqZWN0IGhhcyBubyBrZXlzLCBsaWtlbHkgYSBidWcgaW4gZmFhc3QgKG5vdCBzZXJpYWxpemluZyBlcnJvciBvYmplY3RzKWBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGVycm9yO1xufVxuIl19