openreplay/backend/internal/sink/sessionwriter/session.go
Alexander 43b042aef8
[Sink] new message iterator (#945)
* feat(backend): implemented new version of sink message iterator
2023-01-20 09:49:49 +01:00

74 lines
1.2 KiB
Go

package sessionwriter
import (
"fmt"
"strconv"
"sync"
)
type Session struct {
lock *sync.Mutex
dom *File
dev *File
updated bool
}
func NewSession(sessID uint64, workDir string, bufSize int) (*Session, error) {
if sessID == 0 {
return nil, fmt.Errorf("wrong session id")
}
filePath := workDir + strconv.FormatUint(sessID, 10)
dom, err := NewFile(filePath, bufSize)
if err != nil {
return nil, err
}
dev, err := NewFile(filePath+"devtools", bufSize)
if err != nil {
dom.Close()
return nil, err
}
return &Session{
lock: &sync.Mutex{},
dom: dom,
dev: dev,
updated: false,
}, nil
}
func (s *Session) Write(domBuffer, devBuffer []byte) error {
s.lock.Lock()
defer s.lock.Unlock()
// Write dom buffer to the file (file buffer)
if err := s.dom.Write(domBuffer); err != nil {
return err
}
// Write dev buffer to the file (file buffer)
if err := s.dev.Write(devBuffer); err != nil {
return err
}
return nil
}
func (s *Session) Sync() error {
s.lock.Lock()
defer s.lock.Unlock()
if err := s.dom.Sync(); err != nil {
return err
}
return s.dev.Sync()
}
func (s *Session) Close() error {
s.lock.Lock()
defer s.lock.Unlock()
if err := s.dom.Close(); err != nil {
return err
}
return s.dev.Close()
}