Mobile renaming (protocol + backend) (#2078)

* feat(backend): renamed ios to mobile

* feat(backend): added missing changes to iterator

* feat(backend): added missing changes to ender

* feat(backend): as usual auto deleted import in ch connector

* feat(backend): updated ee/conditions func calls
This commit is contained in:
Alexander 2024-04-12 09:30:24 +02:00 committed by GitHub
parent a316c90472
commit 2bf9298836
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
33 changed files with 327 additions and 327 deletions

View file

@ -62,10 +62,10 @@ func main() {
messages.MsgPageEvent, messages.MsgMouseThrashing, messages.MsgInputChange,
messages.MsgUnbindNodes, messages.MsgCanvasNode, messages.MsgTagTrigger,
// Mobile messages
messages.MsgIOSSessionStart, messages.MsgIOSSessionEnd, messages.MsgIOSUserID, messages.MsgIOSUserAnonymousID,
messages.MsgIOSMetadata, messages.MsgIOSEvent, messages.MsgIOSNetworkCall,
messages.MsgIOSClickEvent, messages.MsgIOSSwipeEvent, messages.MsgIOSInputEvent,
messages.MsgIOSCrash, messages.MsgIOSIssueEvent,
messages.MsgMobileSessionStart, messages.MsgMobileSessionEnd, messages.MsgMobileUserID, messages.MsgMobileUserAnonymousID,
messages.MsgMobileMetadata, messages.MsgMobileEvent, messages.MsgMobileNetworkCall,
messages.MsgMobileClickEvent, messages.MsgMobileSwipeEvent, messages.MsgMobileInputEvent,
messages.MsgMobileCrash, messages.MsgMobileIssueEvent,
}
// Init consumer
@ -73,7 +73,7 @@ func main() {
cfg.GroupDB,
[]string{
cfg.TopicRawWeb,
cfg.TopicRawIOS,
cfg.TopicRawMobile,
cfg.TopicAnalytics,
},
messages.NewMessageIterator(log, saver.Handle, msgFilter, true),

View file

@ -60,7 +60,7 @@ func main() {
cfg.GroupEnder,
[]string{
cfg.TopicRawWeb,
cfg.TopicRawIOS,
cfg.TopicRawMobile,
},
messages.NewEnderMessageIterator(
log,
@ -170,14 +170,14 @@ func main() {
}
}
if sess != nil && (sess.Platform == "ios" || sess.Platform == "android") {
msg := &messages.IOSSessionEnd{Timestamp: timestamp}
if err := producer.Produce(cfg.TopicRawIOS, sessionID, msg.Encode()); err != nil {
log.Error(sessCtx, "can't send iOSSessionEnd to mobile topic: %s", err)
msg := &messages.MobileSessionEnd{Timestamp: timestamp}
if err := producer.Produce(cfg.TopicRawMobile, sessionID, msg.Encode()); err != nil {
log.Error(sessCtx, "can't send MobileSessionEnd to mobile topic: %s", err)
return false, 0
}
// Inform canvas service about session end
if err := producer.Produce(cfg.TopicRawImages, sessionID, msg.Encode()); err != nil {
log.Error(sessCtx, "can't send iOSSessionEnd signal to canvas topic: %s", err)
log.Error(sessCtx, "can't send MobileSessionEnd signal to canvas topic: %s", err)
}
} else {
if err := producer.Produce(cfg.TopicRawWeb, sessionID, msg.Encode()); err != nil {

View file

@ -7,7 +7,7 @@ import (
"openreplay/backend/pkg/builders"
"openreplay/backend/pkg/handlers"
"openreplay/backend/pkg/handlers/custom"
"openreplay/backend/pkg/handlers/ios"
"openreplay/backend/pkg/handlers/mobile"
"openreplay/backend/pkg/handlers/web"
"openreplay/backend/pkg/logger"
"openreplay/backend/pkg/memory"
@ -35,8 +35,8 @@ func main() {
&web.NetworkIssueDetector{},
&web.PerformanceAggregator{},
web.NewAppCrashDetector(),
&ios.TapRageDetector{},
ios.NewViewComponentDurations(),
&mobile.TapRageDetector{},
mobile.NewViewComponentDurations(),
}
}
@ -46,7 +46,7 @@ func main() {
cfg.GroupHeuristics,
[]string{
cfg.TopicRawWeb,
cfg.TopicRawIOS,
cfg.TopicRawMobile,
},
messages.NewMessageIterator(log, eventBuilder.HandleMessage, nil, true),
false,

View file

@ -49,7 +49,7 @@ func main() {
if err != nil {
return nil, err
}
if msgType != messages.MsgIOSSessionEnd {
if msgType != messages.MsgMobileSessionEnd {
return nil, fmt.Errorf("not a mobile session end message")
}
msg, err := messages.ReadMessage(msgType, reader)

View file

@ -81,14 +81,14 @@ func main() {
sessCtx := context.WithValue(context.Background(), "sessionID", msg.SessionID())
// Send SessionEnd trigger to storage service
if msg.TypeID() == messages.MsgSessionEnd || msg.TypeID() == messages.MsgIOSSessionEnd {
if msg.TypeID() == messages.MsgSessionEnd || msg.TypeID() == messages.MsgMobileSessionEnd {
if err := producer.Produce(cfg.TopicTrigger, msg.SessionID(), msg.Encode()); err != nil {
log.Error(sessCtx, "can't send SessionEnd to trigger topic: %s", err)
}
// duplicate session end message to mobile trigger topic to build video replay for mobile sessions
if msg.TypeID() == messages.MsgIOSSessionEnd {
if msg.TypeID() == messages.MsgMobileSessionEnd {
if err := producer.Produce(cfg.TopicMobileTrigger, msg.SessionID(), msg.Encode()); err != nil {
log.Error(sessCtx, "can't send iOSSessionEnd to mobile trigger topic: %s", err)
log.Error(sessCtx, "can't send MobileSessionEnd to mobile trigger topic: %s", err)
}
}
writer.Close(msg.SessionID())
@ -190,7 +190,7 @@ func main() {
cfg.GroupSink,
[]string{
cfg.TopicRawWeb,
cfg.TopicRawIOS,
cfg.TopicRawMobile,
},
messages.NewSinkMessageIterator(log, msgHandler, nil, false),
false,

View file

@ -48,9 +48,9 @@ func main() {
messages.NewMessageIterator(
log,
func(msg messages.Message) {
// Convert IOSSessionEnd to SessionEnd
if msg.TypeID() == messages.MsgIOSSessionEnd {
mobileEnd, oldMeta := msg.(*messages.IOSSessionEnd), msg.Meta()
// Convert MobileSessionEnd to SessionEnd
if msg.TypeID() == messages.MsgMobileSessionEnd {
mobileEnd, oldMeta := msg.(*messages.MobileSessionEnd), msg.Meta()
msg = &messages.SessionEnd{
Timestamp: mobileEnd.Timestamp,
}
@ -66,7 +66,7 @@ func main() {
// Log timestamp of last processed session
counter.Update(msg.SessionID(), time.UnixMilli(msg.Meta().Batch().Timestamp()))
},
[]int{messages.MsgSessionEnd, messages.MsgIOSSessionEnd},
[]int{messages.MsgSessionEnd, messages.MsgMobileSessionEnd},
true,
),
false,

View file

@ -17,7 +17,7 @@ type Config struct {
GroupDB string `env:"GROUP_DB,required"`
TopicRawWeb string `env:"TOPIC_RAW_WEB,required"`
TopicAnalytics string `env:"TOPIC_ANALYTICS,required"`
TopicRawIOS string `env:"TOPIC_RAW_IOS,required"`
TopicRawMobile string `env:"TOPIC_RAW_IOS,required"`
CommitBatchTimeout time.Duration `env:"COMMIT_BATCH_TIMEOUT,default=15s"`
BatchQueueLimit int `env:"DB_BATCH_QUEUE_LIMIT,required"`
BatchSizeLimit int `env:"DB_BATCH_SIZE_LIMIT,required"`

View file

@ -16,7 +16,7 @@ type Config struct {
GroupEnder string `env:"GROUP_ENDER,required"`
LoggerTimeout int `env:"LOG_QUEUE_STATS_INTERVAL_SEC,required"`
TopicRawWeb string `env:"TOPIC_RAW_WEB,required"`
TopicRawIOS string `env:"TOPIC_RAW_IOS,required"`
TopicRawMobile string `env:"TOPIC_RAW_IOS,required"`
TopicCanvasImages string `env:"TOPIC_CANVAS_IMAGES,required"`
TopicRawImages string `env:"TOPIC_RAW_IMAGES,required"`
ProducerTimeout int `env:"PRODUCER_TIMEOUT,default=2000"`

View file

@ -13,7 +13,7 @@ type Config struct {
TopicAnalytics string `env:"TOPIC_ANALYTICS,required"`
LoggerTimeout int `env:"LOG_QUEUE_STATS_INTERVAL_SEC,required"`
TopicRawWeb string `env:"TOPIC_RAW_WEB,required"`
TopicRawIOS string `env:"TOPIC_RAW_IOS,required"`
TopicRawMobile string `env:"TOPIC_RAW_IOS,required"`
ProducerTimeout int `env:"PRODUCER_TIMEOUT,default=2000"`
UseProfiler bool `env:"PROFILER_ENABLED,default=false"`
}

View file

@ -19,7 +19,7 @@ type Config struct {
HTTPPort string `env:"HTTP_PORT,required"`
HTTPTimeout time.Duration `env:"HTTP_TIMEOUT,default=60s"`
TopicRawWeb string `env:"TOPIC_RAW_WEB,required"`
TopicRawIOS string `env:"TOPIC_RAW_IOS,required"`
TopicRawMobile string `env:"TOPIC_RAW_IOS,required"`
TopicRawImages string `env:"TOPIC_RAW_IMAGES,required"`
TopicCanvasImages string `env:"TOPIC_CANVAS_IMAGES,required"`
BeaconSizeLimit int64 `env:"BEACON_SIZE_LIMIT,required"`

View file

@ -14,7 +14,7 @@ type Config struct {
SyncTimeout int `env:"SYNC_TIMEOUT,default=5"`
GroupSink string `env:"GROUP_SINK,required"`
TopicRawWeb string `env:"TOPIC_RAW_WEB,required"`
TopicRawIOS string `env:"TOPIC_RAW_IOS,required"`
TopicRawMobile string `env:"TOPIC_RAW_IOS,required"`
TopicCache string `env:"TOPIC_CACHE,required"`
TopicTrigger string `env:"TOPIC_TRIGGER,required"`
TopicMobileTrigger string `env:"TOPIC_MOBILE_TRIGGER,required"`

View file

@ -47,8 +47,8 @@ func (s *saverImpl) Handle(msg Message) {
if msg.TypeID() == MsgCustomEvent {
defer s.Handle(types.WrapCustomEvent(msg.(*CustomEvent)))
}
if IsIOSType(msg.TypeID()) {
// Handle iOS messages
if IsMobileType(msg.TypeID()) {
// Handle Mobile messages
if err := s.handleMobileMessage(msg); err != nil {
if !postgres.IsPkeyViolation(err) {
s.log.Error(sessCtx, "mobile message insertion error, msg: %+v, err: %s", msg, err)
@ -77,41 +77,41 @@ func (s *saverImpl) handleMobileMessage(msg Message) error {
return err
}
switch m := msg.(type) {
case *IOSUserID:
case *MobileUserID:
if err = s.sessions.UpdateUserID(session.SessionID, m.ID); err != nil {
return err
}
s.pg.InsertAutocompleteValue(session.SessionID, session.ProjectID, "USERID_IOS", m.ID)
s.pg.InsertAutocompleteValue(session.SessionID, session.ProjectID, "USERID_Mobile", m.ID)
return nil
case *IOSUserAnonymousID:
case *MobileUserAnonymousID:
if err = s.sessions.UpdateAnonymousID(session.SessionID, m.ID); err != nil {
return err
}
s.pg.InsertAutocompleteValue(session.SessionID, session.ProjectID, "USERANONYMOUSID_IOS", m.ID)
s.pg.InsertAutocompleteValue(session.SessionID, session.ProjectID, "USERANONYMOUSID_Mobile", m.ID)
return nil
case *IOSMetadata:
case *MobileMetadata:
return s.sessions.UpdateMetadata(m.SessionID(), m.Key, m.Value)
case *IOSEvent:
return s.pg.InsertIOSEvent(session, m)
case *IOSClickEvent:
if err := s.pg.InsertIOSClickEvent(session, m); err != nil {
case *MobileEvent:
return s.pg.InsertMobileEvent(session, m)
case *MobileClickEvent:
if err := s.pg.InsertMobileClickEvent(session, m); err != nil {
return err
}
return s.sessions.UpdateEventsStats(session.SessionID, 1, 0)
case *IOSSwipeEvent:
if err := s.pg.InsertIOSSwipeEvent(session, m); err != nil {
case *MobileSwipeEvent:
if err := s.pg.InsertMobileSwipeEvent(session, m); err != nil {
return err
}
return s.sessions.UpdateEventsStats(session.SessionID, 1, 0)
case *IOSInputEvent:
if err := s.pg.InsertIOSInputEvent(session, m); err != nil {
case *MobileInputEvent:
if err := s.pg.InsertMobileInputEvent(session, m); err != nil {
return err
}
return s.sessions.UpdateEventsStats(session.SessionID, 1, 0)
case *IOSNetworkCall:
return s.pg.InsertIOSNetworkCall(session, m)
case *IOSCrash:
if err := s.pg.InsertIOSCrash(session.SessionID, session.ProjectID, m); err != nil {
case *MobileNetworkCall:
return s.pg.InsertMobileNetworkCall(session, m)
case *MobileCrash:
if err := s.pg.InsertMobileCrash(session.SessionID, session.ProjectID, m); err != nil {
return err
}
return s.sessions.UpdateIssuesStats(session.SessionID, 1, 1000)

View file

@ -18,7 +18,7 @@ import (
"time"
)
func (e *Router) startSessionHandlerIOS(w http.ResponseWriter, r *http.Request) {
func (e *Router) startMobileSessionHandler(w http.ResponseWriter, r *http.Request) {
startTime := time.Now()
if r.Body == nil {
@ -137,20 +137,20 @@ func (e *Router) startSessionHandlerIOS(w http.ResponseWriter, r *http.Request)
e.log.Warn(r.Context(), "failed to add mobile session to DB: %s", err)
}
sessStart := &messages.IOSSessionStart{
sessStart := &messages.MobileSessionStart{
Timestamp: req.Timestamp,
ProjectID: uint64(p.ProjectID),
TrackerVersion: req.TrackerVersion,
RevID: req.RevID,
UserUUID: userUUID,
UserOS: "IOS",
UserOS: os,
UserOSVersion: req.UserOSVersion,
UserDevice: ios.MapIOSDevice(req.UserDevice),
UserDeviceType: ios.GetIOSDeviceType(req.UserDevice),
UserDeviceType: deviceType,
UserCountry: geoInfo.Pack(),
}
if err := e.services.Producer.Produce(e.cfg.TopicRawIOS, tokenData.ID, sessStart.Encode()); err != nil {
if err := e.services.Producer.Produce(e.cfg.TopicRawMobile, tokenData.ID, sessStart.Encode()); err != nil {
e.log.Error(r.Context(), "failed to send mobile sessionStart event to queue: %s", err)
}
}
@ -167,7 +167,7 @@ func (e *Router) startSessionHandlerIOS(w http.ResponseWriter, r *http.Request)
}, startTime, r.URL.Path, 0)
}
func (e *Router) pushMessagesHandlerIOS(w http.ResponseWriter, r *http.Request) {
func (e *Router) pushMobileMessagesHandler(w http.ResponseWriter, r *http.Request) {
startTime := time.Now()
sessionData, err := e.services.Tokenizer.ParseFromHTTPRequest(r)
@ -184,10 +184,10 @@ func (e *Router) pushMessagesHandlerIOS(w http.ResponseWriter, r *http.Request)
r = r.WithContext(context.WithValue(r.Context(), "projectID", fmt.Sprintf("%d", info.ProjectID)))
}
e.pushMessages(w, r, sessionData.ID, e.cfg.TopicRawIOS)
e.pushMessages(w, r, sessionData.ID, e.cfg.TopicRawMobile)
}
func (e *Router) pushLateMessagesHandlerIOS(w http.ResponseWriter, r *http.Request) {
func (e *Router) pushMobileLateMessagesHandler(w http.ResponseWriter, r *http.Request) {
startTime := time.Now()
sessionData, err := e.services.Tokenizer.ParseFromHTTPRequest(r)
if sessionData != nil {
@ -199,10 +199,10 @@ func (e *Router) pushLateMessagesHandlerIOS(w http.ResponseWriter, r *http.Reque
return
}
// Check timestamps here?
e.pushMessages(w, r, sessionData.ID, e.cfg.TopicRawIOS)
e.pushMessages(w, r, sessionData.ID, e.cfg.TopicRawMobile)
}
func (e *Router) imagesUploadHandlerIOS(w http.ResponseWriter, r *http.Request) {
func (e *Router) mobileImagesUploadHandler(w http.ResponseWriter, r *http.Request) {
startTime := time.Now()
sessionData, err := e.services.Tokenizer.ParseFromHTTPRequest(r)

View file

@ -115,10 +115,10 @@ func (e *Router) init() {
"/v1/web/i": e.pushMessagesHandlerWeb,
"/v1/web/feature-flags": e.featureFlagsHandlerWeb,
"/v1/web/images": e.imagesUploaderHandlerWeb,
"/v1/mobile/start": e.startSessionHandlerIOS,
"/v1/mobile/i": e.pushMessagesHandlerIOS,
"/v1/mobile/late": e.pushLateMessagesHandlerIOS,
"/v1/mobile/images": e.imagesUploadHandlerIOS,
"/v1/mobile/start": e.startMobileSessionHandler,
"/v1/mobile/i": e.pushMobileMessagesHandler,
"/v1/mobile/late": e.pushMobileLateMessagesHandler,
"/v1/mobile/images": e.mobileImagesUploadHandler,
"/v1/web/uxt/signals/test": e.sendUXTestSignal,
"/v1/web/uxt/signals/task": e.sendUXTaskSignal,
}

View file

@ -72,7 +72,7 @@ func (se *SessionEnder) UpdateSession(msg messages.Message) {
msgTimestamp = msg.Meta().Timestamp
localTimestamp = time.Now().UnixMilli()
)
if messages.IsIOSType(msg.TypeID()) {
if messages.IsMobileType(msg.TypeID()) {
msgTimestamp = messages.GetTimestamp(msg)
}
if batchTimestamp == 0 {
@ -87,7 +87,7 @@ func (se *SessionEnder) UpdateSession(msg messages.Message) {
lastUpdate: localTimestamp,
lastUserTime: msgTimestamp, // last timestamp from user's machine
isEnded: false,
isMobile: messages.IsIOSType(msg.TypeID()),
isMobile: messages.IsMobileType(msg.TypeID()),
}
ender.IncreaseActiveSessions()
ender.IncreaseTotalSessions()

View file

@ -27,7 +27,7 @@ func NewBuilder(sessionID uint64, events chan Message, handlers ...handlers.Mess
}
func (b *builder) checkSessionEnd(message Message) {
if _, isEnd := message.(*IOSSessionEnd); isEnd {
if _, isEnd := message.(*MobileSessionEnd); isEnd {
b.ended = true
}
if _, isEnd := message.(*SessionEnd); isEnd {

View file

@ -9,23 +9,23 @@ import (
"openreplay/backend/pkg/url"
)
func (conn *Conn) InsertIOSEvent(session *sessions.Session, e *messages.IOSEvent) error {
func (conn *Conn) InsertMobileEvent(session *sessions.Session, e *messages.MobileEvent) error {
if err := conn.InsertCustomEvent(session.SessionID, e.Timestamp, truncSqIdx(e.Index), e.Name, e.Payload); err != nil {
return err
}
conn.InsertAutocompleteValue(session.SessionID, session.ProjectID, "CUSTOM_IOS", e.Name)
conn.InsertAutocompleteValue(session.SessionID, session.ProjectID, "CUSTOM_Mobile", e.Name)
return nil
}
func (conn *Conn) InsertIOSNetworkCall(sess *sessions.Session, e *messages.IOSNetworkCall) error {
func (conn *Conn) InsertMobileNetworkCall(sess *sessions.Session, e *messages.MobileNetworkCall) error {
err := conn.InsertRequest(sess.SessionID, e.Timestamp, truncSqIdx(e.Index), e.URL, e.Duration, e.Status < 400)
if err == nil {
conn.InsertAutocompleteValue(sess.SessionID, sess.ProjectID, "REQUEST_IOS", url.DiscardURLQuery(e.URL))
conn.InsertAutocompleteValue(sess.SessionID, sess.ProjectID, "REQUEST_Mobile", url.DiscardURLQuery(e.URL))
}
return err
}
func (conn *Conn) InsertIOSClickEvent(sess *sessions.Session, clickEvent *messages.IOSClickEvent) error {
func (conn *Conn) InsertMobileClickEvent(sess *sessions.Session, clickEvent *messages.MobileClickEvent) error {
if err := conn.Pool.Exec(`
INSERT INTO events_ios.taps (
session_id, timestamp, seq_index, label
@ -36,11 +36,11 @@ func (conn *Conn) InsertIOSClickEvent(sess *sessions.Session, clickEvent *messag
); err != nil {
return err
}
conn.InsertAutocompleteValue(sess.SessionID, sess.ProjectID, "CLICK_IOS", clickEvent.Label)
conn.InsertAutocompleteValue(sess.SessionID, sess.ProjectID, "CLICK_Mobile", clickEvent.Label)
return nil
}
func (conn *Conn) InsertIOSSwipeEvent(sess *sessions.Session, swipeEvent *messages.IOSSwipeEvent) error {
func (conn *Conn) InsertMobileSwipeEvent(sess *sessions.Session, swipeEvent *messages.MobileSwipeEvent) error {
if err := conn.Pool.Exec(`
INSERT INTO events_ios.swipes (
session_id, timestamp, seq_index, label, direction
@ -51,11 +51,11 @@ func (conn *Conn) InsertIOSSwipeEvent(sess *sessions.Session, swipeEvent *messag
); err != nil {
return err
}
conn.InsertAutocompleteValue(sess.SessionID, sess.ProjectID, "SWIPE_IOS", swipeEvent.Label)
conn.InsertAutocompleteValue(sess.SessionID, sess.ProjectID, "SWIPE_Mobile", swipeEvent.Label)
return nil
}
func (conn *Conn) InsertIOSInputEvent(sess *sessions.Session, inputEvent *messages.IOSInputEvent) error {
func (conn *Conn) InsertMobileInputEvent(sess *sessions.Session, inputEvent *messages.MobileInputEvent) error {
if err := conn.Pool.Exec(`
INSERT INTO events_ios.inputs (
session_id, timestamp, seq_index, label
@ -66,12 +66,12 @@ func (conn *Conn) InsertIOSInputEvent(sess *sessions.Session, inputEvent *messag
); err != nil {
return err
}
conn.InsertAutocompleteValue(sess.SessionID, sess.ProjectID, "INPUT_IOS", inputEvent.Label)
conn.InsertAutocompleteValue(sess.SessionID, sess.ProjectID, "INPUT_Mobile", inputEvent.Label)
return nil
}
func (conn *Conn) InsertIOSCrash(sessionID uint64, projectID uint32, crash *messages.IOSCrash) error {
crashID := hashid.IOSCrashID(projectID, crash)
func (conn *Conn) InsertMobileCrash(sessionID uint64, projectID uint32, crash *messages.MobileCrash) error {
crashID := hashid.MobileCrashID(projectID, crash)
if err := conn.Pool.Exec(`
INSERT INTO public.crashes_ios (
@ -96,8 +96,8 @@ func (conn *Conn) InsertIOSCrash(sessionID uint64, projectID uint32, crash *mess
return nil
}
func (conn *Conn) InsertIOSIssueEvent(sess *sessions.Session, e *messages.IOSIssueEvent) error {
issueID := hashid.IOSIssueID(sess.ProjectID, e)
func (conn *Conn) InsertMobileIssueEvent(sess *sessions.Session, e *messages.MobileIssueEvent) error {
issueID := hashid.MobileIssueID(sess.ProjectID, e)
payload := &e.Payload
if *payload == "" || *payload == "{}" {
payload = nil
@ -113,7 +113,7 @@ func (conn *Conn) InsertIOSIssueEvent(sess *sessions.Session, e *messages.IOSIss
return nil
}
type IOSCrash struct {
type MobileCrash struct {
Timestamp uint64 `json:"timestamp"`
Name string `json:"name"`
Reason string `json:"reason"`

View file

@ -1,4 +1,4 @@
package ios
package mobile
import (
"openreplay/backend/pkg/handlers"
@ -7,11 +7,11 @@ import (
/*
Handler name: AppNotResponding
Input events: IOSClickEvent,
IOSInputEvent,
IOSPerformanceEvent,
IOSSessionEnd
Output event: IOSIssueEvent
Input events: MobileClickEvent,
MobileInputEvent,
MobilePerformanceEvent,
MobileSessionEnd
Output event: MobileIssueEvent
*/
const MIN_TIME_AFTER_LAST_HEARTBEAT = 60 * 1000
@ -28,21 +28,21 @@ func (h *AppNotResponding) Handle(message Message, messageID uint64, timestamp u
h.lastTimestamp = timestamp
var event Message = nil
switch m := message.(type) {
case *IOSClickEvent:
case *MobileClickEvent:
event = h.build(m.Timestamp)
h.lastLabel = m.Label
h.lastHeartbeatTimestamp = m.Timestamp
h.lastHeartbeatIndex = m.Index
case *IOSInputEvent:
case *MobileInputEvent:
event = h.build(m.Timestamp)
h.lastLabel = m.Label
h.lastHeartbeatTimestamp = m.Timestamp
h.lastHeartbeatIndex = m.Index
case *IOSPerformanceEvent:
case *MobilePerformanceEvent:
event = h.build(m.Timestamp)
h.lastHeartbeatTimestamp = m.Timestamp
h.lastHeartbeatIndex = m.Index
case *IOSSessionEnd:
case *MobileSessionEnd:
event = h.build(m.Timestamp)
}
return event
@ -54,7 +54,7 @@ func (h *AppNotResponding) Build() Message {
func (h *AppNotResponding) build(timestamp uint64) Message {
if h.lastHeartbeatTimestamp != 0 && h.lastHeartbeatTimestamp+MIN_TIME_AFTER_LAST_HEARTBEAT <= timestamp {
event := &IOSIssueEvent{
event := &MobileIssueEvent{
Type: "anr",
ContextString: h.lastLabel,
Timestamp: h.lastHeartbeatTimestamp,

View file

@ -1,4 +1,4 @@
package ios
package mobile
import (
"openreplay/backend/pkg/handlers"
@ -7,8 +7,8 @@ import (
/*
Handler name: PerformanceAggregator
Input events: IOSPerformanceEvent,
IOSSessionEnd
Input events: MobilePerformanceEvent,
MobileSessionEnd
Output event: IssueEvent
*/
@ -28,7 +28,7 @@ func (va *valueAggregator) aggregate() uint64 {
type PerformanceAggregator struct {
handlers.ReadyMessageStore
pa *IOSPerformanceAggregated
pa *MobilePerformanceAggregated
fps valueAggregator
cpu valueAggregator
memory valueAggregator
@ -39,11 +39,11 @@ type PerformanceAggregator struct {
func (h *PerformanceAggregator) Handle(message Message, messageID uint64, timestamp uint64) Message {
h.lastTimestamp = timestamp
if h.pa == nil {
h.pa = &IOSPerformanceAggregated{} // TODO: struct type in messages
h.pa = &MobilePerformanceAggregated{} // TODO: struct type in messages
}
var event Message = nil
switch m := message.(type) { // TODO: All Timestamp messages
case *IOSPerformanceEvent:
case *MobilePerformanceEvent:
if h.pa.TimestampStart == 0 {
h.pa.TimestampStart = m.Timestamp
}
@ -88,7 +88,7 @@ func (h *PerformanceAggregator) Handle(message Message, messageID uint64, timest
h.pa.MaxBattery = m.Value
}
}
case *IOSSessionEnd:
case *MobileSessionEnd:
event = h.Build()
}
return event
@ -107,7 +107,7 @@ func (h *PerformanceAggregator) Build() Message {
event := h.pa
h.pa = &IOSPerformanceAggregated{}
h.pa = &MobilePerformanceAggregated{}
for _, agg := range []valueAggregator{h.fps, h.cpu, h.memory, h.battery} {
agg.sum = 0
agg.count = 0

View file

@ -1,4 +1,4 @@
package ios
package mobile
import (
"encoding/json"
@ -29,7 +29,7 @@ func (h *TapRageDetector) createPayload() string {
func (h *TapRageDetector) Build() Message {
if h.countsInARow >= MinTapsInARow {
event := &IOSIssueEvent{
event := &MobileIssueEvent{
Type: "tap_rage",
ContextString: h.lastLabel,
Timestamp: h.firstInARawTimestamp,
@ -49,7 +49,7 @@ func (h *TapRageDetector) Build() Message {
func (h *TapRageDetector) Handle(message Message, timestamp uint64) Message {
var event Message = nil
switch m := message.(type) {
case *IOSClickEvent:
case *MobileClickEvent:
if h.lastTimestamp+TapTimeDiff < m.Timestamp && h.lastLabel == m.Label {
h.lastTimestamp = m.Timestamp
h.countsInARow += 1
@ -63,7 +63,7 @@ func (h *TapRageDetector) Handle(message Message, timestamp uint64) Message {
h.firstInARawSeqIndex = m.Index
h.countsInARow = 1
}
case *IOSSessionEnd:
case *MobileSessionEnd:
event = h.Build()
}
return event

View file

@ -1,4 +1,4 @@
package ios
package mobile
import (
. "openreplay/backend/pkg/messages"

View file

@ -16,14 +16,14 @@ func IssueID(projectID uint32, e *messages.IssueEvent) string {
return strconv.FormatUint(uint64(projectID), 16) + hex.EncodeToString(hash.Sum(nil))
}
func IOSIssueID(projectID uint32, e *messages.IOSIssueEvent) string {
func MobileIssueID(projectID uint32, e *messages.MobileIssueEvent) string {
hash := fnv.New128a()
hash.Write([]byte(e.Type))
hash.Write([]byte(e.ContextString))
return strconv.FormatUint(uint64(projectID), 16) + hex.EncodeToString(hash.Sum(nil))
}
func IOSCrashID(projectID uint32, crash *messages.IOSCrash) string {
func MobileCrashID(projectID uint32, crash *messages.MobileCrash) string {
hash := fnv.New128a()
hash.Write([]byte(crash.Name))
hash.Write([]byte(crash.Reason))

View file

@ -5,7 +5,7 @@ func IsReplayerType(id int) bool {
return 1 != id && 3 != id && 17 != id && 23 != id && 24 != id && 25 != id && 26 != id && 27 != id && 28 != id && 29 != id && 30 != id && 31 != id && 32 != id && 42 != id && 56 != id && 62 != id && 63 != id && 64 != id && 66 != id && 78 != id && 80 != id && 81 != id && 82 != id && 112 != id && 115 != id && 125 != id && 126 != id && 127 != id && 90 != id && 91 != id && 92 != id && 94 != id && 95 != id && 97 != id && 98 != id && 107 != id && 110 != id
}
func IsIOSType(id int) bool {
func IsMobileType(id int) bool {
return 90 == id || 91 == id || 92 == id || 93 == id || 94 == id || 95 == id || 96 == id || 97 == id || 98 == id || 100 == id || 101 == id || 102 == id || 103 == id || 104 == id || 105 == id || 106 == id || 107 == id || 110 == id || 111 == id
}

View file

@ -4,58 +4,58 @@ package messages
func GetTimestamp(message Message) uint64 {
switch msg := message.(type) {
case *IOSSessionStart:
case *MobileSessionStart:
return msg.Timestamp
case *IOSSessionEnd:
case *MobileSessionEnd:
return msg.Timestamp
case *IOSMetadata:
case *MobileMetadata:
return msg.Timestamp
case *IOSEvent:
case *MobileEvent:
return msg.Timestamp
case *IOSUserID:
case *MobileUserID:
return msg.Timestamp
case *IOSUserAnonymousID:
case *MobileUserAnonymousID:
return msg.Timestamp
case *IOSScreenChanges:
case *MobileScreenChanges:
return msg.Timestamp
case *IOSCrash:
case *MobileCrash:
return msg.Timestamp
case *IOSViewComponentEvent:
case *MobileViewComponentEvent:
return msg.Timestamp
case *IOSClickEvent:
case *MobileClickEvent:
return msg.Timestamp
case *IOSInputEvent:
case *MobileInputEvent:
return msg.Timestamp
case *IOSPerformanceEvent:
case *MobilePerformanceEvent:
return msg.Timestamp
case *IOSLog:
case *MobileLog:
return msg.Timestamp
case *IOSInternalError:
case *MobileInternalError:
return msg.Timestamp
case *IOSNetworkCall:
case *MobileNetworkCall:
return msg.Timestamp
case *IOSSwipeEvent:
case *MobileSwipeEvent:
return msg.Timestamp
case *IOSBatchMeta:
case *MobileBatchMeta:
return msg.Timestamp
case *IOSIssueEvent:
case *MobileIssueEvent:
return msg.Timestamp
}

View file

@ -46,7 +46,7 @@ func NewMessageIterator(log logger.Logger, messageHandler MessageHandler, messag
iter.preFilter = map[int]struct{}{
MsgBatchMetadata: {}, MsgBatchMeta: {}, MsgTimestamp: {},
MsgSessionStart: {}, MsgSessionEnd: {}, MsgSetPageLocation: {},
MsgIOSBatchMeta: {},
MsgMobileBatchMeta: {},
}
return iter
}
@ -115,8 +115,8 @@ func (i *messageIteratorImpl) Iterate(batchData []byte, batchInfo *BatchInfo) {
msg.Meta().SetMeta(i.messageInfo)
// Update timestamp value for iOS message types
if IsIOSType(msgType) {
msgTime := i.getIOSTimestamp(msg)
if IsMobileType(msgType) {
msgTime := i.getMobileTimestamp(msg)
msg.Meta().Timestamp = msgTime
}
@ -125,7 +125,7 @@ func (i *messageIteratorImpl) Iterate(batchData []byte, batchInfo *BatchInfo) {
}
}
func (i *messageIteratorImpl) getIOSTimestamp(msg Message) uint64 {
func (i *messageIteratorImpl) getMobileTimestamp(msg Message) uint64 {
return GetTimestamp(msg)
}
@ -152,7 +152,7 @@ func (i *messageIteratorImpl) preprocessing(msg Message) error {
i.version = m.Version
i.batchInfo.version = m.Version
case *BatchMeta: // Is not required to be present in batch since IOS doesn't have it (though we might change it)
case *BatchMeta: // Is not required to be present in batch since Mobile doesn't have it (though we might change it)
if i.messageInfo.Index > 1 { // Might be several 0-0 BatchMeta in a row without an error though
return fmt.Errorf("batchMeta found at the end of the batch, info: %s", i.batchInfo.Info())
}
@ -194,14 +194,14 @@ func (i *messageIteratorImpl) preprocessing(msg Message) error {
// Save session page url in cache for using in next batches
i.urls.Set(i.messageInfo.batch.sessionID, m.URL)
case *IOSBatchMeta:
case *MobileBatchMeta:
if i.messageInfo.Index > 1 { // Might be several 0-0 BatchMeta in a row without an error though
return fmt.Errorf("batchMeta found at the end of the batch, info: %s", i.batchInfo.Info())
}
i.messageInfo.Index = m.FirstIndex
i.messageInfo.Timestamp = m.Timestamp
if m.Timestamp == 0 {
i.zeroTsLog("IOSBatchMeta")
i.zeroTsLog("MobileBatchMeta")
}
}
return nil

View file

@ -91,25 +91,25 @@ const (
MsgIssueEvent = 125
MsgSessionEnd = 126
MsgSessionSearch = 127
MsgIOSSessionStart = 90
MsgIOSSessionEnd = 91
MsgIOSMetadata = 92
MsgIOSEvent = 93
MsgIOSUserID = 94
MsgIOSUserAnonymousID = 95
MsgIOSScreenChanges = 96
MsgIOSCrash = 97
MsgIOSViewComponentEvent = 98
MsgIOSClickEvent = 100
MsgIOSInputEvent = 101
MsgIOSPerformanceEvent = 102
MsgIOSLog = 103
MsgIOSInternalError = 104
MsgIOSNetworkCall = 105
MsgIOSSwipeEvent = 106
MsgIOSBatchMeta = 107
MsgIOSPerformanceAggregated = 110
MsgIOSIssueEvent = 111
MsgMobileSessionStart = 90
MsgMobileSessionEnd = 91
MsgMobileMetadata = 92
MsgMobileEvent = 93
MsgMobileUserID = 94
MsgMobileUserAnonymousID = 95
MsgMobileScreenChanges = 96
MsgMobileCrash = 97
MsgMobileViewComponentEvent = 98
MsgMobileClickEvent = 100
MsgMobileInputEvent = 101
MsgMobilePerformanceEvent = 102
MsgMobileLog = 103
MsgMobileInternalError = 104
MsgMobileNetworkCall = 105
MsgMobileSwipeEvent = 106
MsgMobileBatchMeta = 107
MsgMobilePerformanceAggregated = 110
MsgMobileIssueEvent = 111
)
type Timestamp struct {
@ -2430,7 +2430,7 @@ func (msg *SessionSearch) TypeID() int {
return 127
}
type IOSSessionStart struct {
type MobileSessionStart struct {
message
Timestamp uint64
ProjectID uint64
@ -2444,7 +2444,7 @@ type IOSSessionStart struct {
UserCountry string
}
func (msg *IOSSessionStart) Encode() []byte {
func (msg *MobileSessionStart) Encode() []byte {
buf := make([]byte, 101+len(msg.TrackerVersion)+len(msg.RevID)+len(msg.UserUUID)+len(msg.UserOS)+len(msg.UserOSVersion)+len(msg.UserDevice)+len(msg.UserDeviceType)+len(msg.UserCountry))
buf[0] = 90
p := 1
@ -2461,20 +2461,20 @@ func (msg *IOSSessionStart) Encode() []byte {
return buf[:p]
}
func (msg *IOSSessionStart) Decode() Message {
func (msg *MobileSessionStart) Decode() Message {
return msg
}
func (msg *IOSSessionStart) TypeID() int {
func (msg *MobileSessionStart) TypeID() int {
return 90
}
type IOSSessionEnd struct {
type MobileSessionEnd struct {
message
Timestamp uint64
}
func (msg *IOSSessionEnd) Encode() []byte {
func (msg *MobileSessionEnd) Encode() []byte {
buf := make([]byte, 11)
buf[0] = 91
p := 1
@ -2482,15 +2482,15 @@ func (msg *IOSSessionEnd) Encode() []byte {
return buf[:p]
}
func (msg *IOSSessionEnd) Decode() Message {
func (msg *MobileSessionEnd) Decode() Message {
return msg
}
func (msg *IOSSessionEnd) TypeID() int {
func (msg *MobileSessionEnd) TypeID() int {
return 91
}
type IOSMetadata struct {
type MobileMetadata struct {
message
Timestamp uint64
Length uint64
@ -2498,7 +2498,7 @@ type IOSMetadata struct {
Value string
}
func (msg *IOSMetadata) Encode() []byte {
func (msg *MobileMetadata) Encode() []byte {
buf := make([]byte, 41+len(msg.Key)+len(msg.Value))
buf[0] = 92
p := 1
@ -2509,15 +2509,15 @@ func (msg *IOSMetadata) Encode() []byte {
return buf[:p]
}
func (msg *IOSMetadata) Decode() Message {
func (msg *MobileMetadata) Decode() Message {
return msg
}
func (msg *IOSMetadata) TypeID() int {
func (msg *MobileMetadata) TypeID() int {
return 92
}
type IOSEvent struct {
type MobileEvent struct {
message
Timestamp uint64
Length uint64
@ -2525,7 +2525,7 @@ type IOSEvent struct {
Payload string
}
func (msg *IOSEvent) Encode() []byte {
func (msg *MobileEvent) Encode() []byte {
buf := make([]byte, 41+len(msg.Name)+len(msg.Payload))
buf[0] = 93
p := 1
@ -2536,22 +2536,22 @@ func (msg *IOSEvent) Encode() []byte {
return buf[:p]
}
func (msg *IOSEvent) Decode() Message {
func (msg *MobileEvent) Decode() Message {
return msg
}
func (msg *IOSEvent) TypeID() int {
func (msg *MobileEvent) TypeID() int {
return 93
}
type IOSUserID struct {
type MobileUserID struct {
message
Timestamp uint64
Length uint64
ID string
}
func (msg *IOSUserID) Encode() []byte {
func (msg *MobileUserID) Encode() []byte {
buf := make([]byte, 31+len(msg.ID))
buf[0] = 94
p := 1
@ -2561,22 +2561,22 @@ func (msg *IOSUserID) Encode() []byte {
return buf[:p]
}
func (msg *IOSUserID) Decode() Message {
func (msg *MobileUserID) Decode() Message {
return msg
}
func (msg *IOSUserID) TypeID() int {
func (msg *MobileUserID) TypeID() int {
return 94
}
type IOSUserAnonymousID struct {
type MobileUserAnonymousID struct {
message
Timestamp uint64
Length uint64
ID string
}
func (msg *IOSUserAnonymousID) Encode() []byte {
func (msg *MobileUserAnonymousID) Encode() []byte {
buf := make([]byte, 31+len(msg.ID))
buf[0] = 95
p := 1
@ -2586,15 +2586,15 @@ func (msg *IOSUserAnonymousID) Encode() []byte {
return buf[:p]
}
func (msg *IOSUserAnonymousID) Decode() Message {
func (msg *MobileUserAnonymousID) Decode() Message {
return msg
}
func (msg *IOSUserAnonymousID) TypeID() int {
func (msg *MobileUserAnonymousID) TypeID() int {
return 95
}
type IOSScreenChanges struct {
type MobileScreenChanges struct {
message
Timestamp uint64
Length uint64
@ -2604,7 +2604,7 @@ type IOSScreenChanges struct {
Height uint64
}
func (msg *IOSScreenChanges) Encode() []byte {
func (msg *MobileScreenChanges) Encode() []byte {
buf := make([]byte, 61)
buf[0] = 96
p := 1
@ -2617,15 +2617,15 @@ func (msg *IOSScreenChanges) Encode() []byte {
return buf[:p]
}
func (msg *IOSScreenChanges) Decode() Message {
func (msg *MobileScreenChanges) Decode() Message {
return msg
}
func (msg *IOSScreenChanges) TypeID() int {
func (msg *MobileScreenChanges) TypeID() int {
return 96
}
type IOSCrash struct {
type MobileCrash struct {
message
Timestamp uint64
Length uint64
@ -2634,7 +2634,7 @@ type IOSCrash struct {
Stacktrace string
}
func (msg *IOSCrash) Encode() []byte {
func (msg *MobileCrash) Encode() []byte {
buf := make([]byte, 51+len(msg.Name)+len(msg.Reason)+len(msg.Stacktrace))
buf[0] = 97
p := 1
@ -2646,15 +2646,15 @@ func (msg *IOSCrash) Encode() []byte {
return buf[:p]
}
func (msg *IOSCrash) Decode() Message {
func (msg *MobileCrash) Decode() Message {
return msg
}
func (msg *IOSCrash) TypeID() int {
func (msg *MobileCrash) TypeID() int {
return 97
}
type IOSViewComponentEvent struct {
type MobileViewComponentEvent struct {
message
Timestamp uint64
Length uint64
@ -2663,7 +2663,7 @@ type IOSViewComponentEvent struct {
Visible bool
}
func (msg *IOSViewComponentEvent) Encode() []byte {
func (msg *MobileViewComponentEvent) Encode() []byte {
buf := make([]byte, 51+len(msg.ScreenName)+len(msg.ViewName))
buf[0] = 98
p := 1
@ -2675,15 +2675,15 @@ func (msg *IOSViewComponentEvent) Encode() []byte {
return buf[:p]
}
func (msg *IOSViewComponentEvent) Decode() Message {
func (msg *MobileViewComponentEvent) Decode() Message {
return msg
}
func (msg *IOSViewComponentEvent) TypeID() int {
func (msg *MobileViewComponentEvent) TypeID() int {
return 98
}
type IOSClickEvent struct {
type MobileClickEvent struct {
message
Timestamp uint64
Length uint64
@ -2692,7 +2692,7 @@ type IOSClickEvent struct {
Y uint64
}
func (msg *IOSClickEvent) Encode() []byte {
func (msg *MobileClickEvent) Encode() []byte {
buf := make([]byte, 51+len(msg.Label))
buf[0] = 100
p := 1
@ -2704,15 +2704,15 @@ func (msg *IOSClickEvent) Encode() []byte {
return buf[:p]
}
func (msg *IOSClickEvent) Decode() Message {
func (msg *MobileClickEvent) Decode() Message {
return msg
}
func (msg *IOSClickEvent) TypeID() int {
func (msg *MobileClickEvent) TypeID() int {
return 100
}
type IOSInputEvent struct {
type MobileInputEvent struct {
message
Timestamp uint64
Length uint64
@ -2721,7 +2721,7 @@ type IOSInputEvent struct {
Label string
}
func (msg *IOSInputEvent) Encode() []byte {
func (msg *MobileInputEvent) Encode() []byte {
buf := make([]byte, 51+len(msg.Value)+len(msg.Label))
buf[0] = 101
p := 1
@ -2733,15 +2733,15 @@ func (msg *IOSInputEvent) Encode() []byte {
return buf[:p]
}
func (msg *IOSInputEvent) Decode() Message {
func (msg *MobileInputEvent) Decode() Message {
return msg
}
func (msg *IOSInputEvent) TypeID() int {
func (msg *MobileInputEvent) TypeID() int {
return 101
}
type IOSPerformanceEvent struct {
type MobilePerformanceEvent struct {
message
Timestamp uint64
Length uint64
@ -2749,7 +2749,7 @@ type IOSPerformanceEvent struct {
Value uint64
}
func (msg *IOSPerformanceEvent) Encode() []byte {
func (msg *MobilePerformanceEvent) Encode() []byte {
buf := make([]byte, 41+len(msg.Name))
buf[0] = 102
p := 1
@ -2760,15 +2760,15 @@ func (msg *IOSPerformanceEvent) Encode() []byte {
return buf[:p]
}
func (msg *IOSPerformanceEvent) Decode() Message {
func (msg *MobilePerformanceEvent) Decode() Message {
return msg
}
func (msg *IOSPerformanceEvent) TypeID() int {
func (msg *MobilePerformanceEvent) TypeID() int {
return 102
}
type IOSLog struct {
type MobileLog struct {
message
Timestamp uint64
Length uint64
@ -2776,7 +2776,7 @@ type IOSLog struct {
Content string
}
func (msg *IOSLog) Encode() []byte {
func (msg *MobileLog) Encode() []byte {
buf := make([]byte, 41+len(msg.Severity)+len(msg.Content))
buf[0] = 103
p := 1
@ -2787,22 +2787,22 @@ func (msg *IOSLog) Encode() []byte {
return buf[:p]
}
func (msg *IOSLog) Decode() Message {
func (msg *MobileLog) Decode() Message {
return msg
}
func (msg *IOSLog) TypeID() int {
func (msg *MobileLog) TypeID() int {
return 103
}
type IOSInternalError struct {
type MobileInternalError struct {
message
Timestamp uint64
Length uint64
Content string
}
func (msg *IOSInternalError) Encode() []byte {
func (msg *MobileInternalError) Encode() []byte {
buf := make([]byte, 31+len(msg.Content))
buf[0] = 104
p := 1
@ -2812,15 +2812,15 @@ func (msg *IOSInternalError) Encode() []byte {
return buf[:p]
}
func (msg *IOSInternalError) Decode() Message {
func (msg *MobileInternalError) Decode() Message {
return msg
}
func (msg *IOSInternalError) TypeID() int {
func (msg *MobileInternalError) TypeID() int {
return 104
}
type IOSNetworkCall struct {
type MobileNetworkCall struct {
message
Timestamp uint64
Length uint64
@ -2833,7 +2833,7 @@ type IOSNetworkCall struct {
Duration uint64
}
func (msg *IOSNetworkCall) Encode() []byte {
func (msg *MobileNetworkCall) Encode() []byte {
buf := make([]byte, 91+len(msg.Type)+len(msg.Method)+len(msg.URL)+len(msg.Request)+len(msg.Response))
buf[0] = 105
p := 1
@ -2849,15 +2849,15 @@ func (msg *IOSNetworkCall) Encode() []byte {
return buf[:p]
}
func (msg *IOSNetworkCall) Decode() Message {
func (msg *MobileNetworkCall) Decode() Message {
return msg
}
func (msg *IOSNetworkCall) TypeID() int {
func (msg *MobileNetworkCall) TypeID() int {
return 105
}
type IOSSwipeEvent struct {
type MobileSwipeEvent struct {
message
Timestamp uint64
Length uint64
@ -2867,7 +2867,7 @@ type IOSSwipeEvent struct {
Direction string
}
func (msg *IOSSwipeEvent) Encode() []byte {
func (msg *MobileSwipeEvent) Encode() []byte {
buf := make([]byte, 61+len(msg.Label)+len(msg.Direction))
buf[0] = 106
p := 1
@ -2880,22 +2880,22 @@ func (msg *IOSSwipeEvent) Encode() []byte {
return buf[:p]
}
func (msg *IOSSwipeEvent) Decode() Message {
func (msg *MobileSwipeEvent) Decode() Message {
return msg
}
func (msg *IOSSwipeEvent) TypeID() int {
func (msg *MobileSwipeEvent) TypeID() int {
return 106
}
type IOSBatchMeta struct {
type MobileBatchMeta struct {
message
Timestamp uint64
Length uint64
FirstIndex uint64
}
func (msg *IOSBatchMeta) Encode() []byte {
func (msg *MobileBatchMeta) Encode() []byte {
buf := make([]byte, 31)
buf[0] = 107
p := 1
@ -2905,15 +2905,15 @@ func (msg *IOSBatchMeta) Encode() []byte {
return buf[:p]
}
func (msg *IOSBatchMeta) Decode() Message {
func (msg *MobileBatchMeta) Decode() Message {
return msg
}
func (msg *IOSBatchMeta) TypeID() int {
func (msg *MobileBatchMeta) TypeID() int {
return 107
}
type IOSPerformanceAggregated struct {
type MobilePerformanceAggregated struct {
message
TimestampStart uint64
TimestampEnd uint64
@ -2931,7 +2931,7 @@ type IOSPerformanceAggregated struct {
MaxBattery uint64
}
func (msg *IOSPerformanceAggregated) Encode() []byte {
func (msg *MobilePerformanceAggregated) Encode() []byte {
buf := make([]byte, 141)
buf[0] = 110
p := 1
@ -2952,15 +2952,15 @@ func (msg *IOSPerformanceAggregated) Encode() []byte {
return buf[:p]
}
func (msg *IOSPerformanceAggregated) Decode() Message {
func (msg *MobilePerformanceAggregated) Decode() Message {
return msg
}
func (msg *IOSPerformanceAggregated) TypeID() int {
func (msg *MobilePerformanceAggregated) TypeID() int {
return 110
}
type IOSIssueEvent struct {
type MobileIssueEvent struct {
message
Timestamp uint64
Type string
@ -2969,7 +2969,7 @@ type IOSIssueEvent struct {
Payload string
}
func (msg *IOSIssueEvent) Encode() []byte {
func (msg *MobileIssueEvent) Encode() []byte {
buf := make([]byte, 51+len(msg.Type)+len(msg.ContextString)+len(msg.Context)+len(msg.Payload))
buf[0] = 111
p := 1
@ -2981,10 +2981,10 @@ func (msg *IOSIssueEvent) Encode() []byte {
return buf[:p]
}
func (msg *IOSIssueEvent) Decode() Message {
func (msg *MobileIssueEvent) Decode() Message {
return msg
}
func (msg *IOSIssueEvent) TypeID() int {
func (msg *MobileIssueEvent) TypeID() int {
return 111
}

View file

@ -1479,9 +1479,9 @@ func DecodeSessionSearch(reader BytesReader) (Message, error) {
return msg, err
}
func DecodeIOSSessionStart(reader BytesReader) (Message, error) {
func DecodeMobileSessionStart(reader BytesReader) (Message, error) {
var err error = nil
msg := &IOSSessionStart{}
msg := &MobileSessionStart{}
if msg.Timestamp, err = reader.ReadUint(); err != nil {
return nil, err
}
@ -1515,18 +1515,18 @@ func DecodeIOSSessionStart(reader BytesReader) (Message, error) {
return msg, err
}
func DecodeIOSSessionEnd(reader BytesReader) (Message, error) {
func DecodeMobileSessionEnd(reader BytesReader) (Message, error) {
var err error = nil
msg := &IOSSessionEnd{}
msg := &MobileSessionEnd{}
if msg.Timestamp, err = reader.ReadUint(); err != nil {
return nil, err
}
return msg, err
}
func DecodeIOSMetadata(reader BytesReader) (Message, error) {
func DecodeMobileMetadata(reader BytesReader) (Message, error) {
var err error = nil
msg := &IOSMetadata{}
msg := &MobileMetadata{}
if msg.Timestamp, err = reader.ReadUint(); err != nil {
return nil, err
}
@ -1542,9 +1542,9 @@ func DecodeIOSMetadata(reader BytesReader) (Message, error) {
return msg, err
}
func DecodeIOSEvent(reader BytesReader) (Message, error) {
func DecodeMobileEvent(reader BytesReader) (Message, error) {
var err error = nil
msg := &IOSEvent{}
msg := &MobileEvent{}
if msg.Timestamp, err = reader.ReadUint(); err != nil {
return nil, err
}
@ -1560,9 +1560,9 @@ func DecodeIOSEvent(reader BytesReader) (Message, error) {
return msg, err
}
func DecodeIOSUserID(reader BytesReader) (Message, error) {
func DecodeMobileUserID(reader BytesReader) (Message, error) {
var err error = nil
msg := &IOSUserID{}
msg := &MobileUserID{}
if msg.Timestamp, err = reader.ReadUint(); err != nil {
return nil, err
}
@ -1575,9 +1575,9 @@ func DecodeIOSUserID(reader BytesReader) (Message, error) {
return msg, err
}
func DecodeIOSUserAnonymousID(reader BytesReader) (Message, error) {
func DecodeMobileUserAnonymousID(reader BytesReader) (Message, error) {
var err error = nil
msg := &IOSUserAnonymousID{}
msg := &MobileUserAnonymousID{}
if msg.Timestamp, err = reader.ReadUint(); err != nil {
return nil, err
}
@ -1590,9 +1590,9 @@ func DecodeIOSUserAnonymousID(reader BytesReader) (Message, error) {
return msg, err
}
func DecodeIOSScreenChanges(reader BytesReader) (Message, error) {
func DecodeMobileScreenChanges(reader BytesReader) (Message, error) {
var err error = nil
msg := &IOSScreenChanges{}
msg := &MobileScreenChanges{}
if msg.Timestamp, err = reader.ReadUint(); err != nil {
return nil, err
}
@ -1614,9 +1614,9 @@ func DecodeIOSScreenChanges(reader BytesReader) (Message, error) {
return msg, err
}
func DecodeIOSCrash(reader BytesReader) (Message, error) {
func DecodeMobileCrash(reader BytesReader) (Message, error) {
var err error = nil
msg := &IOSCrash{}
msg := &MobileCrash{}
if msg.Timestamp, err = reader.ReadUint(); err != nil {
return nil, err
}
@ -1635,9 +1635,9 @@ func DecodeIOSCrash(reader BytesReader) (Message, error) {
return msg, err
}
func DecodeIOSViewComponentEvent(reader BytesReader) (Message, error) {
func DecodeMobileViewComponentEvent(reader BytesReader) (Message, error) {
var err error = nil
msg := &IOSViewComponentEvent{}
msg := &MobileViewComponentEvent{}
if msg.Timestamp, err = reader.ReadUint(); err != nil {
return nil, err
}
@ -1656,9 +1656,9 @@ func DecodeIOSViewComponentEvent(reader BytesReader) (Message, error) {
return msg, err
}
func DecodeIOSClickEvent(reader BytesReader) (Message, error) {
func DecodeMobileClickEvent(reader BytesReader) (Message, error) {
var err error = nil
msg := &IOSClickEvent{}
msg := &MobileClickEvent{}
if msg.Timestamp, err = reader.ReadUint(); err != nil {
return nil, err
}
@ -1677,9 +1677,9 @@ func DecodeIOSClickEvent(reader BytesReader) (Message, error) {
return msg, err
}
func DecodeIOSInputEvent(reader BytesReader) (Message, error) {
func DecodeMobileInputEvent(reader BytesReader) (Message, error) {
var err error = nil
msg := &IOSInputEvent{}
msg := &MobileInputEvent{}
if msg.Timestamp, err = reader.ReadUint(); err != nil {
return nil, err
}
@ -1698,9 +1698,9 @@ func DecodeIOSInputEvent(reader BytesReader) (Message, error) {
return msg, err
}
func DecodeIOSPerformanceEvent(reader BytesReader) (Message, error) {
func DecodeMobilePerformanceEvent(reader BytesReader) (Message, error) {
var err error = nil
msg := &IOSPerformanceEvent{}
msg := &MobilePerformanceEvent{}
if msg.Timestamp, err = reader.ReadUint(); err != nil {
return nil, err
}
@ -1716,9 +1716,9 @@ func DecodeIOSPerformanceEvent(reader BytesReader) (Message, error) {
return msg, err
}
func DecodeIOSLog(reader BytesReader) (Message, error) {
func DecodeMobileLog(reader BytesReader) (Message, error) {
var err error = nil
msg := &IOSLog{}
msg := &MobileLog{}
if msg.Timestamp, err = reader.ReadUint(); err != nil {
return nil, err
}
@ -1734,9 +1734,9 @@ func DecodeIOSLog(reader BytesReader) (Message, error) {
return msg, err
}
func DecodeIOSInternalError(reader BytesReader) (Message, error) {
func DecodeMobileInternalError(reader BytesReader) (Message, error) {
var err error = nil
msg := &IOSInternalError{}
msg := &MobileInternalError{}
if msg.Timestamp, err = reader.ReadUint(); err != nil {
return nil, err
}
@ -1749,9 +1749,9 @@ func DecodeIOSInternalError(reader BytesReader) (Message, error) {
return msg, err
}
func DecodeIOSNetworkCall(reader BytesReader) (Message, error) {
func DecodeMobileNetworkCall(reader BytesReader) (Message, error) {
var err error = nil
msg := &IOSNetworkCall{}
msg := &MobileNetworkCall{}
if msg.Timestamp, err = reader.ReadUint(); err != nil {
return nil, err
}
@ -1782,9 +1782,9 @@ func DecodeIOSNetworkCall(reader BytesReader) (Message, error) {
return msg, err
}
func DecodeIOSSwipeEvent(reader BytesReader) (Message, error) {
func DecodeMobileSwipeEvent(reader BytesReader) (Message, error) {
var err error = nil
msg := &IOSSwipeEvent{}
msg := &MobileSwipeEvent{}
if msg.Timestamp, err = reader.ReadUint(); err != nil {
return nil, err
}
@ -1806,9 +1806,9 @@ func DecodeIOSSwipeEvent(reader BytesReader) (Message, error) {
return msg, err
}
func DecodeIOSBatchMeta(reader BytesReader) (Message, error) {
func DecodeMobileBatchMeta(reader BytesReader) (Message, error) {
var err error = nil
msg := &IOSBatchMeta{}
msg := &MobileBatchMeta{}
if msg.Timestamp, err = reader.ReadUint(); err != nil {
return nil, err
}
@ -1821,9 +1821,9 @@ func DecodeIOSBatchMeta(reader BytesReader) (Message, error) {
return msg, err
}
func DecodeIOSPerformanceAggregated(reader BytesReader) (Message, error) {
func DecodeMobilePerformanceAggregated(reader BytesReader) (Message, error) {
var err error = nil
msg := &IOSPerformanceAggregated{}
msg := &MobilePerformanceAggregated{}
if msg.TimestampStart, err = reader.ReadUint(); err != nil {
return nil, err
}
@ -1869,9 +1869,9 @@ func DecodeIOSPerformanceAggregated(reader BytesReader) (Message, error) {
return msg, err
}
func DecodeIOSIssueEvent(reader BytesReader) (Message, error) {
func DecodeMobileIssueEvent(reader BytesReader) (Message, error) {
var err error = nil
msg := &IOSIssueEvent{}
msg := &MobileIssueEvent{}
if msg.Timestamp, err = reader.ReadUint(); err != nil {
return nil, err
}
@ -2071,43 +2071,43 @@ func ReadMessage(t uint64, reader BytesReader) (Message, error) {
case 127:
return DecodeSessionSearch(reader)
case 90:
return DecodeIOSSessionStart(reader)
return DecodeMobileSessionStart(reader)
case 91:
return DecodeIOSSessionEnd(reader)
return DecodeMobileSessionEnd(reader)
case 92:
return DecodeIOSMetadata(reader)
return DecodeMobileMetadata(reader)
case 93:
return DecodeIOSEvent(reader)
return DecodeMobileEvent(reader)
case 94:
return DecodeIOSUserID(reader)
return DecodeMobileUserID(reader)
case 95:
return DecodeIOSUserAnonymousID(reader)
return DecodeMobileUserAnonymousID(reader)
case 96:
return DecodeIOSScreenChanges(reader)
return DecodeMobileScreenChanges(reader)
case 97:
return DecodeIOSCrash(reader)
return DecodeMobileCrash(reader)
case 98:
return DecodeIOSViewComponentEvent(reader)
return DecodeMobileViewComponentEvent(reader)
case 100:
return DecodeIOSClickEvent(reader)
return DecodeMobileClickEvent(reader)
case 101:
return DecodeIOSInputEvent(reader)
return DecodeMobileInputEvent(reader)
case 102:
return DecodeIOSPerformanceEvent(reader)
return DecodeMobilePerformanceEvent(reader)
case 103:
return DecodeIOSLog(reader)
return DecodeMobileLog(reader)
case 104:
return DecodeIOSInternalError(reader)
return DecodeMobileInternalError(reader)
case 105:
return DecodeIOSNetworkCall(reader)
return DecodeMobileNetworkCall(reader)
case 106:
return DecodeIOSSwipeEvent(reader)
return DecodeMobileSwipeEvent(reader)
case 107:
return DecodeIOSBatchMeta(reader)
return DecodeMobileBatchMeta(reader)
case 110:
return DecodeIOSPerformanceAggregated(reader)
return DecodeMobilePerformanceAggregated(reader)
case 111:
return DecodeIOSIssueEvent(reader)
return DecodeMobileIssueEvent(reader)
}
return nil, fmt.Errorf("unknown message code: %v", t)
}

View file

@ -76,19 +76,19 @@ func (s *saverImpl) handleExtraMessage(msg messages.Message) error {
return s.ch.InsertMouseThrashing(session, m)
// Mobile messages
case *messages.IOSSessionEnd:
case *messages.MobileSessionEnd:
return s.ch.InsertMobileSession(session)
case *messages.IOSEvent:
case *messages.MobileEvent:
return s.ch.InsertMobileCustom(session, m)
case *messages.IOSClickEvent:
case *messages.MobileClickEvent:
return s.ch.InsertMobileClick(session, m)
case *messages.IOSSwipeEvent:
case *messages.MobileSwipeEvent:
return s.ch.InsertMobileSwipe(session, m)
case *messages.IOSInputEvent:
case *messages.MobileInputEvent:
return s.ch.InsertMobileInput(session, m)
case *messages.IOSNetworkCall:
case *messages.MobileNetworkCall:
return s.ch.InsertMobileRequest(session, m, session.SaveRequestPayload)
case *messages.IOSCrash:
case *messages.MobileCrash:
return s.ch.InsertMobileCrash(session, m)
}
return nil

View file

@ -14,7 +14,7 @@ func (e *Router) getConditions(w http.ResponseWriter, r *http.Request) {
// Check authorization
_, err := e.services.Tokenizer.ParseFromHTTPRequest(r)
if err != nil {
ResponseWithError(w, http.StatusUnauthorized, err, startTime, r.URL.Path, bodySize)
e.ResponseWithError(r.Context(), w, http.StatusUnauthorized, err, startTime, r.URL.Path, bodySize)
return
}
@ -23,15 +23,15 @@ func (e *Router) getConditions(w http.ResponseWriter, r *http.Request) {
projID := vars["project"]
projectID, err := strconv.Atoi(projID)
if err != nil {
ResponseWithError(w, http.StatusBadRequest, err, startTime, r.URL.Path, bodySize)
e.ResponseWithError(r.Context(), w, http.StatusBadRequest, err, startTime, r.URL.Path, bodySize)
return
}
// Get task info
info, err := e.services.Conditions.Get(uint32(projectID))
if err != nil {
ResponseWithError(w, http.StatusInternalServerError, err, startTime, r.URL.Path, bodySize)
e.ResponseWithError(r.Context(), w, http.StatusInternalServerError, err, startTime, r.URL.Path, bodySize)
return
}
ResponseWithJSON(w, info, startTime, r.URL.Path, bodySize)
e.ResponseWithJSON(r.Context(), w, info, startTime, r.URL.Path, bodySize)
}

View file

@ -38,12 +38,12 @@ type Connector interface {
InsertMouseThrashing(session *sessions.Session, msg *messages.MouseThrashing) error
// Mobile
InsertMobileSession(session *sessions.Session) error
InsertMobileCustom(session *sessions.Session, msg *messages.IOSEvent) error
InsertMobileClick(session *sessions.Session, msg *messages.IOSClickEvent) error
InsertMobileSwipe(session *sessions.Session, msg *messages.IOSSwipeEvent) error
InsertMobileInput(session *sessions.Session, msg *messages.IOSInputEvent) error
InsertMobileRequest(session *sessions.Session, msg *messages.IOSNetworkCall, savePayload bool) error
InsertMobileCrash(session *sessions.Session, msg *messages.IOSCrash) error
InsertMobileCustom(session *sessions.Session, msg *messages.MobileEvent) error
InsertMobileClick(session *sessions.Session, msg *messages.MobileClickEvent) error
InsertMobileSwipe(session *sessions.Session, msg *messages.MobileSwipeEvent) error
InsertMobileInput(session *sessions.Session, msg *messages.MobileInputEvent) error
InsertMobileRequest(session *sessions.Session, msg *messages.MobileNetworkCall, savePayload bool) error
InsertMobileCrash(session *sessions.Session, msg *messages.MobileCrash) error
}
type task struct {
@ -582,7 +582,7 @@ func (c *connectorImpl) InsertMobileSession(session *sessions.Session) error {
return nil
}
func (c *connectorImpl) InsertMobileCustom(session *sessions.Session, msg *messages.IOSEvent) error {
func (c *connectorImpl) InsertMobileCustom(session *sessions.Session, msg *messages.MobileEvent) error {
if err := c.batches["ios_custom"].Append(
session.SessionID,
uint16(session.ProjectID),
@ -598,7 +598,7 @@ func (c *connectorImpl) InsertMobileCustom(session *sessions.Session, msg *messa
return nil
}
func (c *connectorImpl) InsertMobileClick(session *sessions.Session, msg *messages.IOSClickEvent) error {
func (c *connectorImpl) InsertMobileClick(session *sessions.Session, msg *messages.MobileClickEvent) error {
if msg.Label == "" {
return nil
}
@ -616,7 +616,7 @@ func (c *connectorImpl) InsertMobileClick(session *sessions.Session, msg *messag
return nil
}
func (c *connectorImpl) InsertMobileSwipe(session *sessions.Session, msg *messages.IOSSwipeEvent) error {
func (c *connectorImpl) InsertMobileSwipe(session *sessions.Session, msg *messages.MobileSwipeEvent) error {
if msg.Label == "" {
return nil
}
@ -635,7 +635,7 @@ func (c *connectorImpl) InsertMobileSwipe(session *sessions.Session, msg *messag
return nil
}
func (c *connectorImpl) InsertMobileInput(session *sessions.Session, msg *messages.IOSInputEvent) error {
func (c *connectorImpl) InsertMobileInput(session *sessions.Session, msg *messages.MobileInputEvent) error {
if msg.Label == "" {
return nil
}
@ -653,7 +653,7 @@ func (c *connectorImpl) InsertMobileInput(session *sessions.Session, msg *messag
return nil
}
func (c *connectorImpl) InsertMobileRequest(session *sessions.Session, msg *messages.IOSNetworkCall, savePayload bool) error {
func (c *connectorImpl) InsertMobileRequest(session *sessions.Session, msg *messages.MobileNetworkCall, savePayload bool) error {
urlMethod := url.EnsureMethod(msg.Method)
if urlMethod == "" {
return fmt.Errorf("can't parse http method. sess: %d, method: %s", session.SessionID, msg.Method)
@ -683,7 +683,7 @@ func (c *connectorImpl) InsertMobileRequest(session *sessions.Session, msg *mess
return nil
}
func (c *connectorImpl) InsertMobileCrash(session *sessions.Session, msg *messages.IOSCrash) error {
func (c *connectorImpl) InsertMobileCrash(session *sessions.Session, msg *messages.MobileCrash) error {
if err := c.batches["ios_crashes"].Append(
session.SessionID,
uint16(session.ProjectID),

View file

@ -1,4 +1,4 @@
message 90, 'IOSSessionStart', :replayer => false do
message 90, 'MobileSessionStart', :replayer => false do
uint 'Timestamp'
uint 'ProjectID'
string 'TrackerVersion'
@ -11,37 +11,37 @@ message 90, 'IOSSessionStart', :replayer => false do
string 'UserCountry'
end
message 91, 'IOSSessionEnd' do
message 91, 'MobileSessionEnd' do
uint 'Timestamp'
end
message 92, 'IOSMetadata' do
message 92, 'MobileMetadata' do
uint 'Timestamp'
uint 'Length'
string 'Key'
string 'Value'
end
message 93, 'IOSEvent', :replayer => true do
message 93, 'MobileEvent', :replayer => true do
uint 'Timestamp'
uint 'Length'
string 'Name'
string 'Payload'
end
message 94, 'IOSUserID' do
message 94, 'MobileUserID' do
uint 'Timestamp'
uint 'Length'
string 'ID'
end
message 95, 'IOSUserAnonymousID' do
message 95, 'MobileUserAnonymousID' do
uint 'Timestamp'
uint 'Length'
string 'ID'
end
message 96, 'IOSScreenChanges', :replayer => true do
message 96, 'MobileScreenChanges', :replayer => true do
uint 'Timestamp'
uint 'Length'
uint 'X'
@ -50,7 +50,7 @@ message 96, 'IOSScreenChanges', :replayer => true do
uint 'Height'
end
message 97, 'IOSCrash' do
message 97, 'MobileCrash' do
uint 'Timestamp'
uint 'Length'
string 'Name'
@ -58,7 +58,7 @@ message 97, 'IOSCrash' do
string 'Stacktrace'
end
message 98, 'IOSViewComponentEvent' do
message 98, 'MobileViewComponentEvent' do
uint 'Timestamp'
uint 'Length'
string 'ScreenName'
@ -66,7 +66,7 @@ message 98, 'IOSViewComponentEvent' do
boolean 'Visible'
end
message 100, 'IOSClickEvent', :replayer => true do
message 100, 'MobileClickEvent', :replayer => true do
uint 'Timestamp'
uint 'Length'
string 'Label'
@ -74,7 +74,7 @@ message 100, 'IOSClickEvent', :replayer => true do
uint 'Y'
end
message 101, 'IOSInputEvent', :replayer => true do
message 101, 'MobileInputEvent', :replayer => true do
uint 'Timestamp'
uint 'Length'
string 'Value'
@ -97,27 +97,27 @@ Name/Value may be :
"memoryUsage": Used memory in bytes
"fps": Frames per second
=end
message 102, 'IOSPerformanceEvent', :replayer => true do
message 102, 'MobilePerformanceEvent', :replayer => true do
uint 'Timestamp'
uint 'Length'
string 'Name'
uint 'Value'
end
message 103, 'IOSLog', :replayer => true do
message 103, 'MobileLog', :replayer => true do
uint 'Timestamp'
uint 'Length'
string 'Severity' # Possible values ("info", "error")
string 'Content'
end
message 104, 'IOSInternalError', :replayer => true do
message 104, 'MobileInternalError', :replayer => true do
uint 'Timestamp'
uint 'Length'
string 'Content'
end
message 105, 'IOSNetworkCall', :replayer => true do
message 105, 'MobileNetworkCall', :replayer => true do
uint 'Timestamp'
uint 'Length'
string 'Type'
@ -129,7 +129,7 @@ message 105, 'IOSNetworkCall', :replayer => true do
uint 'Duration'
end
message 106, 'IOSSwipeEvent', :replayer => true do
message 106, 'MobileSwipeEvent', :replayer => true do
uint 'Timestamp'
uint 'Length'
string 'Label'
@ -138,13 +138,13 @@ message 106, 'IOSSwipeEvent', :replayer => true do
string 'Direction'
end
message 107, 'IOSBatchMeta' do
message 107, 'MobileBatchMeta' do
uint 'Timestamp'
uint 'Length'
uint 'FirstIndex'
end
message 110, 'IOSPerformanceAggregated', :swift => false do
message 110, 'MobilePerformanceAggregated', :swift => false do
uint 'TimestampStart'
uint 'TimestampEnd'
uint 'MinFPS'
@ -161,7 +161,7 @@ message 110, 'IOSPerformanceAggregated', :swift => false do
uint 'MaxBattery'
end
message 111, 'IOSIssueEvent', :replayer => true do
message 111, 'MobileIssueEvent', :replayer => true do
uint 'Timestamp'
string 'Type'
string 'ContextString'

View file

@ -139,7 +139,7 @@ end
require './messages.rb'
$context = :ios
require './ios_messages.rb'
require './mobile_messages.rb'
Dir["templates/*.erb"].each do |tpl|
e = ERB.new(File.read(tpl))

View file

@ -5,7 +5,7 @@ func IsReplayerType(id int) bool {
return <%= $messages.select { |msg| msg.replayer == false }.map{ |msg| "#{msg.id} != id" }.join(' && ') %>
}
func IsIOSType(id int) bool {
func IsMobileType(id int) bool {
return <%= $messages.select { |msg| msg.context == :ios }.map{ |msg| "#{msg.id} == id"}.join(' || ') %>
}