in dwds/lib/src/handlers/dev_handler.dart [245:314]
void _handleConnection(SocketConnection injectedConnection) {
_injectedConnections.add(injectedConnection);
AppConnection appConnection;
injectedConnection.stream.listen((data) async {
try {
var message = serializers.deserialize(jsonDecode(data));
if (message is ConnectRequest) {
if (appConnection != null) {
throw StateError('Duplicate connection request from the same app. '
'Please file an issue at '
'https://github.com/dart-lang/webdev/issues/new.');
}
appConnection =
await _handleConnectRequest(message, injectedConnection);
} else {
if (appConnection == null) {
throw StateError('Not connected to an application.');
}
if (message is DevToolsRequest) {
await _handleDebugRequest(appConnection, injectedConnection);
} else if (message is IsolateExit) {
await _handleIsolateExit(appConnection);
} else if (message is IsolateStart) {
await _handleIsolateStart(appConnection, injectedConnection);
} else if (message is BatchedDebugEvents) {
await _servicesByAppId[appConnection.request.appId]
?.chromeProxyService
?.parseBatchedDebugEvents(message);
} else if (message is DebugEvent) {
await _servicesByAppId[appConnection.request.appId]
?.chromeProxyService
?.parseDebugEvent(message);
} else if (message is RegisterEvent) {
await _servicesByAppId[appConnection.request.appId]
?.chromeProxyService
?.parseRegisterEvent(message);
}
}
} catch (e, s) {
// Most likely the app disconnected in the middle of us responding,
// but we will try and send an error response back to the page just in
// case it is still running.
try {
injectedConnection.sink
.add(jsonEncode(serializers.serialize(ErrorResponse((b) => b
..error = '$e'
..stackTrace = '$s'))));
} on StateError catch (_) {
// The sink has already closed (app is disconnected), swallow the
// error.
}
}
});
unawaited(injectedConnection.sink.done.then((_) async {
_injectedConnections.remove(injectedConnection);
if (appConnection != null) {
_appConnectionByAppId.remove(appConnection.request.appId);
var services = _servicesByAppId[appConnection.request.appId];
if (services != null) {
if (services.connectedInstanceId == null ||
services.connectedInstanceId ==
appConnection.request.instanceId) {
services.connectedInstanceId = null;
services.chromeProxyService?.destroyIsolate();
}
}
}
}));
}