mirror of
https://github.com/badlogic/pi-mono.git
synced 2026-11-06 23:44:36 +00:00
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.
37 lines
1.3 KiB
TypeScript
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";
|
|
}
|