Skip to content

[BlueBubbles] Hardcoded 10s send timeout causes message loss on macOS 26 (Private API stalls) #67486

@larrylhollan

Description

@larrylhollan

Summary

The BlueBubbles channel plugin uses a hardcoded 10-second timeout (DEFAULT_TIMEOUT_MS = 1e4) for all HTTP requests, including message sends via /api/v1/message/text. On macOS 26 (Tahoe), BlueBubbles Private API sends intermittently stall for 60-124 seconds due to iMessage framework delays. The aggressive 10s timeout causes these sends to be permanently lost — the request is aborted before BB can complete it, even though it would eventually succeed.

Problem

  1. DEFAULT_TIMEOUT_MS is defined in extensions/bluebubbles/src/types.ts as 1e4 (10 seconds)
  2. blueBubblesFetchWithTimeout() uses this as the default when timeoutMs is not passed
  3. All outbound message sends — sendText (outbound adapter at api.js:1090), chunked outbound (channel.runtime:1794), and sendMessageBlueBubbles() itself — call through without passing timeoutMs
  4. The BB config schema (BlueBubblesChannelConfigSchema) has no sendTimeoutMs or similar field
  5. There is no way for operators to tune this value

Environment

  • OpenClaw: 2026.4.11
  • macOS: 26.3.1 (Tahoe)
  • BlueBubbles Server: 1.9.9
  • Private API: enabled (DYLIB injection, SIP disabled)

Observed behavior

BlueBubbles Private API sends on macOS 26 intermittently take 60-124 seconds to complete (iMessage framework stall). OpenClaw aborts these at 10s. The send is lost — no retry, no user-visible error in most outbound paths.

Expected behavior

A configurable timeout for BB API requests, especially message sends. Suggested config shape:

{
  "plugins": {
    "entries": {
      "bluebubbles": {
        "config": {
          "accounts": {
            "default": {
              "sendTimeoutMs": 45000
            }
          }
        }
      }
    }
  }
}

Or a simpler top-level apiTimeoutMs / sendTimeoutMs field in the BB account config schema.

Workaround

None currently. The timeout is not configurable and not exposed in any config path.

Code references

  • DEFAULT_TIMEOUT_MS = 1e4dist/monitor-normalize-*.js:20 (source: extensions/bluebubbles/src/types.ts)
  • blueBubblesFetchWithTimeout(url, init, timeoutMs = DEFAULT_TIMEOUT_MS, ssrfPolicy) → same file
  • sendMessageBlueBubbles() passes opts.timeoutMs through but all callers omit it → dist/reactions-*.js:362
  • Outbound sendText omits timeoutMsdist/extensions/bluebubbles/api.js:1090
  • Chunked outbound omits timeoutMsdist/channel.runtime-*.js:1794
  • Config schema has no timeout field → dist/config-schema-*.js:40

Metadata

Metadata

Assignees

Labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions