@ -7,7 +7,9 @@ from collections import OrderedDict
from . lnutil import OnionFailureCodeMetaFlag
from . lnutil import OnionFailureCodeMetaFlag
class FailedToParseMsg ( Exception ) : pass
class FailedToParseMsg ( Exception ) :
msg_type_int : Optional [ int ] = None
msg_type_name : Optional [ str ] = None
class UnknownMsgType ( FailedToParseMsg ) : pass
class UnknownMsgType ( FailedToParseMsg ) : pass
class UnknownOptionalMsgType ( UnknownMsgType ) : pass
class UnknownOptionalMsgType ( UnknownMsgType ) : pass
@ -488,33 +490,38 @@ class LNSerializer:
assert scheme [ 0 ] [ 2 ] == msg_type_int
assert scheme [ 0 ] [ 2 ] == msg_type_int
msg_type_name = scheme [ 0 ] [ 1 ]
msg_type_name = scheme [ 0 ] [ 1 ]
parsed = { }
parsed = { }
with io . BytesIO ( data [ 2 : ] ) as fd :
try :
for row in scheme :
with io . BytesIO ( data [ 2 : ] ) as fd :
#print(f"row: {row!r}")
for row in scheme :
if row [ 0 ] == " msgtype " :
#print(f"row: {row!r}")
pass
if row [ 0 ] == " msgtype " :
elif row [ 0 ] == " msgdata " :
pass
field_name = row [ 2 ]
elif row [ 0 ] == " msgdata " :
field_type = row [ 3 ]
field_name = row [ 2 ]
field_count_str = row [ 4 ]
field_type = row [ 3 ]
field_count = _resolve_field_count ( field_count_str , vars_dict = parsed )
field_count_str = row [ 4 ]
if field_name == " tlvs " :
field_count = _resolve_field_count ( field_count_str , vars_dict = parsed )
tlv_stream_name = field_type
if field_name == " tlvs " :
d = self . read_tlv_stream ( fd = fd , tlv_stream_name = tlv_stream_name )
tlv_stream_name = field_type
parsed [ tlv_stream_name ] = d
d = self . read_tlv_stream ( fd = fd , tlv_stream_name = tlv_stream_name )
continue
parsed [ tlv_stream_name ] = d
#print(f">> count={field_count}. parsed={parsed}")
continue
try :
#print(f">> count={field_count}. parsed={parsed}")
parsed [ field_name ] = _read_field ( fd = fd ,
try :
field_type = field_type ,
parsed [ field_name ] = _read_field ( fd = fd ,
count = field_count )
field_type = field_type ,
except UnexpectedEndOfStream as e :
count = field_count )
if len ( row ) > 5 :
except UnexpectedEndOfStream as e :
break # optional feature field not present
if len ( row ) > 5 :
else :
break # optional feature field not present
raise
else :
else :
raise
raise Exception ( f " unexpected row in scheme: { row !r} " )
else :
raise Exception ( f " unexpected row in scheme: { row !r} " )
except FailedToParseMsg as e :
e . msg_type_int = msg_type_int
e . msg_type_name = msg_type_name
raise
return msg_type_name , parsed
return msg_type_name , parsed