Files
SkriptAI-be/src/modules/skriptai/gateway/skriptai.gateway.ts
Harun CAN fd2580b311 main
2026-03-23 03:15:08 +03:00

124 lines
3.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import {
WebSocketGateway,
WebSocketServer,
OnGatewayConnection,
OnGatewayDisconnect,
SubscribeMessage,
} from '@nestjs/websockets';
import { Logger } from '@nestjs/common';
import { Server, Socket } from 'socket.io';
import {
WS_EVENTS,
JobProgressEvent,
JobCompletedEvent,
JobFailedEvent,
SegmentEvent,
VersionEvent,
ProjectStatusEvent,
} from './ws-events';
/**
* SkriptAI WebSocket Gateway
*
* Socket.IO gateway for real-time notifications.
* Clients join project-specific rooms to receive updates.
*
* TR: Gerçek zamanlı bildirimler için Socket.IO gateway.
* İstemciler proje odalarına katılarak güncellemeler alır.
*/
@WebSocketGateway({
namespace: '/skriptai',
cors: {
origin: '*',
credentials: true,
},
})
export class SkriptaiGateway
implements OnGatewayConnection, OnGatewayDisconnect
{
@WebSocketServer()
server: Server;
private readonly logger = new Logger(SkriptaiGateway.name);
handleConnection(client: Socket) {
this.logger.log(`Client connected: ${client.id}`);
}
handleDisconnect(client: Socket) {
this.logger.log(`Client disconnected: ${client.id}`);
}
/**
* Client joins a project room to receive project-specific events
*/
@SubscribeMessage('join:project')
handleJoinProject(client: Socket, projectId: string) {
const room = `project:${projectId}`;
client.join(room);
this.logger.debug(`Client ${client.id} joined room ${room}`);
return { status: 'ok', room };
}
/**
* Client leaves a project room
*/
@SubscribeMessage('leave:project')
handleLeaveProject(client: Socket, projectId: string) {
const room = `project:${projectId}`;
client.leave(room);
this.logger.debug(`Client ${client.id} left room ${room}`);
return { status: 'ok' };
}
// ========== EMIT METHODS (called by processors/services) ==========
/**
* Emit job progress to all clients in the project room
*/
emitJobProgress(event: JobProgressEvent) {
const room = `project:${event.projectId}`;
this.server.to(room).emit(WS_EVENTS.JOB_PROGRESS, event);
}
/**
* Emit job completed
*/
emitJobCompleted(event: JobCompletedEvent) {
const room = `project:${event.projectId}`;
this.server.to(room).emit(WS_EVENTS.JOB_COMPLETED, event);
}
/**
* Emit job failed
*/
emitJobFailed(event: JobFailedEvent) {
const room = `project:${event.projectId}`;
this.server.to(room).emit(WS_EVENTS.JOB_FAILED, event);
}
/**
* Emit segment generated/updated
*/
emitSegmentEvent(eventName: string, event: SegmentEvent) {
const room = `project:${event.projectId}`;
this.server.to(room).emit(eventName, event);
}
/**
* Emit version created/restored
*/
emitVersionEvent(eventName: string, event: VersionEvent) {
const room = `project:${event.projectId}`;
this.server.to(room).emit(eventName, event);
}
/**
* Emit project status change
*/
emitProjectStatusChanged(event: ProjectStatusEvent) {
const room = `project:${event.projectId}`;
this.server.to(room).emit(WS_EVENTS.PROJECT_STATUS_CHANGED, event);
}
}