import type WebSocket from 'ws'; import type { ClassType } from '../types'; import type { IByteStreamable } from './SrpcByteStream'; export type RequestKeys = keyof T & `${string}Request`; export type ResponseKeys = keyof T & `${string}Response`; export type RequestPrefix = K extends `${infer P}Request` ? P : never; export type ResponsePrefix = K extends `${infer P}Response` ? P : never; type ExtractPrefix = K extends `${infer P}Request` ? (`${P}Response` extends keyof TRes ? P : never) : never; export type InvokePrefixes = ExtractPrefix; export type RequestData = `${P}Request` extends keyof TReq ? NonNullable : never; export type ResponseData = `${P}Response` extends keyof TRes ? NonNullable : never; export type HandlerRequestData = `${P}Request` extends keyof TReq ? NonNullable : never; export type NotificationKeys = keyof T & `${string}Notification`; export type NotificationPrefixes = NotificationKeys extends infer K ? (K extends `${infer P}Notification` ? P : never) : never; export type NotificationData = `${P}Notification` extends keyof T ? NonNullable : never; export type SrpcMeta = object; /** Numeric wire values shared with the protobuf PingPongType enum. */ export declare enum SrpcPingPongType { UNSPECIFIED = 0, HELLO = 1, HELLO_ACK = 2, ACTIVATED = 3, PING = 4, PONG = 5 } /** Clients give a final response priority over a receipt during this window. */ export declare const SrpcClientRequestAckDelayMs = 3000; export interface BaseMessage { requestId?: string; reply?: boolean; error?: string; userError?: boolean; /** Protocol-v4 receipt acknowledgment; requestId identifies the call, and reply remains false. */ requestAck?: boolean; trace?: { traceId: string; spanId: string; traceFlags: number; }; /** Optional numeric enum; empty legacy PingPong codecs remain compatible. */ pingPong?: { type?: number; }; byteStreamOperation?: { streamId: number; write?: { chunk: Uint8Array; }; finish?: object; destroy?: { error?: string; }; }; } /** Ensures untrusted envelope tracing data is safe to pass to OpenTelemetry. */ export declare function isValidSrpcTrace(trace: BaseMessage['trace']): trace is NonNullable; export interface SrpcMessageFns { encode(message: T, writer?: unknown): { finish(): Uint8Array; } | Uint8Array; decode(input: Uint8Array, length?: number): T; } export type SrpcDisconnectCause = 'disconnect' | 'conflict' | 'supersede' | 'timeout' | 'badArg'; export interface IQueuedRequest { exp: number; acknowledge?: () => void; resolve: (value: unknown) => void; reject: (err: unknown) => void; } export declare class SrpcError extends Error { isUserError?: boolean | undefined; constructor(message: string, isUserError?: boolean | undefined); } /** The socket disconnected during an in-flight request; its outcome is unknown. */ export declare class SrpcStreamDisconnectedError extends SrpcError { readonly disconnectCause: SrpcDisconnectCause; readonly code = "srpc_stream_disconnected"; constructor(clientId: string, disconnectCause?: SrpcDisconnectCause, cause?: unknown); } /** Restore transport errors from the stable code carried by existing envelope codecs. */ export declare function deserializeSrpcError(message: string, userError?: boolean): SrpcError; /** Preserve the explicit sRPC error contract without promoting ordinary errors. */ export declare function serializeSrpcError(error: unknown): { error: string; userError?: boolean; }; export interface ISrpcLogger { info(...messages: unknown[]): void; warn(...messages: unknown[]): void; error(...messages: unknown[]): void; debug(...messages: unknown[]): void; } /** * Controls per-message sRPC traffic logs. `true` logs envelope/message types * except pingPong-only heartbeats; set `bodies` to include the decoded body. */ export interface SrpcTrafficLoggingOptions { bodies?: boolean; /** Include pingPong-only heartbeat envelopes. Defaults to false. */ pingPong?: boolean; } export type SrpcTrafficLogging = boolean | SrpcTrafficLoggingOptions; /** A receipt cannot carry a result, error, or application payload. */ export declare function isSrpcRequestAcknowledgment(message: BaseMessage): boolean; /** Refuse v4 negotiation when a consumer's codec silently drops the receipt field. */ export declare function supportsSrpcRequestAcknowledgments(codec: SrpcMessageFns): boolean; /** Identifies heartbeat-only pings and pongs without hiding mixed payloads or errors. */ export declare function isSrpcPingPongOnly(message: BaseMessage): boolean; /** Returns the application-level message fields carried by an sRPC envelope. */ export declare function srpcMessageTypes(message: BaseMessage): string[]; /** One-way application envelopes contain exactly one notification payload and no reply fields. */ export declare function isSrpcNotification(message: BaseMessage): boolean; export interface ISrpcServerOptions { logger: ISrpcLogger; clientMessage: SrpcMessageFns; serverMessage: SrpcMessageFns; wsPath: string; /** * Protocol version assigned to a handshake that omits `pv` (or legacy `_v`). Leave unset to * require an explicit transport version. Use `1` only where legacy * same-client replacement semantics are intentional. */ defaultUnspecifiedProtocolVersion?: 1 | 2 | 3; logTraffic?: SrpcTrafficLogging; httpServer?: import('node:http').Server; /** How long replies for locally abandoned requests are ignored. Defaults to 60 seconds. */ lateReplyTombstoneTtlMs?: number; /** Revoke an unacknowledged v4 stream at RPC expiry when its budget exceeds the 3s receipt window. Defaults to true. */ disconnectOnRequestTimeout?: boolean; /** Maximum client requests buffered before a stream is activated. */ maxPendingClientRequests?: number; /** Maximum decoded client-request bytes buffered before a stream is activated. */ maxPendingClientRequestBytes?: number; /** Maximum concurrent client request handlers for one stream. */ maxInFlightClientRequests?: number; /** Maximum decoded client-request bytes executing concurrently for one stream. */ maxInFlightClientRequestBytes?: number; /** Maximum queued WebSocket bytes per stream before the stream is closed. */ maxBufferedBytes?: number; /** Maximum encoded size of one incoming client WebSocket message. */ maxMessageBytes?: number; /** Maximum pending server-to-client RPCs per stream. */ maxPendingServerRequests?: number; /** Maximum encoded pending server-to-client RPC bytes per stream. */ maxPendingServerRequestBytes?: number; /** Maximum WebSocket authentication handshakes awaiting authorization. */ maxPendingHandshakes?: number; /** Maximum live streams, including streams still activating. */ maxActiveStreams?: number; /** Maximum UTF-8 byte length of a client ID. */ maxClientIdBytes?: number; /** Maximum JSON-encoded byte length of merged query/authorization metadata. */ maxClientMetadataBytes?: number; /** Maximum principals retained by the bounded local authentication replay cache. */ maxAuthReplayPrincipals?: number; /** Optional audience expected in v2 credentials. Defaults to `wsPath`. */ authAudience?: string; } export interface SrpcStream extends IByteStreamable { $ws: WebSocket; $queue: Map; readonly id: string; readonly clientStreamId: string; readonly address: string; readonly clientId: string; readonly appVersion: string; readonly configureTs: number; readonly protocolVersion: 1 | 2 | 3 | 4; /** Optional client capabilities negotiated during the WebSocket upgrade. */ readonly capabilities?: ReadonlySet; readonly supersede: boolean; readonly meta: T; readonly connectedAt: number; isActivated: boolean; lastPingAt: number; readonly connected: boolean; close(reason?: string): Promise; } /** * Transport-neutral handle for an sRPC client connection. * * A handle is pinned to one connection generation (`id`). Implementations * must not silently retarget it after the same client reconnects. */ export interface SrpcConnection extends IByteStreamable { readonly id: string; readonly clientId: string; readonly meta: T; readonly connectedAt: number; readonly connected: boolean; close(reason?: string): Promise; } export declare class SrpcClientNotFoundError extends Error { constructor(clientId: string); } export declare class SrpcStaleConnectionError extends Error { constructor(clientId: string); } export declare class SrpcOwnerUnavailableError extends Error { constructor(clientId: string, cause?: unknown); } export declare class SrpcIndeterminateDeliveryError extends Error { constructor(clientId: string, cause?: unknown); } export declare class SrpcMeshProtocolError extends Error { constructor(message: string); } export declare class SrpcMeshAuthenticationError extends Error { constructor(message?: string); } export declare class SrpcBackpressureError extends Error { constructor(message?: string); } export declare class SrpcStreamClosedError extends Error { constructor(message?: string); } export type SrpcMessageHandlerFn = (wrappedStream: C, data: I) => Promise | O; export interface ISrpcMessageHandler { handle: SrpcMessageHandlerFn; } export type TSrpcMessageHandlerClass = ClassType>; export type TSrpcMessageHandlerFnOrClass = SrpcMessageHandlerFn | TSrpcMessageHandlerClass; export declare function isSrpcMessageHandlerClass(handler: TSrpcMessageHandlerFnOrClass): handler is TSrpcMessageHandlerClass; export declare function encodeSrpcMessage(codec: SrpcMessageFns, message: T): Buffer; export {}; //# sourceMappingURL=types.d.ts.map