Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.privataswap.com/llms.txt

Use this file to discover all available pages before exploring further.

Basic usage

const stream = privata.streamOrder(orderId);

for await (const event of stream) {
  console.log(event.status, event.eventId);
  if (["completed", "failed", "expired", "refunded"].includes(event.status)) {
    break;
  }
}
The async iterator closes automatically on terminal status, so a plain for await is enough.

Event object

interface StreamEvent {
  orderId: string;
  status: OrderStatus;
  eventId: string;     // "<order_id>:<status>:<unix_ms>"
  ts: string;          // ISO
  raw: any;            // full payload
}

Listeners

const stream = privata.streamOrder(orderId);

stream.on("status", (e) => updateUi(e.status));
stream.on("resume", (source, gapMs) => {
  if (source === "snapshot") log.warn("SSE snapshot fallback, gap=" + gapMs);
});
stream.on("degraded", () => log.warn("Stream degraded to polling"));
stream.on("error", (err) => log.error(err));
stream.on("close", () => log.info("Stream closed"));

Reconnection

Built-in. Backoff 1s, 2s, 5s, 15s, 30s, 30s.... On reconnect we send Last-Event-ID so you don’t lose events as long as the gap stays under 60 seconds (the server’s ring buffer window).

Degraded polling fallback

After 5 consecutive failed reconnects, the SDK switches to polling GET /order/{id} every 10 s and emits a degraded event. It will keep trying to upgrade back to SSE in the background every 60 s. Disable this with:
privata.streamOrder(orderId, { fallbackPollingMs: 0 });

Manual close

const stream = privata.streamOrder(orderId);
stream.close();   // idempotent

Concurrency

Each streamOrder() call counts as one SSE connection against your tier cap. Use a single stream per order — fan out internally with an EventEmitter if multiple consumers need the same data.