|
1 | 1 | import 'dart:async';
|
2 | 2 | import 'dart:isolate';
|
3 | 3 |
|
| 4 | +import 'package:logging/logging.dart'; |
| 5 | +import 'package:meta/meta.dart'; |
4 | 6 | import 'package:sane/src/exceptions.dart';
|
| 7 | +import 'package:sane/src/extensions.dart'; |
5 | 8 | import 'package:sane/src/isolate_messages/exception.dart';
|
6 | 9 | import 'package:sane/src/isolate_messages/interface.dart';
|
7 | 10 | import 'package:sane/src/sane.dart';
|
8 | 11 |
|
| 12 | +final _logger = Logger('sane.isolate'); |
| 13 | + |
| 14 | +@internal |
9 | 15 | class SaneIsolate {
|
10 | 16 | SaneIsolate._(
|
11 | 17 | this._isolate,
|
@@ -36,14 +42,28 @@ class SaneIsolate {
|
36 | 42 | onExit: exitReceivePort.sendPort,
|
37 | 43 | );
|
38 | 44 |
|
39 |
| - final sendPort = await receivePort.first as SendPort; |
| 45 | + final sendPortCompleter = Completer<SendPort>(); |
| 46 | + receivePort.listen((message) { |
| 47 | + switch (message) { |
| 48 | + case SendPort(): |
| 49 | + sendPortCompleter.complete(message); |
| 50 | + case LogRecord(): |
| 51 | + _logger.redirect(message); |
| 52 | + } |
| 53 | + }); |
| 54 | + |
| 55 | + final sendPort = await sendPortCompleter.future; |
40 | 56 | return SaneIsolate._(isolate, sendPort, exitReceivePort);
|
41 | 57 | }
|
42 | 58 |
|
43 |
| - void kill() { |
| 59 | + void killImmediately() { |
44 | 60 | _isolate.kill(priority: Isolate.immediate);
|
45 | 61 | }
|
46 | 62 |
|
| 63 | + void kill() { |
| 64 | + _isolate.kill(priority: Isolate.beforeNextEvent); |
| 65 | + } |
| 66 | + |
47 | 67 | Future<T> sendMessage<T extends IsolateResponse>(
|
48 | 68 | IsolateMessage<T> message,
|
49 | 69 | ) async {
|
@@ -75,6 +95,9 @@ typedef _EntryPointArgs = (SendPort sendPort, Sane sane);
|
75 | 95 | void _entryPoint(_EntryPointArgs args) {
|
76 | 96 | final (sendPort, sane) = args;
|
77 | 97 |
|
| 98 | + Logger.root.level = Level.ALL; |
| 99 | + Logger.root.onRecord.forEach(sendPort.send); |
| 100 | + |
78 | 101 | final receivePort = ReceivePort();
|
79 | 102 | sendPort.send(receivePort.sendPort);
|
80 | 103 |
|
@@ -108,8 +131,10 @@ class _IsolateMessageEnvelope {
|
108 | 131 |
|
109 | 132 | late Map<String, SaneDevice> _devices;
|
110 | 133 |
|
| 134 | +@internal |
111 | 135 | SaneDevice getDevice(String name) => _devices[name]!;
|
112 | 136 |
|
| 137 | +@internal |
113 | 138 | void setDevices(Iterable<SaneDevice> devices) {
|
114 | 139 | _devices = {
|
115 | 140 | for (final device in devices) device.name: device,
|
|
0 commit comments