9872e9d4c4
Bug: https://github.com/dart-lang/sdk/issues/34218 Change-Id: I4215c0a2212d5c15972d9ffe4075c89d27c9081e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/235701 Reviewed-by: Daco Harkes <dacoharkes@google.com> Reviewed-by: William Hesse <whesse@google.com> Commit-Queue: Paul Berry <paulberry@google.com>
141 lines
4.1 KiB
Dart
141 lines
4.1 KiB
Dart
// Copyright (c) 2014, 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 'dart:io';
|
|
import 'package:http_server/http_server.dart' as http_server;
|
|
import 'package:route/server.dart';
|
|
import 'package:path/path.dart';
|
|
import 'package:http_server/http_server.dart';
|
|
|
|
/*
|
|
* This program serves a visualization of a JavaScript source map file generated
|
|
* by dart2js or pub.
|
|
*
|
|
* Usage: dart source_map_viewer.dart <path to map file>.
|
|
*
|
|
* The default system browser is started and pointed to the viewer if
|
|
* available.
|
|
*/
|
|
|
|
Uri sourceMapFile;
|
|
|
|
void main(List<String> args) {
|
|
if (args.length != 1) {
|
|
print('One argument expected; the source map file.');
|
|
exit(-1);
|
|
return;
|
|
}
|
|
|
|
File mapFile = new File(args[0]);
|
|
if (!mapFile.existsSync()) {
|
|
print('Map file not found at ${args[0]}');
|
|
exit(-2);
|
|
return;
|
|
}
|
|
|
|
sourceMapFile = toUri(mapFile.path);
|
|
startServer();
|
|
}
|
|
|
|
// Sends the content of the file requested in the path parameter.
|
|
void handleFile(HttpRequest request) {
|
|
String path = request.uri.queryParameters["path"];
|
|
if (path == null) {
|
|
request.response.close();
|
|
return;
|
|
}
|
|
|
|
Uri uri = sourceMapFile.resolve(path);
|
|
new File.fromUri(uri)
|
|
.openRead()
|
|
.cast<List<int>>()
|
|
.pipe(request.response)
|
|
.catchError((e) {
|
|
print("Error: $e");
|
|
request.response.close();
|
|
});
|
|
}
|
|
|
|
// Sends back the name of the source map file.
|
|
void handleSourceMapFile(HttpRequest request) {
|
|
request.response.write(basename(sourceMapFile.path));
|
|
request.response.close();
|
|
}
|
|
|
|
// Starts an HttpServer rooted in [dir] with two special routes, /file and /map.
|
|
//
|
|
// /file takes a parameter [path] and serves the content of the specified file
|
|
// in path relative to [dir]
|
|
//
|
|
// /map serves the name of the map file such that its content can be requested
|
|
// with a /file request as above.
|
|
void startServer() {
|
|
String root = fromUri(Platform.script.resolve('../build/web/'));
|
|
Directory directory = new Directory(root);
|
|
if (!directory.existsSync()) {
|
|
print("Directory '$root' does not exist. "
|
|
"Run 'pub build' to generate the output.");
|
|
exit(-1);
|
|
}
|
|
|
|
// Use port 0 to get an ephemeral port.
|
|
int port = 0;
|
|
HttpServer.bind(InternetAddress.loopbackIPv4, port).then((server) {
|
|
port = server.port;
|
|
print("Source mapping server is running on "
|
|
"'http://${server.address.address}:$port/'");
|
|
Router router = new Router(server)
|
|
..serve('/file').listen(handleFile)
|
|
..serve('/map').listen(handleSourceMapFile);
|
|
|
|
// Set up default handler. This will serve files from our 'build'
|
|
// directory. Disable jail root, as packages are local symlinks.
|
|
VirtualDirectory virDir = new http_server.VirtualDirectory(root)
|
|
..jailRoot = false
|
|
..allowDirectoryListing = true;
|
|
|
|
virDir.directoryHandler = (dir, request) {
|
|
// Redirect directory requests to index.html files.
|
|
Uri indexUri = new Uri.file(dir.path).resolve('display.html');
|
|
virDir.serveFile(new File(indexUri.toFilePath()), request);
|
|
};
|
|
|
|
// Add an error page handler.
|
|
virDir.errorPageHandler = (HttpRequest request) {
|
|
print("Resource not found: ${request.uri.path}");
|
|
request.response.statusCode = HttpStatus.NOT_FOUND;
|
|
request.response.close();
|
|
};
|
|
|
|
// Serve everything not routed elsewhere through the virtual directory.
|
|
virDir.serve(router.defaultStream);
|
|
|
|
// Start the system' default browser
|
|
startBrowser('http://${server.address.address}:$port/');
|
|
});
|
|
}
|
|
|
|
startBrowser(String url) {
|
|
String command;
|
|
if (Platform.isWindows) {
|
|
command = 'cmd.exe /C start';
|
|
} else if (Platform.isMacOS) {
|
|
command = 'open';
|
|
} else {
|
|
String xdg = '/usr/bin/xdg-open';
|
|
if (new File(xdg).existsSync()) {
|
|
command = xdg;
|
|
} else {
|
|
command = '/usr/bin/google-chrome';
|
|
}
|
|
}
|
|
|
|
print('Starting browser: ${command} ${url}');
|
|
Process.run(command, ['$url']).then((ProcessResult result) {
|
|
if (result.exitCode != 0) {
|
|
print(result.stderr);
|
|
}
|
|
});
|
|
}
|