repos / pico

pico services mono repo
git clone https://github.com/picosh/pico.git

pico / pkg / shared / storage
Eric Bower  ·  2025-04-18

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	"github.com/picosh/pico/pkg/shared/mime"
13)
14
15type StorageFS struct {
16	*sst.StorageFS
17	Logger *slog.Logger
18}
19
20func NewStorageFS(logger *slog.Logger, dir string) (*StorageFS, error) {
21	st, err := sst.NewStorageFS(logger, dir)
22	if err != nil {
23		return nil, err
24	}
25	return &StorageFS{st, logger}, nil
26}
27
28func (s *StorageFS) ServeObject(bucket sst.Bucket, fpath string, opts *ImgProcessOpts) (io.ReadCloser, *sst.ObjectInfo, error) {
29	var rc io.ReadCloser
30	info := &sst.ObjectInfo{}
31	var err error
32	mimeType := mime.GetMimeType(fpath)
33	if !strings.HasPrefix(mimeType, "image/") || opts == nil || os.Getenv("IMGPROXY_URL") == "" {
34		rc, info, err = s.GetObject(bucket, fpath)
35		if info.Metadata == nil {
36			info.Metadata = map[string][]string{}
37		}
38		// StorageFS never returns a content-type.
39		info.Metadata.Set("content-type", mimeType)
40	} else {
41		filePath := filepath.Join(bucket.Name, fpath)
42		dataURL := fmt.Sprintf("s3://%s", filePath)
43		rc, info, err = HandleProxy(s.Logger, dataURL, opts)
44	}
45	if err != nil {
46		return nil, nil, err
47	}
48	return rc, info, err
49}