1 |
|
2 | var getUserMedia = require('getusermedia');
|
3 |
|
4 |
|
5 | var cache = {};
|
6 |
|
7 | module.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 |
|
22 | if (window.navigator.userAgent.match('Linux')) maxver = 35;
|
23 | if (chromever >= 26 && chromever <= maxver) {
|
24 |
|
25 |
|
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 |
|
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 |
|
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';
|
77 | }
|
78 | }
|
79 | };
|
80 |
|
81 | window.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 === '') {
|
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 | });
|