8000 WIP - api standardization across implementation by wer-mathurin · Pull Request #364 · flutter-webrtc/flutter-webrtc · GitHub
[go: up one dir, main page]

Skip to content

WIP - api standardization across implementation #364

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 26 commits into from
Oct 9, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
9e68acd
Initial attemp
wer-mathurin Sep 18, 2020
18593e8
Implement proposed structure
wer-mathurin Sep 23, 2020
a9e0f2d
Prevent breaking change for MediaDevices
wer-mathurin Sep 25, 2020
b9e41fa
Align with w3c js API
wer-mathurin Sep 28, 2020
10dd0a6
export video_renderer
wer-mathurin Sep 30, 2020
92dcf99
Re-organise classes to not expose Renderer Implementation
wer-mathurin Sep 30, 2020
dd21590
Expose enabled setter for mediaStreamTrack
wer-mathurin Sep 30, 2020
be155f9
Fix import
wer-mathurin Sep 30, 2020
8000
0833d3e
fix import
wer-mathurin Sep 30, 2020
f87922b
Add missing methods
wer-mathurin Sep 30, 2020
0dfe4a0
Remove invalid import
wer-mathurin Sep 30, 2020
1228b23
Prevent breaking change for RTCVideoRenderer()
wer-mathurin Sep 30, 2020
8d3efbf
code clean
wer-mathurin Sep 30, 2020
57cc1e9
make sure we use the factory method
wer-mathurin Sep 30, 2020
04dabd2
Fix VideoRenderer casting
wer-mathurin Sep 30, 2020
9a591bf
Add more precide message to depracated
wer-mathurin Sep 30, 2020
5c1cb7b
Keep factory impl in is own class
wer-mathurin Oct 1, 2020
41b4398
Example for exposing class with delegate
wer-mathurin Oct 2, 2020
083230d
remove expose interface when base class is provided
wer-mathurin Oct 2, 2020
bf54588
Merge remote-tracking branch 'origin/master' into feature/api-standar…
wer-mathurin Oct 6, 2020
d6b4efe
Merge change from master to resolve conflict
wer-mathurin Oct 6, 2020
9be563f
API Expose signalingState
wer-mathurin Oct 6, 2020
2785870
Chage to relative path
wer-mathurin Oct 6, 2020
73762e1
Rename Interface
wer-mathurin Oct 6, 2020
c3ca989
Change interface name
wer-mathurin Oct 6, 2020
f5dd179
change interface name
wer-mathurin Oct 6, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion example/lib/src/get_display_media_sample.dart
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ class _GetDisplayMediaSampleState extends State<GetDisplayMediaSample> {
final mediaConstraints = <String, dynamic>{'audio': false, 'video': true};

try {
var stream = await MediaDevices.getDisplayMedia(mediaConstraints);
var stream = await navigator.getDisplayMedia(mediaConstraints);
_localStream = stream;
_localRenderer.srcObject = _localStream;
} catch (e) {
Expand Down
2 changes: 1 addition & 1 deletion example/lib/src/get_user_media_sample.dart
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ class _GetUserMediaSampleState extends State<GetUserMediaSample> {
};

try {
var stream = await MediaDevices.getUserMedia(mediaConstraints);
var stream = await navigator.getUserMedia(mediaConstraints);
_localStream = stream;
_localRenderer.srcObject = _localStream;
} catch (e) {
Expand Down
4 changes: 2 additions & 2 deletions example/lib/src/get_user_media_sample_web.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class _GetUserMediaSampleState extends State<GetUserMediaSample> {
void initState() {
super.initState();
initRenderers();
MediaDevices.getSources().then((md) {
navigator.getSources().then((md) {
setState(() {
cameras = md.where((d) => d['kind'] == 'videoinput').toList();
});
Expand Down Expand Up @@ -62,7 +62,7 @@ class _GetUserMediaSampleState extends State<GetUserMediaSample> {
};

try {
var stream = await MediaDevices.getUserMedia(mediaConstraints);
var stream = await navigator.getUserMedia(mediaConstraints);
_localStream = stream;
_localRenderer.srcObject = _localStream;
} catch (e) {
Expand Down
2 changes: 1 addition & 1 deletion example/lib/src/loopback_sample.dart
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ class _MyAppState extends State<LoopBackSample> {
if (_peerConnection != null) return;

try {
_localStream = await MediaDevices.getUserMedia(mediaConstraints);
_localStream = await navigator.getUserMedia(mediaConstraints);
_localRenderer.srcObject = _localStream;
_peerConnection =
await createPeerConnection(configuration, loopbackConstraints);
Expand Down
40 changes: 16 additions & 24 deletions lib/flutter_webrtc.dart
Original file line number Diff line number Diff line change
@@ -1,27 +1,19 @@
library flutter_webrtc;

export 'src/enums.dart';
export 'src/get_user_media.dart'
if (dart.library.html) 'src/web/get_user_media.dart';
export 'src/media_recorder.dart'
if (dart.library.html) 'src/web/media_recorder.dart';
export 'src/media_stream.dart'
if (dart.library.html) 'src/web/media_stream.dart';
export 'src/media_stream_track.dart'
if (dart.library.html) 'src/web/media_stream_track.dart';
export 'src/rtc_data_channel.dart'
if (dart.library.html) 'src/web/rtc_data_channel.dart';
export 'src/rtc_dtmf_sender.dart'
if (dart.library.html) 'src/web/rtc_dtmf_sender.dart';
export 'src/rtc_ice_candidate.dart'
if (dart.library.html) 'src/web/rtc_ice_candidate.dart';
export 'src/rtc_peerconnection.dart'
if (dart.library.html) 'src/web/rtc_peerconnection.dart';
export 'src/rtc_peerconnection_factory.dart'
export 'src/interface/enums.dart';
export 'src/interface/media_stream.dart';
export 'src/interface/media_stream_track.dart';
export 'src/interface/rtc_data_channel.dart';
export 'src/interface/rtc_dtmf_sender.dart';
export 'src/interface/rtc_ice_candidate.dart';
export 'src/interface/rtc_peerconnection.dart';
export 'src/interface/rtc_session_description.dart';
export 'src/interface/rtc_stats_report.dart';
export 'src/media_devices.dart';
export 'src/media_recorder.dart';
export 'src/native/rtc_peerconnection_factory.dart'
if (dart.library.html) 'src/web/rtc_peerconnection_factory.dart';
export 'src/rtc_session_description.dart'
if (dart.library.html) 'src/web/rtc_session_description.dart';
export 'src/rtc_stats_report.dart';
export 'src/rtc_video_view.dart'
if (dart.library.html) 'src/web/rtc_video_view.dart';
export 'src/utils.dart' if (dart.library.html) 'src/web/utils.dart';
export 'src/native/rtc_video_view_impl.dart'
if (dart.library.html) 'src/web/rtc_video_view_impl.dart';
export 'src/native/utils.dart' if (dart.library.html) 'src/web/utils.dart';
export 'src/rtc_video_renderer.dart';
File renamed without changes.
19 changes: 19 additions & 0 deletions lib/src/interface/factory.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import 'media_recorder.dart';
import 'media_stream.dart';
import 'navigator.dart';
import 'rtc_peerconnection.dart';
import 'rtc_video_renderer.dart';

abstract class RTCFactory {
Future<RTCPeerConnection> createPeerConnection(
Map<String, dynamic> configuration,
[Map<String, dynamic> constraints]);

Future<MediaStream> createLocalMediaStream(String label);

Navigator get navigator;

10000
MediaRecorder mediaRecorder();

VideoRenderer videoRenderer();
}
22 changes: 22 additions & 0 deletions lib/src/interface/media_recorder.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import 'enums.dart';
import 'media_stream.dart';
import 'media_stream_track.dart';

abstract class MediaRecorder {
/// For Android use audioChannel param
/// For iOS use audioTrack
Future<void> start(
String path, {
MediaStreamTrack videoTrack,
RecorderAudioChannel audioChannel,
});

/// Only for Flutter Web
void startWeb(
MediaStream stream, {
Function(dynamic blob, bool isLastOne) onDataChunk,
String mimeType,
});

Future<dynamic> stop();
}
26 changes: 26 additions & 0 deletions lib/src/interface/media_stream.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import 'media_stream_track.dart';

abstract class MediaStream {
MediaStream(this._id, this._ownerTag);
final String _id;
final String _ownerTag;

String get id => _id;

String get ownerTag => _ownerTag;

Future<void> getMediaTracks();

Future<void> addTrack(MediaStreamTrack track, {bool addToNative = true});

Future<void> removeTrack(MediaStreamTrack track,
{bool removeFromNative = true});

List<MediaStreamTrack> getAudioTracks();

List<MediaStreamTrack> getVideoTracks();

Future<void> dispose() async {
return Future.value();
}
}
33 changes: 33 additions & 0 deletions lib/src/interface/media_stream_track.dart
E377
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
abstract class MediaStreamTrack {
MediaStreamTrack();

bool get enabled;
set enabled(bool b);

String get label;

String get kind;

String get id;

///Future contains isFrontCamera
///Throws error if switching camera failed
Future<bool> switchCamera();

Future<void> adaptRes(int width, int height);

void setVolume(double volume);

void setMicrophoneMute(bool mute);

void enableSpeakerphone(bool enable);

Future<dynamic> captureFrame([String filePath]);

Future<bool> hasTorch();
Future<void> setTorch(bool torch);

Future<void> dispose() {
return Future.value();
}
}
7 changes: 7 additions & 0 deletions lib/src/interface/mediadevices.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import 'media_stream.dart';

abstract class MediaDevices {
Future<MediaStream> getUserMedia(Map<String, dynamic> mediaConstraints);
Future<MediaStream> getDisplayMedia(Map<String, dynamic> mediaConstraints);
Future<List<dynamic>> getSources();
}
9 changes: 9 additions & 0 deletions lib/src/interface/navigator.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import 'media_stream.dart';
import 'mediadevices.dart';

abstract class Navigator {
Future<MediaStream> getUserMedia(Map<String, dynamic> mediaConstraints);
Future<MediaStream> getDisplayMedia(Map<String, dynamic> mediaConstraints);
Future<List<dynamic>> getSources();
MediaDevices get mediaDevices;
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
import 'dart:async';
import 'dart:html' as html;
import 'dart:js_util' as jsutil;
import 'dart:typed_data';

import '../enums.dart';
import 'enums.dart';

class RTCDataChannelInit {
bool ordered = true;
Expand All @@ -22,7 +20,7 @@ class RTCDataChannelInit {
if (maxRetransmits > 0) 'maxRetransmits': maxRetransmits,
'protocol': protocol,
'negotiated': negotiated,
if (id != 0) 'id': id
'id': id
};
}
}
Expand Down Expand Up @@ -63,48 +61,18 @@ class RTCDataChannelMessage {
}

typedef RTCDataChannelStateCallback = void Function(RTCDataChannelState state);

typedef RTCDataChannelOnMessageCallback = void Function(
RTCDataChannelMessage data);

class RTCDataChannel {
RTCDataChannel(this._jsDc) {
stateChangeStream = _stateChangeController.stream;
messageStream = _messageController.stream;
_jsDc.onClose.listen((_) {
_state = RTCDataChannelState.RTCDataChannelClosed;
_stateChangeController.add(_state);
if (onDataChannelState != null) {
onDataChannelState(_state);
}
});
_jsDc.onOpen.listen((_) {
_state = RTCDataChannelState.RTCDataChannelOpen;
_stateChangeController.add(_state);
if (onDataChannelState != null) {
onDataChannelState(_state);
}
});
_jsDc.onMessage.listen((event) async {
var msg = await _parse(event.data);
_messageController.add(msg);
if (onMessage != null) {
onMessage(msg);
}
});
}
abstract class RTCDataChannel {
RTCDataChannel();

final html.RtcDataChannel _jsDc;
RTCDataChannelStateCallback onDataChannelState;
RTCDataChannelOnMessageCallback onMessage;
RTCDataChannelState _state = RTCDataChannelState.RTCDataChannelConnecting;

/// Get current state.
RTCDataChannelState get state => _state;

final _stateChangeController =
StreamController<RTCDataChannelState>.broadcast(sync: true);
final _messageController =
StreamController<RTCDataChannelMessage>.broadcast(sync: true);
RTCDataChannelState get state;

/// Stream of state change events. Emits the new state on change.
/// Closes when the [RTCDataChannel] is closed.
Expand All @@ -114,32 +82,12 @@ class RTCDataChannel {
/// Closes when the [RTCDataChannel] is closed.
Stream<RTCDataChannelMessage> messageStream;

Future<RTCDataChannelMessage> _parse(dynamic data) async {
if (data is String) return RTCDataChannelMessage(data);
dynamic arrayBuffer;
if (data is html.Blob) {
// This should never happen actually
arrayBuffer = await jsutil
.promiseToFuture(jsutil.callMethod(data, 'arrayBuffer', []));
} else {
arrayBuffer = data;
}
return RTCDataChannelMessage.fromBinary(arrayBuffer.asUint8List());
}
/// Send a message to this datachannel.
/// To send a text message, use the default constructor to instantiate a text [RTCDataChannelMessage]
/// for the [message] parameter.
/// To send a binary message, pass a binary [RTCDataChannelMessage]
/// constructed with [RTCDataChannelMessage.fromBinary]
Future<void> send(RTCDataChannelMessage message);

Future<void> send(RTCDataChannelMessage message) {
if (!message.isBinary) {
_jsDc.send(message.text);
} else {
// This may just work
_jsDc.sendByteBuffer(message.binary.buffer);
// If not, convert to ArrayBuffer/Blob
}
return Future.value();
}

Future<void> close() {
_jsDc.close();
return Future.value();
}
Future<void> close();
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,4 @@
import 'dart:html' as html;

class RTCDTMFSender {
RTCDTMFSender(this._jsDtmfSender);
final html.RtcDtmfSender _jsDtmfSender;

abstract class RTCDTMFSender {
/// tones:A String containing the DTMF codes to be transmitted to the recipient.
/// Specifying an empty string as the tones parameter clears the tone
/// buffer, aborting any currently queued tones. A "," character inserts
Expand All @@ -15,11 +10,10 @@ class RTCDTMFSender {
/// if you specify a lower value, 30 ms will be used instead);
/// the default is 70 ms.
Future<void> insertDTMF(String tones,
{int duration = 100, int interToneGap = 70}) async {
return _jsDtmfSender.insertDtmf(tones, duration, interToneGap);
}
{int duration = 100, int interToneGap = 70});

/// Compatible with old methods
@Deprecated('Use method insertDTMF instead')
Future<void> sendDtmf(String tones,
{int duration = 100, int interToneGap = 70}) =>
insertDTMF(tones, duration: duration, interToneGap: interToneGap);
Expand Down
Loading
0