2023-05-22 12:55:46 +00:00
|
|
|
import type { Server, Socket } from "socket.io";
|
2022-08-11 09:36:02 +00:00
|
|
|
import log from "loglevel";
|
|
|
|
|
import {
|
|
|
|
|
APP_ROOM_PREFIX,
|
|
|
|
|
RELEASE_VERSION_EVENT_NAME,
|
|
|
|
|
LEAVE_EDIT_EVENT_NAME,
|
|
|
|
|
PAGE_EDIT_NAMESPACE,
|
|
|
|
|
PAGE_ROOM_PREFIX,
|
|
|
|
|
ROOT_NAMESPACE,
|
2023-05-22 12:55:46 +00:00
|
|
|
PAGE_VISIBILITY_EVENT_NAME,
|
2022-09-12 09:15:47 +00:00
|
|
|
} from "@constants/socket";
|
2022-08-12 15:40:50 +00:00
|
|
|
import { VERSION as buildVersion } from "../version";
|
2022-08-11 09:36:02 +00:00
|
|
|
import {
|
|
|
|
|
subscribeToEditEvents,
|
|
|
|
|
onAppSocketConnected,
|
|
|
|
|
onPageSocketConnected,
|
2022-09-12 09:15:47 +00:00
|
|
|
sendCurrentUsers,
|
|
|
|
|
} from "@controllers/socket";
|
2022-08-11 09:36:02 +00:00
|
|
|
|
|
|
|
|
export function watchEvents(io: Server) {
|
|
|
|
|
io.on("connection", (socket: Socket) => {
|
|
|
|
|
socket.emit(RELEASE_VERSION_EVENT_NAME, buildVersion);
|
|
|
|
|
subscribeToEditEvents(socket, APP_ROOM_PREFIX);
|
2023-05-22 12:55:46 +00:00
|
|
|
onAppSocketConnected(socket).catch((error) =>
|
|
|
|
|
log.error("Error in socket connected handler", error),
|
2022-08-11 09:36:02 +00:00
|
|
|
);
|
|
|
|
|
});
|
2022-09-01 08:47:29 +00:00
|
|
|
/** When we get the page visibility event, it means the page/tab
|
|
|
|
|
* is visible on the client after navigating away from it.
|
|
|
|
|
* We will respond back with the current version to
|
|
|
|
|
* so that the client can confirm if they are
|
|
|
|
|
* on the latest version of the client
|
|
|
|
|
*/
|
|
|
|
|
io.on(PAGE_VISIBILITY_EVENT_NAME, (socket: Socket) => {
|
|
|
|
|
socket.emit(RELEASE_VERSION_EVENT_NAME, buildVersion);
|
|
|
|
|
});
|
2022-08-11 09:36:02 +00:00
|
|
|
|
|
|
|
|
io.of(PAGE_EDIT_NAMESPACE).on("connection", (socket: Socket) => {
|
|
|
|
|
subscribeToEditEvents(socket, PAGE_ROOM_PREFIX);
|
2023-05-22 12:55:46 +00:00
|
|
|
onPageSocketConnected(socket, io).catch((error) =>
|
|
|
|
|
log.error("Error in socket connected handler", error),
|
2022-08-11 09:36:02 +00:00
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
io.of(ROOT_NAMESPACE).adapter.on("leave-room", (room, id) => {
|
|
|
|
|
if (room.startsWith(APP_ROOM_PREFIX)) {
|
|
|
|
|
log.debug(`ns:${ROOT_NAMESPACE}# socket ${id} left the room ${room}`);
|
|
|
|
|
}
|
2024-09-18 16:35:28 +00:00
|
|
|
|
2022-08-11 09:36:02 +00:00
|
|
|
sendCurrentUsers(io, room, APP_ROOM_PREFIX);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
io.of(ROOT_NAMESPACE).adapter.on("join-room", (room, id) => {
|
|
|
|
|
if (room.startsWith(APP_ROOM_PREFIX)) {
|
|
|
|
|
log.debug(`ns:${ROOT_NAMESPACE}# socket ${id} joined the room ${room}`);
|
|
|
|
|
}
|
2024-09-18 16:35:28 +00:00
|
|
|
|
2022-08-11 09:36:02 +00:00
|
|
|
sendCurrentUsers(io, room, APP_ROOM_PREFIX);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
io.of(PAGE_EDIT_NAMESPACE).adapter.on("leave-room", (room, id) => {
|
|
|
|
|
if (room.startsWith(PAGE_ROOM_PREFIX)) {
|
|
|
|
|
// someone left the page edit, notify others
|
|
|
|
|
log.debug(
|
2023-05-22 12:55:46 +00:00
|
|
|
`ns:${PAGE_EDIT_NAMESPACE} # socket ${id} left the room ${room}`,
|
2022-08-11 09:36:02 +00:00
|
|
|
);
|
2023-05-22 12:55:46 +00:00
|
|
|
io.of(PAGE_EDIT_NAMESPACE).to(room).emit(LEAVE_EDIT_EVENT_NAME, id);
|
2022-08-11 09:36:02 +00:00
|
|
|
}
|
2024-09-18 16:35:28 +00:00
|
|
|
|
2022-08-11 09:36:02 +00:00
|
|
|
sendCurrentUsers(io.of(PAGE_EDIT_NAMESPACE), room, PAGE_ROOM_PREFIX);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
io.of(PAGE_EDIT_NAMESPACE).adapter.on("join-room", (room, id) => {
|
|
|
|
|
if (room.startsWith(PAGE_ROOM_PREFIX)) {
|
|
|
|
|
log.debug(
|
2023-05-22 12:55:46 +00:00
|
|
|
`ns:${PAGE_EDIT_NAMESPACE}# socket ${id} joined the room ${room}`,
|
2022-08-11 09:36:02 +00:00
|
|
|
);
|
|
|
|
|
}
|
2024-09-18 16:35:28 +00:00
|
|
|
|
2022-08-11 09:36:02 +00:00
|
|
|
sendCurrentUsers(io.of(PAGE_EDIT_NAMESPACE), room, PAGE_ROOM_PREFIX);
|
|
|
|
|
});
|
2022-09-01 08:47:29 +00:00
|
|
|
}
|