androidtvremote2 0.0.14__tar.gz → 0.1.0__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 (24) hide show
  1. {androidtvremote2-0.0.14/src/androidtvremote2.egg-info → androidtvremote2-0.1.0}/PKG-INFO +13 -5
  2. {androidtvremote2-0.0.14 → androidtvremote2-0.1.0}/README.md +9 -4
  3. {androidtvremote2-0.0.14 → androidtvremote2-0.1.0}/pyproject.toml +1 -1
  4. {androidtvremote2-0.0.14 → androidtvremote2-0.1.0}/src/androidtvremote2/androidtv_remote.py +6 -3
  5. {androidtvremote2-0.0.14 → androidtvremote2-0.1.0}/src/androidtvremote2/const.py +1 -0
  6. androidtvremote2-0.1.0/src/androidtvremote2/polo_pb2.pyi +287 -0
  7. androidtvremote2-0.1.0/src/androidtvremote2/remotemessage_pb2.pyi +2253 -0
  8. {androidtvremote2-0.0.14 → androidtvremote2-0.1.0/src/androidtvremote2.egg-info}/PKG-INFO +13 -5
  9. {androidtvremote2-0.0.14 → androidtvremote2-0.1.0}/src/androidtvremote2.egg-info/SOURCES.txt +2 -0
  10. {androidtvremote2-0.0.14 → androidtvremote2-0.1.0}/src/demo.py +10 -7
  11. {androidtvremote2-0.0.14 → androidtvremote2-0.1.0}/LICENSE +0 -0
  12. {androidtvremote2-0.0.14 → androidtvremote2-0.1.0}/setup.cfg +0 -0
  13. {androidtvremote2-0.0.14 → androidtvremote2-0.1.0}/src/androidtvremote2/__init__.py +0 -0
  14. {androidtvremote2-0.0.14 → androidtvremote2-0.1.0}/src/androidtvremote2/base.py +0 -0
  15. {androidtvremote2-0.0.14 → androidtvremote2-0.1.0}/src/androidtvremote2/certificate_generator.py +0 -0
  16. {androidtvremote2-0.0.14 → androidtvremote2-0.1.0}/src/androidtvremote2/exceptions.py +0 -0
  17. {androidtvremote2-0.0.14 → androidtvremote2-0.1.0}/src/androidtvremote2/pairing.py +0 -0
  18. {androidtvremote2-0.0.14 → androidtvremote2-0.1.0}/src/androidtvremote2/polo_pb2.py +0 -0
  19. {androidtvremote2-0.0.14 → androidtvremote2-0.1.0}/src/androidtvremote2/remote.py +0 -0
  20. {androidtvremote2-0.0.14 → androidtvremote2-0.1.0}/src/androidtvremote2/remotemessage_pb2.py +0 -0
  21. {androidtvremote2-0.0.14 → androidtvremote2-0.1.0}/src/androidtvremote2.egg-info/dependency_links.txt +0 -0
  22. {androidtvremote2-0.0.14 → androidtvremote2-0.1.0}/src/androidtvremote2.egg-info/requires.txt +0 -0
  23. {androidtvremote2-0.0.14 → androidtvremote2-0.1.0}/src/androidtvremote2.egg-info/top_level.txt +0 -0
  24. {androidtvremote2-0.0.14 → androidtvremote2-0.1.0}/tests/test_androidtv_remote.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: androidtvremote2
3
- Version: 0.0.14
3
+ Version: 0.1.0
4
4
  Summary: A Python library for interacting with Android TV using the Android TV Remote protocol v2
5
5
  Author-email: tronikos <tronikos@gmail.com>
6
6
  License: Apache-2.0
@@ -9,14 +9,17 @@ Project-URL: Bug Tracker, https://github.com/tronikos/androidtvremote2/issues
9
9
  Requires-Python: >=3.10
10
10
  Description-Content-Type: text/markdown
11
11
  License-File: LICENSE
12
+ Requires-Dist: aiofiles>=0.8
13
+ Requires-Dist: cryptography>=3
14
+ Requires-Dist: protobuf>=4.21
12
15
 
13
16
  # androidtvremote2
14
17
 
15
18
  A Python library for interacting with Android TV using the Android TV Remote protocol v2. This is the same protocol the Google TV mobile app is using. It doesn't require ADB or enabling developer tools on the Android TV device. It only requires the [Android TV Remote Service](https://play.google.com/store/apps/details?id=com.google.android.tv.remote.service) that comes pre-installed on most Android TV devices.
16
19
 
17
20
  For a list of the most common commands you can send to the Android TV see: [TvKeys](https://github.com/tronikos/androidtvremote2/blob/main/TvKeys.txt).
18
- For a full list see [here](https://github.com/tronikos/androidtvremote2/blob/main/src/androidtvremote2/remotemessage.proto#L90).
19
- In addition to commands you can send URLs to open apps registered to handle them.
21
+ For a full list see [here](https://github.com/tronikos/androidtvremote2/blob/b4c49ac03043b1b9c40c2f2960e466d5a3b8bd67/src/androidtvremote2/remotemessage.proto#L90).
22
+ In addition to commands you can send URLs to open apps registered to handle them. See [this guide](https://community.home-assistant.io/t/android-tv-remote-app-links-deep-linking-guide/567921) for how to find deep links for apps.
20
23
 
21
24
  ## Credits
22
25
 
@@ -47,8 +50,13 @@ python -m pip install .
47
50
  python -m pip install grpcio-tools mypy-protobuf
48
51
  python -m grpc_tools.protoc src/androidtvremote2/*.proto --python_out=src/androidtvremote2 --mypy_out=src/androidtvremote2 -Isrc/androidtvremote2
49
52
 
50
- # Run formatter, lint, and type checking
51
- python -m pip install isort black flake8 ruff mypy pydantic
53
+ # Run pre-commit
54
+ python -m pip install pre-commit
55
+ pre-commit install
56
+ pre-commit run --all-files
57
+
58
+ # Alternative: run formatter, lint, and type checking
59
+ python -m pip install isort black flake8 ruff mypy
52
60
  isort . ; black . ; flake8 . ; ruff . --fix ; mypy --install-types .
53
61
 
54
62
  # Run tests
@@ -3,8 +3,8 @@
3
3
  A Python library for interacting with Android TV using the Android TV Remote protocol v2. This is the same protocol the Google TV mobile app is using. It doesn't require ADB or enabling developer tools on the Android TV device. It only requires the [Android TV Remote Service](https://play.google.com/store/apps/details?id=com.google.android.tv.remote.service) that comes pre-installed on most Android TV devices.
4
4
 
5
5
  For a list of the most common commands you can send to the Android TV see: [TvKeys](https://github.com/tronikos/androidtvremote2/blob/main/TvKeys.txt).
6
- For a full list see [here](https://github.com/tronikos/androidtvremote2/blob/main/src/androidtvremote2/remotemessage.proto#L90).
7
- In addition to commands you can send URLs to open apps registered to handle them.
6
+ For a full list see [here](https://github.com/tronikos/androidtvremote2/blob/b4c49ac03043b1b9c40c2f2960e466d5a3b8bd67/src/androidtvremote2/remotemessage.proto#L90).
7
+ In addition to commands you can send URLs to open apps registered to handle them. See [this guide](https://community.home-assistant.io/t/android-tv-remote-app-links-deep-linking-guide/567921) for how to find deep links for apps.
8
8
 
9
9
  ## Credits
10
10
 
@@ -35,8 +35,13 @@ python -m pip install .
35
35
  python -m pip install grpcio-tools mypy-protobuf
36
36
  python -m grpc_tools.protoc src/androidtvremote2/*.proto --python_out=src/androidtvremote2 --mypy_out=src/androidtvremote2 -Isrc/androidtvremote2
37
37
 
38
- # Run formatter, lint, and type checking
39
- python -m pip install isort black flake8 ruff mypy pydantic
38
+ # Run pre-commit
39
+ python -m pip install pre-commit
40
+ pre-commit install
41
+ pre-commit run --all-files
42
+
43
+ # Alternative: run formatter, lint, and type checking
44
+ python -m pip install isort black flake8 ruff mypy
40
45
  isort . ; black . ; flake8 . ; ruff . --fix ; mypy --install-types .
41
46
 
42
47
  # Run tests
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "androidtvremote2"
3
- version = "0.0.14"
3
+ version = "0.1.0"
4
4
  license = {text = "Apache-2.0"}
5
5
  authors = [
6
6
  { name="tronikos", email="tronikos@gmail.com" },
@@ -254,7 +254,7 @@ class AndroidTVRemote:
254
254
  await self.async_connect()
255
255
  self._on_is_available_updated(True)
256
256
  break
257
- except CannotConnect as exc:
257
+ except (CannotConnect, ConnectionClosed) as exc:
258
258
  delay_seconds = min(2 * delay_seconds, 30)
259
259
  LOGGER.debug(
260
260
  "Couldn't reconnect to %s. Will retry in %s seconds. Error: %s",
@@ -387,7 +387,7 @@ class AndroidTVRemote:
387
387
  raise ConnectionClosed("Called send_key_command after disconnect")
388
388
  self._remote_message_protocol.send_key_command(key_code, direction)
389
389
 
390
- def send_launch_app_command(self, app_link: str) -> None:
390
+ def send_launch_app_command(self, app_link_or_app_id: str) -> None:
391
391
  """Launch an app on Android TV.
392
392
 
393
393
  This does not block; it buffers the data and arranges for it to be sent out asynchronously.
@@ -397,4 +397,7 @@ class AndroidTVRemote:
397
397
  if not self._remote_message_protocol:
398
398
  LOGGER.debug("Called send_launch_app_command after disconnect")
399
399
  raise ConnectionClosed("Called send_launch_app_command after disconnect")
400
- self._remote_message_protocol.send_launch_app_command(app_link)
400
+ prefix = "" if "://" in app_link_or_app_id else "market://launch?id="
401
+ self._remote_message_protocol.send_launch_app_command(
402
+ f"{prefix}{app_link_or_app_id}"
403
+ )
@@ -1,4 +1,5 @@
1
1
  """Define package-wide constants."""
2
+
2
3
  import logging
3
4
 
4
5
  LOGGER = logging.getLogger(__package__)
@@ -0,0 +1,287 @@
1
+ """
2
+ @generated by mypy-protobuf. Do not edit manually!
3
+ isort:skip_file
4
+ Copyright 2009 Google Inc. All Rights Reserved."""
5
+ import builtins
6
+ import collections.abc
7
+ import google.protobuf.descriptor
8
+ import google.protobuf.internal.containers
9
+ import google.protobuf.internal.enum_type_wrapper
10
+ import google.protobuf.message
11
+ import sys
12
+ import typing
13
+
14
+ if sys.version_info >= (3, 10):
15
+ import typing as typing_extensions
16
+ else:
17
+ import typing_extensions
18
+
19
+ DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
20
+
21
+ @typing_extensions.final
22
+ class OuterMessage(google.protobuf.message.Message):
23
+ """OuterMessage - base outer message type used in the protocol."""
24
+
25
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
26
+
27
+ class _Status:
28
+ ValueType = typing.NewType("ValueType", builtins.int)
29
+ V: typing_extensions.TypeAlias = ValueType
30
+
31
+ class _StatusEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[OuterMessage._Status.ValueType], builtins.type):
32
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
33
+ STATUS_OK: OuterMessage._Status.ValueType # 200
34
+ STATUS_ERROR: OuterMessage._Status.ValueType # 400
35
+ STATUS_BAD_CONFIGURATION: OuterMessage._Status.ValueType # 401
36
+ STATUS_BAD_SECRET: OuterMessage._Status.ValueType # 402
37
+
38
+ class Status(_Status, metaclass=_StatusEnumTypeWrapper):
39
+ """Protocol status states."""
40
+
41
+ STATUS_OK: OuterMessage.Status.ValueType # 200
42
+ STATUS_ERROR: OuterMessage.Status.ValueType # 400
43
+ STATUS_BAD_CONFIGURATION: OuterMessage.Status.ValueType # 401
44
+ STATUS_BAD_SECRET: OuterMessage.Status.ValueType # 402
45
+
46
+ PROTOCOL_VERSION_FIELD_NUMBER: builtins.int
47
+ STATUS_FIELD_NUMBER: builtins.int
48
+ PAIRING_REQUEST_FIELD_NUMBER: builtins.int
49
+ PAIRING_REQUEST_ACK_FIELD_NUMBER: builtins.int
50
+ OPTIONS_FIELD_NUMBER: builtins.int
51
+ CONFIGURATION_FIELD_NUMBER: builtins.int
52
+ CONFIGURATION_ACK_FIELD_NUMBER: builtins.int
53
+ SECRET_FIELD_NUMBER: builtins.int
54
+ SECRET_ACK_FIELD_NUMBER: builtins.int
55
+ protocol_version: builtins.int
56
+ status: global___OuterMessage.Status.ValueType
57
+ """Protocol status. Any status other than STATUS_OK implies a fault."""
58
+ @property
59
+ def pairing_request(self) -> global___PairingRequest:
60
+ """Initialization phase"""
61
+ @property
62
+ def pairing_request_ack(self) -> global___PairingRequestAck: ...
63
+ @property
64
+ def options(self) -> global___Options:
65
+ """Configuration phase"""
66
+ @property
67
+ def configuration(self) -> global___Configuration: ...
68
+ @property
69
+ def configuration_ack(self) -> global___ConfigurationAck: ...
70
+ @property
71
+ def secret(self) -> global___Secret:
72
+ """Pairing phase"""
73
+ @property
74
+ def secret_ack(self) -> global___SecretAck: ...
75
+ def __init__(
76
+ self,
77
+ *,
78
+ protocol_version: builtins.int | None = ...,
79
+ status: global___OuterMessage.Status.ValueType | None = ...,
80
+ pairing_request: global___PairingRequest | None = ...,
81
+ pairing_request_ack: global___PairingRequestAck | None = ...,
82
+ options: global___Options | None = ...,
83
+ configuration: global___Configuration | None = ...,
84
+ configuration_ack: global___ConfigurationAck | None = ...,
85
+ secret: global___Secret | None = ...,
86
+ secret_ack: global___SecretAck | None = ...,
87
+ ) -> None: ...
88
+ def HasField(self, field_name: typing_extensions.Literal["configuration", b"configuration", "configuration_ack", b"configuration_ack", "options", b"options", "pairing_request", b"pairing_request", "pairing_request_ack", b"pairing_request_ack", "protocol_version", b"protocol_version", "secret", b"secret", "secret_ack", b"secret_ack", "status", b"status"]) -> builtins.bool: ...
89
+ def ClearField(self, field_name: typing_extensions.Literal["configuration", b"configuration", "configuration_ack", b"configuration_ack", "options", b"options", "pairing_request", b"pairing_request", "pairing_request_ack", b"pairing_request_ack", "protocol_version", b"protocol_version", "secret", b"secret", "secret_ack", b"secret_ack", "status", b"status"]) -> None: ...
90
+
91
+ global___OuterMessage = OuterMessage
92
+
93
+ @typing_extensions.final
94
+ class PairingRequest(google.protobuf.message.Message):
95
+ """
96
+ Initialization messages
97
+ """
98
+
99
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
100
+
101
+ SERVICE_NAME_FIELD_NUMBER: builtins.int
102
+ CLIENT_NAME_FIELD_NUMBER: builtins.int
103
+ service_name: builtins.str
104
+ """String name of the service to pair with. The name used should be an
105
+ established convention of the application protocol.
106
+ """
107
+ client_name: builtins.str
108
+ """Descriptive name of the client."""
109
+ def __init__(
110
+ self,
111
+ *,
112
+ service_name: builtins.str | None = ...,
113
+ client_name: builtins.str | None = ...,
114
+ ) -> None: ...
115
+ def HasField(self, field_name: typing_extensions.Literal["client_name", b"client_name", "service_name", b"service_name"]) -> builtins.bool: ...
116
+ def ClearField(self, field_name: typing_extensions.Literal["client_name", b"client_name", "service_name", b"service_name"]) -> None: ...
117
+
118
+ global___PairingRequest = PairingRequest
119
+
120
+ @typing_extensions.final
121
+ class PairingRequestAck(google.protobuf.message.Message):
122
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
123
+
124
+ SERVER_NAME_FIELD_NUMBER: builtins.int
125
+ server_name: builtins.str
126
+ """Descriptive name of the server."""
127
+ def __init__(
128
+ self,
129
+ *,
130
+ server_name: builtins.str | None = ...,
131
+ ) -> None: ...
132
+ def HasField(self, field_name: typing_extensions.Literal["server_name", b"server_name"]) -> builtins.bool: ...
133
+ def ClearField(self, field_name: typing_extensions.Literal["server_name", b"server_name"]) -> None: ...
134
+
135
+ global___PairingRequestAck = PairingRequestAck
136
+
137
+ @typing_extensions.final
138
+ class Options(google.protobuf.message.Message):
139
+ """
140
+ Configuration messages
141
+ """
142
+
143
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
144
+
145
+ class _RoleType:
146
+ ValueType = typing.NewType("ValueType", builtins.int)
147
+ V: typing_extensions.TypeAlias = ValueType
148
+
149
+ class _RoleTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Options._RoleType.ValueType], builtins.type):
150
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
151
+ ROLE_TYPE_UNKNOWN: Options._RoleType.ValueType # 0
152
+ ROLE_TYPE_INPUT: Options._RoleType.ValueType # 1
153
+ ROLE_TYPE_OUTPUT: Options._RoleType.ValueType # 2
154
+
155
+ class RoleType(_RoleType, metaclass=_RoleTypeEnumTypeWrapper): ...
156
+ ROLE_TYPE_UNKNOWN: Options.RoleType.ValueType # 0
157
+ ROLE_TYPE_INPUT: Options.RoleType.ValueType # 1
158
+ ROLE_TYPE_OUTPUT: Options.RoleType.ValueType # 2
159
+
160
+ @typing_extensions.final
161
+ class Encoding(google.protobuf.message.Message):
162
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
163
+
164
+ class _EncodingType:
165
+ ValueType = typing.NewType("ValueType", builtins.int)
166
+ V: typing_extensions.TypeAlias = ValueType
167
+
168
+ class _EncodingTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Options.Encoding._EncodingType.ValueType], builtins.type):
169
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
170
+ ENCODING_TYPE_UNKNOWN: Options.Encoding._EncodingType.ValueType # 0
171
+ ENCODING_TYPE_ALPHANUMERIC: Options.Encoding._EncodingType.ValueType # 1
172
+ ENCODING_TYPE_NUMERIC: Options.Encoding._EncodingType.ValueType # 2
173
+ ENCODING_TYPE_HEXADECIMAL: Options.Encoding._EncodingType.ValueType # 3
174
+ ENCODING_TYPE_QRCODE: Options.Encoding._EncodingType.ValueType # 4
175
+
176
+ class EncodingType(_EncodingType, metaclass=_EncodingTypeEnumTypeWrapper): ...
177
+ ENCODING_TYPE_UNKNOWN: Options.Encoding.EncodingType.ValueType # 0
178
+ ENCODING_TYPE_ALPHANUMERIC: Options.Encoding.EncodingType.ValueType # 1
179
+ ENCODING_TYPE_NUMERIC: Options.Encoding.EncodingType.ValueType # 2
180
+ ENCODING_TYPE_HEXADECIMAL: Options.Encoding.EncodingType.ValueType # 3
181
+ ENCODING_TYPE_QRCODE: Options.Encoding.EncodingType.ValueType # 4
182
+
183
+ TYPE_FIELD_NUMBER: builtins.int
184
+ SYMBOL_LENGTH_FIELD_NUMBER: builtins.int
185
+ type: global___Options.Encoding.EncodingType.ValueType
186
+ symbol_length: builtins.int
187
+ def __init__(
188
+ self,
189
+ *,
190
+ type: global___Options.Encoding.EncodingType.ValueType | None = ...,
191
+ symbol_length: builtins.int | None = ...,
192
+ ) -> None: ...
193
+ def HasField(self, field_name: typing_extensions.Literal["symbol_length", b"symbol_length", "type", b"type"]) -> builtins.bool: ...
194
+ def ClearField(self, field_name: typing_extensions.Literal["symbol_length", b"symbol_length", "type", b"type"]) -> None: ...
195
+
196
+ INPUT_ENCODINGS_FIELD_NUMBER: builtins.int
197
+ OUTPUT_ENCODINGS_FIELD_NUMBER: builtins.int
198
+ PREFERRED_ROLE_FIELD_NUMBER: builtins.int
199
+ @property
200
+ def input_encodings(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Options.Encoding]:
201
+ """List of encodings this endpoint accepts when serving as an input device."""
202
+ @property
203
+ def output_encodings(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Options.Encoding]:
204
+ """List of encodings this endpoint can generate as an output device."""
205
+ preferred_role: global___Options.RoleType.ValueType
206
+ """Preferred role, if any."""
207
+ def __init__(
208
+ self,
209
+ *,
210
+ input_encodings: collections.abc.Iterable[global___Options.Encoding] | None = ...,
211
+ output_encodings: collections.abc.Iterable[global___Options.Encoding] | None = ...,
212
+ preferred_role: global___Options.RoleType.ValueType | None = ...,
213
+ ) -> None: ...
214
+ def HasField(self, field_name: typing_extensions.Literal["preferred_role", b"preferred_role"]) -> builtins.bool: ...
215
+ def ClearField(self, field_name: typing_extensions.Literal["input_encodings", b"input_encodings", "output_encodings", b"output_encodings", "preferred_role", b"preferred_role"]) -> None: ...
216
+
217
+ global___Options = Options
218
+
219
+ @typing_extensions.final
220
+ class Configuration(google.protobuf.message.Message):
221
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
222
+
223
+ ENCODING_FIELD_NUMBER: builtins.int
224
+ CLIENT_ROLE_FIELD_NUMBER: builtins.int
225
+ @property
226
+ def encoding(self) -> global___Options.Encoding:
227
+ """The encoding to be used in this session."""
228
+ client_role: global___Options.RoleType.ValueType
229
+ """The role of the client (ie, the one initiating pairing). This implies the
230
+ peer (server) acts as the complementary role.
231
+ """
232
+ def __init__(
233
+ self,
234
+ *,
235
+ encoding: global___Options.Encoding | None = ...,
236
+ client_role: global___Options.RoleType.ValueType | None = ...,
237
+ ) -> None: ...
238
+ def HasField(self, field_name: typing_extensions.Literal["client_role", b"client_role", "encoding", b"encoding"]) -> builtins.bool: ...
239
+ def ClearField(self, field_name: typing_extensions.Literal["client_role", b"client_role", "encoding", b"encoding"]) -> None: ...
240
+
241
+ global___Configuration = Configuration
242
+
243
+ @typing_extensions.final
244
+ class ConfigurationAck(google.protobuf.message.Message):
245
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
246
+
247
+ def __init__(
248
+ self,
249
+ ) -> None: ...
250
+
251
+ global___ConfigurationAck = ConfigurationAck
252
+
253
+ @typing_extensions.final
254
+ class Secret(google.protobuf.message.Message):
255
+ """
256
+ Pairing messages
257
+ """
258
+
259
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
260
+
261
+ SECRET_FIELD_NUMBER: builtins.int
262
+ secret: builtins.bytes
263
+ def __init__(
264
+ self,
265
+ *,
266
+ secret: builtins.bytes | None = ...,
267
+ ) -> None: ...
268
+ def HasField(self, field_name: typing_extensions.Literal["secret", b"secret"]) -> builtins.bool: ...
269
+ def ClearField(self, field_name: typing_extensions.Literal["secret", b"secret"]) -> None: ...
270
+
271
+ global___Secret = Secret
272
+
273
+ @typing_extensions.final
274
+ class SecretAck(google.protobuf.message.Message):
275
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
276
+
277
+ SECRET_FIELD_NUMBER: builtins.int
278
+ secret: builtins.bytes
279
+ def __init__(
280
+ self,
281
+ *,
282
+ secret: builtins.bytes | None = ...,
283
+ ) -> None: ...
284
+ def HasField(self, field_name: typing_extensions.Literal["secret", b"secret"]) -> builtins.bool: ...
285
+ def ClearField(self, field_name: typing_extensions.Literal["secret", b"secret"]) -> None: ...
286
+
287
+ global___SecretAck = SecretAck