/
Alex_Ural
/
opencode
Обзор
Документация
Войти
/
Alex_Ural
/
opencode
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
dev
packages/server/src/handlers/event.ts
52 строки
2 KB
Kit Langton
feat(sdk): expose live event stream (#34098)
26 июн 2026, 22:16
Не верифицирован
26 июн 2026, 22:16
42e6b7d
Код
Авторство
О чём код?
import { EventV2 } from "@opencode-ai/core/event" import { OpenCodeEvent } from "@opencode-ai/protocol/groups/event" import { Effect, Schema, Stream } from "effect" import { HttpServerResponse } from "effect/unstable/http" import { HttpApiBuilder } from "effect/unstable/httpapi" import * as Sse from "effect/unstable/encoding/Sse" import { Api } from "../api" const subscriberCapacity = 256 function eventData(data: unknown): Sse.Event { return { _tag: "Event", event: "message", id: undefined, data: JSON.stringify(Schema.encodeUnknownSync(OpenCodeEvent)(data)), } } export const EventHandler = HttpApiBuilder.group(Api, "server.event", (handlers) => Effect.gen(function* () { const events = yield* EventV2.Service return handlers.handleRaw("event.subscribe", () => Effect.gen(function* () { const connected = { id: EventV2.ID.create(), type: "server.connected", data: {}, } const output = Stream.unwrap( Effect.gen(function* () { // Acquiring the bounded stream installs its listener before readiness is observable. const live = yield* EventV2.allBounded(events, subscriberCapacity) return Stream.make(connected).pipe(Stream.concat(live)) }), ).pipe(Stream.map(eventData), Stream.pipeThroughChannel(Sse.encode())) const heartbeat = Stream.tick("15 seconds").pipe(Stream.map(() => ": heartbeat\n\n")) return HttpServerResponse.stream( output.pipe(Stream.merge(heartbeat, { haltStrategy: "left" }), Stream.encodeText), { contentType: "text/event-stream", headers: { "Cache-Control": "no-cache, no-transform", "X-Accel-Buffering": "no", "X-Content-Type-Options": "nosniff", }, }, ) }), ) }), )