repos / pico

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

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