blob: 965ace231e08e3fba2bf2c4dc9cdc3e3f74404ac [file] [log] [blame]
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:watcher/watcher.dart';
import 'package:web_socket_channel/web_socket_channel.dart';
import '../../data/build_target.dart';
bool _isBlacklistedPath(String filePath, Set<RegExp> blackListedPatterns) =>
blackListedPatterns.any((pattern) => filePath.contains(pattern));
bool _shouldBuild(BuildTarget target, Iterable<WatchEvent> changes) =>
target is DefaultBuildTarget &&
changes.any((change) =>
!_isBlacklistedPath(change.path, target.blackListPatterns.toSet()));
/// Manages the set of build targets, and corresponding listeners, tracked by
/// the Dart Build Daemon.
class BuildTargetManager {
var _buildTargets = <BuildTarget, Set<WebSocketChannel>>{};
bool Function(BuildTarget, Iterable<WatchEvent>) shouldBuild;
BuildTargetManager(
{bool Function(BuildTarget, Iterable<WatchEvent>) shouldBuildOverride})
: shouldBuild = shouldBuildOverride ?? _shouldBuild;
bool get isEmpty => _buildTargets.isEmpty;
Set<BuildTarget> get targets => _buildTargets.keys.toSet();
/// All the tracked channels.
Set<WebSocketChannel> get allChannels =>
_buildTargets.values.expand((s) => s).toSet();
/// Adds a tracked build target with corresponding interested channel.
void addBuildTarget(BuildTarget target, WebSocketChannel channel) {
_buildTargets
.putIfAbsent(target, () => Set<WebSocketChannel>())
.add(channel);
}
/// Returns channels that are interested in the provided target.
Set<WebSocketChannel> channels(BuildTarget target) =>
_buildTargets[target] ?? Set();
void removeChannel(WebSocketChannel channel) =>
_buildTargets = Map.fromEntries(_buildTargets.entries
.map((e) => MapEntry(e.key, e.value..remove(channel)))
.where((e) => e.value.isNotEmpty));
Set<BuildTarget> targetsForChanges(List<WatchEvent> changes) =>
targets.where((target) => shouldBuild(target, changes)).toSet();
}