Skip to content

Commit 3164733

Browse files
lzyyzznlclaude
andcommitted
fix(telegram): 排除 EADDRNOTAVAIL 误触发 Telegram 传输回退
EADDRNOTAVAIL 是本地 socket 分配失败,切换远程 Telegram IP 无效。 collectErrorCodes() 增加数值 errno 提取,shouldUseTelegramTransportFallback() 在 EADDRNOTAVAIL 时返回 false 避免无效回退和误导性日志。 Fixes #94620 Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
1 parent 0e14a3f commit 3164733

2 files changed

Lines changed: 35 additions & 2 deletions

File tree

extensions/telegram/src/fetch.test.ts

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ vi.mock("openclaw/plugin-sdk/runtime-env", () => ({
113113
let resolveTelegramFetch: typeof import("./fetch.js").resolveTelegramFetch;
114114
let resolveTelegramApiBase: typeof import("./fetch.js").resolveTelegramApiBase;
115115
let resolveTelegramTransport: typeof import("./fetch.js").resolveTelegramTransport;
116+
let shouldRetryTelegramTransportFallback: typeof import("./fetch.js").shouldRetryTelegramTransportFallback;
116117
const tempDirs: string[] = [];
117118

118119
type TelegramDispatcherPolicy = NonNullable<
@@ -125,8 +126,12 @@ type ExplicitProxyTelegramDispatcherPolicy = Extract<
125126
>;
126127

127128
beforeAll(async () => {
128-
({ resolveTelegramApiBase, resolveTelegramFetch, resolveTelegramTransport } =
129-
await import("./fetch.js"));
129+
({
130+
resolveTelegramApiBase,
131+
resolveTelegramFetch,
132+
resolveTelegramTransport,
133+
shouldRetryTelegramTransportFallback,
134+
} = await import("./fetch.js"));
130135
});
131136

132137
beforeEach(() => {
@@ -1327,4 +1332,24 @@ describe("resolveTelegramFetch", () => {
13271332
await expect(transport.close()).resolves.toBeUndefined();
13281333
});
13291334
});
1335+
1336+
describe("shouldRetryTelegramTransportFallback", () => {
1337+
it("returns false for EADDRNOTAVAIL code string", () => {
1338+
const err = buildFetchFallbackError("EADDRNOTAVAIL");
1339+
expect(shouldRetryTelegramTransportFallback(err)).toBe(false);
1340+
});
1341+
1342+
it("returns false for EADDRNOTAVAIL numeric errno", () => {
1343+
const connectErr = Object.assign(new Error("connect EADDRNOTAVAIL api.telegram.org:443"), {
1344+
errno: 99,
1345+
});
1346+
const err = Object.assign(new TypeError("fetch failed"), { cause: connectErr });
1347+
expect(shouldRetryTelegramTransportFallback(err)).toBe(false);
1348+
});
1349+
1350+
it("returns true for other network errors", () => {
1351+
const err = buildFetchFallbackError("ENETUNREACH");
1352+
expect(shouldRetryTelegramTransportFallback(err)).toBe(true);
1353+
});
1354+
});
13301355
});

extensions/telegram/src/fetch.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,10 @@ function collectErrorCodes(err: unknown): Set<string> {
431431
if (typeof code === "string" && code.trim()) {
432432
codes.add(code.trim().toUpperCase());
433433
}
434+
const errno = (current as { errno?: unknown }).errno;
435+
if (typeof errno === "number") {
436+
codes.add(String(errno));
437+
}
434438
const cause = (current as { cause?: unknown }).cause;
435439
if (cause && !seen.has(cause)) {
436440
queue.push(cause);
@@ -473,6 +477,10 @@ function shouldUseTelegramTransportFallback(err: unknown): boolean {
473477
: "",
474478
codes: collectErrorCodes(err),
475479
};
480+
// EADDRNOTAVAIL 是本地 socket 分配失败,换远程 IP 无效
481+
if (ctx.codes.has("EADDRNOTAVAIL") || ctx.codes.has("99")) {
482+
return false;
483+
}
476484
const hasFetchFailedEnvelope = ctx.message.includes("fetch failed");
477485
const hasKnownNetworkCode = FALLBACK_RETRY_ERROR_CODES.some((code) => ctx.codes.has(code));
478486
return hasKnownNetworkCode || (hasFetchFailedEnvelope && ctx.codes.size === 0);

0 commit comments

Comments
 (0)