|
|
@@ -1,3 +1,5 @@
|
|
|
+import { addErrorStack } from '../util';
|
|
|
+
|
|
|
const handlers = createNullObj();
|
|
|
export const addHandlers = obj => assign(handlers, obj);
|
|
|
export const callbacks = createNullObj();
|
|
|
@@ -21,24 +23,31 @@ const bridge = {
|
|
|
cb = resolve;
|
|
|
});
|
|
|
if (IS_FIREFOX) setPrototypeOf(res, SafePromiseConstructor);
|
|
|
- postWithCallback(cmd, data, node, cb, true);
|
|
|
+ postWithCallback(cmd, data, node, cb);
|
|
|
return res;
|
|
|
},
|
|
|
- /** @return {?} synchronous */
|
|
|
call: postWithCallback,
|
|
|
};
|
|
|
|
|
|
-
|
|
|
-function postWithCallback(cmd, data, node, cb, isPromise) {
|
|
|
+/**
|
|
|
+ * @param {string} cmd
|
|
|
+ * @param {any} data
|
|
|
+ * @param {Node} [node]
|
|
|
+ * @param {(this: Node, res: any, err?: Error) => any} [cb] - callback
|
|
|
+ * @param {boolean} [cbAsync] - to keep the original callstack in the async error provided to `cb`,
|
|
|
+ * note that Promise already tracks the caller in modern browsers.
|
|
|
+ * @return {any} the result in synchronous mode (no `cb`)
|
|
|
+ */
|
|
|
+function postWithCallback(cmd, data, node, cb, cbAsync) {
|
|
|
let res, err;
|
|
|
const id = safeGetUniqId();
|
|
|
callbacks[id] = [
|
|
|
cb || ((a, b) => { res = a; err = b; }),
|
|
|
- !isPromise && new SafeError().stack, // Promise already tracks the caller
|
|
|
+ cbAsync && new SafeError(),
|
|
|
];
|
|
|
bridge.post(cmd, { [CALLBACK_ID]: id, data }, node);
|
|
|
if (!cb) {
|
|
|
- if (err) throw err;
|
|
|
+ if (err) throw addErrorStack(err, new SafeError());
|
|
|
return res;
|
|
|
}
|
|
|
}
|