2021-01-13 16:59:08 +00:00
|
|
|
package sink
|
|
|
|
|
|
|
|
import "gitlab.com/inetmock/inetmock/pkg/audit"
|
2021-01-02 16:24:06 +00:00
|
|
|
|
|
|
|
type WriterSinkOption func(sink *writerCloserSink)
|
|
|
|
|
|
|
|
var (
|
|
|
|
WithCloseOnExit WriterSinkOption = func(sink *writerCloserSink) {
|
|
|
|
sink.closeOnExit = true
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
2021-01-13 16:59:08 +00:00
|
|
|
func NewWriterSink(name string, target audit.Writer, opts ...WriterSinkOption) audit.Sink {
|
2021-01-02 16:24:06 +00:00
|
|
|
sink := &writerCloserSink{
|
|
|
|
name: name,
|
|
|
|
target: target,
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, opt := range opts {
|
|
|
|
opt(sink)
|
|
|
|
}
|
|
|
|
|
|
|
|
return sink
|
|
|
|
}
|
|
|
|
|
|
|
|
type writerCloserSink struct {
|
|
|
|
name string
|
2021-01-13 16:59:08 +00:00
|
|
|
target audit.Writer
|
2021-01-02 16:24:06 +00:00
|
|
|
closeOnExit bool
|
|
|
|
}
|
|
|
|
|
|
|
|
func (f writerCloserSink) Name() string {
|
|
|
|
return f.name
|
|
|
|
}
|
|
|
|
|
2021-01-13 20:38:52 +00:00
|
|
|
func (f writerCloserSink) OnSubscribe(evs <-chan audit.Event, _ audit.CloseHandle) {
|
2021-01-13 16:59:08 +00:00
|
|
|
go func(target audit.Writer, closeOnExit bool, evs <-chan audit.Event) {
|
2021-01-02 16:24:06 +00:00
|
|
|
for ev := range evs {
|
|
|
|
_ = target.Write(&ev)
|
|
|
|
}
|
|
|
|
if closeOnExit {
|
|
|
|
_ = target.Close()
|
|
|
|
}
|
|
|
|
}(f.target, f.closeOnExit, evs)
|
|
|
|
}
|