import { ApiDocument, type URLSearchParamsInit } from '@opra/common';
import type { StrictOmit } from 'ts-gems';
import { kBackend } from '../constants.js';
import { HttpBackend } from './http-backend.js';
import { HttpRequestObservable } from './http-request-observable.js';
/**
 *
 * @namespace OpraClientBase
 */
export declare namespace OpraClientBase {
    interface Options {
        document?: ApiDocument;
    }
    type RequestOptions = Partial<StrictOmit<HttpBackend.RequestInit, 'url'>> & {
        params?: URLSearchParamsInit;
    };
}
/**
 *
 * @class OpraClientBase
 * @abstract
 */
export declare abstract class HttpClientBase<TRequestOptions = {}, TResponseExt = {}> {
    protected [kBackend]: HttpBackend;
    protected constructor(backend: HttpBackend);
    get serviceUrl(): string;
    fetchDocument(options?: {
        documentId?: string;
    }): Promise<ApiDocument>;
    request<TBody = any>(path: string, options?: OpraClientBase.RequestOptions): HttpRequestObservable<TBody, TBody, TRequestOptions, TResponseExt>;
    delete<TBody = any>(path: string, options?: StrictOmit<OpraClientBase.RequestOptions, 'method' | 'body'>): HttpRequestObservable<TBody, TBody, TRequestOptions, TResponseExt>;
    get<TBody = any>(path: string, options?: StrictOmit<OpraClientBase.RequestOptions, 'method' | 'body'>): HttpRequestObservable<TBody, TBody, TRequestOptions, TResponseExt>;
    patch<TBody = any>(path: string, requestBody: any, options?: StrictOmit<OpraClientBase.RequestOptions, 'method' | 'body'>): HttpRequestObservable<TBody, TBody, TRequestOptions, TResponseExt>;
    post<TBody = any>(path: string, requestBody: any, options?: StrictOmit<OpraClientBase.RequestOptions, 'method' | 'body'>): HttpRequestObservable<TBody, TBody, TRequestOptions, TResponseExt>;
    put<TBody = any>(path: string, requestBody: any, options?: StrictOmit<OpraClientBase.RequestOptions, 'method' | 'body'>): HttpRequestObservable<TBody, TBody, TRequestOptions, TResponseExt>;
}
