diff --git a/backend/pkg/messages/bytes.go b/backend/pkg/messages/bytes.go new file mode 100644 index 000000000..0576201ea --- /dev/null +++ b/backend/pkg/messages/bytes.go @@ -0,0 +1,119 @@ +package messages + +import ( + "errors" + "fmt" + "io" +) + +type BytesReader interface { + ReadSize() (uint64, error) + ReadByte() (byte, error) + ReadUint() (uint64, error) + ReadInt() (int64, error) + ReadBoolean() (bool, error) + ReadString() (string, error) + Data() []byte + Pointer() int64 + SetPointer(p int64) +} + +type bytesReaderImpl struct { + data []byte + curr int64 +} + +func NewBytesReader(data []byte) BytesReader { + return &bytesReaderImpl{ + data: data, + } +} + +func (m *bytesReaderImpl) ReadSize() (uint64, error) { + if len(m.data)-int(m.curr) < 3 { + return 0, fmt.Errorf("out of range") + } + var size uint64 + for i, b := range m.data[m.curr : m.curr+3] { + size += uint64(b) << (8 * i) + } + m.curr += 3 + return size, nil +} + +func (m *bytesReaderImpl) ReadByte() (byte, error) { + if int(m.curr) >= len(m.data) { + return 0, io.EOF + } + m.curr++ + return m.data[m.curr-1], nil +} + +func (m *bytesReaderImpl) ReadUint() (uint64, error) { + var x uint64 + var s uint + i := 0 + for { + b, err := m.ReadByte() + if err != nil { + return x, err + } + if b < 0x80 { + if i > 9 || i == 9 && b > 1 { + return x, errors.New("uint overflow") + } + return x | uint64(b)<> 1) + if err != nil { + return x, err + } + if ux&1 != 0 { + x = ^x + } + return x, err +} + +func (m *bytesReaderImpl) ReadBoolean() (bool, error) { + val, err := m.ReadByte() + if err != nil { + return false, err + } + return val == 1, nil +} + +func (m *bytesReaderImpl) ReadString() (string, error) { + l, err := m.ReadUint() + if err != nil { + return "", err + } + if l > 10e6 { + return "", errors.New("too long string") + } + if len(m.data)-int(m.curr) < int(l) { + return "", fmt.Errorf("out of range") + } + str := string(m.data[m.curr : int(m.curr)+int(l)]) + m.curr += int64(l) + return str, nil +} + +func (m *bytesReaderImpl) Data() []byte { + return m.data +} + +func (m *bytesReaderImpl) Pointer() int64 { + return m.curr +} + +func (m *bytesReaderImpl) SetPointer(p int64) { + m.curr = p +} diff --git a/backend/pkg/messages/iterator.go b/backend/pkg/messages/iterator.go index 7b7991b19..86e3e6cc8 100644 --- a/backend/pkg/messages/iterator.go +++ b/backend/pkg/messages/iterator.go @@ -1,9 +1,7 @@ package messages import ( - "bytes" "fmt" - "io" "log" ) @@ -54,76 +52,32 @@ func (i *messageIteratorImpl) prepareVars(batchInfo *BatchInfo) { } func (i *messageIteratorImpl) Iterate(batchData []byte, batchInfo *BatchInfo) { + // Create new message reader + reader := NewMessageReader(batchData) + + // Pre-decode batch data + if err := reader.Parse(); err != nil { + log.Printf("pre-decode batch err: %s, info: %s", err, batchInfo.Info()) + return + } + // Prepare iterator before processing messages in batch i.prepareVars(batchInfo) - // Initialize batch reader - reader := bytes.NewReader(batchData) - - // Process until end of batch or parsing error - for { + for reader.Next() { // Increase message index (can be overwritten by batch info message) i.messageInfo.Index++ - if i.broken { - log.Printf("skipping broken batch, info: %s", i.batchInfo.Info()) - return - } - - if i.canSkip { - if _, err := reader.Seek(int64(i.size), io.SeekCurrent); err != nil { - log.Printf("can't skip message: %s, info: %s", err, i.batchInfo.Info()) - return - } - } - i.canSkip = false - - // Read message type - msgType, err := ReadUint(reader) - if err != nil { - if err != io.EOF { - log.Printf("can't read message type: %s, info: %s", err, i.batchInfo.Info()) - } - return - } - - var msg Message - // Read message body (and decode if protocol version less than 1) - if i.version > 0 && messageHasSize(msgType) { - // Read message size if it is a new protocol version - i.size, err = ReadSize(reader) - if err != nil { - log.Printf("can't read message size: %s, info: %s", err, i.batchInfo.Info()) - return - } - msg = &RawMessage{ - tp: msgType, - size: i.size, - reader: reader, - raw: batchData, - skipped: &i.canSkip, - broken: &i.broken, - meta: i.messageInfo, - } - i.canSkip = true - } else { - msg, err = ReadMessage(msgType, reader) - if err != nil { - if err != io.EOF { - log.Printf("can't read message body: %s, info: %s", err, i.batchInfo.Info()) - } - return - } - msg = transformDeprecated(msg) - } + msg := reader.Message() // Preprocess "system" messages if _, ok := i.preFilter[msg.TypeID()]; ok { msg = msg.Decode() if msg == nil { - log.Printf("decode error, type: %d, info: %s", msgType, i.batchInfo.Info()) + log.Printf("decode error, type: %d, info: %s", msg.TypeID(), i.batchInfo.Info()) return } + msg = transformDeprecated(msg) if err := i.preprocessing(msg); err != nil { log.Printf("message preprocessing err: %s", err) return @@ -140,7 +94,7 @@ func (i *messageIteratorImpl) Iterate(batchData []byte, batchInfo *BatchInfo) { if i.autoDecode { msg = msg.Decode() if msg == nil { - log.Printf("decode error, type: %d, info: %s", msgType, i.batchInfo.Info()) + log.Printf("decode error, type: %d, info: %s", msg.TypeID(), i.batchInfo.Info()) return } } diff --git a/backend/pkg/messages/raw.go b/backend/pkg/messages/raw.go index 941828e02..44f666c69 100644 --- a/backend/pkg/messages/raw.go +++ b/backend/pkg/messages/raw.go @@ -1,58 +1,23 @@ package messages import ( - "bytes" - "io" "log" ) // RawMessage is a not decoded message type RawMessage struct { - tp uint64 - size uint64 - data []byte - reader *bytes.Reader - raw []byte - meta *message - encoded bool - skipped *bool - broken *bool + tp uint64 + data []byte + broken *bool + meta *message } func (m *RawMessage) Encode() []byte { - if m.encoded { - return m.data - } - // Try to avoid EOF error - if m.reader.Len() < int(m.size) { - return nil - } - // Get current batch position - currPos, err := m.reader.Seek(0, io.SeekCurrent) - if err != nil { - log.Printf("can't get current batch position: %s", err) - return nil - } - // "Move" message type - if currPos == 0 { - log.Printf("can't move message type, curr position = %d", currPos) - return nil - } - // Dirty hack to avoid extra memory allocation - m.raw[currPos-1] = uint8(m.tp) - m.data = m.raw[currPos-1 : currPos+int64(m.size)] - m.encoded = true return m.data } func (m *RawMessage) Decode() Message { - if !m.encoded { - if m.Encode() == nil { - *m.broken = true - return nil - } - } - msg, err := ReadMessage(m.tp, bytes.NewReader(m.data[1:])) + msg, err := ReadMessage(m.tp, NewBytesReader(m.data[1:])) if err != nil { log.Printf("decode err: %s", err) *m.broken = true diff --git a/backend/pkg/messages/read-message.go b/backend/pkg/messages/read-message.go index aa8738966..a55bea163 100644 --- a/backend/pkg/messages/read-message.go +++ b/backend/pkg/messages/read-message.go @@ -3,1754 +3,1753 @@ package messages import ( "fmt" - "io" ) -func DecodeBatchMeta(reader io.Reader) (Message, error) { - var err error = nil - msg := &BatchMeta{} - if msg.PageNo, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.FirstIndex, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Timestamp, err = ReadInt(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeBatchMetadata(reader io.Reader) (Message, error) { - var err error = nil - msg := &BatchMetadata{} - if msg.Version, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.PageNo, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.FirstIndex, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Timestamp, err = ReadInt(reader); err != nil { - return nil, err - } - if msg.Location, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodePartitionedMessage(reader io.Reader) (Message, error) { - var err error = nil - msg := &PartitionedMessage{} - if msg.PartNo, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.PartTotal, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeTimestamp(reader io.Reader) (Message, error) { - var err error = nil - msg := &Timestamp{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeSessionStart(reader io.Reader) (Message, error) { - var err error = nil - msg := &SessionStart{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ProjectID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.TrackerVersion, err = ReadString(reader); err != nil { - return nil, err - } - if msg.RevID, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserUUID, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserAgent, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserOS, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserOSVersion, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserBrowser, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserBrowserVersion, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserDevice, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserDeviceType, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserDeviceMemorySize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.UserDeviceHeapSize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.UserCountry, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserID, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeSessionEndDeprecated(reader io.Reader) (Message, error) { - var err error = nil - msg := &SessionEndDeprecated{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeSetPageLocation(reader io.Reader) (Message, error) { - var err error = nil - msg := &SetPageLocation{} - if msg.URL, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Referrer, err = ReadString(reader); err != nil { - return nil, err - } - if msg.NavigationStart, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeSetViewportSize(reader io.Reader) (Message, error) { - var err error = nil - msg := &SetViewportSize{} - if msg.Width, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Height, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeSetViewportScroll(reader io.Reader) (Message, error) { - var err error = nil - msg := &SetViewportScroll{} - if msg.X, err = ReadInt(reader); err != nil { - return nil, err - } - if msg.Y, err = ReadInt(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeCreateDocument(reader io.Reader) (Message, error) { - var err error = nil - msg := &CreateDocument{} - - return msg, err -} - -func DecodeCreateElementNode(reader io.Reader) (Message, error) { - var err error = nil - msg := &CreateElementNode{} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ParentID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.index, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Tag, err = ReadString(reader); err != nil { - return nil, err - } - if msg.SVG, err = ReadBoolean(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeCreateTextNode(reader io.Reader) (Message, error) { - var err error = nil - msg := &CreateTextNode{} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ParentID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Index, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeMoveNode(reader io.Reader) (Message, error) { - var err error = nil - msg := &MoveNode{} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ParentID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Index, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeRemoveNode(reader io.Reader) (Message, error) { - var err error = nil - msg := &RemoveNode{} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeSetNodeAttribute(reader io.Reader) (Message, error) { - var err error = nil - msg := &SetNodeAttribute{} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeRemoveNodeAttribute(reader io.Reader) (Message, error) { - var err error = nil - msg := &RemoveNodeAttribute{} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeSetNodeData(reader io.Reader) (Message, error) { - var err error = nil - msg := &SetNodeData{} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Data, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeSetCSSData(reader io.Reader) (Message, error) { - var err error = nil - msg := &SetCSSData{} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Data, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeSetNodeScroll(reader io.Reader) (Message, error) { - var err error = nil - msg := &SetNodeScroll{} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.X, err = ReadInt(reader); err != nil { - return nil, err - } - if msg.Y, err = ReadInt(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeSetInputTarget(reader io.Reader) (Message, error) { - var err error = nil - msg := &SetInputTarget{} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Label, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeSetInputValue(reader io.Reader) (Message, error) { - var err error = nil - msg := &SetInputValue{} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Mask, err = ReadInt(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeSetInputChecked(reader io.Reader) (Message, error) { - var err error = nil - msg := &SetInputChecked{} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Checked, err = ReadBoolean(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeMouseMove(reader io.Reader) (Message, error) { - var err error = nil - msg := &MouseMove{} - if msg.X, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Y, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeConsoleLog(reader io.Reader) (Message, error) { - var err error = nil - msg := &ConsoleLog{} - if msg.Level, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodePageLoadTiming(reader io.Reader) (Message, error) { - var err error = nil - msg := &PageLoadTiming{} - if msg.RequestStart, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ResponseStart, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ResponseEnd, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.DomContentLoadedEventStart, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.DomContentLoadedEventEnd, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.LoadEventStart, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.LoadEventEnd, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.FirstPaint, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.FirstContentfulPaint, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodePageRenderTiming(reader io.Reader) (Message, error) { - var err error = nil - msg := &PageRenderTiming{} - if msg.SpeedIndex, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.VisuallyComplete, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.TimeToInteractive, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeJSExceptionDeprecated(reader io.Reader) (Message, error) { - var err error = nil - msg := &JSExceptionDeprecated{} - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Message, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Payload, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeIntegrationEvent(reader io.Reader) (Message, error) { - var err error = nil - msg := &IntegrationEvent{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Source, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Message, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Payload, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeRawCustomEvent(reader io.Reader) (Message, error) { - var err error = nil - msg := &RawCustomEvent{} - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Payload, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeUserID(reader io.Reader) (Message, error) { - var err error = nil - msg := &UserID{} - if msg.ID, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeUserAnonymousID(reader io.Reader) (Message, error) { - var err error = nil - msg := &UserAnonymousID{} - if msg.ID, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeMetadata(reader io.Reader) (Message, error) { - var err error = nil - msg := &Metadata{} - if msg.Key, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodePageEvent(reader io.Reader) (Message, error) { - var err error = nil - msg := &PageEvent{} - if msg.MessageID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.URL, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Referrer, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Loaded, err = ReadBoolean(reader); err != nil { - return nil, err - } - if msg.RequestStart, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ResponseStart, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ResponseEnd, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.DomContentLoadedEventStart, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.DomContentLoadedEventEnd, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.LoadEventStart, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.LoadEventEnd, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.FirstPaint, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.FirstContentfulPaint, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.SpeedIndex, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.VisuallyComplete, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.TimeToInteractive, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeInputEvent(reader io.Reader) (Message, error) { - var err error = nil - msg := &InputEvent{} - if msg.MessageID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadString(reader); err != nil { - return nil, err - } - if msg.ValueMasked, err = ReadBoolean(reader); err != nil { - return nil, err - } - if msg.Label, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeClickEvent(reader io.Reader) (Message, error) { - var err error = nil - msg := &ClickEvent{} - if msg.MessageID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.HesitationTime, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Label, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Selector, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeResourceEvent(reader io.Reader) (Message, error) { - var err error = nil - msg := &ResourceEvent{} - if msg.MessageID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Duration, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.TTFB, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.HeaderSize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.EncodedBodySize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.DecodedBodySize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.URL, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Type, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Success, err = ReadBoolean(reader); err != nil { - return nil, err - } - if msg.Method, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Status, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeCustomEvent(reader io.Reader) (Message, error) { - var err error = nil - msg := &CustomEvent{} - if msg.MessageID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Payload, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeCSSInsertRule(reader io.Reader) (Message, error) { - var err error = nil - msg := &CSSInsertRule{} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Rule, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Index, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeCSSDeleteRule(reader io.Reader) (Message, error) { - var err error = nil - msg := &CSSDeleteRule{} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Index, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeFetch(reader io.Reader) (Message, error) { - var err error = nil - msg := &Fetch{} - if msg.Method, err = ReadString(reader); err != nil { - return nil, err - } - if msg.URL, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Request, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Response, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Status, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Duration, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeProfiler(reader io.Reader) (Message, error) { - var err error = nil - msg := &Profiler{} - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Duration, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Args, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Result, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeOTable(reader io.Reader) (Message, error) { - var err error = nil - msg := &OTable{} - if msg.Key, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeStateAction(reader io.Reader) (Message, error) { - var err error = nil - msg := &StateAction{} - if msg.Type, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeStateActionEvent(reader io.Reader) (Message, error) { - var err error = nil - msg := &StateActionEvent{} - if msg.MessageID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Type, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeRedux(reader io.Reader) (Message, error) { - var err error = nil - msg := &Redux{} - if msg.Action, err = ReadString(reader); err != nil { - return nil, err - } - if msg.State, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Duration, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeVuex(reader io.Reader) (Message, error) { - var err error = nil - msg := &Vuex{} - if msg.Mutation, err = ReadString(reader); err != nil { - return nil, err - } - if msg.State, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeMobX(reader io.Reader) (Message, error) { - var err error = nil - msg := &MobX{} - if msg.Type, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Payload, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeNgRx(reader io.Reader) (Message, error) { - var err error = nil - msg := &NgRx{} - if msg.Action, err = ReadString(reader); err != nil { - return nil, err - } - if msg.State, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Duration, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeGraphQL(reader io.Reader) (Message, error) { - var err error = nil - msg := &GraphQL{} - if msg.OperationKind, err = ReadString(reader); err != nil { - return nil, err - } - if msg.OperationName, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Variables, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Response, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodePerformanceTrack(reader io.Reader) (Message, error) { - var err error = nil - msg := &PerformanceTrack{} - if msg.Frames, err = ReadInt(reader); err != nil { - return nil, err - } - if msg.Ticks, err = ReadInt(reader); err != nil { - return nil, err - } - if msg.TotalJSHeapSize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.UsedJSHeapSize, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeGraphQLEvent(reader io.Reader) (Message, error) { - var err error = nil - msg := &GraphQLEvent{} - if msg.MessageID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.OperationKind, err = ReadString(reader); err != nil { - return nil, err - } - if msg.OperationName, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Variables, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Response, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeFetchEvent(reader io.Reader) (Message, error) { - var err error = nil - msg := &FetchEvent{} - if msg.MessageID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Method, err = ReadString(reader); err != nil { - return nil, err - } - if msg.URL, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Request, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Response, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Status, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Duration, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeDOMDrop(reader io.Reader) (Message, error) { - var err error = nil - msg := &DOMDrop{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeResourceTiming(reader io.Reader) (Message, error) { - var err error = nil - msg := &ResourceTiming{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Duration, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.TTFB, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.HeaderSize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.EncodedBodySize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.DecodedBodySize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.URL, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Initiator, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeConnectionInformation(reader io.Reader) (Message, error) { - var err error = nil - msg := &ConnectionInformation{} - if msg.Downlink, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Type, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeSetPageVisibility(reader io.Reader) (Message, error) { - var err error = nil - msg := &SetPageVisibility{} - if msg.hidden, err = ReadBoolean(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodePerformanceTrackAggr(reader io.Reader) (Message, error) { - var err error = nil - msg := &PerformanceTrackAggr{} - if msg.TimestampStart, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.TimestampEnd, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MinFPS, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.AvgFPS, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MaxFPS, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MinCPU, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.AvgCPU, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MaxCPU, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MinTotalJSHeapSize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.AvgTotalJSHeapSize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MaxTotalJSHeapSize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MinUsedJSHeapSize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.AvgUsedJSHeapSize, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MaxUsedJSHeapSize, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeLoadFontFace(reader io.Reader) (Message, error) { - var err error = nil - msg := &LoadFontFace{} - if msg.ParentID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Family, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Source, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Descriptors, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeSetNodeFocus(reader io.Reader) (Message, error) { - var err error = nil - msg := &SetNodeFocus{} - if msg.ID, err = ReadInt(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeLongTask(reader io.Reader) (Message, error) { - var err error = nil - msg := &LongTask{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Duration, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Context, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ContainerType, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ContainerSrc, err = ReadString(reader); err != nil { - return nil, err - } - if msg.ContainerId, err = ReadString(reader); err != nil { - return nil, err - } - if msg.ContainerName, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeSetNodeAttributeURLBased(reader io.Reader) (Message, error) { - var err error = nil - msg := &SetNodeAttributeURLBased{} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadString(reader); err != nil { - return nil, err - } - if msg.BaseURL, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeSetCSSDataURLBased(reader io.Reader) (Message, error) { - var err error = nil - msg := &SetCSSDataURLBased{} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Data, err = ReadString(reader); err != nil { - return nil, err - } - if msg.BaseURL, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeIssueEvent(reader io.Reader) (Message, error) { - var err error = nil - msg := &IssueEvent{} - if msg.MessageID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Type, err = ReadString(reader); err != nil { - return nil, err - } - if msg.ContextString, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Context, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Payload, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeTechnicalInfo(reader io.Reader) (Message, error) { - var err error = nil - msg := &TechnicalInfo{} - if msg.Type, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeCustomIssue(reader io.Reader) (Message, error) { - var err error = nil - msg := &CustomIssue{} - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Payload, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeAssetCache(reader io.Reader) (Message, error) { - var err error = nil - msg := &AssetCache{} - if msg.URL, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeCSSInsertRuleURLBased(reader io.Reader) (Message, error) { - var err error = nil - msg := &CSSInsertRuleURLBased{} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Rule, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Index, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.BaseURL, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeMouseClick(reader io.Reader) (Message, error) { - var err error = nil - msg := &MouseClick{} - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.HesitationTime, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Label, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Selector, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeCreateIFrameDocument(reader io.Reader) (Message, error) { - var err error = nil - msg := &CreateIFrameDocument{} - if msg.FrameID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeAdoptedSSReplaceURLBased(reader io.Reader) (Message, error) { - var err error = nil - msg := &AdoptedSSReplaceURLBased{} - if msg.SheetID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Text, err = ReadString(reader); err != nil { - return nil, err - } - if msg.BaseURL, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeAdoptedSSReplace(reader io.Reader) (Message, error) { - var err error = nil - msg := &AdoptedSSReplace{} - if msg.SheetID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Text, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeAdoptedSSInsertRuleURLBased(reader io.Reader) (Message, error) { - var err error = nil - msg := &AdoptedSSInsertRuleURLBased{} - if msg.SheetID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Rule, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Index, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.BaseURL, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeAdoptedSSInsertRule(reader io.Reader) (Message, error) { - var err error = nil - msg := &AdoptedSSInsertRule{} - if msg.SheetID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Rule, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Index, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeAdoptedSSDeleteRule(reader io.Reader) (Message, error) { - var err error = nil - msg := &AdoptedSSDeleteRule{} - if msg.SheetID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Index, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeAdoptedSSAddOwner(reader io.Reader) (Message, error) { - var err error = nil - msg := &AdoptedSSAddOwner{} - if msg.SheetID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeAdoptedSSRemoveOwner(reader io.Reader) (Message, error) { - var err error = nil - msg := &AdoptedSSRemoveOwner{} - if msg.SheetID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ID, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeZustand(reader io.Reader) (Message, error) { - var err error = nil - msg := &Zustand{} - if msg.Mutation, err = ReadString(reader); err != nil { - return nil, err - } - if msg.State, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeJSException(reader io.Reader) (Message, error) { - var err error = nil - msg := &JSException{} - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Message, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Payload, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Metadata, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeSessionEnd(reader io.Reader) (Message, error) { - var err error = nil - msg := &SessionEnd{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.EncryptionKey, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeSessionSearch(reader io.Reader) (Message, error) { - var err error = nil - msg := &SessionSearch{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Partition, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeIOSBatchMeta(reader io.Reader) (Message, error) { - var err error = nil - msg := &IOSBatchMeta{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.FirstIndex, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeIOSSessionStart(reader io.Reader) (Message, error) { - var err error = nil - msg := &IOSSessionStart{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.ProjectID, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.TrackerVersion, err = ReadString(reader); err != nil { - return nil, err - } - if msg.RevID, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserUUID, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserOS, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserOSVersion, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserDevice, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserDeviceType, err = ReadString(reader); err != nil { - return nil, err - } - if msg.UserCountry, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeIOSSessionEnd(reader io.Reader) (Message, error) { - var err error = nil - msg := &IOSSessionEnd{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeIOSMetadata(reader io.Reader) (Message, error) { - var err error = nil - msg := &IOSMetadata{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Key, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeIOSCustomEvent(reader io.Reader) (Message, error) { - var err error = nil - msg := &IOSCustomEvent{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Payload, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeIOSUserID(reader io.Reader) (Message, error) { - var err error = nil - msg := &IOSUserID{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeIOSUserAnonymousID(reader io.Reader) (Message, error) { - var err error = nil - msg := &IOSUserAnonymousID{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeIOSScreenChanges(reader io.Reader) (Message, error) { - var err error = nil - msg := &IOSScreenChanges{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.X, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Y, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Width, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Height, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeIOSCrash(reader io.Reader) (Message, error) { - var err error = nil - msg := &IOSCrash{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Reason, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Stacktrace, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeIOSScreenEnter(reader io.Reader) (Message, error) { - var err error = nil - msg := &IOSScreenEnter{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Title, err = ReadString(reader); err != nil { - return nil, err - } - if msg.ViewName, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeIOSScreenLeave(reader io.Reader) (Message, error) { - var err error = nil - msg := &IOSScreenLeave{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Title, err = ReadString(reader); err != nil { - return nil, err - } - if msg.ViewName, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeIOSClickEvent(reader io.Reader) (Message, error) { - var err error = nil - msg := &IOSClickEvent{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Label, err = ReadString(reader); err != nil { - return nil, err - } - if msg.X, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Y, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeIOSInputEvent(reader io.Reader) (Message, error) { - var err error = nil - msg := &IOSInputEvent{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadString(reader); err != nil { - return nil, err - } - if msg.ValueMasked, err = ReadBoolean(reader); err != nil { - return nil, err - } - if msg.Label, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeIOSPerformanceEvent(reader io.Reader) (Message, error) { - var err error = nil - msg := &IOSPerformanceEvent{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Name, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Value, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeIOSLog(reader io.Reader) (Message, error) { - var err error = nil - msg := &IOSLog{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Severity, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Content, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeIOSInternalError(reader io.Reader) (Message, error) { - var err error = nil - msg := &IOSInternalError{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Content, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeIOSNetworkCall(reader io.Reader) (Message, error) { - var err error = nil - msg := &IOSNetworkCall{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Length, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Duration, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Headers, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Body, err = ReadString(reader); err != nil { - return nil, err - } - if msg.URL, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Success, err = ReadBoolean(reader); err != nil { - return nil, err - } - if msg.Method, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Status, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeIOSPerformanceAggregated(reader io.Reader) (Message, error) { - var err error = nil - msg := &IOSPerformanceAggregated{} - if msg.TimestampStart, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.TimestampEnd, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MinFPS, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.AvgFPS, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MaxFPS, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MinCPU, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.AvgCPU, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MaxCPU, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MinMemory, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.AvgMemory, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MaxMemory, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MinBattery, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.AvgBattery, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.MaxBattery, err = ReadUint(reader); err != nil { - return nil, err - } - return msg, err -} - -func DecodeIOSIssueEvent(reader io.Reader) (Message, error) { - var err error = nil - msg := &IOSIssueEvent{} - if msg.Timestamp, err = ReadUint(reader); err != nil { - return nil, err - } - if msg.Type, err = ReadString(reader); err != nil { - return nil, err - } - if msg.ContextString, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Context, err = ReadString(reader); err != nil { - return nil, err - } - if msg.Payload, err = ReadString(reader); err != nil { - return nil, err - } - return msg, err -} - -func ReadMessage(t uint64, reader io.Reader) (Message, error) { +func DecodeBatchMeta(reader BytesReader) (Message, error) { + var err error = nil + msg := &BatchMeta{} + if msg.PageNo, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.FirstIndex, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Timestamp, err = reader.ReadInt(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeBatchMetadata(reader BytesReader) (Message, error) { + var err error = nil + msg := &BatchMetadata{} + if msg.Version, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.PageNo, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.FirstIndex, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Timestamp, err = reader.ReadInt(); err != nil { + return nil, err + } + if msg.Location, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodePartitionedMessage(reader BytesReader) (Message, error) { + var err error = nil + msg := &PartitionedMessage{} + if msg.PartNo, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.PartTotal, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeTimestamp(reader BytesReader) (Message, error) { + var err error = nil + msg := &Timestamp{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeSessionStart(reader BytesReader) (Message, error) { + var err error = nil + msg := &SessionStart{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.ProjectID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.TrackerVersion, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.RevID, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.UserUUID, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.UserAgent, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.UserOS, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.UserOSVersion, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.UserBrowser, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.UserBrowserVersion, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.UserDevice, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.UserDeviceType, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.UserDeviceMemorySize, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.UserDeviceHeapSize, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.UserCountry, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.UserID, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeSessionEndDeprecated(reader BytesReader) (Message, error) { + var err error = nil + msg := &SessionEndDeprecated{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeSetPageLocation(reader BytesReader) (Message, error) { + var err error = nil + msg := &SetPageLocation{} + if msg.URL, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Referrer, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.NavigationStart, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeSetViewportSize(reader BytesReader) (Message, error) { + var err error = nil + msg := &SetViewportSize{} + if msg.Width, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Height, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeSetViewportScroll(reader BytesReader) (Message, error) { + var err error = nil + msg := &SetViewportScroll{} + if msg.X, err = reader.ReadInt(); err != nil { + return nil, err + } + if msg.Y, err = reader.ReadInt(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeCreateDocument(reader BytesReader) (Message, error) { + var err error = nil + msg := &CreateDocument{} + + return msg, err +} + +func DecodeCreateElementNode(reader BytesReader) (Message, error) { + var err error = nil + msg := &CreateElementNode{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.ParentID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.index, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Tag, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.SVG, err = reader.ReadBoolean(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeCreateTextNode(reader BytesReader) (Message, error) { + var err error = nil + msg := &CreateTextNode{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.ParentID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Index, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeMoveNode(reader BytesReader) (Message, error) { + var err error = nil + msg := &MoveNode{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.ParentID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Index, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeRemoveNode(reader BytesReader) (Message, error) { + var err error = nil + msg := &RemoveNode{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeSetNodeAttribute(reader BytesReader) (Message, error) { + var err error = nil + msg := &SetNodeAttribute{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Name, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Value, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeRemoveNodeAttribute(reader BytesReader) (Message, error) { + var err error = nil + msg := &RemoveNodeAttribute{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Name, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeSetNodeData(reader BytesReader) (Message, error) { + var err error = nil + msg := &SetNodeData{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Data, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeSetCSSData(reader BytesReader) (Message, error) { + var err error = nil + msg := &SetCSSData{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Data, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeSetNodeScroll(reader BytesReader) (Message, error) { + var err error = nil + msg := &SetNodeScroll{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.X, err = reader.ReadInt(); err != nil { + return nil, err + } + if msg.Y, err = reader.ReadInt(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeSetInputTarget(reader BytesReader) (Message, error) { + var err error = nil + msg := &SetInputTarget{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Label, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeSetInputValue(reader BytesReader) (Message, error) { + var err error = nil + msg := &SetInputValue{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Value, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Mask, err = reader.ReadInt(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeSetInputChecked(reader BytesReader) (Message, error) { + var err error = nil + msg := &SetInputChecked{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Checked, err = reader.ReadBoolean(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeMouseMove(reader BytesReader) (Message, error) { + var err error = nil + msg := &MouseMove{} + if msg.X, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Y, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeConsoleLog(reader BytesReader) (Message, error) { + var err error = nil + msg := &ConsoleLog{} + if msg.Level, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Value, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodePageLoadTiming(reader BytesReader) (Message, error) { + var err error = nil + msg := &PageLoadTiming{} + if msg.RequestStart, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.ResponseStart, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.ResponseEnd, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.DomContentLoadedEventStart, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.DomContentLoadedEventEnd, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.LoadEventStart, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.LoadEventEnd, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.FirstPaint, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.FirstContentfulPaint, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodePageRenderTiming(reader BytesReader) (Message, error) { + var err error = nil + msg := &PageRenderTiming{} + if msg.SpeedIndex, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.VisuallyComplete, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.TimeToInteractive, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeJSExceptionDeprecated(reader BytesReader) (Message, error) { + var err error = nil + msg := &JSExceptionDeprecated{} + if msg.Name, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Message, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Payload, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeIntegrationEvent(reader BytesReader) (Message, error) { + var err error = nil + msg := &IntegrationEvent{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Source, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Name, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Message, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Payload, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeRawCustomEvent(reader BytesReader) (Message, error) { + var err error = nil + msg := &RawCustomEvent{} + if msg.Name, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Payload, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeUserID(reader BytesReader) (Message, error) { + var err error = nil + msg := &UserID{} + if msg.ID, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeUserAnonymousID(reader BytesReader) (Message, error) { + var err error = nil + msg := &UserAnonymousID{} + if msg.ID, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeMetadata(reader BytesReader) (Message, error) { + var err error = nil + msg := &Metadata{} + if msg.Key, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Value, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodePageEvent(reader BytesReader) (Message, error) { + var err error = nil + msg := &PageEvent{} + if msg.MessageID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.URL, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Referrer, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Loaded, err = reader.ReadBoolean(); err != nil { + return nil, err + } + if msg.RequestStart, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.ResponseStart, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.ResponseEnd, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.DomContentLoadedEventStart, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.DomContentLoadedEventEnd, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.LoadEventStart, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.LoadEventEnd, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.FirstPaint, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.FirstContentfulPaint, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.SpeedIndex, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.VisuallyComplete, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.TimeToInteractive, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeInputEvent(reader BytesReader) (Message, error) { + var err error = nil + msg := &InputEvent{} + if msg.MessageID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Value, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.ValueMasked, err = reader.ReadBoolean(); err != nil { + return nil, err + } + if msg.Label, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeClickEvent(reader BytesReader) (Message, error) { + var err error = nil + msg := &ClickEvent{} + if msg.MessageID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.HesitationTime, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Label, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Selector, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeResourceEvent(reader BytesReader) (Message, error) { + var err error = nil + msg := &ResourceEvent{} + if msg.MessageID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Duration, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.TTFB, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.HeaderSize, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.EncodedBodySize, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.DecodedBodySize, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.URL, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Type, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Success, err = reader.ReadBoolean(); err != nil { + return nil, err + } + if msg.Method, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Status, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeCustomEvent(reader BytesReader) (Message, error) { + var err error = nil + msg := &CustomEvent{} + if msg.MessageID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Name, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Payload, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeCSSInsertRule(reader BytesReader) (Message, error) { + var err error = nil + msg := &CSSInsertRule{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Rule, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Index, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeCSSDeleteRule(reader BytesReader) (Message, error) { + var err error = nil + msg := &CSSDeleteRule{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Index, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeFetch(reader BytesReader) (Message, error) { + var err error = nil + msg := &Fetch{} + if msg.Method, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.URL, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Request, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Response, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Status, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Duration, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeProfiler(reader BytesReader) (Message, error) { + var err error = nil + msg := &Profiler{} + if msg.Name, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Duration, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Args, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Result, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeOTable(reader BytesReader) (Message, error) { + var err error = nil + msg := &OTable{} + if msg.Key, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Value, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeStateAction(reader BytesReader) (Message, error) { + var err error = nil + msg := &StateAction{} + if msg.Type, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeStateActionEvent(reader BytesReader) (Message, error) { + var err error = nil + msg := &StateActionEvent{} + if msg.MessageID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Type, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeRedux(reader BytesReader) (Message, error) { + var err error = nil + msg := &Redux{} + if msg.Action, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.State, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Duration, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeVuex(reader BytesReader) (Message, error) { + var err error = nil + msg := &Vuex{} + if msg.Mutation, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.State, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeMobX(reader BytesReader) (Message, error) { + var err error = nil + msg := &MobX{} + if msg.Type, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Payload, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeNgRx(reader BytesReader) (Message, error) { + var err error = nil + msg := &NgRx{} + if msg.Action, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.State, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Duration, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeGraphQL(reader BytesReader) (Message, error) { + var err error = nil + msg := &GraphQL{} + if msg.OperationKind, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.OperationName, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Variables, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Response, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodePerformanceTrack(reader BytesReader) (Message, error) { + var err error = nil + msg := &PerformanceTrack{} + if msg.Frames, err = reader.ReadInt(); err != nil { + return nil, err + } + if msg.Ticks, err = reader.ReadInt(); err != nil { + return nil, err + } + if msg.TotalJSHeapSize, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.UsedJSHeapSize, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeGraphQLEvent(reader BytesReader) (Message, error) { + var err error = nil + msg := &GraphQLEvent{} + if msg.MessageID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.OperationKind, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.OperationName, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Variables, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Response, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeFetchEvent(reader BytesReader) (Message, error) { + var err error = nil + msg := &FetchEvent{} + if msg.MessageID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Method, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.URL, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Request, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Response, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Status, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Duration, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeDOMDrop(reader BytesReader) (Message, error) { + var err error = nil + msg := &DOMDrop{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeResourceTiming(reader BytesReader) (Message, error) { + var err error = nil + msg := &ResourceTiming{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Duration, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.TTFB, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.HeaderSize, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.EncodedBodySize, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.DecodedBodySize, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.URL, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Initiator, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeConnectionInformation(reader BytesReader) (Message, error) { + var err error = nil + msg := &ConnectionInformation{} + if msg.Downlink, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Type, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeSetPageVisibility(reader BytesReader) (Message, error) { + var err error = nil + msg := &SetPageVisibility{} + if msg.hidden, err = reader.ReadBoolean(); err != nil { + return nil, err + } + return msg, err +} + +func DecodePerformanceTrackAggr(reader BytesReader) (Message, error) { + var err error = nil + msg := &PerformanceTrackAggr{} + if msg.TimestampStart, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.TimestampEnd, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.MinFPS, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.AvgFPS, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.MaxFPS, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.MinCPU, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.AvgCPU, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.MaxCPU, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.MinTotalJSHeapSize, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.AvgTotalJSHeapSize, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.MaxTotalJSHeapSize, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.MinUsedJSHeapSize, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.AvgUsedJSHeapSize, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.MaxUsedJSHeapSize, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeLoadFontFace(reader BytesReader) (Message, error) { + var err error = nil + msg := &LoadFontFace{} + if msg.ParentID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Family, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Source, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Descriptors, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeSetNodeFocus(reader BytesReader) (Message, error) { + var err error = nil + msg := &SetNodeFocus{} + if msg.ID, err = reader.ReadInt(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeLongTask(reader BytesReader) (Message, error) { + var err error = nil + msg := &LongTask{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Duration, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Context, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.ContainerType, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.ContainerSrc, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.ContainerId, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.ContainerName, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeSetNodeAttributeURLBased(reader BytesReader) (Message, error) { + var err error = nil + msg := &SetNodeAttributeURLBased{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Name, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Value, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.BaseURL, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeSetCSSDataURLBased(reader BytesReader) (Message, error) { + var err error = nil + msg := &SetCSSDataURLBased{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Data, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.BaseURL, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeIssueEvent(reader BytesReader) (Message, error) { + var err error = nil + msg := &IssueEvent{} + if msg.MessageID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Type, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.ContextString, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Context, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Payload, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeTechnicalInfo(reader BytesReader) (Message, error) { + var err error = nil + msg := &TechnicalInfo{} + if msg.Type, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Value, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeCustomIssue(reader BytesReader) (Message, error) { + var err error = nil + msg := &CustomIssue{} + if msg.Name, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Payload, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeAssetCache(reader BytesReader) (Message, error) { + var err error = nil + msg := &AssetCache{} + if msg.URL, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeCSSInsertRuleURLBased(reader BytesReader) (Message, error) { + var err error = nil + msg := &CSSInsertRuleURLBased{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Rule, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Index, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.BaseURL, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeMouseClick(reader BytesReader) (Message, error) { + var err error = nil + msg := &MouseClick{} + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.HesitationTime, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Label, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Selector, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeCreateIFrameDocument(reader BytesReader) (Message, error) { + var err error = nil + msg := &CreateIFrameDocument{} + if msg.FrameID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeAdoptedSSReplaceURLBased(reader BytesReader) (Message, error) { + var err error = nil + msg := &AdoptedSSReplaceURLBased{} + if msg.SheetID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Text, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.BaseURL, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeAdoptedSSReplace(reader BytesReader) (Message, error) { + var err error = nil + msg := &AdoptedSSReplace{} + if msg.SheetID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Text, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeAdoptedSSInsertRuleURLBased(reader BytesReader) (Message, error) { + var err error = nil + msg := &AdoptedSSInsertRuleURLBased{} + if msg.SheetID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Rule, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Index, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.BaseURL, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeAdoptedSSInsertRule(reader BytesReader) (Message, error) { + var err error = nil + msg := &AdoptedSSInsertRule{} + if msg.SheetID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Rule, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Index, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeAdoptedSSDeleteRule(reader BytesReader) (Message, error) { + var err error = nil + msg := &AdoptedSSDeleteRule{} + if msg.SheetID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Index, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeAdoptedSSAddOwner(reader BytesReader) (Message, error) { + var err error = nil + msg := &AdoptedSSAddOwner{} + if msg.SheetID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeAdoptedSSRemoveOwner(reader BytesReader) (Message, error) { + var err error = nil + msg := &AdoptedSSRemoveOwner{} + if msg.SheetID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.ID, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeZustand(reader BytesReader) (Message, error) { + var err error = nil + msg := &Zustand{} + if msg.Mutation, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.State, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeJSException(reader BytesReader) (Message, error) { + var err error = nil + msg := &JSException{} + if msg.Name, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Message, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Payload, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Metadata, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeSessionEnd(reader BytesReader) (Message, error) { + var err error = nil + msg := &SessionEnd{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.EncryptionKey, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeSessionSearch(reader BytesReader) (Message, error) { + var err error = nil + msg := &SessionSearch{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Partition, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeIOSBatchMeta(reader BytesReader) (Message, error) { + var err error = nil + msg := &IOSBatchMeta{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Length, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.FirstIndex, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeIOSSessionStart(reader BytesReader) (Message, error) { + var err error = nil + msg := &IOSSessionStart{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.ProjectID, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.TrackerVersion, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.RevID, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.UserUUID, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.UserOS, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.UserOSVersion, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.UserDevice, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.UserDeviceType, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.UserCountry, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeIOSSessionEnd(reader BytesReader) (Message, error) { + var err error = nil + msg := &IOSSessionEnd{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeIOSMetadata(reader BytesReader) (Message, error) { + var err error = nil + msg := &IOSMetadata{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Length, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Key, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Value, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeIOSCustomEvent(reader BytesReader) (Message, error) { + var err error = nil + msg := &IOSCustomEvent{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Length, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Name, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Payload, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeIOSUserID(reader BytesReader) (Message, error) { + var err error = nil + msg := &IOSUserID{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Length, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Value, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeIOSUserAnonymousID(reader BytesReader) (Message, error) { + var err error = nil + msg := &IOSUserAnonymousID{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Length, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Value, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeIOSScreenChanges(reader BytesReader) (Message, error) { + var err error = nil + msg := &IOSScreenChanges{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Length, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.X, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Y, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Width, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Height, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeIOSCrash(reader BytesReader) (Message, error) { + var err error = nil + msg := &IOSCrash{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Length, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Name, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Reason, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Stacktrace, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeIOSScreenEnter(reader BytesReader) (Message, error) { + var err error = nil + msg := &IOSScreenEnter{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Length, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Title, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.ViewName, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeIOSScreenLeave(reader BytesReader) (Message, error) { + var err error = nil + msg := &IOSScreenLeave{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Length, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Title, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.ViewName, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeIOSClickEvent(reader BytesReader) (Message, error) { + var err error = nil + msg := &IOSClickEvent{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Length, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Label, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.X, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Y, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeIOSInputEvent(reader BytesReader) (Message, error) { + var err error = nil + msg := &IOSInputEvent{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Length, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Value, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.ValueMasked, err = reader.ReadBoolean(); err != nil { + return nil, err + } + if msg.Label, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeIOSPerformanceEvent(reader BytesReader) (Message, error) { + var err error = nil + msg := &IOSPerformanceEvent{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Length, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Name, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Value, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeIOSLog(reader BytesReader) (Message, error) { + var err error = nil + msg := &IOSLog{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Length, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Severity, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Content, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeIOSInternalError(reader BytesReader) (Message, error) { + var err error = nil + msg := &IOSInternalError{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Length, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Content, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeIOSNetworkCall(reader BytesReader) (Message, error) { + var err error = nil + msg := &IOSNetworkCall{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Length, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Duration, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Headers, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Body, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.URL, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Success, err = reader.ReadBoolean(); err != nil { + return nil, err + } + if msg.Method, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Status, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeIOSPerformanceAggregated(reader BytesReader) (Message, error) { + var err error = nil + msg := &IOSPerformanceAggregated{} + if msg.TimestampStart, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.TimestampEnd, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.MinFPS, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.AvgFPS, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.MaxFPS, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.MinCPU, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.AvgCPU, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.MaxCPU, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.MinMemory, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.AvgMemory, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.MaxMemory, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.MinBattery, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.AvgBattery, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.MaxBattery, err = reader.ReadUint(); err != nil { + return nil, err + } + return msg, err +} + +func DecodeIOSIssueEvent(reader BytesReader) (Message, error) { + var err error = nil + msg := &IOSIssueEvent{} + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Type, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.ContextString, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Context, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Payload, err = reader.ReadString(); err != nil { + return nil, err + } + return msg, err +} + +func ReadMessage(t uint64, reader BytesReader) (Message, error) { switch t { case 80: return DecodeBatchMeta(reader) diff --git a/backend/pkg/messages/reader.go b/backend/pkg/messages/reader.go new file mode 100644 index 000000000..1e9fa42db --- /dev/null +++ b/backend/pkg/messages/reader.go @@ -0,0 +1,166 @@ +package messages + +import ( + "fmt" + "io" +) + +type MessageReader interface { + Parse() (err error) + Next() bool + Message() Message +} + +func NewMessageReader(data []byte) MessageReader { + return &messageReaderImpl{ + data: data, + reader: NewBytesReader(data), + list: make([]*MessageMeta, 0, 1024), + } +} + +type MessageMeta struct { + msgType uint64 + msgSize uint64 + msgFrom uint64 +} + +type messageReaderImpl struct { + data []byte + reader BytesReader + msgType uint64 + msgSize uint64 + msgBody []byte + version int + broken bool + message Message + err error + list []*MessageMeta + listPtr int +} + +func (m *messageReaderImpl) Parse() (err error) { + m.listPtr = 0 + m.list = m.list[:0] + m.broken = false + for { + // Try to read and decode message type, message size and check range in + m.msgType, err = m.reader.ReadUint() + if err != nil { + if err != io.EOF { + return fmt.Errorf("read message type err: %s", err) + } + // Reached the end of batch + return nil + } + + // Read message body (and decode if protocol version less than 1) + if m.version > 0 && messageHasSize(m.msgType) { + // Read message size if it is a new protocol version + m.msgSize, err = m.reader.ReadSize() + if err != nil { + return fmt.Errorf("read message size err: %s", err) + } + + // Try to avoid EOF error + + curr := m.reader.Pointer() + if len(m.data)-int(curr) < int(m.msgSize) { + return fmt.Errorf("can't read message body") + } + + // Dirty hack to avoid extra memory allocation + m.data[curr-1] = uint8(m.msgType) + + // Add message meta to list + m.list = append(m.list, &MessageMeta{ + msgType: m.msgType, + msgSize: m.msgSize + 1, + msgFrom: uint64(curr - 1), + }) + + // Update data pointer + m.reader.SetPointer(curr + int64(m.msgSize)) + } else { + from := m.reader.Pointer() - 1 + msg, err := ReadMessage(m.msgType, m.reader) + if err != nil { + return fmt.Errorf("read message err: %s", err) + } + if m.msgType == MsgBatchMeta || m.msgType == MsgBatchMetadata { + if len(m.list) > 0 { + return fmt.Errorf("batch meta not at the start of batch") + } + switch message := msg.(type) { + case *BatchMetadata: + m.version = int(message.Version) + case *BatchMeta: + m.version = 0 + } + if m.version != 1 { + // Unsupported tracker version, reset reader + m.list = m.list[:0] + m.reader.SetPointer(0) + return nil + } + } + + // Add message meta to list + m.list = append(m.list, &MessageMeta{ + msgType: m.msgType, + msgSize: uint64(m.reader.Pointer() - from), + msgFrom: uint64(from), + }) + } + } +} + +func (m *messageReaderImpl) Next() bool { + if m.broken { + return false + } + + // For new version of tracker + if len(m.list) > 0 { + if m.listPtr >= len(m.list) { + return false + } + + meta := m.list[m.listPtr] + m.listPtr++ + m.message = &RawMessage{ + tp: meta.msgType, + data: m.data[meta.msgFrom : meta.msgFrom+meta.msgSize], + broken: &m.broken, + meta: &message{}, + } + return true + } + + // For prev version of tracker + var msg Message + var err error + + // Try to read and decode message type, message size and check range in + m.msgType, err = m.reader.ReadUint() + if err != nil { + if err != io.EOF { + m.err = fmt.Errorf("read message type err: %s", err) + } + // Reached the end of batch + return false + } + + // Read and decode message + msg, err = ReadMessage(m.msgType, m.reader) + if err != nil { + m.err = fmt.Errorf("read message err: %s", err) + return false + } + m.message = msg + return true +} + +func (m *messageReaderImpl) Message() Message { + return m.message +} diff --git a/mobs/templates/backend~pkg~messages~read-message.go.erb b/mobs/templates/backend~pkg~messages~read-message.go.erb index a7cd6dbe4..67cff7344 100644 --- a/mobs/templates/backend~pkg~messages~read-message.go.erb +++ b/mobs/templates/backend~pkg~messages~read-message.go.erb @@ -6,17 +6,17 @@ import ( "io" ) <% $messages.each do |msg| %> -func Decode<%= msg.name %>(reader io.Reader) (Message, error) { +func Decode<%= msg.name %>(reader BytesReader) (Message, error) { var err error = nil msg := &<%= msg.name %>{} <%= msg.attributes.map { |attr| - " if msg.#{attr.name}, err = Read#{attr.type.to_s.pascal_case}(reader); err != nil { + " if msg.#{attr.name}, err = reader.Read#{attr.type.to_s.pascal_case}(); err != nil { return nil, err }" }.join "\n" %> return msg, err } <% end %> -func ReadMessage(t uint64, reader io.Reader) (Message, error) { +func ReadMessage(t uint64, reader BytesReader) (Message, error) { switch t {<% $messages.each do |msg| %> case <%= msg.id %>: return Decode<%= msg.name %>(reader)<% end %>