flwr-nightly 1.21.0.dev20250805__py3-none-any.whl → 1.21.0.dev20250807__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/proto/appio_pb2.py +25 -17
- flwr/proto/appio_pb2.pyi +46 -2
- flwr/proto/clientappio_pb2.py +3 -11
- flwr/proto/clientappio_pb2.pyi +0 -47
- flwr/proto/clientappio_pb2_grpc.py +19 -20
- flwr/proto/clientappio_pb2_grpc.pyi +10 -11
- flwr/proto/serverappio_pb2.py +2 -2
- flwr/proto/serverappio_pb2_grpc.py +68 -0
- flwr/proto/serverappio_pb2_grpc.pyi +26 -0
- flwr/server/superlink/linkstate/in_memory_linkstate.py +34 -0
- flwr/server/superlink/linkstate/linkstate.py +2 -1
- flwr/server/superlink/linkstate/sqlite_linkstate.py +45 -0
- flwr/server/superlink/serverappio/serverappio_servicer.py +26 -0
- flwr/supercore/{scheduler → corestate}/__init__.py +3 -3
- flwr/supercore/corestate/corestate.py +80 -0
- flwr/supercore/superexec/__init__.py +15 -0
- flwr/{supernode/scheduler → supercore/superexec/plugin}/__init__.py +5 -3
- flwr/{supernode/scheduler/simple_clientapp_scheduler_plugin.py → supercore/superexec/plugin/clientapp_exec_plugin.py} +4 -4
- flwr/supercore/{scheduler/plugin.py → superexec/plugin/exec_plugin.py} +4 -4
- flwr/supernode/nodestate/nodestate.py +3 -59
- flwr/supernode/runtime/run_clientapp.py +3 -9
- flwr/supernode/servicer/clientappio/clientappio_servicer.py +8 -10
- {flwr_nightly-1.21.0.dev20250805.dist-info → flwr_nightly-1.21.0.dev20250807.dist-info}/METADATA +1 -1
- {flwr_nightly-1.21.0.dev20250805.dist-info → flwr_nightly-1.21.0.dev20250807.dist-info}/RECORD +26 -24
- {flwr_nightly-1.21.0.dev20250805.dist-info → flwr_nightly-1.21.0.dev20250807.dist-info}/WHEEL +0 -0
- {flwr_nightly-1.21.0.dev20250805.dist-info → flwr_nightly-1.21.0.dev20250807.dist-info}/entry_points.txt +0 -0
flwr/proto/appio_pb2.py
CHANGED
@@ -17,27 +17,35 @@ from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
|
|
17
17
|
from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
|
18
18
|
|
19
19
|
|
20
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x66lwr/proto/appio.proto\x12\nflwr.proto\x1a\x18\x66lwr/proto/message.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x14\x66lwr/proto/run.proto\"\x99\x01\n\x16PushAppMessagesRequest\x12\r\n\x05token\x18\x01 \x01(\t\x12*\n\rmessages_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.Message\x12\x0e\n\x06run_id\x18\x03 \x01(\x04\x12\x34\n\x14message_object_trees\x18\x04 \x03(\x0b\x32\x16.flwr.proto.ObjectTree\"G\n\x17PushAppMessagesResponse\x12\x13\n\x0bmessage_ids\x18\x01 \x03(\t\x12\x17\n\x0fobjects_to_push\x18\x02 \x03(\t\"L\n\x16PullAppMessagesRequest\x12\r\n\x05token\x18\x01 \x01(\t\x12\x13\n\x0bmessage_ids\x18\x02 \x03(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\x04\"{\n\x17PullAppMessagesResponse\x12*\n\rmessages_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.Message\x12\x34\n\x14message_object_trees\x18\x02 \x03(\x0b\x32\x16.flwr.proto.ObjectTree\"%\n\x14PullAppInputsRequest\x12\r\n\x05token\x18\x01 \x01(\t\"y\n\x15PullAppInputsResponse\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\"\\\n\x15PushAppOutputsRequest\x12\r\n\x05token\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\x12$\n\x07\x63ontext\x18\x03 \x01(\x0b\x32\x13.flwr.proto.Context\"\x18\n\x16PushAppOutputsResponseb\x06proto3')
|
20
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x66lwr/proto/appio.proto\x12\nflwr.proto\x1a\x18\x66lwr/proto/message.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x14\x66lwr/proto/run.proto\"\x19\n\x17ListAppsToLaunchRequest\"+\n\x18ListAppsToLaunchResponse\x12\x0f\n\x07run_ids\x18\x01 \x03(\x04\"%\n\x13RequestTokenRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"%\n\x14RequestTokenResponse\x12\r\n\x05token\x18\x01 \x01(\t\"\x99\x01\n\x16PushAppMessagesRequest\x12\r\n\x05token\x18\x01 \x01(\t\x12*\n\rmessages_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.Message\x12\x0e\n\x06run_id\x18\x03 \x01(\x04\x12\x34\n\x14message_object_trees\x18\x04 \x03(\x0b\x32\x16.flwr.proto.ObjectTree\"G\n\x17PushAppMessagesResponse\x12\x13\n\x0bmessage_ids\x18\x01 \x03(\t\x12\x17\n\x0fobjects_to_push\x18\x02 \x03(\t\"L\n\x16PullAppMessagesRequest\x12\r\n\x05token\x18\x01 \x01(\t\x12\x13\n\x0bmessage_ids\x18\x02 \x03(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\x04\"{\n\x17PullAppMessagesResponse\x12*\n\rmessages_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.Message\x12\x34\n\x14message_object_trees\x18\x02 \x03(\x0b\x32\x16.flwr.proto.ObjectTree\"%\n\x14PullAppInputsRequest\x12\r\n\x05token\x18\x01 \x01(\t\"y\n\x15PullAppInputsResponse\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\"\\\n\x15PushAppOutputsRequest\x12\r\n\x05token\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\x12$\n\x07\x63ontext\x18\x03 \x01(\x0b\x32\x13.flwr.proto.Context\"\x18\n\x16PushAppOutputsResponseb\x06proto3')
|
21
21
|
|
22
22
|
_globals = globals()
|
23
23
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
24
24
|
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.appio_pb2', _globals)
|
25
25
|
if _descriptor._USE_C_DESCRIPTORS == False:
|
26
26
|
DESCRIPTOR._options = None
|
27
|
-
_globals['
|
28
|
-
_globals['
|
29
|
-
_globals['
|
30
|
-
_globals['
|
31
|
-
_globals['
|
32
|
-
_globals['
|
33
|
-
_globals['
|
34
|
-
_globals['
|
35
|
-
_globals['
|
36
|
-
_globals['
|
37
|
-
_globals['
|
38
|
-
_globals['
|
39
|
-
_globals['
|
40
|
-
_globals['
|
41
|
-
_globals['
|
42
|
-
_globals['
|
27
|
+
_globals['_LISTAPPSTOLAUNCHREQUEST']._serialized_start=108
|
28
|
+
_globals['_LISTAPPSTOLAUNCHREQUEST']._serialized_end=133
|
29
|
+
_globals['_LISTAPPSTOLAUNCHRESPONSE']._serialized_start=135
|
30
|
+
_globals['_LISTAPPSTOLAUNCHRESPONSE']._serialized_end=178
|
31
|
+
_globals['_REQUESTTOKENREQUEST']._serialized_start=180
|
32
|
+
_globals['_REQUESTTOKENREQUEST']._serialized_end=217
|
33
|
+
_globals['_REQUESTTOKENRESPONSE']._serialized_start=219
|
34
|
+
_globals['_REQUESTTOKENRESPONSE']._serialized_end=256
|
35
|
+
_globals['_PUSHAPPMESSAGESREQUEST']._serialized_start=259
|
36
|
+
_globals['_PUSHAPPMESSAGESREQUEST']._serialized_end=412
|
37
|
+
_globals['_PUSHAPPMESSAGESRESPONSE']._serialized_start=414
|
38
|
+
_globals['_PUSHAPPMESSAGESRESPONSE']._serialized_end=485
|
39
|
+
_globals['_PULLAPPMESSAGESREQUEST']._serialized_start=487
|
40
|
+
_globals['_PULLAPPMESSAGESREQUEST']._serialized_end=563
|
41
|
+
_globals['_PULLAPPMESSAGESRESPONSE']._serialized_start=565
|
42
|
+
_globals['_PULLAPPMESSAGESRESPONSE']._serialized_end=688
|
43
|
+
_globals['_PULLAPPINPUTSREQUEST']._serialized_start=690
|
44
|
+
_globals['_PULLAPPINPUTSREQUEST']._serialized_end=727
|
45
|
+
_globals['_PULLAPPINPUTSRESPONSE']._serialized_start=729
|
46
|
+
_globals['_PULLAPPINPUTSRESPONSE']._serialized_end=850
|
47
|
+
_globals['_PUSHAPPOUTPUTSREQUEST']._serialized_start=852
|
48
|
+
_globals['_PUSHAPPOUTPUTSREQUEST']._serialized_end=944
|
49
|
+
_globals['_PUSHAPPOUTPUTSRESPONSE']._serialized_start=946
|
50
|
+
_globals['_PUSHAPPOUTPUTSRESPONSE']._serialized_end=970
|
43
51
|
# @@protoc_insertion_point(module_scope)
|
flwr/proto/appio_pb2.pyi
CHANGED
@@ -14,12 +14,56 @@ import typing_extensions
|
|
14
14
|
|
15
15
|
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
|
16
16
|
|
17
|
-
class
|
17
|
+
class ListAppsToLaunchRequest(google.protobuf.message.Message):
|
18
18
|
"""These messages are used by both ServerAppIo and ClientAppIo services
|
19
19
|
|
20
|
-
|
20
|
+
ListAppsToLaunch messages
|
21
21
|
"""
|
22
22
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
23
|
+
def __init__(self,
|
24
|
+
) -> None: ...
|
25
|
+
global___ListAppsToLaunchRequest = ListAppsToLaunchRequest
|
26
|
+
|
27
|
+
class ListAppsToLaunchResponse(google.protobuf.message.Message):
|
28
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
29
|
+
RUN_IDS_FIELD_NUMBER: builtins.int
|
30
|
+
@property
|
31
|
+
def run_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]:
|
32
|
+
"""List of run IDs of the apps to launch"""
|
33
|
+
pass
|
34
|
+
def __init__(self,
|
35
|
+
*,
|
36
|
+
run_ids: typing.Optional[typing.Iterable[builtins.int]] = ...,
|
37
|
+
) -> None: ...
|
38
|
+
def ClearField(self, field_name: typing_extensions.Literal["run_ids",b"run_ids"]) -> None: ...
|
39
|
+
global___ListAppsToLaunchResponse = ListAppsToLaunchResponse
|
40
|
+
|
41
|
+
class RequestTokenRequest(google.protobuf.message.Message):
|
42
|
+
"""RequestToken messages"""
|
43
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
44
|
+
RUN_ID_FIELD_NUMBER: builtins.int
|
45
|
+
run_id: builtins.int
|
46
|
+
def __init__(self,
|
47
|
+
*,
|
48
|
+
run_id: builtins.int = ...,
|
49
|
+
) -> None: ...
|
50
|
+
def ClearField(self, field_name: typing_extensions.Literal["run_id",b"run_id"]) -> None: ...
|
51
|
+
global___RequestTokenRequest = RequestTokenRequest
|
52
|
+
|
53
|
+
class RequestTokenResponse(google.protobuf.message.Message):
|
54
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
55
|
+
TOKEN_FIELD_NUMBER: builtins.int
|
56
|
+
token: typing.Text
|
57
|
+
def __init__(self,
|
58
|
+
*,
|
59
|
+
token: typing.Text = ...,
|
60
|
+
) -> None: ...
|
61
|
+
def ClearField(self, field_name: typing_extensions.Literal["token",b"token"]) -> None: ...
|
62
|
+
global___RequestTokenResponse = RequestTokenResponse
|
63
|
+
|
64
|
+
class PushAppMessagesRequest(google.protobuf.message.Message):
|
65
|
+
"""PushAppMessages messages"""
|
66
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
23
67
|
TOKEN_FIELD_NUMBER: builtins.int
|
24
68
|
MESSAGES_LIST_FIELD_NUMBER: builtins.int
|
25
69
|
RUN_ID_FIELD_NUMBER: builtins.int
|
flwr/proto/clientappio_pb2.py
CHANGED
@@ -18,21 +18,13 @@ from flwr.proto import message_pb2 as flwr_dot_proto_dot_message__pb2
|
|
18
18
|
from flwr.proto import appio_pb2 as flwr_dot_proto_dot_appio__pb2
|
19
19
|
|
20
20
|
|
21
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lwr/proto/clientappio.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x18\x66lwr/proto/message.proto\x1a\x16\x66lwr/proto/appio.
|
21
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lwr/proto/clientappio.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x18\x66lwr/proto/message.proto\x1a\x16\x66lwr/proto/appio.proto2\x8a\x07\n\x0b\x43lientAppIo\x12_\n\x10ListAppsToLaunch\x12#.flwr.proto.ListAppsToLaunchRequest\x1a$.flwr.proto.ListAppsToLaunchResponse\"\x00\x12S\n\x0cRequestToken\x12\x1f.flwr.proto.RequestTokenRequest\x1a .flwr.proto.RequestTokenResponse\"\x00\x12\x41\n\x06GetRun\x12\x19.flwr.proto.GetRunRequest\x1a\x1a.flwr.proto.GetRunResponse\"\x00\x12\\\n\x13PullClientAppInputs\x12 .flwr.proto.PullAppInputsRequest\x1a!.flwr.proto.PullAppInputsResponse\"\x00\x12_\n\x14PushClientAppOutputs\x12!.flwr.proto.PushAppOutputsRequest\x1a\".flwr.proto.PushAppOutputsResponse\"\x00\x12X\n\x0bPushMessage\x12\".flwr.proto.PushAppMessagesRequest\x1a#.flwr.proto.PushAppMessagesResponse\"\x00\x12X\n\x0bPullMessage\x12\".flwr.proto.PullAppMessagesRequest\x1a#.flwr.proto.PullAppMessagesResponse\"\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\x12q\n\x16\x43onfirmMessageReceived\x12).flwr.proto.ConfirmMessageReceivedRequest\x1a*.flwr.proto.ConfirmMessageReceivedResponse\"\x00\x62\x06proto3')
|
22
22
|
|
23
23
|
_globals = globals()
|
24
24
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
25
25
|
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.clientappio_pb2', _globals)
|
26
26
|
if _descriptor._USE_C_DESCRIPTORS == False:
|
27
27
|
DESCRIPTOR._options = None
|
28
|
-
_globals['
|
29
|
-
_globals['
|
30
|
-
_globals['_GETRUNIDSWITHPENDINGMESSAGESRESPONSE']._serialized_start=177
|
31
|
-
_globals['_GETRUNIDSWITHPENDINGMESSAGESRESPONSE']._serialized_end=232
|
32
|
-
_globals['_REQUESTTOKENREQUEST']._serialized_start=234
|
33
|
-
_globals['_REQUESTTOKENREQUEST']._serialized_end=271
|
34
|
-
_globals['_REQUESTTOKENRESPONSE']._serialized_start=273
|
35
|
-
_globals['_REQUESTTOKENRESPONSE']._serialized_end=310
|
36
|
-
_globals['_CLIENTAPPIO']._serialized_start=313
|
37
|
-
_globals['_CLIENTAPPIO']._serialized_end=1256
|
28
|
+
_globals['_CLIENTAPPIO']._serialized_start=139
|
29
|
+
_globals['_CLIENTAPPIO']._serialized_end=1045
|
38
30
|
# @@protoc_insertion_point(module_scope)
|
flwr/proto/clientappio_pb2.pyi
CHANGED
@@ -2,53 +2,6 @@
|
|
2
2
|
@generated by mypy-protobuf. Do not edit manually!
|
3
3
|
isort:skip_file
|
4
4
|
"""
|
5
|
-
import builtins
|
6
5
|
import google.protobuf.descriptor
|
7
|
-
import google.protobuf.internal.containers
|
8
|
-
import google.protobuf.message
|
9
|
-
import typing
|
10
|
-
import typing_extensions
|
11
6
|
|
12
7
|
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
|
13
|
-
|
14
|
-
class GetRunIdsWithPendingMessagesRequest(google.protobuf.message.Message):
|
15
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
16
|
-
def __init__(self,
|
17
|
-
) -> None: ...
|
18
|
-
global___GetRunIdsWithPendingMessagesRequest = GetRunIdsWithPendingMessagesRequest
|
19
|
-
|
20
|
-
class GetRunIdsWithPendingMessagesResponse(google.protobuf.message.Message):
|
21
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
22
|
-
RUN_IDS_FIELD_NUMBER: builtins.int
|
23
|
-
@property
|
24
|
-
def run_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]:
|
25
|
-
"""List of run IDs"""
|
26
|
-
pass
|
27
|
-
def __init__(self,
|
28
|
-
*,
|
29
|
-
run_ids: typing.Optional[typing.Iterable[builtins.int]] = ...,
|
30
|
-
) -> None: ...
|
31
|
-
def ClearField(self, field_name: typing_extensions.Literal["run_ids",b"run_ids"]) -> None: ...
|
32
|
-
global___GetRunIdsWithPendingMessagesResponse = GetRunIdsWithPendingMessagesResponse
|
33
|
-
|
34
|
-
class RequestTokenRequest(google.protobuf.message.Message):
|
35
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
36
|
-
RUN_ID_FIELD_NUMBER: builtins.int
|
37
|
-
run_id: builtins.int
|
38
|
-
def __init__(self,
|
39
|
-
*,
|
40
|
-
run_id: builtins.int = ...,
|
41
|
-
) -> None: ...
|
42
|
-
def ClearField(self, field_name: typing_extensions.Literal["run_id",b"run_id"]) -> None: ...
|
43
|
-
global___RequestTokenRequest = RequestTokenRequest
|
44
|
-
|
45
|
-
class RequestTokenResponse(google.protobuf.message.Message):
|
46
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
47
|
-
TOKEN_FIELD_NUMBER: builtins.int
|
48
|
-
token: typing.Text
|
49
|
-
def __init__(self,
|
50
|
-
*,
|
51
|
-
token: typing.Text = ...,
|
52
|
-
) -> None: ...
|
53
|
-
def ClearField(self, field_name: typing_extensions.Literal["token",b"token"]) -> None: ...
|
54
|
-
global___RequestTokenResponse = RequestTokenResponse
|
@@ -3,7 +3,6 @@
|
|
3
3
|
import grpc
|
4
4
|
|
5
5
|
from flwr.proto import appio_pb2 as flwr_dot_proto_dot_appio__pb2
|
6
|
-
from flwr.proto import clientappio_pb2 as flwr_dot_proto_dot_clientappio__pb2
|
7
6
|
from flwr.proto import message_pb2 as flwr_dot_proto_dot_message__pb2
|
8
7
|
from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
|
9
8
|
|
@@ -17,15 +16,15 @@ class ClientAppIoStub(object):
|
|
17
16
|
Args:
|
18
17
|
channel: A grpc.Channel.
|
19
18
|
"""
|
20
|
-
self.
|
21
|
-
'/flwr.proto.ClientAppIo/
|
22
|
-
request_serializer=
|
23
|
-
response_deserializer=
|
19
|
+
self.ListAppsToLaunch = channel.unary_unary(
|
20
|
+
'/flwr.proto.ClientAppIo/ListAppsToLaunch',
|
21
|
+
request_serializer=flwr_dot_proto_dot_appio__pb2.ListAppsToLaunchRequest.SerializeToString,
|
22
|
+
response_deserializer=flwr_dot_proto_dot_appio__pb2.ListAppsToLaunchResponse.FromString,
|
24
23
|
)
|
25
24
|
self.RequestToken = channel.unary_unary(
|
26
25
|
'/flwr.proto.ClientAppIo/RequestToken',
|
27
|
-
request_serializer=
|
28
|
-
response_deserializer=
|
26
|
+
request_serializer=flwr_dot_proto_dot_appio__pb2.RequestTokenRequest.SerializeToString,
|
27
|
+
response_deserializer=flwr_dot_proto_dot_appio__pb2.RequestTokenResponse.FromString,
|
29
28
|
)
|
30
29
|
self.GetRun = channel.unary_unary(
|
31
30
|
'/flwr.proto.ClientAppIo/GetRun',
|
@@ -72,7 +71,7 @@ class ClientAppIoStub(object):
|
|
72
71
|
class ClientAppIoServicer(object):
|
73
72
|
"""Missing associated documentation comment in .proto file."""
|
74
73
|
|
75
|
-
def
|
74
|
+
def ListAppsToLaunch(self, request, context):
|
76
75
|
"""Get run IDs with pending messages
|
77
76
|
"""
|
78
77
|
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
@@ -145,15 +144,15 @@ class ClientAppIoServicer(object):
|
|
145
144
|
|
146
145
|
def add_ClientAppIoServicer_to_server(servicer, server):
|
147
146
|
rpc_method_handlers = {
|
148
|
-
'
|
149
|
-
servicer.
|
150
|
-
request_deserializer=
|
151
|
-
response_serializer=
|
147
|
+
'ListAppsToLaunch': grpc.unary_unary_rpc_method_handler(
|
148
|
+
servicer.ListAppsToLaunch,
|
149
|
+
request_deserializer=flwr_dot_proto_dot_appio__pb2.ListAppsToLaunchRequest.FromString,
|
150
|
+
response_serializer=flwr_dot_proto_dot_appio__pb2.ListAppsToLaunchResponse.SerializeToString,
|
152
151
|
),
|
153
152
|
'RequestToken': grpc.unary_unary_rpc_method_handler(
|
154
153
|
servicer.RequestToken,
|
155
|
-
request_deserializer=
|
156
|
-
response_serializer=
|
154
|
+
request_deserializer=flwr_dot_proto_dot_appio__pb2.RequestTokenRequest.FromString,
|
155
|
+
response_serializer=flwr_dot_proto_dot_appio__pb2.RequestTokenResponse.SerializeToString,
|
157
156
|
),
|
158
157
|
'GetRun': grpc.unary_unary_rpc_method_handler(
|
159
158
|
servicer.GetRun,
|
@@ -206,7 +205,7 @@ class ClientAppIo(object):
|
|
206
205
|
"""Missing associated documentation comment in .proto file."""
|
207
206
|
|
208
207
|
@staticmethod
|
209
|
-
def
|
208
|
+
def ListAppsToLaunch(request,
|
210
209
|
target,
|
211
210
|
options=(),
|
212
211
|
channel_credentials=None,
|
@@ -216,9 +215,9 @@ class ClientAppIo(object):
|
|
216
215
|
wait_for_ready=None,
|
217
216
|
timeout=None,
|
218
217
|
metadata=None):
|
219
|
-
return grpc.experimental.unary_unary(request, target, '/flwr.proto.ClientAppIo/
|
220
|
-
|
221
|
-
|
218
|
+
return grpc.experimental.unary_unary(request, target, '/flwr.proto.ClientAppIo/ListAppsToLaunch',
|
219
|
+
flwr_dot_proto_dot_appio__pb2.ListAppsToLaunchRequest.SerializeToString,
|
220
|
+
flwr_dot_proto_dot_appio__pb2.ListAppsToLaunchResponse.FromString,
|
222
221
|
options, channel_credentials,
|
223
222
|
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
224
223
|
|
@@ -234,8 +233,8 @@ class ClientAppIo(object):
|
|
234
233
|
timeout=None,
|
235
234
|
metadata=None):
|
236
235
|
return grpc.experimental.unary_unary(request, target, '/flwr.proto.ClientAppIo/RequestToken',
|
237
|
-
|
238
|
-
|
236
|
+
flwr_dot_proto_dot_appio__pb2.RequestTokenRequest.SerializeToString,
|
237
|
+
flwr_dot_proto_dot_appio__pb2.RequestTokenResponse.FromString,
|
239
238
|
options, channel_credentials,
|
240
239
|
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
241
240
|
|
@@ -4,21 +4,20 @@ isort:skip_file
|
|
4
4
|
"""
|
5
5
|
import abc
|
6
6
|
import flwr.proto.appio_pb2
|
7
|
-
import flwr.proto.clientappio_pb2
|
8
7
|
import flwr.proto.message_pb2
|
9
8
|
import flwr.proto.run_pb2
|
10
9
|
import grpc
|
11
10
|
|
12
11
|
class ClientAppIoStub:
|
13
12
|
def __init__(self, channel: grpc.Channel) -> None: ...
|
14
|
-
|
15
|
-
flwr.proto.
|
16
|
-
flwr.proto.
|
13
|
+
ListAppsToLaunch: grpc.UnaryUnaryMultiCallable[
|
14
|
+
flwr.proto.appio_pb2.ListAppsToLaunchRequest,
|
15
|
+
flwr.proto.appio_pb2.ListAppsToLaunchResponse]
|
17
16
|
"""Get run IDs with pending messages"""
|
18
17
|
|
19
18
|
RequestToken: grpc.UnaryUnaryMultiCallable[
|
20
|
-
flwr.proto.
|
21
|
-
flwr.proto.
|
19
|
+
flwr.proto.appio_pb2.RequestTokenRequest,
|
20
|
+
flwr.proto.appio_pb2.RequestTokenResponse]
|
22
21
|
"""Request token"""
|
23
22
|
|
24
23
|
GetRun: grpc.UnaryUnaryMultiCallable[
|
@@ -64,18 +63,18 @@ class ClientAppIoStub:
|
|
64
63
|
|
65
64
|
class ClientAppIoServicer(metaclass=abc.ABCMeta):
|
66
65
|
@abc.abstractmethod
|
67
|
-
def
|
68
|
-
request: flwr.proto.
|
66
|
+
def ListAppsToLaunch(self,
|
67
|
+
request: flwr.proto.appio_pb2.ListAppsToLaunchRequest,
|
69
68
|
context: grpc.ServicerContext,
|
70
|
-
) -> flwr.proto.
|
69
|
+
) -> flwr.proto.appio_pb2.ListAppsToLaunchResponse:
|
71
70
|
"""Get run IDs with pending messages"""
|
72
71
|
pass
|
73
72
|
|
74
73
|
@abc.abstractmethod
|
75
74
|
def RequestToken(self,
|
76
|
-
request: flwr.proto.
|
75
|
+
request: flwr.proto.appio_pb2.RequestTokenRequest,
|
77
76
|
context: grpc.ServicerContext,
|
78
|
-
) -> flwr.proto.
|
77
|
+
) -> flwr.proto.appio_pb2.RequestTokenResponse:
|
79
78
|
"""Request token"""
|
80
79
|
pass
|
81
80
|
|
flwr/proto/serverappio_pb2.py
CHANGED
@@ -21,7 +21,7 @@ from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
|
|
21
21
|
from flwr.proto import appio_pb2 as flwr_dot_proto_dot_appio__pb2
|
22
22
|
|
23
23
|
|
24
|
-
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\x1a\x16\x66lwr/proto/appio.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.Node2\
|
24
|
+
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\x1a\x16\x66lwr/proto/appio.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.Node2\xe9\n\n\x0bServerAppIo\x12_\n\x10ListAppsToLaunch\x12#.flwr.proto.ListAppsToLaunchRequest\x1a$.flwr.proto.ListAppsToLaunchResponse\"\x00\x12S\n\x0cRequestToken\x12\x1f.flwr.proto.RequestTokenRequest\x1a .flwr.proto.RequestTokenResponse\"\x00\x12G\n\x08GetNodes\x12\x1b.flwr.proto.GetNodesRequest\x1a\x1c.flwr.proto.GetNodesResponse\"\x00\x12Y\n\x0cPushMessages\x12\".flwr.proto.PushAppMessagesRequest\x1a#.flwr.proto.PushAppMessagesResponse\"\x00\x12Y\n\x0cPullMessages\x12\".flwr.proto.PullAppMessagesRequest\x1a#.flwr.proto.PullAppMessagesResponse\"\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\x12V\n\rPullAppInputs\x12 .flwr.proto.PullAppInputsRequest\x1a!.flwr.proto.PullAppInputsResponse\"\x00\x12Y\n\x0ePushAppOutputs\x12!.flwr.proto.PushAppOutputsRequest\x1a\".flwr.proto.PushAppOutputsResponse\"\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\x12q\n\x16\x43onfirmMessageReceived\x12).flwr.proto.ConfirmMessageReceivedRequest\x1a*.flwr.proto.ConfirmMessageReceivedResponse\"\x00\x62\x06proto3')
|
25
25
|
|
26
26
|
_globals = globals()
|
27
27
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
@@ -33,5 +33,5 @@ if _descriptor._USE_C_DESCRIPTORS == False:
|
|
33
33
|
_globals['_GETNODESRESPONSE']._serialized_start=246
|
34
34
|
_globals['_GETNODESRESPONSE']._serialized_end=297
|
35
35
|
_globals['_SERVERAPPIO']._serialized_start=300
|
36
|
-
_globals['_SERVERAPPIO']._serialized_end=
|
36
|
+
_globals['_SERVERAPPIO']._serialized_end=1685
|
37
37
|
# @@protoc_insertion_point(module_scope)
|
@@ -20,6 +20,16 @@ class ServerAppIoStub(object):
|
|
20
20
|
Args:
|
21
21
|
channel: A grpc.Channel.
|
22
22
|
"""
|
23
|
+
self.ListAppsToLaunch = channel.unary_unary(
|
24
|
+
'/flwr.proto.ServerAppIo/ListAppsToLaunch',
|
25
|
+
request_serializer=flwr_dot_proto_dot_appio__pb2.ListAppsToLaunchRequest.SerializeToString,
|
26
|
+
response_deserializer=flwr_dot_proto_dot_appio__pb2.ListAppsToLaunchResponse.FromString,
|
27
|
+
)
|
28
|
+
self.RequestToken = channel.unary_unary(
|
29
|
+
'/flwr.proto.ServerAppIo/RequestToken',
|
30
|
+
request_serializer=flwr_dot_proto_dot_appio__pb2.RequestTokenRequest.SerializeToString,
|
31
|
+
response_deserializer=flwr_dot_proto_dot_appio__pb2.RequestTokenResponse.FromString,
|
32
|
+
)
|
23
33
|
self.GetNodes = channel.unary_unary(
|
24
34
|
'/flwr.proto.ServerAppIo/GetNodes',
|
25
35
|
request_serializer=flwr_dot_proto_dot_serverappio__pb2.GetNodesRequest.SerializeToString,
|
@@ -95,6 +105,20 @@ class ServerAppIoStub(object):
|
|
95
105
|
class ServerAppIoServicer(object):
|
96
106
|
"""Missing associated documentation comment in .proto file."""
|
97
107
|
|
108
|
+
def ListAppsToLaunch(self, request, context):
|
109
|
+
"""List runs to launch
|
110
|
+
"""
|
111
|
+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
112
|
+
context.set_details('Method not implemented!')
|
113
|
+
raise NotImplementedError('Method not implemented!')
|
114
|
+
|
115
|
+
def RequestToken(self, request, context):
|
116
|
+
"""Request token for a run
|
117
|
+
"""
|
118
|
+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
119
|
+
context.set_details('Method not implemented!')
|
120
|
+
raise NotImplementedError('Method not implemented!')
|
121
|
+
|
98
122
|
def GetNodes(self, request, context):
|
99
123
|
"""Return a set of nodes
|
100
124
|
"""
|
@@ -196,6 +220,16 @@ class ServerAppIoServicer(object):
|
|
196
220
|
|
197
221
|
def add_ServerAppIoServicer_to_server(servicer, server):
|
198
222
|
rpc_method_handlers = {
|
223
|
+
'ListAppsToLaunch': grpc.unary_unary_rpc_method_handler(
|
224
|
+
servicer.ListAppsToLaunch,
|
225
|
+
request_deserializer=flwr_dot_proto_dot_appio__pb2.ListAppsToLaunchRequest.FromString,
|
226
|
+
response_serializer=flwr_dot_proto_dot_appio__pb2.ListAppsToLaunchResponse.SerializeToString,
|
227
|
+
),
|
228
|
+
'RequestToken': grpc.unary_unary_rpc_method_handler(
|
229
|
+
servicer.RequestToken,
|
230
|
+
request_deserializer=flwr_dot_proto_dot_appio__pb2.RequestTokenRequest.FromString,
|
231
|
+
response_serializer=flwr_dot_proto_dot_appio__pb2.RequestTokenResponse.SerializeToString,
|
232
|
+
),
|
199
233
|
'GetNodes': grpc.unary_unary_rpc_method_handler(
|
200
234
|
servicer.GetNodes,
|
201
235
|
request_deserializer=flwr_dot_proto_dot_serverappio__pb2.GetNodesRequest.FromString,
|
@@ -276,6 +310,40 @@ def add_ServerAppIoServicer_to_server(servicer, server):
|
|
276
310
|
class ServerAppIo(object):
|
277
311
|
"""Missing associated documentation comment in .proto file."""
|
278
312
|
|
313
|
+
@staticmethod
|
314
|
+
def ListAppsToLaunch(request,
|
315
|
+
target,
|
316
|
+
options=(),
|
317
|
+
channel_credentials=None,
|
318
|
+
call_credentials=None,
|
319
|
+
insecure=False,
|
320
|
+
compression=None,
|
321
|
+
wait_for_ready=None,
|
322
|
+
timeout=None,
|
323
|
+
metadata=None):
|
324
|
+
return grpc.experimental.unary_unary(request, target, '/flwr.proto.ServerAppIo/ListAppsToLaunch',
|
325
|
+
flwr_dot_proto_dot_appio__pb2.ListAppsToLaunchRequest.SerializeToString,
|
326
|
+
flwr_dot_proto_dot_appio__pb2.ListAppsToLaunchResponse.FromString,
|
327
|
+
options, channel_credentials,
|
328
|
+
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
329
|
+
|
330
|
+
@staticmethod
|
331
|
+
def RequestToken(request,
|
332
|
+
target,
|
333
|
+
options=(),
|
334
|
+
channel_credentials=None,
|
335
|
+
call_credentials=None,
|
336
|
+
insecure=False,
|
337
|
+
compression=None,
|
338
|
+
wait_for_ready=None,
|
339
|
+
timeout=None,
|
340
|
+
metadata=None):
|
341
|
+
return grpc.experimental.unary_unary(request, target, '/flwr.proto.ServerAppIo/RequestToken',
|
342
|
+
flwr_dot_proto_dot_appio__pb2.RequestTokenRequest.SerializeToString,
|
343
|
+
flwr_dot_proto_dot_appio__pb2.RequestTokenResponse.FromString,
|
344
|
+
options, channel_credentials,
|
345
|
+
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
346
|
+
|
279
347
|
@staticmethod
|
280
348
|
def GetNodes(request,
|
281
349
|
target,
|
@@ -14,6 +14,16 @@ import grpc
|
|
14
14
|
|
15
15
|
class ServerAppIoStub:
|
16
16
|
def __init__(self, channel: grpc.Channel) -> None: ...
|
17
|
+
ListAppsToLaunch: grpc.UnaryUnaryMultiCallable[
|
18
|
+
flwr.proto.appio_pb2.ListAppsToLaunchRequest,
|
19
|
+
flwr.proto.appio_pb2.ListAppsToLaunchResponse]
|
20
|
+
"""List runs to launch"""
|
21
|
+
|
22
|
+
RequestToken: grpc.UnaryUnaryMultiCallable[
|
23
|
+
flwr.proto.appio_pb2.RequestTokenRequest,
|
24
|
+
flwr.proto.appio_pb2.RequestTokenResponse]
|
25
|
+
"""Request token for a run"""
|
26
|
+
|
17
27
|
GetNodes: grpc.UnaryUnaryMultiCallable[
|
18
28
|
flwr.proto.serverappio_pb2.GetNodesRequest,
|
19
29
|
flwr.proto.serverappio_pb2.GetNodesResponse]
|
@@ -86,6 +96,22 @@ class ServerAppIoStub:
|
|
86
96
|
|
87
97
|
|
88
98
|
class ServerAppIoServicer(metaclass=abc.ABCMeta):
|
99
|
+
@abc.abstractmethod
|
100
|
+
def ListAppsToLaunch(self,
|
101
|
+
request: flwr.proto.appio_pb2.ListAppsToLaunchRequest,
|
102
|
+
context: grpc.ServicerContext,
|
103
|
+
) -> flwr.proto.appio_pb2.ListAppsToLaunchResponse:
|
104
|
+
"""List runs to launch"""
|
105
|
+
pass
|
106
|
+
|
107
|
+
@abc.abstractmethod
|
108
|
+
def RequestToken(self,
|
109
|
+
request: flwr.proto.appio_pb2.RequestTokenRequest,
|
110
|
+
context: grpc.ServicerContext,
|
111
|
+
) -> flwr.proto.appio_pb2.RequestTokenResponse:
|
112
|
+
"""Request token for a run"""
|
113
|
+
pass
|
114
|
+
|
89
115
|
@abc.abstractmethod
|
90
116
|
def GetNodes(self,
|
91
117
|
request: flwr.proto.serverappio_pb2.GetNodesRequest,
|
@@ -15,6 +15,7 @@
|
|
15
15
|
"""In-memory LinkState implementation."""
|
16
16
|
|
17
17
|
|
18
|
+
import secrets
|
18
19
|
import threading
|
19
20
|
import time
|
20
21
|
from bisect import bisect_right
|
@@ -25,6 +26,7 @@ from typing import Optional
|
|
25
26
|
|
26
27
|
from flwr.common import Context, Message, log, now
|
27
28
|
from flwr.common.constant import (
|
29
|
+
FLWR_APP_TOKEN_LENGTH,
|
28
30
|
HEARTBEAT_MAX_INTERVAL,
|
29
31
|
HEARTBEAT_PATIENCE,
|
30
32
|
MESSAGE_TTL_TOLERANCE,
|
@@ -80,6 +82,11 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
|
|
80
82
|
self.message_res_store: dict[str, Message] = {}
|
81
83
|
self.message_ins_id_to_message_res_id: dict[str, str] = {}
|
82
84
|
|
85
|
+
# Store run ID to token mapping and token to run ID mapping
|
86
|
+
self.token_store: dict[int, str] = {}
|
87
|
+
self.token_to_run_id: dict[str, int] = {}
|
88
|
+
self.lock_token_store = threading.Lock()
|
89
|
+
|
83
90
|
# Map flwr_aid to run_ids for O(1) reverse index lookup
|
84
91
|
self.flwr_aid_to_run_ids: dict[str, set[int]] = defaultdict(set)
|
85
92
|
|
@@ -678,3 +685,30 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
|
|
678
685
|
index = bisect_right(run.logs, (after_timestamp, ""))
|
679
686
|
latest_timestamp = run.logs[-1][0] if index < len(run.logs) else 0.0
|
680
687
|
return "".join(log for _, log in run.logs[index:]), latest_timestamp
|
688
|
+
|
689
|
+
def create_token(self, run_id: int) -> str:
|
690
|
+
"""Create a token for the given run ID."""
|
691
|
+
token = secrets.token_hex(FLWR_APP_TOKEN_LENGTH) # Generate a random token
|
692
|
+
with self.lock_token_store:
|
693
|
+
if run_id in self.token_store:
|
694
|
+
raise ValueError("Token already created for this run ID")
|
695
|
+
self.token_store[run_id] = token
|
696
|
+
self.token_to_run_id[token] = run_id
|
697
|
+
return token
|
698
|
+
|
699
|
+
def verify_token(self, run_id: int, token: str) -> bool:
|
700
|
+
"""Verify a token for the given run ID."""
|
701
|
+
with self.lock_token_store:
|
702
|
+
return self.token_store.get(run_id) == token
|
703
|
+
|
704
|
+
def delete_token(self, run_id: int) -> None:
|
705
|
+
"""Delete the token for the given run ID."""
|
706
|
+
with self.lock_token_store:
|
707
|
+
token = self.token_store.pop(run_id, None)
|
708
|
+
if token is not None:
|
709
|
+
self.token_to_run_id.pop(token, None)
|
710
|
+
|
711
|
+
def get_run_id_by_token(self, token: str) -> Optional[int]:
|
712
|
+
"""Get the run ID associated with a given token."""
|
713
|
+
with self.lock_token_store:
|
714
|
+
return self.token_to_run_id.get(token)
|
@@ -21,9 +21,10 @@ from typing import Optional
|
|
21
21
|
from flwr.common import Context, Message
|
22
22
|
from flwr.common.record import ConfigRecord
|
23
23
|
from flwr.common.typing import Run, RunStatus, UserConfig
|
24
|
+
from flwr.supercore.corestate import CoreState
|
24
25
|
|
25
26
|
|
26
|
-
class LinkState(
|
27
|
+
class LinkState(CoreState): # pylint: disable=R0904
|
27
28
|
"""Abstract LinkState."""
|
28
29
|
|
29
30
|
@abc.abstractmethod
|
@@ -19,6 +19,7 @@
|
|
19
19
|
|
20
20
|
import json
|
21
21
|
import re
|
22
|
+
import secrets
|
22
23
|
import sqlite3
|
23
24
|
import time
|
24
25
|
from collections.abc import Sequence
|
@@ -27,6 +28,7 @@ from typing import Any, Optional, Union, cast
|
|
27
28
|
|
28
29
|
from flwr.common import Context, Message, Metadata, log, now
|
29
30
|
from flwr.common.constant import (
|
31
|
+
FLWR_APP_TOKEN_LENGTH,
|
30
32
|
HEARTBEAT_MAX_INTERVAL,
|
31
33
|
HEARTBEAT_PATIENCE,
|
32
34
|
MESSAGE_TTL_TOLERANCE,
|
@@ -163,6 +165,13 @@ CREATE TABLE IF NOT EXISTS message_res(
|
|
163
165
|
);
|
164
166
|
"""
|
165
167
|
|
168
|
+
SQL_CREATE_TABLE_TOKEN_STORE = """
|
169
|
+
CREATE TABLE IF NOT EXISTS token_store (
|
170
|
+
run_id INTEGER PRIMARY KEY,
|
171
|
+
token TEXT UNIQUE NOT NULL
|
172
|
+
);
|
173
|
+
"""
|
174
|
+
|
166
175
|
DictOrTuple = Union[tuple[Any, ...], dict[str, Any]]
|
167
176
|
|
168
177
|
|
@@ -212,6 +221,7 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
|
|
212
221
|
cur.execute(SQL_CREATE_TABLE_MESSAGE_RES)
|
213
222
|
cur.execute(SQL_CREATE_TABLE_NODE)
|
214
223
|
cur.execute(SQL_CREATE_TABLE_PUBLIC_KEY)
|
224
|
+
cur.execute(SQL_CREATE_TABLE_TOKEN_STORE)
|
215
225
|
cur.execute(SQL_CREATE_INDEX_ONLINE_UNTIL)
|
216
226
|
res = cur.execute("SELECT name FROM sqlite_schema;")
|
217
227
|
return res.fetchall()
|
@@ -1138,6 +1148,41 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
|
|
1138
1148
|
|
1139
1149
|
return message_ins
|
1140
1150
|
|
1151
|
+
def create_token(self, run_id: int) -> str:
|
1152
|
+
"""Create a token for the given run ID."""
|
1153
|
+
token = secrets.token_hex(FLWR_APP_TOKEN_LENGTH) # Generate a random token
|
1154
|
+
query = "INSERT INTO token_store (run_id, token) VALUES (:run_id, :token);"
|
1155
|
+
data = {"run_id": convert_uint64_to_sint64(run_id), "token": token}
|
1156
|
+
try:
|
1157
|
+
self.query(query, data)
|
1158
|
+
except sqlite3.IntegrityError:
|
1159
|
+
raise ValueError("Token already created for this run ID") from None
|
1160
|
+
return token
|
1161
|
+
|
1162
|
+
def verify_token(self, run_id: int, token: str) -> bool:
|
1163
|
+
"""Verify a token for the given run ID."""
|
1164
|
+
query = "SELECT token FROM token_store WHERE run_id = :run_id;"
|
1165
|
+
data = {"run_id": convert_uint64_to_sint64(run_id)}
|
1166
|
+
rows = self.query(query, data)
|
1167
|
+
if not rows:
|
1168
|
+
return False
|
1169
|
+
return cast(str, rows[0]["token"]) == token
|
1170
|
+
|
1171
|
+
def delete_token(self, run_id: int) -> None:
|
1172
|
+
"""Delete the token for the given run ID."""
|
1173
|
+
query = "DELETE FROM token_store WHERE run_id = :run_id;"
|
1174
|
+
data = {"run_id": convert_uint64_to_sint64(run_id)}
|
1175
|
+
self.query(query, data)
|
1176
|
+
|
1177
|
+
def get_run_id_by_token(self, token: str) -> Optional[int]:
|
1178
|
+
"""Get the run ID associated with a given token."""
|
1179
|
+
query = "SELECT run_id FROM token_store WHERE token = :token;"
|
1180
|
+
data = {"token": token}
|
1181
|
+
rows = self.query(query, data)
|
1182
|
+
if not rows:
|
1183
|
+
return None
|
1184
|
+
return convert_sint64_to_uint64(rows[0]["run_id"])
|
1185
|
+
|
1141
1186
|
|
1142
1187
|
def dict_factory(
|
1143
1188
|
cursor: sqlite3.Cursor,
|
@@ -43,6 +43,8 @@ from flwr.common.serde import (
|
|
43
43
|
from flwr.common.typing import Fab, RunStatus
|
44
44
|
from flwr.proto import serverappio_pb2_grpc # pylint: disable=E0611
|
45
45
|
from flwr.proto.appio_pb2 import ( # pylint: disable=E0611
|
46
|
+
ListAppsToLaunchRequest,
|
47
|
+
ListAppsToLaunchResponse,
|
46
48
|
PullAppInputsRequest,
|
47
49
|
PullAppInputsResponse,
|
48
50
|
PullAppMessagesRequest,
|
@@ -51,6 +53,8 @@ from flwr.proto.appio_pb2 import ( # pylint: disable=E0611
|
|
51
53
|
PushAppMessagesResponse,
|
52
54
|
PushAppOutputsRequest,
|
53
55
|
PushAppOutputsResponse,
|
56
|
+
RequestTokenRequest,
|
57
|
+
RequestTokenResponse,
|
54
58
|
)
|
55
59
|
from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
|
56
60
|
from flwr.proto.heartbeat_pb2 import ( # pylint: disable=E0611
|
@@ -104,6 +108,28 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
|
|
104
108
|
self.objectstore_factory = objectstore_factory
|
105
109
|
self.lock = threading.RLock()
|
106
110
|
|
111
|
+
def ListAppsToLaunch(
|
112
|
+
self,
|
113
|
+
request: ListAppsToLaunchRequest,
|
114
|
+
context: grpc.ServicerContext,
|
115
|
+
) -> ListAppsToLaunchResponse:
|
116
|
+
"""Get run IDs with pending messages."""
|
117
|
+
log(DEBUG, "ClientAppIo.ListAppsToLaunch")
|
118
|
+
|
119
|
+
context.abort(
|
120
|
+
grpc.StatusCode.UNIMPLEMENTED, "ListAppsToLaunch is not implemented"
|
121
|
+
)
|
122
|
+
raise NotImplementedError
|
123
|
+
|
124
|
+
def RequestToken(
|
125
|
+
self, request: RequestTokenRequest, context: grpc.ServicerContext
|
126
|
+
) -> RequestTokenResponse:
|
127
|
+
"""Request token."""
|
128
|
+
log(DEBUG, "ClientAppIo.RequestToken")
|
129
|
+
|
130
|
+
context.abort(grpc.StatusCode.UNIMPLEMENTED, "RequestToken is not implemented")
|
131
|
+
raise NotImplementedError
|
132
|
+
|
107
133
|
def GetNodes(
|
108
134
|
self, request: GetNodesRequest, context: grpc.ServicerContext
|
109
135
|
) -> GetNodesResponse:
|
@@ -12,11 +12,11 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
# ==============================================================================
|
15
|
-
"""Flower
|
15
|
+
"""Flower CoreState."""
|
16
16
|
|
17
17
|
|
18
|
-
from .
|
18
|
+
from .corestate import CoreState
|
19
19
|
|
20
20
|
__all__ = [
|
21
|
-
"
|
21
|
+
"CoreState",
|
22
22
|
]
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# Copyright 2025 Flower Labs GmbH. All Rights Reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
# ==============================================================================
|
15
|
+
"""Abstract base class CoreState."""
|
16
|
+
|
17
|
+
|
18
|
+
from abc import ABC, abstractmethod
|
19
|
+
from typing import Optional
|
20
|
+
|
21
|
+
|
22
|
+
class CoreState(ABC):
|
23
|
+
"""Abstract base class for core state."""
|
24
|
+
|
25
|
+
@abstractmethod
|
26
|
+
def create_token(self, run_id: int) -> str:
|
27
|
+
"""Create a token for the given run ID.
|
28
|
+
|
29
|
+
Parameters
|
30
|
+
----------
|
31
|
+
run_id : int
|
32
|
+
The ID of the run for which to create a token.
|
33
|
+
|
34
|
+
Returns
|
35
|
+
-------
|
36
|
+
str
|
37
|
+
A unique token associated with the run ID.
|
38
|
+
"""
|
39
|
+
|
40
|
+
@abstractmethod
|
41
|
+
def verify_token(self, run_id: int, token: str) -> bool:
|
42
|
+
"""Verify a token for the given run ID.
|
43
|
+
|
44
|
+
Parameters
|
45
|
+
----------
|
46
|
+
run_id : int
|
47
|
+
The ID of the run for which to verify the token.
|
48
|
+
token : str
|
49
|
+
The token to verify.
|
50
|
+
|
51
|
+
Returns
|
52
|
+
-------
|
53
|
+
bool
|
54
|
+
True if the token is valid for the run ID, False otherwise.
|
55
|
+
"""
|
56
|
+
|
57
|
+
@abstractmethod
|
58
|
+
def delete_token(self, run_id: int) -> None:
|
59
|
+
"""Delete the token for the given run ID.
|
60
|
+
|
61
|
+
Parameters
|
62
|
+
----------
|
63
|
+
run_id : int
|
64
|
+
The ID of the run for which to delete the token.
|
65
|
+
"""
|
66
|
+
|
67
|
+
@abstractmethod
|
68
|
+
def get_run_id_by_token(self, token: str) -> Optional[int]:
|
69
|
+
"""Get the run ID associated with a given token.
|
70
|
+
|
71
|
+
Parameters
|
72
|
+
----------
|
73
|
+
token : str
|
74
|
+
The token to look up.
|
75
|
+
|
76
|
+
Returns
|
77
|
+
-------
|
78
|
+
Optional[int]
|
79
|
+
The run ID if the token is valid, otherwise None.
|
80
|
+
"""
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# Copyright 2025 Flower Labs GmbH. All Rights Reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
# ==============================================================================
|
15
|
+
"""Flower SuperExec."""
|
@@ -12,11 +12,13 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
# ==============================================================================
|
15
|
-
"""Flower
|
15
|
+
"""Flower SuperExec plugins."""
|
16
16
|
|
17
17
|
|
18
|
-
from .
|
18
|
+
from .clientapp_exec_plugin import ClientAppExecPlugin
|
19
|
+
from .exec_plugin import ExecPlugin
|
19
20
|
|
20
21
|
__all__ = [
|
21
|
-
"
|
22
|
+
"ClientAppExecPlugin",
|
23
|
+
"ExecPlugin",
|
22
24
|
]
|
@@ -12,7 +12,7 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
# ==============================================================================
|
15
|
-
"""Simple Flower
|
15
|
+
"""Simple Flower SuperExec plugin for ClientApp."""
|
16
16
|
|
17
17
|
|
18
18
|
import os
|
@@ -20,11 +20,11 @@ import subprocess
|
|
20
20
|
from collections.abc import Sequence
|
21
21
|
from typing import Optional
|
22
22
|
|
23
|
-
from
|
23
|
+
from .exec_plugin import ExecPlugin
|
24
24
|
|
25
25
|
|
26
|
-
class
|
27
|
-
"""Simple Flower
|
26
|
+
class ClientAppExecPlugin(ExecPlugin):
|
27
|
+
"""Simple Flower SuperExec plugin for ClientApp.
|
28
28
|
|
29
29
|
The plugin always selects the first candidate run ID.
|
30
30
|
"""
|
@@ -12,7 +12,7 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
# ==============================================================================
|
15
|
-
"""Abstract base class
|
15
|
+
"""Abstract base class ExecPlugin."""
|
16
16
|
|
17
17
|
|
18
18
|
from abc import ABC, abstractmethod
|
@@ -22,8 +22,8 @@ from typing import Callable, Optional
|
|
22
22
|
from flwr.common.typing import Run
|
23
23
|
|
24
24
|
|
25
|
-
class
|
26
|
-
"""Abstract base class for
|
25
|
+
class ExecPlugin(ABC):
|
26
|
+
"""Abstract base class for SuperExec plugins."""
|
27
27
|
|
28
28
|
def __init__(
|
29
29
|
self,
|
@@ -59,7 +59,7 @@ class SchedulerPlugin(ABC):
|
|
59
59
|
|
60
60
|
This method starts the application process using the given `token`.
|
61
61
|
The `run_id` is used solely for bookkeeping purposes, allowing any
|
62
|
-
|
62
|
+
plugin implementation to associate this launch with a specific run.
|
63
63
|
|
64
64
|
Parameters
|
65
65
|
----------
|
@@ -15,15 +15,16 @@
|
|
15
15
|
"""Abstract base class NodeState."""
|
16
16
|
|
17
17
|
|
18
|
-
from abc import
|
18
|
+
from abc import abstractmethod
|
19
19
|
from collections.abc import Sequence
|
20
20
|
from typing import Optional
|
21
21
|
|
22
22
|
from flwr.common import Context, Message
|
23
23
|
from flwr.common.typing import Run
|
24
|
+
from flwr.supercore.corestate import CoreState
|
24
25
|
|
25
26
|
|
26
|
-
class NodeState(
|
27
|
+
class NodeState(CoreState):
|
27
28
|
"""Abstract base class for node state."""
|
28
29
|
|
29
30
|
@abstractmethod
|
@@ -168,60 +169,3 @@ class NodeState(ABC):
|
|
168
169
|
Sequence[int]
|
169
170
|
Sequence of run IDs with pending messages.
|
170
171
|
"""
|
171
|
-
|
172
|
-
@abstractmethod
|
173
|
-
def create_token(self, run_id: int) -> str:
|
174
|
-
"""Create a token for the given run ID.
|
175
|
-
|
176
|
-
Parameters
|
177
|
-
----------
|
178
|
-
run_id : int
|
179
|
-
The ID of the run for which to create a token.
|
180
|
-
|
181
|
-
Returns
|
182
|
-
-------
|
183
|
-
str
|
184
|
-
A unique token associated with the run ID.
|
185
|
-
"""
|
186
|
-
|
187
|
-
@abstractmethod
|
188
|
-
def verify_token(self, run_id: int, token: str) -> bool:
|
189
|
-
"""Verify a token for the given run ID.
|
190
|
-
|
191
|
-
Parameters
|
192
|
-
----------
|
193
|
-
run_id : int
|
194
|
-
The ID of the run for which to verify the token.
|
195
|
-
token : str
|
196
|
-
The token to verify.
|
197
|
-
|
198
|
-
Returns
|
199
|
-
-------
|
200
|
-
bool
|
201
|
-
True if the token is valid for the run ID, False otherwise.
|
202
|
-
"""
|
203
|
-
|
204
|
-
@abstractmethod
|
205
|
-
def delete_token(self, run_id: int) -> None:
|
206
|
-
"""Delete the token for the given run ID.
|
207
|
-
|
208
|
-
Parameters
|
209
|
-
----------
|
210
|
-
run_id : int
|
211
|
-
The ID of the run for which to delete the token.
|
212
|
-
"""
|
213
|
-
|
214
|
-
@abstractmethod
|
215
|
-
def get_run_id_by_token(self, token: str) -> Optional[int]:
|
216
|
-
"""Get the run ID associated with a given token.
|
217
|
-
|
218
|
-
Parameters
|
219
|
-
----------
|
220
|
-
token : str
|
221
|
-
The token to look up.
|
222
|
-
|
223
|
-
Returns
|
224
|
-
-------
|
225
|
-
Optional[int]
|
226
|
-
The run ID if the token is valid, otherwise None.
|
227
|
-
"""
|
@@ -55,6 +55,8 @@ from flwr.common.serde import (
|
|
55
55
|
)
|
56
56
|
from flwr.common.typing import Fab, Run
|
57
57
|
from flwr.proto.appio_pb2 import ( # pylint: disable=E0611
|
58
|
+
ListAppsToLaunchRequest,
|
59
|
+
ListAppsToLaunchResponse,
|
58
60
|
PullAppInputsRequest,
|
59
61
|
PullAppInputsResponse,
|
60
62
|
PullAppMessagesRequest,
|
@@ -62,12 +64,6 @@ from flwr.proto.appio_pb2 import ( # pylint: disable=E0611
|
|
62
64
|
PushAppMessagesRequest,
|
63
65
|
PushAppOutputsRequest,
|
64
66
|
PushAppOutputsResponse,
|
65
|
-
)
|
66
|
-
|
67
|
-
# pylint: disable=E0611
|
68
|
-
from flwr.proto.clientappio_pb2 import (
|
69
|
-
GetRunIdsWithPendingMessagesRequest,
|
70
|
-
GetRunIdsWithPendingMessagesResponse,
|
71
67
|
RequestTokenRequest,
|
72
68
|
RequestTokenResponse,
|
73
69
|
)
|
@@ -195,9 +191,7 @@ def get_token(stub: ClientAppIoStub) -> str:
|
|
195
191
|
"""Get a token from SuperNode."""
|
196
192
|
log(DEBUG, "[flwr-clientapp] Request token")
|
197
193
|
while True:
|
198
|
-
res:
|
199
|
-
GetRunIdsWithPendingMessagesRequest()
|
200
|
-
)
|
194
|
+
res: ListAppsToLaunchResponse = stub.ListAppsToLaunch(ListAppsToLaunchRequest())
|
201
195
|
|
202
196
|
for run_id in res.run_ids:
|
203
197
|
tk_res: RequestTokenResponse = stub.RequestToken(
|
@@ -36,6 +36,8 @@ from flwr.common.typing import Fab, Run
|
|
36
36
|
# pylint: disable=E0611
|
37
37
|
from flwr.proto import clientappio_pb2_grpc
|
38
38
|
from flwr.proto.appio_pb2 import ( # pylint: disable=E0401
|
39
|
+
ListAppsToLaunchRequest,
|
40
|
+
ListAppsToLaunchResponse,
|
39
41
|
PullAppInputsRequest,
|
40
42
|
PullAppInputsResponse,
|
41
43
|
PullAppMessagesRequest,
|
@@ -44,10 +46,6 @@ from flwr.proto.appio_pb2 import ( # pylint: disable=E0401
|
|
44
46
|
PushAppMessagesResponse,
|
45
47
|
PushAppOutputsRequest,
|
46
48
|
PushAppOutputsResponse,
|
47
|
-
)
|
48
|
-
from flwr.proto.clientappio_pb2 import ( # pylint: disable=E0401
|
49
|
-
GetRunIdsWithPendingMessagesRequest,
|
50
|
-
GetRunIdsWithPendingMessagesResponse,
|
51
49
|
RequestTokenRequest,
|
52
50
|
RequestTokenResponse,
|
53
51
|
)
|
@@ -82,13 +80,13 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
|
|
82
80
|
self.ffs_factory = ffs_factory
|
83
81
|
self.objectstore_factory = objectstore_factory
|
84
82
|
|
85
|
-
def
|
83
|
+
def ListAppsToLaunch(
|
86
84
|
self,
|
87
|
-
request:
|
85
|
+
request: ListAppsToLaunchRequest,
|
88
86
|
context: grpc.ServicerContext,
|
89
|
-
) ->
|
90
|
-
"""Get run IDs with
|
91
|
-
log(DEBUG, "ClientAppIo.
|
87
|
+
) -> ListAppsToLaunchResponse:
|
88
|
+
"""Get run IDs with apps to launch."""
|
89
|
+
log(DEBUG, "ClientAppIo.ListAppsToLaunch")
|
92
90
|
|
93
91
|
# Initialize state connection
|
94
92
|
state = self.state_factory.state()
|
@@ -97,7 +95,7 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
|
|
97
95
|
run_ids = state.get_run_ids_with_pending_messages()
|
98
96
|
|
99
97
|
# Return run IDs
|
100
|
-
return
|
98
|
+
return ListAppsToLaunchResponse(run_ids=run_ids)
|
101
99
|
|
102
100
|
def RequestToken(
|
103
101
|
self, request: RequestTokenRequest, context: grpc.ServicerContext
|
{flwr_nightly-1.21.0.dev20250805.dist-info → flwr_nightly-1.21.0.dev20250807.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: flwr-nightly
|
3
|
-
Version: 1.21.0.
|
3
|
+
Version: 1.21.0.dev20250807
|
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.21.0.dev20250805.dist-info → flwr_nightly-1.21.0.dev20250807.dist-info}/RECORD
RENAMED
@@ -164,14 +164,14 @@ flwr/compat/server/__init__.py,sha256=TGVSoOTuf5T5JHUVrK5wuorQF7L6Wvdem8B4uufvMJ
|
|
164
164
|
flwr/compat/server/app.py,sha256=_lIe7Q4KUk-olq9PYBxIsO3UaOn6N92CWgWQ4hRcAZw,6490
|
165
165
|
flwr/compat/simulation/__init__.py,sha256=MApGa-tysDDw34iSdxZ7TWOKtGJM-z3i8fIRJa0qbZ8,750
|
166
166
|
flwr/proto/__init__.py,sha256=S3VbQzVwNC1P-3_9EdrXuwgptO-BVuuAe20Z_OUc1cQ,683
|
167
|
-
flwr/proto/appio_pb2.py,sha256=
|
168
|
-
flwr/proto/appio_pb2.pyi,sha256=
|
167
|
+
flwr/proto/appio_pb2.py,sha256=IhwG71f9igeXO8QCuU6vwxETlFka0KR2PiMMNvmAYgs,4029
|
168
|
+
flwr/proto/appio_pb2.pyi,sha256=_XKv4Rvxv7ldH3EV4XKwL7_oub-pe_wMRmQStV7x358,8735
|
169
169
|
flwr/proto/appio_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
170
170
|
flwr/proto/appio_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
|
171
|
-
flwr/proto/clientappio_pb2.py,sha256=
|
172
|
-
flwr/proto/clientappio_pb2.pyi,sha256=
|
173
|
-
flwr/proto/clientappio_pb2_grpc.py,sha256=
|
174
|
-
flwr/proto/clientappio_pb2_grpc.pyi,sha256=
|
171
|
+
flwr/proto/clientappio_pb2.py,sha256=vJjzwWydhg7LruK8cvRAeVQeHPsJztgdIW9nyiPBZF0,2537
|
172
|
+
flwr/proto/clientappio_pb2.pyi,sha256=XbFvpZvvrS7QcH5AFXfpRGl4hQvhd3QdKO6x0oTlCCU,165
|
173
|
+
flwr/proto/clientappio_pb2_grpc.py,sha256=iobNROP0qvn5zddx7k-uIi_dJWP3T_BRp_kbKq086i8,17550
|
174
|
+
flwr/proto/clientappio_pb2_grpc.pyi,sha256=Ytf1O1ktKB0Vsuc3AWLIErGjIJYokzKYzi2uA7mdMeg,4785
|
175
175
|
flwr/proto/control_pb2.py,sha256=Jd_KT0Vi2GRf1rHDERxAsNmQxjLsNEmpqNLYdZ1kFCk,5684
|
176
176
|
flwr/proto/control_pb2.pyi,sha256=oEQH84BwhgaiD5zIseGH_UujuMk2SVCe5R75msEga-8,9478
|
177
177
|
flwr/proto/control_pb2_grpc.py,sha256=AweEk-n77uEwV1DX1lc55mhNlSfDEqsDHHWeouyTOVc,10610
|
@@ -216,10 +216,10 @@ flwr/proto/run_pb2.py,sha256=76pAp3ugvpsUyx34ehvMTe-o-J2pTTvb1OskDmsAcag,4768
|
|
216
216
|
flwr/proto/run_pb2.pyi,sha256=7hWfS3DzrrrKn5ZXRYL1x1rz9u1ZZd68Sz5kinRBDCk,9542
|
217
217
|
flwr/proto/run_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
218
218
|
flwr/proto/run_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
|
219
|
-
flwr/proto/serverappio_pb2.py,sha256=
|
219
|
+
flwr/proto/serverappio_pb2.py,sha256=CRbRIJk9r4RvLng1a_2M32LdNM3PoZmBRlNLO7fKVFs,3794
|
220
220
|
flwr/proto/serverappio_pb2.pyi,sha256=MDY9CEUnev_oi7Y-gZIXx8divcc0BufLAE2d7nmbo_Y,1319
|
221
|
-
flwr/proto/serverappio_pb2_grpc.py,sha256=
|
222
|
-
flwr/proto/serverappio_pb2_grpc.pyi,sha256=
|
221
|
+
flwr/proto/serverappio_pb2_grpc.py,sha256=hfRrdawakgu1uV6vf7lHSqB7IZNlxmsYmep3KJQXjjs,27446
|
222
|
+
flwr/proto/serverappio_pb2_grpc.pyi,sha256=65o7dZaEbqaYJKnJG84umeHGKGdJJQKK1FYMIUnvYwQ,7461
|
223
223
|
flwr/proto/simulationio_pb2.py,sha256=sAJX72z-IttVGxyU3PFnG8AFuA-pV7itvBoxz-hOudE,3342
|
224
224
|
flwr/proto/simulationio_pb2.pyi,sha256=oXx8_FLBe5B54wduZj-f89kub73XxNtQbThuW8YfPAs,2660
|
225
225
|
flwr/proto/simulationio_pb2_grpc.py,sha256=HuGbhOwV_A5GTbvmd5XTm6lSm9fWUgKcxq9OKhgmBT0,12999
|
@@ -298,14 +298,14 @@ flwr/server/superlink/fleet/vce/backend/backend.py,sha256=-wDHjgAy5mrfEgXj0GxkJI
|
|
298
298
|
flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=Hx9hxL7lju1_VJoAwkhBOGerZ3628u0P1zgkPhGWRPY,7154
|
299
299
|
flwr/server/superlink/fleet/vce/vce_api.py,sha256=xSjQbBYHmUTinw7Q_-UxqR7qt07kqj9FCSpPYRsUKf8,12909
|
300
300
|
flwr/server/superlink/linkstate/__init__.py,sha256=OtsgvDTnZLU3k0sUbkHbqoVwW6ql2FDmb6uT6DbNkZo,1064
|
301
|
-
flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=
|
302
|
-
flwr/server/superlink/linkstate/linkstate.py,sha256=
|
301
|
+
flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=jm5ZB6kePnikMEIN841bHedoC8Cjnve5JI2v6Wy8v6E,27886
|
302
|
+
flwr/server/superlink/linkstate/linkstate.py,sha256=TCLM9wZa2XGHs55B3LP9j5-WtUPhBjOUdMKQJELG2oY,13287
|
303
303
|
flwr/server/superlink/linkstate/linkstate_factory.py,sha256=8RlosqSpKOoD_vhUUQPY0jtE3A84GeF96Z7sWNkRRcA,2069
|
304
|
-
flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=
|
304
|
+
flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=ROAdb_uvaCsJa-AJbczbPFOpdaFiof2Y1s1fSBO6YUo,45508
|
305
305
|
flwr/server/superlink/linkstate/utils.py,sha256=IeLh7iGRCHU5MEWOl7iriaSE4L__8GWOa2OleXadK5M,15444
|
306
306
|
flwr/server/superlink/serverappio/__init__.py,sha256=Fy4zJuoccZe5mZSEIpOmQvU6YeXFBa1M4eZuXXmJcn8,717
|
307
307
|
flwr/server/superlink/serverappio/serverappio_grpc.py,sha256=zcvzDhCAnlFxAwCiJUHNm6IE7-rk5jeZqSmPgjEY3AU,2307
|
308
|
-
flwr/server/superlink/serverappio/serverappio_servicer.py,sha256=
|
308
|
+
flwr/server/superlink/serverappio/serverappio_servicer.py,sha256=DmYfjHQLya7LD4rLBLhDCdH9XTBgV8X790D3tdwHZpk,19096
|
309
309
|
flwr/server/superlink/simulation/__init__.py,sha256=Ry8DrNaZCMcQXvUc4FoCN2m3dvUQgWjasfp015o3Ec4,718
|
310
310
|
flwr/server/superlink/simulation/simulationio_grpc.py,sha256=VqWKxjpd4bCgPFKsgtIZPk9YcG0kc1EEmr5k20EKty4,2205
|
311
311
|
flwr/server/superlink/simulation/simulationio_servicer.py,sha256=m1T1zvEn81jlfx9hVTqmeWxAu6APCS2YW8l5O0OQvhU,7724
|
@@ -331,6 +331,8 @@ flwr/simulation/ray_transport/utils.py,sha256=KrexpWYCF-dAF3UHc9yDbPQWO-ahMT-BbD
|
|
331
331
|
flwr/simulation/run_simulation.py,sha256=-sp3dNZcp7MCAH0BlmZpVcFAGvozRdYXRdDYcH_2Zxk,20838
|
332
332
|
flwr/simulation/simulationio_connection.py,sha256=mzS1C6EEREwQDPceDo30anAasmTDLb9qqV2tXlBhOUA,3494
|
333
333
|
flwr/supercore/__init__.py,sha256=pqkFoow_E6UhbBlhmoD1gmTH-33yJRhBsIZqxRPFZ7U,755
|
334
|
+
flwr/supercore/corestate/__init__.py,sha256=Vau6-L_JG5QzNqtCTa9xCKGGljc09wY8avZmIjSJemg,774
|
335
|
+
flwr/supercore/corestate/corestate.py,sha256=vfZxZ6ddpg5ej3BJCJdaumQImElXG-lIaj-942xdT90,2255
|
334
336
|
flwr/supercore/ffs/__init__.py,sha256=U3KXwG_SplEvchat27K0LYPoPHzh-cwwT_NHsGlYMt8,908
|
335
337
|
flwr/supercore/ffs/disk_ffs.py,sha256=c5VywSaRnq3XM_zuJptNtsF2HFwsRK0pvBd5-5CNONs,3272
|
336
338
|
flwr/supercore/ffs/ffs.py,sha256=6w7wy71i7tbuJwqEgdeCa49JejXMEof3jujURN_R7Rg,2395
|
@@ -344,8 +346,10 @@ flwr/supercore/object_store/in_memory_object_store.py,sha256=CGY43syxDGrUPcdOzRH
|
|
344
346
|
flwr/supercore/object_store/object_store.py,sha256=J-rI3X7ET-F6dqOyM-UfHKCCQtPJ_EnYW62H_1txts0,5252
|
345
347
|
flwr/supercore/object_store/object_store_factory.py,sha256=QVwE2ywi7vsj2iKfvWWnNw3N_I7Rz91NUt2RpcbJ7iM,1527
|
346
348
|
flwr/supercore/object_store/utils.py,sha256=DcPbrb9PenloAPoQRiKiXX9DrDfpXcSyY0cZpgn4PeQ,1680
|
347
|
-
flwr/supercore/
|
348
|
-
flwr/supercore/
|
349
|
+
flwr/supercore/superexec/__init__.py,sha256=XKX208hZ6a9gZ4KT9kMqfpCtp_8VGxekzKFfHSu2esQ,707
|
350
|
+
flwr/supercore/superexec/plugin/__init__.py,sha256=OH5WYxZssOUzOVya3na4yHH0bRwtYmnottUreJT9R20,868
|
351
|
+
flwr/supercore/superexec/plugin/clientapp_exec_plugin.py,sha256=qX7vcB2n4crlfTTHKNqV0jHBmk8DiCIRuGDwLGAhP7g,1975
|
352
|
+
flwr/supercore/superexec/plugin/exec_plugin.py,sha256=w3jmtxdv7ov_EdAgifKcm4q8nV39e2Xna4sNjqClwOM,2447
|
349
353
|
flwr/supercore/utils.py,sha256=ebuHMbeA8eXisX0oMPqBK3hk7uVnIE_yiqWVz8YbkpQ,1324
|
350
354
|
flwr/superexec/__init__.py,sha256=YFqER0IJc1XEWfsX6AxZ9LSRq0sawPYrNYki-brvTIc,715
|
351
355
|
flwr/superexec/deployment.py,sha256=CEgWfkN_lH6Vci03RjwKLENw2z6kxNvUdVEErPbqYDY,830
|
@@ -369,17 +373,15 @@ flwr/supernode/cli/flower_supernode.py,sha256=fAkk9zGhoP8Sv05EkdXRiCtirTAzWkSZBq
|
|
369
373
|
flwr/supernode/cli/flwr_clientapp.py,sha256=zaro6BoUEmfKIPQYuyJ9oR4rrHSS3bufhEqxcTo5VZU,3153
|
370
374
|
flwr/supernode/nodestate/__init__.py,sha256=CyLLObbmmVgfRO88UCM0VMait1dL57mUauUDfuSHsbU,976
|
371
375
|
flwr/supernode/nodestate/in_memory_nodestate.py,sha256=LF3AbaW0bcZHY5yKWwUJSU2RZbMynt-YjFysGqvTOQY,7338
|
372
|
-
flwr/supernode/nodestate/nodestate.py,sha256=
|
376
|
+
flwr/supernode/nodestate/nodestate.py,sha256=jCOewZyctecMxsM0-_-pQwef9P3O5QjnKCgCGyx2PK4,5047
|
373
377
|
flwr/supernode/nodestate/nodestate_factory.py,sha256=UYTDCcwK_baHUmkzkJDxL0UEqvtTfOMlQRrROMCd0Xo,1430
|
374
378
|
flwr/supernode/runtime/__init__.py,sha256=JQdqd2EMTn-ORMeTvewYYh52ls0YKP68jrps1qioxu4,718
|
375
|
-
flwr/supernode/runtime/run_clientapp.py,sha256=
|
376
|
-
flwr/supernode/scheduler/__init__.py,sha256=nQLi5ROVCMz8ii_WsZn4MAqKHXI40Eb3tq5-9zZbmpg,850
|
377
|
-
flwr/supernode/scheduler/simple_clientapp_scheduler_plugin.py,sha256=nnNuKhelrAEGCnWZ3aAkqJrhPu7xlVQ-oO1Eih9shTU,2000
|
379
|
+
flwr/supernode/runtime/run_clientapp.py,sha256=efocWcTe2ufkhe4BzMGgxe0COq9aDyJ6HzXwQ8ZaIAU,10551
|
378
380
|
flwr/supernode/servicer/__init__.py,sha256=lucTzre5WPK7G1YLCfaqg3rbFWdNSb7ZTt-ca8gxdEo,717
|
379
381
|
flwr/supernode/servicer/clientappio/__init__.py,sha256=7Oy62Y_oijqF7Dxi6tpcUQyOpLc_QpIRZ83NvwmB0Yg,813
|
380
|
-
flwr/supernode/servicer/clientappio/clientappio_servicer.py,sha256=
|
382
|
+
flwr/supernode/servicer/clientappio/clientappio_servicer.py,sha256=Egp8V_Z3k9wWJUhXEXVWyf-g9iZ_lI6VcoKQTtG9uQg,10454
|
381
383
|
flwr/supernode/start_client_internal.py,sha256=iqJR8WbCW-8RQIRNwARZYoxhnlaAo5KnluCOEfRoLWM,21020
|
382
|
-
flwr_nightly-1.21.0.
|
383
|
-
flwr_nightly-1.21.0.
|
384
|
-
flwr_nightly-1.21.0.
|
385
|
-
flwr_nightly-1.21.0.
|
384
|
+
flwr_nightly-1.21.0.dev20250807.dist-info/METADATA,sha256=_2ScWM9obUF2NYThP8IqpB2AHIL84ChKeSWcS6ikVF4,15966
|
385
|
+
flwr_nightly-1.21.0.dev20250807.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
386
|
+
flwr_nightly-1.21.0.dev20250807.dist-info/entry_points.txt,sha256=jNpDXGBGgs21RqUxelF_jwGaxtqFwm-MQyfz-ZqSjrA,367
|
387
|
+
flwr_nightly-1.21.0.dev20250807.dist-info/RECORD,,
|
{flwr_nightly-1.21.0.dev20250805.dist-info → flwr_nightly-1.21.0.dev20250807.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|