1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.synthesizeFaastError = exports.FaastError = exports.FaastErrorNames = void 0;
|
4 | const verror_1 = require("verror");
|
5 | const log_1 = require("./log");
|
6 | /**
|
7 | * Possible FaastError names. See {@link FaastError}. To test for errors
|
8 | * matching these names, use the static method
|
9 | * {@link FaastError}.hasCauseWithName().
|
10 | * @public
|
11 | */
|
12 | var FaastErrorNames;
|
13 | (function (FaastErrorNames) {
|
14 | /** Generic error. See {@link FaastError}. */
|
15 | FaastErrorNames["EGENERIC"] = "VError";
|
16 | /** The arguments passed to the cloud function could not be serialized without losing information. */
|
17 | FaastErrorNames["ESERIALIZE"] = "FaastSerializationError";
|
18 | /** The remote cloud function timed out. */
|
19 | FaastErrorNames["ETIMEOUT"] = "FaastTimeoutError";
|
20 | /** The remote cloud function exceeded memory limits. */
|
21 | FaastErrorNames["EMEMORY"] = "FaastOutOfMemoryError";
|
22 | /** The function invocation was cancelled by user request. */
|
23 | FaastErrorNames["ECANCEL"] = "FaastCancelError";
|
24 | /** The exception was thrown by user's remote code, not by faast.js or the cloud provider. */
|
25 | FaastErrorNames["EEXCEPTION"] = "UserException";
|
26 | /** Could not create the remote cloud function or supporting infrastructure. */
|
27 | FaastErrorNames["ECREATE"] = "FaastCreateFunctionError";
|
28 | /** The remote cloud function failed to execute because of limited concurrency. */
|
29 | FaastErrorNames["ECONCURRENCY"] = "FaastConcurrencyError";
|
30 | })(FaastErrorNames = exports.FaastErrorNames || (exports.FaastErrorNames = {}));
|
31 | /**
|
32 | * FaastError is a subclass of VError (https://github.com/joyent/node-verror).
|
33 | * that is thrown by faast.js APIs and cloud function invocations.
|
34 | * @remarks
|
35 | * `FaastError` is a subclass of
|
36 | * {@link https://github.com/joyent/node-verror | VError}, which provides an API
|
37 | * for nested error handling. The main API is the same as the standard Error
|
38 | * class, namely the err.message, err.name, and err.stack properties.
|
39 | *
|
40 | * Several static methods on {@link FaastError} are inherited from VError:
|
41 | *
|
42 | * FaastError.fullStack(err) - property provides a more detailed stack trace
|
43 | * that include stack traces of causes in the causal chain.
|
44 | *
|
45 | * FaastError.info(err) - returns an object with fields `functionName`, `args`,
|
46 | * and `logUrl`. The `logUrl` property is a URL pointing to the logs for a
|
47 | * specific invocation that caused the error.`logUrl` will be surrounded by
|
48 | * whitespace on both sides to ease parsing as a URL by IDEs.
|
49 | *
|
50 | * FaastError.hasCauseWithName(err, cause) - returns true if the FaastError or
|
51 | * any of its causes includes an error with the given name, otherwise false. All
|
52 | * of the available names are in the enum {@link FaastErrorNames}. For example,
|
53 | * to detect if a FaastError was caused by a cloud function timeout:
|
54 | *
|
55 | * ```typescript
|
56 | * FaastError.hasCauseWithName(err, FaastErrorNames.ETIMEOUT)
|
57 | * ```
|
58 | *
|
59 | * FaastError.findCauseByName(err, cause) - like FaastError.hasCauseWithName()
|
60 | * except it returns the Error in the causal chain with the given name instead
|
61 | * of a boolean, otherwise null.
|
62 | *
|
63 | * @public
|
64 | */
|
65 | class FaastError extends verror_1.VError {
|
66 | }
|
67 | exports.FaastError = FaastError;
|
68 | function synthesizeFaastError({ errObj, logUrl, functionName, args }) {
|
69 | let underlying;
|
70 | if (logUrl || functionName || args) {
|
71 | underlying = new FaastError({ name: FaastErrorNames.EEXCEPTION, info: { logUrl, functionName, args } }, "%s", logUrl ?? "user exception");
|
72 | underlying.stack = `${underlying}
|
73 | at ${functionName} (faast.js cloud function invocation)`;
|
74 | }
|
75 | const error = new FaastError({
|
76 | cause: underlying,
|
77 | info: errObj,
|
78 | name: errObj.name
|
79 | }, "%s", errObj.message);
|
80 | if (errObj.stack) {
|
81 | error.stack = errObj.stack;
|
82 | }
|
83 | // Surround the logUrl with spaces because URL links are broken in vscode if
|
84 | // there's no whitespace surrounding the URL.
|
85 | if (Object.keys(errObj).length === 0 && !(errObj instanceof Error)) {
|
86 | log_1.log.warn(`Error response object has no keys, likely a bug in faast (not serializing error objects)`);
|
87 | }
|
88 | return error;
|
89 | }
|
90 | exports.synthesizeFaastError = synthesizeFaastError;
|
91 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQXlDO0FBQ3pDLCtCQUE0QjtBQUU1Qjs7Ozs7R0FLRztBQUNILElBQVksZUFpQlg7QUFqQkQsV0FBWSxlQUFlO0lBQ3ZCLDZDQUE2QztJQUM3QyxzQ0FBbUIsQ0FBQTtJQUNuQixzR0FBc0c7SUFDdEcseURBQXNDLENBQUE7SUFDdEMsMkNBQTJDO0lBQzNDLGlEQUE4QixDQUFBO0lBQzlCLHdEQUF3RDtJQUN4RCxvREFBaUMsQ0FBQTtJQUNqQyw2REFBNkQ7SUFDN0QsK0NBQTRCLENBQUE7SUFDNUIsNkZBQTZGO0lBQzdGLCtDQUE0QixDQUFBO0lBQzVCLCtFQUErRTtJQUMvRSx1REFBb0MsQ0FBQTtJQUNwQyxrRkFBa0Y7SUFDbEYseURBQXNDLENBQUE7QUFDMUMsQ0FBQyxFQWpCVyxlQUFlLEdBQWYsdUJBQWUsS0FBZix1QkFBZSxRQWlCMUI7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUNHO0FBQ0gsTUFBYSxVQUFXLFNBQVEsZUFBTTtDQUFHO0FBQXpDLGdDQUF5QztBQUV6QyxTQUFnQixvQkFBb0IsQ0FBQyxFQUNqQyxNQUFNLEVBQ04sTUFBTSxFQUNOLFlBQVksRUFDWixJQUFJLEVBTVA7SUFDRyxJQUFJLFVBQVUsQ0FBQztJQUNmLElBQUksTUFBTSxJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUU7UUFDaEMsVUFBVSxHQUFHLElBQUksVUFBVSxDQUN2QixFQUFFLElBQUksRUFBRSxlQUFlLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFDMUUsSUFBSSxFQUNKLE1BQU0sSUFBSSxnQkFBZ0IsQ0FDN0IsQ0FBQztRQUNGLFVBQVUsQ0FBQyxLQUFLLEdBQUcsR0FBRyxVQUFVO1NBQy9CLFlBQVksdUNBQXVDLENBQUM7S0FDeEQ7SUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FDeEI7UUFDSSxLQUFLLEVBQUUsVUFBVTtRQUNqQixJQUFJLEVBQUUsTUFBTTtRQUNaLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtLQUNwQixFQUNELElBQUksRUFDSixNQUFNLENBQUMsT0FBTyxDQUNqQixDQUFDO0lBQ0YsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2QsS0FBSyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0tBQzlCO0lBQ0QsNEVBQTRFO0lBQzVFLDZDQUE2QztJQUM3QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxZQUFZLEtBQUssQ0FBQyxFQUFFO1FBQ2hFLFNBQUcsQ0FBQyxJQUFJLENBQ0osMEZBQTBGLENBQzdGLENBQUM7S0FDTDtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUM7QUF6Q0Qsb0RBeUNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVkVycm9yLCBPcHRpb25zIH0gZnJvbSBcInZlcnJvclwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIi4vbG9nXCI7XG5cbi8qKlxuICogUG9zc2libGUgRmFhc3RFcnJvciBuYW1lcy4gU2VlIHtAbGluayBGYWFzdEVycm9yfS4gVG8gdGVzdCBmb3IgZXJyb3JzXG4gKiBtYXRjaGluZyB0aGVzZSBuYW1lcywgdXNlIHRoZSBzdGF0aWMgbWV0aG9kXG4gKiB7QGxpbmsgRmFhc3RFcnJvcn0uaGFzQ2F1c2VXaXRoTmFtZSgpLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZW51bSBGYWFzdEVycm9yTmFtZXMge1xuICAgIC8qKiBHZW5lcmljIGVycm9yLiBTZWUge0BsaW5rIEZhYXN0RXJyb3J9LiAqL1xuICAgIEVHRU5FUklDID0gXCJWRXJyb3JcIixcbiAgICAvKiogVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGNsb3VkIGZ1bmN0aW9uIGNvdWxkIG5vdCBiZSBzZXJpYWxpemVkIHdpdGhvdXQgbG9zaW5nIGluZm9ybWF0aW9uLiAgKi9cbiAgICBFU0VSSUFMSVpFID0gXCJGYWFzdFNlcmlhbGl6YXRpb25FcnJvclwiLFxuICAgIC8qKiBUaGUgcmVtb3RlIGNsb3VkIGZ1bmN0aW9uIHRpbWVkIG91dC4gKi9cbiAgICBFVElNRU9VVCA9IFwiRmFhc3RUaW1lb3V0RXJyb3JcIixcbiAgICAvKiogVGhlIHJlbW90ZSBjbG91ZCBmdW5jdGlvbiBleGNlZWRlZCBtZW1vcnkgbGltaXRzLiAqL1xuICAgIEVNRU1PUlkgPSBcIkZhYXN0T3V0T2ZNZW1vcnlFcnJvclwiLFxuICAgIC8qKiBUaGUgZnVuY3Rpb24gaW52b2NhdGlvbiB3YXMgY2FuY2VsbGVkIGJ5IHVzZXIgcmVxdWVzdC4gKi9cbiAgICBFQ0FOQ0VMID0gXCJGYWFzdENhbmNlbEVycm9yXCIsXG4gICAgLyoqIFRoZSBleGNlcHRpb24gd2FzIHRocm93biBieSB1c2VyJ3MgcmVtb3RlIGNvZGUsIG5vdCBieSBmYWFzdC5qcyBvciB0aGUgY2xvdWQgcHJvdmlkZXIuICovXG4gICAgRUVYQ0VQVElPTiA9IFwiVXNlckV4Y2VwdGlvblwiLFxuICAgIC8qKiBDb3VsZCBub3QgY3JlYXRlIHRoZSByZW1vdGUgY2xvdWQgZnVuY3Rpb24gb3Igc3VwcG9ydGluZyBpbmZyYXN0cnVjdHVyZS4gKi9cbiAgICBFQ1JFQVRFID0gXCJGYWFzdENyZWF0ZUZ1bmN0aW9uRXJyb3JcIixcbiAgICAvKiogVGhlIHJlbW90ZSBjbG91ZCBmdW5jdGlvbiBmYWlsZWQgdG8gZXhlY3V0ZSBiZWNhdXNlIG9mIGxpbWl0ZWQgY29uY3VycmVuY3kuICovXG4gICAgRUNPTkNVUlJFTkNZID0gXCJGYWFzdENvbmN1cnJlbmN5RXJyb3JcIlxufVxuXG4vKipcbiAqIEZhYXN0RXJyb3IgaXMgYSBzdWJjbGFzcyBvZiBWRXJyb3IgKGh0dHBzOi8vZ2l0aHViLmNvbS9qb3llbnQvbm9kZS12ZXJyb3IpLlxuICogdGhhdCBpcyB0aHJvd24gYnkgZmFhc3QuanMgQVBJcyBhbmQgY2xvdWQgZnVuY3Rpb24gaW52b2NhdGlvbnMuXG4gKiBAcmVtYXJrc1xuICogYEZhYXN0RXJyb3JgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vam95ZW50L25vZGUtdmVycm9yIHwgVkVycm9yfSwgd2hpY2ggcHJvdmlkZXMgYW4gQVBJXG4gKiBmb3IgbmVzdGVkIGVycm9yIGhhbmRsaW5nLiBUaGUgbWFpbiBBUEkgaXMgdGhlIHNhbWUgYXMgdGhlIHN0YW5kYXJkIEVycm9yXG4gKiBjbGFzcywgbmFtZWx5IHRoZSBlcnIubWVzc2FnZSwgZXJyLm5hbWUsIGFuZCBlcnIuc3RhY2sgcHJvcGVydGllcy5cbiAqXG4gKiBTZXZlcmFsIHN0YXRpYyBtZXRob2RzIG9uIHtAbGluayBGYWFzdEVycm9yfSBhcmUgaW5oZXJpdGVkIGZyb20gVkVycm9yOlxuICpcbiAqIEZhYXN0RXJyb3IuZnVsbFN0YWNrKGVycikgLSBwcm9wZXJ0eSBwcm92aWRlcyBhIG1vcmUgZGV0YWlsZWQgc3RhY2sgdHJhY2VcbiAqIHRoYXQgaW5jbHVkZSBzdGFjayB0cmFjZXMgb2YgY2F1c2VzIGluIHRoZSBjYXVzYWwgY2hhaW4uXG4gKlxuICogRmFhc3RFcnJvci5pbmZvKGVycikgLSByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGZpZWxkcyBgZnVuY3Rpb25OYW1lYCwgYGFyZ3NgLFxuICogYW5kIGBsb2dVcmxgLiBUaGUgYGxvZ1VybGAgcHJvcGVydHkgaXMgYSBVUkwgcG9pbnRpbmcgdG8gdGhlIGxvZ3MgZm9yIGFcbiAqIHNwZWNpZmljIGludm9jYXRpb24gdGhhdCBjYXVzZWQgdGhlIGVycm9yLmBsb2dVcmxgIHdpbGwgYmUgc3Vycm91bmRlZCBieVxuICogd2hpdGVzcGFjZSBvbiBib3RoIHNpZGVzIHRvIGVhc2UgcGFyc2luZyBhcyBhIFVSTCBieSBJREVzLlxuICpcbiAqIEZhYXN0RXJyb3IuaGFzQ2F1c2VXaXRoTmFtZShlcnIsIGNhdXNlKSAtIHJldHVybnMgdHJ1ZSBpZiB0aGUgRmFhc3RFcnJvciBvclxuICogYW55IG9mIGl0cyBjYXVzZXMgaW5jbHVkZXMgYW4gZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3RoZXJ3aXNlIGZhbHNlLiBBbGxcbiAqIG9mIHRoZSBhdmFpbGFibGUgbmFtZXMgYXJlIGluIHRoZSBlbnVtIHtAbGluayBGYWFzdEVycm9yTmFtZXN9LiBGb3IgZXhhbXBsZSxcbiAqIHRvIGRldGVjdCBpZiBhIEZhYXN0RXJyb3Igd2FzIGNhdXNlZCBieSBhIGNsb3VkIGZ1bmN0aW9uIHRpbWVvdXQ6XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogICBGYWFzdEVycm9yLmhhc0NhdXNlV2l0aE5hbWUoZXJyLCBGYWFzdEVycm9yTmFtZXMuRVRJTUVPVVQpXG4gKiBgYGBcbiAqXG4gKiBGYWFzdEVycm9yLmZpbmRDYXVzZUJ5TmFtZShlcnIsIGNhdXNlKSAtIGxpa2UgRmFhc3RFcnJvci5oYXNDYXVzZVdpdGhOYW1lKClcbiAqIGV4Y2VwdCBpdCByZXR1cm5zIHRoZSBFcnJvciBpbiB0aGUgY2F1c2FsIGNoYWluIHdpdGggdGhlIGdpdmVuIG5hbWUgaW5zdGVhZFxuICogb2YgYSBib29sZWFuLCBvdGhlcndpc2UgbnVsbC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBGYWFzdEVycm9yIGV4dGVuZHMgVkVycm9yIHt9XG5cbmV4cG9ydCBmdW5jdGlvbiBzeW50aGVzaXplRmFhc3RFcnJvcih7XG4gICAgZXJyT2JqLFxuICAgIGxvZ1VybCxcbiAgICBmdW5jdGlvbk5hbWUsXG4gICAgYXJnc1xufToge1xuICAgIGVyck9iajogYW55O1xuICAgIGxvZ1VybD86IHN0cmluZztcbiAgICBmdW5jdGlvbk5hbWU/OiBzdHJpbmc7XG4gICAgYXJncz86IGFueVtdO1xufSkge1xuICAgIGxldCB1bmRlcmx5aW5nO1xuICAgIGlmIChsb2dVcmwgfHwgZnVuY3Rpb25OYW1lIHx8IGFyZ3MpIHtcbiAgICAgICAgdW5kZXJseWluZyA9IG5ldyBGYWFzdEVycm9yKFxuICAgICAgICAgICAgeyBuYW1lOiBGYWFzdEVycm9yTmFtZXMuRUVYQ0VQVElPTiwgaW5mbzogeyBsb2dVcmwsIGZ1bmN0aW9uTmFtZSwgYXJncyB9IH0sXG4gICAgICAgICAgICBcIiVzXCIsXG4gICAgICAgICAgICBsb2dVcmwgPz8gXCJ1c2VyIGV4Y2VwdGlvblwiXG4gICAgICAgICk7XG4gICAgICAgIHVuZGVybHlpbmcuc3RhY2sgPSBgJHt1bmRlcmx5aW5nfVxuICAgIGF0ICR7ZnVuY3Rpb25OYW1lfSAoZmFhc3QuanMgY2xvdWQgZnVuY3Rpb24gaW52b2NhdGlvbilgO1xuICAgIH1cbiAgICBjb25zdCBlcnJvciA9IG5ldyBGYWFzdEVycm9yKFxuICAgICAgICB7XG4gICAgICAgICAgICBjYXVzZTogdW5kZXJseWluZyxcbiAgICAgICAgICAgIGluZm86IGVyck9iaixcbiAgICAgICAgICAgIG5hbWU6IGVyck9iai5uYW1lXG4gICAgICAgIH0sXG4gICAgICAgIFwiJXNcIixcbiAgICAgICAgZXJyT2JqLm1lc3NhZ2VcbiAgICApO1xuICAgIGlmIChlcnJPYmouc3RhY2spIHtcbiAgICAgICAgZXJyb3Iuc3RhY2sgPSBlcnJPYmouc3RhY2s7XG4gICAgfVxuICAgIC8vIFN1cnJvdW5kIHRoZSBsb2dVcmwgd2l0aCBzcGFjZXMgYmVjYXVzZSBVUkwgbGlua3MgYXJlIGJyb2tlbiBpbiB2c2NvZGUgaWZcbiAgICAvLyB0aGVyZSdzIG5vIHdoaXRlc3BhY2Ugc3Vycm91bmRpbmcgdGhlIFVSTC5cbiAgICBpZiAoT2JqZWN0LmtleXMoZXJyT2JqKS5sZW5ndGggPT09IDAgJiYgIShlcnJPYmogaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgbG9nLndhcm4oXG4gICAgICAgICAgICBgRXJyb3IgcmVzcG9uc2Ugb2JqZWN0IGhhcyBubyBrZXlzLCBsaWtlbHkgYSBidWcgaW4gZmFhc3QgKG5vdCBzZXJpYWxpemluZyBlcnJvciBvYmplY3RzKWBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGVycm9yO1xufVxuIl19 |
\ | No newline at end of file |