import { AnyRouter, DataTransformer } from '@trpc/server'; import { Observable, Observer } from '@trpc/server/observable'; import { TRPCResultMessage, TRPCSuccessResponse } from '@trpc/server/rpc'; import { TRPCClientError } from '../TRPCClientError'; import { ResponseEsque } from '../internals/types'; /** * @internal */ export type CancelFn = () => void; /** * @internal */ export type PromiseAndCancel = { promise: Promise; cancel: CancelFn; }; /** * @internal */ export type OperationContext = Record; /** * @internal */ export type Operation = { id: number; type: 'query' | 'mutation' | 'subscription'; input: TInput; path: string; context: OperationContext; }; /** * @internal */ export type HTTPHeaders = Record; /** * The default `fetch` implementation has an overloaded signature. By convention this library * only uses the overload taking a string and options object. */ export type TRPCFetch = ( url: string, options?: RequestInit, ) => Promise; export interface TRPCClientRuntime { transformer: DataTransformer; } /** * @internal */ export interface OperationResultEnvelope { result: | TRPCSuccessResponse['result'] | TRPCResultMessage['result']; context?: OperationContext; } /** * @internal */ export type OperationResultObservable< TRouter extends AnyRouter, TOutput, > = Observable, TRPCClientError>; /** * @internal */ export type OperationResultObserver< TRouter extends AnyRouter, TOutput, > = Observer, TRPCClientError>; /** * @internal */ export type OperationLink< TRouter extends AnyRouter, TInput = unknown, TOutput = unknown, > = (opts: { op: Operation; next: (op: Operation) => OperationResultObservable; }) => OperationResultObservable; /** * @public */ export type TRPCLink = ( opts: TRPCClientRuntime, ) => OperationLink;