app.realtime() は Server-Sent Events ストリームを開き、生の Response を返します。SDK は SSE フレームを 解析しません — ストリームをそのまま渡すので、独自のイベントループに組み込むことができます。
接続の制限
- 各接続は最大 10 分間 持続し、その後サーバーが接続を閉じます
- 1 つのアカウントで同時に開いておける接続は最大 10 個 です
イベントの形式
ストリームは 2 種類のフレームを送出します。
event: system — REALTIME_CONNECTING、REALTIME_TIMEOUT などの接続ライフサイクルメッセージ
event: message — JSON のアプリケーションペイロード
ストリームの消費
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;
}
app.realtime() を呼び出すたびに新しい Response が返されます。10 分のサーバータイムアウトを超えて接続を維持するには、ストリームが終了したときに再接続してください。