@noatgnu/cupcake-mint-chocolate 1.2.10 → 1.2.11
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.
|
@@ -796,6 +796,7 @@ class WebRTCSignallingService {
|
|
|
796
796
|
this._peers.next([]);
|
|
797
797
|
}
|
|
798
798
|
sendCheck(peerRole = PeerRole.PARTICIPANT) {
|
|
799
|
+
console.log('[Signalling] Sending check with role:', peerRole);
|
|
799
800
|
this.send({
|
|
800
801
|
type: 'check',
|
|
801
802
|
peerRole: peerRole
|
|
@@ -844,6 +845,7 @@ class WebRTCSignallingService {
|
|
|
844
845
|
}
|
|
845
846
|
}
|
|
846
847
|
handleMessage(message) {
|
|
848
|
+
console.log('[Signalling] Received message:', message.type, message);
|
|
847
849
|
switch (message.type) {
|
|
848
850
|
case 'connection.established':
|
|
849
851
|
this.handleConnectionEstablished(message);
|
|
@@ -856,6 +858,7 @@ class WebRTCSignallingService {
|
|
|
856
858
|
case 'answer':
|
|
857
859
|
case 'ice_candidate':
|
|
858
860
|
case 'peer.state_update':
|
|
861
|
+
console.log('[Signalling] Forwarding message to WebRTC service:', message.type);
|
|
859
862
|
this._messages.next(message);
|
|
860
863
|
break;
|
|
861
864
|
case 'error':
|
|
@@ -868,19 +871,26 @@ class WebRTCSignallingService {
|
|
|
868
871
|
handleConnectionEstablished(message) {
|
|
869
872
|
if (message.peerId) {
|
|
870
873
|
this._peerId.next(message.peerId);
|
|
874
|
+
console.log('[Signalling] Peer ID assigned:', message.peerId);
|
|
871
875
|
}
|
|
872
876
|
if (message.sessionId) {
|
|
873
877
|
this._sessionId.next(message.sessionId);
|
|
878
|
+
console.log('[Signalling] Session ID assigned:', message.sessionId);
|
|
874
879
|
}
|
|
875
880
|
if (message.iceServers) {
|
|
876
881
|
this._iceServers.next(message.iceServers);
|
|
882
|
+
console.log('[Signalling] ICE servers received:', message.iceServers);
|
|
877
883
|
}
|
|
878
|
-
console.log('WebRTC
|
|
884
|
+
console.log('[Signalling] WebRTC connection established:', message);
|
|
879
885
|
}
|
|
880
886
|
handleCheckResponse(message) {
|
|
887
|
+
console.log('[Signalling] Received check.response with peers:', message.peers);
|
|
881
888
|
if (message.peers) {
|
|
882
889
|
this._peers.next(message.peers);
|
|
883
|
-
console.log('
|
|
890
|
+
console.log('[Signalling] Peer list updated, count:', message.peers.length);
|
|
891
|
+
}
|
|
892
|
+
else {
|
|
893
|
+
console.log('[Signalling] No peers in check.response');
|
|
884
894
|
}
|
|
885
895
|
}
|
|
886
896
|
get peerId() {
|
|
@@ -962,9 +972,11 @@ class WebRTCService {
|
|
|
962
972
|
}
|
|
963
973
|
});
|
|
964
974
|
setTimeout(() => {
|
|
975
|
+
console.log('[WebRTC] Sending peer check with role:', role);
|
|
965
976
|
this.signalling.sendCheck(role);
|
|
966
977
|
}, 1000);
|
|
967
978
|
this.signalling.peers$.subscribe(peers => {
|
|
979
|
+
console.log('[WebRTC] Peers list updated:', peers);
|
|
968
980
|
this._activePeers.next(peers);
|
|
969
981
|
});
|
|
970
982
|
}
|
|
@@ -1036,9 +1048,11 @@ class WebRTCService {
|
|
|
1036
1048
|
}
|
|
1037
1049
|
async handleSignallingMessage(message) {
|
|
1038
1050
|
try {
|
|
1051
|
+
console.log('[WebRTC] Received signalling message:', message.type, message);
|
|
1039
1052
|
switch (message.type) {
|
|
1040
1053
|
case 'peer.check':
|
|
1041
1054
|
if (message.fromPeerId) {
|
|
1055
|
+
console.log('[WebRTC] Handling peer check from:', message.fromUsername, message.fromPeerId);
|
|
1042
1056
|
await this.handlePeerCheck(message.fromPeerId, message.fromUserId, message.fromUsername, message.peerRole);
|
|
1043
1057
|
}
|
|
1044
1058
|
break;
|
|
@@ -1724,6 +1738,9 @@ class WebRTCSessionService extends BaseApiService {
|
|
|
1724
1738
|
createSession(data) {
|
|
1725
1739
|
return this.post(`${this.baseUrl}/`, data);
|
|
1726
1740
|
}
|
|
1741
|
+
updateSession(id, data) {
|
|
1742
|
+
return this.patch(`${this.baseUrl}/${id}/`, data);
|
|
1743
|
+
}
|
|
1727
1744
|
endSession(id) {
|
|
1728
1745
|
return this.post(`${this.baseUrl}/${id}/end_session/`, {});
|
|
1729
1746
|
}
|
|
@@ -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 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 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 sessionType: WebRTCSessionType;\r\n ccrvSessionIds?: number[];\r\n}\r\n\r\nexport interface WebRTCSessionQueryParams {\r\n sessionType?: WebRTCSessionType;\r\n sessionStatus?: WebRTCSessionStatus;\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' | 'error';\r\n message?: string;\r\n peerId?: 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}\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\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\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 const wsUrl = `${this.baseUrl}/ccmc/webrtc/${sessionId}/?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: () => {\r\n console.log('WebRTC signalling connection closed');\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 this.zone.run(() => {\r\n this._connected.next(false);\r\n });\r\n\r\n setTimeout(() => {\r\n if (this._sessionId.value) {\r\n console.log('Attempting to reconnect...');\r\n this.connect(this._sessionId.value);\r\n }\r\n }, 5000);\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 this.send({\r\n type: 'check',\r\n peerRole: 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 toPeerId: 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 toPeerId: 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 toPeerId: 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 connectionState,\r\n hasVideo,\r\n hasAudio,\r\n 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 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.check':\r\n case 'offer':\r\n case 'answer':\r\n case 'ice_candidate':\r\n case 'peer.state_update':\r\n this._messages.next(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: WebRTCMessage): void {\r\n if (message.peerId) {\r\n this._peerId.next(message.peerId);\r\n }\r\n if (message.sessionId) {\r\n this._sessionId.next(message.sessionId);\r\n }\r\n if (message.iceServers) {\r\n this._iceServers.next(message.iceServers);\r\n }\r\n console.log('WebRTC signalling connection established:', message);\r\n }\r\n\r\n private handleCheckResponse(message: WebRTCMessage): void {\r\n if (message.peers) {\r\n this._peers.next(message.peers);\r\n console.log('Received peer list:', message.peers);\r\n }\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","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\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\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\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 ): Promise<void> {\r\n this._connectionState.next('connecting');\r\n\r\n if (role === PeerRole.HOST || enableVideo || enableAudio) {\r\n await this.startLocalMedia(enableVideo, enableAudio);\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 setTimeout(() => {\r\n this.signalling.sendCheck(role);\r\n }, 1000);\r\n\r\n this.signalling.peers$.subscribe(peers => {\r\n this._activePeers.next(peers);\r\n });\r\n }\r\n\r\n async startLocalMedia(enableVideo: boolean = true, enableAudio: boolean = true): Promise<void> {\r\n try {\r\n const constraints: MediaConstraintsConfig = {\r\n video: enableVideo ? this.defaultMediaConstraints.video : false,\r\n audio: enableAudio ? this.defaultMediaConstraints.audio : false\r\n };\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('Local media started:', this.localStream);\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 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 switch (message.type) {\r\n case 'peer.check':\r\n if (message.fromPeerId) {\r\n await this.handlePeerCheck(message.fromPeerId, message.fromUserId!, message.fromUsername!, message.peerRole!);\r\n }\r\n break;\r\n\r\n case 'offer':\r\n if (message.fromPeerId && message.sdp) {\r\n await this.handleOffer(message.fromPeerId, message.fromUserId!, message.fromUsername!, message.sdp);\r\n }\r\n break;\r\n\r\n case 'answer':\r\n if (message.fromPeerId && message.sdp) {\r\n await this.handleAnswer(message.fromPeerId, message.sdp);\r\n }\r\n break;\r\n\r\n case 'ice_candidate':\r\n if (message.fromPeerId && message.candidate) {\r\n await this.handleIceCandidate(message.fromPeerId, message.candidate);\r\n }\r\n break;\r\n\r\n case 'peer.state_update':\r\n this.handlePeerStateUpdate(message);\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 async handlePeerCheck(peerId: string, userId: number, username: string, role: PeerRole): Promise<void> {\r\n if (!this.peerConnections.has(peerId)) {\r\n console.log(`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(role);\r\n\r\n if (shouldInitiate) {\r\n const offer = await pc.createOffer();\r\n await pc.setLocalDescription(offer);\r\n\r\n if (pc.localDescription) {\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 }\r\n }\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 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 this.localStream.getTracks().forEach(track => {\r\n pc.addTrack(track, this.localStream!);\r\n });\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 } else if (pc.connectionState === 'failed' || pc.connectionState === '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 dataChannel.onopen = () => {\r\n console.log(`Data channel opened with peer ${peerId}`);\r\n };\r\n\r\n dataChannel.onmessage = (event) => {\r\n console.log(`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(`Data channel closed with peer ${peerId}`);\r\n };\r\n\r\n dataChannel.onerror = (error) => {\r\n console.error(`Data channel error with peer ${peerId}:`, error);\r\n };\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 connection = this.peerConnections.values().next().value;\r\n if (!connection) {\r\n console.warn('No peer connection 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 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\r\n private sendDataChannelMessage(peerId: string, message: DataChannelMessage): void {\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;\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;\r\n }\r\n\r\n try {\r\n connection.dataChannel.send(JSON.stringify(message));\r\n } catch (error) {\r\n console.error(`Error sending data channel message to peer ${peerId}:`, error);\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 shouldInitiateConnection(peerRole: PeerRole): boolean {\r\n const myPeers = Array.from(this.peerConnections.values());\r\n const iAmHost = myPeers.some(p => p.role === PeerRole.HOST);\r\n\r\n return iAmHost && peerRole !== PeerRole.HOST;\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 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 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 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}\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' | 'error';\r\n message?: string;\r\n peerId?: 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}\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\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\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 const wsUrl = `${this.baseUrl}/ccmc/webrtc/${sessionId}/?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: () => {\r\n console.log('WebRTC signalling connection closed');\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 this.zone.run(() => {\r\n this._connected.next(false);\r\n });\r\n\r\n setTimeout(() => {\r\n if (this._sessionId.value) {\r\n console.log('Attempting to reconnect...');\r\n this.connect(this._sessionId.value);\r\n }\r\n }, 5000);\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 peerRole: 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 toPeerId: 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 toPeerId: 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 toPeerId: 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 connectionState,\r\n hasVideo,\r\n hasAudio,\r\n 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.check':\r\n case 'offer':\r\n case 'answer':\r\n case 'ice_candidate':\r\n case 'peer.state_update':\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 '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: WebRTCMessage): void {\r\n if (message.peerId) {\r\n this._peerId.next(message.peerId);\r\n console.log('[Signalling] Peer ID assigned:', message.peerId);\r\n }\r\n if (message.sessionId) {\r\n this._sessionId.next(message.sessionId);\r\n console.log('[Signalling] Session ID assigned:', message.sessionId);\r\n }\r\n if (message.iceServers) {\r\n this._iceServers.next(message.iceServers);\r\n console.log('[Signalling] ICE servers received:', message.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 this._peers.next(message.peers);\r\n console.log('[Signalling] Peer list updated, count:', message.peers.length);\r\n } else {\r\n console.log('[Signalling] No peers in check.response');\r\n }\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","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\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\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\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 ): Promise<void> {\r\n this._connectionState.next('connecting');\r\n\r\n if (role === PeerRole.HOST || enableVideo || enableAudio) {\r\n await this.startLocalMedia(enableVideo, enableAudio);\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 setTimeout(() => {\r\n console.log('[WebRTC] Sending peer check with role:', role);\r\n this.signalling.sendCheck(role);\r\n }, 1000);\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(enableVideo: boolean = true, enableAudio: boolean = true): Promise<void> {\r\n try {\r\n const constraints: MediaConstraintsConfig = {\r\n video: enableVideo ? this.defaultMediaConstraints.video : false,\r\n audio: enableAudio ? this.defaultMediaConstraints.audio : false\r\n };\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('Local media started:', this.localStream);\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 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 switch (message.type) {\r\n case 'peer.check':\r\n if (message.fromPeerId) {\r\n console.log('[WebRTC] Handling peer check from:', message.fromUsername, message.fromPeerId);\r\n await this.handlePeerCheck(message.fromPeerId, message.fromUserId!, message.fromUsername!, message.peerRole!);\r\n }\r\n break;\r\n\r\n case 'offer':\r\n if (message.fromPeerId && message.sdp) {\r\n await this.handleOffer(message.fromPeerId, message.fromUserId!, message.fromUsername!, message.sdp);\r\n }\r\n break;\r\n\r\n case 'answer':\r\n if (message.fromPeerId && message.sdp) {\r\n await this.handleAnswer(message.fromPeerId, message.sdp);\r\n }\r\n break;\r\n\r\n case 'ice_candidate':\r\n if (message.fromPeerId && message.candidate) {\r\n await this.handleIceCandidate(message.fromPeerId, message.candidate);\r\n }\r\n break;\r\n\r\n case 'peer.state_update':\r\n this.handlePeerStateUpdate(message);\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 async handlePeerCheck(peerId: string, userId: number, username: string, role: PeerRole): Promise<void> {\r\n if (!this.peerConnections.has(peerId)) {\r\n console.log(`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(role);\r\n\r\n if (shouldInitiate) {\r\n const offer = await pc.createOffer();\r\n await pc.setLocalDescription(offer);\r\n\r\n if (pc.localDescription) {\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 }\r\n }\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 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 this.localStream.getTracks().forEach(track => {\r\n pc.addTrack(track, this.localStream!);\r\n });\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 } else if (pc.connectionState === 'failed' || pc.connectionState === '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 dataChannel.onopen = () => {\r\n console.log(`Data channel opened with peer ${peerId}`);\r\n };\r\n\r\n dataChannel.onmessage = (event) => {\r\n console.log(`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(`Data channel closed with peer ${peerId}`);\r\n };\r\n\r\n dataChannel.onerror = (error) => {\r\n console.error(`Data channel error with peer ${peerId}:`, error);\r\n };\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 connection = this.peerConnections.values().next().value;\r\n if (!connection) {\r\n console.warn('No peer connection 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 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\r\n private sendDataChannelMessage(peerId: string, message: DataChannelMessage): void {\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;\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;\r\n }\r\n\r\n try {\r\n connection.dataChannel.send(JSON.stringify(message));\r\n } catch (error) {\r\n console.error(`Error sending data channel message to peer ${peerId}:`, error);\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 shouldInitiateConnection(peerRole: PeerRole): boolean {\r\n const myPeers = Array.from(this.peerConnections.values());\r\n const iAmHost = myPeers.some(p => p.role === PeerRole.HOST);\r\n\r\n return iAmHost && peerRole !== PeerRole.HOST;\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
|
@@ -256,6 +256,7 @@ declare enum SignalType {
|
|
|
256
256
|
}
|
|
257
257
|
interface WebRTCSession extends BaseTimestampedModel {
|
|
258
258
|
id: string;
|
|
259
|
+
name?: string;
|
|
259
260
|
sessionType: WebRTCSessionType;
|
|
260
261
|
sessionStatus: WebRTCSessionStatus;
|
|
261
262
|
initiatedBy: number;
|
|
@@ -263,6 +264,8 @@ interface WebRTCSession extends BaseTimestampedModel {
|
|
|
263
264
|
initiatedByDetails?: User;
|
|
264
265
|
participantsList?: WebRTCPeer[];
|
|
265
266
|
participantsCount?: number;
|
|
267
|
+
canEdit?: boolean;
|
|
268
|
+
canDelete?: boolean;
|
|
266
269
|
startedAt: string;
|
|
267
270
|
endedAt?: string;
|
|
268
271
|
}
|
|
@@ -282,12 +285,19 @@ interface WebRTCPeer extends BaseTimestampedModel {
|
|
|
282
285
|
lastSeenAt: string;
|
|
283
286
|
}
|
|
284
287
|
interface WebRTCSessionCreate {
|
|
288
|
+
name?: string;
|
|
285
289
|
sessionType: WebRTCSessionType;
|
|
286
290
|
ccrvSessionIds?: number[];
|
|
287
291
|
}
|
|
292
|
+
interface WebRTCSessionUpdate {
|
|
293
|
+
name?: string;
|
|
294
|
+
sessionType?: WebRTCSessionType;
|
|
295
|
+
sessionStatus?: WebRTCSessionStatus;
|
|
296
|
+
}
|
|
288
297
|
interface WebRTCSessionQueryParams {
|
|
289
298
|
sessionType?: WebRTCSessionType;
|
|
290
299
|
sessionStatus?: WebRTCSessionStatus;
|
|
300
|
+
ccrvSessionId?: number;
|
|
291
301
|
limit?: number;
|
|
292
302
|
offset?: number;
|
|
293
303
|
}
|
|
@@ -960,6 +970,7 @@ declare class WebRTCSessionService extends BaseApiService {
|
|
|
960
970
|
getSessions(params?: WebRTCSessionQueryParams): Observable<PaginatedResponse$1<WebRTCSession>>;
|
|
961
971
|
getSession(id: string): Observable<WebRTCSession>;
|
|
962
972
|
createSession(data: WebRTCSessionCreate): Observable<WebRTCSession>;
|
|
973
|
+
updateSession(id: string, data: WebRTCSessionUpdate): Observable<WebRTCSession>;
|
|
963
974
|
endSession(id: string): Observable<{
|
|
964
975
|
message: string;
|
|
965
976
|
session_id: string;
|
|
@@ -970,4 +981,4 @@ declare class WebRTCSessionService extends BaseApiService {
|
|
|
970
981
|
}
|
|
971
982
|
|
|
972
983
|
export { CommunicationWebSocketService, CupcakeMintChocolate, DeliveryStatus, DeliveryStatusLabels, MessageService, MessageThreadService, MessageType, MessageTypeLabels, NotificationPriority, NotificationPriorityLabels, NotificationService, NotificationType, NotificationTypeLabels, PeerConnectionState, PeerRole, SignalType, ThreadParticipantService, WebRTCService, WebRTCSessionService, WebRTCSessionStatus, WebRTCSessionType, WebRTCSignallingService };
|
|
973
|
-
export type { ApiResponse, BaseTimestampedModel, BulkNotificationActionRequest, ChatMessage, ConnectionEstablishedEvent, DataChannelMessage, FileChunk, FileOfferData, FileTransferAccept, FileTransferProgress, FileTransferRequest, FileTransferState, MarkNotificationReadMessage, MarkNotificationReadRequest, MediaConstraintsConfig, Message, MessageCreateRequest, MessageQueryParams, MessageSearchRequest, MessageThread, MessageThreadCreateRequest, MessageThreadQueryParams, MessageThreadUpdateRequest, MessageUpdateRequest, NewMessageEvent, NewNotificationEvent, Notification, NotificationCreateRequest, NotificationMarkedReadEvent, NotificationQueryParams, NotificationUpdateEvent, NotificationUpdateRequest, PaginatedResponse, PeerConnection, PeerInfo, PingMessage, PongEvent, SubscribeThreadMessage, ThreadParticipant, ThreadParticipantQueryParams, ThreadParticipantRequest, ThreadSearchRequest, ThreadSubscriptionConfirmedEvent, ThreadSubscriptionDeniedEvent, ThreadUnsubscriptionConfirmedEvent, ThreadUpdateEvent, UnsubscribeThreadMessage, UserBasic, WebRTCConfig, WebRTCMessage, WebRTCPeer, WebRTCSession, WebRTCSessionCreate, WebRTCSessionQueryParams, WebRTCSignal, WebSocketIncomingMessage, WebSocketOutgoingMessage };
|
|
984
|
+
export type { ApiResponse, BaseTimestampedModel, BulkNotificationActionRequest, ChatMessage, ConnectionEstablishedEvent, DataChannelMessage, FileChunk, FileOfferData, FileTransferAccept, FileTransferProgress, FileTransferRequest, FileTransferState, MarkNotificationReadMessage, MarkNotificationReadRequest, MediaConstraintsConfig, Message, MessageCreateRequest, MessageQueryParams, MessageSearchRequest, MessageThread, MessageThreadCreateRequest, MessageThreadQueryParams, MessageThreadUpdateRequest, MessageUpdateRequest, NewMessageEvent, NewNotificationEvent, Notification, NotificationCreateRequest, NotificationMarkedReadEvent, NotificationQueryParams, NotificationUpdateEvent, NotificationUpdateRequest, PaginatedResponse, PeerConnection, PeerInfo, PingMessage, PongEvent, SubscribeThreadMessage, ThreadParticipant, ThreadParticipantQueryParams, ThreadParticipantRequest, ThreadSearchRequest, ThreadSubscriptionConfirmedEvent, ThreadSubscriptionDeniedEvent, ThreadUnsubscriptionConfirmedEvent, ThreadUpdateEvent, UnsubscribeThreadMessage, UserBasic, WebRTCConfig, WebRTCMessage, WebRTCPeer, WebRTCSession, WebRTCSessionCreate, WebRTCSessionQueryParams, WebRTCSessionUpdate, WebRTCSignal, WebSocketIncomingMessage, WebSocketOutgoingMessage };
|
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.11",
|
|
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",
|