flwr-nightly 1.15.0.dev20250108__tar.gz → 1.15.0.dev20250109__tar.gz

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 (328) hide show
  1. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/PKG-INFO +2 -2
  2. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/README.md +1 -1
  3. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/pyproject.toml +1 -1
  4. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +6 -0
  5. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +16 -0
  6. flwr_nightly-1.15.0.dev20250109/src/py/flwr/proto/fleet_pb2.py +69 -0
  7. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/fleet_pb2.pyi +84 -0
  8. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/fleet_pb2_grpc.py +66 -0
  9. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/fleet_pb2_grpc.pyi +20 -0
  10. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +22 -8
  11. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +16 -0
  12. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +2 -1
  13. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +26 -22
  14. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/linkstate/linkstate.py +10 -4
  15. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +42 -20
  16. flwr_nightly-1.15.0.dev20250108/src/py/flwr/proto/fleet_pb2.py +0 -56
  17. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/LICENSE +0 -0
  18. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/__init__.py +0 -0
  19. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/__init__.py +0 -0
  20. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/app.py +0 -0
  21. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/build.py +0 -0
  22. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  23. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/config_utils.py +0 -0
  24. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/example.py +0 -0
  25. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/install.py +0 -0
  26. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/log.py +0 -0
  27. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/login/__init__.py +0 -0
  28. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/login/login.py +0 -0
  29. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/ls.py +0 -0
  30. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/__init__.py +0 -0
  31. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/new.py +0 -0
  32. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  33. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  34. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  35. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  36. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  37. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  38. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  39. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  40. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  41. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  42. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  43. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  44. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  45. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  46. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  47. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  48. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  49. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  50. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  51. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  52. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  53. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  54. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  55. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  56. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  57. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  58. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  59. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  60. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  61. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  62. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  63. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  64. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  65. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  66. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  67. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  68. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  69. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  70. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  71. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  72. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  73. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  74. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  75. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  76. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  77. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  78. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  79. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  80. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  81. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  82. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  83. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  84. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/run/__init__.py +0 -0
  85. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/run/run.py +0 -0
  86. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/stop.py +0 -0
  87. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/cli/utils.py +0 -0
  88. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/__init__.py +0 -0
  89. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/app.py +0 -0
  90. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/client.py +0 -0
  91. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/client_app.py +0 -0
  92. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/clientapp/__init__.py +0 -0
  93. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/clientapp/app.py +0 -0
  94. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  95. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/clientapp/utils.py +0 -0
  96. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  97. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  98. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  99. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  100. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/grpc_client/connection.py +0 -0
  101. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  102. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  103. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/heartbeat.py +0 -0
  104. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/message_handler/__init__.py +0 -0
  105. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  106. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  107. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/mod/__init__.py +0 -0
  108. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  109. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/mod/comms_mods.py +0 -0
  110. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  111. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  112. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  113. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  114. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/mod/utils.py +0 -0
  115. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/nodestate/__init__.py +0 -0
  116. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
  117. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/nodestate/nodestate.py +0 -0
  118. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
  119. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/numpy_client.py +0 -0
  120. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/rest_client/__init__.py +0 -0
  121. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/rest_client/connection.py +0 -0
  122. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/run_info_store.py +0 -0
  123. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/supernode/__init__.py +0 -0
  124. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/supernode/app.py +0 -0
  125. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/client/typing.py +0 -0
  126. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/__init__.py +0 -0
  127. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/address.py +0 -0
  128. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/args.py +0 -0
  129. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/auth_plugin/__init__.py +0 -0
  130. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  131. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/config.py +0 -0
  132. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/constant.py +0 -0
  133. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/context.py +0 -0
  134. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/date.py +0 -0
  135. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/differential_privacy.py +0 -0
  136. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  137. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/dp.py +0 -0
  138. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/exit_handlers.py +0 -0
  139. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/grpc.py +0 -0
  140. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/logger.py +0 -0
  141. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/message.py +0 -0
  142. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/object_ref.py +0 -0
  143. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/parameter.py +0 -0
  144. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/pyproject.py +0 -0
  145. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/record/__init__.py +0 -0
  146. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/record/configsrecord.py +0 -0
  147. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/record/conversion_utils.py +0 -0
  148. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/record/metricsrecord.py +0 -0
  149. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/record/parametersrecord.py +0 -0
  150. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/record/recordset.py +0 -0
  151. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/record/typeddict.py +0 -0
  152. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/recordset_compat.py +0 -0
  153. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/retry_invoker.py +0 -0
  154. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  155. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  156. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  157. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  158. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  159. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  160. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  161. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  162. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/serde.py +0 -0
  163. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/telemetry.py +0 -0
  164. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/typing.py +0 -0
  165. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/common/version.py +0 -0
  166. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/__init__.py +0 -0
  167. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  168. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  169. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  170. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  171. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/error_pb2.py +0 -0
  172. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/error_pb2.pyi +0 -0
  173. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  174. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  175. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/exec_pb2.py +0 -0
  176. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/exec_pb2.pyi +0 -0
  177. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  178. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  179. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/fab_pb2.py +0 -0
  180. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  181. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  182. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  183. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  184. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  185. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  186. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  187. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/log_pb2.py +0 -0
  188. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/log_pb2.pyi +0 -0
  189. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
  190. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  191. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/message_pb2.py +0 -0
  192. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/message_pb2.pyi +0 -0
  193. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  194. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  195. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/node_pb2.py +0 -0
  196. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/node_pb2.pyi +0 -0
  197. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  198. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  199. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/recordset_pb2.py +0 -0
  200. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  201. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  202. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  203. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/run_pb2.py +0 -0
  204. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/run_pb2.pyi +0 -0
  205. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  206. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  207. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/serverappio_pb2.py +0 -0
  208. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
  209. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  210. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  211. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/simulationio_pb2.py +0 -0
  212. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
  213. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  214. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  215. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/task_pb2.py +0 -0
  216. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/task_pb2.pyi +0 -0
  217. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  218. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  219. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/transport_pb2.py +0 -0
  220. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  221. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  222. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  223. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/py.typed +0 -0
  224. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/__init__.py +0 -0
  225. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/app.py +0 -0
  226. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/client_manager.py +0 -0
  227. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/client_proxy.py +0 -0
  228. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/compat/__init__.py +0 -0
  229. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/compat/app.py +0 -0
  230. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/compat/app_utils.py +0 -0
  231. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  232. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/compat/legacy_context.py +0 -0
  233. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/criterion.py +0 -0
  234. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/driver/__init__.py +0 -0
  235. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/driver/driver.py +0 -0
  236. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  237. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  238. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/history.py +0 -0
  239. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/run_serverapp.py +0 -0
  240. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/server.py +0 -0
  241. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/server_app.py +0 -0
  242. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/server_config.py +0 -0
  243. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/serverapp/__init__.py +0 -0
  244. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/serverapp/app.py +0 -0
  245. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/serverapp_components.py +0 -0
  246. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/strategy/__init__.py +0 -0
  247. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/strategy/aggregate.py +0 -0
  248. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/strategy/bulyan.py +0 -0
  249. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  250. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  251. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  252. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  253. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  254. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  255. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/strategy/fedadam.py +0 -0
  256. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/strategy/fedavg.py +0 -0
  257. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  258. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  259. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  260. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/strategy/fedopt.py +0 -0
  261. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/strategy/fedprox.py +0 -0
  262. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  263. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  264. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  265. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  266. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  267. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/strategy/krum.py +0 -0
  268. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  269. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/strategy/strategy.py +0 -0
  270. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/__init__.py +0 -0
  271. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  272. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +0 -0
  273. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  274. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  275. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  276. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  277. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  278. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  279. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  280. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  281. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  282. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  283. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  284. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  285. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  286. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  287. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  288. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  289. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  290. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  291. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  292. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  293. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  294. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  295. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  296. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  297. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
  298. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
  299. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  300. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  301. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/superlink/utils.py +0 -0
  302. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/typing.py +0 -0
  303. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/utils/__init__.py +0 -0
  304. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/utils/tensorboard.py +0 -0
  305. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/utils/validator.py +0 -0
  306. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/workflow/__init__.py +0 -0
  307. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/workflow/constant.py +0 -0
  308. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  309. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  310. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  311. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  312. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/simulation/__init__.py +0 -0
  313. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/simulation/app.py +0 -0
  314. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/simulation/legacy_app.py +0 -0
  315. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  316. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  317. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  318. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  319. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/simulation/run_simulation.py +0 -0
  320. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/simulation/simulationio_connection.py +0 -0
  321. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/superexec/__init__.py +0 -0
  322. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/superexec/app.py +0 -0
  323. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/superexec/deployment.py +0 -0
  324. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/superexec/exec_grpc.py +0 -0
  325. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/superexec/exec_servicer.py +0 -0
  326. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  327. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/superexec/executor.py +0 -0
  328. {flwr_nightly-1.15.0.dev20250108 → flwr_nightly-1.15.0.dev20250109}/src/py/flwr/superexec/simulation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.15.0.dev20250108
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
@@ -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
@@ -34,7 +34,7 @@ design of Flower is based on a few guiding principles:
34
34
 
35
35
  - **Framework-agnostic**: Different machine learning frameworks have different
36
36
  strengths. Flower can be used with any machine learning framework, for
37
- 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/)
37
+ 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/)
38
38
  for users who enjoy computing gradients by hand.
39
39
 
40
40
  - **Understandable**: Flower is written with maintainability in mind. The
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.15.0.dev20250108"
7
+ version = "1.15.0.dev20250109"
8
8
  description = "Flower: A Friendly Federated AI Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -36,7 +36,9 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
36
36
  CreateNodeRequest,
37
37
  DeleteNodeRequest,
38
38
  PingRequest,
39
+ PullMessagesRequest,
39
40
  PullTaskInsRequest,
41
+ PushMessagesRequest,
40
42
  PushTaskResRequest,
41
43
  )
42
44
  from flwr.proto.run_pb2 import GetRunRequest # pylint: disable=E0611
@@ -52,6 +54,8 @@ Request = Union[
52
54
  GetRunRequest,
53
55
  PingRequest,
54
56
  GetFabRequest,
57
+ PullMessagesRequest,
58
+ PushMessagesRequest,
55
59
  ]
56
60
 
57
61
 
@@ -129,6 +133,8 @@ class AuthenticateClientInterceptor(grpc.UnaryUnaryClientInterceptor): # type:
129
133
  GetRunRequest,
130
134
  PingRequest,
131
135
  GetFabRequest,
136
+ PullMessagesRequest,
137
+ PushMessagesRequest,
132
138
  ),
133
139
  ):
134
140
  if self.shared_secret is None:
@@ -40,8 +40,12 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
40
40
  DeleteNodeResponse,
41
41
  PingRequest,
42
42
  PingResponse,
43
+ PullMessagesRequest,
44
+ PullMessagesResponse,
43
45
  PullTaskInsRequest,
44
46
  PullTaskInsResponse,
47
+ PushMessagesRequest,
48
+ PushMessagesResponse,
45
49
  PushTaskResRequest,
46
50
  PushTaskResResponse,
47
51
  )
@@ -132,12 +136,24 @@ class GrpcAdapter:
132
136
  """."""
133
137
  return self._send_and_receive(request, PullTaskInsResponse, **kwargs)
134
138
 
139
+ def PullMessages( # pylint: disable=C0103
140
+ self, request: PullMessagesRequest, **kwargs: Any
141
+ ) -> PullMessagesResponse:
142
+ """."""
143
+ return self._send_and_receive(request, PullMessagesResponse, **kwargs)
144
+
135
145
  def PushTaskRes( # pylint: disable=C0103
136
146
  self, request: PushTaskResRequest, **kwargs: Any
137
147
  ) -> PushTaskResResponse:
138
148
  """."""
139
149
  return self._send_and_receive(request, PushTaskResResponse, **kwargs)
140
150
 
151
+ def PushMessages( # pylint: disable=C0103
152
+ self, request: PushMessagesRequest, **kwargs: Any
153
+ ) -> PushMessagesResponse:
154
+ """."""
155
+ return self._send_and_receive(request, PushMessagesResponse, **kwargs)
156
+
141
157
  def GetRun( # pylint: disable=C0103
142
158
  self, request: GetRunRequest, **kwargs: Any
143
159
  ) -> GetRunResponse:
@@ -0,0 +1,69 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: flwr/proto/fleet.proto
4
+ # Protobuf Python Version: 4.25.0
5
+ """Generated protocol buffer code."""
6
+ from google.protobuf import descriptor as _descriptor
7
+ from google.protobuf import descriptor_pool as _descriptor_pool
8
+ from google.protobuf import symbol_database as _symbol_database
9
+ from google.protobuf.internal import builder as _builder
10
+ # @@protoc_insertion_point(imports)
11
+
12
+ _sym_db = _symbol_database.Default()
13
+
14
+
15
+ from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
16
+ from flwr.proto import task_pb2 as flwr_dot_proto_dot_task__pb2
17
+ from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
18
+ from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
19
+ from flwr.proto import message_pb2 as flwr_dot_proto_dot_message__pb2
20
+
21
+
22
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x66lwr/proto/fleet.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x15\x66lwr/proto/task.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x18\x66lwr/proto/message.proto\"*\n\x11\x43reateNodeRequest\x12\x15\n\rping_interval\x18\x01 \x01(\x01\"4\n\x12\x43reateNodeResponse\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"3\n\x11\x44\x65leteNodeRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"\x14\n\x12\x44\x65leteNodeResponse\"D\n\x0bPingRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x15\n\rping_interval\x18\x02 \x01(\x01\"\x1f\n\x0cPingResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"F\n\x12PullTaskInsRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x10\n\x08task_ids\x18\x02 \x03(\t\"k\n\x13PullTaskInsResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12*\n\rtask_ins_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.TaskIns\"`\n\x12PushTaskResRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12*\n\rtask_res_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.TaskRes\"\xae\x01\n\x13PushTaskResResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12=\n\x07results\x18\x02 \x03(\x0b\x32,.flwr.proto.PushTaskResResponse.ResultsEntry\x1a.\n\x0cResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\r:\x02\x38\x01\"J\n\x13PullMessagesRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x13\n\x0bmessage_ids\x18\x02 \x03(\t\"l\n\x14PullMessagesResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12*\n\rmessages_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.Message\"a\n\x13PushMessagesRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12*\n\rmessages_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.Message\"\xb0\x01\n\x14PushMessagesResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12>\n\x07results\x18\x02 \x03(\x0b\x32-.flwr.proto.PushMessagesResponse.ResultsEntry\x1a.\n\x0cResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\r:\x02\x38\x01\"\x1e\n\tReconnect\x12\x11\n\treconnect\x18\x01 \x01(\x04\x32\xb6\x05\n\x05\x46leet\x12M\n\nCreateNode\x12\x1d.flwr.proto.CreateNodeRequest\x1a\x1e.flwr.proto.CreateNodeResponse\"\x00\x12M\n\nDeleteNode\x12\x1d.flwr.proto.DeleteNodeRequest\x1a\x1e.flwr.proto.DeleteNodeResponse\"\x00\x12;\n\x04Ping\x12\x17.flwr.proto.PingRequest\x1a\x18.flwr.proto.PingResponse\"\x00\x12P\n\x0bPullTaskIns\x12\x1e.flwr.proto.PullTaskInsRequest\x1a\x1f.flwr.proto.PullTaskInsResponse\"\x00\x12S\n\x0cPullMessages\x12\x1f.flwr.proto.PullMessagesRequest\x1a .flwr.proto.PullMessagesResponse\"\x00\x12P\n\x0bPushTaskRes\x12\x1e.flwr.proto.PushTaskResRequest\x1a\x1f.flwr.proto.PushTaskResResponse\"\x00\x12S\n\x0cPushMessages\x12\x1f.flwr.proto.PushMessagesRequest\x1a .flwr.proto.PushMessagesResponse\"\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\x62\x06proto3')
23
+
24
+ _globals = globals()
25
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
26
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.fleet_pb2', _globals)
27
+ if _descriptor._USE_C_DESCRIPTORS == False:
28
+ DESCRIPTOR._options = None
29
+ _globals['_PUSHTASKRESRESPONSE_RESULTSENTRY']._options = None
30
+ _globals['_PUSHTASKRESRESPONSE_RESULTSENTRY']._serialized_options = b'8\001'
31
+ _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._options = None
32
+ _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_options = b'8\001'
33
+ _globals['_CREATENODEREQUEST']._serialized_start=154
34
+ _globals['_CREATENODEREQUEST']._serialized_end=196
35
+ _globals['_CREATENODERESPONSE']._serialized_start=198
36
+ _globals['_CREATENODERESPONSE']._serialized_end=250
37
+ _globals['_DELETENODEREQUEST']._serialized_start=252
38
+ _globals['_DELETENODEREQUEST']._serialized_end=303
39
+ _globals['_DELETENODERESPONSE']._serialized_start=305
40
+ _globals['_DELETENODERESPONSE']._serialized_end=325
41
+ _globals['_PINGREQUEST']._serialized_start=327
42
+ _globals['_PINGREQUEST']._serialized_end=395
43
+ _globals['_PINGRESPONSE']._serialized_start=397
44
+ _globals['_PINGRESPONSE']._serialized_end=428
45
+ _globals['_PULLTASKINSREQUEST']._serialized_start=430
46
+ _globals['_PULLTASKINSREQUEST']._serialized_end=500
47
+ _globals['_PULLTASKINSRESPONSE']._serialized_start=502
48
+ _globals['_PULLTASKINSRESPONSE']._serialized_end=609
49
+ _globals['_PUSHTASKRESREQUEST']._serialized_start=611
50
+ _globals['_PUSHTASKRESREQUEST']._serialized_end=707
51
+ _globals['_PUSHTASKRESRESPONSE']._serialized_start=710
52
+ _globals['_PUSHTASKRESRESPONSE']._serialized_end=884
53
+ _globals['_PUSHTASKRESRESPONSE_RESULTSENTRY']._serialized_start=838
54
+ _globals['_PUSHTASKRESRESPONSE_RESULTSENTRY']._serialized_end=884
55
+ _globals['_PULLMESSAGESREQUEST']._serialized_start=886
56
+ _globals['_PULLMESSAGESREQUEST']._serialized_end=960
57
+ _globals['_PULLMESSAGESRESPONSE']._serialized_start=962
58
+ _globals['_PULLMESSAGESRESPONSE']._serialized_end=1070
59
+ _globals['_PUSHMESSAGESREQUEST']._serialized_start=1072
60
+ _globals['_PUSHMESSAGESREQUEST']._serialized_end=1169
61
+ _globals['_PUSHMESSAGESRESPONSE']._serialized_start=1172
62
+ _globals['_PUSHMESSAGESRESPONSE']._serialized_end=1348
63
+ _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_start=838
64
+ _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_end=884
65
+ _globals['_RECONNECT']._serialized_start=1350
66
+ _globals['_RECONNECT']._serialized_end=1380
67
+ _globals['_FLEET']._serialized_start=1383
68
+ _globals['_FLEET']._serialized_end=2077
69
+ # @@protoc_insertion_point(module_scope)
@@ -3,6 +3,7 @@
3
3
  isort:skip_file
4
4
  """
5
5
  import builtins
6
+ import flwr.proto.message_pb2
6
7
  import flwr.proto.node_pb2
7
8
  import flwr.proto.task_pb2
8
9
  import google.protobuf.descriptor
@@ -169,6 +170,89 @@ class PushTaskResResponse(google.protobuf.message.Message):
169
170
  def ClearField(self, field_name: typing_extensions.Literal["reconnect",b"reconnect","results",b"results"]) -> None: ...
170
171
  global___PushTaskResResponse = PushTaskResResponse
171
172
 
173
+ class PullMessagesRequest(google.protobuf.message.Message):
174
+ """PullMessages messages"""
175
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
176
+ NODE_FIELD_NUMBER: builtins.int
177
+ MESSAGE_IDS_FIELD_NUMBER: builtins.int
178
+ @property
179
+ def node(self) -> flwr.proto.node_pb2.Node: ...
180
+ @property
181
+ def message_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]: ...
182
+ def __init__(self,
183
+ *,
184
+ node: typing.Optional[flwr.proto.node_pb2.Node] = ...,
185
+ message_ids: typing.Optional[typing.Iterable[typing.Text]] = ...,
186
+ ) -> None: ...
187
+ def HasField(self, field_name: typing_extensions.Literal["node",b"node"]) -> builtins.bool: ...
188
+ def ClearField(self, field_name: typing_extensions.Literal["message_ids",b"message_ids","node",b"node"]) -> None: ...
189
+ global___PullMessagesRequest = PullMessagesRequest
190
+
191
+ class PullMessagesResponse(google.protobuf.message.Message):
192
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
193
+ RECONNECT_FIELD_NUMBER: builtins.int
194
+ MESSAGES_LIST_FIELD_NUMBER: builtins.int
195
+ @property
196
+ def reconnect(self) -> global___Reconnect: ...
197
+ @property
198
+ def messages_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.Message]: ...
199
+ def __init__(self,
200
+ *,
201
+ reconnect: typing.Optional[global___Reconnect] = ...,
202
+ messages_list: typing.Optional[typing.Iterable[flwr.proto.message_pb2.Message]] = ...,
203
+ ) -> None: ...
204
+ def HasField(self, field_name: typing_extensions.Literal["reconnect",b"reconnect"]) -> builtins.bool: ...
205
+ def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list","reconnect",b"reconnect"]) -> None: ...
206
+ global___PullMessagesResponse = PullMessagesResponse
207
+
208
+ class PushMessagesRequest(google.protobuf.message.Message):
209
+ """PushMessages messages"""
210
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
211
+ NODE_FIELD_NUMBER: builtins.int
212
+ MESSAGES_LIST_FIELD_NUMBER: builtins.int
213
+ @property
214
+ def node(self) -> flwr.proto.node_pb2.Node: ...
215
+ @property
216
+ def messages_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.Message]: ...
217
+ def __init__(self,
218
+ *,
219
+ node: typing.Optional[flwr.proto.node_pb2.Node] = ...,
220
+ messages_list: typing.Optional[typing.Iterable[flwr.proto.message_pb2.Message]] = ...,
221
+ ) -> None: ...
222
+ def HasField(self, field_name: typing_extensions.Literal["node",b"node"]) -> builtins.bool: ...
223
+ def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list","node",b"node"]) -> None: ...
224
+ global___PushMessagesRequest = PushMessagesRequest
225
+
226
+ class PushMessagesResponse(google.protobuf.message.Message):
227
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
228
+ class ResultsEntry(google.protobuf.message.Message):
229
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
230
+ KEY_FIELD_NUMBER: builtins.int
231
+ VALUE_FIELD_NUMBER: builtins.int
232
+ key: typing.Text
233
+ value: builtins.int
234
+ def __init__(self,
235
+ *,
236
+ key: typing.Text = ...,
237
+ value: builtins.int = ...,
238
+ ) -> None: ...
239
+ def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
240
+
241
+ RECONNECT_FIELD_NUMBER: builtins.int
242
+ RESULTS_FIELD_NUMBER: builtins.int
243
+ @property
244
+ def reconnect(self) -> global___Reconnect: ...
245
+ @property
246
+ def results(self) -> google.protobuf.internal.containers.ScalarMap[typing.Text, builtins.int]: ...
247
+ def __init__(self,
248
+ *,
249
+ reconnect: typing.Optional[global___Reconnect] = ...,
250
+ results: typing.Optional[typing.Mapping[typing.Text, builtins.int]] = ...,
251
+ ) -> None: ...
252
+ def HasField(self, field_name: typing_extensions.Literal["reconnect",b"reconnect"]) -> builtins.bool: ...
253
+ def ClearField(self, field_name: typing_extensions.Literal["reconnect",b"reconnect","results",b"results"]) -> None: ...
254
+ global___PushMessagesResponse = PushMessagesResponse
255
+
172
256
  class Reconnect(google.protobuf.message.Message):
173
257
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
174
258
  RECONNECT_FIELD_NUMBER: builtins.int
@@ -36,11 +36,21 @@ class FleetStub(object):
36
36
  request_serializer=flwr_dot_proto_dot_fleet__pb2.PullTaskInsRequest.SerializeToString,
37
37
  response_deserializer=flwr_dot_proto_dot_fleet__pb2.PullTaskInsResponse.FromString,
38
38
  )
39
+ self.PullMessages = channel.unary_unary(
40
+ '/flwr.proto.Fleet/PullMessages',
41
+ request_serializer=flwr_dot_proto_dot_fleet__pb2.PullMessagesRequest.SerializeToString,
42
+ response_deserializer=flwr_dot_proto_dot_fleet__pb2.PullMessagesResponse.FromString,
43
+ )
39
44
  self.PushTaskRes = channel.unary_unary(
40
45
  '/flwr.proto.Fleet/PushTaskRes',
41
46
  request_serializer=flwr_dot_proto_dot_fleet__pb2.PushTaskResRequest.SerializeToString,
42
47
  response_deserializer=flwr_dot_proto_dot_fleet__pb2.PushTaskResResponse.FromString,
43
48
  )
49
+ self.PushMessages = channel.unary_unary(
50
+ '/flwr.proto.Fleet/PushMessages',
51
+ request_serializer=flwr_dot_proto_dot_fleet__pb2.PushMessagesRequest.SerializeToString,
52
+ response_deserializer=flwr_dot_proto_dot_fleet__pb2.PushMessagesResponse.FromString,
53
+ )
44
54
  self.GetRun = channel.unary_unary(
45
55
  '/flwr.proto.Fleet/GetRun',
46
56
  request_serializer=flwr_dot_proto_dot_run__pb2.GetRunRequest.SerializeToString,
@@ -83,6 +93,12 @@ class FleetServicer(object):
83
93
  context.set_details('Method not implemented!')
84
94
  raise NotImplementedError('Method not implemented!')
85
95
 
96
+ def PullMessages(self, request, context):
97
+ """Missing associated documentation comment in .proto file."""
98
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
99
+ context.set_details('Method not implemented!')
100
+ raise NotImplementedError('Method not implemented!')
101
+
86
102
  def PushTaskRes(self, request, context):
87
103
  """Complete one or more tasks, if possible
88
104
 
@@ -92,6 +108,12 @@ class FleetServicer(object):
92
108
  context.set_details('Method not implemented!')
93
109
  raise NotImplementedError('Method not implemented!')
94
110
 
111
+ def PushMessages(self, request, context):
112
+ """Missing associated documentation comment in .proto file."""
113
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
114
+ context.set_details('Method not implemented!')
115
+ raise NotImplementedError('Method not implemented!')
116
+
95
117
  def GetRun(self, request, context):
96
118
  """Missing associated documentation comment in .proto file."""
97
119
  context.set_code(grpc.StatusCode.UNIMPLEMENTED)
@@ -128,11 +150,21 @@ def add_FleetServicer_to_server(servicer, server):
128
150
  request_deserializer=flwr_dot_proto_dot_fleet__pb2.PullTaskInsRequest.FromString,
129
151
  response_serializer=flwr_dot_proto_dot_fleet__pb2.PullTaskInsResponse.SerializeToString,
130
152
  ),
153
+ 'PullMessages': grpc.unary_unary_rpc_method_handler(
154
+ servicer.PullMessages,
155
+ request_deserializer=flwr_dot_proto_dot_fleet__pb2.PullMessagesRequest.FromString,
156
+ response_serializer=flwr_dot_proto_dot_fleet__pb2.PullMessagesResponse.SerializeToString,
157
+ ),
131
158
  'PushTaskRes': grpc.unary_unary_rpc_method_handler(
132
159
  servicer.PushTaskRes,
133
160
  request_deserializer=flwr_dot_proto_dot_fleet__pb2.PushTaskResRequest.FromString,
134
161
  response_serializer=flwr_dot_proto_dot_fleet__pb2.PushTaskResResponse.SerializeToString,
135
162
  ),
163
+ 'PushMessages': grpc.unary_unary_rpc_method_handler(
164
+ servicer.PushMessages,
165
+ request_deserializer=flwr_dot_proto_dot_fleet__pb2.PushMessagesRequest.FromString,
166
+ response_serializer=flwr_dot_proto_dot_fleet__pb2.PushMessagesResponse.SerializeToString,
167
+ ),
136
168
  'GetRun': grpc.unary_unary_rpc_method_handler(
137
169
  servicer.GetRun,
138
170
  request_deserializer=flwr_dot_proto_dot_run__pb2.GetRunRequest.FromString,
@@ -221,6 +253,23 @@ class Fleet(object):
221
253
  options, channel_credentials,
222
254
  insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
223
255
 
256
+ @staticmethod
257
+ def PullMessages(request,
258
+ target,
259
+ options=(),
260
+ channel_credentials=None,
261
+ call_credentials=None,
262
+ insecure=False,
263
+ compression=None,
264
+ wait_for_ready=None,
265
+ timeout=None,
266
+ metadata=None):
267
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.Fleet/PullMessages',
268
+ flwr_dot_proto_dot_fleet__pb2.PullMessagesRequest.SerializeToString,
269
+ flwr_dot_proto_dot_fleet__pb2.PullMessagesResponse.FromString,
270
+ options, channel_credentials,
271
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
272
+
224
273
  @staticmethod
225
274
  def PushTaskRes(request,
226
275
  target,
@@ -238,6 +287,23 @@ class Fleet(object):
238
287
  options, channel_credentials,
239
288
  insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
240
289
 
290
+ @staticmethod
291
+ def PushMessages(request,
292
+ target,
293
+ options=(),
294
+ channel_credentials=None,
295
+ call_credentials=None,
296
+ insecure=False,
297
+ compression=None,
298
+ wait_for_ready=None,
299
+ timeout=None,
300
+ metadata=None):
301
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.Fleet/PushMessages',
302
+ flwr_dot_proto_dot_fleet__pb2.PushMessagesRequest.SerializeToString,
303
+ flwr_dot_proto_dot_fleet__pb2.PushMessagesResponse.FromString,
304
+ options, channel_credentials,
305
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
306
+
241
307
  @staticmethod
242
308
  def GetRun(request,
243
309
  target,
@@ -30,6 +30,10 @@ class FleetStub:
30
30
  HTTP API path: /api/v1/fleet/pull-task-ins
31
31
  """
32
32
 
33
+ PullMessages: grpc.UnaryUnaryMultiCallable[
34
+ flwr.proto.fleet_pb2.PullMessagesRequest,
35
+ flwr.proto.fleet_pb2.PullMessagesResponse]
36
+
33
37
  PushTaskRes: grpc.UnaryUnaryMultiCallable[
34
38
  flwr.proto.fleet_pb2.PushTaskResRequest,
35
39
  flwr.proto.fleet_pb2.PushTaskResResponse]
@@ -38,6 +42,10 @@ class FleetStub:
38
42
  HTTP API path: /api/v1/fleet/push-task-res
39
43
  """
40
44
 
45
+ PushMessages: grpc.UnaryUnaryMultiCallable[
46
+ flwr.proto.fleet_pb2.PushMessagesRequest,
47
+ flwr.proto.fleet_pb2.PushMessagesResponse]
48
+
41
49
  GetRun: grpc.UnaryUnaryMultiCallable[
42
50
  flwr.proto.run_pb2.GetRunRequest,
43
51
  flwr.proto.run_pb2.GetRunResponse]
@@ -78,6 +86,12 @@ class FleetServicer(metaclass=abc.ABCMeta):
78
86
  """
79
87
  pass
80
88
 
89
+ @abc.abstractmethod
90
+ def PullMessages(self,
91
+ request: flwr.proto.fleet_pb2.PullMessagesRequest,
92
+ context: grpc.ServicerContext,
93
+ ) -> flwr.proto.fleet_pb2.PullMessagesResponse: ...
94
+
81
95
  @abc.abstractmethod
82
96
  def PushTaskRes(self,
83
97
  request: flwr.proto.fleet_pb2.PushTaskResRequest,
@@ -89,6 +103,12 @@ class FleetServicer(metaclass=abc.ABCMeta):
89
103
  """
90
104
  pass
91
105
 
106
+ @abc.abstractmethod
107
+ def PushMessages(self,
108
+ request: flwr.proto.fleet_pb2.PushMessagesRequest,
109
+ context: grpc.ServicerContext,
110
+ ) -> flwr.proto.fleet_pb2.PushMessagesResponse: ...
111
+
92
112
  @abc.abstractmethod
93
113
  def GetRun(self,
94
114
  request: flwr.proto.run_pb2.GetRunRequest,
@@ -118,8 +118,9 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
118
118
  ffs: Ffs = self.ffs_factory.ffs()
119
119
  fab_hash = ffs.put(fab.content, {})
120
120
  _raise_if(
121
- fab_hash != fab.hash_str,
122
- f"FAB ({fab.hash_str}) hash from request doesn't match contents",
121
+ validation_error=fab_hash != fab.hash_str,
122
+ request_name="CreateRun",
123
+ detail=f"FAB ({fab.hash_str}) hash from request doesn't match contents",
123
124
  )
124
125
  else:
125
126
  fab_hash = ""
@@ -155,12 +156,22 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
155
156
  task_ins.task.pushed_at = pushed_at
156
157
 
157
158
  # Validate request
158
- _raise_if(len(request.task_ins_list) == 0, "`task_ins_list` must not be empty")
159
+ _raise_if(
160
+ validation_error=len(request.task_ins_list) == 0,
161
+ request_name="PushTaskIns",
162
+ detail="`task_ins_list` must not be empty",
163
+ )
159
164
  for task_ins in request.task_ins_list:
160
165
  validation_errors = validate_task_ins_or_res(task_ins)
161
- _raise_if(bool(validation_errors), ", ".join(validation_errors))
162
166
  _raise_if(
163
- request.run_id != task_ins.run_id, "`task_ins` has mismatched `run_id`"
167
+ validation_error=bool(validation_errors),
168
+ request_name="PushTaskIns",
169
+ detail=", ".join(validation_errors),
170
+ )
171
+ _raise_if(
172
+ validation_error=request.run_id != task_ins.run_id,
173
+ request_name="PushTaskIns",
174
+ detail="`task_ins` has mismatched `run_id`",
164
175
  )
165
176
 
166
177
  # Store each TaskIns
@@ -199,7 +210,9 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
199
210
  # Validate request
200
211
  for task_res in task_res_list:
201
212
  _raise_if(
202
- request.run_id != task_res.run_id, "`task_res` has mismatched `run_id`"
213
+ validation_error=request.run_id != task_res.run_id,
214
+ request_name="PullTaskRes",
215
+ detail="`task_res` has mismatched `run_id`",
203
216
  )
204
217
 
205
218
  # Delete the TaskIns/TaskRes pairs if TaskRes is found
@@ -344,6 +357,7 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
344
357
  return GetRunStatusResponse(run_status_dict=run_status_dict)
345
358
 
346
359
 
347
- def _raise_if(validation_error: bool, detail: str) -> None:
360
+ def _raise_if(validation_error: bool, request_name: str, detail: str) -> None:
361
+ """Raise a `ValueError` with a detailed message if a validation error occurs."""
348
362
  if validation_error:
349
- raise ValueError(f"Malformed PushTaskInsRequest: {detail}")
363
+ raise ValueError(f"Malformed {request_name}: {detail}")
@@ -30,8 +30,12 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
30
30
  DeleteNodeResponse,
31
31
  PingRequest,
32
32
  PingResponse,
33
+ PullMessagesRequest,
34
+ PullMessagesResponse,
33
35
  PullTaskInsRequest,
34
36
  PullTaskInsResponse,
37
+ PushMessagesRequest,
38
+ PushMessagesResponse,
35
39
  PushTaskResRequest,
36
40
  PushTaskResResponse,
37
41
  )
@@ -95,6 +99,12 @@ class FleetServicer(fleet_pb2_grpc.FleetServicer):
95
99
  state=self.state_factory.state(),
96
100
  )
97
101
 
102
+ def PullMessages(
103
+ self, request: PullMessagesRequest, context: grpc.ServicerContext
104
+ ) -> PullMessagesResponse:
105
+ """Pull Messages."""
106
+ return PullMessagesResponse()
107
+
98
108
  def PushTaskRes(
99
109
  self, request: PushTaskResRequest, context: grpc.ServicerContext
100
110
  ) -> PushTaskResResponse:
@@ -118,6 +128,12 @@ class FleetServicer(fleet_pb2_grpc.FleetServicer):
118
128
 
119
129
  return res
120
130
 
131
+ def PushMessages(
132
+ self, request: PushMessagesRequest, context: grpc.ServicerContext
133
+ ) -> PushMessagesResponse:
134
+ """Push Messages."""
135
+ return PushMessagesResponse()
136
+
121
137
  def GetRun(
122
138
  self, request: GetRunRequest, context: grpc.ServicerContext
123
139
  ) -> GetRunResponse:
@@ -223,5 +223,6 @@ class AuthenticateServerInterceptor(grpc.ServerInterceptor): # type: ignore
223
223
  # No `node_id` exists for the provided `public_key`
224
224
  # Handle `CreateNode` here instead of calling the default method handler
225
225
  # Note: the innermost `CreateNode` method will never be called
226
- node_id = state.create_node(request.ping_interval, public_key_bytes)
226
+ node_id = state.create_node(request.ping_interval)
227
+ state.set_node_public_key(node_id, public_key_bytes)
227
228
  return CreateNodeResponse(node=Node(node_id=node_id, anonymous=False))
@@ -62,6 +62,7 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
62
62
  # Map node_id to (online_until, ping_interval)
63
63
  self.node_ids: dict[int, tuple[float, float]] = {}
64
64
  self.public_key_to_node_id: dict[bytes, int] = {}
65
+ self.node_id_to_public_key: dict[int, bytes] = {}
65
66
 
66
67
  # Map run_id to RunRecord
67
68
  self.run_ids: dict[int, RunRecord] = {}
@@ -306,9 +307,7 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
306
307
  """
307
308
  return len(self.task_res_store)
308
309
 
309
- def create_node(
310
- self, ping_interval: float, public_key: Optional[bytes] = None
311
- ) -> int:
310
+ def create_node(self, ping_interval: float) -> int:
312
311
  """Create, store in the link state, and return `node_id`."""
313
312
  # Sample a random int64 as node_id
314
313
  node_id = generate_rand_int_from_bytes(NODE_ID_NUM_BYTES)
@@ -318,33 +317,18 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
318
317
  log(ERROR, "Unexpected node registration failure.")
319
318
  return 0
320
319
 
321
- if public_key is not None:
322
- if (
323
- public_key in self.public_key_to_node_id
324
- or node_id in self.public_key_to_node_id.values()
325
- ):
326
- log(ERROR, "Unexpected node registration failure.")
327
- return 0
328
-
329
- self.public_key_to_node_id[public_key] = node_id
330
-
331
320
  self.node_ids[node_id] = (time.time() + ping_interval, ping_interval)
332
321
  return node_id
333
322
 
334
- def delete_node(self, node_id: int, public_key: Optional[bytes] = None) -> None:
323
+ def delete_node(self, node_id: int) -> None:
335
324
  """Delete a node."""
336
325
  with self.lock:
337
326
  if node_id not in self.node_ids:
338
327
  raise ValueError(f"Node {node_id} not found")
339
328
 
340
- if public_key is not None:
341
- if (
342
- public_key not in self.public_key_to_node_id
343
- or node_id not in self.public_key_to_node_id.values()
344
- ):
345
- raise ValueError("Public key or node_id not found")
346
-
347
- del self.public_key_to_node_id[public_key]
329
+ # Remove node ID <> public key mappings
330
+ if pk := self.node_id_to_public_key.pop(node_id, None):
331
+ del self.public_key_to_node_id[pk]
348
332
 
349
333
  del self.node_ids[node_id]
350
334
 
@@ -366,6 +350,26 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
366
350
  if online_until > current_time
367
351
  }
368
352
 
353
+ def set_node_public_key(self, node_id: int, public_key: bytes) -> None:
354
+ """Set `public_key` for the specified `node_id`."""
355
+ with self.lock:
356
+ if node_id not in self.node_ids:
357
+ raise ValueError(f"Node {node_id} not found")
358
+
359
+ if public_key in self.public_key_to_node_id:
360
+ raise ValueError("Public key already in use")
361
+
362
+ self.public_key_to_node_id[public_key] = node_id
363
+ self.node_id_to_public_key[node_id] = public_key
364
+
365
+ def get_node_public_key(self, node_id: int) -> Optional[bytes]:
366
+ """Get `public_key` for the specified `node_id`."""
367
+ with self.lock:
368
+ if node_id not in self.node_ids:
369
+ raise ValueError(f"Node {node_id} not found")
370
+
371
+ return self.node_id_to_public_key.get(node_id)
372
+
369
373
  def get_node_id(self, node_public_key: bytes) -> Optional[int]:
370
374
  """Retrieve stored `node_id` filtered by `node_public_keys`."""
371
375
  return self.public_key_to_node_id.get(node_public_key)