oRPC v2 is now public beta -
Learn More
The screenshot API for developers -
Try ScreenshotOne
Skip to content

Event Iterator in oRPC Clients

An Event Iterator in oRPC behaves like an AsyncGenerator. Simply iterate over it and await each event.

Basic Usage

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

Stopping the Stream Manually

You can rely on signal or .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
  await iterator.return()
}, 1000)

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

Error Handling

INFO

Unlike traditional SSE, the Event Iterator does not automatically retry on error. To enable automatic retries, refer to the Client 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
  }
}

INFO

Errors thrown by the server can be instances of ORPCError.

Using consumeEventIterator

oRPC provides a utility function consumeEventIterator to consume an event iterator with lifecycle callbacks.

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)

INFO

This utility accepts both promises and event iterators. Passing a promise directly lets it infer correct error type.

Released under the MIT License.