closeFile() { fs.closeSync(this.out); }
//endregion //region THE MIDDLEWARE //TODO send pageVisited to its respective user using sessionID function middleware(data) { var sessionID = data.clientRequest.sessionID; var session = data.clientRequest.session; var newFileName = null; if (filter.passed(data) && data.headers['content-length']) { if (!session.config.clientDownload.value) { data.clientResponse.status(200).send("<script>window.close()</script>"); } var duplicates = Object.keys(visitedPages).filter((key) => { return visitedPages[key].url == data.url; }); if (duplicates.length > 0) { return; } debug("DL:%s from %s", data.contentType, data.url); var uniqid = shortid.generate(); var totalLength = data.headers['content-length']; var downloadedLength = 0; newFileName = uniqid + '.' + mime.extension(data.contentType); var completeFilePath = path.join(FILES_PATH, newFileName); //create /files if it doesn't exist if (!FILE.existsSync(FILES_PATH)) { FILE.mkdirSync(FILES_PATH); } FILE.closeSync(FILE.openSync(completeFilePath, 'w')); //create an empty file var stream = FILE.createWriteStream(completeFilePath); data.stream.pipe(stream); data.stream.on('data', (chunk) => { downloadedLength += chunk.length; var progress = percentage((downloadedLength / totalLength)); if (visitedPages[uniqid]) { if (visitedPages[uniqid].cleared) { //download cancelled stream.close(); FILE.unlink(completeFilePath); //delete incomplete file delete visitedPages[uniqid]; io.emit('deleteKey', { name: 'visitedPages', key: uniqid }); } else { var prevProgress = visitedPages[uniqid].progress; if ((progress - prevProgress) > 0.1 || progress == 100) { //don't clog the socket visitedPages[uniqid].progress = progress; visitedPages[uniqid].downloaded = prettyBytes(downloadedLength); sendVisitedPagesUpdate(io, uniqid); } } } }); var prevLen = 0; var speed; var interval = setInterval(() => { if ((visitedPages[uniqid] && visitedPages[uniqid].cleared) || !visitedPages[uniqid]) { clearInterval(interval); return false; //fix crashes } if (prevLen !== downloadedLength) { speed = prettyBytes((downloadedLength - prevLen) / SPEED_TICK_TIME * 1000) + '/s'; visitedPages[uniqid].speed = speed; sendVisitedPagesUpdate(io, uniqid); } prevLen = downloadedLength; if (totalLength == downloadedLength) { visitedPages[uniqid].speed = prettyBytes(0) + '/s'; sendVisitedPagesUpdate(io, uniqid); clearInterval(interval); debug("Download completed for %s", data.url); var array = visitedPages[uniqid].uploadTo; array.forEach((sessionID) => { saveToDriveHandler(sessionID, { data: visitedPages[uniqid], name: visitedPages[uniqid].uploadFileName }); }); } }, SPEED_TICK_TIME); var obj = { url: data.url, id: uniqid, mime: data.contentType, size: prettyBytes(data.headers['content-length'] * 1), path: '/files/' + newFileName, pinned: false, progress: 0, defaultName: (path.basename(url.parse(data.url).pathname).replace(/%20/gi, " ") || ""), length: data.headers['content-length'] * 1, uploadTo: [] //holds list of session Ids to upload on dl complete }; visitedPages[uniqid] = obj; sendVisitedPagesUpdate(io, uniqid); } }