js-uploader
Version:
A JavaScript library for file upload
213 lines • 11.7 kB
JavaScript
;
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