cos-wx-sdk-v5 1.4.3 → 1.4.5

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 CHANGED
@@ -7,6 +7,32 @@ 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.4](https://github.com/tencentyun/cos-wx-sdk-v5/compare/v1.4.3...v1.4.4) - 2022-10-20
11
+
12
+ - 分块复制支持续传
13
+ - 合法域名校验支持内网域名和.cn域名
14
+
15
+ ### Merged
16
+
17
+ - feat1.4.4 [`#77`](https://github.com/tencentyun/cos-wx-sdk-v5/pull/77)
18
+
19
+ ### Commits
20
+
21
+ - Updated CHANGELOG.md [`cdf8af6`](https://github.com/tencentyun/cos-wx-sdk-v5/commit/cdf8af65f6b44ae1ed8244655073b6e3003535a0)
22
+
23
+ ## [v1.4.3](https://github.com/tencentyun/cos-wx-sdk-v5/compare/v1.4.2...v1.4.3) - 2022-09-22
24
+
25
+ feat
26
+ - 支持sdk内部获取上传文件大小,不再依赖用户传入的FileSize
27
+
28
+ ### Merged
29
+
30
+ - fix: sdk内部获取上传文件大小 [`#76`](https://github.com/tencentyun/cos-wx-sdk-v5/pull/76)
31
+
32
+ ### Commits
33
+
34
+ - Updated CHANGELOG.md [`4652da7`](https://github.com/tencentyun/cos-wx-sdk-v5/commit/4652da7173c8f0fdc1de62955703d6e9e6efd0de)
35
+
10
36
  ## [v1.4.2](https://github.com/tencentyun/cos-wx-sdk-v5/compare/v1.4.1...v1.4.2) - 2022-09-09
11
37
 
12
38
  fix
package/demo/config.js CHANGED
@@ -1,5 +1,5 @@
1
1
  module.exports = {
2
- stsUrl: 'https://example.com/sts.php',
3
- Bucket: 'test-1250000000',
4
- Region: 'ap-guangzhou',
2
+ stsUrl: 'http://127.0.0.1:3000/sts',
3
+ Bucket: 'test-1300555317',
4
+ Region: 'ap-beijing',
5
5
  };
@@ -1,10 +1,15 @@
1
1
  var CosAuth = require('./lib/cos-auth');
2
2
  var config = require('./config');
3
3
 
4
+ var ForcePathStyle = true;
4
5
  var uploadFile = function () {
5
6
  // 请求用到的参数
6
7
  // var prefix = 'https://cos.' + config.Region + '.myqcloud.com/' + config.Bucket + '/'; // 这个是后缀式,签名也要指定 Pathname: '/' + config.Bucket + '/'
7
8
  var prefix = 'https://' + config.Bucket + '.cos.' + config.Region + '.myqcloud.com/';
9
+ if (ForcePathStyle) {
10
+ // 后缀式请求在签名时域名使用地域域名,而不是存储桶域名,具体说明见本文上述“3.后缀式请求”
11
+ prefix = 'https://cos.' + config.Region + '.myqcloud.com/' + config.Bucket + '/';
12
+ }
8
13
 
9
14
  // 对更多字符编码的 url encode 格式
10
15
  var camSafeUrlEncode = function (str) {
@@ -93,13 +98,56 @@ var uploadFile = function () {
93
98
  });
94
99
  };
95
100
 
101
+ var putFile = function (filePath) {
102
+ var Key = filePath.substr(filePath.lastIndexOf('/') + 1); // 这里指定上传的文件名
103
+ var signPathname = '/' + Key; // PutObject 接口 Key 是放在 url 传输,所以请求路径和签名路径是 /Key
104
+ if (ForcePathStyle) {
105
+ // 后缀式请求在签名时用的路径,要包含存储桶名称,具体说明见本文上述“3.后缀式请求”
106
+ signPathname = '/' + config.Bucket + '/' + Key;
107
+ }
108
+ getAuthorization({Method: 'PUT', Pathname: signPathname}, function (AuthData) {
109
+ // 需要从文件临时路径读取出文件内容
110
+ var wxfs = wx.getFileSystemManager();
111
+ wxfs.readFile({
112
+ filePath: filePath,
113
+ success: function (fileRes) {
114
+ var requestTask = wx.request({
115
+ url: prefix + signPathname.substr(signPathname.lastIndexOf('/') + 1),
116
+ method: 'PUT',
117
+ header: {
118
+ 'Authorization': AuthData.Authorization,
119
+ 'x-cos-security-token': AuthData.XCosSecurityToken,
120
+ },
121
+ data: fileRes.data,
122
+ success: function success(res) {
123
+ var url = prefix + camSafeUrlEncode(Key).replace(/%2F/g, '/');
124
+ if (res.statusCode === 200) {
125
+ wx.showModal({title: '上传成功', content: url, showCancel: false});
126
+ } else {
127
+ wx.showModal({title: '上传失败', content: JSON.stringify(response), showCancel: false});
128
+ }
129
+ console.log(res.statusCode);
130
+ console.log(url);
131
+ },
132
+ fail: function fail(response) {
133
+ wx.showModal({title: '上传失败', content: JSON.stringify(response), showCancel: false});
134
+ },
135
+ });
136
+ requestTask.onProgressUpdate(function (res) {
137
+ console.log('正在进度:', res);
138
+ });
139
+ },
140
+ });
141
+ });
142
+ };
143
+
96
144
  // 选择文件
97
145
  wx.chooseImage({
98
146
  count: 1, // 默认9
99
147
  sizeType: ['original'], // 可以指定是原图还是压缩图,这里默认用原图
100
148
  sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
101
149
  success: function (res) {
102
- uploadFile(res.tempFiles[0].path);
150
+ putFile(res.tempFiles[0].path);
103
151
  }
104
152
  })
105
153
  };
@@ -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.3\",\"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\"}}");
6453
+ module.exports = JSON.parse("{\"name\":\"cos-wx-sdk-v5\",\"version\":\"1.4.5\",\"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 = CopySource.match(/^([^.]+-\d+)\.cos(v6)?\.([^.]+)\.[^/]+\/(.+)$/);
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[1];
7652
- var SourceRegion = m[3];
7653
- var SourceKey = decodeURIComponent(m[4]);
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; // 分片复制完成,开始 multipartComplete 操作
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
- self.multipartComplete({
7666
- Bucket: Bucket,
7667
- Region: Region,
7668
- Key: Key,
7669
- UploadId: UploadData.UploadId,
7670
- Parts: UploadData.PartList,
7671
- calledBySdk: 'sliceCopyFile'
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
- Async.eachLimit(UploadData.PartList, ChunkParallel, function (SliceItem, asyncCallback) {
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
- copySliceItem.call(self, {
7694
- Bucket: Bucket,
7695
- Region: Region,
7696
- Key: Key,
7697
- CopySource: CopySource,
7698
- UploadId: UploadData.UploadId,
7699
- PartNumber: PartNumber,
7700
- CopySourceRange: CopySourceRange,
7701
- onProgress: function onProgress(data) {
7702
- FinishSize += data.loaded - preAddSize;
7703
- preAddSize = data.loaded;
7704
-
7705
- _onProgress3({
7706
- loaded: FinishSize,
7707
- total: FileSize
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('get_file_size_finish', function (SourceHeaders) {
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
- var ChunkCount = Math.ceil(FileSize / ChunkSize);
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
- self.multipartInit({
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
- var SourceHeaders = {
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', SourceHeaders);
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 = CopySource.match(/^([^.]+-\d+)\.cos(v6)?\.([^.]+)\.[^/]+\/(.+)$/);
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[1];
10416
- var SourceRegion = m[3];
10417
- var SourceKey = decodeURIComponent(m[4]);
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 = CopySource.match(/^([^.]+-\d+)\.cos(v6)?\.([^.]+)\.[^/]+\/(.+)$/);
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[1];
10459
- var SourceRegion = m[3];
10460
- var SourceKey = decodeURIComponent(m[4]);
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
 
@@ -13529,7 +13649,7 @@ var apiWrapper = function apiWrapper(apiName, apiFn) {
13529
13649
  };
13530
13650
 
13531
13651
  var errMsg = checkParams();
13532
- var isSync = apiName === 'getAuth';
13652
+ var isSync = ['getAuth', 'getObjectUrl'].includes(apiName);
13533
13653
  var Promise = global.Promise;
13534
13654
 
13535
13655
  if (!isSync && Promise && !callback) {
@@ -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;