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/MIGRATION_EXAMPLE.md +164 -0
- package/README.md +241 -0
- package/dist/config-fetcher.d.ts +11 -0
- package/dist/config-fetcher.d.ts.map +1 -0
- package/dist/config-fetcher.js +23 -0
- package/dist/config-fetcher.js.map +1 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +78 -0
- package/dist/index.js.map +1 -0
- package/dist/room.d.ts +79 -0
- package/dist/room.d.ts.map +1 -0
- package/dist/room.js +227 -0
- package/dist/room.js.map +1 -0
- package/dist/signaling/socket-client.d.ts +88 -0
- package/dist/signaling/socket-client.d.ts.map +1 -0
- package/dist/signaling/socket-client.js +136 -0
- package/dist/signaling/socket-client.js.map +1 -0
- package/dist/types.d.ts +36 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/webrtc/media.d.ts +45 -0
- package/dist/webrtc/media.d.ts.map +1 -0
- package/dist/webrtc/media.js +87 -0
- package/dist/webrtc/media.js.map +1 -0
- package/dist/webrtc/peer.d.ts +65 -0
- package/dist/webrtc/peer.d.ts.map +1 -0
- package/dist/webrtc/peer.js +137 -0
- package/dist/webrtc/peer.js.map +1 -0
- package/package.json +37 -0
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
|
package/dist/room.js.map
ADDED
|
@@ -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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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|