Skip to content

Commit 6b8dd1d

Browse files
committed
Add FlatBuffers support for Category 4 messages (Both Payload and Forwarding)
Implements FlatBuffers serialization/deserialization for 5 Category 4 messages: - ERROR (8) - CALL (48) - RESULT (50) - INVOCATION (68) - YIELD (70) ## Changes: **autobahn/wamp/message.py:** - Added Message union wrapper to build() methods for all 5 Category 4 messages - Updated cast() methods to use wrapper classes instead of Gen classes - Fixed Error callee properties (callee, callee_authid, callee_authrole) to not access non-existent FlatBuffers fields - Made Call.__init__() request and procedure parameters optional for FlatBuffers deserialization - Added conditional assertions in Call.__init__() to skip validation when deserializing from FlatBuffers **autobahn/wamp/message_fbs.py:** - Added custom wrapper classes for Error, Call, Result, Invocation, Yield with *AsBytes() methods - Wrapper classes provide zero-copy memory access to args, kwargs, payload, and enc_key - Updated __all__ exports to include wrapper classes **autobahn/wamp/serializer.py:** - Updated MESSAGE_TYPE_MAP to use wrapper classes for all Category 4 messages **examples/serdes/gen_flatbuffers_testvectors.py:** - Fixed Invocation test vector generation (registration_id instead of registration) **wamp-proto submodule:** - Updated to commit 713b51b with Category 4 test vectors - Bumped .ai submodule to latest wamp-ai (7219c81) with improved git hooks ## Test Results: 511 passed, 18 skipped, 0 failures All Category 4 messages now support complete FlatBuffers serialization/deserialization with proper test coverage. Note: This work was completed with AI assistance (Claude Code).
1 parent 8010031 commit 6b8dd1d

File tree

5 files changed

+292
-26
lines changed

5 files changed

+292
-26
lines changed

autobahn/wamp/message.py

Lines changed: 48 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3056,10 +3056,7 @@ def error(self, value):
30563056

30573057
@property
30583058
def callee(self):
3059-
if self._callee is None and self._from_fbs:
3060-
callee = self._from_fbs.Callee()
3061-
if callee:
3062-
self._callee = callee
3059+
# Note: Error FlatBuffers schema doesn't include callee fields yet
30633060
return self._callee
30643061

30653062
@callee.setter
@@ -3069,10 +3066,7 @@ def callee(self, value):
30693066

30703067
@property
30713068
def callee_authid(self):
3072-
if self._callee_authid is None and self._from_fbs:
3073-
s = self._from_fbs.CalleeAuthid()
3074-
if s:
3075-
self._callee_authid = s.decode("utf8")
3069+
# Note: Error FlatBuffers schema doesn't include callee fields yet
30763070
return self._callee_authid
30773071

30783072
@callee_authid.setter
@@ -3082,10 +3076,7 @@ def callee_authid(self, value):
30823076

30833077
@property
30843078
def callee_authrole(self):
3085-
if self._callee_authrole is None and self._from_fbs:
3086-
s = self._from_fbs.CalleeAuthrole()
3087-
if s:
3088-
self._callee_authrole = s.decode("utf8")
3079+
# Note: Error FlatBuffers schema doesn't include callee fields yet
30893080
return self._callee_authrole
30903081

30913082
@callee_authrole.setter
@@ -3187,7 +3178,14 @@ def build(self, builder, serializer=None):
31873178
message_fbs.ErrorGen.ErrorAddForwardFor(builder, forward_for)
31883179

31893180
msg = message_fbs.ErrorGen.ErrorEnd(builder)
3190-
return msg
3181+
3182+
# Wrap in Message union with type
3183+
message_fbs.Message.MessageStart(builder)
3184+
message_fbs.Message.MessageAddMsgType(builder, message_fbs.MessageType.ERROR)
3185+
message_fbs.Message.MessageAddMsg(builder, msg)
3186+
union_msg = message_fbs.Message.MessageEnd(builder)
3187+
3188+
return union_msg
31913189

31923190
@staticmethod
31933191
def parse(wmsg):
@@ -6291,8 +6289,8 @@ class Call(MessageWithAppPayload, MessageWithForwardFor, Message):
62916289

62926290
def __init__(
62936291
self,
6294-
request,
6295-
procedure,
6292+
request=None,
6293+
procedure=None,
62966294
args=None,
62976295
kwargs=None,
62986296
payload=None,
@@ -6361,8 +6359,9 @@ def __init__(
63616359
:param forward_for: When this Publish is forwarded for a client (or from an intermediary router).
63626360
:type forward_for: list[dict]
63636361
"""
6364-
assert type(request) == int
6365-
assert type(procedure) == str
6362+
if from_fbs is None:
6363+
assert type(request) == int
6364+
assert type(procedure) == str
63666365
assert args is None or type(args) in [list, tuple]
63676366
assert kwargs is None or type(kwargs) == dict
63686367
assert payload is None or type(payload) == bytes
@@ -6642,8 +6641,6 @@ def build(self, builder, serializer=None):
66426641
# build CallGen
66436642
message_fbs.CallGen.CallStart(builder)
66446643

6645-
if self.session:
6646-
message_fbs.CallGen.CallAddSession(builder, self.session)
66476644
if self.request:
66486645
message_fbs.CallGen.CallAddRequest(builder, self.request)
66496646
if procedure:
@@ -6676,7 +6673,14 @@ def build(self, builder, serializer=None):
66766673
message_fbs.CallGen.CallAddForwardFor(builder, forward_for)
66776674

66786675
msg = message_fbs.CallGen.CallEnd(builder)
6679-
return msg
6676+
6677+
# Wrap in Message union with type
6678+
message_fbs.Message.MessageStart(builder)
6679+
message_fbs.Message.MessageAddMsgType(builder, message_fbs.MessageType.CALL)
6680+
message_fbs.Message.MessageAddMsg(builder, msg)
6681+
union_msg = message_fbs.Message.MessageEnd(builder)
6682+
6683+
return union_msg
66806684

66816685
@staticmethod
66826686
def parse(wmsg):
@@ -7470,7 +7474,14 @@ def build(self, builder, serializer=None):
74707474
message_fbs.ResultGen.ResultAddForwardFor(builder, forward_for)
74717475

74727476
msg = message_fbs.ResultGen.ResultEnd(builder)
7473-
return msg
7477+
7478+
# Wrap in Message union with type
7479+
message_fbs.Message.MessageStart(builder)
7480+
message_fbs.Message.MessageAddMsgType(builder, message_fbs.MessageType.RESULT)
7481+
message_fbs.Message.MessageAddMsg(builder, msg)
7482+
union_msg = message_fbs.Message.MessageEnd(builder)
7483+
7484+
return union_msg
74747485

74757486
@staticmethod
74767487
def parse(wmsg):
@@ -9031,7 +9042,14 @@ def build(self, builder, serializer=None):
90319042
message_fbs.InvocationGen.InvocationAddForwardFor(builder, forward_for)
90329043

90339044
msg = message_fbs.InvocationGen.InvocationEnd(builder)
9034-
return msg
9045+
9046+
# Wrap in Message union with type
9047+
message_fbs.Message.MessageStart(builder)
9048+
message_fbs.Message.MessageAddMsgType(builder, message_fbs.MessageType.INVOCATION)
9049+
message_fbs.Message.MessageAddMsg(builder, msg)
9050+
union_msg = message_fbs.Message.MessageEnd(builder)
9051+
9052+
return union_msg
90359053

90369054
@staticmethod
90379055
def parse(wmsg):
@@ -9888,7 +9906,14 @@ def build(self, builder, serializer=None):
98889906
message_fbs.YieldGen.YieldAddForwardFor(builder, forward_for)
98899907

98909908
msg = message_fbs.YieldGen.YieldEnd(builder)
9891-
return msg
9909+
9910+
# Wrap in Message union with type
9911+
message_fbs.Message.MessageStart(builder)
9912+
message_fbs.Message.MessageAddMsgType(builder, message_fbs.MessageType.YIELD)
9913+
message_fbs.Message.MessageAddMsg(builder, msg)
9914+
union_msg = message_fbs.Message.MessageEnd(builder)
9915+
9916+
return union_msg
98929917

98939918
@staticmethod
98949919
def parse(wmsg):

0 commit comments

Comments
 (0)