flwr-nightly 1.19.0.dev20250607__tar.gz → 1.19.0.dev20250610__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 (364) hide show
  1. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/PKG-INFO +1 -1
  2. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/grpc_rere_client/connection.py +3 -1
  3. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/inflatable.py +0 -12
  4. flwr_nightly-1.19.0.dev20250610/py/flwr/common/inflatable_grpc_utils.py +99 -0
  5. flwr_nightly-1.19.0.dev20250607/py/flwr/common/inflatable_grpc_utils.py → flwr_nightly-1.19.0.dev20250610/py/flwr/common/inflatable_utils.py +61 -82
  6. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/grid/grpc_grid.py +3 -1
  7. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +25 -63
  8. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +57 -1
  9. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +7 -7
  10. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supercore/object_store/in_memory_object_store.py +5 -1
  11. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/start_client_internal.py +101 -59
  12. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/pyproject.toml +1 -1
  13. flwr_nightly-1.19.0.dev20250607/py/flwr/common/inflatable_utils.py +0 -75
  14. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/README.md +0 -0
  15. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/__init__.py +0 -0
  16. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/app/__init__.py +0 -0
  17. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/app/error.py +0 -0
  18. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/app/metadata.py +0 -0
  19. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/__init__.py +0 -0
  20. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/app.py +0 -0
  21. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  22. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  23. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/build.py +0 -0
  24. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  25. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/config_utils.py +0 -0
  26. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/constant.py +0 -0
  27. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/example.py +0 -0
  28. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/install.py +0 -0
  29. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/log.py +0 -0
  30. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/login/__init__.py +0 -0
  31. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/login/login.py +0 -0
  32. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/ls.py +0 -0
  33. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/__init__.py +0 -0
  34. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/new.py +0 -0
  35. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/__init__.py +0 -0
  36. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  37. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  38. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  39. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  40. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  41. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/__init__.py +0 -0
  42. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  43. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  44. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  45. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  46. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  47. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  48. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  49. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  50. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  51. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  52. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  53. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  54. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  55. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  56. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  57. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  58. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  59. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  60. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  61. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  62. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  63. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  64. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  65. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  66. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  67. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  68. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  69. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  70. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  71. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  72. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  73. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  74. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  75. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  76. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  77. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  78. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  79. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  80. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  81. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  82. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  83. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  84. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  85. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  86. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  87. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/run/__init__.py +0 -0
  88. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/run/run.py +0 -0
  89. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/stop.py +0 -0
  90. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/cli/utils.py +0 -0
  91. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/__init__.py +0 -0
  92. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/client.py +0 -0
  93. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/client_app.py +0 -0
  94. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/clientapp/__init__.py +0 -0
  95. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/clientapp/utils.py +0 -0
  96. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  97. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  98. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  99. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  100. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  101. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  102. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/message_handler/__init__.py +0 -0
  103. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/message_handler/message_handler.py +0 -0
  104. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/mod/__init__.py +0 -0
  105. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/mod/centraldp_mods.py +0 -0
  106. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/mod/comms_mods.py +0 -0
  107. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/mod/localdp_mod.py +0 -0
  108. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  109. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  110. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  111. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/mod/utils.py +0 -0
  112. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/numpy_client.py +0 -0
  113. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/rest_client/__init__.py +0 -0
  114. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/rest_client/connection.py +0 -0
  115. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/run_info_store.py +0 -0
  116. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/client/typing.py +0 -0
  117. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/clientapp/__init__.py +0 -0
  118. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/__init__.py +0 -0
  119. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/address.py +0 -0
  120. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/args.py +0 -0
  121. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/auth_plugin/__init__.py +0 -0
  122. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  123. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/config.py +0 -0
  124. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/constant.py +0 -0
  125. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/context.py +0 -0
  126. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/date.py +0 -0
  127. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/differential_privacy.py +0 -0
  128. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/differential_privacy_constants.py +0 -0
  129. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/dp.py +0 -0
  130. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  131. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  132. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/exit/__init__.py +0 -0
  133. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/exit/exit.py +0 -0
  134. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/exit/exit_code.py +0 -0
  135. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/exit_handlers.py +0 -0
  136. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/grpc.py +0 -0
  137. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/heartbeat.py +0 -0
  138. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/logger.py +0 -0
  139. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/message.py +0 -0
  140. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/object_ref.py +0 -0
  141. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/parameter.py +0 -0
  142. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/pyproject.py +0 -0
  143. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/record/__init__.py +0 -0
  144. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/record/array.py +0 -0
  145. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/record/arrayrecord.py +0 -0
  146. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/record/configrecord.py +0 -0
  147. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/record/conversion_utils.py +0 -0
  148. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/record/metricrecord.py +0 -0
  149. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/record/recorddict.py +0 -0
  150. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/record/typeddict.py +0 -0
  151. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/recorddict_compat.py +0 -0
  152. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/retry_invoker.py +0 -0
  153. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/secure_aggregation/__init__.py +0 -0
  154. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  155. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  156. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  157. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  158. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/secure_aggregation/quantization.py +0 -0
  159. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  160. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  161. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/serde.py +0 -0
  162. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/serde_utils.py +0 -0
  163. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/telemetry.py +0 -0
  164. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/typing.py +0 -0
  165. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/common/version.py +0 -0
  166. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/__init__.py +0 -0
  167. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/client/__init__.py +0 -0
  168. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/client/app.py +0 -0
  169. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
  170. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/client/grpc_client/connection.py +0 -0
  171. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/common/__init__.py +0 -0
  172. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/server/__init__.py +0 -0
  173. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/server/app.py +0 -0
  174. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/compat/simulation/__init__.py +0 -0
  175. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/__init__.py +0 -0
  176. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/clientappio_pb2.py +0 -0
  177. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/clientappio_pb2.pyi +0 -0
  178. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  179. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  180. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/error_pb2.py +0 -0
  181. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/error_pb2.pyi +0 -0
  182. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/error_pb2_grpc.py +0 -0
  183. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  184. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/exec_pb2.py +0 -0
  185. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/exec_pb2.pyi +0 -0
  186. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/exec_pb2_grpc.py +0 -0
  187. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  188. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/fab_pb2.py +0 -0
  189. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/fab_pb2.pyi +0 -0
  190. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  191. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  192. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/fleet_pb2.py +0 -0
  193. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/fleet_pb2.pyi +0 -0
  194. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  195. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  196. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  197. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  198. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  199. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  200. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/heartbeat_pb2.py +0 -0
  201. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
  202. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
  203. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
  204. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/log_pb2.py +0 -0
  205. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/log_pb2.pyi +0 -0
  206. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/log_pb2_grpc.py +0 -0
  207. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  208. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/message_pb2.py +0 -0
  209. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/message_pb2.pyi +0 -0
  210. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/message_pb2_grpc.py +0 -0
  211. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  212. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/node_pb2.py +0 -0
  213. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/node_pb2.pyi +0 -0
  214. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/node_pb2_grpc.py +0 -0
  215. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  216. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/recorddict_pb2.py +0 -0
  217. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  218. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  219. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  220. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/run_pb2.py +0 -0
  221. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/run_pb2.pyi +0 -0
  222. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/run_pb2_grpc.py +0 -0
  223. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  224. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/serverappio_pb2.py +0 -0
  225. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  226. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  227. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  228. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/simulationio_pb2.py +0 -0
  229. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/simulationio_pb2.pyi +0 -0
  230. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  231. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  232. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/transport_pb2.py +0 -0
  233. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/transport_pb2.pyi +0 -0
  234. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  235. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  236. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/py.typed +0 -0
  237. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/__init__.py +0 -0
  238. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/app.py +0 -0
  239. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/client_manager.py +0 -0
  240. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/client_proxy.py +0 -0
  241. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/compat/__init__.py +0 -0
  242. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/compat/app.py +0 -0
  243. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/compat/app_utils.py +0 -0
  244. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  245. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/compat/legacy_context.py +0 -0
  246. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/criterion.py +0 -0
  247. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  248. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/grid/__init__.py +0 -0
  249. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/grid/grid.py +0 -0
  250. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/grid/inmemory_grid.py +0 -0
  251. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/history.py +0 -0
  252. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/run_serverapp.py +0 -0
  253. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/server.py +0 -0
  254. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/server_app.py +0 -0
  255. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/server_config.py +0 -0
  256. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/serverapp/__init__.py +0 -0
  257. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/serverapp/app.py +0 -0
  258. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/serverapp_components.py +0 -0
  259. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/__init__.py +0 -0
  260. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/aggregate.py +0 -0
  261. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/bulyan.py +0 -0
  262. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  263. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  264. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  265. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  266. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  267. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedadagrad.py +0 -0
  268. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedadam.py +0 -0
  269. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedavg.py +0 -0
  270. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedavg_android.py +0 -0
  271. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedavgm.py +0 -0
  272. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedmedian.py +0 -0
  273. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedopt.py +0 -0
  274. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedprox.py +0 -0
  275. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  276. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  277. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  278. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  279. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/fedyogi.py +0 -0
  280. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/krum.py +0 -0
  281. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/qfedavg.py +0 -0
  282. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/strategy/strategy.py +0 -0
  283. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/__init__.py +0 -0
  284. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/ffs/__init__.py +0 -0
  285. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  286. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/ffs/ffs.py +0 -0
  287. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  288. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/__init__.py +0 -0
  289. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  290. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  291. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  292. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  293. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  294. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  295. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  296. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  297. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  298. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  299. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  300. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  301. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  302. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  303. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  304. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  305. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  306. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  307. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  308. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  309. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  310. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  311. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/linkstate/utils.py +0 -0
  312. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  313. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
  314. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/simulation/__init__.py +0 -0
  315. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  316. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  317. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/superlink/utils.py +0 -0
  318. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/typing.py +0 -0
  319. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/utils/__init__.py +0 -0
  320. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/utils/tensorboard.py +0 -0
  321. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/utils/validator.py +0 -0
  322. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/workflow/__init__.py +0 -0
  323. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/workflow/constant.py +0 -0
  324. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/workflow/default_workflows.py +0 -0
  325. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  326. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  327. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  328. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/serverapp/__init__.py +0 -0
  329. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/__init__.py +0 -0
  330. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/app.py +0 -0
  331. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/legacy_app.py +0 -0
  332. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/ray_transport/__init__.py +0 -0
  333. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  334. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  335. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/ray_transport/utils.py +0 -0
  336. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/run_simulation.py +0 -0
  337. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/simulation/simulationio_connection.py +0 -0
  338. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supercore/__init__.py +0 -0
  339. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supercore/object_store/__init__.py +0 -0
  340. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supercore/object_store/object_store.py +0 -0
  341. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
  342. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/__init__.py +0 -0
  343. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/app.py +0 -0
  344. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/deployment.py +0 -0
  345. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/exec_event_log_interceptor.py +0 -0
  346. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/exec_grpc.py +0 -0
  347. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/exec_servicer.py +0 -0
  348. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  349. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/executor.py +0 -0
  350. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superexec/simulation.py +0 -0
  351. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/superlink/__init__.py +0 -0
  352. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/__init__.py +0 -0
  353. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/cli/__init__.py +0 -0
  354. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/cli/flower_supernode.py +0 -0
  355. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
  356. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/nodestate/__init__.py +0 -0
  357. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
  358. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/nodestate/nodestate.py +0 -0
  359. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
  360. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/runtime/__init__.py +0 -0
  361. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/runtime/run_clientapp.py +0 -0
  362. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/servicer/__init__.py +0 -0
  363. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
  364. {flwr_nightly-1.19.0.dev20250607 → flwr_nightly-1.19.0.dev20250610}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr-nightly
3
- Version: 1.19.0.dev20250607
3
+ Version: 1.19.0.dev20250610
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  License: Apache-2.0
6
6
  Keywords: Artificial Intelligence,Federated AI,Federated Analytics,Federated Evaluation,Federated Learning,Flower,Machine Learning
@@ -32,9 +32,11 @@ from flwr.common.grpc import create_channel, on_channel_state_change
32
32
  from flwr.common.heartbeat import HeartbeatSender
33
33
  from flwr.common.inflatable import get_all_nested_objects
34
34
  from flwr.common.inflatable_grpc_utils import (
35
- inflate_object_from_contents,
36
35
  make_pull_object_fn_grpc,
37
36
  make_push_object_fn_grpc,
37
+ )
38
+ from flwr.common.inflatable_utils import (
39
+ inflate_object_from_contents,
38
40
  pull_objects,
39
41
  push_objects,
40
42
  )
@@ -18,11 +18,9 @@
18
18
  from __future__ import annotations
19
19
 
20
20
  import hashlib
21
- from logging import ERROR
22
21
  from typing import TypeVar, cast
23
22
 
24
23
  from .constant import HEAD_BODY_DIVIDER, HEAD_VALUE_DIVIDER
25
- from .logger import log
26
24
 
27
25
 
28
26
  class UnexpectedObjectContentError(Exception):
@@ -175,16 +173,6 @@ def get_object_body_len_from_object_content(object_content: bytes) -> int:
175
173
  return get_object_head_values_from_object_content(object_content)[2]
176
174
 
177
175
 
178
- def check_body_len_consistency(object_content: bytes) -> bool:
179
- """Check that the object body is of length as specified in the head."""
180
- try:
181
- body_len = get_object_body_len_from_object_content(object_content)
182
- return body_len == len(_get_object_body(object_content))
183
- except ValueError:
184
- log(ERROR, "Object content does match the expected format.")
185
- return False
186
-
187
-
188
176
  def get_object_head_values_from_object_content(
189
177
  object_content: bytes,
190
178
  ) -> tuple[str, list[str], int]:
@@ -0,0 +1,99 @@
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """InflatableObject utils."""
16
+
17
+
18
+ from typing import Callable
19
+
20
+ from flwr.proto.message_pb2 import ( # pylint: disable=E0611
21
+ PullObjectRequest,
22
+ PullObjectResponse,
23
+ PushObjectRequest,
24
+ PushObjectResponse,
25
+ )
26
+ from flwr.proto.node_pb2 import Node # pylint: disable=E0611
27
+
28
+ from .inflatable_utils import ObjectIdNotPreregisteredError, ObjectUnavailableError
29
+
30
+
31
+ def make_pull_object_fn_grpc(
32
+ pull_object_grpc: Callable[[PullObjectRequest], PullObjectResponse],
33
+ node: Node,
34
+ run_id: int,
35
+ ) -> Callable[[str], bytes]:
36
+ """Create a pull object function that uses gRPC to pull objects.
37
+
38
+ Parameters
39
+ ----------
40
+ pull_object_grpc : Callable[[PullObjectRequest], PullObjectResponse]
41
+ The gRPC function to pull objects, e.g., `FleetStub.PullObject`.
42
+ node : Node
43
+ The node making the request.
44
+ run_id : int
45
+ The run ID for the current operation.
46
+
47
+ Returns
48
+ -------
49
+ Callable[[str], bytes]
50
+ A function that takes an object ID and returns the object content as bytes.
51
+ The function raises `ObjectIdNotPreregisteredError` if the object ID is not
52
+ pre-registered, or `ObjectUnavailableError` if the object is not yet available.
53
+ """
54
+
55
+ def pull_object_fn(object_id: str) -> bytes:
56
+ request = PullObjectRequest(node=node, run_id=run_id, object_id=object_id)
57
+ response: PullObjectResponse = pull_object_grpc(request)
58
+ if not response.object_found:
59
+ raise ObjectIdNotPreregisteredError(object_id)
60
+ if not response.object_available:
61
+ raise ObjectUnavailableError(object_id)
62
+ return response.object_content
63
+
64
+ return pull_object_fn
65
+
66
+
67
+ def make_push_object_fn_grpc(
68
+ push_object_grpc: Callable[[PushObjectRequest], PushObjectResponse],
69
+ node: Node,
70
+ run_id: int,
71
+ ) -> Callable[[str, bytes], None]:
72
+ """Create a push object function that uses gRPC to push objects.
73
+
74
+ Parameters
75
+ ----------
76
+ push_object_grpc : Callable[[PushObjectRequest], PushObjectResponse]
77
+ The gRPC function to push objects, e.g., `FleetStub.PushObject`.
78
+ node : Node
79
+ The node making the request.
80
+ run_id : int
81
+ The run ID for the current operation.
82
+
83
+ Returns
84
+ -------
85
+ Callable[[str, bytes], None]
86
+ A function that takes an object ID and its content as bytes, and pushes it
87
+ to the servicer. The function raises `ObjectIdNotPreregisteredError` if
88
+ the object ID is not pre-registered.
89
+ """
90
+
91
+ def push_object_fn(object_id: str, object_content: bytes) -> None:
92
+ request = PushObjectRequest(
93
+ node=node, run_id=run_id, object_id=object_id, object_content=object_content
94
+ )
95
+ response: PushObjectResponse = push_object_grpc(request)
96
+ if not response.stored:
97
+ raise ObjectIdNotPreregisteredError(object_id)
98
+
99
+ return push_object_fn
@@ -12,8 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  # ==============================================================================
15
- """InflatableObject utils."""
16
-
15
+ """InflatableObject utilities."""
17
16
 
18
17
  import concurrent.futures
19
18
  import random
@@ -21,15 +20,9 @@ import threading
21
20
  import time
22
21
  from typing import Callable, Optional
23
22
 
24
- from flwr.proto.message_pb2 import ( # pylint: disable=E0611
25
- PullObjectRequest,
26
- PullObjectResponse,
27
- PushObjectRequest,
28
- PushObjectResponse,
29
- )
30
- from flwr.proto.node_pb2 import Node # pylint: disable=E0611
31
-
32
23
  from .constant import (
24
+ HEAD_BODY_DIVIDER,
25
+ HEAD_VALUE_DIVIDER,
33
26
  MAX_CONCURRENT_PULLS,
34
27
  MAX_CONCURRENT_PUSHES,
35
28
  PULL_BACKOFF_CAP,
@@ -37,7 +30,14 @@ from .constant import (
37
30
  PULL_MAX_TIME,
38
31
  PULL_MAX_TRIES_PER_OBJECT,
39
32
  )
40
- from .inflatable import InflatableObject, get_object_head_values_from_object_content
33
+ from .inflatable import (
34
+ InflatableObject,
35
+ UnexpectedObjectContentError,
36
+ _get_object_head,
37
+ get_object_head_values_from_object_content,
38
+ get_object_id,
39
+ is_valid_sha256_hash,
40
+ )
41
41
  from .message import Message
42
42
  from .record import Array, ArrayRecord, ConfigRecord, MetricRecord, RecordDict
43
43
 
@@ -67,77 +67,6 @@ class ObjectIdNotPreregisteredError(Exception):
67
67
  super().__init__(f"Object with ID '{object_id}' could not be found.")
68
68
 
69
69
 
70
- def make_pull_object_fn_grpc(
71
- pull_object_grpc: Callable[[PullObjectRequest], PullObjectResponse],
72
- node: Node,
73
- run_id: int,
74
- ) -> Callable[[str], bytes]:
75
- """Create a pull object function that uses gRPC to pull objects.
76
-
77
- Parameters
78
- ----------
79
- pull_object_grpc : Callable[[PullObjectRequest], PullObjectResponse]
80
- The gRPC function to pull objects, e.g., `FleetStub.PullObject`.
81
- node : Node
82
- The node making the request.
83
- run_id : int
84
- The run ID for the current operation.
85
-
86
- Returns
87
- -------
88
- Callable[[str], bytes]
89
- A function that takes an object ID and returns the object content as bytes.
90
- The function raises `ObjectIdNotPreregisteredError` if the object ID is not
91
- pre-registered, or `ObjectUnavailableError` if the object is not yet available.
92
- """
93
-
94
- def pull_object_fn(object_id: str) -> bytes:
95
- request = PullObjectRequest(node=node, run_id=run_id, object_id=object_id)
96
- response: PullObjectResponse = pull_object_grpc(request)
97
- if not response.object_found:
98
- raise ObjectIdNotPreregisteredError(object_id)
99
- if not response.object_available:
100
- raise ObjectUnavailableError(object_id)
101
- return response.object_content
102
-
103
- return pull_object_fn
104
-
105
-
106
- def make_push_object_fn_grpc(
107
- push_object_grpc: Callable[[PushObjectRequest], PushObjectResponse],
108
- node: Node,
109
- run_id: int,
110
- ) -> Callable[[str, bytes], None]:
111
- """Create a push object function that uses gRPC to push objects.
112
-
113
- Parameters
114
- ----------
115
- push_object_grpc : Callable[[PushObjectRequest], PushObjectResponse]
116
- The gRPC function to push objects, e.g., `FleetStub.PushObject`.
117
- node : Node
118
- The node making the request.
119
- run_id : int
120
- The run ID for the current operation.
121
-
122
- Returns
123
- -------
124
- Callable[[str, bytes], None]
125
- A function that takes an object ID and its content as bytes, and pushes it
126
- to the servicer. The function raises `ObjectIdNotPreregisteredError` if
127
- the object ID is not pre-registered.
128
- """
129
-
130
- def push_object_fn(object_id: str, object_content: bytes) -> None:
131
- request = PushObjectRequest(
132
- node=node, run_id=run_id, object_id=object_id, object_content=object_content
133
- )
134
- response: PushObjectResponse = push_object_grpc(request)
135
- if not response.stored:
136
- raise ObjectIdNotPreregisteredError(object_id)
137
-
138
- return push_object_fn
139
-
140
-
141
70
  def push_objects(
142
71
  objects: dict[str, InflatableObject],
143
72
  push_object_fn: Callable[[str, bytes], None],
@@ -360,3 +289,53 @@ def inflate_object_from_contents(
360
289
  del object_content # Free memory after inflation
361
290
  objects[object_id] = obj
362
291
  return obj
292
+
293
+
294
+ def validate_object_content(content: bytes) -> None:
295
+ """Validate the deflated content of an InflatableObject."""
296
+ try:
297
+ # Check if there is a head-body divider
298
+ index = content.find(HEAD_BODY_DIVIDER)
299
+ if index == -1:
300
+ raise ValueError(
301
+ "Unexpected format for object content. Head and body "
302
+ "could not be split."
303
+ )
304
+
305
+ head = _get_object_head(content)
306
+
307
+ # check if the head has three parts:
308
+ # <object_type> <children_ids> <object_body_len>
309
+ head_decoded = head.decode(encoding="utf-8")
310
+ head_parts = head_decoded.split(HEAD_VALUE_DIVIDER)
311
+
312
+ if len(head_parts) != 3:
313
+ raise ValueError("Unexpected format for object head.")
314
+
315
+ obj_type, children_str, body_len = head_parts
316
+
317
+ # Check that children IDs are valid IDs
318
+ children = children_str.split(",")
319
+ for children_id in children:
320
+ if children_id and not is_valid_sha256_hash(children_id):
321
+ raise ValueError(
322
+ f"Detected invalid object ID ({children_id}) in children."
323
+ )
324
+
325
+ # Check that object type is recognized
326
+ if obj_type not in inflatable_class_registry:
327
+ if obj_type != "CustomDataClass": # to allow for the class in tests
328
+ raise ValueError(f"Object of type {obj_type} is not supported.")
329
+
330
+ # Check if the body length in the head matches that of the body
331
+ actual_body_len = len(content) - len(head) - len(HEAD_BODY_DIVIDER)
332
+ if actual_body_len != int(body_len):
333
+ raise ValueError(
334
+ f"Object content length expected {body_len} bytes but got "
335
+ f"{actual_body_len} bytes."
336
+ )
337
+
338
+ except ValueError as err:
339
+ raise UnexpectedObjectContentError(
340
+ object_id=get_object_id(content), reason=str(err)
341
+ ) from err
@@ -30,9 +30,11 @@ from flwr.common.constant import (
30
30
  from flwr.common.grpc import create_channel, on_channel_state_change
31
31
  from flwr.common.inflatable import get_all_nested_objects
32
32
  from flwr.common.inflatable_grpc_utils import (
33
- inflate_object_from_contents,
34
33
  make_pull_object_fn_grpc,
35
34
  make_push_object_fn_grpc,
35
+ )
36
+ from flwr.common.inflatable_utils import (
37
+ inflate_object_from_contents,
36
38
  pull_objects,
37
39
  push_objects,
38
40
  )
@@ -15,13 +15,12 @@
15
15
  """Fleet API gRPC request-response servicer."""
16
16
 
17
17
 
18
- from logging import DEBUG, ERROR, INFO
18
+ from logging import DEBUG, INFO
19
19
 
20
20
  import grpc
21
21
  from google.protobuf.json_format import MessageToDict
22
22
 
23
- from flwr.common.constant import Status
24
- from flwr.common.inflatable import check_body_len_consistency
23
+ from flwr.common.inflatable import UnexpectedObjectContentError
25
24
  from flwr.common.logger import log
26
25
  from flwr.common.typing import InvalidRunStatusException
27
26
  from flwr.proto import fleet_pb2_grpc # pylint: disable=E0611
@@ -50,9 +49,8 @@ from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=
50
49
  from flwr.server.superlink.ffs.ffs_factory import FfsFactory
51
50
  from flwr.server.superlink.fleet.message_handler import message_handler
52
51
  from flwr.server.superlink.linkstate import LinkStateFactory
53
- from flwr.server.superlink.utils import abort_grpc_context, check_abort
52
+ from flwr.server.superlink.utils import abort_grpc_context
54
53
  from flwr.supercore.object_store import ObjectStoreFactory
55
- from flwr.supercore.object_store.object_store import NoObjectInStoreError
56
54
 
57
55
 
58
56
  class FleetServicer(fleet_pb2_grpc.FleetServicer):
@@ -185,39 +183,20 @@ class FleetServicer(fleet_pb2_grpc.FleetServicer):
185
183
  request.object_id,
186
184
  )
187
185
 
188
- state = self.state_factory.state()
189
-
190
- # Abort if the run is not running
191
- abort_msg = check_abort(
192
- request.run_id,
193
- [Status.PENDING, Status.STARTING, Status.FINISHED],
194
- state,
195
- )
196
- if abort_msg:
197
- abort_grpc_context(abort_msg, context)
198
-
199
- if request.node.node_id not in state.get_nodes(run_id=request.run_id):
200
- # Cancel insertion in ObjectStore
201
- context.abort(grpc.StatusCode.FAILED_PRECONDITION, "Unexpected node ID.")
202
-
203
- if not check_body_len_consistency(request.object_content):
204
- # Cancel insertion in ObjectStore
205
- context.abort(
206
- grpc.StatusCode.FAILED_PRECONDITION, "Unexpected object length"
207
- )
208
-
209
- # Init store
210
- store = self.objectstore_factory.store()
211
-
212
- # Insert in store
213
- stored = False
214
186
  try:
215
- store.put(request.object_id, request.object_content)
216
- stored = True
217
- except (NoObjectInStoreError, ValueError) as e:
218
- log(ERROR, str(e))
187
+ # Insert in Store
188
+ res = message_handler.push_object(
189
+ request=request,
190
+ state=self.state_factory.state(),
191
+ store=self.objectstore_factory.store(),
192
+ )
193
+ except InvalidRunStatusException as e:
194
+ abort_grpc_context(e.message, context)
195
+ except UnexpectedObjectContentError as e:
196
+ # Object content is not valid
197
+ context.abort(grpc.StatusCode.FAILED_PRECONDITION, str(e))
219
198
 
220
- return PushObjectResponse(stored=stored)
199
+ return res
221
200
 
222
201
  def PullObject(
223
202
  self, request: PullObjectRequest, context: grpc.ServicerContext
@@ -229,31 +208,14 @@ class FleetServicer(fleet_pb2_grpc.FleetServicer):
229
208
  request.object_id,
230
209
  )
231
210
 
232
- state = self.state_factory.state()
233
-
234
- # Abort if the run is not running
235
- abort_msg = check_abort(
236
- request.run_id,
237
- [Status.PENDING, Status.STARTING, Status.FINISHED],
238
- state,
239
- )
240
- if abort_msg:
241
- abort_grpc_context(abort_msg, context)
242
-
243
- if request.node.node_id not in state.get_nodes(run_id=request.run_id):
244
- # Cancel insertion in ObjectStore
245
- context.abort(grpc.StatusCode.FAILED_PRECONDITION, "Unexpected node ID.")
246
-
247
- # Init store
248
- store = self.objectstore_factory.store()
249
-
250
- # Fetch from store
251
- content = store.get(request.object_id)
252
- if content is not None:
253
- object_available = content != b""
254
- return PullObjectResponse(
255
- object_found=True,
256
- object_available=object_available,
257
- object_content=content,
211
+ try:
212
+ # Fetch from store
213
+ res = message_handler.pull_object(
214
+ request=request,
215
+ state=self.state_factory.state(),
216
+ store=self.objectstore_factory.store(),
258
217
  )
259
- return PullObjectResponse(object_found=False, object_available=False)
218
+ except InvalidRunStatusException as e:
219
+ abort_grpc_context(e.message, context)
220
+
221
+ return res
@@ -19,6 +19,7 @@ from typing import Optional
19
19
 
20
20
  from flwr.common import Message, log
21
21
  from flwr.common.constant import Status
22
+ from flwr.common.inflatable import UnexpectedObjectContentError
22
23
  from flwr.common.serde import (
23
24
  fab_to_proto,
24
25
  message_from_proto,
@@ -42,7 +43,13 @@ from flwr.proto.heartbeat_pb2 import ( # pylint: disable=E0611
42
43
  SendNodeHeartbeatRequest,
43
44
  SendNodeHeartbeatResponse,
44
45
  )
45
- from flwr.proto.message_pb2 import ObjectIDs # pylint: disable=E0611
46
+ from flwr.proto.message_pb2 import ( # pylint: disable=E0611
47
+ ObjectIDs,
48
+ PullObjectRequest,
49
+ PullObjectResponse,
50
+ PushObjectRequest,
51
+ PushObjectResponse,
52
+ )
46
53
  from flwr.proto.node_pb2 import Node # pylint: disable=E0611
47
54
  from flwr.proto.run_pb2 import ( # pylint: disable=E0611
48
55
  GetRunRequest,
@@ -203,3 +210,52 @@ def get_fab(
203
210
  return GetFabResponse(fab=fab_to_proto(fab))
204
211
 
205
212
  raise ValueError(f"Found no FAB with hash: {request.hash_str}")
213
+
214
+
215
+ def push_object(
216
+ request: PushObjectRequest, state: LinkState, store: ObjectStore
217
+ ) -> PushObjectResponse:
218
+ """Push Object."""
219
+ abort_msg = check_abort(
220
+ request.run_id,
221
+ [Status.PENDING, Status.STARTING, Status.FINISHED],
222
+ state,
223
+ )
224
+ if abort_msg:
225
+ raise InvalidRunStatusException(abort_msg)
226
+
227
+ stored = False
228
+ try:
229
+ store.put(request.object_id, request.object_content)
230
+ stored = True
231
+ except (NoObjectInStoreError, ValueError) as e:
232
+ log(ERROR, str(e))
233
+ except UnexpectedObjectContentError as e:
234
+ # Object content is not valid
235
+ log(ERROR, str(e))
236
+ raise
237
+ return PushObjectResponse(stored=stored)
238
+
239
+
240
+ def pull_object(
241
+ request: PullObjectRequest, state: LinkState, store: ObjectStore
242
+ ) -> PullObjectResponse:
243
+ """Pull Object."""
244
+ abort_msg = check_abort(
245
+ request.run_id,
246
+ [Status.PENDING, Status.STARTING, Status.FINISHED],
247
+ state,
248
+ )
249
+ if abort_msg:
250
+ raise InvalidRunStatusException(abort_msg)
251
+
252
+ # Fetch from store
253
+ content = store.get(request.object_id)
254
+ if content is not None:
255
+ object_available = content != b""
256
+ return PullObjectResponse(
257
+ object_found=True,
258
+ object_available=object_available,
259
+ object_content=content,
260
+ )
261
+ return PullObjectResponse(object_found=False, object_available=False)
@@ -23,7 +23,10 @@ import grpc
23
23
 
24
24
  from flwr.common import Message
25
25
  from flwr.common.constant import SUPERLINK_NODE_ID, Status
26
- from flwr.common.inflatable import check_body_len_consistency, get_descendant_object_ids
26
+ from flwr.common.inflatable import (
27
+ UnexpectedObjectContentError,
28
+ get_descendant_object_ids,
29
+ )
27
30
  from flwr.common.logger import log
28
31
  from flwr.common.serde import (
29
32
  context_from_proto,
@@ -424,12 +427,6 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
424
427
  # Cancel insertion in ObjectStore
425
428
  context.abort(grpc.StatusCode.FAILED_PRECONDITION, "Unexpected node ID.")
426
429
 
427
- if not check_body_len_consistency(request.object_content):
428
- # Cancel insertion in ObjectStore
429
- context.abort(
430
- grpc.StatusCode.FAILED_PRECONDITION, "Unexpected object length."
431
- )
432
-
433
430
  # Init store
434
431
  store = self.objectstore_factory.store()
435
432
 
@@ -440,6 +437,9 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
440
437
  stored = True
441
438
  except (NoObjectInStoreError, ValueError) as e:
442
439
  log(ERROR, str(e))
440
+ except UnexpectedObjectContentError as e:
441
+ # Object content is not valid
442
+ context.abort(grpc.StatusCode.FAILED_PRECONDITION, str(e))
443
443
 
444
444
  return PushObjectResponse(stored=stored)
445
445
 
@@ -18,6 +18,7 @@
18
18
  from typing import Optional
19
19
 
20
20
  from flwr.common.inflatable import get_object_id, is_valid_sha256_hash
21
+ from flwr.common.inflatable_utils import validate_object_content
21
22
 
22
23
  from .object_store import NoObjectInStoreError, ObjectStore
23
24
 
@@ -52,12 +53,15 @@ class InMemoryObjectStore(ObjectStore):
52
53
  f"Object with ID '{object_id}' was not pre-registered."
53
54
  )
54
55
 
55
- # Verify object_id and object_content match
56
56
  if self.verify:
57
+ # Verify object_id and object_content match
57
58
  object_id_from_content = get_object_id(object_content)
58
59
  if object_id != object_id_from_content:
59
60
  raise ValueError(f"Object ID {object_id} does not match content hash")
60
61
 
62
+ # Validate object content
63
+ validate_object_content(content=object_content)
64
+
61
65
  # Return if object is already present in the store
62
66
  if self.store[object_id] != b"":
63
67
  return