Skip to content

Commit 73d8a1a

Browse files
authored
Add assets digests handler (#1709)
This entry point will be used for hot reloading, in order to initially retrieve digests of all assets, as build_runner might not know list of all of them, unlike client.
1 parent 1ee129d commit 73d8a1a

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

build_runner/lib/src/server/server.dart

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import 'path_to_asset_id.dart';
2121

2222
const _performancePath = r'$perf';
2323
final _graphPath = r'$graph';
24+
final _assetsDigestPath = r'$assetDigests';
2425
final _buildUpdatesProtocol = r'$livereload';
2526
final _buildUpdatesMessage = 'update';
2627
final entrypointExtensionMarker = '/* ENTRYPOINT_EXTENTION_MARKER */';
@@ -79,6 +80,9 @@ class ServeHandler implements BuildState {
7980
if (request.url.path == _performancePath) {
8081
return _performanceHandler(request);
8182
}
83+
if (request.url.path == _assetsDigestPath) {
84+
return _assetsDigestHandler(request, rootDir);
85+
}
8286
if (request.url.path.startsWith(_graphPath)) {
8387
var graphHandler = await _assetGraphHandler;
8488
return await graphHandler.handle(
@@ -112,6 +116,24 @@ class ServeHandler implements BuildState {
112116
headers: {HttpHeaders.contentTypeHeader: 'text/html'});
113117
}
114118

119+
Future<shelf.Response> _assetsDigestHandler(
120+
shelf.Request request, String rootDir) async {
121+
var assertPathList = jsonDecode(await request.readAsString()) as List;
122+
var rootPackage = _state.packageGraph.root.name;
123+
var results = <String, String>{};
124+
for (String path in assertPathList) {
125+
try {
126+
var assetId = pathToAssetId(rootPackage, rootDir, p.url.split(path));
127+
var digest = await _state.reader.digest(assetId);
128+
results[path] = digest.toString();
129+
} on AssetNotFoundException {
130+
results.remove(path);
131+
}
132+
}
133+
return new shelf.Response.ok(jsonEncode(results),
134+
headers: {HttpHeaders.contentTypeHeader: 'application/json'});
135+
}
136+
115137
void _warnForEmptyDirectory(String rootDir) {
116138
if (!_state.assetGraph
117139
.packageNodes(_rootPackage)

build_runner/test/server/serve_handler_test.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'dart:async';
6+
import 'dart:convert';
67
import 'dart:io';
78

89
import 'package:logging/logging.dart';
@@ -165,6 +166,23 @@ void main() {
165166
});
166167
});
167168

169+
test('serve asset digests', () async {
170+
_addSource('a|web/index.html', 'content1');
171+
_addSource('a|lib/some.dart.js', 'content2');
172+
_addSource('a|lib/another.dart.js', 'content3');
173+
var response = await serveHandler.handlerFor('web')(new Request(
174+
'GET', Uri.parse('http://server.com/\$assetDigests'),
175+
body: jsonEncode([
176+
'index.html',
177+
'packages/a/some.dart.js',
178+
'packages/a/absent.dart.js'
179+
])));
180+
expect(jsonDecode(await response.readAsString()), {
181+
'index.html': '7e55db001d319a94b0b713529a756623',
182+
'packages/a/some.dart.js': 'eea670f4ac941df71a3b5f268ebe3eac',
183+
});
184+
});
185+
168186
group('build updates', () {
169187
test('injects client code if enabled', () async {
170188
_addSource('a|web/some.js', entrypointExtensionMarker + '\nalert(1)');

0 commit comments

Comments
 (0)