// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. import type { RetryTypes } from "./NativeAPIClient"; export interface ProgressPromise extends Promise { progress?: ( callback: (fractionCompleted: number, bytesRead?: number | null) => void ) => ProgressPromise; onProgress?: ( fractionCompleted: number, bytesRead: number | null | undefined ) => void; cancel?: () => void; } export type ClientHeaders = Record; export type RequestOptions = { headers?: ClientHeaders; body?: Record | string; timeoutInterval?: number; retryPolicyConfiguration?: RetryPolicyConfiguration; }; export type MultipartUploadConfig = { fileKey?: string; data?: Record; }; export type UploadRequestOptions = RequestOptions & { skipBytes?: number; method?: string; multipart?: MultipartUploadConfig; }; export type ClientResponse = { headers?: ClientHeaders; data?: Record; code: number; redirectUrls?: string[]; ok: boolean; retriesExhausted?: boolean; path?: string; }; export type ClientResponseError = { code: number; message: string; domain: string; userInfo?: Record; nativeStackAndroid?: unknown[]; nativeStackIOS?: unknown[]; }; export type APIClientErrorEventHandler = (event: APIClientErrorEvent) => void; export interface GenericClientInterface { head(url: string, options?: RequestOptions): Promise; get(url: string, options?: RequestOptions): Promise; put(url: string, options?: RequestOptions): Promise; post(url: string, options?: RequestOptions): Promise; patch(url: string, options?: RequestOptions): Promise; delete(url: string, options?: RequestOptions): Promise; } export interface APIClientInterface { baseUrl: string; config: APIClientConfiguration; onClientErrorSubscription?: EmitterSubscription; onClientError(callback: APIClientErrorEventHandler): void; head(endpoint: string, options?: RequestOptions): Promise; get(endpoint: string, options?: RequestOptions): Promise; put(endpoint: string, options?: RequestOptions): Promise; post(endpoint: string, options?: RequestOptions): Promise; patch(endpoint: string, options?: RequestOptions): Promise; delete(endpoint: string, options?: RequestOptions): Promise; upload( endpoint: string, fileUrl: string, options?: UploadRequestOptions ): ProgressPromise; download( endpoint: string, filePath: string, options?: RequestOptions ): ProgressPromise; getHeaders(): Promise; addHeaders(headers: ClientHeaders): Promise; importClientP12(path: string, password?: string): Promise; invalidate(): Promise; } export type ClientP12Configuration = { path: string; password?: string; }; export type SessionConfiguration = { allowsCellularAccess?: boolean; waitsForConnectivity?: boolean; timeoutIntervalForRequest?: number; timeoutIntervalForResource?: number; httpMaximumConnectionsPerHost?: number; cancelRequestsOnUnauthorized?: boolean; trustSelfSignedServerCertificate?: boolean; }; export type RetryPolicyConfiguration = { type?: RetryTypes; retryLimit?: number; retryInterval?: number; exponentialBackoffBase?: number; exponentialBackoffScale?: number; statusCodes?: number[]; retryMethods?: string[]; }; export type RequestAdapterConfiguration = { bearerAuthTokenResponseHeader?: string; }; export type APIClientConfiguration = { headers?: ClientHeaders; sessionConfiguration?: SessionConfiguration; retryPolicyConfiguration?: RetryPolicyConfiguration; requestAdapterConfiguration?: RequestAdapterConfiguration; clientP12Configuration?: ClientP12Configuration; }; export type ProgressEvent = { taskId: string; fractionCompleted: number; bytesRead?: number | null; }; export type MissingClientCertificateEvent = { serverUrl: string; }; export type APIClientErrorEvent = { serverUrl: string; errorCode: number; errorDescription: string; };