65 lines
2.6 KiB
TypeScript
65 lines
2.6 KiB
TypeScript
import { getChannelPlugin } from "../../../channels/plugins/index.js";
|
|
import type { InboundDebounceByProvider } from "../../../config/types.messages.js";
|
|
import { normalizeQueueDropPolicy, normalizeQueueMode } from "./normalize.js";
|
|
import { DEFAULT_QUEUE_CAP, DEFAULT_QUEUE_DEBOUNCE_MS, DEFAULT_QUEUE_DROP } from "./state.js";
|
|
import type { QueueMode, QueueSettings, ResolveQueueSettingsParams } from "./types.js";
|
|
|
|
function defaultQueueModeForChannel(_channel?: string): QueueMode {
|
|
return "collect";
|
|
}
|
|
|
|
/** Resolve per-channel debounce override from debounceMsByChannel map. */
|
|
function resolveChannelDebounce(
|
|
byChannel: InboundDebounceByProvider | undefined,
|
|
channelKey: string | undefined,
|
|
): number | undefined {
|
|
if (!channelKey || !byChannel) return undefined;
|
|
const value = byChannel[channelKey];
|
|
return typeof value === "number" && Number.isFinite(value) ? Math.max(0, value) : undefined;
|
|
}
|
|
|
|
function resolvePluginDebounce(channelKey: string | undefined): number | undefined {
|
|
if (!channelKey) return undefined;
|
|
const plugin = getChannelPlugin(channelKey);
|
|
const value = plugin?.defaults?.queue?.debounceMs;
|
|
return typeof value === "number" && Number.isFinite(value) ? Math.max(0, value) : undefined;
|
|
}
|
|
|
|
export function resolveQueueSettings(params: ResolveQueueSettingsParams): QueueSettings {
|
|
const channelKey = params.channel?.trim().toLowerCase();
|
|
const queueCfg = params.cfg.messages?.queue;
|
|
const providerModeRaw =
|
|
channelKey && queueCfg?.byChannel
|
|
? (queueCfg.byChannel as Record<string, string | undefined>)[channelKey]
|
|
: undefined;
|
|
const resolvedMode =
|
|
params.inlineMode ??
|
|
normalizeQueueMode(params.sessionEntry?.queueMode) ??
|
|
normalizeQueueMode(providerModeRaw) ??
|
|
normalizeQueueMode(queueCfg?.mode) ??
|
|
defaultQueueModeForChannel(channelKey);
|
|
const debounceRaw =
|
|
params.inlineOptions?.debounceMs ??
|
|
params.sessionEntry?.queueDebounceMs ??
|
|
resolveChannelDebounce(queueCfg?.debounceMsByChannel, channelKey) ??
|
|
resolvePluginDebounce(channelKey) ??
|
|
queueCfg?.debounceMs ??
|
|
DEFAULT_QUEUE_DEBOUNCE_MS;
|
|
const capRaw =
|
|
params.inlineOptions?.cap ??
|
|
params.sessionEntry?.queueCap ??
|
|
queueCfg?.cap ??
|
|
DEFAULT_QUEUE_CAP;
|
|
const dropRaw =
|
|
params.inlineOptions?.dropPolicy ??
|
|
params.sessionEntry?.queueDrop ??
|
|
normalizeQueueDropPolicy(queueCfg?.drop) ??
|
|
DEFAULT_QUEUE_DROP;
|
|
return {
|
|
mode: resolvedMode,
|
|
debounceMs: typeof debounceRaw === "number" ? Math.max(0, debounceRaw) : undefined,
|
|
cap: typeof capRaw === "number" ? Math.max(1, Math.floor(capRaw)) : undefined,
|
|
dropPolicy: dropRaw,
|
|
};
|
|
}
|