@nocobase/plugin-file-manager 2.1.0-beta.30 → 2.1.0-beta.33

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.
Files changed (67) hide show
  1. package/dist/client/index.js +1 -1
  2. package/dist/client-v2/125.01d5562df948d974.js +10 -0
  3. package/dist/client-v2/229.bd72c2d7aa088310.js +10 -0
  4. package/dist/client-v2/336.1dd1b32466d0c778.js +10 -0
  5. package/dist/client-v2/43.eb45d53ba3e9828b.js +10 -0
  6. package/dist/client-v2/450.f590b4c220108742.js +10 -0
  7. package/dist/client-v2/929.d7e783304cc1f236.js +10 -0
  8. package/dist/client-v2/942.c10c97317af6dd02.js +10 -0
  9. package/dist/{client/StorageOptions.d.ts → client-v2/components/BaseUrlField.d.ts} +1 -1
  10. package/dist/client-v2/components/DefaultField.d.ts +18 -0
  11. package/dist/client-v2/{storageTypes/index.d.ts → components/FileSizeField.d.ts} +2 -2
  12. package/dist/client-v2/components/MimetypeField.d.ts +10 -0
  13. package/dist/client-v2/components/NameField.d.ts +10 -0
  14. package/dist/client-v2/components/ParanoidField.d.ts +10 -0
  15. package/dist/client-v2/components/PathField.d.ts +18 -0
  16. package/dist/client-v2/components/RenameModeField.d.ts +10 -0
  17. package/dist/client-v2/components/TitleField.d.ts +10 -0
  18. package/dist/client-v2/components/index.d.ts +17 -0
  19. package/dist/client-v2/index.d.ts +5 -0
  20. package/dist/client-v2/index.js +1 -1
  21. package/dist/client-v2/plugin.d.ts +47 -6
  22. package/dist/client-v2/storage-forms/AliOssStorageForm.d.ts +10 -0
  23. package/dist/client-v2/storage-forms/LocalStorageForm.d.ts +10 -0
  24. package/dist/client-v2/storage-forms/S3StorageForm.d.ts +10 -0
  25. package/dist/client-v2/storage-forms/TxCosStorageForm.d.ts +10 -0
  26. package/dist/externalVersion.js +10 -13
  27. package/dist/node_modules/@aws-sdk/client-s3/package.json +1 -1
  28. package/dist/node_modules/@aws-sdk/lib-storage/package.json +1 -1
  29. package/dist/node_modules/ali-oss/package.json +1 -1
  30. package/dist/node_modules/cos-nodejs-sdk-v5/.github/workflows/auto-changelog.yml +55 -0
  31. package/dist/node_modules/cos-nodejs-sdk-v5/.prettierrc +10 -0
  32. package/dist/node_modules/cos-nodejs-sdk-v5/.travis.yml +16 -0
  33. package/dist/node_modules/cos-nodejs-sdk-v5/LICENSE +21 -0
  34. package/dist/node_modules/cos-nodejs-sdk-v5/demo/crc64.js +9 -0
  35. package/dist/node_modules/cos-nodejs-sdk-v5/demo/demo-sts-scope.js +75 -0
  36. package/dist/node_modules/cos-nodejs-sdk-v5/demo/demo-sts.js +65 -0
  37. package/dist/node_modules/cos-nodejs-sdk-v5/demo/demo.js +4542 -0
  38. package/dist/node_modules/cos-nodejs-sdk-v5/demo/util.js +135 -0
  39. package/dist/node_modules/cos-nodejs-sdk-v5/index.d.ts +2610 -0
  40. package/dist/node_modules/{multer-cos → cos-nodejs-sdk-v5}/index.js +2 -2
  41. package/dist/node_modules/cos-nodejs-sdk-v5/package.json +1 -0
  42. package/dist/node_modules/cos-nodejs-sdk-v5/sdk/advance.js +1659 -0
  43. package/dist/node_modules/cos-nodejs-sdk-v5/sdk/async.js +59 -0
  44. package/dist/node_modules/cos-nodejs-sdk-v5/sdk/base.js +4404 -0
  45. package/dist/node_modules/cos-nodejs-sdk-v5/sdk/cos.js +137 -0
  46. package/dist/node_modules/cos-nodejs-sdk-v5/sdk/event.js +34 -0
  47. package/dist/node_modules/cos-nodejs-sdk-v5/sdk/select-stream.js +181 -0
  48. package/dist/node_modules/cos-nodejs-sdk-v5/sdk/session.js +126 -0
  49. package/dist/node_modules/cos-nodejs-sdk-v5/sdk/task.js +255 -0
  50. package/dist/node_modules/cos-nodejs-sdk-v5/sdk/util.js +776 -0
  51. package/dist/node_modules/cos-nodejs-sdk-v5/test/csp.js +1302 -0
  52. package/dist/node_modules/cos-nodejs-sdk-v5/test/test.js +6119 -0
  53. package/dist/node_modules/mime-match/package.json +1 -1
  54. package/dist/node_modules/mime-types/package.json +1 -1
  55. package/dist/node_modules/mkdirp/package.json +1 -1
  56. package/dist/node_modules/url-join/package.json +1 -1
  57. package/dist/server/storages/tx-cos.d.ts +16 -1
  58. package/dist/server/storages/tx-cos.js +111 -10
  59. package/dist/shared/previewer/filePreviewTypes.d.ts +1 -0
  60. package/dist/shared/previewer/filePreviewTypes.js +21 -0
  61. package/package.json +2 -3
  62. package/dist/client-v2/855.e7d2e24a0b457a89.js +0 -10
  63. package/dist/client-v2/storageTypes/types.d.ts +0 -26
  64. package/dist/node_modules/multer-cos/LICENSE +0 -24
  65. package/dist/node_modules/multer-cos/demo/index.js +0 -39
  66. package/dist/node_modules/multer-cos/demo/myMulter.js +0 -88
  67. package/dist/node_modules/multer-cos/package.json +0 -1
@@ -0,0 +1,776 @@
1
+ 'use strict';
2
+
3
+ var fs = require('fs');
4
+ var crypto = require('crypto');
5
+ var { XMLParser, XMLBuilder } = require('fast-xml-parser');
6
+ var xmlParser = new XMLParser({
7
+ ignoreDeclaration: true, // 忽略 XML 声明
8
+ ignoreAttributes: true, // 忽略属性
9
+ parseTagValue: false, // 关闭自动解析
10
+ });
11
+ var xmlBuilder = new XMLBuilder();
12
+
13
+ function camSafeUrlEncode(str) {
14
+ return encodeURIComponent(str)
15
+ .replace(/!/g, '%21')
16
+ .replace(/'/g, '%27')
17
+ .replace(/\(/g, '%28')
18
+ .replace(/\)/g, '%29')
19
+ .replace(/\*/g, '%2A');
20
+ }
21
+
22
+ var getObjectKeys = function (obj, forKey) {
23
+ var list = [];
24
+ for (var key in obj) {
25
+ if (obj.hasOwnProperty(key)) {
26
+ list.push(forKey ? camSafeUrlEncode(key).toLowerCase() : key);
27
+ }
28
+ }
29
+ return list.sort(function (a, b) {
30
+ a = a.toLowerCase();
31
+ b = b.toLowerCase();
32
+ return a === b ? 0 : a > b ? 1 : -1;
33
+ });
34
+ };
35
+
36
+ /**
37
+ * obj转为string
38
+ * @param {Object} obj 需要转的对象,必须
39
+ * @param {Boolean} lowerCaseKey key是否转为小写,默认false,非必须
40
+ * @return {String} data 返回字符串
41
+ */
42
+ var obj2str = function (obj, lowerCaseKey) {
43
+ var i, key, val;
44
+ var list = [];
45
+ var keyList = getObjectKeys(obj);
46
+ for (i = 0; i < keyList.length; i++) {
47
+ key = keyList[i];
48
+ val = obj[key] === undefined || obj[key] === null ? '' : '' + obj[key];
49
+ key = lowerCaseKey ? camSafeUrlEncode(key).toLowerCase() : camSafeUrlEncode(key);
50
+ val = camSafeUrlEncode(val) || '';
51
+ list.push(key + '=' + val);
52
+ }
53
+ return list.join('&');
54
+ };
55
+
56
+ // 可以签入签名的headers
57
+ var signHeaders = [
58
+ 'content-disposition',
59
+ 'content-encoding',
60
+ 'content-length',
61
+ 'content-md5',
62
+ 'expect',
63
+ 'expires',
64
+ 'host',
65
+ 'if-match',
66
+ 'if-modified-since',
67
+ 'if-none-match',
68
+ 'if-unmodified-since',
69
+ 'origin',
70
+ 'range',
71
+ 'transfer-encoding',
72
+ 'pic-operations',
73
+ ];
74
+
75
+ var getSignHeaderObj = function (headers) {
76
+ var signHeaderObj = {};
77
+ for (var i in headers) {
78
+ var key = i.toLowerCase();
79
+ if (key.indexOf('x-cos-') > -1 || signHeaders.indexOf(key) > -1) {
80
+ signHeaderObj[i] = headers[i];
81
+ }
82
+ }
83
+ return signHeaderObj;
84
+ };
85
+
86
+ //测试用的key后面可以去掉
87
+ var getAuth = function (opt) {
88
+ opt = opt || {};
89
+
90
+ var SecretId = opt.SecretId;
91
+ var SecretKey = opt.SecretKey;
92
+ var KeyTime = opt.KeyTime;
93
+ var method = (opt.method || opt.Method || 'get').toLowerCase();
94
+ var queryParams = clone(opt.Query || opt.params || {});
95
+ var headers = getSignHeaderObj(clone(opt.Headers || opt.headers || {}));
96
+
97
+ var Key = opt.Key || '';
98
+ var pathname;
99
+ if (opt.UseRawKey) {
100
+ pathname = opt.Pathname || opt.pathname || '/' + Key;
101
+ } else {
102
+ pathname = opt.Pathname || opt.pathname || Key;
103
+ pathname.indexOf('/') !== 0 && (pathname = '/' + pathname);
104
+ }
105
+
106
+ // ForceSignHost明确传入false才不加入host签名
107
+ var forceSignHost = opt.ForceSignHost === false ? false : true;
108
+
109
+ // 如果有传入存储桶,那么签名默认加 Host 参与计算,避免跨桶访问
110
+ if (!headers.Host && !headers.host && opt.Bucket && opt.Region && forceSignHost)
111
+ headers.Host = opt.Bucket + '.cos.' + opt.Region + '.myqcloud.com';
112
+
113
+ if (!SecretId) throw new Error('missing param SecretId');
114
+ if (!SecretKey) throw new Error('missing param SecretKey');
115
+
116
+ // 签名有效起止时间
117
+ var now = Math.round(getSkewTime(opt.SystemClockOffset) / 1000) - 1;
118
+ var exp = now;
119
+
120
+ var Expires = opt.Expires || opt.expires;
121
+ if (Expires === undefined) {
122
+ exp += 900; // 签名过期时间为当前 + 900s
123
+ } else {
124
+ exp += Expires * 1 || 0;
125
+ }
126
+
127
+ // 要用到的 Authorization 参数列表
128
+ var qSignAlgorithm = 'sha1';
129
+ var qAk = SecretId;
130
+ var qSignTime = KeyTime || now + ';' + exp;
131
+ var qKeyTime = KeyTime || now + ';' + exp;
132
+ var qHeaderList = getObjectKeys(headers, true).join(';').toLowerCase();
133
+ var qUrlParamList = getObjectKeys(queryParams, true).join(';').toLowerCase();
134
+
135
+ // 签名算法说明文档:https://www.qcloud.com/document/product/436/7778
136
+ // 步骤一:计算 SignKey
137
+ var signKey = crypto.createHmac('sha1', SecretKey).update(qKeyTime).digest('hex');
138
+
139
+ // 步骤二:构成 FormatString
140
+ var formatString = [method, pathname, obj2str(queryParams, true), obj2str(headers, true), ''].join('\n');
141
+ formatString = Buffer.from(formatString, 'utf8');
142
+
143
+ // 步骤三:计算 StringToSign
144
+ var res = crypto.createHash('sha1').update(formatString).digest('hex');
145
+ var stringToSign = ['sha1', qSignTime, res, ''].join('\n');
146
+
147
+ // 步骤四:计算 Signature
148
+ var qSignature = crypto.createHmac('sha1', signKey).update(stringToSign).digest('hex');
149
+
150
+ // 步骤五:构造 Authorization
151
+ var authorization = [
152
+ 'q-sign-algorithm=' + qSignAlgorithm,
153
+ 'q-ak=' + qAk,
154
+ 'q-sign-time=' + qSignTime,
155
+ 'q-key-time=' + qKeyTime,
156
+ 'q-header-list=' + qHeaderList,
157
+ 'q-url-param-list=' + qUrlParamList,
158
+ 'q-signature=' + qSignature,
159
+ ].join('&');
160
+
161
+ return authorization;
162
+ };
163
+
164
+ var getV4Auth = function (opt) {
165
+ if (!opt.SecretId) return console.error('missing param SecretId');
166
+ if (!opt.SecretKey) return console.error('missing param SecretKey');
167
+ if (!opt.Bucket) return console.error('missing param Bucket');
168
+
169
+ var longBucket = opt.Bucket;
170
+ var ShortBucket = longBucket.substr(0, longBucket.lastIndexOf('-'));
171
+ var AppId = longBucket.substr(longBucket.lastIndexOf('-') + 1);
172
+ var random = Math.round(Math.random() * Math.pow(2, 32));
173
+ var now = Math.round(Date.now() / 1000);
174
+ var e = now + (opt.Expires === undefined ? 900 : opt.Expires);
175
+ var path =
176
+ '/' +
177
+ AppId +
178
+ '/' +
179
+ ShortBucket +
180
+ '/' +
181
+ encodeURIComponent((opt.Key || '').replace(/(^\/*)/g, '')).replace(/%2F/g, '/');
182
+ var plainText =
183
+ 'a=' + AppId + '&b=' + ShortBucket + '&k=' + opt.SecretId + '&t=' + now + '&e=' + e + '&r=' + random + '&f=' + path;
184
+ var signKey = crypto.createHmac('sha1', opt.SecretKey).update(plainText).digest();
185
+ var sign = Buffer.concat([signKey, Buffer.from(plainText)]).toString('base64');
186
+ return sign;
187
+ };
188
+
189
+ var getSourceParams = function (source) {
190
+ var parser = this.options.CopySourceParser;
191
+ if (parser) return parser(source);
192
+ var m = source.match(/^([^.]+-\d+)\.cos(v6|-cdc|-internal)?\.([^.]+)\.((myqcloud\.com)|(tencentcos\.cn))\/(.+)$/);
193
+ if (!m) return null;
194
+ return { Bucket: m[1], Region: m[3], Key: m[7] };
195
+ };
196
+
197
+ var noop = function () {};
198
+
199
+ // 清除对象里值为的 undefined 或 null 的属性
200
+ var clearKey = function (obj) {
201
+ var retObj = {};
202
+ for (var key in obj) {
203
+ if (obj.hasOwnProperty(key) && obj[key] !== undefined && obj[key] !== null) {
204
+ retObj[key] = obj[key];
205
+ }
206
+ }
207
+ return retObj;
208
+ };
209
+
210
+ // XML 对象转 JSON 对象
211
+ var xml2json = function (bodyStr) {
212
+ var d = xmlParser.parse(bodyStr);
213
+
214
+ return d;
215
+ };
216
+
217
+ // JSON 对象转 XML 对象
218
+ var json2xml = function (json) {
219
+ var xml = xmlBuilder.build(json);
220
+ return xml;
221
+ };
222
+
223
+ // 计算 MD5
224
+ var md5 = function (str, encoding) {
225
+ return crypto
226
+ .createHash('md5')
227
+ .update(str)
228
+ .digest(encoding || 'hex');
229
+ };
230
+
231
+ // 获取文件分片
232
+ var fileSlice = function (FilePath, start, end, callback) {
233
+ if (FilePath) {
234
+ try {
235
+ var readStream = fs.createReadStream(FilePath, { start: start, end: end - 1 });
236
+ readStream.isSdkCreated = true;
237
+ callback(readStream);
238
+ } catch (e) {}
239
+ } else {
240
+ callback(null);
241
+ }
242
+ };
243
+
244
+ // 获取文件内容的 MD5
245
+ var getBodyMd5 = function (UploadCheckContentMd5, Body, callback) {
246
+ callback = callback || noop;
247
+ if (UploadCheckContentMd5) {
248
+ if (Body instanceof Buffer || typeof Body === 'string') {
249
+ callback(util.md5(Body));
250
+ } else {
251
+ callback();
252
+ }
253
+ } else {
254
+ callback();
255
+ }
256
+ };
257
+
258
+ // 获取文件 md5 值
259
+ var getFileMd5 = function (readStream, callback) {
260
+ var md5 = crypto.createHash('md5');
261
+ readStream.on('data', function (chunk) {
262
+ md5.update(chunk);
263
+ });
264
+ readStream.on('error', function (err) {
265
+ callback(util.error(err));
266
+ });
267
+ readStream.on('end', function () {
268
+ var hash = md5.digest('hex');
269
+ callback(null, hash);
270
+ });
271
+ };
272
+
273
+ function clone(obj) {
274
+ return map(obj, function (v) {
275
+ return typeof v === 'object' && v !== null ? clone(v) : v;
276
+ });
277
+ }
278
+
279
+ function attr(obj, name, defaultValue) {
280
+ return obj && name in obj ? obj[name] : defaultValue;
281
+ }
282
+
283
+ function extend(target, source) {
284
+ each(source, function (val, key) {
285
+ target[key] = source[key];
286
+ });
287
+ return target;
288
+ }
289
+
290
+ function isArray(arr) {
291
+ return arr instanceof Array;
292
+ }
293
+
294
+ function isInArray(arr, item) {
295
+ var flag = false;
296
+ for (var i = 0; i < arr.length; i++) {
297
+ if (item === arr[i]) {
298
+ flag = true;
299
+ break;
300
+ }
301
+ }
302
+ return flag;
303
+ }
304
+
305
+ function makeArray(arr) {
306
+ return isArray(arr) ? arr : [arr];
307
+ }
308
+
309
+ function each(obj, fn) {
310
+ for (var i in obj) {
311
+ if (obj.hasOwnProperty(i)) {
312
+ fn(obj[i], i);
313
+ }
314
+ }
315
+ }
316
+
317
+ function map(obj, fn) {
318
+ var o = isArray(obj) ? [] : {};
319
+ for (var i in obj) {
320
+ if (obj.hasOwnProperty(i)) {
321
+ o[i] = fn(obj[i], i);
322
+ }
323
+ }
324
+ return o;
325
+ }
326
+
327
+ function filter(obj, fn) {
328
+ var iaArr = isArray(obj);
329
+ var o = iaArr ? [] : {};
330
+ for (var i in obj) {
331
+ if (obj.hasOwnProperty(i)) {
332
+ if (fn(obj[i], i)) {
333
+ if (iaArr) {
334
+ o.push(obj[i]);
335
+ } else {
336
+ o[i] = obj[i];
337
+ }
338
+ }
339
+ }
340
+ }
341
+ return o;
342
+ }
343
+
344
+ var binaryBase64 = function (str) {
345
+ var i,
346
+ len,
347
+ char,
348
+ arr = [];
349
+ for (i = 0, len = str.length / 2; i < len; i++) {
350
+ char = parseInt(str[i * 2] + str[i * 2 + 1], 16);
351
+ arr.push(char);
352
+ }
353
+ return Buffer.from(arr).toString('base64');
354
+ };
355
+ var uuid = function () {
356
+ var S4 = function () {
357
+ return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
358
+ };
359
+ return S4() + S4() + '-' + S4() + '-' + S4() + '-' + S4() + '-' + S4() + S4() + S4();
360
+ };
361
+
362
+ var hasMissingParams = function (apiName, params) {
363
+ var Bucket = params.Bucket;
364
+ var Region = params.Region;
365
+ var Key = params.Key;
366
+ if (
367
+ apiName.indexOf('Bucket') > -1 ||
368
+ apiName === 'deleteMultipleObject' ||
369
+ apiName === 'multipartList' ||
370
+ apiName === 'listObjectVersions'
371
+ ) {
372
+ if (!Bucket) return 'Bucket';
373
+ if (!Region) return 'Region';
374
+ } else if (
375
+ apiName.indexOf('Object') > -1 ||
376
+ apiName.indexOf('multipart') > -1 ||
377
+ apiName === 'sliceUploadFile' ||
378
+ apiName === 'abortUploadTask'
379
+ ) {
380
+ if (!Bucket) return 'Bucket';
381
+ if (!Region) return 'Region';
382
+ if (!Key) return 'Key';
383
+ }
384
+ return false;
385
+ };
386
+
387
+ var formatParams = function (apiName, params) {
388
+ // 复制参数对象
389
+ params = extend({}, params);
390
+
391
+ // 统一处理 Headers
392
+ if (apiName !== 'getAuth' && apiName !== 'getV4Auth' && apiName !== 'getObjectUrl') {
393
+ var Headers = params.Headers || {};
394
+ if (params && typeof params === 'object') {
395
+ (function () {
396
+ for (var key in params) {
397
+ if (params.hasOwnProperty(key) && key.indexOf('x-cos-') > -1) {
398
+ Headers[key] = params[key];
399
+ }
400
+ }
401
+ })();
402
+
403
+ var headerMap = {
404
+ // params headers
405
+ 'x-cos-mfa': 'MFA',
406
+ 'Content-MD5': 'ContentMD5',
407
+ 'Content-Length': 'ContentLength',
408
+ 'Content-Type': 'ContentType',
409
+ Expect: 'Expect',
410
+ Expires: 'Expires',
411
+ 'Cache-Control': 'CacheControl',
412
+ 'Content-Disposition': 'ContentDisposition',
413
+ 'Content-Encoding': 'ContentEncoding',
414
+ Range: 'Range',
415
+ 'If-Modified-Since': 'IfModifiedSince',
416
+ 'If-Unmodified-Since': 'IfUnmodifiedSince',
417
+ 'If-Match': 'IfMatch',
418
+ 'If-None-Match': 'IfNoneMatch',
419
+ 'x-cos-copy-source': 'CopySource',
420
+ 'x-cos-copy-source-Range': 'CopySourceRange',
421
+ 'x-cos-metadata-directive': 'MetadataDirective',
422
+ 'x-cos-copy-source-If-Modified-Since': 'CopySourceIfModifiedSince',
423
+ 'x-cos-copy-source-If-Unmodified-Since': 'CopySourceIfUnmodifiedSince',
424
+ 'x-cos-copy-source-If-Match': 'CopySourceIfMatch',
425
+ 'x-cos-copy-source-If-None-Match': 'CopySourceIfNoneMatch',
426
+ 'x-cos-acl': 'ACL',
427
+ 'x-cos-grant-read': 'GrantRead',
428
+ 'x-cos-grant-write': 'GrantWrite',
429
+ 'x-cos-grant-full-control': 'GrantFullControl',
430
+ 'x-cos-grant-read-acp': 'GrantReadAcp',
431
+ 'x-cos-grant-write-acp': 'GrantWriteAcp',
432
+ 'x-cos-storage-class': 'StorageClass',
433
+ 'x-cos-traffic-limit': 'TrafficLimit',
434
+ 'x-cos-mime-limit': 'MimeLimit',
435
+ // SSE-C
436
+ 'x-cos-server-side-encryption-customer-algorithm': 'SSECustomerAlgorithm',
437
+ 'x-cos-server-side-encryption-customer-key': 'SSECustomerKey',
438
+ 'x-cos-server-side-encryption-customer-key-MD5': 'SSECustomerKeyMD5',
439
+ // SSE-COS、SSE-KMS
440
+ 'x-cos-server-side-encryption': 'ServerSideEncryption',
441
+ 'x-cos-server-side-encryption-cos-kms-key-id': 'SSEKMSKeyId',
442
+ 'x-cos-server-side-encryption-context': 'SSEContext',
443
+ };
444
+ util.each(headerMap, function (paramKey, headerKey) {
445
+ if (params[paramKey] !== undefined) {
446
+ Headers[headerKey] = params[paramKey];
447
+ }
448
+ });
449
+
450
+ params.Headers = clearKey(Headers);
451
+ }
452
+ }
453
+
454
+ return params;
455
+ };
456
+
457
+ var apiWrapper = function (apiName, apiFn) {
458
+ return function (params, callback) {
459
+ var self = this;
460
+
461
+ // 处理参数
462
+ if (typeof params === 'function') {
463
+ callback = params;
464
+ params = {};
465
+ }
466
+
467
+ // 整理参数格式
468
+ params = formatParams(apiName, params);
469
+
470
+ // 代理回调函数
471
+ var formatResult = function (result) {
472
+ if (result && result.headers) {
473
+ result.headers['x-cos-request-id'] && (result.RequestId = result.headers['x-cos-request-id']);
474
+ result.headers['x-ci-request-id'] && (result.RequestId = result.headers['x-ci-request-id']);
475
+ result.headers['x-cos-version-id'] && (result.VersionId = result.headers['x-cos-version-id']);
476
+ result.headers['x-cos-delete-marker'] && (result.DeleteMarker = result.headers['x-cos-delete-marker']);
477
+ }
478
+ return result;
479
+ };
480
+ var _callback = function (err, data) {
481
+ callback && callback(formatResult(err), formatResult(data));
482
+ };
483
+
484
+ var checkParams = function () {
485
+ if (apiName !== 'getService' && apiName !== 'abortUploadTask') {
486
+ // 判断参数是否完整
487
+ var missingResult = hasMissingParams(apiName, params);
488
+ if (missingResult) {
489
+ return 'missing param ' + missingResult;
490
+ }
491
+ // 判断 region 格式
492
+ if (params.Region) {
493
+ if (params.Region.indexOf('cos.') > -1) {
494
+ return 'param Region should not be start with "cos."';
495
+ } else if (!/^([a-z\d-]+)$/.test(params.Region)) {
496
+ return 'Region format error.';
497
+ }
498
+ // 判断 region 格式
499
+ if (
500
+ !self.options.CompatibilityMode &&
501
+ params.Region.indexOf('-') === -1 &&
502
+ params.Region !== 'yfb' &&
503
+ params.Region !== 'default' &&
504
+ params.Region !== 'accelerate'
505
+ ) {
506
+ console.warn(
507
+ 'warning: param Region format error, find help here: https://cloud.tencent.com/document/product/436/6224'
508
+ );
509
+ }
510
+ }
511
+ // 兼容不带 AppId 的 Bucket
512
+ if (params.Bucket) {
513
+ if (!/^([a-z\d-]+)-(\d+)$/.test(params.Bucket)) {
514
+ if (params.AppId) {
515
+ params.Bucket = params.Bucket + '-' + params.AppId;
516
+ } else if (self.options.AppId) {
517
+ params.Bucket = params.Bucket + '-' + self.options.AppId;
518
+ } else {
519
+ return 'Bucket should format as "test-1250000000".';
520
+ }
521
+ }
522
+ if (params.AppId) {
523
+ console.warn(
524
+ 'warning: AppId has been deprecated, Please put it at the end of parameter Bucket(E.g Bucket:"test-1250000000" ).'
525
+ );
526
+ delete params.AppId;
527
+ }
528
+ }
529
+ // 如果 Key 是 / 开头,强制去掉第一个 /
530
+ if (!self.options.UseRawKey && params.Key && params.Key.substr(0, 1) === '/') {
531
+ params.Key = params.Key.substr(1);
532
+ }
533
+ }
534
+ };
535
+
536
+ var errMsg = checkParams();
537
+ var isSync = ['getAuth', 'getV4Auth', 'getObjectUrl'].includes(apiName) || apiName.indexOf('Stream') > -1;
538
+ if (Promise && !isSync && !callback) {
539
+ return new Promise(function (resolve, reject) {
540
+ callback = function (err, data) {
541
+ err ? reject(err) : resolve(data);
542
+ };
543
+ if (errMsg) return _callback(util.error(new Error(errMsg)));
544
+ apiFn.call(self, params, _callback);
545
+ });
546
+ } else {
547
+ if (errMsg) return _callback(util.error(new Error(errMsg)));
548
+ var res = apiFn.call(self, params, _callback);
549
+ if (isSync) return res;
550
+ }
551
+ };
552
+ };
553
+
554
+ var throttleOnProgress = function (total, onProgress) {
555
+ var self = this;
556
+ var size0 = 0;
557
+ var size1 = 0;
558
+ var time0 = Date.now();
559
+ var time1;
560
+ var timer;
561
+
562
+ function update() {
563
+ timer = 0;
564
+ if (onProgress && typeof onProgress === 'function') {
565
+ time1 = Date.now();
566
+ var speed = Math.max(0, Math.round(((size1 - size0) / ((time1 - time0) / 1000)) * 100) / 100) || 0;
567
+ var percent;
568
+ if (size1 === 0 && total === 0) {
569
+ percent = 1;
570
+ } else {
571
+ percent = Math.floor((size1 / total) * 100) / 100 || 0;
572
+ }
573
+ time0 = time1;
574
+ size0 = size1;
575
+ try {
576
+ onProgress({ loaded: size1, total: total, speed: speed, percent: percent });
577
+ } catch (e) {}
578
+ }
579
+ }
580
+
581
+ return function (info, immediately) {
582
+ if (info) {
583
+ size1 = info.loaded;
584
+ total = info.total;
585
+ }
586
+ if (immediately) {
587
+ clearTimeout(timer);
588
+ update();
589
+ } else {
590
+ if (timer) return;
591
+ timer = setTimeout(update, self.options.ProgressInterval);
592
+ }
593
+ };
594
+ };
595
+
596
+ var getFileSize = function (api, params, callback) {
597
+ var size;
598
+ if (api === 'sliceUploadFile') {
599
+ if (params.FilePath) {
600
+ fs.stat(params.FilePath, function (err, fileStats) {
601
+ if (err) {
602
+ if (params.ContentLength !== undefined) {
603
+ size = params.ContentLength;
604
+ } else {
605
+ return callback(err);
606
+ }
607
+ } else {
608
+ params.FileStat = fileStats;
609
+ params.FileStat.FilePath = params.FilePath;
610
+ size = fileStats.isDirectory() ? 0 : fileStats.size;
611
+ }
612
+ params.ContentLength = size = size || 0;
613
+ callback(null, size);
614
+ });
615
+ return;
616
+ } else {
617
+ callback(util.error(new Error('missing param FilePath')));
618
+ return;
619
+ }
620
+ } else {
621
+ if (params.Body !== undefined) {
622
+ if (typeof params.Body === 'string') {
623
+ params.Body = global.Buffer.from(params.Body);
624
+ }
625
+ if (params.Body instanceof global.Buffer) {
626
+ size = params.Body.length;
627
+ } else if (typeof params.Body.pipe === 'function') {
628
+ if (params.ContentLength === undefined) {
629
+ size = undefined;
630
+ } else {
631
+ size = params.ContentLength;
632
+ }
633
+ } else {
634
+ callback(util.error(new Error('params Body format error, Only allow Buffer|Stream|String.')));
635
+ return;
636
+ }
637
+ } else {
638
+ callback(util.error(new Error('missing param Body')));
639
+ return;
640
+ }
641
+ }
642
+ params.ContentLength = size;
643
+ callback(null, size);
644
+ };
645
+
646
+ // 获取调正的时间戳
647
+ var getSkewTime = function (offset) {
648
+ return Date.now() + (offset || 0);
649
+ };
650
+
651
+ // 重写 callback,等待流结束后才 callback
652
+ var callbackAfterStreamFinish = function (stream, callback) {
653
+ if (!stream) return callback;
654
+ var err,
655
+ data,
656
+ count = 2,
657
+ loaded = false;
658
+ var cb = function (e, d) {
659
+ if (loaded) return;
660
+ // 如果有数据,且没有错误,清理 设置错误
661
+ if ((d && !data) || e || err) {
662
+ data = d;
663
+ }
664
+ if (e && !err) {
665
+ err = e;
666
+ data = null;
667
+ }
668
+ if (err || --count === 0) {
669
+ loaded = true;
670
+ callback(err, data);
671
+ }
672
+ };
673
+ stream.on('error', function (err) {
674
+ cb(err);
675
+ });
676
+ stream.on('finish', function () {
677
+ cb();
678
+ });
679
+ return cb;
680
+ };
681
+
682
+ var error = function (err, opt) {
683
+ var sourceErr = err;
684
+ err.message = err.message || null;
685
+
686
+ if (typeof opt === 'string') {
687
+ err.error = opt;
688
+ err.message = opt;
689
+ } else if (typeof opt === 'object' && opt !== null) {
690
+ extend(err, opt);
691
+ if (opt.code || opt.name) err.code = opt.code || opt.name;
692
+ if (opt.message) err.message = opt.message;
693
+ if (opt.stack) err.stack = opt.stack;
694
+ }
695
+
696
+ if (typeof Object.defineProperty === 'function') {
697
+ Object.defineProperty(err, 'name', { writable: true, enumerable: false });
698
+ Object.defineProperty(err, 'message', { enumerable: true });
699
+ }
700
+
701
+ err.name = (opt && opt.name) || err.name || err.code || 'Error';
702
+ if (!err.code) err.code = err.name;
703
+
704
+ if (!err.error) {
705
+ var objectType = Object.prototype.toString.call(err);
706
+ if (objectType === '[object Object]') {
707
+ // 兼容老的错误格式
708
+ err.error = clone(sourceErr);
709
+ } else if (objectType === '[object Error]') {
710
+ // 有环境报出[object Error]对象的情况,兼容处理一下
711
+ err = {
712
+ code: err.code || err.name || 'Error',
713
+ name: err.name || err.code || 'Error',
714
+ message: err.reason || err.message || 'Error',
715
+ };
716
+ }
717
+ }
718
+ return err;
719
+ };
720
+
721
+ var isWeb = function () {
722
+ return typeof window === 'object';
723
+ };
724
+
725
+ var isCIHost = function (url) {
726
+ return /^https?:\/\/([^/]+\.)?ci\.[^/]+/.test(url);
727
+ };
728
+
729
+ var encodeBase64 = function (str, safe) {
730
+ let base64Str = Buffer.from(str).toString('base64');
731
+ // 万象使用的安全base64格式需要特殊处理
732
+ if (safe) {
733
+ base64Str = base64Str.replaceAll('+', '-').replaceAll('/', '_').replaceAll('=', '');
734
+ }
735
+ return base64Str;
736
+ };
737
+
738
+ var util = {
739
+ noop: noop,
740
+ formatParams: formatParams,
741
+ apiWrapper: apiWrapper,
742
+ xml2json: xml2json,
743
+ json2xml: json2xml,
744
+ md5: md5,
745
+ clearKey: clearKey,
746
+ fileSlice: fileSlice,
747
+ getBodyMd5: getBodyMd5,
748
+ getFileMd5: getFileMd5,
749
+ binaryBase64: binaryBase64,
750
+ extend: extend,
751
+ isArray: isArray,
752
+ isInArray: isInArray,
753
+ makeArray: makeArray,
754
+ each: each,
755
+ map: map,
756
+ filter: filter,
757
+ clone: clone,
758
+ attr: attr,
759
+ uuid: uuid,
760
+ camSafeUrlEncode: camSafeUrlEncode,
761
+ throttleOnProgress: throttleOnProgress,
762
+ getFileSize: getFileSize,
763
+ getSkewTime: getSkewTime,
764
+ error: error,
765
+ getAuth: getAuth,
766
+ callbackAfterStreamFinish: callbackAfterStreamFinish,
767
+ getV4Auth: getV4Auth,
768
+ isBrowser: false,
769
+ obj2str: obj2str,
770
+ isWeb: isWeb,
771
+ isCIHost: isCIHost,
772
+ getSourceParams: getSourceParams,
773
+ encodeBase64: encodeBase64,
774
+ };
775
+
776
+ module.exports = util;