flwr-nightly 1.20.0.dev20250617__py3-none-any.whl → 1.20.0.dev20250619__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.
@@ -21,9 +21,8 @@ import time
21
21
  from collections.abc import Iterator
22
22
  from contextlib import contextmanager
23
23
  from logging import INFO, WARN
24
- from os import urandom
25
24
  from pathlib import Path
26
- from typing import Callable, Optional, Union, cast
25
+ from typing import Callable, Optional, Union
27
26
 
28
27
  import grpc
29
28
  from cryptography.hazmat.primitives.asymmetric import ec
@@ -39,7 +38,6 @@ from flwr.common.constant import (
39
38
  CLIENTAPPIO_API_DEFAULT_SERVER_ADDRESS,
40
39
  ISOLATION_MODE_SUBPROCESS,
41
40
  MAX_RETRY_DELAY,
42
- RUN_ID_NUM_BYTES,
43
41
  SERVER_OCTET,
44
42
  TRANSPORT_TYPE_GRPC_ADAPTER,
45
43
  TRANSPORT_TYPE_GRPC_RERE,
@@ -47,15 +45,17 @@ from flwr.common.constant import (
47
45
  TRANSPORT_TYPES,
48
46
  )
49
47
  from flwr.common.exit import ExitCode, flwr_exit
48
+ from flwr.common.exit_handlers import register_exit_handlers
50
49
  from flwr.common.grpc import generic_create_grpc_server
51
50
  from flwr.common.logger import log
52
51
  from flwr.common.retry_invoker import RetryInvoker, RetryState, exponential
52
+ from flwr.common.telemetry import EventType
53
53
  from flwr.common.typing import Fab, Run, RunNotRunningException, UserConfig
54
54
  from flwr.proto.clientappio_pb2_grpc import add_ClientAppIoServicer_to_server
55
55
  from flwr.supercore.ffs import Ffs, FfsFactory
56
56
  from flwr.supercore.object_store import ObjectStore, ObjectStoreFactory
57
57
  from flwr.supernode.nodestate import NodeState, NodeStateFactory
58
- from flwr.supernode.servicer.clientappio import ClientAppInputs, ClientAppIoServicer
58
+ from flwr.supernode.servicer.clientappio import ClientAppIoServicer
59
59
 
60
60
  DEFAULT_FFS_DIR = get_flwr_dir() / "supernode" / "ffs"
61
61
 
@@ -132,16 +132,27 @@ def start_client_internal(
132
132
  if insecure is None:
133
133
  insecure = root_certificates is None
134
134
 
135
- _clientappio_grpc_server, clientappio_servicer = run_clientappio_api_grpc(
136
- address=clientappio_api_address,
137
- certificates=None,
138
- )
139
-
140
135
  # Initialize factories
141
136
  state_factory = NodeStateFactory()
142
137
  ffs_factory = FfsFactory(get_flwr_dir(flwr_path) / "supernode" / "ffs") # type: ignore
143
138
  object_store_factory = ObjectStoreFactory()
144
139
 
140
+ # Launch ClientAppIo API server
141
+ clientappio_server = run_clientappio_api_grpc(
142
+ address=clientappio_api_address,
143
+ state_factory=state_factory,
144
+ ffs_factory=ffs_factory,
145
+ objectstore_factory=object_store_factory,
146
+ certificates=None,
147
+ )
148
+
149
+ # Register handlers for graceful shutdown
150
+ register_exit_handlers(
151
+ event_type=EventType.RUN_SUPERNODE_LEAVE,
152
+ exit_message="SuperNode terminated gracefully.",
153
+ grpc_servers=[clientappio_server],
154
+ )
155
+
145
156
  # Initialize NodeState, Ffs, and ObjectStore
146
157
  state = state_factory.state()
147
158
  ffs = ffs_factory.ffs()
@@ -178,94 +189,39 @@ def start_client_internal(
178
189
  get_fab=get_fab,
179
190
  )
180
191
 
181
- if run_id is None:
182
- time.sleep(3) # Wait for 3s before asking again
183
- continue
184
-
185
- try:
186
- # Retrieve message, context, run and fab for this run
187
- message = state.get_messages(run_ids=[run_id], is_reply=False)[0]
188
- context = cast(Context, state.get_context(run_id))
189
- run = cast(Run, state.get_run(run_id))
190
- fab = Fab(run.fab_hash, ffs.get(run.fab_hash)[0]) # type: ignore
191
-
192
- # Two isolation modes:
193
- # 1. `subprocess`: SuperNode is starting the ClientApp
194
- # process as a subprocess.
195
- # 2. `process`: ClientApp process gets started separately
196
- # (via `flwr-clientapp`), for example, in a separate
197
- # Docker container.
198
-
199
- # Generate SuperNode token
200
- token = int.from_bytes(urandom(RUN_ID_NUM_BYTES), "little")
201
-
202
- # Mode 1: SuperNode starts ClientApp as subprocess
203
- start_subprocess = isolation == ISOLATION_MODE_SUBPROCESS
204
-
205
- # Share Message and Context with servicer
206
- clientappio_servicer.set_inputs(
207
- clientapp_input=ClientAppInputs(
208
- message=message,
209
- context=context,
210
- run=run,
211
- fab=fab,
212
- token=token,
213
- ),
214
- token_returned=start_subprocess,
192
+ # Two isolation modes:
193
+ # 1. `subprocess`: SuperNode is starting the ClientApp
194
+ # process as a subprocess.
195
+ # 2. `process`: ClientApp process gets started separately
196
+ # (via `flwr-clientapp`), for example, in a separate
197
+ # Docker container.
198
+
199
+ # Mode 1: SuperNode starts ClientApp as subprocess
200
+ start_subprocess = isolation == ISOLATION_MODE_SUBPROCESS
201
+
202
+ if start_subprocess and run_id is not None:
203
+ _octet, _colon, _port = clientappio_api_address.rpartition(":")
204
+ io_address = (
205
+ f"{CLIENT_OCTET}:{_port}"
206
+ if _octet == SERVER_OCTET
207
+ else clientappio_api_address
215
208
  )
209
+ # Start ClientApp subprocess
210
+ command = [
211
+ "flwr-clientapp",
212
+ "--clientappio-api-address",
213
+ io_address,
214
+ "--parent-pid",
215
+ str(os.getpid()),
216
+ "--insecure",
217
+ "--run-once",
218
+ ]
219
+ subprocess.run(command, check=False)
216
220
 
217
- if start_subprocess:
218
- _octet, _colon, _port = clientappio_api_address.rpartition(":")
219
- io_address = (
220
- f"{CLIENT_OCTET}:{_port}"
221
- if _octet == SERVER_OCTET
222
- else clientappio_api_address
223
- )
224
- # Start ClientApp subprocess
225
- command = [
226
- "flwr-clientapp",
227
- "--clientappio-api-address",
228
- io_address,
229
- "--token",
230
- str(token),
231
- "--parent-pid",
232
- str(os.getpid()),
233
- "--insecure",
234
- ]
235
- subprocess.run(command, check=False)
236
- else:
237
- # Wait for output to become available
238
- while not clientappio_servicer.has_outputs():
239
- time.sleep(0.1)
240
-
241
- outputs = clientappio_servicer.get_outputs()
242
- reply_message, context = outputs.message, outputs.context
243
-
244
- # Update context in the state
245
- state.store_context(context)
246
-
247
- # Send
248
- send(reply_message)
249
-
250
- # Delete messages from the state
251
- state.delete_messages(
252
- message_ids=[
253
- message.metadata.message_id,
254
- message.metadata.reply_to_message_id,
255
- ]
256
- )
221
+ _push_messages(state=state, send=send)
257
222
 
258
- log(INFO, "Sent reply")
259
-
260
- except RunNotRunningException:
261
- log(INFO, "")
262
- log(
263
- INFO,
264
- "SuperNode aborted sending the reply message. "
265
- "Run ID %s is not in `RUNNING` status.",
266
- run_id,
267
- )
268
- log(INFO, "")
223
+ # Sleep for 3 seconds before the next iteration
224
+ time.sleep(3)
269
225
 
270
226
 
271
227
  def _pull_and_store_message( # pylint: disable=too-many-positional-arguments
@@ -353,6 +309,53 @@ def _pull_and_store_message( # pylint: disable=too-many-positional-arguments
353
309
  return run_id
354
310
 
355
311
 
312
+ def _push_messages(
313
+ state: NodeState,
314
+ send: Callable[[Message], None],
315
+ ) -> None:
316
+ """Push reply messages to the SuperLink."""
317
+ # Get messages to send
318
+ reply_messages = state.get_messages(is_reply=True)
319
+
320
+ for message in reply_messages:
321
+ # Log message sending
322
+ log(INFO, "")
323
+ if message.metadata.group_id:
324
+ log(
325
+ INFO,
326
+ "[RUN %s, ROUND %s]",
327
+ message.metadata.run_id,
328
+ message.metadata.group_id,
329
+ )
330
+ else:
331
+ log(INFO, "[RUN %s]", message.metadata.run_id)
332
+ log(
333
+ INFO,
334
+ "Sending: %s message",
335
+ message.metadata.message_type,
336
+ )
337
+
338
+ # Send the message
339
+ try:
340
+ send(message)
341
+ log(INFO, "Sent successfully")
342
+ except RunNotRunningException:
343
+ log(
344
+ INFO,
345
+ "Run ID %s is not in `RUNNING` status. Ignoring reply message %s.",
346
+ message.metadata.run_id,
347
+ message.metadata.message_id,
348
+ )
349
+ finally:
350
+ # Delete the message from the state
351
+ state.delete_messages(
352
+ message_ids=[
353
+ message.metadata.message_id,
354
+ message.metadata.reply_to_message_id,
355
+ ]
356
+ )
357
+
358
+
356
359
  @contextmanager
357
360
  def _init_connection( # pylint: disable=too-many-positional-arguments
358
361
  transport: str,
@@ -472,10 +475,17 @@ def _make_fleet_connection_retry_invoker(
472
475
 
473
476
  def run_clientappio_api_grpc(
474
477
  address: str,
478
+ state_factory: NodeStateFactory,
479
+ ffs_factory: FfsFactory,
480
+ objectstore_factory: ObjectStoreFactory,
475
481
  certificates: Optional[tuple[bytes, bytes, bytes]],
476
- ) -> tuple[grpc.Server, ClientAppIoServicer]:
482
+ ) -> grpc.Server:
477
483
  """Run ClientAppIo API gRPC server."""
478
- clientappio_servicer: grpc.Server = ClientAppIoServicer()
484
+ clientappio_servicer: grpc.Server = ClientAppIoServicer(
485
+ state_factory=state_factory,
486
+ ffs_factory=ffs_factory,
487
+ objectstore_factory=objectstore_factory,
488
+ )
479
489
  clientappio_add_servicer_to_server_fn = add_ClientAppIoServicer_to_server
480
490
  clientappio_grpc_server = generic_create_grpc_server(
481
491
  servicer_and_add_fn=(
@@ -488,4 +498,4 @@ def run_clientappio_api_grpc(
488
498
  )
489
499
  log(INFO, "Starting Flower ClientAppIo gRPC server on %s", address)
490
500
  clientappio_grpc_server.start()
491
- return clientappio_grpc_server, clientappio_servicer
501
+ return clientappio_grpc_server
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr-nightly
3
- Version: 1.20.0.dev20250617
3
+ Version: 1.20.0.dev20250619
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
@@ -6,7 +6,7 @@ flwr/cli/__init__.py,sha256=EfMGmHoobET6P2blBt_eOByXL8299MgFfB7XNdaPQ6I,720
6
6
  flwr/cli/app.py,sha256=AKCP45Dkbpvdil_4Ir9S93L3HP3iUOnHmcZjscoM8uU,1856
7
7
  flwr/cli/auth_plugin/__init__.py,sha256=FyaoqPzcxlBTFfJ2sBRC5USwQLmAhFr5KuBwfMO4bmo,1052
8
8
  flwr/cli/auth_plugin/oidc_cli_plugin.py,sha256=gIhW6Jg9QAo-jL43LYPpw_kn7pdUZZae0s0H8dEgjLM,5384
9
- flwr/cli/build.py,sha256=bzvXbA0MdNMni3uu8KUl32y3VOTJpsUToxNQl_0qE6U,6967
9
+ flwr/cli/build.py,sha256=7OrcTqrjJd-iVq-MCtCIBCfvzi1JoqwUxeZDGKDKu6I,7265
10
10
  flwr/cli/cli_user_auth_interceptor.py,sha256=-JqDXpeZNQVwoSG7hMKsiS5qY5k5oklNSlQOVpM0-aY,3126
11
11
  flwr/cli/config_utils.py,sha256=IAVn2uWTXpN72YYt7raLtwp8ziwZugUKSURpc471VzU,9123
12
12
  flwr/cli/constant.py,sha256=g7Ad7o3DJDkJNrWS0T3SSJETWSTkkVJWGpLM8zlbpcY,1289
@@ -84,7 +84,7 @@ flwr/client/grpc_adapter_client/__init__.py,sha256=RQWP5mFPROLHKgombiRvPXVWSoVrQ
84
84
  flwr/client/grpc_adapter_client/connection.py,sha256=aj5tTYyE8z2hQLXPPydsJiz8gBDIWLUhfWvqYkAL1L4,3966
85
85
  flwr/client/grpc_rere_client/__init__.py,sha256=i7iS0Lt8B7q0E2L72e4F_YrKm6ClRKnd71PNA6PW2O0,752
86
86
  flwr/client/grpc_rere_client/client_interceptor.py,sha256=zFaVHw6AxeNO-7eCKKb-RxrPa7zbM5Z-2-1Efc4adQY,2451
87
- flwr/client/grpc_rere_client/connection.py,sha256=dyRBkTVUNhlMmLaoJUz9U4lWnAb7QjYRmGfOzaE0CbA,14402
87
+ flwr/client/grpc_rere_client/connection.py,sha256=5XNwDiac3YEXjyosSmiGz3lJyGNzA8I1I-ft4z08uIw,13619
88
88
  flwr/client/grpc_rere_client/grpc_adapter.py,sha256=dLGB5GriszAmtgvuFGuz_F7rIwpzLfDxhJ7T3Un-Ce0,6694
89
89
  flwr/client/message_handler/__init__.py,sha256=0lyljDVqre3WljiZbPcwCCf8GiIaSVI_yo_ylEyPwSE,719
90
90
  flwr/client/message_handler/message_handler.py,sha256=X9SXX6et97Lw9_DGD93HKsEBGNjXClcFgc_5aLK0oiU,6541
@@ -98,7 +98,7 @@ flwr/client/mod/secure_aggregation/secaggplus_mod.py,sha256=aKqjZCrikF73y3E-7h40
98
98
  flwr/client/mod/utils.py,sha256=FUgD2TfcWqSeF6jUKZ4i6Ke56U4Nrv85AeVb93s6R9g,1201
99
99
  flwr/client/numpy_client.py,sha256=Qq6ghsIAop2slKqAfgiI5NiHJ4LIxGmrik3Ror4_XVc,9581
100
100
  flwr/client/rest_client/__init__.py,sha256=MBiuK62hj439m9rtwSwI184Hth6Tt5GbmpNMyl3zkZY,735
101
- flwr/client/rest_client/connection.py,sha256=yxWuuh9A7CVzHDoAcBOQOUmCoT0kXSTGZ8zyD8YZGuo,17033
101
+ flwr/client/rest_client/connection.py,sha256=hp-bVcqG0Ul4OmITxcqEHOsGtJuyNevndP-B8trwlns,16270
102
102
  flwr/client/run_info_store.py,sha256=MaJ3UQ-07hWtK67wnWu0zR29jrk0fsfgJX506dvEOfE,4042
103
103
  flwr/client/typing.py,sha256=Jw3rawDzI_-ZDcRmEQcs5gZModY7oeQlEeltYsdOhlU,1048
104
104
  flwr/clientapp/__init__.py,sha256=zGW4z49Ojzoi1hDiRC7kyhLjijUilc6fqHhtM_ATRVA,719
@@ -108,7 +108,7 @@ flwr/common/args.py,sha256=-aX_jVnSaDrJR2KZ8Wq0Y3dQHII4R4MJtJOIXzVUA0c,5417
108
108
  flwr/common/auth_plugin/__init__.py,sha256=3rzPkVLn9WyB5n7HLk1XGDw3SLCqRWAU1_CnglcWPfw,970
109
109
  flwr/common/auth_plugin/auth_plugin.py,sha256=kXx5o39vJchaPv28sK9qO6H_UXSWym6zRBbCa7sUwtQ,4825
110
110
  flwr/common/config.py,sha256=glcZDjco-amw1YfQcYTFJ4S1pt9APoexT-mf1QscuHs,13960
111
- flwr/common/constant.py,sha256=yCJk_m7sJiMz8fTmOMWLBzltGRVUjFmt9NoYJt3Fz-w,8150
111
+ flwr/common/constant.py,sha256=HO1y0YYHZUCIDt5QQnvCTSYVeKhkIJve0RbQ3nW7jHU,8191
112
112
  flwr/common/context.py,sha256=Be8obQR_OvEDy1OmshuUKxGRQ7Qx89mf5F4xlhkR10s,2407
113
113
  flwr/common/date.py,sha256=1ZT2cRSpC2DJqprOVTLXYCR_O2_OZR0zXO_brJ3LqWc,1554
114
114
  flwr/common/differential_privacy.py,sha256=FdlpdpPl_H_2HJa8CQM1iCUGBBQ5Dc8CzxmHERM-EoE,6148
@@ -164,10 +164,10 @@ 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/clientappio_pb2.py,sha256=aroQDv0D2GquQ5Ujqml7n7l6ObZoXqMvDa0XVO-_8Cc,3703
168
- flwr/proto/clientappio_pb2.pyi,sha256=iL6pOPmnot5wP3aXGiDfiUpp-eJIkysyju0ebPehS8Y,5670
169
- flwr/proto/clientappio_pb2_grpc.py,sha256=G35GhZ3iEOL8N6tu7Kn_ip4QUx4O2HveXngHAuU2YEM,6112
170
- flwr/proto/clientappio_pb2_grpc.pyi,sha256=cybktpMPaIMwrItd8hQaQDnRv4zNu_wgRddSqR9REyI,1822
167
+ flwr/proto/clientappio_pb2.py,sha256=jkTJnHtHOylYTV0pxfFAaA0CtIPGrwGCcVgCg6i0LhU,4337
168
+ flwr/proto/clientappio_pb2.pyi,sha256=qrH9KeJ8YXRa9iQYlKV8-kwXrmxGr6AJp5f7Yx88CEg,6843
169
+ flwr/proto/clientappio_pb2_grpc.py,sha256=vstXed6-uSOqM0qbaZBwYIgHHs7GH6oKqOq0TniboOk,8035
170
+ flwr/proto/clientappio_pb2_grpc.pyi,sha256=828mbHoq0SxZ3NRmGqiZmpb4KtLPi71piQBMF_2EZxk,2399
171
171
  flwr/proto/error_pb2.py,sha256=PQVWrfjVPo88ql_KgV9nCxyQNCcV9PVfmcw7sOzTMro,1084
172
172
  flwr/proto/error_pb2.pyi,sha256=ZNH4HhJTU_KfMXlyCeg8FwU-fcUYxTqEmoJPtWtHikc,734
173
173
  flwr/proto/error_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
@@ -335,31 +335,32 @@ flwr/supercore/object_store/__init__.py,sha256=cdfPAmjINY6iOp8oI_LdcVh2simg469Mk
335
335
  flwr/supercore/object_store/in_memory_object_store.py,sha256=oflJcOuVNgx9A-B2da4VHDb1qj_Jub9wKFOrUBgtz_U,9630
336
336
  flwr/supercore/object_store/object_store.py,sha256=VlZz-yzoWZtITbnYD8vwLZbFosv7vgr1XVNzByObeY0,5853
337
337
  flwr/supercore/object_store/object_store_factory.py,sha256=QVwE2ywi7vsj2iKfvWWnNw3N_I7Rz91NUt2RpcbJ7iM,1527
338
+ flwr/supercore/utils.py,sha256=ebuHMbeA8eXisX0oMPqBK3hk7uVnIE_yiqWVz8YbkpQ,1324
338
339
  flwr/superexec/__init__.py,sha256=YFqER0IJc1XEWfsX6AxZ9LSRq0sawPYrNYki-brvTIc,715
339
340
  flwr/superexec/app.py,sha256=U2jjOHb2LGWoU7vrl9_czTzre9O2mPxu3CPGUZ86sK4,1465
340
341
  flwr/superexec/deployment.py,sha256=cFxhFom-0zv93HLNjNcUdBy3Sf6JwshRoXPQtcZunF0,6797
341
342
  flwr/superexec/exec_event_log_interceptor.py,sha256=7aBjZ4lkpOIyWut0s394OpMePr16g_Te594s-9aDM9Q,5774
342
343
  flwr/superexec/exec_grpc.py,sha256=lpc_rgRjtHHMzcdOzznl12D4vT22JqV5acdy45YDb0k,3498
343
- flwr/superexec/exec_servicer.py,sha256=U2-sOV0C87zvOaWZ0sQcCtnh8ENRWs6bgJhpH1srcEs,12235
344
+ flwr/superexec/exec_servicer.py,sha256=c0nwdFBiS6CbKrRA7ffOpsgASOLeaRV_ICwxDfxNGAg,12498
344
345
  flwr/superexec/exec_user_auth_interceptor.py,sha256=HpGHTcDKzB7XUiQHXgntNVFYL-VfP9Wj5tEVc04VOOw,5820
345
346
  flwr/superexec/executor.py,sha256=LaErHRJvNggjWV6FI6eajgKfnwOvSv2UqzFH253yDro,3265
346
347
  flwr/superexec/simulation.py,sha256=62rSLcS-1wnMsMsafSQuIDLs5ZS6Ail1spkZ-alNNTg,4156
347
348
  flwr/superlink/__init__.py,sha256=GNSuJ4-N6Z8wun2iZNlXqENt5beUyzC0Gi_tN396bbM,707
348
349
  flwr/supernode/__init__.py,sha256=KgeCaVvXWrU3rptNR1y0oBp4YtXbAcrnCcJAiOoWkI4,707
349
350
  flwr/supernode/cli/__init__.py,sha256=JuEMr0-s9zv-PEWKuLB9tj1ocNfroSyNJ-oyv7ati9A,887
350
- flwr/supernode/cli/flower_supernode.py,sha256=ly2AQhbla2sufDaMsENaEALDEd0a4CS4D0eUrUOkHzY,8778
351
- flwr/supernode/cli/flwr_clientapp.py,sha256=KfVUO20ZMnUDSGZTJ9I1KkMawFsRV6kdRUmGIRNbg_8,2812
351
+ flwr/supernode/cli/flower_supernode.py,sha256=fAkk9zGhoP8Sv05EkdXRiCtirTAzWkSZBqRoaDdgflk,8529
352
+ flwr/supernode/cli/flwr_clientapp.py,sha256=zaro6BoUEmfKIPQYuyJ9oR4rrHSS3bufhEqxcTo5VZU,3153
352
353
  flwr/supernode/nodestate/__init__.py,sha256=CyLLObbmmVgfRO88UCM0VMait1dL57mUauUDfuSHsbU,976
353
354
  flwr/supernode/nodestate/in_memory_nodestate.py,sha256=LF3AbaW0bcZHY5yKWwUJSU2RZbMynt-YjFysGqvTOQY,7338
354
355
  flwr/supernode/nodestate/nodestate.py,sha256=kkGFxYnLIwT4-UmlPnf6HvAUpPey2urUNrweGybAIY4,6398
355
356
  flwr/supernode/nodestate/nodestate_factory.py,sha256=UYTDCcwK_baHUmkzkJDxL0UEqvtTfOMlQRrROMCd0Xo,1430
356
357
  flwr/supernode/runtime/__init__.py,sha256=JQdqd2EMTn-ORMeTvewYYh52ls0YKP68jrps1qioxu4,718
357
- flwr/supernode/runtime/run_clientapp.py,sha256=cvWSby7u31u97QapWHxJM-Wer6F1k6mbbD-d1gxwxZA,7962
358
+ flwr/supernode/runtime/run_clientapp.py,sha256=wDOs0SbTQJxcm4z63qK4mHomKXjyW-VMsUjD-mXD5X4,8248
358
359
  flwr/supernode/servicer/__init__.py,sha256=lucTzre5WPK7G1YLCfaqg3rbFWdNSb7ZTt-ca8gxdEo,717
359
- flwr/supernode/servicer/clientappio/__init__.py,sha256=vJyOjO2FXZ2URbnthmdsgs6948wbYfdq1L1V8Um-Lr8,895
360
- flwr/supernode/servicer/clientappio/clientappio_servicer.py,sha256=LmzkxtNQBn5vVrHc0Bhq2WqaK6-LM2v4kfLBN0PiNNM,8522
361
- flwr/supernode/start_client_internal.py,sha256=zH6Pvi1cW-Np9F3_fvZR9ASsr4jeCoGSeC6EnAKOlig,18446
362
- flwr_nightly-1.20.0.dev20250617.dist-info/METADATA,sha256=EAq6pSZc7jgWG0R8DJDg23VkA3W6qWagqmUbi_HilKU,15910
363
- flwr_nightly-1.20.0.dev20250617.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
364
- flwr_nightly-1.20.0.dev20250617.dist-info/entry_points.txt,sha256=jNpDXGBGgs21RqUxelF_jwGaxtqFwm-MQyfz-ZqSjrA,367
365
- flwr_nightly-1.20.0.dev20250617.dist-info/RECORD,,
360
+ flwr/supernode/servicer/clientappio/__init__.py,sha256=7Oy62Y_oijqF7Dxi6tpcUQyOpLc_QpIRZ83NvwmB0Yg,813
361
+ flwr/supernode/servicer/clientappio/clientappio_servicer.py,sha256=d3GdIabycUoDBDL_eVlt513knGSjQW3-9lG6Cw4QEk4,5719
362
+ flwr/supernode/start_client_internal.py,sha256=DAXuReZ1FCXt9Y1KbM0p-dI50ROWPEJXzfKrl14OE6k,18233
363
+ flwr_nightly-1.20.0.dev20250619.dist-info/METADATA,sha256=jui4QpPMXqhY6NHr7ILSXqQLGJSa4QzLuSiS-mWM398,15910
364
+ flwr_nightly-1.20.0.dev20250619.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
365
+ flwr_nightly-1.20.0.dev20250619.dist-info/entry_points.txt,sha256=jNpDXGBGgs21RqUxelF_jwGaxtqFwm-MQyfz-ZqSjrA,367
366
+ flwr_nightly-1.20.0.dev20250619.dist-info/RECORD,,