2025-08-06 18:45:53 +02:00
|
|
|
package asyncbuffer
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"errors"
|
|
|
|
|
"io"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// Underlying Reader that provides io.ReadSeeker interface for the actual data reading
|
|
|
|
|
// What is the purpose of this Reader?
|
|
|
|
|
type Reader struct {
|
|
|
|
|
ab *AsyncBuffer
|
|
|
|
|
pos int64
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Read reads data from the AsyncBuffer.
|
|
|
|
|
func (r *Reader) Read(p []byte) (int, error) {
|
|
|
|
|
n, err := r.ab.readAt(p, r.pos)
|
|
|
|
|
if err == nil {
|
|
|
|
|
r.pos += int64(n)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return n, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Seek sets the position of the reader to the given offset and returns the new position
|
|
|
|
|
func (r *Reader) Seek(offset int64, whence int) (int64, error) {
|
|
|
|
|
switch whence {
|
|
|
|
|
case io.SeekStart:
|
|
|
|
|
r.pos = offset
|
|
|
|
|
|
|
|
|
|
case io.SeekCurrent:
|
|
|
|
|
r.pos += offset
|
|
|
|
|
|
|
|
|
|
case io.SeekEnd:
|
2025-08-19 18:59:33 +03:00
|
|
|
size := r.ab.dataLen
|
|
|
|
|
if size <= 0 {
|
|
|
|
|
var err error
|
|
|
|
|
if size, err = r.ab.Wait(); err != nil {
|
|
|
|
|
return 0, err
|
|
|
|
|
}
|
2025-08-06 18:45:53 +02:00
|
|
|
}
|
|
|
|
|
|
2025-08-11 16:09:54 +02:00
|
|
|
r.pos = int64(size) + offset
|
2025-08-06 18:45:53 +02:00
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
return 0, errors.New("asyncbuffer.AsyncBuffer.ReadAt: invalid whence")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if r.pos < 0 {
|
|
|
|
|
return 0, errors.New("asyncbuffer.AsyncBuffer.ReadAt: negative position")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return r.pos, nil
|
|
|
|
|
}
|