Fixes issue where Telegram fails to send messages when IPv6 is configured but not functional on the network. Problem: - Many networks (especially in Latin America) have IPv6 configured but not properly routed by ISP/router - Node.js tries IPv6 first, gets 'Network is unreachable' error - With autoSelectFamily=false, Node doesn't fallback to IPv4 - Result: All Telegram API calls fail Solution: - Change default from false to true for Node.js 22+ - This enables automatic IPv4 fallback when IPv6 fails - Config option channels.telegram.network.autoSelectFamily still available for users who need to override Symptoms fixed: - Health check: Telegram | WARN | failed (unknown) - fetch failed - Logs: Network request for 'sendMessage' failed - Bot receives messages but cannot send replies Tested on: - macOS 26.2 (Sequoia) - Node.js v22.15.0 - OpenClaw 2026.2.12 - Network with IPv6 configured but not routed
39 lines
1.4 KiB
TypeScript
39 lines
1.4 KiB
TypeScript
import process from "node:process";
|
|
import type { TelegramNetworkConfig } from "../config/types.telegram.js";
|
|
import { isTruthyEnvValue } from "../infra/env.js";
|
|
|
|
export const TELEGRAM_DISABLE_AUTO_SELECT_FAMILY_ENV =
|
|
"OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY";
|
|
export const TELEGRAM_ENABLE_AUTO_SELECT_FAMILY_ENV = "OPENCLAW_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY";
|
|
|
|
export type TelegramAutoSelectFamilyDecision = {
|
|
value: boolean | null;
|
|
source?: string;
|
|
};
|
|
|
|
export function resolveTelegramAutoSelectFamilyDecision(params?: {
|
|
network?: TelegramNetworkConfig;
|
|
env?: NodeJS.ProcessEnv;
|
|
nodeMajor?: number;
|
|
}): TelegramAutoSelectFamilyDecision {
|
|
const env = params?.env ?? process.env;
|
|
const nodeMajor =
|
|
typeof params?.nodeMajor === "number"
|
|
? params.nodeMajor
|
|
: Number(process.versions.node.split(".")[0]);
|
|
|
|
if (isTruthyEnvValue(env[TELEGRAM_ENABLE_AUTO_SELECT_FAMILY_ENV])) {
|
|
return { value: true, source: `env:${TELEGRAM_ENABLE_AUTO_SELECT_FAMILY_ENV}` };
|
|
}
|
|
if (isTruthyEnvValue(env[TELEGRAM_DISABLE_AUTO_SELECT_FAMILY_ENV])) {
|
|
return { value: false, source: `env:${TELEGRAM_DISABLE_AUTO_SELECT_FAMILY_ENV}` };
|
|
}
|
|
if (typeof params?.network?.autoSelectFamily === "boolean") {
|
|
return { value: params.network.autoSelectFamily, source: "config" };
|
|
}
|
|
if (Number.isFinite(nodeMajor) && nodeMajor >= 22) {
|
|
return { value: true, source: "default-node22" };
|
|
}
|
|
return { value: null };
|
|
}
|