cos-nodejs-sdk-v5
Advanced tools
Comparing version 2.14.1 to 2.14.2-beta0
{ | ||
"name": "cos-nodejs-sdk-v5", | ||
"version": "2.14.1", | ||
"version": "2.14.2-beta0", | ||
"description": "cos nodejs sdk v5", | ||
@@ -36,2 +36,3 @@ "main": "index.js", | ||
"conf": "^9.0.0", | ||
"crc64-ecma182.js": "2.0.2", | ||
"fast-xml-parser": "4.2.5", | ||
@@ -44,3 +45,2 @@ "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,3 +6,5 @@ var session = require('./session'); | ||
var util = require('./util'); | ||
var crc64 = require('../lib/crc64'); | ||
// 文件分块上传全过程,暴露的分块上传接口 | ||
@@ -65,3 +67,3 @@ function sliceUploadFile(params, callback) { | ||
if (!self._isRunningTask(TaskId)) return; | ||
session.removeUsing(UploadData.UploadId); | ||
session.upload.removeUsing(UploadData.UploadId); | ||
if (err) { | ||
@@ -71,3 +73,3 @@ onProgress(null, true); | ||
} | ||
session.removeUploadId.call(self, UploadData.UploadId); | ||
session.upload.removeUploadId.call(self, UploadData.UploadId); | ||
onProgress({ loaded: FileSize, total: FileSize }, true); | ||
@@ -82,5 +84,5 @@ ep.emit('upload_complete', data); | ||
// 处理 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 为正在使用 | ||
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 为正在使用 | ||
@@ -330,3 +332,3 @@ // 获取 UploadId | ||
// 如果正在上传,跳过 | ||
if (session.using[UploadId]) { | ||
if (session.upload.using[UploadId]) { | ||
asyncCallback(); // 检查下一个 UploadId | ||
@@ -347,3 +349,3 @@ return; | ||
if (err) { | ||
session.removeUsing(UploadId); | ||
session.upload.removeUsing(UploadId); | ||
return ep.emit('error', err); | ||
@@ -387,4 +389,4 @@ } | ||
// 在本地找可用的 UploadId | ||
var uuid = session.getFileId(params.FileStat, params.ChunkSize, Bucket, Key); | ||
var LocalUploadIdList = session.getUploadIdList.call(self, uuid); | ||
var uuid = session.upload.getFileId(params.FileStat, params.ChunkSize, Bucket, Key); | ||
var LocalUploadIdList = session.upload.getUploadIdList.call(self, uuid); | ||
if (!uuid || !LocalUploadIdList) { | ||
@@ -403,3 +405,3 @@ ep.emit('has_and_check_upload_id', RemoteUploadIdList); | ||
if (!util.isInArray(RemoteUploadIdList, UploadId)) { | ||
session.removeUploadId.call(self, UploadId); | ||
session.upload.removeUploadId.call(self, UploadId); | ||
next(index + 1); | ||
@@ -409,3 +411,3 @@ return; | ||
// 如果正在上传,跳过 | ||
if (session.using[UploadId]) { | ||
if (session.upload.using[UploadId]) { | ||
next(index + 1); | ||
@@ -427,3 +429,3 @@ return; | ||
// 如果 UploadId 获取会出错,跳过并删除 | ||
session.removeUploadId.call(self, UploadId); | ||
session.upload.removeUploadId.call(self, UploadId); | ||
next(index + 1); | ||
@@ -471,7 +473,7 @@ } else { | ||
// 远端没有 UploadId,清理缓存的 UploadId | ||
var uuid = session.getFileId(params.FileStat, params.ChunkSize, Bucket, Key), | ||
var uuid = session.upload.getFileId(params.FileStat, params.ChunkSize, Bucket, Key), | ||
LocalUploadIdList; | ||
if (uuid && (LocalUploadIdList = session.getUploadIdList.call(self, uuid))) { | ||
if (uuid && (LocalUploadIdList = session.upload.getUploadIdList.call(self, uuid))) { | ||
util.each(LocalUploadIdList, function (UploadId) { | ||
session.removeUploadId.call(self, UploadId); | ||
session.upload.removeUploadId.call(self, UploadId); | ||
}); | ||
@@ -1115,3 +1117,3 @@ } | ||
function (err, data) { | ||
session.removeUsing(UploadData.UploadId); // 标记 UploadId 没被使用了,因为复制没提供重试,所以只要出错,就是 UploadId 停用了。 | ||
session.upload.removeUsing(UploadData.UploadId); // 标记 UploadId 没被使用了,因为复制没提供重试,所以只要出错,就是 UploadId 停用了。 | ||
if (err) { | ||
@@ -1121,3 +1123,3 @@ onProgress(null, true); | ||
} | ||
session.removeUploadId.call(self, UploadData.UploadId); | ||
session.upload.removeUploadId.call(self, UploadData.UploadId); | ||
onProgress({ loaded: FileSize, total: FileSize }, true); | ||
@@ -1131,5 +1133,5 @@ callback(null, data); | ||
// 处理 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 为正在使用 | ||
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 为正在使用 | ||
@@ -1177,3 +1179,3 @@ var needCopySlices = util.filter(UploadData.PartList, function (SliceItem) { | ||
if (err) { | ||
session.removeUsing(UploadData.UploadId); // 标记 UploadId 没被使用了,因为复制没提供重试,所以只要出错,就是 UploadId 停用了。 | ||
session.upload.removeUsing(UploadData.UploadId); // 标记 UploadId 没被使用了,因为复制没提供重试,所以只要出错,就是 UploadId 停用了。 | ||
onProgress(null, true); | ||
@@ -1205,4 +1207,4 @@ return callback(err); | ||
// 在本地找可用的 UploadId | ||
var uuid = session.getCopyFileId(CopySource, SourceResHeaders, ChunkSize, Bucket, Key); | ||
var LocalUploadIdList = session.getUploadIdList.call(self, uuid); | ||
var uuid = session.upload.getCopyFileId(CopySource, SourceResHeaders, ChunkSize, Bucket, Key); | ||
var LocalUploadIdList = session.upload.getUploadIdList.call(self, uuid); | ||
if (!uuid || !LocalUploadIdList) return createNewUploadId(); | ||
@@ -1215,3 +1217,3 @@ | ||
// 如果正在被使用,跳过 | ||
if (session.using[UploadId]) return next(index + 1); | ||
if (session.upload.using[UploadId]) return next(index + 1); | ||
// 判断 UploadId 是否存在线上 | ||
@@ -1229,7 +1231,7 @@ wholeMultipartListPart.call( | ||
// 如果 UploadId 获取会出错,跳过并删除 | ||
session.removeUploadId.call(self, UploadId); | ||
session.upload.removeUploadId.call(self, UploadId); | ||
next(index + 1); | ||
} else { | ||
// 如果异步回来 UploadId 已经被用了,也跳过 | ||
if (session.using[UploadId]) return next(index + 1); | ||
if (session.upload.using[UploadId]) return next(index + 1); | ||
// 找到可用 UploadId | ||
@@ -1438,2 +1440,4 @@ var finishETagMap = {}; | ||
var FilePath = params.FilePath; | ||
var TmpPath = FilePath + '.part'; | ||
var checkCrc64 = params.CheckCrc64 || false; | ||
var FileSize; | ||
@@ -1449,2 +1453,3 @@ var FinishSize = 0; | ||
var head = {}; | ||
var downloadId; | ||
@@ -1561,2 +1566,3 @@ ep.on('error', function (err) { | ||
end: end, | ||
loaded: false, | ||
}; | ||
@@ -1567,14 +1573,59 @@ list.push(item); | ||
ep.emit('prepare_file'); | ||
ep.emit('seek_local_avail_download_id'); | ||
}); | ||
// 准备要下载的空文件 | ||
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'); | ||
} | ||
// 在本地缓存找可用的 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 | ||
}); | ||
} | ||
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 }); | ||
} | ||
}); | ||
} | ||
}); | ||
@@ -1584,7 +1635,16 @@ | ||
var result; | ||
ep.on('start_download_chunks', function () { | ||
onProgress({ loaded: 0, total: FileSize }, true); | ||
ep.on('start_download_chunks', function (partsInfo) { | ||
onProgress({ loaded: partsInfo.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( | ||
PartList, | ||
todoPartList, | ||
ParallelLimit, | ||
@@ -1600,3 +1660,3 @@ function (part, nextChunk) { | ||
Headers.Range = 'bytes=' + part.start + '-' + part.end; | ||
const writeStream = fs.createWriteStream(FilePath, { | ||
const writeStream = fs.createWriteStream(TmpPath, { | ||
start: part.start, | ||
@@ -1641,5 +1701,7 @@ 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.'; | ||
@@ -1660,6 +1722,29 @@ // else if (chunkHeaders['last-modified'] !== head.mtime) error = 'download error, Last-Modified has changed.'; | ||
} else { | ||
FinishSize += chunkReadSize - preAddSize; | ||
part.loaded = true; | ||
onProgress({ loaded: FinishSize, total: FileSize }); | ||
tryCallback(err, data); | ||
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); | ||
} | ||
} | ||
@@ -1686,5 +1771,51 @@ } | ||
ep.on('download_chunks_complete', function () { | ||
callback(null, result); | ||
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 }); | ||
} | ||
}); | ||
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); | ||
} | ||
}); | ||
}); | ||
// 监听 取消任务 | ||
@@ -1691,0 +1822,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 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; | ||
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; | ||
} | ||
} | ||
} | ||
changed && setCache(); | ||
}; | ||
// 把缓存存到本地 | ||
var save = function () { | ||
if (timer) return; | ||
timer = setTimeout(function () { | ||
setCache(); | ||
timer = null; | ||
}, 400); | ||
}; | ||
var mod = { | ||
changed && uploadMod.setCache(); | ||
}, | ||
// 把缓存存到本地 | ||
save: function () { | ||
if (uploadMod.timer) return; | ||
uploadMod.timer = setTimeout(function () { | ||
uploadMod.setCache(); | ||
uploadMod.timer = null; | ||
}, 400); | ||
}, | ||
using: {}, | ||
// 标记 UploadId 正在使用 | ||
setUsing: function (uuid) { | ||
mod.using[uuid] = true; | ||
uploadMod.using[uuid] = true; | ||
}, | ||
// 标记 UploadId 已经没在使用 | ||
removeUsing: function (uuid) { | ||
delete mod.using[uuid]; | ||
delete uploadMod.using[uuid]; | ||
}, | ||
@@ -89,6 +86,6 @@ // 用上传参数生成哈希值 | ||
if (!uuid) return null; | ||
init.call(this); | ||
uploadMod.init.call(this); | ||
var list = []; | ||
for (var i = 0; i < cache.length; i++) { | ||
if (cache[i][0] === uuid) list.push(cache[i][1]); | ||
for (var i = 0; i < uploadMod.cache.length; i++) { | ||
if (uploadMod.cache[i][0] === uuid) list.push(uploadMod.cache[i][1]); | ||
} | ||
@@ -99,30 +96,124 @@ return list.length ? list : null; | ||
saveUploadId: function (uuid, UploadId, limit) { | ||
init.call(this); | ||
uploadMod.init.call(this); | ||
if (!uuid) return; | ||
// 清理没用的 UploadId | ||
var part1 = uuid.substr(0, uuid.indexOf('-') + 1); | ||
for (var i = cache.length - 1; i >= 0; i--) { | ||
var item = cache[i]; | ||
for (var i = uploadMod.cache.length - 1; i >= 0; i--) { | ||
var item = uploadMod.cache[i]; | ||
if (item[0] === uuid && item[1] === UploadId) { | ||
cache.splice(i, 1); | ||
uploadMod.cache.splice(i, 1); | ||
} else if (uuid !== item[0] && item[0].indexOf(part1) === 0) { | ||
// 文件路径相同,但其他信息不同,说明文件改变了或上传参数(存储桶、路径、分片大小)变了,直接清理掉 | ||
cache.splice(i, 1); | ||
uploadMod.cache.splice(i, 1); | ||
} | ||
} | ||
cache.unshift([uuid, UploadId, Math.round(Date.now() / 1000)]); | ||
if (cache.length > limit) cache.splice(limit); | ||
save(); | ||
uploadMod.cache.unshift([uuid, UploadId, Math.round(Date.now() / 1000)]); | ||
if (uploadMod.cache.length > limit) uploadMod.cache.splice(limit); | ||
uploadMod.save(); | ||
}, | ||
// UploadId 已用完,移除掉 | ||
removeUploadId: function (UploadId) { | ||
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.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); | ||
} | ||
save(); | ||
uploadMod.save(); | ||
}, | ||
}; | ||
module.exports = mod; | ||
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, | ||
}; |
@@ -134,3 +134,3 @@ var session = require('./session'); | ||
} catch (e) {} | ||
if (switchToState === 'canceled' && UploadId) session.removeUsing(UploadId); | ||
if (switchToState === 'canceled' && UploadId) session.upload.removeUsing(UploadId); | ||
emitListUpdate(); | ||
@@ -137,0 +137,0 @@ if (running) { |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Deprecated
MaintenanceThe maintainer of the package marked it as deprecated. This could indicate that a single version should not be used, or that the package is no longer maintained and any new vulnerabilities will not be fixed.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
945100
6
27
23397
5
1
1
20
+ Addedcrc64-ecma182.js@2.0.2
+ Addedcrc64-ecma182.js@2.0.2(transitive)