| // 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); |
| } |
| }); |
| } |