enigma-bbs/core/download_queue.js

124 lines
3.5 KiB
JavaScript

/* 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'
);
}
});
}
});
}
};