@@ -25,6 +25,7 @@ type SkipWriterReaderSeeker struct {
25
25
type ReWriter func (ctx context.Context , skip uint64 , w io.Writer ) (uint64 , error )
26
26
27
27
var _ io.ReadSeeker = (* SkipWriterReaderSeeker )(nil )
28
+ var _ io.Closer = (* SkipWriterReaderSeeker )(nil )
28
29
29
30
// NewSkipWriterReaderSeeker creates an io.ReadSeeker around a ReWriter.
30
31
func NewSkipWriterReaderSeeker (ctx context.Context , size uint64 , cons ReWriter ) * SkipWriterReaderSeeker {
@@ -37,7 +38,7 @@ func NewSkipWriterReaderSeeker(ctx context.Context, size uint64, cons ReWriter)
37
38
}
38
39
39
40
// Note: not threadsafe
40
- func (c * SkipWriterReaderSeeker ) Read (p []byte ) (n int , err error ) {
41
+ func (c * SkipWriterReaderSeeker ) Read (p []byte ) (int , error ) {
41
42
// Check if there's already a write in progress
42
43
if c .reader == nil {
43
44
// No write in progress, start a new write from the current offset
@@ -90,19 +91,25 @@ func (c *SkipWriterReaderSeeker) Seek(offset int64, whence int) (int64, error) {
90
91
// Cancel any ongoing write and wait for it to complete
91
92
// TODO: if we're fast-forwarding with 'SeekCurrent', we may be able to read from the current reader instead.
92
93
if c .reader != nil {
93
- c .writeCancel ()
94
-
95
- // Seek and Read should not be called concurrently so this is safe
96
- c .reader .Close ()
97
-
98
- select {
99
- case <- c .parentCtx .Done ():
100
- return 0 , c .parentCtx .Err ()
101
- case <- c .writeComplete :
102
- }
103
-
94
+ err := c .Close ()
104
95
c .reader = nil
96
+ if err != nil {
97
+ return 0 , err
98
+ }
105
99
}
106
100
107
101
return int64 (c .offset ), nil
108
102
}
103
+
104
+ func (c * SkipWriterReaderSeeker ) Close () error {
105
+ c .writeCancel ()
106
+ // Seek and Read should not be called concurrently so this is safe
107
+ c .reader .Close ()
108
+
109
+ select {
110
+ case <- c .parentCtx .Done ():
111
+ return c .parentCtx .Err ()
112
+ case <- c .writeComplete :
113
+ }
114
+ return nil
115
+ }
0 commit comments