EventSource works in Chrome 6+, Edge 79+, Firefox 6+, Safari 5+ on macOS, Safari 4+ on iOS, Opera 11+, and Samsung Internet 4+. Learn the API, features, and limits.

Prince Dewani
May 6, 2026
On This Page
EventSource is the JavaScript interface defined in the WHATWG HTML Living Standard that opens a one-way text stream from a server to a browser over plain HTTP using the text/event-stream MIME type. It works in Chrome 6+, Edge 79+, Firefox 6+, Safari 5+ on macOS, Safari 4+ on iOS, Opera 11+, Samsung Internet 4+, and Android Browser 4.4+, while Internet Explorer and Opera Mini never added support.
This guide covers what EventSource is, the browsers that support it, the key features, how it compares to WebSockets, the limitations, and how to check support in your browser.
EventSource is a JavaScript interface defined by the WHATWG HTML Living Standard that opens a long-lived HTTP connection to a server and receives a one-way stream of UTF-8 text events. The browser parses the text/event-stream response, fires message events on the page, and reconnects automatically on network drops.
EventSource ships in every modern browser, with global support near 97% across desktop and mobile. Once a browser shipped the interface, the spec did not break across versions, so feature detection is the only check production code needs.
Chrome supports EventSource from Chrome 6 on Windows, macOS, Linux, ChromeOS, and Android. Chrome 4 and 5 did not support EventSource. The constructor, message and error events, the withCredentials option, and automatic reconnection all ship by default in every supported Chrome release, and Chrome for Android tracks the same Chromium implementation as the desktop build.
Microsoft Edge supports EventSource from Edge 79 on Windows, macOS, and Linux. Pre-Chromium EdgeHTML versions 12 to 18 did not ship the EventSource interface, which means anyone testing on the legacy Edge engine still needs a polyfill. Chromium-based Edge 79 and later track the upstream Chromium build, so behavior matches Chrome on every supported Edge release.
Firefox supports EventSource from Firefox 6 on Windows, macOS, Linux, and Android. Firefox 1 to 5 did not support EventSource. Mozilla ships the constructor, the readyState property, named events through addEventListener, and the withCredentials option on every supported Firefox release, and Firefox for Android tracks the same Gecko build as the desktop browser.
Safari supports EventSource from Safari 5 on macOS and from Safari 4 on iOS and iPadOS. Safari 3 and earlier did not support EventSource on either platform. Apple ships the constructor, the message and error events, and automatic reconnection on every supported Safari version, and Safari Technical Preview tracks the same WebKit implementation that ships in stable Safari.
Opera supports EventSource from Opera 11 on Windows, macOS, and Linux. Opera 9 to 10.6 carried only partial support during the early Server-Sent Events draft. Opera Mobile 12+ and Opera for Android both ship the interface on phones and tablets, while Opera Mini does not expose EventSource in any version because the proxy-based rendering pipeline does not keep long-lived HTTP connections open per user.
Samsung Internet supports EventSource from Samsung Internet 4 on Galaxy phones and tablets. The browser tracks the upstream Chromium implementation, so any Samsung Internet release on a current Android device ships the constructor, automatic reconnection, and the withCredentials option by default. Samsung Internet 1 to 3 did not support EventSource.
Chrome for Android supports EventSource from version 4.4 onward, which covers every Android device sold in the last decade. The legacy stock Android Browser based on WebView 3.x and earlier did not support EventSource. Firefox for Android also ships EventSource from Firefox 6 on phones and tablets, so the streaming interface is available on every actively supported Android browser.
Internet Explorer 5.5 through 11 do not support EventSource on any version of Windows. Microsoft has retired Internet Explorer 11, so any project still pinned to IE has to load a polyfill like the eventsource npm package or fall back to long polling. Move new EventSource workloads to Chromium-based Edge for full native support.
Note: EventSource behaves differently across browsers, proxies, and HTTP versions. Test it on real browsers and OS with TestMu AI. Try TestMu AI free!
EventSource bakes streaming, reconnection, and event routing into a single small interface so the page does not have to wire any of it by hand. The features below cover what the constructor gives you out of the box.
EventSource and WebSockets both keep a long-lived connection open between a browser and a server, but the trade-offs cluster around direction, transport, and payload type. The table below compares the two on the dimensions that drive the design decision.
| Dimension | EventSource (SSE) | WebSockets |
|---|---|---|
| Direction | One-way: server pushes to client only | Bidirectional: either side can send a frame at any time |
| Transport | Plain HTTP, rides HTTP/2 multiplexing for free | Dedicated TCP connection, HTTP/2 needs RFC 8441 |
| Payload | UTF-8 text only, parsed as text/event-stream | UTF-8 text or binary frames, no built-in parsing |
| Reconnection | Automatic, with Last-Event-ID resume | Manual, the page must implement backoff and replay |
| Browser support | Chrome 6+, Firefox 6+, Safari 5+, Edge 79+, no Internet Explorer | Chrome 16+, Firefox 11+, Safari 7+, Edge 12+, IE 10+ |
| Best fit | Live feeds, AI streaming responses, dashboards, notifications | Chat, multiplayer games, collaborative editors, trading |
EventSource trades flexibility for a tiny API, so the rough edges show up the moment a project needs anything beyond a one-way GET stream. The painful failures cluster around HTTP method, headers, connection caps, and proxy behavior.
In my experience, the limitation that bites teams hardest is proxy buffering. An SSE feed that streams cleanly on localhost goes silent in staging because NGINX or a CDN edge holds the response until the connection closes. Set X-Accel-Buffering: no, disable gzip on the route, and verify a chunked response with curl before you ship.
A one-line feature check on the window object tells the page whether to wire native EventSource or load a polyfill. Paste this snippet into the DevTools console of Chrome, Edge, Firefox, or Safari to confirm support and watch a single event arrive from a public test stream.
// Paste this into the DevTools console to confirm EventSource support and watch a test stream.
if ("EventSource" in window) {
console.log("EventSource is supported in this browser.");
const stream = new EventSource("https://sse.dev/test");
stream.addEventListener("open", () => {
console.log("Stream opened, readyState =", stream.readyState);
});
stream.addEventListener("message", (event) => {
console.log("Event received:", event.data);
stream.close();
console.log("Stream closed after first event.");
});
stream.addEventListener("error", () => {
console.log("EventSource error: the test endpoint may be unreachable from this network.");
});
} else {
console.log("EventSource is not supported in this browser.");
}If the console logs that EventSource is supported but the open event never fires, the network path is blocking long-lived HTTP responses. Check the Network tab for a 200 response with Content-Type: text/event-stream, then verify no proxy on the path is buffering or compressing the body.
All EventSource version numbers and platform notes in this guide come from these primary sources:
Did you find this page helpful?
More Related Hubs
TestMu AI forEnterprise
Get access to solutions built on Enterprise
grade security, privacy, & compliance