UNPKG

@sitecore/sc-contenthub-webclient-sdk

Version:

Sitecore Content Hub WebClient SDK.

118 lines 7.07 kB
"use strict"; /* istanbul ignore file */ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.UploadClient = void 0; const form_data_1 = __importDefault(require("form-data")); const ta_json_1 = require("ta-json"); const api_1 = require("../constants/api"); const defaults_1 = require("../constants/defaults"); const error_messages_1 = __importDefault(require("../error-messages")); const web_api_error_1 = require("../errors/web-api-error"); const fileversion_1 = require("../fileversion"); const guard_1 = __importDefault(require("../guard")); const create_upload_response_1 = require("../models/upload/create-upload-response"); const upload_action_1 = require("../models/upload/upload-action"); const upload_configuration_1 = require("../models/upload/upload-configuration"); const upload_request_wrapper_1 = require("../models/upload/upload-request-wrapper"); const response_handler_1 = require("./response-handler"); class UploadClient { constructor(client) { this.client = client; guard_1.default.notNull(client); } uploadAsync(request, cancelCallback) { return __awaiter(this, void 0, void 0, function* () { guard_1.default.notNull(request); yield this.client.versionChecker.compatibilityCheckAsync(new fileversion_1.FileVersion(4, 0, 0, 0)); const source = yield request.source.getReadableSourceAsync(); const uploadRequest = new upload_request_wrapper_1.UploadRequestWrapper(); uploadRequest.fileName = request.source.name; uploadRequest.fileSize = source.byteLength; uploadRequest.uploadConfiguration = new upload_configuration_1.UploadConfiguration(request.configurationName, request.configurationParameters); uploadRequest.action = new upload_action_1.UploadAction(request.actionName, request.actionParameters); return yield this.uploadFileAsync(uploadRequest, source, cancelCallback); }); } uploadFileAsync(uploadRequest, uploadSource, cancelCallback) { return __awaiter(this, void 0, void 0, function* () { guard_1.default.notNull(uploadRequest); guard_1.default.notNull(uploadSource); // 1. Request new file to be created. const uploadLink = yield this.client.linkHelper.createUploadToLinkAsync(); const uploadResponse = yield this.client.raw.postAsync(uploadLink.href, ta_json_1.TaJson.serialize(uploadRequest), undefined, cancelCallback); response_handler_1.ResponseHandler.handleErrors(uploadResponse); const uploadResponseLocation = uploadResponse.responseHeaders[api_1.HEADERS.location]; if (!uploadResponseLocation) { throw new web_api_error_1.WebApiError(error_messages_1.default.EntitiesClient.UnableToExtractLocationHeaderFromResponse, uploadResponse.statusCode, uploadResponse); } const createUploadResponse = ta_json_1.TaJson.deserialize(uploadResponse.content, create_upload_response_1.CreateUploadResponse); // 2. Upload file if (uploadRequest.fileSize >= defaults_1.FILE_UPLOAD.chunkSize) { let chunkCurrent = 0; const chunkTotal = Math.ceil(uploadRequest.fileSize / defaults_1.FILE_UPLOAD.chunkSize); const chunkUploadUri = `${uploadResponseLocation}&chunks=${chunkTotal}`; let index = 0; while (index < uploadSource.byteLength) { const chunk = uploadSource.slice(index, defaults_1.FILE_UPLOAD.chunkSize + index); yield this.uploadChunkAsync(uploadRequest.fileName, chunk, `${chunkUploadUri}&chunk=${chunkCurrent}`, cancelCallback); index += defaults_1.FILE_UPLOAD.chunkSize; chunkCurrent++; } // Finalize chunked upload const finalizeChunkUploadResponse = yield this.client.raw.postAsync(chunkUploadUri, "", undefined, cancelCallback); response_handler_1.ResponseHandler.handleErrors(finalizeChunkUploadResponse); } else { yield this.uploadChunkAsync(uploadRequest.fileName, uploadSource, uploadResponseLocation, cancelCallback); } // 3. Finalize upload const finalizeUploadLink = yield this.client.linkHelper.finalizeUploadToLinkAsync(); const finalizeUploadResponse = yield this.client.raw.postAsync(finalizeUploadLink.href, createUploadResponse, undefined, cancelCallback); response_handler_1.ResponseHandler.handleErrors(finalizeUploadResponse); return finalizeUploadResponse; }); } uploadChunkAsync(fileName, buffer, uri, cancelCallback) { return __awaiter(this, void 0, void 0, function* () { // Due to differences in the re-implementation of the FormData type in the Node.js wrapper we need two different paths to be able to handle uploads performed from Node.js and the browser. // See: // - https://github.com/form-data/form-data // - https://developer.mozilla.org/en-US/docs/Web/API/FormData const [form, headers] = typeof window === "undefined" ? this.prepareFormDataNode(fileName, buffer) : this.prepareFormDataBrowser(fileName, buffer); const uploadResponse = yield this.client.raw.postAsync(uri, form, headers, cancelCallback); response_handler_1.ResponseHandler.handleErrors(uploadResponse); }); } prepareFormDataNode(fileName, buffer) { const form = new form_data_1.default({ autoDestroy: true }); form.append("file", buffer, fileName); const headers = { "Content-Type": `multipart/form-data;boundary=${form.getBoundary()}`, }; return [form, headers]; } prepareFormDataBrowser(fileName, buffer) { const form = new form_data_1.default(); form.append("file", new Blob([buffer]), fileName); const headers = { "Content-Type": "multipart/form-data", }; return [form, headers]; } } exports.UploadClient = UploadClient; //# sourceMappingURL=upload-client.js.map