@sitecore/sc-contenthub-webclient-sdk
Version:
Sitecore Content Hub WebClient SDK.
111 lines • 6.35 kB
JavaScript
/* 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