flwr-nightly 1.20.0.dev20250618__tar.gz → 1.20.0.dev20250619__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.
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/PKG-INFO +1 -1
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/build.py +14 -4
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/grpc_rere_client/connection.py +0 -24
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/rest_client/connection.py +0 -24
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/constant.py +1 -0
- flwr_nightly-1.20.0.dev20250619/py/flwr/proto/clientappio_pb2.py +49 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/clientappio_pb2.pyi +0 -17
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/clientappio_pb2_grpc.py +0 -34
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -13
- flwr_nightly-1.20.0.dev20250619/py/flwr/supercore/utils.py +32 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/superexec/exec_servicer.py +9 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/cli/flower_supernode.py +0 -7
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/cli/flwr_clientapp.py +2 -1
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/runtime/run_clientapp.py +7 -2
- flwr_nightly-1.20.0.dev20250619/py/flwr/supernode/servicer/clientappio/__init__.py +22 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +10 -91
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/start_client_internal.py +89 -66
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/pyproject.toml +1 -1
- flwr_nightly-1.20.0.dev20250618/py/flwr/proto/clientappio_pb2.py +0 -53
- flwr_nightly-1.20.0.dev20250618/py/flwr/supernode/servicer/clientappio/__init__.py +0 -24
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/README.md +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/app/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/app/error.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/app/metadata.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/constant.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/log.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/login/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/login/login.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/ls.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/stop.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/clientapp/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/clientapp/utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/run_info_store.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/clientapp/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/args.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/event_log_plugin/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/exit/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/exit/exit.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/exit/exit_code.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/heartbeat.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/inflatable.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/inflatable_grpc_utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/inflatable_rest_utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/inflatable_utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/record/array.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/record/arrayrecord.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/record/configrecord.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/record/metricrecord.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/record/recorddict.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/recorddict_compat.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/serde_utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/compat/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/compat/client/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/compat/client/app.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/compat/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/compat/common/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/compat/server/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/compat/server/app.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/compat/simulation/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/exec_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/exec_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/exec_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/heartbeat_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/log_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/log_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/log_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/recorddict_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/recorddict_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/serverappio_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/serverappio_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/simulationio_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/simulationio_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/py.typed +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/app.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/compat/grid_client_proxy.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/grid/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/grid/grid.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/grid/grpc_grid.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/grid/inmemory_grid.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/serverapp/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/serverapp/app.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/linkstate/utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/simulation/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/serverapp/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/simulation/legacy_app.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/simulation/run_simulation.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/simulation/simulationio_connection.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supercore/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supercore/ffs/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supercore/ffs/ffs.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supercore/object_store/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supercore/object_store/object_store.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/superexec/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/superexec/app.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/superexec/deployment.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/superexec/exec_event_log_interceptor.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/superexec/exec_grpc.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/superexec/executor.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/superexec/simulation.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/superlink/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/cli/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/nodestate/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/nodestate/nodestate.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/runtime/__init__.py +0 -0
- {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/servicer/__init__.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: flwr-nightly
|
3
|
-
Version: 1.20.0.
|
3
|
+
Version: 1.20.0.dev20250619
|
4
4
|
Summary: Flower: A Friendly Federated AI Framework
|
5
5
|
License: Apache-2.0
|
6
6
|
Keywords: Artificial Intelligence,Federated AI,Federated Analytics,Federated Evaluation,Federated Learning,Flower,Machine Learning
|
@@ -25,7 +25,12 @@ import pathspec
|
|
25
25
|
import tomli_w
|
26
26
|
import typer
|
27
27
|
|
28
|
-
from flwr.common.constant import
|
28
|
+
from flwr.common.constant import (
|
29
|
+
FAB_ALLOWED_EXTENSIONS,
|
30
|
+
FAB_DATE,
|
31
|
+
FAB_HASH_TRUNCATION,
|
32
|
+
FAB_MAX_SIZE,
|
33
|
+
)
|
29
34
|
|
30
35
|
from .config_utils import load as load_toml
|
31
36
|
from .config_utils import load_and_validate
|
@@ -57,7 +62,7 @@ def build(
|
|
57
62
|
Optional[Path],
|
58
63
|
typer.Option(help="Path of the Flower App to bundle into a FAB"),
|
59
64
|
] = None,
|
60
|
-
) ->
|
65
|
+
) -> None:
|
61
66
|
"""Build a Flower App into a Flower App Bundle (FAB).
|
62
67
|
|
63
68
|
You can run ``flwr build`` without any arguments to bundle the app located in the
|
@@ -119,8 +124,6 @@ def build(
|
|
119
124
|
f"🎊 Successfully built {fab_filename}", fg=typer.colors.GREEN, bold=True
|
120
125
|
)
|
121
126
|
|
122
|
-
return fab_filename, fab_hash
|
123
|
-
|
124
127
|
|
125
128
|
def build_fab(app: Path) -> tuple[bytes, str, dict[str, Any]]:
|
126
129
|
"""Build a FAB in memory and return the bytes, hash, and config.
|
@@ -193,6 +196,13 @@ def build_fab(app: Path) -> tuple[bytes, str, dict[str, Any]]:
|
|
193
196
|
write_to_zip(fab_file, ".info/CONTENT", list_file_content)
|
194
197
|
|
195
198
|
fab_bytes = fab_buffer.getvalue()
|
199
|
+
if len(fab_bytes) > FAB_MAX_SIZE:
|
200
|
+
raise ValueError(
|
201
|
+
f"FAB size exceeds maximum allowed size of {FAB_MAX_SIZE:,} bytes."
|
202
|
+
"To reduce the package size, consider ignoring unnecessary files "
|
203
|
+
"via your `.gitignore` file or excluding them from the build."
|
204
|
+
)
|
205
|
+
|
196
206
|
fab_hash = hashlib.sha256(fab_bytes).hexdigest()
|
197
207
|
|
198
208
|
return fab_bytes, fab_hash, config
|
@@ -17,7 +17,6 @@
|
|
17
17
|
|
18
18
|
from collections.abc import Iterator, Sequence
|
19
19
|
from contextlib import contextmanager
|
20
|
-
from copy import copy
|
21
20
|
from logging import DEBUG, ERROR
|
22
21
|
from pathlib import Path
|
23
22
|
from typing import Callable, Optional, Union, cast
|
@@ -25,8 +24,6 @@ from typing import Callable, Optional, Union, cast
|
|
25
24
|
import grpc
|
26
25
|
from cryptography.hazmat.primitives.asymmetric import ec
|
27
26
|
|
28
|
-
from flwr.app.metadata import Metadata
|
29
|
-
from flwr.client.message_handler.message_handler import validate_out_message
|
30
27
|
from flwr.common import GRPC_MAX_MESSAGE_LENGTH
|
31
28
|
from flwr.common.constant import HEARTBEAT_CALL_TIMEOUT, HEARTBEAT_DEFAULT_INTERVAL
|
32
29
|
from flwr.common.grpc import create_channel, on_channel_state_change
|
@@ -163,7 +160,6 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
163
160
|
if adapter_cls is None:
|
164
161
|
adapter_cls = FleetStub
|
165
162
|
stub = adapter_cls(channel)
|
166
|
-
metadata: Optional[Metadata] = None
|
167
163
|
node: Optional[Node] = None
|
168
164
|
|
169
165
|
def _should_giveup_fn(e: Exception) -> bool:
|
@@ -300,10 +296,6 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
300
296
|
# Inject
|
301
297
|
in_message.metadata.__dict__["_message_id"] = msg_id
|
302
298
|
|
303
|
-
# Remember `metadata` of the in message
|
304
|
-
nonlocal metadata
|
305
|
-
metadata = copy(in_message.metadata) if in_message else None
|
306
|
-
|
307
299
|
# Return the message if available
|
308
300
|
return in_message
|
309
301
|
|
@@ -314,19 +306,6 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
314
306
|
log(ERROR, "Node instance missing")
|
315
307
|
return
|
316
308
|
|
317
|
-
# Get the metadata of the incoming message
|
318
|
-
nonlocal metadata
|
319
|
-
if metadata is None:
|
320
|
-
log(ERROR, "No current message")
|
321
|
-
return
|
322
|
-
|
323
|
-
# Set message_id
|
324
|
-
message.metadata.__dict__["_message_id"] = message.object_id
|
325
|
-
# Validate out message
|
326
|
-
if not validate_out_message(message, metadata):
|
327
|
-
log(ERROR, "Invalid out message")
|
328
|
-
return
|
329
|
-
|
330
309
|
with no_object_id_recompute():
|
331
310
|
# Get all nested objects
|
332
311
|
all_objects = get_all_nested_objects(message)
|
@@ -358,9 +337,6 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
358
337
|
)
|
359
338
|
log(DEBUG, "Pushed %s objects to servicer.", len(objs_to_push))
|
360
339
|
|
361
|
-
# Cleanup
|
362
|
-
metadata = None
|
363
|
-
|
364
340
|
def get_run(run_id: int) -> Run:
|
365
341
|
# Call FleetAPI
|
366
342
|
get_run_request = GetRunRequest(node=node, run_id=run_id)
|
@@ -16,7 +16,6 @@
|
|
16
16
|
|
17
17
|
from collections.abc import Iterator
|
18
18
|
from contextlib import contextmanager
|
19
|
-
from copy import copy
|
20
19
|
from logging import DEBUG, ERROR, INFO, WARN
|
21
20
|
from typing import Callable, Optional, TypeVar, Union, cast
|
22
21
|
|
@@ -24,8 +23,6 @@ from cryptography.hazmat.primitives.asymmetric import ec
|
|
24
23
|
from google.protobuf.message import Message as GrpcMessage
|
25
24
|
from requests.exceptions import ConnectionError as RequestsConnectionError
|
26
25
|
|
27
|
-
from flwr.app.metadata import Metadata
|
28
|
-
from flwr.client.message_handler.message_handler import validate_out_message
|
29
26
|
from flwr.common import GRPC_MAX_MESSAGE_LENGTH
|
30
27
|
from flwr.common.constant import HEARTBEAT_DEFAULT_INTERVAL
|
31
28
|
from flwr.common.exit import ExitCode, flwr_exit
|
@@ -178,7 +175,6 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
178
175
|
log(ERROR, "Client authentication is not supported for this transport type.")
|
179
176
|
|
180
177
|
# Shared variables for inner functions
|
181
|
-
metadata: Optional[Metadata] = None
|
182
178
|
node: Optional[Node] = None
|
183
179
|
|
184
180
|
###########################################################################
|
@@ -367,10 +363,6 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
367
363
|
# Inject
|
368
364
|
in_message.metadata.__dict__["_message_id"] = msg_id
|
369
365
|
|
370
|
-
# Remember `metadata` of the in message
|
371
|
-
nonlocal metadata
|
372
|
-
metadata = copy(in_message.metadata) if in_message else None
|
373
|
-
|
374
366
|
return in_message
|
375
367
|
|
376
368
|
def send(message: Message) -> None:
|
@@ -380,19 +372,6 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
380
372
|
log(ERROR, "Node instance missing")
|
381
373
|
return
|
382
374
|
|
383
|
-
# Get incoming message
|
384
|
-
nonlocal metadata
|
385
|
-
if metadata is None:
|
386
|
-
log(ERROR, "No current message")
|
387
|
-
return
|
388
|
-
|
389
|
-
# Set message_id
|
390
|
-
message.metadata.__dict__["_message_id"] = message.object_id
|
391
|
-
# Validate out message
|
392
|
-
if not validate_out_message(message, metadata):
|
393
|
-
log(ERROR, "Invalid out message")
|
394
|
-
return
|
395
|
-
|
396
375
|
with no_object_id_recompute():
|
397
376
|
# Get all nested objects
|
398
377
|
all_objects = get_all_nested_objects(message)
|
@@ -450,9 +429,6 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
450
429
|
)
|
451
430
|
log(ERROR, str(e))
|
452
431
|
|
453
|
-
# Cleanup
|
454
|
-
metadata = None
|
455
|
-
|
456
432
|
def get_run(run_id: int) -> Run:
|
457
433
|
# Construct the request
|
458
434
|
req = GetRunRequest(node=node, run_id=run_id)
|
{flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/constant.py
RENAMED
@@ -74,6 +74,7 @@ FAB_ALLOWED_EXTENSIONS = {".py", ".toml", ".md"}
|
|
74
74
|
FAB_CONFIG_FILE = "pyproject.toml"
|
75
75
|
FAB_DATE = (2024, 10, 1, 0, 0, 0)
|
76
76
|
FAB_HASH_TRUNCATION = 8
|
77
|
+
FAB_MAX_SIZE = 10 * 1024 * 1024 # 10 MB
|
77
78
|
FLWR_DIR = ".flwr" # The default Flower directory: ~/.flwr/
|
78
79
|
FLWR_HOME = "FLWR_HOME" # If set, override the default Flower directory
|
79
80
|
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
3
|
+
# source: flwr/proto/clientappio.proto
|
4
|
+
# Protobuf Python Version: 4.25.1
|
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 fab_pb2 as flwr_dot_proto_dot_fab__pb2
|
16
|
+
from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
|
17
|
+
from flwr.proto import message_pb2 as flwr_dot_proto_dot_message__pb2
|
18
|
+
|
19
|
+
|
20
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lwr/proto/clientappio.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x18\x66lwr/proto/message.proto\"%\n#GetRunIdsWithPendingMessagesRequest\"7\n$GetRunIdsWithPendingMessagesResponse\x12\x0f\n\x07run_ids\x18\x01 \x03(\x04\"%\n\x13RequestTokenRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"%\n\x14RequestTokenResponse\x12\r\n\x05token\x18\x01 \x01(\t\"W\n\x15\x43lientAppOutputStatus\x12-\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x1f.flwr.proto.ClientAppOutputCode\x12\x0f\n\x07message\x18\x02 \x01(\t\"+\n\x1aPullClientAppInputsRequest\x12\r\n\x05token\x18\x01 \x01(\t\"\xa5\x01\n\x1bPullClientAppInputsResponse\x12$\n\x07message\x18\x01 \x01(\x0b\x32\x13.flwr.proto.Message\x12$\n\x07\x63ontext\x18\x02 \x01(\x0b\x32\x13.flwr.proto.Context\x12\x1c\n\x03run\x18\x03 \x01(\x0b\x32\x0f.flwr.proto.Run\x12\x1c\n\x03\x66\x61\x62\x18\x04 \x01(\x0b\x32\x0f.flwr.proto.Fab\"x\n\x1bPushClientAppOutputsRequest\x12\r\n\x05token\x18\x01 \x01(\t\x12$\n\x07message\x18\x02 \x01(\x0b\x32\x13.flwr.proto.Message\x12$\n\x07\x63ontext\x18\x03 \x01(\x0b\x32\x13.flwr.proto.Context\"Q\n\x1cPushClientAppOutputsResponse\x12\x31\n\x06status\x18\x01 \x01(\x0b\x32!.flwr.proto.ClientAppOutputStatus*L\n\x13\x43lientAppOutputCode\x12\x0b\n\x07SUCCESS\x10\x00\x12\x15\n\x11\x44\x45\x41\x44LINE_EXCEEDED\x10\x01\x12\x11\n\rUNKNOWN_ERROR\x10\x02\x32\xbf\x03\n\x0b\x43lientAppIo\x12\x83\x01\n\x1cGetRunIdsWithPendingMessages\x12/.flwr.proto.GetRunIdsWithPendingMessagesRequest\x1a\x30.flwr.proto.GetRunIdsWithPendingMessagesResponse\"\x00\x12S\n\x0cRequestToken\x12\x1f.flwr.proto.RequestTokenRequest\x1a .flwr.proto.RequestTokenResponse\"\x00\x12h\n\x13PullClientAppInputs\x12&.flwr.proto.PullClientAppInputsRequest\x1a\'.flwr.proto.PullClientAppInputsResponse\"\x00\x12k\n\x14PushClientAppOutputs\x12\'.flwr.proto.PushClientAppOutputsRequest\x1a(.flwr.proto.PushClientAppOutputsResponse\"\x00\x62\x06proto3')
|
21
|
+
|
22
|
+
_globals = globals()
|
23
|
+
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
24
|
+
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.clientappio_pb2', _globals)
|
25
|
+
if _descriptor._USE_C_DESCRIPTORS == False:
|
26
|
+
DESCRIPTOR._options = None
|
27
|
+
_globals['_CLIENTAPPOUTPUTCODE']._serialized_start=795
|
28
|
+
_globals['_CLIENTAPPOUTPUTCODE']._serialized_end=871
|
29
|
+
_globals['_GETRUNIDSWITHPENDINGMESSAGESREQUEST']._serialized_start=114
|
30
|
+
_globals['_GETRUNIDSWITHPENDINGMESSAGESREQUEST']._serialized_end=151
|
31
|
+
_globals['_GETRUNIDSWITHPENDINGMESSAGESRESPONSE']._serialized_start=153
|
32
|
+
_globals['_GETRUNIDSWITHPENDINGMESSAGESRESPONSE']._serialized_end=208
|
33
|
+
_globals['_REQUESTTOKENREQUEST']._serialized_start=210
|
34
|
+
_globals['_REQUESTTOKENREQUEST']._serialized_end=247
|
35
|
+
_globals['_REQUESTTOKENRESPONSE']._serialized_start=249
|
36
|
+
_globals['_REQUESTTOKENRESPONSE']._serialized_end=286
|
37
|
+
_globals['_CLIENTAPPOUTPUTSTATUS']._serialized_start=288
|
38
|
+
_globals['_CLIENTAPPOUTPUTSTATUS']._serialized_end=375
|
39
|
+
_globals['_PULLCLIENTAPPINPUTSREQUEST']._serialized_start=377
|
40
|
+
_globals['_PULLCLIENTAPPINPUTSREQUEST']._serialized_end=420
|
41
|
+
_globals['_PULLCLIENTAPPINPUTSRESPONSE']._serialized_start=423
|
42
|
+
_globals['_PULLCLIENTAPPINPUTSRESPONSE']._serialized_end=588
|
43
|
+
_globals['_PUSHCLIENTAPPOUTPUTSREQUEST']._serialized_start=590
|
44
|
+
_globals['_PUSHCLIENTAPPOUTPUTSREQUEST']._serialized_end=710
|
45
|
+
_globals['_PUSHCLIENTAPPOUTPUTSRESPONSE']._serialized_start=712
|
46
|
+
_globals['_PUSHCLIENTAPPOUTPUTSRESPONSE']._serialized_end=793
|
47
|
+
_globals['_CLIENTAPPIO']._serialized_start=874
|
48
|
+
_globals['_CLIENTAPPIO']._serialized_end=1321
|
49
|
+
# @@protoc_insertion_point(module_scope)
|
@@ -88,23 +88,6 @@ class ClientAppOutputStatus(google.protobuf.message.Message):
|
|
88
88
|
def ClearField(self, field_name: typing_extensions.Literal["code",b"code","message",b"message"]) -> None: ...
|
89
89
|
global___ClientAppOutputStatus = ClientAppOutputStatus
|
90
90
|
|
91
|
-
class GetTokenRequest(google.protobuf.message.Message):
|
92
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
93
|
-
def __init__(self,
|
94
|
-
) -> None: ...
|
95
|
-
global___GetTokenRequest = GetTokenRequest
|
96
|
-
|
97
|
-
class GetTokenResponse(google.protobuf.message.Message):
|
98
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
99
|
-
TOKEN_FIELD_NUMBER: builtins.int
|
100
|
-
token: builtins.int
|
101
|
-
def __init__(self,
|
102
|
-
*,
|
103
|
-
token: builtins.int = ...,
|
104
|
-
) -> None: ...
|
105
|
-
def ClearField(self, field_name: typing_extensions.Literal["token",b"token"]) -> None: ...
|
106
|
-
global___GetTokenResponse = GetTokenResponse
|
107
|
-
|
108
91
|
class PullClientAppInputsRequest(google.protobuf.message.Message):
|
109
92
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
110
93
|
TOKEN_FIELD_NUMBER: builtins.int
|
@@ -24,11 +24,6 @@ class ClientAppIoStub(object):
|
|
24
24
|
request_serializer=flwr_dot_proto_dot_clientappio__pb2.RequestTokenRequest.SerializeToString,
|
25
25
|
response_deserializer=flwr_dot_proto_dot_clientappio__pb2.RequestTokenResponse.FromString,
|
26
26
|
)
|
27
|
-
self.GetToken = channel.unary_unary(
|
28
|
-
'/flwr.proto.ClientAppIo/GetToken',
|
29
|
-
request_serializer=flwr_dot_proto_dot_clientappio__pb2.GetTokenRequest.SerializeToString,
|
30
|
-
response_deserializer=flwr_dot_proto_dot_clientappio__pb2.GetTokenResponse.FromString,
|
31
|
-
)
|
32
27
|
self.PullClientAppInputs = channel.unary_unary(
|
33
28
|
'/flwr.proto.ClientAppIo/PullClientAppInputs',
|
34
29
|
request_serializer=flwr_dot_proto_dot_clientappio__pb2.PullClientAppInputsRequest.SerializeToString,
|
@@ -58,13 +53,6 @@ class ClientAppIoServicer(object):
|
|
58
53
|
context.set_details('Method not implemented!')
|
59
54
|
raise NotImplementedError('Method not implemented!')
|
60
55
|
|
61
|
-
def GetToken(self, request, context):
|
62
|
-
"""Get token
|
63
|
-
"""
|
64
|
-
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
65
|
-
context.set_details('Method not implemented!')
|
66
|
-
raise NotImplementedError('Method not implemented!')
|
67
|
-
|
68
56
|
def PullClientAppInputs(self, request, context):
|
69
57
|
"""Pull client app inputs
|
70
58
|
"""
|
@@ -92,11 +80,6 @@ def add_ClientAppIoServicer_to_server(servicer, server):
|
|
92
80
|
request_deserializer=flwr_dot_proto_dot_clientappio__pb2.RequestTokenRequest.FromString,
|
93
81
|
response_serializer=flwr_dot_proto_dot_clientappio__pb2.RequestTokenResponse.SerializeToString,
|
94
82
|
),
|
95
|
-
'GetToken': grpc.unary_unary_rpc_method_handler(
|
96
|
-
servicer.GetToken,
|
97
|
-
request_deserializer=flwr_dot_proto_dot_clientappio__pb2.GetTokenRequest.FromString,
|
98
|
-
response_serializer=flwr_dot_proto_dot_clientappio__pb2.GetTokenResponse.SerializeToString,
|
99
|
-
),
|
100
83
|
'PullClientAppInputs': grpc.unary_unary_rpc_method_handler(
|
101
84
|
servicer.PullClientAppInputs,
|
102
85
|
request_deserializer=flwr_dot_proto_dot_clientappio__pb2.PullClientAppInputsRequest.FromString,
|
@@ -151,23 +134,6 @@ class ClientAppIo(object):
|
|
151
134
|
options, channel_credentials,
|
152
135
|
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
153
136
|
|
154
|
-
@staticmethod
|
155
|
-
def GetToken(request,
|
156
|
-
target,
|
157
|
-
options=(),
|
158
|
-
channel_credentials=None,
|
159
|
-
call_credentials=None,
|
160
|
-
insecure=False,
|
161
|
-
compression=None,
|
162
|
-
wait_for_ready=None,
|
163
|
-
timeout=None,
|
164
|
-
metadata=None):
|
165
|
-
return grpc.experimental.unary_unary(request, target, '/flwr.proto.ClientAppIo/GetToken',
|
166
|
-
flwr_dot_proto_dot_clientappio__pb2.GetTokenRequest.SerializeToString,
|
167
|
-
flwr_dot_proto_dot_clientappio__pb2.GetTokenResponse.FromString,
|
168
|
-
options, channel_credentials,
|
169
|
-
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
170
|
-
|
171
137
|
@staticmethod
|
172
138
|
def PullClientAppInputs(request,
|
173
139
|
target,
|
@@ -18,11 +18,6 @@ class ClientAppIoStub:
|
|
18
18
|
flwr.proto.clientappio_pb2.RequestTokenResponse]
|
19
19
|
"""Request token"""
|
20
20
|
|
21
|
-
GetToken: grpc.UnaryUnaryMultiCallable[
|
22
|
-
flwr.proto.clientappio_pb2.GetTokenRequest,
|
23
|
-
flwr.proto.clientappio_pb2.GetTokenResponse]
|
24
|
-
"""Get token"""
|
25
|
-
|
26
21
|
PullClientAppInputs: grpc.UnaryUnaryMultiCallable[
|
27
22
|
flwr.proto.clientappio_pb2.PullClientAppInputsRequest,
|
28
23
|
flwr.proto.clientappio_pb2.PullClientAppInputsResponse]
|
@@ -51,14 +46,6 @@ class ClientAppIoServicer(metaclass=abc.ABCMeta):
|
|
51
46
|
"""Request token"""
|
52
47
|
pass
|
53
48
|
|
54
|
-
@abc.abstractmethod
|
55
|
-
def GetToken(self,
|
56
|
-
request: flwr.proto.clientappio_pb2.GetTokenRequest,
|
57
|
-
context: grpc.ServicerContext,
|
58
|
-
) -> flwr.proto.clientappio_pb2.GetTokenResponse:
|
59
|
-
"""Get token"""
|
60
|
-
pass
|
61
|
-
|
62
49
|
@abc.abstractmethod
|
63
50
|
def PullClientAppInputs(self,
|
64
51
|
request: flwr.proto.clientappio_pb2.PullClientAppInputsRequest,
|
@@ -0,0 +1,32 @@
|
|
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
|
+
"""Utility functions for the infrastructure."""
|
16
|
+
|
17
|
+
|
18
|
+
def mask_string(value: str, head: int = 4, tail: int = 4) -> str:
|
19
|
+
"""Mask a string by preserving only the head and tail characters.
|
20
|
+
|
21
|
+
Mask a string for safe display by preserving the head and tail characters,
|
22
|
+
and replacing the middle with '...'. Useful for logging tokens, secrets,
|
23
|
+
or IDs without exposing sensitive data.
|
24
|
+
|
25
|
+
Notes
|
26
|
+
-----
|
27
|
+
If the string is shorter than the combined length of `head` and `tail`,
|
28
|
+
the original string is returned unchanged.
|
29
|
+
"""
|
30
|
+
if len(value) <= head + tail:
|
31
|
+
return value
|
32
|
+
return f"{value[:head]}...{value[-tail:]}"
|
@@ -25,6 +25,7 @@ import grpc
|
|
25
25
|
from flwr.common import now
|
26
26
|
from flwr.common.auth_plugin import ExecAuthPlugin
|
27
27
|
from flwr.common.constant import (
|
28
|
+
FAB_MAX_SIZE,
|
28
29
|
LOG_STREAM_INTERVAL,
|
29
30
|
RUN_ID_NOT_FOUND_MESSAGE,
|
30
31
|
Status,
|
@@ -84,6 +85,14 @@ class ExecServicer(exec_pb2_grpc.ExecServicer):
|
|
84
85
|
"""Create run ID."""
|
85
86
|
log(INFO, "ExecServicer.StartRun")
|
86
87
|
|
88
|
+
if len(request.fab.content) > FAB_MAX_SIZE:
|
89
|
+
log(
|
90
|
+
ERROR,
|
91
|
+
"FAB size exceeds maximum allowed size of %d bytes.",
|
92
|
+
FAB_MAX_SIZE,
|
93
|
+
)
|
94
|
+
return StartRunResponse()
|
95
|
+
|
87
96
|
flwr_aid = shared_account_info.get().flwr_aid if self.auth_plugin else None
|
88
97
|
run_id = self.executor.start_run(
|
89
98
|
request.fab.content,
|
@@ -40,7 +40,6 @@ from flwr.common.constant import (
|
|
40
40
|
TRANSPORT_TYPE_REST,
|
41
41
|
)
|
42
42
|
from flwr.common.exit import ExitCode, flwr_exit
|
43
|
-
from flwr.common.exit_handlers import register_exit_handlers
|
44
43
|
from flwr.common.logger import log
|
45
44
|
from flwr.supernode.start_client_internal import start_client_internal
|
46
45
|
|
@@ -66,12 +65,6 @@ def flower_supernode() -> None:
|
|
66
65
|
|
67
66
|
log(DEBUG, "Isolation mode: %s", args.isolation)
|
68
67
|
|
69
|
-
# Register handlers for graceful shutdown
|
70
|
-
register_exit_handlers(
|
71
|
-
event_type=EventType.RUN_SUPERNODE_LEAVE,
|
72
|
-
exit_message="SuperNode terminated gracefully.",
|
73
|
-
)
|
74
|
-
|
75
68
|
start_client_internal(
|
76
69
|
server_address=args.superlink,
|
77
70
|
transport=args.transport,
|
@@ -22,6 +22,7 @@ from flwr.common.args import add_args_flwr_app_common
|
|
22
22
|
from flwr.common.constant import CLIENTAPPIO_API_DEFAULT_CLIENT_ADDRESS
|
23
23
|
from flwr.common.exit import ExitCode, flwr_exit
|
24
24
|
from flwr.common.logger import log
|
25
|
+
from flwr.supercore.utils import mask_string
|
25
26
|
from flwr.supernode.runtime.run_clientapp import run_clientapp
|
26
27
|
|
27
28
|
|
@@ -40,7 +41,7 @@ def flwr_clientapp() -> None:
|
|
40
41
|
"`flwr-clientapp` will attempt to connect to SuperNode's "
|
41
42
|
"ClientAppIo API at %s with token %s",
|
42
43
|
args.clientappio_api_address,
|
43
|
-
args.token,
|
44
|
+
mask_string(args.token) if args.token else "None",
|
44
45
|
)
|
45
46
|
run_clientapp(
|
46
47
|
clientappio_api_address=args.clientappio_api_address,
|
@@ -56,6 +56,7 @@ from flwr.proto.clientappio_pb2 import (
|
|
56
56
|
RequestTokenResponse,
|
57
57
|
)
|
58
58
|
from flwr.proto.clientappio_pb2_grpc import ClientAppIoStub
|
59
|
+
from flwr.supercore.utils import mask_string
|
59
60
|
|
60
61
|
|
61
62
|
def run_clientapp( # pylint: disable=R0913, R0914, R0917
|
@@ -195,7 +196,8 @@ def pull_clientappinputs(
|
|
195
196
|
stub: ClientAppIoStub, token: str
|
196
197
|
) -> tuple[Message, Context, Run, Optional[Fab]]:
|
197
198
|
"""Pull ClientAppInputs from SuperNode."""
|
198
|
-
|
199
|
+
masked_token = mask_string(token)
|
200
|
+
log(INFO, "[flwr-clientapp] Pull `ClientAppInputs` for token %s", masked_token)
|
199
201
|
try:
|
200
202
|
res: PullClientAppInputsResponse = stub.PullClientAppInputs(
|
201
203
|
PullClientAppInputsRequest(token=token)
|
@@ -214,7 +216,10 @@ def push_clientappoutputs(
|
|
214
216
|
stub: ClientAppIoStub, token: str, message: Message, context: Context
|
215
217
|
) -> PushClientAppOutputsResponse:
|
216
218
|
"""Push ClientAppOutputs to SuperNode."""
|
217
|
-
|
219
|
+
masked_token = mask_string(token)
|
220
|
+
log(INFO, "[flwr-clientapp] Push `ClientAppOutputs` for token %s", masked_token)
|
221
|
+
# Set message ID
|
222
|
+
message.metadata.__dict__["_message_id"] = message.object_id
|
218
223
|
proto_message = message_to_proto(message)
|
219
224
|
proto_context = context_to_proto(context)
|
220
225
|
|
@@ -0,0 +1,22 @@
|
|
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
|
+
"""ClientAppIo API Servicer."""
|
16
|
+
|
17
|
+
|
18
|
+
from .clientappio_servicer import ClientAppIoServicer
|
19
|
+
|
20
|
+
__all__ = [
|
21
|
+
"ClientAppIoServicer",
|
22
|
+
]
|
@@ -15,16 +15,14 @@
|
|
15
15
|
"""ClientAppIo API servicer."""
|
16
16
|
|
17
17
|
|
18
|
-
from
|
19
|
-
from
|
20
|
-
from typing import Optional, cast
|
18
|
+
from logging import DEBUG
|
19
|
+
from typing import cast
|
21
20
|
|
22
21
|
import grpc
|
23
22
|
|
24
|
-
from flwr.common import Context
|
23
|
+
from flwr.common import Context
|
25
24
|
from flwr.common.logger import log
|
26
25
|
from flwr.common.serde import (
|
27
|
-
clientappstatus_to_proto,
|
28
26
|
context_from_proto,
|
29
27
|
context_to_proto,
|
30
28
|
fab_to_proto,
|
@@ -39,8 +37,6 @@ from flwr.proto import clientappio_pb2_grpc
|
|
39
37
|
from flwr.proto.clientappio_pb2 import ( # pylint: disable=E0401
|
40
38
|
GetRunIdsWithPendingMessagesRequest,
|
41
39
|
GetRunIdsWithPendingMessagesResponse,
|
42
|
-
GetTokenRequest,
|
43
|
-
GetTokenResponse,
|
44
40
|
PullClientAppInputsRequest,
|
45
41
|
PullClientAppInputsResponse,
|
46
42
|
PushClientAppOutputsRequest,
|
@@ -53,24 +49,6 @@ from flwr.supercore.object_store import ObjectStoreFactory
|
|
53
49
|
from flwr.supernode.nodestate import NodeStateFactory
|
54
50
|
|
55
51
|
|
56
|
-
@dataclass
|
57
|
-
class ClientAppInputs:
|
58
|
-
"""Specify the inputs to the ClientApp."""
|
59
|
-
|
60
|
-
message: Message
|
61
|
-
context: Context
|
62
|
-
run: Run
|
63
|
-
fab: Optional[Fab]
|
64
|
-
|
65
|
-
|
66
|
-
@dataclass
|
67
|
-
class ClientAppOutputs:
|
68
|
-
"""Specify the outputs from the ClientApp."""
|
69
|
-
|
70
|
-
message: Message
|
71
|
-
context: Context
|
72
|
-
|
73
|
-
|
74
52
|
# pylint: disable=C0103,W0613,W0201
|
75
53
|
class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
|
76
54
|
"""ClientAppIo API servicer."""
|
@@ -85,10 +63,6 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
|
|
85
63
|
self.ffs_factory = ffs_factory
|
86
64
|
self.objectstore_factory = objectstore_factory
|
87
65
|
|
88
|
-
self.clientapp_input: Optional[ClientAppInputs] = None
|
89
|
-
self.clientapp_output: Optional[ClientAppOutputs] = None
|
90
|
-
self.token_returned: bool = False
|
91
|
-
|
92
66
|
def GetRunIdsWithPendingMessages(
|
93
67
|
self,
|
94
68
|
request: GetRunIdsWithPendingMessagesRequest,
|
@@ -126,33 +100,6 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
|
|
126
100
|
# Return the token
|
127
101
|
return RequestTokenResponse(token=token)
|
128
102
|
|
129
|
-
def GetToken(
|
130
|
-
self, request: GetTokenRequest, context: grpc.ServicerContext
|
131
|
-
) -> GetTokenResponse:
|
132
|
-
"""Get token."""
|
133
|
-
log(DEBUG, "ClientAppIo.GetToken")
|
134
|
-
|
135
|
-
# Fail if no ClientAppInputs are available
|
136
|
-
if self.clientapp_input is None:
|
137
|
-
context.abort(
|
138
|
-
grpc.StatusCode.FAILED_PRECONDITION,
|
139
|
-
"No inputs available.",
|
140
|
-
)
|
141
|
-
|
142
|
-
# Fail if token was already returned in a previous call
|
143
|
-
if self.token_returned:
|
144
|
-
context.abort(
|
145
|
-
grpc.StatusCode.FAILED_PRECONDITION,
|
146
|
-
"Token already returned. A token can be returned only once.",
|
147
|
-
)
|
148
|
-
|
149
|
-
# If
|
150
|
-
# - ClientAppInputs is set, and
|
151
|
-
# - token hasn't been returned before,
|
152
|
-
# return token
|
153
|
-
self.token_returned = True
|
154
|
-
return GetTokenResponse(token=123) # To be deleted
|
155
|
-
|
156
103
|
def PullClientAppInputs(
|
157
104
|
self, request: PullClientAppInputsRequest, context: grpc.ServicerContext
|
158
105
|
) -> PullClientAppInputsResponse:
|
@@ -203,40 +150,12 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
|
|
203
150
|
)
|
204
151
|
raise RuntimeError("This line should never be reached.")
|
205
152
|
|
206
|
-
#
|
207
|
-
state.
|
208
|
-
|
209
|
-
# Preconditions met
|
210
|
-
try:
|
211
|
-
# Update Message and Context
|
212
|
-
self.clientapp_output = ClientAppOutputs(
|
213
|
-
message=message_from_proto(request.message),
|
214
|
-
context=context_from_proto(request.context),
|
215
|
-
)
|
216
|
-
|
217
|
-
# Set status
|
218
|
-
code = typing.ClientAppOutputCode.SUCCESS
|
219
|
-
status = typing.ClientAppOutputStatus(code=code, message="Success")
|
220
|
-
except Exception as e: # pylint: disable=broad-exception-caught
|
221
|
-
log(ERROR, "ClientApp failed to push message to SuperNode, %s", e)
|
222
|
-
code = typing.ClientAppOutputCode.UNKNOWN_ERROR
|
223
|
-
status = typing.ClientAppOutputStatus(code=code, message="Unkonwn error")
|
224
|
-
|
225
|
-
# Return status to ClientApp process
|
226
|
-
proto_status = clientappstatus_to_proto(status=status)
|
227
|
-
return PushClientAppOutputsResponse(status=proto_status)
|
153
|
+
# Save the message and context to the state
|
154
|
+
state.store_message(message_from_proto(request.message))
|
155
|
+
state.store_context(context_from_proto(request.context))
|
228
156
|
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
def get_outputs(self) -> ClientAppOutputs:
|
234
|
-
"""Get ClientApp outputs."""
|
235
|
-
if self.clientapp_output is None:
|
236
|
-
raise ValueError("ClientAppOutputs not set before calling `get_outputs`.")
|
237
|
-
|
238
|
-
# Set outputs to a local variable and clear state
|
239
|
-
output: ClientAppOutputs = self.clientapp_output
|
240
|
-
self.clientapp_output = None
|
157
|
+
# Remove the token to make the run eligible for processing
|
158
|
+
# A run associated with a token cannot be handled until its token is cleared
|
159
|
+
state.delete_token(run_id)
|
241
160
|
|
242
|
-
return
|
161
|
+
return PushClientAppOutputsResponse()
|