File size: 2,301 Bytes
3144483 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | /** Why a lane cannot admit, from the narrowest cause outward. */
export type CommandLaneBlockReason = "lane" | "group-budget" | "sibling-reservation" | null;
export type CommandLaneSnapshot = {
lane: string;
queuedCount: number;
activeCount: number;
maxConcurrent: number;
draining: boolean;
generation: number;
/** Group this lane belongs to, if any. */
group?: string;
/** Sum of active tasks across every member of the group. Always derived. */
groupActive?: number;
/** Hard aggregate cap shared by the group's members. */
groupBudget?: number;
/** Slots within the budget this lane may always claim. */
reservedForLane?: number;
/**
* Why this lane cannot start more work right now, or null if it can.
* `lane` is the lane's own maxConcurrent; the other two are group-imposed and
* are invisible to a lane-local view — see `noteLaneWaitIfBusy`.
*/
blockedBy?: CommandLaneBlockReason;
};
/**
* Public enqueue knobs shared by command-lane callers and narrower injection
* points that should not import the full queue implementation.
*/
export type CommandQueueTaskDeadline =
| { kind: "bounded"; deadlineAtMs: number }
| { kind: "unlimited" };
export type CommandQueueEnqueueOptions = {
/** Cancels queued admission; the task owns cancellation after it starts. */
abortSignal?: AbortSignal;
/** Called only when this entry remains queued after immediate lane admission. */
onQueued?: () => void;
warnAfterMs?: number;
onWait?: (waitMs: number, queuedAhead: number) => void;
taskTimeoutMs?: number;
taskTimeoutProgressAtMs?: () => number | undefined;
/** Replaces idle timing with an owner deadline; undefined restores idle timing. */
taskTimeoutSubscribe?: (
onDeadline: (deadline: CommandQueueTaskDeadline | undefined) => void,
) => () => void;
taskTimeoutAbortSignal?: AbortSignal;
taskTimeoutAbortGraceMs?: number;
/** Ends the task after a caller-owned timeout cleanup grace has already elapsed. */
taskTimeoutReleaseSignal?: AbortSignal;
priority?: "foreground" | "normal" | "background";
};
/** Minimal queue function contract used by code that only needs to schedule work. */
export type CommandQueueEnqueueFn = <T>(
task: () => Promise<T>,
opts?: CommandQueueEnqueueOptions,
) => Promise<T>;
|