x/recorder/plugin.go
2023-04-18 20:52:56 +08:00

78 lines
1.4 KiB
Go

package recorder
import (
"context"
"github.com/go-gost/core/logger"
"github.com/go-gost/core/recorder"
"github.com/go-gost/plugin/recorder/proto"
xlogger "github.com/go-gost/x/logger"
"google.golang.org/grpc"
)
type pluginOptions struct {
client *grpc.ClientConn
logger logger.Logger
}
type PluginOption func(opts *pluginOptions)
func PluginConnOption(c *grpc.ClientConn) PluginOption {
return func(opts *pluginOptions) {
opts.client = c
}
}
func LoggerOption(logger logger.Logger) PluginOption {
return func(opts *pluginOptions) {
opts.logger = logger
}
}
type pluginRecorder struct {
client proto.RecorderClient
options pluginOptions
}
// NewPluginRecorder creates a plugin recorder.
func NewPluginRecorder(opts ...PluginOption) recorder.Recorder {
var options pluginOptions
for _, opt := range opts {
opt(&options)
}
if options.logger == nil {
options.logger = xlogger.Nop()
}
p := &pluginRecorder{
options: options,
}
if options.client != nil {
p.client = proto.NewRecorderClient(options.client)
}
return p
}
func (p *pluginRecorder) Record(ctx context.Context, b []byte) error {
if p.client == nil {
return nil
}
_, err := p.client.Record(context.Background(),
&proto.RecordRequest{
Data: b,
})
if err != nil {
p.options.logger.Error(err)
return err
}
return nil
}
func (p *pluginRecorder) Close() error {
if p.options.client != nil {
return p.options.client.Close()
}
return nil
}