Skip to content

Commit

Permalink
feat: allow customizing uploads.upload socket methods
Browse files Browse the repository at this point in the history
closes #12416
  • Loading branch information
barisusakli committed Mar 20, 2024
1 parent bf4f666 commit dc67f54
Showing 1 changed file with 20 additions and 11 deletions.
31 changes: 20 additions & 11 deletions src/socket.io/uploads.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,32 +4,41 @@ const socketUser = require('./user');
const socketGroup = require('./groups');
const image = require('../image');
const meta = require('../meta');
const plugins = require('../plugins');

const inProgress = {};

const uploads = module.exports;

uploads.upload = async function (socket, data) {
const methodToFunc = {
'user.uploadCroppedPicture': socketUser.uploadCroppedPicture,
'user.updateCover': socketUser.updateCover,
'groups.cover.update': socketGroup.cover.update,
};
if (!socket.uid || !data || !data.chunk ||
!data.params || !data.params.method || !methodToFunc.hasOwnProperty(data.params.method)) {
if (!socket.uid || !data || !data.chunk || !data.params || !data.params.method) {
throw new Error('[[error:invalid-data]]');
}
const { method } = data.params;
const defaultMaxSize = method === 'user.uploadCroppedPicture' ?
meta.config.maximumProfileImageSize : meta.config.maximumCoverImageSize;

const { methods, maxSize } = await plugins.hooks.fire('filter:uploads.upload', {
methods: {
'user.uploadCroppedPicture': socketUser.uploadCroppedPicture,
'user.updateCover': socketUser.updateCover,
'groups.cover.update': socketGroup.cover.update,
},
maxSize: defaultMaxSize,
data: data,
});

if (!methods.hasOwnProperty(data.params.method)) {
throw new Error('[[error:invalid-data]]');
}

inProgress[socket.id] = inProgress[socket.id] || Object.create(null);
const socketUploads = inProgress[socket.id];
const { method } = data.params;

socketUploads[method] = socketUploads[method] || { imageData: '' };
socketUploads[method].imageData += data.chunk;

try {
const maxSize = data.params.method === 'user.uploadCroppedPicture' ?
meta.config.maximumProfileImageSize : meta.config.maximumCoverImageSize;
const size = image.sizeFromBase64(socketUploads[method].imageData);

if (size > maxSize * 1024) {
Expand All @@ -39,7 +48,7 @@ uploads.upload = async function (socket, data) {
return;
}
data.params.imageData = socketUploads[method].imageData;
const result = await methodToFunc[data.params.method](socket, data.params);
const result = await methods[method](socket, data.params);
delete socketUploads[method];
return result;
} catch (err) {
Expand Down

0 comments on commit dc67f54

Please sign in to comment.