2022-02-01 15:07:23 +00:00
|
|
|
|
module.exports = (io) => {
|
2021-12-30 12:54:23 +00:00
|
|
|
|
const logger = require("../log.js");
|
2022-01-11 16:09:44 +00:00
|
|
|
|
const moment = require("moment");
|
2021-12-30 12:54:23 +00:00
|
|
|
|
const filesIO = io; //TODO: Restore .of("/files");
|
2021-12-24 17:58:38 +00:00
|
|
|
|
|
2021-12-30 12:54:23 +00:00
|
|
|
|
filesIO.on("connection", (socket) => {
|
2021-12-24 17:58:38 +00:00
|
|
|
|
const session = socket.handshake.session;
|
|
|
|
|
|
2021-12-30 12:54:23 +00:00
|
|
|
|
if (!session) {
|
|
|
|
|
logger.error("empty session");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-11 16:09:44 +00:00
|
|
|
|
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");
|
2021-12-24 17:58:38 +00:00
|
|
|
|
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-24 17:58:38 +00:00
|
|
|
|
);
|
|
|
|
|
|
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-24 17:58:38 +00:00
|
|
|
|
|
2021-12-30 12:54:23 +00:00
|
|
|
|
socket.on("subscribe", (roomParts) => {
|
|
|
|
|
if (!roomParts) return;
|
2021-12-24 17:58:38 +00:00
|
|
|
|
|
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-24 17:58:38 +00:00
|
|
|
|
});
|
|
|
|
|
|
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);
|
|
|
|
|
}
|
2021-12-24 17:58:38 +00:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
socket.on("c:refresh-folder", (folderId) => {
|
2022-02-03 07:44:03 +00:00
|
|
|
|
const room = getRoom(`DIR-${folderId}`);
|
2021-12-30 12:54:23 +00:00
|
|
|
|
logger.info(`refresh folder ${folderId} in room ${room}`);
|
2022-02-03 07:44:03 +00:00
|
|
|
|
modifyFolder(room, "refresh", folderId, "folder");
|
2021-12-24 17:58:38 +00:00
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
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);
|
2021-12-24 17:58:38 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-12-30 12:54:23 +00:00
|
|
|
|
function stopEdit({ fileId, room } = {}) {
|
|
|
|
|
logger.info(`stop edit file ${fileId} in room ${room}`);
|
|
|
|
|
filesIO.to(room).emit("s:stop-edit-file", fileId);
|
2021-12-24 17:58:38 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-01-25 09:03:15 +00:00
|
|
|
|
function modifyFolder(room, cmd, id, type, data) {
|
|
|
|
|
filesIO.to(room).emit("s:modify-folder", { cmd, id, type, data });
|
2022-01-24 17:43:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-01-27 08:42:57 +00:00
|
|
|
|
function createFile({ fileId, room, data } = {}) {
|
2022-01-24 17:43:24 +00:00
|
|
|
|
logger.info(`create new file ${fileId} in room ${room}`);
|
2022-01-25 09:03:15 +00:00
|
|
|
|
modifyFolder(room, "create", fileId, "file", data);
|
2022-01-24 17:43:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function deleteFile({ fileId, room } = {}) {
|
|
|
|
|
logger.info(`delete file ${fileId} in room ${room}`);
|
|
|
|
|
modifyFolder(room, "delete", fileId, "file");
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-01 15:07:23 +00:00
|
|
|
|
return { startEdit, stopEdit, createFile, deleteFile };
|
2021-12-24 17:58:38 +00:00
|
|
|
|
};
|