OLD | NEW |
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 import 'dart:async'; | 5 import 'dart:async'; |
6 import 'dart:convert'; | 6 import 'dart:convert'; |
7 import 'dart:isolate'; | 7 import 'dart:isolate'; |
8 | 8 |
9 import 'package:analyzer/instrumentation/instrumentation.dart'; | 9 import 'package:analyzer/instrumentation/instrumentation.dart'; |
10 import 'package:analyzer_plugin/channel/channel.dart'; | 10 import 'package:analyzer_plugin/channel/channel.dart'; |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 * not yet been started by invoking [listen]. | 108 * not yet been started by invoking [listen]. |
109 */ | 109 */ |
110 Isolate _isolate; | 110 Isolate _isolate; |
111 | 111 |
112 /** | 112 /** |
113 * The port used to send requests to the plugin, or `null` if the plugin has | 113 * The port used to send requests to the plugin, or `null` if the plugin has |
114 * not yet been started by invoking [listen]. | 114 * not yet been started by invoking [listen]. |
115 */ | 115 */ |
116 SendPort _sendPort; | 116 SendPort _sendPort; |
117 | 117 |
118 ReceivePort receivePort; | 118 /** |
| 119 * The port used to receive responses and notifications from the plugin. |
| 120 */ |
| 121 ReceivePort _receivePort; |
119 | 122 |
120 ReceivePort errorPort; | 123 /** |
| 124 * The port used to receive unhandled exceptions thrown in the plugin. |
| 125 */ |
| 126 ReceivePort _errorPort; |
121 | 127 |
122 ReceivePort exitPort; | 128 /** |
| 129 * The port used to receive notification when the plugin isolate has exited. |
| 130 */ |
| 131 ReceivePort _exitPort; |
123 | 132 |
124 /** | 133 /** |
125 * Initialize a newly created channel to communicate with an isolate running | 134 * Initialize a newly created channel to communicate with an isolate running |
126 * the code at the given [uri]. | 135 * the code at the given [uri]. |
127 */ | 136 */ |
128 ServerIsolateChannel( | 137 ServerIsolateChannel( |
129 this.pluginUri, this.packagesUri, this.instrumentationService); | 138 this.pluginUri, this.packagesUri, this.instrumentationService); |
130 @override | 139 @override |
131 void close() { | 140 void close() { |
132 receivePort?.close(); | 141 _receivePort?.close(); |
133 errorPort?.close(); | 142 _errorPort?.close(); |
134 exitPort?.close(); | 143 _exitPort?.close(); |
135 _isolate = null; | 144 _isolate = null; |
136 // _sendPort = null; | |
137 // receivePort = null; | |
138 // errorPort = null; | |
139 // exitPort = null; | |
140 } | 145 } |
141 | 146 |
142 @override | 147 @override |
143 Future<Null> listen(void onResponse(Response response), | 148 Future<Null> listen(void onResponse(Response response), |
144 void onNotification(Notification notification), | 149 void onNotification(Notification notification), |
145 {Function onError, void onDone()}) async { | 150 {Function onError, void onDone()}) async { |
146 if (_isolate != null) { | 151 if (_isolate != null) { |
147 throw new StateError('Cannot listen to the same channel more than once.'); | 152 throw new StateError('Cannot listen to the same channel more than once.'); |
148 } | 153 } |
149 receivePort = new ReceivePort(); | 154 _receivePort = new ReceivePort(); |
150 if (onError != null) { | 155 if (onError != null) { |
151 errorPort = new ReceivePort(); | 156 _errorPort = new ReceivePort(); |
152 errorPort.listen((error) { | 157 _errorPort.listen((error) { |
153 onError(error); | 158 onError(error); |
154 }); | 159 }); |
155 } | 160 } |
156 if (onDone != null) { | 161 if (onDone != null) { |
157 exitPort = new ReceivePort(); | 162 _exitPort = new ReceivePort(); |
158 exitPort.listen((_) { | 163 _exitPort.listen((_) { |
159 onDone(); | 164 onDone(); |
160 }); | 165 }); |
161 } | 166 } |
162 _isolate = await Isolate.spawnUri( | 167 _isolate = await Isolate.spawnUri( |
163 pluginUri, <String>[], receivePort.sendPort, | 168 pluginUri, <String>[], _receivePort.sendPort, |
164 onError: errorPort?.sendPort, | 169 onError: _errorPort?.sendPort, |
165 onExit: exitPort?.sendPort, | 170 onExit: _exitPort?.sendPort, |
166 packageConfig: packagesUri); | 171 packageConfig: packagesUri); |
167 Completer<Null> channelReady = new Completer<Null>(); | 172 Completer<Null> channelReady = new Completer<Null>(); |
168 receivePort.listen((dynamic input) { | 173 _receivePort.listen((dynamic input) { |
169 if (input is SendPort) { | 174 if (input is SendPort) { |
170 // print('[server] Received send port'); | 175 // print('[server] Received send port'); |
171 _sendPort = input; | 176 _sendPort = input; |
172 channelReady.complete(null); | 177 channelReady.complete(null); |
173 } else if (input is Map) { | 178 } else if (input is Map) { |
174 if (input.containsKey('id') != null) { | 179 if (input.containsKey('id') != null) { |
175 String encodedInput = JSON.encode(input); | 180 String encodedInput = JSON.encode(input); |
176 // print('[server] Received response: $encodedInput'); | 181 // print('[server] Received response: $encodedInput'); |
177 instrumentationService.logPluginResponse(pluginUri, encodedInput); | 182 instrumentationService.logPluginResponse(pluginUri, encodedInput); |
178 onResponse(new Response.fromJson(input)); | 183 onResponse(new Response.fromJson(input)); |
(...skipping 10 matching lines...) Expand all Loading... |
189 | 194 |
190 @override | 195 @override |
191 void sendRequest(Request request) { | 196 void sendRequest(Request request) { |
192 Map<String, Object> json = request.toJson(); | 197 Map<String, Object> json = request.toJson(); |
193 String encodedRequest = JSON.encode(json); | 198 String encodedRequest = JSON.encode(json); |
194 // print('[server] Send request: $encodedRequest'); | 199 // print('[server] Send request: $encodedRequest'); |
195 instrumentationService.logPluginRequest(pluginUri, encodedRequest); | 200 instrumentationService.logPluginRequest(pluginUri, encodedRequest); |
196 _sendPort.send(json); | 201 _sendPort.send(json); |
197 } | 202 } |
198 } | 203 } |
OLD | NEW |