repos / pico

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

pico / pkg / shared / storage
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}