in src/Runtime/CallbackContext.ts [60:129]
function _rawCallbackContext(
client: IRuntimeClient,
id: string,
scheduleNext: () => void
): [CallbackFunction, ICallbackContext] {
const postError = (err: ErrorStringOrUndefined, callback: () => void) => {
const homogeneousError = _homogeneousError(err);
console.error("Invoke Error", Errors.toFormatted(homogeneousError));
client.postInvocationError(err, id, callback);
};
const complete = (result: unknown, callback: () => void) => {
client.postInvocationResponse(result, id, callback);
};
let waitForEmptyEventLoop = true;
const callback = (
err: ErrorStringOrUndefinedOrNull,
result: unknown
): void => {
BeforeExitListener.reset();
if (err !== undefined && err !== null) {
postError(err, scheduleNext);
} else {
complete(result, () => {
if (!waitForEmptyEventLoop) {
scheduleNext();
} else {
BeforeExitListener.set(scheduleNext);
}
});
}
};
const done = (err: ErrorStringOrUndefinedOrNull, result?: unknown) => {
BeforeExitListener.reset();
if (err !== undefined && err !== null) {
postError(err, scheduleNext);
} else {
complete(result, scheduleNext);
}
};
const succeed = (result: unknown) => {
done(null, result);
};
const fail = (err: ErrorStringOrUndefinedOrNull) => {
if (err === undefined || err === null) {
done("handled");
} else {
done(err);
}
};
const callbackContext = {
get callbackWaitsForEmptyEventLoop(): boolean {
return waitForEmptyEventLoop;
},
set callbackWaitsForEmptyEventLoop(value: boolean) {
waitForEmptyEventLoop = value;
},
succeed,
fail,
done,
};
return [callback, callbackContext];
}