package main import ( "embed" "flag" "fmt" "io/fs" "log" "net/http" "os" "os/signal" "strings" "syscall" ) //go:embed all:static/dist var staticFiles embed.FS func main() { port := flag.Int("port", 8080, "server port") certFile := flag.String("cert", "", "TLS certificate file (enables HTTPS)") keyFile := flag.String("key", "", "TLS key file (enables HTTPS)") flag.Parse() distFS, err := fs.Sub(staticFiles, "static/dist") if err != nil { log.Fatalf("failed to open embedded files: %v", err) } mux := http.NewServeMux() stripped, err := fs.Sub(distFS, ".") if err != nil { log.Fatalf("failed to sub: %v", err) } fileServer := http.FileServer(http.FS(stripped)) mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { if strings.HasSuffix(r.URL.Path, ".wasm") { w.Header().Set("Content-Type", "application/wasm") } fileServer.ServeHTTP(w, r) }) go func() { quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit log.Println("shutting down...") os.Exit(0) }() addr := fmt.Sprintf(":%d", *port) if *certFile != "" && *keyFile != "" { log.Printf("ncmdump-web (WASM mode) starting on https://localhost:%d", *port) if err := http.ListenAndServeTLS(addr, *certFile, *keyFile, mux); err != nil { log.Fatalf("server error: %v", err) } } else { log.Printf("ncmdump-web (WASM mode) starting on http://localhost:%d", *port) if err := http.ListenAndServe(addr, mux); err != nil { log.Fatalf("server error: %v", err) } } }