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