@noatgnu/cupcake-mint-chocolate 1.2.34 → 1.2.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1126,6 +1126,7 @@ class WebRTCService {
|
|
|
1126
1126
|
fileTransfers = new Map();
|
|
1127
1127
|
DEFAULT_CHUNK_SIZE = 16384;
|
|
1128
1128
|
role = PeerRole.PARTICIPANT;
|
|
1129
|
+
_localStream = new BehaviorSubject(null);
|
|
1129
1130
|
_localStreamReady = new BehaviorSubject(false);
|
|
1130
1131
|
_remoteStreams = new BehaviorSubject(new Map());
|
|
1131
1132
|
_connectionState = new BehaviorSubject('disconnected');
|
|
@@ -1133,6 +1134,7 @@ class WebRTCService {
|
|
|
1133
1134
|
_chatMessages = new Subject();
|
|
1134
1135
|
_fileTransferProgress = new Subject();
|
|
1135
1136
|
_dataChannelReady = new BehaviorSubject(false);
|
|
1137
|
+
localStream$ = this._localStream.asObservable();
|
|
1136
1138
|
localStreamReady$ = this._localStreamReady.asObservable();
|
|
1137
1139
|
remoteStreams$ = this._remoteStreams.asObservable();
|
|
1138
1140
|
connectionState$ = this._connectionState.asObservable();
|
|
@@ -1200,6 +1202,7 @@ class WebRTCService {
|
|
|
1200
1202
|
};
|
|
1201
1203
|
console.log('[WebRTC] Starting local media with constraints:', constraints);
|
|
1202
1204
|
this.localStream = await navigator.mediaDevices.getUserMedia(constraints);
|
|
1205
|
+
this._localStream.next(this.localStream || null);
|
|
1203
1206
|
this._localStreamReady.next(true);
|
|
1204
1207
|
this.updatePeerState(undefined, enableVideo, enableAudio, false);
|
|
1205
1208
|
console.log('[WebRTC] Local media started:', {
|
|
@@ -1224,6 +1227,7 @@ class WebRTCService {
|
|
|
1224
1227
|
this.localStream.getTracks().forEach(track => track.stop());
|
|
1225
1228
|
}
|
|
1226
1229
|
this.localStream = screenStream;
|
|
1230
|
+
this._localStream.next(this.localStream || null);
|
|
1227
1231
|
this._localStreamReady.next(true);
|
|
1228
1232
|
this.replaceTracksInAllPeers();
|
|
1229
1233
|
this.updatePeerState(undefined, false, false, true);
|
|
@@ -1241,6 +1245,7 @@ class WebRTCService {
|
|
|
1241
1245
|
if (this.localStream) {
|
|
1242
1246
|
this.localStream.getTracks().forEach(track => track.stop());
|
|
1243
1247
|
this.localStream = undefined;
|
|
1248
|
+
this._localStream.next(null);
|
|
1244
1249
|
this._localStreamReady.next(false);
|
|
1245
1250
|
}
|
|
1246
1251
|
this.updatePeerState(undefined, false, false, false);
|
|
@@ -1257,6 +1262,7 @@ class WebRTCService {
|
|
|
1257
1262
|
}
|
|
1258
1263
|
});
|
|
1259
1264
|
this.localStream = newStream;
|
|
1265
|
+
this._localStream.next(this.localStream || null);
|
|
1260
1266
|
const newVideoTrack = newStream.getVideoTracks()[0];
|
|
1261
1267
|
for (const connection of this.peerConnections.values()) {
|
|
1262
1268
|
connection.pc.addTrack(newVideoTrack, this.localStream);
|
|
@@ -1374,6 +1380,7 @@ class WebRTCService {
|
|
|
1374
1380
|
}
|
|
1375
1381
|
});
|
|
1376
1382
|
this.localStream = newStream;
|
|
1383
|
+
this._localStream.next(this.localStream || null);
|
|
1377
1384
|
const newAudioTrack = newStream.getAudioTracks()[0];
|
|
1378
1385
|
for (const connection of this.peerConnections.values()) {
|
|
1379
1386
|
connection.pc.addTrack(newAudioTrack, this.localStream);
|
|
@@ -1487,6 +1494,7 @@ class WebRTCService {
|
|
|
1487
1494
|
if (this.localStream) {
|
|
1488
1495
|
this.localStream.getTracks().forEach(track => track.stop());
|
|
1489
1496
|
this.localStream = undefined;
|
|
1497
|
+
this._localStream.next(null);
|
|
1490
1498
|
this._localStreamReady.next(false);
|
|
1491
1499
|
}
|
|
1492
1500
|
if (this.signallingSubscription) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"noatgnu-cupcake-mint-chocolate.mjs","sources":["../../../projects/cupcake-mint-chocolate/src/lib/cupcake-mint-chocolate.ts","../../../projects/cupcake-mint-chocolate/src/lib/models/enums.ts","../../../projects/cupcake-mint-chocolate/src/lib/models/webrtc.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/notification.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/message-thread.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/message.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/thread-participant.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/communication-websocket.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/webrtc-signalling.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/webrtc.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/webrtc-session.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/index.ts","../../../projects/cupcake-mint-chocolate/src/public-api.ts","../../../projects/cupcake-mint-chocolate/src/noatgnu-cupcake-mint-chocolate.ts"],"sourcesContent":["import { Component } from '@angular/core';\n\n@Component({\n selector: 'ccmc-cupcake-mint-chocolate',\n imports: [],\n template: `\n <p>\n cupcake-mint-chocolate works!\n </p>\n `,\n styles: ``\n})\nexport class CupcakeMintChocolate {\n\n}\n","export enum NotificationType {\r\n SYSTEM = 'system',\r\n MAINTENANCE = 'maintenance',\r\n INVENTORY = 'inventory',\r\n BILLING = 'billing',\r\n PROJECT = 'project',\r\n PROTOCOL = 'protocol',\r\n DOCUMENT = 'document',\r\n USER = 'user'\r\n}\r\n\r\nexport const NotificationTypeLabels: Record<NotificationType, string> = {\r\n [NotificationType.SYSTEM]: 'System',\r\n [NotificationType.MAINTENANCE]: 'Maintenance',\r\n [NotificationType.INVENTORY]: 'Inventory',\r\n [NotificationType.BILLING]: 'Billing',\r\n [NotificationType.PROJECT]: 'Project',\r\n [NotificationType.PROTOCOL]: 'Protocol',\r\n [NotificationType.DOCUMENT]: 'Document',\r\n [NotificationType.USER]: 'User'\r\n};\r\n\r\nexport enum NotificationPriority {\r\n LOW = 'low',\r\n NORMAL = 'normal',\r\n HIGH = 'high',\r\n URGENT = 'urgent'\r\n}\r\n\r\nexport const NotificationPriorityLabels: Record<NotificationPriority, string> = {\r\n [NotificationPriority.LOW]: 'Low',\r\n [NotificationPriority.NORMAL]: 'Normal',\r\n [NotificationPriority.HIGH]: 'High',\r\n [NotificationPriority.URGENT]: 'Urgent'\r\n};\r\n\r\nexport enum DeliveryStatus {\r\n PENDING = 'pending',\r\n SENT = 'sent',\r\n DELIVERED = 'delivered',\r\n FAILED = 'failed',\r\n READ = 'read'\r\n}\r\n\r\nexport const DeliveryStatusLabels: Record<DeliveryStatus, string> = {\r\n [DeliveryStatus.PENDING]: 'Pending',\r\n [DeliveryStatus.SENT]: 'Sent',\r\n [DeliveryStatus.DELIVERED]: 'Delivered',\r\n [DeliveryStatus.FAILED]: 'Failed',\r\n [DeliveryStatus.READ]: 'Read'\r\n};\r\n\r\nexport enum MessageType {\r\n DIRECT = 'direct',\r\n THREAD = 'thread',\r\n BROADCAST = 'broadcast',\r\n SYSTEM = 'system'\r\n}\r\n\r\nexport const MessageTypeLabels: Record<MessageType, string> = {\r\n [MessageType.DIRECT]: 'Direct Message',\r\n [MessageType.THREAD]: 'Thread Reply',\r\n [MessageType.BROADCAST]: 'Broadcast',\r\n [MessageType.SYSTEM]: 'System Message'\r\n};","import { BaseTimestampedModel } from './base';\r\nimport { User } from '@noatgnu/cupcake-core';\r\n\r\nexport enum WebRTCSessionType {\r\n VIDEO_CALL = 'video_call',\r\n AUDIO_CALL = 'audio_call',\r\n SCREEN_SHARE = 'screen_share',\r\n DATA_CHANNEL = 'data_channel'\r\n}\r\n\r\nexport enum WebRTCSessionStatus {\r\n WAITING = 'waiting',\r\n ACTIVE = 'active',\r\n ENDED = 'ended'\r\n}\r\n\r\nexport enum PeerRole {\r\n HOST = 'host',\r\n VIEWER = 'viewer',\r\n PARTICIPANT = 'participant'\r\n}\r\n\r\nexport enum PeerConnectionState {\r\n CONNECTING = 'connecting',\r\n CONNECTED = 'connected',\r\n DISCONNECTED = 'disconnected',\r\n FAILED = 'failed'\r\n}\r\n\r\nexport enum SignalType {\r\n OFFER = 'offer',\r\n ANSWER = 'answer',\r\n ICE_CANDIDATE = 'ice_candidate',\r\n CHECK = 'check'\r\n}\r\n\r\nexport interface WebRTCSession extends BaseTimestampedModel {\r\n id: string;\r\n name?: string;\r\n isDefault: boolean;\r\n sessionType: WebRTCSessionType;\r\n sessionStatus: WebRTCSessionStatus;\r\n initiatedBy: number;\r\n initiatedByUsername?: string;\r\n initiatedByDetails?: User;\r\n participantsList?: WebRTCPeer[];\r\n participantsCount?: number;\r\n canEdit?: boolean;\r\n canDelete?: boolean;\r\n startedAt: string;\r\n endedAt?: string;\r\n}\r\n\r\nexport interface WebRTCPeer extends BaseTimestampedModel {\r\n id: string;\r\n session: string;\r\n user: number;\r\n username?: string;\r\n userDetails?: User;\r\n channelId: string;\r\n peerRole: PeerRole;\r\n connectionState: PeerConnectionState;\r\n hasVideo: boolean;\r\n hasAudio: boolean;\r\n hasScreenShare: boolean;\r\n joinedAt: string;\r\n lastSeenAt: string;\r\n}\r\n\r\nexport interface WebRTCSessionCreate {\r\n name?: string;\r\n sessionType: WebRTCSessionType;\r\n ccrvSessionIds?: number[];\r\n}\r\n\r\nexport interface WebRTCSessionUpdate {\r\n name?: string;\r\n sessionType?: WebRTCSessionType;\r\n sessionStatus?: WebRTCSessionStatus;\r\n isDefault?: boolean;\r\n}\r\n\r\nexport interface WebRTCSessionQueryParams {\r\n sessionType?: WebRTCSessionType;\r\n sessionStatus?: WebRTCSessionStatus;\r\n ccrvSessionId?: number;\r\n limit?: number;\r\n offset?: number;\r\n}\r\n\r\nexport interface WebRTCSignal extends BaseTimestampedModel {\r\n id: string;\r\n session: string;\r\n fromPeer: string;\r\n toPeer?: string;\r\n signalType: SignalType;\r\n signalData: any;\r\n delivered: boolean;\r\n}\r\n\r\nexport interface PeerInfo {\r\n id: string;\r\n userId: number;\r\n username: string;\r\n peerRole: PeerRole;\r\n connectionState: PeerConnectionState;\r\n hasVideo: boolean;\r\n hasAudio: boolean;\r\n hasScreenShare: boolean;\r\n}\r\n\r\nexport interface WebRTCMessage {\r\n type: 'connection.established' | 'check.response' | 'peer.check' | 'offer' | 'answer' | 'ice_candidate' | 'peer.state_update' | 'peer.joined' | 'peer.left' | 'heartbeat.response' | 'error';\r\n message?: string;\r\n peerId?: string;\r\n clientPeerId?: string;\r\n sessionId?: string;\r\n userId?: number;\r\n username?: string;\r\n fromPeerId?: string;\r\n fromUserId?: number;\r\n fromUsername?: string;\r\n toPeerId?: string;\r\n sdp?: RTCSessionDescriptionInit;\r\n candidate?: RTCIceCandidateInit;\r\n peers?: PeerInfo[];\r\n peerRole?: PeerRole;\r\n connectionState?: PeerConnectionState;\r\n hasVideo?: boolean;\r\n hasAudio?: boolean;\r\n hasScreenShare?: boolean;\r\n iceServers?: RTCIceServer[];\r\n timestamp?: string;\r\n isReconnection?: boolean;\r\n}\r\n\r\nexport interface WebRTCConfig {\r\n iceServers: RTCIceServer[];\r\n iceCandidatePoolSize?: number;\r\n iceTransportPolicy?: RTCIceTransportPolicy;\r\n bundlePolicy?: RTCBundlePolicy;\r\n rtcpMuxPolicy?: RTCRtcpMuxPolicy;\r\n}\r\n\r\nexport interface MediaConstraintsConfig {\r\n video?: boolean | MediaTrackConstraints;\r\n audio?: boolean | MediaTrackConstraints;\r\n}\r\n\r\nexport interface PeerConnection {\r\n peerId: string;\r\n userId: number;\r\n username: string;\r\n pc: RTCPeerConnection;\r\n dataChannel?: RTCDataChannel;\r\n stream?: MediaStream;\r\n role: PeerRole;\r\n offered: boolean;\r\n answered: boolean;\r\n connected: boolean;\r\n queuedCandidates: RTCIceCandidate[];\r\n}\r\n\r\nexport interface ChatMessage {\r\n type: 'chat';\r\n peerId: string;\r\n userId: number;\r\n username: string;\r\n message: string;\r\n timestamp: string;\r\n fileOffer?: FileOfferData;\r\n}\r\n\r\nexport interface FileOfferData {\r\n fileId: string;\r\n fileName: string;\r\n fileSize: number;\r\n fileType: string;\r\n chunkSize: number;\r\n totalChunks: number;\r\n}\r\n\r\nexport interface FileTransferRequest {\r\n type: 'file_request';\r\n fileId: string;\r\n requesterId: string;\r\n}\r\n\r\nexport interface FileTransferAccept {\r\n type: 'file_accept';\r\n fileId: string;\r\n toPeerId: string;\r\n}\r\n\r\nexport interface FileChunk {\r\n type: 'file_chunk';\r\n fileId: string;\r\n chunkIndex: number;\r\n totalChunks: number;\r\n data: ArrayBuffer;\r\n isLast: boolean;\r\n}\r\n\r\nexport interface FileTransferProgress {\r\n fileId: string;\r\n fileName: string;\r\n fileSize: number;\r\n chunksReceived: number;\r\n totalChunks: number;\r\n bytesReceived: number;\r\n percentage: number;\r\n}\r\n\r\nexport interface FileTransferState {\r\n fileId: string;\r\n fileName: string;\r\n fileSize: number;\r\n fileType: string;\r\n file?: File;\r\n chunks: Map<number, ArrayBuffer>;\r\n totalChunks: number;\r\n chunkSize: number;\r\n sentChunks: number;\r\n receivedChunks: number;\r\n status: 'pending' | 'transferring' | 'completed' | 'failed';\r\n requestedBy: Set<string>;\r\n streamWriter?: WritableStreamDefaultWriter<Uint8Array>;\r\n downloadStream?: WritableStream<Uint8Array>;\r\n}\r\n\r\nexport interface DataChannelMessage {\r\n type: 'chat' | 'ping' | 'pong' | 'file_request' | 'file_accept' | 'file_chunk' | 'file_complete' | 'file_cancel';\r\n data: any;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n Notification,\r\n NotificationCreateRequest,\r\n NotificationUpdateRequest,\r\n MarkNotificationReadRequest,\r\n BulkNotificationActionRequest,\r\n NotificationType,\r\n NotificationPriority,\r\n DeliveryStatus,\r\n PaginatedResponse,\r\n NotificationQueryParams\r\n} from '../models';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NotificationService extends BaseApiService {\r\n\r\n /**\r\n * Get all notifications with optional filtering\r\n */\r\n getNotifications(params?: NotificationQueryParams): Observable<PaginatedResponse<Notification>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<Notification>>(`${this.apiUrl}/notifications/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single notification by ID\r\n */\r\n getNotification(id: string): Observable<Notification> {\r\n return this.get<Notification>(`${this.apiUrl}/notifications/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new notification\r\n */\r\n createNotification(notification: NotificationCreateRequest): Observable<Notification> {\r\n return this.post<Notification>(`${this.apiUrl}/notifications/`, notification);\r\n }\r\n\r\n /**\r\n * Update an existing notification\r\n */\r\n updateNotification(id: string, notification: NotificationUpdateRequest): Observable<Notification> {\r\n return this.put<Notification>(`${this.apiUrl}/notifications/${id}/`, notification);\r\n }\r\n\r\n /**\r\n * Partially update a notification\r\n */\r\n patchNotification(id: string, notification: Partial<NotificationUpdateRequest>): Observable<Notification> {\r\n return this.patch<Notification>(`${this.apiUrl}/notifications/${id}/`, notification);\r\n }\r\n\r\n /**\r\n * Delete a notification\r\n */\r\n deleteNotification(id: string): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/notifications/${id}/`);\r\n }\r\n\r\n /**\r\n * Mark a notification as read/unread\r\n */\r\n markNotificationRead(id: string, request: MarkNotificationReadRequest): Observable<Notification> {\r\n return this.post<Notification>(`${this.apiUrl}/notifications/${id}/mark_read/`, request);\r\n }\r\n\r\n\r\n /**\r\n * Get unread notifications for current user\r\n */\r\n getUnreadNotifications(): Observable<PaginatedResponse<Notification>> {\r\n return this.get<PaginatedResponse<Notification>>(`${this.apiUrl}/notifications/unread/`);\r\n }\r\n\r\n /**\r\n * Get notification statistics for current user\r\n */\r\n getNotificationStats(): Observable<{\r\n total: number;\r\n unread: number;\r\n byType: { [key: string]: number };\r\n byPriority: { [key: string]: number };\r\n }> {\r\n return this.get<{\r\n total: number;\r\n unread: number;\r\n byType: { [key: string]: number };\r\n byPriority: { [key: string]: number };\r\n }>(`${this.apiUrl}/notifications/stats/`);\r\n }\r\n\r\n /**\r\n * Mark all notifications as read for current user\r\n */\r\n markAllNotificationsRead(): Observable<{ success: boolean; message: string }> {\r\n return this.post<{ success: boolean; message: string }>(`${this.apiUrl}/notifications/mark_all_read/`, {});\r\n }\r\n\r\n /**\r\n * Search notifications by title or message\r\n */\r\n searchNotifications(query: string): Observable<PaginatedResponse<Notification>> {\r\n return this.getNotifications({ search: query });\r\n }\r\n\r\n /**\r\n * Get notifications by type\r\n */\r\n getNotificationsByType(type: NotificationType): Observable<PaginatedResponse<Notification>> {\r\n return this.getNotifications({ notificationType: type });\r\n }\r\n\r\n /**\r\n * Get notifications by priority\r\n */\r\n getNotificationsByPriority(priority: NotificationPriority): Observable<PaginatedResponse<Notification>> {\r\n return this.getNotifications({ priority });\r\n }\r\n\r\n /**\r\n * Get notifications by sender\r\n */\r\n getNotificationsBySender(senderId: number): Observable<PaginatedResponse<Notification>> {\r\n return this.getNotifications({ sender: senderId });\r\n }\r\n\r\n /**\r\n * Get notifications by delivery status\r\n */\r\n getNotificationsByStatus(status: DeliveryStatus): Observable<PaginatedResponse<Notification>> {\r\n return this.getNotifications({ deliveryStatus: status });\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n MessageThread,\r\n MessageThreadCreateRequest,\r\n MessageThreadUpdateRequest,\r\n ThreadParticipantRequest,\r\n ThreadSearchRequest,\r\n ThreadParticipant,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\nexport interface MessageThreadQueryParams {\r\n search?: string;\r\n isPrivate?: boolean;\r\n isArchived?: boolean;\r\n creator?: number;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MessageThreadService extends BaseApiService {\r\n\r\n /**\r\n * Get all message threads with optional filtering\r\n */\r\n getMessageThreads(params?: MessageThreadQueryParams): Observable<PaginatedResponse<MessageThread>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<MessageThread>>(`${this.apiUrl}/threads/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single message thread by ID\r\n */\r\n getMessageThread(id: string): Observable<MessageThread> {\r\n return this.get<MessageThread>(`${this.apiUrl}/threads/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new message thread\r\n */\r\n createMessageThread(thread: MessageThreadCreateRequest): Observable<MessageThread> {\r\n return this.post<MessageThread>(`${this.apiUrl}/threads/`, thread);\r\n }\r\n\r\n /**\r\n * Update an existing message thread\r\n */\r\n updateMessageThread(id: string, thread: MessageThreadUpdateRequest): Observable<MessageThread> {\r\n return this.put<MessageThread>(`${this.apiUrl}/threads/${id}/`, thread);\r\n }\r\n\r\n /**\r\n * Partially update a message thread\r\n */\r\n patchMessageThread(id: string, thread: Partial<MessageThreadUpdateRequest>): Observable<MessageThread> {\r\n return this.patch<MessageThread>(`${this.apiUrl}/threads/${id}/`, thread);\r\n }\r\n\r\n /**\r\n * Delete a message thread\r\n */\r\n deleteMessageThread(id: string): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/threads/${id}/`);\r\n }\r\n\r\n /**\r\n * Add participant to a thread\r\n */\r\n addParticipant(id: string, request: { username: string }): Observable<{ message: string; participant: ThreadParticipant }> {\r\n return this.post<{ message: string; participant: ThreadParticipant }>(`${this.apiUrl}/threads/${id}/add_participant/`, request);\r\n }\r\n\r\n /**\r\n * Remove participant from a thread\r\n */\r\n removeParticipant(id: string, request: { username: string }): Observable<{ message: string }> {\r\n return this.post<{ message: string }>(`${this.apiUrl}/threads/${id}/remove_participant/`, request);\r\n }\r\n\r\n /**\r\n * Get thread participants\r\n */\r\n getParticipants(id: string): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.get<PaginatedResponse<ThreadParticipant>>(`${this.apiUrl}/threads/${id}/participants/`);\r\n }\r\n\r\n /**\r\n * Archive/unarchive a thread (toggles state)\r\n */\r\n toggleArchiveThread(id: string): Observable<{ message: string; isArchived: boolean }> {\r\n return this.post<{ message: string; isArchived: boolean }>(`${this.apiUrl}/threads/${id}/archive/`, {});\r\n }\r\n\r\n /**\r\n * Mark thread as read for current user\r\n */\r\n markThreadAsRead(id: string): Observable<{ success: boolean; message: string }> {\r\n return this.post<{ success: boolean; message: string }>(`${this.apiUrl}/threads/${id}/mark_read/`, {});\r\n }\r\n\r\n\r\n /**\r\n * Search message threads by title or description\r\n */\r\n searchMessageThreads(query: string): Observable<PaginatedResponse<MessageThread>> {\r\n return this.getMessageThreads({ search: query });\r\n }\r\n\r\n /**\r\n * Get private threads only\r\n */\r\n getPrivateThreads(): Observable<PaginatedResponse<MessageThread>> {\r\n return this.getMessageThreads({ isPrivate: true });\r\n }\r\n\r\n /**\r\n * Get public threads only\r\n */\r\n getPublicThreads(): Observable<PaginatedResponse<MessageThread>> {\r\n return this.getMessageThreads({ isPrivate: false });\r\n }\r\n\r\n /**\r\n * Get archived threads\r\n */\r\n getArchivedThreads(): Observable<PaginatedResponse<MessageThread>> {\r\n return this.getMessageThreads({ isArchived: true });\r\n }\r\n\r\n /**\r\n * Get active threads (non-archived)\r\n */\r\n getActiveThreads(): Observable<PaginatedResponse<MessageThread>> {\r\n return this.getMessageThreads({ isArchived: false });\r\n }\r\n\r\n /**\r\n * Get threads created by a specific user\r\n */\r\n getThreadsByCreator(creatorId: number): Observable<PaginatedResponse<MessageThread>> {\r\n return this.getMessageThreads({ creator: creatorId });\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n Message,\r\n MessageCreateRequest,\r\n MessageUpdateRequest,\r\n MessageSearchRequest,\r\n MessageType,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\nexport interface MessageQueryParams {\r\n search?: string;\r\n thread?: string;\r\n messageType?: MessageType;\r\n sender?: number;\r\n isDeleted?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MessageService extends BaseApiService {\r\n\r\n /**\r\n * Get all messages with optional filtering\r\n */\r\n getMessages(params?: MessageQueryParams): Observable<PaginatedResponse<Message>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<Message>>(`${this.apiUrl}/messages/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single message by ID\r\n */\r\n getMessage(id: string): Observable<Message> {\r\n return this.get<Message>(`${this.apiUrl}/messages/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new message\r\n */\r\n createMessage(message: MessageCreateRequest): Observable<Message> {\r\n return this.post<Message>(`${this.apiUrl}/messages/`, message);\r\n }\r\n\r\n /**\r\n * Update an existing message\r\n */\r\n updateMessage(id: string, message: MessageUpdateRequest): Observable<Message> {\r\n return this.put<Message>(`${this.apiUrl}/messages/${id}/`, message);\r\n }\r\n\r\n /**\r\n * Partially update a message\r\n */\r\n patchMessage(id: string, message: Partial<MessageUpdateRequest>): Observable<Message> {\r\n return this.patch<Message>(`${this.apiUrl}/messages/${id}/`, message);\r\n }\r\n\r\n /**\r\n * Delete a message (soft delete)\r\n */\r\n deleteMessage(id: string): Observable<Message> {\r\n return this.delete<Message>(`${this.apiUrl}/messages/${id}/`);\r\n }\r\n\r\n\r\n /**\r\n * Get messages in a specific thread\r\n */\r\n getThreadMessages(threadId: string, params?: Omit<MessageQueryParams, 'thread'>): Observable<PaginatedResponse<Message>> {\r\n const queryParams = { ...params, thread: threadId };\r\n return this.getMessages(queryParams);\r\n }\r\n\r\n /**\r\n * Search messages by content\r\n */\r\n searchMessages(query: string, threadId?: string): Observable<PaginatedResponse<Message>> {\r\n const params: MessageQueryParams = { search: query };\r\n if (threadId) {\r\n params.thread = threadId;\r\n }\r\n return this.getMessages(params);\r\n }\r\n\r\n /**\r\n * Get messages by sender\r\n */\r\n getMessagesBySender(senderId: number, threadId?: string): Observable<PaginatedResponse<Message>> {\r\n const params: MessageQueryParams = { sender: senderId };\r\n if (threadId) {\r\n params.thread = threadId;\r\n }\r\n return this.getMessages(params);\r\n }\r\n\r\n /**\r\n * Get messages by type\r\n */\r\n getMessagesByType(messageType: MessageType, threadId?: string): Observable<PaginatedResponse<Message>> {\r\n const params: MessageQueryParams = { messageType };\r\n if (threadId) {\r\n params.thread = threadId;\r\n }\r\n return this.getMessages(params);\r\n }\r\n\r\n /**\r\n * Get deleted messages (for moderation)\r\n */\r\n getDeletedMessages(threadId?: string): Observable<PaginatedResponse<Message>> {\r\n const params: MessageQueryParams = { isDeleted: true };\r\n if (threadId) {\r\n params.thread = threadId;\r\n }\r\n return this.getMessages(params);\r\n }\r\n\r\n /**\r\n * Get active messages (non-deleted)\r\n */\r\n getActiveMessages(threadId?: string): Observable<PaginatedResponse<Message>> {\r\n const params: MessageQueryParams = { isDeleted: false };\r\n if (threadId) {\r\n params.thread = threadId;\r\n }\r\n return this.getMessages(params);\r\n }\r\n\r\n /**\r\n * Reply to a message\r\n */\r\n replyToMessage(parentMessageId: string, content: string, threadId: string): Observable<Message> {\r\n const message: MessageCreateRequest = {\r\n thread: threadId,\r\n content,\r\n replyTo: parentMessageId\r\n };\r\n return this.createMessage(message);\r\n }\r\n}","import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\n\r\nimport {\r\n ThreadParticipant,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\nexport interface ThreadParticipantQueryParams {\r\n thread?: string;\r\n isModerator?: boolean;\r\n notificationsEnabled?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ThreadParticipantService {\r\n private http = inject(HttpClient);\r\n private apiUrl = '/api'; // This should be configurable\r\n\r\n /**\r\n * Get all thread participants with optional filtering\r\n */\r\n getThreadParticipants(params?: ThreadParticipantQueryParams): Observable<PaginatedResponse<ThreadParticipant>> {\r\n let httpParams = new HttpParams();\r\n \r\n if (params) {\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n httpParams = httpParams.set(key, value.toString());\r\n }\r\n });\r\n }\r\n\r\n return this.http.get<PaginatedResponse<ThreadParticipant>>(`${this.apiUrl}/thread-participants/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single thread participant by ID\r\n */\r\n getThreadParticipant(id: number): Observable<ThreadParticipant> {\r\n return this.http.get<ThreadParticipant>(`${this.apiUrl}/thread-participants/${id}/`);\r\n }\r\n\r\n /**\r\n * Update thread participant settings\r\n */\r\n updateThreadParticipant(id: number, updates: { isModerator?: boolean; notificationsEnabled?: boolean }): Observable<ThreadParticipant> {\r\n return this.http.patch<ThreadParticipant>(`${this.apiUrl}/thread-participants/${id}/`, updates);\r\n }\r\n\r\n /**\r\n * Update participant's last read timestamp\r\n */\r\n updateLastRead(id: number): Observable<ThreadParticipant> {\r\n return this.http.post<ThreadParticipant>(`${this.apiUrl}/thread-participants/${id}/update_last_read/`, {});\r\n }\r\n\r\n /**\r\n * Get participants for a specific thread\r\n */\r\n getParticipantsForThread(threadId: string): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.getThreadParticipants({ thread: threadId });\r\n }\r\n\r\n /**\r\n * Get moderators for a specific thread\r\n */\r\n getModeratorsForThread(threadId: string): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.getThreadParticipants({ thread: threadId, isModerator: true });\r\n }\r\n\r\n /**\r\n * Get non-moderator participants for a specific thread\r\n */\r\n getRegularParticipantsForThread(threadId: string): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.getThreadParticipants({ thread: threadId, isModerator: false });\r\n }\r\n\r\n /**\r\n * Get participants with notifications enabled for a specific thread\r\n */\r\n getNotificationEnabledParticipants(threadId: string): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.getThreadParticipants({ thread: threadId, notificationsEnabled: true });\r\n }\r\n\r\n /**\r\n * Get participants with notifications disabled for a specific thread\r\n */\r\n getNotificationDisabledParticipants(threadId: string): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.getThreadParticipants({ thread: threadId, notificationsEnabled: false });\r\n }\r\n\r\n /**\r\n * Toggle moderator status for a participant\r\n */\r\n toggleModeratorStatus(id: number): Observable<ThreadParticipant> {\r\n return this.http.post<ThreadParticipant>(`${this.apiUrl}/thread-participants/${id}/toggle_moderator/`, {});\r\n }\r\n\r\n /**\r\n * Toggle notifications for a participant\r\n */\r\n toggleNotifications(id: number): Observable<ThreadParticipant> {\r\n return this.http.post<ThreadParticipant>(`${this.apiUrl}/thread-participants/${id}/toggle_notifications/`, {});\r\n }\r\n\r\n /**\r\n * Leave a thread (for current user)\r\n */\r\n leaveThread(threadId: string): Observable<{ success: boolean; message: string }> {\r\n return this.http.post<{ success: boolean; message: string }>(`${this.apiUrl}/thread-participants/leave_thread/`, { thread: threadId });\r\n }\r\n\r\n /**\r\n * Get threads where current user is participant\r\n */\r\n getMyParticipations(): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.http.get<PaginatedResponse<ThreadParticipant>>(`${this.apiUrl}/thread-participants/my_participations/`);\r\n }\r\n\r\n /**\r\n * Get threads where current user is moderator\r\n */\r\n getMyModerations(): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.http.get<PaginatedResponse<ThreadParticipant>>(`${this.apiUrl}/thread-participants/my_moderations/`);\r\n }\r\n}","import { Injectable, OnDestroy } from '@angular/core';\r\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\r\nimport { filter, map } from 'rxjs/operators';\r\n\r\nimport { NotificationType, NotificationPriority, MessageType } from '../models';\r\n\r\nexport interface NewNotificationEvent {\r\n type: 'notification.new';\r\n notificationId: string;\r\n title: string;\r\n message: string;\r\n notificationType: NotificationType;\r\n priority: NotificationPriority;\r\n data: {\r\n alertType?: string;\r\n quantity?: number;\r\n link?: string;\r\n [key: string]: string | number | boolean | undefined;\r\n };\r\n timestamp: string;\r\n}\r\n\r\nexport interface NewMessageEvent {\r\n type: 'message.new';\r\n threadId: string;\r\n messageId: string;\r\n senderId: number;\r\n senderUsername: string;\r\n content: string;\r\n messageType: MessageType;\r\n timestamp: string;\r\n}\r\n\r\nexport interface ThreadUpdateEvent {\r\n type: 'thread.update';\r\n threadId: string;\r\n action: string;\r\n message: string;\r\n timestamp: string;\r\n}\r\n\r\nexport interface NotificationUpdateEvent {\r\n type: 'notification.update';\r\n notificationId: string;\r\n status: string;\r\n timestamp: string;\r\n}\r\n\r\nexport interface ConnectionEstablishedEvent {\r\n type: 'ccmc.connection.established';\r\n message: string;\r\n userId: number;\r\n username: string;\r\n}\r\n\r\nexport interface ThreadSubscriptionConfirmedEvent {\r\n type: 'thread.subscription.confirmed';\r\n threadId: string;\r\n}\r\n\r\nexport interface ThreadSubscriptionDeniedEvent {\r\n type: 'thread.subscription.denied';\r\n threadId: string;\r\n error: string;\r\n}\r\n\r\nexport interface ThreadUnsubscriptionConfirmedEvent {\r\n type: 'thread.unsubscription.confirmed';\r\n threadId: string;\r\n}\r\n\r\nexport interface NotificationMarkedReadEvent {\r\n type: 'notification.marked_read';\r\n notificationId: string;\r\n}\r\n\r\nexport interface PongEvent {\r\n type: 'pong';\r\n}\r\n\r\nexport type WebSocketIncomingMessage =\r\n | NewNotificationEvent\r\n | NewMessageEvent\r\n | ThreadUpdateEvent\r\n | NotificationUpdateEvent\r\n | ConnectionEstablishedEvent\r\n | ThreadSubscriptionConfirmedEvent\r\n | ThreadSubscriptionDeniedEvent\r\n | ThreadUnsubscriptionConfirmedEvent\r\n | NotificationMarkedReadEvent\r\n | PongEvent;\r\n\r\nexport interface SubscribeThreadMessage {\r\n type: 'subscribe_thread';\r\n thread_id: string;\r\n}\r\n\r\nexport interface UnsubscribeThreadMessage {\r\n type: 'unsubscribe_thread';\r\n thread_id: string;\r\n}\r\n\r\nexport interface MarkNotificationReadMessage {\r\n type: 'mark_notification_read';\r\n notification_id: string;\r\n}\r\n\r\nexport interface PingMessage {\r\n type: 'ping';\r\n}\r\n\r\nexport type WebSocketOutgoingMessage =\r\n | SubscribeThreadMessage\r\n | UnsubscribeThreadMessage\r\n | MarkNotificationReadMessage\r\n | PingMessage;\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CommunicationWebSocketService implements OnDestroy {\r\n private socket: WebSocket | null = null;\r\n private reconnectAttempts = 0;\r\n private maxReconnectAttempts = 5;\r\n private reconnectDelay = 3000;\r\n private reconnectTimer: number | null = null;\r\n\r\n private messageSubject = new Subject<WebSocketIncomingMessage>();\r\n private connectionStateSubject = new BehaviorSubject<'disconnected' | 'connecting' | 'connected'>('disconnected');\r\n\r\n public connectionState$ = this.connectionStateSubject.asObservable();\r\n public messages$ = this.messageSubject.asObservable();\r\n\r\n public newNotifications$: Observable<NewNotificationEvent> = this.messages$.pipe(\r\n filter((msg): msg is NewNotificationEvent => msg.type === 'notification.new')\r\n );\r\n\r\n public newMessages$: Observable<NewMessageEvent> = this.messages$.pipe(\r\n filter((msg): msg is NewMessageEvent => msg.type === 'message.new')\r\n );\r\n\r\n public threadUpdates$: Observable<ThreadUpdateEvent> = this.messages$.pipe(\r\n filter((msg): msg is ThreadUpdateEvent => msg.type === 'thread.update')\r\n );\r\n\r\n public notificationUpdates$: Observable<NotificationUpdateEvent> = this.messages$.pipe(\r\n filter((msg): msg is NotificationUpdateEvent => msg.type === 'notification.update')\r\n );\r\n\r\n connect(wsBaseUrl: string, token?: string): void {\r\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\r\n console.log('WebSocket already connected');\r\n return;\r\n }\r\n\r\n this.connectionStateSubject.next('connecting');\r\n\r\n const fullUrl = `${wsBaseUrl.replace(/\\/$/, '')}/ccmc/communications/`;\r\n const url = token ? `${fullUrl}?token=${token}` : fullUrl;\r\n this.socket = new WebSocket(url);\r\n\r\n this.socket.onopen = () => {\r\n console.log('CCMC WebSocket connected');\r\n this.connectionStateSubject.next('connected');\r\n this.reconnectAttempts = 0;\r\n };\r\n\r\n this.socket.onmessage = (event) => {\r\n try {\r\n const message = JSON.parse(event.data) as WebSocketIncomingMessage;\r\n this.messageSubject.next(message);\r\n\r\n if (message.type === 'ccmc.connection.established') {\r\n console.log('CCMC connection established:', message);\r\n }\r\n } catch (error) {\r\n console.error('Error parsing WebSocket message:', error);\r\n }\r\n };\r\n\r\n this.socket.onerror = (error) => {\r\n console.error('CCMC WebSocket error:', error);\r\n };\r\n\r\n this.socket.onclose = (event) => {\r\n console.log('CCMC WebSocket closed:', event.code, event.reason);\r\n this.connectionStateSubject.next('disconnected');\r\n\r\n if (this.reconnectAttempts < this.maxReconnectAttempts) {\r\n this.scheduleReconnect(wsBaseUrl, token);\r\n }\r\n };\r\n }\r\n\r\n private scheduleReconnect(wsBaseUrl: string, token?: string): void {\r\n this.reconnectAttempts++;\r\n const delay = this.reconnectDelay * this.reconnectAttempts;\r\n\r\n console.log(`Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`);\r\n\r\n this.reconnectTimer = setTimeout(() => {\r\n this.connect(wsBaseUrl, token);\r\n }, delay);\r\n }\r\n\r\n disconnect(): void {\r\n if (this.reconnectTimer) {\r\n clearTimeout(this.reconnectTimer);\r\n this.reconnectTimer = null;\r\n }\r\n\r\n if (this.socket) {\r\n this.socket.close();\r\n this.socket = null;\r\n }\r\n\r\n this.connectionStateSubject.next('disconnected');\r\n this.reconnectAttempts = 0;\r\n }\r\n\r\n subscribeToThread(threadId: string): void {\r\n const message: SubscribeThreadMessage = {\r\n type: 'subscribe_thread',\r\n thread_id: threadId\r\n };\r\n this.send(message);\r\n }\r\n\r\n unsubscribeFromThread(threadId: string): void {\r\n const message: UnsubscribeThreadMessage = {\r\n type: 'unsubscribe_thread',\r\n thread_id: threadId\r\n };\r\n this.send(message);\r\n }\r\n\r\n markNotificationAsRead(notificationId: string): void {\r\n const message: MarkNotificationReadMessage = {\r\n type: 'mark_notification_read',\r\n notification_id: notificationId\r\n };\r\n this.send(message);\r\n }\r\n\r\n ping(): void {\r\n const message: PingMessage = { type: 'ping' };\r\n this.send(message);\r\n }\r\n\r\n private send(message: WebSocketOutgoingMessage): void {\r\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\r\n this.socket.send(JSON.stringify(message));\r\n } else {\r\n console.warn('Cannot send message: WebSocket not connected');\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.disconnect();\r\n }\r\n\r\n isConnected(): boolean {\r\n return this.socket !== null && this.socket.readyState === WebSocket.OPEN;\r\n }\r\n\r\n getConnectionState(): 'disconnected' | 'connecting' | 'connected' {\r\n return this.connectionStateSubject.value;\r\n }\r\n}\r\n","import { Injectable, NgZone, inject } from '@angular/core';\r\nimport { webSocket, WebSocketSubject } from 'rxjs/webSocket';\r\nimport { BehaviorSubject, Subject, Subscription } from 'rxjs';\r\nimport { AuthService, CUPCAKE_CORE_CONFIG } from '@noatgnu/cupcake-core';\r\nimport {\r\n WebRTCMessage,\r\n PeerInfo,\r\n PeerRole,\r\n PeerConnectionState\r\n} from '../models/webrtc';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class WebRTCSignallingService {\r\n private ws?: WebSocketSubject<WebRTCMessage>;\r\n private wsSubscription?: Subscription;\r\n private baseUrl: string = '';\r\n private clientPeerId: string | null = null;\r\n private readonly CLIENT_PEER_ID_KEY = 'webrtc_client_peer_id';\r\n private shouldReconnect: boolean = true;\r\n\r\n private _connected = new BehaviorSubject<boolean>(false);\r\n private _peerId = new BehaviorSubject<string | null>(null);\r\n private _sessionId = new BehaviorSubject<string | null>(null);\r\n private _peers = new BehaviorSubject<PeerInfo[]>([]);\r\n private _messages = new Subject<WebRTCMessage>();\r\n private _iceServers = new BehaviorSubject<RTCIceServer[]>([]);\r\n\r\n connected$ = this._connected.asObservable();\r\n peerId$ = this._peerId.asObservable();\r\n sessionId$ = this._sessionId.asObservable();\r\n peers$ = this._peers.asObservable();\r\n messages$ = this._messages.asObservable();\r\n iceServers$ = this._iceServers.asObservable();\r\n\r\n private config = inject(CUPCAKE_CORE_CONFIG);\r\n\r\n constructor(\r\n private authService: AuthService,\r\n private zone: NgZone\r\n ) {\r\n this.baseUrl = this.getBaseUrl();\r\n }\r\n\r\n private getBaseUrl(): string {\r\n if (this.config && this.config.websocketUrl) {\r\n return this.config.websocketUrl;\r\n }\r\n if (this.config && this.config.apiUrl) {\r\n const apiUrl = this.config.apiUrl.replace(/^https?:\\/\\//, '');\r\n const protocol = this.config.apiUrl.startsWith('https') ? 'wss:' : 'ws:';\r\n return `${protocol}//${apiUrl}`;\r\n }\r\n const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';\r\n const host = window.location.host;\r\n return `${protocol}//${host}`;\r\n }\r\n\r\n connect(sessionId: string): void {\r\n this.disconnect();\r\n this.shouldReconnect = true;\r\n\r\n const token = this.authService.getAccessToken();\r\n if (!token) {\r\n console.error('No authentication token available');\r\n return;\r\n }\r\n\r\n this.clientPeerId = this.getClientPeerId();\r\n\r\n const wsPath = this.baseUrl.endsWith('/ws') ? '' : '/ws';\r\n let wsUrl = `${this.baseUrl}${wsPath}/ccmc/webrtc/${sessionId}/?token=${token}`;\r\n\r\n if (this.clientPeerId) {\r\n wsUrl += `&client_peer_id=${this.clientPeerId}`;\r\n console.log('[Signalling] Reconnecting with client peer ID:', this.clientPeerId);\r\n } else {\r\n console.log('[Signalling] First connection, no client peer ID');\r\n }\r\n\r\n console.log('[Signalling] Base URL:', this.baseUrl);\r\n console.log('[Signalling] Connecting to WebSocket URL:', wsUrl.replace(/token=[^&]+/, 'token=***'));\r\n\r\n this.ws = webSocket<WebRTCMessage>({\r\n url: wsUrl,\r\n openObserver: {\r\n next: () => {\r\n console.log('WebRTC signalling connection opened');\r\n this.zone.run(() => {\r\n this._connected.next(true);\r\n });\r\n }\r\n },\r\n closeObserver: {\r\n next: (event: CloseEvent) => {\r\n console.log(`WebRTC signalling connection closed: ${event.code} ${event.reason}`);\r\n\r\n if (event.code === 4001) {\r\n console.error('WebRTC authentication failed - token invalid, please re-login');\r\n this.shouldReconnect = false;\r\n this.zone.run(() => {\r\n this.authService.logout().subscribe({\r\n next: () => {\r\n console.log('Logged out due to WebRTC authentication failure');\r\n },\r\n error: (err) => {\r\n console.error('Error during logout, forcing logout:', err);\r\n }\r\n });\r\n });\r\n return;\r\n } else if (event.code === 4003) {\r\n console.error('WebRTC permission denied');\r\n this.shouldReconnect = false;\r\n }\r\n\r\n this.zone.run(() => {\r\n this._connected.next(false);\r\n this._peerId.next(null);\r\n });\r\n }\r\n },\r\n deserializer: msg => {\r\n try {\r\n return JSON.parse(msg.data);\r\n } catch (e) {\r\n console.error('Error parsing WebSocket message:', e);\r\n return msg.data;\r\n }\r\n }\r\n });\r\n\r\n this.wsSubscription = this.ws.subscribe({\r\n next: (message: WebRTCMessage) => {\r\n this.zone.run(() => {\r\n this.handleMessage(message);\r\n });\r\n },\r\n error: (error) => {\r\n console.error('WebRTC signalling error:', error);\r\n console.error('Error details:', {\r\n message: error?.message,\r\n code: error?.code,\r\n type: error?.type,\r\n target: error?.target?.url\r\n });\r\n this.zone.run(() => {\r\n this._connected.next(false);\r\n });\r\n\r\n if (this.shouldReconnect && this._sessionId.value) {\r\n console.log('Attempting to reconnect in 5 seconds...');\r\n setTimeout(() => {\r\n if (this.shouldReconnect && this._sessionId.value) {\r\n console.log('Reconnecting to WebRTC signalling...');\r\n this.connect(this._sessionId.value);\r\n }\r\n }, 5000);\r\n } else {\r\n console.log('Reconnection disabled due to authentication error');\r\n }\r\n },\r\n complete: () => {\r\n console.log('WebRTC signalling connection completed');\r\n this.zone.run(() => {\r\n this._connected.next(false);\r\n });\r\n }\r\n });\r\n }\r\n\r\n disconnect(): void {\r\n if (this.wsSubscription) {\r\n this.wsSubscription.unsubscribe();\r\n this.wsSubscription = undefined;\r\n }\r\n\r\n if (this.ws) {\r\n this.ws.complete();\r\n this.ws = undefined;\r\n }\r\n\r\n this._connected.next(false);\r\n this._peerId.next(null);\r\n this._sessionId.next(null);\r\n this._peers.next([]);\r\n }\r\n\r\n sendCheck(peerRole: PeerRole = PeerRole.PARTICIPANT): void {\r\n console.log('[Signalling] Sending check with role:', peerRole);\r\n this.send({\r\n type: 'check',\r\n peer_role: peerRole\r\n } as any);\r\n }\r\n\r\n sendOffer(toPeerId: string, sdp: RTCSessionDescriptionInit): void {\r\n this.send({\r\n type: 'offer',\r\n to_peer_id: toPeerId,\r\n sdp: sdp\r\n } as any);\r\n }\r\n\r\n sendAnswer(toPeerId: string, sdp: RTCSessionDescriptionInit): void {\r\n this.send({\r\n type: 'answer',\r\n to_peer_id: toPeerId,\r\n sdp: sdp\r\n } as any);\r\n }\r\n\r\n sendIceCandidate(toPeerId: string, candidate: RTCIceCandidateInit): void {\r\n this.send({\r\n type: 'ice_candidate',\r\n to_peer_id: toPeerId,\r\n candidate: candidate\r\n } as any);\r\n }\r\n\r\n sendPeerState(\r\n connectionState?: PeerConnectionState,\r\n hasVideo?: boolean,\r\n hasAudio?: boolean,\r\n hasScreenShare?: boolean\r\n ): void {\r\n this.send({\r\n type: 'peer_state',\r\n connection_state: connectionState,\r\n has_video: hasVideo,\r\n has_audio: hasAudio,\r\n has_screen_share: hasScreenShare\r\n } as any);\r\n }\r\n\r\n private send(message: any): void {\r\n if (!this.ws) {\r\n console.error('WebSocket not connected');\r\n return;\r\n }\r\n\r\n try {\r\n this.ws.next(message);\r\n } catch (error) {\r\n console.error('Error sending message:', error);\r\n }\r\n }\r\n\r\n private handleMessage(message: WebRTCMessage): void {\r\n console.log('[Signalling] Received message:', message.type, message);\r\n switch (message.type) {\r\n case 'connection.established':\r\n this.handleConnectionEstablished(message);\r\n break;\r\n\r\n case 'check.response':\r\n this.handleCheckResponse(message);\r\n break;\r\n\r\n case 'peer.joined':\r\n this.handlePeerJoined(message);\r\n break;\r\n\r\n case 'peer.left':\r\n this.handlePeerLeft(message);\r\n break;\r\n\r\n case 'peer.check':\r\n case 'offer':\r\n case 'answer':\r\n case 'ice_candidate':\r\n console.log('[Signalling] Forwarding message to WebRTC service:', message.type);\r\n this._messages.next(message);\r\n break;\r\n\r\n case 'peer.state_update':\r\n this.handlePeerStateUpdate(message);\r\n break;\r\n\r\n case 'error':\r\n console.error('WebRTC signalling error:', message.message);\r\n break;\r\n\r\n default:\r\n console.warn('Unknown message type:', message.type);\r\n }\r\n }\r\n\r\n private handleConnectionEstablished(message: any): void {\r\n const peerId = message.peer_id || message.peerId;\r\n const sessionId = message.session_id || message.sessionId;\r\n const clientPeerId = message.client_peer_id || message.clientPeerId;\r\n const isReconnection = message.is_reconnection !== undefined ? message.is_reconnection : message.isReconnection;\r\n const iceServers = message.ice_servers || message.iceServers;\r\n\r\n if (peerId) {\r\n this._peerId.next(peerId);\r\n console.log('[Signalling] Peer ID assigned:', peerId);\r\n }\r\n if (sessionId) {\r\n this._sessionId.next(sessionId);\r\n console.log('[Signalling] Session ID assigned:', sessionId);\r\n }\r\n if (clientPeerId) {\r\n this.setClientPeerId(clientPeerId);\r\n console.log('[Signalling] Client Peer ID received:', clientPeerId);\r\n }\r\n if (isReconnection !== undefined) {\r\n console.log('[Signalling] Is reconnection:', isReconnection);\r\n }\r\n if (iceServers) {\r\n this._iceServers.next(iceServers);\r\n console.log('[Signalling] ICE servers received:', iceServers);\r\n }\r\n console.log('[Signalling] WebRTC connection established:', message);\r\n }\r\n\r\n private handleCheckResponse(message: WebRTCMessage): void {\r\n console.log('[Signalling] Received check.response with peers:', message.peers);\r\n if (message.peers) {\r\n const normalizedPeers = message.peers\r\n .map((peer: any) => ({\r\n id: peer.id,\r\n userId: peer.user_id || peer.userId,\r\n username: peer.username,\r\n peerRole: peer.peer_role || peer.peerRole,\r\n connectionState: peer.connection_state || peer.connectionState,\r\n hasVideo: peer.has_video !== undefined ? peer.has_video : peer.hasVideo,\r\n hasAudio: peer.has_audio !== undefined ? peer.has_audio : peer.hasAudio,\r\n hasScreenShare: peer.has_screen_share !== undefined ? peer.has_screen_share : peer.hasScreenShare\r\n }))\r\n .filter(peer => {\r\n if (peer.id === this._peerId.value) {\r\n console.log('[Signalling] Filtering out self from peer list:', peer.id);\r\n return false;\r\n }\r\n if (peer.connectionState === 'disconnected') {\r\n console.log('[Signalling] Filtering out disconnected peer:', peer.username, peer.id);\r\n return false;\r\n }\r\n return true;\r\n });\r\n\r\n this._peers.next(normalizedPeers);\r\n console.log('[Signalling] Peer list updated, active count:', normalizedPeers.length);\r\n\r\n normalizedPeers.forEach(peer => {\r\n console.log('[Signalling] Discovered peer from check.response:', peer.username, peer.id, 'userId:', peer.userId, 'role:', peer.peerRole, 'state:', peer.connectionState);\r\n const peerCheckMessage: WebRTCMessage = {\r\n type: 'peer.check',\r\n fromPeerId: peer.id,\r\n fromUserId: peer.userId,\r\n fromUsername: peer.username,\r\n peerRole: peer.peerRole\r\n };\r\n this._messages.next(peerCheckMessage);\r\n });\r\n } else {\r\n console.log('[Signalling] No peers in check.response');\r\n }\r\n }\r\n\r\n private handlePeerJoined(message: any): void {\r\n const peerId = message.peer_id || message.peerId;\r\n const userId = message.user_id || message.userId;\r\n const username = message.username;\r\n\r\n console.log('[Signalling] Peer joined:', username, peerId, 'userId:', userId);\r\n\r\n const newPeer: PeerInfo = {\r\n id: peerId,\r\n userId: userId,\r\n username: username,\r\n peerRole: PeerRole.PARTICIPANT,\r\n connectionState: PeerConnectionState.CONNECTING,\r\n hasVideo: false,\r\n hasAudio: false,\r\n hasScreenShare: false\r\n };\r\n\r\n const currentPeers = this._peers.value;\r\n if (!currentPeers.find(p => p.id === peerId)) {\r\n this._peers.next([...currentPeers, newPeer]);\r\n }\r\n\r\n const peerCheckMessage: WebRTCMessage = {\r\n type: 'peer.check',\r\n fromPeerId: peerId,\r\n fromUserId: userId,\r\n fromUsername: username,\r\n peerRole: PeerRole.PARTICIPANT\r\n };\r\n this._messages.next(peerCheckMessage);\r\n }\r\n\r\n private handlePeerLeft(message: any): void {\r\n const peerId = message.peer_id || message.peerId;\r\n const userId = message.user_id || message.userId;\r\n const username = message.username;\r\n\r\n console.log('[Signalling] Peer left:', username, peerId, 'userId:', userId);\r\n\r\n const currentPeers = this._peers.value;\r\n const filteredPeers = currentPeers.filter(p => p.id !== peerId);\r\n if (filteredPeers.length !== currentPeers.length) {\r\n this._peers.next(filteredPeers);\r\n }\r\n\r\n this._messages.next({\r\n type: 'peer.left',\r\n fromPeerId: peerId,\r\n fromUserId: userId,\r\n fromUsername: username\r\n });\r\n }\r\n\r\n private handlePeerStateUpdate(message: any): void {\r\n const peerId = message.peer_id || message.from_peer_id || message.fromPeerId || message.peerId;\r\n const connectionState = message.connection_state || message.connectionState;\r\n const hasVideo = message.has_video !== undefined ? message.has_video : message.hasVideo;\r\n const hasAudio = message.has_audio !== undefined ? message.has_audio : message.hasAudio;\r\n const hasScreenShare = message.has_screen_share !== undefined ? message.has_screen_share : message.hasScreenShare;\r\n\r\n console.log('[Signalling] Peer state update for peer:', peerId, {connectionState, hasVideo, hasAudio, hasScreenShare});\r\n\r\n if (!peerId) {\r\n console.error('[Signalling] No peer ID in state update message:', message);\r\n return;\r\n }\r\n\r\n const currentPeers = this._peers.value;\r\n const updatedPeers = currentPeers.map(peer => {\r\n if (peer.id === peerId) {\r\n return {\r\n ...peer,\r\n connectionState: connectionState !== undefined ? connectionState : peer.connectionState,\r\n hasVideo: hasVideo !== undefined ? hasVideo : peer.hasVideo,\r\n hasAudio: hasAudio !== undefined ? hasAudio : peer.hasAudio,\r\n hasScreenShare: hasScreenShare !== undefined ? hasScreenShare : peer.hasScreenShare\r\n };\r\n }\r\n return peer;\r\n });\r\n\r\n this._peers.next(updatedPeers);\r\n this._messages.next(message);\r\n }\r\n\r\n get peerId(): string | null {\r\n return this._peerId.value;\r\n }\r\n\r\n get sessionId(): string | null {\r\n return this._sessionId.value;\r\n }\r\n\r\n get connected(): boolean {\r\n return this._connected.value;\r\n }\r\n\r\n get peers(): PeerInfo[] {\r\n return this._peers.value;\r\n }\r\n\r\n get iceServers(): RTCIceServer[] {\r\n return this._iceServers.value;\r\n }\r\n\r\n private getClientPeerId(): string | null {\r\n try {\r\n return sessionStorage.getItem(this.CLIENT_PEER_ID_KEY);\r\n } catch (error) {\r\n console.error('[Signalling] Error reading client peer ID from sessionStorage:', error);\r\n return null;\r\n }\r\n }\r\n\r\n private setClientPeerId(clientPeerId: string): void {\r\n try {\r\n sessionStorage.setItem(this.CLIENT_PEER_ID_KEY, clientPeerId);\r\n this.clientPeerId = clientPeerId;\r\n } catch (error) {\r\n console.error('[Signalling] Error saving client peer ID to sessionStorage:', error);\r\n }\r\n }\r\n\r\n clearClientPeerId(): void {\r\n try {\r\n sessionStorage.removeItem(this.CLIENT_PEER_ID_KEY);\r\n this.clientPeerId = null;\r\n console.log('[Signalling] Client peer ID cleared from sessionStorage');\r\n } catch (error) {\r\n console.error('[Signalling] Error clearing client peer ID from sessionStorage:', error);\r\n }\r\n }\r\n}\r\n","import { Injectable, NgZone } from '@angular/core';\r\nimport { BehaviorSubject, Subject, Subscription } from 'rxjs';\r\nimport { WebRTCSignallingService } from './webrtc-signalling';\r\nimport {\r\n WebRTCMessage,\r\n PeerConnection,\r\n PeerInfo,\r\n PeerRole,\r\n PeerConnectionState,\r\n WebRTCConfig,\r\n MediaConstraintsConfig,\r\n ChatMessage,\r\n DataChannelMessage,\r\n FileOfferData,\r\n FileTransferRequest,\r\n FileTransferAccept,\r\n FileChunk,\r\n FileTransferProgress,\r\n FileTransferState\r\n} from '../models/webrtc';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class WebRTCService {\r\n private peerConnections: Map<string, PeerConnection> = new Map();\r\n private localStream?: MediaStream;\r\n private signallingSubscription?: Subscription;\r\n private fileTransfers: Map<string, FileTransferState> = new Map();\r\n private readonly DEFAULT_CHUNK_SIZE = 16384;\r\n private role: PeerRole = PeerRole.PARTICIPANT;\r\n\r\n private _localStreamReady = new BehaviorSubject<boolean>(false);\r\n private _remoteStreams = new BehaviorSubject<Map<string, MediaStream>>(new Map());\r\n private _connectionState = new BehaviorSubject<'disconnected' | 'connecting' | 'connected'>('disconnected');\r\n private _activePeers = new BehaviorSubject<PeerInfo[]>([]);\r\n private _chatMessages = new Subject<ChatMessage>();\r\n private _fileTransferProgress = new Subject<FileTransferProgress>();\r\n private _dataChannelReady = new BehaviorSubject<boolean>(false);\r\n\r\n localStreamReady$ = this._localStreamReady.asObservable();\r\n remoteStreams$ = this._remoteStreams.asObservable();\r\n connectionState$ = this._connectionState.asObservable();\r\n activePeers$ = this._activePeers.asObservable();\r\n chatMessages$ = this._chatMessages.asObservable();\r\n fileTransferProgress$ = this._fileTransferProgress.asObservable();\r\n dataChannelReady$ = this._dataChannelReady.asObservable();\r\n\r\n private defaultConfig: WebRTCConfig = {\r\n iceServers: [\r\n { urls: 'stun:stun.l.google.com:19302' },\r\n { urls: 'stun:stun1.l.google.com:19302' }\r\n ],\r\n iceCandidatePoolSize: 10,\r\n iceTransportPolicy: 'all',\r\n bundlePolicy: 'max-bundle',\r\n rtcpMuxPolicy: 'require'\r\n };\r\n\r\n private defaultMediaConstraints: MediaConstraintsConfig = {\r\n video: {\r\n width: { ideal: 1280 },\r\n height: { ideal: 720 },\r\n frameRate: { ideal: 30 }\r\n },\r\n audio: true\r\n };\r\n\r\n constructor(\r\n private signalling: WebRTCSignallingService,\r\n private zone: NgZone\r\n ) {}\r\n\r\n async startSession(\r\n sessionId: string,\r\n role: PeerRole = PeerRole.PARTICIPANT,\r\n enableVideo: boolean = true,\r\n enableAudio: boolean = true,\r\n videoDeviceId?: string,\r\n audioDeviceId?: string\r\n ): Promise<void> {\r\n this.role = role;\r\n this._connectionState.next('connecting');\r\n\r\n console.log('[WebRTC] Starting session with role:', role, {enableVideo, enableAudio, videoDeviceId, audioDeviceId});\r\n\r\n if (enableVideo || enableAudio) {\r\n await this.startLocalMedia(enableVideo, enableAudio, videoDeviceId, audioDeviceId);\r\n }\r\n\r\n this.signalling.connect(sessionId);\r\n\r\n this.signallingSubscription = this.signalling.messages$.subscribe({\r\n next: (message) => {\r\n this.handleSignallingMessage(message);\r\n }\r\n });\r\n\r\n this.signalling.peerId$.subscribe(peerId => {\r\n if (peerId) {\r\n console.log('[WebRTC] Peer ID assigned, sending check with role:', role);\r\n this.signalling.sendCheck(role);\r\n }\r\n });\r\n\r\n this.signalling.peers$.subscribe(peers => {\r\n console.log('[WebRTC] Peers list updated:', peers);\r\n this._activePeers.next(peers);\r\n });\r\n }\r\n\r\n async startLocalMedia(\r\n enableVideo: boolean = true,\r\n enableAudio: boolean = true,\r\n videoDeviceId?: string,\r\n audioDeviceId?: string\r\n ): Promise<void> {\r\n try {\r\n const constraints: MediaConstraintsConfig = {\r\n video: enableVideo ? {\r\n ...this.defaultMediaConstraints.video as MediaTrackConstraints,\r\n ...(videoDeviceId ? { deviceId: { exact: videoDeviceId } } : {})\r\n } : false,\r\n audio: enableAudio ? {\r\n ...(this.defaultMediaConstraints.audio as MediaTrackConstraints || {}),\r\n ...(audioDeviceId ? { deviceId: { exact: audioDeviceId } } : {})\r\n } : false\r\n };\r\n\r\n console.log('[WebRTC] Starting local media with constraints:', constraints);\r\n\r\n this.localStream = await navigator.mediaDevices.getUserMedia(constraints);\r\n this._localStreamReady.next(true);\r\n\r\n this.updatePeerState(\r\n undefined,\r\n enableVideo,\r\n enableAudio,\r\n false\r\n );\r\n\r\n console.log('[WebRTC] Local media started:', {\r\n hasVideo: this.localStream.getVideoTracks().length > 0,\r\n hasAudio: this.localStream.getAudioTracks().length > 0,\r\n videoTrack: this.localStream.getVideoTracks()[0]?.label,\r\n audioTrack: this.localStream.getAudioTracks()[0]?.label\r\n });\r\n } catch (error) {\r\n console.error('Error accessing media devices:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n async startScreenShare(): Promise<void> {\r\n try {\r\n const screenStream = await (navigator.mediaDevices as any).getDisplayMedia({\r\n video: true,\r\n audio: false\r\n });\r\n\r\n if (this.localStream) {\r\n this.localStream.getTracks().forEach(track => track.stop());\r\n }\r\n\r\n this.localStream = screenStream;\r\n this._localStreamReady.next(true);\r\n\r\n this.replaceTracksInAllPeers();\r\n\r\n this.updatePeerState(undefined, false, false, true);\r\n\r\n screenStream.getVideoTracks()[0].addEventListener('ended', () => {\r\n this.stopScreenShare();\r\n });\r\n\r\n console.log('Screen sharing started');\r\n } catch (error) {\r\n console.error('Error starting screen share:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n stopScreenShare(): void {\r\n if (this.localStream) {\r\n this.localStream.getTracks().forEach(track => track.stop());\r\n this.localStream = undefined;\r\n this._localStreamReady.next(false);\r\n }\r\n\r\n this.updatePeerState(undefined, false, false, false);\r\n\r\n console.log('Screen sharing stopped');\r\n }\r\n\r\n async enableVideo(deviceId?: string): Promise<void> {\r\n if (!this.localStream) {\r\n console.log('[WebRTC] Creating local stream for video');\r\n try {\r\n const newStream = await navigator.mediaDevices.getUserMedia({\r\n video: {\r\n ...this.defaultMediaConstraints.video as MediaTrackConstraints,\r\n ...(deviceId ? { deviceId: { exact: deviceId } } : {})\r\n }\r\n });\r\n\r\n this.localStream = newStream;\r\n const newVideoTrack = newStream.getVideoTracks()[0];\r\n\r\n for (const connection of this.peerConnections.values()) {\r\n connection.pc.addTrack(newVideoTrack, this.localStream!);\r\n console.log(`[WebRTC] Added video track for peer ${connection.peerId}`);\r\n\r\n await this.renegotiateConnection(connection.peerId);\r\n }\r\n\r\n this.updatePeerState(undefined, true, undefined, undefined);\r\n this._localStreamReady.next(true);\r\n console.log('[WebRTC] Video enabled with new stream:', newVideoTrack.label);\r\n } catch (error) {\r\n console.error('[WebRTC] Error creating stream for video:', error);\r\n throw error;\r\n }\r\n return;\r\n }\r\n\r\n const hasVideoTrack = this.localStream.getVideoTracks().length > 0;\r\n if (hasVideoTrack) {\r\n console.log('[WebRTC] Video already enabled');\r\n return;\r\n }\r\n\r\n try {\r\n const newStream = await navigator.mediaDevices.getUserMedia({\r\n video: {\r\n ...this.defaultMediaConstraints.video as MediaTrackConstraints,\r\n ...(deviceId ? { deviceId: { exact: deviceId } } : {})\r\n }\r\n });\r\n\r\n const newVideoTrack = newStream.getVideoTracks()[0];\r\n this.localStream.addTrack(newVideoTrack);\r\n\r\n for (const connection of this.peerConnections.values()) {\r\n connection.pc.addTrack(newVideoTrack, this.localStream!);\r\n console.log(`[WebRTC] Added video track for peer ${connection.peerId}`);\r\n\r\n await this.renegotiateConnection(connection.peerId);\r\n }\r\n\r\n this.updatePeerState(undefined, true, undefined, undefined);\r\n this._localStreamReady.next(true);\r\n console.log('[WebRTC] Video enabled:', newVideoTrack.label);\r\n } catch (error) {\r\n console.error('[WebRTC] Error enabling video:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n async disableVideo(): Promise<void> {\r\n if (!this.localStream) {\r\n return;\r\n }\r\n\r\n const videoTrack = this.localStream.getVideoTracks()[0];\r\n if (videoTrack) {\r\n videoTrack.stop();\r\n this.localStream.removeTrack(videoTrack);\r\n\r\n this.peerConnections.forEach((connection) => {\r\n const sender = connection.pc.getSenders().find(s => s.track?.kind === 'video');\r\n if (sender) {\r\n connection.pc.removeTrack(sender);\r\n console.log(`[WebRTC] Removed video track for peer ${connection.peerId}`);\r\n }\r\n });\r\n\r\n this.updatePeerState(undefined, false, undefined, undefined);\r\n console.log('[WebRTC] Video disabled');\r\n }\r\n }\r\n\r\n async switchVideoDevice(deviceId: string): Promise<void> {\r\n if (!this.localStream) {\r\n console.log('[WebRTC] No local stream yet, device will be used when video is enabled');\r\n return;\r\n }\r\n\r\n const hasVideoTrack = this.localStream.getVideoTracks().length > 0;\r\n if (!hasVideoTrack) {\r\n console.log('[WebRTC] Video is not enabled, device will be used when video is enabled');\r\n return;\r\n }\r\n\r\n try {\r\n const oldVideoTrack = this.localStream.getVideoTracks()[0];\r\n\r\n const newStream = await navigator.mediaDevices.getUserMedia({\r\n video: {\r\n ...this.defaultMediaConstraints.video as MediaTrackConstraints,\r\n deviceId: { exact: deviceId }\r\n }\r\n });\r\n\r\n const newVideoTrack = newStream.getVideoTracks()[0];\r\n\r\n if (oldVideoTrack) {\r\n oldVideoTrack.stop();\r\n this.localStream.removeTrack(oldVideoTrack);\r\n }\r\n\r\n this.localStream.addTrack(newVideoTrack);\r\n\r\n this.peerConnections.forEach((connection) => {\r\n const sender = connection.pc.getSenders().find(s => s.track?.kind === 'video');\r\n if (sender) {\r\n sender.replaceTrack(newVideoTrack);\r\n console.log(`[WebRTC] Replaced video track for peer ${connection.peerId}`);\r\n } else {\r\n connection.pc.addTrack(newVideoTrack, this.localStream!);\r\n console.log(`[WebRTC] Added video track for peer ${connection.peerId}`);\r\n }\r\n });\r\n\r\n this._localStreamReady.next(true);\r\n console.log('[WebRTC] Video device switched to:', newVideoTrack.label);\r\n } catch (error) {\r\n console.error('[WebRTC] Error switching video device:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n async enableAudio(deviceId?: string): Promise<void> {\r\n if (!this.localStream) {\r\n console.log('[WebRTC] Creating local stream for audio');\r\n try {\r\n const newStream = await navigator.mediaDevices.getUserMedia({\r\n audio: {\r\n ...(this.defaultMediaConstraints.audio as MediaTrackConstraints || {}),\r\n ...(deviceId ? { deviceId: { exact: deviceId } } : {})\r\n }\r\n });\r\n\r\n this.localStream = newStream;\r\n const newAudioTrack = newStream.getAudioTracks()[0];\r\n\r\n for (const connection of this.peerConnections.values()) {\r\n connection.pc.addTrack(newAudioTrack, this.localStream!);\r\n console.log(`[WebRTC] Added audio track for peer ${connection.peerId}`);\r\n\r\n await this.renegotiateConnection(connection.peerId);\r\n }\r\n\r\n this.updatePeerState(undefined, undefined, true, undefined);\r\n this._localStreamReady.next(true);\r\n console.log('[WebRTC] Audio enabled with new stream:', newAudioTrack.label);\r\n } catch (error) {\r\n console.error('[WebRTC] Error creating stream for audio:', error);\r\n throw error;\r\n }\r\n return;\r\n }\r\n\r\n const hasAudioTrack = this.localStream.getAudioTracks().length > 0;\r\n if (hasAudioTrack) {\r\n console.log('[WebRTC] Audio already enabled');\r\n return;\r\n }\r\n\r\n try {\r\n const newStream = await navigator.mediaDevices.getUserMedia({\r\n audio: {\r\n ...(this.defaultMediaConstraints.audio as MediaTrackConstraints || {}),\r\n ...(deviceId ? { deviceId: { exact: deviceId } } : {})\r\n }\r\n });\r\n\r\n const newAudioTrack = newStream.getAudioTracks()[0];\r\n this.localStream.addTrack(newAudioTrack);\r\n\r\n for (const connection of this.peerConnections.values()) {\r\n connection.pc.addTrack(newAudioTrack, this.localStream!);\r\n console.log(`[WebRTC] Added audio track for peer ${connection.peerId}`);\r\n\r\n await this.renegotiateConnection(connection.peerId);\r\n }\r\n\r\n this.updatePeerState(undefined, undefined, true, undefined);\r\n this._localStreamReady.next(true);\r\n console.log('[WebRTC] Audio enabled:', newAudioTrack.label);\r\n } catch (error) {\r\n console.error('[WebRTC] Error enabling audio:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n async disableAudio(): Promise<void> {\r\n if (!this.localStream) {\r\n return;\r\n }\r\n\r\n const audioTrack = this.localStream.getAudioTracks()[0];\r\n if (audioTrack) {\r\n audioTrack.stop();\r\n this.localStream.removeTrack(audioTrack);\r\n\r\n this.peerConnections.forEach((connection) => {\r\n const sender = connection.pc.getSenders().find(s => s.track?.kind === 'audio');\r\n if (sender) {\r\n connection.pc.removeTrack(sender);\r\n console.log(`[WebRTC] Removed audio track for peer ${connection.peerId}`);\r\n }\r\n });\r\n\r\n this.updatePeerState(undefined, undefined, false, undefined);\r\n console.log('[WebRTC] Audio disabled');\r\n }\r\n }\r\n\r\n async switchAudioDevice(deviceId: string): Promise<void> {\r\n if (!this.localStream) {\r\n console.log('[WebRTC] No local stream yet, device will be used when audio is enabled');\r\n return;\r\n }\r\n\r\n const hasAudioTrack = this.localStream.getAudioTracks().length > 0;\r\n if (!hasAudioTrack) {\r\n console.log('[WebRTC] Audio is not enabled, device will be used when audio is enabled');\r\n return;\r\n }\r\n\r\n try {\r\n const oldAudioTrack = this.localStream.getAudioTracks()[0];\r\n\r\n const newStream = await navigator.mediaDevices.getUserMedia({\r\n audio: {\r\n ...(this.defaultMediaConstraints.audio as MediaTrackConstraints || {}),\r\n deviceId: { exact: deviceId }\r\n }\r\n });\r\n\r\n const newAudioTrack = newStream.getAudioTracks()[0];\r\n\r\n if (oldAudioTrack) {\r\n oldAudioTrack.stop();\r\n this.localStream.removeTrack(oldAudioTrack);\r\n }\r\n\r\n this.localStream.addTrack(newAudioTrack);\r\n\r\n this.peerConnections.forEach((connection) => {\r\n const sender = connection.pc.getSenders().find(s => s.track?.kind === 'audio');\r\n if (sender) {\r\n sender.replaceTrack(newAudioTrack);\r\n console.log(`[WebRTC] Replaced audio track for peer ${connection.peerId}`);\r\n } else {\r\n connection.pc.addTrack(newAudioTrack, this.localStream!);\r\n console.log(`[WebRTC] Added audio track for peer ${connection.peerId}`);\r\n }\r\n });\r\n\r\n this._localStreamReady.next(true);\r\n console.log('[WebRTC] Audio device switched to:', newAudioTrack.label);\r\n } catch (error) {\r\n console.error('[WebRTC] Error switching audio device:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n endSession(): void {\r\n this.peerConnections.forEach((conn, peerId) => {\r\n this.closePeerConnection(peerId);\r\n });\r\n\r\n if (this.localStream) {\r\n this.localStream.getTracks().forEach(track => track.stop());\r\n this.localStream = undefined;\r\n this._localStreamReady.next(false);\r\n }\r\n\r\n if (this.signallingSubscription) {\r\n this.signallingSubscription.unsubscribe();\r\n }\r\n\r\n this.signalling.disconnect();\r\n\r\n this._connectionState.next('disconnected');\r\n this._remoteStreams.next(new Map());\r\n this._activePeers.next([]);\r\n\r\n console.log('WebRTC session ended');\r\n }\r\n\r\n private async handleSignallingMessage(message: WebRTCMessage): Promise<void> {\r\n try {\r\n console.log('[WebRTC] Received signalling message:', message.type, message);\r\n\r\n const normalizedMessage = this.normalizeMessage(message);\r\n\r\n switch (normalizedMessage.type) {\r\n case 'peer.check':\r\n if (normalizedMessage.fromPeerId) {\r\n console.log('[WebRTC] Handling peer check from:', normalizedMessage.fromUsername, normalizedMessage.fromPeerId);\r\n await this.handlePeerCheck(normalizedMessage.fromPeerId, normalizedMessage.fromUserId!, normalizedMessage.fromUsername!, normalizedMessage.peerRole!);\r\n }\r\n break;\r\n\r\n case 'offer':\r\n if (normalizedMessage.fromPeerId && normalizedMessage.sdp) {\r\n await this.handleOffer(normalizedMessage.fromPeerId, normalizedMessage.fromUserId!, normalizedMessage.fromUsername!, normalizedMessage.sdp);\r\n }\r\n break;\r\n\r\n case 'answer':\r\n if (normalizedMessage.fromPeerId && normalizedMessage.sdp) {\r\n await this.handleAnswer(normalizedMessage.fromPeerId, normalizedMessage.sdp);\r\n }\r\n break;\r\n\r\n case 'ice_candidate':\r\n if (normalizedMessage.fromPeerId && normalizedMessage.candidate) {\r\n await this.handleIceCandidate(normalizedMessage.fromPeerId, normalizedMessage.candidate);\r\n }\r\n break;\r\n\r\n case 'peer.state_update':\r\n this.handlePeerStateUpdate(normalizedMessage);\r\n break;\r\n\r\n case 'peer.left':\r\n if (normalizedMessage.fromPeerId) {\r\n this.handlePeerLeft(normalizedMessage.fromPeerId);\r\n }\r\n break;\r\n }\r\n } catch (error) {\r\n console.error('Error handling signalling message:', error);\r\n }\r\n }\r\n\r\n private normalizeMessage(message: any): WebRTCMessage {\r\n return {\r\n ...message,\r\n fromPeerId: message.from_peer_id || message.fromPeerId,\r\n fromUserId: message.from_user_id || message.fromUserId,\r\n fromUsername: message.from_username || message.fromUsername,\r\n peerRole: message.peer_role || message.peerRole,\r\n toPeerId: message.to_peer_id || message.toPeerId,\r\n connectionState: message.connection_state || message.connectionState,\r\n hasVideo: message.has_video !== undefined ? message.has_video : message.hasVideo,\r\n hasAudio: message.has_audio !== undefined ? message.has_audio : message.hasAudio,\r\n hasScreenShare: message.has_screen_share !== undefined ? message.has_screen_share : message.hasScreenShare\r\n } as WebRTCMessage;\r\n }\r\n\r\n private async handlePeerCheck(peerId: string, userId: number, username: string, role: PeerRole): Promise<void> {\r\n if (peerId === this.signalling.peerId) {\r\n console.log(`[WebRTC] Ignoring peer check from self: ${peerId}`);\r\n return;\r\n }\r\n\r\n if (!this.peerConnections.has(peerId)) {\r\n console.log(`[WebRTC] New peer discovered: ${username} (${peerId}) as ${role}`);\r\n\r\n const pc = await this.createPeerConnection(peerId, userId, username, role);\r\n\r\n const shouldInitiate = this.shouldInitiateConnection(peerId, role);\r\n\r\n if (shouldInitiate) {\r\n console.log(`[WebRTC] Initiating connection to ${username} (${peerId})`);\r\n try {\r\n const offer = await pc.createOffer();\r\n console.log(`[WebRTC] Offer created for ${peerId}:`, offer);\r\n await pc.setLocalDescription(offer);\r\n console.log(`[WebRTC] Local description set for ${peerId}`);\r\n\r\n if (pc.localDescription) {\r\n console.log(`[WebRTC] Sending offer to ${peerId}`);\r\n this.signalling.sendOffer(peerId, pc.localDescription);\r\n\r\n const connection = this.peerConnections.get(peerId);\r\n if (connection) {\r\n connection.offered = true;\r\n }\r\n console.log(`[WebRTC] Offer sent successfully to ${peerId}`);\r\n }\r\n } catch (error) {\r\n console.error(`[WebRTC] Error creating/sending offer to ${peerId}:`, error);\r\n }\r\n } else {\r\n console.log(`[WebRTC] Waiting for ${username} (${peerId}) to initiate connection`);\r\n }\r\n } else {\r\n console.log(`[WebRTC] Peer connection already exists for: ${peerId}`);\r\n }\r\n }\r\n\r\n private async handleOffer(peerId: string, userId: number, username: string, sdp: RTCSessionDescriptionInit): Promise<void> {\r\n let pc: RTCPeerConnection;\r\n\r\n if (!this.peerConnections.has(peerId)) {\r\n pc = await this.createPeerConnection(peerId, userId, username, PeerRole.PARTICIPANT);\r\n } else {\r\n pc = this.peerConnections.get(peerId)!.pc;\r\n }\r\n\r\n await pc.setRemoteDescription(new RTCSessionDescription(sdp));\r\n\r\n const answer = await pc.createAnswer();\r\n await pc.setLocalDescription(answer);\r\n\r\n if (pc.localDescription) {\r\n this.signalling.sendAnswer(peerId, pc.localDescription);\r\n\r\n const connection = this.peerConnections.get(peerId);\r\n if (connection) {\r\n connection.answered = true;\r\n }\r\n }\r\n\r\n const connection = this.peerConnections.get(peerId);\r\n if (connection && connection.queuedCandidates.length > 0) {\r\n await Promise.all(\r\n connection.queuedCandidates.map(candidate => pc.addIceCandidate(candidate))\r\n );\r\n connection.queuedCandidates = [];\r\n }\r\n }\r\n\r\n private async handleAnswer(peerId: string, sdp: RTCSessionDescriptionInit): Promise<void> {\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection) {\r\n console.warn(`Received answer from unknown peer: ${peerId}`);\r\n return;\r\n }\r\n\r\n await connection.pc.setRemoteDescription(new RTCSessionDescription(sdp));\r\n\r\n if (connection.queuedCandidates.length > 0) {\r\n await Promise.all(\r\n connection.queuedCandidates.map(candidate => connection.pc.addIceCandidate(candidate))\r\n );\r\n connection.queuedCandidates = [];\r\n }\r\n }\r\n\r\n private async handleIceCandidate(peerId: string, candidate: RTCIceCandidateInit): Promise<void> {\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection) {\r\n console.warn(`Received ICE candidate from unknown peer: ${peerId}`);\r\n return;\r\n }\r\n\r\n const iceCandidate = new RTCIceCandidate(candidate);\r\n\r\n if (connection.pc.remoteDescription) {\r\n await connection.pc.addIceCandidate(iceCandidate);\r\n } else {\r\n connection.queuedCandidates.push(iceCandidate);\r\n }\r\n }\r\n\r\n private handlePeerStateUpdate(message: WebRTCMessage): void {\r\n console.log('Peer state update:', message);\r\n }\r\n\r\n private handlePeerLeft(peerId: string): void {\r\n console.log(`[WebRTC] Peer left: ${peerId}`);\r\n\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection) {\r\n console.log(`[WebRTC] No connection found for peer: ${peerId}`);\r\n return;\r\n }\r\n\r\n if (connection.dataChannel) {\r\n connection.dataChannel.close();\r\n }\r\n\r\n connection.pc.close();\r\n\r\n this.peerConnections.delete(peerId);\r\n\r\n const streams = this._remoteStreams.value;\r\n streams.delete(peerId);\r\n this._remoteStreams.next(streams);\r\n\r\n this.updateDataChannelReadyState();\r\n\r\n console.log(`[WebRTC] Cleaned up connection for peer: ${peerId}`);\r\n }\r\n\r\n private async createPeerConnection(\r\n peerId: string,\r\n userId: number,\r\n username: string,\r\n role: PeerRole\r\n ): Promise<RTCPeerConnection> {\r\n const iceServers = this.signalling.iceServers;\r\n const config: WebRTCConfig = iceServers.length > 0\r\n ? { ...this.defaultConfig, iceServers }\r\n : this.defaultConfig;\r\n\r\n const pc = new RTCPeerConnection(config);\r\n\r\n const dataChannel = pc.createDataChannel('data', { ordered: true });\r\n this.setupDataChannelHandlers(dataChannel, peerId);\r\n\r\n if (this.localStream) {\r\n console.log(`[WebRTC] Adding local tracks to peer ${peerId}:`, {\r\n videoTracks: this.localStream.getVideoTracks().length,\r\n audioTracks: this.localStream.getAudioTracks().length,\r\n tracks: this.localStream.getTracks().map(t => ({kind: t.kind, label: t.label, enabled: t.enabled}))\r\n });\r\n this.localStream.getTracks().forEach(track => {\r\n console.log(`[WebRTC] Adding ${track.kind} track to ${peerId}:`, track.label, 'enabled:', track.enabled);\r\n pc.addTrack(track, this.localStream!);\r\n });\r\n } else {\r\n console.log(`[WebRTC] No local stream available to add tracks to peer ${peerId}`);\r\n }\r\n\r\n this.setupPeerConnectionHandlers(pc, peerId);\r\n\r\n const connection: PeerConnection = {\r\n peerId,\r\n userId,\r\n username,\r\n pc,\r\n dataChannel,\r\n role,\r\n offered: false,\r\n answered: false,\r\n connected: false,\r\n queuedCandidates: []\r\n };\r\n\r\n this.peerConnections.set(peerId, connection);\r\n\r\n console.log(`Created peer connection for ${username} (${peerId})`);\r\n\r\n return pc;\r\n }\r\n\r\n private setupPeerConnectionHandlers(pc: RTCPeerConnection, peerId: string): void {\r\n pc.onicecandidate = (event) => {\r\n if (event.candidate) {\r\n this.signalling.sendIceCandidate(peerId, event.candidate.toJSON());\r\n }\r\n };\r\n\r\n pc.ontrack = (event) => {\r\n console.log(`Received track from peer ${peerId}:`, event.track.kind);\r\n\r\n this.zone.run(() => {\r\n const stream = event.streams[0];\r\n const connection = this.peerConnections.get(peerId);\r\n if (connection) {\r\n connection.stream = stream;\r\n }\r\n\r\n const streams = this._remoteStreams.value;\r\n streams.set(peerId, stream);\r\n this._remoteStreams.next(streams);\r\n });\r\n };\r\n\r\n pc.onconnectionstatechange = () => {\r\n console.log(`Connection state with peer ${peerId}: ${pc.connectionState}`);\r\n\r\n this.zone.run(() => {\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection) return;\r\n\r\n if (pc.connectionState === 'connected') {\r\n connection.connected = true;\r\n this._connectionState.next('connected');\r\n this.signalling.sendPeerState(PeerConnectionState.CONNECTED);\r\n console.log(`[WebRTC] Peer connection established with ${peerId}, sent state update to backend`);\r\n } else if (pc.connectionState === 'connecting') {\r\n this.signalling.sendPeerState(PeerConnectionState.CONNECTING);\r\n } else if (pc.connectionState === 'failed') {\r\n this.signalling.sendPeerState(PeerConnectionState.FAILED);\r\n this.closePeerConnection(peerId);\r\n } else if (pc.connectionState === 'disconnected') {\r\n this.signalling.sendPeerState(PeerConnectionState.DISCONNECTED);\r\n this.closePeerConnection(peerId);\r\n }\r\n });\r\n };\r\n\r\n pc.ondatachannel = (event) => {\r\n const receivedChannel = event.channel;\r\n this.setupDataChannelHandlers(receivedChannel, peerId);\r\n\r\n const connection = this.peerConnections.get(peerId);\r\n if (connection) {\r\n connection.dataChannel = receivedChannel;\r\n }\r\n };\r\n }\r\n\r\n private setupDataChannelHandlers(dataChannel: RTCDataChannel, peerId: string): void {\r\n console.log(`[WebRTC] Setting up data channel for peer ${peerId}, current state: ${dataChannel.readyState}`);\r\n\r\n dataChannel.onopen = () => {\r\n console.log(`[WebRTC] Data channel opened with peer ${peerId}`);\r\n this.updateDataChannelReadyState();\r\n };\r\n\r\n dataChannel.onmessage = (event) => {\r\n console.log(`[WebRTC] Data received from peer ${peerId}:`, event.data);\r\n this.handleDataChannelMessage(event.data, peerId);\r\n };\r\n\r\n dataChannel.onclose = () => {\r\n console.log(`[WebRTC] Data channel closed with peer ${peerId}`);\r\n this.updateDataChannelReadyState();\r\n };\r\n\r\n dataChannel.onerror = (error) => {\r\n console.error(`[WebRTC] Data channel error with peer ${peerId}:`, error);\r\n this.updateDataChannelReadyState();\r\n };\r\n }\r\n\r\n private updateDataChannelReadyState(): void {\r\n const connections = Array.from(this.peerConnections.values());\r\n const hasOpenChannel = connections.some(\r\n conn => conn.dataChannel && conn.dataChannel.readyState === 'open'\r\n );\r\n\r\n console.log('[WebRTC] Data channel ready state check:', {\r\n totalConnections: connections.length,\r\n channelStates: connections.map(c => ({\r\n peerId: c.peerId,\r\n hasChannel: !!c.dataChannel,\r\n state: c.dataChannel?.readyState\r\n })),\r\n hasOpenChannel\r\n });\r\n\r\n this._dataChannelReady.next(hasOpenChannel);\r\n }\r\n\r\n private handleDataChannelMessage(data: string | ArrayBuffer, peerId: string): void {\r\n if (data instanceof ArrayBuffer) {\r\n return;\r\n }\r\n\r\n try {\r\n const message: DataChannelMessage = JSON.parse(data);\r\n\r\n this.zone.run(() => {\r\n switch (message.type) {\r\n case 'chat':\r\n const chatMessage: ChatMessage = message.data as ChatMessage;\r\n this._chatMessages.next(chatMessage);\r\n console.log('Chat message received:', chatMessage);\r\n break;\r\n\r\n case 'file_request':\r\n this.handleFileRequest(message.data as FileTransferRequest, peerId);\r\n break;\r\n\r\n case 'file_accept':\r\n this.handleFileAccept(message.data as FileTransferAccept, peerId);\r\n break;\r\n\r\n case 'file_chunk':\r\n this.handleFileChunk(message.data as FileChunk);\r\n break;\r\n\r\n case 'file_complete':\r\n this.handleFileComplete(message.data.fileId);\r\n break;\r\n\r\n case 'file_cancel':\r\n this.handleFileCancel(message.data.fileId);\r\n break;\r\n\r\n case 'ping':\r\n this.sendDataChannelMessage(peerId, { type: 'pong', data: {} });\r\n break;\r\n\r\n case 'pong':\r\n console.log(`Received pong from peer ${peerId}`);\r\n break;\r\n\r\n default:\r\n console.log('Unknown data channel message type:', message.type);\r\n }\r\n });\r\n } catch (error) {\r\n console.error('Error parsing data channel message:', error);\r\n }\r\n }\r\n\r\n sendChatMessage(message: string): void {\r\n const openConnections = Array.from(this.peerConnections.values()).filter(\r\n conn => conn.dataChannel && conn.dataChannel.readyState === 'open'\r\n );\r\n\r\n if (openConnections.length === 0) {\r\n console.warn('No open data channels available');\r\n return;\r\n }\r\n\r\n const chatMessage: ChatMessage = {\r\n type: 'chat',\r\n peerId: this.signalling.peerId || 'unknown',\r\n userId: 0,\r\n username: 'You',\r\n message: message,\r\n timestamp: new Date().toISOString()\r\n };\r\n\r\n const dataChannelMessage: DataChannelMessage = {\r\n type: 'chat',\r\n data: chatMessage\r\n };\r\n\r\n let sentCount = 0;\r\n this.peerConnections.forEach((conn) => {\r\n if (this.sendDataChannelMessage(conn.peerId, dataChannelMessage)) {\r\n sentCount++;\r\n }\r\n });\r\n\r\n if (sentCount > 0) {\r\n this._chatMessages.next(chatMessage);\r\n } else {\r\n console.warn('Failed to send message to any peer');\r\n }\r\n }\r\n\r\n private sendDataChannelMessage(peerId: string, message: DataChannelMessage): boolean {\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection || !connection.dataChannel) {\r\n console.warn(`No data channel available for peer ${peerId}`);\r\n return false;\r\n }\r\n\r\n if (connection.dataChannel.readyState !== 'open') {\r\n console.warn(`Data channel not open for peer ${peerId}, state: ${connection.dataChannel.readyState}`);\r\n return false;\r\n }\r\n\r\n try {\r\n connection.dataChannel.send(JSON.stringify(message));\r\n return true;\r\n } catch (error) {\r\n console.error(`Error sending data channel message to peer ${peerId}:`, error);\r\n return false;\r\n }\r\n }\r\n\r\n private closePeerConnection(peerId: string): void {\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection) return;\r\n\r\n connection.pc.close();\r\n this.peerConnections.delete(peerId);\r\n\r\n const streams = this._remoteStreams.value;\r\n streams.delete(peerId);\r\n this._remoteStreams.next(streams);\r\n\r\n console.log(`Closed peer connection with ${peerId}`);\r\n }\r\n\r\n private async renegotiateConnection(peerId: string): Promise<void> {\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection) {\r\n console.log(`[WebRTC] No connection found for peer ${peerId} to renegotiate`);\r\n return;\r\n }\r\n\r\n try {\r\n console.log(`[WebRTC] Renegotiating connection with ${peerId}`);\r\n const offer = await connection.pc.createOffer();\r\n await connection.pc.setLocalDescription(offer);\r\n\r\n if (connection.pc.localDescription) {\r\n this.signalling.sendOffer(peerId, connection.pc.localDescription);\r\n console.log(`[WebRTC] Sent renegotiation offer to ${peerId}`);\r\n }\r\n } catch (error) {\r\n console.error(`[WebRTC] Error renegotiating connection with ${peerId}:`, error);\r\n }\r\n }\r\n\r\n private shouldInitiateConnection(targetPeerId: string, peerRole: PeerRole): boolean {\r\n const myPeerId = this.signalling.peerId;\r\n if (!myPeerId) {\r\n console.log('[WebRTC] No peer ID yet, cannot determine initiation');\r\n return false;\r\n }\r\n\r\n const shouldInitiate = myPeerId < targetPeerId;\r\n console.log(`[WebRTC] Connection initiation: myId(${myPeerId.substring(0, 8)}...) < targetId(${targetPeerId.substring(0, 8)}...) = ${shouldInitiate}`);\r\n console.log(`[WebRTC] Roles (for info only): My role: ${this.role}, Target role: ${peerRole}`);\r\n return shouldInitiate;\r\n }\r\n\r\n private replaceTracksInAllPeers(): void {\r\n if (!this.localStream) return;\r\n\r\n this.peerConnections.forEach((connection) => {\r\n const senders = connection.pc.getSenders();\r\n\r\n this.localStream!.getTracks().forEach(track => {\r\n const sender = senders.find(s => s.track?.kind === track.kind);\r\n\r\n if (sender) {\r\n sender.replaceTrack(track).catch(error => {\r\n console.error(`Error replacing ${track.kind} track:`, error);\r\n });\r\n } else {\r\n connection.pc.addTrack(track, this.localStream!);\r\n }\r\n });\r\n });\r\n }\r\n\r\n private updatePeerState(\r\n connectionState?: PeerConnectionState,\r\n hasVideo?: boolean,\r\n hasAudio?: boolean,\r\n hasScreenShare?: boolean\r\n ): void {\r\n this.signalling.sendPeerState(connectionState, hasVideo, hasAudio, hasScreenShare);\r\n }\r\n\r\n offerFile(file: File): void {\r\n const fileId = `${Date.now()}-${Math.random().toString(36).substring(7)}`;\r\n const chunkSize = this.DEFAULT_CHUNK_SIZE;\r\n const totalChunks = Math.ceil(file.size / chunkSize);\r\n\r\n const fileOffer: FileOfferData = {\r\n fileId,\r\n fileName: file.name,\r\n fileSize: file.size,\r\n fileType: file.type,\r\n chunkSize,\r\n totalChunks\r\n };\r\n\r\n const fileTransfer: FileTransferState = {\r\n fileId,\r\n fileName: file.name,\r\n fileSize: file.size,\r\n fileType: file.type,\r\n file,\r\n chunks: new Map(),\r\n totalChunks,\r\n chunkSize,\r\n sentChunks: 0,\r\n receivedChunks: 0,\r\n status: 'pending',\r\n requestedBy: new Set()\r\n };\r\n\r\n this.fileTransfers.set(fileId, fileTransfer);\r\n\r\n const chatMessage: ChatMessage = {\r\n type: 'chat',\r\n peerId: this.signalling.peerId || 'unknown',\r\n userId: 0,\r\n username: 'You',\r\n message: `📎 ${file.name} (${this.formatFileSize(file.size)})`,\r\n timestamp: new Date().toISOString(),\r\n fileOffer\r\n };\r\n\r\n const dataChannelMessage: DataChannelMessage = {\r\n type: 'chat',\r\n data: chatMessage\r\n };\r\n\r\n this.peerConnections.forEach((conn) => {\r\n this.sendDataChannelMessage(conn.peerId, dataChannelMessage);\r\n });\r\n\r\n this._chatMessages.next(chatMessage);\r\n\r\n console.log('File offered:', fileOffer);\r\n }\r\n\r\n requestFile(fileId: string): void {\r\n const request: FileTransferRequest = {\r\n type: 'file_request',\r\n fileId,\r\n requesterId: this.signalling.peerId || 'unknown'\r\n };\r\n\r\n this.peerConnections.forEach((conn) => {\r\n this.sendDataChannelMessage(conn.peerId, {\r\n type: 'file_request',\r\n data: request\r\n });\r\n });\r\n\r\n console.log('File requested:', fileId);\r\n }\r\n\r\n private handleFileRequest(request: FileTransferRequest, fromPeerId: string): void {\r\n const transfer = this.fileTransfers.get(request.fileId);\r\n if (!transfer || !transfer.file) {\r\n console.warn('File not found for request:', request.fileId);\r\n return;\r\n }\r\n\r\n transfer.requestedBy.add(fromPeerId);\r\n transfer.status = 'transferring';\r\n\r\n const accept: FileTransferAccept = {\r\n type: 'file_accept',\r\n fileId: request.fileId,\r\n toPeerId: request.requesterId\r\n };\r\n\r\n this.sendDataChannelMessage(fromPeerId, {\r\n type: 'file_accept',\r\n data: accept\r\n });\r\n\r\n this.startSendingFile(request.fileId, fromPeerId);\r\n }\r\n\r\n private async handleFileAccept(accept: FileTransferAccept, fromPeerId: string): Promise<void> {\r\n console.log('File transfer accepted:', accept.fileId);\r\n\r\n const chatMessages = (this._chatMessages as any)._buffer || [];\r\n const relatedMessage = chatMessages.find((msg: ChatMessage) => msg.fileOffer?.fileId === accept.fileId);\r\n\r\n if (!relatedMessage?.fileOffer) {\r\n console.error('Cannot find file offer for accepted transfer:', accept.fileId);\r\n return;\r\n }\r\n\r\n const fileOffer = relatedMessage.fileOffer;\r\n\r\n try {\r\n const downloadStream = await this.createFileDownloadStream(fileOffer.fileName);\r\n\r\n const transfer: FileTransferState = {\r\n fileId: accept.fileId,\r\n fileName: fileOffer.fileName,\r\n fileSize: fileOffer.fileSize,\r\n fileType: fileOffer.fileType,\r\n chunks: new Map(),\r\n totalChunks: fileOffer.totalChunks,\r\n chunkSize: fileOffer.chunkSize,\r\n sentChunks: 0,\r\n receivedChunks: 0,\r\n status: 'transferring',\r\n requestedBy: new Set(),\r\n downloadStream: downloadStream,\r\n streamWriter: downloadStream.getWriter()\r\n };\r\n\r\n this.fileTransfers.set(accept.fileId, transfer);\r\n console.log('Streaming download started for:', fileOffer.fileName);\r\n } catch (error) {\r\n console.error('Failed to create download stream:', error);\r\n\r\n const transfer: FileTransferState = {\r\n fileId: accept.fileId,\r\n fileName: fileOffer.fileName,\r\n fileSize: fileOffer.fileSize,\r\n fileType: fileOffer.fileType,\r\n chunks: new Map(),\r\n totalChunks: fileOffer.totalChunks,\r\n chunkSize: fileOffer.chunkSize,\r\n sentChunks: 0,\r\n receivedChunks: 0,\r\n status: 'transferring',\r\n requestedBy: new Set()\r\n };\r\n\r\n this.fileTransfers.set(accept.fileId, transfer);\r\n console.log('Fallback to in-memory assembly for:', fileOffer.fileName);\r\n }\r\n }\r\n\r\n private async createFileDownloadStream(fileName: string): Promise<WritableStream<Uint8Array>> {\r\n if ('showSaveFilePicker' in window) {\r\n try {\r\n const handle = await (window as any).showSaveFilePicker({\r\n suggestedName: fileName,\r\n types: [{\r\n description: 'File',\r\n accept: { '*/*': [] }\r\n }]\r\n });\r\n\r\n const writable = await handle.createWritable();\r\n return writable;\r\n } catch (error) {\r\n if ((error as Error).name === 'AbortError') {\r\n throw new Error('User cancelled file save');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n return this.createStreamSaverFallback(fileName);\r\n }\r\n\r\n private createStreamSaverFallback(fileName: string): WritableStream<Uint8Array> {\r\n let chunks: Uint8Array[] = [];\r\n\r\n return new WritableStream<Uint8Array>({\r\n write(chunk) {\r\n chunks.push(chunk);\r\n },\r\n close() {\r\n const blob = new Blob(chunks);\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = fileName;\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url);\r\n chunks = [];\r\n },\r\n abort(reason) {\r\n console.error('Stream aborted:', reason);\r\n chunks = [];\r\n }\r\n });\r\n }\r\n\r\n private async startSendingFile(fileId: string, toPeerId: string): Promise<void> {\r\n const transfer = this.fileTransfers.get(fileId);\r\n if (!transfer || !transfer.file) {\r\n console.error('File transfer not found:', fileId);\r\n return;\r\n }\r\n\r\n const file = transfer.file;\r\n let offset = 0;\r\n let chunkIndex = 0;\r\n\r\n while (offset < file.size) {\r\n const chunk = file.slice(offset, offset + transfer.chunkSize);\r\n const arrayBuffer = await chunk.arrayBuffer();\r\n\r\n const fileChunk: FileChunk = {\r\n type: 'file_chunk',\r\n fileId,\r\n chunkIndex,\r\n totalChunks: transfer.totalChunks,\r\n data: arrayBuffer,\r\n isLast: offset + transfer.chunkSize >= file.size\r\n };\r\n\r\n const base64Data = this.arrayBufferToBase64(arrayBuffer);\r\n\r\n this.sendDataChannelMessage(toPeerId, {\r\n type: 'file_chunk',\r\n data: {\r\n ...fileChunk,\r\n data: base64Data\r\n }\r\n });\r\n\r\n transfer.sentChunks++;\r\n offset += transfer.chunkSize;\r\n chunkIndex++;\r\n\r\n await new Promise(resolve => setTimeout(resolve, 10));\r\n }\r\n\r\n this.sendDataChannelMessage(toPeerId, {\r\n type: 'file_complete',\r\n data: { fileId }\r\n });\r\n\r\n console.log('File sending completed:', fileId);\r\n }\r\n\r\n private async handleFileChunk(chunk: any): Promise<void> {\r\n const fileId = chunk.fileId;\r\n let transfer = this.fileTransfers.get(fileId);\r\n\r\n if (!transfer) {\r\n console.warn('File transfer not found:', fileId);\r\n return;\r\n }\r\n\r\n const arrayBuffer = this.base64ToArrayBuffer(chunk.data);\r\n const uint8Array = new Uint8Array(arrayBuffer);\r\n\r\n if (transfer.streamWriter) {\r\n try {\r\n await transfer.streamWriter.write(uint8Array);\r\n console.log(`Streamed chunk ${chunk.chunkIndex + 1}/${transfer.totalChunks} directly to disk`);\r\n } catch (error) {\r\n console.error('Error writing to stream, falling back to in-memory:', error);\r\n transfer.streamWriter = undefined;\r\n transfer.chunks.set(chunk.chunkIndex, arrayBuffer);\r\n }\r\n } else {\r\n transfer.chunks.set(chunk.chunkIndex, arrayBuffer);\r\n }\r\n\r\n transfer.receivedChunks++;\r\n\r\n const progress: FileTransferProgress = {\r\n fileId,\r\n fileName: transfer.fileName,\r\n fileSize: transfer.fileSize,\r\n chunksReceived: transfer.receivedChunks,\r\n totalChunks: transfer.totalChunks,\r\n bytesReceived: transfer.receivedChunks * transfer.chunkSize,\r\n percentage: (transfer.receivedChunks / transfer.totalChunks) * 100\r\n };\r\n\r\n this.zone.run(() => {\r\n this._fileTransferProgress.next(progress);\r\n });\r\n }\r\n\r\n private async handleFileComplete(fileId: string): Promise<void> {\r\n const transfer = this.fileTransfers.get(fileId);\r\n if (!transfer) {\r\n console.warn('File transfer not found:', fileId);\r\n return;\r\n }\r\n\r\n transfer.status = 'completed';\r\n\r\n if (transfer.streamWriter) {\r\n try {\r\n await transfer.streamWriter.close();\r\n console.log('File streamed to disk successfully:', transfer.fileName);\r\n } catch (error) {\r\n console.error('Error closing stream:', error);\r\n }\r\n } else {\r\n const chunks: ArrayBuffer[] = [];\r\n for (let i = 0; i < transfer.totalChunks; i++) {\r\n const chunk = transfer.chunks.get(i);\r\n if (chunk) {\r\n chunks.push(chunk);\r\n }\r\n }\r\n\r\n const blob = new Blob(chunks, { type: transfer.fileType });\r\n const url = URL.createObjectURL(blob);\r\n\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = transfer.fileName;\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url);\r\n\r\n console.log('File downloaded from memory:', transfer.fileName);\r\n }\r\n\r\n this.fileTransfers.delete(fileId);\r\n }\r\n\r\n private async handleFileCancel(fileId: string): Promise<void> {\r\n const transfer = this.fileTransfers.get(fileId);\r\n if (transfer) {\r\n transfer.status = 'failed';\r\n\r\n if (transfer.streamWriter) {\r\n try {\r\n await transfer.streamWriter.abort('Transfer cancelled');\r\n } catch (error) {\r\n console.error('Error aborting stream:', error);\r\n }\r\n }\r\n\r\n this.fileTransfers.delete(fileId);\r\n console.log('File transfer cancelled:', fileId);\r\n }\r\n }\r\n\r\n async cancelFileTransfer(fileId: string): Promise<void> {\r\n const transfer = this.fileTransfers.get(fileId);\r\n if (!transfer) return;\r\n\r\n if (transfer.streamWriter) {\r\n try {\r\n await transfer.streamWriter.abort('Transfer cancelled by user');\r\n } catch (error) {\r\n console.error('Error aborting stream:', error);\r\n }\r\n }\r\n\r\n this.peerConnections.forEach((conn) => {\r\n this.sendDataChannelMessage(conn.peerId, {\r\n type: 'file_cancel',\r\n data: { fileId }\r\n });\r\n });\r\n\r\n this.fileTransfers.delete(fileId);\r\n console.log('File transfer cancelled:', fileId);\r\n }\r\n\r\n private arrayBufferToBase64(buffer: ArrayBuffer): string {\r\n const bytes = new Uint8Array(buffer);\r\n let binary = '';\r\n for (let i = 0; i < bytes.byteLength; i++) {\r\n binary += String.fromCharCode(bytes[i]);\r\n }\r\n return btoa(binary);\r\n }\r\n\r\n private base64ToArrayBuffer(base64: string): ArrayBuffer {\r\n const binary = atob(base64);\r\n const bytes = new Uint8Array(binary.length);\r\n for (let i = 0; i < binary.length; i++) {\r\n bytes[i] = binary.charCodeAt(i);\r\n }\r\n return bytes.buffer;\r\n }\r\n\r\n private formatFileSize(bytes: number): string {\r\n if (bytes === 0) return '0 Bytes';\r\n const k = 1024;\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];\r\n }\r\n\r\n get localMediaStream(): MediaStream | undefined {\r\n return this.localStream;\r\n }\r\n\r\n get isConnected(): boolean {\r\n return this._connectionState.value === 'connected';\r\n }\r\n\r\n get activePeerConnections(): PeerConnection[] {\r\n return Array.from(this.peerConnections.values());\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService, PaginatedResponse } from '@noatgnu/cupcake-core';\r\nimport {\r\n WebRTCSession,\r\n WebRTCSessionCreate,\r\n WebRTCSessionUpdate,\r\n WebRTCSessionQueryParams\r\n} from '../models/webrtc';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class WebRTCSessionService extends BaseApiService {\r\n private modelName = 'webrtc-sessions';\r\n private baseUrl = `${this.apiUrl}/${this.modelName}`;\r\n\r\n getSessions(params?: WebRTCSessionQueryParams): Observable<PaginatedResponse<WebRTCSession>> {\r\n const httpParams = params ? this.buildHttpParams(params) : undefined;\r\n return this.get<PaginatedResponse<WebRTCSession>>(`${this.baseUrl}/`, { params: httpParams });\r\n }\r\n\r\n getSession(id: string): Observable<WebRTCSession> {\r\n return this.get<WebRTCSession>(`${this.baseUrl}/${id}/`);\r\n }\r\n\r\n createSession(data: WebRTCSessionCreate): Observable<WebRTCSession> {\r\n return this.post<WebRTCSession>(`${this.baseUrl}/`, data);\r\n }\r\n\r\n updateSession(id: string, data: WebRTCSessionUpdate): Observable<WebRTCSession> {\r\n return this.patch<WebRTCSession>(`${this.baseUrl}/${id}/`, data);\r\n }\r\n\r\n endSession(id: string): Observable<{ message: string; session_id: string }> {\r\n return this.post<{ message: string; session_id: string }>(\r\n `${this.baseUrl}/${id}/end_session/`,\r\n {}\r\n );\r\n }\r\n\r\n deleteSession(id: string): Observable<void> {\r\n return this.delete<void>(`${this.baseUrl}/${id}/`);\r\n }\r\n}\r\n","// Communication and messaging services\r\nexport * from './notification';\r\nexport * from './message-thread';\r\nexport * from './message';\r\nexport * from './thread-participant';\r\nexport * from './communication-websocket';\r\nexport * from './webrtc-signalling';\r\nexport * from './webrtc';\r\nexport * from './webrtc-session';","/*\n * Public API Surface of cupcake-mint-chocolate\n */\n\nexport * from './lib/cupcake-mint-chocolate';\n\nexport * from './lib/models';\n\nexport * from './lib/services';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.WebRTCSignallingService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"noatgnu-cupcake-mint-chocolate.mjs","sources":["../../../projects/cupcake-mint-chocolate/src/lib/cupcake-mint-chocolate.ts","../../../projects/cupcake-mint-chocolate/src/lib/models/enums.ts","../../../projects/cupcake-mint-chocolate/src/lib/models/webrtc.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/notification.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/message-thread.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/message.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/thread-participant.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/communication-websocket.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/webrtc-signalling.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/webrtc.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/webrtc-session.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/index.ts","../../../projects/cupcake-mint-chocolate/src/public-api.ts","../../../projects/cupcake-mint-chocolate/src/noatgnu-cupcake-mint-chocolate.ts"],"sourcesContent":["import { Component } from '@angular/core';\n\n@Component({\n selector: 'ccmc-cupcake-mint-chocolate',\n imports: [],\n template: `\n <p>\n cupcake-mint-chocolate works!\n </p>\n `,\n styles: ``\n})\nexport class CupcakeMintChocolate {\n\n}\n","export enum NotificationType {\r\n SYSTEM = 'system',\r\n MAINTENANCE = 'maintenance',\r\n INVENTORY = 'inventory',\r\n BILLING = 'billing',\r\n PROJECT = 'project',\r\n PROTOCOL = 'protocol',\r\n DOCUMENT = 'document',\r\n USER = 'user'\r\n}\r\n\r\nexport const NotificationTypeLabels: Record<NotificationType, string> = {\r\n [NotificationType.SYSTEM]: 'System',\r\n [NotificationType.MAINTENANCE]: 'Maintenance',\r\n [NotificationType.INVENTORY]: 'Inventory',\r\n [NotificationType.BILLING]: 'Billing',\r\n [NotificationType.PROJECT]: 'Project',\r\n [NotificationType.PROTOCOL]: 'Protocol',\r\n [NotificationType.DOCUMENT]: 'Document',\r\n [NotificationType.USER]: 'User'\r\n};\r\n\r\nexport enum NotificationPriority {\r\n LOW = 'low',\r\n NORMAL = 'normal',\r\n HIGH = 'high',\r\n URGENT = 'urgent'\r\n}\r\n\r\nexport const NotificationPriorityLabels: Record<NotificationPriority, string> = {\r\n [NotificationPriority.LOW]: 'Low',\r\n [NotificationPriority.NORMAL]: 'Normal',\r\n [NotificationPriority.HIGH]: 'High',\r\n [NotificationPriority.URGENT]: 'Urgent'\r\n};\r\n\r\nexport enum DeliveryStatus {\r\n PENDING = 'pending',\r\n SENT = 'sent',\r\n DELIVERED = 'delivered',\r\n FAILED = 'failed',\r\n READ = 'read'\r\n}\r\n\r\nexport const DeliveryStatusLabels: Record<DeliveryStatus, string> = {\r\n [DeliveryStatus.PENDING]: 'Pending',\r\n [DeliveryStatus.SENT]: 'Sent',\r\n [DeliveryStatus.DELIVERED]: 'Delivered',\r\n [DeliveryStatus.FAILED]: 'Failed',\r\n [DeliveryStatus.READ]: 'Read'\r\n};\r\n\r\nexport enum MessageType {\r\n DIRECT = 'direct',\r\n THREAD = 'thread',\r\n BROADCAST = 'broadcast',\r\n SYSTEM = 'system'\r\n}\r\n\r\nexport const MessageTypeLabels: Record<MessageType, string> = {\r\n [MessageType.DIRECT]: 'Direct Message',\r\n [MessageType.THREAD]: 'Thread Reply',\r\n [MessageType.BROADCAST]: 'Broadcast',\r\n [MessageType.SYSTEM]: 'System Message'\r\n};","import { BaseTimestampedModel } from './base';\r\nimport { User } from '@noatgnu/cupcake-core';\r\n\r\nexport enum WebRTCSessionType {\r\n VIDEO_CALL = 'video_call',\r\n AUDIO_CALL = 'audio_call',\r\n SCREEN_SHARE = 'screen_share',\r\n DATA_CHANNEL = 'data_channel'\r\n}\r\n\r\nexport enum WebRTCSessionStatus {\r\n WAITING = 'waiting',\r\n ACTIVE = 'active',\r\n ENDED = 'ended'\r\n}\r\n\r\nexport enum PeerRole {\r\n HOST = 'host',\r\n VIEWER = 'viewer',\r\n PARTICIPANT = 'participant'\r\n}\r\n\r\nexport enum PeerConnectionState {\r\n CONNECTING = 'connecting',\r\n CONNECTED = 'connected',\r\n DISCONNECTED = 'disconnected',\r\n FAILED = 'failed'\r\n}\r\n\r\nexport enum SignalType {\r\n OFFER = 'offer',\r\n ANSWER = 'answer',\r\n ICE_CANDIDATE = 'ice_candidate',\r\n CHECK = 'check'\r\n}\r\n\r\nexport interface WebRTCSession extends BaseTimestampedModel {\r\n id: string;\r\n name?: string;\r\n isDefault: boolean;\r\n sessionType: WebRTCSessionType;\r\n sessionStatus: WebRTCSessionStatus;\r\n initiatedBy: number;\r\n initiatedByUsername?: string;\r\n initiatedByDetails?: User;\r\n participantsList?: WebRTCPeer[];\r\n participantsCount?: number;\r\n canEdit?: boolean;\r\n canDelete?: boolean;\r\n startedAt: string;\r\n endedAt?: string;\r\n}\r\n\r\nexport interface WebRTCPeer extends BaseTimestampedModel {\r\n id: string;\r\n session: string;\r\n user: number;\r\n username?: string;\r\n userDetails?: User;\r\n channelId: string;\r\n peerRole: PeerRole;\r\n connectionState: PeerConnectionState;\r\n hasVideo: boolean;\r\n hasAudio: boolean;\r\n hasScreenShare: boolean;\r\n joinedAt: string;\r\n lastSeenAt: string;\r\n}\r\n\r\nexport interface WebRTCSessionCreate {\r\n name?: string;\r\n sessionType: WebRTCSessionType;\r\n ccrvSessionIds?: number[];\r\n}\r\n\r\nexport interface WebRTCSessionUpdate {\r\n name?: string;\r\n sessionType?: WebRTCSessionType;\r\n sessionStatus?: WebRTCSessionStatus;\r\n isDefault?: boolean;\r\n}\r\n\r\nexport interface WebRTCSessionQueryParams {\r\n sessionType?: WebRTCSessionType;\r\n sessionStatus?: WebRTCSessionStatus;\r\n ccrvSessionId?: number;\r\n limit?: number;\r\n offset?: number;\r\n}\r\n\r\nexport interface WebRTCSignal extends BaseTimestampedModel {\r\n id: string;\r\n session: string;\r\n fromPeer: string;\r\n toPeer?: string;\r\n signalType: SignalType;\r\n signalData: any;\r\n delivered: boolean;\r\n}\r\n\r\nexport interface PeerInfo {\r\n id: string;\r\n userId: number;\r\n username: string;\r\n peerRole: PeerRole;\r\n connectionState: PeerConnectionState;\r\n hasVideo: boolean;\r\n hasAudio: boolean;\r\n hasScreenShare: boolean;\r\n}\r\n\r\nexport interface WebRTCMessage {\r\n type: 'connection.established' | 'check.response' | 'peer.check' | 'offer' | 'answer' | 'ice_candidate' | 'peer.state_update' | 'peer.joined' | 'peer.left' | 'heartbeat.response' | 'error';\r\n message?: string;\r\n peerId?: string;\r\n clientPeerId?: string;\r\n sessionId?: string;\r\n userId?: number;\r\n username?: string;\r\n fromPeerId?: string;\r\n fromUserId?: number;\r\n fromUsername?: string;\r\n toPeerId?: string;\r\n sdp?: RTCSessionDescriptionInit;\r\n candidate?: RTCIceCandidateInit;\r\n peers?: PeerInfo[];\r\n peerRole?: PeerRole;\r\n connectionState?: PeerConnectionState;\r\n hasVideo?: boolean;\r\n hasAudio?: boolean;\r\n hasScreenShare?: boolean;\r\n iceServers?: RTCIceServer[];\r\n timestamp?: string;\r\n isReconnection?: boolean;\r\n}\r\n\r\nexport interface WebRTCConfig {\r\n iceServers: RTCIceServer[];\r\n iceCandidatePoolSize?: number;\r\n iceTransportPolicy?: RTCIceTransportPolicy;\r\n bundlePolicy?: RTCBundlePolicy;\r\n rtcpMuxPolicy?: RTCRtcpMuxPolicy;\r\n}\r\n\r\nexport interface MediaConstraintsConfig {\r\n video?: boolean | MediaTrackConstraints;\r\n audio?: boolean | MediaTrackConstraints;\r\n}\r\n\r\nexport interface PeerConnection {\r\n peerId: string;\r\n userId: number;\r\n username: string;\r\n pc: RTCPeerConnection;\r\n dataChannel?: RTCDataChannel;\r\n stream?: MediaStream;\r\n role: PeerRole;\r\n offered: boolean;\r\n answered: boolean;\r\n connected: boolean;\r\n queuedCandidates: RTCIceCandidate[];\r\n}\r\n\r\nexport interface ChatMessage {\r\n type: 'chat';\r\n peerId: string;\r\n userId: number;\r\n username: string;\r\n message: string;\r\n timestamp: string;\r\n fileOffer?: FileOfferData;\r\n}\r\n\r\nexport interface FileOfferData {\r\n fileId: string;\r\n fileName: string;\r\n fileSize: number;\r\n fileType: string;\r\n chunkSize: number;\r\n totalChunks: number;\r\n}\r\n\r\nexport interface FileTransferRequest {\r\n type: 'file_request';\r\n fileId: string;\r\n requesterId: string;\r\n}\r\n\r\nexport interface FileTransferAccept {\r\n type: 'file_accept';\r\n fileId: string;\r\n toPeerId: string;\r\n}\r\n\r\nexport interface FileChunk {\r\n type: 'file_chunk';\r\n fileId: string;\r\n chunkIndex: number;\r\n totalChunks: number;\r\n data: ArrayBuffer;\r\n isLast: boolean;\r\n}\r\n\r\nexport interface FileTransferProgress {\r\n fileId: string;\r\n fileName: string;\r\n fileSize: number;\r\n chunksReceived: number;\r\n totalChunks: number;\r\n bytesReceived: number;\r\n percentage: number;\r\n}\r\n\r\nexport interface FileTransferState {\r\n fileId: string;\r\n fileName: string;\r\n fileSize: number;\r\n fileType: string;\r\n file?: File;\r\n chunks: Map<number, ArrayBuffer>;\r\n totalChunks: number;\r\n chunkSize: number;\r\n sentChunks: number;\r\n receivedChunks: number;\r\n status: 'pending' | 'transferring' | 'completed' | 'failed';\r\n requestedBy: Set<string>;\r\n streamWriter?: WritableStreamDefaultWriter<Uint8Array>;\r\n downloadStream?: WritableStream<Uint8Array>;\r\n}\r\n\r\nexport interface DataChannelMessage {\r\n type: 'chat' | 'ping' | 'pong' | 'file_request' | 'file_accept' | 'file_chunk' | 'file_complete' | 'file_cancel';\r\n data: any;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n Notification,\r\n NotificationCreateRequest,\r\n NotificationUpdateRequest,\r\n MarkNotificationReadRequest,\r\n BulkNotificationActionRequest,\r\n NotificationType,\r\n NotificationPriority,\r\n DeliveryStatus,\r\n PaginatedResponse,\r\n NotificationQueryParams\r\n} from '../models';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NotificationService extends BaseApiService {\r\n\r\n /**\r\n * Get all notifications with optional filtering\r\n */\r\n getNotifications(params?: NotificationQueryParams): Observable<PaginatedResponse<Notification>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<Notification>>(`${this.apiUrl}/notifications/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single notification by ID\r\n */\r\n getNotification(id: string): Observable<Notification> {\r\n return this.get<Notification>(`${this.apiUrl}/notifications/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new notification\r\n */\r\n createNotification(notification: NotificationCreateRequest): Observable<Notification> {\r\n return this.post<Notification>(`${this.apiUrl}/notifications/`, notification);\r\n }\r\n\r\n /**\r\n * Update an existing notification\r\n */\r\n updateNotification(id: string, notification: NotificationUpdateRequest): Observable<Notification> {\r\n return this.put<Notification>(`${this.apiUrl}/notifications/${id}/`, notification);\r\n }\r\n\r\n /**\r\n * Partially update a notification\r\n */\r\n patchNotification(id: string, notification: Partial<NotificationUpdateRequest>): Observable<Notification> {\r\n return this.patch<Notification>(`${this.apiUrl}/notifications/${id}/`, notification);\r\n }\r\n\r\n /**\r\n * Delete a notification\r\n */\r\n deleteNotification(id: string): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/notifications/${id}/`);\r\n }\r\n\r\n /**\r\n * Mark a notification as read/unread\r\n */\r\n markNotificationRead(id: string, request: MarkNotificationReadRequest): Observable<Notification> {\r\n return this.post<Notification>(`${this.apiUrl}/notifications/${id}/mark_read/`, request);\r\n }\r\n\r\n\r\n /**\r\n * Get unread notifications for current user\r\n */\r\n getUnreadNotifications(): Observable<PaginatedResponse<Notification>> {\r\n return this.get<PaginatedResponse<Notification>>(`${this.apiUrl}/notifications/unread/`);\r\n }\r\n\r\n /**\r\n * Get notification statistics for current user\r\n */\r\n getNotificationStats(): Observable<{\r\n total: number;\r\n unread: number;\r\n byType: { [key: string]: number };\r\n byPriority: { [key: string]: number };\r\n }> {\r\n return this.get<{\r\n total: number;\r\n unread: number;\r\n byType: { [key: string]: number };\r\n byPriority: { [key: string]: number };\r\n }>(`${this.apiUrl}/notifications/stats/`);\r\n }\r\n\r\n /**\r\n * Mark all notifications as read for current user\r\n */\r\n markAllNotificationsRead(): Observable<{ success: boolean; message: string }> {\r\n return this.post<{ success: boolean; message: string }>(`${this.apiUrl}/notifications/mark_all_read/`, {});\r\n }\r\n\r\n /**\r\n * Search notifications by title or message\r\n */\r\n searchNotifications(query: string): Observable<PaginatedResponse<Notification>> {\r\n return this.getNotifications({ search: query });\r\n }\r\n\r\n /**\r\n * Get notifications by type\r\n */\r\n getNotificationsByType(type: NotificationType): Observable<PaginatedResponse<Notification>> {\r\n return this.getNotifications({ notificationType: type });\r\n }\r\n\r\n /**\r\n * Get notifications by priority\r\n */\r\n getNotificationsByPriority(priority: NotificationPriority): Observable<PaginatedResponse<Notification>> {\r\n return this.getNotifications({ priority });\r\n }\r\n\r\n /**\r\n * Get notifications by sender\r\n */\r\n getNotificationsBySender(senderId: number): Observable<PaginatedResponse<Notification>> {\r\n return this.getNotifications({ sender: senderId });\r\n }\r\n\r\n /**\r\n * Get notifications by delivery status\r\n */\r\n getNotificationsByStatus(status: DeliveryStatus): Observable<PaginatedResponse<Notification>> {\r\n return this.getNotifications({ deliveryStatus: status });\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n MessageThread,\r\n MessageThreadCreateRequest,\r\n MessageThreadUpdateRequest,\r\n ThreadParticipantRequest,\r\n ThreadSearchRequest,\r\n ThreadParticipant,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\nexport interface MessageThreadQueryParams {\r\n search?: string;\r\n isPrivate?: boolean;\r\n isArchived?: boolean;\r\n creator?: number;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MessageThreadService extends BaseApiService {\r\n\r\n /**\r\n * Get all message threads with optional filtering\r\n */\r\n getMessageThreads(params?: MessageThreadQueryParams): Observable<PaginatedResponse<MessageThread>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<MessageThread>>(`${this.apiUrl}/threads/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single message thread by ID\r\n */\r\n getMessageThread(id: string): Observable<MessageThread> {\r\n return this.get<MessageThread>(`${this.apiUrl}/threads/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new message thread\r\n */\r\n createMessageThread(thread: MessageThreadCreateRequest): Observable<MessageThread> {\r\n return this.post<MessageThread>(`${this.apiUrl}/threads/`, thread);\r\n }\r\n\r\n /**\r\n * Update an existing message thread\r\n */\r\n updateMessageThread(id: string, thread: MessageThreadUpdateRequest): Observable<MessageThread> {\r\n return this.put<MessageThread>(`${this.apiUrl}/threads/${id}/`, thread);\r\n }\r\n\r\n /**\r\n * Partially update a message thread\r\n */\r\n patchMessageThread(id: string, thread: Partial<MessageThreadUpdateRequest>): Observable<MessageThread> {\r\n return this.patch<MessageThread>(`${this.apiUrl}/threads/${id}/`, thread);\r\n }\r\n\r\n /**\r\n * Delete a message thread\r\n */\r\n deleteMessageThread(id: string): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/threads/${id}/`);\r\n }\r\n\r\n /**\r\n * Add participant to a thread\r\n */\r\n addParticipant(id: string, request: { username: string }): Observable<{ message: string; participant: ThreadParticipant }> {\r\n return this.post<{ message: string; participant: ThreadParticipant }>(`${this.apiUrl}/threads/${id}/add_participant/`, request);\r\n }\r\n\r\n /**\r\n * Remove participant from a thread\r\n */\r\n removeParticipant(id: string, request: { username: string }): Observable<{ message: string }> {\r\n return this.post<{ message: string }>(`${this.apiUrl}/threads/${id}/remove_participant/`, request);\r\n }\r\n\r\n /**\r\n * Get thread participants\r\n */\r\n getParticipants(id: string): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.get<PaginatedResponse<ThreadParticipant>>(`${this.apiUrl}/threads/${id}/participants/`);\r\n }\r\n\r\n /**\r\n * Archive/unarchive a thread (toggles state)\r\n */\r\n toggleArchiveThread(id: string): Observable<{ message: string; isArchived: boolean }> {\r\n return this.post<{ message: string; isArchived: boolean }>(`${this.apiUrl}/threads/${id}/archive/`, {});\r\n }\r\n\r\n /**\r\n * Mark thread as read for current user\r\n */\r\n markThreadAsRead(id: string): Observable<{ success: boolean; message: string }> {\r\n return this.post<{ success: boolean; message: string }>(`${this.apiUrl}/threads/${id}/mark_read/`, {});\r\n }\r\n\r\n\r\n /**\r\n * Search message threads by title or description\r\n */\r\n searchMessageThreads(query: string): Observable<PaginatedResponse<MessageThread>> {\r\n return this.getMessageThreads({ search: query });\r\n }\r\n\r\n /**\r\n * Get private threads only\r\n */\r\n getPrivateThreads(): Observable<PaginatedResponse<MessageThread>> {\r\n return this.getMessageThreads({ isPrivate: true });\r\n }\r\n\r\n /**\r\n * Get public threads only\r\n */\r\n getPublicThreads(): Observable<PaginatedResponse<MessageThread>> {\r\n return this.getMessageThreads({ isPrivate: false });\r\n }\r\n\r\n /**\r\n * Get archived threads\r\n */\r\n getArchivedThreads(): Observable<PaginatedResponse<MessageThread>> {\r\n return this.getMessageThreads({ isArchived: true });\r\n }\r\n\r\n /**\r\n * Get active threads (non-archived)\r\n */\r\n getActiveThreads(): Observable<PaginatedResponse<MessageThread>> {\r\n return this.getMessageThreads({ isArchived: false });\r\n }\r\n\r\n /**\r\n * Get threads created by a specific user\r\n */\r\n getThreadsByCreator(creatorId: number): Observable<PaginatedResponse<MessageThread>> {\r\n return this.getMessageThreads({ creator: creatorId });\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n Message,\r\n MessageCreateRequest,\r\n MessageUpdateRequest,\r\n MessageSearchRequest,\r\n MessageType,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\nexport interface MessageQueryParams {\r\n search?: string;\r\n thread?: string;\r\n messageType?: MessageType;\r\n sender?: number;\r\n isDeleted?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MessageService extends BaseApiService {\r\n\r\n /**\r\n * Get all messages with optional filtering\r\n */\r\n getMessages(params?: MessageQueryParams): Observable<PaginatedResponse<Message>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<Message>>(`${this.apiUrl}/messages/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single message by ID\r\n */\r\n getMessage(id: string): Observable<Message> {\r\n return this.get<Message>(`${this.apiUrl}/messages/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new message\r\n */\r\n createMessage(message: MessageCreateRequest): Observable<Message> {\r\n return this.post<Message>(`${this.apiUrl}/messages/`, message);\r\n }\r\n\r\n /**\r\n * Update an existing message\r\n */\r\n updateMessage(id: string, message: MessageUpdateRequest): Observable<Message> {\r\n return this.put<Message>(`${this.apiUrl}/messages/${id}/`, message);\r\n }\r\n\r\n /**\r\n * Partially update a message\r\n */\r\n patchMessage(id: string, message: Partial<MessageUpdateRequest>): Observable<Message> {\r\n return this.patch<Message>(`${this.apiUrl}/messages/${id}/`, message);\r\n }\r\n\r\n /**\r\n * Delete a message (soft delete)\r\n */\r\n deleteMessage(id: string): Observable<Message> {\r\n return this.delete<Message>(`${this.apiUrl}/messages/${id}/`);\r\n }\r\n\r\n\r\n /**\r\n * Get messages in a specific thread\r\n */\r\n getThreadMessages(threadId: string, params?: Omit<MessageQueryParams, 'thread'>): Observable<PaginatedResponse<Message>> {\r\n const queryParams = { ...params, thread: threadId };\r\n return this.getMessages(queryParams);\r\n }\r\n\r\n /**\r\n * Search messages by content\r\n */\r\n searchMessages(query: string, threadId?: string): Observable<PaginatedResponse<Message>> {\r\n const params: MessageQueryParams = { search: query };\r\n if (threadId) {\r\n params.thread = threadId;\r\n }\r\n return this.getMessages(params);\r\n }\r\n\r\n /**\r\n * Get messages by sender\r\n */\r\n getMessagesBySender(senderId: number, threadId?: string): Observable<PaginatedResponse<Message>> {\r\n const params: MessageQueryParams = { sender: senderId };\r\n if (threadId) {\r\n params.thread = threadId;\r\n }\r\n return this.getMessages(params);\r\n }\r\n\r\n /**\r\n * Get messages by type\r\n */\r\n getMessagesByType(messageType: MessageType, threadId?: string): Observable<PaginatedResponse<Message>> {\r\n const params: MessageQueryParams = { messageType };\r\n if (threadId) {\r\n params.thread = threadId;\r\n }\r\n return this.getMessages(params);\r\n }\r\n\r\n /**\r\n * Get deleted messages (for moderation)\r\n */\r\n getDeletedMessages(threadId?: string): Observable<PaginatedResponse<Message>> {\r\n const params: MessageQueryParams = { isDeleted: true };\r\n if (threadId) {\r\n params.thread = threadId;\r\n }\r\n return this.getMessages(params);\r\n }\r\n\r\n /**\r\n * Get active messages (non-deleted)\r\n */\r\n getActiveMessages(threadId?: string): Observable<PaginatedResponse<Message>> {\r\n const params: MessageQueryParams = { isDeleted: false };\r\n if (threadId) {\r\n params.thread = threadId;\r\n }\r\n return this.getMessages(params);\r\n }\r\n\r\n /**\r\n * Reply to a message\r\n */\r\n replyToMessage(parentMessageId: string, content: string, threadId: string): Observable<Message> {\r\n const message: MessageCreateRequest = {\r\n thread: threadId,\r\n content,\r\n replyTo: parentMessageId\r\n };\r\n return this.createMessage(message);\r\n }\r\n}","import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\n\r\nimport {\r\n ThreadParticipant,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\nexport interface ThreadParticipantQueryParams {\r\n thread?: string;\r\n isModerator?: boolean;\r\n notificationsEnabled?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ThreadParticipantService {\r\n private http = inject(HttpClient);\r\n private apiUrl = '/api'; // This should be configurable\r\n\r\n /**\r\n * Get all thread participants with optional filtering\r\n */\r\n getThreadParticipants(params?: ThreadParticipantQueryParams): Observable<PaginatedResponse<ThreadParticipant>> {\r\n let httpParams = new HttpParams();\r\n \r\n if (params) {\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n httpParams = httpParams.set(key, value.toString());\r\n }\r\n });\r\n }\r\n\r\n return this.http.get<PaginatedResponse<ThreadParticipant>>(`${this.apiUrl}/thread-participants/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single thread participant by ID\r\n */\r\n getThreadParticipant(id: number): Observable<ThreadParticipant> {\r\n return this.http.get<ThreadParticipant>(`${this.apiUrl}/thread-participants/${id}/`);\r\n }\r\n\r\n /**\r\n * Update thread participant settings\r\n */\r\n updateThreadParticipant(id: number, updates: { isModerator?: boolean; notificationsEnabled?: boolean }): Observable<ThreadParticipant> {\r\n return this.http.patch<ThreadParticipant>(`${this.apiUrl}/thread-participants/${id}/`, updates);\r\n }\r\n\r\n /**\r\n * Update participant's last read timestamp\r\n */\r\n updateLastRead(id: number): Observable<ThreadParticipant> {\r\n return this.http.post<ThreadParticipant>(`${this.apiUrl}/thread-participants/${id}/update_last_read/`, {});\r\n }\r\n\r\n /**\r\n * Get participants for a specific thread\r\n */\r\n getParticipantsForThread(threadId: string): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.getThreadParticipants({ thread: threadId });\r\n }\r\n\r\n /**\r\n * Get moderators for a specific thread\r\n */\r\n getModeratorsForThread(threadId: string): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.getThreadParticipants({ thread: threadId, isModerator: true });\r\n }\r\n\r\n /**\r\n * Get non-moderator participants for a specific thread\r\n */\r\n getRegularParticipantsForThread(threadId: string): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.getThreadParticipants({ thread: threadId, isModerator: false });\r\n }\r\n\r\n /**\r\n * Get participants with notifications enabled for a specific thread\r\n */\r\n getNotificationEnabledParticipants(threadId: string): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.getThreadParticipants({ thread: threadId, notificationsEnabled: true });\r\n }\r\n\r\n /**\r\n * Get participants with notifications disabled for a specific thread\r\n */\r\n getNotificationDisabledParticipants(threadId: string): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.getThreadParticipants({ thread: threadId, notificationsEnabled: false });\r\n }\r\n\r\n /**\r\n * Toggle moderator status for a participant\r\n */\r\n toggleModeratorStatus(id: number): Observable<ThreadParticipant> {\r\n return this.http.post<ThreadParticipant>(`${this.apiUrl}/thread-participants/${id}/toggle_moderator/`, {});\r\n }\r\n\r\n /**\r\n * Toggle notifications for a participant\r\n */\r\n toggleNotifications(id: number): Observable<ThreadParticipant> {\r\n return this.http.post<ThreadParticipant>(`${this.apiUrl}/thread-participants/${id}/toggle_notifications/`, {});\r\n }\r\n\r\n /**\r\n * Leave a thread (for current user)\r\n */\r\n leaveThread(threadId: string): Observable<{ success: boolean; message: string }> {\r\n return this.http.post<{ success: boolean; message: string }>(`${this.apiUrl}/thread-participants/leave_thread/`, { thread: threadId });\r\n }\r\n\r\n /**\r\n * Get threads where current user is participant\r\n */\r\n getMyParticipations(): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.http.get<PaginatedResponse<ThreadParticipant>>(`${this.apiUrl}/thread-participants/my_participations/`);\r\n }\r\n\r\n /**\r\n * Get threads where current user is moderator\r\n */\r\n getMyModerations(): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.http.get<PaginatedResponse<ThreadParticipant>>(`${this.apiUrl}/thread-participants/my_moderations/`);\r\n }\r\n}","import { Injectable, OnDestroy } from '@angular/core';\r\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\r\nimport { filter, map } from 'rxjs/operators';\r\n\r\nimport { NotificationType, NotificationPriority, MessageType } from '../models';\r\n\r\nexport interface NewNotificationEvent {\r\n type: 'notification.new';\r\n notificationId: string;\r\n title: string;\r\n message: string;\r\n notificationType: NotificationType;\r\n priority: NotificationPriority;\r\n data: {\r\n alertType?: string;\r\n quantity?: number;\r\n link?: string;\r\n [key: string]: string | number | boolean | undefined;\r\n };\r\n timestamp: string;\r\n}\r\n\r\nexport interface NewMessageEvent {\r\n type: 'message.new';\r\n threadId: string;\r\n messageId: string;\r\n senderId: number;\r\n senderUsername: string;\r\n content: string;\r\n messageType: MessageType;\r\n timestamp: string;\r\n}\r\n\r\nexport interface ThreadUpdateEvent {\r\n type: 'thread.update';\r\n threadId: string;\r\n action: string;\r\n message: string;\r\n timestamp: string;\r\n}\r\n\r\nexport interface NotificationUpdateEvent {\r\n type: 'notification.update';\r\n notificationId: string;\r\n status: string;\r\n timestamp: string;\r\n}\r\n\r\nexport interface ConnectionEstablishedEvent {\r\n type: 'ccmc.connection.established';\r\n message: string;\r\n userId: number;\r\n username: string;\r\n}\r\n\r\nexport interface ThreadSubscriptionConfirmedEvent {\r\n type: 'thread.subscription.confirmed';\r\n threadId: string;\r\n}\r\n\r\nexport interface ThreadSubscriptionDeniedEvent {\r\n type: 'thread.subscription.denied';\r\n threadId: string;\r\n error: string;\r\n}\r\n\r\nexport interface ThreadUnsubscriptionConfirmedEvent {\r\n type: 'thread.unsubscription.confirmed';\r\n threadId: string;\r\n}\r\n\r\nexport interface NotificationMarkedReadEvent {\r\n type: 'notification.marked_read';\r\n notificationId: string;\r\n}\r\n\r\nexport interface PongEvent {\r\n type: 'pong';\r\n}\r\n\r\nexport type WebSocketIncomingMessage =\r\n | NewNotificationEvent\r\n | NewMessageEvent\r\n | ThreadUpdateEvent\r\n | NotificationUpdateEvent\r\n | ConnectionEstablishedEvent\r\n | ThreadSubscriptionConfirmedEvent\r\n | ThreadSubscriptionDeniedEvent\r\n | ThreadUnsubscriptionConfirmedEvent\r\n | NotificationMarkedReadEvent\r\n | PongEvent;\r\n\r\nexport interface SubscribeThreadMessage {\r\n type: 'subscribe_thread';\r\n thread_id: string;\r\n}\r\n\r\nexport interface UnsubscribeThreadMessage {\r\n type: 'unsubscribe_thread';\r\n thread_id: string;\r\n}\r\n\r\nexport interface MarkNotificationReadMessage {\r\n type: 'mark_notification_read';\r\n notification_id: string;\r\n}\r\n\r\nexport interface PingMessage {\r\n type: 'ping';\r\n}\r\n\r\nexport type WebSocketOutgoingMessage =\r\n | SubscribeThreadMessage\r\n | UnsubscribeThreadMessage\r\n | MarkNotificationReadMessage\r\n | PingMessage;\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CommunicationWebSocketService implements OnDestroy {\r\n private socket: WebSocket | null = null;\r\n private reconnectAttempts = 0;\r\n private maxReconnectAttempts = 5;\r\n private reconnectDelay = 3000;\r\n private reconnectTimer: number | null = null;\r\n\r\n private messageSubject = new Subject<WebSocketIncomingMessage>();\r\n private connectionStateSubject = new BehaviorSubject<'disconnected' | 'connecting' | 'connected'>('disconnected');\r\n\r\n public connectionState$ = this.connectionStateSubject.asObservable();\r\n public messages$ = this.messageSubject.asObservable();\r\n\r\n public newNotifications$: Observable<NewNotificationEvent> = this.messages$.pipe(\r\n filter((msg): msg is NewNotificationEvent => msg.type === 'notification.new')\r\n );\r\n\r\n public newMessages$: Observable<NewMessageEvent> = this.messages$.pipe(\r\n filter((msg): msg is NewMessageEvent => msg.type === 'message.new')\r\n );\r\n\r\n public threadUpdates$: Observable<ThreadUpdateEvent> = this.messages$.pipe(\r\n filter((msg): msg is ThreadUpdateEvent => msg.type === 'thread.update')\r\n );\r\n\r\n public notificationUpdates$: Observable<NotificationUpdateEvent> = this.messages$.pipe(\r\n filter((msg): msg is NotificationUpdateEvent => msg.type === 'notification.update')\r\n );\r\n\r\n connect(wsBaseUrl: string, token?: string): void {\r\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\r\n console.log('WebSocket already connected');\r\n return;\r\n }\r\n\r\n this.connectionStateSubject.next('connecting');\r\n\r\n const fullUrl = `${wsBaseUrl.replace(/\\/$/, '')}/ccmc/communications/`;\r\n const url = token ? `${fullUrl}?token=${token}` : fullUrl;\r\n this.socket = new WebSocket(url);\r\n\r\n this.socket.onopen = () => {\r\n console.log('CCMC WebSocket connected');\r\n this.connectionStateSubject.next('connected');\r\n this.reconnectAttempts = 0;\r\n };\r\n\r\n this.socket.onmessage = (event) => {\r\n try {\r\n const message = JSON.parse(event.data) as WebSocketIncomingMessage;\r\n this.messageSubject.next(message);\r\n\r\n if (message.type === 'ccmc.connection.established') {\r\n console.log('CCMC connection established:', message);\r\n }\r\n } catch (error) {\r\n console.error('Error parsing WebSocket message:', error);\r\n }\r\n };\r\n\r\n this.socket.onerror = (error) => {\r\n console.error('CCMC WebSocket error:', error);\r\n };\r\n\r\n this.socket.onclose = (event) => {\r\n console.log('CCMC WebSocket closed:', event.code, event.reason);\r\n this.connectionStateSubject.next('disconnected');\r\n\r\n if (this.reconnectAttempts < this.maxReconnectAttempts) {\r\n this.scheduleReconnect(wsBaseUrl, token);\r\n }\r\n };\r\n }\r\n\r\n private scheduleReconnect(wsBaseUrl: string, token?: string): void {\r\n this.reconnectAttempts++;\r\n const delay = this.reconnectDelay * this.reconnectAttempts;\r\n\r\n console.log(`Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`);\r\n\r\n this.reconnectTimer = setTimeout(() => {\r\n this.connect(wsBaseUrl, token);\r\n }, delay);\r\n }\r\n\r\n disconnect(): void {\r\n if (this.reconnectTimer) {\r\n clearTimeout(this.reconnectTimer);\r\n this.reconnectTimer = null;\r\n }\r\n\r\n if (this.socket) {\r\n this.socket.close();\r\n this.socket = null;\r\n }\r\n\r\n this.connectionStateSubject.next('disconnected');\r\n this.reconnectAttempts = 0;\r\n }\r\n\r\n subscribeToThread(threadId: string): void {\r\n const message: SubscribeThreadMessage = {\r\n type: 'subscribe_thread',\r\n thread_id: threadId\r\n };\r\n this.send(message);\r\n }\r\n\r\n unsubscribeFromThread(threadId: string): void {\r\n const message: UnsubscribeThreadMessage = {\r\n type: 'unsubscribe_thread',\r\n thread_id: threadId\r\n };\r\n this.send(message);\r\n }\r\n\r\n markNotificationAsRead(notificationId: string): void {\r\n const message: MarkNotificationReadMessage = {\r\n type: 'mark_notification_read',\r\n notification_id: notificationId\r\n };\r\n this.send(message);\r\n }\r\n\r\n ping(): void {\r\n const message: PingMessage = { type: 'ping' };\r\n this.send(message);\r\n }\r\n\r\n private send(message: WebSocketOutgoingMessage): void {\r\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\r\n this.socket.send(JSON.stringify(message));\r\n } else {\r\n console.warn('Cannot send message: WebSocket not connected');\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.disconnect();\r\n }\r\n\r\n isConnected(): boolean {\r\n return this.socket !== null && this.socket.readyState === WebSocket.OPEN;\r\n }\r\n\r\n getConnectionState(): 'disconnected' | 'connecting' | 'connected' {\r\n return this.connectionStateSubject.value;\r\n }\r\n}\r\n","import { Injectable, NgZone, inject } from '@angular/core';\r\nimport { webSocket, WebSocketSubject } from 'rxjs/webSocket';\r\nimport { BehaviorSubject, Subject, Subscription } from 'rxjs';\r\nimport { AuthService, CUPCAKE_CORE_CONFIG } from '@noatgnu/cupcake-core';\r\nimport {\r\n WebRTCMessage,\r\n PeerInfo,\r\n PeerRole,\r\n PeerConnectionState\r\n} from '../models/webrtc';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class WebRTCSignallingService {\r\n private ws?: WebSocketSubject<WebRTCMessage>;\r\n private wsSubscription?: Subscription;\r\n private baseUrl: string = '';\r\n private clientPeerId: string | null = null;\r\n private readonly CLIENT_PEER_ID_KEY = 'webrtc_client_peer_id';\r\n private shouldReconnect: boolean = true;\r\n\r\n private _connected = new BehaviorSubject<boolean>(false);\r\n private _peerId = new BehaviorSubject<string | null>(null);\r\n private _sessionId = new BehaviorSubject<string | null>(null);\r\n private _peers = new BehaviorSubject<PeerInfo[]>([]);\r\n private _messages = new Subject<WebRTCMessage>();\r\n private _iceServers = new BehaviorSubject<RTCIceServer[]>([]);\r\n\r\n connected$ = this._connected.asObservable();\r\n peerId$ = this._peerId.asObservable();\r\n sessionId$ = this._sessionId.asObservable();\r\n peers$ = this._peers.asObservable();\r\n messages$ = this._messages.asObservable();\r\n iceServers$ = this._iceServers.asObservable();\r\n\r\n private config = inject(CUPCAKE_CORE_CONFIG);\r\n\r\n constructor(\r\n private authService: AuthService,\r\n private zone: NgZone\r\n ) {\r\n this.baseUrl = this.getBaseUrl();\r\n }\r\n\r\n private getBaseUrl(): string {\r\n if (this.config && this.config.websocketUrl) {\r\n return this.config.websocketUrl;\r\n }\r\n if (this.config && this.config.apiUrl) {\r\n const apiUrl = this.config.apiUrl.replace(/^https?:\\/\\//, '');\r\n const protocol = this.config.apiUrl.startsWith('https') ? 'wss:' : 'ws:';\r\n return `${protocol}//${apiUrl}`;\r\n }\r\n const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';\r\n const host = window.location.host;\r\n return `${protocol}//${host}`;\r\n }\r\n\r\n connect(sessionId: string): void {\r\n this.disconnect();\r\n this.shouldReconnect = true;\r\n\r\n const token = this.authService.getAccessToken();\r\n if (!token) {\r\n console.error('No authentication token available');\r\n return;\r\n }\r\n\r\n this.clientPeerId = this.getClientPeerId();\r\n\r\n const wsPath = this.baseUrl.endsWith('/ws') ? '' : '/ws';\r\n let wsUrl = `${this.baseUrl}${wsPath}/ccmc/webrtc/${sessionId}/?token=${token}`;\r\n\r\n if (this.clientPeerId) {\r\n wsUrl += `&client_peer_id=${this.clientPeerId}`;\r\n console.log('[Signalling] Reconnecting with client peer ID:', this.clientPeerId);\r\n } else {\r\n console.log('[Signalling] First connection, no client peer ID');\r\n }\r\n\r\n console.log('[Signalling] Base URL:', this.baseUrl);\r\n console.log('[Signalling] Connecting to WebSocket URL:', wsUrl.replace(/token=[^&]+/, 'token=***'));\r\n\r\n this.ws = webSocket<WebRTCMessage>({\r\n url: wsUrl,\r\n openObserver: {\r\n next: () => {\r\n console.log('WebRTC signalling connection opened');\r\n this.zone.run(() => {\r\n this._connected.next(true);\r\n });\r\n }\r\n },\r\n closeObserver: {\r\n next: (event: CloseEvent) => {\r\n console.log(`WebRTC signalling connection closed: ${event.code} ${event.reason}`);\r\n\r\n if (event.code === 4001) {\r\n console.error('WebRTC authentication failed - token invalid, please re-login');\r\n this.shouldReconnect = false;\r\n this.zone.run(() => {\r\n this.authService.logout().subscribe({\r\n next: () => {\r\n console.log('Logged out due to WebRTC authentication failure');\r\n },\r\n error: (err) => {\r\n console.error('Error during logout, forcing logout:', err);\r\n }\r\n });\r\n });\r\n return;\r\n } else if (event.code === 4003) {\r\n console.error('WebRTC permission denied');\r\n this.shouldReconnect = false;\r\n }\r\n\r\n this.zone.run(() => {\r\n this._connected.next(false);\r\n this._peerId.next(null);\r\n });\r\n }\r\n },\r\n deserializer: msg => {\r\n try {\r\n return JSON.parse(msg.data);\r\n } catch (e) {\r\n console.error('Error parsing WebSocket message:', e);\r\n return msg.data;\r\n }\r\n }\r\n });\r\n\r\n this.wsSubscription = this.ws.subscribe({\r\n next: (message: WebRTCMessage) => {\r\n this.zone.run(() => {\r\n this.handleMessage(message);\r\n });\r\n },\r\n error: (error) => {\r\n console.error('WebRTC signalling error:', error);\r\n console.error('Error details:', {\r\n message: error?.message,\r\n code: error?.code,\r\n type: error?.type,\r\n target: error?.target?.url\r\n });\r\n this.zone.run(() => {\r\n this._connected.next(false);\r\n });\r\n\r\n if (this.shouldReconnect && this._sessionId.value) {\r\n console.log('Attempting to reconnect in 5 seconds...');\r\n setTimeout(() => {\r\n if (this.shouldReconnect && this._sessionId.value) {\r\n console.log('Reconnecting to WebRTC signalling...');\r\n this.connect(this._sessionId.value);\r\n }\r\n }, 5000);\r\n } else {\r\n console.log('Reconnection disabled due to authentication error');\r\n }\r\n },\r\n complete: () => {\r\n console.log('WebRTC signalling connection completed');\r\n this.zone.run(() => {\r\n this._connected.next(false);\r\n });\r\n }\r\n });\r\n }\r\n\r\n disconnect(): void {\r\n if (this.wsSubscription) {\r\n this.wsSubscription.unsubscribe();\r\n this.wsSubscription = undefined;\r\n }\r\n\r\n if (this.ws) {\r\n this.ws.complete();\r\n this.ws = undefined;\r\n }\r\n\r\n this._connected.next(false);\r\n this._peerId.next(null);\r\n this._sessionId.next(null);\r\n this._peers.next([]);\r\n }\r\n\r\n sendCheck(peerRole: PeerRole = PeerRole.PARTICIPANT): void {\r\n console.log('[Signalling] Sending check with role:', peerRole);\r\n this.send({\r\n type: 'check',\r\n peer_role: peerRole\r\n } as any);\r\n }\r\n\r\n sendOffer(toPeerId: string, sdp: RTCSessionDescriptionInit): void {\r\n this.send({\r\n type: 'offer',\r\n to_peer_id: toPeerId,\r\n sdp: sdp\r\n } as any);\r\n }\r\n\r\n sendAnswer(toPeerId: string, sdp: RTCSessionDescriptionInit): void {\r\n this.send({\r\n type: 'answer',\r\n to_peer_id: toPeerId,\r\n sdp: sdp\r\n } as any);\r\n }\r\n\r\n sendIceCandidate(toPeerId: string, candidate: RTCIceCandidateInit): void {\r\n this.send({\r\n type: 'ice_candidate',\r\n to_peer_id: toPeerId,\r\n candidate: candidate\r\n } as any);\r\n }\r\n\r\n sendPeerState(\r\n connectionState?: PeerConnectionState,\r\n hasVideo?: boolean,\r\n hasAudio?: boolean,\r\n hasScreenShare?: boolean\r\n ): void {\r\n this.send({\r\n type: 'peer_state',\r\n connection_state: connectionState,\r\n has_video: hasVideo,\r\n has_audio: hasAudio,\r\n has_screen_share: hasScreenShare\r\n } as any);\r\n }\r\n\r\n private send(message: any): void {\r\n if (!this.ws) {\r\n console.error('WebSocket not connected');\r\n return;\r\n }\r\n\r\n try {\r\n this.ws.next(message);\r\n } catch (error) {\r\n console.error('Error sending message:', error);\r\n }\r\n }\r\n\r\n private handleMessage(message: WebRTCMessage): void {\r\n console.log('[Signalling] Received message:', message.type, message);\r\n switch (message.type) {\r\n case 'connection.established':\r\n this.handleConnectionEstablished(message);\r\n break;\r\n\r\n case 'check.response':\r\n this.handleCheckResponse(message);\r\n break;\r\n\r\n case 'peer.joined':\r\n this.handlePeerJoined(message);\r\n break;\r\n\r\n case 'peer.left':\r\n this.handlePeerLeft(message);\r\n break;\r\n\r\n case 'peer.check':\r\n case 'offer':\r\n case 'answer':\r\n case 'ice_candidate':\r\n console.log('[Signalling] Forwarding message to WebRTC service:', message.type);\r\n this._messages.next(message);\r\n break;\r\n\r\n case 'peer.state_update':\r\n this.handlePeerStateUpdate(message);\r\n break;\r\n\r\n case 'error':\r\n console.error('WebRTC signalling error:', message.message);\r\n break;\r\n\r\n default:\r\n console.warn('Unknown message type:', message.type);\r\n }\r\n }\r\n\r\n private handleConnectionEstablished(message: any): void {\r\n const peerId = message.peer_id || message.peerId;\r\n const sessionId = message.session_id || message.sessionId;\r\n const clientPeerId = message.client_peer_id || message.clientPeerId;\r\n const isReconnection = message.is_reconnection !== undefined ? message.is_reconnection : message.isReconnection;\r\n const iceServers = message.ice_servers || message.iceServers;\r\n\r\n if (peerId) {\r\n this._peerId.next(peerId);\r\n console.log('[Signalling] Peer ID assigned:', peerId);\r\n }\r\n if (sessionId) {\r\n this._sessionId.next(sessionId);\r\n console.log('[Signalling] Session ID assigned:', sessionId);\r\n }\r\n if (clientPeerId) {\r\n this.setClientPeerId(clientPeerId);\r\n console.log('[Signalling] Client Peer ID received:', clientPeerId);\r\n }\r\n if (isReconnection !== undefined) {\r\n console.log('[Signalling] Is reconnection:', isReconnection);\r\n }\r\n if (iceServers) {\r\n this._iceServers.next(iceServers);\r\n console.log('[Signalling] ICE servers received:', iceServers);\r\n }\r\n console.log('[Signalling] WebRTC connection established:', message);\r\n }\r\n\r\n private handleCheckResponse(message: WebRTCMessage): void {\r\n console.log('[Signalling] Received check.response with peers:', message.peers);\r\n if (message.peers) {\r\n const normalizedPeers = message.peers\r\n .map((peer: any) => ({\r\n id: peer.id,\r\n userId: peer.user_id || peer.userId,\r\n username: peer.username,\r\n peerRole: peer.peer_role || peer.peerRole,\r\n connectionState: peer.connection_state || peer.connectionState,\r\n hasVideo: peer.has_video !== undefined ? peer.has_video : peer.hasVideo,\r\n hasAudio: peer.has_audio !== undefined ? peer.has_audio : peer.hasAudio,\r\n hasScreenShare: peer.has_screen_share !== undefined ? peer.has_screen_share : peer.hasScreenShare\r\n }))\r\n .filter(peer => {\r\n if (peer.id === this._peerId.value) {\r\n console.log('[Signalling] Filtering out self from peer list:', peer.id);\r\n return false;\r\n }\r\n if (peer.connectionState === 'disconnected') {\r\n console.log('[Signalling] Filtering out disconnected peer:', peer.username, peer.id);\r\n return false;\r\n }\r\n return true;\r\n });\r\n\r\n this._peers.next(normalizedPeers);\r\n console.log('[Signalling] Peer list updated, active count:', normalizedPeers.length);\r\n\r\n normalizedPeers.forEach(peer => {\r\n console.log('[Signalling] Discovered peer from check.response:', peer.username, peer.id, 'userId:', peer.userId, 'role:', peer.peerRole, 'state:', peer.connectionState);\r\n const peerCheckMessage: WebRTCMessage = {\r\n type: 'peer.check',\r\n fromPeerId: peer.id,\r\n fromUserId: peer.userId,\r\n fromUsername: peer.username,\r\n peerRole: peer.peerRole\r\n };\r\n this._messages.next(peerCheckMessage);\r\n });\r\n } else {\r\n console.log('[Signalling] No peers in check.response');\r\n }\r\n }\r\n\r\n private handlePeerJoined(message: any): void {\r\n const peerId = message.peer_id || message.peerId;\r\n const userId = message.user_id || message.userId;\r\n const username = message.username;\r\n\r\n console.log('[Signalling] Peer joined:', username, peerId, 'userId:', userId);\r\n\r\n const newPeer: PeerInfo = {\r\n id: peerId,\r\n userId: userId,\r\n username: username,\r\n peerRole: PeerRole.PARTICIPANT,\r\n connectionState: PeerConnectionState.CONNECTING,\r\n hasVideo: false,\r\n hasAudio: false,\r\n hasScreenShare: false\r\n };\r\n\r\n const currentPeers = this._peers.value;\r\n if (!currentPeers.find(p => p.id === peerId)) {\r\n this._peers.next([...currentPeers, newPeer]);\r\n }\r\n\r\n const peerCheckMessage: WebRTCMessage = {\r\n type: 'peer.check',\r\n fromPeerId: peerId,\r\n fromUserId: userId,\r\n fromUsername: username,\r\n peerRole: PeerRole.PARTICIPANT\r\n };\r\n this._messages.next(peerCheckMessage);\r\n }\r\n\r\n private handlePeerLeft(message: any): void {\r\n const peerId = message.peer_id || message.peerId;\r\n const userId = message.user_id || message.userId;\r\n const username = message.username;\r\n\r\n console.log('[Signalling] Peer left:', username, peerId, 'userId:', userId);\r\n\r\n const currentPeers = this._peers.value;\r\n const filteredPeers = currentPeers.filter(p => p.id !== peerId);\r\n if (filteredPeers.length !== currentPeers.length) {\r\n this._peers.next(filteredPeers);\r\n }\r\n\r\n this._messages.next({\r\n type: 'peer.left',\r\n fromPeerId: peerId,\r\n fromUserId: userId,\r\n fromUsername: username\r\n });\r\n }\r\n\r\n private handlePeerStateUpdate(message: any): void {\r\n const peerId = message.peer_id || message.from_peer_id || message.fromPeerId || message.peerId;\r\n const connectionState = message.connection_state || message.connectionState;\r\n const hasVideo = message.has_video !== undefined ? message.has_video : message.hasVideo;\r\n const hasAudio = message.has_audio !== undefined ? message.has_audio : message.hasAudio;\r\n const hasScreenShare = message.has_screen_share !== undefined ? message.has_screen_share : message.hasScreenShare;\r\n\r\n console.log('[Signalling] Peer state update for peer:', peerId, {connectionState, hasVideo, hasAudio, hasScreenShare});\r\n\r\n if (!peerId) {\r\n console.error('[Signalling] No peer ID in state update message:', message);\r\n return;\r\n }\r\n\r\n const currentPeers = this._peers.value;\r\n const updatedPeers = currentPeers.map(peer => {\r\n if (peer.id === peerId) {\r\n return {\r\n ...peer,\r\n connectionState: connectionState !== undefined ? connectionState : peer.connectionState,\r\n hasVideo: hasVideo !== undefined ? hasVideo : peer.hasVideo,\r\n hasAudio: hasAudio !== undefined ? hasAudio : peer.hasAudio,\r\n hasScreenShare: hasScreenShare !== undefined ? hasScreenShare : peer.hasScreenShare\r\n };\r\n }\r\n return peer;\r\n });\r\n\r\n this._peers.next(updatedPeers);\r\n this._messages.next(message);\r\n }\r\n\r\n get peerId(): string | null {\r\n return this._peerId.value;\r\n }\r\n\r\n get sessionId(): string | null {\r\n return this._sessionId.value;\r\n }\r\n\r\n get connected(): boolean {\r\n return this._connected.value;\r\n }\r\n\r\n get peers(): PeerInfo[] {\r\n return this._peers.value;\r\n }\r\n\r\n get iceServers(): RTCIceServer[] {\r\n return this._iceServers.value;\r\n }\r\n\r\n private getClientPeerId(): string | null {\r\n try {\r\n return sessionStorage.getItem(this.CLIENT_PEER_ID_KEY);\r\n } catch (error) {\r\n console.error('[Signalling] Error reading client peer ID from sessionStorage:', error);\r\n return null;\r\n }\r\n }\r\n\r\n private setClientPeerId(clientPeerId: string): void {\r\n try {\r\n sessionStorage.setItem(this.CLIENT_PEER_ID_KEY, clientPeerId);\r\n this.clientPeerId = clientPeerId;\r\n } catch (error) {\r\n console.error('[Signalling] Error saving client peer ID to sessionStorage:', error);\r\n }\r\n }\r\n\r\n clearClientPeerId(): void {\r\n try {\r\n sessionStorage.removeItem(this.CLIENT_PEER_ID_KEY);\r\n this.clientPeerId = null;\r\n console.log('[Signalling] Client peer ID cleared from sessionStorage');\r\n } catch (error) {\r\n console.error('[Signalling] Error clearing client peer ID from sessionStorage:', error);\r\n }\r\n }\r\n}\r\n","import { Injectable, NgZone } from '@angular/core';\r\nimport { BehaviorSubject, Subject, Subscription } from 'rxjs';\r\nimport { WebRTCSignallingService } from './webrtc-signalling';\r\nimport {\r\n WebRTCMessage,\r\n PeerConnection,\r\n PeerInfo,\r\n PeerRole,\r\n PeerConnectionState,\r\n WebRTCConfig,\r\n MediaConstraintsConfig,\r\n ChatMessage,\r\n DataChannelMessage,\r\n FileOfferData,\r\n FileTransferRequest,\r\n FileTransferAccept,\r\n FileChunk,\r\n FileTransferProgress,\r\n FileTransferState\r\n} from '../models/webrtc';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class WebRTCService {\r\n private peerConnections: Map<string, PeerConnection> = new Map();\r\n private localStream?: MediaStream;\r\n private signallingSubscription?: Subscription;\r\n private fileTransfers: Map<string, FileTransferState> = new Map();\r\n private readonly DEFAULT_CHUNK_SIZE = 16384;\r\n private role: PeerRole = PeerRole.PARTICIPANT;\r\n\r\n private _localStream = new BehaviorSubject<MediaStream | null>(null);\r\n private _localStreamReady = new BehaviorSubject<boolean>(false);\r\n private _remoteStreams = new BehaviorSubject<Map<string, MediaStream>>(new Map());\r\n private _connectionState = new BehaviorSubject<'disconnected' | 'connecting' | 'connected'>('disconnected');\r\n private _activePeers = new BehaviorSubject<PeerInfo[]>([]);\r\n private _chatMessages = new Subject<ChatMessage>();\r\n private _fileTransferProgress = new Subject<FileTransferProgress>();\r\n private _dataChannelReady = new BehaviorSubject<boolean>(false);\r\n\r\n localStream$ = this._localStream.asObservable();\r\n localStreamReady$ = this._localStreamReady.asObservable();\r\n remoteStreams$ = this._remoteStreams.asObservable();\r\n connectionState$ = this._connectionState.asObservable();\r\n activePeers$ = this._activePeers.asObservable();\r\n chatMessages$ = this._chatMessages.asObservable();\r\n fileTransferProgress$ = this._fileTransferProgress.asObservable();\r\n dataChannelReady$ = this._dataChannelReady.asObservable();\r\n\r\n private defaultConfig: WebRTCConfig = {\r\n iceServers: [\r\n { urls: 'stun:stun.l.google.com:19302' },\r\n { urls: 'stun:stun1.l.google.com:19302' }\r\n ],\r\n iceCandidatePoolSize: 10,\r\n iceTransportPolicy: 'all',\r\n bundlePolicy: 'max-bundle',\r\n rtcpMuxPolicy: 'require'\r\n };\r\n\r\n private defaultMediaConstraints: MediaConstraintsConfig = {\r\n video: {\r\n width: { ideal: 1280 },\r\n height: { ideal: 720 },\r\n frameRate: { ideal: 30 }\r\n },\r\n audio: true\r\n };\r\n\r\n constructor(\r\n private signalling: WebRTCSignallingService,\r\n private zone: NgZone\r\n ) {}\r\n\r\n async startSession(\r\n sessionId: string,\r\n role: PeerRole = PeerRole.PARTICIPANT,\r\n enableVideo: boolean = true,\r\n enableAudio: boolean = true,\r\n videoDeviceId?: string,\r\n audioDeviceId?: string\r\n ): Promise<void> {\r\n this.role = role;\r\n this._connectionState.next('connecting');\r\n\r\n console.log('[WebRTC] Starting session with role:', role, {enableVideo, enableAudio, videoDeviceId, audioDeviceId});\r\n\r\n if (enableVideo || enableAudio) {\r\n await this.startLocalMedia(enableVideo, enableAudio, videoDeviceId, audioDeviceId);\r\n }\r\n\r\n this.signalling.connect(sessionId);\r\n\r\n this.signallingSubscription = this.signalling.messages$.subscribe({\r\n next: (message) => {\r\n this.handleSignallingMessage(message);\r\n }\r\n });\r\n\r\n this.signalling.peerId$.subscribe(peerId => {\r\n if (peerId) {\r\n console.log('[WebRTC] Peer ID assigned, sending check with role:', role);\r\n this.signalling.sendCheck(role);\r\n }\r\n });\r\n\r\n this.signalling.peers$.subscribe(peers => {\r\n console.log('[WebRTC] Peers list updated:', peers);\r\n this._activePeers.next(peers);\r\n });\r\n }\r\n\r\n async startLocalMedia(\r\n enableVideo: boolean = true,\r\n enableAudio: boolean = true,\r\n videoDeviceId?: string,\r\n audioDeviceId?: string\r\n ): Promise<void> {\r\n try {\r\n const constraints: MediaConstraintsConfig = {\r\n video: enableVideo ? {\r\n ...this.defaultMediaConstraints.video as MediaTrackConstraints,\r\n ...(videoDeviceId ? { deviceId: { exact: videoDeviceId } } : {})\r\n } : false,\r\n audio: enableAudio ? {\r\n ...(this.defaultMediaConstraints.audio as MediaTrackConstraints || {}),\r\n ...(audioDeviceId ? { deviceId: { exact: audioDeviceId } } : {})\r\n } : false\r\n };\r\n\r\n console.log('[WebRTC] Starting local media with constraints:', constraints);\r\n\r\n this.localStream = await navigator.mediaDevices.getUserMedia(constraints);\r\n this._localStream.next(this.localStream || null);\r\n this._localStreamReady.next(true);\r\n\r\n this.updatePeerState(\r\n undefined,\r\n enableVideo,\r\n enableAudio,\r\n false\r\n );\r\n\r\n console.log('[WebRTC] Local media started:', {\r\n hasVideo: this.localStream.getVideoTracks().length > 0,\r\n hasAudio: this.localStream.getAudioTracks().length > 0,\r\n videoTrack: this.localStream.getVideoTracks()[0]?.label,\r\n audioTrack: this.localStream.getAudioTracks()[0]?.label\r\n });\r\n } catch (error) {\r\n console.error('Error accessing media devices:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n async startScreenShare(): Promise<void> {\r\n try {\r\n const screenStream = await (navigator.mediaDevices as any).getDisplayMedia({\r\n video: true,\r\n audio: false\r\n });\r\n\r\n if (this.localStream) {\r\n this.localStream.getTracks().forEach(track => track.stop());\r\n }\r\n\r\n this.localStream = screenStream;\r\n this._localStream.next(this.localStream || null);\r\n this._localStreamReady.next(true);\r\n\r\n this.replaceTracksInAllPeers();\r\n\r\n this.updatePeerState(undefined, false, false, true);\r\n\r\n screenStream.getVideoTracks()[0].addEventListener('ended', () => {\r\n this.stopScreenShare();\r\n });\r\n\r\n console.log('Screen sharing started');\r\n } catch (error) {\r\n console.error('Error starting screen share:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n stopScreenShare(): void {\r\n if (this.localStream) {\r\n this.localStream.getTracks().forEach(track => track.stop());\r\n this.localStream = undefined;\r\n this._localStream.next(null);\r\n this._localStreamReady.next(false);\r\n }\r\n\r\n this.updatePeerState(undefined, false, false, false);\r\n\r\n console.log('Screen sharing stopped');\r\n }\r\n\r\n async enableVideo(deviceId?: string): Promise<void> {\r\n if (!this.localStream) {\r\n console.log('[WebRTC] Creating local stream for video');\r\n try {\r\n const newStream = await navigator.mediaDevices.getUserMedia({\r\n video: {\r\n ...this.defaultMediaConstraints.video as MediaTrackConstraints,\r\n ...(deviceId ? { deviceId: { exact: deviceId } } : {})\r\n }\r\n });\r\n\r\n this.localStream = newStream;\r\n this._localStream.next(this.localStream || null);\r\n const newVideoTrack = newStream.getVideoTracks()[0];\r\n\r\n for (const connection of this.peerConnections.values()) {\r\n connection.pc.addTrack(newVideoTrack, this.localStream!);\r\n console.log(`[WebRTC] Added video track for peer ${connection.peerId}`);\r\n\r\n await this.renegotiateConnection(connection.peerId);\r\n }\r\n\r\n this.updatePeerState(undefined, true, undefined, undefined);\r\n this._localStreamReady.next(true);\r\n console.log('[WebRTC] Video enabled with new stream:', newVideoTrack.label);\r\n } catch (error) {\r\n console.error('[WebRTC] Error creating stream for video:', error);\r\n throw error;\r\n }\r\n return;\r\n }\r\n\r\n const hasVideoTrack = this.localStream.getVideoTracks().length > 0;\r\n if (hasVideoTrack) {\r\n console.log('[WebRTC] Video already enabled');\r\n return;\r\n }\r\n\r\n try {\r\n const newStream = await navigator.mediaDevices.getUserMedia({\r\n video: {\r\n ...this.defaultMediaConstraints.video as MediaTrackConstraints,\r\n ...(deviceId ? { deviceId: { exact: deviceId } } : {})\r\n }\r\n });\r\n\r\n const newVideoTrack = newStream.getVideoTracks()[0];\r\n this.localStream.addTrack(newVideoTrack);\r\n\r\n for (const connection of this.peerConnections.values()) {\r\n connection.pc.addTrack(newVideoTrack, this.localStream!);\r\n console.log(`[WebRTC] Added video track for peer ${connection.peerId}`);\r\n\r\n await this.renegotiateConnection(connection.peerId);\r\n }\r\n\r\n this.updatePeerState(undefined, true, undefined, undefined);\r\n this._localStreamReady.next(true);\r\n console.log('[WebRTC] Video enabled:', newVideoTrack.label);\r\n } catch (error) {\r\n console.error('[WebRTC] Error enabling video:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n async disableVideo(): Promise<void> {\r\n if (!this.localStream) {\r\n return;\r\n }\r\n\r\n const videoTrack = this.localStream.getVideoTracks()[0];\r\n if (videoTrack) {\r\n videoTrack.stop();\r\n this.localStream.removeTrack(videoTrack);\r\n\r\n this.peerConnections.forEach((connection) => {\r\n const sender = connection.pc.getSenders().find(s => s.track?.kind === 'video');\r\n if (sender) {\r\n connection.pc.removeTrack(sender);\r\n console.log(`[WebRTC] Removed video track for peer ${connection.peerId}`);\r\n }\r\n });\r\n\r\n this.updatePeerState(undefined, false, undefined, undefined);\r\n console.log('[WebRTC] Video disabled');\r\n }\r\n }\r\n\r\n async switchVideoDevice(deviceId: string): Promise<void> {\r\n if (!this.localStream) {\r\n console.log('[WebRTC] No local stream yet, device will be used when video is enabled');\r\n return;\r\n }\r\n\r\n const hasVideoTrack = this.localStream.getVideoTracks().length > 0;\r\n if (!hasVideoTrack) {\r\n console.log('[WebRTC] Video is not enabled, device will be used when video is enabled');\r\n return;\r\n }\r\n\r\n try {\r\n const oldVideoTrack = this.localStream.getVideoTracks()[0];\r\n\r\n const newStream = await navigator.mediaDevices.getUserMedia({\r\n video: {\r\n ...this.defaultMediaConstraints.video as MediaTrackConstraints,\r\n deviceId: { exact: deviceId }\r\n }\r\n });\r\n\r\n const newVideoTrack = newStream.getVideoTracks()[0];\r\n\r\n if (oldVideoTrack) {\r\n oldVideoTrack.stop();\r\n this.localStream.removeTrack(oldVideoTrack);\r\n }\r\n\r\n this.localStream.addTrack(newVideoTrack);\r\n\r\n this.peerConnections.forEach((connection) => {\r\n const sender = connection.pc.getSenders().find(s => s.track?.kind === 'video');\r\n if (sender) {\r\n sender.replaceTrack(newVideoTrack);\r\n console.log(`[WebRTC] Replaced video track for peer ${connection.peerId}`);\r\n } else {\r\n connection.pc.addTrack(newVideoTrack, this.localStream!);\r\n console.log(`[WebRTC] Added video track for peer ${connection.peerId}`);\r\n }\r\n });\r\n\r\n this._localStreamReady.next(true);\r\n console.log('[WebRTC] Video device switched to:', newVideoTrack.label);\r\n } catch (error) {\r\n console.error('[WebRTC] Error switching video device:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n async enableAudio(deviceId?: string): Promise<void> {\r\n if (!this.localStream) {\r\n console.log('[WebRTC] Creating local stream for audio');\r\n try {\r\n const newStream = await navigator.mediaDevices.getUserMedia({\r\n audio: {\r\n ...(this.defaultMediaConstraints.audio as MediaTrackConstraints || {}),\r\n ...(deviceId ? { deviceId: { exact: deviceId } } : {})\r\n }\r\n });\r\n\r\n this.localStream = newStream;\r\n this._localStream.next(this.localStream || null);\r\n const newAudioTrack = newStream.getAudioTracks()[0];\r\n\r\n for (const connection of this.peerConnections.values()) {\r\n connection.pc.addTrack(newAudioTrack, this.localStream!);\r\n console.log(`[WebRTC] Added audio track for peer ${connection.peerId}`);\r\n\r\n await this.renegotiateConnection(connection.peerId);\r\n }\r\n\r\n this.updatePeerState(undefined, undefined, true, undefined);\r\n this._localStreamReady.next(true);\r\n console.log('[WebRTC] Audio enabled with new stream:', newAudioTrack.label);\r\n } catch (error) {\r\n console.error('[WebRTC] Error creating stream for audio:', error);\r\n throw error;\r\n }\r\n return;\r\n }\r\n\r\n const hasAudioTrack = this.localStream.getAudioTracks().length > 0;\r\n if (hasAudioTrack) {\r\n console.log('[WebRTC] Audio already enabled');\r\n return;\r\n }\r\n\r\n try {\r\n const newStream = await navigator.mediaDevices.getUserMedia({\r\n audio: {\r\n ...(this.defaultMediaConstraints.audio as MediaTrackConstraints || {}),\r\n ...(deviceId ? { deviceId: { exact: deviceId } } : {})\r\n }\r\n });\r\n\r\n const newAudioTrack = newStream.getAudioTracks()[0];\r\n this.localStream.addTrack(newAudioTrack);\r\n\r\n for (const connection of this.peerConnections.values()) {\r\n connection.pc.addTrack(newAudioTrack, this.localStream!);\r\n console.log(`[WebRTC] Added audio track for peer ${connection.peerId}`);\r\n\r\n await this.renegotiateConnection(connection.peerId);\r\n }\r\n\r\n this.updatePeerState(undefined, undefined, true, undefined);\r\n this._localStreamReady.next(true);\r\n console.log('[WebRTC] Audio enabled:', newAudioTrack.label);\r\n } catch (error) {\r\n console.error('[WebRTC] Error enabling audio:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n async disableAudio(): Promise<void> {\r\n if (!this.localStream) {\r\n return;\r\n }\r\n\r\n const audioTrack = this.localStream.getAudioTracks()[0];\r\n if (audioTrack) {\r\n audioTrack.stop();\r\n this.localStream.removeTrack(audioTrack);\r\n\r\n this.peerConnections.forEach((connection) => {\r\n const sender = connection.pc.getSenders().find(s => s.track?.kind === 'audio');\r\n if (sender) {\r\n connection.pc.removeTrack(sender);\r\n console.log(`[WebRTC] Removed audio track for peer ${connection.peerId}`);\r\n }\r\n });\r\n\r\n this.updatePeerState(undefined, undefined, false, undefined);\r\n console.log('[WebRTC] Audio disabled');\r\n }\r\n }\r\n\r\n async switchAudioDevice(deviceId: string): Promise<void> {\r\n if (!this.localStream) {\r\n console.log('[WebRTC] No local stream yet, device will be used when audio is enabled');\r\n return;\r\n }\r\n\r\n const hasAudioTrack = this.localStream.getAudioTracks().length > 0;\r\n if (!hasAudioTrack) {\r\n console.log('[WebRTC] Audio is not enabled, device will be used when audio is enabled');\r\n return;\r\n }\r\n\r\n try {\r\n const oldAudioTrack = this.localStream.getAudioTracks()[0];\r\n\r\n const newStream = await navigator.mediaDevices.getUserMedia({\r\n audio: {\r\n ...(this.defaultMediaConstraints.audio as MediaTrackConstraints || {}),\r\n deviceId: { exact: deviceId }\r\n }\r\n });\r\n\r\n const newAudioTrack = newStream.getAudioTracks()[0];\r\n\r\n if (oldAudioTrack) {\r\n oldAudioTrack.stop();\r\n this.localStream.removeTrack(oldAudioTrack);\r\n }\r\n\r\n this.localStream.addTrack(newAudioTrack);\r\n\r\n this.peerConnections.forEach((connection) => {\r\n const sender = connection.pc.getSenders().find(s => s.track?.kind === 'audio');\r\n if (sender) {\r\n sender.replaceTrack(newAudioTrack);\r\n console.log(`[WebRTC] Replaced audio track for peer ${connection.peerId}`);\r\n } else {\r\n connection.pc.addTrack(newAudioTrack, this.localStream!);\r\n console.log(`[WebRTC] Added audio track for peer ${connection.peerId}`);\r\n }\r\n });\r\n\r\n this._localStreamReady.next(true);\r\n console.log('[WebRTC] Audio device switched to:', newAudioTrack.label);\r\n } catch (error) {\r\n console.error('[WebRTC] Error switching audio device:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n endSession(): void {\r\n this.peerConnections.forEach((conn, peerId) => {\r\n this.closePeerConnection(peerId);\r\n });\r\n\r\n if (this.localStream) {\r\n this.localStream.getTracks().forEach(track => track.stop());\r\n this.localStream = undefined;\r\n this._localStream.next(null);\r\n this._localStreamReady.next(false);\r\n }\r\n\r\n if (this.signallingSubscription) {\r\n this.signallingSubscription.unsubscribe();\r\n }\r\n\r\n this.signalling.disconnect();\r\n\r\n this._connectionState.next('disconnected');\r\n this._remoteStreams.next(new Map());\r\n this._activePeers.next([]);\r\n\r\n console.log('WebRTC session ended');\r\n }\r\n\r\n private async handleSignallingMessage(message: WebRTCMessage): Promise<void> {\r\n try {\r\n console.log('[WebRTC] Received signalling message:', message.type, message);\r\n\r\n const normalizedMessage = this.normalizeMessage(message);\r\n\r\n switch (normalizedMessage.type) {\r\n case 'peer.check':\r\n if (normalizedMessage.fromPeerId) {\r\n console.log('[WebRTC] Handling peer check from:', normalizedMessage.fromUsername, normalizedMessage.fromPeerId);\r\n await this.handlePeerCheck(normalizedMessage.fromPeerId, normalizedMessage.fromUserId!, normalizedMessage.fromUsername!, normalizedMessage.peerRole!);\r\n }\r\n break;\r\n\r\n case 'offer':\r\n if (normalizedMessage.fromPeerId && normalizedMessage.sdp) {\r\n await this.handleOffer(normalizedMessage.fromPeerId, normalizedMessage.fromUserId!, normalizedMessage.fromUsername!, normalizedMessage.sdp);\r\n }\r\n break;\r\n\r\n case 'answer':\r\n if (normalizedMessage.fromPeerId && normalizedMessage.sdp) {\r\n await this.handleAnswer(normalizedMessage.fromPeerId, normalizedMessage.sdp);\r\n }\r\n break;\r\n\r\n case 'ice_candidate':\r\n if (normalizedMessage.fromPeerId && normalizedMessage.candidate) {\r\n await this.handleIceCandidate(normalizedMessage.fromPeerId, normalizedMessage.candidate);\r\n }\r\n break;\r\n\r\n case 'peer.state_update':\r\n this.handlePeerStateUpdate(normalizedMessage);\r\n break;\r\n\r\n case 'peer.left':\r\n if (normalizedMessage.fromPeerId) {\r\n this.handlePeerLeft(normalizedMessage.fromPeerId);\r\n }\r\n break;\r\n }\r\n } catch (error) {\r\n console.error('Error handling signalling message:', error);\r\n }\r\n }\r\n\r\n private normalizeMessage(message: any): WebRTCMessage {\r\n return {\r\n ...message,\r\n fromPeerId: message.from_peer_id || message.fromPeerId,\r\n fromUserId: message.from_user_id || message.fromUserId,\r\n fromUsername: message.from_username || message.fromUsername,\r\n peerRole: message.peer_role || message.peerRole,\r\n toPeerId: message.to_peer_id || message.toPeerId,\r\n connectionState: message.connection_state || message.connectionState,\r\n hasVideo: message.has_video !== undefined ? message.has_video : message.hasVideo,\r\n hasAudio: message.has_audio !== undefined ? message.has_audio : message.hasAudio,\r\n hasScreenShare: message.has_screen_share !== undefined ? message.has_screen_share : message.hasScreenShare\r\n } as WebRTCMessage;\r\n }\r\n\r\n private async handlePeerCheck(peerId: string, userId: number, username: string, role: PeerRole): Promise<void> {\r\n if (peerId === this.signalling.peerId) {\r\n console.log(`[WebRTC] Ignoring peer check from self: ${peerId}`);\r\n return;\r\n }\r\n\r\n if (!this.peerConnections.has(peerId)) {\r\n console.log(`[WebRTC] New peer discovered: ${username} (${peerId}) as ${role}`);\r\n\r\n const pc = await this.createPeerConnection(peerId, userId, username, role);\r\n\r\n const shouldInitiate = this.shouldInitiateConnection(peerId, role);\r\n\r\n if (shouldInitiate) {\r\n console.log(`[WebRTC] Initiating connection to ${username} (${peerId})`);\r\n try {\r\n const offer = await pc.createOffer();\r\n console.log(`[WebRTC] Offer created for ${peerId}:`, offer);\r\n await pc.setLocalDescription(offer);\r\n console.log(`[WebRTC] Local description set for ${peerId}`);\r\n\r\n if (pc.localDescription) {\r\n console.log(`[WebRTC] Sending offer to ${peerId}`);\r\n this.signalling.sendOffer(peerId, pc.localDescription);\r\n\r\n const connection = this.peerConnections.get(peerId);\r\n if (connection) {\r\n connection.offered = true;\r\n }\r\n console.log(`[WebRTC] Offer sent successfully to ${peerId}`);\r\n }\r\n } catch (error) {\r\n console.error(`[WebRTC] Error creating/sending offer to ${peerId}:`, error);\r\n }\r\n } else {\r\n console.log(`[WebRTC] Waiting for ${username} (${peerId}) to initiate connection`);\r\n }\r\n } else {\r\n console.log(`[WebRTC] Peer connection already exists for: ${peerId}`);\r\n }\r\n }\r\n\r\n private async handleOffer(peerId: string, userId: number, username: string, sdp: RTCSessionDescriptionInit): Promise<void> {\r\n let pc: RTCPeerConnection;\r\n\r\n if (!this.peerConnections.has(peerId)) {\r\n pc = await this.createPeerConnection(peerId, userId, username, PeerRole.PARTICIPANT);\r\n } else {\r\n pc = this.peerConnections.get(peerId)!.pc;\r\n }\r\n\r\n await pc.setRemoteDescription(new RTCSessionDescription(sdp));\r\n\r\n const answer = await pc.createAnswer();\r\n await pc.setLocalDescription(answer);\r\n\r\n if (pc.localDescription) {\r\n this.signalling.sendAnswer(peerId, pc.localDescription);\r\n\r\n const connection = this.peerConnections.get(peerId);\r\n if (connection) {\r\n connection.answered = true;\r\n }\r\n }\r\n\r\n const connection = this.peerConnections.get(peerId);\r\n if (connection && connection.queuedCandidates.length > 0) {\r\n await Promise.all(\r\n connection.queuedCandidates.map(candidate => pc.addIceCandidate(candidate))\r\n );\r\n connection.queuedCandidates = [];\r\n }\r\n }\r\n\r\n private async handleAnswer(peerId: string, sdp: RTCSessionDescriptionInit): Promise<void> {\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection) {\r\n console.warn(`Received answer from unknown peer: ${peerId}`);\r\n return;\r\n }\r\n\r\n await connection.pc.setRemoteDescription(new RTCSessionDescription(sdp));\r\n\r\n if (connection.queuedCandidates.length > 0) {\r\n await Promise.all(\r\n connection.queuedCandidates.map(candidate => connection.pc.addIceCandidate(candidate))\r\n );\r\n connection.queuedCandidates = [];\r\n }\r\n }\r\n\r\n private async handleIceCandidate(peerId: string, candidate: RTCIceCandidateInit): Promise<void> {\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection) {\r\n console.warn(`Received ICE candidate from unknown peer: ${peerId}`);\r\n return;\r\n }\r\n\r\n const iceCandidate = new RTCIceCandidate(candidate);\r\n\r\n if (connection.pc.remoteDescription) {\r\n await connection.pc.addIceCandidate(iceCandidate);\r\n } else {\r\n connection.queuedCandidates.push(iceCandidate);\r\n }\r\n }\r\n\r\n private handlePeerStateUpdate(message: WebRTCMessage): void {\r\n console.log('Peer state update:', message);\r\n }\r\n\r\n private handlePeerLeft(peerId: string): void {\r\n console.log(`[WebRTC] Peer left: ${peerId}`);\r\n\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection) {\r\n console.log(`[WebRTC] No connection found for peer: ${peerId}`);\r\n return;\r\n }\r\n\r\n if (connection.dataChannel) {\r\n connection.dataChannel.close();\r\n }\r\n\r\n connection.pc.close();\r\n\r\n this.peerConnections.delete(peerId);\r\n\r\n const streams = this._remoteStreams.value;\r\n streams.delete(peerId);\r\n this._remoteStreams.next(streams);\r\n\r\n this.updateDataChannelReadyState();\r\n\r\n console.log(`[WebRTC] Cleaned up connection for peer: ${peerId}`);\r\n }\r\n\r\n private async createPeerConnection(\r\n peerId: string,\r\n userId: number,\r\n username: string,\r\n role: PeerRole\r\n ): Promise<RTCPeerConnection> {\r\n const iceServers = this.signalling.iceServers;\r\n const config: WebRTCConfig = iceServers.length > 0\r\n ? { ...this.defaultConfig, iceServers }\r\n : this.defaultConfig;\r\n\r\n const pc = new RTCPeerConnection(config);\r\n\r\n const dataChannel = pc.createDataChannel('data', { ordered: true });\r\n this.setupDataChannelHandlers(dataChannel, peerId);\r\n\r\n if (this.localStream) {\r\n console.log(`[WebRTC] Adding local tracks to peer ${peerId}:`, {\r\n videoTracks: this.localStream.getVideoTracks().length,\r\n audioTracks: this.localStream.getAudioTracks().length,\r\n tracks: this.localStream.getTracks().map(t => ({kind: t.kind, label: t.label, enabled: t.enabled}))\r\n });\r\n this.localStream.getTracks().forEach(track => {\r\n console.log(`[WebRTC] Adding ${track.kind} track to ${peerId}:`, track.label, 'enabled:', track.enabled);\r\n pc.addTrack(track, this.localStream!);\r\n });\r\n } else {\r\n console.log(`[WebRTC] No local stream available to add tracks to peer ${peerId}`);\r\n }\r\n\r\n this.setupPeerConnectionHandlers(pc, peerId);\r\n\r\n const connection: PeerConnection = {\r\n peerId,\r\n userId,\r\n username,\r\n pc,\r\n dataChannel,\r\n role,\r\n offered: false,\r\n answered: false,\r\n connected: false,\r\n queuedCandidates: []\r\n };\r\n\r\n this.peerConnections.set(peerId, connection);\r\n\r\n console.log(`Created peer connection for ${username} (${peerId})`);\r\n\r\n return pc;\r\n }\r\n\r\n private setupPeerConnectionHandlers(pc: RTCPeerConnection, peerId: string): void {\r\n pc.onicecandidate = (event) => {\r\n if (event.candidate) {\r\n this.signalling.sendIceCandidate(peerId, event.candidate.toJSON());\r\n }\r\n };\r\n\r\n pc.ontrack = (event) => {\r\n console.log(`Received track from peer ${peerId}:`, event.track.kind);\r\n\r\n this.zone.run(() => {\r\n const stream = event.streams[0];\r\n const connection = this.peerConnections.get(peerId);\r\n if (connection) {\r\n connection.stream = stream;\r\n }\r\n\r\n const streams = this._remoteStreams.value;\r\n streams.set(peerId, stream);\r\n this._remoteStreams.next(streams);\r\n });\r\n };\r\n\r\n pc.onconnectionstatechange = () => {\r\n console.log(`Connection state with peer ${peerId}: ${pc.connectionState}`);\r\n\r\n this.zone.run(() => {\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection) return;\r\n\r\n if (pc.connectionState === 'connected') {\r\n connection.connected = true;\r\n this._connectionState.next('connected');\r\n this.signalling.sendPeerState(PeerConnectionState.CONNECTED);\r\n console.log(`[WebRTC] Peer connection established with ${peerId}, sent state update to backend`);\r\n } else if (pc.connectionState === 'connecting') {\r\n this.signalling.sendPeerState(PeerConnectionState.CONNECTING);\r\n } else if (pc.connectionState === 'failed') {\r\n this.signalling.sendPeerState(PeerConnectionState.FAILED);\r\n this.closePeerConnection(peerId);\r\n } else if (pc.connectionState === 'disconnected') {\r\n this.signalling.sendPeerState(PeerConnectionState.DISCONNECTED);\r\n this.closePeerConnection(peerId);\r\n }\r\n });\r\n };\r\n\r\n pc.ondatachannel = (event) => {\r\n const receivedChannel = event.channel;\r\n this.setupDataChannelHandlers(receivedChannel, peerId);\r\n\r\n const connection = this.peerConnections.get(peerId);\r\n if (connection) {\r\n connection.dataChannel = receivedChannel;\r\n }\r\n };\r\n }\r\n\r\n private setupDataChannelHandlers(dataChannel: RTCDataChannel, peerId: string): void {\r\n console.log(`[WebRTC] Setting up data channel for peer ${peerId}, current state: ${dataChannel.readyState}`);\r\n\r\n dataChannel.onopen = () => {\r\n console.log(`[WebRTC] Data channel opened with peer ${peerId}`);\r\n this.updateDataChannelReadyState();\r\n };\r\n\r\n dataChannel.onmessage = (event) => {\r\n console.log(`[WebRTC] Data received from peer ${peerId}:`, event.data);\r\n this.handleDataChannelMessage(event.data, peerId);\r\n };\r\n\r\n dataChannel.onclose = () => {\r\n console.log(`[WebRTC] Data channel closed with peer ${peerId}`);\r\n this.updateDataChannelReadyState();\r\n };\r\n\r\n dataChannel.onerror = (error) => {\r\n console.error(`[WebRTC] Data channel error with peer ${peerId}:`, error);\r\n this.updateDataChannelReadyState();\r\n };\r\n }\r\n\r\n private updateDataChannelReadyState(): void {\r\n const connections = Array.from(this.peerConnections.values());\r\n const hasOpenChannel = connections.some(\r\n conn => conn.dataChannel && conn.dataChannel.readyState === 'open'\r\n );\r\n\r\n console.log('[WebRTC] Data channel ready state check:', {\r\n totalConnections: connections.length,\r\n channelStates: connections.map(c => ({\r\n peerId: c.peerId,\r\n hasChannel: !!c.dataChannel,\r\n state: c.dataChannel?.readyState\r\n })),\r\n hasOpenChannel\r\n });\r\n\r\n this._dataChannelReady.next(hasOpenChannel);\r\n }\r\n\r\n private handleDataChannelMessage(data: string | ArrayBuffer, peerId: string): void {\r\n if (data instanceof ArrayBuffer) {\r\n return;\r\n }\r\n\r\n try {\r\n const message: DataChannelMessage = JSON.parse(data);\r\n\r\n this.zone.run(() => {\r\n switch (message.type) {\r\n case 'chat':\r\n const chatMessage: ChatMessage = message.data as ChatMessage;\r\n this._chatMessages.next(chatMessage);\r\n console.log('Chat message received:', chatMessage);\r\n break;\r\n\r\n case 'file_request':\r\n this.handleFileRequest(message.data as FileTransferRequest, peerId);\r\n break;\r\n\r\n case 'file_accept':\r\n this.handleFileAccept(message.data as FileTransferAccept, peerId);\r\n break;\r\n\r\n case 'file_chunk':\r\n this.handleFileChunk(message.data as FileChunk);\r\n break;\r\n\r\n case 'file_complete':\r\n this.handleFileComplete(message.data.fileId);\r\n break;\r\n\r\n case 'file_cancel':\r\n this.handleFileCancel(message.data.fileId);\r\n break;\r\n\r\n case 'ping':\r\n this.sendDataChannelMessage(peerId, { type: 'pong', data: {} });\r\n break;\r\n\r\n case 'pong':\r\n console.log(`Received pong from peer ${peerId}`);\r\n break;\r\n\r\n default:\r\n console.log('Unknown data channel message type:', message.type);\r\n }\r\n });\r\n } catch (error) {\r\n console.error('Error parsing data channel message:', error);\r\n }\r\n }\r\n\r\n sendChatMessage(message: string): void {\r\n const openConnections = Array.from(this.peerConnections.values()).filter(\r\n conn => conn.dataChannel && conn.dataChannel.readyState === 'open'\r\n );\r\n\r\n if (openConnections.length === 0) {\r\n console.warn('No open data channels available');\r\n return;\r\n }\r\n\r\n const chatMessage: ChatMessage = {\r\n type: 'chat',\r\n peerId: this.signalling.peerId || 'unknown',\r\n userId: 0,\r\n username: 'You',\r\n message: message,\r\n timestamp: new Date().toISOString()\r\n };\r\n\r\n const dataChannelMessage: DataChannelMessage = {\r\n type: 'chat',\r\n data: chatMessage\r\n };\r\n\r\n let sentCount = 0;\r\n this.peerConnections.forEach((conn) => {\r\n if (this.sendDataChannelMessage(conn.peerId, dataChannelMessage)) {\r\n sentCount++;\r\n }\r\n });\r\n\r\n if (sentCount > 0) {\r\n this._chatMessages.next(chatMessage);\r\n } else {\r\n console.warn('Failed to send message to any peer');\r\n }\r\n }\r\n\r\n private sendDataChannelMessage(peerId: string, message: DataChannelMessage): boolean {\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection || !connection.dataChannel) {\r\n console.warn(`No data channel available for peer ${peerId}`);\r\n return false;\r\n }\r\n\r\n if (connection.dataChannel.readyState !== 'open') {\r\n console.warn(`Data channel not open for peer ${peerId}, state: ${connection.dataChannel.readyState}`);\r\n return false;\r\n }\r\n\r\n try {\r\n connection.dataChannel.send(JSON.stringify(message));\r\n return true;\r\n } catch (error) {\r\n console.error(`Error sending data channel message to peer ${peerId}:`, error);\r\n return false;\r\n }\r\n }\r\n\r\n private closePeerConnection(peerId: string): void {\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection) return;\r\n\r\n connection.pc.close();\r\n this.peerConnections.delete(peerId);\r\n\r\n const streams = this._remoteStreams.value;\r\n streams.delete(peerId);\r\n this._remoteStreams.next(streams);\r\n\r\n console.log(`Closed peer connection with ${peerId}`);\r\n }\r\n\r\n private async renegotiateConnection(peerId: string): Promise<void> {\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection) {\r\n console.log(`[WebRTC] No connection found for peer ${peerId} to renegotiate`);\r\n return;\r\n }\r\n\r\n try {\r\n console.log(`[WebRTC] Renegotiating connection with ${peerId}`);\r\n const offer = await connection.pc.createOffer();\r\n await connection.pc.setLocalDescription(offer);\r\n\r\n if (connection.pc.localDescription) {\r\n this.signalling.sendOffer(peerId, connection.pc.localDescription);\r\n console.log(`[WebRTC] Sent renegotiation offer to ${peerId}`);\r\n }\r\n } catch (error) {\r\n console.error(`[WebRTC] Error renegotiating connection with ${peerId}:`, error);\r\n }\r\n }\r\n\r\n private shouldInitiateConnection(targetPeerId: string, peerRole: PeerRole): boolean {\r\n const myPeerId = this.signalling.peerId;\r\n if (!myPeerId) {\r\n console.log('[WebRTC] No peer ID yet, cannot determine initiation');\r\n return false;\r\n }\r\n\r\n const shouldInitiate = myPeerId < targetPeerId;\r\n console.log(`[WebRTC] Connection initiation: myId(${myPeerId.substring(0, 8)}...) < targetId(${targetPeerId.substring(0, 8)}...) = ${shouldInitiate}`);\r\n console.log(`[WebRTC] Roles (for info only): My role: ${this.role}, Target role: ${peerRole}`);\r\n return shouldInitiate;\r\n }\r\n\r\n private replaceTracksInAllPeers(): void {\r\n if (!this.localStream) return;\r\n\r\n this.peerConnections.forEach((connection) => {\r\n const senders = connection.pc.getSenders();\r\n\r\n this.localStream!.getTracks().forEach(track => {\r\n const sender = senders.find(s => s.track?.kind === track.kind);\r\n\r\n if (sender) {\r\n sender.replaceTrack(track).catch(error => {\r\n console.error(`Error replacing ${track.kind} track:`, error);\r\n });\r\n } else {\r\n connection.pc.addTrack(track, this.localStream!);\r\n }\r\n });\r\n });\r\n }\r\n\r\n private updatePeerState(\r\n connectionState?: PeerConnectionState,\r\n hasVideo?: boolean,\r\n hasAudio?: boolean,\r\n hasScreenShare?: boolean\r\n ): void {\r\n this.signalling.sendPeerState(connectionState, hasVideo, hasAudio, hasScreenShare);\r\n }\r\n\r\n offerFile(file: File): void {\r\n const fileId = `${Date.now()}-${Math.random().toString(36).substring(7)}`;\r\n const chunkSize = this.DEFAULT_CHUNK_SIZE;\r\n const totalChunks = Math.ceil(file.size / chunkSize);\r\n\r\n const fileOffer: FileOfferData = {\r\n fileId,\r\n fileName: file.name,\r\n fileSize: file.size,\r\n fileType: file.type,\r\n chunkSize,\r\n totalChunks\r\n };\r\n\r\n const fileTransfer: FileTransferState = {\r\n fileId,\r\n fileName: file.name,\r\n fileSize: file.size,\r\n fileType: file.type,\r\n file,\r\n chunks: new Map(),\r\n totalChunks,\r\n chunkSize,\r\n sentChunks: 0,\r\n receivedChunks: 0,\r\n status: 'pending',\r\n requestedBy: new Set()\r\n };\r\n\r\n this.fileTransfers.set(fileId, fileTransfer);\r\n\r\n const chatMessage: ChatMessage = {\r\n type: 'chat',\r\n peerId: this.signalling.peerId || 'unknown',\r\n userId: 0,\r\n username: 'You',\r\n message: `📎 ${file.name} (${this.formatFileSize(file.size)})`,\r\n timestamp: new Date().toISOString(),\r\n fileOffer\r\n };\r\n\r\n const dataChannelMessage: DataChannelMessage = {\r\n type: 'chat',\r\n data: chatMessage\r\n };\r\n\r\n this.peerConnections.forEach((conn) => {\r\n this.sendDataChannelMessage(conn.peerId, dataChannelMessage);\r\n });\r\n\r\n this._chatMessages.next(chatMessage);\r\n\r\n console.log('File offered:', fileOffer);\r\n }\r\n\r\n requestFile(fileId: string): void {\r\n const request: FileTransferRequest = {\r\n type: 'file_request',\r\n fileId,\r\n requesterId: this.signalling.peerId || 'unknown'\r\n };\r\n\r\n this.peerConnections.forEach((conn) => {\r\n this.sendDataChannelMessage(conn.peerId, {\r\n type: 'file_request',\r\n data: request\r\n });\r\n });\r\n\r\n console.log('File requested:', fileId);\r\n }\r\n\r\n private handleFileRequest(request: FileTransferRequest, fromPeerId: string): void {\r\n const transfer = this.fileTransfers.get(request.fileId);\r\n if (!transfer || !transfer.file) {\r\n console.warn('File not found for request:', request.fileId);\r\n return;\r\n }\r\n\r\n transfer.requestedBy.add(fromPeerId);\r\n transfer.status = 'transferring';\r\n\r\n const accept: FileTransferAccept = {\r\n type: 'file_accept',\r\n fileId: request.fileId,\r\n toPeerId: request.requesterId\r\n };\r\n\r\n this.sendDataChannelMessage(fromPeerId, {\r\n type: 'file_accept',\r\n data: accept\r\n });\r\n\r\n this.startSendingFile(request.fileId, fromPeerId);\r\n }\r\n\r\n private async handleFileAccept(accept: FileTransferAccept, fromPeerId: string): Promise<void> {\r\n console.log('File transfer accepted:', accept.fileId);\r\n\r\n const chatMessages = (this._chatMessages as any)._buffer || [];\r\n const relatedMessage = chatMessages.find((msg: ChatMessage) => msg.fileOffer?.fileId === accept.fileId);\r\n\r\n if (!relatedMessage?.fileOffer) {\r\n console.error('Cannot find file offer for accepted transfer:', accept.fileId);\r\n return;\r\n }\r\n\r\n const fileOffer = relatedMessage.fileOffer;\r\n\r\n try {\r\n const downloadStream = await this.createFileDownloadStream(fileOffer.fileName);\r\n\r\n const transfer: FileTransferState = {\r\n fileId: accept.fileId,\r\n fileName: fileOffer.fileName,\r\n fileSize: fileOffer.fileSize,\r\n fileType: fileOffer.fileType,\r\n chunks: new Map(),\r\n totalChunks: fileOffer.totalChunks,\r\n chunkSize: fileOffer.chunkSize,\r\n sentChunks: 0,\r\n receivedChunks: 0,\r\n status: 'transferring',\r\n requestedBy: new Set(),\r\n downloadStream: downloadStream,\r\n streamWriter: downloadStream.getWriter()\r\n };\r\n\r\n this.fileTransfers.set(accept.fileId, transfer);\r\n console.log('Streaming download started for:', fileOffer.fileName);\r\n } catch (error) {\r\n console.error('Failed to create download stream:', error);\r\n\r\n const transfer: FileTransferState = {\r\n fileId: accept.fileId,\r\n fileName: fileOffer.fileName,\r\n fileSize: fileOffer.fileSize,\r\n fileType: fileOffer.fileType,\r\n chunks: new Map(),\r\n totalChunks: fileOffer.totalChunks,\r\n chunkSize: fileOffer.chunkSize,\r\n sentChunks: 0,\r\n receivedChunks: 0,\r\n status: 'transferring',\r\n requestedBy: new Set()\r\n };\r\n\r\n this.fileTransfers.set(accept.fileId, transfer);\r\n console.log('Fallback to in-memory assembly for:', fileOffer.fileName);\r\n }\r\n }\r\n\r\n private async createFileDownloadStream(fileName: string): Promise<WritableStream<Uint8Array>> {\r\n if ('showSaveFilePicker' in window) {\r\n try {\r\n const handle = await (window as any).showSaveFilePicker({\r\n suggestedName: fileName,\r\n types: [{\r\n description: 'File',\r\n accept: { '*/*': [] }\r\n }]\r\n });\r\n\r\n const writable = await handle.createWritable();\r\n return writable;\r\n } catch (error) {\r\n if ((error as Error).name === 'AbortError') {\r\n throw new Error('User cancelled file save');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n return this.createStreamSaverFallback(fileName);\r\n }\r\n\r\n private createStreamSaverFallback(fileName: string): WritableStream<Uint8Array> {\r\n let chunks: Uint8Array[] = [];\r\n\r\n return new WritableStream<Uint8Array>({\r\n write(chunk) {\r\n chunks.push(chunk);\r\n },\r\n close() {\r\n const blob = new Blob(chunks);\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = fileName;\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url);\r\n chunks = [];\r\n },\r\n abort(reason) {\r\n console.error('Stream aborted:', reason);\r\n chunks = [];\r\n }\r\n });\r\n }\r\n\r\n private async startSendingFile(fileId: string, toPeerId: string): Promise<void> {\r\n const transfer = this.fileTransfers.get(fileId);\r\n if (!transfer || !transfer.file) {\r\n console.error('File transfer not found:', fileId);\r\n return;\r\n }\r\n\r\n const file = transfer.file;\r\n let offset = 0;\r\n let chunkIndex = 0;\r\n\r\n while (offset < file.size) {\r\n const chunk = file.slice(offset, offset + transfer.chunkSize);\r\n const arrayBuffer = await chunk.arrayBuffer();\r\n\r\n const fileChunk: FileChunk = {\r\n type: 'file_chunk',\r\n fileId,\r\n chunkIndex,\r\n totalChunks: transfer.totalChunks,\r\n data: arrayBuffer,\r\n isLast: offset + transfer.chunkSize >= file.size\r\n };\r\n\r\n const base64Data = this.arrayBufferToBase64(arrayBuffer);\r\n\r\n this.sendDataChannelMessage(toPeerId, {\r\n type: 'file_chunk',\r\n data: {\r\n ...fileChunk,\r\n data: base64Data\r\n }\r\n });\r\n\r\n transfer.sentChunks++;\r\n offset += transfer.chunkSize;\r\n chunkIndex++;\r\n\r\n await new Promise(resolve => setTimeout(resolve, 10));\r\n }\r\n\r\n this.sendDataChannelMessage(toPeerId, {\r\n type: 'file_complete',\r\n data: { fileId }\r\n });\r\n\r\n console.log('File sending completed:', fileId);\r\n }\r\n\r\n private async handleFileChunk(chunk: any): Promise<void> {\r\n const fileId = chunk.fileId;\r\n let transfer = this.fileTransfers.get(fileId);\r\n\r\n if (!transfer) {\r\n console.warn('File transfer not found:', fileId);\r\n return;\r\n }\r\n\r\n const arrayBuffer = this.base64ToArrayBuffer(chunk.data);\r\n const uint8Array = new Uint8Array(arrayBuffer);\r\n\r\n if (transfer.streamWriter) {\r\n try {\r\n await transfer.streamWriter.write(uint8Array);\r\n console.log(`Streamed chunk ${chunk.chunkIndex + 1}/${transfer.totalChunks} directly to disk`);\r\n } catch (error) {\r\n console.error('Error writing to stream, falling back to in-memory:', error);\r\n transfer.streamWriter = undefined;\r\n transfer.chunks.set(chunk.chunkIndex, arrayBuffer);\r\n }\r\n } else {\r\n transfer.chunks.set(chunk.chunkIndex, arrayBuffer);\r\n }\r\n\r\n transfer.receivedChunks++;\r\n\r\n const progress: FileTransferProgress = {\r\n fileId,\r\n fileName: transfer.fileName,\r\n fileSize: transfer.fileSize,\r\n chunksReceived: transfer.receivedChunks,\r\n totalChunks: transfer.totalChunks,\r\n bytesReceived: transfer.receivedChunks * transfer.chunkSize,\r\n percentage: (transfer.receivedChunks / transfer.totalChunks) * 100\r\n };\r\n\r\n this.zone.run(() => {\r\n this._fileTransferProgress.next(progress);\r\n });\r\n }\r\n\r\n private async handleFileComplete(fileId: string): Promise<void> {\r\n const transfer = this.fileTransfers.get(fileId);\r\n if (!transfer) {\r\n console.warn('File transfer not found:', fileId);\r\n return;\r\n }\r\n\r\n transfer.status = 'completed';\r\n\r\n if (transfer.streamWriter) {\r\n try {\r\n await transfer.streamWriter.close();\r\n console.log('File streamed to disk successfully:', transfer.fileName);\r\n } catch (error) {\r\n console.error('Error closing stream:', error);\r\n }\r\n } else {\r\n const chunks: ArrayBuffer[] = [];\r\n for (let i = 0; i < transfer.totalChunks; i++) {\r\n const chunk = transfer.chunks.get(i);\r\n if (chunk) {\r\n chunks.push(chunk);\r\n }\r\n }\r\n\r\n const blob = new Blob(chunks, { type: transfer.fileType });\r\n const url = URL.createObjectURL(blob);\r\n\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = transfer.fileName;\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url);\r\n\r\n console.log('File downloaded from memory:', transfer.fileName);\r\n }\r\n\r\n this.fileTransfers.delete(fileId);\r\n }\r\n\r\n private async handleFileCancel(fileId: string): Promise<void> {\r\n const transfer = this.fileTransfers.get(fileId);\r\n if (transfer) {\r\n transfer.status = 'failed';\r\n\r\n if (transfer.streamWriter) {\r\n try {\r\n await transfer.streamWriter.abort('Transfer cancelled');\r\n } catch (error) {\r\n console.error('Error aborting stream:', error);\r\n }\r\n }\r\n\r\n this.fileTransfers.delete(fileId);\r\n console.log('File transfer cancelled:', fileId);\r\n }\r\n }\r\n\r\n async cancelFileTransfer(fileId: string): Promise<void> {\r\n const transfer = this.fileTransfers.get(fileId);\r\n if (!transfer) return;\r\n\r\n if (transfer.streamWriter) {\r\n try {\r\n await transfer.streamWriter.abort('Transfer cancelled by user');\r\n } catch (error) {\r\n console.error('Error aborting stream:', error);\r\n }\r\n }\r\n\r\n this.peerConnections.forEach((conn) => {\r\n this.sendDataChannelMessage(conn.peerId, {\r\n type: 'file_cancel',\r\n data: { fileId }\r\n });\r\n });\r\n\r\n this.fileTransfers.delete(fileId);\r\n console.log('File transfer cancelled:', fileId);\r\n }\r\n\r\n private arrayBufferToBase64(buffer: ArrayBuffer): string {\r\n const bytes = new Uint8Array(buffer);\r\n let binary = '';\r\n for (let i = 0; i < bytes.byteLength; i++) {\r\n binary += String.fromCharCode(bytes[i]);\r\n }\r\n return btoa(binary);\r\n }\r\n\r\n private base64ToArrayBuffer(base64: string): ArrayBuffer {\r\n const binary = atob(base64);\r\n const bytes = new Uint8Array(binary.length);\r\n for (let i = 0; i < binary.length; i++) {\r\n bytes[i] = binary.charCodeAt(i);\r\n }\r\n return bytes.buffer;\r\n }\r\n\r\n private formatFileSize(bytes: number): string {\r\n if (bytes === 0) return '0 Bytes';\r\n const k = 1024;\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];\r\n }\r\n\r\n get localMediaStream(): MediaStream | undefined {\r\n return this.localStream;\r\n }\r\n\r\n get isConnected(): boolean {\r\n return this._connectionState.value === 'connected';\r\n }\r\n\r\n get activePeerConnections(): PeerConnection[] {\r\n return Array.from(this.peerConnections.values());\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService, PaginatedResponse } from '@noatgnu/cupcake-core';\r\nimport {\r\n WebRTCSession,\r\n WebRTCSessionCreate,\r\n WebRTCSessionUpdate,\r\n WebRTCSessionQueryParams\r\n} from '../models/webrtc';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class WebRTCSessionService extends BaseApiService {\r\n private modelName = 'webrtc-sessions';\r\n private baseUrl = `${this.apiUrl}/${this.modelName}`;\r\n\r\n getSessions(params?: WebRTCSessionQueryParams): Observable<PaginatedResponse<WebRTCSession>> {\r\n const httpParams = params ? this.buildHttpParams(params) : undefined;\r\n return this.get<PaginatedResponse<WebRTCSession>>(`${this.baseUrl}/`, { params: httpParams });\r\n }\r\n\r\n getSession(id: string): Observable<WebRTCSession> {\r\n return this.get<WebRTCSession>(`${this.baseUrl}/${id}/`);\r\n }\r\n\r\n createSession(data: WebRTCSessionCreate): Observable<WebRTCSession> {\r\n return this.post<WebRTCSession>(`${this.baseUrl}/`, data);\r\n }\r\n\r\n updateSession(id: string, data: WebRTCSessionUpdate): Observable<WebRTCSession> {\r\n return this.patch<WebRTCSession>(`${this.baseUrl}/${id}/`, data);\r\n }\r\n\r\n endSession(id: string): Observable<{ message: string; session_id: string }> {\r\n return this.post<{ message: string; session_id: string }>(\r\n `${this.baseUrl}/${id}/end_session/`,\r\n {}\r\n );\r\n }\r\n\r\n deleteSession(id: string): Observable<void> {\r\n return this.delete<void>(`${this.baseUrl}/${id}/`);\r\n }\r\n}\r\n","// Communication and messaging services\r\nexport * from './notification';\r\nexport * from './message-thread';\r\nexport * from './message';\r\nexport * from './thread-participant';\r\nexport * from './communication-websocket';\r\nexport * from './webrtc-signalling';\r\nexport * from './webrtc';\r\nexport * from './webrtc-session';","/*\n * Public API Surface of cupcake-mint-chocolate\n */\n\nexport * from './lib/cupcake-mint-chocolate';\n\nexport * from './lib/models';\n\nexport * from './lib/services';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.WebRTCSignallingService"],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -842,7 +842,7 @@ declare class CommunicationWebSocketService implements OnDestroy {
|
|
|
842
842
|
private reconnectTimer;
|
|
843
843
|
private messageSubject;
|
|
844
844
|
private connectionStateSubject;
|
|
845
|
-
connectionState$: Observable<"
|
|
845
|
+
connectionState$: Observable<"connecting" | "connected" | "disconnected">;
|
|
846
846
|
messages$: Observable<WebSocketIncomingMessage>;
|
|
847
847
|
newNotifications$: Observable<NewNotificationEvent>;
|
|
848
848
|
newMessages$: Observable<NewMessageEvent>;
|
|
@@ -922,6 +922,7 @@ declare class WebRTCService {
|
|
|
922
922
|
private fileTransfers;
|
|
923
923
|
private readonly DEFAULT_CHUNK_SIZE;
|
|
924
924
|
private role;
|
|
925
|
+
private _localStream;
|
|
925
926
|
private _localStreamReady;
|
|
926
927
|
private _remoteStreams;
|
|
927
928
|
private _connectionState;
|
|
@@ -929,9 +930,10 @@ declare class WebRTCService {
|
|
|
929
930
|
private _chatMessages;
|
|
930
931
|
private _fileTransferProgress;
|
|
931
932
|
private _dataChannelReady;
|
|
933
|
+
localStream$: rxjs.Observable<MediaStream | null>;
|
|
932
934
|
localStreamReady$: rxjs.Observable<boolean>;
|
|
933
935
|
remoteStreams$: rxjs.Observable<Map<string, MediaStream>>;
|
|
934
|
-
connectionState$: rxjs.Observable<"
|
|
936
|
+
connectionState$: rxjs.Observable<"connecting" | "connected" | "disconnected">;
|
|
935
937
|
activePeers$: rxjs.Observable<PeerInfo[]>;
|
|
936
938
|
chatMessages$: rxjs.Observable<ChatMessage>;
|
|
937
939
|
fileTransferProgress$: rxjs.Observable<FileTransferProgress>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@noatgnu/cupcake-mint-chocolate",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.35",
|
|
4
4
|
"description": "An extension for cupcake-core that provides additional api and interfaces for managing notifications and messaging.",
|
|
5
5
|
"author": "Toan Phung",
|
|
6
6
|
"license": "MIT",
|