Skip to content

Server-Sent Events (SSE)

Vous pouvez gérer un flux SSE en utilisant le contrat de réponse approprié.

ts
import { ResponseContract, 
useRouteBuilder
} from "@duplojs/http";
import {
D
,
DPE
,
sleep
} from "@duplojs/utils";
useRouteBuilder
("GET", "/some-route")
.
extract
({
headers
: {
superToken
:
DPE
.
string
(),
}, }) .
cut
(
ResponseContract.
unauthorized
("invalid-token"),
({
superToken
}, {
response
,
output
}) => {
if (
superToken
!== "valid-token") {
return
response
("invalid-token");
} return
output
();
}, ) .
handler
(
ResponseContract.
serverSentEvents
(
"SSE",
DPE
.
object
({
value
:
DPE
.
string
() }),
{
otherEvent
:
DPE
.
string
() },
), (
__
, {
serverSentEventsResponse
}) =>
serverSentEventsResponse
(
"SSE", async({
send
,
lastId
,
isAbort
}) => {
if (
lastId
!== null) {
await
send
(
"otherEvent", "successful reconnection", {
retry
: "10s" },
); } while (
isAbort
() === false) {
await
send
(
"message", {
value
: "super Value" },
{
id
:
D
.
now
().
toString
() },
); await
sleep
(1000);
} }, ), );

Gestion du flux côté client

Il suffit d'appeler une route qui renvoie un flux SSE, et le client se chargera de créer une réponse adaptée pour le recevoir.

ts
import { 
createHttpClient
} from "@duplojs/http/client";
import { type
Routes
} from "./types";
const
client
=
createHttpClient
<
Routes
>({
baseUrl
: "http://localhost:1506",
}); const
response
= await
client
.
get
(
"/some-route", {
headers
: {
superToken
: "valid-token" } },
).
iWantInformationOrThrow
("SSE");
response
.
onReceiveEvent
("message", (
event
) => {
});
response
.
onReceiveEvent
("otherEvent", (
event
) => {
// ... }); // start consume SSE for await (const
event
of
response
) {
// ... } // or void
response
.
consumeEventStream
();

Lorsque le client détecte un flux SSE, il ajoute des méthodes permettant de manipuler et de consommer les événements reçus. Pour consommer le flux, il suffit soit d'itérer sur la réponse, soit d'appeler la méthode consumeEventStream.

Diffusé sous licence MIT.