@noatgnu/cupcake-mint-chocolate 1.2.18 → 1.2.20
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.
|
@@ -885,31 +885,37 @@ class WebRTCSignallingService {
|
|
|
885
885
|
}
|
|
886
886
|
}
|
|
887
887
|
handleConnectionEstablished(message) {
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
888
|
+
const peerId = message.peer_id || message.peerId;
|
|
889
|
+
const sessionId = message.session_id || message.sessionId;
|
|
890
|
+
const clientPeerId = message.client_peer_id || message.clientPeerId;
|
|
891
|
+
const isReconnection = message.is_reconnection !== undefined ? message.is_reconnection : message.isReconnection;
|
|
892
|
+
const iceServers = message.ice_servers || message.iceServers;
|
|
893
|
+
if (peerId) {
|
|
894
|
+
this._peerId.next(peerId);
|
|
895
|
+
console.log('[Signalling] Peer ID assigned:', peerId);
|
|
891
896
|
}
|
|
892
|
-
if (
|
|
893
|
-
this._sessionId.next(
|
|
894
|
-
console.log('[Signalling] Session ID assigned:',
|
|
897
|
+
if (sessionId) {
|
|
898
|
+
this._sessionId.next(sessionId);
|
|
899
|
+
console.log('[Signalling] Session ID assigned:', sessionId);
|
|
895
900
|
}
|
|
896
|
-
if (
|
|
897
|
-
this.setClientPeerId(
|
|
898
|
-
console.log('[Signalling] Client Peer ID received:',
|
|
901
|
+
if (clientPeerId) {
|
|
902
|
+
this.setClientPeerId(clientPeerId);
|
|
903
|
+
console.log('[Signalling] Client Peer ID received:', clientPeerId);
|
|
899
904
|
}
|
|
900
|
-
if (
|
|
901
|
-
console.log('[Signalling] Is reconnection:',
|
|
905
|
+
if (isReconnection !== undefined) {
|
|
906
|
+
console.log('[Signalling] Is reconnection:', isReconnection);
|
|
902
907
|
}
|
|
903
|
-
if (
|
|
904
|
-
this._iceServers.next(
|
|
905
|
-
console.log('[Signalling] ICE servers received:',
|
|
908
|
+
if (iceServers) {
|
|
909
|
+
this._iceServers.next(iceServers);
|
|
910
|
+
console.log('[Signalling] ICE servers received:', iceServers);
|
|
906
911
|
}
|
|
907
912
|
console.log('[Signalling] WebRTC connection established:', message);
|
|
908
913
|
}
|
|
909
914
|
handleCheckResponse(message) {
|
|
910
915
|
console.log('[Signalling] Received check.response with peers:', message.peers);
|
|
911
916
|
if (message.peers) {
|
|
912
|
-
const normalizedPeers = message.peers
|
|
917
|
+
const normalizedPeers = message.peers
|
|
918
|
+
.map((peer) => ({
|
|
913
919
|
id: peer.id,
|
|
914
920
|
userId: peer.user_id || peer.userId,
|
|
915
921
|
username: peer.username,
|
|
@@ -918,11 +924,22 @@ class WebRTCSignallingService {
|
|
|
918
924
|
hasVideo: peer.has_video !== undefined ? peer.has_video : peer.hasVideo,
|
|
919
925
|
hasAudio: peer.has_audio !== undefined ? peer.has_audio : peer.hasAudio,
|
|
920
926
|
hasScreenShare: peer.has_screen_share !== undefined ? peer.has_screen_share : peer.hasScreenShare
|
|
921
|
-
}))
|
|
927
|
+
}))
|
|
928
|
+
.filter(peer => {
|
|
929
|
+
if (peer.id === this._peerId.value) {
|
|
930
|
+
console.log('[Signalling] Filtering out self from peer list:', peer.id);
|
|
931
|
+
return false;
|
|
932
|
+
}
|
|
933
|
+
if (peer.connectionState === 'disconnected') {
|
|
934
|
+
console.log('[Signalling] Filtering out disconnected peer:', peer.username, peer.id);
|
|
935
|
+
return false;
|
|
936
|
+
}
|
|
937
|
+
return true;
|
|
938
|
+
});
|
|
922
939
|
this._peers.next(normalizedPeers);
|
|
923
|
-
console.log('[Signalling] Peer list updated, count:', normalizedPeers.length);
|
|
940
|
+
console.log('[Signalling] Peer list updated, active count:', normalizedPeers.length);
|
|
924
941
|
normalizedPeers.forEach(peer => {
|
|
925
|
-
console.log('[Signalling] Discovered peer from check.response:', peer.username, peer.id, 'userId:', peer.userId, 'role:', peer.peerRole);
|
|
942
|
+
console.log('[Signalling] Discovered peer from check.response:', peer.username, peer.id, 'userId:', peer.userId, 'role:', peer.peerRole, 'state:', peer.connectionState);
|
|
926
943
|
const peerCheckMessage = {
|
|
927
944
|
type: 'peer.check',
|
|
928
945
|
fromPeerId: peer.id,
|
|
@@ -1043,6 +1060,7 @@ class WebRTCService {
|
|
|
1043
1060
|
signallingSubscription;
|
|
1044
1061
|
fileTransfers = new Map();
|
|
1045
1062
|
DEFAULT_CHUNK_SIZE = 16384;
|
|
1063
|
+
role = PeerRole.PARTICIPANT;
|
|
1046
1064
|
_localStreamReady = new BehaviorSubject(false);
|
|
1047
1065
|
_remoteStreams = new BehaviorSubject(new Map());
|
|
1048
1066
|
_connectionState = new BehaviorSubject('disconnected');
|
|
@@ -1080,8 +1098,10 @@ class WebRTCService {
|
|
|
1080
1098
|
this.zone = zone;
|
|
1081
1099
|
}
|
|
1082
1100
|
async startSession(sessionId, role = PeerRole.PARTICIPANT, enableVideo = true, enableAudio = true) {
|
|
1101
|
+
this.role = role;
|
|
1083
1102
|
this._connectionState.next('connecting');
|
|
1084
|
-
|
|
1103
|
+
console.log('[WebRTC] Starting session with role:', role);
|
|
1104
|
+
if (enableVideo || enableAudio) {
|
|
1085
1105
|
await this.startLocalMedia(enableVideo, enableAudio);
|
|
1086
1106
|
}
|
|
1087
1107
|
this.signalling.connect(sessionId);
|
|
@@ -1090,10 +1110,12 @@ class WebRTCService {
|
|
|
1090
1110
|
this.handleSignallingMessage(message);
|
|
1091
1111
|
}
|
|
1092
1112
|
});
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1113
|
+
this.signalling.peerId$.subscribe(peerId => {
|
|
1114
|
+
if (peerId) {
|
|
1115
|
+
console.log('[WebRTC] Peer ID assigned, sending check with role:', role);
|
|
1116
|
+
this.signalling.sendCheck(role);
|
|
1117
|
+
}
|
|
1118
|
+
});
|
|
1097
1119
|
this.signalling.peers$.subscribe(peers => {
|
|
1098
1120
|
console.log('[WebRTC] Peers list updated:', peers);
|
|
1099
1121
|
this._activePeers.next(peers);
|
|
@@ -1205,11 +1227,16 @@ class WebRTCService {
|
|
|
1205
1227
|
}
|
|
1206
1228
|
}
|
|
1207
1229
|
async handlePeerCheck(peerId, userId, username, role) {
|
|
1230
|
+
if (peerId === this.signalling.peerId) {
|
|
1231
|
+
console.log(`[WebRTC] Ignoring peer check from self: ${peerId}`);
|
|
1232
|
+
return;
|
|
1233
|
+
}
|
|
1208
1234
|
if (!this.peerConnections.has(peerId)) {
|
|
1209
|
-
console.log(`New peer discovered: ${username} (${peerId}) as ${role}`);
|
|
1235
|
+
console.log(`[WebRTC] New peer discovered: ${username} (${peerId}) as ${role}`);
|
|
1210
1236
|
const pc = await this.createPeerConnection(peerId, userId, username, role);
|
|
1211
|
-
const shouldInitiate = this.shouldInitiateConnection(role);
|
|
1237
|
+
const shouldInitiate = this.shouldInitiateConnection(peerId, role);
|
|
1212
1238
|
if (shouldInitiate) {
|
|
1239
|
+
console.log(`[WebRTC] Initiating connection to ${username} (${peerId})`);
|
|
1213
1240
|
const offer = await pc.createOffer();
|
|
1214
1241
|
await pc.setLocalDescription(offer);
|
|
1215
1242
|
if (pc.localDescription) {
|
|
@@ -1220,6 +1247,12 @@ class WebRTCService {
|
|
|
1220
1247
|
}
|
|
1221
1248
|
}
|
|
1222
1249
|
}
|
|
1250
|
+
else {
|
|
1251
|
+
console.log(`[WebRTC] Waiting for ${username} (${peerId}) to initiate connection`);
|
|
1252
|
+
}
|
|
1253
|
+
}
|
|
1254
|
+
else {
|
|
1255
|
+
console.log(`[WebRTC] Peer connection already exists for: ${peerId}`);
|
|
1223
1256
|
}
|
|
1224
1257
|
}
|
|
1225
1258
|
async handleOffer(peerId, userId, username, sdp) {
|
|
@@ -1492,10 +1525,16 @@ class WebRTCService {
|
|
|
1492
1525
|
this._remoteStreams.next(streams);
|
|
1493
1526
|
console.log(`Closed peer connection with ${peerId}`);
|
|
1494
1527
|
}
|
|
1495
|
-
shouldInitiateConnection(peerRole) {
|
|
1496
|
-
const
|
|
1497
|
-
|
|
1498
|
-
|
|
1528
|
+
shouldInitiateConnection(targetPeerId, peerRole) {
|
|
1529
|
+
const myPeerId = this.signalling.peerId;
|
|
1530
|
+
if (!myPeerId) {
|
|
1531
|
+
console.log('[WebRTC] No peer ID yet, cannot determine initiation');
|
|
1532
|
+
return false;
|
|
1533
|
+
}
|
|
1534
|
+
const shouldInitiate = myPeerId < targetPeerId;
|
|
1535
|
+
console.log(`[WebRTC] Connection initiation: myId(${myPeerId.substring(0, 8)}...) < targetId(${targetPeerId.substring(0, 8)}...) = ${shouldInitiate}`);
|
|
1536
|
+
console.log(`[WebRTC] Roles (for info only): My role: ${this.role}, Target role: ${peerRole}`);
|
|
1537
|
+
return shouldInitiate;
|
|
1499
1538
|
}
|
|
1500
1539
|
replaceTracksInAllPeers() {
|
|
1501
1540
|
if (!this.localStream)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"noatgnu-cupcake-mint-chocolate.mjs","sources":["../../../projects/cupcake-mint-chocolate/src/lib/cupcake-mint-chocolate.ts","../../../projects/cupcake-mint-chocolate/src/lib/models/enums.ts","../../../projects/cupcake-mint-chocolate/src/lib/models/webrtc.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/notification.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/message-thread.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/message.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/thread-participant.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/communication-websocket.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/webrtc-signalling.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/webrtc.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/webrtc-session.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/index.ts","../../../projects/cupcake-mint-chocolate/src/public-api.ts","../../../projects/cupcake-mint-chocolate/src/noatgnu-cupcake-mint-chocolate.ts"],"sourcesContent":["import { Component } from '@angular/core';\n\n@Component({\n selector: 'ccmc-cupcake-mint-chocolate',\n imports: [],\n template: `\n <p>\n cupcake-mint-chocolate works!\n </p>\n `,\n styles: ``\n})\nexport class CupcakeMintChocolate {\n\n}\n","export enum NotificationType {\r\n SYSTEM = 'system',\r\n MAINTENANCE = 'maintenance',\r\n INVENTORY = 'inventory',\r\n BILLING = 'billing',\r\n PROJECT = 'project',\r\n PROTOCOL = 'protocol',\r\n DOCUMENT = 'document',\r\n USER = 'user'\r\n}\r\n\r\nexport const NotificationTypeLabels: Record<NotificationType, string> = {\r\n [NotificationType.SYSTEM]: 'System',\r\n [NotificationType.MAINTENANCE]: 'Maintenance',\r\n [NotificationType.INVENTORY]: 'Inventory',\r\n [NotificationType.BILLING]: 'Billing',\r\n [NotificationType.PROJECT]: 'Project',\r\n [NotificationType.PROTOCOL]: 'Protocol',\r\n [NotificationType.DOCUMENT]: 'Document',\r\n [NotificationType.USER]: 'User'\r\n};\r\n\r\nexport enum NotificationPriority {\r\n LOW = 'low',\r\n NORMAL = 'normal',\r\n HIGH = 'high',\r\n URGENT = 'urgent'\r\n}\r\n\r\nexport const NotificationPriorityLabels: Record<NotificationPriority, string> = {\r\n [NotificationPriority.LOW]: 'Low',\r\n [NotificationPriority.NORMAL]: 'Normal',\r\n [NotificationPriority.HIGH]: 'High',\r\n [NotificationPriority.URGENT]: 'Urgent'\r\n};\r\n\r\nexport enum DeliveryStatus {\r\n PENDING = 'pending',\r\n SENT = 'sent',\r\n DELIVERED = 'delivered',\r\n FAILED = 'failed',\r\n READ = 'read'\r\n}\r\n\r\nexport const DeliveryStatusLabels: Record<DeliveryStatus, string> = {\r\n [DeliveryStatus.PENDING]: 'Pending',\r\n [DeliveryStatus.SENT]: 'Sent',\r\n [DeliveryStatus.DELIVERED]: 'Delivered',\r\n [DeliveryStatus.FAILED]: 'Failed',\r\n [DeliveryStatus.READ]: 'Read'\r\n};\r\n\r\nexport enum MessageType {\r\n DIRECT = 'direct',\r\n THREAD = 'thread',\r\n BROADCAST = 'broadcast',\r\n SYSTEM = 'system'\r\n}\r\n\r\nexport const MessageTypeLabels: Record<MessageType, string> = {\r\n [MessageType.DIRECT]: 'Direct Message',\r\n [MessageType.THREAD]: 'Thread Reply',\r\n [MessageType.BROADCAST]: 'Broadcast',\r\n [MessageType.SYSTEM]: 'System Message'\r\n};","import { BaseTimestampedModel } from './base';\r\nimport { User } from '@noatgnu/cupcake-core';\r\n\r\nexport enum WebRTCSessionType {\r\n VIDEO_CALL = 'video_call',\r\n AUDIO_CALL = 'audio_call',\r\n SCREEN_SHARE = 'screen_share',\r\n DATA_CHANNEL = 'data_channel'\r\n}\r\n\r\nexport enum WebRTCSessionStatus {\r\n WAITING = 'waiting',\r\n ACTIVE = 'active',\r\n ENDED = 'ended'\r\n}\r\n\r\nexport enum PeerRole {\r\n HOST = 'host',\r\n VIEWER = 'viewer',\r\n PARTICIPANT = 'participant'\r\n}\r\n\r\nexport enum PeerConnectionState {\r\n CONNECTING = 'connecting',\r\n CONNECTED = 'connected',\r\n DISCONNECTED = 'disconnected',\r\n FAILED = 'failed'\r\n}\r\n\r\nexport enum SignalType {\r\n OFFER = 'offer',\r\n ANSWER = 'answer',\r\n ICE_CANDIDATE = 'ice_candidate',\r\n CHECK = 'check'\r\n}\r\n\r\nexport interface WebRTCSession extends BaseTimestampedModel {\r\n id: string;\r\n name?: string;\r\n isDefault: boolean;\r\n sessionType: WebRTCSessionType;\r\n sessionStatus: WebRTCSessionStatus;\r\n initiatedBy: number;\r\n initiatedByUsername?: string;\r\n initiatedByDetails?: User;\r\n participantsList?: WebRTCPeer[];\r\n participantsCount?: number;\r\n canEdit?: boolean;\r\n canDelete?: boolean;\r\n startedAt: string;\r\n endedAt?: string;\r\n}\r\n\r\nexport interface WebRTCPeer extends BaseTimestampedModel {\r\n id: string;\r\n session: string;\r\n user: number;\r\n username?: string;\r\n userDetails?: User;\r\n channelId: string;\r\n peerRole: PeerRole;\r\n connectionState: PeerConnectionState;\r\n hasVideo: boolean;\r\n hasAudio: boolean;\r\n hasScreenShare: boolean;\r\n joinedAt: string;\r\n lastSeenAt: string;\r\n}\r\n\r\nexport interface WebRTCSessionCreate {\r\n name?: string;\r\n sessionType: WebRTCSessionType;\r\n ccrvSessionIds?: number[];\r\n}\r\n\r\nexport interface WebRTCSessionUpdate {\r\n name?: string;\r\n sessionType?: WebRTCSessionType;\r\n sessionStatus?: WebRTCSessionStatus;\r\n isDefault?: boolean;\r\n}\r\n\r\nexport interface WebRTCSessionQueryParams {\r\n sessionType?: WebRTCSessionType;\r\n sessionStatus?: WebRTCSessionStatus;\r\n ccrvSessionId?: number;\r\n limit?: number;\r\n offset?: number;\r\n}\r\n\r\nexport interface WebRTCSignal extends BaseTimestampedModel {\r\n id: string;\r\n session: string;\r\n fromPeer: string;\r\n toPeer?: string;\r\n signalType: SignalType;\r\n signalData: any;\r\n delivered: boolean;\r\n}\r\n\r\nexport interface PeerInfo {\r\n id: string;\r\n userId: number;\r\n username: string;\r\n peerRole: PeerRole;\r\n connectionState: PeerConnectionState;\r\n hasVideo: boolean;\r\n hasAudio: boolean;\r\n hasScreenShare: boolean;\r\n}\r\n\r\nexport interface WebRTCMessage {\r\n type: 'connection.established' | 'check.response' | 'peer.check' | 'offer' | 'answer' | 'ice_candidate' | 'peer.state_update' | 'peer.joined' | 'peer.left' | 'heartbeat.response' | 'error';\r\n message?: string;\r\n peerId?: string;\r\n clientPeerId?: string;\r\n sessionId?: string;\r\n userId?: number;\r\n username?: string;\r\n fromPeerId?: string;\r\n fromUserId?: number;\r\n fromUsername?: string;\r\n toPeerId?: string;\r\n sdp?: RTCSessionDescriptionInit;\r\n candidate?: RTCIceCandidateInit;\r\n peers?: PeerInfo[];\r\n peerRole?: PeerRole;\r\n connectionState?: PeerConnectionState;\r\n hasVideo?: boolean;\r\n hasAudio?: boolean;\r\n hasScreenShare?: boolean;\r\n iceServers?: RTCIceServer[];\r\n timestamp?: string;\r\n isReconnection?: boolean;\r\n}\r\n\r\nexport interface WebRTCConfig {\r\n iceServers: RTCIceServer[];\r\n iceCandidatePoolSize?: number;\r\n iceTransportPolicy?: RTCIceTransportPolicy;\r\n bundlePolicy?: RTCBundlePolicy;\r\n rtcpMuxPolicy?: RTCRtcpMuxPolicy;\r\n}\r\n\r\nexport interface MediaConstraintsConfig {\r\n video?: boolean | MediaTrackConstraints;\r\n audio?: boolean | MediaTrackConstraints;\r\n}\r\n\r\nexport interface PeerConnection {\r\n peerId: string;\r\n userId: number;\r\n username: string;\r\n pc: RTCPeerConnection;\r\n dataChannel?: RTCDataChannel;\r\n stream?: MediaStream;\r\n role: PeerRole;\r\n offered: boolean;\r\n answered: boolean;\r\n connected: boolean;\r\n queuedCandidates: RTCIceCandidate[];\r\n}\r\n\r\nexport interface ChatMessage {\r\n type: 'chat';\r\n peerId: string;\r\n userId: number;\r\n username: string;\r\n message: string;\r\n timestamp: string;\r\n fileOffer?: FileOfferData;\r\n}\r\n\r\nexport interface FileOfferData {\r\n fileId: string;\r\n fileName: string;\r\n fileSize: number;\r\n fileType: string;\r\n chunkSize: number;\r\n totalChunks: number;\r\n}\r\n\r\nexport interface FileTransferRequest {\r\n type: 'file_request';\r\n fileId: string;\r\n requesterId: string;\r\n}\r\n\r\nexport interface FileTransferAccept {\r\n type: 'file_accept';\r\n fileId: string;\r\n toPeerId: string;\r\n}\r\n\r\nexport interface FileChunk {\r\n type: 'file_chunk';\r\n fileId: string;\r\n chunkIndex: number;\r\n totalChunks: number;\r\n data: ArrayBuffer;\r\n isLast: boolean;\r\n}\r\n\r\nexport interface FileTransferProgress {\r\n fileId: string;\r\n fileName: string;\r\n fileSize: number;\r\n chunksReceived: number;\r\n totalChunks: number;\r\n bytesReceived: number;\r\n percentage: number;\r\n}\r\n\r\nexport interface FileTransferState {\r\n fileId: string;\r\n fileName: string;\r\n fileSize: number;\r\n fileType: string;\r\n file?: File;\r\n chunks: Map<number, ArrayBuffer>;\r\n totalChunks: number;\r\n chunkSize: number;\r\n sentChunks: number;\r\n receivedChunks: number;\r\n status: 'pending' | 'transferring' | 'completed' | 'failed';\r\n requestedBy: Set<string>;\r\n streamWriter?: WritableStreamDefaultWriter<Uint8Array>;\r\n downloadStream?: WritableStream<Uint8Array>;\r\n}\r\n\r\nexport interface DataChannelMessage {\r\n type: 'chat' | 'ping' | 'pong' | 'file_request' | 'file_accept' | 'file_chunk' | 'file_complete' | 'file_cancel';\r\n data: any;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n Notification,\r\n NotificationCreateRequest,\r\n NotificationUpdateRequest,\r\n MarkNotificationReadRequest,\r\n BulkNotificationActionRequest,\r\n NotificationType,\r\n NotificationPriority,\r\n DeliveryStatus,\r\n PaginatedResponse,\r\n NotificationQueryParams\r\n} from '../models';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NotificationService extends BaseApiService {\r\n\r\n /**\r\n * Get all notifications with optional filtering\r\n */\r\n getNotifications(params?: NotificationQueryParams): Observable<PaginatedResponse<Notification>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<Notification>>(`${this.apiUrl}/notifications/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single notification by ID\r\n */\r\n getNotification(id: string): Observable<Notification> {\r\n return this.get<Notification>(`${this.apiUrl}/notifications/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new notification\r\n */\r\n createNotification(notification: NotificationCreateRequest): Observable<Notification> {\r\n return this.post<Notification>(`${this.apiUrl}/notifications/`, notification);\r\n }\r\n\r\n /**\r\n * Update an existing notification\r\n */\r\n updateNotification(id: string, notification: NotificationUpdateRequest): Observable<Notification> {\r\n return this.put<Notification>(`${this.apiUrl}/notifications/${id}/`, notification);\r\n }\r\n\r\n /**\r\n * Partially update a notification\r\n */\r\n patchNotification(id: string, notification: Partial<NotificationUpdateRequest>): Observable<Notification> {\r\n return this.patch<Notification>(`${this.apiUrl}/notifications/${id}/`, notification);\r\n }\r\n\r\n /**\r\n * Delete a notification\r\n */\r\n deleteNotification(id: string): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/notifications/${id}/`);\r\n }\r\n\r\n /**\r\n * Mark a notification as read/unread\r\n */\r\n markNotificationRead(id: string, request: MarkNotificationReadRequest): Observable<Notification> {\r\n return this.post<Notification>(`${this.apiUrl}/notifications/${id}/mark_read/`, request);\r\n }\r\n\r\n\r\n /**\r\n * Get unread notifications for current user\r\n */\r\n getUnreadNotifications(): Observable<PaginatedResponse<Notification>> {\r\n return this.get<PaginatedResponse<Notification>>(`${this.apiUrl}/notifications/unread/`);\r\n }\r\n\r\n /**\r\n * Get notification statistics for current user\r\n */\r\n getNotificationStats(): Observable<{\r\n total: number;\r\n unread: number;\r\n byType: { [key: string]: number };\r\n byPriority: { [key: string]: number };\r\n }> {\r\n return this.get<{\r\n total: number;\r\n unread: number;\r\n byType: { [key: string]: number };\r\n byPriority: { [key: string]: number };\r\n }>(`${this.apiUrl}/notifications/stats/`);\r\n }\r\n\r\n /**\r\n * Mark all notifications as read for current user\r\n */\r\n markAllNotificationsRead(): Observable<{ success: boolean; message: string }> {\r\n return this.post<{ success: boolean; message: string }>(`${this.apiUrl}/notifications/mark_all_read/`, {});\r\n }\r\n\r\n /**\r\n * Search notifications by title or message\r\n */\r\n searchNotifications(query: string): Observable<PaginatedResponse<Notification>> {\r\n return this.getNotifications({ search: query });\r\n }\r\n\r\n /**\r\n * Get notifications by type\r\n */\r\n getNotificationsByType(type: NotificationType): Observable<PaginatedResponse<Notification>> {\r\n return this.getNotifications({ notificationType: type });\r\n }\r\n\r\n /**\r\n * Get notifications by priority\r\n */\r\n getNotificationsByPriority(priority: NotificationPriority): Observable<PaginatedResponse<Notification>> {\r\n return this.getNotifications({ priority });\r\n }\r\n\r\n /**\r\n * Get notifications by sender\r\n */\r\n getNotificationsBySender(senderId: number): Observable<PaginatedResponse<Notification>> {\r\n return this.getNotifications({ sender: senderId });\r\n }\r\n\r\n /**\r\n * Get notifications by delivery status\r\n */\r\n getNotificationsByStatus(status: DeliveryStatus): Observable<PaginatedResponse<Notification>> {\r\n return this.getNotifications({ deliveryStatus: status });\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n MessageThread,\r\n MessageThreadCreateRequest,\r\n MessageThreadUpdateRequest,\r\n ThreadParticipantRequest,\r\n ThreadSearchRequest,\r\n ThreadParticipant,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\nexport interface MessageThreadQueryParams {\r\n search?: string;\r\n isPrivate?: boolean;\r\n isArchived?: boolean;\r\n creator?: number;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MessageThreadService extends BaseApiService {\r\n\r\n /**\r\n * Get all message threads with optional filtering\r\n */\r\n getMessageThreads(params?: MessageThreadQueryParams): Observable<PaginatedResponse<MessageThread>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<MessageThread>>(`${this.apiUrl}/threads/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single message thread by ID\r\n */\r\n getMessageThread(id: string): Observable<MessageThread> {\r\n return this.get<MessageThread>(`${this.apiUrl}/threads/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new message thread\r\n */\r\n createMessageThread(thread: MessageThreadCreateRequest): Observable<MessageThread> {\r\n return this.post<MessageThread>(`${this.apiUrl}/threads/`, thread);\r\n }\r\n\r\n /**\r\n * Update an existing message thread\r\n */\r\n updateMessageThread(id: string, thread: MessageThreadUpdateRequest): Observable<MessageThread> {\r\n return this.put<MessageThread>(`${this.apiUrl}/threads/${id}/`, thread);\r\n }\r\n\r\n /**\r\n * Partially update a message thread\r\n */\r\n patchMessageThread(id: string, thread: Partial<MessageThreadUpdateRequest>): Observable<MessageThread> {\r\n return this.patch<MessageThread>(`${this.apiUrl}/threads/${id}/`, thread);\r\n }\r\n\r\n /**\r\n * Delete a message thread\r\n */\r\n deleteMessageThread(id: string): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/threads/${id}/`);\r\n }\r\n\r\n /**\r\n * Add participant to a thread\r\n */\r\n addParticipant(id: string, request: { username: string }): Observable<{ message: string; participant: ThreadParticipant }> {\r\n return this.post<{ message: string; participant: ThreadParticipant }>(`${this.apiUrl}/threads/${id}/add_participant/`, request);\r\n }\r\n\r\n /**\r\n * Remove participant from a thread\r\n */\r\n removeParticipant(id: string, request: { username: string }): Observable<{ message: string }> {\r\n return this.post<{ message: string }>(`${this.apiUrl}/threads/${id}/remove_participant/`, request);\r\n }\r\n\r\n /**\r\n * Get thread participants\r\n */\r\n getParticipants(id: string): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.get<PaginatedResponse<ThreadParticipant>>(`${this.apiUrl}/threads/${id}/participants/`);\r\n }\r\n\r\n /**\r\n * Archive/unarchive a thread (toggles state)\r\n */\r\n toggleArchiveThread(id: string): Observable<{ message: string; isArchived: boolean }> {\r\n return this.post<{ message: string; isArchived: boolean }>(`${this.apiUrl}/threads/${id}/archive/`, {});\r\n }\r\n\r\n /**\r\n * Mark thread as read for current user\r\n */\r\n markThreadAsRead(id: string): Observable<{ success: boolean; message: string }> {\r\n return this.post<{ success: boolean; message: string }>(`${this.apiUrl}/threads/${id}/mark_read/`, {});\r\n }\r\n\r\n\r\n /**\r\n * Search message threads by title or description\r\n */\r\n searchMessageThreads(query: string): Observable<PaginatedResponse<MessageThread>> {\r\n return this.getMessageThreads({ search: query });\r\n }\r\n\r\n /**\r\n * Get private threads only\r\n */\r\n getPrivateThreads(): Observable<PaginatedResponse<MessageThread>> {\r\n return this.getMessageThreads({ isPrivate: true });\r\n }\r\n\r\n /**\r\n * Get public threads only\r\n */\r\n getPublicThreads(): Observable<PaginatedResponse<MessageThread>> {\r\n return this.getMessageThreads({ isPrivate: false });\r\n }\r\n\r\n /**\r\n * Get archived threads\r\n */\r\n getArchivedThreads(): Observable<PaginatedResponse<MessageThread>> {\r\n return this.getMessageThreads({ isArchived: true });\r\n }\r\n\r\n /**\r\n * Get active threads (non-archived)\r\n */\r\n getActiveThreads(): Observable<PaginatedResponse<MessageThread>> {\r\n return this.getMessageThreads({ isArchived: false });\r\n }\r\n\r\n /**\r\n * Get threads created by a specific user\r\n */\r\n getThreadsByCreator(creatorId: number): Observable<PaginatedResponse<MessageThread>> {\r\n return this.getMessageThreads({ creator: creatorId });\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n Message,\r\n MessageCreateRequest,\r\n MessageUpdateRequest,\r\n MessageSearchRequest,\r\n MessageType,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\nexport interface MessageQueryParams {\r\n search?: string;\r\n thread?: string;\r\n messageType?: MessageType;\r\n sender?: number;\r\n isDeleted?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MessageService extends BaseApiService {\r\n\r\n /**\r\n * Get all messages with optional filtering\r\n */\r\n getMessages(params?: MessageQueryParams): Observable<PaginatedResponse<Message>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<Message>>(`${this.apiUrl}/messages/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single message by ID\r\n */\r\n getMessage(id: string): Observable<Message> {\r\n return this.get<Message>(`${this.apiUrl}/messages/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new message\r\n */\r\n createMessage(message: MessageCreateRequest): Observable<Message> {\r\n return this.post<Message>(`${this.apiUrl}/messages/`, message);\r\n }\r\n\r\n /**\r\n * Update an existing message\r\n */\r\n updateMessage(id: string, message: MessageUpdateRequest): Observable<Message> {\r\n return this.put<Message>(`${this.apiUrl}/messages/${id}/`, message);\r\n }\r\n\r\n /**\r\n * Partially update a message\r\n */\r\n patchMessage(id: string, message: Partial<MessageUpdateRequest>): Observable<Message> {\r\n return this.patch<Message>(`${this.apiUrl}/messages/${id}/`, message);\r\n }\r\n\r\n /**\r\n * Delete a message (soft delete)\r\n */\r\n deleteMessage(id: string): Observable<Message> {\r\n return this.delete<Message>(`${this.apiUrl}/messages/${id}/`);\r\n }\r\n\r\n\r\n /**\r\n * Get messages in a specific thread\r\n */\r\n getThreadMessages(threadId: string, params?: Omit<MessageQueryParams, 'thread'>): Observable<PaginatedResponse<Message>> {\r\n const queryParams = { ...params, thread: threadId };\r\n return this.getMessages(queryParams);\r\n }\r\n\r\n /**\r\n * Search messages by content\r\n */\r\n searchMessages(query: string, threadId?: string): Observable<PaginatedResponse<Message>> {\r\n const params: MessageQueryParams = { search: query };\r\n if (threadId) {\r\n params.thread = threadId;\r\n }\r\n return this.getMessages(params);\r\n }\r\n\r\n /**\r\n * Get messages by sender\r\n */\r\n getMessagesBySender(senderId: number, threadId?: string): Observable<PaginatedResponse<Message>> {\r\n const params: MessageQueryParams = { sender: senderId };\r\n if (threadId) {\r\n params.thread = threadId;\r\n }\r\n return this.getMessages(params);\r\n }\r\n\r\n /**\r\n * Get messages by type\r\n */\r\n getMessagesByType(messageType: MessageType, threadId?: string): Observable<PaginatedResponse<Message>> {\r\n const params: MessageQueryParams = { messageType };\r\n if (threadId) {\r\n params.thread = threadId;\r\n }\r\n return this.getMessages(params);\r\n }\r\n\r\n /**\r\n * Get deleted messages (for moderation)\r\n */\r\n getDeletedMessages(threadId?: string): Observable<PaginatedResponse<Message>> {\r\n const params: MessageQueryParams = { isDeleted: true };\r\n if (threadId) {\r\n params.thread = threadId;\r\n }\r\n return this.getMessages(params);\r\n }\r\n\r\n /**\r\n * Get active messages (non-deleted)\r\n */\r\n getActiveMessages(threadId?: string): Observable<PaginatedResponse<Message>> {\r\n const params: MessageQueryParams = { isDeleted: false };\r\n if (threadId) {\r\n params.thread = threadId;\r\n }\r\n return this.getMessages(params);\r\n }\r\n\r\n /**\r\n * Reply to a message\r\n */\r\n replyToMessage(parentMessageId: string, content: string, threadId: string): Observable<Message> {\r\n const message: MessageCreateRequest = {\r\n thread: threadId,\r\n content,\r\n replyTo: parentMessageId\r\n };\r\n return this.createMessage(message);\r\n }\r\n}","import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\n\r\nimport {\r\n ThreadParticipant,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\nexport interface ThreadParticipantQueryParams {\r\n thread?: string;\r\n isModerator?: boolean;\r\n notificationsEnabled?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ThreadParticipantService {\r\n private http = inject(HttpClient);\r\n private apiUrl = '/api'; // This should be configurable\r\n\r\n /**\r\n * Get all thread participants with optional filtering\r\n */\r\n getThreadParticipants(params?: ThreadParticipantQueryParams): Observable<PaginatedResponse<ThreadParticipant>> {\r\n let httpParams = new HttpParams();\r\n \r\n if (params) {\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n httpParams = httpParams.set(key, value.toString());\r\n }\r\n });\r\n }\r\n\r\n return this.http.get<PaginatedResponse<ThreadParticipant>>(`${this.apiUrl}/thread-participants/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single thread participant by ID\r\n */\r\n getThreadParticipant(id: number): Observable<ThreadParticipant> {\r\n return this.http.get<ThreadParticipant>(`${this.apiUrl}/thread-participants/${id}/`);\r\n }\r\n\r\n /**\r\n * Update thread participant settings\r\n */\r\n updateThreadParticipant(id: number, updates: { isModerator?: boolean; notificationsEnabled?: boolean }): Observable<ThreadParticipant> {\r\n return this.http.patch<ThreadParticipant>(`${this.apiUrl}/thread-participants/${id}/`, updates);\r\n }\r\n\r\n /**\r\n * Update participant's last read timestamp\r\n */\r\n updateLastRead(id: number): Observable<ThreadParticipant> {\r\n return this.http.post<ThreadParticipant>(`${this.apiUrl}/thread-participants/${id}/update_last_read/`, {});\r\n }\r\n\r\n /**\r\n * Get participants for a specific thread\r\n */\r\n getParticipantsForThread(threadId: string): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.getThreadParticipants({ thread: threadId });\r\n }\r\n\r\n /**\r\n * Get moderators for a specific thread\r\n */\r\n getModeratorsForThread(threadId: string): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.getThreadParticipants({ thread: threadId, isModerator: true });\r\n }\r\n\r\n /**\r\n * Get non-moderator participants for a specific thread\r\n */\r\n getRegularParticipantsForThread(threadId: string): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.getThreadParticipants({ thread: threadId, isModerator: false });\r\n }\r\n\r\n /**\r\n * Get participants with notifications enabled for a specific thread\r\n */\r\n getNotificationEnabledParticipants(threadId: string): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.getThreadParticipants({ thread: threadId, notificationsEnabled: true });\r\n }\r\n\r\n /**\r\n * Get participants with notifications disabled for a specific thread\r\n */\r\n getNotificationDisabledParticipants(threadId: string): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.getThreadParticipants({ thread: threadId, notificationsEnabled: false });\r\n }\r\n\r\n /**\r\n * Toggle moderator status for a participant\r\n */\r\n toggleModeratorStatus(id: number): Observable<ThreadParticipant> {\r\n return this.http.post<ThreadParticipant>(`${this.apiUrl}/thread-participants/${id}/toggle_moderator/`, {});\r\n }\r\n\r\n /**\r\n * Toggle notifications for a participant\r\n */\r\n toggleNotifications(id: number): Observable<ThreadParticipant> {\r\n return this.http.post<ThreadParticipant>(`${this.apiUrl}/thread-participants/${id}/toggle_notifications/`, {});\r\n }\r\n\r\n /**\r\n * Leave a thread (for current user)\r\n */\r\n leaveThread(threadId: string): Observable<{ success: boolean; message: string }> {\r\n return this.http.post<{ success: boolean; message: string }>(`${this.apiUrl}/thread-participants/leave_thread/`, { thread: threadId });\r\n }\r\n\r\n /**\r\n * Get threads where current user is participant\r\n */\r\n getMyParticipations(): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.http.get<PaginatedResponse<ThreadParticipant>>(`${this.apiUrl}/thread-participants/my_participations/`);\r\n }\r\n\r\n /**\r\n * Get threads where current user is moderator\r\n */\r\n getMyModerations(): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.http.get<PaginatedResponse<ThreadParticipant>>(`${this.apiUrl}/thread-participants/my_moderations/`);\r\n }\r\n}","import { Injectable, OnDestroy } from '@angular/core';\r\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\r\nimport { filter, map } from 'rxjs/operators';\r\n\r\nimport { NotificationType, NotificationPriority, MessageType } from '../models';\r\n\r\nexport interface NewNotificationEvent {\r\n type: 'notification.new';\r\n notificationId: string;\r\n title: string;\r\n message: string;\r\n notificationType: NotificationType;\r\n priority: NotificationPriority;\r\n data: {\r\n alertType?: string;\r\n quantity?: number;\r\n link?: string;\r\n [key: string]: string | number | boolean | undefined;\r\n };\r\n timestamp: string;\r\n}\r\n\r\nexport interface NewMessageEvent {\r\n type: 'message.new';\r\n threadId: string;\r\n messageId: string;\r\n senderId: number;\r\n senderUsername: string;\r\n content: string;\r\n messageType: MessageType;\r\n timestamp: string;\r\n}\r\n\r\nexport interface ThreadUpdateEvent {\r\n type: 'thread.update';\r\n threadId: string;\r\n action: string;\r\n message: string;\r\n timestamp: string;\r\n}\r\n\r\nexport interface NotificationUpdateEvent {\r\n type: 'notification.update';\r\n notificationId: string;\r\n status: string;\r\n timestamp: string;\r\n}\r\n\r\nexport interface ConnectionEstablishedEvent {\r\n type: 'ccmc.connection.established';\r\n message: string;\r\n userId: number;\r\n username: string;\r\n}\r\n\r\nexport interface ThreadSubscriptionConfirmedEvent {\r\n type: 'thread.subscription.confirmed';\r\n threadId: string;\r\n}\r\n\r\nexport interface ThreadSubscriptionDeniedEvent {\r\n type: 'thread.subscription.denied';\r\n threadId: string;\r\n error: string;\r\n}\r\n\r\nexport interface ThreadUnsubscriptionConfirmedEvent {\r\n type: 'thread.unsubscription.confirmed';\r\n threadId: string;\r\n}\r\n\r\nexport interface NotificationMarkedReadEvent {\r\n type: 'notification.marked_read';\r\n notificationId: string;\r\n}\r\n\r\nexport interface PongEvent {\r\n type: 'pong';\r\n}\r\n\r\nexport type WebSocketIncomingMessage =\r\n | NewNotificationEvent\r\n | NewMessageEvent\r\n | ThreadUpdateEvent\r\n | NotificationUpdateEvent\r\n | ConnectionEstablishedEvent\r\n | ThreadSubscriptionConfirmedEvent\r\n | ThreadSubscriptionDeniedEvent\r\n | ThreadUnsubscriptionConfirmedEvent\r\n | NotificationMarkedReadEvent\r\n | PongEvent;\r\n\r\nexport interface SubscribeThreadMessage {\r\n type: 'subscribe_thread';\r\n thread_id: string;\r\n}\r\n\r\nexport interface UnsubscribeThreadMessage {\r\n type: 'unsubscribe_thread';\r\n thread_id: string;\r\n}\r\n\r\nexport interface MarkNotificationReadMessage {\r\n type: 'mark_notification_read';\r\n notification_id: string;\r\n}\r\n\r\nexport interface PingMessage {\r\n type: 'ping';\r\n}\r\n\r\nexport type WebSocketOutgoingMessage =\r\n | SubscribeThreadMessage\r\n | UnsubscribeThreadMessage\r\n | MarkNotificationReadMessage\r\n | PingMessage;\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CommunicationWebSocketService implements OnDestroy {\r\n private socket: WebSocket | null = null;\r\n private reconnectAttempts = 0;\r\n private maxReconnectAttempts = 5;\r\n private reconnectDelay = 3000;\r\n private reconnectTimer: number | null = null;\r\n\r\n private messageSubject = new Subject<WebSocketIncomingMessage>();\r\n private connectionStateSubject = new BehaviorSubject<'disconnected' | 'connecting' | 'connected'>('disconnected');\r\n\r\n public connectionState$ = this.connectionStateSubject.asObservable();\r\n public messages$ = this.messageSubject.asObservable();\r\n\r\n public newNotifications$: Observable<NewNotificationEvent> = this.messages$.pipe(\r\n filter((msg): msg is NewNotificationEvent => msg.type === 'notification.new')\r\n );\r\n\r\n public newMessages$: Observable<NewMessageEvent> = this.messages$.pipe(\r\n filter((msg): msg is NewMessageEvent => msg.type === 'message.new')\r\n );\r\n\r\n public threadUpdates$: Observable<ThreadUpdateEvent> = this.messages$.pipe(\r\n filter((msg): msg is ThreadUpdateEvent => msg.type === 'thread.update')\r\n );\r\n\r\n public notificationUpdates$: Observable<NotificationUpdateEvent> = this.messages$.pipe(\r\n filter((msg): msg is NotificationUpdateEvent => msg.type === 'notification.update')\r\n );\r\n\r\n connect(wsBaseUrl: string, token?: string): void {\r\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\r\n console.log('WebSocket already connected');\r\n return;\r\n }\r\n\r\n this.connectionStateSubject.next('connecting');\r\n\r\n const fullUrl = `${wsBaseUrl.replace(/\\/$/, '')}/ccmc/communications/`;\r\n const url = token ? `${fullUrl}?token=${token}` : fullUrl;\r\n this.socket = new WebSocket(url);\r\n\r\n this.socket.onopen = () => {\r\n console.log('CCMC WebSocket connected');\r\n this.connectionStateSubject.next('connected');\r\n this.reconnectAttempts = 0;\r\n };\r\n\r\n this.socket.onmessage = (event) => {\r\n try {\r\n const message = JSON.parse(event.data) as WebSocketIncomingMessage;\r\n this.messageSubject.next(message);\r\n\r\n if (message.type === 'ccmc.connection.established') {\r\n console.log('CCMC connection established:', message);\r\n }\r\n } catch (error) {\r\n console.error('Error parsing WebSocket message:', error);\r\n }\r\n };\r\n\r\n this.socket.onerror = (error) => {\r\n console.error('CCMC WebSocket error:', error);\r\n };\r\n\r\n this.socket.onclose = (event) => {\r\n console.log('CCMC WebSocket closed:', event.code, event.reason);\r\n this.connectionStateSubject.next('disconnected');\r\n\r\n if (this.reconnectAttempts < this.maxReconnectAttempts) {\r\n this.scheduleReconnect(wsBaseUrl, token);\r\n }\r\n };\r\n }\r\n\r\n private scheduleReconnect(wsBaseUrl: string, token?: string): void {\r\n this.reconnectAttempts++;\r\n const delay = this.reconnectDelay * this.reconnectAttempts;\r\n\r\n console.log(`Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`);\r\n\r\n this.reconnectTimer = setTimeout(() => {\r\n this.connect(wsBaseUrl, token);\r\n }, delay);\r\n }\r\n\r\n disconnect(): void {\r\n if (this.reconnectTimer) {\r\n clearTimeout(this.reconnectTimer);\r\n this.reconnectTimer = null;\r\n }\r\n\r\n if (this.socket) {\r\n this.socket.close();\r\n this.socket = null;\r\n }\r\n\r\n this.connectionStateSubject.next('disconnected');\r\n this.reconnectAttempts = 0;\r\n }\r\n\r\n subscribeToThread(threadId: string): void {\r\n const message: SubscribeThreadMessage = {\r\n type: 'subscribe_thread',\r\n thread_id: threadId\r\n };\r\n this.send(message);\r\n }\r\n\r\n unsubscribeFromThread(threadId: string): void {\r\n const message: UnsubscribeThreadMessage = {\r\n type: 'unsubscribe_thread',\r\n thread_id: threadId\r\n };\r\n this.send(message);\r\n }\r\n\r\n markNotificationAsRead(notificationId: string): void {\r\n const message: MarkNotificationReadMessage = {\r\n type: 'mark_notification_read',\r\n notification_id: notificationId\r\n };\r\n this.send(message);\r\n }\r\n\r\n ping(): void {\r\n const message: PingMessage = { type: 'ping' };\r\n this.send(message);\r\n }\r\n\r\n private send(message: WebSocketOutgoingMessage): void {\r\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\r\n this.socket.send(JSON.stringify(message));\r\n } else {\r\n console.warn('Cannot send message: WebSocket not connected');\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.disconnect();\r\n }\r\n\r\n isConnected(): boolean {\r\n return this.socket !== null && this.socket.readyState === WebSocket.OPEN;\r\n }\r\n\r\n getConnectionState(): 'disconnected' | 'connecting' | 'connected' {\r\n return this.connectionStateSubject.value;\r\n }\r\n}\r\n","import { Injectable, NgZone, inject } from '@angular/core';\r\nimport { webSocket, WebSocketSubject } from 'rxjs/webSocket';\r\nimport { BehaviorSubject, Subject, Subscription } from 'rxjs';\r\nimport { AuthService, CUPCAKE_CORE_CONFIG } from '@noatgnu/cupcake-core';\r\nimport {\r\n WebRTCMessage,\r\n PeerInfo,\r\n PeerRole,\r\n PeerConnectionState\r\n} from '../models/webrtc';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class WebRTCSignallingService {\r\n private ws?: WebSocketSubject<WebRTCMessage>;\r\n private wsSubscription?: Subscription;\r\n private baseUrl: string = '';\r\n private clientPeerId: string | null = null;\r\n private readonly CLIENT_PEER_ID_KEY = 'webrtc_client_peer_id';\r\n\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 this.clientPeerId = this.getClientPeerId();\r\n let wsUrl = `${this.baseUrl}/ccmc/webrtc/${sessionId}/?token=${token}`;\r\n\r\n if (this.clientPeerId) {\r\n wsUrl += `&client_peer_id=${this.clientPeerId}`;\r\n console.log('[Signalling] Reconnecting with client peer ID:', this.clientPeerId);\r\n } else {\r\n console.log('[Signalling] First connection, no client peer ID');\r\n }\r\n\r\n 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.joined':\r\n this.handlePeerJoined(message);\r\n break;\r\n\r\n case 'peer.left':\r\n this.handlePeerLeft(message);\r\n break;\r\n\r\n case 'peer.check':\r\n case 'offer':\r\n case 'answer':\r\n case 'ice_candidate':\r\n 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.clientPeerId) {\r\n this.setClientPeerId(message.clientPeerId);\r\n console.log('[Signalling] Client Peer ID received:', message.clientPeerId);\r\n }\r\n if (message.isReconnection !== undefined) {\r\n console.log('[Signalling] Is reconnection:', message.isReconnection);\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 const normalizedPeers = message.peers.map((peer: any) => ({\r\n id: peer.id,\r\n userId: peer.user_id || peer.userId,\r\n username: peer.username,\r\n peerRole: peer.peer_role || peer.peerRole,\r\n connectionState: peer.connection_state || peer.connectionState,\r\n hasVideo: peer.has_video !== undefined ? peer.has_video : peer.hasVideo,\r\n hasAudio: peer.has_audio !== undefined ? peer.has_audio : peer.hasAudio,\r\n hasScreenShare: peer.has_screen_share !== undefined ? peer.has_screen_share : peer.hasScreenShare\r\n }));\r\n\r\n this._peers.next(normalizedPeers);\r\n console.log('[Signalling] Peer list updated, count:', normalizedPeers.length);\r\n\r\n normalizedPeers.forEach(peer => {\r\n console.log('[Signalling] Discovered peer from check.response:', peer.username, peer.id, 'userId:', peer.userId, 'role:', peer.peerRole);\r\n const peerCheckMessage: WebRTCMessage = {\r\n type: 'peer.check',\r\n fromPeerId: peer.id,\r\n fromUserId: peer.userId,\r\n fromUsername: peer.username,\r\n peerRole: peer.peerRole\r\n };\r\n this._messages.next(peerCheckMessage);\r\n });\r\n } else {\r\n console.log('[Signalling] No peers in check.response');\r\n }\r\n }\r\n\r\n private handlePeerJoined(message: any): void {\r\n const peerId = message.peer_id || message.peerId;\r\n const userId = message.user_id || message.userId;\r\n const username = message.username;\r\n\r\n console.log('[Signalling] Peer joined:', username, peerId, 'userId:', userId);\r\n\r\n const newPeer: PeerInfo = {\r\n id: peerId,\r\n userId: userId,\r\n username: username,\r\n peerRole: PeerRole.PARTICIPANT,\r\n connectionState: PeerConnectionState.CONNECTING,\r\n hasVideo: false,\r\n hasAudio: false,\r\n hasScreenShare: false\r\n };\r\n\r\n const currentPeers = this._peers.value;\r\n if (!currentPeers.find(p => p.id === peerId)) {\r\n this._peers.next([...currentPeers, newPeer]);\r\n }\r\n\r\n const peerCheckMessage: WebRTCMessage = {\r\n type: 'peer.check',\r\n fromPeerId: peerId,\r\n fromUserId: userId,\r\n fromUsername: username,\r\n peerRole: PeerRole.PARTICIPANT\r\n };\r\n this._messages.next(peerCheckMessage);\r\n }\r\n\r\n private handlePeerLeft(message: any): void {\r\n const peerId = message.peer_id || message.peerId;\r\n const userId = message.user_id || message.userId;\r\n const username = message.username;\r\n\r\n console.log('[Signalling] Peer left:', username, peerId, 'userId:', userId);\r\n\r\n const currentPeers = this._peers.value;\r\n const filteredPeers = currentPeers.filter(p => p.id !== peerId);\r\n if (filteredPeers.length !== currentPeers.length) {\r\n this._peers.next(filteredPeers);\r\n }\r\n\r\n this._messages.next({\r\n type: 'peer.left',\r\n fromPeerId: peerId,\r\n fromUserId: userId,\r\n fromUsername: username\r\n });\r\n }\r\n\r\n get peerId(): string | null {\r\n return this._peerId.value;\r\n }\r\n\r\n get sessionId(): string | null {\r\n return this._sessionId.value;\r\n }\r\n\r\n get connected(): boolean {\r\n return this._connected.value;\r\n }\r\n\r\n get peers(): PeerInfo[] {\r\n return this._peers.value;\r\n }\r\n\r\n get iceServers(): RTCIceServer[] {\r\n return this._iceServers.value;\r\n }\r\n\r\n private getClientPeerId(): string | null {\r\n try {\r\n return sessionStorage.getItem(this.CLIENT_PEER_ID_KEY);\r\n } catch (error) {\r\n console.error('[Signalling] Error reading client peer ID from sessionStorage:', error);\r\n return null;\r\n }\r\n }\r\n\r\n private setClientPeerId(clientPeerId: string): void {\r\n try {\r\n sessionStorage.setItem(this.CLIENT_PEER_ID_KEY, clientPeerId);\r\n this.clientPeerId = clientPeerId;\r\n } catch (error) {\r\n console.error('[Signalling] Error saving client peer ID to sessionStorage:', error);\r\n }\r\n }\r\n\r\n clearClientPeerId(): void {\r\n try {\r\n sessionStorage.removeItem(this.CLIENT_PEER_ID_KEY);\r\n this.clientPeerId = null;\r\n console.log('[Signalling] Client peer ID cleared from sessionStorage');\r\n } catch (error) {\r\n console.error('[Signalling] Error clearing client peer ID from sessionStorage:', error);\r\n }\r\n }\r\n}\r\n","import { Injectable, NgZone } from '@angular/core';\r\nimport { BehaviorSubject, Subject, Subscription } from 'rxjs';\r\nimport { WebRTCSignallingService } from './webrtc-signalling';\r\nimport {\r\n WebRTCMessage,\r\n PeerConnection,\r\n PeerInfo,\r\n PeerRole,\r\n PeerConnectionState,\r\n WebRTCConfig,\r\n MediaConstraintsConfig,\r\n ChatMessage,\r\n DataChannelMessage,\r\n FileOfferData,\r\n FileTransferRequest,\r\n FileTransferAccept,\r\n FileChunk,\r\n FileTransferProgress,\r\n FileTransferState\r\n} from '../models/webrtc';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class WebRTCService {\r\n private peerConnections: Map<string, PeerConnection> = new Map();\r\n private localStream?: MediaStream;\r\n private signallingSubscription?: Subscription;\r\n private fileTransfers: Map<string, FileTransferState> = new Map();\r\n private readonly DEFAULT_CHUNK_SIZE = 16384;\r\n\r\n private _localStreamReady = new BehaviorSubject<boolean>(false);\r\n private _remoteStreams = new BehaviorSubject<Map<string, MediaStream>>(new Map());\r\n private _connectionState = new BehaviorSubject<'disconnected' | 'connecting' | 'connected'>('disconnected');\r\n private _activePeers = new BehaviorSubject<PeerInfo[]>([]);\r\n private _chatMessages = new Subject<ChatMessage>();\r\n private _fileTransferProgress = new Subject<FileTransferProgress>();\r\n private _dataChannelReady = new BehaviorSubject<boolean>(false);\r\n\r\n localStreamReady$ = this._localStreamReady.asObservable();\r\n remoteStreams$ = this._remoteStreams.asObservable();\r\n connectionState$ = this._connectionState.asObservable();\r\n activePeers$ = this._activePeers.asObservable();\r\n chatMessages$ = this._chatMessages.asObservable();\r\n fileTransferProgress$ = this._fileTransferProgress.asObservable();\r\n dataChannelReady$ = this._dataChannelReady.asObservable();\r\n\r\n private defaultConfig: WebRTCConfig = {\r\n iceServers: [\r\n { urls: 'stun:stun.l.google.com:19302' },\r\n { urls: 'stun:stun1.l.google.com:19302' }\r\n ],\r\n iceCandidatePoolSize: 10,\r\n iceTransportPolicy: 'all',\r\n bundlePolicy: 'max-bundle',\r\n rtcpMuxPolicy: 'require'\r\n };\r\n\r\n private defaultMediaConstraints: MediaConstraintsConfig = {\r\n video: {\r\n width: { ideal: 1280 },\r\n height: { ideal: 720 },\r\n frameRate: { ideal: 30 }\r\n },\r\n audio: true\r\n };\r\n\r\n constructor(\r\n private signalling: WebRTCSignallingService,\r\n private zone: NgZone\r\n ) {}\r\n\r\n async startSession(\r\n sessionId: string,\r\n role: PeerRole = PeerRole.PARTICIPANT,\r\n enableVideo: boolean = true,\r\n enableAudio: boolean = true\r\n ): 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 case 'peer.left':\r\n if (message.fromPeerId) {\r\n this.handlePeerLeft(message.fromPeerId);\r\n }\r\n break;\r\n }\r\n } catch (error) {\r\n console.error('Error handling signalling message:', error);\r\n }\r\n }\r\n\r\n private 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 handlePeerLeft(peerId: string): void {\r\n console.log(`[WebRTC] Peer left: ${peerId}`);\r\n\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection) {\r\n console.log(`[WebRTC] No connection found for peer: ${peerId}`);\r\n return;\r\n }\r\n\r\n if (connection.dataChannel) {\r\n connection.dataChannel.close();\r\n }\r\n\r\n connection.pc.close();\r\n\r\n this.peerConnections.delete(peerId);\r\n\r\n const streams = this._remoteStreams.value;\r\n streams.delete(peerId);\r\n this._remoteStreams.next(streams);\r\n\r\n this.updateDataChannelReadyState();\r\n\r\n console.log(`[WebRTC] Cleaned up connection for peer: ${peerId}`);\r\n }\r\n\r\n private async createPeerConnection(\r\n peerId: string,\r\n userId: number,\r\n username: string,\r\n role: PeerRole\r\n ): Promise<RTCPeerConnection> {\r\n const iceServers = this.signalling.iceServers;\r\n const config: WebRTCConfig = iceServers.length > 0\r\n ? { ...this.defaultConfig, iceServers }\r\n : this.defaultConfig;\r\n\r\n const pc = new RTCPeerConnection(config);\r\n\r\n const dataChannel = pc.createDataChannel('data', { ordered: true });\r\n this.setupDataChannelHandlers(dataChannel, peerId);\r\n\r\n if (this.localStream) {\r\n 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 this.updateDataChannelReadyState();\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 this.updateDataChannelReadyState();\r\n };\r\n\r\n dataChannel.onerror = (error) => {\r\n console.error(`Data channel error with peer ${peerId}:`, error);\r\n this.updateDataChannelReadyState();\r\n };\r\n }\r\n\r\n private updateDataChannelReadyState(): void {\r\n const hasOpenChannel = Array.from(this.peerConnections.values()).some(\r\n conn => conn.dataChannel && conn.dataChannel.readyState === 'open'\r\n );\r\n this._dataChannelReady.next(hasOpenChannel);\r\n }\r\n\r\n private handleDataChannelMessage(data: string | ArrayBuffer, peerId: string): void {\r\n if (data instanceof ArrayBuffer) {\r\n return;\r\n }\r\n\r\n try {\r\n const message: DataChannelMessage = JSON.parse(data);\r\n\r\n this.zone.run(() => {\r\n switch (message.type) {\r\n case 'chat':\r\n const chatMessage: ChatMessage = message.data as ChatMessage;\r\n this._chatMessages.next(chatMessage);\r\n console.log('Chat message received:', chatMessage);\r\n break;\r\n\r\n case 'file_request':\r\n this.handleFileRequest(message.data as FileTransferRequest, peerId);\r\n break;\r\n\r\n case 'file_accept':\r\n this.handleFileAccept(message.data as FileTransferAccept, peerId);\r\n break;\r\n\r\n case 'file_chunk':\r\n this.handleFileChunk(message.data as FileChunk);\r\n break;\r\n\r\n case 'file_complete':\r\n this.handleFileComplete(message.data.fileId);\r\n break;\r\n\r\n case 'file_cancel':\r\n this.handleFileCancel(message.data.fileId);\r\n break;\r\n\r\n case 'ping':\r\n this.sendDataChannelMessage(peerId, { type: 'pong', data: {} });\r\n break;\r\n\r\n case 'pong':\r\n console.log(`Received pong from peer ${peerId}`);\r\n break;\r\n\r\n default:\r\n console.log('Unknown data channel message type:', message.type);\r\n }\r\n });\r\n } catch (error) {\r\n console.error('Error parsing data channel message:', error);\r\n }\r\n }\r\n\r\n sendChatMessage(message: string): void {\r\n const openConnections = Array.from(this.peerConnections.values()).filter(\r\n conn => conn.dataChannel && conn.dataChannel.readyState === 'open'\r\n );\r\n\r\n if (openConnections.length === 0) {\r\n console.warn('No open data channels available');\r\n return;\r\n }\r\n\r\n const chatMessage: ChatMessage = {\r\n type: 'chat',\r\n peerId: this.signalling.peerId || 'unknown',\r\n userId: 0,\r\n username: 'You',\r\n message: message,\r\n timestamp: new Date().toISOString()\r\n };\r\n\r\n const dataChannelMessage: DataChannelMessage = {\r\n type: 'chat',\r\n data: chatMessage\r\n };\r\n\r\n let sentCount = 0;\r\n this.peerConnections.forEach((conn) => {\r\n if (this.sendDataChannelMessage(conn.peerId, dataChannelMessage)) {\r\n sentCount++;\r\n }\r\n });\r\n\r\n if (sentCount > 0) {\r\n this._chatMessages.next(chatMessage);\r\n } else {\r\n console.warn('Failed to send message to any peer');\r\n }\r\n }\r\n\r\n private sendDataChannelMessage(peerId: string, message: DataChannelMessage): boolean {\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection || !connection.dataChannel) {\r\n console.warn(`No data channel available for peer ${peerId}`);\r\n return false;\r\n }\r\n\r\n if (connection.dataChannel.readyState !== 'open') {\r\n console.warn(`Data channel not open for peer ${peerId}, state: ${connection.dataChannel.readyState}`);\r\n return false;\r\n }\r\n\r\n try {\r\n connection.dataChannel.send(JSON.stringify(message));\r\n return true;\r\n } catch (error) {\r\n console.error(`Error sending data channel message to peer ${peerId}:`, error);\r\n return false;\r\n }\r\n }\r\n\r\n private closePeerConnection(peerId: string): void {\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection) return;\r\n\r\n connection.pc.close();\r\n this.peerConnections.delete(peerId);\r\n\r\n const streams = this._remoteStreams.value;\r\n streams.delete(peerId);\r\n this._remoteStreams.next(streams);\r\n\r\n console.log(`Closed peer connection with ${peerId}`);\r\n }\r\n\r\n private 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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"}
|
|
1
|
+
{"version":3,"file":"noatgnu-cupcake-mint-chocolate.mjs","sources":["../../../projects/cupcake-mint-chocolate/src/lib/cupcake-mint-chocolate.ts","../../../projects/cupcake-mint-chocolate/src/lib/models/enums.ts","../../../projects/cupcake-mint-chocolate/src/lib/models/webrtc.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/notification.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/message-thread.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/message.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/thread-participant.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/communication-websocket.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/webrtc-signalling.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/webrtc.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/webrtc-session.ts","../../../projects/cupcake-mint-chocolate/src/lib/services/index.ts","../../../projects/cupcake-mint-chocolate/src/public-api.ts","../../../projects/cupcake-mint-chocolate/src/noatgnu-cupcake-mint-chocolate.ts"],"sourcesContent":["import { Component } from '@angular/core';\n\n@Component({\n selector: 'ccmc-cupcake-mint-chocolate',\n imports: [],\n template: `\n <p>\n cupcake-mint-chocolate works!\n </p>\n `,\n styles: ``\n})\nexport class CupcakeMintChocolate {\n\n}\n","export enum NotificationType {\r\n SYSTEM = 'system',\r\n MAINTENANCE = 'maintenance',\r\n INVENTORY = 'inventory',\r\n BILLING = 'billing',\r\n PROJECT = 'project',\r\n PROTOCOL = 'protocol',\r\n DOCUMENT = 'document',\r\n USER = 'user'\r\n}\r\n\r\nexport const NotificationTypeLabels: Record<NotificationType, string> = {\r\n [NotificationType.SYSTEM]: 'System',\r\n [NotificationType.MAINTENANCE]: 'Maintenance',\r\n [NotificationType.INVENTORY]: 'Inventory',\r\n [NotificationType.BILLING]: 'Billing',\r\n [NotificationType.PROJECT]: 'Project',\r\n [NotificationType.PROTOCOL]: 'Protocol',\r\n [NotificationType.DOCUMENT]: 'Document',\r\n [NotificationType.USER]: 'User'\r\n};\r\n\r\nexport enum NotificationPriority {\r\n LOW = 'low',\r\n NORMAL = 'normal',\r\n HIGH = 'high',\r\n URGENT = 'urgent'\r\n}\r\n\r\nexport const NotificationPriorityLabels: Record<NotificationPriority, string> = {\r\n [NotificationPriority.LOW]: 'Low',\r\n [NotificationPriority.NORMAL]: 'Normal',\r\n [NotificationPriority.HIGH]: 'High',\r\n [NotificationPriority.URGENT]: 'Urgent'\r\n};\r\n\r\nexport enum DeliveryStatus {\r\n PENDING = 'pending',\r\n SENT = 'sent',\r\n DELIVERED = 'delivered',\r\n FAILED = 'failed',\r\n READ = 'read'\r\n}\r\n\r\nexport const DeliveryStatusLabels: Record<DeliveryStatus, string> = {\r\n [DeliveryStatus.PENDING]: 'Pending',\r\n [DeliveryStatus.SENT]: 'Sent',\r\n [DeliveryStatus.DELIVERED]: 'Delivered',\r\n [DeliveryStatus.FAILED]: 'Failed',\r\n [DeliveryStatus.READ]: 'Read'\r\n};\r\n\r\nexport enum MessageType {\r\n DIRECT = 'direct',\r\n THREAD = 'thread',\r\n BROADCAST = 'broadcast',\r\n SYSTEM = 'system'\r\n}\r\n\r\nexport const MessageTypeLabels: Record<MessageType, string> = {\r\n [MessageType.DIRECT]: 'Direct Message',\r\n [MessageType.THREAD]: 'Thread Reply',\r\n [MessageType.BROADCAST]: 'Broadcast',\r\n [MessageType.SYSTEM]: 'System Message'\r\n};","import { BaseTimestampedModel } from './base';\r\nimport { User } from '@noatgnu/cupcake-core';\r\n\r\nexport enum WebRTCSessionType {\r\n VIDEO_CALL = 'video_call',\r\n AUDIO_CALL = 'audio_call',\r\n SCREEN_SHARE = 'screen_share',\r\n DATA_CHANNEL = 'data_channel'\r\n}\r\n\r\nexport enum WebRTCSessionStatus {\r\n WAITING = 'waiting',\r\n ACTIVE = 'active',\r\n ENDED = 'ended'\r\n}\r\n\r\nexport enum PeerRole {\r\n HOST = 'host',\r\n VIEWER = 'viewer',\r\n PARTICIPANT = 'participant'\r\n}\r\n\r\nexport enum PeerConnectionState {\r\n CONNECTING = 'connecting',\r\n CONNECTED = 'connected',\r\n DISCONNECTED = 'disconnected',\r\n FAILED = 'failed'\r\n}\r\n\r\nexport enum SignalType {\r\n OFFER = 'offer',\r\n ANSWER = 'answer',\r\n ICE_CANDIDATE = 'ice_candidate',\r\n CHECK = 'check'\r\n}\r\n\r\nexport interface WebRTCSession extends BaseTimestampedModel {\r\n id: string;\r\n name?: string;\r\n isDefault: boolean;\r\n sessionType: WebRTCSessionType;\r\n sessionStatus: WebRTCSessionStatus;\r\n initiatedBy: number;\r\n initiatedByUsername?: string;\r\n initiatedByDetails?: User;\r\n participantsList?: WebRTCPeer[];\r\n participantsCount?: number;\r\n canEdit?: boolean;\r\n canDelete?: boolean;\r\n startedAt: string;\r\n endedAt?: string;\r\n}\r\n\r\nexport interface WebRTCPeer extends BaseTimestampedModel {\r\n id: string;\r\n session: string;\r\n user: number;\r\n username?: string;\r\n userDetails?: User;\r\n channelId: string;\r\n peerRole: PeerRole;\r\n connectionState: PeerConnectionState;\r\n hasVideo: boolean;\r\n hasAudio: boolean;\r\n hasScreenShare: boolean;\r\n joinedAt: string;\r\n lastSeenAt: string;\r\n}\r\n\r\nexport interface WebRTCSessionCreate {\r\n name?: string;\r\n sessionType: WebRTCSessionType;\r\n ccrvSessionIds?: number[];\r\n}\r\n\r\nexport interface WebRTCSessionUpdate {\r\n name?: string;\r\n sessionType?: WebRTCSessionType;\r\n sessionStatus?: WebRTCSessionStatus;\r\n isDefault?: boolean;\r\n}\r\n\r\nexport interface WebRTCSessionQueryParams {\r\n sessionType?: WebRTCSessionType;\r\n sessionStatus?: WebRTCSessionStatus;\r\n ccrvSessionId?: number;\r\n limit?: number;\r\n offset?: number;\r\n}\r\n\r\nexport interface WebRTCSignal extends BaseTimestampedModel {\r\n id: string;\r\n session: string;\r\n fromPeer: string;\r\n toPeer?: string;\r\n signalType: SignalType;\r\n signalData: any;\r\n delivered: boolean;\r\n}\r\n\r\nexport interface PeerInfo {\r\n id: string;\r\n userId: number;\r\n username: string;\r\n peerRole: PeerRole;\r\n connectionState: PeerConnectionState;\r\n hasVideo: boolean;\r\n hasAudio: boolean;\r\n hasScreenShare: boolean;\r\n}\r\n\r\nexport interface WebRTCMessage {\r\n type: 'connection.established' | 'check.response' | 'peer.check' | 'offer' | 'answer' | 'ice_candidate' | 'peer.state_update' | 'peer.joined' | 'peer.left' | 'heartbeat.response' | 'error';\r\n message?: string;\r\n peerId?: string;\r\n clientPeerId?: string;\r\n sessionId?: string;\r\n userId?: number;\r\n username?: string;\r\n fromPeerId?: string;\r\n fromUserId?: number;\r\n fromUsername?: string;\r\n toPeerId?: string;\r\n sdp?: RTCSessionDescriptionInit;\r\n candidate?: RTCIceCandidateInit;\r\n peers?: PeerInfo[];\r\n peerRole?: PeerRole;\r\n connectionState?: PeerConnectionState;\r\n hasVideo?: boolean;\r\n hasAudio?: boolean;\r\n hasScreenShare?: boolean;\r\n iceServers?: RTCIceServer[];\r\n timestamp?: string;\r\n isReconnection?: boolean;\r\n}\r\n\r\nexport interface WebRTCConfig {\r\n iceServers: RTCIceServer[];\r\n iceCandidatePoolSize?: number;\r\n iceTransportPolicy?: RTCIceTransportPolicy;\r\n bundlePolicy?: RTCBundlePolicy;\r\n rtcpMuxPolicy?: RTCRtcpMuxPolicy;\r\n}\r\n\r\nexport interface MediaConstraintsConfig {\r\n video?: boolean | MediaTrackConstraints;\r\n audio?: boolean | MediaTrackConstraints;\r\n}\r\n\r\nexport interface PeerConnection {\r\n peerId: string;\r\n userId: number;\r\n username: string;\r\n pc: RTCPeerConnection;\r\n dataChannel?: RTCDataChannel;\r\n stream?: MediaStream;\r\n role: PeerRole;\r\n offered: boolean;\r\n answered: boolean;\r\n connected: boolean;\r\n queuedCandidates: RTCIceCandidate[];\r\n}\r\n\r\nexport interface ChatMessage {\r\n type: 'chat';\r\n peerId: string;\r\n userId: number;\r\n username: string;\r\n message: string;\r\n timestamp: string;\r\n fileOffer?: FileOfferData;\r\n}\r\n\r\nexport interface FileOfferData {\r\n fileId: string;\r\n fileName: string;\r\n fileSize: number;\r\n fileType: string;\r\n chunkSize: number;\r\n totalChunks: number;\r\n}\r\n\r\nexport interface FileTransferRequest {\r\n type: 'file_request';\r\n fileId: string;\r\n requesterId: string;\r\n}\r\n\r\nexport interface FileTransferAccept {\r\n type: 'file_accept';\r\n fileId: string;\r\n toPeerId: string;\r\n}\r\n\r\nexport interface FileChunk {\r\n type: 'file_chunk';\r\n fileId: string;\r\n chunkIndex: number;\r\n totalChunks: number;\r\n data: ArrayBuffer;\r\n isLast: boolean;\r\n}\r\n\r\nexport interface FileTransferProgress {\r\n fileId: string;\r\n fileName: string;\r\n fileSize: number;\r\n chunksReceived: number;\r\n totalChunks: number;\r\n bytesReceived: number;\r\n percentage: number;\r\n}\r\n\r\nexport interface FileTransferState {\r\n fileId: string;\r\n fileName: string;\r\n fileSize: number;\r\n fileType: string;\r\n file?: File;\r\n chunks: Map<number, ArrayBuffer>;\r\n totalChunks: number;\r\n chunkSize: number;\r\n sentChunks: number;\r\n receivedChunks: number;\r\n status: 'pending' | 'transferring' | 'completed' | 'failed';\r\n requestedBy: Set<string>;\r\n streamWriter?: WritableStreamDefaultWriter<Uint8Array>;\r\n downloadStream?: WritableStream<Uint8Array>;\r\n}\r\n\r\nexport interface DataChannelMessage {\r\n type: 'chat' | 'ping' | 'pong' | 'file_request' | 'file_accept' | 'file_chunk' | 'file_complete' | 'file_cancel';\r\n data: any;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n Notification,\r\n NotificationCreateRequest,\r\n NotificationUpdateRequest,\r\n MarkNotificationReadRequest,\r\n BulkNotificationActionRequest,\r\n NotificationType,\r\n NotificationPriority,\r\n DeliveryStatus,\r\n PaginatedResponse,\r\n NotificationQueryParams\r\n} from '../models';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NotificationService extends BaseApiService {\r\n\r\n /**\r\n * Get all notifications with optional filtering\r\n */\r\n getNotifications(params?: NotificationQueryParams): Observable<PaginatedResponse<Notification>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<Notification>>(`${this.apiUrl}/notifications/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single notification by ID\r\n */\r\n getNotification(id: string): Observable<Notification> {\r\n return this.get<Notification>(`${this.apiUrl}/notifications/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new notification\r\n */\r\n createNotification(notification: NotificationCreateRequest): Observable<Notification> {\r\n return this.post<Notification>(`${this.apiUrl}/notifications/`, notification);\r\n }\r\n\r\n /**\r\n * Update an existing notification\r\n */\r\n updateNotification(id: string, notification: NotificationUpdateRequest): Observable<Notification> {\r\n return this.put<Notification>(`${this.apiUrl}/notifications/${id}/`, notification);\r\n }\r\n\r\n /**\r\n * Partially update a notification\r\n */\r\n patchNotification(id: string, notification: Partial<NotificationUpdateRequest>): Observable<Notification> {\r\n return this.patch<Notification>(`${this.apiUrl}/notifications/${id}/`, notification);\r\n }\r\n\r\n /**\r\n * Delete a notification\r\n */\r\n deleteNotification(id: string): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/notifications/${id}/`);\r\n }\r\n\r\n /**\r\n * Mark a notification as read/unread\r\n */\r\n markNotificationRead(id: string, request: MarkNotificationReadRequest): Observable<Notification> {\r\n return this.post<Notification>(`${this.apiUrl}/notifications/${id}/mark_read/`, request);\r\n }\r\n\r\n\r\n /**\r\n * Get unread notifications for current user\r\n */\r\n getUnreadNotifications(): Observable<PaginatedResponse<Notification>> {\r\n return this.get<PaginatedResponse<Notification>>(`${this.apiUrl}/notifications/unread/`);\r\n }\r\n\r\n /**\r\n * Get notification statistics for current user\r\n */\r\n getNotificationStats(): Observable<{\r\n total: number;\r\n unread: number;\r\n byType: { [key: string]: number };\r\n byPriority: { [key: string]: number };\r\n }> {\r\n return this.get<{\r\n total: number;\r\n unread: number;\r\n byType: { [key: string]: number };\r\n byPriority: { [key: string]: number };\r\n }>(`${this.apiUrl}/notifications/stats/`);\r\n }\r\n\r\n /**\r\n * Mark all notifications as read for current user\r\n */\r\n markAllNotificationsRead(): Observable<{ success: boolean; message: string }> {\r\n return this.post<{ success: boolean; message: string }>(`${this.apiUrl}/notifications/mark_all_read/`, {});\r\n }\r\n\r\n /**\r\n * Search notifications by title or message\r\n */\r\n searchNotifications(query: string): Observable<PaginatedResponse<Notification>> {\r\n return this.getNotifications({ search: query });\r\n }\r\n\r\n /**\r\n * Get notifications by type\r\n */\r\n getNotificationsByType(type: NotificationType): Observable<PaginatedResponse<Notification>> {\r\n return this.getNotifications({ notificationType: type });\r\n }\r\n\r\n /**\r\n * Get notifications by priority\r\n */\r\n getNotificationsByPriority(priority: NotificationPriority): Observable<PaginatedResponse<Notification>> {\r\n return this.getNotifications({ priority });\r\n }\r\n\r\n /**\r\n * Get notifications by sender\r\n */\r\n getNotificationsBySender(senderId: number): Observable<PaginatedResponse<Notification>> {\r\n return this.getNotifications({ sender: senderId });\r\n }\r\n\r\n /**\r\n * Get notifications by delivery status\r\n */\r\n getNotificationsByStatus(status: DeliveryStatus): Observable<PaginatedResponse<Notification>> {\r\n return this.getNotifications({ deliveryStatus: status });\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n MessageThread,\r\n MessageThreadCreateRequest,\r\n MessageThreadUpdateRequest,\r\n ThreadParticipantRequest,\r\n ThreadSearchRequest,\r\n ThreadParticipant,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\nexport interface MessageThreadQueryParams {\r\n search?: string;\r\n isPrivate?: boolean;\r\n isArchived?: boolean;\r\n creator?: number;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MessageThreadService extends BaseApiService {\r\n\r\n /**\r\n * Get all message threads with optional filtering\r\n */\r\n getMessageThreads(params?: MessageThreadQueryParams): Observable<PaginatedResponse<MessageThread>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<MessageThread>>(`${this.apiUrl}/threads/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single message thread by ID\r\n */\r\n getMessageThread(id: string): Observable<MessageThread> {\r\n return this.get<MessageThread>(`${this.apiUrl}/threads/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new message thread\r\n */\r\n createMessageThread(thread: MessageThreadCreateRequest): Observable<MessageThread> {\r\n return this.post<MessageThread>(`${this.apiUrl}/threads/`, thread);\r\n }\r\n\r\n /**\r\n * Update an existing message thread\r\n */\r\n updateMessageThread(id: string, thread: MessageThreadUpdateRequest): Observable<MessageThread> {\r\n return this.put<MessageThread>(`${this.apiUrl}/threads/${id}/`, thread);\r\n }\r\n\r\n /**\r\n * Partially update a message thread\r\n */\r\n patchMessageThread(id: string, thread: Partial<MessageThreadUpdateRequest>): Observable<MessageThread> {\r\n return this.patch<MessageThread>(`${this.apiUrl}/threads/${id}/`, thread);\r\n }\r\n\r\n /**\r\n * Delete a message thread\r\n */\r\n deleteMessageThread(id: string): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/threads/${id}/`);\r\n }\r\n\r\n /**\r\n * Add participant to a thread\r\n */\r\n addParticipant(id: string, request: { username: string }): Observable<{ message: string; participant: ThreadParticipant }> {\r\n return this.post<{ message: string; participant: ThreadParticipant }>(`${this.apiUrl}/threads/${id}/add_participant/`, request);\r\n }\r\n\r\n /**\r\n * Remove participant from a thread\r\n */\r\n removeParticipant(id: string, request: { username: string }): Observable<{ message: string }> {\r\n return this.post<{ message: string }>(`${this.apiUrl}/threads/${id}/remove_participant/`, request);\r\n }\r\n\r\n /**\r\n * Get thread participants\r\n */\r\n getParticipants(id: string): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.get<PaginatedResponse<ThreadParticipant>>(`${this.apiUrl}/threads/${id}/participants/`);\r\n }\r\n\r\n /**\r\n * Archive/unarchive a thread (toggles state)\r\n */\r\n toggleArchiveThread(id: string): Observable<{ message: string; isArchived: boolean }> {\r\n return this.post<{ message: string; isArchived: boolean }>(`${this.apiUrl}/threads/${id}/archive/`, {});\r\n }\r\n\r\n /**\r\n * Mark thread as read for current user\r\n */\r\n markThreadAsRead(id: string): Observable<{ success: boolean; message: string }> {\r\n return this.post<{ success: boolean; message: string }>(`${this.apiUrl}/threads/${id}/mark_read/`, {});\r\n }\r\n\r\n\r\n /**\r\n * Search message threads by title or description\r\n */\r\n searchMessageThreads(query: string): Observable<PaginatedResponse<MessageThread>> {\r\n return this.getMessageThreads({ search: query });\r\n }\r\n\r\n /**\r\n * Get private threads only\r\n */\r\n getPrivateThreads(): Observable<PaginatedResponse<MessageThread>> {\r\n return this.getMessageThreads({ isPrivate: true });\r\n }\r\n\r\n /**\r\n * Get public threads only\r\n */\r\n getPublicThreads(): Observable<PaginatedResponse<MessageThread>> {\r\n return this.getMessageThreads({ isPrivate: false });\r\n }\r\n\r\n /**\r\n * Get archived threads\r\n */\r\n getArchivedThreads(): Observable<PaginatedResponse<MessageThread>> {\r\n return this.getMessageThreads({ isArchived: true });\r\n }\r\n\r\n /**\r\n * Get active threads (non-archived)\r\n */\r\n getActiveThreads(): Observable<PaginatedResponse<MessageThread>> {\r\n return this.getMessageThreads({ isArchived: false });\r\n }\r\n\r\n /**\r\n * Get threads created by a specific user\r\n */\r\n getThreadsByCreator(creatorId: number): Observable<PaginatedResponse<MessageThread>> {\r\n return this.getMessageThreads({ creator: creatorId });\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n Message,\r\n MessageCreateRequest,\r\n MessageUpdateRequest,\r\n MessageSearchRequest,\r\n MessageType,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\nexport interface MessageQueryParams {\r\n search?: string;\r\n thread?: string;\r\n messageType?: MessageType;\r\n sender?: number;\r\n isDeleted?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MessageService extends BaseApiService {\r\n\r\n /**\r\n * Get all messages with optional filtering\r\n */\r\n getMessages(params?: MessageQueryParams): Observable<PaginatedResponse<Message>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<Message>>(`${this.apiUrl}/messages/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single message by ID\r\n */\r\n getMessage(id: string): Observable<Message> {\r\n return this.get<Message>(`${this.apiUrl}/messages/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new message\r\n */\r\n createMessage(message: MessageCreateRequest): Observable<Message> {\r\n return this.post<Message>(`${this.apiUrl}/messages/`, message);\r\n }\r\n\r\n /**\r\n * Update an existing message\r\n */\r\n updateMessage(id: string, message: MessageUpdateRequest): Observable<Message> {\r\n return this.put<Message>(`${this.apiUrl}/messages/${id}/`, message);\r\n }\r\n\r\n /**\r\n * Partially update a message\r\n */\r\n patchMessage(id: string, message: Partial<MessageUpdateRequest>): Observable<Message> {\r\n return this.patch<Message>(`${this.apiUrl}/messages/${id}/`, message);\r\n }\r\n\r\n /**\r\n * Delete a message (soft delete)\r\n */\r\n deleteMessage(id: string): Observable<Message> {\r\n return this.delete<Message>(`${this.apiUrl}/messages/${id}/`);\r\n }\r\n\r\n\r\n /**\r\n * Get messages in a specific thread\r\n */\r\n getThreadMessages(threadId: string, params?: Omit<MessageQueryParams, 'thread'>): Observable<PaginatedResponse<Message>> {\r\n const queryParams = { ...params, thread: threadId };\r\n return this.getMessages(queryParams);\r\n }\r\n\r\n /**\r\n * Search messages by content\r\n */\r\n searchMessages(query: string, threadId?: string): Observable<PaginatedResponse<Message>> {\r\n const params: MessageQueryParams = { search: query };\r\n if (threadId) {\r\n params.thread = threadId;\r\n }\r\n return this.getMessages(params);\r\n }\r\n\r\n /**\r\n * Get messages by sender\r\n */\r\n getMessagesBySender(senderId: number, threadId?: string): Observable<PaginatedResponse<Message>> {\r\n const params: MessageQueryParams = { sender: senderId };\r\n if (threadId) {\r\n params.thread = threadId;\r\n }\r\n return this.getMessages(params);\r\n }\r\n\r\n /**\r\n * Get messages by type\r\n */\r\n getMessagesByType(messageType: MessageType, threadId?: string): Observable<PaginatedResponse<Message>> {\r\n const params: MessageQueryParams = { messageType };\r\n if (threadId) {\r\n params.thread = threadId;\r\n }\r\n return this.getMessages(params);\r\n }\r\n\r\n /**\r\n * Get deleted messages (for moderation)\r\n */\r\n getDeletedMessages(threadId?: string): Observable<PaginatedResponse<Message>> {\r\n const params: MessageQueryParams = { isDeleted: true };\r\n if (threadId) {\r\n params.thread = threadId;\r\n }\r\n return this.getMessages(params);\r\n }\r\n\r\n /**\r\n * Get active messages (non-deleted)\r\n */\r\n getActiveMessages(threadId?: string): Observable<PaginatedResponse<Message>> {\r\n const params: MessageQueryParams = { isDeleted: false };\r\n if (threadId) {\r\n params.thread = threadId;\r\n }\r\n return this.getMessages(params);\r\n }\r\n\r\n /**\r\n * Reply to a message\r\n */\r\n replyToMessage(parentMessageId: string, content: string, threadId: string): Observable<Message> {\r\n const message: MessageCreateRequest = {\r\n thread: threadId,\r\n content,\r\n replyTo: parentMessageId\r\n };\r\n return this.createMessage(message);\r\n }\r\n}","import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\n\r\nimport {\r\n ThreadParticipant,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\nexport interface ThreadParticipantQueryParams {\r\n thread?: string;\r\n isModerator?: boolean;\r\n notificationsEnabled?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ThreadParticipantService {\r\n private http = inject(HttpClient);\r\n private apiUrl = '/api'; // This should be configurable\r\n\r\n /**\r\n * Get all thread participants with optional filtering\r\n */\r\n getThreadParticipants(params?: ThreadParticipantQueryParams): Observable<PaginatedResponse<ThreadParticipant>> {\r\n let httpParams = new HttpParams();\r\n \r\n if (params) {\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n httpParams = httpParams.set(key, value.toString());\r\n }\r\n });\r\n }\r\n\r\n return this.http.get<PaginatedResponse<ThreadParticipant>>(`${this.apiUrl}/thread-participants/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single thread participant by ID\r\n */\r\n getThreadParticipant(id: number): Observable<ThreadParticipant> {\r\n return this.http.get<ThreadParticipant>(`${this.apiUrl}/thread-participants/${id}/`);\r\n }\r\n\r\n /**\r\n * Update thread participant settings\r\n */\r\n updateThreadParticipant(id: number, updates: { isModerator?: boolean; notificationsEnabled?: boolean }): Observable<ThreadParticipant> {\r\n return this.http.patch<ThreadParticipant>(`${this.apiUrl}/thread-participants/${id}/`, updates);\r\n }\r\n\r\n /**\r\n * Update participant's last read timestamp\r\n */\r\n updateLastRead(id: number): Observable<ThreadParticipant> {\r\n return this.http.post<ThreadParticipant>(`${this.apiUrl}/thread-participants/${id}/update_last_read/`, {});\r\n }\r\n\r\n /**\r\n * Get participants for a specific thread\r\n */\r\n getParticipantsForThread(threadId: string): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.getThreadParticipants({ thread: threadId });\r\n }\r\n\r\n /**\r\n * Get moderators for a specific thread\r\n */\r\n getModeratorsForThread(threadId: string): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.getThreadParticipants({ thread: threadId, isModerator: true });\r\n }\r\n\r\n /**\r\n * Get non-moderator participants for a specific thread\r\n */\r\n getRegularParticipantsForThread(threadId: string): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.getThreadParticipants({ thread: threadId, isModerator: false });\r\n }\r\n\r\n /**\r\n * Get participants with notifications enabled for a specific thread\r\n */\r\n getNotificationEnabledParticipants(threadId: string): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.getThreadParticipants({ thread: threadId, notificationsEnabled: true });\r\n }\r\n\r\n /**\r\n * Get participants with notifications disabled for a specific thread\r\n */\r\n getNotificationDisabledParticipants(threadId: string): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.getThreadParticipants({ thread: threadId, notificationsEnabled: false });\r\n }\r\n\r\n /**\r\n * Toggle moderator status for a participant\r\n */\r\n toggleModeratorStatus(id: number): Observable<ThreadParticipant> {\r\n return this.http.post<ThreadParticipant>(`${this.apiUrl}/thread-participants/${id}/toggle_moderator/`, {});\r\n }\r\n\r\n /**\r\n * Toggle notifications for a participant\r\n */\r\n toggleNotifications(id: number): Observable<ThreadParticipant> {\r\n return this.http.post<ThreadParticipant>(`${this.apiUrl}/thread-participants/${id}/toggle_notifications/`, {});\r\n }\r\n\r\n /**\r\n * Leave a thread (for current user)\r\n */\r\n leaveThread(threadId: string): Observable<{ success: boolean; message: string }> {\r\n return this.http.post<{ success: boolean; message: string }>(`${this.apiUrl}/thread-participants/leave_thread/`, { thread: threadId });\r\n }\r\n\r\n /**\r\n * Get threads where current user is participant\r\n */\r\n getMyParticipations(): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.http.get<PaginatedResponse<ThreadParticipant>>(`${this.apiUrl}/thread-participants/my_participations/`);\r\n }\r\n\r\n /**\r\n * Get threads where current user is moderator\r\n */\r\n getMyModerations(): Observable<PaginatedResponse<ThreadParticipant>> {\r\n return this.http.get<PaginatedResponse<ThreadParticipant>>(`${this.apiUrl}/thread-participants/my_moderations/`);\r\n }\r\n}","import { Injectable, OnDestroy } from '@angular/core';\r\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\r\nimport { filter, map } from 'rxjs/operators';\r\n\r\nimport { NotificationType, NotificationPriority, MessageType } from '../models';\r\n\r\nexport interface NewNotificationEvent {\r\n type: 'notification.new';\r\n notificationId: string;\r\n title: string;\r\n message: string;\r\n notificationType: NotificationType;\r\n priority: NotificationPriority;\r\n data: {\r\n alertType?: string;\r\n quantity?: number;\r\n link?: string;\r\n [key: string]: string | number | boolean | undefined;\r\n };\r\n timestamp: string;\r\n}\r\n\r\nexport interface NewMessageEvent {\r\n type: 'message.new';\r\n threadId: string;\r\n messageId: string;\r\n senderId: number;\r\n senderUsername: string;\r\n content: string;\r\n messageType: MessageType;\r\n timestamp: string;\r\n}\r\n\r\nexport interface ThreadUpdateEvent {\r\n type: 'thread.update';\r\n threadId: string;\r\n action: string;\r\n message: string;\r\n timestamp: string;\r\n}\r\n\r\nexport interface NotificationUpdateEvent {\r\n type: 'notification.update';\r\n notificationId: string;\r\n status: string;\r\n timestamp: string;\r\n}\r\n\r\nexport interface ConnectionEstablishedEvent {\r\n type: 'ccmc.connection.established';\r\n message: string;\r\n userId: number;\r\n username: string;\r\n}\r\n\r\nexport interface ThreadSubscriptionConfirmedEvent {\r\n type: 'thread.subscription.confirmed';\r\n threadId: string;\r\n}\r\n\r\nexport interface ThreadSubscriptionDeniedEvent {\r\n type: 'thread.subscription.denied';\r\n threadId: string;\r\n error: string;\r\n}\r\n\r\nexport interface ThreadUnsubscriptionConfirmedEvent {\r\n type: 'thread.unsubscription.confirmed';\r\n threadId: string;\r\n}\r\n\r\nexport interface NotificationMarkedReadEvent {\r\n type: 'notification.marked_read';\r\n notificationId: string;\r\n}\r\n\r\nexport interface PongEvent {\r\n type: 'pong';\r\n}\r\n\r\nexport type WebSocketIncomingMessage =\r\n | NewNotificationEvent\r\n | NewMessageEvent\r\n | ThreadUpdateEvent\r\n | NotificationUpdateEvent\r\n | ConnectionEstablishedEvent\r\n | ThreadSubscriptionConfirmedEvent\r\n | ThreadSubscriptionDeniedEvent\r\n | ThreadUnsubscriptionConfirmedEvent\r\n | NotificationMarkedReadEvent\r\n | PongEvent;\r\n\r\nexport interface SubscribeThreadMessage {\r\n type: 'subscribe_thread';\r\n thread_id: string;\r\n}\r\n\r\nexport interface UnsubscribeThreadMessage {\r\n type: 'unsubscribe_thread';\r\n thread_id: string;\r\n}\r\n\r\nexport interface MarkNotificationReadMessage {\r\n type: 'mark_notification_read';\r\n notification_id: string;\r\n}\r\n\r\nexport interface PingMessage {\r\n type: 'ping';\r\n}\r\n\r\nexport type WebSocketOutgoingMessage =\r\n | SubscribeThreadMessage\r\n | UnsubscribeThreadMessage\r\n | MarkNotificationReadMessage\r\n | PingMessage;\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CommunicationWebSocketService implements OnDestroy {\r\n private socket: WebSocket | null = null;\r\n private reconnectAttempts = 0;\r\n private maxReconnectAttempts = 5;\r\n private reconnectDelay = 3000;\r\n private reconnectTimer: number | null = null;\r\n\r\n private messageSubject = new Subject<WebSocketIncomingMessage>();\r\n private connectionStateSubject = new BehaviorSubject<'disconnected' | 'connecting' | 'connected'>('disconnected');\r\n\r\n public connectionState$ = this.connectionStateSubject.asObservable();\r\n public messages$ = this.messageSubject.asObservable();\r\n\r\n public newNotifications$: Observable<NewNotificationEvent> = this.messages$.pipe(\r\n filter((msg): msg is NewNotificationEvent => msg.type === 'notification.new')\r\n );\r\n\r\n public newMessages$: Observable<NewMessageEvent> = this.messages$.pipe(\r\n filter((msg): msg is NewMessageEvent => msg.type === 'message.new')\r\n );\r\n\r\n public threadUpdates$: Observable<ThreadUpdateEvent> = this.messages$.pipe(\r\n filter((msg): msg is ThreadUpdateEvent => msg.type === 'thread.update')\r\n );\r\n\r\n public notificationUpdates$: Observable<NotificationUpdateEvent> = this.messages$.pipe(\r\n filter((msg): msg is NotificationUpdateEvent => msg.type === 'notification.update')\r\n );\r\n\r\n connect(wsBaseUrl: string, token?: string): void {\r\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\r\n console.log('WebSocket already connected');\r\n return;\r\n }\r\n\r\n this.connectionStateSubject.next('connecting');\r\n\r\n const fullUrl = `${wsBaseUrl.replace(/\\/$/, '')}/ccmc/communications/`;\r\n const url = token ? `${fullUrl}?token=${token}` : fullUrl;\r\n this.socket = new WebSocket(url);\r\n\r\n this.socket.onopen = () => {\r\n console.log('CCMC WebSocket connected');\r\n this.connectionStateSubject.next('connected');\r\n this.reconnectAttempts = 0;\r\n };\r\n\r\n this.socket.onmessage = (event) => {\r\n try {\r\n const message = JSON.parse(event.data) as WebSocketIncomingMessage;\r\n this.messageSubject.next(message);\r\n\r\n if (message.type === 'ccmc.connection.established') {\r\n console.log('CCMC connection established:', message);\r\n }\r\n } catch (error) {\r\n console.error('Error parsing WebSocket message:', error);\r\n }\r\n };\r\n\r\n this.socket.onerror = (error) => {\r\n console.error('CCMC WebSocket error:', error);\r\n };\r\n\r\n this.socket.onclose = (event) => {\r\n console.log('CCMC WebSocket closed:', event.code, event.reason);\r\n this.connectionStateSubject.next('disconnected');\r\n\r\n if (this.reconnectAttempts < this.maxReconnectAttempts) {\r\n this.scheduleReconnect(wsBaseUrl, token);\r\n }\r\n };\r\n }\r\n\r\n private scheduleReconnect(wsBaseUrl: string, token?: string): void {\r\n this.reconnectAttempts++;\r\n const delay = this.reconnectDelay * this.reconnectAttempts;\r\n\r\n console.log(`Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`);\r\n\r\n this.reconnectTimer = setTimeout(() => {\r\n this.connect(wsBaseUrl, token);\r\n }, delay);\r\n }\r\n\r\n disconnect(): void {\r\n if (this.reconnectTimer) {\r\n clearTimeout(this.reconnectTimer);\r\n this.reconnectTimer = null;\r\n }\r\n\r\n if (this.socket) {\r\n this.socket.close();\r\n this.socket = null;\r\n }\r\n\r\n this.connectionStateSubject.next('disconnected');\r\n this.reconnectAttempts = 0;\r\n }\r\n\r\n subscribeToThread(threadId: string): void {\r\n const message: SubscribeThreadMessage = {\r\n type: 'subscribe_thread',\r\n thread_id: threadId\r\n };\r\n this.send(message);\r\n }\r\n\r\n unsubscribeFromThread(threadId: string): void {\r\n const message: UnsubscribeThreadMessage = {\r\n type: 'unsubscribe_thread',\r\n thread_id: threadId\r\n };\r\n this.send(message);\r\n }\r\n\r\n markNotificationAsRead(notificationId: string): void {\r\n const message: MarkNotificationReadMessage = {\r\n type: 'mark_notification_read',\r\n notification_id: notificationId\r\n };\r\n this.send(message);\r\n }\r\n\r\n ping(): void {\r\n const message: PingMessage = { type: 'ping' };\r\n this.send(message);\r\n }\r\n\r\n private send(message: WebSocketOutgoingMessage): void {\r\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\r\n this.socket.send(JSON.stringify(message));\r\n } else {\r\n console.warn('Cannot send message: WebSocket not connected');\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.disconnect();\r\n }\r\n\r\n isConnected(): boolean {\r\n return this.socket !== null && this.socket.readyState === WebSocket.OPEN;\r\n }\r\n\r\n getConnectionState(): 'disconnected' | 'connecting' | 'connected' {\r\n return this.connectionStateSubject.value;\r\n }\r\n}\r\n","import { Injectable, NgZone, inject } from '@angular/core';\r\nimport { webSocket, WebSocketSubject } from 'rxjs/webSocket';\r\nimport { BehaviorSubject, Subject, Subscription } from 'rxjs';\r\nimport { AuthService, CUPCAKE_CORE_CONFIG } from '@noatgnu/cupcake-core';\r\nimport {\r\n WebRTCMessage,\r\n PeerInfo,\r\n PeerRole,\r\n PeerConnectionState\r\n} from '../models/webrtc';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class WebRTCSignallingService {\r\n private ws?: WebSocketSubject<WebRTCMessage>;\r\n private wsSubscription?: Subscription;\r\n private baseUrl: string = '';\r\n private clientPeerId: string | null = null;\r\n private readonly CLIENT_PEER_ID_KEY = 'webrtc_client_peer_id';\r\n\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 this.clientPeerId = this.getClientPeerId();\r\n let wsUrl = `${this.baseUrl}/ccmc/webrtc/${sessionId}/?token=${token}`;\r\n\r\n if (this.clientPeerId) {\r\n wsUrl += `&client_peer_id=${this.clientPeerId}`;\r\n console.log('[Signalling] Reconnecting with client peer ID:', this.clientPeerId);\r\n } else {\r\n console.log('[Signalling] First connection, no client peer ID');\r\n }\r\n\r\n 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.joined':\r\n this.handlePeerJoined(message);\r\n break;\r\n\r\n case 'peer.left':\r\n this.handlePeerLeft(message);\r\n break;\r\n\r\n case 'peer.check':\r\n case 'offer':\r\n case 'answer':\r\n case 'ice_candidate':\r\n 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: any): void {\r\n const peerId = message.peer_id || message.peerId;\r\n const sessionId = message.session_id || message.sessionId;\r\n const clientPeerId = message.client_peer_id || message.clientPeerId;\r\n const isReconnection = message.is_reconnection !== undefined ? message.is_reconnection : message.isReconnection;\r\n const iceServers = message.ice_servers || message.iceServers;\r\n\r\n if (peerId) {\r\n this._peerId.next(peerId);\r\n console.log('[Signalling] Peer ID assigned:', peerId);\r\n }\r\n if (sessionId) {\r\n this._sessionId.next(sessionId);\r\n console.log('[Signalling] Session ID assigned:', sessionId);\r\n }\r\n if (clientPeerId) {\r\n this.setClientPeerId(clientPeerId);\r\n console.log('[Signalling] Client Peer ID received:', clientPeerId);\r\n }\r\n if (isReconnection !== undefined) {\r\n console.log('[Signalling] Is reconnection:', isReconnection);\r\n }\r\n if (iceServers) {\r\n this._iceServers.next(iceServers);\r\n console.log('[Signalling] ICE servers received:', iceServers);\r\n }\r\n console.log('[Signalling] WebRTC connection established:', message);\r\n }\r\n\r\n private handleCheckResponse(message: WebRTCMessage): void {\r\n console.log('[Signalling] Received check.response with peers:', message.peers);\r\n if (message.peers) {\r\n const normalizedPeers = message.peers\r\n .map((peer: any) => ({\r\n id: peer.id,\r\n userId: peer.user_id || peer.userId,\r\n username: peer.username,\r\n peerRole: peer.peer_role || peer.peerRole,\r\n connectionState: peer.connection_state || peer.connectionState,\r\n hasVideo: peer.has_video !== undefined ? peer.has_video : peer.hasVideo,\r\n hasAudio: peer.has_audio !== undefined ? peer.has_audio : peer.hasAudio,\r\n hasScreenShare: peer.has_screen_share !== undefined ? peer.has_screen_share : peer.hasScreenShare\r\n }))\r\n .filter(peer => {\r\n if (peer.id === this._peerId.value) {\r\n console.log('[Signalling] Filtering out self from peer list:', peer.id);\r\n return false;\r\n }\r\n if (peer.connectionState === 'disconnected') {\r\n console.log('[Signalling] Filtering out disconnected peer:', peer.username, peer.id);\r\n return false;\r\n }\r\n return true;\r\n });\r\n\r\n this._peers.next(normalizedPeers);\r\n console.log('[Signalling] Peer list updated, active count:', normalizedPeers.length);\r\n\r\n normalizedPeers.forEach(peer => {\r\n console.log('[Signalling] Discovered peer from check.response:', peer.username, peer.id, 'userId:', peer.userId, 'role:', peer.peerRole, 'state:', peer.connectionState);\r\n const peerCheckMessage: WebRTCMessage = {\r\n type: 'peer.check',\r\n fromPeerId: peer.id,\r\n fromUserId: peer.userId,\r\n fromUsername: peer.username,\r\n peerRole: peer.peerRole\r\n };\r\n this._messages.next(peerCheckMessage);\r\n });\r\n } else {\r\n console.log('[Signalling] No peers in check.response');\r\n }\r\n }\r\n\r\n private handlePeerJoined(message: any): void {\r\n const peerId = message.peer_id || message.peerId;\r\n const userId = message.user_id || message.userId;\r\n const username = message.username;\r\n\r\n console.log('[Signalling] Peer joined:', username, peerId, 'userId:', userId);\r\n\r\n const newPeer: PeerInfo = {\r\n id: peerId,\r\n userId: userId,\r\n username: username,\r\n peerRole: PeerRole.PARTICIPANT,\r\n connectionState: PeerConnectionState.CONNECTING,\r\n hasVideo: false,\r\n hasAudio: false,\r\n hasScreenShare: false\r\n };\r\n\r\n const currentPeers = this._peers.value;\r\n if (!currentPeers.find(p => p.id === peerId)) {\r\n this._peers.next([...currentPeers, newPeer]);\r\n }\r\n\r\n const peerCheckMessage: WebRTCMessage = {\r\n type: 'peer.check',\r\n fromPeerId: peerId,\r\n fromUserId: userId,\r\n fromUsername: username,\r\n peerRole: PeerRole.PARTICIPANT\r\n };\r\n this._messages.next(peerCheckMessage);\r\n }\r\n\r\n private handlePeerLeft(message: any): void {\r\n const peerId = message.peer_id || message.peerId;\r\n const userId = message.user_id || message.userId;\r\n const username = message.username;\r\n\r\n console.log('[Signalling] Peer left:', username, peerId, 'userId:', userId);\r\n\r\n const currentPeers = this._peers.value;\r\n const filteredPeers = currentPeers.filter(p => p.id !== peerId);\r\n if (filteredPeers.length !== currentPeers.length) {\r\n this._peers.next(filteredPeers);\r\n }\r\n\r\n this._messages.next({\r\n type: 'peer.left',\r\n fromPeerId: peerId,\r\n fromUserId: userId,\r\n fromUsername: username\r\n });\r\n }\r\n\r\n get peerId(): string | null {\r\n return this._peerId.value;\r\n }\r\n\r\n get sessionId(): string | null {\r\n return this._sessionId.value;\r\n }\r\n\r\n get connected(): boolean {\r\n return this._connected.value;\r\n }\r\n\r\n get peers(): PeerInfo[] {\r\n return this._peers.value;\r\n }\r\n\r\n get iceServers(): RTCIceServer[] {\r\n return this._iceServers.value;\r\n }\r\n\r\n private getClientPeerId(): string | null {\r\n try {\r\n return sessionStorage.getItem(this.CLIENT_PEER_ID_KEY);\r\n } catch (error) {\r\n console.error('[Signalling] Error reading client peer ID from sessionStorage:', error);\r\n return null;\r\n }\r\n }\r\n\r\n private setClientPeerId(clientPeerId: string): void {\r\n try {\r\n sessionStorage.setItem(this.CLIENT_PEER_ID_KEY, clientPeerId);\r\n this.clientPeerId = clientPeerId;\r\n } catch (error) {\r\n console.error('[Signalling] Error saving client peer ID to sessionStorage:', error);\r\n }\r\n }\r\n\r\n clearClientPeerId(): void {\r\n try {\r\n sessionStorage.removeItem(this.CLIENT_PEER_ID_KEY);\r\n this.clientPeerId = null;\r\n console.log('[Signalling] Client peer ID cleared from sessionStorage');\r\n } catch (error) {\r\n console.error('[Signalling] Error clearing client peer ID from sessionStorage:', error);\r\n }\r\n }\r\n}\r\n","import { Injectable, NgZone } from '@angular/core';\r\nimport { BehaviorSubject, Subject, Subscription } from 'rxjs';\r\nimport { WebRTCSignallingService } from './webrtc-signalling';\r\nimport {\r\n WebRTCMessage,\r\n PeerConnection,\r\n PeerInfo,\r\n PeerRole,\r\n PeerConnectionState,\r\n WebRTCConfig,\r\n MediaConstraintsConfig,\r\n ChatMessage,\r\n DataChannelMessage,\r\n FileOfferData,\r\n FileTransferRequest,\r\n FileTransferAccept,\r\n FileChunk,\r\n FileTransferProgress,\r\n FileTransferState\r\n} from '../models/webrtc';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class WebRTCService {\r\n private peerConnections: Map<string, PeerConnection> = new Map();\r\n private localStream?: MediaStream;\r\n private signallingSubscription?: Subscription;\r\n private fileTransfers: Map<string, FileTransferState> = new Map();\r\n private readonly DEFAULT_CHUNK_SIZE = 16384;\r\n private role: PeerRole = PeerRole.PARTICIPANT;\r\n\r\n private _localStreamReady = new BehaviorSubject<boolean>(false);\r\n private _remoteStreams = new BehaviorSubject<Map<string, MediaStream>>(new Map());\r\n private _connectionState = new BehaviorSubject<'disconnected' | 'connecting' | 'connected'>('disconnected');\r\n private _activePeers = new BehaviorSubject<PeerInfo[]>([]);\r\n private _chatMessages = new Subject<ChatMessage>();\r\n private _fileTransferProgress = new Subject<FileTransferProgress>();\r\n private _dataChannelReady = new BehaviorSubject<boolean>(false);\r\n\r\n localStreamReady$ = this._localStreamReady.asObservable();\r\n remoteStreams$ = this._remoteStreams.asObservable();\r\n connectionState$ = this._connectionState.asObservable();\r\n activePeers$ = this._activePeers.asObservable();\r\n chatMessages$ = this._chatMessages.asObservable();\r\n fileTransferProgress$ = this._fileTransferProgress.asObservable();\r\n dataChannelReady$ = this._dataChannelReady.asObservable();\r\n\r\n private defaultConfig: WebRTCConfig = {\r\n iceServers: [\r\n { urls: 'stun:stun.l.google.com:19302' },\r\n { urls: 'stun:stun1.l.google.com:19302' }\r\n ],\r\n iceCandidatePoolSize: 10,\r\n iceTransportPolicy: 'all',\r\n bundlePolicy: 'max-bundle',\r\n rtcpMuxPolicy: 'require'\r\n };\r\n\r\n private defaultMediaConstraints: MediaConstraintsConfig = {\r\n video: {\r\n width: { ideal: 1280 },\r\n height: { ideal: 720 },\r\n frameRate: { ideal: 30 }\r\n },\r\n audio: true\r\n };\r\n\r\n constructor(\r\n private signalling: WebRTCSignallingService,\r\n private zone: NgZone\r\n ) {}\r\n\r\n async startSession(\r\n sessionId: string,\r\n role: PeerRole = PeerRole.PARTICIPANT,\r\n enableVideo: boolean = true,\r\n enableAudio: boolean = true\r\n ): Promise<void> {\r\n this.role = role;\r\n this._connectionState.next('connecting');\r\n\r\n console.log('[WebRTC] Starting session with role:', role);\r\n\r\n if (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 this.signalling.peerId$.subscribe(peerId => {\r\n if (peerId) {\r\n console.log('[WebRTC] Peer ID assigned, sending check with role:', role);\r\n this.signalling.sendCheck(role);\r\n }\r\n });\r\n\r\n this.signalling.peers$.subscribe(peers => {\r\n console.log('[WebRTC] Peers list updated:', peers);\r\n this._activePeers.next(peers);\r\n });\r\n }\r\n\r\n async startLocalMedia(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 case 'peer.left':\r\n if (message.fromPeerId) {\r\n this.handlePeerLeft(message.fromPeerId);\r\n }\r\n break;\r\n }\r\n } catch (error) {\r\n console.error('Error handling signalling message:', error);\r\n }\r\n }\r\n\r\n private async handlePeerCheck(peerId: string, userId: number, username: string, role: PeerRole): Promise<void> {\r\n if (peerId === this.signalling.peerId) {\r\n console.log(`[WebRTC] Ignoring peer check from self: ${peerId}`);\r\n return;\r\n }\r\n\r\n if (!this.peerConnections.has(peerId)) {\r\n console.log(`[WebRTC] New peer discovered: ${username} (${peerId}) as ${role}`);\r\n\r\n const pc = await this.createPeerConnection(peerId, userId, username, role);\r\n\r\n const shouldInitiate = this.shouldInitiateConnection(peerId, role);\r\n\r\n if (shouldInitiate) {\r\n console.log(`[WebRTC] Initiating connection to ${username} (${peerId})`);\r\n 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 } else {\r\n console.log(`[WebRTC] Waiting for ${username} (${peerId}) to initiate connection`);\r\n }\r\n } else {\r\n console.log(`[WebRTC] Peer connection already exists for: ${peerId}`);\r\n }\r\n }\r\n\r\n private async handleOffer(peerId: string, userId: number, username: string, sdp: RTCSessionDescriptionInit): Promise<void> {\r\n let pc: RTCPeerConnection;\r\n\r\n if (!this.peerConnections.has(peerId)) {\r\n pc = await this.createPeerConnection(peerId, userId, username, PeerRole.PARTICIPANT);\r\n } else {\r\n pc = this.peerConnections.get(peerId)!.pc;\r\n }\r\n\r\n await pc.setRemoteDescription(new RTCSessionDescription(sdp));\r\n\r\n const answer = await pc.createAnswer();\r\n await pc.setLocalDescription(answer);\r\n\r\n if (pc.localDescription) {\r\n this.signalling.sendAnswer(peerId, pc.localDescription);\r\n\r\n const connection = this.peerConnections.get(peerId);\r\n if (connection) {\r\n connection.answered = true;\r\n }\r\n }\r\n\r\n const connection = this.peerConnections.get(peerId);\r\n if (connection && connection.queuedCandidates.length > 0) {\r\n await Promise.all(\r\n connection.queuedCandidates.map(candidate => pc.addIceCandidate(candidate))\r\n );\r\n connection.queuedCandidates = [];\r\n }\r\n }\r\n\r\n private async handleAnswer(peerId: string, sdp: RTCSessionDescriptionInit): Promise<void> {\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection) {\r\n console.warn(`Received answer from unknown peer: ${peerId}`);\r\n return;\r\n }\r\n\r\n await connection.pc.setRemoteDescription(new RTCSessionDescription(sdp));\r\n\r\n if (connection.queuedCandidates.length > 0) {\r\n await Promise.all(\r\n connection.queuedCandidates.map(candidate => connection.pc.addIceCandidate(candidate))\r\n );\r\n connection.queuedCandidates = [];\r\n }\r\n }\r\n\r\n private async handleIceCandidate(peerId: string, candidate: RTCIceCandidateInit): Promise<void> {\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection) {\r\n console.warn(`Received ICE candidate from unknown peer: ${peerId}`);\r\n return;\r\n }\r\n\r\n const iceCandidate = new RTCIceCandidate(candidate);\r\n\r\n if (connection.pc.remoteDescription) {\r\n await connection.pc.addIceCandidate(iceCandidate);\r\n } else {\r\n connection.queuedCandidates.push(iceCandidate);\r\n }\r\n }\r\n\r\n private handlePeerStateUpdate(message: WebRTCMessage): void {\r\n console.log('Peer state update:', message);\r\n }\r\n\r\n private handlePeerLeft(peerId: string): void {\r\n console.log(`[WebRTC] Peer left: ${peerId}`);\r\n\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection) {\r\n console.log(`[WebRTC] No connection found for peer: ${peerId}`);\r\n return;\r\n }\r\n\r\n if (connection.dataChannel) {\r\n connection.dataChannel.close();\r\n }\r\n\r\n connection.pc.close();\r\n\r\n this.peerConnections.delete(peerId);\r\n\r\n const streams = this._remoteStreams.value;\r\n streams.delete(peerId);\r\n this._remoteStreams.next(streams);\r\n\r\n this.updateDataChannelReadyState();\r\n\r\n console.log(`[WebRTC] Cleaned up connection for peer: ${peerId}`);\r\n }\r\n\r\n private async createPeerConnection(\r\n peerId: string,\r\n userId: number,\r\n username: string,\r\n role: PeerRole\r\n ): Promise<RTCPeerConnection> {\r\n const iceServers = this.signalling.iceServers;\r\n const config: WebRTCConfig = iceServers.length > 0\r\n ? { ...this.defaultConfig, iceServers }\r\n : this.defaultConfig;\r\n\r\n const pc = new RTCPeerConnection(config);\r\n\r\n const dataChannel = pc.createDataChannel('data', { ordered: true });\r\n this.setupDataChannelHandlers(dataChannel, peerId);\r\n\r\n if (this.localStream) {\r\n 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 this.updateDataChannelReadyState();\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 this.updateDataChannelReadyState();\r\n };\r\n\r\n dataChannel.onerror = (error) => {\r\n console.error(`Data channel error with peer ${peerId}:`, error);\r\n this.updateDataChannelReadyState();\r\n };\r\n }\r\n\r\n private updateDataChannelReadyState(): void {\r\n const hasOpenChannel = Array.from(this.peerConnections.values()).some(\r\n conn => conn.dataChannel && conn.dataChannel.readyState === 'open'\r\n );\r\n this._dataChannelReady.next(hasOpenChannel);\r\n }\r\n\r\n private handleDataChannelMessage(data: string | ArrayBuffer, peerId: string): void {\r\n if (data instanceof ArrayBuffer) {\r\n return;\r\n }\r\n\r\n try {\r\n const message: DataChannelMessage = JSON.parse(data);\r\n\r\n this.zone.run(() => {\r\n switch (message.type) {\r\n case 'chat':\r\n const chatMessage: ChatMessage = message.data as ChatMessage;\r\n this._chatMessages.next(chatMessage);\r\n console.log('Chat message received:', chatMessage);\r\n break;\r\n\r\n case 'file_request':\r\n this.handleFileRequest(message.data as FileTransferRequest, peerId);\r\n break;\r\n\r\n case 'file_accept':\r\n this.handleFileAccept(message.data as FileTransferAccept, peerId);\r\n break;\r\n\r\n case 'file_chunk':\r\n this.handleFileChunk(message.data as FileChunk);\r\n break;\r\n\r\n case 'file_complete':\r\n this.handleFileComplete(message.data.fileId);\r\n break;\r\n\r\n case 'file_cancel':\r\n this.handleFileCancel(message.data.fileId);\r\n break;\r\n\r\n case 'ping':\r\n this.sendDataChannelMessage(peerId, { type: 'pong', data: {} });\r\n break;\r\n\r\n case 'pong':\r\n console.log(`Received pong from peer ${peerId}`);\r\n break;\r\n\r\n default:\r\n console.log('Unknown data channel message type:', message.type);\r\n }\r\n });\r\n } catch (error) {\r\n console.error('Error parsing data channel message:', error);\r\n }\r\n }\r\n\r\n sendChatMessage(message: string): void {\r\n const openConnections = Array.from(this.peerConnections.values()).filter(\r\n conn => conn.dataChannel && conn.dataChannel.readyState === 'open'\r\n );\r\n\r\n if (openConnections.length === 0) {\r\n console.warn('No open data channels available');\r\n return;\r\n }\r\n\r\n const chatMessage: ChatMessage = {\r\n type: 'chat',\r\n peerId: this.signalling.peerId || 'unknown',\r\n userId: 0,\r\n username: 'You',\r\n message: message,\r\n timestamp: new Date().toISOString()\r\n };\r\n\r\n const dataChannelMessage: DataChannelMessage = {\r\n type: 'chat',\r\n data: chatMessage\r\n };\r\n\r\n let sentCount = 0;\r\n this.peerConnections.forEach((conn) => {\r\n if (this.sendDataChannelMessage(conn.peerId, dataChannelMessage)) {\r\n sentCount++;\r\n }\r\n });\r\n\r\n if (sentCount > 0) {\r\n this._chatMessages.next(chatMessage);\r\n } else {\r\n console.warn('Failed to send message to any peer');\r\n }\r\n }\r\n\r\n private sendDataChannelMessage(peerId: string, message: DataChannelMessage): boolean {\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection || !connection.dataChannel) {\r\n console.warn(`No data channel available for peer ${peerId}`);\r\n return false;\r\n }\r\n\r\n if (connection.dataChannel.readyState !== 'open') {\r\n console.warn(`Data channel not open for peer ${peerId}, state: ${connection.dataChannel.readyState}`);\r\n return false;\r\n }\r\n\r\n try {\r\n connection.dataChannel.send(JSON.stringify(message));\r\n return true;\r\n } catch (error) {\r\n console.error(`Error sending data channel message to peer ${peerId}:`, error);\r\n return false;\r\n }\r\n }\r\n\r\n private closePeerConnection(peerId: string): void {\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection) return;\r\n\r\n connection.pc.close();\r\n this.peerConnections.delete(peerId);\r\n\r\n const streams = this._remoteStreams.value;\r\n streams.delete(peerId);\r\n this._remoteStreams.next(streams);\r\n\r\n console.log(`Closed peer connection with ${peerId}`);\r\n }\r\n\r\n private shouldInitiateConnection(targetPeerId: string, peerRole: PeerRole): boolean {\r\n const myPeerId = this.signalling.peerId;\r\n if (!myPeerId) {\r\n console.log('[WebRTC] No peer ID yet, cannot determine initiation');\r\n return false;\r\n }\r\n\r\n const shouldInitiate = myPeerId < targetPeerId;\r\n console.log(`[WebRTC] Connection initiation: myId(${myPeerId.substring(0, 8)}...) < targetId(${targetPeerId.substring(0, 8)}...) = ${shouldInitiate}`);\r\n console.log(`[WebRTC] Roles (for info only): My role: ${this.role}, Target role: ${peerRole}`);\r\n return shouldInitiate;\r\n }\r\n\r\n private replaceTracksInAllPeers(): void {\r\n if (!this.localStream) return;\r\n\r\n this.peerConnections.forEach((connection) => {\r\n const senders = connection.pc.getSenders();\r\n\r\n this.localStream!.getTracks().forEach(track => {\r\n const sender = senders.find(s => s.track?.kind === track.kind);\r\n\r\n if (sender) {\r\n sender.replaceTrack(track).catch(error => {\r\n console.error(`Error replacing ${track.kind} track:`, error);\r\n });\r\n } else {\r\n connection.pc.addTrack(track, this.localStream!);\r\n }\r\n });\r\n });\r\n }\r\n\r\n private updatePeerState(\r\n connectionState?: PeerConnectionState,\r\n hasVideo?: boolean,\r\n hasAudio?: boolean,\r\n hasScreenShare?: boolean\r\n ): void {\r\n this.signalling.sendPeerState(connectionState, hasVideo, hasAudio, hasScreenShare);\r\n }\r\n\r\n offerFile(file: File): void {\r\n const fileId = `${Date.now()}-${Math.random().toString(36).substring(7)}`;\r\n const chunkSize = this.DEFAULT_CHUNK_SIZE;\r\n const totalChunks = Math.ceil(file.size / chunkSize);\r\n\r\n const fileOffer: FileOfferData = {\r\n fileId,\r\n fileName: file.name,\r\n fileSize: file.size,\r\n fileType: file.type,\r\n chunkSize,\r\n totalChunks\r\n };\r\n\r\n const fileTransfer: FileTransferState = {\r\n fileId,\r\n fileName: file.name,\r\n fileSize: file.size,\r\n fileType: file.type,\r\n file,\r\n chunks: new Map(),\r\n totalChunks,\r\n chunkSize,\r\n sentChunks: 0,\r\n receivedChunks: 0,\r\n status: 'pending',\r\n requestedBy: new Set()\r\n };\r\n\r\n this.fileTransfers.set(fileId, fileTransfer);\r\n\r\n const chatMessage: ChatMessage = {\r\n type: 'chat',\r\n peerId: this.signalling.peerId || 'unknown',\r\n userId: 0,\r\n username: 'You',\r\n message: `📎 ${file.name} (${this.formatFileSize(file.size)})`,\r\n timestamp: new Date().toISOString(),\r\n fileOffer\r\n };\r\n\r\n const dataChannelMessage: DataChannelMessage = {\r\n type: 'chat',\r\n data: chatMessage\r\n };\r\n\r\n this.peerConnections.forEach((conn) => {\r\n this.sendDataChannelMessage(conn.peerId, dataChannelMessage);\r\n });\r\n\r\n this._chatMessages.next(chatMessage);\r\n\r\n console.log('File offered:', fileOffer);\r\n }\r\n\r\n requestFile(fileId: string): void {\r\n const request: FileTransferRequest = {\r\n type: 'file_request',\r\n fileId,\r\n requesterId: this.signalling.peerId || 'unknown'\r\n };\r\n\r\n this.peerConnections.forEach((conn) => {\r\n this.sendDataChannelMessage(conn.peerId, {\r\n type: 'file_request',\r\n data: request\r\n });\r\n });\r\n\r\n console.log('File requested:', fileId);\r\n }\r\n\r\n private handleFileRequest(request: FileTransferRequest, fromPeerId: string): void {\r\n const transfer = this.fileTransfers.get(request.fileId);\r\n if (!transfer || !transfer.file) {\r\n console.warn('File not found for request:', request.fileId);\r\n return;\r\n }\r\n\r\n transfer.requestedBy.add(fromPeerId);\r\n transfer.status = 'transferring';\r\n\r\n const accept: FileTransferAccept = {\r\n type: 'file_accept',\r\n fileId: request.fileId,\r\n toPeerId: request.requesterId\r\n };\r\n\r\n this.sendDataChannelMessage(fromPeerId, {\r\n type: 'file_accept',\r\n data: accept\r\n });\r\n\r\n this.startSendingFile(request.fileId, fromPeerId);\r\n }\r\n\r\n private async handleFileAccept(accept: FileTransferAccept, fromPeerId: string): Promise<void> {\r\n console.log('File transfer accepted:', accept.fileId);\r\n\r\n const chatMessages = (this._chatMessages as any)._buffer || [];\r\n const relatedMessage = chatMessages.find((msg: ChatMessage) => msg.fileOffer?.fileId === accept.fileId);\r\n\r\n if (!relatedMessage?.fileOffer) {\r\n console.error('Cannot find file offer for accepted transfer:', accept.fileId);\r\n return;\r\n }\r\n\r\n const fileOffer = relatedMessage.fileOffer;\r\n\r\n try {\r\n const downloadStream = await this.createFileDownloadStream(fileOffer.fileName);\r\n\r\n const transfer: FileTransferState = {\r\n fileId: accept.fileId,\r\n fileName: fileOffer.fileName,\r\n fileSize: fileOffer.fileSize,\r\n fileType: fileOffer.fileType,\r\n chunks: new Map(),\r\n totalChunks: fileOffer.totalChunks,\r\n chunkSize: fileOffer.chunkSize,\r\n sentChunks: 0,\r\n receivedChunks: 0,\r\n status: 'transferring',\r\n requestedBy: new Set(),\r\n downloadStream: downloadStream,\r\n streamWriter: downloadStream.getWriter()\r\n };\r\n\r\n this.fileTransfers.set(accept.fileId, transfer);\r\n console.log('Streaming download started for:', fileOffer.fileName);\r\n } catch (error) {\r\n console.error('Failed to create download stream:', error);\r\n\r\n const transfer: FileTransferState = {\r\n fileId: accept.fileId,\r\n fileName: fileOffer.fileName,\r\n fileSize: fileOffer.fileSize,\r\n fileType: fileOffer.fileType,\r\n chunks: new Map(),\r\n totalChunks: fileOffer.totalChunks,\r\n chunkSize: fileOffer.chunkSize,\r\n sentChunks: 0,\r\n receivedChunks: 0,\r\n status: 'transferring',\r\n requestedBy: new Set()\r\n };\r\n\r\n this.fileTransfers.set(accept.fileId, transfer);\r\n console.log('Fallback to in-memory assembly for:', fileOffer.fileName);\r\n }\r\n }\r\n\r\n private async createFileDownloadStream(fileName: string): Promise<WritableStream<Uint8Array>> {\r\n if ('showSaveFilePicker' in window) {\r\n try {\r\n const handle = await (window as any).showSaveFilePicker({\r\n suggestedName: fileName,\r\n types: [{\r\n description: 'File',\r\n accept: { '*/*': [] }\r\n }]\r\n });\r\n\r\n const writable = await handle.createWritable();\r\n return writable;\r\n } catch (error) {\r\n if ((error as Error).name === 'AbortError') {\r\n throw new Error('User cancelled file save');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n return this.createStreamSaverFallback(fileName);\r\n }\r\n\r\n private createStreamSaverFallback(fileName: string): WritableStream<Uint8Array> {\r\n let chunks: Uint8Array[] = [];\r\n\r\n return new WritableStream<Uint8Array>({\r\n write(chunk) {\r\n chunks.push(chunk);\r\n },\r\n close() {\r\n const blob = new Blob(chunks);\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = fileName;\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url);\r\n chunks = [];\r\n },\r\n abort(reason) {\r\n console.error('Stream aborted:', reason);\r\n chunks = [];\r\n }\r\n });\r\n }\r\n\r\n private async startSendingFile(fileId: string, toPeerId: string): Promise<void> {\r\n const transfer = this.fileTransfers.get(fileId);\r\n if (!transfer || !transfer.file) {\r\n console.error('File transfer not found:', fileId);\r\n return;\r\n }\r\n\r\n const file = transfer.file;\r\n let offset = 0;\r\n let chunkIndex = 0;\r\n\r\n while (offset < file.size) {\r\n const chunk = file.slice(offset, offset + transfer.chunkSize);\r\n const arrayBuffer = await chunk.arrayBuffer();\r\n\r\n const fileChunk: FileChunk = {\r\n type: 'file_chunk',\r\n fileId,\r\n chunkIndex,\r\n totalChunks: transfer.totalChunks,\r\n data: arrayBuffer,\r\n isLast: offset + transfer.chunkSize >= file.size\r\n };\r\n\r\n const base64Data = this.arrayBufferToBase64(arrayBuffer);\r\n\r\n this.sendDataChannelMessage(toPeerId, {\r\n type: 'file_chunk',\r\n data: {\r\n ...fileChunk,\r\n data: base64Data\r\n }\r\n });\r\n\r\n transfer.sentChunks++;\r\n offset += transfer.chunkSize;\r\n chunkIndex++;\r\n\r\n await new Promise(resolve => setTimeout(resolve, 10));\r\n }\r\n\r\n this.sendDataChannelMessage(toPeerId, {\r\n type: 'file_complete',\r\n data: { fileId }\r\n });\r\n\r\n console.log('File sending completed:', fileId);\r\n }\r\n\r\n private async handleFileChunk(chunk: any): Promise<void> {\r\n const fileId = chunk.fileId;\r\n let transfer = this.fileTransfers.get(fileId);\r\n\r\n if (!transfer) {\r\n console.warn('File transfer not found:', fileId);\r\n return;\r\n }\r\n\r\n const arrayBuffer = this.base64ToArrayBuffer(chunk.data);\r\n const uint8Array = new Uint8Array(arrayBuffer);\r\n\r\n if (transfer.streamWriter) {\r\n try {\r\n await transfer.streamWriter.write(uint8Array);\r\n console.log(`Streamed chunk ${chunk.chunkIndex + 1}/${transfer.totalChunks} directly to disk`);\r\n } catch (error) {\r\n console.error('Error writing to stream, falling back to in-memory:', error);\r\n transfer.streamWriter = undefined;\r\n transfer.chunks.set(chunk.chunkIndex, arrayBuffer);\r\n }\r\n } else {\r\n transfer.chunks.set(chunk.chunkIndex, arrayBuffer);\r\n }\r\n\r\n transfer.receivedChunks++;\r\n\r\n const progress: FileTransferProgress = {\r\n fileId,\r\n fileName: transfer.fileName,\r\n fileSize: transfer.fileSize,\r\n chunksReceived: transfer.receivedChunks,\r\n totalChunks: transfer.totalChunks,\r\n bytesReceived: transfer.receivedChunks * transfer.chunkSize,\r\n percentage: (transfer.receivedChunks / transfer.totalChunks) * 100\r\n };\r\n\r\n this.zone.run(() => {\r\n this._fileTransferProgress.next(progress);\r\n });\r\n }\r\n\r\n private async handleFileComplete(fileId: string): Promise<void> {\r\n const transfer = this.fileTransfers.get(fileId);\r\n if (!transfer) {\r\n console.warn('File transfer not found:', fileId);\r\n return;\r\n }\r\n\r\n transfer.status = 'completed';\r\n\r\n if (transfer.streamWriter) {\r\n try {\r\n await transfer.streamWriter.close();\r\n console.log('File streamed to disk successfully:', transfer.fileName);\r\n } catch (error) {\r\n console.error('Error closing stream:', error);\r\n }\r\n } else {\r\n const chunks: ArrayBuffer[] = [];\r\n for (let i = 0; i < transfer.totalChunks; i++) {\r\n const chunk = transfer.chunks.get(i);\r\n if (chunk) {\r\n chunks.push(chunk);\r\n }\r\n }\r\n\r\n const blob = new Blob(chunks, { type: transfer.fileType });\r\n const url = URL.createObjectURL(blob);\r\n\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = transfer.fileName;\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url);\r\n\r\n console.log('File downloaded from memory:', transfer.fileName);\r\n }\r\n\r\n this.fileTransfers.delete(fileId);\r\n }\r\n\r\n private async handleFileCancel(fileId: string): Promise<void> {\r\n const transfer = this.fileTransfers.get(fileId);\r\n if (transfer) {\r\n transfer.status = 'failed';\r\n\r\n if (transfer.streamWriter) {\r\n try {\r\n await transfer.streamWriter.abort('Transfer cancelled');\r\n } catch (error) {\r\n console.error('Error aborting stream:', error);\r\n }\r\n }\r\n\r\n this.fileTransfers.delete(fileId);\r\n console.log('File transfer cancelled:', fileId);\r\n }\r\n }\r\n\r\n async cancelFileTransfer(fileId: string): Promise<void> {\r\n const transfer = this.fileTransfers.get(fileId);\r\n if (!transfer) return;\r\n\r\n if (transfer.streamWriter) {\r\n try {\r\n await transfer.streamWriter.abort('Transfer cancelled by user');\r\n } catch (error) {\r\n console.error('Error aborting stream:', error);\r\n }\r\n }\r\n\r\n this.peerConnections.forEach((conn) => {\r\n this.sendDataChannelMessage(conn.peerId, {\r\n type: 'file_cancel',\r\n data: { fileId }\r\n });\r\n });\r\n\r\n this.fileTransfers.delete(fileId);\r\n console.log('File transfer cancelled:', fileId);\r\n }\r\n\r\n private arrayBufferToBase64(buffer: ArrayBuffer): string {\r\n const bytes = new Uint8Array(buffer);\r\n let binary = '';\r\n for (let i = 0; i < bytes.byteLength; i++) {\r\n binary += String.fromCharCode(bytes[i]);\r\n }\r\n return btoa(binary);\r\n }\r\n\r\n private base64ToArrayBuffer(base64: string): ArrayBuffer {\r\n const binary = atob(base64);\r\n const bytes = new Uint8Array(binary.length);\r\n for (let i = 0; i < binary.length; i++) {\r\n bytes[i] = binary.charCodeAt(i);\r\n }\r\n return bytes.buffer;\r\n }\r\n\r\n private formatFileSize(bytes: number): string {\r\n if (bytes === 0) return '0 Bytes';\r\n const k = 1024;\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];\r\n }\r\n\r\n get localMediaStream(): MediaStream | undefined {\r\n return this.localStream;\r\n }\r\n\r\n get isConnected(): boolean {\r\n return this._connectionState.value === 'connected';\r\n }\r\n\r\n get activePeerConnections(): PeerConnection[] {\r\n return Array.from(this.peerConnections.values());\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService, PaginatedResponse } from '@noatgnu/cupcake-core';\r\nimport {\r\n WebRTCSession,\r\n WebRTCSessionCreate,\r\n WebRTCSessionUpdate,\r\n WebRTCSessionQueryParams\r\n} from '../models/webrtc';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class WebRTCSessionService extends BaseApiService {\r\n private modelName = 'webrtc-sessions';\r\n private baseUrl = `${this.apiUrl}/${this.modelName}`;\r\n\r\n getSessions(params?: WebRTCSessionQueryParams): Observable<PaginatedResponse<WebRTCSession>> {\r\n const httpParams = params ? this.buildHttpParams(params) : undefined;\r\n return this.get<PaginatedResponse<WebRTCSession>>(`${this.baseUrl}/`, { params: httpParams });\r\n }\r\n\r\n getSession(id: string): Observable<WebRTCSession> {\r\n return this.get<WebRTCSession>(`${this.baseUrl}/${id}/`);\r\n }\r\n\r\n createSession(data: WebRTCSessionCreate): Observable<WebRTCSession> {\r\n return this.post<WebRTCSession>(`${this.baseUrl}/`, data);\r\n }\r\n\r\n updateSession(id: string, data: WebRTCSessionUpdate): Observable<WebRTCSession> {\r\n return this.patch<WebRTCSession>(`${this.baseUrl}/${id}/`, data);\r\n }\r\n\r\n endSession(id: string): Observable<{ message: string; session_id: string }> {\r\n return this.post<{ message: string; session_id: string }>(\r\n `${this.baseUrl}/${id}/end_session/`,\r\n {}\r\n );\r\n }\r\n\r\n deleteSession(id: string): Observable<void> {\r\n return this.delete<void>(`${this.baseUrl}/${id}/`);\r\n }\r\n}\r\n","// Communication and messaging services\r\nexport * from './notification';\r\nexport * from './message-thread';\r\nexport * from './message';\r\nexport * from './thread-participant';\r\nexport * from './communication-websocket';\r\nexport * from './webrtc-signalling';\r\nexport * from './webrtc';\r\nexport * from './webrtc-session';","/*\n * Public API Surface of cupcake-mint-chocolate\n */\n\nexport * from './lib/cupcake-mint-chocolate';\n\nexport * from './lib/models';\n\nexport * from './lib/services';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.WebRTCSignallingService"],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -842,7 +842,7 @@ declare class CommunicationWebSocketService implements OnDestroy {
|
|
|
842
842
|
private reconnectTimer;
|
|
843
843
|
private messageSubject;
|
|
844
844
|
private connectionStateSubject;
|
|
845
|
-
connectionState$: Observable<"
|
|
845
|
+
connectionState$: Observable<"disconnected" | "connecting" | "connected">;
|
|
846
846
|
messages$: Observable<WebSocketIncomingMessage>;
|
|
847
847
|
newNotifications$: Observable<NewNotificationEvent>;
|
|
848
848
|
newMessages$: Observable<NewMessageEvent>;
|
|
@@ -919,6 +919,7 @@ declare class WebRTCService {
|
|
|
919
919
|
private signallingSubscription?;
|
|
920
920
|
private fileTransfers;
|
|
921
921
|
private readonly DEFAULT_CHUNK_SIZE;
|
|
922
|
+
private role;
|
|
922
923
|
private _localStreamReady;
|
|
923
924
|
private _remoteStreams;
|
|
924
925
|
private _connectionState;
|
|
@@ -928,7 +929,7 @@ declare class WebRTCService {
|
|
|
928
929
|
private _dataChannelReady;
|
|
929
930
|
localStreamReady$: rxjs.Observable<boolean>;
|
|
930
931
|
remoteStreams$: rxjs.Observable<Map<string, MediaStream>>;
|
|
931
|
-
connectionState$: rxjs.Observable<"
|
|
932
|
+
connectionState$: rxjs.Observable<"disconnected" | "connecting" | "connected">;
|
|
932
933
|
activePeers$: rxjs.Observable<PeerInfo[]>;
|
|
933
934
|
chatMessages$: rxjs.Observable<ChatMessage>;
|
|
934
935
|
fileTransferProgress$: rxjs.Observable<FileTransferProgress>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@noatgnu/cupcake-mint-chocolate",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.20",
|
|
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",
|