UNPKG

4.61 kBJavaScriptView Raw
1// getScreenMedia helper by @HenrikJoreteg
2var getUserMedia = require('getusermedia');
3
4// cache for constraints and callback
5var cache = {};
6
7module.exports = function (constraints, cb) {
8 var hasConstraints = arguments.length === 2;
9 var callback = hasConstraints ? cb : constraints;
10 var error;
11
12 if (typeof window === 'undefined' || window.location.protocol === 'http:') {
13 error = new Error('NavigatorUserMediaError');
14 error.name = 'HTTPS_REQUIRED';
15 return callback(error);
16 }
17
18 if (window.navigator.userAgent.match('Chrome')) {
19 var chromever = parseInt(window.navigator.userAgent.match(/Chrome\/(.*) /)[1], 10);
20 var maxver = 33;
21 // "known" crash in chrome 34 and 35 on linux
22 if (window.navigator.userAgent.match('Linux')) maxver = 35;
23 if (chromever >= 26 && chromever <= maxver) {
24 // chrome 26 - chrome 33 way to do it -- requires bad chrome://flags
25 // note: this is basically in maintenance mode and will go away soon
26 constraints = (hasConstraints && constraints) || {
27 video: {
28 mandatory: {
29 googLeakyBucket: true,
30 maxWidth: window.screen.width,
31 maxHeight: window.screen.height,
32 maxFrameRate: 3,
33 chromeMediaSource: 'screen'
34 }
35 }
36 };
37 getUserMedia(constraints, callback);
38 } else {
39 // chrome 34+ way requiring an extension
40 var pending = window.setTimeout(function () {
41 error = new Error('NavigatorUserMediaError');
42 error.name = 'EXTENSION_UNAVAILABLE';
43 return callback(error);
44 }, 1000);
45 cache[pending] = [callback, hasConstraints ? constraint : null];
46 window.postMessage({ type: 'getScreen', id: pending }, '*');
47 }
48 } else if (window.navigator.userAgent.match('Firefox')) {
49 var ffver = parseInt(window.navigator.userAgent.match(/Firefox\/(.*)/)[1], 10);
50 if (ffver >= 33) {
51 constraints = (hasConstraints && constraints) || {
52 video: {
53 mozMediaSource: 'window',
54 mediaSource: 'window'
55 }
56 }
57 getUserMedia(constraints, function (err, stream) {
58 callback(err, stream);
59 // workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=1045810
60 if (!err) {
61 var lastTime = stream.currentTime;
62 var polly = window.setInterval(function () {
63 if (!stream) window.clearInterval(polly);
64 if (stream.currentTime == lastTime) {
65 window.clearInterval(polly);
66 if (stream.onended) {
67 stream.onended();
68 }
69 }
70 lastTime = stream.currentTime;
71 }, 500);
72 }
73 });
74 } else {
75 error = new Error('NavigatorUserMediaError');
76 error.name = 'EXTENSION_UNAVAILABLE'; // does not make much sense but...
77 }
78 }
79};
80
81window.addEventListener('message', function (event) {
82 if (event.origin != window.location.origin) {
83 return;
84 }
85 if (event.data.type == 'gotScreen' && cache[event.data.id]) {
86 var data = cache[event.data.id];
87 var constraints = data[1];
88 var callback = data[0];
89 delete cache[event.data.id];
90
91 if (event.data.sourceId === '') { // user canceled
92 var error = new Error('NavigatorUserMediaError');
93 error.name = 'PERMISSION_DENIED';
94 callback(error);
95 } else {
96 constraints = constraints || {audio: false, video: {
97 mandatory: {
98 chromeMediaSource: 'desktop',
99 maxWidth: window.screen.width,
100 maxHeight: window.screen.height,
101 maxFrameRate: 3
102 },
103 optional: [
104 {googLeakyBucket: true},
105 {googTemporalLayeredScreencast: true}
106 ]
107 }};
108 constraints.video.mandatory.chromeMediaSourceId = event.data.sourceId;
109 getUserMedia(constraints, callback);
110 }
111 } else if (event.data.type == 'getScreenPending') {
112 window.clearTimeout(event.data.id);
113 }
114});