@noatgnu/cupcake-mint-chocolate 1.2.4 → 1.2.5

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.
@@ -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/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/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 { 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","// 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';","/*\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":[],"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/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\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 thread?: string;\r\n sessionType: WebRTCSessionType;\r\n sessionStatus: WebRTCSessionStatus;\r\n initiatedBy: number;\r\n participants: number[];\r\n startedAt: string;\r\n endedAt?: string;\r\n}\r\n\r\nexport interface WebRTCPeer extends BaseTimestampedModel {\r\n id: string;\r\n session: string;\r\n user: number;\r\n 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 WebRTCSignal extends BaseTimestampedModel {\r\n id: string;\r\n session: string;\r\n fromPeer: string;\r\n toPeer?: string;\r\n signalType: SignalType;\r\n signalData: any;\r\n delivered: boolean;\r\n}\r\n\r\nexport interface PeerInfo {\r\n id: string;\r\n userId: number;\r\n username: string;\r\n peerRole: PeerRole;\r\n connectionState: PeerConnectionState;\r\n hasVideo: boolean;\r\n hasAudio: boolean;\r\n hasScreenShare: boolean;\r\n}\r\n\r\nexport interface WebRTCMessage {\r\n type: 'connection.established' | 'check.response' | 'peer.check' | 'offer' | 'answer' | 'ice_candidate' | 'peer.state_update' | 'error';\r\n message?: string;\r\n peerId?: string;\r\n sessionId?: string;\r\n userId?: number;\r\n username?: string;\r\n fromPeerId?: string;\r\n fromUserId?: number;\r\n fromUsername?: string;\r\n toPeerId?: string;\r\n sdp?: RTCSessionDescriptionInit;\r\n candidate?: RTCIceCandidateInit;\r\n peers?: PeerInfo[];\r\n peerRole?: PeerRole;\r\n connectionState?: PeerConnectionState;\r\n hasVideo?: boolean;\r\n hasAudio?: boolean;\r\n hasScreenShare?: boolean;\r\n iceServers?: RTCIceServer[];\r\n}\r\n\r\nexport interface WebRTCConfig {\r\n iceServers: RTCIceServer[];\r\n iceCandidatePoolSize?: number;\r\n iceTransportPolicy?: RTCIceTransportPolicy;\r\n bundlePolicy?: RTCBundlePolicy;\r\n rtcpMuxPolicy?: RTCRtcpMuxPolicy;\r\n}\r\n\r\nexport interface MediaConstraintsConfig {\r\n video?: boolean | MediaTrackConstraints;\r\n audio?: boolean | MediaTrackConstraints;\r\n}\r\n\r\nexport interface PeerConnection {\r\n peerId: string;\r\n userId: number;\r\n username: string;\r\n pc: RTCPeerConnection;\r\n dataChannel?: RTCDataChannel;\r\n stream?: MediaStream;\r\n role: PeerRole;\r\n offered: boolean;\r\n answered: boolean;\r\n connected: boolean;\r\n queuedCandidates: RTCIceCandidate[];\r\n}\r\n","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 } from '@angular/core';\r\nimport { webSocket, WebSocketSubject } from 'rxjs/webSocket';\r\nimport { BehaviorSubject, Subject, Subscription } from 'rxjs';\r\nimport { AuthService } from '@noatgnu/cupcake-core';\r\nimport {\r\n WebRTCMessage,\r\n PeerInfo,\r\n PeerRole,\r\n PeerConnectionState\r\n} from '../models/webrtc';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class WebRTCSignallingService {\r\n private ws?: WebSocketSubject<WebRTCMessage>;\r\n private wsSubscription?: Subscription;\r\n private baseUrl: string = '';\r\n\r\n private _connected = new BehaviorSubject<boolean>(false);\r\n private _peerId = new BehaviorSubject<string | null>(null);\r\n private _sessionId = new BehaviorSubject<string | null>(null);\r\n private _peers = new BehaviorSubject<PeerInfo[]>([]);\r\n private _messages = new Subject<WebRTCMessage>();\r\n private _iceServers = new BehaviorSubject<RTCIceServer[]>([]);\r\n\r\n connected$ = this._connected.asObservable();\r\n peerId$ = this._peerId.asObservable();\r\n sessionId$ = this._sessionId.asObservable();\r\n peers$ = this._peers.asObservable();\r\n messages$ = this._messages.asObservable();\r\n iceServers$ = this._iceServers.asObservable();\r\n\r\n 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 const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';\r\n const host = window.location.host;\r\n return `${protocol}//${host}`;\r\n }\r\n\r\n connect(sessionId: string): void {\r\n this.disconnect();\r\n\r\n const token = this.authService.getAccessToken();\r\n if (!token) {\r\n console.error('No authentication token available');\r\n return;\r\n }\r\n\r\n const wsUrl = `${this.baseUrl}/ws/ccmc/webrtc/${sessionId}/?token=${token}`;\r\n\r\n this.ws = webSocket<WebRTCMessage>({\r\n url: wsUrl,\r\n openObserver: {\r\n next: () => {\r\n console.log('WebRTC signalling connection opened');\r\n this.zone.run(() => {\r\n this._connected.next(true);\r\n });\r\n }\r\n },\r\n closeObserver: {\r\n next: () => {\r\n console.log('WebRTC signalling connection closed');\r\n this.zone.run(() => {\r\n this._connected.next(false);\r\n this._peerId.next(null);\r\n });\r\n }\r\n },\r\n deserializer: msg => {\r\n try {\r\n return JSON.parse(msg.data);\r\n } catch (e) {\r\n console.error('Error parsing WebSocket message:', e);\r\n return msg.data;\r\n }\r\n }\r\n });\r\n\r\n this.wsSubscription = this.ws.subscribe({\r\n next: (message: WebRTCMessage) => {\r\n this.zone.run(() => {\r\n this.handleMessage(message);\r\n });\r\n },\r\n error: (error) => {\r\n console.error('WebRTC signalling error:', error);\r\n this.zone.run(() => {\r\n this._connected.next(false);\r\n });\r\n\r\n setTimeout(() => {\r\n if (this._sessionId.value) {\r\n console.log('Attempting to reconnect...');\r\n this.connect(this._sessionId.value);\r\n }\r\n }, 5000);\r\n },\r\n complete: () => {\r\n console.log('WebRTC signalling connection completed');\r\n this.zone.run(() => {\r\n this._connected.next(false);\r\n });\r\n }\r\n });\r\n }\r\n\r\n disconnect(): void {\r\n if (this.wsSubscription) {\r\n this.wsSubscription.unsubscribe();\r\n this.wsSubscription = undefined;\r\n }\r\n\r\n if (this.ws) {\r\n this.ws.complete();\r\n this.ws = undefined;\r\n }\r\n\r\n this._connected.next(false);\r\n this._peerId.next(null);\r\n this._sessionId.next(null);\r\n this._peers.next([]);\r\n }\r\n\r\n sendCheck(peerRole: PeerRole = PeerRole.PARTICIPANT): void {\r\n this.send({\r\n type: 'check',\r\n peerRole: peerRole\r\n } as any);\r\n }\r\n\r\n sendOffer(toPeerId: string, sdp: RTCSessionDescriptionInit): void {\r\n this.send({\r\n type: 'offer',\r\n toPeerId: toPeerId,\r\n sdp: sdp\r\n } as any);\r\n }\r\n\r\n sendAnswer(toPeerId: string, sdp: RTCSessionDescriptionInit): void {\r\n this.send({\r\n type: 'answer',\r\n toPeerId: toPeerId,\r\n sdp: sdp\r\n } as any);\r\n }\r\n\r\n sendIceCandidate(toPeerId: string, candidate: RTCIceCandidateInit): void {\r\n this.send({\r\n type: 'ice_candidate',\r\n toPeerId: toPeerId,\r\n candidate: candidate\r\n } as any);\r\n }\r\n\r\n sendPeerState(\r\n connectionState?: PeerConnectionState,\r\n hasVideo?: boolean,\r\n hasAudio?: boolean,\r\n hasScreenShare?: boolean\r\n ): void {\r\n this.send({\r\n type: 'peer_state',\r\n connectionState,\r\n hasVideo,\r\n hasAudio,\r\n hasScreenShare\r\n } as any);\r\n }\r\n\r\n private send(message: any): void {\r\n if (!this.ws) {\r\n console.error('WebSocket not connected');\r\n return;\r\n }\r\n\r\n try {\r\n this.ws.next(message);\r\n } catch (error) {\r\n console.error('Error sending message:', error);\r\n }\r\n }\r\n\r\n private handleMessage(message: WebRTCMessage): void {\r\n switch (message.type) {\r\n case 'connection.established':\r\n this.handleConnectionEstablished(message);\r\n break;\r\n\r\n case 'check.response':\r\n this.handleCheckResponse(message);\r\n break;\r\n\r\n case 'peer.check':\r\n case 'offer':\r\n case 'answer':\r\n case 'ice_candidate':\r\n case 'peer.state_update':\r\n this._messages.next(message);\r\n break;\r\n\r\n case 'error':\r\n console.error('WebRTC signalling error:', message.message);\r\n break;\r\n\r\n default:\r\n console.warn('Unknown message type:', message.type);\r\n }\r\n }\r\n\r\n private handleConnectionEstablished(message: WebRTCMessage): void {\r\n if (message.peerId) {\r\n this._peerId.next(message.peerId);\r\n }\r\n if (message.sessionId) {\r\n this._sessionId.next(message.sessionId);\r\n }\r\n if (message.iceServers) {\r\n this._iceServers.next(message.iceServers);\r\n }\r\n console.log('WebRTC signalling connection established:', message);\r\n }\r\n\r\n private handleCheckResponse(message: WebRTCMessage): void {\r\n if (message.peers) {\r\n this._peers.next(message.peers);\r\n console.log('Received peer list:', message.peers);\r\n }\r\n }\r\n\r\n get peerId(): string | null {\r\n return this._peerId.value;\r\n }\r\n\r\n get sessionId(): string | null {\r\n return this._sessionId.value;\r\n }\r\n\r\n get connected(): boolean {\r\n return this._connected.value;\r\n }\r\n\r\n get peers(): PeerInfo[] {\r\n return this._peers.value;\r\n }\r\n\r\n get iceServers(): RTCIceServer[] {\r\n return this._iceServers.value;\r\n }\r\n}\r\n","import { Injectable, NgZone } from '@angular/core';\r\nimport { BehaviorSubject, Subject, Subscription } from 'rxjs';\r\nimport { WebRTCSignallingService } from './webrtc-signalling';\r\nimport {\r\n WebRTCMessage,\r\n PeerConnection,\r\n PeerInfo,\r\n PeerRole,\r\n PeerConnectionState,\r\n WebRTCConfig,\r\n MediaConstraintsConfig\r\n} 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\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\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\r\n private defaultConfig: WebRTCConfig = {\r\n iceServers: [\r\n { urls: 'stun:stun.l.google.com:19302' },\r\n { urls: 'stun:stun1.l.google.com:19302' }\r\n ],\r\n iceCandidatePoolSize: 10,\r\n iceTransportPolicy: 'all',\r\n bundlePolicy: 'max-bundle',\r\n rtcpMuxPolicy: 'require'\r\n };\r\n\r\n private defaultMediaConstraints: MediaConstraintsConfig = {\r\n video: {\r\n width: { ideal: 1280 },\r\n height: { ideal: 720 },\r\n frameRate: { ideal: 30 }\r\n },\r\n audio: true\r\n };\r\n\r\n constructor(\r\n private signalling: WebRTCSignallingService,\r\n private zone: NgZone\r\n ) {}\r\n\r\n async startSession(\r\n sessionId: string,\r\n role: PeerRole = PeerRole.PARTICIPANT,\r\n enableVideo: boolean = true,\r\n enableAudio: boolean = true\r\n ): Promise<void> {\r\n this._connectionState.next('connecting');\r\n\r\n if (role === PeerRole.HOST || enableVideo || enableAudio) {\r\n await this.startLocalMedia(enableVideo, enableAudio);\r\n }\r\n\r\n this.signalling.connect(sessionId);\r\n\r\n this.signallingSubscription = this.signalling.messages$.subscribe({\r\n next: (message) => {\r\n this.handleSignallingMessage(message);\r\n }\r\n });\r\n\r\n setTimeout(() => {\r\n this.signalling.sendCheck(role);\r\n }, 1000);\r\n\r\n this.signalling.peers$.subscribe(peers => {\r\n this._activePeers.next(peers);\r\n });\r\n }\r\n\r\n async startLocalMedia(enableVideo: boolean = true, enableAudio: boolean = true): Promise<void> {\r\n try {\r\n const constraints: MediaConstraintsConfig = {\r\n video: enableVideo ? this.defaultMediaConstraints.video : false,\r\n audio: enableAudio ? this.defaultMediaConstraints.audio : false\r\n };\r\n\r\n this.localStream = await navigator.mediaDevices.getUserMedia(constraints);\r\n this._localStreamReady.next(true);\r\n\r\n this.updatePeerState(\r\n undefined,\r\n enableVideo,\r\n enableAudio,\r\n false\r\n );\r\n\r\n console.log('Local media started:', this.localStream);\r\n } catch (error) {\r\n console.error('Error accessing media devices:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n async startScreenShare(): Promise<void> {\r\n try {\r\n const screenStream = await (navigator.mediaDevices as any).getDisplayMedia({\r\n video: true,\r\n audio: false\r\n });\r\n\r\n if (this.localStream) {\r\n this.localStream.getTracks().forEach(track => track.stop());\r\n }\r\n\r\n this.localStream = screenStream;\r\n this._localStreamReady.next(true);\r\n\r\n this.replaceTracksInAllPeers();\r\n\r\n this.updatePeerState(undefined, false, false, true);\r\n\r\n screenStream.getVideoTracks()[0].addEventListener('ended', () => {\r\n this.stopScreenShare();\r\n });\r\n\r\n console.log('Screen sharing started');\r\n } catch (error) {\r\n console.error('Error starting screen share:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n stopScreenShare(): void {\r\n if (this.localStream) {\r\n this.localStream.getTracks().forEach(track => track.stop());\r\n this.localStream = undefined;\r\n this._localStreamReady.next(false);\r\n }\r\n\r\n this.updatePeerState(undefined, false, false, false);\r\n\r\n console.log('Screen sharing stopped');\r\n }\r\n\r\n endSession(): void {\r\n this.peerConnections.forEach((conn, peerId) => {\r\n this.closePeerConnection(peerId);\r\n });\r\n\r\n if (this.localStream) {\r\n this.localStream.getTracks().forEach(track => track.stop());\r\n this.localStream = undefined;\r\n this._localStreamReady.next(false);\r\n }\r\n\r\n if (this.signallingSubscription) {\r\n this.signallingSubscription.unsubscribe();\r\n }\r\n\r\n this.signalling.disconnect();\r\n\r\n this._connectionState.next('disconnected');\r\n this._remoteStreams.next(new Map());\r\n this._activePeers.next([]);\r\n\r\n console.log('WebRTC session ended');\r\n }\r\n\r\n private async handleSignallingMessage(message: WebRTCMessage): Promise<void> {\r\n try {\r\n switch (message.type) {\r\n case 'peer.check':\r\n if (message.fromPeerId) {\r\n await this.handlePeerCheck(message.fromPeerId, message.fromUserId!, message.fromUsername!, message.peerRole!);\r\n }\r\n break;\r\n\r\n case 'offer':\r\n if (message.fromPeerId && message.sdp) {\r\n await this.handleOffer(message.fromPeerId, message.fromUserId!, message.fromUsername!, message.sdp);\r\n }\r\n break;\r\n\r\n case 'answer':\r\n if (message.fromPeerId && message.sdp) {\r\n await this.handleAnswer(message.fromPeerId, message.sdp);\r\n }\r\n break;\r\n\r\n case 'ice_candidate':\r\n if (message.fromPeerId && message.candidate) {\r\n await this.handleIceCandidate(message.fromPeerId, message.candidate);\r\n }\r\n break;\r\n\r\n case 'peer.state_update':\r\n this.handlePeerStateUpdate(message);\r\n break;\r\n }\r\n } catch (error) {\r\n console.error('Error handling signalling message:', error);\r\n }\r\n }\r\n\r\n private async handlePeerCheck(peerId: string, userId: number, username: string, role: PeerRole): Promise<void> {\r\n if (!this.peerConnections.has(peerId)) {\r\n console.log(`New peer discovered: ${username} (${peerId}) as ${role}`);\r\n\r\n const pc = await this.createPeerConnection(peerId, userId, username, role);\r\n\r\n const shouldInitiate = this.shouldInitiateConnection(role);\r\n\r\n if (shouldInitiate) {\r\n const offer = await pc.createOffer();\r\n await pc.setLocalDescription(offer);\r\n\r\n if (pc.localDescription) {\r\n this.signalling.sendOffer(peerId, pc.localDescription);\r\n\r\n const connection = this.peerConnections.get(peerId);\r\n if (connection) {\r\n connection.offered = true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private async handleOffer(peerId: string, userId: number, username: string, sdp: RTCSessionDescriptionInit): Promise<void> {\r\n let pc: RTCPeerConnection;\r\n\r\n if (!this.peerConnections.has(peerId)) {\r\n pc = await this.createPeerConnection(peerId, userId, username, PeerRole.PARTICIPANT);\r\n } else {\r\n pc = this.peerConnections.get(peerId)!.pc;\r\n }\r\n\r\n await pc.setRemoteDescription(new RTCSessionDescription(sdp));\r\n\r\n const answer = await pc.createAnswer();\r\n await pc.setLocalDescription(answer);\r\n\r\n if (pc.localDescription) {\r\n this.signalling.sendAnswer(peerId, pc.localDescription);\r\n\r\n const connection = this.peerConnections.get(peerId);\r\n if (connection) {\r\n connection.answered = true;\r\n }\r\n }\r\n\r\n const connection = this.peerConnections.get(peerId);\r\n if (connection && connection.queuedCandidates.length > 0) {\r\n await Promise.all(\r\n connection.queuedCandidates.map(candidate => pc.addIceCandidate(candidate))\r\n );\r\n connection.queuedCandidates = [];\r\n }\r\n }\r\n\r\n private async handleAnswer(peerId: string, sdp: RTCSessionDescriptionInit): Promise<void> {\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection) {\r\n console.warn(`Received answer from unknown peer: ${peerId}`);\r\n return;\r\n }\r\n\r\n await connection.pc.setRemoteDescription(new RTCSessionDescription(sdp));\r\n\r\n if (connection.queuedCandidates.length > 0) {\r\n await Promise.all(\r\n connection.queuedCandidates.map(candidate => connection.pc.addIceCandidate(candidate))\r\n );\r\n connection.queuedCandidates = [];\r\n }\r\n }\r\n\r\n private async handleIceCandidate(peerId: string, candidate: RTCIceCandidateInit): Promise<void> {\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection) {\r\n console.warn(`Received ICE candidate from unknown peer: ${peerId}`);\r\n return;\r\n }\r\n\r\n const iceCandidate = new RTCIceCandidate(candidate);\r\n\r\n if (connection.pc.remoteDescription) {\r\n await connection.pc.addIceCandidate(iceCandidate);\r\n } else {\r\n connection.queuedCandidates.push(iceCandidate);\r\n }\r\n }\r\n\r\n private handlePeerStateUpdate(message: WebRTCMessage): void {\r\n console.log('Peer state update:', message);\r\n }\r\n\r\n private async createPeerConnection(\r\n peerId: string,\r\n userId: number,\r\n username: string,\r\n role: PeerRole\r\n ): Promise<RTCPeerConnection> {\r\n const iceServers = this.signalling.iceServers;\r\n const config: WebRTCConfig = iceServers.length > 0\r\n ? { ...this.defaultConfig, iceServers }\r\n : this.defaultConfig;\r\n\r\n const pc = new RTCPeerConnection(config);\r\n\r\n const dataChannel = pc.createDataChannel('data', { ordered: true });\r\n this.setupDataChannelHandlers(dataChannel, peerId);\r\n\r\n if (this.localStream) {\r\n this.localStream.getTracks().forEach(track => {\r\n pc.addTrack(track, this.localStream!);\r\n });\r\n }\r\n\r\n this.setupPeerConnectionHandlers(pc, peerId);\r\n\r\n const connection: PeerConnection = {\r\n peerId,\r\n userId,\r\n username,\r\n pc,\r\n dataChannel,\r\n role,\r\n offered: false,\r\n answered: false,\r\n connected: false,\r\n queuedCandidates: []\r\n };\r\n\r\n this.peerConnections.set(peerId, connection);\r\n\r\n console.log(`Created peer connection for ${username} (${peerId})`);\r\n\r\n return pc;\r\n }\r\n\r\n private setupPeerConnectionHandlers(pc: RTCPeerConnection, peerId: string): void {\r\n pc.onicecandidate = (event) => {\r\n if (event.candidate) {\r\n this.signalling.sendIceCandidate(peerId, event.candidate.toJSON());\r\n }\r\n };\r\n\r\n pc.ontrack = (event) => {\r\n console.log(`Received track from peer ${peerId}:`, event.track.kind);\r\n\r\n this.zone.run(() => {\r\n const stream = event.streams[0];\r\n const connection = this.peerConnections.get(peerId);\r\n if (connection) {\r\n connection.stream = stream;\r\n }\r\n\r\n const streams = this._remoteStreams.value;\r\n streams.set(peerId, stream);\r\n this._remoteStreams.next(streams);\r\n });\r\n };\r\n\r\n pc.onconnectionstatechange = () => {\r\n console.log(`Connection state with peer ${peerId}: ${pc.connectionState}`);\r\n\r\n this.zone.run(() => {\r\n const connection = this.peerConnections.get(peerId);\r\n if (!connection) return;\r\n\r\n if (pc.connectionState === 'connected') {\r\n connection.connected = true;\r\n this._connectionState.next('connected');\r\n } else if (pc.connectionState === 'failed' || pc.connectionState === 'disconnected') {\r\n this.closePeerConnection(peerId);\r\n }\r\n });\r\n };\r\n\r\n pc.ondatachannel = (event) => {\r\n const receivedChannel = event.channel;\r\n this.setupDataChannelHandlers(receivedChannel, peerId);\r\n\r\n const connection = this.peerConnections.get(peerId);\r\n if (connection) {\r\n connection.dataChannel = receivedChannel;\r\n }\r\n };\r\n }\r\n\r\n private setupDataChannelHandlers(dataChannel: RTCDataChannel, peerId: string): void {\r\n dataChannel.onopen = () => {\r\n console.log(`Data channel opened with peer ${peerId}`);\r\n };\r\n\r\n dataChannel.onmessage = (event) => {\r\n console.log(`Data received from peer ${peerId}:`, event.data);\r\n };\r\n\r\n dataChannel.onclose = () => {\r\n console.log(`Data channel closed with peer ${peerId}`);\r\n };\r\n\r\n dataChannel.onerror = (error) => {\r\n console.error(`Data channel error with peer ${peerId}:`, error);\r\n };\r\n }\r\n\r\n private 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 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","// 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';","/*\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
@@ -1,7 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
- import { OnDestroy } from '@angular/core';
2
+ import { OnDestroy, NgZone } from '@angular/core';
3
+ import * as rxjs from 'rxjs';
3
4
  import { Observable } from 'rxjs';
4
- import { BaseApiService } from '@noatgnu/cupcake-core';
5
+ import { BaseApiService, AuthService } from '@noatgnu/cupcake-core';
5
6
 
6
7
  declare class CupcakeMintChocolate {
7
8
  static ɵfac: i0.ɵɵFactoryDeclaration<CupcakeMintChocolate, never>;
@@ -225,6 +226,122 @@ interface MessageSearchRequest {
225
226
  includeDeleted?: boolean;
226
227
  }
227
228
 
229
+ declare enum WebRTCSessionType {
230
+ VIDEO_CALL = "video_call",
231
+ AUDIO_CALL = "audio_call",
232
+ SCREEN_SHARE = "screen_share",
233
+ DATA_CHANNEL = "data_channel"
234
+ }
235
+ declare enum WebRTCSessionStatus {
236
+ WAITING = "waiting",
237
+ ACTIVE = "active",
238
+ ENDED = "ended"
239
+ }
240
+ declare enum PeerRole {
241
+ HOST = "host",
242
+ VIEWER = "viewer",
243
+ PARTICIPANT = "participant"
244
+ }
245
+ declare enum PeerConnectionState {
246
+ CONNECTING = "connecting",
247
+ CONNECTED = "connected",
248
+ DISCONNECTED = "disconnected",
249
+ FAILED = "failed"
250
+ }
251
+ declare enum SignalType {
252
+ OFFER = "offer",
253
+ ANSWER = "answer",
254
+ ICE_CANDIDATE = "ice_candidate",
255
+ CHECK = "check"
256
+ }
257
+ interface WebRTCSession extends BaseTimestampedModel {
258
+ id: string;
259
+ thread?: string;
260
+ sessionType: WebRTCSessionType;
261
+ sessionStatus: WebRTCSessionStatus;
262
+ initiatedBy: number;
263
+ participants: number[];
264
+ startedAt: string;
265
+ endedAt?: string;
266
+ }
267
+ interface WebRTCPeer extends BaseTimestampedModel {
268
+ id: string;
269
+ session: string;
270
+ user: number;
271
+ channelId: string;
272
+ peerRole: PeerRole;
273
+ connectionState: PeerConnectionState;
274
+ hasVideo: boolean;
275
+ hasAudio: boolean;
276
+ hasScreenShare: boolean;
277
+ joinedAt: string;
278
+ lastSeenAt: string;
279
+ }
280
+ interface WebRTCSignal extends BaseTimestampedModel {
281
+ id: string;
282
+ session: string;
283
+ fromPeer: string;
284
+ toPeer?: string;
285
+ signalType: SignalType;
286
+ signalData: any;
287
+ delivered: boolean;
288
+ }
289
+ interface PeerInfo {
290
+ id: string;
291
+ userId: number;
292
+ username: string;
293
+ peerRole: PeerRole;
294
+ connectionState: PeerConnectionState;
295
+ hasVideo: boolean;
296
+ hasAudio: boolean;
297
+ hasScreenShare: boolean;
298
+ }
299
+ interface WebRTCMessage {
300
+ type: 'connection.established' | 'check.response' | 'peer.check' | 'offer' | 'answer' | 'ice_candidate' | 'peer.state_update' | 'error';
301
+ message?: string;
302
+ peerId?: string;
303
+ sessionId?: string;
304
+ userId?: number;
305
+ username?: string;
306
+ fromPeerId?: string;
307
+ fromUserId?: number;
308
+ fromUsername?: string;
309
+ toPeerId?: string;
310
+ sdp?: RTCSessionDescriptionInit;
311
+ candidate?: RTCIceCandidateInit;
312
+ peers?: PeerInfo[];
313
+ peerRole?: PeerRole;
314
+ connectionState?: PeerConnectionState;
315
+ hasVideo?: boolean;
316
+ hasAudio?: boolean;
317
+ hasScreenShare?: boolean;
318
+ iceServers?: RTCIceServer[];
319
+ }
320
+ interface WebRTCConfig {
321
+ iceServers: RTCIceServer[];
322
+ iceCandidatePoolSize?: number;
323
+ iceTransportPolicy?: RTCIceTransportPolicy;
324
+ bundlePolicy?: RTCBundlePolicy;
325
+ rtcpMuxPolicy?: RTCRtcpMuxPolicy;
326
+ }
327
+ interface MediaConstraintsConfig {
328
+ video?: boolean | MediaTrackConstraints;
329
+ audio?: boolean | MediaTrackConstraints;
330
+ }
331
+ interface PeerConnection {
332
+ peerId: string;
333
+ userId: number;
334
+ username: string;
335
+ pc: RTCPeerConnection;
336
+ dataChannel?: RTCDataChannel;
337
+ stream?: MediaStream;
338
+ role: PeerRole;
339
+ offered: boolean;
340
+ answered: boolean;
341
+ connected: boolean;
342
+ queuedCandidates: RTCIceCandidate[];
343
+ }
344
+
228
345
  declare class NotificationService extends BaseApiService {
229
346
  /**
230
347
  * Get all notifications with optional filtering
@@ -632,7 +749,7 @@ declare class CommunicationWebSocketService implements OnDestroy {
632
749
  private reconnectTimer;
633
750
  private messageSubject;
634
751
  private connectionStateSubject;
635
- connectionState$: Observable<"disconnected" | "connecting" | "connected">;
752
+ connectionState$: Observable<"connecting" | "connected" | "disconnected">;
636
753
  messages$: Observable<WebSocketIncomingMessage>;
637
754
  newNotifications$: Observable<NewNotificationEvent>;
638
755
  newMessages$: Observable<NewMessageEvent>;
@@ -653,5 +770,87 @@ declare class CommunicationWebSocketService implements OnDestroy {
653
770
  static ɵprov: i0.ɵɵInjectableDeclaration<CommunicationWebSocketService>;
654
771
  }
655
772
 
656
- export { CommunicationWebSocketService, CupcakeMintChocolate, DeliveryStatus, DeliveryStatusLabels, MessageService, MessageThreadService, MessageType, MessageTypeLabels, NotificationPriority, NotificationPriorityLabels, NotificationService, NotificationType, NotificationTypeLabels, ThreadParticipantService };
657
- export type { ApiResponse, BaseTimestampedModel, BulkNotificationActionRequest, ConnectionEstablishedEvent, MarkNotificationReadMessage, MarkNotificationReadRequest, Message, MessageCreateRequest, MessageQueryParams, MessageSearchRequest, MessageThread, MessageThreadCreateRequest, MessageThreadQueryParams, MessageThreadUpdateRequest, MessageUpdateRequest, NewMessageEvent, NewNotificationEvent, Notification, NotificationCreateRequest, NotificationMarkedReadEvent, NotificationQueryParams, NotificationUpdateEvent, NotificationUpdateRequest, PaginatedResponse, PingMessage, PongEvent, SubscribeThreadMessage, ThreadParticipant, ThreadParticipantQueryParams, ThreadParticipantRequest, ThreadSearchRequest, ThreadSubscriptionConfirmedEvent, ThreadSubscriptionDeniedEvent, ThreadUnsubscriptionConfirmedEvent, ThreadUpdateEvent, UnsubscribeThreadMessage, UserBasic, WebSocketIncomingMessage, WebSocketOutgoingMessage };
773
+ declare class WebRTCSignallingService {
774
+ private authService;
775
+ private zone;
776
+ private ws?;
777
+ private wsSubscription?;
778
+ private baseUrl;
779
+ private _connected;
780
+ private _peerId;
781
+ private _sessionId;
782
+ private _peers;
783
+ private _messages;
784
+ private _iceServers;
785
+ connected$: rxjs.Observable<boolean>;
786
+ peerId$: rxjs.Observable<string | null>;
787
+ sessionId$: rxjs.Observable<string | null>;
788
+ peers$: rxjs.Observable<PeerInfo[]>;
789
+ messages$: rxjs.Observable<WebRTCMessage>;
790
+ iceServers$: rxjs.Observable<RTCIceServer[]>;
791
+ constructor(authService: AuthService, zone: NgZone);
792
+ private getBaseUrl;
793
+ connect(sessionId: string): void;
794
+ disconnect(): void;
795
+ sendCheck(peerRole?: PeerRole): void;
796
+ sendOffer(toPeerId: string, sdp: RTCSessionDescriptionInit): void;
797
+ sendAnswer(toPeerId: string, sdp: RTCSessionDescriptionInit): void;
798
+ sendIceCandidate(toPeerId: string, candidate: RTCIceCandidateInit): void;
799
+ sendPeerState(connectionState?: PeerConnectionState, hasVideo?: boolean, hasAudio?: boolean, hasScreenShare?: boolean): void;
800
+ private send;
801
+ private handleMessage;
802
+ private handleConnectionEstablished;
803
+ private handleCheckResponse;
804
+ get peerId(): string | null;
805
+ get sessionId(): string | null;
806
+ get connected(): boolean;
807
+ get peers(): PeerInfo[];
808
+ get iceServers(): RTCIceServer[];
809
+ static ɵfac: i0.ɵɵFactoryDeclaration<WebRTCSignallingService, never>;
810
+ static ɵprov: i0.ɵɵInjectableDeclaration<WebRTCSignallingService>;
811
+ }
812
+
813
+ declare class WebRTCService {
814
+ private signalling;
815
+ private zone;
816
+ private peerConnections;
817
+ private localStream?;
818
+ private signallingSubscription?;
819
+ private _localStreamReady;
820
+ private _remoteStreams;
821
+ private _connectionState;
822
+ private _activePeers;
823
+ localStreamReady$: rxjs.Observable<boolean>;
824
+ remoteStreams$: rxjs.Observable<Map<string, MediaStream>>;
825
+ connectionState$: rxjs.Observable<"connecting" | "connected" | "disconnected">;
826
+ activePeers$: rxjs.Observable<PeerInfo[]>;
827
+ private defaultConfig;
828
+ private defaultMediaConstraints;
829
+ constructor(signalling: WebRTCSignallingService, zone: NgZone);
830
+ startSession(sessionId: string, role?: PeerRole, enableVideo?: boolean, enableAudio?: boolean): Promise<void>;
831
+ startLocalMedia(enableVideo?: boolean, enableAudio?: boolean): Promise<void>;
832
+ startScreenShare(): Promise<void>;
833
+ stopScreenShare(): void;
834
+ endSession(): void;
835
+ private handleSignallingMessage;
836
+ private handlePeerCheck;
837
+ private handleOffer;
838
+ private handleAnswer;
839
+ private handleIceCandidate;
840
+ private handlePeerStateUpdate;
841
+ private createPeerConnection;
842
+ private setupPeerConnectionHandlers;
843
+ private setupDataChannelHandlers;
844
+ private closePeerConnection;
845
+ private shouldInitiateConnection;
846
+ private replaceTracksInAllPeers;
847
+ private updatePeerState;
848
+ get localMediaStream(): MediaStream | undefined;
849
+ get isConnected(): boolean;
850
+ get activePeerConnections(): PeerConnection[];
851
+ static ɵfac: i0.ɵɵFactoryDeclaration<WebRTCService, never>;
852
+ static ɵprov: i0.ɵɵInjectableDeclaration<WebRTCService>;
853
+ }
854
+
855
+ export { CommunicationWebSocketService, CupcakeMintChocolate, DeliveryStatus, DeliveryStatusLabels, MessageService, MessageThreadService, MessageType, MessageTypeLabels, NotificationPriority, NotificationPriorityLabels, NotificationService, NotificationType, NotificationTypeLabels, PeerConnectionState, PeerRole, SignalType, ThreadParticipantService, WebRTCService, WebRTCSessionStatus, WebRTCSessionType, WebRTCSignallingService };
856
+ export type { ApiResponse, BaseTimestampedModel, BulkNotificationActionRequest, ConnectionEstablishedEvent, MarkNotificationReadMessage, MarkNotificationReadRequest, MediaConstraintsConfig, Message, MessageCreateRequest, MessageQueryParams, MessageSearchRequest, MessageThread, MessageThreadCreateRequest, MessageThreadQueryParams, MessageThreadUpdateRequest, MessageUpdateRequest, NewMessageEvent, NewNotificationEvent, Notification, NotificationCreateRequest, NotificationMarkedReadEvent, NotificationQueryParams, NotificationUpdateEvent, NotificationUpdateRequest, PaginatedResponse, PeerConnection, PeerInfo, PingMessage, PongEvent, SubscribeThreadMessage, ThreadParticipant, ThreadParticipantQueryParams, ThreadParticipantRequest, ThreadSearchRequest, ThreadSubscriptionConfirmedEvent, ThreadSubscriptionDeniedEvent, ThreadUnsubscriptionConfirmedEvent, ThreadUpdateEvent, UnsubscribeThreadMessage, UserBasic, WebRTCConfig, WebRTCMessage, WebRTCPeer, WebRTCSession, WebRTCSignal, WebSocketIncomingMessage, WebSocketOutgoingMessage };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noatgnu/cupcake-mint-chocolate",
3
- "version": "1.2.4",
3
+ "version": "1.2.5",
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",