cloudflare / cloudflare/moltworker

# Bug: Telegram integration fails with `TypeError: fetch failed` from Node.js process, but `curl` works from shell

Open
#268 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
TypeScript
Stars
10k
Forks
1.7k
PR merge metrics
No merged PRs in 30d

Description

# Bug: Telegram integration fails with `TypeError: fetch failed` from Node.js process, but `curl` works from shell

## Environment

- **Moltworker:** Deployed via "Deploy to Cloudflare" button
- **OpenClaw version:** 2026.2.17 (upgraded from 2026.2.3 — same behavior on both)
- **Container:** Cloudflare Sandbox (`standard-1`)
- **Secrets configured:** `TELEGRAM_BOT_TOKEN`, `ANTHROPIC_API_KEY`, `MOLTBOT_GATEWAY_TOKEN`, `CF_ACCESS_AUD`, `CF_ACCESS_TEAM_DOMAIN`, `CF_ACCOUNT_ID`, `R2_ACCESS_KEY_ID`, `R2_SECRET_ACCESS_KEY`, `CDP_SECRET`, `WORKER_URL`, `DEBUG_ROUTES=true`

## Description

Telegram channel shows as configured and enabled in the gateway config, and the bot token is valid. However, the grammy library's `getUpdates` polling fails continuously with `TypeError: fetch failed` from Node's built-in undici fetch.

**The key finding:** Running `curl` to `api.telegram.org` from within the container shell **works** — messages are successfully sent. But the Node.js gateway process **cannot** make outbound HTTP requests to Telegram's API.

This suggests the Cloudflare Sandbox/Firecracker environment has different network access rules for the Node.js process vs. shell commands.

## Steps to Reproduce

1. Deploy Moltworker via the "Deploy to Cloudflare" button
2. Set `TELEGRAM_BOT_TOKEN` secret with a valid bot token from @BotFather
3. Restart the gateway
4. Send a message to the bot on Telegram
5. Observe no response; check debug logs

## Expected Behavior

Telegram bot receives and responds to messages.

## Actual Behavior

Gateway starts and recognizes Telegram config:

```
[telegram] [default] starting provider (@claw_gpolzer_bot)
[telegram] autoSelectFamily=false (default-node22)
```

Then immediately begins failing with repeated fetch errors:

```
[openclaw] Non-fatal unhandled rejection (continuing): TypeError: fetch failed
at node:internal/deps/undici/undici:13502:13
at processTicksAndRejections (node:internal/process/task_queues:105:5)
```

With periodic Telegram-specific errors:

```
[telegram] network error: Network request for 'getUpdates' failed!; retrying in 2.16s.
[telegram] network error: Network request for 'getUpdates' failed!; retrying in 4.49s.
```

These errors repeat indefinitely every ~10 seconds.

## Diagnostic Evidence

**OpenClaw's own status check reports Telegram as healthy:**

```
│ Telegram │ ON │ OK │ token config (8243…MWJk · len 46) · accounts 1/1
```

**But sending a message via curl from the container shell succeeds:**

OpenClaw was able to run `curl` to `api.telegram.org/bot/sendMessage` and the message was delivered to Telegram. This confirms:
- The bot token is valid
- The container *can* reach `api.telegram.org` via shell commands
- The issue is specific to Node.js `fetch()` / undici within the gateway process

## Possible Cause

The Cloudflare Sandbox (Firecracker) environment may apply different network isolation rules to the main Node.js process vs. child processes / shell commands. The grammy library uses Node's built-in `fetch` (undici), which may be subject to stricter networking constraints in the sandbox.

## Workaround

None found. The Control UI (WebSocket-based) works correctly for all interactions — only external API calls from the Node.js process are affected. This likely also impacts Discord and Slack integrations.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.