Skip to content
This repository was archived by the owner on Oct 25, 2024. It is now read-only.

Commit 8436248

Browse files
committed
Initialize QUIC support.
1 parent 3f18afa commit 8436248

File tree

3 files changed

+147
-23
lines changed

3 files changed

+147
-23
lines changed

src/samples/conference/public/scripts/index.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,33 @@ const runSocketIOSample = function() {
191191
if(!subscribeForward){
192192
if (stream.source.audio === 'mixed' || stream.source.video ===
193193
'mixed') {
194+
<<<<<<< HEAD
194195
subscribeAndRenderVideo(stream);
196+
=======
197+
conference.subscribe(stream, {
198+
audio: {codecs:[{name:'opus'}]},
199+
video: true,
200+
transport: {protocol:'quic'}
201+
}).then((subscription) => {
202+
subscriptionForMixedStream = subscription;
203+
let $video = $(`<video controls autoplay id=${stream.id} style='display:block'>this browser does not supported video tag</video>`);
204+
$video.get(0).srcObject = stream.mediaStream;
205+
$('body').append($video);
206+
subscription.addEventListener('error', (err) => {
207+
console.log('Subscription error: ' + err.error.message);
208+
})
209+
});
210+
for (const resolution of stream.capabilities.video.resolutions) {
211+
const button = $('<button/>', {
212+
text: resolution.width + 'x' +
213+
resolution.height,
214+
click: () => {
215+
subscribeDifferentResolution(stream, resolution);
216+
}
217+
});
218+
button.appendTo($('body'));
219+
};
220+
>>>>>>> d4a3a3c... Initialize QUIC support.
195221
}
196222
} else if (stream.source.audio !== 'mixed') {
197223
subscribeAndRenderVideo(stream);

src/sdk/conference/channel.js

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -814,3 +814,100 @@ export class ConferencePeerConnectionChannel extends EventDispatcher {
814814
return !!param.codec;
815815
}
816816
}
817+
export class ConferenceQuicChannel extends EventDispatcher {
818+
// TODO: share code with ConferencePeerConnectionChannel.
819+
820+
constructor(config, signaling) {
821+
super();
822+
if (typeof RTCIceTransport !== 'function' || typeof RTCQuicTransport !==
823+
'function') {
824+
throw new TypeError(
825+
'RTCIceTransport or RTCQuicTransport is not supported. Please use WebRTC connection.'
826+
)
827+
}
828+
this._signaling = signaling;
829+
this._iceTransport = null;
830+
this._quicTransport = null;
831+
this._subscribedStream = null;
832+
this._subscribePromise = null;
833+
}
834+
835+
subscribe(stream, options) {
836+
this._subscribedStream = stream;
837+
this._iceTransport = new RTCIceTransport();
838+
this._iceTransport.onicecandidate=(event)=>{
839+
const candidate=event.candidate;
840+
this._signaling.sendSignalingMessage('soac', {
841+
id: this._internalId,
842+
signaling: {
843+
type: 'candidate',
844+
candidate: {
845+
candidate: 'a=' + candidate.candidate,
846+
sdpMid: candidate.sdpMid,
847+
sdpMLineIndex: candidate.sdpMLineIndex
848+
}
849+
}
850+
});
851+
};
852+
const mediaOptions=Object.create({});
853+
mediaOptions.audio = {};
854+
mediaOptions.audio.from = stream.id;
855+
mediaOptions.video = {};
856+
mediaOptions.video.from = stream.id;
857+
this._signaling.sendSignalingMessage('subscribe', {
858+
transport: {protocol:'quic'},
859+
media:mediaOptions
860+
}).then((data) => {
861+
const messageEvent = new MessageEvent('id', {
862+
message: data.id,
863+
origin: this._remoteId
864+
});
865+
this.dispatchEvent(messageEvent);
866+
this._internalId = data.id;
867+
this._signaling.sendSignalingMessage('soac', {
868+
id: this._internalId,
869+
signaling: {
870+
type: 'ice-parameters',
871+
parameters: this._iceTransport.getLocalParameters()
872+
}
873+
});
874+
});
875+
return new Promise((resolve, reject) => {
876+
this._subscribePromise = { resolve: resolve, reject: reject };
877+
});
878+
}
879+
880+
onMessage(notification, message) {
881+
switch (notification) {
882+
case 'progress':
883+
if (message.status === 'soac')
884+
this._soacHandler(message.data);
885+
else if (message.status === 'ready')
886+
this._readyHandler();
887+
else if(message.status === 'error')
888+
this._errorHandler(message.data);
889+
break;
890+
case 'stream':
891+
this._onStreamEvent(message);
892+
break;
893+
default:
894+
Logger.warning('Unknown notification from MCU.');
895+
}
896+
}
897+
898+
_soacHandler(data) {
899+
if (data.type === 'ice-parameters') {
900+
Logger.debug('Username: ' + data.parameters.usernameFragment +
901+
', password:' + data.parameters.password);
902+
this._iceTransport.start(data.parameters);
903+
this._iceTransport.gather({gatherPolicy:'all', iceServers:[]});
904+
} else if (data.type === 'candidate') {
905+
const candidate=new RTCIceCandidate({
906+
candidate: data.candidate.candidate,
907+
sdpMid: data.candidate.sdpMid,
908+
sdpMLineIndex: data.candidate.sdpMLineIndex
909+
});
910+
this._iceTransport.addRemoteCandidate(candidate);
911+
}
912+
}
913+
}

src/sdk/conference/client.js

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,19 @@
66

77
'use strict';
88

9-
import * as EventModule from '../base/event.js';
10-
import {SioSignaling as Signaling} from './signaling.js';
11-
import Logger from '../base/logger.js';
12-
import {Base64} from '../base/base64.js';
13-
import {ConferenceError} from './error.js';
14-
import * as Utils from '../base/utils.js';
15-
import * as StreamModule from '../base/stream.js';
16-
import {Participant} from './participant.js';
17-
import {ConferenceInfo} from './info.js';
18-
import {ConferencePeerConnectionChannel} from './channel.js';
19-
import {
20-
RemoteMixedStream,
21-
ActiveAudioInputChangeEvent,
22-
LayoutChangeEvent,
23-
} from './mixedstream.js';
24-
import * as StreamUtilsModule from './streamutils.js';
9+
import * as EventModule from '../base/event.js'
10+
import { SioSignaling as Signaling } from './signaling.js'
11+
import Logger from '../base/logger.js'
12+
import { Base64 } from '../base/base64.js'
13+
import { ConferenceError } from './error.js'
14+
import * as Utils from '../base/utils.js'
15+
import * as StreamModule from '../base/stream.js'
16+
import { Participant } from './participant.js'
17+
import { ConferenceInfo } from './info.js'
18+
import { ConferencePeerConnectionChannel, ConferenceQuicChannel } from './channel.js'
19+
import { RemoteMixedStream, ActiveAudioInputChangeEvent, LayoutChangeEvent } from './mixedstream.js'
20+
import * as StreamUtilsModule from './streamutils.js'
21+
import { timingSafeEqual } from 'crypto';
2522

2623
const SignalingState = {
2724
READY: 1,
@@ -297,16 +294,20 @@ export const ConferenceClient = function(config, signalingImpl) {
297294
}
298295

299296
// eslint-disable-next-line require-jsdoc
300-
function createPeerConnectionChannel() {
297+
function createPeerConnectionChannel(transport) {
301298
// Construct an signaling sender/receiver for ConferencePeerConnection.
302299
const signalingForChannel = Object.create(EventModule.EventDispatcher);
303300
signalingForChannel.sendSignalingMessage = sendSignalingMessage;
304-
const pcc = new ConferencePeerConnectionChannel(
305-
config, signalingForChannel);
306-
pcc.addEventListener('id', (messageEvent) => {
307-
channels.set(messageEvent.message, pcc);
301+
let channel;
302+
if (transport && transport.protocol === 'quic') {
303+
channel = new ConferenceQuicChannel(config, signalingForChannel);
304+
} else {
305+
channel = new ConferencePeerConnectionChannel(config, signalingForChannel);
306+
}
307+
channel.addEventListener('id', (messageEvent) => {
308+
channels.set(messageEvent.message, channel);
308309
});
309-
return pcc;
310+
return channel;
310311
}
311312

312313
// eslint-disable-next-line require-jsdoc
@@ -422,7 +423,7 @@ export const ConferenceClient = function(config, signalingImpl) {
422423
if (!(stream instanceof StreamModule.RemoteStream)) {
423424
return Promise.reject(new ConferenceError('Invalid stream.'));
424425
}
425-
const channel = createPeerConnectionChannel();
426+
const channel = createPeerConnectionChannel(options.transport);
426427
return channel.subscribe(stream, options);
427428
};
428429

0 commit comments

Comments
 (0)