{"version":3,"sources":["../../src/client/client-error.ts","../../src/http-client/http-error.ts","../../src/http-client/http-response-error.ts","../../src/http-client/http-client.ts"],"sourcesContent":["export class ClientError extends Error {\n    constructor(msg: string) {\n        super(msg);\n        this.name = 'ClientError';\n    }\n}\n","export class HttpError extends Error {\n\n\n\n    /**\n     *\n     * @param {string} message\n     */\n    constructor(message: string) {\n        super(message);\n        this.name = \"HttpError\";\n    }\n}","import { HttpError } from \"./http-error\";\n\nexport class HttpResponseError extends HttpError {\n\n    readonly code: number;\n    readonly name: string;\n\n    /**\n     *\n     * @param {Response} response\n     */\n    constructor(message: string, response: Response) {\n        super(HttpResponseError.buildMessage(message, response));\n        this.code = response.status;\n        this.name = \"HttpResponseError\";\n    }\n\n    static buildMessage(message : string, response: Response) : string {\n        if(message) {\n            return `HTTP Error: ${message}: ${response.status} ${response.statusText}`;\n        } else {\n            return `HTTP Error: ${response.status} ${response.statusText}`;\n        }\n    }\n}","import { ClientError } from \"../client/client-error\";\nimport { IHttpClient } from \"./http-client-interface\";\nimport { HttpError } from \"./http-error\";\nimport { HttpResponseError } from \"./http-response-error\";\nimport {ResponseBase} from \"./response-base\";\nimport {v4 as uuidv4} from 'uuid';\nimport { LoggerInterface,  } from '@aws-lambda-powertools/logger/types';\nimport { BodyInit, HeadersInit } from \"undici-types/fetch\";\n\nexport class HttpClient implements IHttpClient {\n\n    \n    private headers : Record<string,string> = {}\n\n    private baseUrl: string = \".\";\n    \n    private logger : LoggerInterface;\n\n    constructor(logger : LoggerInterface) {\n        this.logger = logger;\n    }\n\n    /**\n     * \n     * @returns The configuration service base URL\n     */\n    getBaseUrl(): string {\n        return <string>this.baseUrl;\n    }\n\n    setBaseUrl(baseUrl : string) : void {\n        this.baseUrl = baseUrl;\n    }\n\n    setCommonHeaders(headers : Record<string,string>) : void{\n        this.headers = headers;\n    }\n\n\n    async request(httpMethod: string, path: string, query?: URLSearchParams, body?: any): Promise<any> {\n        httpMethod = httpMethod.toUpperCase();\n\n        if (query === undefined) {\n            query = new URLSearchParams();\n        }\n\n        const url = this.getBaseUrl() + '/' + path + (query.size > 0 ? '?' + query.toString() : '');\n\n        const request: RequestInit = {\n            method: httpMethod.toUpperCase(),\n            headers: { ...this.headers} // Clone headers\n        }\n\n        console.log(`HttpClient::_request: httpMethod=[${httpMethod}], url=[${url}]`);\n        if (httpMethod === 'POST') {\n            this.logger.debug(`HttpClient::_request: body=[${JSON.stringify(body)}]`);\n            console.log(\"HttpClient::_request: body:\", body);\n            request.body = JSON.stringify(body);\n            // @ts-ignore request.Headers is always set.\n            request.headers['Content-Type'] = 'application/json';\n        }\n\n        const response = await fetch(url, request);\n\n        let data: ResponseBase | null = null;\n\n        const contentType: string = <string>response.headers.get(\"Content-Type\");\n        switch (contentType) {\n            case \"application/json\":\n                data = (await response.json()) as ResponseBase;\n                break;\n            default:\n                throw new HttpResponseError(`Unsupported content type: ${contentType}`, response);\n        }\n\n        data = this._checkResponse(data);\n\n        return data.Result;\n    }\n\n\n    /**\n     *\n     * @param url\n     * @returns \n     */\n    async downloadFile(url : string, query?: URLSearchParams) : Promise<ArrayBuffer>{\n        if (query === undefined) {\n            query = new URLSearchParams();\n        } \n\n        const parsedUrl = new URL(url)\n\n        query.forEach((value, key) => {\n            parsedUrl.searchParams.set(key, value);\n        });\n\n\n        //url = url + (query.size > 0 ? '?' + query.toString() : '');\n        url = parsedUrl.toString();\n\n        \n        const response = await fetch(url);\n\n        if (!response.ok) {\n            throw new HttpResponseError(\"Object cannot be downloaded from Studio.\", response);\n        }\n\n        const buffer = await response.arrayBuffer();\n\n        console.log(`Downloaded ${buffer.byteLength} bytes`);\n\n        return buffer;\n    }\n\n    /**\n     * Upload a file to the Studio transfer server.\n     * \n     * \n     * @param body \n     * @param size\n     * @param contentType \n     * @param ticket \n     * @param studiobaseUrl The Studio base url\n     *\n     * @returns The url to the uploaded file\n     */\n    async uploadFile(body : BodyInit, size : number | null, contentType : string, ticket : string, studiobaseUrl : string) : Promise<string> {\n        this.logger.debug(`HttpClient::uploadFile: ticket=[${ticket}], studiobaseUrl=[${studiobaseUrl}]`)\n\n        const url = `${studiobaseUrl}/transferindex.php?ticket=${ticket}&fileguid=${uuidv4()}`;\n\n        const headers : HeadersInit = {\n            'Content-Type' : contentType,\n        }\n\n        if(size !== null) {\n            headers['Content-Length'] = String(size);\n        }\n\n        const response = await fetch(url, {\n            method: 'PUT',\n            // To prevent the error: RequestInit: duplex option is required when sending a body\n            // Note: The order is important!!!! The 'duplex' setting must be set before the body otherwise it will be ignored.\n            duplex: 'half',\n            body: body,\n            headers: headers\n        });\n\n        if (!response.ok) {\n            throw new HttpResponseError('Unable to upload file.',response);\n        }\n\n        return url;\n    }\n\n    /**\n     * @param {object} data\n     * @private\n     */\n    _checkResponse(data: ResponseBase | null) : ResponseBase {\n        console.log(\"HttpClient::_checkResponse: \", data);\n\n        if (data === null) {\n            throw new HttpError(\"No JSON data received\");\n        }\n\n        if (data.hasOwnProperty('Status')) {\n            if (data.Status !== 'ok') {\n                if (data.StatusMessage !== undefined) {\n                    throw new ClientError(`The status is not 'ok': ${data.Status}: ${data.StatusMessage}`);\n                } else {\n                    throw new ClientError(`The status is not 'ok': ${data.Status}`);\n                }\n            }\n        } else {\n            throw new HttpError(\"No 'Status' property found in response\");\n        }\n\n        if (!data.hasOwnProperty('Result')) {\n            throw new HttpError(\"No 'Result' property found in response\");\n        }\n\n        return data;\n    }\n\n    _sanitizeUrl(url: string): string {\n        return url.replace(/\\/$/, \"\");\n    }\n}"],"mappings":"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","names":[]}