1
+ import 'dart:async' ;
1
2
import 'dart:isolate' ;
2
3
import 'dart:typed_data' ;
3
4
5
+ import 'package:logging/logging.dart' ;
4
6
import 'package:sane/sane.dart' ;
7
+ import 'package:sane/src/extensions.dart' ;
5
8
import 'package:sane/src/isolate_messages/cancel.dart' ;
6
9
import 'package:sane/src/isolate_messages/close.dart' ;
7
10
import 'package:sane/src/isolate_messages/control_button_option.dart' ;
@@ -19,6 +22,8 @@ import 'package:sane/src/isolate_messages/read.dart';
19
22
import 'package:sane/src/isolate_messages/set_io_mode.dart' ;
20
23
import 'package:sane/src/isolate_messages/start.dart' ;
21
24
25
+ final _logger = Logger ('sane.isolate' );
26
+
22
27
class SaneIsolate implements Sane {
23
28
SaneIsolate ({
24
29
required Sane sane,
@@ -38,7 +43,16 @@ class SaneIsolate implements Sane {
38
43
sane: _sane,
39
44
),
40
45
);
41
- _sendPort = await receivePort.first as SendPort ;
46
+
47
+ final sendPortCompleter = Completer <SendPort >();
48
+ receivePort.listen ((message) {
49
+ if (message is _SendPortMessage ) {
50
+ sendPortCompleter.complete (message.sendPort);
51
+ } else if (message is _LogRecordMessage ) {
52
+ _logger.redirect (message.record);
53
+ }
54
+ });
55
+ _sendPort = await sendPortCompleter.future;
42
56
}
43
57
44
58
void kill () {
@@ -292,7 +306,16 @@ class _IsolateEntryPointArgs {
292
306
293
307
void _isolateEntryPoint (_IsolateEntryPointArgs args) {
294
308
final isolateReceivePort = ReceivePort ();
295
- args.mainSendPort.send (isolateReceivePort.sendPort);
309
+ args.mainSendPort.send (
310
+ _SendPortMessage (isolateReceivePort.sendPort),
311
+ );
312
+
313
+ Logger .root.level = Level .ALL ;
314
+ Logger .root.onRecord.listen ((record) {
315
+ args.mainSendPort.send (
316
+ _LogRecordMessage (record),
317
+ );
318
+ });
296
319
297
320
final sane = args.sane;
298
321
isolateReceivePort.cast <_IsolateMessageEnvelope >().listen ((envelope) async {
@@ -320,3 +343,13 @@ class _IsolateMessageEnvelope {
320
343
final SendPort replyPort;
321
344
final IsolateMessage message;
322
345
}
346
+
347
+ class _SendPortMessage {
348
+ _SendPortMessage (this .sendPort);
349
+ final SendPort sendPort;
350
+ }
351
+
352
+ class _LogRecordMessage {
353
+ _LogRecordMessage (this .record);
354
+ final LogRecord record;
355
+ }
0 commit comments