@agentuity/frontend 1.0.0 → 1.0.2
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/AGENTS.md +53 -53
- package/README.md +31 -0
- package/dist/beacon-script.js +1 -1
- package/dist/beacon.js +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/webrtc-manager.d.ts +420 -0
- package/dist/webrtc-manager.d.ts.map +1 -0
- package/dist/webrtc-manager.js +1221 -0
- package/dist/webrtc-manager.js.map +1 -0
- package/package.json +3 -3
- package/src/client/index.ts +11 -11
- package/src/index.ts +23 -0
- package/src/webrtc-manager.ts +1631 -0
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
import type { WebRTCConnectionState, WebRTCDisconnectReason, DataChannelConfig, DataChannelState, ConnectionQualitySummary, RecordingOptions, RecordingHandle, TrackSource as CoreTrackSource } from '@agentuity/core';
|
|
2
|
+
/**
|
|
3
|
+
* Track source interface extended for browser environment.
|
|
4
|
+
*/
|
|
5
|
+
export interface TrackSource extends Omit<CoreTrackSource, 'getStream'> {
|
|
6
|
+
getStream(): Promise<MediaStream>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* User media (camera/microphone) track source.
|
|
10
|
+
*/
|
|
11
|
+
export declare class UserMediaSource implements TrackSource {
|
|
12
|
+
private constraints;
|
|
13
|
+
readonly type: "user-media";
|
|
14
|
+
private stream;
|
|
15
|
+
constructor(constraints?: MediaStreamConstraints);
|
|
16
|
+
getStream(): Promise<MediaStream>;
|
|
17
|
+
stop(): void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Display media (screen share) track source.
|
|
21
|
+
*/
|
|
22
|
+
export declare class DisplayMediaSource implements TrackSource {
|
|
23
|
+
private constraints;
|
|
24
|
+
readonly type: "display-media";
|
|
25
|
+
private stream;
|
|
26
|
+
constructor(constraints?: DisplayMediaStreamOptions);
|
|
27
|
+
getStream(): Promise<MediaStream>;
|
|
28
|
+
stop(): void;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Custom stream track source - wraps a user-provided MediaStream.
|
|
32
|
+
*/
|
|
33
|
+
export declare class CustomStreamSource implements TrackSource {
|
|
34
|
+
private stream;
|
|
35
|
+
readonly type: "custom";
|
|
36
|
+
constructor(stream: MediaStream);
|
|
37
|
+
getStream(): Promise<MediaStream>;
|
|
38
|
+
stop(): void;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Callbacks for WebRTC client state changes and events.
|
|
42
|
+
* All callbacks are optional - only subscribe to events you care about.
|
|
43
|
+
*/
|
|
44
|
+
export interface WebRTCClientCallbacks {
|
|
45
|
+
/**
|
|
46
|
+
* Called on every state transition.
|
|
47
|
+
*/
|
|
48
|
+
onStateChange?: (from: WebRTCConnectionState, to: WebRTCConnectionState, reason?: string) => void;
|
|
49
|
+
/**
|
|
50
|
+
* Called when connected to at least one peer.
|
|
51
|
+
*/
|
|
52
|
+
onConnect?: () => void;
|
|
53
|
+
/**
|
|
54
|
+
* Called when disconnected from all peers.
|
|
55
|
+
*/
|
|
56
|
+
onDisconnect?: (reason: WebRTCDisconnectReason) => void;
|
|
57
|
+
/**
|
|
58
|
+
* Called when local media stream is acquired.
|
|
59
|
+
*/
|
|
60
|
+
onLocalStream?: (stream: MediaStream) => void;
|
|
61
|
+
/**
|
|
62
|
+
* Called when a remote media stream is received.
|
|
63
|
+
*/
|
|
64
|
+
onRemoteStream?: (peerId: string, stream: MediaStream) => void;
|
|
65
|
+
/**
|
|
66
|
+
* Called when a new track is added to a stream.
|
|
67
|
+
*/
|
|
68
|
+
onTrackAdded?: (peerId: string, track: MediaStreamTrack, stream: MediaStream) => void;
|
|
69
|
+
/**
|
|
70
|
+
* Called when a track is removed from a stream.
|
|
71
|
+
*/
|
|
72
|
+
onTrackRemoved?: (peerId: string, track: MediaStreamTrack) => void;
|
|
73
|
+
/**
|
|
74
|
+
* Called when a peer joins the room.
|
|
75
|
+
*/
|
|
76
|
+
onPeerJoined?: (peerId: string) => void;
|
|
77
|
+
/**
|
|
78
|
+
* Called when a peer leaves the room.
|
|
79
|
+
*/
|
|
80
|
+
onPeerLeft?: (peerId: string) => void;
|
|
81
|
+
/**
|
|
82
|
+
* Called when negotiation starts with a peer.
|
|
83
|
+
*/
|
|
84
|
+
onNegotiationStart?: (peerId: string) => void;
|
|
85
|
+
/**
|
|
86
|
+
* Called when negotiation completes with a peer.
|
|
87
|
+
*/
|
|
88
|
+
onNegotiationComplete?: (peerId: string) => void;
|
|
89
|
+
/**
|
|
90
|
+
* Called for each ICE candidate generated.
|
|
91
|
+
*/
|
|
92
|
+
onIceCandidate?: (peerId: string, candidate: RTCIceCandidateInit) => void;
|
|
93
|
+
/**
|
|
94
|
+
* Called when ICE connection state changes for a peer.
|
|
95
|
+
*/
|
|
96
|
+
onIceStateChange?: (peerId: string, state: string) => void;
|
|
97
|
+
/**
|
|
98
|
+
* Called when an error occurs.
|
|
99
|
+
*/
|
|
100
|
+
onError?: (error: Error, state: WebRTCConnectionState) => void;
|
|
101
|
+
/**
|
|
102
|
+
* Called when a data channel is opened.
|
|
103
|
+
*/
|
|
104
|
+
onDataChannelOpen?: (peerId: string, label: string) => void;
|
|
105
|
+
/**
|
|
106
|
+
* Called when a data channel is closed.
|
|
107
|
+
*/
|
|
108
|
+
onDataChannelClose?: (peerId: string, label: string) => void;
|
|
109
|
+
/**
|
|
110
|
+
* Called when a message is received on a data channel.
|
|
111
|
+
*
|
|
112
|
+
* **Note:** String messages are automatically parsed as JSON if valid.
|
|
113
|
+
* - If the message is valid JSON, `data` will be the parsed object/array/value
|
|
114
|
+
* - If the message is not valid JSON, `data` will be the raw string
|
|
115
|
+
* - Binary messages (ArrayBuffer) are passed through unchanged
|
|
116
|
+
*
|
|
117
|
+
* To distinguish between parsed JSON and raw strings, check the type:
|
|
118
|
+
* ```ts
|
|
119
|
+
* onDataChannelMessage: (peerId, label, data) => {
|
|
120
|
+
* if (typeof data === 'string') {
|
|
121
|
+
* // Raw string (failed JSON parse)
|
|
122
|
+
* } else if (data instanceof ArrayBuffer) {
|
|
123
|
+
* // Binary data
|
|
124
|
+
* } else {
|
|
125
|
+
* // Parsed JSON object/array/primitive
|
|
126
|
+
* }
|
|
127
|
+
* }
|
|
128
|
+
* ```
|
|
129
|
+
*/
|
|
130
|
+
onDataChannelMessage?: (peerId: string, label: string, data: string | ArrayBuffer | unknown) => void;
|
|
131
|
+
/**
|
|
132
|
+
* Called when a data channel error occurs.
|
|
133
|
+
*/
|
|
134
|
+
onDataChannelError?: (peerId: string, label: string, error: Error) => void;
|
|
135
|
+
/**
|
|
136
|
+
* Called when screen sharing starts.
|
|
137
|
+
*/
|
|
138
|
+
onScreenShareStart?: () => void;
|
|
139
|
+
/**
|
|
140
|
+
* Called when screen sharing stops.
|
|
141
|
+
*/
|
|
142
|
+
onScreenShareStop?: () => void;
|
|
143
|
+
/**
|
|
144
|
+
* Called when a reconnect attempt is scheduled.
|
|
145
|
+
*/
|
|
146
|
+
onReconnecting?: (attempt: number) => void;
|
|
147
|
+
/**
|
|
148
|
+
* Called after a successful reconnection.
|
|
149
|
+
*/
|
|
150
|
+
onReconnected?: () => void;
|
|
151
|
+
/**
|
|
152
|
+
* Called when reconnect attempts are exhausted.
|
|
153
|
+
*/
|
|
154
|
+
onReconnectFailed?: () => void;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Options for WebRTCManager
|
|
158
|
+
*/
|
|
159
|
+
export interface WebRTCManagerOptions {
|
|
160
|
+
/** WebSocket signaling URL */
|
|
161
|
+
signalUrl: string;
|
|
162
|
+
/** Room ID to join */
|
|
163
|
+
roomId: string;
|
|
164
|
+
/** Whether this peer is "polite" in perfect negotiation (default: auto-determined) */
|
|
165
|
+
polite?: boolean;
|
|
166
|
+
/** ICE servers configuration */
|
|
167
|
+
iceServers?: RTCIceServer[];
|
|
168
|
+
/**
|
|
169
|
+
* Media source configuration.
|
|
170
|
+
* - `false`: Data-only mode (no media)
|
|
171
|
+
* - `MediaStreamConstraints`: Use getUserMedia with these constraints
|
|
172
|
+
* - `TrackSource`: Use a custom track source
|
|
173
|
+
* Default: { video: true, audio: true }
|
|
174
|
+
*/
|
|
175
|
+
media?: MediaStreamConstraints | TrackSource | false;
|
|
176
|
+
/**
|
|
177
|
+
* Data channels to create when connection is established.
|
|
178
|
+
* Only the offerer (late joiner) creates channels; the answerer receives them.
|
|
179
|
+
*/
|
|
180
|
+
dataChannels?: DataChannelConfig[];
|
|
181
|
+
/**
|
|
182
|
+
* Callbacks for state changes and events.
|
|
183
|
+
*/
|
|
184
|
+
callbacks?: WebRTCClientCallbacks;
|
|
185
|
+
/**
|
|
186
|
+
* Whether to auto-reconnect on WebSocket/ICE failures (default: true)
|
|
187
|
+
*/
|
|
188
|
+
autoReconnect?: boolean;
|
|
189
|
+
/**
|
|
190
|
+
* Maximum reconnection attempts before giving up (default: 5)
|
|
191
|
+
*/
|
|
192
|
+
maxReconnectAttempts?: number;
|
|
193
|
+
/**
|
|
194
|
+
* Connection timeout in ms for connecting/negotiating (default: 30000)
|
|
195
|
+
*/
|
|
196
|
+
connectionTimeout?: number;
|
|
197
|
+
/**
|
|
198
|
+
* ICE gathering timeout in ms (default: 10000)
|
|
199
|
+
*/
|
|
200
|
+
iceGatheringTimeout?: number;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* WebRTC manager state
|
|
204
|
+
*/
|
|
205
|
+
export interface WebRTCManagerState {
|
|
206
|
+
state: WebRTCConnectionState;
|
|
207
|
+
peerId: string | null;
|
|
208
|
+
remotePeerIds: string[];
|
|
209
|
+
isAudioMuted: boolean;
|
|
210
|
+
isVideoMuted: boolean;
|
|
211
|
+
isScreenSharing: boolean;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Framework-agnostic WebRTC connection manager with multi-peer mesh networking,
|
|
215
|
+
* perfect negotiation, media/data channel handling, and screen sharing.
|
|
216
|
+
*
|
|
217
|
+
* Uses an explicit state machine for connection lifecycle:
|
|
218
|
+
* - idle: No resources allocated, ready to connect
|
|
219
|
+
* - connecting: Acquiring media + opening WebSocket
|
|
220
|
+
* - signaling: In room, waiting for peer(s)
|
|
221
|
+
* - negotiating: SDP/ICE exchange in progress with at least one peer
|
|
222
|
+
* - connected: At least one peer is connected
|
|
223
|
+
*
|
|
224
|
+
* @example
|
|
225
|
+
* ```ts
|
|
226
|
+
* const manager = new WebRTCManager({
|
|
227
|
+
* signalUrl: 'wss://example.com/call/signal',
|
|
228
|
+
* roomId: 'my-room',
|
|
229
|
+
* callbacks: {
|
|
230
|
+
* onStateChange: (from, to, reason) => console.log(`${from} → ${to}`, reason),
|
|
231
|
+
* onConnect: () => console.log('Connected!'),
|
|
232
|
+
* onRemoteStream: (peerId, stream) => { remoteVideos[peerId].srcObject = stream; },
|
|
233
|
+
* },
|
|
234
|
+
* });
|
|
235
|
+
*
|
|
236
|
+
* await manager.connect();
|
|
237
|
+
* ```
|
|
238
|
+
*/
|
|
239
|
+
export declare class WebRTCManager {
|
|
240
|
+
private ws;
|
|
241
|
+
private localStream;
|
|
242
|
+
private trackSource;
|
|
243
|
+
private previousVideoTrack;
|
|
244
|
+
private peerId;
|
|
245
|
+
private peers;
|
|
246
|
+
private isAudioMuted;
|
|
247
|
+
private isVideoMuted;
|
|
248
|
+
private isScreenSharing;
|
|
249
|
+
private _state;
|
|
250
|
+
private isConnecting;
|
|
251
|
+
private basePolite;
|
|
252
|
+
private options;
|
|
253
|
+
private callbacks;
|
|
254
|
+
private reconnectManager;
|
|
255
|
+
private isReconnecting;
|
|
256
|
+
private intentionalClose;
|
|
257
|
+
private connectionTimeoutId;
|
|
258
|
+
private recordings;
|
|
259
|
+
constructor(options: WebRTCManagerOptions);
|
|
260
|
+
/**
|
|
261
|
+
* Current connection state
|
|
262
|
+
*/
|
|
263
|
+
get state(): WebRTCConnectionState;
|
|
264
|
+
/**
|
|
265
|
+
* Get current manager state
|
|
266
|
+
*/
|
|
267
|
+
getState(): WebRTCManagerState;
|
|
268
|
+
/**
|
|
269
|
+
* Get local media stream
|
|
270
|
+
*/
|
|
271
|
+
getLocalStream(): MediaStream | null;
|
|
272
|
+
/**
|
|
273
|
+
* Get remote media streams keyed by peer ID
|
|
274
|
+
*/
|
|
275
|
+
getRemoteStreams(): Map<string, MediaStream>;
|
|
276
|
+
/**
|
|
277
|
+
* Get a specific peer's remote stream
|
|
278
|
+
*/
|
|
279
|
+
getRemoteStream(peerId: string): MediaStream | null;
|
|
280
|
+
/**
|
|
281
|
+
* Whether this manager is in data-only mode (no media streams).
|
|
282
|
+
*/
|
|
283
|
+
get isDataOnly(): boolean;
|
|
284
|
+
/**
|
|
285
|
+
* Get connected peer count
|
|
286
|
+
*/
|
|
287
|
+
get peerCount(): number;
|
|
288
|
+
private setState;
|
|
289
|
+
private mapToDisconnectReason;
|
|
290
|
+
private handleStateTimeouts;
|
|
291
|
+
private startConnectionTimeout;
|
|
292
|
+
private clearConnectionTimeout;
|
|
293
|
+
private handleTimeout;
|
|
294
|
+
private shouldAutoReconnect;
|
|
295
|
+
private updateConnectionState;
|
|
296
|
+
private send;
|
|
297
|
+
/**
|
|
298
|
+
* Connect to the signaling server and start the call
|
|
299
|
+
*/
|
|
300
|
+
connect(): Promise<void>;
|
|
301
|
+
private ensureLocalStream;
|
|
302
|
+
private openWebSocket;
|
|
303
|
+
private handleConnectionLoss;
|
|
304
|
+
private scheduleReconnect;
|
|
305
|
+
private reconnect;
|
|
306
|
+
private handleSignalingMessage;
|
|
307
|
+
private createPeerSession;
|
|
308
|
+
private createOffer;
|
|
309
|
+
private handleRemoteSDP;
|
|
310
|
+
private isOffererFor;
|
|
311
|
+
private handleRemoteICE;
|
|
312
|
+
private closePeerSession;
|
|
313
|
+
private cleanupPeerSessions;
|
|
314
|
+
private scheduleIceGatheringTimeout;
|
|
315
|
+
private setupDataChannel;
|
|
316
|
+
/**
|
|
317
|
+
* Create a new data channel to all connected peers.
|
|
318
|
+
*/
|
|
319
|
+
createDataChannel(config: DataChannelConfig): Map<string, RTCDataChannel>;
|
|
320
|
+
/**
|
|
321
|
+
* Get a data channel by label from a specific peer.
|
|
322
|
+
*/
|
|
323
|
+
getDataChannel(peerId: string, label: string): RTCDataChannel | undefined;
|
|
324
|
+
/**
|
|
325
|
+
* Get all open data channel labels.
|
|
326
|
+
*/
|
|
327
|
+
getDataChannelLabels(): string[];
|
|
328
|
+
/**
|
|
329
|
+
* Get the state of a data channel for a specific peer.
|
|
330
|
+
*/
|
|
331
|
+
getDataChannelState(peerId: string, label: string): DataChannelState | null;
|
|
332
|
+
/**
|
|
333
|
+
* Send a string message to all peers on a data channel.
|
|
334
|
+
*/
|
|
335
|
+
sendString(label: string, data: string): boolean;
|
|
336
|
+
/**
|
|
337
|
+
* Send a string message to a specific peer.
|
|
338
|
+
*/
|
|
339
|
+
sendStringTo(peerId: string, label: string, data: string): boolean;
|
|
340
|
+
/**
|
|
341
|
+
* Send binary data to all peers on a data channel.
|
|
342
|
+
*/
|
|
343
|
+
sendBinary(label: string, data: ArrayBuffer | Uint8Array): boolean;
|
|
344
|
+
/**
|
|
345
|
+
* Send binary data to a specific peer.
|
|
346
|
+
*/
|
|
347
|
+
sendBinaryTo(peerId: string, label: string, data: ArrayBuffer | Uint8Array): boolean;
|
|
348
|
+
/**
|
|
349
|
+
* Send JSON data to all peers on a data channel.
|
|
350
|
+
*/
|
|
351
|
+
sendJSON(label: string, data: unknown): boolean;
|
|
352
|
+
/**
|
|
353
|
+
* Send JSON data to a specific peer.
|
|
354
|
+
*/
|
|
355
|
+
sendJSONTo(peerId: string, label: string, data: unknown): boolean;
|
|
356
|
+
/**
|
|
357
|
+
* Close a specific data channel on all peers.
|
|
358
|
+
*/
|
|
359
|
+
closeDataChannel(label: string): boolean;
|
|
360
|
+
/**
|
|
361
|
+
* Mute or unmute audio
|
|
362
|
+
*/
|
|
363
|
+
muteAudio(muted: boolean): void;
|
|
364
|
+
/**
|
|
365
|
+
* Mute or unmute video
|
|
366
|
+
*/
|
|
367
|
+
muteVideo(muted: boolean): void;
|
|
368
|
+
/**
|
|
369
|
+
* Start screen sharing, replacing the current video track.
|
|
370
|
+
* @param options - Display media constraints
|
|
371
|
+
*/
|
|
372
|
+
startScreenShare(options?: DisplayMediaStreamOptions): Promise<void>;
|
|
373
|
+
/**
|
|
374
|
+
* Stop screen sharing and restore the previous video track.
|
|
375
|
+
*/
|
|
376
|
+
stopScreenShare(): Promise<void>;
|
|
377
|
+
/**
|
|
378
|
+
* Get raw stats for a peer connection.
|
|
379
|
+
*/
|
|
380
|
+
getRawStats(peerId: string): Promise<RTCStatsReport | null>;
|
|
381
|
+
/**
|
|
382
|
+
* Get raw stats for all peer connections.
|
|
383
|
+
*/
|
|
384
|
+
getAllRawStats(): Promise<Map<string, RTCStatsReport>>;
|
|
385
|
+
/**
|
|
386
|
+
* Get a normalized quality summary for a peer connection.
|
|
387
|
+
*/
|
|
388
|
+
getQualitySummary(peerId: string): Promise<ConnectionQualitySummary | null>;
|
|
389
|
+
/**
|
|
390
|
+
* Get quality summaries for all peer connections.
|
|
391
|
+
*/
|
|
392
|
+
getAllQualitySummaries(): Promise<Map<string, ConnectionQualitySummary>>;
|
|
393
|
+
private parseStatsToSummary;
|
|
394
|
+
private findMatchingReport;
|
|
395
|
+
private getStatReport;
|
|
396
|
+
/**
|
|
397
|
+
* Start recording a stream.
|
|
398
|
+
* @param streamId - 'local' for local stream, or a peer ID for remote stream
|
|
399
|
+
* @param options - Recording options
|
|
400
|
+
*/
|
|
401
|
+
startRecording(streamId: string, options?: RecordingOptions): RecordingHandle | null;
|
|
402
|
+
/**
|
|
403
|
+
* Check if a stream is being recorded.
|
|
404
|
+
*/
|
|
405
|
+
isRecording(streamId: string): boolean;
|
|
406
|
+
/**
|
|
407
|
+
* Stop all recordings and return the blobs.
|
|
408
|
+
*/
|
|
409
|
+
stopAllRecordings(): Promise<Map<string, Blob>>;
|
|
410
|
+
private selectMimeType;
|
|
411
|
+
/**
|
|
412
|
+
* End the call and disconnect from all peers
|
|
413
|
+
*/
|
|
414
|
+
hangup(): void;
|
|
415
|
+
/**
|
|
416
|
+
* Clean up all resources
|
|
417
|
+
*/
|
|
418
|
+
dispose(): void;
|
|
419
|
+
}
|
|
420
|
+
//# sourceMappingURL=webrtc-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webrtc-manager.d.ts","sourceRoot":"","sources":["../src/webrtc-manager.ts"],"names":[],"mappings":"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"}
|