mirror of https://github.com/XTLS/Xray-core
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.
53 lines
934 B
53 lines
934 B
package kcp |
|
|
|
import ( |
|
"io" |
|
"sync" |
|
|
|
"github.com/xtls/xray-core/common/buf" |
|
"github.com/xtls/xray-core/common/retry" |
|
) |
|
|
|
type SegmentWriter interface { |
|
Write(seg Segment) error |
|
} |
|
|
|
type SimpleSegmentWriter struct { |
|
sync.Mutex |
|
buffer *buf.Buffer |
|
writer io.Writer |
|
} |
|
|
|
func NewSegmentWriter(writer io.Writer) SegmentWriter { |
|
return &SimpleSegmentWriter{ |
|
writer: writer, |
|
buffer: buf.New(), |
|
} |
|
} |
|
|
|
func (w *SimpleSegmentWriter) Write(seg Segment) error { |
|
w.Lock() |
|
defer w.Unlock() |
|
|
|
w.buffer.Clear() |
|
rawBytes := w.buffer.Extend(seg.ByteSize()) |
|
seg.Serialize(rawBytes) |
|
_, err := w.writer.Write(w.buffer.Bytes()) |
|
return err |
|
} |
|
|
|
type RetryableWriter struct { |
|
writer SegmentWriter |
|
} |
|
|
|
func NewRetryableWriter(writer SegmentWriter) SegmentWriter { |
|
return &RetryableWriter{ |
|
writer: writer, |
|
} |
|
} |
|
|
|
func (w *RetryableWriter) Write(seg Segment) error { |
|
return retry.Timed(5, 100).On(func() error { |
|
return w.writer.Write(seg) |
|
}) |
|
}
|
|
|