diff options
Diffstat (limited to 'app/src/services/socketService.ts')
-rw-r--r-- | app/src/services/socketService.ts | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/app/src/services/socketService.ts b/app/src/services/socketService.ts new file mode 100644 index 0000000..79b944f --- /dev/null +++ b/app/src/services/socketService.ts @@ -0,0 +1,66 @@ +import { Server as SocketIOServer } from 'socket.io'; +import { Server as HTTPServer } from 'http'; + +// Store active connections +const activeUsers = new Map<string, string>(); + +export function createSocketService(httpServer: HTTPServer) { + const io = new SocketIOServer(httpServer, { + cors: { + origin: '*', + methods: ['GET', 'POST'] + } + }); + + io.on('connection', (socket) => { + console.log(`New client connected: ${socket.id}`); + + // Handle user login/registration + socket.on('user:register', (userId: string) => { + console.log(`User registered: ${userId} (Socket: ${socket.id})`); + activeUsers.set(userId, socket.id); + // Broadcast updated user list + io.emit('users:update', Array.from(activeUsers.keys())); + }); + + // Handle location updates + socket.on('location:update', (data: { userId: string; latitude: number; longitude: number }) => { + console.log(`Location update from ${data.userId}: ${data.latitude}, ${data.longitude}`); + // Broadcast to all connected clients + io.emit('location:broadcast', data); + }); + + // Handle direct messages or location shares + socket.on('location:share', (data: { fromUserId: string; toUserId: string; latitude: number; longitude: number }) => { + console.log(`Location share from ${data.fromUserId} to ${data.toUserId}`); + const targetSocketId = activeUsers.get(data.toUserId); + + if (targetSocketId) { + // Send to specific user + io.to(targetSocketId).emit('location:shared', { + fromUserId: data.fromUserId, + latitude: data.latitude, + longitude: data.longitude + }); + } + }); + + // Handle disconnect + socket.on('disconnect', () => { + console.log(`Client disconnected: ${socket.id}`); + // Remove user from active users + for (const [userId, socketId] of activeUsers.entries()) { + if (socketId === socket.id) { + activeUsers.delete(userId); + break; + } + } + // Broadcast updated user list + io.emit('users:update', Array.from(activeUsers.keys())); + }); + }); + + return io; +} + +export default createSocketService;
\ No newline at end of file |