import { Actual, Filtered, MaybeMessage, Message, MessageType, Shared, } from "silentium"; /** * Will return an error via error transport if * time runs out from $timeout; if $base manages to * respond before $timeout then the value from base will be returned */ export function Deadline( $base: MessageType, _timeout: MaybeMessage, ) { const $timeout = Actual(_timeout); return Message(function DeadlineImpl(resolve, reject) { let timer: ReturnType | number = 0; const base = Shared($base); $timeout.then(function deadlineTimeoutSub(timeout) { if (timer) { clearTimeout(timer); } let timeoutReached = false; timer = setTimeout(() => { if (timeoutReached) { return; } timeoutReached = true; reject(new Error("Timeout reached in Deadline")); }, timeout); const f = Filtered(base, () => !timeoutReached); f.then(resolve); base.then(function deadlineBaseSub() { timeoutReached = true; }); }); }); }