|
|
|
@ -1,20 +1,31 @@
|
|
|
|
|
package uiserver
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"io"
|
|
|
|
|
"bytes"
|
|
|
|
|
"io/fs"
|
|
|
|
|
"os"
|
|
|
|
|
"time"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// bufferedFile implements fs.File and allows us to modify a file from disk by
|
|
|
|
|
// writing out the new version into a buffer and then serving file reads from
|
|
|
|
|
// that.
|
|
|
|
|
type bufferedFile struct {
|
|
|
|
|
buf io.Reader
|
|
|
|
|
buf *bytes.Buffer
|
|
|
|
|
info fs.FileInfo
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var _ fs.FileInfo = (*bufferedFile)(nil)
|
|
|
|
|
|
|
|
|
|
func newBufferedFile(buf *bytes.Buffer, info fs.FileInfo) *bufferedFile {
|
|
|
|
|
return &bufferedFile{
|
|
|
|
|
buf: buf,
|
|
|
|
|
info: info,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (b *bufferedFile) Stat() (fs.FileInfo, error) {
|
|
|
|
|
return b.info, nil
|
|
|
|
|
return b, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (b *bufferedFile) Read(bytes []byte) (int, error) {
|
|
|
|
@ -25,9 +36,26 @@ func (b *bufferedFile) Close() error {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func newBufferedFile(buf io.Reader, info fs.FileInfo) *bufferedFile {
|
|
|
|
|
return &bufferedFile{
|
|
|
|
|
buf: buf,
|
|
|
|
|
info: info,
|
|
|
|
|
func (b *bufferedFile) Name() string {
|
|
|
|
|
return b.info.Name()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (b *bufferedFile) Size() int64 {
|
|
|
|
|
return int64(b.buf.Len())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (b *bufferedFile) Mode() os.FileMode {
|
|
|
|
|
return b.info.Mode()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (b *bufferedFile) ModTime() time.Time {
|
|
|
|
|
return b.info.ModTime()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (b *bufferedFile) IsDir() bool {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (b *bufferedFile) Sys() any {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|