AgentHttpServer (SDK ≥ 0.11.0) is the HTTP front door for an
AgentSocketServer: the agent’s
streams over Server-Sent Events (GET answers a text/event-stream response),
and its RPC surface over POST to …/rpc/<method>. It is a second encoder over
the same server — same frames, same authorize / onAttach policy, same dispatch
as the WebSocket path — so a plain page with an EventSource and fetch() needs
no SDK at all.
Construct one over the socket server the actor’s webSocket delegates to, and
route HTTP requests from the actor’s fetch into fetch():
token query parameter — an
EventSource cannot set headers — and subscribe picks the streams
(subscribe=state,messages; omitted = every stream the server offers). Each
server frame becomes one SSE event, and the id: carries resume cursors so the
browser’s automatic reconnect replays only what it missed. On the RPC path the
credential rides Authorization: Bearer <token> (preferred) or the same query
parameter; the JSON-array request body is the argument list, and the response
body is the same result / error frame a WebSocket caller would receive.
mountAgents hands a mounted agent’s GET and POST requests to the actor’s fetch
on /agents/<mount>/<name>. The override above answers them there, and the function
needs no routing code of its own. See mountAgents.
Two limits, by design: SSE is one-way, so there are no server→client calls
mid-stream (RPC is client-initiated POST only), and there is no ping/pong —
an EventSource detects a dropped stream and reconnects by itself.
The Fetch Entry
AgentHttpServer.fetch is the body of the actor’s fetch entry. It chooses between the RPC and the stream by method and address.
fetch(req)on the actor passes the request the mount forwarded, with its URL and query string intact.Agentinherits the basefetch, which answers404. The example above overrides it.ActorFetchTimeoutErrorends afetchthat runs past its 30-second budget. An RPC overPOSTruns inside thatfetchand shares the budget.