index.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. ;
  2. (function () {
  3. const event = require('myevents'),
  4. DownFile = require('downfile'),
  5. taskStatus = require('taskstatus'),
  6. appCache = require('app-cache'),
  7. path = require('path'),
  8. downTaskList = require('downtask'),
  9. transfer = require('transfer'),
  10. dbServer = require('db-server'),
  11. apiService = require('app-service'),
  12. mkpath = require('mkpath'),
  13. md5 = require('md5');
  14. let cacheConfig = appCache.local_config();
  15. let folderTask = {};
  16. var task = {
  17. parallelDownloadNum: cacheConfig.task.down_num,
  18. addTask: function (upload) {
  19. let downfile = new DownFile(upload),
  20. down_options = downfile.options;
  21. if (!downTaskList.add(down_options))
  22. return task.startNext(); //如果已经存在了,进行下一波的下载
  23. return wfsGateway(down_options).then(host => {
  24. if (host) {
  25. down_options.url = host;
  26. down_options.status = taskStatus.doing;
  27. } else {
  28. down_options.status = taskStatus.netError;
  29. }
  30. return dbServer.down.status(down_options._id, down_options.status);
  31. }).then(e => {
  32. if (down_options.status === taskStatus.doing)
  33. downfile.start();
  34. else {
  35. downTaskList.remove(downfile._id);
  36. }
  37. event.emit('down_change_ctr', down_options);
  38. });
  39. },
  40. pause: function (id) {
  41. var downfile = downTaskList.find(id);
  42. if (downfile) {
  43. downfile.status = taskStatus.pause;
  44. downTaskList.remove(id);
  45. };
  46. dbServer.down.status(id, taskStatus.pause).then(e => {
  47. task.startNext();
  48. });
  49. },
  50. startNext: function (id) {
  51. if (downTaskList.taskNum >= task.parallelDownloadNum) {
  52. id && dbServer.down.status(id, taskStatus.wait);
  53. return false;
  54. };
  55. return nextTask(id).then(doc => {
  56. if (!doc) {
  57. return id && event.emit('down_complete_ctr', { _id: id });
  58. }
  59. if (downTaskList.taskNum >= task.parallelDownloadNum)
  60. return dbServer.down.status(id, taskStatus.wait);
  61. return task.addTask(doc);
  62. });
  63. },
  64. remove: function (id) {
  65. var options = downTaskList.find(id);
  66. if (options) options.status = taskStatus.stop;
  67. return dbServer.down.remove(id).then(e => {
  68. downTaskList.remove(id);
  69. task.startNext();
  70. });
  71. },
  72. stop: function (id) {
  73. let options = downTaskList.find(id);
  74. if (options) options.status = taskStatus.stop;
  75. dbServer.down.status(id, taskStatus.stop).then(e => {
  76. downTaskList.remove(id);
  77. task.startNext();
  78. });
  79. },
  80. clearQueue: function () {
  81. return dbServer.down.clear().then(e => {
  82. let list = downTaskList.list();
  83. for (let e in list) {
  84. list[e].status = taskStatus.stop;
  85. };
  86. downTaskList.clear();
  87. });
  88. },
  89. stopQueue: function () {
  90. return dbServer.down.status({}, taskStatus.pause).then(e => {
  91. let list = downTaskList.list();
  92. downTaskList.stopAll();
  93. for (let e in list) {
  94. list[e].status = taskStatus.pause;
  95. };
  96. downTaskList.clear();
  97. });
  98. },
  99. startQueue: function () {
  100. return dbServer.down.status({}, taskStatus.wait).then(e => {
  101. let num = cacheConfig.task.upload_num;
  102. downTaskList.startAll();
  103. do {
  104. num = num - 1;
  105. task.startNext();
  106. } while (num)
  107. });
  108. },
  109. _onDownComplete: function (file) {
  110. return task.remove(file._id).then(() => {
  111. let num = cacheConfig.task.upload_num;
  112. do {
  113. num = num - 1;
  114. task.startNext();
  115. } while (num)
  116. event.emit('down_complete_ctr', file);
  117. event.emit('down_notice', file);
  118. event.emit('task_num_change');
  119. });
  120. },
  121. _onRangeFinish: function (file) {
  122. event.emit('down_change_ctr', file);
  123. dbServer.down.downRange(file._id, file.end_len);
  124. },
  125. _onPause: function (file) {
  126. task.startNext();
  127. event.emit('down_change_ctr', file);
  128. },
  129. _onError: function (file) {
  130. task.startNext();
  131. event.emit('down_change_ctr', file);
  132. },
  133. _onOvertime: function (file) {
  134. }
  135. };
  136. event.on('down_complete', task._onDownComplete);
  137. event.on('range_finish', task._onRangeFinish);
  138. event.on('down_pause', task._onPause);
  139. event.on('down_error', task._onError);
  140. event.on('down_overtime', task._onOvertime);
  141. function wfsGateway(down) {
  142. return transfer.wfsGateway.download(down.md5).then(e => {
  143. if (e && e.ret !== 0) {
  144. return e.url;
  145. }
  146. return false;
  147. });
  148. }
  149. function nextTask(id) {
  150. if (id)
  151. return dbServer.down.findOne({ '_id': id }).then(addTask);
  152. return dbServer.down.nextTask().then(addTask);
  153. function addTask(doc) {
  154. if (!doc) {
  155. return false;
  156. }
  157. if (doc.isdir == 1) {
  158. if (folderTask[doc.fileid]) {
  159. task.startNext();
  160. return false;
  161. }
  162. folderTask[doc.fileid] = true;
  163. return task._onDownComplete(doc).then(() => {
  164. mkpath.sync(doc.path);
  165. // event.emit('down_complete_ctr', { _id: doc._id });
  166. return apiService.item_list(doc.fileid)
  167. }).then(function (d) {
  168. let new_tasks = d.data.map((v,index) => ({
  169. 'fileid': v._id,
  170. 'isdir': v.isdir,
  171. "md5": v.md5,
  172. "name": v.name,
  173. "size": v.size,
  174. "path": path.join(doc.path, v.name),
  175. "status": 0,
  176. "url": '',
  177. 'start_len': 0,
  178. 'sort':index
  179. }));
  180. if (new_tasks.length)
  181. return dbServer.down.add(new_tasks);
  182. return false;
  183. }).then((newDocs) => {
  184. if (newDocs && newDocs.length) {
  185. event.emit('updataDownTaskNum', newDocs.length);
  186. event.emit('down_taskList', newDocs);
  187. event.emit('task_num_change');
  188. }
  189. delete folderTask[doc.fileid];
  190. task.startNext();
  191. return false
  192. });
  193. }
  194. return doc;
  195. }
  196. }
  197. module.exports = task;
  198. }());