feat: image variants cache panel

This commit is contained in:
fsylvain committed 2026-10-08 21:13:32 +02:00
1 parent 951fef18ba
commit d768668014
53 files changed
+5809 -46

No files matched your search

@@ -55,6 +55,18 @@ type ServeVariantUseCase struct {
maxSourcePixels int64
renderSlots chan struct{}
flights singleflight.Group
tracker image.VariantUsageTracker
}
type idleUsageTracker struct{}
func (idleUsageTracker) RecordHit(string, string) {}
func (idleUsageTracker) RecordRejection() {}
func (idleUsageTracker) Flush() error { return nil }
func (u *ServeVariantUseCase) WithUsageTracker(tracker image.VariantUsageTracker) *ServeVariantUseCase {
u.tracker = tracker
return u
}
func NewServeVariantUseCase(variants image.VariantRepository, files image.VariantFileRepository, images image.Repository, storage image.Storage, renderer image.VariantRenderer, limits ServeVariantLimits) *ServeVariantUseCase {
@@ -67,10 +79,19 @@ func NewServeVariantUseCase(variants image.VariantRepository, files image.Varian
maxSourceBytes: limits.MaxSourceBytes,
maxSourcePixels: limits.MaxSourcePixels,
renderSlots: make(chan struct{}, max(1, limits.MaxConcurrentRenders)),
tracker: idleUsageTracker{},
}
}
func (u *ServeVariantUseCase) Serve(request ServeVariantRequest) (ServedVariant, error) {
served, err := u.serve(request)
if errors.Is(err, image.ErrUnknownVariant) || errors.Is(err, image.ErrUnsupportedParameter) {
u.tracker.RecordRejection()
}
return served, err
}
func (u *ServeVariantUseCase) serve(request ServeVariantRequest) (ServedVariant, error) {
if parameter := unsupportedParameter(request.Parameters); parameter != "" {
return ServedVariant{}, image.NewUnsupportedParameterError(parameter)
}
@@ -134,18 +155,26 @@ func (u *ServeVariantUseCase) serveSource(variant image.Variant, request ServeVa
settings := variant.Settings()
etag := image.VariantETag(settings, request.StoredName)
if image.ETagMatches(request.IfNoneMatch, etag) {
u.tracker.RecordHit(variant.Name, request.StoredName)
return ServedVariant{NotModified: true, ETag: etag}, nil
}
fingerprint := settings.Fingerprint()
cached, previous, hit, err := u.lookupCached(variant.Name, request.StoredName, fingerprint, etag)
if err != nil || hit {
if err == nil {
u.tracker.RecordHit(variant.Name, request.StoredName)
}
return cached, err
}
file, err := u.generated(requestContext(request), variant, request.StoredName, fingerprint, previous)
if err != nil {
return ServedVariant{}, err
}
return u.serveFile(file, etag)
served, err := u.serveFile(file, etag)
if err == nil {
u.tracker.RecordHit(variant.Name, request.StoredName)
}
return served, err
}
func requestContext(request ServeVariantRequest) context.Context {