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.
99 lines
2.6 KiB
99 lines
2.6 KiB
10 months ago
|
/*
|
||
|
* Copyright (c) 2017 Philipp Hancke. 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');
|
||
|
const SDPUtils = require('sdp');
|
||
|
|
||
|
module.exports = function(window) {
|
||
|
const MediaStream = function(tracks) {
|
||
|
this.id = SDPUtils.generateIdentifier();
|
||
|
this._tracks = tracks || [];
|
||
|
|
||
|
this._emitter = new EventEmitter();
|
||
|
this.addEventListener = (name, cb) => {
|
||
|
this._emitter.addListener(name, cb);
|
||
|
};
|
||
|
this.removeEventListener = (name, cb) => {
|
||
|
this._emitter.removeListener(name, cb);
|
||
|
};
|
||
|
this.dispatchEvent = (ev) => {
|
||
|
this._emitter.emit(ev.type, ev);
|
||
|
};
|
||
|
};
|
||
|
|
||
|
MediaStream.prototype.getTracks = function() {
|
||
|
return this._tracks;
|
||
|
};
|
||
|
MediaStream.prototype.getAudioTracks = function() {
|
||
|
return this._tracks.filter(t => t.kind === 'audio');
|
||
|
};
|
||
|
MediaStream.prototype.getVideoTracks = function() {
|
||
|
return this._tracks.filter(t => t.kind === 'video');
|
||
|
};
|
||
|
MediaStream.prototype.addTrack = function(t) {
|
||
|
this._tracks.push(t);
|
||
|
};
|
||
|
MediaStream.prototype.removeTrack = function(t) {
|
||
|
var idx = this._tracks.indexOf(t);
|
||
|
if (idx !== -1) {
|
||
|
this._tracks.splice(idx, 1);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
window.MediaStream = MediaStream;
|
||
|
|
||
|
const MediaStreamTrack = function() {
|
||
|
this.id = SDPUtils.generateIdentifier();
|
||
|
|
||
|
this._emitter = new EventEmitter();
|
||
|
this.addEventListener = (name, cb) => {
|
||
|
this._emitter.addListener(name, cb);
|
||
|
};
|
||
|
this.removeEventListener = (name, cb) => {
|
||
|
this._emitter.removeListener(name, cb);
|
||
|
};
|
||
|
this.dispatchEvent = (ev) => {
|
||
|
this._emitter.emit(ev.type, ev);
|
||
|
};
|
||
|
};
|
||
|
MediaStreamTrack.prototype.stop = function() {};
|
||
|
window.MediaStreamTrack = MediaStreamTrack;
|
||
|
|
||
|
const MediaStreamTrackEvent = function(type, args) {
|
||
|
this.type = type;
|
||
|
this.track = args.track;
|
||
|
};
|
||
|
window.MediaStreamTrackEvent = MediaStreamTrackEvent;
|
||
|
|
||
|
const getUserMedia = (constraints) => {
|
||
|
const tracks = [];
|
||
|
if (constraints.audio) {
|
||
|
let track = new MediaStreamTrack();
|
||
|
track.kind = 'audio';
|
||
|
tracks.push(track);
|
||
|
}
|
||
|
if (constraints.video) {
|
||
|
let track = new MediaStreamTrack();
|
||
|
track.kind = 'video';
|
||
|
tracks.push(track);
|
||
|
}
|
||
|
const stream = new MediaStream(tracks);
|
||
|
return new Promise((resolve) => {
|
||
|
resolve(stream);
|
||
|
});
|
||
|
};
|
||
|
window.navigator = {
|
||
|
getUserMedia: (constraints, cb, eb) => {
|
||
|
getUserMedia(constraints).then(cb, eb);
|
||
|
},
|
||
|
mediaDevices: {
|
||
|
getUserMedia
|
||
|
}
|
||
|
};
|
||
|
};
|