| 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"; |
| } |
|
|
| |
| 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, |
| }; |
| } |
|
|