/** * Message envelopes shared by unstable RPC clients, servers, serializers, and * transports. * * `RpcMessage` is the protocol vocabulary below `RpcClient` and `RpcServer`. * It defines decoded messages for in-process channels and encoded messages for * transport boundaries, so custom protocols can move the same request, * streaming, acknowledgement, interrupt, keepalive, and defect signals as the * built-in HTTP, socket, worker, and test transports. * * @stability unstable * @since 4.0.0 */ import type { NonEmptyReadonlyArray } from "../Array.ts"; import type { Branded } from "../Brand.ts"; import type { Headers } from "../http/Headers.ts"; import * as Schema from "../Schema.ts"; import type * as Rpc from "./Rpc.ts"; import type { RpcClientError } from "./RpcClientError.ts"; /** * Decoded messages that can be sent from an RPC client to a server. * * @stability unstable * @category models * @since 4.0.0 */ export type FromClient = Request | Ack | Interrupt | Eof; /** * Transport-encoded messages that can be sent from an RPC client to a server. * * @stability unstable * @category models * @since 4.0.0 */ export type FromClientEncoded = RequestEncoded | AckEncoded | InterruptEncoded | Ping | Eof; /** * A branded request identifier used to correlate RPC requests, responses, * chunks, acknowledgements, and interrupts. * * @stability unstable * @category models * @since 4.0.0 */ export type RequestId = Branded; /** * Converts a bigint or string request id into the branded `RequestId` type. * * @stability unstable * @category constructors * @since 4.0.0 */ export declare const RequestId: (id: string | number) => RequestId; /** * The transport-encoded RPC request envelope, including the string request id, * RPC tag, encoded payload, headers, and optional trace context. * * **Details** * * Requests flow in both directions: servers use them for server-originated * requests and, with `isNotification` set, for server notifications. * * @stability unstable * @category models * @since 4.0.0 */ export interface RequestEncoded { readonly _tag: "Request"; readonly id: string | number; readonly tag: string; readonly payload: unknown; readonly headers: ReadonlyArray<[string, string]>; readonly isNotification?: true; readonly traceId?: string; readonly spanId?: string; readonly sampled?: boolean; } /** * The decoded RPC request envelope for an RPC union, carrying a branded request * id, typed RPC tag, decoded payload, headers, and optional trace context. * * @stability unstable * @category models * @since 4.0.0 */ export interface Request { readonly _tag: "Request"; readonly id: RequestId; readonly tag: Rpc.Tag; readonly payload: Rpc.Payload; readonly headers: Headers; readonly traceId?: string; readonly spanId?: string; readonly sampled?: boolean; } /** * A decoded acknowledgement for a streamed RPC response chunk. * * @stability unstable * @category models * @since 4.0.0 */ export interface Ack { readonly _tag: "Ack"; readonly requestId: RequestId; } /** * A decoded request to interrupt an in-flight RPC, carrying the request id and * interrupting fiber ids. * * @stability unstable * @category models * @since 4.0.0 */ export interface Interrupt { readonly _tag: "Interrupt"; readonly requestId: RequestId; readonly interruptors: ReadonlyArray; } /** * The transport-encoded acknowledgement for a streamed RPC response chunk. * * @stability unstable * @category models * @since 4.0.0 */ export interface AckEncoded { readonly _tag: "Ack"; readonly requestId: string | number; } /** * The transport-encoded request to interrupt an in-flight RPC. * * @stability unstable * @category models * @since 4.0.0 */ export interface InterruptEncoded { readonly _tag: "Interrupt"; readonly requestId: string | number; } /** * A client-to-server message indicating that the client has finished sending * input for the current connection or request batch. * * @stability unstable * @category models * @since 4.0.0 */ export interface Eof { readonly _tag: "Eof"; } /** * A client-to-server keepalive message used by protocols that monitor * connection liveness. * * @stability unstable * @category models * @since 4.0.0 */ export interface Ping { readonly _tag: "Ping"; } /** * Represents the reusable `Eof` message value. * * @stability unstable * @category constants * @since 4.0.0 */ export declare const constEof: Eof; /** * Represents the reusable `Ping` message value. * * @stability unstable * @category constants * @since 4.0.0 */ export declare const constPing: Ping; /** * Decoded messages that can be sent from an RPC server to a client. * * @stability unstable * @category models * @since 4.0.0 */ export type FromServer = ResponseChunk | ResponseExit | ResponseDefect | ClientEnd; /** * Transport-encoded messages that can be sent from an RPC server to a client. * * @stability unstable * @category models * @since 4.0.0 */ export type FromServerEncoded = ResponseChunkEncoded | ResponseExitEncoded | ResponseDefectEncoded | Pong | ClientProtocolError | RequestEncoded; /** * The brand identifier used by the `ResponseId` type. * * @stability unstable * @category type IDs * @since 4.0.0 */ export declare const ResponseIdTypeId = "~effect/rpc/RpcMessage/ResponseId"; /** * The literal type of the `ResponseId` brand identifier. * * @stability unstable * @category type IDs * @since 4.0.0 */ export type ResponseIdTypeId = typeof ResponseIdTypeId; /** * A branded numeric identifier for server responses. * * @stability unstable * @category models * @since 4.0.0 */ export type ResponseId = Branded; /** * The transport-encoded response message containing a non-empty batch of stream * chunk values for a request. * * @stability unstable * @category models * @since 4.0.0 */ export interface ResponseChunkEncoded { readonly _tag: "Chunk"; readonly requestId: string | number; readonly values: NonEmptyReadonlyArray; } /** * The decoded response message containing a non-empty batch of stream chunk * values for a specific client and request. * * @stability unstable * @category models * @since 4.0.0 */ export interface ResponseChunk { readonly _tag: "Chunk"; readonly clientId: number; readonly requestId: RequestId; readonly values: NonEmptyReadonlyArray>; } /** * The transport representation of an RPC `Exit`, encoding success values or a * failure cause made of failures, defects, and interrupts. * * @stability unstable * @category models * @since 4.0.0 */ export type ExitEncoded = { readonly _tag: "Success"; readonly value: A; } | { readonly _tag: "Failure"; readonly cause: ReadonlyArray<{ readonly _tag: "Fail"; readonly error: E; } | { readonly _tag: "Die"; readonly defect: unknown; } | { readonly _tag: "Interrupt"; readonly fiberId: number | null | undefined; }>; }; /** * The transport-encoded terminal response for a request, carrying the encoded * `Exit`. * * @stability unstable * @category models * @since 4.0.0 */ export interface ResponseExitEncoded { readonly _tag: "Exit"; readonly requestId: string | number; readonly exit: ExitEncoded; } /** * A server-to-client protocol message reporting a client protocol error to all * affected in-flight requests. * * @stability unstable * @category models * @since 4.0.0 */ export interface ClientProtocolError { readonly _tag: "ClientProtocolError"; readonly error: RpcClientError; } /** * The decoded terminal response for a request, carrying the typed `Rpc.Exit` * for the RPC. * * @stability unstable * @category models * @since 4.0.0 */ export interface ResponseExit { readonly _tag: "Exit"; readonly clientId: number; readonly requestId: RequestId; readonly exit: Rpc.Exit; } /** * The transport-encoded server defect message used for protocol-level defects * that affect the client connection. * * @stability unstable * @category models * @since 4.0.0 */ export interface ResponseDefectEncoded { readonly _tag: "Defect"; readonly defect: unknown; } /** * Creates an encoded terminal response for a request whose exit is a defect. * * **Details** * * The defect must already be encoded, because the codec that fills the defect * hole belongs to the protocol. Encode it with * `protocol.codecFor(Schema.Defect())` first. * * This constructor produces the structured exit used by JSON-compatible * protocols. Serializations whose `codecFor` returns bytes must encode the * complete RPC exit before placing it in the response envelope instead. * * @stability unstable * @category constructors * @since 4.0.0 */ export declare const ResponseExitDieEncoded: (options: { readonly requestId: RequestId; readonly encodedDefect: unknown; }) => ResponseExitEncoded; /** * Creates a transport-encoded defect response around an already-encoded defect. * * **Details** * * Encode the defect with `protocol.codecFor(Schema.Defect())` before wrapping * it, because the codec that fills the defect hole belongs to the protocol. * * @stability unstable * @category constructors * @since 4.0.0 */ export declare const ResponseDefectEncoded: (encodedDefect: unknown) => ResponseDefectEncoded; /** * The decoded server defect message for a client connection. * * @stability unstable * @category models * @since 4.0.0 */ export interface ResponseDefect { readonly _tag: "Defect"; readonly clientId: number; readonly defect: unknown; } /** * A server message indicating that the client connection has ended. * * @stability unstable * @category models * @since 4.0.0 */ export interface ClientEnd { readonly _tag: "ClientEnd"; readonly clientId: number; } /** * A server-to-client keepalive response to a `Ping` message. * * @stability unstable * @category models * @since 4.0.0 */ export interface Pong { readonly _tag: "Pong"; } /** * Schema for every transport-encoded RPC envelope that crosses the wire. * Binary serializers use it only after each schema-dependent hole has been * encoded as bytes. `ClientProtocolError` is excluded because clients create * it locally rather than receiving it from a server. * * @stability unstable * @category schemas * @since 4.0.0 */ export declare const EncodedSchema: Schema.Union; readonly id: Schema.Union; readonly tag: Schema.String; readonly payload: Schema.Uint8Array; readonly headers: Schema.$Array>; readonly isNotification: Schema.optional>; readonly traceId: Schema.optional; readonly spanId: Schema.optional; readonly sampled: Schema.optional; }>, Schema.Struct<{ readonly _tag: Schema.tag<"Ack">; readonly requestId: Schema.Union; }>, Schema.Struct<{ readonly _tag: Schema.tag<"Interrupt">; readonly requestId: Schema.Union; }>, Schema.Struct<{ readonly _tag: Schema.tag<"Ping">; }>, Schema.Struct<{ readonly _tag: Schema.tag<"Eof">; }>, Schema.Struct<{ readonly _tag: Schema.tag<"Chunk">; readonly requestId: Schema.Union; readonly values: Schema.Uint8Array; }>, Schema.Struct<{ readonly _tag: Schema.tag<"Exit">; readonly requestId: Schema.Union; readonly exit: Schema.Uint8Array; }>, Schema.Struct<{ readonly _tag: Schema.tag<"Defect">; readonly defect: Schema.Uint8Array; }>, Schema.Struct<{ readonly _tag: Schema.tag<"Pong">; }>]>; /** * Represents the reusable `Pong` message value. * * @stability unstable * @category constants * @since 4.0.0 */ export declare const constPong: Pong; /** * Checks if the response type is terminal. * * @stability unstable * @category guards * @since 4.0.0 */ export declare const isTerminalResponse: (response: FromServerEncoded) => boolean; //# sourceMappingURL=RpcMessage.d.ts.map