@@ 1,18 1,30 @@
package main
import (
+ "embed"
"fmt"
+ "io/fs"
"log"
"net/http"
"os"
+ "path"
"github.com/tus/tusd/pkg/filestore"
tusd "github.com/tus/tusd/pkg/handler"
)
+//go:embed public
+var embedded embed.FS
+
func main() {
err := server{
- PublicDir: http.Dir("./public"),
+ PublicDir: http.FS(fallbackFS{
+ primary: os.DirFS("./public"),
+ fallback: subFS{
+ folder: "public",
+ fs: embedded,
+ },
+ }),
UploadDir: "./upload",
Addr: ":54321",
}.run()
@@ 78,3 90,30 @@ func (s server) run() error {
log.Println("Listening on " + s.Addr)
return http.ListenAndServe(s.Addr, mux)
}
+
+type fallbackFS struct {
+ primary fs.FS
+ fallback fs.FS
+}
+
+func (fs fallbackFS) Open(name string) (fs.File, error) {
+ f, errPrimary := fs.primary.Open(name)
+ if errPrimary == nil {
+ return f, nil
+ }
+
+ f, errFallback := fs.fallback.Open(name)
+ if errFallback == nil {
+ return f, nil
+ }
+ return nil, errPrimary
+}
+
+type subFS struct {
+ folder string
+ fs fs.FS
+}
+
+func (s subFS) Open(name string) (fs.File, error) {
+ return s.fs.Open(path.Join(s.folder, name))
+}