UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

93 lines (92 loc) 4.09 kB
import { _ as uniqueStrings, l as normalizeStringEntries } from "./string-normalization-WNUDCpXX.js"; import "./string-coerce-runtime-CEGJWkQ_.js"; import { t as createClaimableDedupe } from "./persistent-dedupe-tc3aSkBu.js"; import path from "node:path"; //#region extensions/telegram/src/message-dispatch-dedupe.ts const TELEGRAM_MESSAGE_DISPATCH_DEDUPE_TTL_MS = 10080 * 60 * 1e3; const TELEGRAM_MESSAGE_DISPATCH_DEDUPE_NAMESPACE = "global"; const TELEGRAM_MESSAGE_DISPATCH_DEDUPE_NAMESPACE_PREFIX = "telegram.message-dispatch-dedupe"; const TELEGRAM_MESSAGE_DISPATCH_DEDUPE_STATE_PLUGIN_ID = "telegram-message-dispatch-dedupe"; const TELEGRAM_MESSAGE_DISPATCH_DEDUPE_MEMORY_MAX_ENTRIES = 5e4; const TELEGRAM_MESSAGE_DISPATCH_DEDUPE_STATE_MAX_ENTRIES = 5e4; function sanitizeFileSegment(value) { const trimmed = value.trim(); if (!trimmed) return "default"; return trimmed.replace(/[^a-zA-Z0-9_-]/g, "_"); } function resolveTelegramMessageDispatchLegacyPath(params) { return path.join(path.dirname(params.storePath), `${path.basename(params.storePath)}.telegram-message-dispatch-${sanitizeFileSegment(params.namespace)}.json`); } function buildTelegramMessageDispatchReplayKey(msg) { const chatId = msg.chat?.id; const messageId = msg.message_id; if (chatId == null || typeof messageId !== "number" || messageId <= 0) return null; return JSON.stringify([ "message", String(chatId), messageId ]); } function buildTelegramMessageDispatchAccountReplayKey(params) { return JSON.stringify([ "account", params.accountId, params.key ]); } function buildTelegramMessageDispatchStoredReplayKey(params) { const key = buildTelegramMessageDispatchReplayKey(params.msg); return key ? buildTelegramMessageDispatchAccountReplayKey({ accountId: params.accountId, key }) : null; } function createTelegramMessageDispatchReplayGuard(params = {}) { return createClaimableDedupe({ ttlMs: TELEGRAM_MESSAGE_DISPATCH_DEDUPE_TTL_MS, memoryMaxSize: TELEGRAM_MESSAGE_DISPATCH_DEDUPE_MEMORY_MAX_ENTRIES, pluginId: TELEGRAM_MESSAGE_DISPATCH_DEDUPE_STATE_PLUGIN_ID, namespacePrefix: TELEGRAM_MESSAGE_DISPATCH_DEDUPE_NAMESPACE_PREFIX, stateMaxEntries: TELEGRAM_MESSAGE_DISPATCH_DEDUPE_STATE_MAX_ENTRIES, ...params.onDiskError ? { onDiskError: params.onDiskError } : {} }); } async function claimTelegramMessageDispatchReplay(params) { const key = buildTelegramMessageDispatchStoredReplayKey({ accountId: params.accountId, msg: params.msg }); if (!key) return { kind: "invalid" }; let releaseRetries = 0; while (true) { const claim = await params.guard.claim(key, { namespace: TELEGRAM_MESSAGE_DISPATCH_DEDUPE_NAMESPACE }); if (claim.kind === "claimed") return { kind: "claimed", key }; if (claim.kind === "duplicate") return { kind: "duplicate" }; try { await claim.pending; return { kind: "duplicate" }; } catch { releaseRetries += 1; if (releaseRetries > 1) return { kind: "duplicate" }; } } } function normalizeReplayKeys(keys) { return uniqueStrings(normalizeStringEntries(keys ?? [])); } async function commitTelegramMessageDispatchReplay(params) { const keys = normalizeReplayKeys(params.keys); await Promise.all(keys.map((key) => params.guard.commit(key, { namespace: TELEGRAM_MESSAGE_DISPATCH_DEDUPE_NAMESPACE }))); } function releaseTelegramMessageDispatchReplay(params) { const keys = normalizeReplayKeys(params.keys); for (const key of keys) params.guard.release(key, { namespace: TELEGRAM_MESSAGE_DISPATCH_DEDUPE_NAMESPACE, error: params.error }); } //#endregion export { TELEGRAM_MESSAGE_DISPATCH_DEDUPE_TTL_MS as a, commitTelegramMessageDispatchReplay as c, resolveTelegramMessageDispatchLegacyPath as d, TELEGRAM_MESSAGE_DISPATCH_DEDUPE_STATE_PLUGIN_ID as i, createTelegramMessageDispatchReplayGuard as l, TELEGRAM_MESSAGE_DISPATCH_DEDUPE_NAMESPACE_PREFIX as n, buildTelegramMessageDispatchAccountReplayKey as o, TELEGRAM_MESSAGE_DISPATCH_DEDUPE_STATE_MAX_ENTRIES as r, claimTelegramMessageDispatchReplay as s, TELEGRAM_MESSAGE_DISPATCH_DEDUPE_NAMESPACE as t, releaseTelegramMessageDispatchReplay as u };