import { Server, Socket } from "socket.io"; import { EVENTS } from "./events.ts"; import { createCamera } from "../services/camera/camera-Controller.ts"; import { setEnvironment } from "../services/environments/environments-controller.ts"; import { deleteFloorItems, setFloorItems, } from "../services/assets/flooritem-Controller.ts"; import { deleteWallItems, setWallItems, } from "../services/assets/wallitem-Controller.ts"; import { deleteLineItems, deleteLinPoiteItems, updateLineItems, createLineItems, deleteLayer, } from "../services/lines/line-Controller.ts"; import { activeUserOffline, activeUsers, } from "../services/users/user-controller.ts"; import { deleteZone, setZone } from "../services/lines/zone-controller.ts"; import { addPanel, panelClear, panelDelete, panelLocked, } from "../services/visualization/panel-Services.ts"; import { addWidget, Widgetdelete, } from "../services/visualization/widget-Services.ts"; import { addfloat, deletefloat, duplicatefloat, } from "../services/visualization/floatWidget-Service.ts"; import { addTemplate, addTemplateZone, TemplateZoneDelete, } from "../services/visualization/templateServices.ts"; import { deleteAssetModel, replaceEventDatas, setAssetModel, } from "../services/assets/asset-Controller.ts"; import { add3Dwidget, delete3Dwidget, update3D, } from "../services/visualization/3dWidget-Service.ts"; import { projectDeleteHandleEvent, projectHandleEvent, projecUpdateHandleEvent, } from "../controllers/project/projectController.ts"; import { getUserRole } from "../utils/getUsers.ts"; const cameraHandleEvent = async ( event: string, socket: Socket, data: any, namespace: any, notifySender: boolean = false ) => { if (!data?.organization) { console.warn(`Missing organization for event: ${event}`); return; } let result; switch (event) { case EVENTS.setCamera: { result = await createCamera(data); if (result) { const responseEvent = EVENTS.cameraUpdateResponse; const organization = result?.organization; // const emitTarget = notifySender ? socket.in(organization) : socket.to(organization); // console.log(`👀 Active sockets in room:`, namespace.adapter.rooms.get(organization)); if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } // case EVENTS.deleteWidget: { // const result = await Widgetdelete(data) // if (result) { // // console.log('result?.success: ', result.organization); // const responseEvent = EVENTS.widgetDeleteResponse // // console.log('responseEvent: ', responseEvent); // const organization = result?.organization // // console.log('organization: ', organization); // // const emitTarget = notifySender ? socket.in(organization) : socket.to(organization); // // console.log(`👀 Active sockets in room:`, namespace.adapter.rooms.get(organization)); // // console.log('emitTarget: ', emitTarget); // if (organization) { // socket.emit(responseEvent, { // success: result.success, // message: result.message, // data: result.data, // error: result.error || null, // socketId: socket.id, // organization, // }); // } else { // console.warn(`Organization missing in response for event: ${event}`); // } // } // break // } } }; const EnvironmentHandleEvent = async ( event: string, socket: Socket, data: any, io: any ) => { if (!data?.organization) { console.warn(`Missing organization for event: ${event}`); return; } let result; switch (event) { case EVENTS.setenvironment: { result = await setEnvironment(data); if (result) { const responseEvent = EVENTS.EnvironmentUpdateResponse; const organization = result?.organization; // const emitTarget = notifySender ? socket.in(organization) : socket.to(organization); // console.log(`👀 Active sockets in room:`, namespace.adapter.rooms.get(organization)); if (organization) { socket.emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } // case EVENTS.deleteWidget: { // const result = await Widgetdelete(data) // if (result) { // // console.log('result?.success: ', result.organization); // const responseEvent = EVENTS.widgetDeleteResponse // // console.log('responseEvent: ', responseEvent); // const organization = result?.organization // // console.log('organization: ', organization); // // const emitTarget = notifySender ? socket.in(organization) : socket.to(organization); // // console.log(`👀 Active sockets in room:`, namespace.adapter.rooms.get(organization)); // // console.log('emitTarget: ', emitTarget); // if (organization) { // socket.emit(responseEvent, { // success: result.success, // message: result.message, // data: result.data, // error: result.error || null, // socketId: socket.id, // organization, // }); // } else { // console.warn(`Organization missing in response for event: ${event}`); // } // } // break // } default: return; } }; const floorItemsHandleEvent = async ( event: string, socket: Socket, data: any, io: any ) => { switch (event) { case EVENTS.setFloorItems: { const result = await setFloorItems(data); // console.log('result: ', result); if (result.success) { io.emit(EVENTS.FloorItemsUpdateResponse, { success: true || false, message: result.message, data: result.data, socketId: socket.id, organization: result.organization, }); } else { // Emit error response socket.emit(EVENTS.floorItemError, { success: false, message: result.message, error: result.error, socketId: socket.id, organization: result.organization, }); } break; } case EVENTS.deleteFloorItems: { const result = await deleteFloorItems(data); // console.log('result: ', result); if (result.success) { io.emit(EVENTS.FloorItemsDeleteResponse, { success: true || false, message: result.message, data: result.data, socketId: socket.id, organization: result.organization, }); } else { // Emit error response socket.emit(EVENTS.floorItemError, { success: false, message: result.message, error: result.error, socketId: socket.id, organization: result.organization, }); } break; } default: // console.error(`Unhandled event type: ${event}`); } }; const wallItemsHandleEvent = async ( event: string, socket: Socket, data: any, io: any ) => { if (!data?.organization) { console.warn(`Missing organization for event: ${event}`); return; } let result; switch (event) { case EVENTS.setWallItems: { result = await setWallItems(data); if (result) { const responseEvent = EVENTS.wallItemsUpdateResponse; const organization = result?.organization; // const emitTarget = notifySender ? socket.in(organization) : socket.to(organization); // console.log(`👀 Active sockets in room:`, namespace.adapter.rooms.get(organization)); if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } case EVENTS.deleteWallItems: { const result = await deleteWallItems(data); if (result) { // console.log('result?.success: ', result.organization); const responseEvent = EVENTS.wallItemsDeleteResponse; // console.log('responseEvent: ', responseEvent); const organization = result?.organization; // console.log('organization: ', organization); // const emitTarget = notifySender ? socket.in(organization) : socket.to(organization); // console.log(`👀 Active sockets in room:`, namespace.adapter.rooms.get(organization)); // console.log('emitTarget: ', emitTarget); if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } default: return; } }; const lineHandleEvent = async ( event: string, socket: Socket, data: any, io: any ) => { if (!data?.organization) { console.warn(`Missing organization for event: ${event}`); return; } let result; switch (event) { case EVENTS.createLine: { result = await createLineItems(data); if (result) { const responseEvent = EVENTS.createLineResponse; const organization = result?.organization; // const emitTarget = notifySender ? socket.in(organization) : socket.to(organization); // console.log(`👀 Active sockets in room:`, namespace.adapter.rooms.get(organization)); if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } case EVENTS.updateLine: { const result = await updateLineItems(data); if (result) { // console.log('result?.success: ', result.organization); const responseEvent = EVENTS.updateLineResponse; // console.log('responseEvent: ', responseEvent); const organization = result?.organization; // console.log('organization: ', organization); // const emitTarget = notifySender ? socket.in(organization) : socket.to(organization); // console.log(`👀 Active sockets in room:`, namespace.adapter.rooms.get(organization)); // console.log('emitTarget: ', emitTarget); if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } case EVENTS.deleteLine: { const result = await deleteLineItems(data); if (result) { // console.log('result?.success: ', result.organization); const responseEvent = EVENTS.deleteLineResponse; // console.log('responseEvent: ', responseEvent); const organization = result?.organization; // console.log('organization: ', organization); // const emitTarget = notifySender ? socket.in(organization) : socket.to(organization); // console.log(`👀 Active sockets in room:`, namespace.adapter.rooms.get(organization)); // console.log('emitTarget: ', emitTarget); if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } case EVENTS.deletePoint: { const result = await deleteLinPoiteItems(data); if (result) { // console.log('result?.success: ', result.organization); const responseEvent = EVENTS.deletePointResponse; // console.log('responseEvent: ', responseEvent); const organization = result?.organization; if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } default: return; } }; const userStatus = async ( event: string, socket: Socket, data: any, io: any ) => { if (!data?.organization) { console.warn(`Missing organization for event: ${event}`); return; } let result; switch (event) { case EVENTS.connection: { result = await activeUsers(data); // console.log('result: ', result); if (result) { const responseEvent = EVENTS.userConnect; const organization = result?.organization; // const emitTarget = notifySender ? socket.in(organization) : socket.to(organization); // console.log(`👀 Active sockets in room:`, namespace.adapter.rooms.get(organization)); if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } case EVENTS.disconnect: { const result = await activeUserOffline(data); if (result) { // console.log('result?.success: ', result.organization); const responseEvent = EVENTS.userDisConnect; // console.log('responseEvent: ', responseEvent); const organization = result?.organization; if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || "disconnectError", socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } default: return; } }; const zoneHandleEvent = async ( event: string, socket: Socket, data: any, io: any ) => { if (!data?.organization) { console.warn(`Missing organization for event: ${event}`); return; } let result; switch (event) { case EVENTS.setZone: { result = await setZone(data); if (result) { const responseEvent = EVENTS.zoneUpdateResponse; const organization = result?.organization; // const emitTarget = notifySender ? socket.in(organization) : socket.to(organization); // console.log(`👀 Active sockets in room:`, namespace.adapter.rooms.get(organization)); if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } case EVENTS.deleteZone: { const result = await deleteZone(data); if (result) { // console.log('result?.success: ', result.organization); const responseEvent = EVENTS.ZoneDeleteResponse; // console.log('responseEvent: ', responseEvent); const organization = result?.organization; if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } } }; const panelHandleEvent = async ( event: string, socket: Socket, data: any, namespace: any, notifySender: boolean = false ) => { if (!data?.organization) { console.warn(`Missing organization for event: ${event}`); return; } let result; switch (event) { case EVENTS.addPanel: { result = await addPanel(data); if (result) { const responseEvent = EVENTS.panelUpdateResponse; const organization = result?.organization; // const emitTarget = notifySender ? socket.in(organization) : socket.to(organization); // console.log(`👀 Active sockets in room:`, namespace.adapter.rooms.get(organization)); // console.log('emitTarget: ', emitTarget); socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error, socketId: socket.id, organization: result.organization, }); } break; } case EVENTS.deletePanel: { const result = await panelDelete(data); if (result) { // console.log('result?.success: ', result.organization); const responseEvent = EVENTS.PanelDeleteResponse; // console.log('responseEvent: ', responseEvent); const organization = result?.organization; if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } case EVENTS.clearPanel: { const result = await panelClear(data); if (result) { // console.log('result?.success: ', result.organization); const responseEvent = EVENTS.PanelClearResponse; // console.log('responseEvent: ', responseEvent); const organization = result?.organization; if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } case EVENTS.lockedPanel: { const result = await panelLocked(data); if (result) { // console.log('result?.success: ', result.organization); const responseEvent = EVENTS.PanelLockedResponse; // console.log('responseEvent: ', responseEvent); const organization = result?.organization; if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } default: return; } }; const widgetHandleEvent = async ( event: string, socket: Socket, data: any, namespace: any, notifySender: boolean = false, callback: any ) => { if (!data?.organization) { console.warn(`Missing organization for event: ${event}`); return; } let result; switch (event) { case EVENTS.addWidget: { result = await addWidget(data, callback); // console.log('result: ', result); if (result) { // console.log('result?.success: ', result.organization); const responseEvent = EVENTS.widgetUpdateResponse; // console.log('responseEvent: ', responseEvent); const organization = result?.organization; if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } case EVENTS.deleteWidget: { const result = await Widgetdelete(data); if (result) { // console.log('result?.success: ', result.organization); const responseEvent = EVENTS.widgetDeleteResponse; // console.log('responseEvent: ', responseEvent); const organization = result?.organization; if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } default: return; } }; const floatHandleEvent = async ( event: string, socket: Socket, data: any, namespace: any, notifySender: boolean = false, callback: any ) => { // console.log('data: ', data); if (!data?.organization) { console.warn(`Missing organization for event: ${event}`); return; } let result; switch (event) { case EVENTS.addFloat: { result = await addfloat(data); // console.log('result: ', result); if (result) { // console.log('result?.success: ', result.organization); const responseEvent = EVENTS.floatUpdateResponse; // console.log('responseEvent: ', responseEvent); const organization = result?.organization; if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } case EVENTS.deleteFloat: { const result = await deletefloat(data); if (result) { // console.log('result?.success: ', result.organization); const responseEvent = EVENTS.floatDeleteResponse; // console.log('responseEvent: ', responseEvent); const organization = result?.organization; if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } case EVENTS.duplicatefloat: { const result = await duplicatefloat(data, callback); if (result) { // console.log('result?.success: ', result.organization); const responseEvent = EVENTS.duplicatefloatUpdateResponse; // console.log('responseEvent: ', responseEvent); const organization = result?.organization; if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } default: return; } }; const templateHandleEvent = async ( event: string, socket: Socket, data: any, namespace: any, notifySender: boolean = false ) => { // console.log('data: ', data); if (!data?.organization) { console.warn(`Missing organization for event: ${event}`); return; } let result; switch (event) { case EVENTS.addTemplate: { result = await addTemplate(data); if (result) { const responseEvent = EVENTS.templateUpdateResponse; const organization = result?.organization; // const emitTarget = notifySender ? socket.in(organization) : socket.to(organization); // console.log(`👀 Active sockets in room:`, namespace.adapter.rooms.get(organization)); if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } case EVENTS.addTemplateZone: { const result = await addTemplateZone(data); if (result) { // console.log('result?.success: ', result.organization); const responseEvent = EVENTS.addTemplateZoneResponse; // console.log('responseEvent: ', responseEvent const organization = result?.organization; if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } case EVENTS.deleteTemplate: { const result = await TemplateZoneDelete(data); if (result) { // console.log('result?.success: ', result.organization); const responseEvent = EVENTS.TemplateDeleteResponse; // console.log('responseEvent: ', responseEvent); const organization = result?.organization; if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } default: return; } }; const Widget3DHandleEvent = async ( event: string, socket: Socket, data: any, namespace: any, notifySender: boolean = false, callback: any ) => { // console.log('data: ', data); if (!data?.organization) { console.warn(`Missing organization for event: ${event}`); return; } let result; switch (event) { case EVENTS.add3DWidget: { result = await add3Dwidget(data, callback); if (result) { const responseEvent = EVENTS.widget3DUpdateResponse; const organization = result?.organization; // const emitTarget = notifySender ? socket.in(organization) : socket.to(organization); // console.log(`👀 Active sockets in room:`, namespace.adapter.rooms.get(organization)); if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } case EVENTS.update3dPosition: { result = await update3D(data); if (result) { const responseEvent = EVENTS.update3dPositionResponse; const organization = result?.organization; // const emitTarget = notifySender ? socket.in(organization) : socket.to(organization); // console.log(`👀 Active sockets in room:`, namespace.adapter.rooms.get(organization)); if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } case EVENTS.delete3DWidget: { result = await delete3Dwidget(data); if (result) { const responseEvent = EVENTS.widget3DDeleteResponse; const organization = result?.organization; // const emitTarget = notifySender ? socket.in(organization) : socket.to(organization); // console.log(`👀 Active sockets in room:`, namespace.adapter.rooms.get(organization)); if (organization) { socket.to(organization).emit(responseEvent, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } } break; } // case EVENTS.deleteWidget: { // const result = await Widgetdelete(data) // if (result) { // // console.log('result?.success: ', result.organization); // const responseEvent = EVENTS.widgetDeleteResponse // // console.log('responseEvent: ', responseEvent); // const organization = result?.organization // // console.log('organization: ', organization); // // const emitTarget = notifySender ? socket.in(organization) : socket.to(organization); // // console.log(`👀 Active sockets in room:`, namespace.adapter.rooms.get(organization)); // // console.log('emitTarget: ', emitTarget); // if (organization) { // socket.emit(responseEvent, { // success: result.success, // message: result.message, // data: result.data, // error: result.error || null, // socketId: socket.id, // organization, // }); // } else { // console.warn(`Organization missing in response for event: ${event}`); // } // } // break // } default: return; } }; const modelAssetHandleEvent = async ( event: string, socket: Socket, data: any, namespace: any, notifySender: boolean = false ) => { // console.log('data: ', data); if (!data?.organization) { console.warn(`Missing organization for event: ${event}`); return; } let result; switch (event) { case EVENTS.setAssetModel: result = await setAssetModel(data); if (result) emitEventResponse( socket, result.organization, EVENTS.assetUpdateResponse, result ); break; case EVENTS.deleteAssetModel: result = await deleteAssetModel(data); if (result) emitEventResponse( socket, result.organization, EVENTS.assetDeleteResponse, result ); break; case EVENTS.assetEventData: result = await replaceEventDatas(data); if (result) emitEventResponse( socket, result.organization, EVENTS.assetEventDataResponse, result ); break; // case EVENTS.setAssetModel: { // result = await setAssetModel(data); // if (result) { // const responseEvent = EVENTS.assetUpdateResponse // const organization = result?.organization // // const emitTarget = notifySender ? socket.in(organization) : socket.to(organization); // // console.log(`👀 Active sockets in room:`, namespace.adapter.rooms.get(organization)); // if (organization) { // socket.to(organization).emit(responseEvent, { // success: result.success, // message: result.message, // data: result.data, // error: result.error || null, // socketId: socket.id, // organization, // }); // } else { // console.warn(`Organization missing in response for event: ${event}`); // } // } // break // } // case EVENTS.deleteAssetModel: { // const result = await deleteAssetModel(data) // if (result) { // // console.log('result?.success: ', result.organization); // const responseEvent = EVENTS.assetDeleteResponse // // console.log('responseEvent: ', responseEvent); // const organization = result?.organization // if (organization) { // socket.to(organization).emit(responseEvent, { // success: result.success, // message: result.message, // data: result.data, // error: result.error || null, // socketId: socket.id, // organization, // }); // } else { // console.warn(`Organization missing in response for event: ${event}`); // } // } // break // } // case EVENTS.assetEventData: { // const result = await replaceEventDatas(data) // if (result) { // // console.log('result?.success: ', result.organization); // const responseEvent = EVENTS.assetEventDataResponse // // console.log('responseEvent: ', responseEvent); // const organization = result?.organization // if (organization) { // socket.to(organization).emit(responseEvent, { // success: result.success, // message: result.message, // data: result.data, // error: result.error || null, // socketId: socket.id, // organization, // }); // } else { // console.warn(`Organization missing in response for event: ${event}`); // } // } // break // } default: return; } }; const simulationHandleEvent = async ( event: string, socket: Socket, data: any ) => { // console.log('data: ', data); if (!data?.organization) { console.warn(`Missing organization for event: ${event}`); return; } let result; try { switch (event) { case EVENTS.setAssetModel: result = await addTemplate(data); if (result) emitEventResponse( socket, result.organization, EVENTS.zoneUpdateResponse, result ); break; default: console.warn(`❌ Unknown event received: ${event}`); } } catch (error) { console.error(`❌ Error handling event ${event}:`, error); } }; const emitEventResponse = ( socket: Socket, organization: string, event: string, result: any ) => { if (organization) { socket.to(organization).emit(event, { success: result.success, message: result.message, data: result.data, error: result.error || null, socketId: socket.id, organization, }); } else { console.warn(`Organization missing in response for event: ${event}`); } }; interface UserSocketInfo { socketId: string; userId: string; role: string; // e.g., "admin" or "user" } const connectedUsersByOrg: { [organization: string]: UserSocketInfo[] } = {}; export const initSocketServer = (httpServer: any) => { const io = new Server(httpServer, { cors: { origin: "*", // Allow CORS for all origins (adjust in production) methods: ["GET", "POST"], }, }); // 🔹 Create different namespaces const namespaces = { Builder: io.of("/Builder"), visualization: io.of("/Visualization"), project: io.of("/project"), }; // const onlineUsers = new Map>(); const onlineUsers: { [organization: string]: Set } = {}; const handleNamespace = ( namespaceName: string, namespace: any, ...eventHandlers: Function[] ) => { namespace.on("connection", async (socket: Socket) => { // const organization = socket.handshake.query.organization as string; // const email = socket.handshake.query.email as string; const { organization, email, userId } = socket.handshake.auth; // console.log(' socket.handshake.auth: ', socket.handshake.auth); if (organization) { socket.join(organization); // console.log(`🔹 Socket ${socket.id} joined room: ${organization}`); } // Handle all events if (organization && email) { if (!onlineUsers[organization]) { onlineUsers[organization] = new Set(); } onlineUsers[organization].add(socket.id); } const role = await getUserRole(userId, organization); // console.log('role: ', role); if (role === "Admin") { socket.join(`${organization}_admins`); } // Save user info somewhere if (organization && userId && role) { if (!connectedUsersByOrg[organization]) { connectedUsersByOrg[organization] = []; } connectedUsersByOrg[organization].push({ socketId: socket.id, userId, role, }); // console.log(`🔗 User connected: ${userId} with role ${role} in ${organization}`); // console.log("🧩 connectedUsersByOrg: ", connectedUsersByOrg); } else { // console.warn(`❌ Cannot store user. Missing data:`,); } userStatus(EVENTS.connection, socket, socket.handshake.auth, socket); socket.onAny((event: string, data: any, callback: any) => { eventHandlers.forEach((handler) => handler(event, socket, io, data, connectedUsersByOrg, callback) ); }); // Handle disconnection socket.on("disconnect", () => { onlineUsers[organization]?.delete(socket.id); if (onlineUsers[organization]?.size === 0) delete onlineUsers[organization]; userStatus(EVENTS.disconnect, socket, socket.handshake.auth, socket); connectedUsersByOrg[organization] = connectedUsersByOrg[ organization ].filter((u) => u.socketId !== socket.id); }); // Handle reconnection (Auto rejoin) socket.on("reconnect", (attempt: number) => { // console.log(`🔄 Socket ${socket.id} reconnected to ${namespaceName} (Attempt ${attempt})`); if (organization) { socket.join(organization); // console.log(`♻️ Rejoined room: ${organization}`); } }); }); }; handleNamespace( "Builder", namespaces.Builder, userStatus, modelAssetHandleEvent, cameraHandleEvent, EnvironmentHandleEvent, wallItemsHandleEvent, lineHandleEvent, zoneHandleEvent ); handleNamespace( "Visualization", namespaces.visualization, panelHandleEvent, widgetHandleEvent, floatHandleEvent, templateHandleEvent, Widget3DHandleEvent ); handleNamespace( "project", namespaces.project, projectHandleEvent, projectDeleteHandleEvent, projecUpdateHandleEvent ); return io; };