|
| 1 | +### Server-Sent Events |
| 2 | + |
| 3 | +Server-Sent Events (SSE) is a server push technology enabling a client to receive automatic updates from a server via HTTP connection. Each notification is sent as a block of text terminated by a pair of newlines (learn more [here](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events)). |
| 4 | + |
| 5 | +#### Usage |
| 6 | + |
| 7 | +To enable Server-Sent events on a route (route registered within a **controller class**), annotate the method handler with the `@Sse()` decorator. |
| 8 | + |
| 9 | +```typescript |
| 10 | +@Sse('sse') |
| 11 | +sse(): Observable<MessageEvent> { |
| 12 | + return interval(1000).pipe(map((_) => ({ data: { hello: 'world' } }))); |
| 13 | +} |
| 14 | +``` |
| 15 | + |
| 16 | +> info **Hint** The `@Sse()` decorator is imported from the `@nestjs/common`, while `Observable`, `interval`, `and map` are imported from the `rxjs` package. |
| 17 | +
|
| 18 | +> warning **Warning** Server-Sent Events routes must return an `Observable` stream. |
| 19 | +
|
| 20 | +In the example above, we defined a route named `sse` that will allow us to propagate real-time updates. These events can be listened to using the [EventSource API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource). |
| 21 | + |
| 22 | +The `sse` method returns an `Observable` that emits multiple `MessageEvent` (in this example, it emits a new `MessageEvent` every second). The `MessageEvent` object should respect the following interface to match the specification: |
| 23 | + |
| 24 | +```typescript |
| 25 | +export interface MessageEvent { |
| 26 | + data: string | object; |
| 27 | + id?: string; |
| 28 | + type?: string; |
| 29 | + retry?: number; |
| 30 | +} |
| 31 | +``` |
| 32 | + |
| 33 | +With this in place, we can now create an instance of the `EventSource` class in our client-side application, passing the `/see` (which is a route string matching what we have passed into the `@Sse()` decorator above) as a constructor argument. |
| 34 | + |
| 35 | +`EventSource` instance opens a persistent connection to an HTTP server, which sends events in `text/event-stream` format. The connection remains open until closed by calling `EventSource.close()`. |
| 36 | + |
| 37 | +Once the connection is opened, incoming messages from the server are delivered to your code in the form of events. If there is an event field in the incoming message, the triggered event is the same as the event field value. If no event field is present, then a generic `message` event is fired ([source](https://developer.mozilla.org/en-US/docs/Web/API/EventSource)). |
| 38 | + |
| 39 | +```javascript |
| 40 | +const eventSource = new EventSource('/sse'); |
| 41 | +eventSource.onmessage = ({ data }) => { |
| 42 | + console.log('New message', JSON.parse(data)); |
| 43 | +}; |
| 44 | +``` |
| 45 | + |
| 46 | +You can find a working example [here](https://github.com/nestjs/nest/tree/master/sample/28-sse). |
0 commit comments