11import 'dart:async' ;
2- import 'dart:js' as js;
32import 'dart:js_interop' ;
4- import 'dart:js_util' as jsutil ;
3+ import 'dart:js_interop_unsafe' ;
54
5+ import 'package:dart_webrtc/src/frame_cryptor_impl.dart' ;
66import 'package:web/web.dart' as web;
77import 'package:webrtc_interface/webrtc_interface.dart' ;
88
@@ -52,10 +52,11 @@ class MediaDevicesWeb extends MediaDevices {
5252
5353 final mediaDevices = web.window.navigator.mediaDevices;
5454
55- if (jsutil.hasProperty (mediaDevices, 'getUserMedia' )) {
56- var args = jsutil.jsify (mediaConstraints);
57- final jsStream = await jsutil.promiseToFuture< web.MediaStream > (
58- jsutil.callMethod (mediaDevices, 'getUserMedia' , [args]));
55+ if (mediaDevices.getProperty ('getUserMedia' .toJS).isDefinedAndNotNull) {
56+ var args = mediaConstraints.jsify ();
57+ final jsStream = await mediaDevices
58+ .getUserMedia (args as web.MediaStreamConstraints )
59+ .toDart;
5960
6061 return MediaStreamWeb (jsStream, 'local' );
6162 } else {
@@ -78,15 +79,18 @@ class MediaDevicesWeb extends MediaDevices {
7879 try {
7980 final mediaDevices = web.window.navigator.mediaDevices;
8081
81- if (jsutil.hasProperty (mediaDevices, 'getDisplayMedia' )) {
82- final arg = jsutil.jsify (mediaConstraints);
83- final jsStream = await jsutil.promiseToFuture< web.MediaStream > (
84- jsutil.callMethod (mediaDevices, 'getDisplayMedia' , [arg]));
82+ if (mediaDevices
83+ .getProperty ('getDisplayMedia' .toJS)
84+ .isDefinedAndNotNull) {
85+ final arg = mediaConstraints.jsify ();
86+ final jsStream = await mediaDevices
87+ .getDisplayMedia (arg as web.DisplayMediaStreamOptions )
88+ .toDart;
8589 return MediaStreamWeb (jsStream, 'local' );
8690 } else {
8791 final jsStream = await web.window.navigator.mediaDevices
8892 .getUserMedia (web.MediaStreamConstraints (
89- video: jsutil. jsify ( {'mediaSource' : 'screen' }) ,
93+ video: {'mediaSource' : 'screen' }. jsify () ! ,
9094 audio: mediaConstraints['audio' ] ?? false ))
9195 .toDart;
9296 return MediaStreamWeb (jsStream, 'local' );
@@ -165,20 +169,26 @@ class MediaDevicesWeb extends MediaDevices {
165169 try {
166170 final mediaDevices = web.window.navigator.mediaDevices;
167171
168- if (jsutil.hasProperty (mediaDevices, 'selectAudioOutput' )) {
172+ if (mediaDevices
173+ .getProperty ('selectAudioOutput' .toJS)
174+ .isDefinedAndNotNull) {
169175 if (options != null ) {
170- final arg = jsutil.jsify (options);
171- final deviceInfo = await jsutil.promiseToFuture< web.MediaDeviceInfo > (
172- jsutil.callMethod (mediaDevices, 'selectAudioOutput' , [arg]));
176+ final arg = options.jsify ();
177+ final deviceInfo =
178+ await (mediaDevices.callMethod ('selectAudioOutput' .toJS, arg)
179+ as JSPromise <web.MediaDeviceInfo >)
180+ .toDart;
173181 return MediaDeviceInfo (
174182 kind: deviceInfo.kind,
175183 label: deviceInfo.label,
176184 deviceId: deviceInfo.deviceId,
177185 groupId: deviceInfo.groupId,
178186 );
179187 } else {
180- final deviceInfo = await jsutil.promiseToFuture< web.MediaDeviceInfo > (
181- jsutil.callMethod (mediaDevices, 'selectAudioOutput' , []));
188+ final deviceInfo =
189+ await (mediaDevices.callMethod ('selectAudioOutput' .toJS)
190+ as JSPromise <web.MediaDeviceInfo >)
191+ .toDart;
182192 return MediaDeviceInfo (
183193 kind: deviceInfo.kind,
184194 label: deviceInfo.label,
@@ -199,8 +209,9 @@ class MediaDevicesWeb extends MediaDevices {
199209 try {
200210 final mediaDevices = web.window.navigator.mediaDevices;
201211
202- jsutil.setProperty (mediaDevices, 'ondevicechange' ,
203- js.allowInterop ((evt) => listener? .call (evt)));
212+ mediaDevices.ondevicechange = ((JSObject evt) {
213+ listener? .call (evt);
214+ }).toJS;
204215 } catch (e) {
205216 throw 'Unable to set ondevicechange: ${e .toString ()}' ;
206217 }
@@ -211,7 +222,11 @@ class MediaDevicesWeb extends MediaDevices {
211222 try {
212223 final mediaDevices = web.window.navigator.mediaDevices;
213224
214- jsutil.getProperty (mediaDevices, 'ondevicechange' );
225+ final fn = mediaDevices.ondevicechange;
226+ if (fn.isUndefinedOrNull) {
227+ return null ;
228+ }
229+ return (dynamic event) => fn! .callAsFunction (event);
215230 } catch (e) {
216231 throw 'Unable to get ondevicechange: ${e .toString ()}' ;
217232 }
0 commit comments