upload.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. ;
  2. (function () {
  3. 'use strict';
  4. const
  5. event = require('myevents'),
  6. Upload = require('uploadfile'),
  7. taskStatus = require('taskstatus'),
  8. md5file = require('md5file'),
  9. nedbCollection = require('nedbCollection'),
  10. appCache = require('app-cache'),
  11. uploadTask = require('uploadtask'),
  12. apiService = require('app-service'),
  13. sysConfig = require('sys-config'),
  14. transfer = require('transfer'),
  15. dbServer = require('db-server'),
  16. fs = require('fs');
  17. var cacheConfig = appCache.local_config();
  18. var _task = {
  19. parallelUploadNum: cacheConfig.task.upload_num || 3,
  20. start: function (upload) {
  21. let uploadManagement = new Upload(upload);
  22. upload = uploadManagement.options;
  23. upload.status = taskStatus.read;
  24. dbServer.upload.status(upload._id, taskStatus.read);
  25. event.emit('upload_change_ctr', upload);
  26. if (!uploadTask.add(upload))
  27. return _task.startNext();//任务已经存在了,进行下一波下载
  28. wfsGateway(upload).then(e => {
  29. upload.url = e.host;
  30. dbServer.upload.modifyMd5(upload._id, upload.md5, upload.url);
  31. upload.status = taskStatus.doing;
  32. event.emit('upload_change_ctr', upload);
  33. dbServer.upload.status(upload._id, taskStatus.doing).then(e => {
  34. return _task._maxSize();
  35. }).then(e => {
  36. if (e)
  37. uploadManagement.startSB();
  38. else {
  39. upload.status = taskStatus.spaceLimit;
  40. event.emit('upload_change_ctr', upload);
  41. dbServer.upload.status(upload._id, upload.status).then(e => {
  42. uploadTask.remove(upload._id);
  43. return _task.startNext();
  44. })
  45. }
  46. });
  47. });
  48. },
  49. startNext: function (id) {
  50. // if (!uploadTask.queue_status)
  51. // return id && dbServer.upload.status(id, taskStatus.stop);
  52. if (uploadTask.taskNum >= _task.parallelUploadNum) {
  53. return dbServer.upload.status(id, taskStatus.wait);
  54. };
  55. nextTask(id).then(upload => {
  56. if (!upload) return event.emit('upload_complete_ctr', { _id: id });
  57. if (uploadTask.taskNum >= _task.parallelUploadNum) {
  58. return dbServer.upload.status(id, taskStatus.wait)
  59. };
  60. _task.start(upload);
  61. });
  62. },
  63. stop: function (id) {
  64. let options = uploadTask.find(id);
  65. if (options) options.status = taskStatus.pause;
  66. dbServer.upload.status(id, taskStatus.pause).then(e => {
  67. uploadTask.remove(id);
  68. _task.startNext();
  69. });
  70. },
  71. delete: function (id) {
  72. let options = uploadTask.find(id);
  73. if (options) options.status = taskStatus.stop;
  74. dbServer.upload.remove(id).then(e => {
  75. uploadTask.remove(id);
  76. _task.startNext();
  77. });
  78. },
  79. clearQueue: function () {
  80. return dbServer.folder.clear().then(e => {
  81. return dbServer.upload.clear();
  82. }).then(e => {
  83. let list = uploadTask.list();
  84. for (let e in list) {
  85. list[e].status = taskStatus.stop;
  86. };
  87. uploadTask.clear();
  88. });
  89. },
  90. stopQueue: function () {
  91. return dbServer.upload.status({}, taskStatus.pause).then(e => {
  92. let list = uploadTask.list();
  93. uploadTask.stopAll();
  94. for (let e in list) {
  95. list[e].status = taskStatus.stop;
  96. };
  97. uploadTask.clear();
  98. });
  99. },
  100. startQueue: function () {
  101. return dbServer.upload.status({}, taskStatus.wait).then(e => {
  102. let num = cacheConfig.task.upload_num;
  103. uploadTask.startAll();
  104. do {
  105. num = num - 1;
  106. _task.startNext();
  107. } while (num)
  108. });
  109. },
  110. _maxSize: function () {
  111. let list = uploadTask.list(),
  112. size = 0;
  113. for (let e in list) size += list[e].size;
  114. return use_space().then(e => { return (e + size) < sysConfig.storage_space; })
  115. },
  116. _onUplodComplete: function (task, options) {
  117. event.emit('upload_complete_ctr', options);
  118. let _id = options._id;
  119. delete options._id;
  120. uploadTask.remove(_id);
  121. dbServer
  122. .upload
  123. .remove(_id)
  124. .then(e => {
  125. _task.startNext();
  126. });
  127. event.emit('upload_notice', options);
  128. event.emit('task_num_change');
  129. // event.emit('fileListRefresh');
  130. },
  131. _onRangeFinish: function (task, options) {
  132. dbServer
  133. .upload
  134. .updateRange(options._id, options.end_len)
  135. .then(function () {
  136. event.emit('upload_change_ctr', options);
  137. })
  138. },
  139. _onPause: function (task, options) {
  140. dbServer.upload.status(task.options._id, taskStatus.pause);
  141. uploadTask.remove(task.options._id)
  142. _task.startNext();
  143. event.emit('upload_change_ctr', options);
  144. },
  145. _upload_error: (task, options) => {
  146. let _id = options._id;
  147. delete options._id;
  148. dbServer
  149. .upload
  150. .status(options._id, options.status)
  151. .then(e => {
  152. _task.startNext();
  153. event.emit('upload_change_ctr', options);
  154. });
  155. }
  156. };
  157. function MD5(upload) {
  158. return md5file(upload.path).then(e => e);
  159. }
  160. function wfsGateway(upload) {
  161. if (upload.md5)
  162. return transfer.wfsGateway.upload(upload.md5); // ({ md5: file_md5, url: e.host })
  163. else {
  164. return MD5(upload).then(md5 => { upload.md5 = md5; return wfsGateway(upload) });
  165. }
  166. }
  167. function nextTask(id) {
  168. return !id ? dbServer.upload.nextTask() : dbServer.upload.findOne({ '_id': id });
  169. }
  170. event.on('upload_error', _task._upload_error);
  171. event.on('upload_complete', _task._onUplodComplete);
  172. event.on('upload_range_finish', _task._onRangeFinish);
  173. event.on('upload_pause', _task._onPause);
  174. function use_space() {
  175. return apiService.use_space().then((d) => {
  176. return d.data.totalAmount;
  177. });
  178. }
  179. transfer.uploadmanager = _task;
  180. }());