{"version":3,"sources":["src/common.browser/RestMessageAdapter.ts"],"names":[],"mappings":";AAGA,OAAO,EAGH,OAAO,EACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAK5C,oBAAY,eAAe;IACvB,GAAG,QAAQ;IACX,IAAI,SAAS;IACb,MAAM,WAAW;IACjB,IAAI,SAAS;CAChB;AAED,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACnB;AAGD,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,WAAW,CAA6B;gBAG5C,YAAY,EAAE,eAAe,EAC7B,YAAY,CAAC,EAAE,MAAM;IAYlB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAI,IAAI;IAI7C,OAAO,CACV,MAAM,EAAE,eAAe,EACvB,GAAG,EAAE,MAAM,EACX,WAAW,GAAE,GAAQ,EACrB,IAAI,GAAE,GAAU,EAChB,UAAU,GAAE,IAAI,GAAG,MAAa,GAC7B,OAAO,CAAC,aAAa,CAAC;IAgD7B,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,WAAW;CAKtB","file":"RestMessageAdapter.d.ts","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\nimport {\n    ArgumentNullError,\n    Deferred,\n    Promise,\n} from \"../common/Exports\";\nimport { IRequestOptions } from \"./Exports\";\n\n// Node.JS specific xmlhttprequest / browser support.\nimport * as XHR from \"xmlhttprequest-ts\";\n\nexport enum RestRequestType {\n    Get = \"get\",\n    Post = \"post\",\n    Delete = \"delete\",\n    File = \"file\",\n}\n\nexport interface IRestResponse {\n    ok: boolean;\n    status: number;\n    statusText: string;\n    data: string;\n    json: <T>() => T;\n    headers: string;\n}\n\n// accept rest operations via request method and return abstracted objects from server response\nexport class RestMessageAdapter {\n\n    private privTimeout: number;\n    private privIgnoreCache: boolean;\n    private privHeaders: { [key: string]: string; };\n\n    public constructor(\n        configParams: IRequestOptions,\n        connectionId?: string\n        ) {\n\n        if (!configParams) {\n            throw new ArgumentNullError(\"configParams\");\n        }\n\n        this.privHeaders = configParams.headers;\n        this.privTimeout = configParams.timeout;\n        this.privIgnoreCache = configParams.ignoreCache;\n    }\n\n    public setHeaders(key: string, value: string ): void {\n        this.privHeaders[key] = value;\n    }\n\n    public request(\n        method: RestRequestType,\n        uri: string,\n        queryParams: any = {},\n        body: any = null,\n        binaryBody: Blob | Buffer = null,\n        ): Promise<IRestResponse> {\n\n        const responseReceivedDeferral = new Deferred<IRestResponse>();\n\n        let xhr: XMLHttpRequest | XHR.XMLHttpRequest;\n        if (typeof (XMLHttpRequest) === \"undefined\") {\n            xhr = new XHR.XMLHttpRequest();\n        } else {\n            xhr = new XMLHttpRequest();\n        }\n        const requestCommand = method === RestRequestType.File ? \"post\" : method;\n        xhr.open(requestCommand, this.withQuery(uri, queryParams), true);\n\n        if (this.privHeaders) {\n            Object.keys(this.privHeaders).forEach((key: any) => xhr.setRequestHeader(key, this.privHeaders[key]));\n        }\n\n        if (this.privIgnoreCache) {\n            xhr.setRequestHeader(\"Cache-Control\", \"no-cache\");\n        }\n\n        xhr.timeout = this.privTimeout;\n\n        xhr.onload = () => {\n            responseReceivedDeferral.resolve(this.parseXHRResult(xhr));\n        };\n\n        xhr.onerror = () => {\n            responseReceivedDeferral.resolve(this.errorResponse(xhr, \"Failed to make request.\"));\n        };\n\n        xhr.ontimeout = () => {\n            responseReceivedDeferral.resolve(this.errorResponse(xhr, \"Request took longer than expected.\"));\n        };\n\n        if (method === RestRequestType.File && binaryBody) {\n            xhr.setRequestHeader(\"Content-Type\", \"multipart/form-data\");\n            xhr.send(binaryBody);\n        } else if (method === RestRequestType.Post && body) {\n            xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n            xhr.send(JSON.stringify(body));\n        } else {\n            xhr.send();\n        }\n\n        return responseReceivedDeferral.promise();\n    }\n\n    private parseXHRResult(xhr: XMLHttpRequest | XHR.XMLHttpRequest): IRestResponse {\n        return {\n            data: xhr.responseText,\n            headers: xhr.getAllResponseHeaders(),\n            json: <T>() => JSON.parse(xhr.responseText) as T,\n            ok: xhr.status >= 200 && xhr.status < 300,\n            status: xhr.status,\n            statusText: xhr.statusText,\n        };\n    }\n\n    private errorResponse(xhr: XMLHttpRequest | XHR.XMLHttpRequest, message: string | null = null): IRestResponse {\n        return {\n            data: message || xhr.statusText,\n            headers: xhr.getAllResponseHeaders(),\n            json: <T>() => JSON.parse(message || (\"\\\"\" + xhr.statusText + \"\\\"\")) as T,\n            ok: false,\n            status: xhr.status,\n            statusText: xhr.statusText,\n        };\n    }\n\n    private withQuery(url: string, params: any = {}): any {\n        const queryString = this.queryParams(params);\n        return queryString ? url + (url.indexOf(\"?\") === -1 ? \"?\" : \"&\") + queryString : url;\n    }\n\n    private queryParams(params: any = {}): any {\n        return Object.keys(params)\n            .map((k: any) => encodeURIComponent(k) + \"=\" + encodeURIComponent(params[k]))\n            .join(\"&\");\n    }\n}\n"]}