| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- ;
- (function () {
- const event = require('myevents'),
- DownFile = require('downfile'),
- taskStatus = require('taskstatus'),
- appCache = require('app-cache'),
- path = require('path'),
- downTaskList = require('downtask'),
- transfer = require('transfer'),
- dbServer = require('db-server'),
- apiService = require('app-service'),
- mkpath = require('mkpath'),
- md5 = require('md5');
- let cacheConfig = appCache.local_config();
- let folderTask = {};
- var task = {
- parallelDownloadNum: cacheConfig.task.down_num,
- addTask: function (upload) {
- let downfile = new DownFile(upload),
- down_options = downfile.options;
- if (!downTaskList.add(down_options))
- return task.startNext(); //如果已经存在了,进行下一波的下载
- return wfsGateway(down_options).then(host => {
- if (host) {
- down_options.url = host;
- down_options.status = taskStatus.doing;
- } else {
- down_options.status = taskStatus.netError;
- }
- return dbServer.down.status(down_options._id, down_options.status);
- }).then(e => {
- if (down_options.status === taskStatus.doing)
- downfile.start();
- else {
- downTaskList.remove(downfile._id);
- }
- event.emit('down_change_ctr', down_options);
- });
- },
- pause: function (id) {
- var downfile = downTaskList.find(id);
- if (downfile) {
- downfile.status = taskStatus.pause;
- downTaskList.remove(id);
- };
- dbServer.down.status(id, taskStatus.pause).then(e => {
- task.startNext();
- });
- },
- startNext: function (id) {
- if (downTaskList.taskNum >= task.parallelDownloadNum) {
- id && dbServer.down.status(id, taskStatus.wait);
- return false;
- };
- return nextTask(id).then(doc => {
- if (!doc) {
- return id && event.emit('down_complete_ctr', { _id: id });
- }
- if (downTaskList.taskNum >= task.parallelDownloadNum)
- return dbServer.down.status(id, taskStatus.wait);
- return task.addTask(doc);
- });
- },
- remove: function (id) {
- var options = downTaskList.find(id);
- if (options) options.status = taskStatus.stop;
- return dbServer.down.remove(id).then(e => {
- downTaskList.remove(id);
- task.startNext();
- });
- },
- stop: function (id) {
- let options = downTaskList.find(id);
- if (options) options.status = taskStatus.stop;
- dbServer.down.status(id, taskStatus.stop).then(e => {
- downTaskList.remove(id);
- task.startNext();
- });
- },
- clearQueue: function () {
- return dbServer.down.clear().then(e => {
- let list = downTaskList.list();
- for (let e in list) {
- list[e].status = taskStatus.stop;
- };
- downTaskList.clear();
- });
- },
- stopQueue: function () {
- return dbServer.down.status({}, taskStatus.pause).then(e => {
- let list = downTaskList.list();
- downTaskList.stopAll();
- for (let e in list) {
- list[e].status = taskStatus.pause;
- };
- downTaskList.clear();
- });
- },
- startQueue: function () {
- return dbServer.down.status({}, taskStatus.wait).then(e => {
- let num = cacheConfig.task.upload_num;
- downTaskList.startAll();
- do {
- num = num - 1;
- task.startNext();
- } while (num)
- });
- },
- _onDownComplete: function (file) {
- return task.remove(file._id).then(() => {
- let num = cacheConfig.task.upload_num;
- do {
- num = num - 1;
- task.startNext();
- } while (num)
- event.emit('down_complete_ctr', file);
- event.emit('down_notice', file);
- event.emit('task_num_change');
- });
- },
- _onRangeFinish: function (file) {
- event.emit('down_change_ctr', file);
- dbServer.down.downRange(file._id, file.end_len);
- },
- _onPause: function (file) {
- task.startNext();
- event.emit('down_change_ctr', file);
- },
- _onError: function (file) {
- task.startNext();
- event.emit('down_change_ctr', file);
- },
- _onOvertime: function (file) {
- }
- };
- event.on('down_complete', task._onDownComplete);
- event.on('range_finish', task._onRangeFinish);
- event.on('down_pause', task._onPause);
- event.on('down_error', task._onError);
- event.on('down_overtime', task._onOvertime);
- function wfsGateway(down) {
- return transfer.wfsGateway.download(down.md5).then(e => {
- if (e && e.ret !== 0) {
- return e.url;
- }
- return false;
- });
- }
- function nextTask(id) {
- if (id)
- return dbServer.down.findOne({ '_id': id }).then(addTask);
- return dbServer.down.nextTask().then(addTask);
- function addTask(doc) {
- if (!doc) {
- return false;
- }
- if (doc.isdir == 1) {
- if (folderTask[doc.fileid]) {
- task.startNext();
- return false;
- }
- folderTask[doc.fileid] = true;
- return task._onDownComplete(doc).then(() => {
- mkpath.sync(doc.path);
- // event.emit('down_complete_ctr', { _id: doc._id });
- return apiService.item_list(doc.fileid)
- }).then(function (d) {
- let new_tasks = d.data.map((v,index) => ({
- 'fileid': v._id,
- 'isdir': v.isdir,
- "md5": v.md5,
- "name": v.name,
- "size": v.size,
- "path": path.join(doc.path, v.name),
- "status": 0,
- "url": '',
- 'start_len': 0,
- 'sort':index
- }));
- if (new_tasks.length)
- return dbServer.down.add(new_tasks);
- return false;
- }).then((newDocs) => {
- if (newDocs && newDocs.length) {
- event.emit('updataDownTaskNum', newDocs.length);
- event.emit('down_taskList', newDocs);
- event.emit('task_num_change');
- }
- delete folderTask[doc.fileid];
- task.startNext();
- return false
- });
- }
- return doc;
- }
- }
- module.exports = task;
- }());
|