flwr-nightly 1.16.0.dev20250204__py3-none-any.whl → 1.16.0.dev20250205__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.
@@ -15,10 +15,10 @@
15
15
  """Common function to register exit handlers for server and client."""
16
16
 
17
17
 
18
- from signal import SIGINT, SIGQUIT, SIGTERM, signal
18
+ import signal
19
19
  from threading import Thread
20
20
  from types import FrameType
21
- from typing import Optional
21
+ from typing import Callable, Optional
22
22
 
23
23
  from grpc import Server
24
24
 
@@ -26,12 +26,15 @@ from flwr.common.telemetry import EventType
26
26
 
27
27
  from .exit import ExitCode, flwr_exit
28
28
 
29
- SIGNAL_TO_EXIT_CODE = {
30
- SIGINT: ExitCode.GRACEFUL_EXIT_SIGINT,
31
- SIGQUIT: ExitCode.GRACEFUL_EXIT_SIGQUIT,
32
- SIGTERM: ExitCode.GRACEFUL_EXIT_SIGTERM,
29
+ SIGNAL_TO_EXIT_CODE: dict[int, int] = {
30
+ signal.SIGINT: ExitCode.GRACEFUL_EXIT_SIGINT,
31
+ signal.SIGTERM: ExitCode.GRACEFUL_EXIT_SIGTERM,
33
32
  }
34
33
 
34
+ # SIGQUIT is not available on Windows
35
+ if hasattr(signal, "SIGQUIT"):
36
+ SIGNAL_TO_EXIT_CODE[signal.SIGQUIT] = ExitCode.GRACEFUL_EXIT_SIGQUIT
37
+
35
38
 
36
39
  def register_exit_handlers(
37
40
  event_type: EventType,
@@ -54,23 +57,16 @@ def register_exit_handlers(
54
57
  An optional list of threads that need to be gracefully
55
58
  terminated before exiting.
56
59
  """
57
- default_handlers = {
58
- SIGINT: None,
59
- SIGQUIT: None,
60
- SIGTERM: None,
61
- }
62
-
63
- def graceful_exit_handler( # type: ignore
64
- signalnum,
65
- frame: FrameType, # pylint: disable=unused-argument
66
- ) -> None:
60
+ default_handlers: dict[int, Callable[[int, FrameType], None]] = {}
61
+
62
+ def graceful_exit_handler(signalnum: int, _frame: FrameType) -> None:
67
63
  """Exit handler to be registered with `signal.signal`.
68
64
 
69
65
  When called will reset signal handler to original signal handler from
70
66
  default_handlers.
71
67
  """
72
68
  # Reset to default handler
73
- signal(signalnum, default_handlers[signalnum])
69
+ signal.signal(signalnum, default_handlers[signalnum]) # type: ignore
74
70
 
75
71
  if grpc_servers is not None:
76
72
  for grpc_server in grpc_servers:
@@ -87,15 +83,7 @@ def register_exit_handlers(
87
83
  event_type=event_type,
88
84
  )
89
85
 
90
- default_handlers[SIGINT] = signal( # type: ignore
91
- SIGINT,
92
- graceful_exit_handler, # type: ignore
93
- )
94
- default_handlers[SIGQUIT] = signal( # type: ignore
95
- SIGQUIT,
96
- graceful_exit_handler, # type: ignore
97
- )
98
- default_handlers[SIGTERM] = signal( # type: ignore
99
- SIGTERM,
100
- graceful_exit_handler, # type: ignore
101
- )
86
+ # Register signal handlers
87
+ for sig in SIGNAL_TO_EXIT_CODE:
88
+ default_handler = signal.signal(sig, graceful_exit_handler) # type: ignore
89
+ default_handlers[sig] = default_handler # type: ignore
@@ -43,9 +43,11 @@ MIN_TIMESTAMP_DIFF = -SYSTEM_TIME_TOLERANCE
43
43
  MAX_TIMESTAMP_DIFF = TIMESTAMP_TOLERANCE + SYSTEM_TIME_TOLERANCE
44
44
 
45
45
 
46
- def _unary_unary_rpc_terminator(message: str) -> grpc.RpcMethodHandler:
46
+ def _unary_unary_rpc_terminator(
47
+ message: str, code: Any = grpc.StatusCode.UNAUTHENTICATED
48
+ ) -> grpc.RpcMethodHandler:
47
49
  def terminate(_request: GrpcMessage, context: grpc.ServicerContext) -> GrpcMessage:
48
- context.abort(grpc.StatusCode.UNAUTHENTICATED, message)
50
+ context.abort(code, message)
49
51
  raise RuntimeError("Should not reach this point") # Make mypy happy
50
52
 
51
53
  return grpc.unary_unary_rpc_method_handler(terminate)
@@ -68,7 +70,7 @@ class AuthenticateServerInterceptor(grpc.ServerInterceptor): # type: ignore
68
70
  self.state_factory = state_factory
69
71
  self.auto_auth = auto_auth
70
72
 
71
- def intercept_service(
73
+ def intercept_service( # pylint: disable=too-many-return-statements
72
74
  self,
73
75
  continuation: Callable[[Any], Any],
74
76
  handler_call_details: grpc.HandlerCallDetails,
@@ -79,6 +81,13 @@ class AuthenticateServerInterceptor(grpc.ServerInterceptor): # type: ignore
79
81
  metadata sent by the node. Continue RPC call if node is authenticated, else,
80
82
  terminate RPC call by setting context to abort.
81
83
  """
84
+ # Filter out non-Fleet service calls
85
+ if not handler_call_details.method.startswith("/flwr.proto.Fleet/"):
86
+ return _unary_unary_rpc_terminator(
87
+ "This request should be sent to a different service.",
88
+ grpc.StatusCode.FAILED_PRECONDITION,
89
+ )
90
+
82
91
  state = self.state_factory.state()
83
92
  metadata_dict = dict(handler_call_details.invocation_metadata)
84
93
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.16.0.dev20250204
3
+ Version: 1.16.0.dev20250205
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -126,7 +126,7 @@ flwr/common/dp.py,sha256=vddkvyjV2FhRoN4VuU2LeAM1UBn7dQB8_W-Qdiveal8,1978
126
126
  flwr/common/exit/__init__.py,sha256=-ZOJYLaNnR729a7VzZiFsLiqngzKQh3xc27svYStZ_Q,826
127
127
  flwr/common/exit/exit.py,sha256=DmZFyksp-w1sFDQekq5Z-qfnr-ivCAv78aQkqj-TDps,3458
128
128
  flwr/common/exit/exit_code.py,sha256=PNEnCrZfOILjfDAFu5m-2YWEJBrk97xglq4zCUlqV7E,3470
129
- flwr/common/exit_handlers.py,sha256=Dke87CC6d6b6kqkC2mF0I4JsP4mHhlQTFxkS4sKKgyw,3308
129
+ flwr/common/exit_handlers.py,sha256=yclujry30954o0lI7vtknTajskPCvK8TXw2V3RdldXU,3174
130
130
  flwr/common/grpc.py,sha256=K60AIvIqH0CvkkiqBfw5HoxQfbFOL2DrhKPjbZ8raIE,9786
131
131
  flwr/common/logger.py,sha256=Hund1C6bEhMw3GemlzuFK22tXZ27YeHLrFB0b4LP5f8,13041
132
132
  flwr/common/message.py,sha256=Zv4ID2BLQsbff0F03DI_MeFoHbSqVZAdDD9NcKYv6Zo,13832
@@ -280,7 +280,7 @@ flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py,sha256=h3EhqgelegVC4E
280
280
  flwr/server/superlink/fleet/grpc_bidi/grpc_server.py,sha256=mxPxyEF0IW0vV41Bqk1zfKOdRDEvXPwzJyMiRMg7nTI,5173
281
281
  flwr/server/superlink/fleet/grpc_rere/__init__.py,sha256=j2hyC342am-_Hgp1g80Y3fGDzfTI6n8QOOn2PyWf4eg,758
282
282
  flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=syWWZgsU3PHvIuvSoJxUTbEdkOtyV6psXAbRowNE_yY,5533
283
- flwr/server/superlink/fleet/grpc_rere/server_interceptor.py,sha256=K464S9UrV5NQVRgXwqQWCtoVnXBbOEWeRzkOJjeTC7o,6605
283
+ flwr/server/superlink/fleet/grpc_rere/server_interceptor.py,sha256=KPgAcnYsKPPI7_iYNSnqGbyv4tsqZuBqrTiREwVBJiM,6984
284
284
  flwr/server/superlink/fleet/message_handler/__init__.py,sha256=h8oLD7uo5lKICPy0rRdKRjTYe62u8PKkT_fA4xF5JPA,731
285
285
  flwr/server/superlink/fleet/message_handler/message_handler.py,sha256=DM53K4yLOmzXikTe6i6KJ0v8IvlJKDifvFEV09GFKhI,5510
286
286
  flwr/server/superlink/fleet/rest_rere/__init__.py,sha256=5jbYbAn75sGv-gBwOPDySE0kz96F6dTYLeMrGqNi4lM,735
@@ -327,8 +327,8 @@ flwr/superexec/exec_servicer.py,sha256=X10ILT-AoGMrB3IgI2mBe9i-QcIVUAl9bucuqVOPY
327
327
  flwr/superexec/exec_user_auth_interceptor.py,sha256=K06OU-l4LnYhTDg071hGJuOaQWEJbZsYi5qxUmmtiG0,3704
328
328
  flwr/superexec/executor.py,sha256=_B55WW2TD1fBINpabSSDRenVHXYmvlfhv-k8hJKU4lQ,3115
329
329
  flwr/superexec/simulation.py,sha256=WQDon15oqpMopAZnwRZoTICYCfHqtkvFSqiTQ2hLD_g,4088
330
- flwr_nightly-1.16.0.dev20250204.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
331
- flwr_nightly-1.16.0.dev20250204.dist-info/METADATA,sha256=T4A15Y7FEN90CKMRxjCRRDh8A6OVyNHsu_FIUYqSsrM,15873
332
- flwr_nightly-1.16.0.dev20250204.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
333
- flwr_nightly-1.16.0.dev20250204.dist-info/entry_points.txt,sha256=JlNxX3qhaV18_2yj5a3kJW1ESxm31cal9iS_N_pf1Rk,538
334
- flwr_nightly-1.16.0.dev20250204.dist-info/RECORD,,
330
+ flwr_nightly-1.16.0.dev20250205.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
331
+ flwr_nightly-1.16.0.dev20250205.dist-info/METADATA,sha256=WKm99h3uLWPbfmQCecvvugCPsm4Ukwm1Sx5kF4VTvzM,15873
332
+ flwr_nightly-1.16.0.dev20250205.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
333
+ flwr_nightly-1.16.0.dev20250205.dist-info/entry_points.txt,sha256=JlNxX3qhaV18_2yj5a3kJW1ESxm31cal9iS_N_pf1Rk,538
334
+ flwr_nightly-1.16.0.dev20250205.dist-info/RECORD,,