|
|
|
|
@ -4,8 +4,6 @@ |
|
|
|
|
package web |
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
"embed" |
|
|
|
|
"io/fs" |
|
|
|
|
"log" |
|
|
|
|
"net/http" |
|
|
|
|
"net/http/httputil" |
|
|
|
|
@ -15,36 +13,16 @@ import ( |
|
|
|
|
"path/filepath" |
|
|
|
|
"strings" |
|
|
|
|
|
|
|
|
|
"tailscale.com/util/must" |
|
|
|
|
prebuilt "github.com/tailscale/web-client-prebuilt" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
// This contains all files needed to build the frontend assets.
|
|
|
|
|
// Because we assign this to the blank identifier, it does not actually embed the files.
|
|
|
|
|
// However, this does cause `go mod vendor` to include the files when vendoring the package.
|
|
|
|
|
// External packages that use the web client can `go mod vendor`, run `yarn build` to
|
|
|
|
|
// build the assets, then those asset bundles will be embedded.
|
|
|
|
|
//
|
|
|
|
|
//go:embed yarn.lock index.html *.js *.json src/*
|
|
|
|
|
var _ embed.FS |
|
|
|
|
|
|
|
|
|
//go:embed build/*
|
|
|
|
|
var embeddedFS embed.FS |
|
|
|
|
|
|
|
|
|
// staticfiles serves static files from the build directory.
|
|
|
|
|
var staticfiles http.Handler |
|
|
|
|
|
|
|
|
|
func init() { |
|
|
|
|
buildFiles := must.Get(fs.Sub(embeddedFS, "build")) |
|
|
|
|
staticfiles = http.FileServer(http.FS(buildFiles)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func assetsHandler(devMode bool) (_ http.Handler, cleanup func()) { |
|
|
|
|
if devMode { |
|
|
|
|
// When in dev mode, proxy asset requests to the Vite dev server.
|
|
|
|
|
cleanup := startDevServer() |
|
|
|
|
return devServerProxy(), cleanup |
|
|
|
|
} |
|
|
|
|
return staticfiles, nil |
|
|
|
|
return http.FileServer(http.FS(prebuilt.FS())), nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// startDevServer starts the JS dev server that does on-demand rebuilding
|
|
|
|
|
|