# ol.llx.ai.impl.client.event-stream

_platforms: clj, cljs_

Shared stream runtime orchestration for all hosts.

## Why

Host runtimes should differ only in transport concerns (how bytes arrive, how
cancellation reaches the underlying request). Event decoding, lifecycle
emission, finalize behavior, and terminal error handling must stay identical.

## What

This namespace owns the shared stream loop:
- opens a provider stream with retry policy
- emits canonical `:start` / delta / `:done` events
- converts runtime failures into canonical terminal error events
- coordinates cancellation across producer/source and consumer/output channel

## How

Hosts inject two hooks:
- `:open-stream!` to acquire the transport stream response
- `:start-source!` to push provider payloads onto `payload-ch`

The shared loop consumes payload/control channels with Promesa CSP, applies
adapter decode/finalize functions, and emits canonical events to `out`.

## Related Namespaces

* [`ol.llx.ai.impl.client.jvm`](api/ol-llx-ai-impl-client-jvm.adoc)
* [`ol.llx.ai.impl.client.node`](api/ol-llx-ai-impl-client-node.adoc)
* [`ol.llx.ai.impl.client`](api/ol-llx-ai-impl-client.adoc)

## await!

### clj

_platforms: clj_

```clojure
(await! x)
(await! x duration default-on-timeout)
```

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai/impl/client/event_stream.cljc#L48-L62)

### cljs

_platforms: cljs_

```clojure
(await! x)
(await! x _duration default-on-timeout)
```

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai/impl/client/event_stream.cljc#L65-L71)

---

## open-stream-with-retries*

### clj

_platforms: clj_

```clojure
(open-stream-with-retries* {:keys [adapter env model request request-opts]})
```

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai/impl/client/event_stream.cljc#L73-L92)

### cljs

_platforms: cljs_

```clojure
(open-stream-with-retries* {:keys [adapter env model request request-opts]})
```

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai/impl/client/event_stream.cljc#L73-L92)

---

## emit-events*

### clj

_platforms: clj_

```clojure
(emit-events* {:keys [emit! cancel-fn events]})
```

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai/impl/client/event_stream.cljc#L94-L108)

### cljs

_platforms: cljs_

```clojure
(emit-events* {:keys [emit! cancel-fn events]})
```

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai/impl/client/event_stream.cljc#L94-L108)

---

## emit-start*

### clj

_platforms: clj_

```clojure
(emit-start* {:keys [emit! cancel-fn env model]})
```

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai/impl/client/event_stream.cljc#L110-L124)

### cljs

_platforms: cljs_

```clojure
(emit-start* {:keys [emit! cancel-fn env model]})
```

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai/impl/client/event_stream.cljc#L110-L124)

---

## decode-payload-step

### clj

_platforms: clj_

```clojure
(decode-payload-step {:keys [adapter env model state item-index payload]})
```

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai/impl/client/event_stream.cljc#L126-L145)

### cljs

_platforms: cljs_

```clojure
(decode-payload-step {:keys [adapter env model state item-index payload]})
```

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai/impl/client/event_stream.cljc#L126-L145)

---

## process-payload-step*

### clj

_platforms: clj_

```clojure
(process-payload-step* {:keys [adapter env model state* emit! cancel-fn]} item-index payload)
```

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai/impl/client/event_stream.cljc#L147-L163)

### cljs

_platforms: cljs_

```clojure
(process-payload-step* {:keys [adapter env model state* emit! cancel-fn]} item-index payload)
```

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai/impl/client/event_stream.cljc#L147-L163)

---

## finalize-step

### clj

_platforms: clj_

```clojure
(finalize-step {:keys [adapter env state]})
```

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai/impl/client/event_stream.cljc#L165-L172)

### cljs

_platforms: cljs_

```clojure
(finalize-step {:keys [adapter env state]})
```

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai/impl/client/event_stream.cljc#L165-L172)

---

## finalize-stream*

### clj

_platforms: clj_

```clojure
(finalize-stream* {:keys [adapter env model state* emit! cancel-fn]})
```

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai/impl/client/event_stream.cljc#L174-L194)

### cljs

_platforms: cljs_

```clojure
(finalize-stream* {:keys [adapter env model state* emit! cancel-fn]})
```

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai/impl/client/event_stream.cljc#L174-L194)

---

## emit-terminal-error*

### clj

_platforms: clj_

```clojure
(emit-terminal-error* {:keys [adapter env model state* emit!]} stream-ex)
```

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai/impl/client/event_stream.cljc#L196-L199)

### cljs

_platforms: cljs_

```clojure
(emit-terminal-error* {:keys [adapter env model state* emit!]} stream-ex)
```

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai/impl/client/event_stream.cljc#L196-L199)

---

## payload-msg

### clj

_platforms: clj_

```clojure
(payload-msg payload)
```

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai/impl/client/event_stream.cljc#L201-L203)

### cljs

_platforms: cljs_

```clojure
(payload-msg payload)
```

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai/impl/client/event_stream.cljc#L201-L203)

---

## error-msg

### clj

_platforms: clj_

```clojure
(error-msg ex)
```

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai/impl/client/event_stream.cljc#L205-L207)

### cljs

_platforms: cljs_

```clojure
(error-msg ex)
```

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai/impl/client/event_stream.cljc#L205-L207)

---

## run-stream!

### clj

_platforms: clj_

```clojure
(run-stream! {:keys [adapter env model request out state* cancel! start-source! open-stream!] :as args})
```

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai/impl/client/event_stream.cljc#L220-L330)

### cljs

_platforms: cljs_

```clojure
(run-stream! {:keys [adapter env model request out state* cancel! start-source! open-stream!] :as args})
```

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai/impl/client/event_stream.cljc#L220-L330)
