KrishnaCosmic's picture
bug fix
c0b84a6
/**
* WebSocket API Route for Real-time Messaging
*
* GET /api/messaging/ws
* Establishes a WebSocket connection for real-time message delivery
*/
import { NextRequest } from 'next/server';
import { getCurrentUser } from '@/lib/auth';
import { realtimeMessaging } from '@/lib/realtime-messaging';
// Types for WebSocket handling
interface WebSocketMessage {
type: string;
[key: string]: any;
}
// Next.js doesn't natively support WebSockets in the same way as Node.js
// We'll need to use a different approach with API routes and Server-Sent Events (SSE)
// OR we can check if the server is using a custom WebSocket server
// For now, we'll create an SSE endpoint which provides real-time updates
export async function GET(request: NextRequest) {
try {
const user = await getCurrentUser(request);
if (!user) {
return new Response(JSON.stringify({ error: 'Unauthorized' }), {
status: 401,
headers: { 'Content-Type': 'application/json' },
});
}
// Setup SSE connection
const encoder = new TextEncoder();
let isConnected = true;
const customReadable = new ReadableStream({
start(controller) {
// Send initial connection message
const message = `data: ${JSON.stringify({
type: 'connected',
userId: user.id,
timestamp: new Date().toISOString(),
})}\n\n`;
controller.enqueue(encoder.encode(message));
// Register this connection with the realtime service
const unsubscribe = realtimeMessaging.registerConnection(user.id, (event) => {
if (isConnected) {
const eventMessage = `data: ${JSON.stringify(event)}\n\n`;
try {
controller.enqueue(encoder.encode(eventMessage));
} catch (error) {
console.error('Error sending SSE event:', error);
isConnected = false;
controller.close();
}
}
});
// Cleanup on connection close
request.signal?.addEventListener('abort', () => {
isConnected = false;
unsubscribe();
controller.close();
});
},
});
return new Response(customReadable, {
headers: {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'X-Accel-Buffering': 'no',
},
});
} catch (error) {
console.error('WebSocket connection error:', error);
return new Response(JSON.stringify({ error: 'Internal server error' }), {
status: 500,
headers: { 'Content-Type': 'application/json' },
});
}
}