@@ -18,7 +18,8 @@ abstract class PortClient {
18
18
class ParentPortClient implements PortClient {
19
19
late Future <SendPort > sendPortFuture;
20
20
SendPort ? sendPort;
21
- ReceivePort receivePort = ReceivePort ();
21
+ final ReceivePort _receivePort = ReceivePort ();
22
+ final ReceivePort _errorPort = ReceivePort ();
22
23
bool closed = false ;
23
24
int _nextId = 1 ;
24
25
@@ -30,7 +31,7 @@ class ParentPortClient implements PortClient {
30
31
sendPortFuture.then ((value) {
31
32
sendPort = value;
32
33
});
33
- receivePort .listen ((message) {
34
+ _receivePort .listen ((message) {
34
35
if (message is _InitMessage ) {
35
36
assert (! initCompleter.isCompleted);
36
37
initCompleter.complete (message.port);
@@ -57,6 +58,17 @@ class ParentPortClient implements PortClient {
57
58
}
58
59
close ();
59
60
});
61
+ _errorPort.listen ((message) {
62
+ var [error, stackTrace] = message;
63
+ print ('got an error ${initCompleter .isCompleted } $error ' );
64
+ if (! initCompleter.isCompleted) {
65
+ if (stackTrace == null ) {
66
+ initCompleter.completeError (error);
67
+ } else {
68
+ initCompleter.completeError (error, StackTrace .fromString (stackTrace));
69
+ }
70
+ }
71
+ });
60
72
}
61
73
62
74
Future <void > get ready async {
@@ -94,20 +106,22 @@ class ParentPortClient implements PortClient {
94
106
}
95
107
96
108
RequestPortServer server () {
97
- return RequestPortServer (receivePort .sendPort);
109
+ return RequestPortServer (_receivePort .sendPort);
98
110
}
99
111
100
112
void close () async {
101
113
if (! closed) {
102
114
closed = true ;
103
115
104
- receivePort.close ();
116
+ _receivePort.close ();
117
+ _errorPort.close ();
105
118
_cancelAll (const ClosedException ());
106
119
}
107
120
}
108
121
109
122
tieToIsolate (Isolate isolate) {
110
- isolate.addOnExitListener (receivePort.sendPort, response: _closeMessage);
123
+ isolate.addErrorListener (_errorPort.sendPort);
124
+ isolate.addOnExitListener (_receivePort.sendPort, response: _closeMessage);
111
125
}
112
126
}
113
127
0 commit comments