mirror of
https://github.com/localsend/localsend.git
synced 2026-06-23 04:10:07 +00:00
refactor: improve type safety for isolates
This commit is contained in:
@@ -22,7 +22,11 @@ class InitialData {
|
||||
});
|
||||
}
|
||||
|
||||
/// A helper to setup the child isolate.
|
||||
/// A helper to setup the child isolate,
|
||||
/// constructing an endless running task that listens to [receiveFromMain]
|
||||
/// and calls [handler] for each message (usually calling [sendToMain] in the [handler]).
|
||||
///
|
||||
/// An optional [init] function can be provided to run before the endless loop.
|
||||
@internal
|
||||
Future<void> setupChildIsolateHelper<S, R>({
|
||||
required String debugLabel,
|
||||
|
||||
@@ -4,9 +4,17 @@ import 'package:common/src/isolate/child/main.dart';
|
||||
import 'package:common/src/isolate/dto/send_to_isolate_data.dart';
|
||||
import 'package:meta/meta.dart';
|
||||
|
||||
/// Sends an announcement to all devices to all network interfaces.
|
||||
/// They will respond with their device information.
|
||||
class MulticastAnnouncementTask {
|
||||
static const instance = MulticastAnnouncementTask._();
|
||||
|
||||
const MulticastAnnouncementTask._();
|
||||
}
|
||||
|
||||
@internal
|
||||
Future<void> setupMulticastDiscoveryIsolate(
|
||||
Stream<SendToIsolateData<void>> receiveFromMain,
|
||||
Stream<SendToIsolateData<MulticastAnnouncementTask>> receiveFromMain,
|
||||
void Function(Device) sendToMain,
|
||||
InitialData initialData,
|
||||
) async {
|
||||
|
||||
@@ -3,6 +3,7 @@ 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/dto/isolate_task.dart';
|
||||
import 'package:common/src/isolate/dto/isolate_task_stream_result.dart';
|
||||
import 'package:common/src/isolate/dto/send_to_isolate_data.dart';
|
||||
@@ -141,13 +142,15 @@ class IsolateSendMulticastAnnouncementAction extends ReduxAction<IsolateControll
|
||||
|
||||
connection.sendToIsolate(SendToIsolateData(
|
||||
syncState: null,
|
||||
data: const Object(),
|
||||
data: MulticastAnnouncementTask.instance,
|
||||
));
|
||||
|
||||
return state;
|
||||
}
|
||||
}
|
||||
|
||||
/// Sends the task to the isolate
|
||||
/// and transforms [IsolateTaskStreamResult] into a proper stream making it easier to work with.
|
||||
Stream<R> _sendTaskAndListenStream<R, T>({
|
||||
required IsolateTask<T> task,
|
||||
required IsolateConnector<IsolateTaskStreamResult<R>, SendToIsolateData<IsolateTask<T>>> connection,
|
||||
|
||||
@@ -23,7 +23,7 @@ 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<Object>>? multicastDiscovery;
|
||||
final IsolateConnector<Device, SendToIsolateData<MulticastAnnouncementTask>>? multicastDiscovery;
|
||||
|
||||
ParentIsolateState({
|
||||
required this.syncState,
|
||||
@@ -81,7 +81,7 @@ class IsolateSetupAction extends AsyncReduxAction<IsolateController, ParentIsola
|
||||
),
|
||||
);
|
||||
|
||||
final multicastDiscovery = await startIsolate<Device, SendToIsolateData<Object>, InitialData>(
|
||||
final multicastDiscovery = await startIsolate<Device, SendToIsolateData<MulticastAnnouncementTask>, InitialData>(
|
||||
task: setupMulticastDiscoveryIsolate,
|
||||
param: InitialData(
|
||||
syncState: state.syncState,
|
||||
|
||||
@@ -32,8 +32,8 @@ class ParentIsolateStateMapper extends ClassMapperBase<ParentIsolateState> {
|
||||
v.httpTargetDiscovery;
|
||||
static const Field<ParentIsolateState, IsolateConnector<IsolateTaskResult<Device?>, SendToIsolateData<IsolateTask<HttpTargetTask>>>>
|
||||
_f$httpTargetDiscovery = Field('httpTargetDiscovery', _$httpTargetDiscovery);
|
||||
static IsolateConnector<Device, SendToIsolateData<Object>>? _$multicastDiscovery(ParentIsolateState v) => v.multicastDiscovery;
|
||||
static const Field<ParentIsolateState, IsolateConnector<Device, SendToIsolateData<Object>>> _f$multicastDiscovery =
|
||||
static IsolateConnector<Device, SendToIsolateData<MulticastAnnouncementTask>>? _$multicastDiscovery(ParentIsolateState v) => v.multicastDiscovery;
|
||||
static const Field<ParentIsolateState, IsolateConnector<Device, SendToIsolateData<MulticastAnnouncementTask>>> _f$multicastDiscovery =
|
||||
Field('multicastDiscovery', _$multicastDiscovery);
|
||||
|
||||
@override
|
||||
@@ -102,7 +102,7 @@ abstract class ParentIsolateStateCopyWith<$R, $In extends ParentIsolateState, $O
|
||||
{SyncState? syncState,
|
||||
IsolateConnector<IsolateTaskStreamResult<Device>, SendToIsolateData<IsolateTask<HttpScanTask>>>? httpScanDiscovery,
|
||||
IsolateConnector<IsolateTaskResult<Device?>, SendToIsolateData<IsolateTask<HttpTargetTask>>>? httpTargetDiscovery,
|
||||
IsolateConnector<Device, SendToIsolateData<Object>>? multicastDiscovery});
|
||||
IsolateConnector<Device, SendToIsolateData<MulticastAnnouncementTask>>? multicastDiscovery});
|
||||
ParentIsolateStateCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t);
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ class IdProvider {
|
||||
int _id = 0;
|
||||
|
||||
/// Returns the next id.
|
||||
/// This is an atomic operation because Dart's event loop is single-threaded.
|
||||
int getNextId() => _id++;
|
||||
|
||||
/// Resets the id to 0.
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ version: 1.0.0
|
||||
publish_to: "none"
|
||||
|
||||
environment:
|
||||
sdk: ^3.1.1
|
||||
sdk: ^3.5.0
|
||||
|
||||
dependencies:
|
||||
collection: ^1.17.2 # allow newer versions, so it can compile with newer Flutter versions
|
||||
|
||||
Reference in New Issue
Block a user