@davidcal/fec-raptorq
Version:
Node.js wrapper for RaptorQ forward error correction
58 lines (45 loc) • 1.31 kB
JavaScript
import { user_error } from "./error.js";
import { unsuspended_factory } from "./unsuspended_factory.js";
import { internal_error } from "./error.js";
/**
* @deprecated
* @stability 0 - deprecated
*/
export const create_func_factory = (cls) => {
return unsuspended_factory(async (...args) => {
const obj = new cls(...args);
obj._init && await obj._init();
const origin = Symbol("origin");
cls._user_error = (message, cause) => {
const error = user_error(message, cause);
error._origin = origin;
};
const keys = Object.keys(obj).filter(key => typeof obj[key] === "function" && !key.startsWith("_"));
if (keys.length !== 1) {
throw new Error(`Expected exactly one public method in a determinstic interface, but got ${keys.length}.`);
}
for (let key of Object.keys(obj)) {
if (key.startsWith("_")) {
continue;
}
if (typeof obj[key] === "function") {
obj[key] = obj[key].bind(obj);
}
}
const func = obj[keys[0]];
return async (...args) => {
let result;
try {
result = await func(...args);
} catch (e) {
if (e._origin === origin || e.name === "InternalError") {
throw e;
} else {
throw internal_error("Uncaught error", e);
}
}
return result;
};
});
};
export const createFuncFactory = create_func_factory;