2017-06-19 22:10:06 +02:00
|
|
|
const logger = require('winston');
|
2017-07-06 03:26:33 +02:00
|
|
|
const fs = require('fs');
|
2017-06-26 19:02:14 +02:00
|
|
|
const publishController = require('../controllers/publishController.js');
|
2017-06-26 19:43:35 +02:00
|
|
|
const publishHelpers = require('../helpers/libraries/publishHelpers.js');
|
2017-06-26 19:02:14 +02:00
|
|
|
const errorHandlers = require('../helpers/libraries/errorHandlers.js');
|
2017-06-30 07:26:29 +02:00
|
|
|
const { postToStats } = require('../controllers/statsController.js');
|
2017-06-15 20:15:13 +02:00
|
|
|
|
2017-06-28 05:25:36 +02:00
|
|
|
module.exports = (app, siofu, hostedContentPath) => {
|
2017-07-05 22:51:25 +02:00
|
|
|
const http = require('http');
|
|
|
|
const server = http.Server(app);
|
|
|
|
const io = require('socket.io')(server);
|
2017-05-25 07:50:02 +02:00
|
|
|
|
2017-06-17 22:51:30 +02:00
|
|
|
io.on('connection', socket => {
|
2017-06-19 22:10:06 +02:00
|
|
|
logger.silly('a user connected via sockets');
|
2017-06-17 22:51:30 +02:00
|
|
|
// attach upload listeners
|
2017-06-19 18:37:35 +02:00
|
|
|
const uploader = new siofu();
|
|
|
|
uploader.dir = hostedContentPath;
|
|
|
|
uploader.listen(socket);
|
2017-06-28 00:53:53 +02:00
|
|
|
// listener for when file upload starts
|
2017-06-17 22:51:30 +02:00
|
|
|
uploader.on('start', ({ file }) => {
|
2017-06-30 07:26:29 +02:00
|
|
|
// log
|
2017-06-20 05:22:23 +02:00
|
|
|
logger.info('client started an upload:', file.name);
|
2017-06-17 22:51:30 +02:00
|
|
|
// server side test to make sure file is not a bad file type
|
|
|
|
if (/\.exe$/.test(file.name)) {
|
2017-06-19 18:37:35 +02:00
|
|
|
uploader.abort(file.id, socket);
|
2017-06-17 22:51:30 +02:00
|
|
|
}
|
2017-06-19 18:37:35 +02:00
|
|
|
});
|
2017-06-28 00:53:53 +02:00
|
|
|
// listener for when file upload encounters an error
|
2017-06-17 22:51:30 +02:00
|
|
|
uploader.on('error', ({ error }) => {
|
2017-06-19 22:10:06 +02:00
|
|
|
logger.error('an error occured while uploading', error);
|
2017-06-29 23:34:23 +02:00
|
|
|
postToStats('publish', '/', null, error);
|
2017-06-19 18:37:35 +02:00
|
|
|
socket.emit('publish-status', error);
|
|
|
|
});
|
2017-06-28 00:53:53 +02:00
|
|
|
// listener for when file has been uploaded
|
2017-06-17 22:51:30 +02:00
|
|
|
uploader.on('saved', ({ file }) => {
|
|
|
|
if (file.success) {
|
2017-06-20 05:22:23 +02:00
|
|
|
logger.debug(`Client successfully uploaded ${file.name}`);
|
2017-06-26 19:02:14 +02:00
|
|
|
socket.emit('publish-status', 'file upload successfully completed. Your image is being published (this might take a second)...');
|
|
|
|
// prepare the publish parameters
|
|
|
|
const publishParams = publishHelpers.createPublishParams(file.meta.name, file.pathName, file.meta.license, file.meta.nsfw);
|
|
|
|
// publish the file
|
|
|
|
publishController
|
|
|
|
.publish(publishParams, file.name, file.meta.type)
|
|
|
|
.then(result => {
|
2017-06-29 23:34:23 +02:00
|
|
|
postToStats('publish', '/', null, 'success');
|
2017-06-26 19:02:14 +02:00
|
|
|
socket.emit('publish-complete', { name: publishParams.name, result });
|
|
|
|
})
|
|
|
|
.catch(error => {
|
2017-06-28 06:32:05 +02:00
|
|
|
error = errorHandlers.handlePublishError(error);
|
2017-06-29 23:34:23 +02:00
|
|
|
postToStats('publish', '/', null, error);
|
2017-06-28 06:32:05 +02:00
|
|
|
socket.emit('publish-failure', error);
|
2017-06-26 19:02:14 +02:00
|
|
|
});
|
2017-06-17 22:51:30 +02:00
|
|
|
} else {
|
2017-06-19 22:10:06 +02:00
|
|
|
logger.error(`An error occurred in uploading the client's file`);
|
2017-06-19 18:37:35 +02:00
|
|
|
socket.emit('publish-failure', 'file uploaded, but with errors');
|
2017-06-29 23:34:23 +02:00
|
|
|
postToStats('publish', '/', null, 'file uploaded, but with errors');
|
2017-06-19 22:10:06 +02:00
|
|
|
// to-do: remove the file if not done automatically
|
2017-06-17 22:51:30 +02:00
|
|
|
}
|
2017-06-19 18:37:35 +02:00
|
|
|
});
|
2017-07-05 22:51:25 +02:00
|
|
|
// handle asset requests
|
2017-07-06 03:26:33 +02:00
|
|
|
socket.on('asset-request', filePath => {
|
|
|
|
logger.debug('received a request for the following file', filePath);
|
|
|
|
fs.readFile(filePath, (err, assetBuffer) => {
|
|
|
|
if (err) {
|
|
|
|
logger.error('fs.readFile error', err);
|
|
|
|
return;
|
|
|
|
};
|
|
|
|
// set the data
|
|
|
|
const fileExtension = filePath.substring(filePath.lastIndexOf('.'));
|
|
|
|
let data = {
|
|
|
|
type : null,
|
|
|
|
buffer: assetBuffer.toString('base64'),
|
|
|
|
};
|
|
|
|
switch (fileExtension) {
|
|
|
|
case 'jpeg' || 'jpg':
|
|
|
|
data['type'] = 'image/jpeg';
|
|
|
|
break;
|
|
|
|
case 'gif':
|
|
|
|
data['type'] = 'image/gif';
|
|
|
|
break;
|
|
|
|
case 'png':
|
|
|
|
data['type'] = 'image/png';
|
|
|
|
break;
|
|
|
|
case 'mp4':
|
|
|
|
data['type'] = 'video/mp4';
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
data['type'] = 'image/jpeg';
|
|
|
|
logger.warn('showing file with unknown type as jpeg');
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
// send the asset
|
|
|
|
socket.emit('asset-transfer', data);
|
|
|
|
});
|
2017-07-05 22:51:25 +02:00
|
|
|
});
|
2017-06-17 22:51:30 +02:00
|
|
|
// handle disconnect
|
|
|
|
socket.on('disconnect', () => {
|
2017-06-19 22:10:06 +02:00
|
|
|
logger.silly('a user disconnected via sockets');
|
2017-06-19 18:37:35 +02:00
|
|
|
});
|
|
|
|
});
|
2017-06-17 22:51:30 +02:00
|
|
|
|
2017-07-05 22:51:25 +02:00
|
|
|
return server;
|
2017-06-19 18:37:35 +02:00
|
|
|
};
|