session.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. var util = require('./util');
  2. // 按照文件特征值,缓存 UploadId
  3. var cacheKey = 'cos_sdk_upload_cache';
  4. var expires = 30 * 24 * 3600;
  5. var cache;
  6. var timer;
  7. var getCache = function () {
  8. try {
  9. var val = JSON.parse(wx.getStorageSync(cacheKey));
  10. } catch (e) {}
  11. if (!val) val = [];
  12. return val;
  13. };
  14. var setCache = function () {
  15. try {
  16. if (cache.length) wx.setStorageSync(cacheKey, JSON.stringify(cache));
  17. else wx.removeStorageSync(cacheKey);
  18. } catch (e) {}
  19. };
  20. var init = function () {
  21. if (cache) return;
  22. cache = getCache();
  23. // 清理太老旧的数据
  24. var changed = false;
  25. var now = Math.round(Date.now() / 1000);
  26. for (var i = cache.length - 1; i >= 0; i--) {
  27. var mtime = cache[i][2];
  28. if (!mtime || mtime + expires < now) {
  29. cache.splice(i, 1);
  30. changed = true;
  31. }
  32. }
  33. changed && setCache();
  34. };
  35. // 把缓存存到本地
  36. var save = function () {
  37. if (timer) return;
  38. timer = setTimeout(function () {
  39. setCache();
  40. timer = null;
  41. }, 400);
  42. };
  43. var mod = {
  44. using: {},
  45. // 标记 UploadId 正在使用
  46. setUsing: function (uuid) {
  47. mod.using[uuid] = true;
  48. },
  49. // 标记 UploadId 已经没在使用
  50. removeUsing: function (uuid) {
  51. delete mod.using[uuid];
  52. },
  53. // 用上传参数生成哈希值
  54. getFileId: function (FileStat, ChunkSize, Bucket, Key) {
  55. if (FileStat.FilePath && FileStat.size && FileStat.lastModifiedTime && ChunkSize) {
  56. return (
  57. util.md5([FileStat.FilePath].join('::')) +
  58. '-' +
  59. util.md5(
  60. [
  61. FileStat.size,
  62. FileStat.mode,
  63. FileStat.lastAccessedTime,
  64. FileStat.lastModifiedTime,
  65. ChunkSize,
  66. Bucket,
  67. Key,
  68. ].join('::')
  69. )
  70. );
  71. } else {
  72. return null;
  73. }
  74. },
  75. // 用上传参数生成哈希值
  76. getCopyFileId: function (copySource, sourceHeaders, ChunkSize, Bucket, Key) {
  77. var size = sourceHeaders['content-length'];
  78. var etag = sourceHeaders.etag || '';
  79. var lastModified = sourceHeaders['last-modified'];
  80. if (copySource && ChunkSize) {
  81. return util.md5([copySource, size, etag, lastModified, ChunkSize, Bucket, Key].join('::'));
  82. } else {
  83. return null;
  84. }
  85. },
  86. // 获取文件对应的 UploadId 列表
  87. getUploadIdList: function (uuid) {
  88. if (!uuid) return null;
  89. init();
  90. var list = [];
  91. for (var i = 0; i < cache.length; i++) {
  92. if (cache[i][0] === uuid) list.push(cache[i][1]);
  93. }
  94. return list.length ? list : null;
  95. },
  96. // 缓存 UploadId
  97. saveUploadId: function (uuid, UploadId, limit) {
  98. init();
  99. if (!uuid) return;
  100. // 清理没用的 UploadId
  101. var part1 = uuid.substr(0, uuid.indexOf('-') + 1);
  102. for (var i = cache.length - 1; i >= 0; i--) {
  103. var item = cache[i];
  104. if (item[0] === uuid && item[1] === UploadId) {
  105. cache.splice(i, 1);
  106. } else if (uuid !== item[0] && item[0].indexOf(part1) === 0) {
  107. // 文件路径相同,但其他信息不同,说明文件改变了或上传参数(存储桶、路径、分片大小)变了,直接清理掉
  108. cache.splice(i, 1);
  109. }
  110. }
  111. cache.unshift([uuid, UploadId, Math.round(Date.now() / 1000)]);
  112. if (cache.length > limit) cache.splice(limit);
  113. save();
  114. },
  115. // UploadId 已用完,移除掉
  116. removeUploadId: function (UploadId) {
  117. init();
  118. delete mod.using[UploadId];
  119. for (var i = cache.length - 1; i >= 0; i--) {
  120. if (cache[i][1] === UploadId) cache.splice(i, 1);
  121. }
  122. save();
  123. },
  124. };
  125. module.exports = mod;