simplerestclients
Version:
A library of components for accessing RESTful services with javascript/typescript.
149 lines (148 loc) • 5.7 kB
TypeScript
/**
* SimpleWebRequest.ts
* Author: David de Regt
* Copyright: Microsoft 2016
*
* Simple client for issuing web requests.
*/
import { ExponentialTime } from './ExponentialTime';
interface Dictionary<T> {
[key: string]: T;
}
export interface Headers extends Dictionary<string> {
}
export interface Params extends Dictionary<any> {
}
export interface WebTransportResponseBase {
url: string;
method: string;
statusCode: number;
statusText: string | undefined;
headers: Headers;
responseParsingException?: Error;
}
export interface WebTransportResponse<TBody> extends WebTransportResponseBase {
body: TBody;
}
export interface WebTransportErrorResponse extends WebTransportResponseBase {
body: any;
canceled: boolean;
timedOut: boolean;
}
export interface RestRequestInResponse<TOptions = WebRequestOptions> {
requestOptions: TOptions;
requestHeaders: Headers;
}
export interface WebResponseBase<TOptions = WebRequestOptions> extends WebTransportResponseBase, RestRequestInResponse<TOptions> {
}
export interface WebErrorResponse<TOptions = WebRequestOptions> extends WebTransportErrorResponse, RestRequestInResponse<TOptions> {
}
export interface WebResponse<TBody, TOptions = WebRequestOptions> extends WebTransportResponse<TBody>, RestRequestInResponse<TOptions> {
}
export declare enum WebRequestPriority {
DontCare = 0,
Low = 1,
Normal = 2,
High = 3,
Critical = 4
}
export declare enum ErrorHandlingType {
DoNotRetry = 0,
RetryUncountedImmediately = 1,
RetryUncountedWithBackoff = 2,
RetryCountedWithBackoff = 3,
PauseUntilResumed = 4
}
export interface NativeBlobFileData {
uri: string;
size: number;
name: string;
type: string;
}
export interface NativeFileData {
file: NativeBlobFileData | File;
}
export interface XMLHttpRequestProgressEvent extends ProgressEvent {
lengthComputable: boolean;
loaded: number;
path: string[];
percent: number;
position: number;
total: number;
totalSize: number;
}
export declare type SendDataType = Params | string | NativeFileData;
export interface WebRequestOptions {
withCredentials?: boolean;
retries?: number;
priority?: WebRequestPriority;
timeout?: number;
acceptType?: string;
customResponseType?: XMLHttpRequestResponseType;
contentType?: string;
sendData?: SendDataType;
headers?: Headers;
overrideGetHeaders?: Headers;
augmentHeaders?: Headers;
streamingDownloadProgress?: (responseText: string) => void;
onProgress?: (progressEvent: XMLHttpRequestProgressEvent) => void;
customErrorHandler?: (webRequest: SimpleWebRequestBase, errorResponse: WebErrorResponse) => ErrorHandlingType;
augmentErrorResponse?: (resp: WebErrorResponse) => void;
}
export declare const DefaultOptions: WebRequestOptions;
export interface ISimpleWebRequestOptions {
MaxSimultaneousRequests: number;
HungRequestCleanupIntervalMs: number;
setTimeout: (callback: () => void, timeoutMs?: number) => number;
clearTimeout: (id: number) => void;
}
export declare let SimpleWebRequestOptions: ISimpleWebRequestOptions;
export declare function DefaultErrorHandler(webRequest: SimpleWebRequestBase, errResp: WebTransportErrorResponse): ErrorHandlingType;
export declare abstract class SimpleWebRequestBase<TOptions extends WebRequestOptions = WebRequestOptions> {
protected _action: string;
protected _url: string;
protected readonly options: TOptions;
protected readonly _getHeaders?: (() => Headers) | undefined;
protected readonly _blockRequestUntil?: (() => Promise<void> | undefined) | undefined;
protected _xhr: XMLHttpRequest | undefined;
protected _xhrRequestHeaders: Headers | undefined;
protected _requestTimeoutTimer: number | undefined;
protected _options: TOptions;
protected _aborted: boolean;
protected _timedOut: boolean;
protected _paused: boolean;
protected _created: number;
protected _finishHandled: boolean;
protected _retryTimer: number | undefined;
protected _retryExponentialTime: ExponentialTime;
constructor(_action: string, _url: string, options: TOptions, _getHeaders?: (() => Headers) | undefined, _blockRequestUntil?: (() => Promise<void> | undefined) | undefined);
getPriority(): WebRequestPriority;
abstract abort(): void;
protected static checkQueueProcessing(): void;
private static _scheduleHungRequestCleanupIfNeeded;
private static _hungRequestCleanupTimerCallback;
protected _removeFromQueue(): void;
protected _assertAndClean(expression: any, message: string): void;
private _fire;
private static _setRequestHeader;
static mapContentType(contentType: string): string;
static mapBody(sendData: SendDataType, contentType: string): SendDataType;
setUrl(newUrl: string): void;
setHeader(key: string, val: string | undefined): void;
getRequestHeaders(): Headers;
getOptions(): Readonly<WebRequestOptions>;
setPriority(newPriority: WebRequestPriority): void;
resumeRetrying(): void;
protected _enqueue(): void;
private static _getResponseType;
protected abstract _respond(errorStatusText?: string): void;
}
export declare class SimpleWebRequest<TBody, TOptions extends WebRequestOptions = WebRequestOptions> extends SimpleWebRequestBase<TOptions> {
private _resolve?;
private _reject?;
constructor(action: string, url: string, options: TOptions, getHeaders?: () => Headers, blockRequestUntil?: () => Promise<void> | undefined);
abort(): void;
start(): Promise<WebResponse<TBody, TOptions>>;
protected _respond(errorStatusText?: string): void;
}
export {};