|
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