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

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;
};