Passer au contenu principal
app.realtime() ouvre un flux Server-Sent Events et renvoie la Response brute. Le SDK ne parse pas les trames SSE pour vous — il vous remet le flux afin que vous l’intégriez dans votre propre boucle d’événements.

Limites de connexion

  • Chaque connexion dure jusqu’à 10 minutes, après quoi le serveur la ferme
  • Un même compte peut maintenir au maximum 10 connexions simultanées ouvertes

Forme des événements

Le flux émet deux types de trames :
  • event: system — messages de cycle de vie de la connexion tels que REALTIME_CONNECTING, REALTIME_TIMEOUT, etc.
  • event: message — la charge utile JSON de l’application

Consommer le flux

import { SquareCloudAPI } from "@squarecloud/api";

const api = new SquareCloudAPI(process.env.SQUARE_API_KEY!);
const app = await api.applications.fetch("abc123def456abc123def456");

const response = await app.realtime();

if (!response.body) {
    throw new Error("No stream body");
}

const reader = response.body.pipeThrough(new TextDecoderStream()).getReader();
let buffer = "";

while (true) {
    const { value, done } = await reader.read();
    if (done) break;

    buffer += value;

    // SSE frames are separated by \n\n
    let separator = buffer.indexOf("\n\n");
    while (separator !== -1) {
        const rawFrame = buffer.slice(0, separator);
        buffer = buffer.slice(separator + 2);
        separator = buffer.indexOf("\n\n");

        const event = parseSSE(rawFrame);
        if (!event) continue;

        if (event.name === "system") {
            console.log(`[system] ${event.data}`);
            continue;
        }

        try {
            const payload = JSON.parse(event.data);
            console.log("[message]", payload);
        } catch {
            console.log("[message]", event.data);
        }
    }
}

function parseSSE(frame: string): { name: string; data: string } | null {
    let name = "message";
    let data = "";

    for (const line of frame.split("\n")) {
        if (line.startsWith("event:")) name = line.slice(6).trim();
        else if (line.startsWith("data:")) data += line.slice(5).trim();
    }

    return data ? { name, data } : null;
}
Chaque appel à app.realtime() renvoie une nouvelle Response. Pour rester connecté au-delà du timeout serveur de 10 minutes, reconnectez-vous lorsque le flux se termine.