Skip to Content

Server-Sent Events (SSE)

Strumieniuj zdarzenia w czasie rzeczywistym przez długotrwałe połączenie

Ostatnio zaktualizowano

SSE udostępnia długotrwały strumień tych samych zdarzeń, które otrzymują webhooki. Użyj SSE, gdy wolisz trwałe połączenie od wywołań zwrotnych HTTP.

Endpoint

GET /api/orgs/:orgId/realtime/subscribe

Uwierzytelnianie

SSE używa tego samego uwierzytelniania co pozostałe endpointy API:

  • x-api-key - Twój klucz API

ID organizacji znajduje się w ścieżce URL.

Filtrowanie zdarzeń

Użyj parametru zapytania events, aby filtrować według typu zdarzenia:

GET /api/orgs/:orgId/realtime/subscribe?events=invoice:created&events=invoice:paid

Użyj events=*, aby otrzymywać wszystkie zdarzenia (tak samo jak przy pominięciu parametru).

Wszystkie zdarzenia, uprawnienie dla każdego zdarzenia i przykładowy payload znajdziesz w indeksie zdarzeń.

Kilka zdarzeń ma własny kanał (logi kontrolerów i I/O kontrolerów). Otrzymasz je tylko z ?channel=controller-logs lub ?channel=controller-io; indeks zdarzeń podaje kanał.

Tillor dostarcza tylko zdarzenia, do których zalogowany członek organizacji ma uprawnienie. Bez bank-transactions:read (lub sync) nie dostaniesz na przykład zdarzeń bankAccountTransaction:*, także gdy nie wysyłasz filtra events.

Powiązane dane z innej domeny podlegają tym samym regułom co API: bez customers:read zdarzenie reservation:updated przychodzi z customer: null, bez payments:read zdarzenie invoice:paid przychodzi z payment: null. Lista staje się wtedy [].


Format zdarzenia

Payload ma taką samą strukturę jak dostarczenia webhooków:

PoleTypOpis
eventstringKlucz zdarzenia (np. invoice:created)
dataobjectPayload specyficzny dla zdarzenia
timestampnumberUnix timestamp (ms) w chwili wysłania zdarzenia
traceIdstringID śladu OpenTelemetry akcji Tillor, która wywołała to zdarzenie (tak samo jak przy webhookach)
spanIdstring (opcjonalnie)Span w obrębie tego śladu

W strumieniu SSE ten obiekt JSON znajduje się w wierszu data:; klucz zdarzenia jest też w wierszu event:. Przykład na poziomie protokołu znajdziesz w przykładach SSE.


Przykład: Node.js

const orgId = "org_abc123";
const apiKey = "tkn_xxx";

const url = `https://app.tillor.eu/api/orgs/${orgId}/realtime/subscribe?events=invoice:created&events=customer:updated`;

const response = await fetch(url, {
  headers: {
    "x-api-key": apiKey,
    "Accept": "text/event-stream",
  },
});

const reader = response.body.getReader();
const decoder = new TextDecoder();

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

  const chunk = decoder.decode(value, { stream: true });
  for (const line of chunk.split("\n")) {
    if (line.startsWith("data: ")) {
      const payload = JSON.parse(line.slice(6));
      console.log(payload.event, payload.data);
    }
  }
}

Przykład: cURL

curl -N -H "x-api-key: tkn_xxx" \
     -H "Accept: text/event-stream" \
     "https://app.tillor.eu/api/orgs/org_abc123/realtime/subscribe"

Ponowne łączenie

Gdy połączenie zostanie przerwane, połącz się ponownie z tym samym URL i nagłówkami. Strumień nie obsługuje wznawiania; po ponownym połączeniu otrzymujesz tylko nowe zdarzenia.


Powiązane

Czy ta strona była pomocna?

Na tej stronie