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:
@@ -1,54 +0,0 @@
|
||||
import 'package:common/model/device.dart';
|
||||
import 'package:common/src/isolate/child/main.dart';
|
||||
import 'package:common/src/isolate/dto/isolate_task.dart';
|
||||
import 'package:common/src/isolate/dto/isolate_task_result.dart';
|
||||
import 'package:common/src/isolate/dto/send_to_isolate_data.dart';
|
||||
import 'package:common/src/task/discovery/http_target_discovery.dart';
|
||||
import 'package:meta/meta.dart';
|
||||
|
||||
class HttpTargetTask {
|
||||
final String ip;
|
||||
final int port;
|
||||
final bool https;
|
||||
|
||||
HttpTargetTask({
|
||||
required this.ip,
|
||||
required this.port,
|
||||
required this.https,
|
||||
});
|
||||
}
|
||||
|
||||
@internal
|
||||
Future<void> setupHttpTargetDiscoveryIsolate(
|
||||
Stream<SendToIsolateData<IsolateTask<HttpTargetTask>>> receiveFromMain,
|
||||
void Function(IsolateTaskResult<Device>) sendToMain,
|
||||
InitialData initialData,
|
||||
) async {
|
||||
await setupChildIsolateHelper(
|
||||
debugLabel: 'HttpTargetDiscoveryIsolate',
|
||||
receiveFromMain: receiveFromMain,
|
||||
sendToMain: sendToMain,
|
||||
initialData: initialData,
|
||||
handler: (ref, task) async {
|
||||
Object? error;
|
||||
final device = await ref.read(httpTargetDiscoveryProvider).discover(
|
||||
ip: task.data.ip,
|
||||
port: task.data.port,
|
||||
https: task.data.https,
|
||||
onError: (url, e) => error = e,
|
||||
);
|
||||
|
||||
if (error != null || device == null) {
|
||||
return sendToMain(IsolateTaskErrorResult(
|
||||
id: task.id,
|
||||
error: error?.toString() ?? 'Unknown error',
|
||||
));
|
||||
}
|
||||
|
||||
sendToMain(IsolateTaskSuccessResult(
|
||||
id: task.id,
|
||||
data: device,
|
||||
));
|
||||
},
|
||||
);
|
||||
}
|
||||
@@ -2,7 +2,6 @@ import 'dart:async';
|
||||
|
||||
import 'package:common/model/device.dart';
|
||||
import 'package:common/src/isolate/child/http_scan_discovery_isolate.dart';
|
||||
import 'package:common/src/isolate/child/http_target_discovery_isolate.dart';
|
||||
import 'package:common/src/isolate/child/multicast_discovery_isolate.dart';
|
||||
import 'package:common/src/isolate/child/upload_isolate.dart';
|
||||
import 'package:common/src/isolate/dto/isolate_task.dart';
|
||||
@@ -15,56 +14,6 @@ import 'package:refena/refena.dart';
|
||||
|
||||
final _idProvider = IdProvider();
|
||||
|
||||
class IsolateTargetHttpDiscoveryAction extends AsyncReduxActionWithResult<IsolateController, ParentIsolateState, Device> {
|
||||
final String ip;
|
||||
final int port;
|
||||
final bool https;
|
||||
|
||||
IsolateTargetHttpDiscoveryAction({
|
||||
required this.ip,
|
||||
required this.port,
|
||||
required this.https,
|
||||
});
|
||||
|
||||
@override
|
||||
Future<(ParentIsolateState, Device)> reduce() async {
|
||||
final connection = state.httpTargetDiscovery;
|
||||
if (connection == null) {
|
||||
throw StateError('httpTargetDiscovery is not initialized');
|
||||
}
|
||||
|
||||
final task = IsolateTask(
|
||||
id: _idProvider.getNextId(),
|
||||
data: HttpTargetTask(
|
||||
ip: ip,
|
||||
port: port,
|
||||
https: https,
|
||||
),
|
||||
);
|
||||
|
||||
// ignore: unawaited_futures
|
||||
Future.microtask(() {
|
||||
connection.sendToIsolate(SendToIsolateData(
|
||||
syncState: null,
|
||||
data: task,
|
||||
));
|
||||
});
|
||||
|
||||
await for (final result in connection.receiveFromIsolate) {
|
||||
if (result.id == task.id) {
|
||||
switch (result) {
|
||||
case IsolateTaskSuccessResult<Device>():
|
||||
return (state, result.data);
|
||||
case IsolateTaskErrorResult<Device>():
|
||||
throw result.error;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
throw StateError('Unexpected end of stream');
|
||||
}
|
||||
}
|
||||
|
||||
class IsolateInterfaceHttpDiscoveryAction extends ReduxActionWithResult<IsolateController, ParentIsolateState, Stream<Device>> {
|
||||
final String networkInterface;
|
||||
final int port;
|
||||
|
||||
@@ -115,10 +115,6 @@ class _PublishSyncStateAction extends ReduxAction<IsolateController, ParentIsola
|
||||
syncState: syncState,
|
||||
data: null,
|
||||
));
|
||||
state.httpTargetDiscovery?.sendToIsolate(SendToIsolateData(
|
||||
syncState: syncState,
|
||||
data: null,
|
||||
));
|
||||
state.multicastDiscovery?.sendToIsolate(SendToIsolateData(
|
||||
syncState: syncState,
|
||||
data: null,
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import 'package:common/model/device.dart';
|
||||
import 'package:common/src/isolate/child/http_scan_discovery_isolate.dart';
|
||||
import 'package:common/src/isolate/child/http_target_discovery_isolate.dart';
|
||||
import 'package:common/src/isolate/child/main.dart';
|
||||
import 'package:common/src/isolate/child/multicast_discovery_isolate.dart';
|
||||
import 'package:common/src/isolate/child/sync_provider.dart';
|
||||
@@ -24,7 +23,6 @@ const _uploadIsolateCount = 2;
|
||||
class ParentIsolateState with ParentIsolateStateMappable {
|
||||
final SyncState syncState;
|
||||
final IsolateConnector<IsolateTaskStreamResult<Device>, SendToIsolateData<IsolateTask<HttpScanTask>>>? httpScanDiscovery;
|
||||
final IsolateConnector<IsolateTaskResult<Device>, SendToIsolateData<IsolateTask<HttpTargetTask>>>? httpTargetDiscovery;
|
||||
final IsolateConnector<Device, SendToIsolateData<MulticastTask>>? multicastDiscovery;
|
||||
final List<IsolateConnector<IsolateTaskStreamResult<double>, SendToIsolateData<IsolateTask<BaseHttpUploadTask>>>> httpUpload;
|
||||
int get uploadIsolateCount => httpUpload.length;
|
||||
@@ -32,7 +30,6 @@ class ParentIsolateState with ParentIsolateStateMappable {
|
||||
ParentIsolateState({
|
||||
required this.syncState,
|
||||
required this.httpScanDiscovery,
|
||||
required this.httpTargetDiscovery,
|
||||
required this.multicastDiscovery,
|
||||
required this.httpUpload,
|
||||
});
|
||||
@@ -40,14 +37,13 @@ class ParentIsolateState with ParentIsolateStateMappable {
|
||||
static ParentIsolateState initial(SyncState syncState) => ParentIsolateState(
|
||||
syncState: syncState,
|
||||
httpScanDiscovery: null,
|
||||
httpTargetDiscovery: null,
|
||||
multicastDiscovery: null,
|
||||
httpUpload: [],
|
||||
);
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'ParentIsolateState(syncState: $syncState, httpTargetDiscovery: $httpTargetDiscovery)';
|
||||
return 'ParentIsolateState(syncState: $syncState)';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,14 +82,6 @@ class IsolateSetupAction extends AsyncReduxAction<IsolateController, ParentIsola
|
||||
),
|
||||
);
|
||||
|
||||
final httpTargetDiscovery = await startIsolate<IsolateTaskResult<Device>, SendToIsolateData<IsolateTask<HttpTargetTask>>, InitialData>(
|
||||
task: setupHttpTargetDiscoveryIsolate,
|
||||
param: InitialData(
|
||||
syncState: state.syncState,
|
||||
logLevel: Logger.root.level,
|
||||
),
|
||||
);
|
||||
|
||||
final multicastDiscovery = await startIsolate<Device, SendToIsolateData<MulticastTask>, InitialData>(
|
||||
task: setupMulticastDiscoveryIsolate,
|
||||
param: InitialData(
|
||||
@@ -130,7 +118,6 @@ class IsolateSetupAction extends AsyncReduxAction<IsolateController, ParentIsola
|
||||
|
||||
return state.copyWith(
|
||||
httpScanDiscovery: httpScanDiscovery,
|
||||
httpTargetDiscovery: httpTargetDiscovery,
|
||||
multicastDiscovery: multicastDiscovery,
|
||||
httpUpload: await Future.wait(httpUploadIsolates),
|
||||
);
|
||||
@@ -141,7 +128,6 @@ class IsolateDisposeAction extends ReduxAction<IsolateController, ParentIsolateS
|
||||
@override
|
||||
ParentIsolateState reduce() {
|
||||
state.httpScanDiscovery?.isolate.kill();
|
||||
state.httpTargetDiscovery?.isolate.kill();
|
||||
state.multicastDiscovery?.isolate.kill();
|
||||
for (final httpUpload in state.httpUpload) {
|
||||
httpUpload.isolate.kill();
|
||||
|
||||
@@ -28,10 +28,6 @@ class ParentIsolateStateMapper extends ClassMapperBase<ParentIsolateState> {
|
||||
v.httpScanDiscovery;
|
||||
static const Field<ParentIsolateState, IsolateConnector<IsolateTaskStreamResult<Device>, SendToIsolateData<IsolateTask<HttpScanTask>>>>
|
||||
_f$httpScanDiscovery = Field('httpScanDiscovery', _$httpScanDiscovery);
|
||||
static IsolateConnector<IsolateTaskResult<Device>, SendToIsolateData<IsolateTask<HttpTargetTask>>>? _$httpTargetDiscovery(ParentIsolateState v) =>
|
||||
v.httpTargetDiscovery;
|
||||
static const Field<ParentIsolateState, IsolateConnector<IsolateTaskResult<Device>, SendToIsolateData<IsolateTask<HttpTargetTask>>>>
|
||||
_f$httpTargetDiscovery = Field('httpTargetDiscovery', _$httpTargetDiscovery);
|
||||
static IsolateConnector<Device, SendToIsolateData<MulticastTask>>? _$multicastDiscovery(ParentIsolateState v) => v.multicastDiscovery;
|
||||
static const Field<ParentIsolateState, IsolateConnector<Device, SendToIsolateData<MulticastTask>>> _f$multicastDiscovery =
|
||||
Field('multicastDiscovery', _$multicastDiscovery);
|
||||
@@ -45,7 +41,6 @@ class ParentIsolateStateMapper extends ClassMapperBase<ParentIsolateState> {
|
||||
final MappableFields<ParentIsolateState> fields = const {
|
||||
#syncState: _f$syncState,
|
||||
#httpScanDiscovery: _f$httpScanDiscovery,
|
||||
#httpTargetDiscovery: _f$httpTargetDiscovery,
|
||||
#multicastDiscovery: _f$multicastDiscovery,
|
||||
#httpUpload: _f$httpUpload,
|
||||
};
|
||||
@@ -54,7 +49,6 @@ class ParentIsolateStateMapper extends ClassMapperBase<ParentIsolateState> {
|
||||
return ParentIsolateState(
|
||||
syncState: data.dec(_f$syncState),
|
||||
httpScanDiscovery: data.dec(_f$httpScanDiscovery),
|
||||
httpTargetDiscovery: data.dec(_f$httpTargetDiscovery),
|
||||
multicastDiscovery: data.dec(_f$multicastDiscovery),
|
||||
httpUpload: data.dec(_f$httpUpload));
|
||||
}
|
||||
@@ -113,7 +107,6 @@ abstract class ParentIsolateStateCopyWith<$R, $In extends ParentIsolateState, $O
|
||||
$R call(
|
||||
{SyncState? syncState,
|
||||
IsolateConnector<IsolateTaskStreamResult<Device>, SendToIsolateData<IsolateTask<HttpScanTask>>>? httpScanDiscovery,
|
||||
IsolateConnector<IsolateTaskResult<Device>, SendToIsolateData<IsolateTask<HttpTargetTask>>>? httpTargetDiscovery,
|
||||
IsolateConnector<Device, SendToIsolateData<MulticastTask>>? multicastDiscovery,
|
||||
List<IsolateConnector<IsolateTaskStreamResult<double>, SendToIsolateData<IsolateTask<BaseHttpUploadTask>>>>? httpUpload});
|
||||
ParentIsolateStateCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t);
|
||||
@@ -138,13 +131,11 @@ class _ParentIsolateStateCopyWithImpl<$R, $Out> extends ClassCopyWithBase<$R, Pa
|
||||
$R call(
|
||||
{SyncState? syncState,
|
||||
Object? httpScanDiscovery = $none,
|
||||
Object? httpTargetDiscovery = $none,
|
||||
Object? multicastDiscovery = $none,
|
||||
List<IsolateConnector<IsolateTaskStreamResult<double>, SendToIsolateData<IsolateTask<BaseHttpUploadTask>>>>? httpUpload}) =>
|
||||
$apply(FieldCopyWithData({
|
||||
if (syncState != null) #syncState: syncState,
|
||||
if (httpScanDiscovery != $none) #httpScanDiscovery: httpScanDiscovery,
|
||||
if (httpTargetDiscovery != $none) #httpTargetDiscovery: httpTargetDiscovery,
|
||||
if (multicastDiscovery != $none) #multicastDiscovery: multicastDiscovery,
|
||||
if (httpUpload != null) #httpUpload: httpUpload
|
||||
}));
|
||||
@@ -152,7 +143,6 @@ class _ParentIsolateStateCopyWithImpl<$R, $Out> extends ClassCopyWithBase<$R, Pa
|
||||
ParentIsolateState $make(CopyWithData data) => ParentIsolateState(
|
||||
syncState: data.get(#syncState, or: $value.syncState),
|
||||
httpScanDiscovery: data.get(#httpScanDiscovery, or: $value.httpScanDiscovery),
|
||||
httpTargetDiscovery: data.get(#httpTargetDiscovery, or: $value.httpTargetDiscovery),
|
||||
multicastDiscovery: data.get(#multicastDiscovery, or: $value.multicastDiscovery),
|
||||
httpUpload: data.get(#httpUpload, or: $value.httpUpload));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user