import { make_warningLog } from "node-opcua-debug"; import { CallbackT } from "node-opcua-status-code"; const warningLog = make_warningLog(__filename); export type StraightFunc = (this: This) => T; export type PromiseFunc = (this: This) => Promise; export type CallbackFunc = (this: This, callback: CallbackT) => void; export type MultiformFunc = StraightFunc | PromiseFunc | CallbackFunc; export function convertToCallbackFunction(func: MultiformFunc): CallbackFunc { if (func.length === 0) { return function (this: This, callback: CallbackT) { /** */ let valueOrPromise: T | Promise; try { valueOrPromise = (func as (this: This) => Promise | T).call(this); } catch (err) { return callback(err as Error); } if (valueOrPromise instanceof Promise) { valueOrPromise.then((value: T) => callback(null, value)).catch((err) => callback(err)); } else { return callback(null, valueOrPromise); } }; } else { if (func.length !== 1) { throw new Error("convertToCallbackFunction: invalid function"); } return function (this: This, callback: CallbackT) { try { (func as CallbackFunc).call(this, callback); } catch (err) { warningLog("internal error", (err as Error).message); callback(err as Error); } }; } } export type StraightFunc1 = (this: This, param1: P) => T; export type PromiseFunc1 = (this: This, param1: P) => Promise; export type CallbackFunc1 = (this: This, param1: P, callback: CallbackT) => void; export type MultiformFunc1 = StraightFunc1 | PromiseFunc1 | CallbackFunc1; export function convertToCallbackFunction1(func: MultiformFunc1): CallbackFunc1 { if (func.length === 1) { return function (this: This, param: P, callback: CallbackT) { /** */ let valueOrPromise: T | Promise; try { valueOrPromise = (func as (this: This, param: P) => Promise | T).call(this, param); } catch (err) { return callback(err as Error); } if (valueOrPromise instanceof Promise) { valueOrPromise.then((value: T) => callback(null, value)).catch((err) => callback(err)); } else { return callback(null, valueOrPromise); } }; } else { if (func.length !== 2) { throw new Error("convertToCallbackFunction: invalid function"); } return function (this: This, param: P, callback: CallbackT) { try { (func as CallbackFunc1).call(this, param, callback); } catch (err) { warningLog("internal error", (err as Error).message); callback(err as Error); } }; } }