1 | | | import 'dart:async'; |
2 | | | import 'dart:isolate'; |
3 | | |
|
4 | | | import 'package:logger/web.dart'; |
5 | | | import 'package:using/using.dart'; |
6 | | |
|
7 | | | import '../../channel.dart'; |
8 | | | import '../../exceptions/exception_manager.dart'; |
9 | | | import '../../exceptions/task_terminated_exception.dart'; |
10 | | | import '../../local_worker/local_worker.dart'; |
11 | | | import '../../typedefs.dart'; |
12 | | | import '../xplat/_worker_runner.dart'; |
13 | | | import '_worker_runner.dart'; |
14 | | |
|
15 | | | base class _VmLocalWorker<W> with Releasable implements LocalWorker<W> { |
16 | | 1 | _VmLocalWorker._(this.service, this.operations, this.exceptionManager) { |
17 | | 1 | final runner = WorkerRunner.use(this); |
18 | | 3 | _port.listen(runner.handle); |
19 | | 2 | _channel = Channel.deserialize( |
20 | | 4 | _port.sendPort, runner.internalLogger, exceptionManager)!; |
21 | | | } |
22 | | |
|
23 | | | @override |
24 | | | final W service; |
25 | | |
|
26 | | | @override |
27 | | | final OperationsMap operations; |
28 | | |
|
29 | | | @override |
30 | | | final ExceptionManager exceptionManager; |
31 | | |
|
32 | | | @override |
33 | | | Logger? channelLogger; |
34 | | |
|
35 | | | final _port = ReceivePort(); |
36 | | | late Channel? _channel; |
37 | | |
|
38 | | 1 | @override |
39 | | 1 | Channel? get channel => _channel; |
40 | | |
|
41 | | 0 | @override |
42 | | | FutureOr<void> start() {} |
43 | | |
|
44 | | 0 | @override |
45 | | | void stop() { |
46 | | 0 | _port.close(); |
47 | | 0 | _channel?.close(); |
48 | | 0 | _channel = null; |
49 | | | } |
50 | | |
|
51 | | 0 | @override |
52 | | 0 | void terminate([TaskTerminatedException? ex]) => stop(); |
53 | | | } |
54 | | |
|
55 | | | /// Creates a [LocalWorker] on a native platform. |
56 | | 1 | LocalWorker<W> createLocalWorker<W>(W service, OperationsMap operations, |
57 | | | ExceptionManager exceptionManager) => |
58 | | 1 | _VmLocalWorker<W>._(service, operations, exceptionManager); |