flwr-nightly 1.19.0.dev20250528__py3-none-any.whl → 1.19.0.dev20250529__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -32,14 +32,17 @@ def message_size_mod(
32
32
 
33
33
  This mod logs the size in bytes of the message being transmited.
34
34
  """
35
- message_size_in_bytes = 0
35
+ # Log the size of the incoming message in bytes
36
+ total_bytes = sum(record.count_bytes() for record in msg.content.values())
37
+ log(INFO, "Incoming message size: %i bytes", total_bytes)
36
38
 
37
- for record in msg.content.values():
38
- message_size_in_bytes += record.count_bytes()
39
+ # Call the next layer
40
+ msg = call_next(msg, ctxt)
39
41
 
40
- log(INFO, "Message size: %i bytes", message_size_in_bytes)
41
-
42
- return call_next(msg, ctxt)
42
+ # Log the size of the outgoing message in bytes
43
+ total_bytes = sum(record.count_bytes() for record in msg.content.values())
44
+ log(INFO, "Outgoing message size: %i bytes", total_bytes)
45
+ return msg
43
46
 
44
47
 
45
48
  def arrays_size_mod(
@@ -50,25 +53,41 @@ def arrays_size_mod(
50
53
  This mod logs the number of array elements transmitted in ``ArrayRecord`` objects
51
54
  of the message as well as their sizes in bytes.
52
55
  """
53
- model_size_stats = {}
54
- arrays_size_in_bytes = 0
56
+ # Log the ArrayRecord size statistics and the total size in the incoming message
57
+ array_record_size_stats = _get_array_record_size_stats(msg)
58
+ total_bytes = sum(stat["bytes"] for stat in array_record_size_stats.values())
59
+ if array_record_size_stats:
60
+ log(INFO, "Incoming `ArrayRecord` size statistics:")
61
+ log(INFO, array_record_size_stats)
62
+ log(INFO, "Total array elements received: %i bytes", total_bytes)
63
+
64
+ msg = call_next(msg, ctxt)
65
+
66
+ # Log the ArrayRecord size statistics and the total size in the outgoing message
67
+ array_record_size_stats = _get_array_record_size_stats(msg)
68
+ total_bytes = sum(stat["bytes"] for stat in array_record_size_stats.values())
69
+ if array_record_size_stats:
70
+ log(INFO, "Outgoing `ArrayRecord` size statistics:")
71
+ log(INFO, array_record_size_stats)
72
+ log(INFO, "Total array elements sent: %i bytes", total_bytes)
73
+ return msg
74
+
75
+
76
+ def _get_array_record_size_stats(
77
+ msg: Message,
78
+ ) -> dict[str, dict[str, int]]:
79
+ """Get `ArrayRecord` size statistics from the message."""
80
+ array_record_size_stats = {}
55
81
  for record_name, arr_record in msg.content.array_records.items():
56
82
  arr_record_bytes = arr_record.count_bytes()
57
- arrays_size_in_bytes += arr_record_bytes
58
83
  element_count = 0
59
84
  for array in arr_record.values():
60
85
  element_count += (
61
86
  int(np.prod(array.shape)) if array.shape else array.numpy().size
62
87
  )
63
88
 
64
- model_size_stats[f"{record_name}"] = {
89
+ array_record_size_stats[record_name] = {
65
90
  "elements": element_count,
66
91
  "bytes": arr_record_bytes,
67
92
  }
68
-
69
- if model_size_stats:
70
- log(INFO, model_size_stats)
71
-
72
- log(INFO, "Total array elements transmitted: %i bytes", arrays_size_in_bytes)
73
-
74
- return call_next(msg, ctxt)
93
+ return array_record_size_stats
@@ -33,6 +33,9 @@ class ExecAuthPlugin(ABC):
33
33
  ----------
34
34
  user_auth_config_path : Path
35
35
  Path to the YAML file containing the authentication configuration.
36
+ verify_tls_cert : bool
37
+ Boolean indicating whether to verify the TLS certificate
38
+ when making requests to the server.
36
39
  """
37
40
 
38
41
  @abstractmethod
@@ -69,12 +72,15 @@ class ExecAuthzPlugin(ABC): # pylint: disable=too-few-public-methods
69
72
 
70
73
  Parameters
71
74
  ----------
72
- user_authz_config_path : Path
75
+ user_auth_config_path : Path
73
76
  Path to the YAML file containing the authorization configuration.
77
+ verify_tls_cert : bool
78
+ Boolean indicating whether to verify the TLS certificate
79
+ when making requests to the server.
74
80
  """
75
81
 
76
82
  @abstractmethod
77
- def __init__(self, user_authz_config_path: Path, verify_tls_cert: bool):
83
+ def __init__(self, user_auth_config_path: Path, verify_tls_cert: bool):
78
84
  """Abstract constructor."""
79
85
 
80
86
  @abstractmethod
flwr/common/message.py CHANGED
@@ -24,6 +24,7 @@ from flwr.common.date import now
24
24
  from flwr.common.logger import warn_deprecated_feature
25
25
  from flwr.proto.message_pb2 import Message as ProtoMessage # pylint: disable=E0611
26
26
  from flwr.proto.message_pb2 import Metadata as ProtoMetadata # pylint: disable=E0611
27
+ from flwr.proto.message_pb2 import ObjectIDs # pylint: disable=E0611
27
28
 
28
29
  from ..app.error import Error
29
30
  from ..app.metadata import Metadata
@@ -31,6 +32,7 @@ from .constant import MESSAGE_TTL_TOLERANCE
31
32
  from .inflatable import (
32
33
  InflatableObject,
33
34
  add_header_to_object_body,
35
+ get_desdendant_object_ids,
34
36
  get_object_body,
35
37
  get_object_children_ids_from_object_content,
36
38
  )
@@ -505,3 +507,12 @@ def _check_arg_types( # pylint: disable=too-many-arguments, R0917
505
507
  ):
506
508
  return
507
509
  raise MessageInitializationError()
510
+
511
+
512
+ def get_message_to_descendant_id_mapping(message: Message) -> dict[str, ObjectIDs]:
513
+ """Construct a mapping between message object_id and that of its descendants."""
514
+ return {
515
+ message.object_id: ObjectIDs(
516
+ object_ids=list(get_desdendant_object_ids(message))
517
+ )
518
+ }
flwr/proto/fleet_pb2.py CHANGED
@@ -19,7 +19,7 @@ from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
19
19
  from flwr.proto import message_pb2 as flwr_dot_proto_dot_message__pb2
20
20
 
21
21
 
22
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x66lwr/proto/fleet.proto\x12\nflwr.proto\x1a\x1a\x66lwr/proto/heartbeat.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x18\x66lwr/proto/message.proto\"/\n\x11\x43reateNodeRequest\x12\x1a\n\x12heartbeat_interval\x18\x01 \x01(\x01\"4\n\x12\x43reateNodeResponse\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"3\n\x11\x44\x65leteNodeRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"\x14\n\x12\x44\x65leteNodeResponse\"J\n\x13PullMessagesRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x13\n\x0bmessage_ids\x18\x02 \x03(\t\"\x87\x02\n\x14PullMessagesResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12*\n\rmessages_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.Message\x12L\n\x0fobjects_to_pull\x18\x03 \x03(\x0b\x32\x33.flwr.proto.PullMessagesResponse.ObjectsToPullEntry\x1aK\n\x12ObjectsToPullEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.ObjectIDs:\x02\x38\x01\"\x91\x02\n\x13PushMessagesRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12*\n\rmessages_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.Message\x12Z\n\x17msg_to_children_mapping\x18\x03 \x03(\x0b\x32\x39.flwr.proto.PushMessagesRequest.MsgToChildrenMappingEntry\x1aR\n\x19MsgToChildrenMappingEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.ObjectIDs:\x02\x38\x01\"\xcb\x02\n\x14PushMessagesResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12>\n\x07results\x18\x02 \x03(\x0b\x32-.flwr.proto.PushMessagesResponse.ResultsEntry\x12L\n\x0fobjects_to_push\x18\x03 \x03(\x0b\x32\x33.flwr.proto.PushMessagesResponse.ObjectsToPushEntry\x1a.\n\x0cResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\r:\x02\x38\x01\x1aK\n\x12ObjectsToPushEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.ObjectIDs:\x02\x38\x01\"\x1e\n\tReconnect\x12\x11\n\treconnect\x18\x01 \x01(\x04\x32\xd7\x05\n\x05\x46leet\x12M\n\nCreateNode\x12\x1d.flwr.proto.CreateNodeRequest\x1a\x1e.flwr.proto.CreateNodeResponse\"\x00\x12M\n\nDeleteNode\x12\x1d.flwr.proto.DeleteNodeRequest\x1a\x1e.flwr.proto.DeleteNodeResponse\"\x00\x12\x62\n\x11SendNodeHeartbeat\x12$.flwr.proto.SendNodeHeartbeatRequest\x1a%.flwr.proto.SendNodeHeartbeatResponse\"\x00\x12S\n\x0cPullMessages\x12\x1f.flwr.proto.PullMessagesRequest\x1a .flwr.proto.PullMessagesResponse\"\x00\x12S\n\x0cPushMessages\x12\x1f.flwr.proto.PushMessagesRequest\x1a .flwr.proto.PushMessagesResponse\"\x00\x12\x41\n\x06GetRun\x12\x19.flwr.proto.GetRunRequest\x1a\x1a.flwr.proto.GetRunResponse\"\x00\x12\x41\n\x06GetFab\x12\x19.flwr.proto.GetFabRequest\x1a\x1a.flwr.proto.GetFabResponse\"\x00\x12M\n\nPushObject\x12\x1d.flwr.proto.PushObjectRequest\x1a\x1e.flwr.proto.PushObjectResponse\"\x00\x12M\n\nPullObject\x12\x1d.flwr.proto.PullObjectRequest\x1a\x1e.flwr.proto.PullObjectResponse\"\x00\x62\x06proto3')
22
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x66lwr/proto/fleet.proto\x12\nflwr.proto\x1a\x1a\x66lwr/proto/heartbeat.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x18\x66lwr/proto/message.proto\"/\n\x11\x43reateNodeRequest\x12\x1a\n\x12heartbeat_interval\x18\x01 \x01(\x01\"4\n\x12\x43reateNodeResponse\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"3\n\x11\x44\x65leteNodeRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"\x14\n\x12\x44\x65leteNodeResponse\"J\n\x13PullMessagesRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x13\n\x0bmessage_ids\x18\x02 \x03(\t\"\x87\x02\n\x14PullMessagesResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12*\n\rmessages_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.Message\x12L\n\x0fobjects_to_pull\x18\x03 \x03(\x0b\x32\x33.flwr.proto.PullMessagesResponse.ObjectsToPullEntry\x1aK\n\x12ObjectsToPullEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.ObjectIDs:\x02\x38\x01\"\x97\x02\n\x13PushMessagesRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12*\n\rmessages_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.Message\x12^\n\x19msg_to_descendant_mapping\x18\x03 \x03(\x0b\x32;.flwr.proto.PushMessagesRequest.MsgToDescendantMappingEntry\x1aT\n\x1bMsgToDescendantMappingEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.ObjectIDs:\x02\x38\x01\"\xcb\x02\n\x14PushMessagesResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12>\n\x07results\x18\x02 \x03(\x0b\x32-.flwr.proto.PushMessagesResponse.ResultsEntry\x12L\n\x0fobjects_to_push\x18\x03 \x03(\x0b\x32\x33.flwr.proto.PushMessagesResponse.ObjectsToPushEntry\x1a.\n\x0cResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\r:\x02\x38\x01\x1aK\n\x12ObjectsToPushEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.ObjectIDs:\x02\x38\x01\"\x1e\n\tReconnect\x12\x11\n\treconnect\x18\x01 \x01(\x04\x32\xd7\x05\n\x05\x46leet\x12M\n\nCreateNode\x12\x1d.flwr.proto.CreateNodeRequest\x1a\x1e.flwr.proto.CreateNodeResponse\"\x00\x12M\n\nDeleteNode\x12\x1d.flwr.proto.DeleteNodeRequest\x1a\x1e.flwr.proto.DeleteNodeResponse\"\x00\x12\x62\n\x11SendNodeHeartbeat\x12$.flwr.proto.SendNodeHeartbeatRequest\x1a%.flwr.proto.SendNodeHeartbeatResponse\"\x00\x12S\n\x0cPullMessages\x12\x1f.flwr.proto.PullMessagesRequest\x1a .flwr.proto.PullMessagesResponse\"\x00\x12S\n\x0cPushMessages\x12\x1f.flwr.proto.PushMessagesRequest\x1a .flwr.proto.PushMessagesResponse\"\x00\x12\x41\n\x06GetRun\x12\x19.flwr.proto.GetRunRequest\x1a\x1a.flwr.proto.GetRunResponse\"\x00\x12\x41\n\x06GetFab\x12\x19.flwr.proto.GetFabRequest\x1a\x1a.flwr.proto.GetFabResponse\"\x00\x12M\n\nPushObject\x12\x1d.flwr.proto.PushObjectRequest\x1a\x1e.flwr.proto.PushObjectResponse\"\x00\x12M\n\nPullObject\x12\x1d.flwr.proto.PullObjectRequest\x1a\x1e.flwr.proto.PullObjectResponse\"\x00\x62\x06proto3')
23
23
 
24
24
  _globals = globals()
25
25
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -28,8 +28,8 @@ if _descriptor._USE_C_DESCRIPTORS == False:
28
28
  DESCRIPTOR._options = None
29
29
  _globals['_PULLMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._options = None
30
30
  _globals['_PULLMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._serialized_options = b'8\001'
31
- _globals['_PUSHMESSAGESREQUEST_MSGTOCHILDRENMAPPINGENTRY']._options = None
32
- _globals['_PUSHMESSAGESREQUEST_MSGTOCHILDRENMAPPINGENTRY']._serialized_options = b'8\001'
31
+ _globals['_PUSHMESSAGESREQUEST_MSGTODESCENDANTMAPPINGENTRY']._options = None
32
+ _globals['_PUSHMESSAGESREQUEST_MSGTODESCENDANTMAPPINGENTRY']._serialized_options = b'8\001'
33
33
  _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._options = None
34
34
  _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_options = b'8\001'
35
35
  _globals['_PUSHMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._options = None
@@ -49,17 +49,17 @@ if _descriptor._USE_C_DESCRIPTORS == False:
49
49
  _globals['_PULLMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._serialized_start=602
50
50
  _globals['_PULLMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._serialized_end=677
51
51
  _globals['_PUSHMESSAGESREQUEST']._serialized_start=680
52
- _globals['_PUSHMESSAGESREQUEST']._serialized_end=953
53
- _globals['_PUSHMESSAGESREQUEST_MSGTOCHILDRENMAPPINGENTRY']._serialized_start=871
54
- _globals['_PUSHMESSAGESREQUEST_MSGTOCHILDRENMAPPINGENTRY']._serialized_end=953
55
- _globals['_PUSHMESSAGESRESPONSE']._serialized_start=956
56
- _globals['_PUSHMESSAGESRESPONSE']._serialized_end=1287
57
- _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_start=1164
58
- _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_end=1210
59
- _globals['_PUSHMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_start=1212
60
- _globals['_PUSHMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_end=1287
61
- _globals['_RECONNECT']._serialized_start=1289
62
- _globals['_RECONNECT']._serialized_end=1319
63
- _globals['_FLEET']._serialized_start=1322
64
- _globals['_FLEET']._serialized_end=2049
52
+ _globals['_PUSHMESSAGESREQUEST']._serialized_end=959
53
+ _globals['_PUSHMESSAGESREQUEST_MSGTODESCENDANTMAPPINGENTRY']._serialized_start=875
54
+ _globals['_PUSHMESSAGESREQUEST_MSGTODESCENDANTMAPPINGENTRY']._serialized_end=959
55
+ _globals['_PUSHMESSAGESRESPONSE']._serialized_start=962
56
+ _globals['_PUSHMESSAGESRESPONSE']._serialized_end=1293
57
+ _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_start=1170
58
+ _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_end=1216
59
+ _globals['_PUSHMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_start=1218
60
+ _globals['_PUSHMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_end=1293
61
+ _globals['_RECONNECT']._serialized_start=1295
62
+ _globals['_RECONNECT']._serialized_end=1325
63
+ _globals['_FLEET']._serialized_start=1328
64
+ _globals['_FLEET']._serialized_end=2055
65
65
  # @@protoc_insertion_point(module_scope)
flwr/proto/fleet_pb2.pyi CHANGED
@@ -115,7 +115,7 @@ global___PullMessagesResponse = PullMessagesResponse
115
115
  class PushMessagesRequest(google.protobuf.message.Message):
116
116
  """PushMessages messages"""
117
117
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
118
- class MsgToChildrenMappingEntry(google.protobuf.message.Message):
118
+ class MsgToDescendantMappingEntry(google.protobuf.message.Message):
119
119
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
120
120
  KEY_FIELD_NUMBER: builtins.int
121
121
  VALUE_FIELD_NUMBER: builtins.int
@@ -132,21 +132,21 @@ class PushMessagesRequest(google.protobuf.message.Message):
132
132
 
133
133
  NODE_FIELD_NUMBER: builtins.int
134
134
  MESSAGES_LIST_FIELD_NUMBER: builtins.int
135
- MSG_TO_CHILDREN_MAPPING_FIELD_NUMBER: builtins.int
135
+ MSG_TO_DESCENDANT_MAPPING_FIELD_NUMBER: builtins.int
136
136
  @property
137
137
  def node(self) -> flwr.proto.node_pb2.Node: ...
138
138
  @property
139
139
  def messages_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.Message]: ...
140
140
  @property
141
- def msg_to_children_mapping(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.message_pb2.ObjectIDs]: ...
141
+ def msg_to_descendant_mapping(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.message_pb2.ObjectIDs]: ...
142
142
  def __init__(self,
143
143
  *,
144
144
  node: typing.Optional[flwr.proto.node_pb2.Node] = ...,
145
145
  messages_list: typing.Optional[typing.Iterable[flwr.proto.message_pb2.Message]] = ...,
146
- msg_to_children_mapping: typing.Optional[typing.Mapping[typing.Text, flwr.proto.message_pb2.ObjectIDs]] = ...,
146
+ msg_to_descendant_mapping: typing.Optional[typing.Mapping[typing.Text, flwr.proto.message_pb2.ObjectIDs]] = ...,
147
147
  ) -> None: ...
148
148
  def HasField(self, field_name: typing_extensions.Literal["node",b"node"]) -> builtins.bool: ...
149
- def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list","msg_to_children_mapping",b"msg_to_children_mapping","node",b"node"]) -> None: ...
149
+ def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list","msg_to_descendant_mapping",b"msg_to_descendant_mapping","node",b"node"]) -> None: ...
150
150
  global___PushMessagesRequest = PushMessagesRequest
151
151
 
152
152
  class PushMessagesResponse(google.protobuf.message.Message):
flwr/proto/message_pb2.py CHANGED
@@ -18,7 +18,7 @@ from flwr.proto import transport_pb2 as flwr_dot_proto_dot_transport__pb2
18
18
  from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
19
19
 
20
20
 
21
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66lwr/proto/message.proto\x12\nflwr.proto\x1a\x16\x66lwr/proto/error.proto\x1a\x1b\x66lwr/proto/recorddict.proto\x1a\x1a\x66lwr/proto/transport.proto\x1a\x15\x66lwr/proto/node.proto\"|\n\x07Message\x12&\n\x08metadata\x18\x01 \x01(\x0b\x32\x14.flwr.proto.Metadata\x12\'\n\x07\x63ontent\x18\x02 \x01(\x0b\x32\x16.flwr.proto.RecordDict\x12 \n\x05\x65rror\x18\x03 \x01(\x0b\x32\x11.flwr.proto.Error\"\xd0\x02\n\x07\x43ontext\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x0f\n\x07node_id\x18\x02 \x01(\x04\x12\x38\n\x0bnode_config\x18\x03 \x03(\x0b\x32#.flwr.proto.Context.NodeConfigEntry\x12%\n\x05state\x18\x04 \x01(\x0b\x32\x16.flwr.proto.RecordDict\x12\x36\n\nrun_config\x18\x05 \x03(\x0b\x32\".flwr.proto.Context.RunConfigEntry\x1a\x45\n\x0fNodeConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1a\x44\n\x0eRunConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"\xbe\x01\n\x08Metadata\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x12\n\nmessage_id\x18\x02 \x01(\t\x12\x13\n\x0bsrc_node_id\x18\x03 \x01(\x04\x12\x13\n\x0b\x64st_node_id\x18\x04 \x01(\x04\x12\x1b\n\x13reply_to_message_id\x18\x05 \x01(\t\x12\x10\n\x08group_id\x18\x06 \x01(\t\x12\x0b\n\x03ttl\x18\x07 \x01(\x01\x12\x14\n\x0cmessage_type\x18\x08 \x01(\t\x12\x12\n\ncreated_at\x18\t \x01(\x01\"\x1e\n\tObjectIDs\x12\x11\n\tobject_id\x18\x01 \x03(\t\"^\n\x11PushObjectRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x11\n\tobject_id\x18\x02 \x01(\t\x12\x16\n\x0eobject_content\x18\x03 \x01(\x0c\"\x14\n\x12PushObjectResponse\"F\n\x11PullObjectRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x11\n\tobject_id\x18\x02 \x01(\t\",\n\x12PullObjectResponse\x12\x16\n\x0eobject_content\x18\x01 \x01(\x0c\x62\x06proto3')
21
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66lwr/proto/message.proto\x12\nflwr.proto\x1a\x16\x66lwr/proto/error.proto\x1a\x1b\x66lwr/proto/recorddict.proto\x1a\x1a\x66lwr/proto/transport.proto\x1a\x15\x66lwr/proto/node.proto\"|\n\x07Message\x12&\n\x08metadata\x18\x01 \x01(\x0b\x32\x14.flwr.proto.Metadata\x12\'\n\x07\x63ontent\x18\x02 \x01(\x0b\x32\x16.flwr.proto.RecordDict\x12 \n\x05\x65rror\x18\x03 \x01(\x0b\x32\x11.flwr.proto.Error\"\xd0\x02\n\x07\x43ontext\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x0f\n\x07node_id\x18\x02 \x01(\x04\x12\x38\n\x0bnode_config\x18\x03 \x03(\x0b\x32#.flwr.proto.Context.NodeConfigEntry\x12%\n\x05state\x18\x04 \x01(\x0b\x32\x16.flwr.proto.RecordDict\x12\x36\n\nrun_config\x18\x05 \x03(\x0b\x32\".flwr.proto.Context.RunConfigEntry\x1a\x45\n\x0fNodeConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1a\x44\n\x0eRunConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"\xbe\x01\n\x08Metadata\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x12\n\nmessage_id\x18\x02 \x01(\t\x12\x13\n\x0bsrc_node_id\x18\x03 \x01(\x04\x12\x13\n\x0b\x64st_node_id\x18\x04 \x01(\x04\x12\x1b\n\x13reply_to_message_id\x18\x05 \x01(\t\x12\x10\n\x08group_id\x18\x06 \x01(\t\x12\x0b\n\x03ttl\x18\x07 \x01(\x01\x12\x14\n\x0cmessage_type\x18\x08 \x01(\t\x12\x12\n\ncreated_at\x18\t \x01(\x01\"\x1f\n\tObjectIDs\x12\x12\n\nobject_ids\x18\x01 \x03(\t\"^\n\x11PushObjectRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x11\n\tobject_id\x18\x02 \x01(\t\x12\x16\n\x0eobject_content\x18\x03 \x01(\x0c\"\x14\n\x12PushObjectResponse\"F\n\x11PullObjectRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x11\n\tobject_id\x18\x02 \x01(\t\",\n\x12PullObjectResponse\x12\x16\n\x0eobject_content\x18\x01 \x01(\x0c\x62\x06proto3')
22
22
 
23
23
  _globals = globals()
24
24
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -40,13 +40,13 @@ if _descriptor._USE_C_DESCRIPTORS == False:
40
40
  _globals['_METADATA']._serialized_start=610
41
41
  _globals['_METADATA']._serialized_end=800
42
42
  _globals['_OBJECTIDS']._serialized_start=802
43
- _globals['_OBJECTIDS']._serialized_end=832
44
- _globals['_PUSHOBJECTREQUEST']._serialized_start=834
45
- _globals['_PUSHOBJECTREQUEST']._serialized_end=928
46
- _globals['_PUSHOBJECTRESPONSE']._serialized_start=930
47
- _globals['_PUSHOBJECTRESPONSE']._serialized_end=950
48
- _globals['_PULLOBJECTREQUEST']._serialized_start=952
49
- _globals['_PULLOBJECTREQUEST']._serialized_end=1022
50
- _globals['_PULLOBJECTRESPONSE']._serialized_start=1024
51
- _globals['_PULLOBJECTRESPONSE']._serialized_end=1068
43
+ _globals['_OBJECTIDS']._serialized_end=833
44
+ _globals['_PUSHOBJECTREQUEST']._serialized_start=835
45
+ _globals['_PUSHOBJECTREQUEST']._serialized_end=929
46
+ _globals['_PUSHOBJECTRESPONSE']._serialized_start=931
47
+ _globals['_PUSHOBJECTRESPONSE']._serialized_end=951
48
+ _globals['_PULLOBJECTREQUEST']._serialized_start=953
49
+ _globals['_PULLOBJECTREQUEST']._serialized_end=1023
50
+ _globals['_PULLOBJECTRESPONSE']._serialized_start=1025
51
+ _globals['_PULLOBJECTRESPONSE']._serialized_end=1069
52
52
  # @@protoc_insertion_point(module_scope)
@@ -130,14 +130,14 @@ global___Metadata = Metadata
130
130
 
131
131
  class ObjectIDs(google.protobuf.message.Message):
132
132
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
133
- OBJECT_ID_FIELD_NUMBER: builtins.int
133
+ OBJECT_IDS_FIELD_NUMBER: builtins.int
134
134
  @property
135
- def object_id(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]: ...
135
+ def object_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]: ...
136
136
  def __init__(self,
137
137
  *,
138
- object_id: typing.Optional[typing.Iterable[typing.Text]] = ...,
138
+ object_ids: typing.Optional[typing.Iterable[typing.Text]] = ...,
139
139
  ) -> None: ...
140
- def ClearField(self, field_name: typing_extensions.Literal["object_id",b"object_id"]) -> None: ...
140
+ def ClearField(self, field_name: typing_extensions.Literal["object_ids",b"object_ids"]) -> None: ...
141
141
  global___ObjectIDs = ObjectIDs
142
142
 
143
143
  class PushObjectRequest(google.protobuf.message.Message):
@@ -20,15 +20,15 @@ from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
20
20
  from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
21
21
 
22
22
 
23
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lwr/proto/serverappio.proto\x12\nflwr.proto\x1a\x1a\x66lwr/proto/heartbeat.proto\x1a\x14\x66lwr/proto/log.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x18\x66lwr/proto/message.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\"!\n\x0fGetNodesRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"3\n\x10GetNodesResponse\x12\x1f\n\x05nodes\x18\x01 \x03(\x0b\x32\x10.flwr.proto.Node\"\x87\x02\n\x16PushInsMessagesRequest\x12*\n\rmessages_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.Message\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\x12]\n\x17msg_to_children_mapping\x18\x03 \x03(\x0b\x32<.flwr.proto.PushInsMessagesRequest.MsgToChildrenMappingEntry\x1aR\n\x19MsgToChildrenMappingEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.ObjectIDs:\x02\x38\x01\"\xcc\x01\n\x17PushInsMessagesResponse\x12\x13\n\x0bmessage_ids\x18\x01 \x03(\t\x12O\n\x0fobjects_to_push\x18\x02 \x03(\x0b\x32\x36.flwr.proto.PushInsMessagesResponse.ObjectsToPushEntry\x1aK\n\x12ObjectsToPushEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.ObjectIDs:\x02\x38\x01\"=\n\x16PullResMessagesRequest\x12\x13\n\x0bmessage_ids\x18\x01 \x03(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\"\xe3\x01\n\x17PullResMessagesResponse\x12*\n\rmessages_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.Message\x12O\n\x0fobjects_to_pull\x18\x02 \x03(\x0b\x32\x36.flwr.proto.PullResMessagesResponse.ObjectsToPullEntry\x1aK\n\x12ObjectsToPullEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.ObjectIDs:\x02\x38\x01\"\x1c\n\x1aPullServerAppInputsRequest\"\x7f\n\x1bPullServerAppInputsResponse\x12$\n\x07\x63ontext\x18\x01 \x01(\x0b\x32\x13.flwr.proto.Context\x12\x1c\n\x03run\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run\x12\x1c\n\x03\x66\x61\x62\x18\x03 \x01(\x0b\x32\x0f.flwr.proto.Fab\"S\n\x1bPushServerAppOutputsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12$\n\x07\x63ontext\x18\x02 \x01(\x0b\x32\x13.flwr.proto.Context\"\x1e\n\x1cPushServerAppOutputsResponse2\xe4\x08\n\x0bServerAppIo\x12G\n\x08GetNodes\x12\x1b.flwr.proto.GetNodesRequest\x1a\x1c.flwr.proto.GetNodesResponse\"\x00\x12Y\n\x0cPushMessages\x12\".flwr.proto.PushInsMessagesRequest\x1a#.flwr.proto.PushInsMessagesResponse\"\x00\x12Y\n\x0cPullMessages\x12\".flwr.proto.PullResMessagesRequest\x1a#.flwr.proto.PullResMessagesResponse\"\x00\x12\x41\n\x06GetRun\x12\x19.flwr.proto.GetRunRequest\x1a\x1a.flwr.proto.GetRunResponse\"\x00\x12\x41\n\x06GetFab\x12\x19.flwr.proto.GetFabRequest\x1a\x1a.flwr.proto.GetFabResponse\"\x00\x12h\n\x13PullServerAppInputs\x12&.flwr.proto.PullServerAppInputsRequest\x1a\'.flwr.proto.PullServerAppInputsResponse\"\x00\x12k\n\x14PushServerAppOutputs\x12\'.flwr.proto.PushServerAppOutputsRequest\x1a(.flwr.proto.PushServerAppOutputsResponse\"\x00\x12\\\n\x0fUpdateRunStatus\x12\".flwr.proto.UpdateRunStatusRequest\x1a#.flwr.proto.UpdateRunStatusResponse\"\x00\x12S\n\x0cGetRunStatus\x12\x1f.flwr.proto.GetRunStatusRequest\x1a .flwr.proto.GetRunStatusResponse\"\x00\x12G\n\x08PushLogs\x12\x1b.flwr.proto.PushLogsRequest\x1a\x1c.flwr.proto.PushLogsResponse\"\x00\x12_\n\x10SendAppHeartbeat\x12#.flwr.proto.SendAppHeartbeatRequest\x1a$.flwr.proto.SendAppHeartbeatResponse\"\x00\x12M\n\nPushObject\x12\x1d.flwr.proto.PushObjectRequest\x1a\x1e.flwr.proto.PushObjectResponse\"\x00\x12M\n\nPullObject\x12\x1d.flwr.proto.PullObjectRequest\x1a\x1e.flwr.proto.PullObjectResponse\"\x00\x62\x06proto3')
23
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lwr/proto/serverappio.proto\x12\nflwr.proto\x1a\x1a\x66lwr/proto/heartbeat.proto\x1a\x14\x66lwr/proto/log.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x18\x66lwr/proto/message.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\"!\n\x0fGetNodesRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"3\n\x10GetNodesResponse\x12\x1f\n\x05nodes\x18\x01 \x03(\x0b\x32\x10.flwr.proto.Node\"\x8d\x02\n\x16PushInsMessagesRequest\x12*\n\rmessages_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.Message\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\x12\x61\n\x19msg_to_descendant_mapping\x18\x03 \x03(\x0b\x32>.flwr.proto.PushInsMessagesRequest.MsgToDescendantMappingEntry\x1aT\n\x1bMsgToDescendantMappingEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.ObjectIDs:\x02\x38\x01\"\xcc\x01\n\x17PushInsMessagesResponse\x12\x13\n\x0bmessage_ids\x18\x01 \x03(\t\x12O\n\x0fobjects_to_push\x18\x02 \x03(\x0b\x32\x36.flwr.proto.PushInsMessagesResponse.ObjectsToPushEntry\x1aK\n\x12ObjectsToPushEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.ObjectIDs:\x02\x38\x01\"=\n\x16PullResMessagesRequest\x12\x13\n\x0bmessage_ids\x18\x01 \x03(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\"\xe3\x01\n\x17PullResMessagesResponse\x12*\n\rmessages_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.Message\x12O\n\x0fobjects_to_pull\x18\x02 \x03(\x0b\x32\x36.flwr.proto.PullResMessagesResponse.ObjectsToPullEntry\x1aK\n\x12ObjectsToPullEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.ObjectIDs:\x02\x38\x01\"\x1c\n\x1aPullServerAppInputsRequest\"\x7f\n\x1bPullServerAppInputsResponse\x12$\n\x07\x63ontext\x18\x01 \x01(\x0b\x32\x13.flwr.proto.Context\x12\x1c\n\x03run\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run\x12\x1c\n\x03\x66\x61\x62\x18\x03 \x01(\x0b\x32\x0f.flwr.proto.Fab\"S\n\x1bPushServerAppOutputsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12$\n\x07\x63ontext\x18\x02 \x01(\x0b\x32\x13.flwr.proto.Context\"\x1e\n\x1cPushServerAppOutputsResponse2\xe4\x08\n\x0bServerAppIo\x12G\n\x08GetNodes\x12\x1b.flwr.proto.GetNodesRequest\x1a\x1c.flwr.proto.GetNodesResponse\"\x00\x12Y\n\x0cPushMessages\x12\".flwr.proto.PushInsMessagesRequest\x1a#.flwr.proto.PushInsMessagesResponse\"\x00\x12Y\n\x0cPullMessages\x12\".flwr.proto.PullResMessagesRequest\x1a#.flwr.proto.PullResMessagesResponse\"\x00\x12\x41\n\x06GetRun\x12\x19.flwr.proto.GetRunRequest\x1a\x1a.flwr.proto.GetRunResponse\"\x00\x12\x41\n\x06GetFab\x12\x19.flwr.proto.GetFabRequest\x1a\x1a.flwr.proto.GetFabResponse\"\x00\x12h\n\x13PullServerAppInputs\x12&.flwr.proto.PullServerAppInputsRequest\x1a\'.flwr.proto.PullServerAppInputsResponse\"\x00\x12k\n\x14PushServerAppOutputs\x12\'.flwr.proto.PushServerAppOutputsRequest\x1a(.flwr.proto.PushServerAppOutputsResponse\"\x00\x12\\\n\x0fUpdateRunStatus\x12\".flwr.proto.UpdateRunStatusRequest\x1a#.flwr.proto.UpdateRunStatusResponse\"\x00\x12S\n\x0cGetRunStatus\x12\x1f.flwr.proto.GetRunStatusRequest\x1a .flwr.proto.GetRunStatusResponse\"\x00\x12G\n\x08PushLogs\x12\x1b.flwr.proto.PushLogsRequest\x1a\x1c.flwr.proto.PushLogsResponse\"\x00\x12_\n\x10SendAppHeartbeat\x12#.flwr.proto.SendAppHeartbeatRequest\x1a$.flwr.proto.SendAppHeartbeatResponse\"\x00\x12M\n\nPushObject\x12\x1d.flwr.proto.PushObjectRequest\x1a\x1e.flwr.proto.PushObjectResponse\"\x00\x12M\n\nPullObject\x12\x1d.flwr.proto.PullObjectRequest\x1a\x1e.flwr.proto.PullObjectResponse\"\x00\x62\x06proto3')
24
24
 
25
25
  _globals = globals()
26
26
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
27
27
  _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.serverappio_pb2', _globals)
28
28
  if _descriptor._USE_C_DESCRIPTORS == False:
29
29
  DESCRIPTOR._options = None
30
- _globals['_PUSHINSMESSAGESREQUEST_MSGTOCHILDRENMAPPINGENTRY']._options = None
31
- _globals['_PUSHINSMESSAGESREQUEST_MSGTOCHILDRENMAPPINGENTRY']._serialized_options = b'8\001'
30
+ _globals['_PUSHINSMESSAGESREQUEST_MSGTODESCENDANTMAPPINGENTRY']._options = None
31
+ _globals['_PUSHINSMESSAGESREQUEST_MSGTODESCENDANTMAPPINGENTRY']._serialized_options = b'8\001'
32
32
  _globals['_PUSHINSMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._options = None
33
33
  _globals['_PUSHINSMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_options = b'8\001'
34
34
  _globals['_PULLRESMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._options = None
@@ -38,27 +38,27 @@ if _descriptor._USE_C_DESCRIPTORS == False:
38
38
  _globals['_GETNODESRESPONSE']._serialized_start=222
39
39
  _globals['_GETNODESRESPONSE']._serialized_end=273
40
40
  _globals['_PUSHINSMESSAGESREQUEST']._serialized_start=276
41
- _globals['_PUSHINSMESSAGESREQUEST']._serialized_end=539
42
- _globals['_PUSHINSMESSAGESREQUEST_MSGTOCHILDRENMAPPINGENTRY']._serialized_start=457
43
- _globals['_PUSHINSMESSAGESREQUEST_MSGTOCHILDRENMAPPINGENTRY']._serialized_end=539
44
- _globals['_PUSHINSMESSAGESRESPONSE']._serialized_start=542
45
- _globals['_PUSHINSMESSAGESRESPONSE']._serialized_end=746
46
- _globals['_PUSHINSMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_start=671
47
- _globals['_PUSHINSMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_end=746
48
- _globals['_PULLRESMESSAGESREQUEST']._serialized_start=748
49
- _globals['_PULLRESMESSAGESREQUEST']._serialized_end=809
50
- _globals['_PULLRESMESSAGESRESPONSE']._serialized_start=812
51
- _globals['_PULLRESMESSAGESRESPONSE']._serialized_end=1039
52
- _globals['_PULLRESMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._serialized_start=964
53
- _globals['_PULLRESMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._serialized_end=1039
54
- _globals['_PULLSERVERAPPINPUTSREQUEST']._serialized_start=1041
55
- _globals['_PULLSERVERAPPINPUTSREQUEST']._serialized_end=1069
56
- _globals['_PULLSERVERAPPINPUTSRESPONSE']._serialized_start=1071
57
- _globals['_PULLSERVERAPPINPUTSRESPONSE']._serialized_end=1198
58
- _globals['_PUSHSERVERAPPOUTPUTSREQUEST']._serialized_start=1200
59
- _globals['_PUSHSERVERAPPOUTPUTSREQUEST']._serialized_end=1283
60
- _globals['_PUSHSERVERAPPOUTPUTSRESPONSE']._serialized_start=1285
61
- _globals['_PUSHSERVERAPPOUTPUTSRESPONSE']._serialized_end=1315
62
- _globals['_SERVERAPPIO']._serialized_start=1318
63
- _globals['_SERVERAPPIO']._serialized_end=2442
41
+ _globals['_PUSHINSMESSAGESREQUEST']._serialized_end=545
42
+ _globals['_PUSHINSMESSAGESREQUEST_MSGTODESCENDANTMAPPINGENTRY']._serialized_start=461
43
+ _globals['_PUSHINSMESSAGESREQUEST_MSGTODESCENDANTMAPPINGENTRY']._serialized_end=545
44
+ _globals['_PUSHINSMESSAGESRESPONSE']._serialized_start=548
45
+ _globals['_PUSHINSMESSAGESRESPONSE']._serialized_end=752
46
+ _globals['_PUSHINSMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_start=677
47
+ _globals['_PUSHINSMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_end=752
48
+ _globals['_PULLRESMESSAGESREQUEST']._serialized_start=754
49
+ _globals['_PULLRESMESSAGESREQUEST']._serialized_end=815
50
+ _globals['_PULLRESMESSAGESRESPONSE']._serialized_start=818
51
+ _globals['_PULLRESMESSAGESRESPONSE']._serialized_end=1045
52
+ _globals['_PULLRESMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._serialized_start=970
53
+ _globals['_PULLRESMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._serialized_end=1045
54
+ _globals['_PULLSERVERAPPINPUTSREQUEST']._serialized_start=1047
55
+ _globals['_PULLSERVERAPPINPUTSREQUEST']._serialized_end=1075
56
+ _globals['_PULLSERVERAPPINPUTSRESPONSE']._serialized_start=1077
57
+ _globals['_PULLSERVERAPPINPUTSRESPONSE']._serialized_end=1204
58
+ _globals['_PUSHSERVERAPPOUTPUTSREQUEST']._serialized_start=1206
59
+ _globals['_PUSHSERVERAPPOUTPUTSREQUEST']._serialized_end=1289
60
+ _globals['_PUSHSERVERAPPOUTPUTSRESPONSE']._serialized_start=1291
61
+ _globals['_PUSHSERVERAPPOUTPUTSRESPONSE']._serialized_end=1321
62
+ _globals['_SERVERAPPIO']._serialized_start=1324
63
+ _globals['_SERVERAPPIO']._serialized_end=2448
64
64
  # @@protoc_insertion_point(module_scope)
@@ -42,7 +42,7 @@ global___GetNodesResponse = GetNodesResponse
42
42
  class PushInsMessagesRequest(google.protobuf.message.Message):
43
43
  """PushMessages messages"""
44
44
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
45
- class MsgToChildrenMappingEntry(google.protobuf.message.Message):
45
+ class MsgToDescendantMappingEntry(google.protobuf.message.Message):
46
46
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
47
47
  KEY_FIELD_NUMBER: builtins.int
48
48
  VALUE_FIELD_NUMBER: builtins.int
@@ -59,19 +59,19 @@ class PushInsMessagesRequest(google.protobuf.message.Message):
59
59
 
60
60
  MESSAGES_LIST_FIELD_NUMBER: builtins.int
61
61
  RUN_ID_FIELD_NUMBER: builtins.int
62
- MSG_TO_CHILDREN_MAPPING_FIELD_NUMBER: builtins.int
62
+ MSG_TO_DESCENDANT_MAPPING_FIELD_NUMBER: builtins.int
63
63
  @property
64
64
  def messages_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.Message]: ...
65
65
  run_id: builtins.int
66
66
  @property
67
- def msg_to_children_mapping(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.message_pb2.ObjectIDs]: ...
67
+ def msg_to_descendant_mapping(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.message_pb2.ObjectIDs]: ...
68
68
  def __init__(self,
69
69
  *,
70
70
  messages_list: typing.Optional[typing.Iterable[flwr.proto.message_pb2.Message]] = ...,
71
71
  run_id: builtins.int = ...,
72
- msg_to_children_mapping: typing.Optional[typing.Mapping[typing.Text, flwr.proto.message_pb2.ObjectIDs]] = ...,
72
+ msg_to_descendant_mapping: typing.Optional[typing.Mapping[typing.Text, flwr.proto.message_pb2.ObjectIDs]] = ...,
73
73
  ) -> None: ...
74
- def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list","msg_to_children_mapping",b"msg_to_children_mapping","run_id",b"run_id"]) -> None: ...
74
+ def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list","msg_to_descendant_mapping",b"msg_to_descendant_mapping","run_id",b"run_id"]) -> None: ...
75
75
  global___PushInsMessagesRequest = PushInsMessagesRequest
76
76
 
77
77
  class PushInsMessagesResponse(google.protobuf.message.Message):
flwr/server/app.py CHANGED
@@ -27,7 +27,7 @@ from collections.abc import Sequence
27
27
  from logging import DEBUG, INFO, WARN
28
28
  from pathlib import Path
29
29
  from time import sleep
30
- from typing import Any, Optional
30
+ from typing import Any, Callable, Optional, Union, cast
31
31
 
32
32
  import grpc
33
33
  import yaml
@@ -155,17 +155,14 @@ def run_superlink() -> None:
155
155
  event_log_plugin: Optional[EventLogWriterPlugin] = None
156
156
  # Load the auth plugin if the args.user_auth_config is provided
157
157
  if cfg_path := getattr(args, "user_auth_config", None):
158
- auth_plugin = _try_obtain_exec_auth_plugin(Path(cfg_path), verify_tls_cert)
158
+ # pylint: disable=unused-variable
159
+ auth_plugin, authz_plugin = _try_obtain_exec_auth_plugins( # noqa: F841
160
+ Path(cfg_path), verify_tls_cert
161
+ )
162
+ # pylint: enable=unused-variable
159
163
  # Enable event logging if the args.enable_event_log is True
160
164
  if args.enable_event_log:
161
165
  event_log_plugin = _try_obtain_exec_event_log_writer_plugin()
162
- # Enable authorization if the args.enable_authorization is True
163
- if args.enable_authorization:
164
- # pylint: disable=unused-variable
165
- authz_plugin = _try_obtain_exec_authz_plugin( # noqa: F841
166
- Path(cfg_path), verify_tls_cert
167
- )
168
- # pylint: enable=unused-variable
169
166
 
170
167
  # Initialize StateFactory
171
168
  state_factory = LinkStateFactory(args.database)
@@ -258,6 +255,7 @@ def run_superlink() -> None:
258
255
  args.ssl_certfile,
259
256
  state_factory,
260
257
  ffs_factory,
258
+ objectstore_factory,
261
259
  num_workers,
262
260
  ),
263
261
  daemon=True,
@@ -483,62 +481,58 @@ def _try_load_public_keys_node_authentication(
483
481
  return node_public_keys
484
482
 
485
483
 
486
- def _try_obtain_exec_auth_plugin(
484
+ def _try_obtain_exec_auth_plugins(
487
485
  config_path: Path, verify_tls_cert: bool
488
- ) -> Optional[ExecAuthPlugin]:
486
+ ) -> tuple[ExecAuthPlugin, ExecAuthzPlugin]:
487
+ """Obtain Exec API authentication and authorization plugins."""
489
488
  # Load YAML file
490
489
  with config_path.open("r", encoding="utf-8") as file:
491
490
  config: dict[str, Any] = yaml.safe_load(file)
492
491
 
493
- # Load authentication configuration
494
- auth_config: dict[str, Any] = config.get("authentication", {})
495
- auth_type: str = auth_config.get(AUTH_TYPE_YAML_KEY, "")
496
-
497
- # Load authentication plugin
498
- try:
499
- all_plugins: dict[str, type[ExecAuthPlugin]] = get_exec_auth_plugins()
500
- auth_plugin_class = all_plugins[auth_type]
501
- return auth_plugin_class(
502
- user_auth_config_path=config_path, verify_tls_cert=verify_tls_cert
503
- )
504
- except KeyError:
505
- if auth_type != "":
506
- sys.exit(
507
- f'Authentication type "{auth_type}" is not supported. '
508
- "Please provide a valid authentication type in the configuration."
492
+ def _load_plugin(
493
+ section: str,
494
+ yaml_key: str,
495
+ loader: Callable[[], dict[str, type[Union[ExecAuthPlugin, ExecAuthzPlugin]]]],
496
+ ) -> Union[ExecAuthPlugin, ExecAuthzPlugin]:
497
+ section_cfg = config.get(section, {})
498
+ auth_plugin_name = section_cfg.get(yaml_key, "")
499
+ try:
500
+ plugins = loader()
501
+ plugin_cls = plugins[auth_plugin_name]
502
+ return plugin_cls(
503
+ user_auth_config_path=config_path, verify_tls_cert=verify_tls_cert
509
504
  )
510
- sys.exit("No authentication type is provided in the configuration.")
511
- except NotImplementedError:
512
- sys.exit("No authentication plugins are currently supported.")
513
-
514
-
515
- def _try_obtain_exec_authz_plugin(
516
- config_path: Path, verify_tls_cert: bool
517
- ) -> Optional[ExecAuthzPlugin]:
518
- # Load YAML file
519
- with config_path.open("r", encoding="utf-8") as file:
520
- config: dict[str, Any] = yaml.safe_load(file)
505
+ except KeyError:
506
+ if auth_plugin_name:
507
+ sys.exit(
508
+ f"{yaml_key}: {auth_plugin_name} is not supported. "
509
+ f"Please provide a valid {section} type in the configuration."
510
+ )
511
+ sys.exit(f"No {section} type is provided in the configuration.")
512
+ except NotImplementedError:
513
+ sys.exit(f"No {section} plugins are currently supported.")
521
514
 
522
- # Load authentication configuration
523
- authz_config: dict[str, Any] = config.get("authorization", {})
524
- authz_type: str = authz_config.get(AUTHZ_TYPE_YAML_KEY, "")
515
+ # Load authentication plugin
516
+ auth_plugin = cast(
517
+ ExecAuthPlugin,
518
+ _load_plugin(
519
+ section="authentication",
520
+ yaml_key=AUTH_TYPE_YAML_KEY,
521
+ loader=get_exec_auth_plugins,
522
+ ),
523
+ )
525
524
 
526
525
  # Load authorization plugin
527
- try:
528
- all_plugins: dict[str, type[ExecAuthzPlugin]] = get_exec_authz_plugins()
529
- authz_plugin_class = all_plugins[authz_type]
530
- return authz_plugin_class(
531
- user_authz_config_path=config_path, verify_tls_cert=verify_tls_cert
532
- )
533
- except KeyError:
534
- if authz_type != "":
535
- sys.exit(
536
- f'Authentication type "{authz_type}" is not supported. '
537
- "Please provide a valid authorization type in the configuration."
538
- )
539
- sys.exit("No authorization type is provided in the configuration.")
540
- except NotImplementedError:
541
- sys.exit("No authorization plugins are currently supported.")
526
+ authz_plugin = cast(
527
+ ExecAuthzPlugin,
528
+ _load_plugin(
529
+ section="authorization",
530
+ yaml_key=AUTHZ_TYPE_YAML_KEY,
531
+ loader=get_exec_authz_plugins,
532
+ ),
533
+ )
534
+
535
+ return auth_plugin, authz_plugin
542
536
 
543
537
 
544
538
  def _try_obtain_exec_event_log_writer_plugin() -> Optional[EventLogWriterPlugin]:
@@ -636,6 +630,7 @@ def _run_fleet_api_rest(
636
630
  ssl_certfile: Optional[str],
637
631
  state_factory: LinkStateFactory,
638
632
  ffs_factory: FfsFactory,
633
+ objectstore_factory: ObjectStoreFactory,
639
634
  num_workers: int,
640
635
  ) -> None:
641
636
  """Run ServerAppIo API (REST-based)."""
@@ -651,6 +646,7 @@ def _run_fleet_api_rest(
651
646
  # See: https://www.starlette.io/applications/#accessing-the-app-instance
652
647
  fast_api_app.state.STATE_FACTORY = state_factory
653
648
  fast_api_app.state.FFS_FACTORY = ffs_factory
649
+ fast_api_app.state.OBJECTSTORE_FACTORY = objectstore_factory
654
650
 
655
651
  uvicorn.run(
656
652
  app="flwr.server.superlink.fleet.rest_rere.rest_api:app",
@@ -133,6 +133,7 @@ class FleetServicer(fleet_pb2_grpc.FleetServicer):
133
133
  res = message_handler.push_messages(
134
134
  request=request,
135
135
  state=self.state_factory.state(),
136
+ store=self.objectstore_factory.store(),
136
137
  )
137
138
  except InvalidRunStatusException as e:
138
139
  abort_grpc_context(e.message, context)
@@ -51,6 +51,9 @@ from flwr.proto.run_pb2 import ( # pylint: disable=E0611
51
51
  from flwr.server.superlink.ffs.ffs import Ffs
52
52
  from flwr.server.superlink.linkstate import LinkState
53
53
  from flwr.server.superlink.utils import check_abort
54
+ from flwr.supercore.object_store import ObjectStore
55
+
56
+ from ...utils import store_mapping_and_register_objects
54
57
 
55
58
 
56
59
  def create_node(
@@ -105,7 +108,9 @@ def pull_messages(
105
108
 
106
109
 
107
110
  def push_messages(
108
- request: PushMessagesRequest, state: LinkState
111
+ request: PushMessagesRequest,
112
+ state: LinkState,
113
+ store: ObjectStore,
109
114
  ) -> PushMessagesResponse:
110
115
  """Push Messages handler."""
111
116
  # Convert Message from proto
@@ -123,10 +128,14 @@ def push_messages(
123
128
  # Store Message in State
124
129
  message_id: Optional[str] = state.store_message_res(message=msg)
125
130
 
131
+ # Store Message object to descendants mapping and preregister objects
132
+ objects_to_push = store_mapping_and_register_objects(store, request=request)
133
+
126
134
  # Build response
127
135
  response = PushMessagesResponse(
128
136
  reconnect=Reconnect(reconnect=5),
129
137
  results={str(message_id): 0},
138
+ objects_to_push=objects_to_push,
130
139
  )
131
140
  return response
132
141
 
@@ -43,6 +43,7 @@ from flwr.server.superlink.ffs.ffs import Ffs
43
43
  from flwr.server.superlink.ffs.ffs_factory import FfsFactory
44
44
  from flwr.server.superlink.fleet.message_handler import message_handler
45
45
  from flwr.server.superlink.linkstate import LinkState, LinkStateFactory
46
+ from flwr.supercore.object_store import ObjectStore, ObjectStoreFactory
46
47
 
47
48
  try:
48
49
  from starlette.applications import Starlette
@@ -123,9 +124,10 @@ async def push_message(request: PushMessagesRequest) -> PushMessagesResponse:
123
124
  """Pull PushMessages."""
124
125
  # Get state from app
125
126
  state: LinkState = cast(LinkStateFactory, app.state.STATE_FACTORY).state()
127
+ store: ObjectStore = cast(ObjectStoreFactory, app.state.STATE_FACTORY).store()
126
128
 
127
129
  # Handle message
128
- return message_handler.push_messages(request=request, state=state)
130
+ return message_handler.push_messages(request=request, state=state, store=store)
129
131
 
130
132
 
131
133
  @rest_request_response(SendNodeHeartbeatRequest)
@@ -80,6 +80,8 @@ from flwr.server.superlink.utils import abort_if
80
80
  from flwr.server.utils.validator import validate_message
81
81
  from flwr.supercore.object_store import ObjectStoreFactory
82
82
 
83
+ from ..utils import store_mapping_and_register_objects
84
+
83
85
 
84
86
  class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
85
87
  """ServerAppIo API servicer."""
@@ -158,10 +160,17 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
158
160
  message_id: Optional[str] = state.store_message_ins(message=message)
159
161
  message_ids.append(message_id)
160
162
 
163
+ # Init store
164
+ store = self.objectstore_factory.store()
165
+
166
+ # Store Message object to descendants mapping and preregister objects
167
+ objects_to_push = store_mapping_and_register_objects(store, request=request)
168
+
161
169
  return PushInsMessagesResponse(
162
170
  message_ids=[
163
171
  str(message_id) if message_id else "" for message_id in message_ids
164
- ]
172
+ ],
173
+ objects_to_push=objects_to_push,
165
174
  )
166
175
 
167
176
  def PullMessages(
@@ -21,7 +21,11 @@ import grpc
21
21
 
22
22
  from flwr.common.constant import Status, SubStatus
23
23
  from flwr.common.typing import RunStatus
24
+ from flwr.proto.fleet_pb2 import PushMessagesRequest # pylint: disable=E0611
25
+ from flwr.proto.message_pb2 import ObjectIDs # pylint: disable=E0611
26
+ from flwr.proto.serverappio_pb2 import PushInsMessagesRequest # pylint: disable=E0611
24
27
  from flwr.server.superlink.linkstate import LinkState
28
+ from flwr.supercore.object_store import ObjectStore
25
29
 
26
30
  _STATUS_TO_MSG = {
27
31
  Status.PENDING: "Run is pending.",
@@ -63,3 +67,28 @@ def abort_if(
63
67
  """Abort context if status of the provided `run_id` is in `abort_status_list`."""
64
68
  msg = check_abort(run_id, abort_status_list, state)
65
69
  abort_grpc_context(msg, context)
70
+
71
+
72
+ def store_mapping_and_register_objects(
73
+ store: ObjectStore, request: Union[PushInsMessagesRequest, PushMessagesRequest]
74
+ ) -> dict[str, ObjectIDs]:
75
+ """Store Message object to descendants mapping and preregister objects."""
76
+ objects_to_push: dict[str, ObjectIDs] = {}
77
+ for (
78
+ message_obj_id,
79
+ descendant_obj_ids,
80
+ ) in request.msg_to_descendant_mapping.items():
81
+ descendants = list(descendant_obj_ids.object_ids)
82
+ # Store mapping
83
+ store.set_message_descendant_ids(
84
+ msg_object_id=message_obj_id, descendant_ids=descendants
85
+ )
86
+
87
+ # Preregister
88
+ object_ids_just_registered = store.preregister(descendants + [message_obj_id])
89
+ # Keep track of objects that need to be pushed
90
+ objects_to_push[message_obj_id] = ObjectIDs(
91
+ object_ids=object_ids_just_registered
92
+ )
93
+
94
+ return objects_to_push
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr-nightly
3
- Version: 1.19.0.dev20250528
3
+ Version: 1.19.0.dev20250529
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  License: Apache-2.0
6
6
  Keywords: Artificial Intelligence,Federated AI,Federated Analytics,Federated Evaluation,Federated Learning,Flower,Machine Learning
@@ -92,7 +92,7 @@ flwr/client/message_handler/__init__.py,sha256=0lyljDVqre3WljiZbPcwCCf8GiIaSVI_y
92
92
  flwr/client/message_handler/message_handler.py,sha256=X9SXX6et97Lw9_DGD93HKsEBGNjXClcFgc_5aLK0oiU,6541
93
93
  flwr/client/mod/__init__.py,sha256=AtV4Y5UGuYqJdTg7bJ--KtfOZUYLGDPMy616LvtP5W4,1151
94
94
  flwr/client/mod/centraldp_mods.py,sha256=ha5j0vDT7Mi8Ke5iz-hMn3H_H1jnXW10EswoyKYrRag,5422
95
- flwr/client/mod/comms_mods.py,sha256=zfypvalPdVQ7aWwbsTYEYf0T0hv6aU3VO1eOCb9Uj9A,2387
95
+ flwr/client/mod/comms_mods.py,sha256=ehp0AF-nGXxQOtm4G5Ts_7RTP04x5Y8PmA1Myfrjuro,3479
96
96
  flwr/client/mod/localdp_mod.py,sha256=GzVQrydejUfFDgnIIEIwrUU2DgvhN990LUnoydm9Tpo,5008
97
97
  flwr/client/mod/secure_aggregation/__init__.py,sha256=k8HYXvqu3pd_V3eZ0_5wwH52o-C6XJCPbT4n4anYyWY,849
98
98
  flwr/client/mod/secure_aggregation/secagg_mod.py,sha256=y54DvpM2-DWUiEYqgwZ0DssC1VVRCJEfGgST7O3OcwM,1095
@@ -108,7 +108,7 @@ flwr/common/__init__.py,sha256=5GCLVk399Az_rTJHNticRlL0Sl_oPw_j5_LuFKfX7-M,4171
108
108
  flwr/common/address.py,sha256=9JucdTwlc-jpeJkRKeUboZoacUtErwSVtnDR9kAtLqE,4119
109
109
  flwr/common/args.py,sha256=-aX_jVnSaDrJR2KZ8Wq0Y3dQHII4R4MJtJOIXzVUA0c,5417
110
110
  flwr/common/auth_plugin/__init__.py,sha256=3rzPkVLn9WyB5n7HLk1XGDw3SLCqRWAU1_CnglcWPfw,970
111
- flwr/common/auth_plugin/auth_plugin.py,sha256=lds7y8sDIzd4ZYuNEVUevXcPmCK93t-tvPqiKvq6eYQ,4499
111
+ flwr/common/auth_plugin/auth_plugin.py,sha256=_D23QATlSnXtyRhtRQr8_t8LJELWpYvCAJARN0Mhswo,4769
112
112
  flwr/common/config.py,sha256=glcZDjco-amw1YfQcYTFJ4S1pt9APoexT-mf1QscuHs,13960
113
113
  flwr/common/constant.py,sha256=lQCel7YanrEdFzy7pHBejhrQ7ZIylJrhBD9pXY02qv0,7472
114
114
  flwr/common/context.py,sha256=Be8obQR_OvEDy1OmshuUKxGRQ7Qx89mf5F4xlhkR10s,2407
@@ -127,7 +127,7 @@ flwr/common/heartbeat.py,sha256=SyEpNDnmJ0lni0cWO67rcoJVKasCLmkNHm3dKLeNrLU,5749
127
127
  flwr/common/inflatable.py,sha256=vBDlaJlgF6sryjglhFcr22zylROmPFwM7QLjVV7XbtU,6837
128
128
  flwr/common/inflatable_grpc_utils.py,sha256=On_RT8cYChwE3-1MlY21s_cVXgYCGeKTONRafm-rmEk,3432
129
129
  flwr/common/logger.py,sha256=JbRf6E2vQxXzpDBq1T8IDUJo_usu3gjWEBPQ6uKcmdg,13049
130
- flwr/common/message.py,sha256=onc0stpXk26P9d__AfSTde1BUVN0Z9Ofw85m0kyS9pY,19225
130
+ flwr/common/message.py,sha256=HfSeqxwXgf90ilbMlM0vrF4cJWqJVx3jJ0gNmTfgdFw,19628
131
131
  flwr/common/object_ref.py,sha256=p3SfTeqo3Aj16SkB-vsnNn01zswOPdGNBitcbRnqmUk,9134
132
132
  flwr/common/parameter.py,sha256=UVw6sOgehEFhFs4uUCMl2kfVq1PD6ncmWgPLMsZPKPE,2095
133
133
  flwr/common/pyproject.py,sha256=2SU6yJW7059SbMXgzjOdK1GZRWO6AixDH7BmdxbMvHI,1386
@@ -180,8 +180,8 @@ flwr/proto/fab_pb2.py,sha256=2Nu0WaWxDZ8TbutMtctjdcGM7OtXiyP4kmCgg5o7Jjw,1627
180
180
  flwr/proto/fab_pb2.pyi,sha256=AMXpiDK0fo3nZWjxsC2E4otSaVjyQbU7iiWKrsSZavs,2395
181
181
  flwr/proto/fab_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
182
182
  flwr/proto/fab_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
183
- flwr/proto/fleet_pb2.py,sha256=bg9Jp2h0_9zzL_Tvk7aIpoab4F0-7kl8OmKZYB5R_SE,6509
184
- flwr/proto/fleet_pb2.pyi,sha256=tVEh2ffDZ_VnL53fk-wC8xk_TZYRWerjAwnPM-obuEk,9974
183
+ flwr/proto/fleet_pb2.py,sha256=6QgmU4saPKVCEEB5miAa_0-qCTyl8AhdQBKLN6pyC-U,6520
184
+ flwr/proto/fleet_pb2.pyi,sha256=72jgu8aUxxmDG3QzAIvaIf0pNZnlW3H0QHyC6bUzKrU,9986
185
185
  flwr/proto/fleet_pb2_grpc.py,sha256=pYQwwZ8KUZFmbYaJKJ8YJ06QCilhLqI_9vc0bBFXrNI,15779
186
186
  flwr/proto/fleet_pb2_grpc.pyi,sha256=F--4QaDeoCHFuyOB506wHoMlQ4fPHvf8MoiVei_9jr8,4214
187
187
  flwr/proto/grpcadapter_pb2.py,sha256=PJ8DtfeV29g_y4Z3aNZlSZocLqSxeLmTsYCdOZDYCiE,1843
@@ -196,8 +196,8 @@ flwr/proto/log_pb2.py,sha256=iKaS3MVn1BS4xHu8uGPFCOi1KWtvVx-H9V4jCUIJghs,1393
196
196
  flwr/proto/log_pb2.pyi,sha256=ipuhgo40sAHTcRzCsGI1HwIstr5q0THPNk_cf62YyME,1448
197
197
  flwr/proto/log_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
198
198
  flwr/proto/log_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
199
- flwr/proto/message_pb2.py,sha256=b5hNBRRABH4sIUVo0G1iTOGjCFd4M68yiAPlJBeda_g,4276
200
- flwr/proto/message_pb2.pyi,sha256=lRzQ5rvriqWDde-TX8K6jYEQhsl6TZZdmamtc8wf5O4,8622
199
+ flwr/proto/message_pb2.py,sha256=2yEK9O-lbbHpgUYBnWhq2UWjQTZquO1IVbhTzmiOMtI,4277
200
+ flwr/proto/message_pb2.pyi,sha256=W7dLhhVDLxgij7sBc8cJ2zfcusoceBGjhgCIVjaRMHc,8627
201
201
  flwr/proto/message_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
202
202
  flwr/proto/message_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
203
203
  flwr/proto/node_pb2.py,sha256=BzZfAWIX7lV62bZr9f7x16lUZcpg-EImxnwxQXgCbYg,1045
@@ -212,8 +212,8 @@ flwr/proto/run_pb2.py,sha256=SWpc2yDTprm7DaabMQne43q_7_NWQN3I66y-d_PpcGg,4727
212
212
  flwr/proto/run_pb2.pyi,sha256=g87sUXdUA3cPmlYG03EoUisVIxOtWft3OR6nznzXeDo,9416
213
213
  flwr/proto/run_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
214
214
  flwr/proto/run_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
215
- flwr/proto/serverappio_pb2.py,sha256=5TgzU5_KCVtNohLrBUsM7hed0nl0TQqjVjEp0T0cpOY,7005
216
- flwr/proto/serverappio_pb2.pyi,sha256=tuz3TyMmlSbwR1nQSP2842V4gCwW5YRo_KwSd73u4eI,9647
215
+ flwr/proto/serverappio_pb2.py,sha256=J75Kc6TI0HN2EWIX687ULCjr7Fe1tpLNHltWpfhABdw,7022
216
+ flwr/proto/serverappio_pb2.pyi,sha256=xo_Tl-r-Hdtfrrp9RRfpqzethtCPfvs8vMJ7ILXb7Kg,9659
217
217
  flwr/proto/serverappio_pb2_grpc.py,sha256=An5cPfO_1-MjvP8FaVymRfAFpes_pASDLUoxonZ1vrs,22602
218
218
  flwr/proto/serverappio_pb2_grpc.pyi,sha256=GI6b8aH2H7yPnqeE7q9lF6RUMtohuucYYxTjtHXzLsA,6204
219
219
  flwr/proto/simulationio_pb2.py,sha256=sAJX72z-IttVGxyU3PFnG8AFuA-pV7itvBoxz-hOudE,3342
@@ -226,7 +226,7 @@ flwr/proto/transport_pb2_grpc.py,sha256=vLN3EHtx2aEEMCO4f1Upu-l27BPzd3-5pV-u8wPc
226
226
  flwr/proto/transport_pb2_grpc.pyi,sha256=AGXf8RiIiW2J5IKMlm_3qT3AzcDa4F3P5IqUjve_esA,766
227
227
  flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
228
228
  flwr/server/__init__.py,sha256=LQQHiuL2jy7TpNaKastRdGsexlxSt5ZWAQNVqitDnrY,1598
229
- flwr/server/app.py,sha256=iSv0CI9RjnOqJIyNzoL_1jBP7NEwVGXCdikElA_5fZo,30586
229
+ flwr/server/app.py,sha256=GJZHJdd9THHdsvda-vz6EzLL_edBFsvR5HKi6093Wog,30114
230
230
  flwr/server/client_manager.py,sha256=5jCGavVli7XdupvWWo7ru3PdFTlRU8IGvHFSSoUVLRs,6227
231
231
  flwr/server/client_proxy.py,sha256=sv0E9AldBYOvc3pusqFh-GnyreeMfsXQ1cuTtxTq_wY,2399
232
232
  flwr/server/compat/__init__.py,sha256=0IsttWvY15qO98_1GyzVC-vR1e_ZPXOdu2qUlOkYMPE,886
@@ -286,12 +286,12 @@ flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py,sha256=KouR9PUcrPmMtoLooF4O
286
286
  flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py,sha256=iSf0mbBAlig7G6subQwBSVjcUCgSihONKdZ1RmQPTOk,4887
287
287
  flwr/server/superlink/fleet/grpc_bidi/grpc_server.py,sha256=OsS-6GgCIzMMZDVu5Y-OKjynHVUrpdc_5OrtuB-IbU0,5174
288
288
  flwr/server/superlink/fleet/grpc_rere/__init__.py,sha256=ahDJJ1e-lDxBpeBMgPk7YZt2wB38_QltcpOC0gLbpFs,758
289
- flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=--Xfd3FqBUIKHHQ1oS53Zal3rqqxrCORcpbFQeGSDlY,7081
289
+ flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=pYTltWgHwfou_uwXZ6xAaamZVW47MFRLsP49NvQ7FqI,7137
290
290
  flwr/server/superlink/fleet/grpc_rere/server_interceptor.py,sha256=DrHubsaLgJCwCeeJPYogQTiP0xYqjxwnT9rh7OP7BoU,6984
291
291
  flwr/server/superlink/fleet/message_handler/__init__.py,sha256=fHsRV0KvJ8HtgSA4_YBsEzuhJLjO8p6xx4aCY2oE1p4,731
292
- flwr/server/superlink/fleet/message_handler/message_handler.py,sha256=fyckLUyumpApwcMM3Cme8sLBL8BHQN0-yltd3ngl9D4,5404
292
+ flwr/server/superlink/fleet/message_handler/message_handler.py,sha256=aF3y07kvFi9Kohs9Jt66x-CqgYF5A3a1RuA6SVwX2rw,5739
293
293
  flwr/server/superlink/fleet/rest_rere/__init__.py,sha256=Lzc93nA7tDqoy-zRUaPG316oqFiZX1HUCL5ELaXY_xw,735
294
- flwr/server/superlink/fleet/rest_rere/rest_api.py,sha256=s6SNp_z-Uyr4tT4C5PqSbeJySfvsdK1SIczwwxrljO8,6923
294
+ flwr/server/superlink/fleet/rest_rere/rest_api.py,sha256=PrXXJQo0HZXLNFj81Efpig2YYFw5BWisIID3qyBSbbE,7091
295
295
  flwr/server/superlink/fleet/vce/__init__.py,sha256=XOKbAWOzlCqEOQ3M2cBYkH7HKA7PxlbCJMunt-ty-DY,784
296
296
  flwr/server/superlink/fleet/vce/backend/__init__.py,sha256=PPH89Yqd1XKm-sRJN6R0WQlKT_b4v54Kzl2yzHAFzM8,1437
297
297
  flwr/server/superlink/fleet/vce/backend/backend.py,sha256=-wDHjgAy5mrfEgXj0GxkJI7lhEbgSUyPwmNAf9ZcDzc,2193
@@ -305,11 +305,11 @@ flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=sHJPK1w0tP0m2WCXH2F9l
305
305
  flwr/server/superlink/linkstate/utils.py,sha256=i93ZXBPHR27YCPkTBLX0-LP-zKOxV4L-qi7spoBxJXE,15345
306
306
  flwr/server/superlink/serverappio/__init__.py,sha256=Fy4zJuoccZe5mZSEIpOmQvU6YeXFBa1M4eZuXXmJcn8,717
307
307
  flwr/server/superlink/serverappio/serverappio_grpc.py,sha256=6-FUUt0GiLcBPljj8bBrUNeAITUoDQOLzaMihKo52hg,2326
308
- flwr/server/superlink/serverappio/serverappio_servicer.py,sha256=-d4XUmSbtalTIENQzh84Mj21KDoaq51pxWrrrSa5Ts8,13826
308
+ flwr/server/superlink/serverappio/serverappio_servicer.py,sha256=VxQdDolgfr8mI83tHpoyxfwRN1_ET80WarxfHUIwevE,14163
309
309
  flwr/server/superlink/simulation/__init__.py,sha256=Ry8DrNaZCMcQXvUc4FoCN2m3dvUQgWjasfp015o3Ec4,718
310
310
  flwr/server/superlink/simulation/simulationio_grpc.py,sha256=0l0F-UjYEk6W7HZmI28PbJQLFxSi_vBHRkdchgdaSMQ,2224
311
311
  flwr/server/superlink/simulation/simulationio_servicer.py,sha256=aJezU8RSJswcmWm7Eoy0BqsU13jrcfuFwX3ljm-cORM,7719
312
- flwr/server/superlink/utils.py,sha256=BpKJ8IQBzJ8nLfTD5plBA_Y9re5hIS2gQ_40fc-zno8,2137
312
+ flwr/server/superlink/utils.py,sha256=huXWw0R2EcO8F0D99DoBI_aWihi19tuqnc2lo8771hE,3326
313
313
  flwr/server/typing.py,sha256=LvO6gq7H6TAWhA9JFx0WyqHxU7FycyvhSsLjBLPgpts,1011
314
314
  flwr/server/utils/__init__.py,sha256=U4gM84-uUFddarODDQkO6SjNUuGhFcsHJZMjSEbezkU,884
315
315
  flwr/server/utils/tensorboard.py,sha256=3z3MeF0cu_U6ghNgRd0UQ5bunyDQKxCLpIpEdGMoCJ0,5466
@@ -353,7 +353,7 @@ flwr/supernode/nodestate/in_memory_nodestate.py,sha256=brV7TMMzS93tXk6ntpoYjtPK5
353
353
  flwr/supernode/nodestate/nodestate.py,sha256=-LAjZOnS7VyHC05ll3b31cYDjwAt6l4WmYt7duVLRKk,1024
354
354
  flwr/supernode/nodestate/nodestate_factory.py,sha256=UYTDCcwK_baHUmkzkJDxL0UEqvtTfOMlQRrROMCd0Xo,1430
355
355
  flwr/supernode/start_client_internal.py,sha256=4z9qtwT7ZwNwahpX1SRfuaoYw1HCICPFUvjPBLHgsA0,18806
356
- flwr_nightly-1.19.0.dev20250528.dist-info/METADATA,sha256=S54bdEeqV_WTys7Xz7TbQmS0ynnkV9MKfYY9AWIO8M4,15910
357
- flwr_nightly-1.19.0.dev20250528.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
358
- flwr_nightly-1.19.0.dev20250528.dist-info/entry_points.txt,sha256=08k99PaHg3Wr6W49rFXYtjmgcfIdpFLNeu6O0bXDYnU,370
359
- flwr_nightly-1.19.0.dev20250528.dist-info/RECORD,,
356
+ flwr_nightly-1.19.0.dev20250529.dist-info/METADATA,sha256=k8T_zqQ3VfowP5KCkRhclVAl6mM7FPfcIe41XwH9jI4,15910
357
+ flwr_nightly-1.19.0.dev20250529.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
358
+ flwr_nightly-1.19.0.dev20250529.dist-info/entry_points.txt,sha256=08k99PaHg3Wr6W49rFXYtjmgcfIdpFLNeu6O0bXDYnU,370
359
+ flwr_nightly-1.19.0.dev20250529.dist-info/RECORD,,