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.
- flwr/client/mod/comms_mods.py +36 -17
- flwr/common/auth_plugin/auth_plugin.py +8 -2
- flwr/common/message.py +11 -0
- flwr/proto/fleet_pb2.py +16 -16
- flwr/proto/fleet_pb2.pyi +5 -5
- flwr/proto/message_pb2.py +10 -10
- flwr/proto/message_pb2.pyi +4 -4
- flwr/proto/serverappio_pb2.py +26 -26
- flwr/proto/serverappio_pb2.pyi +5 -5
- flwr/server/app.py +52 -56
- flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +1 -0
- flwr/server/superlink/fleet/message_handler/message_handler.py +10 -1
- flwr/server/superlink/fleet/rest_rere/rest_api.py +3 -1
- flwr/server/superlink/serverappio/serverappio_servicer.py +10 -1
- flwr/server/superlink/utils.py +29 -0
- {flwr_nightly-1.19.0.dev20250528.dist-info → flwr_nightly-1.19.0.dev20250529.dist-info}/METADATA +1 -1
- {flwr_nightly-1.19.0.dev20250528.dist-info → flwr_nightly-1.19.0.dev20250529.dist-info}/RECORD +19 -19
- {flwr_nightly-1.19.0.dev20250528.dist-info → flwr_nightly-1.19.0.dev20250529.dist-info}/WHEEL +0 -0
- {flwr_nightly-1.19.0.dev20250528.dist-info → flwr_nightly-1.19.0.dev20250529.dist-info}/entry_points.txt +0 -0
flwr/client/mod/comms_mods.py
CHANGED
@@ -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
|
-
|
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
|
-
|
38
|
-
|
39
|
+
# Call the next layer
|
40
|
+
msg = call_next(msg, ctxt)
|
39
41
|
|
40
|
-
|
41
|
-
|
42
|
-
|
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
|
-
|
54
|
-
|
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
|
-
|
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
|
-
|
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,
|
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\"\
|
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['
|
32
|
-
_globals['
|
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=
|
53
|
-
_globals['
|
54
|
-
_globals['
|
55
|
-
_globals['_PUSHMESSAGESRESPONSE']._serialized_start=
|
56
|
-
_globals['_PUSHMESSAGESRESPONSE']._serialized_end=
|
57
|
-
_globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_start=
|
58
|
-
_globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_end=
|
59
|
-
_globals['_PUSHMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_start=
|
60
|
-
_globals['_PUSHMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_end=
|
61
|
-
_globals['_RECONNECT']._serialized_start=
|
62
|
-
_globals['_RECONNECT']._serialized_end=
|
63
|
-
_globals['_FLEET']._serialized_start=
|
64
|
-
_globals['_FLEET']._serialized_end=
|
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
|
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
|
-
|
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
|
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
|
-
|
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","
|
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\"\
|
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=
|
44
|
-
_globals['_PUSHOBJECTREQUEST']._serialized_start=
|
45
|
-
_globals['_PUSHOBJECTREQUEST']._serialized_end=
|
46
|
-
_globals['_PUSHOBJECTRESPONSE']._serialized_start=
|
47
|
-
_globals['_PUSHOBJECTRESPONSE']._serialized_end=
|
48
|
-
_globals['_PULLOBJECTREQUEST']._serialized_start=
|
49
|
-
_globals['_PULLOBJECTREQUEST']._serialized_end=
|
50
|
-
_globals['_PULLOBJECTRESPONSE']._serialized_start=
|
51
|
-
_globals['_PULLOBJECTRESPONSE']._serialized_end=
|
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)
|
flwr/proto/message_pb2.pyi
CHANGED
@@ -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
|
-
|
133
|
+
OBJECT_IDS_FIELD_NUMBER: builtins.int
|
134
134
|
@property
|
135
|
-
def
|
135
|
+
def object_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]: ...
|
136
136
|
def __init__(self,
|
137
137
|
*,
|
138
|
-
|
138
|
+
object_ids: typing.Optional[typing.Iterable[typing.Text]] = ...,
|
139
139
|
) -> None: ...
|
140
|
-
def ClearField(self, field_name: typing_extensions.Literal["
|
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):
|
flwr/proto/serverappio_pb2.py
CHANGED
@@ -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\"\
|
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['
|
31
|
-
_globals['
|
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=
|
42
|
-
_globals['
|
43
|
-
_globals['
|
44
|
-
_globals['_PUSHINSMESSAGESRESPONSE']._serialized_start=
|
45
|
-
_globals['_PUSHINSMESSAGESRESPONSE']._serialized_end=
|
46
|
-
_globals['_PUSHINSMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_start=
|
47
|
-
_globals['_PUSHINSMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_end=
|
48
|
-
_globals['_PULLRESMESSAGESREQUEST']._serialized_start=
|
49
|
-
_globals['_PULLRESMESSAGESREQUEST']._serialized_end=
|
50
|
-
_globals['_PULLRESMESSAGESRESPONSE']._serialized_start=
|
51
|
-
_globals['_PULLRESMESSAGESRESPONSE']._serialized_end=
|
52
|
-
_globals['_PULLRESMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._serialized_start=
|
53
|
-
_globals['_PULLRESMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._serialized_end=
|
54
|
-
_globals['_PULLSERVERAPPINPUTSREQUEST']._serialized_start=
|
55
|
-
_globals['_PULLSERVERAPPINPUTSREQUEST']._serialized_end=
|
56
|
-
_globals['_PULLSERVERAPPINPUTSRESPONSE']._serialized_start=
|
57
|
-
_globals['_PULLSERVERAPPINPUTSRESPONSE']._serialized_end=
|
58
|
-
_globals['_PUSHSERVERAPPOUTPUTSREQUEST']._serialized_start=
|
59
|
-
_globals['_PUSHSERVERAPPOUTPUTSREQUEST']._serialized_end=
|
60
|
-
_globals['_PUSHSERVERAPPOUTPUTSRESPONSE']._serialized_start=
|
61
|
-
_globals['_PUSHSERVERAPPOUTPUTSRESPONSE']._serialized_end=
|
62
|
-
_globals['_SERVERAPPIO']._serialized_start=
|
63
|
-
_globals['_SERVERAPPIO']._serialized_end=
|
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)
|
flwr/proto/serverappio_pb2.pyi
CHANGED
@@ -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
|
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
|
-
|
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
|
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
|
-
|
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","
|
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
|
-
|
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
|
484
|
+
def _try_obtain_exec_auth_plugins(
|
487
485
|
config_path: Path, verify_tls_cert: bool
|
488
|
-
) ->
|
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
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
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
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
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
|
523
|
-
|
524
|
-
|
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
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
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,
|
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(
|
flwr/server/superlink/utils.py
CHANGED
@@ -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
|
{flwr_nightly-1.19.0.dev20250528.dist-info → flwr_nightly-1.19.0.dev20250529.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: flwr-nightly
|
3
|
-
Version: 1.19.0.
|
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
|
{flwr_nightly-1.19.0.dev20250528.dist-info → flwr_nightly-1.19.0.dev20250529.dist-info}/RECORD
RENAMED
@@ -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=
|
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=
|
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=
|
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=
|
184
|
-
flwr/proto/fleet_pb2.pyi,sha256=
|
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=
|
200
|
-
flwr/proto/message_pb2.pyi,sha256=
|
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=
|
216
|
-
flwr/proto/serverappio_pb2.pyi,sha256=
|
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=
|
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
|
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=
|
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=
|
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
|
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=
|
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.
|
357
|
-
flwr_nightly-1.19.0.
|
358
|
-
flwr_nightly-1.19.0.
|
359
|
-
flwr_nightly-1.19.0.
|
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,,
|
{flwr_nightly-1.19.0.dev20250528.dist-info → flwr_nightly-1.19.0.dev20250529.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|