* feat(backend): handlers for mobile messages * feat(backend): new service template * feat(backend): save mobile session start and send batches to kafka * feat(backend): added mobile support to sink, ender and storage * helm(videostorage): added helm chart for a new service videostorage * fix(backend): added pointer to streing for userBrowser (because it's null for mobile sessions) * feat(backend): added MsgIOSBatchMeta handler to message iterator's logic * feat(backend): added ios ts parser to ender * feat(backend): enabled producing batch of messages to queue * feat(backend): removed iosstart from mob files * feat(backend): added new ios message types * feat(backend): added iosStart and iosEnd * fix(backend): fixed log issue * feat(backend): send tar.gz archives to special queue topic * feat(backend): read raw archives from kafka * fix(backend): added missing file * fix(backend): removed the second file reading * fix(backend): fixed wrong queue topic name * fix(backend): fixed mobile trigger topic name * feat(backend): added tar.gz extractor and iOSSessionEnd handler * feat(backend): debug logs on message uploading * fix(backend): added raw-images topic consumption * feat(backend): now sink send iosSessionEnd to video-storage * feat(backend): added dir creator for new sessions * feat(backend): added correct command to execute * feat(backend): added overwrite option * feat(backend): added s3 uploader for video session replays * feat(backend): new consumer group for mobile sessions * feat(backend): debug logs for uploader * feat(backend): removed unused log * feat(backend): fixed s3 key for video replays * feat(backend): removed debug code * feat(backend): fixed video-storage message filter * fix(backend): added mobileSessionEnd to SessionEnd converter * feat(backend): added first version if db support for mobile events * fix(backend): added swipe events to mob file * feat(backend): added swipe event to pg * feat(backend): split logic into 2 services: image-storage and video-storage * feat(backend): added helm chart for image-storage service * fix(backend): fixed table name for mobile taps * feat(backend): added metadata handler for mobile message parser + fix message filters * feat(backend): added iosRawTopic to DB message consumer * fix(backend): removed value from mobile inputs * feat(backend): removed debug log from iterator * feat(backend): added new apple devices to iOS device parser * fix(backend): added real projectID instead of 0 * feat(backend): extended a list of simulators for device detector * feat(backend): updated networkCall mobile message * fix(backend): added new way to define is network call successed or not * feat(backend): added timezone support for mobile start request * feat(backend): added 2 mobile events Input and Click to mob file * feat(backend): refactored image storage * feat(backend): video storage with 2 workers * feat(backend): added project's platform support * feat(backend): added memory size field for mobile start request * feat(backend): changed video preset for ultrafast * feat(backend): added debug log to http /late handler * feat(backend): added debug log to db service for iosCrash messages * feat(backend): added tapRage event handler to heuristics * feat(backend): changed table and field names for ios crashes * feat(backend): added payload for tapRage events * feat(backend): added TapRage events insert to DB * feat(backend): added fps value to /mobile/start response * feat(backend): added image quality parameter to /mobile/start response * feat(backend): added ScreenLeave handler * feat(backend): removed screenEnter and screenLeave events, added new viewComponent event --------- Co-authored-by: rjshrjndrn <rjshrjndrn@gmail.com>
898 lines
30 KiB
Python
898 lines
30 KiB
Python
# Auto-generated, do not edit
|
|
|
|
from msgcodec.codec import Codec
|
|
from msgcodec.messages import *
|
|
from typing import List
|
|
import io
|
|
|
|
class MessageCodec(Codec):
|
|
|
|
def __init__(self, msg_selector: List[int] = list()):
|
|
self.msg_selector = msg_selector
|
|
|
|
def read_message_id(self, reader: io.BytesIO) -> int:
|
|
"""
|
|
Read and return the first byte where the message id is encoded
|
|
"""
|
|
id_ = self.read_uint(reader)
|
|
return id_
|
|
|
|
def encode(self, m: Message) -> bytes:
|
|
...
|
|
|
|
def decode(self, b: bytes) -> Message:
|
|
reader = io.BytesIO(b)
|
|
return self.read_head_message(reader)
|
|
|
|
@staticmethod
|
|
def check_message_id(b: bytes) -> int:
|
|
"""
|
|
todo: make it static and without reader. It's just the first byte
|
|
Read and return the first byte where the message id is encoded
|
|
"""
|
|
reader = io.BytesIO(b)
|
|
id_ = Codec.read_uint(reader)
|
|
|
|
return id_
|
|
|
|
@staticmethod
|
|
def decode_key(b) -> int:
|
|
"""
|
|
Decode the message key (encoded with little endian)
|
|
"""
|
|
try:
|
|
decoded = int.from_bytes(b, "little", signed=False)
|
|
except Exception as e:
|
|
raise UnicodeDecodeError(f"Error while decoding message key (SessionID) from {b}\n{e}")
|
|
return decoded
|
|
|
|
def decode_detailed(self, b: bytes) -> List[Message]:
|
|
reader = io.BytesIO(b)
|
|
messages_list = list()
|
|
try:
|
|
messages_list.append(self.handler(reader, 0))
|
|
except IndexError:
|
|
print('[WARN] Broken batch')
|
|
return list()
|
|
if isinstance(messages_list[0], BatchMeta):
|
|
# Old BatchMeta
|
|
mode = 0
|
|
elif isinstance(messages_list[0], BatchMetadata):
|
|
# New BatchMeta
|
|
if messages_list[0].version == 0:
|
|
mode = 0
|
|
else:
|
|
mode = 1
|
|
else:
|
|
return messages_list
|
|
while True:
|
|
try:
|
|
msg_decoded = self.handler(reader, mode)
|
|
if msg_decoded is not None:
|
|
messages_list.append(msg_decoded)
|
|
except IndexError:
|
|
break
|
|
return messages_list
|
|
|
|
def handler(self, reader: io.BytesIO, mode=0) -> Message:
|
|
message_id = self.read_message_id(reader)
|
|
#print(f'[INFO-context] Current mode {mode}')
|
|
#print(f'[INFO] Currently processing message type {message_id}')
|
|
if mode == 1:
|
|
# We read the three bytes representing the length of message. It can be used to skip unwanted messages
|
|
r_size = self.read_size(reader)
|
|
if message_id not in self.msg_selector:
|
|
reader.read(r_size)
|
|
return None
|
|
return self.read_head_message(reader, message_id)
|
|
elif mode == 0:
|
|
# Old format with no bytes for message length
|
|
return self.read_head_message(reader, message_id)
|
|
else:
|
|
raise IOError()
|
|
|
|
def read_head_message(self, reader: io.BytesIO, message_id) -> Message:
|
|
|
|
if message_id == 0:
|
|
return Timestamp(
|
|
timestamp=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 1:
|
|
return SessionStart(
|
|
timestamp=self.read_uint(reader),
|
|
project_id=self.read_uint(reader),
|
|
tracker_version=self.read_string(reader),
|
|
rev_id=self.read_string(reader),
|
|
user_uuid=self.read_string(reader),
|
|
user_agent=self.read_string(reader),
|
|
user_os=self.read_string(reader),
|
|
user_os_version=self.read_string(reader),
|
|
user_browser=self.read_string(reader),
|
|
user_browser_version=self.read_string(reader),
|
|
user_device=self.read_string(reader),
|
|
user_device_type=self.read_string(reader),
|
|
user_device_memory_size=self.read_uint(reader),
|
|
user_device_heap_size=self.read_uint(reader),
|
|
user_country=self.read_string(reader),
|
|
user_id=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 3:
|
|
return SessionEndDeprecated(
|
|
timestamp=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 4:
|
|
return SetPageLocation(
|
|
url=self.read_string(reader),
|
|
referrer=self.read_string(reader),
|
|
navigation_start=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 5:
|
|
return SetViewportSize(
|
|
width=self.read_uint(reader),
|
|
height=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 6:
|
|
return SetViewportScroll(
|
|
x=self.read_int(reader),
|
|
y=self.read_int(reader)
|
|
)
|
|
|
|
if message_id == 7:
|
|
return CreateDocument(
|
|
|
|
)
|
|
|
|
if message_id == 8:
|
|
return CreateElementNode(
|
|
id=self.read_uint(reader),
|
|
parent_id=self.read_uint(reader),
|
|
index=self.read_uint(reader),
|
|
tag=self.read_string(reader),
|
|
svg=self.read_boolean(reader)
|
|
)
|
|
|
|
if message_id == 9:
|
|
return CreateTextNode(
|
|
id=self.read_uint(reader),
|
|
parent_id=self.read_uint(reader),
|
|
index=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 10:
|
|
return MoveNode(
|
|
id=self.read_uint(reader),
|
|
parent_id=self.read_uint(reader),
|
|
index=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 11:
|
|
return RemoveNode(
|
|
id=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 12:
|
|
return SetNodeAttribute(
|
|
id=self.read_uint(reader),
|
|
name=self.read_string(reader),
|
|
value=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 13:
|
|
return RemoveNodeAttribute(
|
|
id=self.read_uint(reader),
|
|
name=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 14:
|
|
return SetNodeData(
|
|
id=self.read_uint(reader),
|
|
data=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 15:
|
|
return SetCSSData(
|
|
id=self.read_uint(reader),
|
|
data=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 16:
|
|
return SetNodeScroll(
|
|
id=self.read_uint(reader),
|
|
x=self.read_int(reader),
|
|
y=self.read_int(reader)
|
|
)
|
|
|
|
if message_id == 17:
|
|
return SetInputTarget(
|
|
id=self.read_uint(reader),
|
|
label=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 18:
|
|
return SetInputValue(
|
|
id=self.read_uint(reader),
|
|
value=self.read_string(reader),
|
|
mask=self.read_int(reader)
|
|
)
|
|
|
|
if message_id == 19:
|
|
return SetInputChecked(
|
|
id=self.read_uint(reader),
|
|
checked=self.read_boolean(reader)
|
|
)
|
|
|
|
if message_id == 20:
|
|
return MouseMove(
|
|
x=self.read_uint(reader),
|
|
y=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 21:
|
|
return NetworkRequest(
|
|
type=self.read_string(reader),
|
|
method=self.read_string(reader),
|
|
url=self.read_string(reader),
|
|
request=self.read_string(reader),
|
|
response=self.read_string(reader),
|
|
status=self.read_uint(reader),
|
|
timestamp=self.read_uint(reader),
|
|
duration=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 22:
|
|
return ConsoleLog(
|
|
level=self.read_string(reader),
|
|
value=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 23:
|
|
return PageLoadTiming(
|
|
request_start=self.read_uint(reader),
|
|
response_start=self.read_uint(reader),
|
|
response_end=self.read_uint(reader),
|
|
dom_content_loaded_event_start=self.read_uint(reader),
|
|
dom_content_loaded_event_end=self.read_uint(reader),
|
|
load_event_start=self.read_uint(reader),
|
|
load_event_end=self.read_uint(reader),
|
|
first_paint=self.read_uint(reader),
|
|
first_contentful_paint=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 24:
|
|
return PageRenderTiming(
|
|
speed_index=self.read_uint(reader),
|
|
visually_complete=self.read_uint(reader),
|
|
time_to_interactive=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 25:
|
|
return JSExceptionDeprecated(
|
|
name=self.read_string(reader),
|
|
message=self.read_string(reader),
|
|
payload=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 26:
|
|
return IntegrationEvent(
|
|
timestamp=self.read_uint(reader),
|
|
source=self.read_string(reader),
|
|
name=self.read_string(reader),
|
|
message=self.read_string(reader),
|
|
payload=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 27:
|
|
return CustomEvent(
|
|
name=self.read_string(reader),
|
|
payload=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 28:
|
|
return UserID(
|
|
id=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 29:
|
|
return UserAnonymousID(
|
|
id=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 30:
|
|
return Metadata(
|
|
key=self.read_string(reader),
|
|
value=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 31:
|
|
return PageEvent(
|
|
message_id=self.read_uint(reader),
|
|
timestamp=self.read_uint(reader),
|
|
url=self.read_string(reader),
|
|
referrer=self.read_string(reader),
|
|
loaded=self.read_boolean(reader),
|
|
request_start=self.read_uint(reader),
|
|
response_start=self.read_uint(reader),
|
|
response_end=self.read_uint(reader),
|
|
dom_content_loaded_event_start=self.read_uint(reader),
|
|
dom_content_loaded_event_end=self.read_uint(reader),
|
|
load_event_start=self.read_uint(reader),
|
|
load_event_end=self.read_uint(reader),
|
|
first_paint=self.read_uint(reader),
|
|
first_contentful_paint=self.read_uint(reader),
|
|
speed_index=self.read_uint(reader),
|
|
visually_complete=self.read_uint(reader),
|
|
time_to_interactive=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 32:
|
|
return InputEvent(
|
|
message_id=self.read_uint(reader),
|
|
timestamp=self.read_uint(reader),
|
|
value=self.read_string(reader),
|
|
value_masked=self.read_boolean(reader),
|
|
label=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 37:
|
|
return CSSInsertRule(
|
|
id=self.read_uint(reader),
|
|
rule=self.read_string(reader),
|
|
index=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 38:
|
|
return CSSDeleteRule(
|
|
id=self.read_uint(reader),
|
|
index=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 39:
|
|
return Fetch(
|
|
method=self.read_string(reader),
|
|
url=self.read_string(reader),
|
|
request=self.read_string(reader),
|
|
response=self.read_string(reader),
|
|
status=self.read_uint(reader),
|
|
timestamp=self.read_uint(reader),
|
|
duration=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 40:
|
|
return Profiler(
|
|
name=self.read_string(reader),
|
|
duration=self.read_uint(reader),
|
|
args=self.read_string(reader),
|
|
result=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 41:
|
|
return OTable(
|
|
key=self.read_string(reader),
|
|
value=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 42:
|
|
return StateAction(
|
|
type=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 44:
|
|
return Redux(
|
|
action=self.read_string(reader),
|
|
state=self.read_string(reader),
|
|
duration=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 45:
|
|
return Vuex(
|
|
mutation=self.read_string(reader),
|
|
state=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 46:
|
|
return MobX(
|
|
type=self.read_string(reader),
|
|
payload=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 47:
|
|
return NgRx(
|
|
action=self.read_string(reader),
|
|
state=self.read_string(reader),
|
|
duration=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 48:
|
|
return GraphQL(
|
|
operation_kind=self.read_string(reader),
|
|
operation_name=self.read_string(reader),
|
|
variables=self.read_string(reader),
|
|
response=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 49:
|
|
return PerformanceTrack(
|
|
frames=self.read_int(reader),
|
|
ticks=self.read_int(reader),
|
|
total_js_heap_size=self.read_uint(reader),
|
|
used_js_heap_size=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 50:
|
|
return StringDict(
|
|
key=self.read_uint(reader),
|
|
value=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 51:
|
|
return SetNodeAttributeDict(
|
|
id=self.read_uint(reader),
|
|
name_key=self.read_uint(reader),
|
|
value_key=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 53:
|
|
return ResourceTimingDeprecated(
|
|
timestamp=self.read_uint(reader),
|
|
duration=self.read_uint(reader),
|
|
ttfb=self.read_uint(reader),
|
|
header_size=self.read_uint(reader),
|
|
encoded_body_size=self.read_uint(reader),
|
|
decoded_body_size=self.read_uint(reader),
|
|
url=self.read_string(reader),
|
|
initiator=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 54:
|
|
return ConnectionInformation(
|
|
downlink=self.read_uint(reader),
|
|
type=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 55:
|
|
return SetPageVisibility(
|
|
hidden=self.read_boolean(reader)
|
|
)
|
|
|
|
if message_id == 56:
|
|
return PerformanceTrackAggr(
|
|
timestamp_start=self.read_uint(reader),
|
|
timestamp_end=self.read_uint(reader),
|
|
min_fps=self.read_uint(reader),
|
|
avg_fps=self.read_uint(reader),
|
|
max_fps=self.read_uint(reader),
|
|
min_cpu=self.read_uint(reader),
|
|
avg_cpu=self.read_uint(reader),
|
|
max_cpu=self.read_uint(reader),
|
|
min_total_js_heap_size=self.read_uint(reader),
|
|
avg_total_js_heap_size=self.read_uint(reader),
|
|
max_total_js_heap_size=self.read_uint(reader),
|
|
min_used_js_heap_size=self.read_uint(reader),
|
|
avg_used_js_heap_size=self.read_uint(reader),
|
|
max_used_js_heap_size=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 57:
|
|
return LoadFontFace(
|
|
parent_id=self.read_uint(reader),
|
|
family=self.read_string(reader),
|
|
source=self.read_string(reader),
|
|
descriptors=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 58:
|
|
return SetNodeFocus(
|
|
id=self.read_int(reader)
|
|
)
|
|
|
|
if message_id == 59:
|
|
return LongTask(
|
|
timestamp=self.read_uint(reader),
|
|
duration=self.read_uint(reader),
|
|
context=self.read_uint(reader),
|
|
container_type=self.read_uint(reader),
|
|
container_src=self.read_string(reader),
|
|
container_id=self.read_string(reader),
|
|
container_name=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 60:
|
|
return SetNodeAttributeURLBased(
|
|
id=self.read_uint(reader),
|
|
name=self.read_string(reader),
|
|
value=self.read_string(reader),
|
|
base_url=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 61:
|
|
return SetCSSDataURLBased(
|
|
id=self.read_uint(reader),
|
|
data=self.read_string(reader),
|
|
base_url=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 62:
|
|
return IssueEventDeprecated(
|
|
message_id=self.read_uint(reader),
|
|
timestamp=self.read_uint(reader),
|
|
type=self.read_string(reader),
|
|
context_string=self.read_string(reader),
|
|
context=self.read_string(reader),
|
|
payload=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 63:
|
|
return TechnicalInfo(
|
|
type=self.read_string(reader),
|
|
value=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 64:
|
|
return CustomIssue(
|
|
name=self.read_string(reader),
|
|
payload=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 66:
|
|
return AssetCache(
|
|
url=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 67:
|
|
return CSSInsertRuleURLBased(
|
|
id=self.read_uint(reader),
|
|
rule=self.read_string(reader),
|
|
index=self.read_uint(reader),
|
|
base_url=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 69:
|
|
return MouseClick(
|
|
id=self.read_uint(reader),
|
|
hesitation_time=self.read_uint(reader),
|
|
label=self.read_string(reader),
|
|
selector=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 70:
|
|
return CreateIFrameDocument(
|
|
frame_id=self.read_uint(reader),
|
|
id=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 71:
|
|
return AdoptedSSReplaceURLBased(
|
|
sheet_id=self.read_uint(reader),
|
|
text=self.read_string(reader),
|
|
base_url=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 72:
|
|
return AdoptedSSReplace(
|
|
sheet_id=self.read_uint(reader),
|
|
text=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 73:
|
|
return AdoptedSSInsertRuleURLBased(
|
|
sheet_id=self.read_uint(reader),
|
|
rule=self.read_string(reader),
|
|
index=self.read_uint(reader),
|
|
base_url=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 74:
|
|
return AdoptedSSInsertRule(
|
|
sheet_id=self.read_uint(reader),
|
|
rule=self.read_string(reader),
|
|
index=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 75:
|
|
return AdoptedSSDeleteRule(
|
|
sheet_id=self.read_uint(reader),
|
|
index=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 76:
|
|
return AdoptedSSAddOwner(
|
|
sheet_id=self.read_uint(reader),
|
|
id=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 77:
|
|
return AdoptedSSRemoveOwner(
|
|
sheet_id=self.read_uint(reader),
|
|
id=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 78:
|
|
return JSException(
|
|
name=self.read_string(reader),
|
|
message=self.read_string(reader),
|
|
payload=self.read_string(reader),
|
|
metadata=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 79:
|
|
return Zustand(
|
|
mutation=self.read_string(reader),
|
|
state=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 80:
|
|
return BatchMeta(
|
|
page_no=self.read_uint(reader),
|
|
first_index=self.read_uint(reader),
|
|
timestamp=self.read_int(reader)
|
|
)
|
|
|
|
if message_id == 81:
|
|
return BatchMetadata(
|
|
version=self.read_uint(reader),
|
|
page_no=self.read_uint(reader),
|
|
first_index=self.read_uint(reader),
|
|
timestamp=self.read_int(reader),
|
|
location=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 82:
|
|
return PartitionedMessage(
|
|
part_no=self.read_uint(reader),
|
|
part_total=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 112:
|
|
return InputChange(
|
|
id=self.read_uint(reader),
|
|
value=self.read_string(reader),
|
|
value_masked=self.read_boolean(reader),
|
|
label=self.read_string(reader),
|
|
hesitation_time=self.read_int(reader),
|
|
input_duration=self.read_int(reader)
|
|
)
|
|
|
|
if message_id == 113:
|
|
return SelectionChange(
|
|
selection_start=self.read_uint(reader),
|
|
selection_end=self.read_uint(reader),
|
|
selection=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 114:
|
|
return MouseThrashing(
|
|
timestamp=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 115:
|
|
return UnbindNodes(
|
|
total_removed_percent=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 116:
|
|
return ResourceTiming(
|
|
timestamp=self.read_uint(reader),
|
|
duration=self.read_uint(reader),
|
|
ttfb=self.read_uint(reader),
|
|
header_size=self.read_uint(reader),
|
|
encoded_body_size=self.read_uint(reader),
|
|
decoded_body_size=self.read_uint(reader),
|
|
url=self.read_string(reader),
|
|
initiator=self.read_string(reader),
|
|
transferred_size=self.read_uint(reader),
|
|
cached=self.read_boolean(reader)
|
|
)
|
|
|
|
if message_id == 117:
|
|
return TabChange(
|
|
tab_id=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 118:
|
|
return TabData(
|
|
tab_id=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 125:
|
|
return IssueEvent(
|
|
message_id=self.read_uint(reader),
|
|
timestamp=self.read_uint(reader),
|
|
type=self.read_string(reader),
|
|
context_string=self.read_string(reader),
|
|
context=self.read_string(reader),
|
|
payload=self.read_string(reader),
|
|
url=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 126:
|
|
return SessionEnd(
|
|
timestamp=self.read_uint(reader),
|
|
encryption_key=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 127:
|
|
return SessionSearch(
|
|
timestamp=self.read_uint(reader),
|
|
partition=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 90:
|
|
return IOSSessionStart(
|
|
timestamp=self.read_uint(reader),
|
|
project_id=self.read_uint(reader),
|
|
tracker_version=self.read_string(reader),
|
|
rev_id=self.read_string(reader),
|
|
user_uuid=self.read_string(reader),
|
|
user_os=self.read_string(reader),
|
|
user_os_version=self.read_string(reader),
|
|
user_device=self.read_string(reader),
|
|
user_device_type=self.read_string(reader),
|
|
user_country=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 91:
|
|
return IOSSessionEnd(
|
|
timestamp=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 92:
|
|
return IOSMetadata(
|
|
timestamp=self.read_uint(reader),
|
|
length=self.read_uint(reader),
|
|
key=self.read_string(reader),
|
|
value=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 93:
|
|
return IOSCustomEvent(
|
|
timestamp=self.read_uint(reader),
|
|
length=self.read_uint(reader),
|
|
name=self.read_string(reader),
|
|
payload=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 94:
|
|
return IOSUserID(
|
|
timestamp=self.read_uint(reader),
|
|
length=self.read_uint(reader),
|
|
value=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 95:
|
|
return IOSUserAnonymousID(
|
|
timestamp=self.read_uint(reader),
|
|
length=self.read_uint(reader),
|
|
value=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 96:
|
|
return IOSScreenChanges(
|
|
timestamp=self.read_uint(reader),
|
|
length=self.read_uint(reader),
|
|
x=self.read_uint(reader),
|
|
y=self.read_uint(reader),
|
|
width=self.read_uint(reader),
|
|
height=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 97:
|
|
return IOSCrash(
|
|
timestamp=self.read_uint(reader),
|
|
length=self.read_uint(reader),
|
|
name=self.read_string(reader),
|
|
reason=self.read_string(reader),
|
|
stacktrace=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 98:
|
|
return IOSViewComponentEvent(
|
|
timestamp=self.read_uint(reader),
|
|
length=self.read_uint(reader),
|
|
screen_name=self.read_string(reader),
|
|
view_name=self.read_string(reader),
|
|
visible=self.read_boolean(reader)
|
|
)
|
|
|
|
if message_id == 100:
|
|
return IOSClickEvent(
|
|
timestamp=self.read_uint(reader),
|
|
length=self.read_uint(reader),
|
|
label=self.read_string(reader),
|
|
x=self.read_uint(reader),
|
|
y=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 101:
|
|
return IOSInputEvent(
|
|
timestamp=self.read_uint(reader),
|
|
length=self.read_uint(reader),
|
|
value=self.read_string(reader),
|
|
value_masked=self.read_boolean(reader),
|
|
label=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 102:
|
|
return IOSPerformanceEvent(
|
|
timestamp=self.read_uint(reader),
|
|
length=self.read_uint(reader),
|
|
name=self.read_string(reader),
|
|
value=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 103:
|
|
return IOSLog(
|
|
timestamp=self.read_uint(reader),
|
|
length=self.read_uint(reader),
|
|
severity=self.read_string(reader),
|
|
content=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 104:
|
|
return IOSInternalError(
|
|
timestamp=self.read_uint(reader),
|
|
length=self.read_uint(reader),
|
|
content=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 105:
|
|
return IOSNetworkCall(
|
|
timestamp=self.read_uint(reader),
|
|
length=self.read_uint(reader),
|
|
type=self.read_string(reader),
|
|
method=self.read_string(reader),
|
|
url=self.read_string(reader),
|
|
request=self.read_string(reader),
|
|
response=self.read_string(reader),
|
|
status=self.read_uint(reader),
|
|
duration=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 106:
|
|
return IOSSwipeEvent(
|
|
timestamp=self.read_uint(reader),
|
|
length=self.read_uint(reader),
|
|
label=self.read_string(reader),
|
|
x=self.read_uint(reader),
|
|
y=self.read_uint(reader),
|
|
direction=self.read_string(reader)
|
|
)
|
|
|
|
if message_id == 107:
|
|
return IOSBatchMeta(
|
|
timestamp=self.read_uint(reader),
|
|
length=self.read_uint(reader),
|
|
first_index=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 110:
|
|
return IOSPerformanceAggregated(
|
|
timestamp_start=self.read_uint(reader),
|
|
timestamp_end=self.read_uint(reader),
|
|
min_fps=self.read_uint(reader),
|
|
avg_fps=self.read_uint(reader),
|
|
max_fps=self.read_uint(reader),
|
|
min_cpu=self.read_uint(reader),
|
|
avg_cpu=self.read_uint(reader),
|
|
max_cpu=self.read_uint(reader),
|
|
min_memory=self.read_uint(reader),
|
|
avg_memory=self.read_uint(reader),
|
|
max_memory=self.read_uint(reader),
|
|
min_battery=self.read_uint(reader),
|
|
avg_battery=self.read_uint(reader),
|
|
max_battery=self.read_uint(reader)
|
|
)
|
|
|
|
if message_id == 111:
|
|
return IOSIssueEvent(
|
|
timestamp=self.read_uint(reader),
|
|
type=self.read_string(reader),
|
|
context_string=self.read_string(reader),
|
|
context=self.read_string(reader),
|
|
payload=self.read_string(reader)
|
|
)
|
|
|