Eric Bower
·
2025-06-08
fs.go
1package storage
2
3import (
4 "fmt"
5 "io"
6 "log/slog"
7 "net/http"
8 "os"
9 "path/filepath"
10 "strings"
11
12 sst "github.com/picosh/pico/pkg/pobj/storage"
13 "github.com/picosh/pico/pkg/shared/mime"
14)
15
16type StorageFS struct {
17 *sst.StorageFS
18 Logger *slog.Logger
19}
20
21func NewStorageFS(logger *slog.Logger, dir string) (*StorageFS, error) {
22 st, err := sst.NewStorageFS(logger, dir)
23 if err != nil {
24 return nil, err
25 }
26 return &StorageFS{st, logger}, nil
27}
28
29func (s *StorageFS) ServeObject(r *http.Request, bucket sst.Bucket, fpath string, opts *ImgProcessOpts) (io.ReadCloser, *sst.ObjectInfo, error) {
30 var rc io.ReadCloser
31 info := &sst.ObjectInfo{}
32 var err error
33 mimeType := mime.GetMimeType(fpath)
34 if !strings.HasPrefix(mimeType, "image/") || opts == nil || os.Getenv("IMGPROXY_URL") == "" {
35 rc, info, err = s.GetObject(bucket, fpath)
36 if info.Metadata == nil {
37 info.Metadata = map[string][]string{}
38 }
39 // StorageFS never returns a content-type.
40 info.Metadata.Set("content-type", mimeType)
41 } else {
42 filePath := filepath.Join(bucket.Name, fpath)
43 dataURL := fmt.Sprintf("local:///%s", filePath)
44 rc, info, err = HandleProxy(r, s.Logger, dataURL, opts)
45 }
46 if err != nil {
47 return nil, nil, err
48 }
49 return rc, info, err
50}