UNPKG

@platform/cell.client

Version:

A strongly typed HTTP client for operating with a CellOS service end-point.

169 lines (168 loc) 9.69 kB
"use strict"; 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;