RODEO

Streaming

Async iterator SSE streaming for scene events

Usage

for await (const event of rodeo.scenes.stream(sceneId)) {
  console.log(event.type, event.data);
}

Returns AsyncIterable<SceneEvent>.

SceneEvent

interface SceneEvent {
  type: string;
  beat_id?: string;
  data?: Record<string, unknown>;
  timestamp?: string;
}

Event handling

for await (const event of rodeo.scenes.stream(sceneId)) {
  switch (event.type) {
    case "beat_fired":
      console.log(`Beat ${event.beat_id} fired`);
      break;
    case "sensor_reading":
      handleSensorReading(event.data);
      break;
    case "adaptation_triggered":
      console.log(`Adapting: ${event.data?.rule?.action}`);
      break;
    case "scene_completed":
      console.log(`Scene finished: ${event.data?.outcome}`);
      break;
    case "scene_aborted":
      console.log("Scene was aborted");
      break;
  }
}

Lifecycle

The stream closes when the scene completes, aborts, or expires. Heartbeat events fire every 15 seconds to keep the connection alive.