Chromium Code Reviews| Index: pkg/barback/lib/src/internal_asset.dart |
| diff --git a/pkg/barback/lib/src/asset.dart b/pkg/barback/lib/src/internal_asset.dart |
| similarity index 56% |
| copy from pkg/barback/lib/src/asset.dart |
| copy to pkg/barback/lib/src/internal_asset.dart |
| index fda813380dc1965b6b901db7e043f531256eed41..a90603ea095ed2a470dbf60d2faa7a4fb4fa7fed 100644 |
| --- a/pkg/barback/lib/src/asset.dart |
| +++ b/pkg/barback/lib/src/internal_asset.dart |
| @@ -2,64 +2,78 @@ |
| // 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. |
| -library barback.asset; |
| +library barback.internal_asset; |
| import 'dart:async'; |
| import 'dart:convert'; |
| import 'dart:io'; |
| +import 'asset.dart'; |
| import 'asset_id.dart'; |
| import 'file_pool.dart'; |
| +import 'serialize.dart'; |
| import 'stream_replayer.dart'; |
| import 'utils.dart'; |
| -/// A blob of content. |
| -/// |
| -/// Assets may come from the file system, or as the output of a [Transformer]. |
| -/// They are identified by [AssetId]. |
| -abstract class Asset { |
| - /// The ID for this asset. |
| - final AssetId id; |
| - |
| - Asset(this.id); |
| - |
| - factory Asset.fromBytes(AssetId id, List<int> bytes) => |
| - new _BinaryAsset(id, bytes); |
| - |
| - factory Asset.fromFile(AssetId id, File file) => |
| - new _FileAsset(id, file); |
| - |
| - factory Asset.fromString(AssetId id, String content) => |
| - new _StringAsset(id, content); |
| - |
| - factory Asset.fromPath(AssetId id, String path) => |
| - new _FileAsset(id, new File(path)); |
| - |
| - /// Creates an asset from a stream. |
| - /// |
| - /// This immediately starts draining [stream]. |
| - factory Asset.fromStream(AssetId id, Stream<List<int>> stream) => |
| - new _StreamAsset(id, stream); |
| - |
| - /// Returns the contents of the asset as a string. |
| - /// |
| - /// If the asset was created from a [String] the original string is always |
| - /// returned and [encoding] is ignored. Otherwise, the binary data of the |
| - /// asset is decoded using [encoding], which defaults to [UTF8]. |
| - Future<String> readAsString({Encoding encoding}); |
| +/// Serialize an asset to a form that's safe to send across isolates. |
| +Map serializeAsset(Asset asset) { |
| + var id = serializeId(asset.id); |
| + if (asset is BinaryAsset) { |
| + var contents = asset._contents.runtimeType == List ? |
| + asset._contents : asset._contents.toList(); |
| + // TODO(nweiz): Send a typed array if that works after issue 14703 is fixed. |
| + return { |
| + 'type': 'binary', |
| + 'id': id, |
| + // If [_contents] is a custom subclass of List, it won't be serializable, |
| + // so we have to convert it to a built-in [List] first. |
|
Bob Nystrom
2013/11/08 19:22:14
Move this comment up.
nweiz
2013/11/08 22:03:49
Done.
|
| + 'contents': contents |
| + }; |
| + } else if (asset is FileAsset) { |
| + return { |
| + 'type': 'file', |
| + 'id': id, |
| + 'path': asset._path |
| + }; |
| + } else if (asset is StringAsset) { |
| + return { |
| + 'type': 'string', |
| + 'id': id, |
| + 'contents': asset._contents |
| + }; |
| + } else { |
| + // [asset] is probably a [StreamAsset], but it's possible that the user has |
| + // created a custom subclass, in which case we just serialize the stream |
| + // anyway. |
| + return { |
| + 'type': 'stream', |
| + 'id': id, |
| + 'stream': serializeStream(asset.read()) |
| + }; |
| + } |
| +} |
| - /// Streams the binary contents of the asset. |
| - /// |
| - /// If the asset was created from a [String], this returns its UTF-8 encoding. |
| - Stream<List<int>> read(); |
| +/// Deserialize an asset from the form returned by [serialize]. |
| +Asset deserializeAsset(Map asset) { |
| + var id = deserializeId(asset['id']); |
| + switch (asset['type']) { |
| + case 'binary': return new BinaryAsset(id, asset['contents']); |
| + case 'file': return new FileAsset(id, asset['path']); |
| + case 'string': return new StringAsset(id, asset['contents']); |
| + case 'stream': |
| + return new StreamAsset(id, deserializeStream(asset['stream'])); |
| + default: |
| + throw new FormatException('Unknown asset type "${asset['type']}".'); |
| + } |
| } |
| /// An asset whose data is stored in a list of bytes. |
| -class _BinaryAsset extends Asset { |
| +class BinaryAsset implements Asset { |
| + final AssetId id; |
| + |
| final List<int> _contents; |
| - _BinaryAsset(AssetId id, this._contents) |
| - : super(id); |
| + BinaryAsset(this.id, this._contents); |
| Future<String> readAsString({Encoding encoding}) { |
| if (encoding == null) encoding = UTF8; |
| @@ -99,31 +113,33 @@ class _BinaryAsset extends Asset { |
| } |
| /// An asset backed by a file on the local file system. |
| -class _FileAsset extends Asset { |
| +class FileAsset implements Asset { |
| + final AssetId id; |
| + |
| /// Use a [FilePool] to handle reads so we can try to cope with running out |
| /// of file descriptors more gracefully. |
| static final _pool = new FilePool(); |
| - final File _file; |
| - _FileAsset(AssetId id, this._file) |
| - : super(id); |
| + final String _path; |
| + FileAsset(this.id, this._path); |
| Future<String> readAsString({Encoding encoding}) { |
| if (encoding == null) encoding = UTF8; |
| - return _pool.readAsString(_file, encoding); |
| + return _pool.readAsString(_path, encoding); |
| } |
| - Stream<List<int>> read() => _pool.openRead(_file); |
| + Stream<List<int>> read() => _pool.openRead(_path); |
| - String toString() => 'File "${_file.path}"'; |
| + String toString() => 'File "${_path}"'; |
| } |
| /// An asset whose data is stored in a string. |
| -class _StringAsset extends Asset { |
| +class StringAsset implements Asset { |
| + final AssetId id; |
| + |
| final String _contents; |
| - _StringAsset(AssetId id, this._contents) |
| - : super(id); |
| + StringAsset(this.id, this._contents); |
| Future<String> readAsString({Encoding encoding}) => |
| new Future.value(_contents); |
| @@ -153,14 +169,15 @@ class _StringAsset extends Asset { |
| } |
| /// An asset whose data is available from a stream. |
| -class _StreamAsset extends Asset { |
| +class StreamAsset implements Asset { |
| + final AssetId id; |
| + |
| /// A stream replayer that records and replays the contents of the input |
| /// stream. |
| final StreamReplayer<List<int>> _replayer; |
| - _StreamAsset(AssetId id, Stream<List<int>> stream) |
| - : _replayer = new StreamReplayer(stream), |
| - super(id); |
| + StreamAsset(this.id, Stream<List<int>> stream) |
| + : _replayer = new StreamReplayer(stream); |
| Future<String> readAsString({Encoding encoding}) { |
| if (encoding == null) encoding = UTF8; |