DocSpace-client/common/ASC.Socket.IO/app/hubs/files.js

119 lines
3.3 KiB
JavaScript
Raw Normal View History

module.exports = (io) => {
2021-12-30 12:54:23 +00:00
const logger = require("../log.js");
const moment = require("moment");
2021-12-30 12:54:23 +00:00
const filesIO = io; //TODO: Restore .of("/files");
2021-12-30 12:54:23 +00:00
filesIO.on("connection", (socket) => {
const session = socket.handshake.session;
2021-12-30 12:54:23 +00:00
if (!session) {
logger.error("empty session");
return;
}
if (session.system) {
logger.info(`connect system as socketId='${socket.id}'`);
socket.on("ping", (date) => {
logger.info(`ping (client ${socket.id}) at ${date}`);
filesIO.to(socket.id).emit("pong", moment.utc());
});
socket.on("disconnect", (reason) => {
logger.info(
`disconnect system as socketId='${socket.id}' due to ${reason}`
);
});
return;
}
2021-12-30 12:54:23 +00:00
if (!session.user) {
logger.error("invalid session: unknown user");
return;
}
if (!session.portal) {
logger.error("invalid session: unknown portal");
return;
}
const userId = session?.user?.id;
const tenantId = session?.portal?.tenantId;
2021-12-30 12:54:23 +00:00
getRoom = (roomPart) => {
return `${tenantId}-${roomPart}`;
};
logger.info(
`connect user='${userId}' on tenant='${tenantId}' socketId='${socket.id}'`
);
2021-12-30 12:54:23 +00:00
socket.on("disconnect", (reason) => {
logger.info(
`disconnect user='${userId}' on tenant='${tenantId}' socketId='${socket.id}' due to ${reason}`
);
});
2021-12-30 12:54:23 +00:00
socket.on("subscribe", (roomParts) => {
if (!roomParts) return;
2021-12-30 12:54:23 +00:00
if (Array.isArray(roomParts)) {
const rooms = roomParts.map((p) => getRoom(p));
logger.info(`client ${socket.id} join rooms [${rooms.join(",")}]`);
socket.join(rooms);
} else {
const room = getRoom(roomParts);
logger.info(`client ${socket.id} join room ${room}`);
socket.join(room);
}
});
2021-12-30 12:54:23 +00:00
socket.on("unsubscribe", (roomParts) => {
if (!roomParts) return;
if (Array.isArray(roomParts)) {
const rooms = roomParts.map((p) => getRoom(p));
logger.info(`client ${socket.id} leave rooms [${rooms.join(",")}]`);
socket.leave(rooms);
} else {
const room = getRoom(roomParts);
logger.info(`client ${socket.id} leave room ${room}`);
socket.leave(room);
}
});
socket.on("refresh-folder", (folderId) => {
const room = getRoom(`DIR-${folderId}`);
2021-12-30 12:54:23 +00:00
logger.info(`refresh folder ${folderId} in room ${room}`);
socket.to(room).emit("refresh-folder", folderId);
});
});
2021-12-30 12:54:23 +00:00
function startEdit({ fileId, room } = {}) {
logger.info(`start edit file ${fileId} in room ${room}`);
filesIO.to(room).emit("s:start-edit-file", fileId);
}
function stopEdit({ fileId, room, data } = {}) {
2021-12-30 12:54:23 +00:00
logger.info(`stop edit file ${fileId} in room ${room}`);
filesIO.to(room).emit("s:stop-edit-file", fileId, data);
}
function modifyFolder(room, cmd, id, type, data) {
filesIO.to(room).emit("s:modify-folder", { cmd, id, type, data });
}
function createFile({ fileId, room, data } = {}) {
logger.info(`create new file ${fileId} in room ${room}`);
modifyFolder(room, "create", fileId, "file", data);
}
function deleteFile({ fileId, room } = {}) {
logger.info(`delete file ${fileId} in room ${room}`);
modifyFolder(room, "delete", fileId, "file");
}
return { startEdit, stopEdit, createFile, deleteFile };
};