mirror of
https://github.com/localsend/localsend.git
synced 2026-06-23 04:10:07 +00:00
feat: move target discovery out of external isolate
This commit is contained in:
@@ -20,6 +20,19 @@ extension DeviceExt on Device {
|
||||
true => rust_model.ProtocolType.https,
|
||||
};
|
||||
}
|
||||
|
||||
rust_model.RegisterDto toRegisterDto() {
|
||||
return rust_model.RegisterDto(
|
||||
alias: alias,
|
||||
version: version,
|
||||
deviceModel: deviceModel,
|
||||
deviceType: deviceType.toRust(),
|
||||
token: fingerprint,
|
||||
port: port,
|
||||
protocol: getProtocolType(),
|
||||
hasWebInterface: download,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
extension DeviceTypeExt on DeviceType {
|
||||
@@ -52,3 +65,33 @@ extension FileDtoExt on FileDto {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
extension RustDeviceTypeExt on rust_model.DeviceType {
|
||||
DeviceType toDart() {
|
||||
return switch (this) {
|
||||
rust_model.DeviceType.mobile => DeviceType.mobile,
|
||||
rust_model.DeviceType.desktop => DeviceType.desktop,
|
||||
rust_model.DeviceType.web => DeviceType.web,
|
||||
rust_model.DeviceType.headless => DeviceType.headless,
|
||||
rust_model.DeviceType.server => DeviceType.server,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
extension RegisterResponseDtoExt on rust_model.RegisterResponseDto {
|
||||
Device toDevice(String ip, int port, bool https, DiscoveryMethod method) {
|
||||
return Device(
|
||||
signalingId: null,
|
||||
ip: ip,
|
||||
version: version,
|
||||
port: port,
|
||||
https: https,
|
||||
fingerprint: token,
|
||||
alias: alias,
|
||||
deviceModel: deviceModel,
|
||||
deviceType: deviceType?.toDart() ?? DeviceType.desktop,
|
||||
download: hasWebInterface,
|
||||
discoveryMethods: {method},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +1,18 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:common/isolate.dart';
|
||||
import 'package:common/model/device.dart';
|
||||
import 'package:flutter/gestures.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:localsend_app/config/theme.dart';
|
||||
import 'package:localsend_app/gen/strings.g.dart';
|
||||
import 'package:localsend_app/provider/device_info_provider.dart';
|
||||
import 'package:localsend_app/provider/http_provider.dart';
|
||||
import 'package:localsend_app/provider/last_devices.provider.dart';
|
||||
import 'package:localsend_app/provider/local_ip_provider.dart';
|
||||
import 'package:localsend_app/provider/settings_provider.dart';
|
||||
import 'package:localsend_app/rust/api/model.dart';
|
||||
import 'package:localsend_app/util/rust.dart';
|
||||
import 'package:localsend_app/widget/dialogs/error_dialog.dart';
|
||||
import 'package:refena_flutter/refena_flutter.dart';
|
||||
import 'package:routerino/routerino.dart';
|
||||
@@ -63,22 +66,24 @@ class _AddressInputDialogState extends State<AddressInputDialog> with Refena {
|
||||
Device? foundDevice;
|
||||
String? error;
|
||||
|
||||
final List<Future<Device>> futures = [
|
||||
final payload = ref.read(deviceFullInfoProvider).toRegisterDto();
|
||||
|
||||
final List<Future<void>> futures = [
|
||||
for (final ip in candidates)
|
||||
() async {
|
||||
try {
|
||||
final device = await ref
|
||||
.redux(parentIsolateProvider)
|
||||
.dispatchAsyncTakeResult(
|
||||
IsolateTargetHttpDiscoveryAction(
|
||||
ip: ip,
|
||||
port: port,
|
||||
https: https,
|
||||
),
|
||||
final response = await ref
|
||||
.read(httpProvider)
|
||||
.v2
|
||||
.register(
|
||||
protocol: https ? ProtocolType.https : ProtocolType.http,
|
||||
ip: ip,
|
||||
port: port,
|
||||
payload: payload,
|
||||
);
|
||||
foundDevice = device;
|
||||
|
||||
foundDevice = response.body.toDevice(ip, port, https, HttpDiscovery(ip: ip));
|
||||
deviceCompleter.complete();
|
||||
return device;
|
||||
} catch (e) {
|
||||
error = e.toString();
|
||||
rethrow;
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
import 'package:common/isolate.dart';
|
||||
import 'package:common/model/device.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:localsend_app/config/theme.dart';
|
||||
import 'package:localsend_app/gen/strings.g.dart';
|
||||
import 'package:localsend_app/model/persistence/favorite_device.dart';
|
||||
import 'package:localsend_app/provider/device_info_provider.dart';
|
||||
import 'package:localsend_app/provider/favorites_provider.dart';
|
||||
import 'package:localsend_app/provider/http_provider.dart';
|
||||
import 'package:localsend_app/provider/settings_provider.dart';
|
||||
import 'package:localsend_app/rust/api/model.dart';
|
||||
import 'package:localsend_app/util/rust.dart';
|
||||
import 'package:localsend_app/widget/dialogs/error_dialog.dart';
|
||||
import 'package:localsend_app/widget/dialogs/favorite_edit_dialog.dart';
|
||||
import 'package:refena_flutter/refena_flutter.dart';
|
||||
@@ -31,18 +35,21 @@ class _FavoritesDialogState extends State<FavoritesDialog> with Refena {
|
||||
final https = ref.read(settingsProvider).https;
|
||||
|
||||
try {
|
||||
final result = await ref
|
||||
.redux(parentIsolateProvider)
|
||||
.dispatchAsyncTakeResult(
|
||||
IsolateTargetHttpDiscoveryAction(
|
||||
ip: favorite.ip,
|
||||
port: favorite.port,
|
||||
https: https,
|
||||
),
|
||||
);
|
||||
final payload = ref.read(deviceFullInfoProvider).toRegisterDto();
|
||||
final response = await ref
|
||||
.read(httpProvider)
|
||||
.v2
|
||||
.register(
|
||||
protocol: https ? ProtocolType.https : ProtocolType.http,
|
||||
ip: favorite.ip,
|
||||
port: favorite.port,
|
||||
payload: payload,
|
||||
);
|
||||
|
||||
final device = response.body.toDevice(favorite.ip, favorite.port, https, HttpDiscovery(ip: favorite.ip));
|
||||
|
||||
if (mounted) {
|
||||
context.pop(result);
|
||||
context.pop(device);
|
||||
}
|
||||
} catch (e) {
|
||||
setState(() {
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
import 'package:common/isolate.dart';
|
||||
import 'package:common/model/device.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:localsend_app/config/theme.dart';
|
||||
import 'package:localsend_app/gen/strings.g.dart';
|
||||
import 'package:localsend_app/model/persistence/favorite_device.dart';
|
||||
import 'package:localsend_app/provider/device_info_provider.dart';
|
||||
import 'package:localsend_app/provider/favorites_provider.dart';
|
||||
import 'package:localsend_app/provider/http_provider.dart';
|
||||
import 'package:localsend_app/provider/settings_provider.dart';
|
||||
import 'package:localsend_app/rust/api/model.dart';
|
||||
import 'package:localsend_app/util/rust.dart';
|
||||
import 'package:localsend_app/widget/dialogs/error_dialog.dart';
|
||||
import 'package:localsend_app/widget/dialogs/favorite_delete_dialog.dart';
|
||||
import 'package:refena_flutter/refena_flutter.dart';
|
||||
@@ -185,15 +188,16 @@ class _FavoriteEditDialogState extends State<FavoriteEditDialog> with Refena {
|
||||
});
|
||||
|
||||
try {
|
||||
final result = await ref
|
||||
.redux(parentIsolateProvider)
|
||||
.dispatchAsyncTakeResult(
|
||||
IsolateTargetHttpDiscoveryAction(
|
||||
ip: ip,
|
||||
port: port,
|
||||
https: https,
|
||||
),
|
||||
);
|
||||
final payload = ref.read(deviceFullInfoProvider).toRegisterDto();
|
||||
final response = await ref
|
||||
.read(httpProvider)
|
||||
.v2
|
||||
.register(
|
||||
protocol: https ? ProtocolType.https : ProtocolType.http,
|
||||
ip: ip,
|
||||
port: port,
|
||||
payload: payload,
|
||||
);
|
||||
|
||||
final name = _aliasController.text.trim();
|
||||
|
||||
@@ -202,10 +206,10 @@ class _FavoriteEditDialogState extends State<FavoriteEditDialog> with Refena {
|
||||
.dispatchAsync(
|
||||
AddFavoriteAction(
|
||||
FavoriteDevice.fromValues(
|
||||
fingerprint: result.fingerprint,
|
||||
fingerprint: response.body.token,
|
||||
ip: _ipController.text,
|
||||
port: int.parse(_portController.text),
|
||||
alias: name.isEmpty ? result.alias : name,
|
||||
alias: name.isEmpty ? response.body.alias : name,
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -54,7 +54,7 @@ PODS:
|
||||
- FlutterMacOS
|
||||
- wakelock_plus (0.0.1):
|
||||
- FlutterMacOS
|
||||
- window_manager (0.2.0):
|
||||
- window_manager (0.5.0):
|
||||
- FlutterMacOS
|
||||
|
||||
DEPENDENCIES:
|
||||
@@ -147,9 +147,9 @@ SPEC CHECKSUMS:
|
||||
Defaults: d785e56c0fb8890dc40351603f05c8e1df1bdd45
|
||||
desktop_drop: e0b672a7d84c0a6cbc378595e82cdb15f2970a43
|
||||
device_info_plus: 4fb280989f669696856f8b129e4a5e3cd6c48f76
|
||||
dynamic_color: b820c000cc68df65e7ba7ff177cb98404ce56651
|
||||
dynamic_color: cb7c2a300ee67ed3bd96c3e852df3af0300bf610
|
||||
file_selector_macos: 6280b52b459ae6c590af5d78fc35c7267a3c4b31
|
||||
FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
|
||||
FlutterMacOS: d0db08ddef1a9af05a5ec4b724367152bb0500b1
|
||||
gal: 44e5b10dbd347c8247a2851acee6c1fbe282c1d3
|
||||
in_app_purchase_storekit: e126ef1b89e4a9fdf07e28f005f82632b4609437
|
||||
network_info_plus: 21d1cd6a015ccb2fdff06a1fbfa88d54b4e92f61
|
||||
@@ -159,15 +159,15 @@ SPEC CHECKSUMS:
|
||||
path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
|
||||
photo_manager: d2fbcc0f2d82458700ee6256a15018210a81d413
|
||||
rhttp: 08d791d6373089de796318f4cfb172cbcf34e78b
|
||||
rust_lib_localsend_app: 6b270a4b507b1599a1d06c9ebf86d01adfa0e875
|
||||
rust_lib_localsend_app: 293779a82668308386129c9669c081d201d3e278
|
||||
screen_retriever_macos: 452e51764a9e1cdb74b3c541238795849f21557f
|
||||
shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7
|
||||
tray_manager: a104b5c81b578d83f3c3d0f40a997c8b10810166
|
||||
uri_content: a2350e4567f5fba3f48bb0f144f277eaddf0aa2c
|
||||
uri_content: 6c7c098bcc83078659b4d274f42db92691eb9123
|
||||
url_launcher_macos: 0fba8ddabfc33ce0a9afe7c5fef5aab3d8d2d673
|
||||
video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b
|
||||
wakelock_plus: 21ddc249ac4b8d018838dbdabd65c5976c308497
|
||||
window_manager: 1d01fa7ac65a6e6f83b965471b1a7fdd3f06166c
|
||||
window_manager: b729e31d38fb04905235df9ea896128991cad99e
|
||||
|
||||
PODFILE CHECKSUM: 5c6550f5101fcba381ddb97e2135e4cacca4f31f
|
||||
|
||||
|
||||
Reference in New Issue
Block a user