OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 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. |
| 4 |
| 5 library barback.graph.static_asset_cascade; |
| 6 |
| 7 import 'dart:async'; |
| 8 |
| 9 import '../asset/asset_id.dart'; |
| 10 import '../asset/asset_node.dart'; |
| 11 import '../asset/asset_set.dart'; |
| 12 import '../errors.dart'; |
| 13 import '../log.dart'; |
| 14 import '../package_provider.dart'; |
| 15 import 'asset_cascade.dart'; |
| 16 import 'node_status.dart'; |
| 17 import 'package_graph.dart'; |
| 18 |
| 19 /// An asset cascade for a static package. |
| 20 /// |
| 21 /// A static package is known to have no transformers and no changes to its |
| 22 /// assets. This allows this class to lazily and efficiently provide assets to |
| 23 /// the rest of the package graph. |
| 24 class StaticAssetCascade implements AssetCascade { |
| 25 final String package; |
| 26 |
| 27 final PackageGraph graph; |
| 28 |
| 29 /// All sources that have been requested from the provider. |
| 30 final _sources = new Map<AssetId, Future<AssetNode>>(); |
| 31 |
| 32 StaticAssetCascade(this.graph, this.package); |
| 33 |
| 34 Stream<BarbackException> get errors => _errorsController.stream; |
| 35 final _errorsController = |
| 36 new StreamController<BarbackException>.broadcast(sync: true); |
| 37 |
| 38 final status = NodeStatus.IDLE; |
| 39 |
| 40 final onLog = new StreamController<LogEntry>.broadcast().stream; |
| 41 final onStatusChange = new StreamController<LogEntry>.broadcast().stream; |
| 42 |
| 43 Future<AssetSet> get availableOutputs { |
| 44 var provider = graph.provider as StaticPackageProvider; |
| 45 return provider.getAllAssetIds(package).map(provider.getAsset).toList() |
| 46 .then((assets) => new AssetSet.from(assets)); |
| 47 } |
| 48 |
| 49 Future<AssetNode> getAssetNode(AssetId id) { |
| 50 return _sources.putIfAbsent(id, () { |
| 51 return graph.provider.getAsset(id).then((asset) { |
| 52 return new AssetNodeController.available(asset).node; |
| 53 }).catchError((error, stackTrace) { |
| 54 if (error is! AssetNotFoundException) { |
| 55 reportError(new AssetLoadException(id, error, stackTrace)); |
| 56 } |
| 57 |
| 58 // TODO(nweiz): propagate error information through asset nodes. |
| 59 return null; |
| 60 }); |
| 61 }); |
| 62 } |
| 63 |
| 64 void updateSources(Iterable<AssetId> sources) => |
| 65 throw new UnsupportedError("Static package $package can't be explicitly " |
| 66 "provided sources."); |
| 67 |
| 68 void removeSources(Iterable<AssetId> sources) => |
| 69 throw new UnsupportedError("Static package $package can't be explicitly " |
| 70 "provided sources."); |
| 71 |
| 72 void updateTransformers(Iterable<Iterable> transformersIterable) => |
| 73 throw new UnsupportedError("Static package $package can't have " |
| 74 "transformers."); |
| 75 |
| 76 void forceAllTransforms() {} |
| 77 |
| 78 void reportError(BarbackException error) => _errorsController.add(error); |
| 79 |
| 80 String toString() => "static cascade for $package"; |
| 81 } |
OLD | NEW |