session.js 3.1 KB

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