pi-mono/packages/server/src/connection.ts
Armin Ronacher 1a7bc80e7c feat: move service wire semantics into Chord
Keep protocol payloads transport-opaque and validate service calls, state snapshots, updates, and errors at Chord boundaries. Ensure successful OpenAI Responses messages remain strict JSON so terminal Transcript updates reach clients.
2026-09-01 00:53:40 +02:00

37 lines
1.3 KiB
TypeScript

import type { ServiceStateEncoder } from "@earendil-works/chord";
import type { ClientMessageDecoder, RpcTarget } from "@earendil-works/pi-protocol";
import type { MaybePromise, RoutedServerServiceAttachment } from "./types.ts";
/** An established, authorized ordered byte connection. */
export interface ByteConnection {
readonly closed: boolean;
send(chunk: Uint8Array): Promise<void>;
close(finalChunk?: Uint8Array): MaybePromise<void>;
}
export interface ByteConnectionHandler {
onData(chunk: Uint8Array): void;
onClose(): void;
onError(error: Error): void;
}
export type ByteConnectionAcceptor = (connection: ByteConnection) => ByteConnectionHandler;
export type ConnectionStage = "awaitingHello" | "handshaking" | "ready" | "closing" | "closed";
export interface ConnectionState {
connection: ByteConnection;
decoder: ClientMessageDecoder;
serviceStateEncoders: Map<string, ServiceStateEncoder>;
stage: ConnectionStage;
disconnected: boolean;
handshake?: Promise<void>;
handshakeTimeout: NodeJS.Timeout;
serverServices?: RoutedServerServiceAttachment;
activeRequests: Map<string, { controller: AbortController; target: RpcTarget }>;
}
export function isTerminalConnection(state: ConnectionState): boolean {
return state.disconnected || state.stage === "closing" || state.stage === "closed";
}