Skip to content

Commit 7ceb417

Browse files
committed
Merge remote-tracking branch 'origin/master'
2 parents 03bf11c + a6791a2 commit 7ceb417

File tree

9 files changed

+348
-147
lines changed

9 files changed

+348
-147
lines changed

CHANGELOG.md

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,59 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
99

10+
## [v2.9.0](https://github.com/tencentyun/cos-nodejs-sdk-v5/compare/v2.8.6...v2.9.0) - 2021-01-21
11+
12+
* 增加 d.ts 支持
13+
* 优化错误格式,返回标准 Error 对象
14+
* 优化鉴权格式,优化凭证错误识别
15+
* 补充用例
16+
17+
### Commits
18+
19+
- 优化错误格式,优化鉴权格式 [`54c7ff6`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/54c7ff6138f2a3eee36a2501ef0ac3022fad2169)
20+
- 优化错误格式,优化鉴权格式 [`5a713ed`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/5a713ed6a3d96248b337909d14f478079ac61a29)
21+
- update test case [`65c656f`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/65c656f2639263195620709a04bd57eae00b3070)
22+
- update d.ts [`ad1e41f`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/ad1e41fbcd6a6e97442231e71226db97b0fd215a)
23+
- complete 接口 xml body 去掉空格 [`1f4bfe8`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/1f4bfe8c984ef355561c562844e570fa2a60a799)
24+
- update demo [`2550858`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/25508584b4299f3627e0d105ae40565983d5a2d6)
25+
26+
## [v2.8.6](https://github.com/tencentyun/cos-nodejs-sdk-v5/compare/v2.8.5...v2.8.6) - 2021-01-13
27+
28+
### Commits
29+
30+
- 增加 d.ts [`8c230a4`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/8c230a4b905ad5ea3ceebfa629ddb53d30ae2025)
31+
- 增加 d.ts 增加示例 [`2a4459a`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/2a4459aa32c4d011698d2a317cd23efe8489774f)
32+
- 整理所有参数说明 [`d67b249`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/d67b249c62ef87773c12bc4d755ceee3b14422f0)
33+
- 补充 domain、origin、inventory、accelerate 接口说明 [`5ece2ec`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/5ece2ecaf09ba57d0116ee19024ab69ee43c0388)
34+
- 整理参数和返回值 [`42c0a47`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/42c0a470f8e54bab2f5569e08ec90aa023c35347)
35+
- Bucket Region Key 改为继承 [`333f855`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/333f8552f202a605133c78aa10c0bb0375d197f8)
36+
- 补充 API 文档链接 [`8e65ca9`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/8e65ca9555f1be59b7de14253906afc01f0e2039)
37+
- 修改 .d.ts [`f2011ad`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/f2011ad24159fc12b67e201783bc8ad758ff78ab)
38+
- 修改 demo 错误 [`0715e0e`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/0715e0e526c4643283b70f3cdd1de4f46fbe0458)
39+
- 修改变量名称 [`b6ec13a`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/b6ec13a7b5022a6e7a525d6124a82820fca3a1a1)
40+
- 修改 .d.ts [`85250b2`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/85250b207eec5bc01d7e693dd0e95f476fe98768)
41+
- 修改描述 [`c71290c`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/c71290c22d61d2952b7275bc40e89fda32970b4e)
42+
- 修改引用错误 [`23c5c66`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/23c5c66afd68898e57f531e06607a50fb55acc78)
43+
- 修改注释 [`dbe64be`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/dbe64be073121cda855349b1b50623815309cde0)
44+
- 修改用例 [`8663a34`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/8663a34875843fe806112127a5a9dbc7d9d1292a)
45+
- 修改参数错误 [`61d4de5`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/61d4de5438ac7f72fdbefbaaf38fa9b229c64407)
46+
47+
## [v2.8.5](https://github.com/tencentyun/cos-nodejs-sdk-v5/compare/v2.8.4...v2.8.5) - 2020-12-31
48+
49+
### Commits
50+
51+
- 修复传入小写 cache-control 且被代理串改后,返回 403 签名错误 [`d3052a5`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/d3052a52341a4e4ce87d571d726cc2971320f411)
52+
53+
## [v2.8.4](https://github.com/tencentyun/cos-nodejs-sdk-v5/compare/v2.8.3...v2.8.4) - 2020-12-24
54+
55+
### Commits
56+
57+
- Updated CHANGELOG.md [`f48f556`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/f48f556653c81d1e131e5bcc3180d85181bcdb21)
58+
- add auto changelog workflow [`be3875f`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/be3875fdaa4db835c69ac315255ec7953582188a)
59+
- 修复使用 v4 签名判断错误,nodejs 不支持 atob [`c9f9243`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/c9f9243c16cdfdfa30d2de78e29d79cb98299caa)
60+
- update demo [`caeef74`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/caeef743b61b9da8548b5a274c169da3f0b91132)
61+
- update demo [`959b842`](https://github.com/tencentyun/cos-nodejs-sdk-v5/commit/959b842afaecebfc8e72c1d2032530d03bfddf9d)
62+
1063
## [v2.8.3](https://github.com/tencentyun/cos-nodejs-sdk-v5/compare/v2.5.14...v2.8.3) - 2020-11-19
1164

1265
### Commits

index.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ declare namespace COS {
3131
/** COS API 使用的时间字符串,为 ISO8601 格式,例如2019-05-24T10:56:40Z */
3232
type IsoDateTime = string;
3333
/** 请求里的 Url Query 参数 */
34-
type Query = object;
34+
type Query = Record<string, any>;
3535
/** 请求里的 Header 参数 */
36-
type Headers = object;
36+
type Headers = Record<string, any>;
3737
/** 一个字符的分隔符,常用 / 字符,用于对对象键进行分组。所有对象键中从 prefix 或从头(如未指定 prefix)到首个 delimiter 之间相同的部分将作为 CommonPrefixes 下的一个 Prefix 节点。被分组的对象键不再出现在后续对象列表中 */
3838
type Delimiter = '/' | string;
3939
/** 规定返回值的编码方式,可选值:url,代表返回的对象键为 URL 编码(百分号编码)后的值,例如“腾讯云”将被编码为%E8%85%BE%E8%AE%AF%E4%BA%91 */

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "cos-nodejs-sdk-v5",
3-
"version": "2.9.0",
3+
"version": "2.9.1",
44
"description": "cos nodejs sdk v5",
55
"main": "index.js",
66
"types": "types",
@@ -9,6 +9,7 @@
99
"demo-sts": "node demo/demo-sts.js",
1010
"demo-sts-scope": "node demo/demo-sts-scope.js",
1111
"test": "mocha test/test.js",
12+
"nyc": "nyc --reporter=html mocha test/test.js",
1213
"csp": "mocha test/csp.js"
1314
},
1415
"repository": {

sdk/advance.js

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,18 @@ function sliceUploadFile(params, callback) {
3535

3636
// 上传分块完成,开始 uploadSliceComplete 操作
3737
ep.on('upload_slice_complete', function (UploadData) {
38+
var metaHeaders = {};
39+
util.each(params.Headers, function (val, k) {
40+
var shortKey = k.toLowerCase();
41+
if (shortKey.indexOf('x-cos-meta-') === 0 || shortKey === 'pic-operations') metaHeaders[k] = val;
42+
});
3843
uploadSliceComplete.call(self, {
3944
Bucket: Bucket,
4045
Region: Region,
4146
Key: Key,
4247
UploadId: UploadData.UploadId,
4348
SliceList: UploadData.SliceList,
49+
Headers: metaHeaders,
4450
}, function (err, data) {
4551
if (!self._isRunningTask(TaskId)) return;
4652
session.removeUsing(UploadData.UploadId);
@@ -620,6 +626,7 @@ function uploadSliceComplete(params, callback) {
620626
var SliceList = params.SliceList;
621627
var self = this;
622628
var ChunkRetryTimes = this.options.ChunkRetryTimes + 1;
629+
var Headers = params.Headers;
623630
var Parts = SliceList.map(function (item) {
624631
return {
625632
PartNumber: item.PartNumber,
@@ -633,7 +640,8 @@ function uploadSliceComplete(params, callback) {
633640
Region: Region,
634641
Key: Key,
635642
UploadId: UploadId,
636-
Parts: Parts
643+
Parts: Parts,
644+
Headers: Headers,
637645
}, tryCallback);
638646
}, function (err, data) {
639647
callback(err, data);
@@ -890,6 +898,10 @@ function sliceCopyFile(params, callback) {
890898

891899
// 分片复制完成,开始 multipartComplete 操作
892900
ep.on('copy_slice_complete', function (UploadData) {
901+
var metaHeaders = {};
902+
util.each(params.Headers, function (val, k) {
903+
if (k.toLowerCase().indexOf('x-cos-meta-') === 0) metaHeaders[k] = val;
904+
});
893905
var Parts = util.map(UploadData.PartList, function (item) {
894906
return {
895907
PartNumber: item.PartNumber,
@@ -917,7 +929,6 @@ function sliceCopyFile(params, callback) {
917929
var PartNumber = SliceItem.PartNumber;
918930
var CopySourceRange = SliceItem.CopySourceRange;
919931
var currentSize = SliceItem.end - SliceItem.start;
920-
var preAddSize = 0;
921932

922933
copySliceItem.call(self, {
923934
Bucket: Bucket,
@@ -927,16 +938,10 @@ function sliceCopyFile(params, callback) {
927938
UploadId: UploadData.UploadId,
928939
PartNumber: PartNumber,
929940
CopySourceRange: CopySourceRange,
930-
onProgress: function (data) {
931-
FinishSize += data.loaded - preAddSize;
932-
preAddSize = data.loaded;
933-
onProgress({loaded: FinishSize, total: FileSize});
934-
}
935941
},function (err,data) {
936942
if (err) return asyncCallback(err);
943+
FinishSize += currentSize;
937944
onProgress({loaded: FinishSize, total: FileSize});
938-
939-
FinishSize += currentSize - preAddSize;
940945
SliceItem.ETag = data.ETag;
941946
asyncCallback(err || null, data);
942947
});
@@ -1099,7 +1104,6 @@ function copySliceItem(params, callback) {
10991104
UploadId: UploadId,
11001105
PartNumber:PartNumber,
11011106
CopySourceRange:CopySourceRange,
1102-
onProgress:params.onProgress,
11031107
},function (err,data) {
11041108
tryCallback(err || null, data);
11051109
})

sdk/base.js

Lines changed: 31 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ function putBucketCors(params, callback) {
322322
var CORSRules = CORSConfiguration['CORSRules'] || params['CORSRules'] || [];
323323
CORSRules = util.clone(util.isArray(CORSRules) ? CORSRules : [CORSRules]);
324324
util.each(CORSRules, function (rule) {
325-
util.each(['AllowedOrigin', 'AllowedHeader', 'AllowedMethod', 'ExposeHeader'], function (key, k) {
325+
util.each(['AllowedOrigin', 'AllowedHeader', 'AllowedMethod', 'ExposeHeader'], function (key) {
326326
var sKey = key + 's';
327327
var val = rule[sKey] || rule[key] || [];
328328
delete rule[sKey];
@@ -390,7 +390,7 @@ function getBucketCors(params, callback) {
390390
CORSRules = util.clone(util.isArray(CORSRules) ? CORSRules : [CORSRules]);
391391

392392
util.each(CORSRules, function (rule) {
393-
util.each(['AllowedOrigin', 'AllowedHeader', 'AllowedMethod', 'ExposeHeader'], function (key, j) {
393+
util.each(['AllowedOrigin', 'AllowedHeader', 'AllowedMethod', 'ExposeHeader'], function (key) {
394394
var sKey = key + 's';
395395
var val = rule[sKey] || rule[key] || [];
396396
delete rule[key];
@@ -1645,7 +1645,6 @@ function putBucketAccelerate(params, callback) {
16451645
headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
16461646

16471647
submitRequest.call(this, {
1648-
Interface: 'putBucketAccelerate',
16491648
Action: 'name/cos:PutBucketAccelerate',
16501649
method: 'PUT',
16511650
Bucket: params.Bucket,
@@ -1664,7 +1663,6 @@ function putBucketAccelerate(params, callback) {
16641663

16651664
function getBucketAccelerate(params, callback) {
16661665
submitRequest.call(this, {
1667-
Interface: 'getBucketAccelerate',
16681666
Action: 'name/cos:GetBucketAccelerate',
16691667
method: 'GET',
16701668
Bucket: params.Bucket,
@@ -1712,9 +1710,7 @@ function headObject(params, callback) {
17121710
}
17131711
return callback(err);
17141712
}
1715-
if (data.headers && data.headers.etag) {
1716-
data.ETag = data.headers && data.headers.etag;
1717-
}
1713+
data.ETag = util.attr(data.headers, 'etag', '');
17181714
callback(null, data);
17191715
});
17201716
}
@@ -1879,10 +1875,8 @@ function getObject(params, callback) {
18791875
result.Body = data.body;
18801876
}
18811877
}
1882-
if (data.headers && data.headers.etag) {
1883-
result.ETag = data.headers && data.headers.etag;
1884-
}
18851878
util.extend(result, {
1879+
ETag: util.attr(data.headers, 'etag', ''),
18861880
statusCode: data.statusCode,
18871881
headers: data.headers,
18881882
});
@@ -1930,7 +1924,7 @@ function putObject(params, callback) {
19301924
var FileSize = params.ContentLength;
19311925
var onProgress = util.throttleOnProgress.call(self, FileSize, params.onProgress);
19321926

1933-
// 特殊处理 Cache-Control
1927+
// 特殊处理 Cache-Control、Content-Type,避免代理更改这两个字段导致写入到 Object 属性里
19341928
var headers = params.Headers;
19351929
if (!headers['Cache-Control'] && !headers['cache-control']) headers['Cache-Control'] = '';
19361930

@@ -1998,9 +1992,7 @@ function deleteObject(params, callback) {
19981992
}, function (err, data) {
19991993
if (err) {
20001994
var statusCode = err.statusCode;
2001-
if (statusCode && statusCode === 204) {
2002-
return callback(null, {statusCode: statusCode});
2003-
} else if (statusCode && statusCode === 404) {
1995+
if (statusCode && statusCode === 404) {
20041996
return callback(null, {BucketNotFound: true, statusCode: statusCode,});
20051997
} else {
20061998
return callback(err);
@@ -2168,8 +2160,8 @@ function optionsObject(params, callback) {
21682160
* @param {String} MetadataDirective 是否拷贝元数据,枚举值:Copy, Replaced,默认值Copy。假如标记为Copy,忽略Header中的用户元数据信息直接复制;假如标记为Replaced,按Header信息修改元数据。当目标路径和原路径一致,即用户试图修改元数据时,必须为Replaced
21692161
* @param {String} CopySourceIfModifiedSince 当Object在指定时间后被修改,则执行操作,否则返回412。可与x-cos-copy-source-If-None-Match一起使用,与其他条件联合使用返回冲突。
21702162
* @param {String} CopySourceIfUnmodifiedSince 当Object在指定时间后未被修改,则执行操作,否则返回412。可与x-cos-copy-source-If-Match一起使用,与其他条件联合使用返回冲突。
2171-
* @param {String} CopySourceIfMatch 当Object的Etag和给定一致时,则执行操作,否则返回412。可与x-cos-copy-source-If-Unmodified-Since一起使用,与其他条件联合使用返回冲突。
2172-
* @param {String} CopySourceIfNoneMatch 当Object的Etag和给定不一致时,则执行操作,否则返回412。可与x-cos-copy-source-If-Modified-Since一起使用,与其他条件联合使用返回冲突。
2163+
* @param {String} CopySourceIfMatch 当Object的ETag和给定一致时,则执行操作,否则返回412。可与x-cos-copy-source-If-Unmodified-Since一起使用,与其他条件联合使用返回冲突。
2164+
* @param {String} CopySourceIfNoneMatch 当Object的ETag和给定不一致时,则执行操作,否则返回412。可与x-cos-copy-source-If-Modified-Since一起使用,与其他条件联合使用返回冲突。
21732165
* @param {String} StorageClass 存储级别,枚举值:存储级别,枚举值:Standard, Standard_IA,Archive;默认值:Standard
21742166
* @param {String} CacheControl 指定所有缓存机制在整个请求/响应链中必须服从的指令。
21752167
* @param {String} ContentDisposition MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件
@@ -2370,7 +2362,6 @@ function putObjectTagging(params, callback) {
23702362
headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
23712363

23722364
submitRequest.call(this, {
2373-
Interface: 'putObjectTagging',
23742365
Action: 'name/cos:PutObjectTagging',
23752366
method: 'PUT',
23762367
Bucket: params.Bucket,
@@ -2405,7 +2396,6 @@ function putObjectTagging(params, callback) {
24052396
function getObjectTagging(params, callback) {
24062397

24072398
submitRequest.call(this, {
2408-
Interface: 'getObjectTagging',
24092399
Action: 'name/cos:GetObjectTagging',
24102400
method: 'GET',
24112401
Key: params.Key,
@@ -2453,7 +2443,6 @@ function getObjectTagging(params, callback) {
24532443
*/
24542444
function deleteObjectTagging(params, callback) {
24552445
submitRequest.call(this, {
2456-
Interface: 'deleteObjectTagging',
24572446
Action: 'name/cos:DeleteObjectTagging',
24582447
method: 'DELETE',
24592448
Bucket: params.Bucket,
@@ -2514,7 +2503,6 @@ function selectObjectContent(params, callback) {
25142503
});
25152504
}
25162505
submitRequest.call(this, {
2517-
Interface: 'selectObjectContent',
25182506
Action: 'name/cos:GetObject',
25192507
method: 'POST',
25202508
Bucket: params.Bucket,
@@ -2616,7 +2604,10 @@ function multipartInit(params, callback) {
26162604

26172605
// 特殊处理 Cache-Control
26182606
var headers = params.Headers;
2607+
2608+
// 特殊处理 Cache-Control、Content-Type
26192609
if (!headers['Cache-Control'] && !headers['cache-control']) headers['Cache-Control'] = '';
2610+
if (!headers['Content-Type'] && !headers['content-type']) headers['Content-Type'] = params.Body && params.Body.type || '';
26202611

26212612
submitRequest.call(this, {
26222613
Action: 'name/cos:InitiateMultipartUpload',
@@ -2677,12 +2668,9 @@ function multipartUpload(params, callback) {
26772668
onProgress: params.onProgress,
26782669
body: params.Body || null
26792670
}, function (err, data) {
2680-
if (err) {
2681-
return callback(err);
2682-
}
2683-
data['headers'] = data['headers'] || {};
2671+
if (err) return callback(err);
26842672
callback(null, {
2685-
ETag: data['headers']['etag'] || '',
2673+
ETag: util.attr(data.headers, 'etag', ''),
26862674
statusCode: data.statusCode,
26872675
headers: data.headers,
26882676
});
@@ -2750,8 +2738,23 @@ function multipartComplete(params, callback) {
27502738
object: params.Key,
27512739
isLocation: true,
27522740
});
2753-
var CompleteMultipartUploadResult = data.CompleteMultipartUploadResult || {};
2754-
var result = util.extend(CompleteMultipartUploadResult, {
2741+
var res = data.CompleteMultipartUploadResult || {};
2742+
if (res.ProcessResults) {
2743+
if (res && res.ProcessResults) {
2744+
res.UploadResult = {
2745+
OriginalInfo: {
2746+
Key: res.Key,
2747+
Location: url,
2748+
ETag: res.ETag,
2749+
ImageInfo: res.ImageInfo,
2750+
},
2751+
ProcessResults: res.ProcessResults,
2752+
};
2753+
delete res.ImageInfo;
2754+
delete res.ProcessResults;
2755+
}
2756+
}
2757+
var result = util.extend(res, {
27552758
Location: url,
27562759
statusCode: data.statusCode,
27572760
headers: data.headers,
@@ -3353,10 +3356,7 @@ function submitRequest(params, callback) {
33533356
ResourceKey: params.ResourceKey,
33543357
Scope: params.Scope,
33553358
}, function (err, AuthData) {
3356-
if (err) {
3357-
callback(err);
3358-
return;
3359-
}
3359+
if (err) return callback(err);
33603360
params.AuthData = AuthData;
33613361
_submitRequest.call(self, params, function (err, data) {
33623362
if (err &&
@@ -3393,7 +3393,6 @@ function _submitRequest(params, callback) {
33933393
var method = params.method || 'GET';
33943394
var url = params.url;
33953395
var body = params.body;
3396-
var json = params.json;
33973396
var rawBody = params.rawBody;
33983397

33993398
// 处理 readStream and body
@@ -3422,7 +3421,6 @@ function _submitRequest(params, callback) {
34223421
headers: params.headers,
34233422
qs: params.qs,
34243423
body: body,
3425-
json: json,
34263424
};
34273425

34283426
// 获取签名

sdk/cos.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ var defaultOptions = {
2222
CopySliceSize: 1024 * 1024 * 10,
2323
MaxPartNumber: 10000,
2424
ProgressInterval: 1000,
25-
UploadQueueSize: 1000,
2625
Domain: '',
2726
ServiceDomain: '',
2827
Protocol: '',
@@ -33,6 +32,7 @@ var defaultOptions = {
3332
CorrectClockSkew: true,
3433
SystemClockOffset: 0, // 单位毫秒,ms
3534
UploadCheckContentMd5: false,
35+
UploadQueueSize: 1000,
3636
UploadIdCacheLimit: 500,
3737
Proxy: '',
3838
Ip: '',

0 commit comments

Comments
 (0)