116 lines
2.4 KiB
Go
116 lines
2.4 KiB
Go
package extension
|
|
|
|
import (
|
|
"seanime/internal/util/result"
|
|
"sync"
|
|
)
|
|
|
|
type UnifiedBank struct {
|
|
extensions *result.Map[string, BaseExtension]
|
|
extensionAddedCh chan struct{}
|
|
extensionRemovedCh chan struct{}
|
|
mu sync.RWMutex
|
|
}
|
|
|
|
func NewUnifiedBank() *UnifiedBank {
|
|
return &UnifiedBank{
|
|
extensions: result.NewResultMap[string, BaseExtension](),
|
|
extensionAddedCh: make(chan struct{}, 100),
|
|
extensionRemovedCh: make(chan struct{}, 100),
|
|
mu: sync.RWMutex{},
|
|
}
|
|
}
|
|
|
|
func (b *UnifiedBank) Lock() {
|
|
b.mu.Lock()
|
|
}
|
|
|
|
func (b *UnifiedBank) Unlock() {
|
|
b.mu.Unlock()
|
|
}
|
|
|
|
func (b *UnifiedBank) Reset() {
|
|
b.mu.Lock()
|
|
defer b.mu.Unlock()
|
|
b.extensions = result.NewResultMap[string, BaseExtension]()
|
|
}
|
|
|
|
func (b *UnifiedBank) RemoveExternalExtensions() {
|
|
b.mu.Lock()
|
|
defer b.mu.Unlock()
|
|
|
|
b.extensions.Range(func(id string, ext BaseExtension) bool {
|
|
if ext.GetManifestURI() != "builtin" {
|
|
b.extensions.Delete(id)
|
|
}
|
|
return true
|
|
})
|
|
}
|
|
|
|
func (b *UnifiedBank) Set(id string, ext BaseExtension) {
|
|
// Add the extension to the map
|
|
b.extensions.Set(id, ext)
|
|
|
|
// Notify listeners that an extension has been added
|
|
b.mu.Lock()
|
|
defer b.mu.Unlock()
|
|
|
|
b.extensionAddedCh <- struct{}{}
|
|
}
|
|
|
|
func (b *UnifiedBank) Get(id string) (BaseExtension, bool) {
|
|
//b.mu.RLock()
|
|
//defer b.mu.RUnlock()
|
|
return b.extensions.Get(id)
|
|
}
|
|
|
|
func (b *UnifiedBank) Delete(id string) {
|
|
// Delete the extension from the map
|
|
b.extensions.Delete(id)
|
|
|
|
// Notify listeners that an extension has been removed
|
|
b.mu.Lock()
|
|
defer b.mu.Unlock()
|
|
|
|
b.extensionRemovedCh <- struct{}{}
|
|
}
|
|
|
|
func (b *UnifiedBank) GetExtensionMap() *result.Map[string, BaseExtension] {
|
|
b.mu.RLock()
|
|
defer b.mu.RUnlock()
|
|
return b.extensions
|
|
}
|
|
|
|
func (b *UnifiedBank) Range(f func(id string, ext BaseExtension) bool) {
|
|
// No need to lock
|
|
b.extensions.Range(f)
|
|
}
|
|
|
|
func (b *UnifiedBank) OnExtensionAdded() <-chan struct{} {
|
|
return b.extensionAddedCh
|
|
}
|
|
|
|
func (b *UnifiedBank) OnExtensionRemoved() <-chan struct{} {
|
|
return b.extensionRemovedCh
|
|
}
|
|
|
|
func GetExtension[T BaseExtension](bank *UnifiedBank, id string) (ret T, ok bool) {
|
|
// No need to lock
|
|
ext, ok := bank.extensions.Get(id)
|
|
if !ok {
|
|
return
|
|
}
|
|
|
|
ret, ok = ext.(T)
|
|
return
|
|
}
|
|
|
|
func RangeExtensions[T BaseExtension](bank *UnifiedBank, f func(id string, ext T) bool) {
|
|
// No need to lock
|
|
bank.extensions.Range(func(id string, ext BaseExtension) bool {
|
|
if typedExt, ok := ext.(T); ok {
|
|
return f(id, typedExt)
|
|
}
|
|
return true
|
|
})
|
|
} |