refactor(queue): share drain helpers across announce and reply

This commit is contained in:
Peter Steinberger
2026-02-22 17:54:19 +00:00
parent 78220db2be
commit dacb3d1aa2
3 changed files with 60 additions and 31 deletions

View File

@@ -132,6 +132,18 @@ export function waitForQueueDebounce(queue: {
});
}
export function beginQueueDrain<T extends { draining: boolean }>(
map: Map<string, T>,
key: string,
): T | undefined {
const queue = map.get(key);
if (!queue || queue.draining) {
return undefined;
}
queue.draining = true;
return queue;
}
export async function drainNextQueueItem<T>(
items: T[],
run: (item: T) => Promise<void>,
@@ -162,6 +174,23 @@ export async function drainCollectItemIfNeeded<T>(params: {
return drained ? "drained" : "empty";
}
export async function drainCollectQueueStep<T>(params: {
collectState: { forceIndividualCollect: boolean };
isCrossChannel: boolean;
items: T[];
run: (item: T) => Promise<void>;
}): Promise<"skipped" | "drained" | "empty"> {
return await drainCollectItemIfNeeded({
forceIndividualCollect: params.collectState.forceIndividualCollect,
isCrossChannel: params.isCrossChannel,
setForceIndividualCollect: (next) => {
params.collectState.forceIndividualCollect = next;
},
items: params.items,
run: params.run,
});
}
export function buildQueueSummaryPrompt(params: {
state: QueueSummaryState;
noun: string;