cos-wx-sdk-v5 1.4.3 → 1.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/demo/lib/cos-wx-sdk-v5.js +180 -59
- package/demo/lib/cos-wx-sdk-v5.min.js +2 -2
- package/demo-album/lib/cos-wx-sdk-v5.js +180 -59
- package/demo-album/lib/cos-wx-sdk-v5.min.js +2 -2
- package/package.json +1 -1
- package/src/advance.js +138 -55
- package/src/base.js +8 -8
- package/src/session.js +13 -1
- package/src/util.js +9 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
|
9
9
|
|
|
10
|
+
## [v1.4.3](https://github.com/tencentyun/cos-wx-sdk-v5/compare/v1.4.2...v1.4.3) - 2022-09-22
|
|
11
|
+
|
|
12
|
+
feat
|
|
13
|
+
- 支持sdk内部获取上传文件大小,不再依赖用户传入的FileSize
|
|
14
|
+
|
|
15
|
+
### Merged
|
|
16
|
+
|
|
17
|
+
- fix: sdk内部获取上传文件大小 [`#76`](https://github.com/tencentyun/cos-wx-sdk-v5/pull/76)
|
|
18
|
+
|
|
19
|
+
### Commits
|
|
20
|
+
|
|
21
|
+
- Updated CHANGELOG.md [`4652da7`](https://github.com/tencentyun/cos-wx-sdk-v5/commit/4652da7173c8f0fdc1de62955703d6e9e6efd0de)
|
|
22
|
+
|
|
10
23
|
## [v1.4.2](https://github.com/tencentyun/cos-wx-sdk-v5/compare/v1.4.1...v1.4.2) - 2022-09-09
|
|
11
24
|
|
|
12
25
|
fix
|
|
@@ -6450,7 +6450,7 @@ module.exports = function(module) {
|
|
|
6450
6450
|
/*! exports provided: name, version, description, main, scripts, repository, author, license, dependencies, devDependencies, default */
|
|
6451
6451
|
/***/ (function(module) {
|
|
6452
6452
|
|
|
6453
|
-
module.exports = JSON.parse("{\"name\":\"cos-wx-sdk-v5\",\"version\":\"1.4.
|
|
6453
|
+
module.exports = JSON.parse("{\"name\":\"cos-wx-sdk-v5\",\"version\":\"1.4.4\",\"description\":\"小程序 SDK for [腾讯云对象存储服务](https://cloud.tencent.com/product/cos)\",\"main\":\"demo/lib/cos-wx-sdk-v5.min.js\",\"scripts\":{\"dev\":\"cross-env NODE_ENV=development node build.js --mode=development\",\"build\":\"cross-env NODE_ENV=production node build.js --mode=production\",\"sts.js\":\"node server/sts.js\"},\"repository\":{\"type\":\"git\",\"url\":\"http://github.com/tencentyun/cos-wx-sdk-v5.git\"},\"author\":\"carsonxu\",\"license\":\"ISC\",\"dependencies\":{\"mime\":\"^2.4.6\",\"@xmldom/xmldom\":\"^0.8.2\"},\"devDependencies\":{\"babel-core\":\"6.26.3\",\"babel-loader\":\"8.2.5\",\"@babel/preset-env\":\"7.16.11\",\"body-parser\":\"^1.18.3\",\"cross-env\":\"^7.0.3\",\"express\":\"^4.17.1\",\"qcloud-cos-sts\":\"^3.0.2\",\"terser-webpack-plugin\":\"4.2.3\",\"webpack\":\"4.46.0\",\"webpack-cli\":\"4.10.0\"}}");
|
|
6454
6454
|
|
|
6455
6455
|
/***/ }),
|
|
6456
6456
|
|
|
@@ -7639,7 +7639,7 @@ function sliceCopyFile(params, callback) {
|
|
|
7639
7639
|
var Region = params.Region;
|
|
7640
7640
|
var Key = params.Key;
|
|
7641
7641
|
var CopySource = params.CopySource;
|
|
7642
|
-
var m =
|
|
7642
|
+
var m = util.getSourceParams.call(this, CopySource);
|
|
7643
7643
|
|
|
7644
7644
|
if (!m) {
|
|
7645
7645
|
callback({
|
|
@@ -7648,34 +7648,56 @@ function sliceCopyFile(params, callback) {
|
|
|
7648
7648
|
return;
|
|
7649
7649
|
}
|
|
7650
7650
|
|
|
7651
|
-
var SourceBucket = m
|
|
7652
|
-
var SourceRegion = m
|
|
7653
|
-
var SourceKey = decodeURIComponent(m
|
|
7651
|
+
var SourceBucket = m.Bucket;
|
|
7652
|
+
var SourceRegion = m.Region;
|
|
7653
|
+
var SourceKey = decodeURIComponent(m.Key);
|
|
7654
7654
|
var CopySliceSize = params.CopySliceSize === undefined ? self.options.CopySliceSize : params.CopySliceSize;
|
|
7655
7655
|
CopySliceSize = Math.max(0, CopySliceSize);
|
|
7656
7656
|
var ChunkSize = params.CopyChunkSize || this.options.CopyChunkSize;
|
|
7657
7657
|
var ChunkParallel = this.options.CopyChunkParallelLimit;
|
|
7658
|
+
var ChunkRetryTimes = this.options.ChunkRetryTimes + 1;
|
|
7659
|
+
var ChunkCount = 0;
|
|
7658
7660
|
var FinishSize = 0;
|
|
7659
7661
|
var FileSize;
|
|
7660
7662
|
|
|
7661
|
-
var _onProgress3;
|
|
7663
|
+
var _onProgress3;
|
|
7662
7664
|
|
|
7665
|
+
var SourceResHeaders = {};
|
|
7666
|
+
var SourceHeaders = {};
|
|
7667
|
+
var TargetHeader = {}; // 分片复制完成,开始 multipartComplete 操作
|
|
7663
7668
|
|
|
7664
7669
|
ep.on('copy_slice_complete', function (UploadData) {
|
|
7665
|
-
|
|
7666
|
-
|
|
7667
|
-
|
|
7668
|
-
|
|
7669
|
-
|
|
7670
|
-
|
|
7671
|
-
|
|
7670
|
+
var metaHeaders = {};
|
|
7671
|
+
util.each(params.Headers, function (val, k) {
|
|
7672
|
+
if (k.toLowerCase().indexOf('x-cos-meta-') === 0) metaHeaders[k] = val;
|
|
7673
|
+
});
|
|
7674
|
+
var Parts = util.map(UploadData.PartList, function (item) {
|
|
7675
|
+
return {
|
|
7676
|
+
PartNumber: item.PartNumber,
|
|
7677
|
+
ETag: item.ETag
|
|
7678
|
+
};
|
|
7679
|
+
}); // 完成上传的请求也做重试
|
|
7680
|
+
|
|
7681
|
+
Async.retry(ChunkRetryTimes, function (tryCallback) {
|
|
7682
|
+
self.multipartComplete({
|
|
7683
|
+
Bucket: Bucket,
|
|
7684
|
+
Region: Region,
|
|
7685
|
+
Key: Key,
|
|
7686
|
+
UploadId: UploadData.UploadId,
|
|
7687
|
+
Parts: Parts,
|
|
7688
|
+
calledBySdk: 'sliceCopyFile'
|
|
7689
|
+
}, tryCallback);
|
|
7672
7690
|
}, function (err, data) {
|
|
7691
|
+
session.removeUsing(UploadData.UploadId); // 标记 UploadId 没被使用了,因为复制没提供重试,所以只要出错,就是 UploadId 停用了。
|
|
7692
|
+
|
|
7673
7693
|
if (err) {
|
|
7674
7694
|
_onProgress3(null, true);
|
|
7675
7695
|
|
|
7676
7696
|
return callback(err);
|
|
7677
7697
|
}
|
|
7678
7698
|
|
|
7699
|
+
session.removeUploadId(UploadData.UploadId);
|
|
7700
|
+
|
|
7679
7701
|
_onProgress3({
|
|
7680
7702
|
loaded: FileSize,
|
|
7681
7703
|
total: FileSize
|
|
@@ -7685,28 +7707,43 @@ function sliceCopyFile(params, callback) {
|
|
|
7685
7707
|
});
|
|
7686
7708
|
});
|
|
7687
7709
|
ep.on('get_copy_data_finish', function (UploadData) {
|
|
7688
|
-
|
|
7710
|
+
// 处理 UploadId 缓存
|
|
7711
|
+
var uuid = session.getCopyFileId(CopySource, SourceResHeaders, ChunkSize, Bucket, Key);
|
|
7712
|
+
uuid && session.saveUploadId(uuid, UploadData.UploadId, self.options.UploadIdCacheLimit); // 缓存 UploadId
|
|
7713
|
+
|
|
7714
|
+
session.setUsing(UploadData.UploadId); // 标记 UploadId 为正在使用
|
|
7715
|
+
|
|
7716
|
+
var needCopySlices = util.filter(UploadData.PartList, function (SliceItem) {
|
|
7717
|
+
if (SliceItem['Uploaded']) {
|
|
7718
|
+
FinishSize += SliceItem['PartNumber'] >= ChunkCount ? FileSize % ChunkSize || ChunkSize : ChunkSize;
|
|
7719
|
+
}
|
|
7720
|
+
|
|
7721
|
+
return !SliceItem['Uploaded'];
|
|
7722
|
+
});
|
|
7723
|
+
Async.eachLimit(needCopySlices, ChunkParallel, function (SliceItem, asyncCallback) {
|
|
7689
7724
|
var PartNumber = SliceItem.PartNumber;
|
|
7690
7725
|
var CopySourceRange = SliceItem.CopySourceRange;
|
|
7691
7726
|
var currentSize = SliceItem.end - SliceItem.start;
|
|
7692
7727
|
var preAddSize = 0;
|
|
7693
|
-
|
|
7694
|
-
|
|
7695
|
-
|
|
7696
|
-
|
|
7697
|
-
|
|
7698
|
-
|
|
7699
|
-
|
|
7700
|
-
|
|
7701
|
-
|
|
7702
|
-
|
|
7703
|
-
|
|
7704
|
-
|
|
7705
|
-
|
|
7706
|
-
|
|
7707
|
-
|
|
7708
|
-
|
|
7709
|
-
|
|
7728
|
+
Async.retry(ChunkRetryTimes, function (tryCallback) {
|
|
7729
|
+
copySliceItem.call(self, {
|
|
7730
|
+
Bucket: Bucket,
|
|
7731
|
+
Region: Region,
|
|
7732
|
+
Key: Key,
|
|
7733
|
+
CopySource: CopySource,
|
|
7734
|
+
UploadId: UploadData.UploadId,
|
|
7735
|
+
PartNumber: PartNumber,
|
|
7736
|
+
CopySourceRange: CopySourceRange,
|
|
7737
|
+
onProgress: function onProgress(data) {
|
|
7738
|
+
FinishSize += data.loaded - preAddSize;
|
|
7739
|
+
preAddSize = data.loaded;
|
|
7740
|
+
|
|
7741
|
+
_onProgress3({
|
|
7742
|
+
loaded: FinishSize,
|
|
7743
|
+
total: FileSize
|
|
7744
|
+
});
|
|
7745
|
+
}
|
|
7746
|
+
}, tryCallback);
|
|
7710
7747
|
}, function (err, data) {
|
|
7711
7748
|
if (err) {
|
|
7712
7749
|
return asyncCallback(err);
|
|
@@ -7723,6 +7760,8 @@ function sliceCopyFile(params, callback) {
|
|
|
7723
7760
|
});
|
|
7724
7761
|
}, function (err) {
|
|
7725
7762
|
if (err) {
|
|
7763
|
+
session.removeUsing(UploadData.UploadId); // 标记 UploadId 没被使用了,因为复制没提供重试,所以只要出错,就是 UploadId 停用了。
|
|
7764
|
+
|
|
7726
7765
|
_onProgress3(null, true);
|
|
7727
7766
|
|
|
7728
7767
|
return callback(err);
|
|
@@ -7731,7 +7770,76 @@ function sliceCopyFile(params, callback) {
|
|
|
7731
7770
|
ep.emit('copy_slice_complete', UploadData);
|
|
7732
7771
|
});
|
|
7733
7772
|
});
|
|
7734
|
-
ep.on('
|
|
7773
|
+
ep.on('get_chunk_size_finish', function () {
|
|
7774
|
+
var createNewUploadId = function createNewUploadId() {
|
|
7775
|
+
self.multipartInit({
|
|
7776
|
+
Bucket: Bucket,
|
|
7777
|
+
Region: Region,
|
|
7778
|
+
Key: Key,
|
|
7779
|
+
Headers: TargetHeader
|
|
7780
|
+
}, function (err, data) {
|
|
7781
|
+
if (err) return callback(err);
|
|
7782
|
+
params.UploadId = data.UploadId;
|
|
7783
|
+
ep.emit('get_copy_data_finish', {
|
|
7784
|
+
UploadId: params.UploadId,
|
|
7785
|
+
PartList: params.PartList
|
|
7786
|
+
});
|
|
7787
|
+
});
|
|
7788
|
+
}; // 在本地找可用的 UploadId
|
|
7789
|
+
|
|
7790
|
+
|
|
7791
|
+
var uuid = session.getCopyFileId(CopySource, SourceResHeaders, ChunkSize, Bucket, Key);
|
|
7792
|
+
var LocalUploadIdList = session.getUploadIdList(uuid);
|
|
7793
|
+
if (!uuid || !LocalUploadIdList) return createNewUploadId();
|
|
7794
|
+
|
|
7795
|
+
var next = function next(index) {
|
|
7796
|
+
// 如果本地找不到可用 UploadId,再一个个遍历校验远端
|
|
7797
|
+
if (index >= LocalUploadIdList.length) return createNewUploadId();
|
|
7798
|
+
var UploadId = LocalUploadIdList[index]; // 如果正在被使用,跳过
|
|
7799
|
+
|
|
7800
|
+
if (session.using[UploadId]) return next(index + 1); // 判断 UploadId 是否存在线上
|
|
7801
|
+
|
|
7802
|
+
wholeMultipartListPart.call(self, {
|
|
7803
|
+
Bucket: Bucket,
|
|
7804
|
+
Region: Region,
|
|
7805
|
+
Key: Key,
|
|
7806
|
+
UploadId: UploadId
|
|
7807
|
+
}, function (err, PartListData) {
|
|
7808
|
+
if (err) {
|
|
7809
|
+
// 如果 UploadId 获取会出错,跳过并删除
|
|
7810
|
+
session.removeUploadId(UploadId);
|
|
7811
|
+
next(index + 1);
|
|
7812
|
+
} else {
|
|
7813
|
+
// 如果异步回来 UploadId 已经被用了,也跳过
|
|
7814
|
+
if (session.using[UploadId]) return next(index + 1); // 找到可用 UploadId
|
|
7815
|
+
|
|
7816
|
+
var finishETagMap = {};
|
|
7817
|
+
var offset = 0;
|
|
7818
|
+
util.each(PartListData.PartList, function (PartItem) {
|
|
7819
|
+
var size = parseInt(PartItem.Size);
|
|
7820
|
+
var end = offset + size - 1;
|
|
7821
|
+
finishETagMap[PartItem.PartNumber + '|' + offset + '|' + end] = PartItem.ETag;
|
|
7822
|
+
offset += size;
|
|
7823
|
+
});
|
|
7824
|
+
util.each(params.PartList, function (PartItem) {
|
|
7825
|
+
var ETag = finishETagMap[PartItem.PartNumber + '|' + PartItem.start + '|' + PartItem.end];
|
|
7826
|
+
|
|
7827
|
+
if (ETag) {
|
|
7828
|
+
PartItem.ETag = ETag;
|
|
7829
|
+
PartItem.Uploaded = true;
|
|
7830
|
+
}
|
|
7831
|
+
});
|
|
7832
|
+
ep.emit('get_copy_data_finish', {
|
|
7833
|
+
UploadId: UploadId,
|
|
7834
|
+
PartList: params.PartList
|
|
7835
|
+
});
|
|
7836
|
+
}
|
|
7837
|
+
});
|
|
7838
|
+
};
|
|
7839
|
+
|
|
7840
|
+
next(0);
|
|
7841
|
+
});
|
|
7842
|
+
ep.on('get_file_size_finish', function () {
|
|
7735
7843
|
// 控制分片大小
|
|
7736
7844
|
(function () {
|
|
7737
7845
|
var SIZE = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 1024 * 2, 1024 * 4, 1024 * 5];
|
|
@@ -7743,7 +7851,7 @@ function sliceCopyFile(params, callback) {
|
|
|
7743
7851
|
}
|
|
7744
7852
|
|
|
7745
7853
|
params.ChunkSize = ChunkSize = Math.max(ChunkSize, AutoChunkSize);
|
|
7746
|
-
|
|
7854
|
+
ChunkCount = Math.ceil(FileSize / ChunkSize);
|
|
7747
7855
|
var list = [];
|
|
7748
7856
|
|
|
7749
7857
|
for (var partNumber = 1; partNumber <= ChunkCount; partNumber++) {
|
|
@@ -7797,20 +7905,7 @@ function sliceCopyFile(params, callback) {
|
|
|
7797
7905
|
delete TargetHeader['x-cos-copy-source-If-Unmodified-Since'];
|
|
7798
7906
|
delete TargetHeader['x-cos-copy-source-If-Match'];
|
|
7799
7907
|
delete TargetHeader['x-cos-copy-source-If-None-Match'];
|
|
7800
|
-
|
|
7801
|
-
Bucket: Bucket,
|
|
7802
|
-
Region: Region,
|
|
7803
|
-
Key: Key,
|
|
7804
|
-
Headers: TargetHeader,
|
|
7805
|
-
calledBySdk: 'sliceCopyFile'
|
|
7806
|
-
}, function (err, data) {
|
|
7807
|
-
if (err) {
|
|
7808
|
-
return callback(err);
|
|
7809
|
-
}
|
|
7810
|
-
|
|
7811
|
-
params.UploadId = data.UploadId;
|
|
7812
|
-
ep.emit('get_copy_data_finish', params);
|
|
7813
|
-
});
|
|
7908
|
+
ep.emit('get_chunk_size_finish');
|
|
7814
7909
|
}); // 获取远端复制源文件的大小
|
|
7815
7910
|
|
|
7816
7911
|
self.headObject({
|
|
@@ -7862,7 +7957,8 @@ function sliceCopyFile(params, callback) {
|
|
|
7862
7957
|
});
|
|
7863
7958
|
} else {
|
|
7864
7959
|
var resHeaders = data.headers;
|
|
7865
|
-
|
|
7960
|
+
SourceResHeaders = resHeaders;
|
|
7961
|
+
SourceHeaders = {
|
|
7866
7962
|
'Cache-Control': resHeaders['cache-control'],
|
|
7867
7963
|
'Content-Disposition': resHeaders['content-disposition'],
|
|
7868
7964
|
'Content-Encoding': resHeaders['content-encoding'],
|
|
@@ -7877,7 +7973,7 @@ function sliceCopyFile(params, callback) {
|
|
|
7877
7973
|
SourceHeaders[k] = v;
|
|
7878
7974
|
}
|
|
7879
7975
|
});
|
|
7880
|
-
ep.emit('get_file_size_finish'
|
|
7976
|
+
ep.emit('get_file_size_finish');
|
|
7881
7977
|
}
|
|
7882
7978
|
});
|
|
7883
7979
|
} // 复制指定分片
|
|
@@ -10403,7 +10499,7 @@ function putObjectCopy(params, callback) {
|
|
|
10403
10499
|
var headers = params.Headers;
|
|
10404
10500
|
if (!headers['Cache-Control'] && !!headers['cache-control']) headers['Cache-Control'] = '';
|
|
10405
10501
|
var CopySource = params.CopySource || '';
|
|
10406
|
-
var m =
|
|
10502
|
+
var m = util.getSourceParams.call(this, CopySource);
|
|
10407
10503
|
|
|
10408
10504
|
if (!m) {
|
|
10409
10505
|
callback({
|
|
@@ -10412,9 +10508,9 @@ function putObjectCopy(params, callback) {
|
|
|
10412
10508
|
return;
|
|
10413
10509
|
}
|
|
10414
10510
|
|
|
10415
|
-
var SourceBucket = m
|
|
10416
|
-
var SourceRegion = m
|
|
10417
|
-
var SourceKey = decodeURIComponent(m
|
|
10511
|
+
var SourceBucket = m.Bucket;
|
|
10512
|
+
var SourceRegion = m.Region;
|
|
10513
|
+
var SourceKey = decodeURIComponent(m.Key);
|
|
10418
10514
|
submitRequest.call(this, {
|
|
10419
10515
|
Scope: [{
|
|
10420
10516
|
action: 'name/cos:GetObject',
|
|
@@ -10446,7 +10542,7 @@ function putObjectCopy(params, callback) {
|
|
|
10446
10542
|
|
|
10447
10543
|
function uploadPartCopy(params, callback) {
|
|
10448
10544
|
var CopySource = params.CopySource || '';
|
|
10449
|
-
var m =
|
|
10545
|
+
var m = util.getSourceParams.call(this, CopySource);
|
|
10450
10546
|
|
|
10451
10547
|
if (!m) {
|
|
10452
10548
|
callback({
|
|
@@ -10455,9 +10551,9 @@ function uploadPartCopy(params, callback) {
|
|
|
10455
10551
|
return;
|
|
10456
10552
|
}
|
|
10457
10553
|
|
|
10458
|
-
var SourceBucket = m
|
|
10459
|
-
var SourceRegion = m
|
|
10460
|
-
var SourceKey = decodeURIComponent(m
|
|
10554
|
+
var SourceBucket = m.Bucket;
|
|
10555
|
+
var SourceRegion = m.Region;
|
|
10556
|
+
var SourceKey = decodeURIComponent(m.Key);
|
|
10461
10557
|
submitRequest.call(this, {
|
|
10462
10558
|
Scope: [{
|
|
10463
10559
|
action: 'name/cos:GetObject',
|
|
@@ -12223,7 +12319,7 @@ var getCache = function getCache() {
|
|
|
12223
12319
|
|
|
12224
12320
|
var setCache = function setCache() {
|
|
12225
12321
|
try {
|
|
12226
|
-
wx.setStorageSync(cacheKey, JSON.stringify(cache));
|
|
12322
|
+
if (cache.length) wx.setStorageSync(cacheKey, JSON.stringify(cache));else wx.removeStorageSync(cacheKey);
|
|
12227
12323
|
} catch (e) {}
|
|
12228
12324
|
};
|
|
12229
12325
|
|
|
@@ -12273,6 +12369,18 @@ var mod = {
|
|
|
12273
12369
|
return null;
|
|
12274
12370
|
}
|
|
12275
12371
|
},
|
|
12372
|
+
// 用上传参数生成哈希值
|
|
12373
|
+
getCopyFileId: function getCopyFileId(copySource, sourceHeaders, ChunkSize, Bucket, Key) {
|
|
12374
|
+
var size = sourceHeaders['content-length'];
|
|
12375
|
+
var etag = sourceHeaders.etag || '';
|
|
12376
|
+
var lastModified = sourceHeaders['last-modified'];
|
|
12377
|
+
|
|
12378
|
+
if (copySource && ChunkSize) {
|
|
12379
|
+
return util.md5([copySource, size, etag, lastModified, ChunkSize, Bucket, Key].join('::'));
|
|
12380
|
+
} else {
|
|
12381
|
+
return null;
|
|
12382
|
+
}
|
|
12383
|
+
},
|
|
12276
12384
|
// 获取文件对应的 UploadId 列表
|
|
12277
12385
|
getUploadIdList: function getUploadIdList(uuid) {
|
|
12278
12386
|
if (!uuid) return null;
|
|
@@ -13175,6 +13283,18 @@ var getAuth = function getAuth(opt) {
|
|
|
13175
13283
|
return authorization;
|
|
13176
13284
|
};
|
|
13177
13285
|
|
|
13286
|
+
var getSourceParams = function getSourceParams(source) {
|
|
13287
|
+
var parser = this.options.CopySourceParser;
|
|
13288
|
+
if (parser) return parser(source);
|
|
13289
|
+
var m = source.match(/^([^.]+-\d+)\.cos(v6|-cdc|-internal)?\.([^.]+)\.((myqcloud\.com)|(tencentcos\.cn))\/(.+)$/);
|
|
13290
|
+
if (!m) return null;
|
|
13291
|
+
return {
|
|
13292
|
+
Bucket: m[1],
|
|
13293
|
+
Region: m[3],
|
|
13294
|
+
Key: m[7]
|
|
13295
|
+
};
|
|
13296
|
+
};
|
|
13297
|
+
|
|
13178
13298
|
var noop = function noop() {}; // 清除对象里值为的 undefined 或 null 的属性
|
|
13179
13299
|
|
|
13180
13300
|
|
|
@@ -13838,7 +13958,8 @@ var util = {
|
|
|
13838
13958
|
compareVersion: compareVersion,
|
|
13839
13959
|
canFileSlice: canFileSlice,
|
|
13840
13960
|
isCIHost: isCIHost,
|
|
13841
|
-
error: error
|
|
13961
|
+
error: error,
|
|
13962
|
+
getSourceParams: getSourceParams
|
|
13842
13963
|
};
|
|
13843
13964
|
module.exports = util;
|
|
13844
13965
|
xml2json;
|