UNPKG

@sitecore/sc-contenthub-webclient-sdk

Version:

Sitecore Content Hub WebClient SDK.

111 lines 6.35 kB
/* 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()); }); }; import FormData from "form-data"; import { TaJson } from "ta-json"; import { HEADERS } from "../constants/api"; import { FILE_UPLOAD } from "../constants/defaults"; import ErrorMessages from "../error-messages"; import { WebApiError } from "../errors/web-api-error"; import { FileVersion } from "../fileversion"; import Guard from "../guard"; import { CreateUploadResponse } from "../models/upload/create-upload-response"; import { UploadAction } from "../models/upload/upload-action"; import { UploadConfiguration } from "../models/upload/upload-configuration"; import { UploadRequestWrapper } from "../models/upload/upload-request-wrapper"; import { ResponseHandler } from "./response-handler"; export class UploadClient { constructor(client) { this.client = client; Guard.notNull(client); } uploadAsync(request, cancelCallback) { return __awaiter(this, void 0, void 0, function* () { Guard.notNull(request); yield this.client.versionChecker.compatibilityCheckAsync(new FileVersion(4, 0, 0, 0)); const source = yield request.source.getReadableSourceAsync(); const uploadRequest = new UploadRequestWrapper(); uploadRequest.fileName = request.source.name; uploadRequest.fileSize = source.byteLength; uploadRequest.uploadConfiguration = new UploadConfiguration(request.configurationName, request.configurationParameters); uploadRequest.action = new 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.notNull(uploadRequest); Guard.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, TaJson.serialize(uploadRequest), undefined, cancelCallback); ResponseHandler.handleErrors(uploadResponse); const uploadResponseLocation = uploadResponse.responseHeaders[HEADERS.location]; if (!uploadResponseLocation) { throw new WebApiError(ErrorMessages.EntitiesClient.UnableToExtractLocationHeaderFromResponse, uploadResponse.statusCode, uploadResponse); } const createUploadResponse = TaJson.deserialize(uploadResponse.content, CreateUploadResponse); // 2. Upload file if (uploadRequest.fileSize >= FILE_UPLOAD.chunkSize) { let chunkCurrent = 0; const chunkTotal = Math.ceil(uploadRequest.fileSize / FILE_UPLOAD.chunkSize); const chunkUploadUri = `${uploadResponseLocation}&chunks=${chunkTotal}`; let index = 0; while (index < uploadSource.byteLength) { const chunk = uploadSource.slice(index, FILE_UPLOAD.chunkSize + index); yield this.uploadChunkAsync(uploadRequest.fileName, chunk, `${chunkUploadUri}&chunk=${chunkCurrent}`, cancelCallback); index += FILE_UPLOAD.chunkSize; chunkCurrent++; } // Finalize chunked upload const finalizeChunkUploadResponse = yield this.client.raw.postAsync(chunkUploadUri, "", undefined, cancelCallback); 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); 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); ResponseHandler.handleErrors(uploadResponse); }); } prepareFormDataNode(fileName, buffer) { const form = new FormData({ 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 FormData(); form.append("file", new Blob([buffer]), fileName); const headers = { "Content-Type": "multipart/form-data", }; return [form, headers]; } } //# sourceMappingURL=upload-client.js.map