File size: 1,807 Bytes
77610ec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import { Server } from "socket.io";
import { Server as HttpServer } from "http";

export const initSocket = (server: HttpServer) => {
  const io = new Server(server, {
    cors: {
      origin: process.env.CLIENT_URL
        ? process.env.CLIENT_URL.split(",")
        : ["http://localhost:3002"],
      methods: ["GET", "POST"],
      credentials: true,
    },
  });

  io.on("connection", (socket) => {
    console.log("A user connected:", socket.id);

    // Join a collaboration room for a specific project
    socket.on("join-project", (projectId: string) => {
      socket.join(`project:${projectId}`);
      console.log(`User ${socket.id} joined project ${projectId}`);
    });

    // Leave project room
    socket.on("leave-project", (projectId: string) => {
      socket.leave(`project:${projectId}`);
      console.log(`User ${socket.id} left project ${projectId}`);
    });

    // Handle code changes (if not using Yjs directly via y-websocket server)
    socket.on("code-change", (data: { projectId: string; change: any }) => {
      socket.to(`project:${data.projectId}`).emit("code-update", data.change);
    });

    // Real-time cursor/presence
    socket.on(
      "cursor-move",
      (data: { projectId: string; position: any; user: any }) => {
        socket.to(`data.projectId`).emit("cursor-update", {
          userId: socket.id,
          ...data,
        });
      }
    );

    // Video Chat Signaling
    socket.on("video-signal", (data: { target: string; signal: any }) => {
      io.to(data.target).emit("video-signal", {
        sender: socket.id,
        signal: data.signal,
      });
    });

    socket.on("disconnect", () => {
      console.log("User disconnected:", socket.id);
    });
  });

  return io;
};