github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/pkg/assets/embedded.go (about) 1 package assets 2 3 import ( 4 "context" 5 "embed" 6 "io/fs" 7 "net/http" 8 "strconv" 9 10 "github.com/tilt-dev/tilt/pkg/logger" 11 ) 12 13 //go:embed build 14 var build embed.FS 15 16 type embeddedServer struct { 17 http.Handler 18 } 19 20 func GetEmbeddedServer() (Server, bool) { 21 var assets fs.FS 22 index, err := build.ReadFile("build/index.html") 23 if err == nil { 24 assets, err = fs.Sub(build, "build") 25 } 26 27 if err != nil { 28 return embeddedServer{}, false 29 } 30 31 return embeddedServer{Handler: serveAssets(assets, index)}, true 32 } 33 34 func (s embeddedServer) Serve(ctx context.Context) error { 35 logger.Get(ctx).Verbosef("Serving embedded Tilt production web assets") 36 <-ctx.Done() 37 return nil 38 } 39 40 func (s embeddedServer) TearDown(ctx context.Context) { 41 } 42 43 func serveAssets(assets fs.FS, index []byte) http.HandlerFunc { 44 handler := http.FileServer(http.FS(assets)) 45 return func(w http.ResponseWriter, req *http.Request) { 46 w = cacheAssets(w, req.URL.Path, req.Method) 47 if isAssetPath(req.URL.Path) { 48 handler.ServeHTTP(w, req) 49 } else { 50 w.Header().Set("Content-Type", "text/html; charset=utf-8") 51 w.Header().Set("Content-Length", strconv.Itoa(len(index))) 52 w.WriteHeader(200) 53 _, _ = w.Write(index) 54 } 55 } 56 }