/* jslint node: true */ 'use strict'; const FileEntry = require('./file_entry'); const UserProps = require('./user_property'); const Events = require('./events'); // deps const _ = require('lodash'); module.exports = class DownloadQueue { constructor(client) { this.client = client; if (!Array.isArray(this.client.user.downloadQueue)) { if (this.client.user.properties[UserProps.DownloadQueue]) { this.loadFromProperty( this.client.user.properties[UserProps.DownloadQueue] ); } else { this.client.user.downloadQueue = []; } } } static get(client) { return new DownloadQueue(client); } get items() { return this.client.user.downloadQueue; } clear() { this.client.user.downloadQueue = []; } toggle(fileEntry, systemFile = false) { if (this.isQueued(fileEntry)) { this.client.user.downloadQueue = this.client.user.downloadQueue.filter( e => fileEntry.fileId !== e.fileId ); } else { this.add(fileEntry, systemFile); } } add(fileEntry, systemFile = false) { this.client.user.downloadQueue.push({ fileId: fileEntry.fileId, areaTag: fileEntry.areaTag, fileName: fileEntry.fileName, path: fileEntry.filePath, byteSize: fileEntry.meta.byte_size || 0, systemFile: systemFile, }); } removeItems(fileIds) { if (!Array.isArray(fileIds)) { fileIds = [fileIds]; } const [remain, removed] = _.partition( this.client.user.downloadQueue, e => -1 === fileIds.indexOf(e.fileId) ); this.client.user.downloadQueue = remain; return removed; } isQueued(entryOrId) { if (entryOrId instanceof FileEntry) { entryOrId = entryOrId.fileId; } return this.client.user.downloadQueue.find(e => entryOrId === e.fileId) ? true : false; } toProperty() { return JSON.stringify(this.client.user.downloadQueue); } loadFromProperty(prop) { try { this.client.user.downloadQueue = JSON.parse(prop); } catch (e) { this.client.user.downloadQueue = []; this.client.log.error( { error: e.message, property: prop }, 'Failed parsing download queue property' ); } } addTemporaryDownload(entry) { this.add(entry, true); // true=systemFile // clean up after ourselves when the session ends const thisUniqueId = this.client.session.uniqueId; Events.once(Events.getSystemEvents().ClientDisconnected, evt => { if (thisUniqueId === _.get(evt, 'client.session.uniqueId')) { FileEntry.removeEntry(entry, { removePhysFile: true }, err => { const Log = require('./logger').log; if (err) { Log.warn( { fileId: entry.fileId, path: entry.filePath }, 'Failed removing temporary session download' ); } else { Log.debug( { fileId: entry.fileId, path: entry.filePath }, 'Removed temporary session download item' ); } }); } }); } };