/* eslint-disable @typescript-eslint/no-namespace */ import { ProcedureType } from '../'; import { TRPC_ERROR_CODE_NUMBER } from './codes'; /** * Error response */ export interface TRPCErrorShape< TCode extends number = TRPC_ERROR_CODE_NUMBER, TData extends Record = Record, > { code: TCode; message: string; data: TData; } /** * JSON-RPC 2.0 Specification */ export namespace JSONRPC2 { export type RequestId = number | string | null; /** * All requests/responses extends this shape */ export interface BaseEnvelope { id?: RequestId; jsonrpc?: '2.0'; } export interface BaseRequest extends BaseEnvelope { method: TMethod; } export interface Request extends BaseRequest { params: TParams; } export interface ResultResponse extends BaseEnvelope { result: TResult; } export interface ErrorResponse extends BaseEnvelope { error: TError; } } /////////////////////////// HTTP envelopes /////////////////////// export interface TRPCRequest extends JSONRPC2.Request {} export interface TRPCResult { data: TData; } export interface TRPCSuccessResponse extends JSONRPC2.ResultResponse< TRPCResult & { type?: 'data'; } > {} export interface TRPCErrorResponse< TError extends TRPCErrorShape = TRPCErrorShape, > extends JSONRPC2.ErrorResponse {} export type TRPCResponse< TData = unknown, TError extends TRPCErrorShape = TRPCErrorShape, > = TRPCErrorResponse | TRPCSuccessResponse; /////////////////////////// WebSocket envelopes /////////////////////// export type TRPCRequestMessage = TRPCRequest & { id: JSONRPC2.RequestId; }; /** * The client asked the server to unsubscribe */ export interface TRPCSubscriptionStopNotification extends JSONRPC2.BaseRequest<'subscription.stop'> { id: null; } /** * The client's outgoing request types */ export type TRPCClientOutgoingRequest = TRPCSubscriptionStopNotification; /** * The client's sent messages shape */ export type TRPCClientOutgoingMessage = | TRPCRequestMessage | (JSONRPC2.BaseRequest<'subscription.stop'> & { id: JSONRPC2.RequestId }); export interface TRPCResultMessage extends JSONRPC2.ResultResponse< | { type: 'started'; data?: never } | { type: 'stopped'; data?: never } | (TRPCResult & { type: 'data' }) > {} export type TRPCResponseMessage< TData = unknown, TError extends TRPCErrorShape = TRPCErrorShape, > = { id: JSONRPC2.RequestId } & ( | TRPCErrorResponse | TRPCResultMessage ); /** * The server asked the client to reconnect - useful when restarting/redeploying service */ export interface TRPCReconnectNotification extends JSONRPC2.BaseRequest<'reconnect'> { id: JSONRPC2.RequestId; } /** * The client's incoming request types */ export type TRPCClientIncomingRequest = TRPCReconnectNotification; /** * The client's received messages shape */ export type TRPCClientIncomingMessage< TResult = unknown, TError extends TRPCErrorShape = TRPCErrorShape, > = TRPCClientIncomingRequest | TRPCResponseMessage;