From 4309dc6d5ee91d4237f4227de26a8389b8733355 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Thu, 2 Apr 2026 14:07:35 +0900 Subject: [PATCH] perf(memory): lazy-load telegram monitor runtime graphs --- .../telegram/src/monitor-polling.runtime.ts | 3 + .../telegram/src/monitor-webhook.runtime.ts | 2 + extensions/telegram/src/monitor.ts | 76 +++++++++++++------ 3 files changed, 58 insertions(+), 23 deletions(-) create mode 100644 extensions/telegram/src/monitor-polling.runtime.ts create mode 100644 extensions/telegram/src/monitor-webhook.runtime.ts diff --git a/extensions/telegram/src/monitor-polling.runtime.ts b/extensions/telegram/src/monitor-polling.runtime.ts new file mode 100644 index 00000000000..a2f94979b15 --- /dev/null +++ b/extensions/telegram/src/monitor-polling.runtime.ts @@ -0,0 +1,3 @@ +export { TelegramExecApprovalHandler } from "./exec-approvals-handler.js"; +export { TelegramPollingSession } from "./polling-session.js"; +export { readTelegramUpdateOffset, writeTelegramUpdateOffset } from "./update-offset-store.js"; diff --git a/extensions/telegram/src/monitor-webhook.runtime.ts b/extensions/telegram/src/monitor-webhook.runtime.ts new file mode 100644 index 00000000000..4580f11e31f --- /dev/null +++ b/extensions/telegram/src/monitor-webhook.runtime.ts @@ -0,0 +1,2 @@ +export { TelegramExecApprovalHandler } from "./exec-approvals-handler.js"; +export { startTelegramWebhook } from "./webhook.js"; diff --git a/extensions/telegram/src/monitor.ts b/extensions/telegram/src/monitor.ts index 63b80a16e57..bb9376f3ae4 100644 --- a/extensions/telegram/src/monitor.ts +++ b/extensions/telegram/src/monitor.ts @@ -8,16 +8,12 @@ import type { RuntimeEnv } from "openclaw/plugin-sdk/runtime-env"; import { formatErrorMessage } from "openclaw/plugin-sdk/ssrf-runtime"; import { resolveTelegramAccount } from "./accounts.js"; import { resolveTelegramAllowedUpdates } from "./allowed-updates.js"; -import { TelegramExecApprovalHandler } from "./exec-approvals-handler.js"; import { resolveTelegramTransport } from "./fetch.js"; import { isRecoverableTelegramNetworkError, isTelegramPollingNetworkError, } from "./network-errors.js"; -import { TelegramPollingSession } from "./polling-session.js"; import { makeProxyFetch } from "./proxy.js"; -import { readTelegramUpdateOffset, writeTelegramUpdateOffset } from "./update-offset-store.js"; -import { startTelegramWebhook } from "./webhook.js"; export type MonitorTelegramOpts = { token?: string; @@ -75,6 +71,24 @@ const isGrammyHttpError = (err: unknown): boolean => { return (err as { name?: string }).name === "HttpError"; }; +let telegramMonitorPollingRuntimePromise: + | Promise + | undefined; + +async function loadTelegramMonitorPollingRuntime() { + telegramMonitorPollingRuntimePromise ??= import("./monitor-polling.runtime.js"); + return await telegramMonitorPollingRuntimePromise; +} + +let telegramMonitorWebhookRuntimePromise: + | Promise + | undefined; + +async function loadTelegramMonitorWebhookRuntime() { + telegramMonitorWebhookRuntimePromise ??= import("./monitor-webhook.runtime.js"); + return await telegramMonitorWebhookRuntimePromise; +} + export async function monitorTelegramProvider(opts: MonitorTelegramOpts = {}) { const log = opts.runtime?.error ?? console.error; let pollingSession: TelegramPollingSession | undefined; @@ -120,6 +134,41 @@ export async function monitorTelegramProvider(opts: MonitorTelegramOpts = {}) { const proxyFetch = opts.proxyFetch ?? (account.config.proxy ? makeProxyFetch(account.config.proxy) : undefined); + if (opts.useWebhook) { + const { TelegramExecApprovalHandler, startTelegramWebhook } = + await loadTelegramMonitorWebhookRuntime(); + execApprovalsHandler = new TelegramExecApprovalHandler({ + token, + accountId: account.accountId, + cfg, + runtime: opts.runtime, + }); + await execApprovalsHandler.start(); + await startTelegramWebhook({ + token, + accountId: account.accountId, + config: cfg, + path: opts.webhookPath, + port: opts.webhookPort, + secret: opts.webhookSecret ?? account.config.webhookSecret, + host: opts.webhookHost ?? account.config.webhookHost, + runtime: opts.runtime as RuntimeEnv, + fetch: proxyFetch, + abortSignal: opts.abortSignal, + publicUrl: opts.webhookUrl, + webhookCertPath: opts.webhookCertPath, + }); + await waitForAbortSignal(opts.abortSignal); + return; + } + + const { + TelegramExecApprovalHandler, + TelegramPollingSession, + readTelegramUpdateOffset, + writeTelegramUpdateOffset, + } = await loadTelegramMonitorPollingRuntime(); + execApprovalsHandler = new TelegramExecApprovalHandler({ token, accountId: account.accountId, @@ -162,25 +211,6 @@ export async function monitorTelegramProvider(opts: MonitorTelegramOpts = {}) { } }; - if (opts.useWebhook) { - await startTelegramWebhook({ - token, - accountId: account.accountId, - config: cfg, - path: opts.webhookPath, - port: opts.webhookPort, - secret: opts.webhookSecret ?? account.config.webhookSecret, - host: opts.webhookHost ?? account.config.webhookHost, - runtime: opts.runtime as RuntimeEnv, - fetch: proxyFetch, - abortSignal: opts.abortSignal, - publicUrl: opts.webhookUrl, - webhookCertPath: opts.webhookCertPath, - }); - await waitForAbortSignal(opts.abortSignal); - return; - } - // Preserve sticky IPv4 fallback state across clean/conflict restarts. // Dirty polling cycles rebuild transport inside TelegramPollingSession. const createTelegramTransportForPolling = () =>