11// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
22// for details. All rights reserved. Use of this source code is governed by a
33// BSD-style license that can be found in the LICENSE file.
4-
54import 'dart:async' ;
65import 'dart:convert' ;
76import 'dart:io' ;
@@ -17,6 +16,7 @@ import 'package:watcher/watcher.dart';
1716import 'package:web_socket_channel/web_socket_channel.dart' ;
1817
1918import '../change_provider.dart' ;
19+ import '../constants.dart' ;
2020import '../daemon_builder.dart' ;
2121import '../data/build_request.dart' ;
2222import '../data/build_target.dart' ;
@@ -31,24 +31,19 @@ import 'managers/build_target_manager.dart';
3131/// Note the server will only notify clients of pertinent events.
3232class Server {
3333 static final loggerName = 'BuildDaemonServer' ;
34-
35- final _isDoneCompleter = Completer ();
34+ final _isDoneCompleter = Completer <int >();
3635 final BuildTargetManager _buildTargetManager;
3736 final _pool = Pool (1 );
3837 final Serializers _serializers;
3938 final ChangeProvider _changeProvider;
4039 late final Timer _timeout;
41-
4240 HttpServer ? _server;
4341 final DaemonBuilder _builder;
4442 // Channels that are interested in the current build.
4543 var _interestedChannels = < WebSocketChannel > {};
46-
4744 final _subs = < StreamSubscription > [];
48-
4945 final _outputStreamController = StreamController <ServerLog >();
5046 late final Stream <ServerLog > _logs;
51-
5247 Server (
5348 this ._builder,
5449 Duration timeout,
@@ -61,9 +56,7 @@ class Server {
6156 BuildTargetManager (shouldBuildOverride: shouldBuild) {
6257 _logs = _outputStreamController.stream;
6358 _forwardData ();
64-
6559 _handleChanges (changeProvider.changes);
66-
6760 // Stop the server if nobody connects.
6861 _timeout = Timer (timeout, () async {
6962 if (_buildTargetManager.isEmpty) {
@@ -72,7 +65,8 @@ class Server {
7265 });
7366 }
7467
75- Future <void > get onDone => _isDoneCompleter.future;
68+ /// Returns exit code.
69+ Future <int > get onDone => _isDoneCompleter.future;
7670
7771 /// Starts listening for build daemon clients.
7872 Future <int > listen () async {
@@ -98,7 +92,6 @@ class Server {
9892 _removeChannel (channel);
9993 });
10094 });
101-
10295 var server = _server = await HttpMultiServer .loopback (0 );
10396 // Serve requests in an error zone to prevent failures
10497 // when running from another error zone.
@@ -124,7 +117,7 @@ class Server {
124117 await sub.cancel ();
125118 }
126119 await _outputStreamController.close ();
127- if (! _isDoneCompleter.isCompleted) _isDoneCompleter.complete ();
120+ if (! _isDoneCompleter.isCompleted) _isDoneCompleter.complete (failureType );
128121 }
129122
130123 Future <void > _build (
@@ -134,7 +127,6 @@ class Server {
134127 buildTargets.expand (_buildTargetManager.channels).toSet ();
135128 return _builder.build (buildTargets, changes);
136129 });
137-
138130 void _forwardData () {
139131 _subs
140132 ..add (_builder.logs.listen ((log) {
@@ -147,14 +139,11 @@ class Server {
147139 // Don't serialize or send changed assets if the client isn't interested
148140 // in them.
149141 String ? message, messageWithoutChangedAssets;
150-
151142 for (var channel in _interestedChannels) {
152143 var targets = _buildTargetManager.targetsFor (channel);
153144 var wantsChangedAssets = targets
154145 .any ((e) => e is DefaultBuildTarget && e.reportChangedAssets);
155-
156146 String messageForChannel;
157-
158147 if (wantsChangedAssets) {
159148 messageForChannel =
160149 message ?? = jsonEncode (_serializers.serialize (status));
@@ -163,7 +152,6 @@ class Server {
163152 _serializers
164153 .serialize (status.rebuild ((b) => b.changedAssets = null )));
165154 }
166-
167155 channel.sink.add (messageForChannel);
168156 }
169157 }))
@@ -183,7 +171,15 @@ class Server {
183171 var buildTargets = _buildTargetManager.targetsForChanges (changes);
184172 if (buildTargets.isEmpty) return ;
185173 await _build (buildTargets, changes);
186- }).listen ((_) {}));
174+ }).listen ((_) {}, onError: (e) {
175+ stop (
176+ message: 'Error in file change event: $e ' ,
177+ failureType: fileChangeEventErrorCode);
178+ }, onDone: () {
179+ stop (
180+ message: 'File change stream closed' ,
181+ failureType: fileChangeStreamClosedErrorCode);
182+ }));
187183 }
188184
189185 void _removeChannel (WebSocketChannel channel) async {
0 commit comments