mirror of
https://github.com/binwiederhier/ntfy.git
synced 2024-11-25 20:59:36 +01:00
35 lines
891 B
Go
35 lines
891 B
Go
|
package util
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"io"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
// ErrWriteTimeout is returned when a write timed out
|
||
|
var ErrWriteTimeout = errors.New("write operation failed due to timeout since creation")
|
||
|
|
||
|
// TimeoutWriter wraps an io.Writer that will time out after the given timeout
|
||
|
type TimeoutWriter struct {
|
||
|
writer io.Writer
|
||
|
timeout time.Duration
|
||
|
start time.Time
|
||
|
}
|
||
|
|
||
|
// NewTimeoutWriter creates a new TimeoutWriter
|
||
|
func NewTimeoutWriter(w io.Writer, timeout time.Duration) *TimeoutWriter {
|
||
|
return &TimeoutWriter{
|
||
|
writer: w,
|
||
|
timeout: timeout,
|
||
|
start: time.Now(),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Write implements the io.Writer interface, failing if called after the timeout period from creation.
|
||
|
func (tw *TimeoutWriter) Write(p []byte) (n int, err error) {
|
||
|
if time.Since(tw.start) > tw.timeout {
|
||
|
return 0, errors.New("write operation failed due to timeout since creation")
|
||
|
}
|
||
|
return tw.writer.Write(p)
|
||
|
}
|