Skip to content

Commit 810e1e5

Browse files
committed
Add features to v2 sdk
1 parent 1844be9 commit 810e1e5

File tree

10 files changed

+1231
-73
lines changed

10 files changed

+1231
-73
lines changed

packages/webrtc-sdk/README.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ Common events emitted by the SDK (see TypeDoc for full list):
4242
- `data_received` { streamId, data: string | ArrayBuffer }
4343
- `updated_stats` PeerStats
4444
- `devices_updated` GroupedDevices
45+
- `room_joined` / `room_left`
46+
- `room_information`, `broadcast_object`, `subscriber_count`, `subscriber_list`
47+
- `video_track_assignments`
48+
- `reconnection_attempt_for_publisher` / `reconnection_attempt_for_player`
4549
- `error` { error, message? }
4650

4751
### Stats helpers
@@ -101,6 +105,36 @@ adaptor.enableTrack('mainStreamId', 'camera_user3', true);
101105
adaptor.forceStreamQuality('mainStreamId', 720); // or 'auto'
102106
```
103107

108+
### Device management and screen share
109+
110+
```ts
111+
// Switch devices without renegotiation
112+
await adaptor.selectVideoInput('camera-device-id');
113+
await adaptor.selectAudioInput('mic-device-id');
114+
115+
// Camera on/off keeps sender alive (black dummy track)
116+
await adaptor.turnOffLocalCamera();
117+
await adaptor.turnOnLocalCamera();
118+
119+
// Screen share and overlay (PIP camera)
120+
await adaptor.startScreenShare();
121+
await adaptor.stopScreenShare();
122+
await adaptor.startScreenWithCameraOverlay();
123+
await adaptor.stopScreenWithCameraOverlay();
124+
```
125+
126+
### Data channel
127+
128+
```ts
129+
// Text
130+
await adaptor.sendData('s1', 'hello');
131+
// Binary
132+
await adaptor.sendData('s1', new Uint8Array([1,2,3]).buffer);
133+
// Optional sanitize received strings
134+
adaptor.setSanitizeDataChannelStrings(true);
135+
adaptor.on('data_received', ({ data }) => console.log('rx', data));
136+
```
137+
104138
## Examples
105139

106140
- `examples/publish.html`

packages/webrtc-sdk/examples/publish.html

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,26 @@ <h2>Publish Sample (TS v2)</h2>
4444
<input id="dcText" placeholder="message" />
4545
<button id="sendText" disabled>Send Text</button>
4646
<button id="sendBin" disabled>Send 128KB Binary</button>
47+
<label style="margin-left:12px"><input type="checkbox" id="sanitize" /> Sanitize Strings</label>
4748
</fieldset>
4849
</div>
4950
<div style="margin-top:12px;">
5051
<fieldset>
5152
<legend>Screen Share</legend>
5253
<button id="startShare">Start Share</button>
5354
<button id="stopShare" disabled>Stop Share</button>
55+
<button id="startOverlay">Start Share + Camera Overlay</button>
56+
<button id="stopOverlay" disabled>Stop Overlay</button>
57+
</fieldset>
58+
</div>
59+
<div style="margin-top:12px;">
60+
<fieldset>
61+
<legend>Audio</legend>
62+
<label>Volume:</label>
63+
<input id="volume" type="range" min="0" max="1" step="0.01" value="1" />
64+
<button id="meterOn">Enable Level Meter</button>
65+
<button id="meterOff">Disable Level Meter</button>
66+
<span id="level">level: 0.00</span>
5467
</fieldset>
5568
</div>
5669
<div style="margin-top:12px;">
@@ -77,12 +90,19 @@ <h2>Publish Sample (TS v2)</h2>
7790
const dcText = document.getElementById('dcText');
7891
const sendTextBtn = document.getElementById('sendText');
7992
const sendBinBtn = document.getElementById('sendBin');
93+
const sanitizeCb = document.getElementById('sanitize');
8094
const statsEl = document.getElementById('stats');
8195
const enableStatsBtn = document.getElementById('enableStats');
8296
const startShareBtn = document.getElementById('startShare');
8397
const stopShareBtn = document.getElementById('stopShare');
98+
const startOverlayBtn = document.getElementById('startOverlay');
99+
const stopOverlayBtn = document.getElementById('stopOverlay');
84100
const turnOffCamBtn = document.getElementById('turnOffCam');
85101
const turnOnCamBtn = document.getElementById('turnOnCam');
102+
const vol = document.getElementById('volume');
103+
const meterOn = document.getElementById('meterOn');
104+
const meterOff = document.getElementById('meterOff');
105+
const level = document.getElementById('level');
86106

87107
function log(msg) {
88108
logEl.textContent += msg + '\n';
@@ -116,6 +136,7 @@ <h2>Publish Sample (TS v2)</h2>
116136
if (typeof data === 'string') log('dc <- ' + data);
117137
else log('dc <- binary ' + (data.byteLength || 0) + ' bytes');
118138
});
139+
sanitizeCb.onchange = () => adaptor.setSanitizeDataChannelStrings(sanitizeCb.checked);
119140
adaptor.on('updated_stats', (ps) => {
120141
statsEl.textContent = `bytesSent=${ps.totalBytesSent} bytesRecv=${ps.totalBytesReceived}`;
121142
});
@@ -179,6 +200,23 @@ <h2>Publish Sample (TS v2)</h2>
179200
} catch (e) { log('stop share failed: ' + e.message); }
180201
};
181202

203+
startOverlayBtn.onclick = async () => {
204+
try {
205+
await adaptor.startScreenWithCameraOverlay();
206+
startOverlayBtn.disabled = true;
207+
stopOverlayBtn.disabled = false;
208+
log('overlay started');
209+
} catch (e) { log('start overlay failed: ' + e.message); }
210+
};
211+
stopOverlayBtn.onclick = async () => {
212+
try {
213+
await adaptor.stopScreenWithCameraOverlay();
214+
startOverlayBtn.disabled = false;
215+
stopOverlayBtn.disabled = true;
216+
log('overlay stopped');
217+
} catch (e) { log('stop overlay failed: ' + e.message); }
218+
};
219+
182220
turnOffCamBtn.onclick = () => {
183221
adaptor.turnOffLocalCamera();
184222
log('camera turned off');
@@ -187,6 +225,19 @@ <h2>Publish Sample (TS v2)</h2>
187225
adaptor.turnOnLocalCamera();
188226
log('camera turned on');
189227
};
228+
229+
vol.oninput = () => {
230+
adaptor.setVolumeLevel(parseFloat(vol.value));
231+
};
232+
meterOn.onclick = async () => {
233+
await adaptor.enableAudioLevelForLocalStream((v) => {
234+
level.textContent = 'level: ' + v.toFixed(2);
235+
}, 200);
236+
};
237+
meterOff.onclick = () => {
238+
adaptor.disableAudioLevelForLocalStream();
239+
level.textContent = 'level: 0.00';
240+
};
190241
</script>
191242
</body>
192243
</html>

packages/webrtc-sdk/src/core/events.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export interface EventMap {
99
initialized: void;
1010
closed: unknown;
1111
server_will_stop: unknown;
12+
/** Emitted when new local tracks are attached or replaced; used internally to refresh senders */
1213
publish_started: { streamId: string };
1314
publish_finished: { streamId: string };
1415
play_started: { streamId: string };
@@ -20,6 +21,7 @@ export interface EventMap {
2021
data_channel_closed: { streamId: string };
2122
newTrackAvailable: { stream: MediaStream; track: MediaStreamTrack; streamId: string };
2223
devices_updated: GroupedDevices;
24+
local_tracks_changed: void;
2325
error: { error: string; message?: unknown };
2426
// dynamic notification channel e.g. notification:subscriberCount -> payload from server
2527
[k: `notification:${string}`]: unknown;
@@ -31,6 +33,13 @@ export interface EventMap {
3133
room_joined?: unknown;
3234
room_left?: unknown;
3335
video_track_assignments?: unknown;
36+
// additional common notifications
37+
stream_information?: unknown;
38+
track_list?: unknown;
39+
subtrack_list?: unknown;
40+
subtrack_count?: unknown;
41+
reconnection_attempt_for_publisher?: string | { streamId: string };
42+
reconnection_attempt_for_player?: string | { streamId: string };
3443
}
3544

3645
export interface TypedEmitter<M extends Record<string, unknown>> {

0 commit comments

Comments
 (0)