@eddye68/studio-client
Version:
The AWS service Studio client
1 lines • 10.4 kB
Source Map (JSON)
{"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":[]}