UNPKG

js-uploader

Version:
313 lines 17.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.QiniuOSSTaskHandler_v2 = void 0; var tslib_1 = require("tslib"); var CommonsTaskHandler_1 = require("./CommonsTaskHandler"); var interface_1 = require("../../interface"); var rxjs_1 = require("rxjs"); var operators_1 = require("rxjs/operators"); var ajax_1 = require("rxjs/ajax"); var shared_1 = require("../../shared"); var base64_1 = require("../../shared/base64"); var QiniuOSSTaskHandler_v2 = /** @class */ (function (_super) { tslib_1.__extends(QiniuOSSTaskHandler_v2, _super); function QiniuOSSTaskHandler_v2(task, uploaderOptions) { var _this = _super.call(this, task, uploaderOptions) || this; shared_1.Logger.info('🚀 ~ QiniuOSSTaskHandler_v2 ~ constructor :', task, uploaderOptions); if (!QiniuOSSTaskHandler_v2._overwrite) { _this.processUploaderOptions(); } return _this; } QiniuOSSTaskHandler_v2.prototype.enable = function (task) { var ossOptions = this.uploaderOptions.ossOptions; return (ossOptions === null || ossOptions === void 0 ? void 0 : ossOptions.enable(task)) && ossOptions.provider === interface_1.OSSProvider.Qiniu_v2; }; QiniuOSSTaskHandler_v2.prototype.abort = function () { this.abortTaskFiles(); _super.prototype.abort.call(this); return this; }; QiniuOSSTaskHandler_v2.prototype.abortTaskFiles = function () { var _this = this; var sub = rxjs_1.of.apply(void 0, tslib_1.__spread(this.task.fileList)).pipe(operators_1.filter(function (file) { var _a = _this.getFileExtraInfo(file), key = _a.key, uploadId = _a.uploadId; return !!key && !!uploadId && file.status !== interface_1.StatusCode.Complete; }), operators_1.mergeMap(function (file) { var _a = _this.getFileExtraInfo(file), key = _a.key, uploadId = _a.uploadId; return _this.abortMultipartUpload(file, key, uploadId); }, 10)) .subscribe({ complete: function () { sub.unsubscribe(); sub = null; }, }); }; QiniuOSSTaskHandler_v2.prototype.processUploaderOptions = function () { var _this = this; var uploaderOptions = this.uploaderOptions; var ossOptions = uploaderOptions.ossOptions, beforeFileUploadComplete = uploaderOptions.beforeFileUploadComplete, beforeFileUploadStart = uploaderOptions.beforeFileUploadStart, beforeUploadResponseProcess = uploaderOptions.beforeUploadResponseProcess; if (!(ossOptions === null || ossOptions === void 0 ? void 0 : ossOptions.enable) || (ossOptions === null || ossOptions === void 0 ? void 0 : ossOptions.provider) !== interface_1.OSSProvider.Qiniu_v2) { throw new Error('ossOptions配置错误!'); } var chunkSize = uploaderOptions.chunkSize, chunked = uploaderOptions.chunked, requestBodyProcessFn = uploaderOptions.requestBodyProcessFn, requestOptions = uploaderOptions.requestOptions; var url = requestOptions.url, headers = requestOptions.headers, method = requestOptions.method; uploaderOptions.chunkSize = chunked ? Math.max(chunkSize || 0, Math.pow(1024, 2) * 4) : chunkSize; uploaderOptions.requestOptions.method = function (task, upfile, chunk) { if (!_this.enable(task)) { return typeof method === 'function' ? method(task, upfile, chunk) : method; } return 'PUT'; }; uploaderOptions.requestOptions.url = function (task, upfile, chunk) { if (!_this.enable(task)) { return _this.createObserverble(url, task, upfile, chunk).toPromise(); } var baseURL = _this.getRequestBaseURL(upfile); var _a = _this.getFileExtraInfo(upfile), key = _a.key, uploadId = _a.uploadId; key = base64_1.urlSafeBase64Encode(key); return baseURL + "/objects/" + key + "/uploads/" + uploadId + "/" + (chunk.index + 1); }; uploaderOptions.requestOptions.headers = function (task, upfile, chunk) { if (!_this.enable(task)) { return _this.createObserverble(headers, task, upfile, chunk).toPromise(); } var authHeaders = _this.getAuthHeaders(upfile); return tslib_1.__assign({ 'Content-Type': 'application/octet-stream' }, authHeaders); }; uploaderOptions.requestBodyProcessFn = function (task, upfile, chunk, params) { if (_this.enable(task)) { return params.file; } return requestBodyProcessFn === null || requestBodyProcessFn === void 0 ? void 0 : requestBodyProcessFn(task, upfile, chunk, params); }; var overwriteFns = this.getOverwriteFns(); if ((beforeFileUploadComplete === null || beforeFileUploadComplete === void 0 ? void 0 : beforeFileUploadComplete.name) !== overwriteFns.overwriteBeforeFileUploadComplete.name) { uploaderOptions.beforeFileUploadComplete = overwriteFns.overwriteBeforeFileUploadComplete; } if ((beforeFileUploadStart === null || beforeFileUploadStart === void 0 ? void 0 : beforeFileUploadStart.name) !== overwriteFns.overwriteBeforeFileUploadStart.name) { uploaderOptions.beforeFileUploadStart = overwriteFns.overwriteBeforeFileUploadStart; } if ((beforeUploadResponseProcess === null || beforeUploadResponseProcess === void 0 ? void 0 : beforeUploadResponseProcess.name) !== overwriteFns.overwriteBeforeUploadResponseProcess.name) { uploaderOptions.beforeUploadResponseProcess = overwriteFns.overwriteBeforeUploadResponseProcess; } QiniuOSSTaskHandler_v2._overwrite = true; }; QiniuOSSTaskHandler_v2.prototype.getOverwriteFns = function () { var _this = this; var uploaderOptions = this.uploaderOptions; var beforeFileUploadComplete = uploaderOptions.beforeFileUploadComplete, beforeFileUploadStart = uploaderOptions.beforeFileUploadStart, beforeUploadResponseProcess = uploaderOptions.beforeUploadResponseProcess; return { overwriteBeforeFileUploadStart: function (task, upFile) { var extraInfo = _this.getFileExtraInfo(upFile); var beforeUpload = function () { return (beforeFileUploadStart === null || beforeFileUploadStart === void 0 ? void 0 : beforeFileUploadStart(task, upFile)) || Promise.resolve(); }; if (!_this.enable(task)) { return beforeUpload(); } var getObjectKey = function () { var _a, _b; var objectKey = ((_b = (_a = uploaderOptions.ossOptions) === null || _a === void 0 ? void 0 : _a.keyGenerator) === null || _b === void 0 ? void 0 : _b.call(_a, upFile, task)) || Promise.resolve(''); return _this.toObserverble(objectKey).pipe(operators_1.map(function (key) { return (extraInfo.key = key); })); }; var getUpToken = function () { var _a, _b; var upToken = ((_b = (_a = uploaderOptions.ossOptions) === null || _a === void 0 ? void 0 : _a.uptokenGenerator) === null || _b === void 0 ? void 0 : _b.call(_a, upFile, task)) || Promise.resolve(''); return _this.toObserverble(upToken).pipe(operators_1.map(function (token) { return (extraInfo.upToken = token); })); }; var getUploadUrlFn = function (token) { return rxjs_1.from(_this.getUploadUrl(token)).pipe(operators_1.map(function (baseUrl) { return (extraInfo.baseUrl = baseUrl); })); }; var pre = function () { if (extraInfo.uploadId) { return rxjs_1.of(extraInfo); } return rxjs_1.of(null).pipe(operators_1.concatMap(getUpToken), operators_1.concatMap(getUploadUrlFn), operators_1.concatMap(getObjectKey), operators_1.concatMap(function (key) { return _this.createMultipartUpload(upFile, key); }), operators_1.tap(function (_a) { var uploadId = _a.uploadId, bucket = _a.bucket; return Object.assign(extraInfo, { uploadId: uploadId, bucket: bucket }); })); }; return rxjs_1.of(null).pipe(operators_1.concatMap(pre), operators_1.concatMap(beforeUpload)).toPromise(); }, overwriteBeforeFileUploadComplete: function (task, file) { var beforeFileComplete = function () { return (beforeFileUploadComplete === null || beforeFileUploadComplete === void 0 ? void 0 : beforeFileUploadComplete(task, file)) || Promise.resolve(); }; if (!_this.enable(task)) { return beforeFileComplete(); } var completeMultipartUpload = function () { if (file.response.key) { return rxjs_1.of(file.response); } return new rxjs_1.Observable(function (subscriber) { var _a; var _b = _this.getFileExtraInfo(file), key = _b.key, uploadId = _b.uploadId; var parts = (_a = file.chunkList) === null || _a === void 0 ? void 0 : _a.map(function (ck) { return ({ etag: ck.response.etag, partNumber: ck.index + 1, }); }); _this.completeMultipartUpload(file, key, uploadId, parts) .pipe(operators_1.tap(function (res) { file.response = res; })) .subscribe(subscriber); }); }; return rxjs_1.of(null).pipe(operators_1.concatMap(completeMultipartUpload), operators_1.concatMap(beforeFileComplete)).toPromise(); }, overwriteBeforeUploadResponseProcess: function (task, file, chunk, response) { if (!_this.enable(task)) { return Promise.resolve(); } try { response.response = JSON.parse(response.response); } catch (error) { console.error(error); } return (beforeUploadResponseProcess === null || beforeUploadResponseProcess === void 0 ? void 0 : beforeUploadResponseProcess(task, file, chunk, response)) || Promise.resolve(); }, }; }; QiniuOSSTaskHandler_v2.prototype.createMultipartUpload = function (upfile, key) { var _this = this; var authHeaders = this.getAuthHeaders(upfile); var baseURL = this.getRequestBaseURL(upfile); key = base64_1.urlSafeBase64Encode(key); return ajax_1.ajax({ url: baseURL + "/objects/" + key + "/uploads", method: 'POST', headers: tslib_1.__assign({}, authHeaders), }).pipe(operators_1.map(function (res) { var uploadId = (res === null || res === void 0 ? void 0 : res.response).uploadId; var extraInfo = _this.getFileExtraInfo(upfile); var policy = _this.getPutPolicy(extraInfo.upToken); return { bucket: policy.bucket, key: key, uploadId: uploadId }; })); }; QiniuOSSTaskHandler_v2.prototype.uploadPart = function (upfile, key, partNumber, uploadId, body) { var authHeaders = this.getAuthHeaders(upfile); var baseURL = this.getRequestBaseURL(upfile); key = base64_1.urlSafeBase64Encode(key); return ajax_1.ajax({ url: baseURL + "/objects/" + key + "/uploads/" + uploadId + "/partNumber", method: 'PUT', body: body, headers: tslib_1.__assign({ 'Content-Type': 'application/octet-stream' }, authHeaders), }).pipe(operators_1.map(function (res) { var _a = res.response, etag = _a.etag, md5 = _a.md5; return { uploadId: uploadId, key: key, partNumber: partNumber, etag: etag, md5: md5 }; })); }; QiniuOSSTaskHandler_v2.prototype.completeMultipartUpload = function (upfile, key, uploadId, parts) { var authHeaders = this.getAuthHeaders(upfile); var baseURL = this.getRequestBaseURL(upfile); key = base64_1.urlSafeBase64Encode(key); return ajax_1.ajax({ url: baseURL + "/objects/" + key + "/uploads/" + uploadId, method: 'POST', body: { parts: parts.sort(function (a, b) { return a.partNumber - b.partNumber; }), }, headers: tslib_1.__assign({ 'Content-Type': 'application/json' }, authHeaders), }).pipe(operators_1.map(function (res) { var response = res.response || {}; try { response = typeof response === 'string' ? JSON.parse(response) : response; } catch (error) { } return tslib_1.__assign({ uploadId: uploadId }, response); })); }; QiniuOSSTaskHandler_v2.prototype.abortMultipartUpload = function (upfile, key, uploadId) { var authHeaders = this.getAuthHeaders(upfile); var baseURL = this.getRequestBaseURL(upfile); key = base64_1.urlSafeBase64Encode(key); return ajax_1.ajax({ url: baseURL + "/objects/" + key + "/uploads/" + uploadId, method: 'DELETE', headers: tslib_1.__assign({}, authHeaders), responseType: 'text', }).pipe(operators_1.mapTo(true), operators_1.catchError(function () { return rxjs_1.of(false); })); }; QiniuOSSTaskHandler_v2.prototype.getAuthHeaders = function (upfile) { var extraInfo = this.getFileExtraInfo(upfile); return { Authorization: "UpToken " + extraInfo.upToken, }; }; QiniuOSSTaskHandler_v2.prototype.getRequestBaseURL = function (upfile) { var extraInfo = this.getFileExtraInfo(upfile); return extraInfo.baseUrl; }; QiniuOSSTaskHandler_v2.prototype.getFileExtraInfo = function (file) { file.extraInfo = file.extraInfo || {}; return file.extraInfo; }; QiniuOSSTaskHandler_v2.prototype.getUploadUrl = function (token) { return tslib_1.__awaiter(this, void 0, void 0, function () { var reg, protocol, res, putPolicy, data, hosts; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: reg = /^https?:/; protocol = location.protocol; if (!reg.test(protocol)) { res = reg.exec(location.origin); protocol = ((res === null || res === void 0 ? void 0 : res.length) ? res[0] : 'http:'); } putPolicy = this.getPutPolicy(token); return [4 /*yield*/, this.getUpHosts(token, protocol)]; case 1: data = _a.sent(); hosts = data.up.acc.main; return [2 /*return*/, protocol + "//" + hosts[0] + "/buckets/" + putPolicy.bucket]; } }); }); }; QiniuOSSTaskHandler_v2.prototype.getUpHosts = function (token, protocol) { return tslib_1.__awaiter(this, void 0, void 0, function () { var putPolicy, k, hosts, url, ob$; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: putPolicy = this.getPutPolicy(token); k = putPolicy.ak + "--" + putPolicy.bucket; hosts = QiniuOSSTaskHandler_v2.HOST_MAP.get(k); if (!!hosts) return [3 /*break*/, 2]; url = protocol + "//api.qiniu.com/v2/query?ak=" + putPolicy.ak + "&bucket=" + putPolicy.bucket; ob$ = ajax_1.ajax.getJSON(url); return [4 /*yield*/, ob$.toPromise()]; case 1: hosts = _a.sent(); QiniuOSSTaskHandler_v2.HOST_MAP.set(k, hosts); _a.label = 2; case 2: return [2 /*return*/, hosts]; } }); }); }; QiniuOSSTaskHandler_v2.prototype.getPutPolicy = function (token) { var segments = token.split(':'); // token 构造的差异参考:https://github.com/qbox/product/blob/master/kodo/auths/UpToken.md#admin-uptoken-authorization var ak = segments.length > 3 ? segments[1] : segments[0]; var putPolicy = JSON.parse(base64_1.urlSafeBase64Decode(segments[segments.length - 1])); return { ak: ak, bucket: putPolicy.scope.split(':')[0], }; }; QiniuOSSTaskHandler_v2.HOST_MAP = new Map(); QiniuOSSTaskHandler_v2._overwrite = false; return QiniuOSSTaskHandler_v2; }(CommonsTaskHandler_1.CommonsTaskHandler)); exports.QiniuOSSTaskHandler_v2 = QiniuOSSTaskHandler_v2; //# sourceMappingURL=QiniuOSSTaskHandler_v2.js.map