flwr-nightly 1.15.0.dev20250107__py3-none-any.whl → 1.15.0.dev20250109__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.
Files changed (27) hide show
  1. flwr/cli/cli_user_auth_interceptor.py +6 -2
  2. flwr/cli/login/login.py +11 -4
  3. flwr/cli/utils.py +4 -4
  4. flwr/client/grpc_rere_client/client_interceptor.py +6 -0
  5. flwr/client/grpc_rere_client/grpc_adapter.py +16 -0
  6. flwr/common/auth_plugin/auth_plugin.py +33 -23
  7. flwr/common/constant.py +2 -0
  8. flwr/common/typing.py +20 -0
  9. flwr/proto/exec_pb2.py +12 -24
  10. flwr/proto/exec_pb2.pyi +27 -54
  11. flwr/proto/fleet_pb2.py +40 -27
  12. flwr/proto/fleet_pb2.pyi +84 -0
  13. flwr/proto/fleet_pb2_grpc.py +66 -0
  14. flwr/proto/fleet_pb2_grpc.pyi +20 -0
  15. flwr/server/app.py +11 -13
  16. flwr/server/superlink/driver/serverappio_servicer.py +22 -8
  17. flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +16 -0
  18. flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +2 -1
  19. flwr/server/superlink/linkstate/in_memory_linkstate.py +26 -22
  20. flwr/server/superlink/linkstate/linkstate.py +10 -4
  21. flwr/server/superlink/linkstate/sqlite_linkstate.py +50 -29
  22. flwr/superexec/exec_servicer.py +23 -2
  23. {flwr_nightly-1.15.0.dev20250107.dist-info → flwr_nightly-1.15.0.dev20250109.dist-info}/METADATA +4 -4
  24. {flwr_nightly-1.15.0.dev20250107.dist-info → flwr_nightly-1.15.0.dev20250109.dist-info}/RECORD +27 -27
  25. {flwr_nightly-1.15.0.dev20250107.dist-info → flwr_nightly-1.15.0.dev20250109.dist-info}/LICENSE +0 -0
  26. {flwr_nightly-1.15.0.dev20250107.dist-info → flwr_nightly-1.15.0.dev20250109.dist-info}/WHEEL +0 -0
  27. {flwr_nightly-1.15.0.dev20250107.dist-info → flwr_nightly-1.15.0.dev20250109.dist-info}/entry_points.txt +0 -0
@@ -72,14 +72,14 @@ CREATE TABLE IF NOT EXISTS node(
72
72
 
73
73
  SQL_CREATE_TABLE_CREDENTIAL = """
74
74
  CREATE TABLE IF NOT EXISTS credential(
75
- private_key BLOB PRIMARY KEY,
76
- public_key BLOB
75
+ private_key BLOB PRIMARY KEY,
76
+ public_key BLOB
77
77
  );
78
78
  """
79
79
 
80
80
  SQL_CREATE_TABLE_PUBLIC_KEY = """
81
81
  CREATE TABLE IF NOT EXISTS public_key(
82
- public_key BLOB UNIQUE
82
+ public_key BLOB PRIMARY KEY
83
83
  );
84
84
  """
85
85
 
@@ -635,9 +635,7 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
635
635
 
636
636
  return {UUID(row["task_id"]) for row in rows}
637
637
 
638
- def create_node(
639
- self, ping_interval: float, public_key: Optional[bytes] = None
640
- ) -> int:
638
+ def create_node(self, ping_interval: float) -> int:
641
639
  """Create, store in the link state, and return `node_id`."""
642
640
  # Sample a random uint64 as node_id
643
641
  uint64_node_id = generate_rand_int_from_bytes(NODE_ID_NUM_BYTES)
@@ -645,13 +643,6 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
645
643
  # Convert the uint64 value to sint64 for SQLite
646
644
  sint64_node_id = convert_uint64_to_sint64(uint64_node_id)
647
645
 
648
- query = "SELECT node_id FROM node WHERE public_key = :public_key;"
649
- row = self.query(query, {"public_key": public_key})
650
-
651
- if len(row) > 0:
652
- log(ERROR, "Unexpected node registration failure.")
653
- return 0
654
-
655
646
  query = (
656
647
  "INSERT INTO node "
657
648
  "(node_id, online_until, ping_interval, public_key) "
@@ -665,7 +656,7 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
665
656
  sint64_node_id,
666
657
  time.time() + ping_interval,
667
658
  ping_interval,
668
- public_key,
659
+ b"", # Initialize with an empty public key
669
660
  ),
670
661
  )
671
662
  except sqlite3.IntegrityError:
@@ -675,7 +666,7 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
675
666
  # Note: we need to return the uint64 value of the node_id
676
667
  return uint64_node_id
677
668
 
678
- def delete_node(self, node_id: int, public_key: Optional[bytes] = None) -> None:
669
+ def delete_node(self, node_id: int) -> None:
679
670
  """Delete a node."""
680
671
  # Convert the uint64 value to sint64 for SQLite
681
672
  sint64_node_id = convert_uint64_to_sint64(node_id)
@@ -683,10 +674,6 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
683
674
  query = "DELETE FROM node WHERE node_id = ?"
684
675
  params = (sint64_node_id,)
685
676
 
686
- if public_key is not None:
687
- query += " AND public_key = ?"
688
- params += (public_key,) # type: ignore
689
-
690
677
  if self.conn is None:
691
678
  raise AttributeError("LinkState is not initialized.")
692
679
 
@@ -694,7 +681,7 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
694
681
  with self.conn:
695
682
  rows = self.conn.execute(query, params)
696
683
  if rows.rowcount < 1:
697
- raise ValueError("Public key or node_id not found")
684
+ raise ValueError(f"Node {node_id} not found")
698
685
  except KeyError as exc:
699
686
  log(ERROR, {"query": query, "data": params, "exception": exc})
700
687
 
@@ -722,6 +709,41 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
722
709
  result: set[int] = {convert_sint64_to_uint64(row["node_id"]) for row in rows}
723
710
  return result
724
711
 
712
+ def set_node_public_key(self, node_id: int, public_key: bytes) -> None:
713
+ """Set `public_key` for the specified `node_id`."""
714
+ # Convert the uint64 value to sint64 for SQLite
715
+ sint64_node_id = convert_uint64_to_sint64(node_id)
716
+
717
+ # Check if the node exists in the `node` table
718
+ query = "SELECT 1 FROM node WHERE node_id = ?"
719
+ if not self.query(query, (sint64_node_id,)):
720
+ raise ValueError(f"Node {node_id} not found")
721
+
722
+ # Check if the public key is already in use in the `node` table
723
+ query = "SELECT 1 FROM node WHERE public_key = ?"
724
+ if self.query(query, (public_key,)):
725
+ raise ValueError("Public key already in use")
726
+
727
+ # Update the `node` table to set the public key for the given node ID
728
+ query = "UPDATE node SET public_key = ? WHERE node_id = ?"
729
+ self.query(query, (public_key, sint64_node_id))
730
+
731
+ def get_node_public_key(self, node_id: int) -> Optional[bytes]:
732
+ """Get `public_key` for the specified `node_id`."""
733
+ # Convert the uint64 value to sint64 for SQLite
734
+ sint64_node_id = convert_uint64_to_sint64(node_id)
735
+
736
+ # Query the public key for the given node_id
737
+ query = "SELECT public_key FROM node WHERE node_id = ?"
738
+ rows = self.query(query, (sint64_node_id,))
739
+
740
+ # If no result is found, return None
741
+ if not rows:
742
+ raise ValueError(f"Node {node_id} not found")
743
+
744
+ # Return the public key if it is not empty, otherwise return None
745
+ return rows[0]["public_key"] or None
746
+
725
747
  def get_node_id(self, node_public_key: bytes) -> Optional[int]:
726
748
  """Retrieve stored `node_id` filtered by `node_public_keys`."""
727
749
  query = "SELECT node_id FROM node WHERE public_key = :public_key;"
@@ -982,17 +1004,16 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
982
1004
  """Acknowledge a ping received from a node, serving as a heartbeat."""
983
1005
  sint64_node_id = convert_uint64_to_sint64(node_id)
984
1006
 
985
- # Update `online_until` and `ping_interval` for the given `node_id`
986
- query = "UPDATE node SET online_until = ?, ping_interval = ? WHERE node_id = ?;"
987
- try:
988
- self.query(
989
- query, (time.time() + ping_interval, ping_interval, sint64_node_id)
990
- )
991
- return True
992
- except sqlite3.IntegrityError:
993
- log(ERROR, "`node_id` does not exist.")
1007
+ # Check if the node exists in the `node` table
1008
+ query = "SELECT 1 FROM node WHERE node_id = ?"
1009
+ if not self.query(query, (sint64_node_id,)):
994
1010
  return False
995
1011
 
1012
+ # Update `online_until` and `ping_interval` for the given `node_id`
1013
+ query = "UPDATE node SET online_until = ?, ping_interval = ? WHERE node_id = ?"
1014
+ self.query(query, (time.time() + ping_interval, ping_interval, sint64_node_id))
1015
+ return True
1016
+
996
1017
  def get_serverapp_context(self, run_id: int) -> Optional[Context]:
997
1018
  """Get the context for the specified `run_id`."""
998
1019
  # Retrieve context if any
@@ -181,8 +181,20 @@ class ExecServicer(exec_pb2_grpc.ExecServicer):
181
181
  "ExecServicer initialized without user authentication",
182
182
  )
183
183
  raise grpc.RpcError() # This line is unreachable
184
+
185
+ # Get login details
186
+ details = self.auth_plugin.get_login_details()
187
+
188
+ # Return empty response if details is None
189
+ if details is None:
190
+ return GetLoginDetailsResponse()
191
+
184
192
  return GetLoginDetailsResponse(
185
- login_details=self.auth_plugin.get_login_details()
193
+ auth_type=details.auth_type,
194
+ device_code=details.device_code,
195
+ verification_uri_complete=details.verification_uri_complete,
196
+ expires_in=details.expires_in,
197
+ interval=details.interval,
186
198
  )
187
199
 
188
200
  def GetAuthTokens(
@@ -196,8 +208,17 @@ class ExecServicer(exec_pb2_grpc.ExecServicer):
196
208
  "ExecServicer initialized without user authentication",
197
209
  )
198
210
  raise grpc.RpcError() # This line is unreachable
211
+
212
+ # Get auth tokens
213
+ credentials = self.auth_plugin.get_auth_tokens(request.device_code)
214
+
215
+ # Return empty response if credentials is None
216
+ if credentials is None:
217
+ return GetAuthTokensResponse()
218
+
199
219
  return GetAuthTokensResponse(
200
- auth_tokens=self.auth_plugin.get_auth_tokens(dict(request.auth_details))
220
+ access_token=credentials.access_token,
221
+ refresh_token=credentials.refresh_token,
201
222
  )
202
223
 
203
224
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.15.0.dev20250107
3
+ Version: 1.15.0.dev20250109
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -43,11 +43,11 @@ Requires-Dist: pyyaml (>=6.0.2,<7.0.0)
43
43
  Requires-Dist: ray (==2.10.0) ; (python_version >= "3.9" and python_version < "3.12") and (extra == "simulation")
44
44
  Requires-Dist: requests (>=2.31.0,<3.0.0)
45
45
  Requires-Dist: rich (>=13.5.0,<14.0.0)
46
- Requires-Dist: starlette (>=0.31.0,<0.32.0) ; extra == "rest"
46
+ Requires-Dist: starlette (>=0.45.2,<0.46.0) ; extra == "rest"
47
47
  Requires-Dist: tomli (>=2.0.1,<3.0.0)
48
48
  Requires-Dist: tomli-w (>=1.0.0,<2.0.0)
49
49
  Requires-Dist: typer (>=0.12.5,<0.13.0)
50
- Requires-Dist: uvicorn[standard] (>=0.23.0,<0.24.0) ; extra == "rest"
50
+ Requires-Dist: uvicorn[standard] (>=0.34.0,<0.35.0) ; extra == "rest"
51
51
  Project-URL: Documentation, https://flower.ai
52
52
  Project-URL: Repository, https://github.com/adap/flower
53
53
  Description-Content-Type: text/markdown
@@ -88,7 +88,7 @@ design of Flower is based on a few guiding principles:
88
88
 
89
89
  - **Framework-agnostic**: Different machine learning frameworks have different
90
90
  strengths. Flower can be used with any machine learning framework, for
91
- example, [PyTorch](https://pytorch.org), [TensorFlow](https://tensorflow.org), [Hugging Face Transformers](https://huggingface.co/), [PyTorch Lightning](https://pytorchlightning.ai/), [scikit-learn](https://scikit-learn.org/), [JAX](https://jax.readthedocs.io/), [TFLite](https://tensorflow.org/lite/), [MONAI](https://docs.monai.io/en/latest/index.html), [fastai](https://www.fast.ai/), [MLX](https://ml-explore.github.io/mlx/build/html/index.html), [XGBoost](https://xgboost.readthedocs.io/en/stable/), [Pandas](https://pandas.pydata.org/) for federated analytics, or even raw [NumPy](https://numpy.org/)
91
+ example, [PyTorch](https://pytorch.org), [TensorFlow](https://tensorflow.org), [Hugging Face Transformers](https://huggingface.co/), [PyTorch Lightning](https://pytorchlightning.ai/), [scikit-learn](https://scikit-learn.org/), [JAX](https://jax.readthedocs.io/), [TFLite](https://tensorflow.org/lite/), [MONAI](https://docs.monai.io/en/latest/index.html), [fastai](https://www.fast.ai/), [MLX](https://ml-explore.github.io/mlx/build/html/index.html), [XGBoost](https://xgboost.readthedocs.io/en/stable/), [LeRobot](https://github.com/huggingface/lerobot) for federated robots, [Pandas](https://pandas.pydata.org/) for federated analytics, or even raw [NumPy](https://numpy.org/)
92
92
  for users who enjoy computing gradients by hand.
93
93
 
94
94
  - **Understandable**: Flower is written with maintainability in mind. The
@@ -2,13 +2,13 @@ flwr/__init__.py,sha256=VmBWedrCxqmt4QvUHBLqyVEH6p7zaFMD_oCHerXHSVw,937
2
2
  flwr/cli/__init__.py,sha256=cZJVgozlkC6Ni2Hd_FAIrqefrkCGOV18fikToq-6iLw,720
3
3
  flwr/cli/app.py,sha256=UeXrW5gxrUnFViDjAMIxGNZZKwu3a1oAj83v53IWIWM,1382
4
4
  flwr/cli/build.py,sha256=4P70i_FnUs0P21aTwjTXtFQSAfY-C04hUDF-2npfJdo,6345
5
- flwr/cli/cli_user_auth_interceptor.py,sha256=rEjgAZmzHO0GjwdyZib6bkTI2X59ErJAZlutqpqZGF0,2952
5
+ flwr/cli/cli_user_auth_interceptor.py,sha256=aZepPA298s-HjGmkJGMvI_uZe72O5aLC3jri-ilG53o,3126
6
6
  flwr/cli/config_utils.py,sha256=I4_EMv2f68mfrL_QuOYoAG--yDfKisE7tGiIg09G2YQ,12079
7
7
  flwr/cli/example.py,sha256=uk5CoD0ZITgpY_ffsTbEKf8XOOCSUzByjHPcMSPqV18,2216
8
8
  flwr/cli/install.py,sha256=0AD0qJD79SKgBnWOQlphcubfr4zHk8jTpFgwZbJBI_g,8180
9
9
  flwr/cli/log.py,sha256=O7MBpsJp114PIZb-7Cru-KM6fqyneFQkqoQbQsqQmZU,6121
10
10
  flwr/cli/login/__init__.py,sha256=6_9zOzbPOAH72K2wX3-9dXTAbS7Mjpa5sEn2lA6eHHI,800
11
- flwr/cli/login/login.py,sha256=bZZ3hVeGpF5805R0Eg_SBZUGwrLAWmyaoLhLw6vQFcg,2764
11
+ flwr/cli/login/login.py,sha256=VaBPQBdLYmSfxXEJWVyu8U5dXztQgIv6rfTJkvz3zV8,3025
12
12
  flwr/cli/ls.py,sha256=K_3Bt2RfETw4V7J4qgo8_Wx-Y_bWZqttuO879Ppxo5Y,11056
13
13
  flwr/cli/new/__init__.py,sha256=pOQtPT9W4kCIttcKne5m-FtJbvTqdjTVJxzQ9AUYK8I,790
14
14
  flwr/cli/new/new.py,sha256=scyyKt8mzkc3El1bypgkHjKwVQEc2-q4I50PxriPFdI,9922
@@ -67,7 +67,7 @@ flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=r0SZnvoR5a5mEWKJ
67
67
  flwr/cli/run/__init__.py,sha256=cCsKVB0SFzh2b3QmGba6BHckB85xlhjh3mh4pBpACtY,790
68
68
  flwr/cli/run/run.py,sha256=BvpjYyUvDhVMvO5cG711ihtdeSbls9p8zVAuFGETLA8,7893
69
69
  flwr/cli/stop.py,sha256=1T9RNRCH8dxjmBT38hFtKAWY9Gb7RMCMCML7kex9WzE,4613
70
- flwr/cli/utils.py,sha256=d15VkwxVK-NC1X-LVXXW3_O4-A38ZrlevwSNKNYpJCY,10592
70
+ flwr/cli/utils.py,sha256=RXozds-T7HN8yH0mMj67q-0YktdNNm83N9Ptu_pdhsc,10604
71
71
  flwr/client/__init__.py,sha256=DGDoO0AEAfz-0CUFmLdyUUweAS64-07AOnmDfWUefK4,1192
72
72
  flwr/client/app.py,sha256=XJWu-kPswM52oLYXaOLKr0gj87KPNRI7M0Na9oBsDK4,34784
73
73
  flwr/client/client.py,sha256=8o58nd9o6ZFcMIaVYPGcV4MSjBG4H0oFgWiv8ZEO3oA,7895
@@ -82,9 +82,9 @@ flwr/client/grpc_adapter_client/connection.py,sha256=nV-hPd5q5Eblg6PgUrGGYj74mbE
82
82
  flwr/client/grpc_client/__init__.py,sha256=LsnbqXiJhgQcB0XzAlUQgPx011Uf7Y7yabIC1HxivJ8,735
83
83
  flwr/client/grpc_client/connection.py,sha256=gMwB87mlmRBbvPOvUA1m3C-Ci6bjMEmTRI4bJpgbyic,9416
84
84
  flwr/client/grpc_rere_client/__init__.py,sha256=MK-oSoV3kwUEQnIwl0GN4OpiHR7eLOrMA8ikunET130,752
85
- flwr/client/grpc_rere_client/client_interceptor.py,sha256=q08lIEeJLvvonNOiejNXvmySbPObteGnbDHhEKDmWzE,5380
85
+ flwr/client/grpc_rere_client/client_interceptor.py,sha256=9BEZNOHxNJFxIuXc9KzBF0ZkXECtOm7RgnZ9yHVUxCQ,5554
86
86
  flwr/client/grpc_rere_client/connection.py,sha256=NqKSoYIJblB4lElZ7EKIgDjLb6KYEcI-7CBrTbyiKfg,11475
87
- flwr/client/grpc_rere_client/grpc_adapter.py,sha256=sQo0I9T65t97LFGoW_PrmgaTbd18GFgi2DoAI5wQJ4k,5589
87
+ flwr/client/grpc_rere_client/grpc_adapter.py,sha256=VrSqHosRcWv8xDLKEabuzyHpVnRhjAEJf_MUFQxhDh8,6155
88
88
  flwr/client/heartbeat.py,sha256=cx37mJBH8LyoIN4Lks85wtqT1mnU5GulQnr4pGCvAq0,2404
89
89
  flwr/client/message_handler/__init__.py,sha256=QxxQuBNpFPTHx3KiUNvQSlqMKlEnbRR1kFfc1KVje08,719
90
90
  flwr/client/message_handler/message_handler.py,sha256=s7FEfYJp5QB259Pj1L94_9AC24Kh5JyKC2U-E6eNkkY,6492
@@ -112,9 +112,9 @@ flwr/common/__init__.py,sha256=TVaoFEJE158aui1TPZQiJCDZX4RNHRyI8I55VC80HhI,3901
112
112
  flwr/common/address.py,sha256=9KNYE69WW_QVcyumsux3Qn1wmn4J7f13Y9nHASpvzbA,3018
113
113
  flwr/common/args.py,sha256=bCvtG0hhh_hVjl9NoWsY_g7kLMIN3jCN7B883HvZ7hg,6223
114
114
  flwr/common/auth_plugin/__init__.py,sha256=1Y8Oj3iB49IHDu9tvDih1J74Ygu7k85V9s2A4WORPyA,887
115
- flwr/common/auth_plugin/auth_plugin.py,sha256=6WEAVVPrS7LgSBpd4WyHYU4EsajT2nBGI_IN3mhYzoU,3567
115
+ flwr/common/auth_plugin/auth_plugin.py,sha256=p_3oDuKiHtMMLLCyEe_fuRi_g5GwRKb4HJCnBkVK74I,3840
116
116
  flwr/common/config.py,sha256=vmPwtRu7JIoGCke03pJlsyrA6zTlN43flzQx-4AX1mE,8099
117
- flwr/common/constant.py,sha256=9HwFVxFWbLTzMetIffUT3gAC9nPtqzBNxrKWr5A0oSI,5996
117
+ flwr/common/constant.py,sha256=0H9SBSnQ78ZK4KPIKCIxTQZps2jU_pea8KMX8Hw22bQ,6066
118
118
  flwr/common/context.py,sha256=uJ-mnoC_8y_udEb3kAX-r8CPphNTWM72z1AlsvQEu54,2403
119
119
  flwr/common/date.py,sha256=NHHpESce5wYqEwoDXf09gp9U9l_5Bmlh2BsOcwS-kDM,1554
120
120
  flwr/common/differential_privacy.py,sha256=XwcJ3rWr8S8BZUocc76vLSJAXIf6OHnWkBV6-xlIRuw,6106
@@ -146,7 +146,7 @@ flwr/common/secure_aggregation/secaggplus_constants.py,sha256=9MF-oQh62uD7rt9VeN
146
146
  flwr/common/secure_aggregation/secaggplus_utils.py,sha256=OgYd68YBRaHQYLc-YdExj9CSpwL58bVTaPrdHoAj2AE,3214
147
147
  flwr/common/serde.py,sha256=K9ExsqcTPETESkt2HMaNtIQAIAfwmuwtJFlG-59I7Sw,31046
148
148
  flwr/common/telemetry.py,sha256=APKVubU_zJNrE-M_rip6S6Fsu41DxY3tAjFWNOgTmC0,9086
149
- flwr/common/typing.py,sha256=eTlGl56rdus583r11xHY_ejG-3b3rknqF735UY5zMK8,6025
149
+ flwr/common/typing.py,sha256=IMgs_7nDJWn8Eb7y16Hl4HC3imQV7_Hdla1IFs3B5u8,6382
150
150
  flwr/common/version.py,sha256=aNSxLL49RKeLz8sPcZrsTEWtrAeQ0uxu6tjmfba4O60,1325
151
151
  flwr/proto/__init__.py,sha256=hbY7JYakwZwCkYgCNlmHdc8rtvfoJbAZLalMdc--CGc,683
152
152
  flwr/proto/clientappio_pb2.py,sha256=Y3PMv-JMaBGehpslgbvGY6l2u5vNpfCTFWu-fmAmBJ4,3703
@@ -157,18 +157,18 @@ flwr/proto/error_pb2.py,sha256=LarjKL90LbwkXKlhzNrDssgl4DXcvIPve8NVCXHpsKA,1084
157
157
  flwr/proto/error_pb2.pyi,sha256=ZNH4HhJTU_KfMXlyCeg8FwU-fcUYxTqEmoJPtWtHikc,734
158
158
  flwr/proto/error_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
159
159
  flwr/proto/error_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
160
- flwr/proto/exec_pb2.py,sha256=IVqmpzzThSjuLBCF8T9VofTpnUXtp3SYWOEp8dzyv5o,6883
161
- flwr/proto/exec_pb2.pyi,sha256=amt-3e3zJVjkRlQ8Gz6m1A7hXyeZmbQhHpAEIQyIDn0,10660
160
+ flwr/proto/exec_pb2.py,sha256=1a8nh4RyDpRLY2gC6vMSAEe6-ksj7hLonAr-pZAejqc,5664
161
+ flwr/proto/exec_pb2.pyi,sha256=2vbzq2OOYM5GI-Tug4eVM5J6xvNvSFtR8m3MsP-i-Q4,9477
162
162
  flwr/proto/exec_pb2_grpc.py,sha256=-bdLqjsqQxK9R8LIiZaKlLKH2NmjR50EaGKTPPTwFhI,10445
163
163
  flwr/proto/exec_pb2_grpc.pyi,sha256=M5k-FzeLWxal7zt28LJfzMWWRxmNknTC2BzHRRMa1sQ,2914
164
164
  flwr/proto/fab_pb2.py,sha256=-gfW_ePYHx1vDGHfimwn91qEhmmY_gslaOHwqqZnVdU,1627
165
165
  flwr/proto/fab_pb2.pyi,sha256=AMXpiDK0fo3nZWjxsC2E4otSaVjyQbU7iiWKrsSZavs,2395
166
166
  flwr/proto/fab_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
167
167
  flwr/proto/fab_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
168
- flwr/proto/fleet_pb2.py,sha256=06NAaIAOxTA2UhkBA-VWZKflaVQIzXgPZ3Fb6vtliY0,4789
169
- flwr/proto/fleet_pb2.pyi,sha256=bkzPOFXaYVZv9jRIA_XqckTR4dLZcfPRmluaGeoqxBY,7851
170
- flwr/proto/fleet_pb2_grpc.py,sha256=VyqpAcX-6tiQVehQfRMbCErtIW4Mot1uXUSzRaklZTI,12228
171
- flwr/proto/fleet_pb2_grpc.pyi,sha256=VvOtOBwPcgoHRPgj2JENXq2HbcfU8cxp82E9tDfGyEs,3216
168
+ flwr/proto/fleet_pb2.py,sha256=Uu_oFKPBTzkROKWQmFN59jFucGagtvMjHqkgz6PhlLM,6583
169
+ flwr/proto/fleet_pb2.pyi,sha256=XT8Y79QB9ZWljt30hGmytkxJbu6H_D7ltkYopJQFM4o,12004
170
+ flwr/proto/fleet_pb2_grpc.py,sha256=J1rR8nr3_LFzaBfocZdgFj8xIXUaJDOMCN-G2-Rs-hU,15510
171
+ flwr/proto/fleet_pb2_grpc.pyi,sha256=BsqtyvC2GSqB40efort63LG2wRIKTp4eI8aOr9rbU1Y,3928
172
172
  flwr/proto/grpcadapter_pb2.py,sha256=bb8mW09XzNCpMdr1KuYQkefPFWR8lc8y1uL6Uk0TtsM,1843
173
173
  flwr/proto/grpcadapter_pb2.pyi,sha256=AR77gDsF6f8zqSIQp3877DUd7S8lP95lFak5Ir_WPkw,1716
174
174
  flwr/proto/grpcadapter_pb2_grpc.py,sha256=rRNuNES5nBugUZWfeA8oAy8dMHgzqU_PF1srTseo3b8,2634
@@ -211,7 +211,7 @@ flwr/proto/transport_pb2_grpc.py,sha256=vLN3EHtx2aEEMCO4f1Upu-l27BPzd3-5pV-u8wPc
211
211
  flwr/proto/transport_pb2_grpc.pyi,sha256=AGXf8RiIiW2J5IKMlm_3qT3AzcDa4F3P5IqUjve_esA,766
212
212
  flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
213
213
  flwr/server/__init__.py,sha256=cEg1oecBu4cKB69iJCqWEylC8b5XW47bl7rQiJsdTvM,1528
214
- flwr/server/app.py,sha256=qn5gdsDqvJ7o4ZiWpbNBHtYKSZiUJ7SiGfdkUEczTd4,31010
214
+ flwr/server/app.py,sha256=xXiRsHXypzMW0EI1ewiiGE0dk6296I9d95ae1d0MKYU,30860
215
215
  flwr/server/client_manager.py,sha256=7Ese0tgrH-i-ms363feYZJKwB8gWnXSmg_hYF2Bju4U,6227
216
216
  flwr/server/client_proxy.py,sha256=4G-oTwhb45sfWLx2uZdcXD98IZwdTS6F88xe3akCdUg,2399
217
217
  flwr/server/compat/__init__.py,sha256=VxnJtJyOjNFQXMNi9hIuzNlZM5n0Hj1p3aq_Pm2udw4,892
@@ -259,7 +259,7 @@ flwr/server/strategy/strategy.py,sha256=cXapkD5uDrt5C-RbmWDn9FLoap3Q41i7GKvbmfbC
259
259
  flwr/server/superlink/__init__.py,sha256=8tHYCfodUlRD8PCP9fHgvu8cz5N31A2QoRVL0jDJ15E,707
260
260
  flwr/server/superlink/driver/__init__.py,sha256=5soEK5QSvxNjmJQ-CGTWROc4alSAeU0e9Ad9RDhsd3E,717
261
261
  flwr/server/superlink/driver/serverappio_grpc.py,sha256=62371xIRzp3k-eQTaSpb9c4TiSfueSuI7Iw5X3IafOY,2186
262
- flwr/server/superlink/driver/serverappio_servicer.py,sha256=mgyV0XTONO7Vqb7sGOLu6AkCXWpBSeJ2s7ksadK1vE4,12197
262
+ flwr/server/superlink/driver/serverappio_servicer.py,sha256=4QEwqm_pew1iVbtEZuOWLhfgbbw4LIUwFjOuGBlPJZY,12747
263
263
  flwr/server/superlink/ffs/__init__.py,sha256=FAY-zShcfPmOxosok2QyT6hTNMNctG8cH9s_nIl8jkI,840
264
264
  flwr/server/superlink/ffs/disk_ffs.py,sha256=n_Ah0sQwXGVQ9wj5965nLjdkQQbpoHCljjXKFnwftsU,3297
265
265
  flwr/server/superlink/ffs/ffs.py,sha256=qLI1UfosJugu2BKOJWqHIhafTm-YiuKqGf3OGWPH0NM,2395
@@ -273,8 +273,8 @@ flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py,sha256=JkAH_nIZaqe_9kntrg26
273
273
  flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py,sha256=h3EhqgelegVC4EjOXH5birmAnMoCBJcP7jpHYCnHZPk,4887
274
274
  flwr/server/superlink/fleet/grpc_bidi/grpc_server.py,sha256=X4I2rd1ZC9fqjOg9uwdTydLxJ3JiWthkIAqb3wEv17g,12454
275
275
  flwr/server/superlink/fleet/grpc_rere/__init__.py,sha256=j2hyC342am-_Hgp1g80Y3fGDzfTI6n8QOOn2PyWf4eg,758
276
- flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=KBVsGt57G2_OWB_74N29TYVzD36G0xJg2l5m0ArPoEU,5389
277
- flwr/server/superlink/fleet/grpc_rere/server_interceptor.py,sha256=8PHzqtW_rKBvqI5XVwYN-CBEpEonnj85iN0daSWliyI,8299
276
+ flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=PyZP78gHU_RIRVSlPjyAvKG6UOLSilopkT6zoC_6ASc,5881
277
+ flwr/server/superlink/fleet/grpc_rere/server_interceptor.py,sha256=SKa1wfBNxJL6vGBUbbTgUylY3ZHJMyBSZRC1J6PBvyY,8342
278
278
  flwr/server/superlink/fleet/message_handler/__init__.py,sha256=h8oLD7uo5lKICPy0rRdKRjTYe62u8PKkT_fA4xF5JPA,731
279
279
  flwr/server/superlink/fleet/message_handler/message_handler.py,sha256=hzL8t6uUqO1lu5UHLF_NerdJuce4S5cK9fIWkKDzJfA,5298
280
280
  flwr/server/superlink/fleet/rest_rere/__init__.py,sha256=5jbYbAn75sGv-gBwOPDySE0kz96F6dTYLeMrGqNi4lM,735
@@ -285,10 +285,10 @@ flwr/server/superlink/fleet/vce/backend/backend.py,sha256=LBAQxnbfPAphVOVIvYMj0Q
285
285
  flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=jsUkFEVQTnrucK1jNQ_cUM8YwL7W4MQNA1GAf8ibRdg,7156
286
286
  flwr/server/superlink/fleet/vce/vce_api.py,sha256=WTnUILr1OHS8LfjXQUA3FyWJYdJgdqpFAybyJUD-1Xo,13025
287
287
  flwr/server/superlink/linkstate/__init__.py,sha256=v-2JyJlCB3qyhMNwMjmcNVOq4rkooqFU0LHH8Zo1jls,1064
288
- flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=SR6a0wb-xFVQmPEsNseT91jmBeN0Lh1m_lZ6nY6aNS0,21984
289
- flwr/server/superlink/linkstate/linkstate.py,sha256=ayQY5eb-2InSldQUnVcx5ABjPU4QhQRV2lEVPVM_818,13114
288
+ flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=yYLIzFurLTw5L5KscLYF6VBEBo1i-GFuSjBW2ij-7V0,22230
289
+ flwr/server/superlink/linkstate/linkstate.py,sha256=NAdArILJ58TUif-K-LzUVfgqcMdqb0719GYAV3gu0n4,13342
290
290
  flwr/server/superlink/linkstate/linkstate_factory.py,sha256=ISSMjDlwuN7swxjOeYlTNpI_kuZ8PGkMcJnf1dbhUSE,2069
291
- flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=svP5Vj6Jaq1iazd6q0wWQU0lJslfIJT0XBw8mA1SABs,42879
291
+ flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=lLvVAscwVioqzj4uj0WfDUyoq-L7Nr-kMKCdaGPI0Z8,44050
292
292
  flwr/server/superlink/linkstate/utils.py,sha256=d5uqqIOCKfd54X8CFNfUr3AWqPLpgmzsC_RagRwFugM,13321
293
293
  flwr/server/superlink/simulation/__init__.py,sha256=mg-oapC9dkzEfjXPQFior5lpWj4g9kwbLovptyYM_g0,718
294
294
  flwr/server/superlink/simulation/simulationio_grpc.py,sha256=5wflYW_TS0mjmPG6OYuHMJwXD2_cYmUNhFkdOU0jMWQ,2237
@@ -317,12 +317,12 @@ flwr/superexec/__init__.py,sha256=fcj366jh4RFby_vDwLroU4kepzqbnJgseZD_jUr_Mko,71
317
317
  flwr/superexec/app.py,sha256=Z6kYHWd62YL0Q4YKyCAbt_BcefNfbKH6V-jCC-1NkZM,1842
318
318
  flwr/superexec/deployment.py,sha256=wZ9G42gGS91knfplswh95MnQ83Fzu-rs6wcuNgDmmvY,6735
319
319
  flwr/superexec/exec_grpc.py,sha256=XD94kqzigQ9tLB3hU-jVgMAS_BmlK80Z5rQ_9M6b7aY,2897
320
- flwr/superexec/exec_servicer.py,sha256=8tFwj1fDBF6PzwLhByTlxM-KNZc83bG1UdE92-8DSFk,7699
320
+ flwr/superexec/exec_servicer.py,sha256=X10ILT-AoGMrB3IgI2mBe9i-QcIVUAl9bucuqVOPYkU,8341
321
321
  flwr/superexec/exec_user_auth_interceptor.py,sha256=K06OU-l4LnYhTDg071hGJuOaQWEJbZsYi5qxUmmtiG0,3704
322
322
  flwr/superexec/executor.py,sha256=_B55WW2TD1fBINpabSSDRenVHXYmvlfhv-k8hJKU4lQ,3115
323
323
  flwr/superexec/simulation.py,sha256=WQDon15oqpMopAZnwRZoTICYCfHqtkvFSqiTQ2hLD_g,4088
324
- flwr_nightly-1.15.0.dev20250107.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
325
- flwr_nightly-1.15.0.dev20250107.dist-info/METADATA,sha256=WViuONypdpsZ9HD8sY37AA9v1KR4FA86-PspOAyHPCQ,15810
326
- flwr_nightly-1.15.0.dev20250107.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
327
- flwr_nightly-1.15.0.dev20250107.dist-info/entry_points.txt,sha256=JlNxX3qhaV18_2yj5a3kJW1ESxm31cal9iS_N_pf1Rk,538
328
- flwr_nightly-1.15.0.dev20250107.dist-info/RECORD,,
324
+ flwr_nightly-1.15.0.dev20250109.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
325
+ flwr_nightly-1.15.0.dev20250109.dist-info/METADATA,sha256=bx7_AOmer-gS3TN_YLCG0WVJFPIXNgyGE6ovkxjiGDg,15882
326
+ flwr_nightly-1.15.0.dev20250109.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
327
+ flwr_nightly-1.15.0.dev20250109.dist-info/entry_points.txt,sha256=JlNxX3qhaV18_2yj5a3kJW1ESxm31cal9iS_N_pf1Rk,538
328
+ flwr_nightly-1.15.0.dev20250109.dist-info/RECORD,,