@@ -27,24 +27,40 @@ class Binding {
27
27
_library = openLib ();
28
28
}
29
29
30
- static callBridge (IsolateArguments args) async {
30
+ static void callBridge (IsolateArguments args) async {
31
31
var result = await Binding ().call (args.name, args.payload);
32
32
args.port.send (result);
33
33
}
34
34
35
35
Future <Uint8List > callAsync (String name, Uint8List payload) async {
36
- final port = ReceivePort ();
36
+ final port = ReceivePort ('${ _libraryName }_port' );
37
37
final args = IsolateArguments (name, payload, port.sendPort);
38
+ final completer = new Completer <Uint8List >();
39
+
40
+ final isolate = await Isolate .spawn (
41
+ callBridge,
42
+ args,
43
+ errorsAreFatal: false ,
44
+ debugName: '${_libraryName }_isolate' ,
45
+ onError: port.sendPort,
46
+ );
47
+
48
+ port.listen (
49
+ (message) async {
50
+ if (message is Uint8List ) {
51
+ completer.complete (message);
52
+ } else if (message is List ) {
53
+ completer.completeError (message.firstOrNull ?? "internal error" );
54
+ } else {
55
+ completer.completeError (message ?? "spawn error" );
56
+ }
57
+ port.close ();
58
+ },
59
+ onDone: () {
60
+ isolate.kill (priority: Isolate .beforeNextEvent);
61
+ },
62
+ );
38
63
39
- final isolate = await Isolate .spawn (callBridge, args);
40
-
41
- Completer <Uint8List > completer = new Completer ();
42
-
43
- port.listen ((message) async {
44
- completer.complete (message);
45
- port.close ();
46
- isolate.kill ();
47
- });
48
64
return completer.future;
49
65
}
50
66
@@ -66,7 +82,7 @@ class Binding {
66
82
final result = callable (namePointer, payloadPointer, payload.length);
67
83
68
84
malloc.free (namePointer);
69
- malloc.free (payloadPointer );
85
+ malloc.free (pointer );
70
86
71
87
handleError (result.ref.error, result);
72
88
0 commit comments