New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

cos-nodejs-sdk-v5

Package Overview
Dependencies
Maintainers
5
Versions
167
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

cos-nodejs-sdk-v5 - npm Package Compare versions

Comparing version 2.14.3-beta0 to 2.14.3

4

package.json
{
"name": "cos-nodejs-sdk-v5",
"version": "2.14.3-beta0",
"version": "2.14.3",
"description": "cos nodejs sdk v5",

@@ -36,3 +36,2 @@ "main": "index.js",

"conf": "^9.0.0",
"crc64-ecma182.js": "2.0.2",
"fast-xml-parser": "4.2.5",

@@ -45,2 +44,3 @@ "mime-types": "^2.1.24",

"batch": "^0.6.1",
"crc64-ecma182.js": "^1.0.0",
"mocha": "^4.0.1",

@@ -47,0 +47,0 @@ "nyc": "^15.1.0",

@@ -6,5 +6,3 @@ var session = require('./session');

var util = require('./util');
var crc64 = require('../lib/crc64');
// 文件分块上传全过程,暴露的分块上传接口

@@ -67,3 +65,3 @@ function sliceUploadFile(params, callback) {

if (!self._isRunningTask(TaskId)) return;
session.upload.removeUsing(UploadData.UploadId);
session.removeUsing(UploadData.UploadId);
if (err) {

@@ -73,3 +71,3 @@ onProgress(null, true);

}
session.upload.removeUploadId.call(self, UploadData.UploadId);
session.removeUploadId.call(self, UploadData.UploadId);
onProgress({ loaded: FileSize, total: FileSize }, true);

@@ -84,5 +82,5 @@ ep.emit('upload_complete', data);

// 处理 UploadId 缓存
var uuid = session.upload.getFileId(params.FileStat, params.ChunkSize, Bucket, Key);
uuid && session.upload.saveUploadId.call(self, uuid, UploadData.UploadId, self.options.UploadIdCacheLimit); // 缓存 UploadId
session.upload.setUsing(UploadData.UploadId); // 标记 UploadId 为正在使用
var uuid = session.getFileId(params.FileStat, params.ChunkSize, Bucket, Key);
uuid && session.saveUploadId.call(self, uuid, UploadData.UploadId, self.options.UploadIdCacheLimit); // 缓存 UploadId
session.setUsing(UploadData.UploadId); // 标记 UploadId 为正在使用

@@ -332,3 +330,3 @@ // 获取 UploadId

// 如果正在上传,跳过
if (session.upload.using[UploadId]) {
if (session.using[UploadId]) {
asyncCallback(); // 检查下一个 UploadId

@@ -349,3 +347,3 @@ return;

if (err) {
session.upload.removeUsing(UploadId);
session.removeUsing(UploadId);
return ep.emit('error', err);

@@ -389,4 +387,4 @@ }

// 在本地找可用的 UploadId
var uuid = session.upload.getFileId(params.FileStat, params.ChunkSize, Bucket, Key);
var LocalUploadIdList = session.upload.getUploadIdList.call(self, uuid);
var uuid = session.getFileId(params.FileStat, params.ChunkSize, Bucket, Key);
var LocalUploadIdList = session.getUploadIdList.call(self, uuid);
if (!uuid || !LocalUploadIdList) {

@@ -405,3 +403,3 @@ ep.emit('has_and_check_upload_id', RemoteUploadIdList);

if (!util.isInArray(RemoteUploadIdList, UploadId)) {
session.upload.removeUploadId.call(self, UploadId);
session.removeUploadId.call(self, UploadId);
next(index + 1);

@@ -411,3 +409,3 @@ return;

// 如果正在上传,跳过
if (session.upload.using[UploadId]) {
if (session.using[UploadId]) {
next(index + 1);

@@ -429,3 +427,3 @@ return;

// 如果 UploadId 获取会出错,跳过并删除
session.upload.removeUploadId.call(self, UploadId);
session.removeUploadId.call(self, UploadId);
next(index + 1);

@@ -473,7 +471,7 @@ } else {

// 远端没有 UploadId,清理缓存的 UploadId
var uuid = session.upload.getFileId(params.FileStat, params.ChunkSize, Bucket, Key),
var uuid = session.getFileId(params.FileStat, params.ChunkSize, Bucket, Key),
LocalUploadIdList;
if (uuid && (LocalUploadIdList = session.upload.getUploadIdList.call(self, uuid))) {
if (uuid && (LocalUploadIdList = session.getUploadIdList.call(self, uuid))) {
util.each(LocalUploadIdList, function (UploadId) {
session.upload.removeUploadId.call(self, UploadId);
session.removeUploadId.call(self, UploadId);
});

@@ -1117,3 +1115,3 @@ }

function (err, data) {
session.upload.removeUsing(UploadData.UploadId); // 标记 UploadId 没被使用了,因为复制没提供重试,所以只要出错,就是 UploadId 停用了。
session.removeUsing(UploadData.UploadId); // 标记 UploadId 没被使用了,因为复制没提供重试,所以只要出错,就是 UploadId 停用了。
if (err) {

@@ -1123,3 +1121,3 @@ onProgress(null, true);

}
session.upload.removeUploadId.call(self, UploadData.UploadId);
session.removeUploadId.call(self, UploadData.UploadId);
onProgress({ loaded: FileSize, total: FileSize }, true);

@@ -1133,5 +1131,5 @@ callback(null, data);

// 处理 UploadId 缓存
var uuid = session.upload.getCopyFileId(CopySource, SourceResHeaders, ChunkSize, Bucket, Key);
uuid && session.upload.saveUploadId.call(self, uuid, UploadData.UploadId, self.options.UploadIdCacheLimit); // 缓存 UploadId
session.upload.setUsing(UploadData.UploadId); // 标记 UploadId 为正在使用
var uuid = session.getCopyFileId(CopySource, SourceResHeaders, ChunkSize, Bucket, Key);
uuid && session.saveUploadId.call(self, uuid, UploadData.UploadId, self.options.UploadIdCacheLimit); // 缓存 UploadId
session.setUsing(UploadData.UploadId); // 标记 UploadId 为正在使用

@@ -1179,3 +1177,3 @@ var needCopySlices = util.filter(UploadData.PartList, function (SliceItem) {

if (err) {
session.upload.removeUsing(UploadData.UploadId); // 标记 UploadId 没被使用了,因为复制没提供重试,所以只要出错,就是 UploadId 停用了。
session.removeUsing(UploadData.UploadId); // 标记 UploadId 没被使用了,因为复制没提供重试,所以只要出错,就是 UploadId 停用了。
onProgress(null, true);

@@ -1207,4 +1205,4 @@ return callback(err);

// 在本地找可用的 UploadId
var uuid = session.upload.getCopyFileId(CopySource, SourceResHeaders, ChunkSize, Bucket, Key);
var LocalUploadIdList = session.upload.getUploadIdList.call(self, uuid);
var uuid = session.getCopyFileId(CopySource, SourceResHeaders, ChunkSize, Bucket, Key);
var LocalUploadIdList = session.getUploadIdList.call(self, uuid);
if (!uuid || !LocalUploadIdList) return createNewUploadId();

@@ -1217,3 +1215,3 @@

// 如果正在被使用,跳过
if (session.upload.using[UploadId]) return next(index + 1);
if (session.using[UploadId]) return next(index + 1);
// 判断 UploadId 是否存在线上

@@ -1231,7 +1229,7 @@ wholeMultipartListPart.call(

// 如果 UploadId 获取会出错,跳过并删除
session.upload.removeUploadId.call(self, UploadId);
session.removeUploadId.call(self, UploadId);
next(index + 1);
} else {
// 如果异步回来 UploadId 已经被用了,也跳过
if (session.upload.using[UploadId]) return next(index + 1);
if (session.using[UploadId]) return next(index + 1);
// 找到可用 UploadId

@@ -1440,4 +1438,2 @@ var finishETagMap = {};

var FilePath = params.FilePath;
var TmpPath = FilePath + '.part';
var checkCrc64 = params.CheckCrc64 || false;
var FileSize;

@@ -1453,3 +1449,2 @@ var FinishSize = 0;

var head = {};
var downloadId;

@@ -1566,3 +1561,2 @@ ep.on('error', function (err) {

end: end,
loaded: false,
};

@@ -1573,59 +1567,14 @@ list.push(item);

ep.emit('seek_local_avail_download_id');
ep.emit('prepare_file');
});
// 在本地缓存找可用的 DownloadId
ep.on('seek_local_avail_download_id', function () {
downloadId = session.download.getFileId(FilePath, FileSize, head.mtime, ChunkSize, Bucket, Key);
var localDownloadInfo = session.download.getDownloadInfo.call(self, downloadId);
// 本地无缓存记录,需要从头下载
if (!downloadId || !localDownloadInfo) {
ep.emit('prepare_file', false);
return;
}
// 本地缓存和远端文件已经不一致,需要重新下载
if (localDownloadInfo.size !== head.size ||
localDownloadInfo.crc64ecma !== head.crc64ecma) {
ep.emit('prepare_file', false);
return;
}
ep.emit('prepare_file', true);
});
var saveDownloadInfo = function() {
session.download.saveDownloadId(downloadId, {
key: params.Key,
size: FileSize,
crc64ecma: head.crc64ecma,
parts: PartList
// 准备要下载的空文件
ep.on('prepare_file', function () {
fs.writeFile(FilePath, '', (err) => {
if (err) {
ep.emit('error', err.code === 'EISDIR' ? { code: 'exist_same_dir', message: FilePath } : err);
} else {
ep.emit('start_download_chunks');
}
});
}
var removeDownloadInfo = function(downloadId) {
session.download.removeUploadId(downloadId);
}
// 准备要下载的文件
ep.on('prepare_file', function (continueDownload) {
if (continueDownload) {
// 可以续下载
var localDownloadInfo = session.download.getDownloadInfo.call(self, downloadId);
PartList = localDownloadInfo.parts;
PartList.forEach(function(part) {
if (part.loaded) {
FinishSize += part.end - part.start;
}
});
ep.emit('start_download_chunks', { loaded: FinishSize });
} else {
// 创建空临时文件
fs.writeFile(TmpPath, '', (err) => {
if (err) {
ep.emit('error', err.code === 'EISDIR' ? { code: 'exist_same_dir', message: TmpPath } : err);
} else {
saveDownloadInfo();
ep.emit('start_download_chunks', { loaded: 0 });
}
});
}
});

@@ -1635,16 +1584,7 @@

var result;
ep.on('start_download_chunks', function (partsInfo) {
onProgress({ loaded: partsInfo.loaded || 0, total: FileSize }, true);
ep.on('start_download_chunks', function () {
onProgress({ loaded: 0, total: FileSize }, true);
var maxPartNumber = PartList.length;
var todoPartList = PartList.filter(function(part) {
return !part.loaded;
});
if (todoPartList.legnth === 0) {
// 缓存已经完成下载,为了获取回调只下载最后一块
todoPartList = PartList.filter(function(part) {
return part.PartNumber === maxPartNumber;
});
}
Async.eachLimit(
todoPartList,
PartList,
ParallelLimit,

@@ -1660,3 +1600,3 @@ function (part, nextChunk) {

Headers.Range = 'bytes=' + part.start + '-' + part.end;
const writeStream = fs.createWriteStream(TmpPath, {
const writeStream = fs.createWriteStream(FilePath, {
start: part.start,

@@ -1701,7 +1641,5 @@ flags: 'r+',

var changed;
if (chunkHeaders['x-cos-hash-crc64ecma'] !== head.crc64ecma) {
if (chunkHeaders['x-cos-hash-crc64ecma'] !== head.crc64ecma)
changed = 'download error, x-cos-hash-crc64ecma has changed.';
} else if (totalSize !== head.size) {
changed = 'download error, Last-Modified has changed.';
}
else if (totalSize !== head.size) changed = 'download error, Last-Modified has changed.';
// else if (data.ETag !== head.ETag) error = 'download error, ETag has changed.';

@@ -1722,29 +1660,6 @@ // else if (chunkHeaders['last-modified'] !== head.mtime) error = 'download error, Last-Modified has changed.';

} else {
if (checkCrc64) {
// 需要校验 crc64
crc64.crc64_file(TmpPath, { start: part.start, end: part.end }, function(err, content) {
if (err) {
ep.emit('error', {
code: 'ReadChunkError',
message: e.message || '',
statusCode: data.statusCode,
header: chunkHeaders,
});
self.emit('inner-kill-task', { TaskId: TaskId });
} else {
FinishSize += chunkReadSize - preAddSize;
part.loaded = true;
part.crc64 = content;
saveDownloadInfo();
onProgress({ loaded: FinishSize, total: FileSize });
tryCallback(err, data);
}
});
} else {
FinishSize += chunkReadSize - preAddSize;
part.loaded = true;
saveDownloadInfo();
onProgress({ loaded: FinishSize, total: FileSize });
tryCallback(err, data);
}
FinishSize += chunkReadSize - preAddSize;
part.loaded = true;
onProgress({ loaded: FinishSize, total: FileSize });
tryCallback(err, data);
}

@@ -1771,51 +1686,5 @@ }

ep.on('download_chunks_complete', function () {
if (checkCrc64) {
// 对比 crc64
var max = PartList.length;
var resCrc64 = PartList[0].crc64;
for(var i = 1; i < max; i++) {
var partInfo = PartList[i];
var partCrc64 = partInfo.crc64;
var partLength = partInfo.end - partInfo.start + 1;
resCrc64 = crc64.crc64_combine(resCrc64, partCrc64, partLength);
}
var remoteCrc64 = head['crc64ecma'];
if (resCrc64.toString() === remoteCrc64) {
ep.emit('download_finished', { err: null, data: result });
} else {
ep.emit('download_finished', {
err: {
code: 'ObjectHasChanged',
message: 'download error, x-cos-hash-crc64ecma is not equal local crc64',
statusCode: result.statusCode,
header: result.headers,
}
});
}
} else {
ep.emit('download_finished', { err: null, data: result });
}
callback(null, result);
});
ep.on('download_finished', function(info) {
var err = info.err;
var data = info.data;
fs.rename(TmpPath, FilePath, (error) => {
if (error) {
// 下载完成但是重命名失败
callback({
code: 'RenameError',
message: error.message || '',
statusCode: result.statusCode,
header: result.headers,
});
} else {
// 下载成功
removeDownloadInfo(downloadId);
callback(err, data);
}
});
});
// 监听 取消任务

@@ -1822,0 +1691,0 @@ var killTask = function (info) {

var util = require('./util');
// 按照文件特征值,缓存 UploadId
var cacheKey = 'cos_sdk_upload_cache';
var expires = 30 * 24 * 3600;
var store;
var cache;
var timer;
var uploadMod = {
// 按照文件特征值,缓存 UploadId
cacheKey: 'cos_sdk_upload_cache',
store: null,
cache: null,
timer: null,
getCache: function() {
var val,
opt = { configName: 'cos-nodejs-sdk-v5-storage' };
if (this.options.ConfCwd) opt.cwd = this.options.ConfCwd;
try {
var Conf = require('conf');
uploadMod.store = new Conf(opt);
val = uploadMod.store.get(cacheKey.cacheKey);
} catch (e) {}
if (!val || !(val instanceof Array)) val = [];
uploadMod.cache = val;
},
setCache: function () {
try {
if (uploadMod.cache.length) uploadMod.store.set(uploadMod.cacheKey, uploadMod.cache);
else uploadMod.store.delete(uploadMod.cacheKey);
} catch (e) {}
},
init: function () {
if (uploadMod.cache) return;
uploadMod.getCache.call(this);
// 清理太老旧的数据
var changed = false;
var now = Math.round(Date.now() / 1000);
for (var i = uploadMod.cache.length - 1; i >= 0; i--) {
var mtime = uploadMod.cache[i][2];
if (!mtime || mtime + expires < now) {
uploadMod.cache.splice(i, 1);
changed = true;
}
var getCache = function () {
var val,
opt = { configName: 'cos-nodejs-sdk-v5-storage' };
if (this.options.ConfCwd) opt.cwd = this.options.ConfCwd;
try {
var Conf = require('conf');
store = new Conf(opt);
val = store.get(cacheKey);
} catch (e) {}
if (!val || !(val instanceof Array)) val = [];
cache = val;
};
var setCache = function () {
try {
if (cache.length) store.set(cacheKey, cache);
else store.delete(cacheKey);
} catch (e) {}
};
var init = function () {
if (cache) return;
getCache.call(this);
// 清理太老旧的数据
var changed = false;
var now = Math.round(Date.now() / 1000);
for (var i = cache.length - 1; i >= 0; i--) {
var mtime = cache[i][2];
if (!mtime || mtime + expires < now) {
cache.splice(i, 1);
changed = true;
}
changed && uploadMod.setCache();
},
// 把缓存存到本地
save: function () {
if (uploadMod.timer) return;
uploadMod.timer = setTimeout(function () {
uploadMod.setCache();
uploadMod.timer = null;
}, 400);
},
}
changed && setCache();
};
// 把缓存存到本地
var save = function () {
if (timer) return;
timer = setTimeout(function () {
setCache();
timer = null;
}, 400);
};
var mod = {
using: {},
// 标记 UploadId 正在使用
setUsing: function (uuid) {
uploadMod.using[uuid] = true;
mod.using[uuid] = true;
},
// 标记 UploadId 已经没在使用
removeUsing: function (uuid) {
delete uploadMod.using[uuid];
delete mod.using[uuid];
},

@@ -86,6 +89,6 @@ // 用上传参数生成哈希值

if (!uuid) return null;
uploadMod.init.call(this);
init.call(this);
var list = [];
for (var i = 0; i < uploadMod.cache.length; i++) {
if (uploadMod.cache[i][0] === uuid) list.push(uploadMod.cache[i][1]);
for (var i = 0; i < cache.length; i++) {
if (cache[i][0] === uuid) list.push(cache[i][1]);
}

@@ -96,124 +99,30 @@ return list.length ? list : null;

saveUploadId: function (uuid, UploadId, limit) {
uploadMod.init.call(this);
init.call(this);
if (!uuid) return;
// 清理没用的 UploadId
var part1 = uuid.substr(0, uuid.indexOf('-') + 1);
for (var i = uploadMod.cache.length - 1; i >= 0; i--) {
var item = uploadMod.cache[i];
for (var i = cache.length - 1; i >= 0; i--) {
var item = cache[i];
if (item[0] === uuid && item[1] === UploadId) {
uploadMod.cache.splice(i, 1);
cache.splice(i, 1);
} else if (uuid !== item[0] && item[0].indexOf(part1) === 0) {
// 文件路径相同,但其他信息不同,说明文件改变了或上传参数(存储桶、路径、分片大小)变了,直接清理掉
uploadMod.cache.splice(i, 1);
cache.splice(i, 1);
}
}
uploadMod.cache.unshift([uuid, UploadId, Math.round(Date.now() / 1000)]);
if (uploadMod.cache.length > limit) uploadMod.cache.splice(limit);
uploadMod.save();
cache.unshift([uuid, UploadId, Math.round(Date.now() / 1000)]);
if (cache.length > limit) cache.splice(limit);
save();
},
// UploadId 已用完,移除掉
removeUploadId: function (UploadId) {
uploadMod.init.call(this);
delete uploadMod.using[UploadId];
for (var i = uploadMod.cache.length - 1; i >= 0; i--) {
if (uploadMod.cache[i][1] === UploadId) uploadMod.cache.splice(i, 1);
init.call(this);
delete mod.using[UploadId];
for (var i = cache.length - 1; i >= 0; i--) {
if (cache[i][1] === UploadId) cache.splice(i, 1);
}
uploadMod.save();
save();
},
};
var downloadMod = {
// 按照文件特征值,缓存 DownloadId
cacheKey: 'cos_sdk_download_cache',
store: null,
cache: null,
timer: null,
getCache: function() {
var val,
opt = { configName: 'cos-nodejs-sdk-v5-storage' };
if (this.options.ConfCwd) opt.cwd = this.options.ConfCwd;
try {
var Conf = require('conf');
downloadMod.store = new Conf(opt);
val = downloadMod.store.get(cacheKey.cacheKey);
} catch (e) {}
if (!val) val = {};
downloadMod.cache = val;
},
setCache: function () {
try {
if (downloadMod.cache) downloadMod.store.set(downloadMod.cacheKey, downloadMod.cache);
else downloadMod.store.delete(downloadMod.cacheKey);
} catch (e) {}
},
init: function () {
if (downloadMod.cache) return;
downloadMod.getCache.call(this);
// 清理太老旧的数据
var changed = false;
var now = Math.round(Date.now() / 1000);
for (var i in downloadMod.cache) {
var mtime = downloadMod.cache[i].mtime;
if (!mtime || mtime + expires < now) {
// TODO 清理缓存是否需要清理临时文件
delete downloadMod.cache[i];
changed = true;
}
}
changed && downloadMod.setCache();
},
// 把缓存存到本地
save: function () {
if (downloadMod.timer) return;
downloadMod.timer = setTimeout(function () {
downloadMod.setCache();
downloadMod.timer = null;
}, 400);
},
using: {},
// 标记 DownloadId 正在使用
setUsing: function (uuid) {
downloadMod.using[uuid] = true;
},
// 标记 DownloadId 已经没在使用
removeUsing: function (uuid) {
delete downloadMod.using[uuid];
},
// 用下载参数生成哈希值
getFileId: function (FilePath, FileSize, mtime, ChunkSize, Bucket, Key) {
if (FilePath && FileSize && mtime && ChunkSize) {
return (
util.md5([FilePath].join('::')) +
'-' +
util.md5([FileSize, mtime, ChunkSize, Bucket, Key].join('::'))
);
} else {
return null;
}
},
// 获取文件对应的 DownloadId 列表
getDownloadInfo: function (uuid) {
if (!uuid) return null;
downloadMod.init.call(this);
return downloadMod.cache[uuid] || null;
},
// 缓存 DownloadId
saveDownloadId: function (uuid, DownloadInfo) {
downloadMod.init.call(this);
if (!uuid) return;
downloadMod.cache[uuid] = DownloadInfo;
downloadMod.save();
},
// DownloadId 已用完,移除掉
removeUploadId: function (uuid) {
downloadMod.init.call(this);
delete downloadMod.using[uuid];
delete downloadMod.cache[uuid];
downloadMod.save();
},
};
module.exports = {
upload: uploadMod,
download: downloadMod,
};
module.exports = mod;

@@ -134,3 +134,3 @@ var session = require('./session');

} catch (e) {}
if (switchToState === 'canceled' && UploadId) session.upload.removeUsing(UploadId);
if (switchToState === 'canceled' && UploadId) session.removeUsing(UploadId);
emitListUpdate();

@@ -137,0 +137,0 @@ if (running) {

@@ -532,10 +532,4 @@ 'use strict';

}
// 除了下列 api,如果 Key 是 / 开头,强制去掉第一个 /
var dontRemoveApi = ['sliceUploadFile', 'uploadFile', 'downloadFile', 'sliceCopyFile'];
if (
!self.options.UseRawKey &&
params.Key &&
params.Key.substr(0, 1) === '/' &&
!dontRemoveApi.includes(apiName)
) {
// 如果 Key 是 / 开头,强制去掉第一个 /
if (!self.options.UseRawKey && params.Key && params.Key.substr(0, 1) === '/') {
params.Key = params.Key.substr(1);

@@ -542,0 +536,0 @@ }

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc