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:
parent
a316c90472
commit
2bf9298836
33 changed files with 327 additions and 327 deletions
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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"`
|
||||
|
|
|
|||
|
|
@ -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"`
|
||||
|
|
|
|||
|
|
@ -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"`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"`
|
||||
|
|
|
|||
|
|
@ -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"`
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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"`
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package ios
|
||||
package mobile
|
||||
|
||||
import (
|
||||
. "openreplay/backend/pkg/messages"
|
||||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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(' || ') %>
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue