@platform/cell.client
Version:
A strongly typed HTTP client for operating with a CellOS service end-point.
169 lines (168 loc) • 9.69 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.uploadFiles = void 0;
var tslib_1 = require("tslib");
var common_1 = require("../common");
var HttpClientCellFs_upload_event_1 = require("./HttpClientCellFs.upload.event");
var HttpClientCellFs_upload_files_1 = require("./HttpClientCellFs.upload.files");
function uploadFiles(args) {
var _this = this;
var _a;
var http = args.http, urls = args.urls, cellUri = args.cellUri;
var sendChanges = (_a = args.changes) !== null && _a !== void 0 ? _a : false;
var input = common_1.value.asArray(args.input).filter(function (file) { return file.data.byteLength > 0; });
var event = (0, HttpClientCellFs_upload_event_1.UploadEvent)({ total: input.length, uri: cellUri });
var promise = new Promise(function (resolve) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
var errors, addError, done, message, changes, addChanges, fileUrls, url, uploadStartBody, res1, message, uploadStart, fileUploadWait, res2, fileUploadSuccesses, fileUploadErrors, res3, fileCompleteFails, fileCompleteFailErrors, cellUploadCompleteBody, res4, cellUploadComplete, files, status_1, error_1, status_2;
var _this = this;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4, common_1.time.wait(0)];
case 1:
_a.sent();
errors = [];
addError = function (status, message) {
var type = common_1.ERROR.HTTP.FILE;
var error = { status: status, type: type, message: message };
errors.push(error);
return error;
};
done = function (status, options) {
if (options === void 0) { options = {}; }
var responseBody = {
uri: cellUri,
cell: options.cell || {},
files: options.files || [],
errors: errors,
changes: changes,
};
var error;
if (errors.length > 0) {
var messages = errors
.map(function (error) { return error.message || ''; })
.map(function (message) { return message.replace(/\.*$/, ''); })
.map(function (message) { return "".concat(message, "."); })
.join(' ');
var message = "Failed to upload. ".concat(messages);
error = { type: common_1.ERROR.HTTP.FILE, status: status, message: message };
}
event.dispose();
var result = common_1.util.toClientResponse(status, responseBody, { error: error });
resolve(result);
};
if (input.length === 0) {
message = "No files provided to client to upload [".concat(cellUri, "]");
event.fire({ error: addError(400, message), done: true });
return [2, done(400)];
}
addChanges = function (input) {
if (sendChanges && input && input.length > 0) {
changes = changes || [];
changes = tslib_1.__spreadArray(tslib_1.__spreadArray([], changes, true), input, true);
}
};
fileUrls = urls.cell(cellUri).files;
url = {
start: fileUrls.upload.query({ changes: sendChanges }).toString(),
complete: fileUrls.uploaded.query({ changes: sendChanges }).toString(),
};
event.fire();
_a.label = 2;
case 2:
_a.trys.push([2, 7, , 8]);
uploadStartBody = {
expires: undefined,
files: input.map(function (item) {
var filehash = common_1.Schema.Hash.sha256(item.data);
var file = {
filehash: filehash,
filename: item.filename,
mimetype: item.mimetype,
allowRedirect: item.allowRedirect,
's3:permission': item['s3:permission'],
};
return file;
}),
};
return [4, http.post(url.start, uploadStartBody)];
case 3:
res1 = _a.sent();
if (!res1.ok) {
message = "Failed during initial file-upload step to [".concat(cellUri, "]");
if (typeof res1.json === 'object' && typeof res1.json.message === 'string') {
message = "".concat(message, ". ").concat(res1.json.message);
}
event.fire({ error: addError(res1.status, message), done: true });
return [2, done(res1.status)];
}
uploadStart = res1.json;
addChanges(uploadStart.data.changes);
fileUploadWait = (0, HttpClientCellFs_upload_files_1.uploadToTarget)({
http: http,
urls: uploadStart.urls.uploads,
files: input,
fire: event.fire,
});
return [4, Promise.all(fileUploadWait)];
case 4:
res2 = _a.sent();
fileUploadSuccesses = res2.filter(function (item) { return item.ok; });
fileUploadErrors = res2
.filter(function (item) { return Boolean(item.error); })
.map(function (item) { return item.error; });
return [4, Promise.all(fileUploadSuccesses.map(function (item) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
var url, filename, body, res, status, ok, json, file;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
url = urls.file(item.uri).uploaded.query({ changes: sendChanges }).toString();
filename = item.filename;
body = { filename: filename };
return [4, http.post(url, body)];
case 1:
res = _a.sent();
status = res.status, ok = res.ok;
json = res.json;
file = json.data;
return [2, { status: status, ok: ok, json: json, file: file, filename: filename }];
}
});
}); }))];
case 5:
res3 = _a.sent();
res3.forEach(function (res) { return addChanges(res.json.changes); });
fileCompleteFails = res3.filter(function (res) { return !res.ok; });
fileCompleteFailErrors = fileCompleteFails.map(function (res) {
var filename = res.filename || 'UNKNOWN';
var message = "Failed while completing upload of file '".concat(filename, "' (").concat(res.status, ")");
var error = { type: 'FILE/upload', filename: filename, message: message };
return error;
});
cellUploadCompleteBody = {};
return [4, http.post(url.complete, cellUploadCompleteBody)];
case 6:
res4 = _a.sent();
cellUploadComplete = res4.json;
files = cellUploadComplete.data.files;
addChanges(cellUploadComplete.data.changes);
tslib_1.__spreadArray(tslib_1.__spreadArray(tslib_1.__spreadArray([], uploadStart.data.errors, true), fileUploadErrors, true), fileCompleteFailErrors, true).forEach(function (error) {
var status = 500;
var message = error.message;
message = error.filename ? "".concat(error.message, ". Filename: ").concat(error.filename) : message;
event.fire({ error: addError(status, message), done: true });
});
status_1 = errors.length === 0 ? 200 : 500;
return [2, done(status_1, { cell: cellUploadComplete.data.cell, files: files })];
case 7:
error_1 = _a.sent();
status_2 = 500;
addError(status_2, error_1.message);
return [2, done(status_2)];
case 8: return [2];
}
});
}); });
promise.event$ = event.$;
return promise;
}
exports.uploadFiles = uploadFiles;