mirror of
https://github.com/ScuroNeko/mtg.git
synced 2026-09-01 02:44:02 +03:00
FILE / ScuroNeko/mtg
wrappers/rwc/ping.go
Исходный файл и его история в репозитории.
49 lines
866 B
Go
49 lines
866 B
Go
package rwc
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
)
|
|
|
|
type wrapperPing struct {
|
|
parent io.ReadWriteCloser
|
|
ctx context.Context
|
|
channelPing chan<- struct{}
|
|
}
|
|
|
|
func (w *wrapperPing) Read(p []byte) (int, error) {
|
|
n, err := w.parent.Read(p)
|
|
if err == nil {
|
|
select {
|
|
case <-w.ctx.Done():
|
|
case w.channelPing <- struct{}{}:
|
|
}
|
|
}
|
|
|
|
return n, err // nolint: wrapcheck
|
|
}
|
|
|
|
func (w *wrapperPing) Write(p []byte) (int, error) {
|
|
n, err := w.parent.Write(p)
|
|
if err == nil {
|
|
select {
|
|
case <-w.ctx.Done():
|
|
case w.channelPing <- struct{}{}:
|
|
}
|
|
}
|
|
|
|
return n, err // nolint: wrapcheck
|
|
}
|
|
|
|
func (w *wrapperPing) Close() error {
|
|
return w.parent.Close()
|
|
}
|
|
|
|
func NewPing(ctx context.Context, parent io.ReadWriteCloser, channelPing chan<- struct{}) io.ReadWriteCloser {
|
|
return &wrapperPing{
|
|
parent: parent,
|
|
ctx: ctx,
|
|
channelPing: channelPing,
|
|
}
|
|
}
|