Limits
Technical limits for EdgeBase Realtime (WebSocket subscriptions, Presence, and Broadcast).
Connections
| Limit | Default | Configurable | Notes |
|---|---|---|---|
| Auth timeout | 5,000 ms | Yes | realtime.authTimeoutMs — connection closed if no auth message received |
| Max pending connections per IP | 5 | No | Unauthenticated WebSocket DDoS gate |
| Pending connection TTL | 10 seconds | No | Auto-expires; no cleanup needed |
| Ping/Pong interval | 30 seconds | No | Client sends ping, server responds pong |
Subscriptions & Filters
| Limit | Value | Notes |
|---|---|---|
| Server-side filter conditions (AND) | 5 max | Per subscription |
| Server-side filter conditions (OR) | 5 max | Per subscription |
| Channel access rule evaluation | Subscribe-time only | Re-evaluated on re-auth |
| Batch changes threshold | 10 changes | Configurable via realtime.batchThreshold |
Presence
| Limit | Default | Configurable | Notes |
|---|---|---|---|
| Presence payload size | 1 KB | No | Validated on both server and SDK |
| Presence TTL | 60,000 ms (60s) | Yes | realtime.presenceTTL — stale entries auto-removed |
Hibernation & Recovery
| Behavior | Details |
|---|---|
| Hibernation | Idle DOs hibernate automatically — $0 duration cost |
| Wake-up recovery | PRESENCE_RESYNC + FILTER_RESYNC messages sent to clients |
| State loss on hibernate | Subscription state and presence maps are cleared; SDK re-syncs automatically |
Rate Limiting
| Group | Default | Key | Configurable |
|---|---|---|---|
global | 10,000,000 req / 60s | IP | Yes |
WebSocket upgrade requests count against the global rate limit. Once connected, messages flow through the Durable Object without per-message rate limiting.
SQLite not used
Realtime DOs do not use SQLite. All state is in-memory and connection-based. When a connection ends, the associated state is removed. This is by design — Realtime is ephemeral.