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  }