refactor(queue): share drain helpers across announce and reply
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user