You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.3 KiB
65 lines
1.3 KiB
package config |
|
|
|
import ( |
|
"context" |
|
"path/filepath" |
|
"strings" |
|
|
|
"github.com/go-kratos/kratos/v2/config" |
|
"github.com/nacos-group/nacos-sdk-go/vo" |
|
) |
|
|
|
type Watcher struct { |
|
dataID string |
|
group string |
|
content chan string |
|
cancelListenConfig cancelListenConfigFunc |
|
|
|
ctx context.Context |
|
cancel context.CancelFunc |
|
} |
|
|
|
type cancelListenConfigFunc func(params vo.ConfigParam) (err error) |
|
|
|
func newWatcher(ctx context.Context, dataID string, group string, cancelListenConfig cancelListenConfigFunc) *Watcher { |
|
ctx, cancel := context.WithCancel(ctx) |
|
w := &Watcher{ |
|
dataID: dataID, |
|
group: group, |
|
cancelListenConfig: cancelListenConfig, |
|
content: make(chan string, 100), |
|
|
|
ctx: ctx, |
|
cancel: cancel, |
|
} |
|
return w |
|
} |
|
|
|
func (w *Watcher) Next() ([]*config.KeyValue, error) { |
|
select { |
|
case <-w.ctx.Done(): |
|
return nil, w.ctx.Err() |
|
case content := <-w.content: |
|
k := w.dataID |
|
return []*config.KeyValue{ |
|
{ |
|
Key: k, |
|
Value: []byte(content), |
|
Format: strings.TrimPrefix(filepath.Ext(k), "."), |
|
}, |
|
}, nil |
|
} |
|
} |
|
|
|
func (w *Watcher) Close() error { |
|
err := w.cancelListenConfig(vo.ConfigParam{ |
|
DataId: w.dataID, |
|
Group: w.group, |
|
}) |
|
w.cancel() |
|
return err |
|
} |
|
|
|
func (w *Watcher) Stop() error { |
|
return w.Close() |
|
}
|
|
|