return connection error message, removed mediastream during publishing

This commit is contained in:
David Zhao
2021-08-05 23:20:20 -07:00
parent 101849d0bb
commit 908c830b86
6 changed files with 79 additions and 30 deletions
+21
View File
@@ -102,6 +102,20 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.6.5" version: "0.6.5"
http:
dependency: transitive
description:
name: http
url: "https://pub.dartlang.org"
source: hosted
version: "0.13.3"
http_parser:
dependency: transitive
description:
name: http_parser
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.0"
livekit_client: livekit_client:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -179,6 +193,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.1" version: "2.0.1"
pedantic:
dependency: transitive
description:
name: pedantic
url: "https://pub.dartlang.org"
source: hosted
version: "1.11.1"
platform: platform:
dependency: transitive dependency: transitive
description: description:
+1 -15
View File
@@ -13,7 +13,6 @@ import 'participant.dart';
class LocalParticipant extends Participant { class LocalParticipant extends Participant {
RTCEngine _engine; RTCEngine _engine;
MediaStream? _mediaStream;
LocalParticipant({ LocalParticipant({
required RTCEngine engine, required RTCEngine engine,
@@ -25,15 +24,6 @@ class LocalParticipant extends Participant {
RTCEngine get engine => _engine; RTCEngine get engine => _engine;
Future<MediaStream> getMediaStream() async {
var stream = _mediaStream;
if (stream == null) {
stream = await createLocalMediaStream(sid);
_mediaStream = stream;
}
return stream;
}
/// publish an audio track to the room /// publish an audio track to the room
Future<TrackPublication> publishAudioTrack(LocalAudioTrack track) async { Future<TrackPublication> publishAudioTrack(LocalAudioTrack track) async {
if (audioTracks.values.any( if (audioTracks.values.any(
@@ -44,10 +34,8 @@ class LocalParticipant extends Participant {
try { try {
var trackInfo = await _engine.addTrack( var trackInfo = await _engine.addTrack(
cid: track.getCid(), name: track.name, kind: track.kind); cid: track.getCid(), name: track.name, kind: track.kind);
var stream = await getMediaStream();
var transceiverInit = new RTCRtpTransceiverInit( var transceiverInit = new RTCRtpTransceiverInit(
direction: TransceiverDirection.SendOnly, direction: TransceiverDirection.SendOnly,
streams: [stream],
); );
track.transceiver = await _engine.publisher?.pc.addTransceiver( track.transceiver = await _engine.publisher?.pc.addTransceiver(
track: track.mediaTrack, track: track.mediaTrack,
@@ -67,7 +55,7 @@ class LocalParticipant extends Participant {
/// publish a video track to the room /// publish a video track to the room
Future<TrackPublication> publishVideoTrack(LocalVideoTrack track) async { Future<TrackPublication> publishVideoTrack(LocalVideoTrack track) async {
if (audioTracks.values.any( if (videoTracks.values.any(
(element) => element.track?.mediaTrack.id == track.mediaTrack.id)) { (element) => element.track?.mediaTrack.id == track.mediaTrack.id)) {
return Future.error(TrackPublishError('track already exists')); return Future.error(TrackPublishError('track already exists'));
} }
@@ -75,10 +63,8 @@ class LocalParticipant extends Participant {
try { try {
var trackInfo = await _engine.addTrack( var trackInfo = await _engine.addTrack(
cid: track.getCid(), name: track.name, kind: track.kind); cid: track.getCid(), name: track.name, kind: track.kind);
var stream = await getMediaStream();
var transceiverInit = new RTCRtpTransceiverInit( var transceiverInit = new RTCRtpTransceiverInit(
direction: TransceiverDirection.SendOnly, direction: TransceiverDirection.SendOnly,
streams: [stream],
); );
// TODO: video encodings and simulcast // TODO: video encodings and simulcast
track.transceiver = await _engine.publisher?.pc.addTransceiver( track.transceiver = await _engine.publisher?.pc.addTransceiver(
+6 -2
View File
@@ -64,14 +64,18 @@ class RTCEngine with SignalClientDelegate {
this.client.delegate = this; this.client.delegate = this;
} }
Future<JoinResponse> join(String url, String token, JoinOptions? opts) { Future<JoinResponse> join(String url, String token, JoinOptions? opts) async {
this.url = url; this.url = url;
this.token = token; this.token = token;
var completer = new Completer<JoinResponse>(); var completer = new Completer<JoinResponse>();
joinCompleter = completer; joinCompleter = completer;
client.join(url, token, opts); try {
await client.join(url, token, opts);
} catch (e) {
return Future.error(e);
}
// if it's not complete after 5 seconds, fail // if it's not complete after 5 seconds, fail
new Timer(connectionTimeout, () { new Timer(connectionTimeout, () {
+29 -13
View File
@@ -1,12 +1,17 @@
import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:developer'; import 'dart:developer';
import 'package:flutter_webrtc/flutter_webrtc.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart';
import 'package:livekit_client/livekit_client.dart';
import 'package:web_socket_channel/web_socket_channel.dart'; import 'package:web_socket_channel/web_socket_channel.dart';
import './track/track.dart'; import 'package:http/http.dart' as http;
import './version.dart';
import './proto/livekit_models.pb.dart'; import 'logger.dart';
import './proto/livekit_rtc.pb.dart'; import 'track/track.dart';
import 'version.dart';
import 'proto/livekit_models.pb.dart';
import 'proto/livekit_rtc.pb.dart';
import '_websocket_api.dart' import '_websocket_api.dart'
if (dart.library.io) '_websocket_io.dart' if (dart.library.io) '_websocket_io.dart'
if (dart.library.html) '_websocket_html.dart' as platform; if (dart.library.html) '_websocket_html.dart' as platform;
@@ -48,22 +53,33 @@ class SignalClient {
bool get connected => this._connected; bool get connected => this._connected;
join(String url, String token, JoinOptions? options) { Future<void> join(String url, String token, JoinOptions? options) async {
url += '/rtc'; var rtcUrl = '$url/rtc';
var params = _paramsForToken(token); var params = _paramsForToken(token);
if (options != null && options.autoSubscribe != null) { if (options != null && options.autoSubscribe != null) {
params += '&auto_subscribe=${options.autoSubscribe! ? '1' : '0'}'; params += '&auto_subscribe=${options.autoSubscribe! ? '1' : '0'}';
} }
var uri = Uri.parse(url + params);
platform.connectToWebSocket(uri).then((ws) { try {
var ws = await platform.connectToWebSocket(Uri.parse(rtcUrl + params));
ws.stream ws.stream
.listen(_handleMessage, onError: _handleError, onDone: _handleDone); .listen(_handleMessage, onError: _handleError, onDone: _handleDone);
_ws = ws; _ws = ws;
}).catchError((error) { } catch (e) {
// TODO: ping api endpoint var completer = Completer();
_handleError(error); var validateUri = Uri.parse('http${rtcUrl.substring(2)}/validate$params');
}); http.get(validateUri).then((response) {
if (response.statusCode != 200) {
completer.completeError(ConnectError(response.body));
} else {
completer.completeError(ConnectError());
}
}).catchError((e) {
completer.completeError(ConnectError());
});
return completer.future;
}
} }
Future<void> reconnect(String url, String token) async { Future<void> reconnect(String url, String token) async {
@@ -210,7 +226,7 @@ class SignalClient {
} }
_handleError(Object error) { _handleError(Object error) {
// TODO: test HTTP endpoint logger.warning('received websocket error $error');
} }
_handleDone() { _handleDone() {
+21
View File
@@ -95,6 +95,20 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.6.5" version: "0.6.5"
http:
dependency: "direct main"
description:
name: http
url: "https://pub.dartlang.org"
source: hosted
version: "0.13.3"
http_parser:
dependency: transitive
description:
name: http_parser
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.0"
logging: logging:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -158,6 +172,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.1" version: "2.0.1"
pedantic:
dependency: transitive
description:
name: pedantic
url: "https://pub.dartlang.org"
source: hosted
version: "1.11.1"
platform: platform:
dependency: transitive dependency: transitive
description: description:
+1
View File
@@ -13,6 +13,7 @@ dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
flutter_webrtc: ^0.6.4 flutter_webrtc: ^0.6.4
http: ^0.13.3
logging: ^1.0.1 logging: ^1.0.1
protobuf: ^2.0.0 protobuf: ^2.0.0
tuple: ^2.0.0 tuple: ^2.0.0