59 lines
1.0 KiB
Go
59 lines
1.0 KiB
Go
package fs
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
"sync"
|
|
|
|
"ollie/cmd/olliesrv/internal/backend"
|
|
)
|
|
|
|
// ModelCache caches the model list from all backends.
|
|
// Created by NewRoot and used by the /models handler.
|
|
// Also invalidated by root-level /ctl.
|
|
type ModelCache struct {
|
|
mu sync.Mutex
|
|
data []byte
|
|
fetched bool
|
|
}
|
|
|
|
func NewModelCache() *ModelCache { return &ModelCache{} }
|
|
|
|
func (c *ModelCache) Get() []byte {
|
|
c.mu.Lock()
|
|
if !c.fetched {
|
|
c.mu.Unlock()
|
|
c.refresh()
|
|
c.mu.Lock()
|
|
}
|
|
defer c.mu.Unlock()
|
|
return c.data
|
|
}
|
|
|
|
func (c *ModelCache) Invalidate() {
|
|
c.mu.Lock()
|
|
c.fetched = false
|
|
c.data = nil
|
|
c.mu.Unlock()
|
|
}
|
|
|
|
func (c *ModelCache) refresh() {
|
|
var sb strings.Builder
|
|
for _, name := range backend.Backends() {
|
|
b, err := backend.NewWithName(name)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
for _, m := range b.Models(context.Background()) {
|
|
sb.WriteString(name)
|
|
sb.WriteByte('\t')
|
|
sb.WriteString(m)
|
|
sb.WriteByte('\n')
|
|
}
|
|
}
|
|
c.mu.Lock()
|
|
c.data = []byte(sb.String())
|
|
c.fetched = true
|
|
c.mu.Unlock()
|
|
}
|