flwr-nightly 1.21.0.dev20250805__py3-none-any.whl → 1.21.0.dev20250806__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 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['_PUSHAPPMESSAGESREQUEST']._serialized_start=109
28
- _globals['_PUSHAPPMESSAGESREQUEST']._serialized_end=262
29
- _globals['_PUSHAPPMESSAGESRESPONSE']._serialized_start=264
30
- _globals['_PUSHAPPMESSAGESRESPONSE']._serialized_end=335
31
- _globals['_PULLAPPMESSAGESREQUEST']._serialized_start=337
32
- _globals['_PULLAPPMESSAGESREQUEST']._serialized_end=413
33
- _globals['_PULLAPPMESSAGESRESPONSE']._serialized_start=415
34
- _globals['_PULLAPPMESSAGESRESPONSE']._serialized_end=538
35
- _globals['_PULLAPPINPUTSREQUEST']._serialized_start=540
36
- _globals['_PULLAPPINPUTSREQUEST']._serialized_end=577
37
- _globals['_PULLAPPINPUTSRESPONSE']._serialized_start=579
38
- _globals['_PULLAPPINPUTSRESPONSE']._serialized_end=700
39
- _globals['_PUSHAPPOUTPUTSREQUEST']._serialized_start=702
40
- _globals['_PUSHAPPOUTPUTSREQUEST']._serialized_end=794
41
- _globals['_PUSHAPPOUTPUTSRESPONSE']._serialized_start=796
42
- _globals['_PUSHAPPOUTPUTSRESPONSE']._serialized_end=820
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 PushAppMessagesRequest(google.protobuf.message.Message):
17
+ class ListAppsToLaunchRequest(google.protobuf.message.Message):
18
18
  """These messages are used by both ServerAppIo and ClientAppIo services
19
19
 
20
- PushAppMessages messages
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
@@ -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.proto\"%\n#GetRunIdsWithPendingMessagesRequest\"7\n$GetRunIdsWithPendingMessagesResponse\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(\t2\xaf\x07\n\x0b\x43lientAppIo\x12\x83\x01\n\x1cGetRunIdsWithPendingMessages\x12/.flwr.proto.GetRunIdsWithPendingMessagesRequest\x1a\x30.flwr.proto.GetRunIdsWithPendingMessagesResponse\"\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')
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['_GETRUNIDSWITHPENDINGMESSAGESREQUEST']._serialized_start=138
29
- _globals['_GETRUNIDSWITHPENDINGMESSAGESREQUEST']._serialized_end=175
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)
@@ -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.GetRunIdsWithPendingMessages = channel.unary_unary(
21
- '/flwr.proto.ClientAppIo/GetRunIdsWithPendingMessages',
22
- request_serializer=flwr_dot_proto_dot_clientappio__pb2.GetRunIdsWithPendingMessagesRequest.SerializeToString,
23
- response_deserializer=flwr_dot_proto_dot_clientappio__pb2.GetRunIdsWithPendingMessagesResponse.FromString,
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=flwr_dot_proto_dot_clientappio__pb2.RequestTokenRequest.SerializeToString,
28
- response_deserializer=flwr_dot_proto_dot_clientappio__pb2.RequestTokenResponse.FromString,
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 GetRunIdsWithPendingMessages(self, request, context):
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
- 'GetRunIdsWithPendingMessages': grpc.unary_unary_rpc_method_handler(
149
- servicer.GetRunIdsWithPendingMessages,
150
- request_deserializer=flwr_dot_proto_dot_clientappio__pb2.GetRunIdsWithPendingMessagesRequest.FromString,
151
- response_serializer=flwr_dot_proto_dot_clientappio__pb2.GetRunIdsWithPendingMessagesResponse.SerializeToString,
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=flwr_dot_proto_dot_clientappio__pb2.RequestTokenRequest.FromString,
156
- response_serializer=flwr_dot_proto_dot_clientappio__pb2.RequestTokenResponse.SerializeToString,
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 GetRunIdsWithPendingMessages(request,
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/GetRunIdsWithPendingMessages',
220
- flwr_dot_proto_dot_clientappio__pb2.GetRunIdsWithPendingMessagesRequest.SerializeToString,
221
- flwr_dot_proto_dot_clientappio__pb2.GetRunIdsWithPendingMessagesResponse.FromString,
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
- flwr_dot_proto_dot_clientappio__pb2.RequestTokenRequest.SerializeToString,
238
- flwr_dot_proto_dot_clientappio__pb2.RequestTokenResponse.FromString,
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
- GetRunIdsWithPendingMessages: grpc.UnaryUnaryMultiCallable[
15
- flwr.proto.clientappio_pb2.GetRunIdsWithPendingMessagesRequest,
16
- flwr.proto.clientappio_pb2.GetRunIdsWithPendingMessagesResponse]
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.clientappio_pb2.RequestTokenRequest,
21
- flwr.proto.clientappio_pb2.RequestTokenResponse]
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 GetRunIdsWithPendingMessages(self,
68
- request: flwr.proto.clientappio_pb2.GetRunIdsWithPendingMessagesRequest,
66
+ def ListAppsToLaunch(self,
67
+ request: flwr.proto.appio_pb2.ListAppsToLaunchRequest,
69
68
  context: grpc.ServicerContext,
70
- ) -> flwr.proto.clientappio_pb2.GetRunIdsWithPendingMessagesResponse:
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.clientappio_pb2.RequestTokenRequest,
75
+ request: flwr.proto.appio_pb2.RequestTokenRequest,
77
76
  context: grpc.ServicerContext,
78
- ) -> flwr.proto.clientappio_pb2.RequestTokenResponse:
77
+ ) -> flwr.proto.appio_pb2.RequestTokenResponse:
79
78
  """Request token"""
80
79
  pass
81
80
 
@@ -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\xb3\t\n\x0bServerAppIo\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')
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=1503
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(abc.ABC): # pylint: disable=R0904
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:
@@ -0,0 +1,22 @@
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 CoreState."""
16
+
17
+
18
+ from .corestate import CoreState
19
+
20
+ __all__ = [
21
+ "CoreState",
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
+ """
@@ -15,15 +15,16 @@
15
15
  """Abstract base class NodeState."""
16
16
 
17
17
 
18
- from abc import ABC, abstractmethod
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(ABC):
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: GetRunIdsWithPendingMessagesResponse = stub.GetRunIdsWithPendingMessages(
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 GetRunIdsWithPendingMessages(
83
+ def ListAppsToLaunch(
86
84
  self,
87
- request: GetRunIdsWithPendingMessagesRequest,
85
+ request: ListAppsToLaunchRequest,
88
86
  context: grpc.ServicerContext,
89
- ) -> GetRunIdsWithPendingMessagesResponse:
90
- """Get run IDs with pending messages."""
91
- log(DEBUG, "ClientAppIo.GetRunIdsWithPendingMessages")
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 GetRunIdsWithPendingMessagesResponse(run_ids=run_ids)
98
+ return ListAppsToLaunchResponse(run_ids=run_ids)
101
99
 
102
100
  def RequestToken(
103
101
  self, request: RequestTokenRequest, context: grpc.ServicerContext
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr-nightly
3
- Version: 1.21.0.dev20250805
3
+ Version: 1.21.0.dev20250806
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
@@ -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=3Mwzq1d__hYMfhCEkERZ6XwCpcd328zB6jg-WH4IX8o,3326
168
- flwr/proto/appio_pb2.pyi,sha256=PNPX6hu9J-pnVoFOULuQNjILR3xzdk0Q3cz10p2u2GU,6978
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=3b87t4_AFgeDopgpYhhOVBrdh1HG74W2HC-y0C0q_eY,3349
172
- flwr/proto/clientappio_pb2.pyi,sha256=gA-WU5lCYxhMciAUiCg__DrAzHPtytqRLyflpToWHqc,2033
173
- flwr/proto/clientappio_pb2_grpc.py,sha256=CrB1caDEuPxgjQxDEozLyApzNMqzD8z1pWg310xCTGU,17856
174
- flwr/proto/clientappio_pb2_grpc.pyi,sha256=FkS3ZcsU1iUuoS7ji84o8L5D9u-e5vsVR7O-ESqD5LI,4939
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=CeVRUlT3jn4xVaTVi2U9L5H7r7uc_U4DYZOZNxT5kI4,3575
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=Y4uz8M2JT5pg6ADobq5hDQyYFjFplRV53J2z8pdRqVk,24140
222
- flwr/proto/serverappio_pb2_grpc.pyi,sha256=8pFqwGZjBUzyg1hTY7LCbLiYmGL7hlffeS0jyCi7L20,6571
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=OuyuW_btDL-Nuon2aAcyXDapzwzZX4PrRWTjb0epoaI,26478
302
- flwr/server/superlink/linkstate/linkstate.py,sha256=JZHshn7NnUHr_hvHqO593YWwuCQVJm7InXor60DRcX0,13238
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=E699Ak0jMF3N7i1SIeFRutjorg51Fd7qBqaPX_gkWU0,43687
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=m0c05XQwRWwymOqbVYWDuDKRryIT3PxGhB8OM6YPyaM,18253
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
@@ -369,17 +371,17 @@ flwr/supernode/cli/flower_supernode.py,sha256=fAkk9zGhoP8Sv05EkdXRiCtirTAzWkSZBq
369
371
  flwr/supernode/cli/flwr_clientapp.py,sha256=zaro6BoUEmfKIPQYuyJ9oR4rrHSS3bufhEqxcTo5VZU,3153
370
372
  flwr/supernode/nodestate/__init__.py,sha256=CyLLObbmmVgfRO88UCM0VMait1dL57mUauUDfuSHsbU,976
371
373
  flwr/supernode/nodestate/in_memory_nodestate.py,sha256=LF3AbaW0bcZHY5yKWwUJSU2RZbMynt-YjFysGqvTOQY,7338
372
- flwr/supernode/nodestate/nodestate.py,sha256=kkGFxYnLIwT4-UmlPnf6HvAUpPey2urUNrweGybAIY4,6398
374
+ flwr/supernode/nodestate/nodestate.py,sha256=jCOewZyctecMxsM0-_-pQwef9P3O5QjnKCgCGyx2PK4,5047
373
375
  flwr/supernode/nodestate/nodestate_factory.py,sha256=UYTDCcwK_baHUmkzkJDxL0UEqvtTfOMlQRrROMCd0Xo,1430
374
376
  flwr/supernode/runtime/__init__.py,sha256=JQdqd2EMTn-ORMeTvewYYh52ls0YKP68jrps1qioxu4,718
375
- flwr/supernode/runtime/run_clientapp.py,sha256=0ysvN07xPDysFVViu2QyRR7BUI4Hv8ZcacmaADagvdQ,10701
377
+ flwr/supernode/runtime/run_clientapp.py,sha256=efocWcTe2ufkhe4BzMGgxe0COq9aDyJ6HzXwQ8ZaIAU,10551
376
378
  flwr/supernode/scheduler/__init__.py,sha256=nQLi5ROVCMz8ii_WsZn4MAqKHXI40Eb3tq5-9zZbmpg,850
377
379
  flwr/supernode/scheduler/simple_clientapp_scheduler_plugin.py,sha256=nnNuKhelrAEGCnWZ3aAkqJrhPu7xlVQ-oO1Eih9shTU,2000
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=ClPoKco7Tjj_cxRPhZlQSrOvcGa8sJwGs26LUNZnI3Y,10608
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.dev20250805.dist-info/METADATA,sha256=xg10fVg_5H2EM-cTHhx2YfrzC1s2mGqBpBhl8UcGUSI,15966
383
- flwr_nightly-1.21.0.dev20250805.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
384
- flwr_nightly-1.21.0.dev20250805.dist-info/entry_points.txt,sha256=jNpDXGBGgs21RqUxelF_jwGaxtqFwm-MQyfz-ZqSjrA,367
385
- flwr_nightly-1.21.0.dev20250805.dist-info/RECORD,,
384
+ flwr_nightly-1.21.0.dev20250806.dist-info/METADATA,sha256=Y6qSCklbNFCeLm17NenNYbX8me-uZz3aY8GZ4BxDv7U,15966
385
+ flwr_nightly-1.21.0.dev20250806.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
386
+ flwr_nightly-1.21.0.dev20250806.dist-info/entry_points.txt,sha256=jNpDXGBGgs21RqUxelF_jwGaxtqFwm-MQyfz-ZqSjrA,367
387
+ flwr_nightly-1.21.0.dev20250806.dist-info/RECORD,,