import { JetroutineFunction, JetroutineFunctionReturnTypes, SupportedTypes } from '../config/_symbols'; import { remote } from '../proto/runtime/v1alpha1/remote'; import { SystemError } from '../runtime/_errors'; export const execJetroutine = async ( func: JetroutineFunction, encodedArgs: SupportedTypes[], postResultCallback: ( res?: JetroutineFunctionReturnTypes, err?: remote.Error, ) => Promise, ) => { if (!func) { throw new SystemError('cannot execute jetroutine: function is missing.'); } let result; let grpcError; let originalError; try { result = await func(...(encodedArgs || [])); } catch (err) { // Only throw the original error after postResult callback. originalError = err; grpcError = new remote.Error({ encoded_error: Buffer.from(JSON.stringify(err, Object.getOwnPropertyNames(err)), 'utf8'), }); } await postResultCallback(result, grpcError); return { result, error: originalError }; };