| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 | // Package memory is a memory sourcepackage memoryimport (	"sync"	"time"	"github.com/google/uuid"	"gogs.baozhida.cn/zoie/OAuth-core/config/source")type memory struct {	sync.RWMutex	ChangeSet *source.ChangeSet	Watchers  map[string]*watcher}func (s *memory) Read() (*source.ChangeSet, error) {	s.RLock()	cs := &source.ChangeSet{		Format:    s.ChangeSet.Format,		Timestamp: s.ChangeSet.Timestamp,		Data:      s.ChangeSet.Data,		Checksum:  s.ChangeSet.Checksum,		Source:    s.ChangeSet.Source,	}	s.RUnlock()	return cs, nil}func (s *memory) Watch() (source.Watcher, error) {	w := &watcher{		Id:      uuid.New().String(),		Updates: make(chan *source.ChangeSet, 100),		Source:  s,	}	s.Lock()	s.Watchers[w.Id] = w	s.Unlock()	return w, nil}func (m *memory) Write(cs *source.ChangeSet) error {	m.Update(cs)	return nil}// Update allows manual updates of the config data.func (s *memory) Update(c *source.ChangeSet) {	// don't process nil	if c == nil {		return	}	// hash the file	s.Lock()	// update changeset	s.ChangeSet = &source.ChangeSet{		Data:      c.Data,		Format:    c.Format,		Source:    "memory",		Timestamp: time.Now(),	}	s.ChangeSet.Checksum = s.ChangeSet.Sum()	// update watchers	for _, w := range s.Watchers {		select {		case w.Updates <- s.ChangeSet:		default:		}	}	s.Unlock()}func (s *memory) String() string {	return "memory"}func NewSource(opts ...source.Option) source.Source {	var options source.Options	for _, o := range opts {		o(&options)	}	s := &memory{		Watchers: make(map[string]*watcher),	}	if options.Context != nil {		c, ok := options.Context.Value(changeSetKey{}).(*source.ChangeSet)		if ok {			s.Update(c)		}	}	return s}
 |