UNPKG

@eddye68/studio-client

Version:

The AWS service Studio client

181 lines (178 loc) 5.12 kB
// src/client/client-error.ts var ClientError = class extends Error { constructor(msg) { super(msg); this.name = "ClientError"; } }; // src/http-client/http-error.ts var HttpError = class extends Error { /** * * @param {string} message */ constructor(message) { super(message); this.name = "HttpError"; } }; // src/http-client/http-response-error.ts var HttpResponseError = class _HttpResponseError extends HttpError { /** * * @param {Response} response */ constructor(message, response) { super(_HttpResponseError.buildMessage(message, response)); this.code = response.status; this.name = "HttpResponseError"; } static buildMessage(message, response) { if (message) { return `HTTP Error: ${message}: ${response.status} ${response.statusText}`; } else { return `HTTP Error: ${response.status} ${response.statusText}`; } } }; // src/http-client/http-client.ts import { v4 as uuidv4 } from "uuid"; var HttpClient = class { constructor(logger) { this.headers = {}; this.baseUrl = "."; this.logger = logger; } /** * * @returns The configuration service base URL */ getBaseUrl() { return this.baseUrl; } setBaseUrl(baseUrl) { this.baseUrl = baseUrl; } setCommonHeaders(headers) { this.headers = headers; } async request(httpMethod, path, query, body) { httpMethod = httpMethod.toUpperCase(); if (query === void 0) { query = new URLSearchParams(); } const url = this.getBaseUrl() + "/" + path + (query.size > 0 ? "?" + query.toString() : ""); const request = { method: httpMethod.toUpperCase(), headers: { ...this.headers } // Clone headers }; console.log(`HttpClient::_request: httpMethod=[${httpMethod}], url=[${url}]`); if (httpMethod === "POST") { this.logger.debug(`HttpClient::_request: body=[${JSON.stringify(body)}]`); console.log("HttpClient::_request: body:", body); request.body = JSON.stringify(body); request.headers["Content-Type"] = "application/json"; } const response = await fetch(url, request); let data = null; const contentType = response.headers.get("Content-Type"); switch (contentType) { case "application/json": data = await response.json(); break; default: throw new HttpResponseError(`Unsupported content type: ${contentType}`, response); } data = this._checkResponse(data); return data.Result; } /** * * @param url * @returns */ async downloadFile(url, query) { if (query === void 0) { query = new URLSearchParams(); } const parsedUrl = new URL(url); query.forEach((value, key) => { parsedUrl.searchParams.set(key, value); }); url = parsedUrl.toString(); const response = await fetch(url); if (!response.ok) { throw new HttpResponseError("Object cannot be downloaded from Studio.", response); } const buffer = await response.arrayBuffer(); console.log(`Downloaded ${buffer.byteLength} bytes`); return buffer; } /** * Upload a file to the Studio transfer server. * * * @param body * @param size * @param contentType * @param ticket * @param studiobaseUrl The Studio base url * * @returns The url to the uploaded file */ async uploadFile(body, size, contentType, ticket, studiobaseUrl) { this.logger.debug(`HttpClient::uploadFile: ticket=[${ticket}], studiobaseUrl=[${studiobaseUrl}]`); const url = `${studiobaseUrl}/transferindex.php?ticket=${ticket}&fileguid=${uuidv4()}`; const headers = { "Content-Type": contentType }; if (size !== null) { headers["Content-Length"] = String(size); } const response = await fetch(url, { method: "PUT", // To prevent the error: RequestInit: duplex option is required when sending a body // Note: The order is important!!!! The 'duplex' setting must be set before the body otherwise it will be ignored. duplex: "half", body, headers }); if (!response.ok) { throw new HttpResponseError("Unable to upload file.", response); } return url; } /** * @param {object} data * @private */ _checkResponse(data) { console.log("HttpClient::_checkResponse: ", data); if (data === null) { throw new HttpError("No JSON data received"); } if (data.hasOwnProperty("Status")) { if (data.Status !== "ok") { if (data.StatusMessage !== void 0) { throw new ClientError(`The status is not 'ok': ${data.Status}: ${data.StatusMessage}`); } else { throw new ClientError(`The status is not 'ok': ${data.Status}`); } } } else { throw new HttpError("No 'Status' property found in response"); } if (!data.hasOwnProperty("Result")) { throw new HttpError("No 'Result' property found in response"); } return data; } _sanitizeUrl(url) { return url.replace(/\/$/, ""); } }; export { HttpClient }; //# sourceMappingURL=http-client.mjs.map