import { AsyncOrSync, Lookup } from './common.js'; import { ContentFormat, MimeType, OperationTypes } from './operations.js'; export interface SdkConfigFor, F extends BaseFetch = BaseFetch> { /** API server address. */ readonly address: Address; /** Global request headers, overridable in individual requests. */ readonly headers?: RequestHeaders; /** * Other global request options. These can similarly be overriden in * individual fetch calls. */ readonly options?: RequestOptions; /** Underlying fetch method. */ readonly fetch?: FetchOption; /** Global request body encoders. */ readonly encoders?: Encoders; /** Global response decoders. */ readonly decoders?: Decoders; /** * Unexpected response coercion. The default will ignore bodies of responses * which do not have any declared content and throw an error otherwise. */ readonly coercer?: Coercer; } type Address = string | URL | AddressInfo; interface AddressInfo { readonly address: string; readonly port: number; } export type RequestHeaders = Record; export interface BaseInit { readonly body?: B; readonly headers: RequestHeaders; readonly method: string; } export interface BaseResponse { readonly status: number; readonly headers: { get(name: string): string | null | undefined; }; blob(): Promise; json(): Promise; text(): Promise; } export type BaseFetch = (url: string, init?: BaseInit) => Promise; export type FetchOption = (url: string, init: BaseInit> & RequestOptions) => Promise>; export type RequestOptions = Omit, 'body' | 'headers' | 'method'>; type RequestInitFor = F extends (url: any, init?: infer R) => any ? R : never; export interface Encoders { readonly [mimeType: MimeType]: Encoder; } export type Encoder = (body: unknown, ctx: EncoderContext) => AsyncOrSync>; export type BodyInitFor = Lookup, 'body', unknown>; export interface EncoderContext { readonly operationId: string; readonly content: ContentFormat; readonly headers: RequestHeaders; readonly options?: RequestOptions; } export interface Decoders { readonly [mimeType: MimeType]: Decoder; } export type Decoder = (res: ResponseFor, ctx: DecoderContext) => AsyncOrSync; export type ResponseFor = F extends (url: any, init?: any) => Promise ? R : never; export interface DecoderContext { readonly operationId: string; readonly content: ContentFormat; readonly headers: RequestHeaders; readonly options?: RequestOptions; } export type Coercer = (res: ResponseFor, ctx: CoercerContext) => AsyncOrSync; export interface CoercerContext { readonly path: string; readonly method: string; readonly received: MimeType | undefined; readonly accepted: ReadonlySet; readonly declared: ReadonlyMap | undefined; } export {};