import { EventV2 } from "@opencode-ai/core/event" import { Effect, Stream } from "effect" import { HttpServerResponse } from "effect/unstable/http" import { HttpApiBuilder } from "effect/unstable/httpapi" import { Api } from "../api" import { EventFeed } from "../event-feed" export const EventHandler = HttpApiBuilder.group(Api, "server.event", (handlers) => Effect.gen(function* () { const feed = yield* EventFeed.Service return handlers.handleRaw("event.subscribe", () => Effect.gen(function* () { const connected = { id: EventV2.ID.create(), type: "server.connected", data: {}, } as const const output = Stream.unwrap( feed.subscribe.pipe(Effect.map((live) => Stream.make(EventFeed.frame(connected)).pipe(Stream.concat(live)))), ) 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", }, }, ) }), ) }), )