{"version":3,"sources":["src/common.browser/RestMessageAdapter.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,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,GAAG,CAAC;IACV,OAAO,EAAE,MAAM,CAAC;CACnB;AASD,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,WAAW,CAA4B;gBAG3C,YAAY,EAAE,eAAe;WAWnB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;IAqB5E,IAAW,OAAO,CAAC,YAAY,EAAE,eAAe,EAG/C;IAEM,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI5C,OAAO,CACV,MAAM,EAAE,eAAe,EACvB,GAAG,EAAE,MAAM,EACX,WAAW,GAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAO,EACxC,IAAI,GAAE,GAAU,GACb,OAAO,CAAC,aAAa,CAAC;IAiD7B,OAAO,CAAC,WAAW;CAKtB","file":"RestMessageAdapter.d.ts","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\nimport bent, { BentResponse, RequestBody } from \"bent\";\nimport {\n    ArgumentNullError,\n    Deferred\n} from \"../common/Exports.js\";\nimport { IRequestOptions } from \"./Exports.js\";\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: any;\n    headers: string;\n}\n\ninterface JsonError {\n    error?: {\n        message: string;\n    };\n}\n\n// accept rest operations via request method and return abstracted objects from server response\nexport class RestMessageAdapter {\n\n    private privIgnoreCache: boolean;\n    private privHeaders: { [key: string]: string };\n\n    public constructor(\n        configParams: IRequestOptions\n        ) {\n\n        if (!configParams) {\n            throw new ArgumentNullError(\"configParams\");\n        }\n\n        this.privHeaders = configParams.headers;\n        this.privIgnoreCache = configParams.ignoreCache;\n    }\n\n    public static extractHeaderValue(headerKey: string, headers: string): string {\n        let headerValue: string = \"\";\n\n        try {\n            const arr = headers.trim().split(/[\\r\\n]+/);\n            const headerMap: { [key: string]: string } = {};\n            arr.forEach((line: string): void => {\n                const parts = line.split(\": \");\n                const header = parts.shift().toLowerCase();\n                const value = parts.join(\": \");\n                headerMap[header] = value;\n            });\n\n            headerValue = headerMap[headerKey.toLowerCase()];\n        } catch (e) {\n            // ignore the error\n        }\n\n        return headerValue;\n    }\n\n    public set options(configParams: IRequestOptions) {\n        this.privHeaders = configParams.headers;\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: { [key: string]: any } = {},\n        body: any = null,\n        ): Promise<IRestResponse> {\n\n        const responseReceivedDeferral = new Deferred<IRestResponse>();\n\n        const requestCommand = method === RestRequestType.File ? \"POST\" : method;\n        const handleRestResponse = (data: BentResponse, j: JsonError = {}): IRestResponse => {\n            const d: { statusText?: string; statusMessage?: string } = data;\n            return {\n                data: JSON.stringify(j),\n                headers: JSON.stringify(data.headers),\n                json: j,\n                ok: data.statusCode >= 200 && data.statusCode < 300,\n                status: data.statusCode,\n                statusText: j.error ? j.error.message : d.statusText ? d.statusText : d.statusMessage\n            };\n        };\n\n        const send = (postData: RequestBody): void => {\n            const sendRequest = bent(uri, requestCommand, this.privHeaders, 200, 201, 202, 204, 400, 401, 402, 403, 404);\n            const params = this.queryParams(queryParams) === \"\" ? \"\" : `?${this.queryParams(queryParams)}`;\n            sendRequest(params, postData).then( async (data: BentResponse): Promise<void> => {\n                if (method === RestRequestType.Delete || data.statusCode === 204) {\n                    // No JSON from Delete and reset (204) operations\n                    responseReceivedDeferral.resolve(handleRestResponse(data));\n                } else {\n                    try {\n                        const j: JsonError = await data.json() as JsonError;\n                        responseReceivedDeferral.resolve(handleRestResponse(data, j));\n                    } catch {\n                        responseReceivedDeferral.resolve(handleRestResponse(data));\n                    }\n                }\n            }).catch((error: string): void => {\n                responseReceivedDeferral.reject(error);\n            });\n        };\n\n        if (this.privIgnoreCache) {\n            this.privHeaders[\"Cache-Control\"] = \"no-cache\";\n        }\n\n        if (method === RestRequestType.Post && body) {\n            this.privHeaders[\"content-type\"] = \"application/json\";\n            this.privHeaders[\"Content-Type\"] = \"application/json\";\n        }\n        send(body as RequestBody);\n        return responseReceivedDeferral.promise;\n    }\n\n    private queryParams(params: { [key: string]: string } = {}): string {\n        return Object.keys(params)\n            .map((k: string): string => encodeURIComponent(k) + \"=\" + encodeURIComponent(params[k]))\n            .join(\"&\");\n    }\n}\n"]}