Skip to content

Commit 33e93e2

Browse files
committed
Telegram: lazy load send runtime from entrypoints
1 parent 4756330 commit 33e93e2

5 files changed

Lines changed: 53 additions & 25 deletions

File tree

extensions/telegram/index.test.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1-
import { describe, expect, it } from "vitest";
1+
import { beforeEach, describe, expect, it, vi } from "vitest";
22
import entry from "./index.js";
33
import setupEntry from "./setup-entry.js";
44

55
describe("telegram bundled entries", () => {
6-
it("loads the channel plugin without importing the broad api barrel", () => {
7-
const plugin = entry.loadChannelPlugin();
8-
expect(plugin.id).toBe("telegram");
6+
beforeEach(() => {
7+
vi.useRealTimers();
8+
});
9+
10+
it("declares the channel entry without importing the broad api barrel", () => {
11+
expect(entry.id).toBe("telegram");
12+
expect(entry.name).toBe("Telegram");
913
});
1014

1115
it("loads the setup plugin without importing the broad api barrel", () => {

extensions/telegram/setup-entry.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { defineBundledChannelSetupEntry } from "openclaw/plugin-sdk/channel-entr
33
export default defineBundledChannelSetupEntry({
44
importMetaUrl: import.meta.url,
55
plugin: {
6-
specifier: "./channel-plugin-api.js",
6+
specifier: "./src/channel.setup.js",
77
exportName: "telegramSetupPlugin",
88
},
99
secrets: {

extensions/telegram/src/channel.ts

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ import * as probeModule from "./probe.js";
6060
import { resolveTelegramReactionLevel } from "./reaction-level.js";
6161
import { getTelegramRuntime } from "./runtime.js";
6262
import { collectTelegramSecurityAuditFindings } from "./security-audit.js";
63-
import { sendMessageTelegram, sendPollTelegram, sendTypingTelegram } from "./send.js";
6463
import { resolveTelegramSessionConversation } from "./session-conversation.js";
6564
import { telegramSetupAdapter } from "./setup-core.js";
6665
import { telegramSetupWizard } from "./setup-surface.js";
@@ -82,7 +81,14 @@ import { buildTelegramThreadingToolContext } from "./threading-tool-context.js";
8281
import { resolveTelegramToken } from "./token.js";
8382
import { parseTelegramTopicConversation } from "./topic-conversation.js";
8483

85-
type TelegramSendFn = typeof sendMessageTelegram;
84+
type TelegramSendFn = typeof import("./send.js").sendMessageTelegram;
85+
86+
let telegramSendModulePromise: Promise<typeof import("./send.js")> | undefined;
87+
88+
async function loadTelegramSendModule() {
89+
telegramSendModulePromise ??= import("./send.js");
90+
return await telegramSendModulePromise;
91+
}
8692

8793
type TelegramSendOptions = NonNullable<Parameters<TelegramSendFn>[2]>;
8894

@@ -121,11 +127,11 @@ function getOptionalTelegramRuntime() {
121127
}
122128
}
123129

124-
function resolveTelegramSend(deps?: OutboundSendDeps): TelegramSendFn {
130+
async function resolveTelegramSend(deps?: OutboundSendDeps): Promise<TelegramSendFn> {
125131
return (
126132
resolveOutboundSendDep<TelegramSendFn>(deps, "telegram") ??
127133
getOptionalTelegramRuntime()?.channel?.telegram?.sendMessageTelegram ??
128-
sendMessageTelegram
134+
(await loadTelegramSendModule()).sendMessageTelegram
129135
);
130136
}
131137

@@ -175,7 +181,7 @@ async function sendTelegramOutbound(params: {
175181
silent?: boolean | null;
176182
gatewayClientScopes?: readonly string[] | null;
177183
}) {
178-
const send = resolveTelegramSend(params.deps);
184+
const send = await resolveTelegramSend(params.deps);
179185
return await send(
180186
params.to,
181187
params.text,
@@ -961,7 +967,8 @@ export const telegramPlugin = createChatChannelPlugin({
961967
if (!token) {
962968
throw new Error("telegram token not configured");
963969
}
964-
await resolveTelegramSend()(id, message, { token, accountId });
970+
const send = await resolveTelegramSend();
971+
await send(id, message, { token, accountId });
965972
},
966973
},
967974
},
@@ -1004,6 +1011,7 @@ export const telegramPlugin = createChatChannelPlugin({
10041011
: typeof target.threadId === "string"
10051012
? Number.parseInt(target.threadId, 10)
10061013
: undefined;
1014+
const { sendTypingTelegram } = await loadTelegramSendModule();
10071015
await sendTypingTelegram(target.to, {
10081016
cfg,
10091017
accountId: target.accountId ?? undefined,
@@ -1030,7 +1038,7 @@ export const telegramPlugin = createChatChannelPlugin({
10301038
forceDocument,
10311039
gatewayClientScopes,
10321040
}) => {
1033-
const send = resolveTelegramSend(deps);
1041+
const send = await resolveTelegramSend(deps);
10341042
const result = await sendTelegramPayloadMessages({
10351043
send,
10361044
to,
@@ -1108,15 +1116,17 @@ export const telegramPlugin = createChatChannelPlugin({
11081116
silent,
11091117
isAnonymous,
11101118
gatewayClientScopes,
1111-
}) =>
1112-
await sendPollTelegram(to, poll, {
1119+
}) => {
1120+
const { sendPollTelegram } = await loadTelegramSendModule();
1121+
return await sendPollTelegram(to, poll, {
11131122
cfg,
11141123
accountId: accountId ?? undefined,
11151124
messageThreadId: parseTelegramThreadId(threadId),
11161125
silent: silent ?? undefined,
11171126
isAnonymous: isAnonymous ?? undefined,
11181127
gatewayClientScopes,
1119-
}),
1128+
});
1129+
},
11201130
},
11211131
},
11221132
});

extensions/telegram/src/outbound-adapter.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,27 @@ import type { TelegramInlineButtons } from "./button-types.js";
1818
import { resolveTelegramInlineButtons } from "./button-types.js";
1919
import { markdownToTelegramHtmlChunks } from "./format.js";
2020
import { parseTelegramReplyToMessageId, parseTelegramThreadId } from "./outbound-params.js";
21-
import { sendMessageTelegram } from "./send.js";
2221

2322
export const TELEGRAM_TEXT_CHUNK_LIMIT = 4000;
2423

25-
type TelegramSendFn = typeof sendMessageTelegram;
24+
type TelegramSendFn = typeof import("./send.js").sendMessageTelegram;
2625
type TelegramSendOpts = Parameters<TelegramSendFn>[2];
2726

28-
function resolveTelegramSendContext(params: {
27+
let telegramSendModulePromise: Promise<typeof import("./send.js")> | undefined;
28+
29+
async function loadTelegramSendModule() {
30+
telegramSendModulePromise ??= import("./send.js");
31+
return await telegramSendModulePromise;
32+
}
33+
34+
async function resolveTelegramSendContext(params: {
2935
cfg: NonNullable<TelegramSendOpts>["cfg"];
3036
deps?: OutboundSendDeps;
3137
accountId?: string | null;
3238
replyToId?: string | null;
3339
threadId?: string | number | null;
3440
gatewayClientScopes?: readonly string[];
35-
}): {
41+
}): Promise<{
3642
send: TelegramSendFn;
3743
baseOpts: {
3844
cfg: NonNullable<TelegramSendOpts>["cfg"];
@@ -43,9 +49,10 @@ function resolveTelegramSendContext(params: {
4349
accountId?: string;
4450
gatewayClientScopes?: readonly string[];
4551
};
46-
} {
52+
}> {
4753
const send =
48-
resolveOutboundSendDep<TelegramSendFn>(params.deps, "telegram") ?? sendMessageTelegram;
54+
resolveOutboundSendDep<TelegramSendFn>(params.deps, "telegram") ??
55+
(await loadTelegramSendModule()).sendMessageTelegram;
4956
return {
5057
send,
5158
baseOpts: {
@@ -126,7 +133,7 @@ export const telegramOutbound: ChannelOutboundAdapter = {
126133
threadId,
127134
gatewayClientScopes,
128135
}) => {
129-
const { send, baseOpts } = resolveTelegramSendContext({
136+
const { send, baseOpts } = await resolveTelegramSendContext({
130137
cfg,
131138
deps,
132139
accountId,
@@ -152,7 +159,7 @@ export const telegramOutbound: ChannelOutboundAdapter = {
152159
forceDocument,
153160
gatewayClientScopes,
154161
}) => {
155-
const { send, baseOpts } = resolveTelegramSendContext({
162+
const { send, baseOpts } = await resolveTelegramSendContext({
156163
cfg,
157164
deps,
158165
accountId,
@@ -182,7 +189,7 @@ export const telegramOutbound: ChannelOutboundAdapter = {
182189
forceDocument,
183190
gatewayClientScopes,
184191
}) => {
185-
const { send, baseOpts } = resolveTelegramSendContext({
192+
const { send, baseOpts } = await resolveTelegramSendContext({
186193
cfg,
187194
deps,
188195
accountId,

extensions/telegram/src/thread-bindings.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,20 @@ import { normalizeAccountId } from "openclaw/plugin-sdk/routing";
1818
import { logVerbose } from "openclaw/plugin-sdk/runtime-env";
1919
import { resolveStateDir } from "openclaw/plugin-sdk/state-paths";
2020
import { normalizeOptionalString } from "openclaw/plugin-sdk/text-runtime";
21-
import { createForumTopicTelegram } from "./send.js";
2221
import { resolveTelegramToken } from "./token.js";
2322

2423
const DEFAULT_THREAD_BINDING_IDLE_TIMEOUT_MS = 24 * 60 * 60 * 1000;
2524
const DEFAULT_THREAD_BINDING_MAX_AGE_MS = 0;
2625
const THREAD_BINDINGS_SWEEP_INTERVAL_MS = 60_000;
2726
const STORE_VERSION = 1;
2827

28+
let telegramSendModulePromise: Promise<typeof import("./send.js")> | undefined;
29+
30+
async function loadTelegramSendModule() {
31+
telegramSendModulePromise ??= import("./send.js");
32+
return await telegramSendModulePromise;
33+
}
34+
2935
type TelegramBindingTargetKind = "subagent" | "acp";
3036

3137
export type TelegramThreadBindingRecord = {
@@ -593,6 +599,7 @@ export function createTelegramThreadBindingManager(
593599
if (!tokenResolution.token) {
594600
return null;
595601
}
602+
const { createForumTopicTelegram } = await loadTelegramSendModule();
596603
const result = await createForumTopicTelegram(chatId, threadName, {
597604
cfg,
598605
token: tokenResolution.token,

0 commit comments

Comments
 (0)