diff options
author | Nayeem Rahman <nayeemrmn99@gmail.com> | 2021-04-09 16:55:33 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-09 11:55:33 -0400 |
commit | c86ee742a2522a169bfe40890b946c646aeac1cf (patch) | |
tree | 73b6f1efb0a72ab9f8186d76595186b133b4b554 /core/core.js | |
parent | c6e7a243d524417fe77c4799a2bcc1b3db1bf01a (diff) |
fix: async op error stacktraces (#10080)
Co-authored-by: Aaron O'Mullan <aaron.omullan@gmail.com>
Diffstat (limited to 'core/core.js')
-rw-r--r-- | core/core.js | 52 |
1 files changed, 19 insertions, 33 deletions
diff --git a/core/core.js b/core/core.js index 3ec5c3e41..3142aa93a 100644 --- a/core/core.js +++ b/core/core.js @@ -65,7 +65,10 @@ function handleAsyncMsgFromRust() { for (let i = 0; i < arguments.length; i += 2) { - opAsyncHandler(arguments[i], arguments[i + 1]); + const promiseId = arguments[i]; + const res = arguments[i + 1]; + const promise = getPromise(promiseId); + promise.resolve(res); } } @@ -84,48 +87,31 @@ return errorMap[errorName] ?? [undefined, []]; } - function processResponse(res) { - if (!isErr(res)) { - return res; - } - throw processErr(res); - } - - // .$err_class_name is a special key that should only exist on errors - function isErr(res) { - return !!(res && res.$err_class_name); - } - - function processErr(err) { - const className = err.$err_class_name; - const [ErrorClass, args] = getErrorClassAndArgs(className); - if (!ErrorClass) { - return new Error( - `Unregistered error class: "${className}"\n ${err.message}\n Classes of errors returned from ops should be registered via Deno.core.registerErrorClass().`, - ); + function unwrapOpResult(res) { + // .$err_class_name is a special key that should only exist on errors + if (res?.$err_class_name) { + const className = res.$err_class_name; + const [ErrorClass, args] = getErrorClassAndArgs(className); + if (!ErrorClass) { + throw new Error( + `Unregistered error class: "${className}"\n ${res.message}\n Classes of errors returned from ops should be registered via Deno.core.registerErrorClass().`, + ); + } + throw new ErrorClass(res.message, ...args); } - return new ErrorClass(err.message, ...args); + return res; } function jsonOpAsync(opName, args = null, zeroCopy = null) { const promiseId = nextPromiseId++; const maybeError = dispatch(opName, promiseId, args, zeroCopy); // Handle sync error (e.g: error parsing args) - if (maybeError) processResponse(maybeError); - return setPromise(promiseId); + if (maybeError) return unwrapOpResult(maybeError); + return setPromise(promiseId).then(unwrapOpResult); } function jsonOpSync(opName, args = null, zeroCopy = null) { - return processResponse(dispatch(opName, null, args, zeroCopy)); - } - - function opAsyncHandler(promiseId, res) { - const promise = getPromise(promiseId); - if (!isErr(res)) { - promise.resolve(res); - } else { - promise.reject(processErr(res)); - } + return unwrapOpResult(dispatch(opName, null, args, zeroCopy)); } function binOpSync(opName, args = null, zeroCopy = null) { |