UNPKG

js-uploader

Version:
213 lines 11.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.QiniuOSSTaskHandler = void 0; var tslib_1 = require("tslib"); var interface_1 = require("../../interface"); var rxjs_1 = require("rxjs"); var ajax_1 = require("rxjs/ajax"); var CommonsTaskHandler_1 = require("./CommonsTaskHandler"); var base64_1 = require("../../shared/base64"); var operators_1 = require("rxjs/operators"); var shared_1 = require("../../shared"); var QiniuOSSTaskHandler = /** @class */ (function (_super) { tslib_1.__extends(QiniuOSSTaskHandler, _super); function QiniuOSSTaskHandler(task, uploaderOptions) { var _this = _super.call(this, task, uploaderOptions) || this; _this.chunkSize = 4 * Math.pow(1024, 2); !QiniuOSSTaskHandler._overwrite && _this.processUploaderOptions(); return _this; } QiniuOSSTaskHandler.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; }; QiniuOSSTaskHandler.prototype.processUploaderOptions = function () { var _this = this; shared_1.Logger.warn('QiniuOSSTaskHandler -> processUploaderOptions -> processUploaderOptions', this); var uploaderOptions = this.uploaderOptions; var ossOptions = uploaderOptions.ossOptions, beforeFileUploadComplete = uploaderOptions.beforeFileUploadComplete, beforeFileUploadStart = uploaderOptions.beforeFileUploadStart; if (!(ossOptions === null || ossOptions === void 0 ? void 0 : ossOptions.enable) || (ossOptions === null || ossOptions === void 0 ? void 0 : ossOptions.provider) !== interface_1.OSSProvider.Qiniu) { throw new Error('ossOptions配置错误!'); } var requestOptions = uploaderOptions.requestOptions, requestBodyProcessFn = uploaderOptions.requestBodyProcessFn; var headers = requestOptions.headers, url = requestOptions.url, method = requestOptions.method; uploaderOptions.chunkSize = this.chunkSize; uploaderOptions.requestOptions.url = function (task, upfile, chunk) { if (_this.enable(task)) { return _this.getUploadBlockUrl(_this.getFileExtraInfo(upfile).host || '', chunk.size); } else { return _this.createObserverble(url, task, upfile, chunk).toPromise(); } }; uploaderOptions.requestOptions.headers = function (task, upfile, chunk) { if (_this.enable(task)) { return { 'Content-Type': 'application/octet-stream', Authorization: "UpToken " + (_this.getFileExtraInfo(upfile).uptoken || ''), }; } else { return _this.createObserverble(headers, task, upfile, chunk).toPromise(); } }; uploaderOptions.requestOptions.method = function (task, upfile, chunk) { if (_this.enable(task)) { return 'POST'; } else { return typeof method === 'function' ? method(task, upfile, chunk) : method; } }; uploaderOptions.requestBodyProcessFn = function (task, upfile, chunk, params) { if (_this.enable(task)) { return params.file; } else { 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; } QiniuOSSTaskHandler._overwrite = true; }; QiniuOSSTaskHandler.prototype.getOverwriteFns = function () { var _this = this; var uploaderOptions = this.uploaderOptions; var beforeFileUploadComplete = uploaderOptions.beforeFileUploadComplete, beforeFileUploadStart = uploaderOptions.beforeFileUploadStart; 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 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.tap(function (token) { extraInfo.uptoken = token; })); }; 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.tap(function (key) { extraInfo.key = key; })); }; var getUploadUrlFn = function (token) { return rxjs_1.from(_this.getUploadUrl(token)).pipe(operators_1.tap(function (host) { extraInfo.host = host; })); }; return rxjs_1.of(null) .pipe(operators_1.concatMap(getUpToken), operators_1.concatMap(function (token) { return getUploadUrlFn(token); }), operators_1.concatMap(getObjectKey), 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 mergeFileRequest = function () { var _a, _b; var extraInfo = _this.getFileExtraInfo(file); var url = _this.getMakeFileUrl(extraInfo.host || '', file.size, (_a = file.extraInfo) === null || _a === void 0 ? void 0 : _a.key); var headers = { 'Content-Type': 'text/plain', Authorization: "UpToken " + (extraInfo.uptoken || ''), }; var body = (_b = file.chunkList) === null || _b === void 0 ? void 0 : _b.map(function (ck) { var response = typeof ck.response === 'string' ? JSON.parse(ck.response) : ck.response; return response === null || response === void 0 ? void 0 : response.ctx; }).join(); return ajax_1.ajax.post(url, body, headers).pipe(operators_1.tap(function (res) { file.response = res.response; })); }; return rxjs_1.of(null).pipe(operators_1.concatMap(mergeFileRequest), operators_1.concatMap(beforeFileComplete)).toPromise(); }, }; }; QiniuOSSTaskHandler.prototype.getFileExtraInfo = function (file) { file.extraInfo = file.extraInfo || {}; return file.extraInfo; }; QiniuOSSTaskHandler.prototype.getUploadUrl = function (token) { return tslib_1.__awaiter(this, void 0, void 0, function () { var reg, protocol, res, 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:'); } return [4 /*yield*/, this.getUpHosts(token, protocol)]; case 1: data = _a.sent(); hosts = data.up.acc.main; return [2 /*return*/, protocol + "//" + hosts[0]]; } }); }); }; QiniuOSSTaskHandler.prototype.getMakeFileUrl = function (host, fileSize, key) { if (key) { return host + "/mkfile/" + fileSize + "/key/" + base64_1.urlSafeBase64Encode(key); } else { return host + "/mkfile/" + fileSize; } }; QiniuOSSTaskHandler.prototype.getUploadBlockUrl = function (host, blockSize) { return host + "/mkblk/" + blockSize; }; QiniuOSSTaskHandler.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.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.HOST_MAP.set(k, hosts); _a.label = 2; case 2: return [2 /*return*/, hosts]; } }); }); }; QiniuOSSTaskHandler.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.HOST_MAP = new Map(); QiniuOSSTaskHandler._overwrite = false; return QiniuOSSTaskHandler; }(CommonsTaskHandler_1.CommonsTaskHandler)); exports.QiniuOSSTaskHandler = QiniuOSSTaskHandler; //# sourceMappingURL=QiniuOSSTaskHandler.js.map