refactor: improve type safety for isolates

This commit is contained in:
Tien Do Nam
2024-10-28 01:27:33 +01:00
parent 447d77e285
commit a87928b2e2
7 changed files with 25 additions and 9 deletions
+5 -1
View File
@@ -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 {
+4 -1
View File
@@ -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);
}
+1
View File
@@ -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
View File
@@ -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