You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
240 lines
6.4 KiB
240 lines
6.4 KiB
10 months ago
|
/*
|
||
|
* Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
|
||
|
*
|
||
|
* Use of this source code is governed by a BSD-style license
|
||
|
* that can be found in the LICENSE file in the root of the source
|
||
|
* tree.
|
||
|
*/
|
||
|
/* eslint-env node */
|
||
|
const EventEmitter = require('events');
|
||
|
|
||
|
module.exports = function(window) {
|
||
|
// required by the shim to mock an EventEmitter.
|
||
|
global.document = {
|
||
|
createDocumentFragment: () => {
|
||
|
let e = new EventEmitter();
|
||
|
e.addEventListener = e.addListener.bind(e);
|
||
|
e.removeEventListener = e.removeListener.bind(e);
|
||
|
e.dispatchEvent = function(ev) {
|
||
|
e.emit(ev.type, ev);
|
||
|
};
|
||
|
return e;
|
||
|
}
|
||
|
};
|
||
|
global.Event = function(type) {
|
||
|
this.type = type;
|
||
|
};
|
||
|
|
||
|
window.RTCSessionDescription = function(init) {
|
||
|
return init;
|
||
|
};
|
||
|
|
||
|
const RTCIceGatherer = function(options) {
|
||
|
this.component = 'rtp';
|
||
|
|
||
|
this._emitter = new EventEmitter();
|
||
|
this.addEventListener = this._emitter.addListener.bind(this);
|
||
|
this.removeEventListener = this._emitter.removeListener.bind(this);
|
||
|
this.dispatchEvent = (ev) => {
|
||
|
this._emitter.emit(ev.type, ev);
|
||
|
};
|
||
|
|
||
|
let candidates = [
|
||
|
{
|
||
|
foundation: '702786350',
|
||
|
priority: 41819902,
|
||
|
protocol: 'udp',
|
||
|
ip: '8.8.8.8',
|
||
|
port: 60769,
|
||
|
type: 'host'
|
||
|
},
|
||
|
{}
|
||
|
];
|
||
|
this._emittedCandidates = [];
|
||
|
let emitCandidate = () => {
|
||
|
let e = new Event('RTCIceGatherEvent');
|
||
|
e.candidate = candidates.shift();
|
||
|
if (Object.keys(e.candidate).length) {
|
||
|
this._emittedCandidates.push(e.candidate);
|
||
|
}
|
||
|
if (this.onlocalcandidate) {
|
||
|
this.onlocalcandidate(e);
|
||
|
}
|
||
|
if (candidates.length) {
|
||
|
setTimeout(emitCandidate, 50);
|
||
|
}
|
||
|
};
|
||
|
setTimeout(emitCandidate, 50);
|
||
|
};
|
||
|
|
||
|
RTCIceGatherer.prototype.getLocalCandidates = function() {
|
||
|
return this._emittedCandidates;
|
||
|
};
|
||
|
|
||
|
RTCIceGatherer.prototype.getLocalParameters = function() {
|
||
|
return {
|
||
|
usernameFragment: 'someufrag',
|
||
|
password: 'somepass'
|
||
|
};
|
||
|
};
|
||
|
RTCIceGatherer.prototype.getStats = function() {
|
||
|
return Promise.resolve({});
|
||
|
};
|
||
|
window.RTCIceGatherer = RTCIceGatherer;
|
||
|
|
||
|
const RTCIceTransport = function() {
|
||
|
this._remoteCandidates = [];
|
||
|
this.state = 'new';
|
||
|
};
|
||
|
RTCIceTransport.prototype.start = function(gatherer, parameters, role) {
|
||
|
this._gatherer = gatherer;
|
||
|
this._remoteParameters = parameters;
|
||
|
this._role = role || 'controlled';
|
||
|
if (this._remoteCandidates.length > 0) {
|
||
|
this.state = 'completed'; // TODO: not accurate, should go to checking.
|
||
|
}
|
||
|
};
|
||
|
RTCIceTransport.prototype.addRemoteCandidate = function(remoteCandidate) {
|
||
|
if (Object.keys(remoteCandidate).length) {
|
||
|
this._remoteCandidates.push(remoteCandidate);
|
||
|
}
|
||
|
if (this.state === 'new') {
|
||
|
this.state = 'completed'; // TODO: not accurate, should go to checking.
|
||
|
}
|
||
|
};
|
||
|
RTCIceTransport.prototype.setRemoteCandidates = function(remoteCandidates) {
|
||
|
this._remoteCandidates = remoteCandidates;
|
||
|
};
|
||
|
RTCIceTransport.prototype.getRemoteCandidates = function() {
|
||
|
return this._remoteCandidates;
|
||
|
};
|
||
|
RTCIceTransport.prototype.getRemoteParameters = function() {
|
||
|
return this._remoteParameters;
|
||
|
};
|
||
|
RTCIceTransport.prototype.stop = function() {};
|
||
|
RTCIceTransport.prototype.getStats = function() {
|
||
|
return Promise.resolve({});
|
||
|
};
|
||
|
window.RTCIceTransport = RTCIceTransport;
|
||
|
|
||
|
const RTCDtlsTransport = function(transport) {
|
||
|
this.transport = transport;
|
||
|
this.state = 'new';
|
||
|
};
|
||
|
RTCDtlsTransport.prototype.start = function() {
|
||
|
this.state = 'connected'; // TODO: not accurate.
|
||
|
};
|
||
|
RTCDtlsTransport.prototype.stop = function() {};
|
||
|
RTCDtlsTransport.prototype.getLocalParameters = function() {
|
||
|
return {
|
||
|
role: 'auto',
|
||
|
fingerprints: [
|
||
|
{
|
||
|
algorithm: 'sha-256',
|
||
|
value: '00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00' +
|
||
|
':00:00:00:00:00:00:00:00:00:00:00:00:00:00:00'
|
||
|
}
|
||
|
]
|
||
|
};
|
||
|
};
|
||
|
RTCDtlsTransport.prototype.getStats = function() {
|
||
|
return Promise.resolve({});
|
||
|
};
|
||
|
window.RTCDtlsTransport = RTCDtlsTransport;
|
||
|
|
||
|
function getCapabilities(kind) {
|
||
|
var opus = {
|
||
|
name: 'opus',
|
||
|
kind: 'audio',
|
||
|
clockRate: 48000,
|
||
|
preferredPayloadType: 111,
|
||
|
numChannels: 2
|
||
|
};
|
||
|
var vp8 = {
|
||
|
name: 'vp8',
|
||
|
kind: 'video',
|
||
|
clockRate: 90000,
|
||
|
preferredPayloadType: 100,
|
||
|
numChannels: 1,
|
||
|
rtcpFeedback: [
|
||
|
{type: 'nack', parameter: ''},
|
||
|
{type: 'nack', parameter: 'pli'}
|
||
|
]
|
||
|
};
|
||
|
var rtx = {
|
||
|
name: 'rtx',
|
||
|
kind: 'video',
|
||
|
clockRate: 90000,
|
||
|
preferredPayloadType: 101,
|
||
|
numChannels: 1,
|
||
|
parameters: {apt: 100}
|
||
|
};
|
||
|
var codecs;
|
||
|
switch (kind) {
|
||
|
case 'audio':
|
||
|
codecs = [opus];
|
||
|
break;
|
||
|
case 'video':
|
||
|
codecs = [vp8, rtx];
|
||
|
break;
|
||
|
default:
|
||
|
codecs = [opus, vp8, rtx];
|
||
|
break;
|
||
|
}
|
||
|
var headerExtensions;
|
||
|
switch (kind) {
|
||
|
case 'audio':
|
||
|
headerExtensions = [];
|
||
|
break;
|
||
|
default:
|
||
|
case 'video':
|
||
|
headerExtensions = [{
|
||
|
id: 3,
|
||
|
uri: 'http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time'
|
||
|
}];
|
||
|
break;
|
||
|
}
|
||
|
return {
|
||
|
codecs: codecs,
|
||
|
headerExtensions: headerExtensions
|
||
|
};
|
||
|
}
|
||
|
|
||
|
const RTCRtpReceiver = function(transport, kind) {
|
||
|
this.track = new window.MediaStreamTrack();
|
||
|
this.track.kind = kind;
|
||
|
this.transport = transport;
|
||
|
};
|
||
|
RTCRtpReceiver.prototype.receive = function() {};
|
||
|
RTCRtpReceiver.prototype.stop = function() {};
|
||
|
RTCRtpReceiver.prototype.setTransport = function(transport) {
|
||
|
this.transport = transport;
|
||
|
};
|
||
|
|
||
|
RTCRtpReceiver.getCapabilities = getCapabilities;
|
||
|
RTCRtpReceiver.prototype.getStats = function() {
|
||
|
return Promise.resolve({});
|
||
|
};
|
||
|
window.RTCRtpReceiver = RTCRtpReceiver;
|
||
|
|
||
|
const RTCRtpSender = function(track, transport) {
|
||
|
this.track = track;
|
||
|
this.transport = transport;
|
||
|
};
|
||
|
RTCRtpSender.prototype.send = function() {};
|
||
|
RTCRtpSender.prototype.stop = function() {};
|
||
|
RTCRtpSender.prototype.setTransport = function(transport) {
|
||
|
this.transport = transport;
|
||
|
};
|
||
|
|
||
|
RTCRtpSender.getCapabilities = getCapabilities;
|
||
|
RTCRtpSender.prototype.getStats = function() {
|
||
|
return Promise.resolve({123: {type: 'outboundrtp', id: 123}});
|
||
|
};
|
||
|
RTCRtpSender.prototype.replaceTrack = function(withTrack) {
|
||
|
this.track = withTrack;
|
||
|
return Promise.resolve();
|
||
|
};
|
||
|
window.RTCRtpSender = RTCRtpSender;
|
||
|
};
|