js-uploader
Version:
A JavaScript library for file upload
313 lines • 17.5 kB
JavaScript
"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