@sitecore/sc-contenthub-webclient-sdk
Version:
Sitecore Content Hub WebClient SDK.
118 lines • 7.07 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());
});
};
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