Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/wheels.yml
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,9 @@ jobs:
shell: pwsh

- name: Setup uv cache
# skip broken platform ("Error: The template is not valid. .github/workflows/wheels.yml (Line: 182, Col: 13):
# hashFiles('pyproject.toml') failed. Fail to hash files under directory '/Users/runner/work/autobahn-python/autobahn-python'")
if: matrix.platform != 'macos'
uses: actions/cache@v4
with:
path: ${{ env.UV_CACHE_DIR }}
Expand Down
127 changes: 113 additions & 14 deletions autobahn/wamp/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -1279,9 +1279,6 @@ def build(self, builder, serializer=None):
message_fbs.HelloGen.HelloStart(builder)

# Add fields
session = getattr(self, 'session', None)
if session:
message_fbs.HelloGen.HelloAddSession(builder, session)
if realm:
message_fbs.HelloGen.HelloAddRealm(builder, realm)
if authid:
Expand All @@ -1299,9 +1296,16 @@ def build(self, builder, serializer=None):
# TODO: Add authmethods array serialization
# TODO: Add authextra Map serialization

# End and return
# End message
msg = message_fbs.HelloGen.HelloEnd(builder)
return msg

# Wrap in Message union with type
message_fbs.Message.MessageStart(builder)
message_fbs.Message.MessageAddMsgType(builder, message_fbs.MessageType.HELLO)
message_fbs.Message.MessageAddMsg(builder, msg)
union_msg = message_fbs.Message.MessageEnd(builder)

return union_msg

@staticmethod
def parse(wmsg):
Expand Down Expand Up @@ -1903,9 +1907,16 @@ def build(self, builder, serializer=None):
# TODO: Add authmethod enum serialization
# TODO: Add authextra Map serialization

# End and return
# End message
msg = message_fbs.WelcomeGen.WelcomeEnd(builder)
return msg

# Wrap in Message union with type
message_fbs.Message.MessageStart(builder)
message_fbs.Message.MessageAddMsgType(builder, message_fbs.MessageType.WELCOME)
message_fbs.Message.MessageAddMsg(builder, msg)
union_msg = message_fbs.Message.MessageEnd(builder)

return union_msg

@staticmethod
def parse(wmsg):
Expand Down Expand Up @@ -6230,8 +6241,6 @@ def cast(buf):
def build(self, builder, serializer=None):
message_fbs.EventReceivedGen.EventReceivedStart(builder)

if self.session:
message_fbs.EventReceivedGen.EventReceivedAddSession(builder, self.session)
if self.publication:
message_fbs.EventReceivedGen.EventReceivedAddPublication(
builder, self.publication
Expand All @@ -6241,7 +6250,9 @@ def build(self, builder, serializer=None):

# Wrap in Message union with type
message_fbs.Message.MessageStart(builder)
message_fbs.Message.MessageAddMsgType(builder, message_fbs.MessageType.EVENT_RECEIVED)
message_fbs.Message.MessageAddMsgType(
builder, message_fbs.MessageType.EVENT_RECEIVED
)
message_fbs.Message.MessageAddMsg(builder, msg)
union_msg = message_fbs.Message.MessageEnd(builder)

Expand Down Expand Up @@ -7138,10 +7149,36 @@ def cast(buf):
return Cancel(from_fbs=message_fbs.Cancel.GetRootAsCancel(buf, 0))

def build(self, builder, serializer=None):
# Handle forward_for: [Principal]
forward_for = self.forward_for
if forward_for:
from autobahn.wamp.gen.wamp.proto import Principal as PrincipalGen

_forward_for = []
for principal in forward_for:
_session = principal.get("session", 0)
_authid = principal.get("authid", None)
_authrole = principal.get("authrole", "")

if _authid:
_authid = builder.CreateString(_authid)
_authrole = builder.CreateString(_authrole)

PrincipalGen.Start(builder)
PrincipalGen.AddSession(builder, _session)
if _authid:
PrincipalGen.AddAuthid(builder, _authid)
PrincipalGen.AddAuthrole(builder, _authrole)
_forward_for.append(PrincipalGen.End(builder))

message_fbs.CancelGen.CancelStartForwardForVector(builder, len(_forward_for))
for principal in reversed(_forward_for):
builder.PrependUOffsetTRelative(principal)
forward_for = builder.EndVector()

# Start Cancel message
message_fbs.CancelGen.CancelStart(builder)

if self.session:
message_fbs.CancelGen.CancelAddSession(builder, self.session)
if self.request:
message_fbs.CancelGen.CancelAddRequest(builder, self.request)

Expand All @@ -7156,6 +7193,9 @@ def build(self, builder, serializer=None):
mode_val = message_fbs.CancelMode.SKIP # default
message_fbs.CancelGen.CancelAddMode(builder, mode_val)

if forward_for:
message_fbs.CancelGen.CancelAddForwardFor(builder, forward_for)

msg = message_fbs.CancelGen.CancelEnd(builder)

# Wrap in Message union with type
Expand Down Expand Up @@ -8429,6 +8469,35 @@ def marshal(self):
else:
return [Unregister.MESSAGE_TYPE, self.request, self.registration]

@staticmethod
def cast(buf):
return Unregister(from_fbs=message_fbs.Unregister.GetRootAsUnregister(buf, 0))

def build(self, builder, serializer=None):
# Start Unregister message
message_fbs.UnregisterGen.UnregisterStart(builder)

if self.request:
message_fbs.UnregisterGen.UnregisterAddRequest(builder, self.request)
if self.registration:
message_fbs.UnregisterGen.UnregisterAddRegistration(
builder, self.registration
)

# Note: forward_for not supported in current FlatBuffers schema

msg = message_fbs.UnregisterGen.UnregisterEnd(builder)

# Wrap in Message union with type
message_fbs.Message.MessageStart(builder)
message_fbs.Message.MessageAddMsgType(
builder, message_fbs.MessageType.UNREGISTER
)
message_fbs.Message.MessageAddMsg(builder, msg)
union_msg = message_fbs.Message.MessageEnd(builder)

return union_msg


class Unregistered(Message):
"""
Expand Down Expand Up @@ -9570,12 +9639,39 @@ def build(self, builder, serializer=None):
if reason:
reason = builder.CreateString(reason)

# Handle forward_for: [Principal]
forward_for = self.forward_for
if forward_for:
from autobahn.wamp.gen.wamp.proto import Principal as PrincipalGen

_forward_for = []
for principal in forward_for:
_session = principal.get("session", 0)
_authid = principal.get("authid", None)
_authrole = principal.get("authrole", "")

if _authid:
_authid = builder.CreateString(_authid)
_authrole = builder.CreateString(_authrole)

PrincipalGen.Start(builder)
PrincipalGen.AddSession(builder, _session)
if _authid:
PrincipalGen.AddAuthid(builder, _authid)
PrincipalGen.AddAuthrole(builder, _authrole)
_forward_for.append(PrincipalGen.End(builder))

message_fbs.InterruptGen.InterruptStartForwardForVector(
builder, len(_forward_for)
)
for principal in reversed(_forward_for):
builder.PrependUOffsetTRelative(principal)
forward_for = builder.EndVector()

# Start message
message_fbs.InterruptGen.InterruptStart(builder)

# Add fields
if self.session:
message_fbs.InterruptGen.InterruptAddSession(builder, self.session)
if self.request:
message_fbs.InterruptGen.InterruptAddRequest(builder, self.request)

Expand All @@ -9591,6 +9687,9 @@ def build(self, builder, serializer=None):
if reason:
message_fbs.InterruptGen.InterruptAddReason(builder, reason)

if forward_for:
message_fbs.InterruptGen.InterruptAddForwardFor(builder, forward_for)

msg = message_fbs.InterruptGen.InterruptEnd(builder)

# Wrap in Message union with type
Expand Down
2 changes: 2 additions & 0 deletions autobahn/wamp/serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -1064,6 +1064,8 @@ class FlatBuffersObjectSerializer(object):
message_fbs.MessageType.YIELD: (message_fbs.Yield, message.Yield),

# Category 1: Session lifecycle messages
message_fbs.MessageType.HELLO: (message_fbs.HelloGen.Hello, message.Hello),
message_fbs.MessageType.WELCOME: (message_fbs.WelcomeGen.Welcome, message.Welcome),
message_fbs.MessageType.ABORT: (message_fbs.AbortGen.Abort, message.Abort),
message_fbs.MessageType.CHALLENGE: (message_fbs.ChallengeGen.Challenge, message.Challenge),
message_fbs.MessageType.AUTHENTICATE: (message_fbs.AuthenticateGen.Authenticate, message.Authenticate),
Expand Down
31 changes: 27 additions & 4 deletions examples/serdes/gen_flatbuffers_testvectors.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@
"INVOCATION": (wamp_messages.Invocation, 68),
"INTERRUPT": (wamp_messages.Interrupt, 69),
"YIELD": (wamp_messages.Yield, 70),
"EVENT_RECEIVED": (wamp_messages.EventReceived, 71),
}


Expand All @@ -98,11 +99,31 @@ def create_message_from_attributes(message_type_name, attributes):

# Session establishment messages
if message_type_name == "HELLO":
return message_class(realm=attributes["realm"], roles=attributes["roles"])
# Convert dict roles to RoleFeatures instances
from autobahn.wamp import role

roles_dict = {}
for role_name, role_features in attributes["roles"].items():
if role_name == "subscriber":
roles_dict[role_name] = role.RoleSubscriberFeatures()
elif role_name == "publisher":
roles_dict[role_name] = role.RolePublisherFeatures()
elif role_name == "caller":
roles_dict[role_name] = role.RoleCallerFeatures()
elif role_name == "callee":
roles_dict[role_name] = role.RoleCalleeFeatures()
return message_class(realm=attributes["realm"], roles=roles_dict)
elif message_type_name == "WELCOME":
return message_class(
session=attributes["session_id"], roles=attributes["roles"]
)
# Convert dict roles to RoleFeatures instances
from autobahn.wamp import role

roles_dict = {}
for role_name, role_features in attributes["roles"].items():
if role_name == "broker":
roles_dict[role_name] = role.RoleBrokerFeatures()
elif role_name == "dealer":
roles_dict[role_name] = role.RoleDealerFeatures()
return message_class(session=attributes["session_id"], roles=roles_dict)
elif message_type_name == "ABORT":
return message_class(
reason=attributes["reason"], message=attributes.get("message")
Expand Down Expand Up @@ -282,6 +303,8 @@ def create_message_from_attributes(message_type_name, attributes):
reason=attributes.get("options", {}).get("reason"),
forward_for=attributes.get("options", {}).get("forward_for"),
)
elif message_type_name == "EVENT_RECEIVED":
return message_class(publication=attributes["publication_id"])
elif message_type_name == "YIELD":
return message_class(
request=attributes["request_id"],
Expand Down