Skip to content

Event Iterator in Client

Consume an Event Iterator like an AsyncGenerator. Await the call, then iterate over events as they arrive.

Basic Usage

ts
const 
iterator
= await
client
.
streaming
()
for await (const
event
of
iterator
) {
console
.
log
(
event
.
message
)
}

Stopping the Stream

Use an AbortSignal or call .return to stop the iterator.

ts
const controller = new AbortController()
const iterator = await client.streaming(undefined, { signal: controller.signal })

// Stop the stream after 1 second
setTimeout(async () => {
  controller.abort()

  // Or call `await iterator.return()` if you already have the iterator instance.
}, 1000)

for await (const event of iterator) {
  console.log(event.message)
}

Error Handling

INFO

Unlike traditional SSE, Event Iterators do not retry automatically after an error. To add retries, use the Retry Plugin.

ts
const iterator = await client.streaming()

try {
  for await (const event of iterator) {
    console.log(event.message)
  }
}
catch (error) {
  if (error instanceof ORPCError) {
    // Handle the error here
  }
}

Event Metadata

Use getEventMeta to read event metadata for each item, such as the event ID and retry interval.

ts
import { getEventMeta } from '@orpc/client'

const iterator = await client.streaming()

for await (const event of iterator) {
  const meta = getEventMeta(event)
  console.log(event.message, meta?.id, meta?.retry)
}

Using consumeEventIterator

Use consumeEventIterator to consume an event iterator with lifecycle callbacks. It accepts either an event iterator or a promise that resolves to one.

ts
import { consumeEventIterator } from '@orpc/client'

const cancel = consumeEventIterator(client.streaming(), {
  onEvent: (event) => {
    console.log(event.message)
  },
  onError: (error) => {
    console.error(error)
  },
  onSuccess: (value) => {
    console.log(value)
  },
  onFinish: (state) => {
    console.log(state)
  },
})

setTimeout(async () => {
  // Stop the stream after 1 second
  await cancel()
}, 1000)

Released under the MIT License.