Skip to content

Commit

Permalink
update.
Browse files Browse the repository at this point in the history
  • Loading branch information
cloudwebrtc committed Aug 15, 2024
1 parent 90092c0 commit faf5c68
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 7 deletions.
52 changes: 51 additions & 1 deletion lib/src/core/room.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import 'dart:async';
import 'package:flutter/foundation.dart';

import 'package:collection/collection.dart';
import 'package:http/http.dart' as http;
import 'package:meta/meta.dart';

import '../core/signal_client.dart';
Expand All @@ -38,6 +39,7 @@ import '../proto/livekit_models.pb.dart' as lk_models;
import '../proto/livekit_rtc.pb.dart' as lk_rtc;
import '../support/disposable.dart';
import '../support/platform.dart';
import '../support/region_url_provider.dart';
import '../track/local/audio.dart';
import '../track/local/video.dart';
import '../track/track.dart';
Expand Down Expand Up @@ -110,6 +112,9 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
//
late EventsListener<SignalEvent> _signalListener;

RegionUrlProvider? _regionUrlProvider;
String? _regionUrl;

Room({
@Deprecated('deprecated, please use connectOptions in room.connect()')
ConnectOptions connectOptions = const ConnectOptions(),
Expand Down Expand Up @@ -148,6 +153,31 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
});
}

void prepareConnection(String url, String? token) async {
if (engine.connectionState != ConnectionState.disconnected) {
return;
}
logger.info('prepareConnection to $url');
try {
if (isCloudUrl(Uri.parse(url)) && token != null) {
_regionUrlProvider = RegionUrlProvider(token: token, url: url);
final regionUrl = await _regionUrlProvider!.getNextBestRegionUrl();
// we will not replace the regionUrl if an attempt had already started
// to avoid overriding regionUrl after a new connection attempt had started
if (regionUrl != null &&
connectionState == ConnectionState.disconnected) {
_regionUrl = regionUrl;
await http.head(Uri.parse(toHttpUrl(regionUrl)));
logger.fine('prepared connection to ${regionUrl}');
}
} else {
await http.head(Uri.parse(toHttpUrl(url)));
}
} catch (e) {
logger.warning('could not prepare connection');
}
}

Future<void> connect(
String url,
String token, {
Expand All @@ -174,8 +204,28 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
);
}

if (_regionUrlProvider?.getServerUrl().toString() != url) {
_regionUrl = null;
_regionUrlProvider = null;
}
if (isCloudUrl(Uri.parse(url))) {
if (_regionUrlProvider == null) {
_regionUrlProvider = RegionUrlProvider(url: url, token: token);
} else {
_regionUrlProvider?.updateToken(token);
}
// trigger the first fetch without waiting for a response
// if initial connection fails, this will speed up picking regional url
// on subsequent runs
try {
await _regionUrlProvider?.fetchRegionSettings();
} catch (e) {
logger.warning('could not fetch region settings $e');
}
}

await engine.connect(
url,
_regionUrl ?? url,
token,
connectOptions: connectOptions,
roomOptions: roomOptions,
Expand Down
28 changes: 22 additions & 6 deletions lib/src/support/region_url_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,7 @@ class RegionUrlProvider {
this.token = token;
}

bool isCloud() {
return serverUrl.host.endsWith('.livekit.cloud') ||
serverUrl.host.endsWith('.livekit.run');
}
bool isCloud() => isCloudUrl(serverUrl);

Uri getServerUrl() {
return serverUrl;
Expand Down Expand Up @@ -64,8 +61,8 @@ class RegionUrlProvider {

/* @internal */
Future<lk_models.RegionSettings> fetchRegionSettings() async {
http.Response regionSettingsResponse =
await http.get(Uri.parse(getCloudConfigUrl(serverUrl)), headers: {
http.Response regionSettingsResponse = await http
.get(Uri.parse('${getCloudConfigUrl(serverUrl)}/regions'), headers: {
'authorization': 'Bearer $token',
});
if (regionSettingsResponse.statusCode == 200) {
Expand Down Expand Up @@ -106,3 +103,22 @@ extension RegionSettingsExtension on lk_models.RegionSettings {
.toList(),
);
}

bool isCloudUrl(Uri url) {
return url.host.contains('.livekit.cloud') ||
url.host.contains('.livekit.run');
}

String toHttpUrl(String url) {
if (url.startsWith('ws')) {
return url.replaceAll('ws', 'http');
}
return url;
}

String toWebsocketUrl(String url) {
if (url.startsWith('http')) {
return url.replaceAll('http', 'ws');
}
return url;
}

0 comments on commit faf5c68

Please sign in to comment.