|
|
// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// heapview is a tool for viewing Go heap dumps.
package main
import ( "flag" "fmt" "go/build" "io" "log" "net/http" "os" "path/filepath" )
var host = flag.String("host", "", "host addr to listen on") var port = flag.Int("port", 8080, "service port")
var index = `<!DOCTYPE html> <script src="js/customelements.js"></script> <script src="js/typescript.js"></script> <script src="js/moduleloader.js"></script> <script> System.transpiler = 'typescript'; System.typescriptOptions = {target: ts.ScriptTarget.ES2015}; System.locate = (load) => load.name + '.ts'; </script> <script type="module"> import {main} from './client/main'; main(); </script> `
func toolsDir() string { p, err := build.Import("golang.org/x/tools", "", build.FindOnly) if err != nil { log.Println("error: can't find client files:", err) os.Exit(1) } return p.Dir }
var parseFlags = func() { flag.Parse() }
var addHandlers = func() { toolsDir := toolsDir()
// Directly serve typescript code in client directory for development.
http.Handle("/client/", http.StripPrefix("/client", http.FileServer(http.Dir(filepath.Join(toolsDir, "cmd/heapview/client")))))
// Serve typescript.js and moduleloader.js for development.
http.HandleFunc("/js/typescript.js", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, filepath.Join(toolsDir, "third_party/typescript/typescript.js")) }) http.HandleFunc("/js/moduleloader.js", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, filepath.Join(toolsDir, "third_party/moduleloader/moduleloader.js")) }) http.HandleFunc("/js/customelements.js", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, filepath.Join(toolsDir, "third_party/webcomponents/customelements.js")) })
// Serve index.html using html string above.
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html") io.WriteString(w, index) }) }
var listenAndServe = func() error { return http.ListenAndServe(fmt.Sprintf("%s:%d", *host, *port), nil) }
func main() { parseFlags() addHandlers() log.Fatal(listenAndServe()) }
|