talksphere-sdk 1.0.0

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.
package/dist/room.js ADDED
@@ -0,0 +1,227 @@
1
+ // Room Class
2
+ // Public API for interacting with a WebRTC room
3
+ // Orchestrates media, peer connection, and signaling
4
+ import { MediaManager } from './webrtc/media.js';
5
+ import { PeerConnectionManager } from './webrtc/peer.js';
6
+ import { SignalingClient } from './signaling/socket-client.js';
7
+ /**
8
+ * Room
9
+ * Public API for WebRTC room interactions
10
+ * Hides all WebRTC complexity from consumers
11
+ */
12
+ export class Room {
13
+ constructor(roomId, userId, config) {
14
+ this.peerManager = null;
15
+ this.eventListeners = new Map();
16
+ this.remotePeer = null;
17
+ this.remoteStream = null;
18
+ this.roomId = roomId;
19
+ this.userId = userId;
20
+ this.config = config;
21
+ this.mediaManager = new MediaManager();
22
+ this.signalingClient = new SignalingClient({
23
+ onJoinedRoom: this.handleJoinedRoom.bind(this),
24
+ onUserConnected: this.handleUserConnected.bind(this),
25
+ onOffer: this.handleOffer.bind(this),
26
+ onAnswer: this.handleAnswer.bind(this),
27
+ onIceCandidate: this.handleIceCandidate.bind(this),
28
+ onChatMessage: this.handleChatMessage.bind(this),
29
+ onUserDisconnected: this.handleUserDisconnected.bind(this),
30
+ onError: this.handleError.bind(this),
31
+ });
32
+ }
33
+ /**
34
+ * Initialize room connection
35
+ * @param audio - Enable audio
36
+ * @param video - Enable video
37
+ */
38
+ async initialize(audio, video) {
39
+ // Get local media
40
+ const localStream = await this.mediaManager.getUserMedia({ audio, video });
41
+ // Connect to signaling server
42
+ this.signalingClient.connect(this.config.signalingUrl);
43
+ // Join room
44
+ this.signalingClient.joinRoom(this.roomId, this.userId);
45
+ return localStream;
46
+ }
47
+ /**
48
+ * Event listener registration
49
+ * MIGRATED pattern from useWebRTC.ts event handling
50
+ */
51
+ on(event, callback) {
52
+ if (!this.eventListeners.has(event)) {
53
+ this.eventListeners.set(event, new Set());
54
+ }
55
+ this.eventListeners.get(event).add(callback);
56
+ }
57
+ /**
58
+ * Remove event listener
59
+ */
60
+ off(event, callback) {
61
+ const listeners = this.eventListeners.get(event);
62
+ if (listeners) {
63
+ listeners.delete(callback);
64
+ }
65
+ }
66
+ /**
67
+ * Emit event to listeners
68
+ */
69
+ emit(event, ...args) {
70
+ const listeners = this.eventListeners.get(event);
71
+ if (listeners) {
72
+ listeners.forEach(callback => {
73
+ try {
74
+ callback(...args);
75
+ }
76
+ catch (error) {
77
+ console.error(`Error in ${event} listener:`, error);
78
+ }
79
+ });
80
+ }
81
+ }
82
+ // ===== Signaling Event Handlers =====
83
+ // MIGRATED from useWebRTC.ts lines 60-124
84
+ handleJoinedRoom(data) {
85
+ console.log('Joined room:', data.roomId);
86
+ }
87
+ async handleUserConnected(data) {
88
+ console.log('User connected:', data.userId);
89
+ this.remotePeer = { id: data.userId };
90
+ this.emit('peer-joined', this.remotePeer);
91
+ // Create peer connection and send offer
92
+ // MIGRATED from useWebRTC.ts lines 66-77
93
+ this.createPeerConnection();
94
+ const localStream = this.mediaManager.getStream();
95
+ if (localStream && this.peerManager) {
96
+ this.peerManager.addTracks(localStream);
97
+ const offer = await this.peerManager.createOffer();
98
+ this.signalingClient.sendOffer(this.roomId, offer.sdp);
99
+ }
100
+ }
101
+ async handleOffer(data) {
102
+ // MIGRATED from useWebRTC.ts lines 80-94
103
+ if (!this.peerManager) {
104
+ this.createPeerConnection();
105
+ }
106
+ const localStream = this.mediaManager.getStream();
107
+ if (localStream && this.peerManager) {
108
+ this.peerManager.addTracks(localStream);
109
+ }
110
+ if (this.peerManager) {
111
+ const answer = await this.peerManager.createAnswer(data.sdp);
112
+ this.signalingClient.sendAnswer(this.roomId, answer.sdp);
113
+ }
114
+ }
115
+ async handleAnswer(data) {
116
+ // MIGRATED from useWebRTC.ts lines 97-102
117
+ if (this.peerManager) {
118
+ await this.peerManager.setRemoteAnswer(data.sdp);
119
+ }
120
+ }
121
+ async handleIceCandidate(data) {
122
+ // MIGRATED from useWebRTC.ts lines 104-111
123
+ if (this.peerManager && data.candidate) {
124
+ await this.peerManager.addIceCandidate(data.candidate);
125
+ }
126
+ }
127
+ handleChatMessage(data) {
128
+ // MIGRATED from useWebRTC.ts lines 113-115
129
+ this.emit('message', data);
130
+ }
131
+ handleUserDisconnected(data) {
132
+ // MIGRATED from useWebRTC.ts lines 117-124
133
+ console.log('User disconnected:', data.userId);
134
+ if (this.remotePeer) {
135
+ this.emit('peer-left', this.remotePeer);
136
+ this.remotePeer = null;
137
+ }
138
+ if (this.peerManager) {
139
+ this.peerManager.close();
140
+ this.peerManager = null;
141
+ }
142
+ this.remoteStream = null;
143
+ }
144
+ handleError(message) {
145
+ console.error('Signaling error:', message);
146
+ this.emit('error', new Error(message));
147
+ }
148
+ // ===== Peer Connection Management =====
149
+ createPeerConnection() {
150
+ this.peerManager = new PeerConnectionManager(this.config.iceServers, {
151
+ onIceCandidate: (candidate) => {
152
+ this.signalingClient.sendIceCandidate(this.roomId, candidate);
153
+ },
154
+ onTrack: (track, stream) => {
155
+ console.log('Remote track received');
156
+ this.remoteStream = stream;
157
+ if (this.remotePeer) {
158
+ this.emit('track', track, this.remotePeer);
159
+ }
160
+ },
161
+ onConnectionStateChange: (state) => {
162
+ this.emit('connection-state', state);
163
+ },
164
+ });
165
+ this.peerManager.createPeerConnection();
166
+ }
167
+ // ===== Public API Methods =====
168
+ /**
169
+ * Toggle audio on/off
170
+ * MIGRATED from useWebRTC.ts lines 166-168
171
+ */
172
+ toggleAudio(enabled) {
173
+ this.mediaManager.toggleAudio(enabled);
174
+ }
175
+ /**
176
+ * Toggle video on/off
177
+ * MIGRATED from useWebRTC.ts lines 170-172
178
+ */
179
+ toggleVideo(enabled) {
180
+ this.mediaManager.toggleVideo(enabled);
181
+ }
182
+ /**
183
+ * Send chat message
184
+ * MIGRATED from useWebRTC.ts lines 160-164
185
+ */
186
+ sendMessage(text) {
187
+ this.signalingClient.sendChatMessage(this.roomId, text, this.userId);
188
+ }
189
+ /**
190
+ * Get local media stream
191
+ */
192
+ getLocalStream() {
193
+ return this.mediaManager.getStream();
194
+ }
195
+ /**
196
+ * Get remote media stream
197
+ */
198
+ getRemoteStream() {
199
+ return this.remoteStream;
200
+ }
201
+ /**
202
+ * Get connection state
203
+ */
204
+ getConnectionState() {
205
+ return this.peerManager?.getConnectionState() ?? null;
206
+ }
207
+ /**
208
+ * Leave room and cleanup
209
+ * MIGRATED from useWebRTC.ts lines 174-178
210
+ */
211
+ async leave() {
212
+ // Stop local media
213
+ this.mediaManager.stop();
214
+ // Close peer connection
215
+ if (this.peerManager) {
216
+ this.peerManager.close();
217
+ this.peerManager = null;
218
+ }
219
+ // Disconnect signaling
220
+ this.signalingClient.disconnect();
221
+ // Clear state
222
+ this.remotePeer = null;
223
+ this.remoteStream = null;
224
+ this.eventListeners.clear();
225
+ }
226
+ }
227
+ //# sourceMappingURL=room.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room.js","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ export interface SignalingCallbacks {
2
+ onJoinedRoom: (data: {
3
+ roomId: string;
4
+ userId: string;
5
+ }) => void;
6
+ onUserConnected: (data: {
7
+ userId: string;
8
+ }) => void;
9
+ onOffer: (data: {
10
+ type: 'offer';
11
+ sdp: string;
12
+ roomId: string;
13
+ }) => void;
14
+ onAnswer: (data: {
15
+ type: 'answer';
16
+ sdp: string;
17
+ roomId: string;
18
+ }) => void;
19
+ onIceCandidate: (data: {
20
+ roomId: string;
21
+ candidate: RTCIceCandidateInit;
22
+ }) => void;
23
+ onChatMessage: (data: {
24
+ roomId: string;
25
+ message: string;
26
+ userId: string;
27
+ timestamp: Date;
28
+ }) => void;
29
+ onUserDisconnected: (data: {
30
+ userId: string;
31
+ }) => void;
32
+ onError: (message: string) => void;
33
+ }
34
+ /**
35
+ * Signaling Client
36
+ * Manages Socket.io connection and WebRTC signaling protocol
37
+ * PRESERVES exact protocol from socket-handler.ts
38
+ */
39
+ export declare class SignalingClient {
40
+ private socket;
41
+ private callbacks;
42
+ constructor(callbacks: SignalingCallbacks);
43
+ /**
44
+ * Connect to signaling server
45
+ * MIGRATED from useWebRTC.ts lines 33-35
46
+ */
47
+ connect(signalingUrl: string): void;
48
+ /**
49
+ * Setup Socket.io event listeners
50
+ * MIGRATED from useWebRTC.ts lines 60-124
51
+ * PROTOCOL from socket-handler.ts lines 24-68
52
+ */
53
+ private setupEventListeners;
54
+ /**
55
+ * Join a room
56
+ * PROTOCOL: socket-handler.ts lines 24-46
57
+ */
58
+ joinRoom(roomId: string, userId: string): void;
59
+ /**
60
+ * Send WebRTC offer
61
+ * PROTOCOL: socket-handler.ts lines 50-52
62
+ */
63
+ sendOffer(roomId: string, sdp: string): void;
64
+ /**
65
+ * Send WebRTC answer
66
+ * PROTOCOL: socket-handler.ts lines 55-57
67
+ */
68
+ sendAnswer(roomId: string, sdp: string): void;
69
+ /**
70
+ * Send ICE candidate
71
+ * PROTOCOL: socket-handler.ts lines 60-62
72
+ */
73
+ sendIceCandidate(roomId: string, candidate: RTCIceCandidate): void;
74
+ /**
75
+ * Send chat message
76
+ * PROTOCOL: socket-handler.ts lines 65-68
77
+ */
78
+ sendChatMessage(roomId: string, message: string, userId: string): void;
79
+ /**
80
+ * Disconnect from signaling server
81
+ */
82
+ disconnect(): void;
83
+ /**
84
+ * Check if connected
85
+ */
86
+ isConnected(): boolean;
87
+ }
88
+ //# sourceMappingURL=socket-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-client.d.ts","sourceRoot":"","sources":["../../src/signaling/socket-client.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,kBAAkB;IAC/B,YAAY,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACjE,eAAe,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACpD,OAAO,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACxE,QAAQ,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC1E,cAAc,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,mBAAmB,CAAA;KAAE,KAAK,IAAI,CAAC;IACnF,aAAa,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,IAAI,CAAA;KAAE,KAAK,IAAI,CAAC;IACpG,kBAAkB,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACvD,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED;;;;GAIG;AACH,qBAAa,eAAe;IACxB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAqB;gBAE1B,SAAS,EAAE,kBAAkB;IAIzC;;;OAGG;IACH,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAYnC;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IA4C3B;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAQ9C;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAM5C;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAM7C;;;OAGG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,GAAG,IAAI;IAMlE;;;OAGG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAWtE;;OAEG;IACH,UAAU,IAAI,IAAI;IAOlB;;OAEG;IACH,WAAW,IAAI,OAAO;CAGzB"}
@@ -0,0 +1,136 @@
1
+ // Signaling Client
2
+ // Socket.io wrapper for WebRTC signaling
3
+ // MIGRATED from useWebRTC.ts lines 33-35, 58-133 and socket-handler.ts protocol
4
+ import { io } from 'socket.io-client';
5
+ /**
6
+ * Signaling Client
7
+ * Manages Socket.io connection and WebRTC signaling protocol
8
+ * PRESERVES exact protocol from socket-handler.ts
9
+ */
10
+ export class SignalingClient {
11
+ constructor(callbacks) {
12
+ this.socket = null;
13
+ this.callbacks = callbacks;
14
+ }
15
+ /**
16
+ * Connect to signaling server
17
+ * MIGRATED from useWebRTC.ts lines 33-35
18
+ */
19
+ connect(signalingUrl) {
20
+ if (this.socket) {
21
+ this.socket.disconnect();
22
+ }
23
+ this.socket = io(signalingUrl, {
24
+ transports: ['websocket'],
25
+ });
26
+ this.setupEventListeners();
27
+ }
28
+ /**
29
+ * Setup Socket.io event listeners
30
+ * MIGRATED from useWebRTC.ts lines 60-124
31
+ * PROTOCOL from socket-handler.ts lines 24-68
32
+ */
33
+ setupEventListeners() {
34
+ if (!this.socket)
35
+ return;
36
+ // Joined room confirmation
37
+ this.socket.on('joined-room', (data) => {
38
+ this.callbacks.onJoinedRoom(data);
39
+ });
40
+ // Peer joined room
41
+ this.socket.on('user-connected', (data) => {
42
+ this.callbacks.onUserConnected(data);
43
+ });
44
+ // WebRTC offer received
45
+ this.socket.on('offer', (data) => {
46
+ this.callbacks.onOffer(data);
47
+ });
48
+ // WebRTC answer received
49
+ this.socket.on('answer', (data) => {
50
+ this.callbacks.onAnswer(data);
51
+ });
52
+ // ICE candidate received
53
+ this.socket.on('ice-candidate', (data) => {
54
+ this.callbacks.onIceCandidate(data);
55
+ });
56
+ // Chat message received
57
+ this.socket.on('chat-message', (data) => {
58
+ this.callbacks.onChatMessage(data);
59
+ });
60
+ // Peer disconnected
61
+ this.socket.on('user-disconnected', (data) => {
62
+ this.callbacks.onUserDisconnected(data);
63
+ });
64
+ // Error from server
65
+ this.socket.on('error', (message) => {
66
+ this.callbacks.onError(message);
67
+ });
68
+ }
69
+ /**
70
+ * Join a room
71
+ * PROTOCOL: socket-handler.ts lines 24-46
72
+ */
73
+ joinRoom(roomId, userId) {
74
+ if (!this.socket) {
75
+ throw new Error('Socket not connected');
76
+ }
77
+ this.socket.emit('join-room', { roomId, userId });
78
+ }
79
+ /**
80
+ * Send WebRTC offer
81
+ * PROTOCOL: socket-handler.ts lines 50-52
82
+ */
83
+ sendOffer(roomId, sdp) {
84
+ if (!this.socket)
85
+ return;
86
+ this.socket.emit('offer', { type: 'offer', sdp, roomId });
87
+ }
88
+ /**
89
+ * Send WebRTC answer
90
+ * PROTOCOL: socket-handler.ts lines 55-57
91
+ */
92
+ sendAnswer(roomId, sdp) {
93
+ if (!this.socket)
94
+ return;
95
+ this.socket.emit('answer', { type: 'answer', sdp, roomId });
96
+ }
97
+ /**
98
+ * Send ICE candidate
99
+ * PROTOCOL: socket-handler.ts lines 60-62
100
+ */
101
+ sendIceCandidate(roomId, candidate) {
102
+ if (!this.socket)
103
+ return;
104
+ this.socket.emit('ice-candidate', { roomId, candidate });
105
+ }
106
+ /**
107
+ * Send chat message
108
+ * PROTOCOL: socket-handler.ts lines 65-68
109
+ */
110
+ sendChatMessage(roomId, message, userId) {
111
+ if (!this.socket)
112
+ return;
113
+ this.socket.emit('chat-message', {
114
+ roomId,
115
+ message,
116
+ userId,
117
+ timestamp: new Date(),
118
+ });
119
+ }
120
+ /**
121
+ * Disconnect from signaling server
122
+ */
123
+ disconnect() {
124
+ if (this.socket) {
125
+ this.socket.disconnect();
126
+ this.socket = null;
127
+ }
128
+ }
129
+ /**
130
+ * Check if connected
131
+ */
132
+ isConnected() {
133
+ return this.socket?.connected ?? false;
134
+ }
135
+ }
136
+ //# sourceMappingURL=socket-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-client.js","sourceRoot":"","sources":["../../src/signaling/socket-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export interface SDKConfig {
2
+ apiKey: string;
3
+ backendUrl?: string;
4
+ }
5
+ export interface JoinOptions {
6
+ audio?: boolean;
7
+ video?: boolean;
8
+ displayName: string;
9
+ }
10
+ export interface Peer {
11
+ id: string;
12
+ displayName?: string;
13
+ }
14
+ export interface ChatMessage {
15
+ roomId: string;
16
+ message: string;
17
+ userId: string;
18
+ timestamp: Date;
19
+ }
20
+ export type RoomEventMap = {
21
+ 'peer-joined': (peer: Peer) => void;
22
+ 'peer-left': (peer: Peer) => void;
23
+ 'track': (track: MediaStreamTrack, peer: Peer) => void;
24
+ 'message': (message: ChatMessage) => void;
25
+ 'connection-state': (state: RTCPeerConnectionState) => void;
26
+ 'error': (error: Error) => void;
27
+ };
28
+ export interface BackendConfig {
29
+ signalingUrl: string;
30
+ iceServers: Array<{
31
+ urls: string | string[];
32
+ username?: string;
33
+ credential?: string;
34
+ }>;
35
+ }
36
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,IAAI;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;CACnB;AAGD,MAAM,MAAM,YAAY,GAAG;IACvB,aAAa,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACpC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAClC,OAAO,EAAE,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACvD,SAAS,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IAC1C,kBAAkB,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAC;IAC5D,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACnC,CAAC;AAGF,MAAM,WAAW,aAAa;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC,CAAC;CACN"}
package/dist/types.js ADDED
@@ -0,0 +1,4 @@
1
+ // SDK Types
2
+ // Public and internal type definitions
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,YAAY;AACZ,uCAAuC"}
@@ -0,0 +1,45 @@
1
+ export interface MediaConstraints {
2
+ audio: boolean;
3
+ video: boolean;
4
+ }
5
+ /**
6
+ * Media Manager
7
+ * Manages local media stream (camera/microphone)
8
+ */
9
+ export declare class MediaManager {
10
+ private stream;
11
+ /**
12
+ * Request user media (camera + microphone)
13
+ * @param constraints - Audio/video constraints
14
+ * @returns Local media stream
15
+ */
16
+ getUserMedia(constraints: MediaConstraints): Promise<MediaStream>;
17
+ /**
18
+ * Get current local stream
19
+ */
20
+ getStream(): MediaStream | null;
21
+ /**
22
+ * Toggle audio track enabled state
23
+ * MIGRATED from useWebRTC.ts lines 166-168
24
+ */
25
+ toggleAudio(enabled: boolean): void;
26
+ /**
27
+ * Toggle video track enabled state
28
+ * MIGRATED from useWebRTC.ts lines 170-172
29
+ */
30
+ toggleVideo(enabled: boolean): void;
31
+ /**
32
+ * Stop all tracks and release media devices
33
+ * MIGRATED from useWebRTC.ts line 175
34
+ */
35
+ stop(): void;
36
+ /**
37
+ * Check if audio is currently enabled
38
+ */
39
+ isAudioEnabled(): boolean;
40
+ /**
41
+ * Check if video is currently enabled
42
+ */
43
+ isVideoEnabled(): boolean;
44
+ }
45
+ //# sourceMappingURL=media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/webrtc/media.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,YAAY;IACrB,OAAO,CAAC,MAAM,CAA4B;IAE1C;;;;OAIG;IACG,YAAY,CAAC,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC;IAcvE;;OAEG;IACH,SAAS,IAAI,WAAW,GAAG,IAAI;IAI/B;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAQnC;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAQnC;;;OAGG;IACH,IAAI,IAAI,IAAI;IAOZ;;OAEG;IACH,cAAc,IAAI,OAAO;IAMzB;;OAEG;IACH,cAAc,IAAI,OAAO;CAK5B"}
@@ -0,0 +1,87 @@
1
+ // Media Manager
2
+ // Handles getUserMedia and local track management
3
+ // MIGRATED from useWebRTC.ts lines 38-46, 166-172
4
+ /**
5
+ * Media Manager
6
+ * Manages local media stream (camera/microphone)
7
+ */
8
+ export class MediaManager {
9
+ constructor() {
10
+ this.stream = null;
11
+ }
12
+ /**
13
+ * Request user media (camera + microphone)
14
+ * @param constraints - Audio/video constraints
15
+ * @returns Local media stream
16
+ */
17
+ async getUserMedia(constraints) {
18
+ try {
19
+ this.stream = await navigator.mediaDevices.getUserMedia({
20
+ video: constraints.video,
21
+ audio: constraints.audio,
22
+ });
23
+ return this.stream;
24
+ }
25
+ catch (error) {
26
+ console.error('Error accessing media devices:', error);
27
+ throw new Error('Failed to access camera/microphone. Please grant permissions.');
28
+ }
29
+ }
30
+ /**
31
+ * Get current local stream
32
+ */
33
+ getStream() {
34
+ return this.stream;
35
+ }
36
+ /**
37
+ * Toggle audio track enabled state
38
+ * MIGRATED from useWebRTC.ts lines 166-168
39
+ */
40
+ toggleAudio(enabled) {
41
+ if (!this.stream)
42
+ return;
43
+ this.stream.getAudioTracks().forEach(track => {
44
+ track.enabled = enabled;
45
+ });
46
+ }
47
+ /**
48
+ * Toggle video track enabled state
49
+ * MIGRATED from useWebRTC.ts lines 170-172
50
+ */
51
+ toggleVideo(enabled) {
52
+ if (!this.stream)
53
+ return;
54
+ this.stream.getVideoTracks().forEach(track => {
55
+ track.enabled = enabled;
56
+ });
57
+ }
58
+ /**
59
+ * Stop all tracks and release media devices
60
+ * MIGRATED from useWebRTC.ts line 175
61
+ */
62
+ stop() {
63
+ if (!this.stream)
64
+ return;
65
+ this.stream.getTracks().forEach(track => track.stop());
66
+ this.stream = null;
67
+ }
68
+ /**
69
+ * Check if audio is currently enabled
70
+ */
71
+ isAudioEnabled() {
72
+ if (!this.stream)
73
+ return false;
74
+ const audioTrack = this.stream.getAudioTracks()[0];
75
+ return audioTrack?.enabled ?? false;
76
+ }
77
+ /**
78
+ * Check if video is currently enabled
79
+ */
80
+ isVideoEnabled() {
81
+ if (!this.stream)
82
+ return false;
83
+ const videoTrack = this.stream.getVideoTracks()[0];
84
+ return videoTrack?.enabled ?? false;
85
+ }
86
+ }
87
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/webrtc/media.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,kDAAkD;AAClD,kDAAkD;AAOlD;;;GAGG;AACH,MAAM,OAAO,YAAY;IAAzB;QACY,WAAM,GAAuB,IAAI,CAAC;IAgF9C,CAAC;IA9EG;;;;OAIG;IACH,KAAK,CAAC,YAAY,CAAC,WAA6B;QAC5C,IAAI,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC;gBACpD,KAAK,EAAE,WAAW,CAAC,KAAK;gBACxB,KAAK,EAAE,WAAW,CAAC,KAAK;aAC3B,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC,MAAM,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;QACrF,CAAC;IACL,CAAC;IAED;;OAEG;IACH,SAAS;QACL,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,OAAgB;QACxB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEzB,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACzC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;QAC5B,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,OAAgB;QACxB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEzB,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACzC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;QAC5B,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;OAGG;IACH,IAAI;QACA,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEzB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,cAAc;QACV,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,OAAO,UAAU,EAAE,OAAO,IAAI,KAAK,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,cAAc;QACV,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,OAAO,UAAU,EAAE,OAAO,IAAI,KAAK,CAAC;IACxC,CAAC;CACJ"}