53 lines
1.1 KiB
Go
53 lines
1.1 KiB
Go
package builder
|
|
|
|
import (
|
|
"openreplay/backend/internal/handlers"
|
|
. "openreplay/backend/pkg/messages"
|
|
)
|
|
|
|
type builder struct {
|
|
readyMsgs []Message
|
|
timestamp uint64
|
|
processors []handlers.MessageProcessor
|
|
ended bool
|
|
}
|
|
|
|
func NewBuilder(handlers ...handlers.MessageProcessor) *builder {
|
|
return &builder{
|
|
processors: handlers,
|
|
}
|
|
}
|
|
|
|
func (b *builder) iterateReadyMessages(iter func(msg Message)) {
|
|
for _, readyMsg := range b.readyMsgs {
|
|
iter(readyMsg)
|
|
}
|
|
b.readyMsgs = nil
|
|
}
|
|
|
|
func (b *builder) checkSessionEnd(message Message) {
|
|
if _, isEnd := message.(*IOSSessionEnd); isEnd {
|
|
b.ended = true
|
|
}
|
|
if _, isEnd := message.(*SessionEnd); isEnd {
|
|
b.ended = true
|
|
}
|
|
}
|
|
|
|
func (b *builder) handleMessage(message Message, messageID uint64) {
|
|
timestamp := GetTimestamp(message)
|
|
if b.timestamp < timestamp {
|
|
b.timestamp = timestamp
|
|
}
|
|
if b.timestamp == 0 {
|
|
// in case of SessionStart. TODO: make timestamp system transparent
|
|
return
|
|
}
|
|
|
|
for _, p := range b.processors {
|
|
if rm := p.Handle(message, messageID, b.timestamp); rm != nil {
|
|
b.readyMsgs = append(b.readyMsgs, rm)
|
|
}
|
|
}
|
|
b.checkSessionEnd(message)
|
|
}
|