otdf-python 0.4.0__py3-none-any.whl → 0.4.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- otdf_python/__init__.py +1 -2
- otdf_python/__main__.py +1 -2
- otdf_python/address_normalizer.py +8 -10
- otdf_python/aesgcm.py +8 -0
- otdf_python/assertion_config.py +21 -0
- otdf_python/asym_crypto.py +18 -22
- otdf_python/auth_headers.py +7 -6
- otdf_python/autoconfigure_utils.py +21 -7
- otdf_python/cli.py +5 -5
- otdf_python/collection_store.py +13 -1
- otdf_python/collection_store_impl.py +5 -0
- otdf_python/config.py +13 -0
- otdf_python/connect_client.py +1 -0
- otdf_python/constants.py +2 -0
- otdf_python/crypto_utils.py +4 -0
- otdf_python/dpop.py +3 -5
- otdf_python/ecc_constants.py +12 -14
- otdf_python/ecc_mode.py +7 -2
- otdf_python/ecdh.py +24 -31
- otdf_python/eckeypair.py +5 -0
- otdf_python/header.py +5 -0
- otdf_python/invalid_zip_exception.py +6 -2
- otdf_python/kas_client.py +66 -55
- otdf_python/kas_connect_rpc_client.py +75 -38
- otdf_python/kas_info.py +4 -3
- otdf_python/kas_key_cache.py +10 -9
- otdf_python/key_type.py +4 -0
- otdf_python/key_type_constants.py +4 -11
- otdf_python/manifest.py +24 -0
- otdf_python/nanotdf.py +30 -28
- otdf_python/nanotdf_ecdsa_struct.py +5 -11
- otdf_python/nanotdf_type.py +13 -1
- otdf_python/policy_binding_serializer.py +6 -4
- otdf_python/policy_info.py +6 -0
- otdf_python/policy_object.py +8 -0
- otdf_python/policy_stub.py +2 -0
- otdf_python/resource_locator.py +22 -13
- otdf_python/sdk.py +51 -73
- otdf_python/sdk_builder.py +60 -47
- otdf_python/sdk_exceptions.py +11 -1
- otdf_python/symmetric_and_payload_config.py +6 -0
- otdf_python/tdf.py +47 -10
- otdf_python/tdf_reader.py +10 -13
- otdf_python/tdf_writer.py +5 -0
- otdf_python/token_source.py +4 -3
- otdf_python/version.py +5 -0
- otdf_python/zip_reader.py +10 -2
- otdf_python/zip_writer.py +11 -0
- {otdf_python-0.4.0.dist-info → otdf_python-0.4.2.dist-info}/METADATA +3 -2
- {otdf_python-0.4.0.dist-info → otdf_python-0.4.2.dist-info}/RECORD +81 -72
- {otdf_python-0.4.0.dist-info → otdf_python-0.4.2.dist-info}/WHEEL +1 -1
- otdf_python_proto/__init__.py +2 -6
- otdf_python_proto/authorization/__init__.py +10 -0
- otdf_python_proto/authorization/authorization_connect.py +250 -0
- otdf_python_proto/authorization/v2/authorization_connect.py +315 -0
- otdf_python_proto/entityresolution/__init__.py +10 -0
- otdf_python_proto/entityresolution/entity_resolution_connect.py +185 -0
- otdf_python_proto/entityresolution/v2/entity_resolution_connect.py +185 -0
- otdf_python_proto/kas/__init__.py +2 -2
- otdf_python_proto/kas/kas_connect.py +259 -0
- otdf_python_proto/policy/actions/__init__.py +11 -0
- otdf_python_proto/policy/actions/actions_connect.py +380 -0
- otdf_python_proto/policy/attributes/__init__.py +11 -0
- otdf_python_proto/policy/attributes/attributes_connect.py +1310 -0
- otdf_python_proto/policy/kasregistry/__init__.py +11 -0
- otdf_python_proto/policy/kasregistry/key_access_server_registry_connect.py +912 -0
- otdf_python_proto/policy/keymanagement/__init__.py +11 -0
- otdf_python_proto/policy/keymanagement/key_management_connect.py +380 -0
- otdf_python_proto/policy/namespaces/__init__.py +11 -0
- otdf_python_proto/policy/namespaces/namespaces_connect.py +648 -0
- otdf_python_proto/policy/registeredresources/__init__.py +11 -0
- otdf_python_proto/policy/registeredresources/registered_resources_connect.py +770 -0
- otdf_python_proto/policy/resourcemapping/__init__.py +11 -0
- otdf_python_proto/policy/resourcemapping/resource_mapping_connect.py +790 -0
- otdf_python_proto/policy/subjectmapping/__init__.py +11 -0
- otdf_python_proto/policy/subjectmapping/subject_mapping_connect.py +851 -0
- otdf_python_proto/policy/unsafe/__init__.py +11 -0
- otdf_python_proto/policy/unsafe/unsafe_connect.py +705 -0
- otdf_python_proto/wellknownconfiguration/__init__.py +10 -0
- otdf_python_proto/wellknownconfiguration/wellknown_configuration_connect.py +124 -0
- otdf_python_proto/authorization/authorization_pb2_connect.py +0 -191
- otdf_python_proto/authorization/v2/authorization_pb2_connect.py +0 -233
- otdf_python_proto/entityresolution/entity_resolution_pb2_connect.py +0 -149
- otdf_python_proto/entityresolution/v2/entity_resolution_pb2_connect.py +0 -149
- otdf_python_proto/kas/kas_pb2_connect.py +0 -192
- otdf_python_proto/policy/actions/actions_pb2_connect.py +0 -275
- otdf_python_proto/policy/attributes/attributes_pb2_connect.py +0 -863
- otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2_connect.py +0 -611
- otdf_python_proto/policy/keymanagement/key_management_pb2_connect.py +0 -275
- otdf_python_proto/policy/namespaces/namespaces_pb2_connect.py +0 -443
- otdf_python_proto/policy/registeredresources/registered_resources_pb2_connect.py +0 -527
- otdf_python_proto/policy/resourcemapping/resource_mapping_pb2_connect.py +0 -527
- otdf_python_proto/policy/subjectmapping/subject_mapping_pb2_connect.py +0 -569
- otdf_python_proto/policy/unsafe/unsafe_pb2_connect.py +0 -485
- otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2_connect.py +0 -107
- {otdf_python-0.4.0.dist-info → otdf_python-0.4.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Generated by https://github.com/connectrpc/connect-python. DO NOT EDIT!
|
|
3
|
+
# source: entityresolution/entity_resolution.proto
|
|
4
|
+
|
|
5
|
+
from collections.abc import AsyncGenerator, AsyncIterator, Iterable, Iterator, Mapping
|
|
6
|
+
from typing import Protocol
|
|
7
|
+
|
|
8
|
+
from connectrpc.client import ConnectClient, ConnectClientSync
|
|
9
|
+
from connectrpc.code import Code
|
|
10
|
+
from connectrpc.errors import ConnectError
|
|
11
|
+
from connectrpc.interceptor import Interceptor, InterceptorSync
|
|
12
|
+
from connectrpc.method import IdempotencyLevel, MethodInfo
|
|
13
|
+
from connectrpc.request import Headers, RequestContext
|
|
14
|
+
from connectrpc.server import ConnectASGIApplication, ConnectWSGIApplication, Endpoint, EndpointSync
|
|
15
|
+
from . import entity_resolution_pb2 as entityresolution_dot_entity__resolution__pb2
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class EntityResolutionService(Protocol):
|
|
19
|
+
async def resolve_entities(self, request: entityresolution_dot_entity__resolution__pb2.ResolveEntitiesRequest, ctx: RequestContext) -> entityresolution_dot_entity__resolution__pb2.ResolveEntitiesResponse:
|
|
20
|
+
raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
|
|
21
|
+
|
|
22
|
+
async def create_entity_chain_from_jwt(self, request: entityresolution_dot_entity__resolution__pb2.CreateEntityChainFromJwtRequest, ctx: RequestContext) -> entityresolution_dot_entity__resolution__pb2.CreateEntityChainFromJwtResponse:
|
|
23
|
+
raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class EntityResolutionServiceASGIApplication(ConnectASGIApplication[EntityResolutionService]):
|
|
27
|
+
def __init__(self, service: EntityResolutionService | AsyncGenerator[EntityResolutionService], *, interceptors: Iterable[Interceptor]=(), read_max_bytes: int | None = None) -> None:
|
|
28
|
+
super().__init__(
|
|
29
|
+
service=service,
|
|
30
|
+
endpoints=lambda svc: {
|
|
31
|
+
"/entityresolution.EntityResolutionService/ResolveEntities": Endpoint.unary(
|
|
32
|
+
method=MethodInfo(
|
|
33
|
+
name="ResolveEntities",
|
|
34
|
+
service_name="entityresolution.EntityResolutionService",
|
|
35
|
+
input=entityresolution_dot_entity__resolution__pb2.ResolveEntitiesRequest,
|
|
36
|
+
output=entityresolution_dot_entity__resolution__pb2.ResolveEntitiesResponse,
|
|
37
|
+
idempotency_level=IdempotencyLevel.UNKNOWN,
|
|
38
|
+
),
|
|
39
|
+
function=svc.resolve_entities,
|
|
40
|
+
),
|
|
41
|
+
"/entityresolution.EntityResolutionService/CreateEntityChainFromJwt": Endpoint.unary(
|
|
42
|
+
method=MethodInfo(
|
|
43
|
+
name="CreateEntityChainFromJwt",
|
|
44
|
+
service_name="entityresolution.EntityResolutionService",
|
|
45
|
+
input=entityresolution_dot_entity__resolution__pb2.CreateEntityChainFromJwtRequest,
|
|
46
|
+
output=entityresolution_dot_entity__resolution__pb2.CreateEntityChainFromJwtResponse,
|
|
47
|
+
idempotency_level=IdempotencyLevel.UNKNOWN,
|
|
48
|
+
),
|
|
49
|
+
function=svc.create_entity_chain_from_jwt,
|
|
50
|
+
),
|
|
51
|
+
},
|
|
52
|
+
interceptors=interceptors,
|
|
53
|
+
read_max_bytes=read_max_bytes,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
@property
|
|
57
|
+
def path(self) -> str:
|
|
58
|
+
"""Returns the URL path to mount the application to when serving multiple applications."""
|
|
59
|
+
return "/entityresolution.EntityResolutionService"
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class EntityResolutionServiceClient(ConnectClient):
|
|
63
|
+
async def resolve_entities(
|
|
64
|
+
self,
|
|
65
|
+
request: entityresolution_dot_entity__resolution__pb2.ResolveEntitiesRequest,
|
|
66
|
+
*,
|
|
67
|
+
headers: Headers | Mapping[str, str] | None = None,
|
|
68
|
+
timeout_ms: int | None = None,
|
|
69
|
+
) -> entityresolution_dot_entity__resolution__pb2.ResolveEntitiesResponse:
|
|
70
|
+
return await self.execute_unary(
|
|
71
|
+
request=request,
|
|
72
|
+
method=MethodInfo(
|
|
73
|
+
name="ResolveEntities",
|
|
74
|
+
service_name="entityresolution.EntityResolutionService",
|
|
75
|
+
input=entityresolution_dot_entity__resolution__pb2.ResolveEntitiesRequest,
|
|
76
|
+
output=entityresolution_dot_entity__resolution__pb2.ResolveEntitiesResponse,
|
|
77
|
+
idempotency_level=IdempotencyLevel.UNKNOWN,
|
|
78
|
+
),
|
|
79
|
+
headers=headers,
|
|
80
|
+
timeout_ms=timeout_ms,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
async def create_entity_chain_from_jwt(
|
|
84
|
+
self,
|
|
85
|
+
request: entityresolution_dot_entity__resolution__pb2.CreateEntityChainFromJwtRequest,
|
|
86
|
+
*,
|
|
87
|
+
headers: Headers | Mapping[str, str] | None = None,
|
|
88
|
+
timeout_ms: int | None = None,
|
|
89
|
+
) -> entityresolution_dot_entity__resolution__pb2.CreateEntityChainFromJwtResponse:
|
|
90
|
+
return await self.execute_unary(
|
|
91
|
+
request=request,
|
|
92
|
+
method=MethodInfo(
|
|
93
|
+
name="CreateEntityChainFromJwt",
|
|
94
|
+
service_name="entityresolution.EntityResolutionService",
|
|
95
|
+
input=entityresolution_dot_entity__resolution__pb2.CreateEntityChainFromJwtRequest,
|
|
96
|
+
output=entityresolution_dot_entity__resolution__pb2.CreateEntityChainFromJwtResponse,
|
|
97
|
+
idempotency_level=IdempotencyLevel.UNKNOWN,
|
|
98
|
+
),
|
|
99
|
+
headers=headers,
|
|
100
|
+
timeout_ms=timeout_ms,
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class EntityResolutionServiceSync(Protocol):
|
|
105
|
+
def resolve_entities(self, request: entityresolution_dot_entity__resolution__pb2.ResolveEntitiesRequest, ctx: RequestContext) -> entityresolution_dot_entity__resolution__pb2.ResolveEntitiesResponse:
|
|
106
|
+
raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
|
|
107
|
+
def create_entity_chain_from_jwt(self, request: entityresolution_dot_entity__resolution__pb2.CreateEntityChainFromJwtRequest, ctx: RequestContext) -> entityresolution_dot_entity__resolution__pb2.CreateEntityChainFromJwtResponse:
|
|
108
|
+
raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
class EntityResolutionServiceWSGIApplication(ConnectWSGIApplication):
|
|
112
|
+
def __init__(self, service: EntityResolutionServiceSync, interceptors: Iterable[InterceptorSync]=(), read_max_bytes: int | None = None) -> None:
|
|
113
|
+
super().__init__(
|
|
114
|
+
endpoints={
|
|
115
|
+
"/entityresolution.EntityResolutionService/ResolveEntities": EndpointSync.unary(
|
|
116
|
+
method=MethodInfo(
|
|
117
|
+
name="ResolveEntities",
|
|
118
|
+
service_name="entityresolution.EntityResolutionService",
|
|
119
|
+
input=entityresolution_dot_entity__resolution__pb2.ResolveEntitiesRequest,
|
|
120
|
+
output=entityresolution_dot_entity__resolution__pb2.ResolveEntitiesResponse,
|
|
121
|
+
idempotency_level=IdempotencyLevel.UNKNOWN,
|
|
122
|
+
),
|
|
123
|
+
function=service.resolve_entities,
|
|
124
|
+
),
|
|
125
|
+
"/entityresolution.EntityResolutionService/CreateEntityChainFromJwt": EndpointSync.unary(
|
|
126
|
+
method=MethodInfo(
|
|
127
|
+
name="CreateEntityChainFromJwt",
|
|
128
|
+
service_name="entityresolution.EntityResolutionService",
|
|
129
|
+
input=entityresolution_dot_entity__resolution__pb2.CreateEntityChainFromJwtRequest,
|
|
130
|
+
output=entityresolution_dot_entity__resolution__pb2.CreateEntityChainFromJwtResponse,
|
|
131
|
+
idempotency_level=IdempotencyLevel.UNKNOWN,
|
|
132
|
+
),
|
|
133
|
+
function=service.create_entity_chain_from_jwt,
|
|
134
|
+
),
|
|
135
|
+
},
|
|
136
|
+
interceptors=interceptors,
|
|
137
|
+
read_max_bytes=read_max_bytes,
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
@property
|
|
141
|
+
def path(self) -> str:
|
|
142
|
+
"""Returns the URL path to mount the application to when serving multiple applications."""
|
|
143
|
+
return "/entityresolution.EntityResolutionService"
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
class EntityResolutionServiceClientSync(ConnectClientSync):
|
|
147
|
+
def resolve_entities(
|
|
148
|
+
self,
|
|
149
|
+
request: entityresolution_dot_entity__resolution__pb2.ResolveEntitiesRequest,
|
|
150
|
+
*,
|
|
151
|
+
headers: Headers | Mapping[str, str] | None = None,
|
|
152
|
+
timeout_ms: int | None = None,
|
|
153
|
+
) -> entityresolution_dot_entity__resolution__pb2.ResolveEntitiesResponse:
|
|
154
|
+
return self.execute_unary(
|
|
155
|
+
request=request,
|
|
156
|
+
method=MethodInfo(
|
|
157
|
+
name="ResolveEntities",
|
|
158
|
+
service_name="entityresolution.EntityResolutionService",
|
|
159
|
+
input=entityresolution_dot_entity__resolution__pb2.ResolveEntitiesRequest,
|
|
160
|
+
output=entityresolution_dot_entity__resolution__pb2.ResolveEntitiesResponse,
|
|
161
|
+
idempotency_level=IdempotencyLevel.UNKNOWN,
|
|
162
|
+
),
|
|
163
|
+
headers=headers,
|
|
164
|
+
timeout_ms=timeout_ms,
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
def create_entity_chain_from_jwt(
|
|
168
|
+
self,
|
|
169
|
+
request: entityresolution_dot_entity__resolution__pb2.CreateEntityChainFromJwtRequest,
|
|
170
|
+
*,
|
|
171
|
+
headers: Headers | Mapping[str, str] | None = None,
|
|
172
|
+
timeout_ms: int | None = None,
|
|
173
|
+
) -> entityresolution_dot_entity__resolution__pb2.CreateEntityChainFromJwtResponse:
|
|
174
|
+
return self.execute_unary(
|
|
175
|
+
request=request,
|
|
176
|
+
method=MethodInfo(
|
|
177
|
+
name="CreateEntityChainFromJwt",
|
|
178
|
+
service_name="entityresolution.EntityResolutionService",
|
|
179
|
+
input=entityresolution_dot_entity__resolution__pb2.CreateEntityChainFromJwtRequest,
|
|
180
|
+
output=entityresolution_dot_entity__resolution__pb2.CreateEntityChainFromJwtResponse,
|
|
181
|
+
idempotency_level=IdempotencyLevel.UNKNOWN,
|
|
182
|
+
),
|
|
183
|
+
headers=headers,
|
|
184
|
+
timeout_ms=timeout_ms,
|
|
185
|
+
)
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Generated by https://github.com/connectrpc/connect-python. DO NOT EDIT!
|
|
3
|
+
# source: entityresolution/v2/entity_resolution.proto
|
|
4
|
+
|
|
5
|
+
from collections.abc import AsyncGenerator, AsyncIterator, Iterable, Iterator, Mapping
|
|
6
|
+
from typing import Protocol
|
|
7
|
+
|
|
8
|
+
from connectrpc.client import ConnectClient, ConnectClientSync
|
|
9
|
+
from connectrpc.code import Code
|
|
10
|
+
from connectrpc.errors import ConnectError
|
|
11
|
+
from connectrpc.interceptor import Interceptor, InterceptorSync
|
|
12
|
+
from connectrpc.method import IdempotencyLevel, MethodInfo
|
|
13
|
+
from connectrpc.request import Headers, RequestContext
|
|
14
|
+
from connectrpc.server import ConnectASGIApplication, ConnectWSGIApplication, Endpoint, EndpointSync
|
|
15
|
+
import entityresolution.v2.entity_resolution_pb2 as entityresolution_dot_v2_dot_entity__resolution__pb2
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class EntityResolutionService(Protocol):
|
|
19
|
+
async def resolve_entities(self, request: entityresolution_dot_v2_dot_entity__resolution__pb2.ResolveEntitiesRequest, ctx: RequestContext) -> entityresolution_dot_v2_dot_entity__resolution__pb2.ResolveEntitiesResponse:
|
|
20
|
+
raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
|
|
21
|
+
|
|
22
|
+
async def create_entity_chains_from_tokens(self, request: entityresolution_dot_v2_dot_entity__resolution__pb2.CreateEntityChainsFromTokensRequest, ctx: RequestContext) -> entityresolution_dot_v2_dot_entity__resolution__pb2.CreateEntityChainsFromTokensResponse:
|
|
23
|
+
raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class EntityResolutionServiceASGIApplication(ConnectASGIApplication[EntityResolutionService]):
|
|
27
|
+
def __init__(self, service: EntityResolutionService | AsyncGenerator[EntityResolutionService], *, interceptors: Iterable[Interceptor]=(), read_max_bytes: int | None = None) -> None:
|
|
28
|
+
super().__init__(
|
|
29
|
+
service=service,
|
|
30
|
+
endpoints=lambda svc: {
|
|
31
|
+
"/entityresolution.v2.EntityResolutionService/ResolveEntities": Endpoint.unary(
|
|
32
|
+
method=MethodInfo(
|
|
33
|
+
name="ResolveEntities",
|
|
34
|
+
service_name="entityresolution.v2.EntityResolutionService",
|
|
35
|
+
input=entityresolution_dot_v2_dot_entity__resolution__pb2.ResolveEntitiesRequest,
|
|
36
|
+
output=entityresolution_dot_v2_dot_entity__resolution__pb2.ResolveEntitiesResponse,
|
|
37
|
+
idempotency_level=IdempotencyLevel.UNKNOWN,
|
|
38
|
+
),
|
|
39
|
+
function=svc.resolve_entities,
|
|
40
|
+
),
|
|
41
|
+
"/entityresolution.v2.EntityResolutionService/CreateEntityChainsFromTokens": Endpoint.unary(
|
|
42
|
+
method=MethodInfo(
|
|
43
|
+
name="CreateEntityChainsFromTokens",
|
|
44
|
+
service_name="entityresolution.v2.EntityResolutionService",
|
|
45
|
+
input=entityresolution_dot_v2_dot_entity__resolution__pb2.CreateEntityChainsFromTokensRequest,
|
|
46
|
+
output=entityresolution_dot_v2_dot_entity__resolution__pb2.CreateEntityChainsFromTokensResponse,
|
|
47
|
+
idempotency_level=IdempotencyLevel.UNKNOWN,
|
|
48
|
+
),
|
|
49
|
+
function=svc.create_entity_chains_from_tokens,
|
|
50
|
+
),
|
|
51
|
+
},
|
|
52
|
+
interceptors=interceptors,
|
|
53
|
+
read_max_bytes=read_max_bytes,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
@property
|
|
57
|
+
def path(self) -> str:
|
|
58
|
+
"""Returns the URL path to mount the application to when serving multiple applications."""
|
|
59
|
+
return "/entityresolution.v2.EntityResolutionService"
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class EntityResolutionServiceClient(ConnectClient):
|
|
63
|
+
async def resolve_entities(
|
|
64
|
+
self,
|
|
65
|
+
request: entityresolution_dot_v2_dot_entity__resolution__pb2.ResolveEntitiesRequest,
|
|
66
|
+
*,
|
|
67
|
+
headers: Headers | Mapping[str, str] | None = None,
|
|
68
|
+
timeout_ms: int | None = None,
|
|
69
|
+
) -> entityresolution_dot_v2_dot_entity__resolution__pb2.ResolveEntitiesResponse:
|
|
70
|
+
return await self.execute_unary(
|
|
71
|
+
request=request,
|
|
72
|
+
method=MethodInfo(
|
|
73
|
+
name="ResolveEntities",
|
|
74
|
+
service_name="entityresolution.v2.EntityResolutionService",
|
|
75
|
+
input=entityresolution_dot_v2_dot_entity__resolution__pb2.ResolveEntitiesRequest,
|
|
76
|
+
output=entityresolution_dot_v2_dot_entity__resolution__pb2.ResolveEntitiesResponse,
|
|
77
|
+
idempotency_level=IdempotencyLevel.UNKNOWN,
|
|
78
|
+
),
|
|
79
|
+
headers=headers,
|
|
80
|
+
timeout_ms=timeout_ms,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
async def create_entity_chains_from_tokens(
|
|
84
|
+
self,
|
|
85
|
+
request: entityresolution_dot_v2_dot_entity__resolution__pb2.CreateEntityChainsFromTokensRequest,
|
|
86
|
+
*,
|
|
87
|
+
headers: Headers | Mapping[str, str] | None = None,
|
|
88
|
+
timeout_ms: int | None = None,
|
|
89
|
+
) -> entityresolution_dot_v2_dot_entity__resolution__pb2.CreateEntityChainsFromTokensResponse:
|
|
90
|
+
return await self.execute_unary(
|
|
91
|
+
request=request,
|
|
92
|
+
method=MethodInfo(
|
|
93
|
+
name="CreateEntityChainsFromTokens",
|
|
94
|
+
service_name="entityresolution.v2.EntityResolutionService",
|
|
95
|
+
input=entityresolution_dot_v2_dot_entity__resolution__pb2.CreateEntityChainsFromTokensRequest,
|
|
96
|
+
output=entityresolution_dot_v2_dot_entity__resolution__pb2.CreateEntityChainsFromTokensResponse,
|
|
97
|
+
idempotency_level=IdempotencyLevel.UNKNOWN,
|
|
98
|
+
),
|
|
99
|
+
headers=headers,
|
|
100
|
+
timeout_ms=timeout_ms,
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class EntityResolutionServiceSync(Protocol):
|
|
105
|
+
def resolve_entities(self, request: entityresolution_dot_v2_dot_entity__resolution__pb2.ResolveEntitiesRequest, ctx: RequestContext) -> entityresolution_dot_v2_dot_entity__resolution__pb2.ResolveEntitiesResponse:
|
|
106
|
+
raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
|
|
107
|
+
def create_entity_chains_from_tokens(self, request: entityresolution_dot_v2_dot_entity__resolution__pb2.CreateEntityChainsFromTokensRequest, ctx: RequestContext) -> entityresolution_dot_v2_dot_entity__resolution__pb2.CreateEntityChainsFromTokensResponse:
|
|
108
|
+
raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
class EntityResolutionServiceWSGIApplication(ConnectWSGIApplication):
|
|
112
|
+
def __init__(self, service: EntityResolutionServiceSync, interceptors: Iterable[InterceptorSync]=(), read_max_bytes: int | None = None) -> None:
|
|
113
|
+
super().__init__(
|
|
114
|
+
endpoints={
|
|
115
|
+
"/entityresolution.v2.EntityResolutionService/ResolveEntities": EndpointSync.unary(
|
|
116
|
+
method=MethodInfo(
|
|
117
|
+
name="ResolveEntities",
|
|
118
|
+
service_name="entityresolution.v2.EntityResolutionService",
|
|
119
|
+
input=entityresolution_dot_v2_dot_entity__resolution__pb2.ResolveEntitiesRequest,
|
|
120
|
+
output=entityresolution_dot_v2_dot_entity__resolution__pb2.ResolveEntitiesResponse,
|
|
121
|
+
idempotency_level=IdempotencyLevel.UNKNOWN,
|
|
122
|
+
),
|
|
123
|
+
function=service.resolve_entities,
|
|
124
|
+
),
|
|
125
|
+
"/entityresolution.v2.EntityResolutionService/CreateEntityChainsFromTokens": EndpointSync.unary(
|
|
126
|
+
method=MethodInfo(
|
|
127
|
+
name="CreateEntityChainsFromTokens",
|
|
128
|
+
service_name="entityresolution.v2.EntityResolutionService",
|
|
129
|
+
input=entityresolution_dot_v2_dot_entity__resolution__pb2.CreateEntityChainsFromTokensRequest,
|
|
130
|
+
output=entityresolution_dot_v2_dot_entity__resolution__pb2.CreateEntityChainsFromTokensResponse,
|
|
131
|
+
idempotency_level=IdempotencyLevel.UNKNOWN,
|
|
132
|
+
),
|
|
133
|
+
function=service.create_entity_chains_from_tokens,
|
|
134
|
+
),
|
|
135
|
+
},
|
|
136
|
+
interceptors=interceptors,
|
|
137
|
+
read_max_bytes=read_max_bytes,
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
@property
|
|
141
|
+
def path(self) -> str:
|
|
142
|
+
"""Returns the URL path to mount the application to when serving multiple applications."""
|
|
143
|
+
return "/entityresolution.v2.EntityResolutionService"
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
class EntityResolutionServiceClientSync(ConnectClientSync):
|
|
147
|
+
def resolve_entities(
|
|
148
|
+
self,
|
|
149
|
+
request: entityresolution_dot_v2_dot_entity__resolution__pb2.ResolveEntitiesRequest,
|
|
150
|
+
*,
|
|
151
|
+
headers: Headers | Mapping[str, str] | None = None,
|
|
152
|
+
timeout_ms: int | None = None,
|
|
153
|
+
) -> entityresolution_dot_v2_dot_entity__resolution__pb2.ResolveEntitiesResponse:
|
|
154
|
+
return self.execute_unary(
|
|
155
|
+
request=request,
|
|
156
|
+
method=MethodInfo(
|
|
157
|
+
name="ResolveEntities",
|
|
158
|
+
service_name="entityresolution.v2.EntityResolutionService",
|
|
159
|
+
input=entityresolution_dot_v2_dot_entity__resolution__pb2.ResolveEntitiesRequest,
|
|
160
|
+
output=entityresolution_dot_v2_dot_entity__resolution__pb2.ResolveEntitiesResponse,
|
|
161
|
+
idempotency_level=IdempotencyLevel.UNKNOWN,
|
|
162
|
+
),
|
|
163
|
+
headers=headers,
|
|
164
|
+
timeout_ms=timeout_ms,
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
def create_entity_chains_from_tokens(
|
|
168
|
+
self,
|
|
169
|
+
request: entityresolution_dot_v2_dot_entity__resolution__pb2.CreateEntityChainsFromTokensRequest,
|
|
170
|
+
*,
|
|
171
|
+
headers: Headers | Mapping[str, str] | None = None,
|
|
172
|
+
timeout_ms: int | None = None,
|
|
173
|
+
) -> entityresolution_dot_v2_dot_entity__resolution__pb2.CreateEntityChainsFromTokensResponse:
|
|
174
|
+
return self.execute_unary(
|
|
175
|
+
request=request,
|
|
176
|
+
method=MethodInfo(
|
|
177
|
+
name="CreateEntityChainsFromTokens",
|
|
178
|
+
service_name="entityresolution.v2.EntityResolutionService",
|
|
179
|
+
input=entityresolution_dot_v2_dot_entity__resolution__pb2.CreateEntityChainsFromTokensRequest,
|
|
180
|
+
output=entityresolution_dot_v2_dot_entity__resolution__pb2.CreateEntityChainsFromTokensResponse,
|
|
181
|
+
idempotency_level=IdempotencyLevel.UNKNOWN,
|
|
182
|
+
),
|
|
183
|
+
headers=headers,
|
|
184
|
+
timeout_ms=timeout_ms,
|
|
185
|
+
)
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"""KAS (Key Access Service) protobuf definitions."""
|
|
2
2
|
|
|
3
3
|
from .kas_pb2 import *
|
|
4
|
-
from .
|
|
4
|
+
from .kas_connect import AccessServiceClient, AccessServiceClientSync
|
|
5
5
|
|
|
6
6
|
__all__ = [
|
|
7
7
|
"AccessServiceClient",
|
|
8
|
-
"
|
|
8
|
+
"AccessServiceClientSync",
|
|
9
9
|
]
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Generated by https://github.com/connectrpc/connect-python. DO NOT EDIT!
|
|
3
|
+
# source: kas/kas.proto
|
|
4
|
+
|
|
5
|
+
from collections.abc import AsyncGenerator, AsyncIterator, Iterable, Iterator, Mapping
|
|
6
|
+
from typing import Protocol
|
|
7
|
+
|
|
8
|
+
from connectrpc.client import ConnectClient, ConnectClientSync
|
|
9
|
+
from connectrpc.code import Code
|
|
10
|
+
from connectrpc.errors import ConnectError
|
|
11
|
+
from connectrpc.interceptor import Interceptor, InterceptorSync
|
|
12
|
+
from connectrpc.method import IdempotencyLevel, MethodInfo
|
|
13
|
+
from connectrpc.request import Headers, RequestContext
|
|
14
|
+
from connectrpc.server import ConnectASGIApplication, ConnectWSGIApplication, Endpoint, EndpointSync
|
|
15
|
+
import google.protobuf.wrappers_pb2 as google_dot_protobuf_dot_wrappers__pb2
|
|
16
|
+
from . import kas_pb2 as kas_dot_kas__pb2
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class AccessService(Protocol):
|
|
20
|
+
async def public_key(self, request: kas_dot_kas__pb2.PublicKeyRequest, ctx: RequestContext) -> kas_dot_kas__pb2.PublicKeyResponse:
|
|
21
|
+
raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
|
|
22
|
+
|
|
23
|
+
async def legacy_public_key(self, request: kas_dot_kas__pb2.LegacyPublicKeyRequest, ctx: RequestContext) -> google_dot_protobuf_dot_wrappers__pb2.StringValue:
|
|
24
|
+
raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
|
|
25
|
+
|
|
26
|
+
async def rewrap(self, request: kas_dot_kas__pb2.RewrapRequest, ctx: RequestContext) -> kas_dot_kas__pb2.RewrapResponse:
|
|
27
|
+
raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class AccessServiceASGIApplication(ConnectASGIApplication[AccessService]):
|
|
31
|
+
def __init__(self, service: AccessService | AsyncGenerator[AccessService], *, interceptors: Iterable[Interceptor]=(), read_max_bytes: int | None = None) -> None:
|
|
32
|
+
super().__init__(
|
|
33
|
+
service=service,
|
|
34
|
+
endpoints=lambda svc: {
|
|
35
|
+
"/kas.AccessService/PublicKey": Endpoint.unary(
|
|
36
|
+
method=MethodInfo(
|
|
37
|
+
name="PublicKey",
|
|
38
|
+
service_name="kas.AccessService",
|
|
39
|
+
input=kas_dot_kas__pb2.PublicKeyRequest,
|
|
40
|
+
output=kas_dot_kas__pb2.PublicKeyResponse,
|
|
41
|
+
idempotency_level=IdempotencyLevel.NO_SIDE_EFFECTS,
|
|
42
|
+
),
|
|
43
|
+
function=svc.public_key,
|
|
44
|
+
),
|
|
45
|
+
"/kas.AccessService/LegacyPublicKey": Endpoint.unary(
|
|
46
|
+
method=MethodInfo(
|
|
47
|
+
name="LegacyPublicKey",
|
|
48
|
+
service_name="kas.AccessService",
|
|
49
|
+
input=kas_dot_kas__pb2.LegacyPublicKeyRequest,
|
|
50
|
+
output=google_dot_protobuf_dot_wrappers__pb2.StringValue,
|
|
51
|
+
idempotency_level=IdempotencyLevel.NO_SIDE_EFFECTS,
|
|
52
|
+
),
|
|
53
|
+
function=svc.legacy_public_key,
|
|
54
|
+
),
|
|
55
|
+
"/kas.AccessService/Rewrap": Endpoint.unary(
|
|
56
|
+
method=MethodInfo(
|
|
57
|
+
name="Rewrap",
|
|
58
|
+
service_name="kas.AccessService",
|
|
59
|
+
input=kas_dot_kas__pb2.RewrapRequest,
|
|
60
|
+
output=kas_dot_kas__pb2.RewrapResponse,
|
|
61
|
+
idempotency_level=IdempotencyLevel.UNKNOWN,
|
|
62
|
+
),
|
|
63
|
+
function=svc.rewrap,
|
|
64
|
+
),
|
|
65
|
+
},
|
|
66
|
+
interceptors=interceptors,
|
|
67
|
+
read_max_bytes=read_max_bytes,
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
@property
|
|
71
|
+
def path(self) -> str:
|
|
72
|
+
"""Returns the URL path to mount the application to when serving multiple applications."""
|
|
73
|
+
return "/kas.AccessService"
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class AccessServiceClient(ConnectClient):
|
|
77
|
+
async def public_key(
|
|
78
|
+
self,
|
|
79
|
+
request: kas_dot_kas__pb2.PublicKeyRequest,
|
|
80
|
+
*,
|
|
81
|
+
headers: Headers | Mapping[str, str] | None = None,
|
|
82
|
+
timeout_ms: int | None = None,
|
|
83
|
+
use_get: bool = False,
|
|
84
|
+
) -> kas_dot_kas__pb2.PublicKeyResponse:
|
|
85
|
+
return await self.execute_unary(
|
|
86
|
+
request=request,
|
|
87
|
+
method=MethodInfo(
|
|
88
|
+
name="PublicKey",
|
|
89
|
+
service_name="kas.AccessService",
|
|
90
|
+
input=kas_dot_kas__pb2.PublicKeyRequest,
|
|
91
|
+
output=kas_dot_kas__pb2.PublicKeyResponse,
|
|
92
|
+
idempotency_level=IdempotencyLevel.NO_SIDE_EFFECTS,
|
|
93
|
+
),
|
|
94
|
+
headers=headers,
|
|
95
|
+
timeout_ms=timeout_ms,
|
|
96
|
+
use_get=use_get,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
async def legacy_public_key(
|
|
100
|
+
self,
|
|
101
|
+
request: kas_dot_kas__pb2.LegacyPublicKeyRequest,
|
|
102
|
+
*,
|
|
103
|
+
headers: Headers | Mapping[str, str] | None = None,
|
|
104
|
+
timeout_ms: int | None = None,
|
|
105
|
+
use_get: bool = False,
|
|
106
|
+
) -> google_dot_protobuf_dot_wrappers__pb2.StringValue:
|
|
107
|
+
return await self.execute_unary(
|
|
108
|
+
request=request,
|
|
109
|
+
method=MethodInfo(
|
|
110
|
+
name="LegacyPublicKey",
|
|
111
|
+
service_name="kas.AccessService",
|
|
112
|
+
input=kas_dot_kas__pb2.LegacyPublicKeyRequest,
|
|
113
|
+
output=google_dot_protobuf_dot_wrappers__pb2.StringValue,
|
|
114
|
+
idempotency_level=IdempotencyLevel.NO_SIDE_EFFECTS,
|
|
115
|
+
),
|
|
116
|
+
headers=headers,
|
|
117
|
+
timeout_ms=timeout_ms,
|
|
118
|
+
use_get=use_get,
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
async def rewrap(
|
|
122
|
+
self,
|
|
123
|
+
request: kas_dot_kas__pb2.RewrapRequest,
|
|
124
|
+
*,
|
|
125
|
+
headers: Headers | Mapping[str, str] | None = None,
|
|
126
|
+
timeout_ms: int | None = None,
|
|
127
|
+
) -> kas_dot_kas__pb2.RewrapResponse:
|
|
128
|
+
return await self.execute_unary(
|
|
129
|
+
request=request,
|
|
130
|
+
method=MethodInfo(
|
|
131
|
+
name="Rewrap",
|
|
132
|
+
service_name="kas.AccessService",
|
|
133
|
+
input=kas_dot_kas__pb2.RewrapRequest,
|
|
134
|
+
output=kas_dot_kas__pb2.RewrapResponse,
|
|
135
|
+
idempotency_level=IdempotencyLevel.UNKNOWN,
|
|
136
|
+
),
|
|
137
|
+
headers=headers,
|
|
138
|
+
timeout_ms=timeout_ms,
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
class AccessServiceSync(Protocol):
|
|
143
|
+
def public_key(self, request: kas_dot_kas__pb2.PublicKeyRequest, ctx: RequestContext) -> kas_dot_kas__pb2.PublicKeyResponse:
|
|
144
|
+
raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
|
|
145
|
+
def legacy_public_key(self, request: kas_dot_kas__pb2.LegacyPublicKeyRequest, ctx: RequestContext) -> google_dot_protobuf_dot_wrappers__pb2.StringValue:
|
|
146
|
+
raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
|
|
147
|
+
def rewrap(self, request: kas_dot_kas__pb2.RewrapRequest, ctx: RequestContext) -> kas_dot_kas__pb2.RewrapResponse:
|
|
148
|
+
raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
class AccessServiceWSGIApplication(ConnectWSGIApplication):
|
|
152
|
+
def __init__(self, service: AccessServiceSync, interceptors: Iterable[InterceptorSync]=(), read_max_bytes: int | None = None) -> None:
|
|
153
|
+
super().__init__(
|
|
154
|
+
endpoints={
|
|
155
|
+
"/kas.AccessService/PublicKey": EndpointSync.unary(
|
|
156
|
+
method=MethodInfo(
|
|
157
|
+
name="PublicKey",
|
|
158
|
+
service_name="kas.AccessService",
|
|
159
|
+
input=kas_dot_kas__pb2.PublicKeyRequest,
|
|
160
|
+
output=kas_dot_kas__pb2.PublicKeyResponse,
|
|
161
|
+
idempotency_level=IdempotencyLevel.NO_SIDE_EFFECTS,
|
|
162
|
+
),
|
|
163
|
+
function=service.public_key,
|
|
164
|
+
),
|
|
165
|
+
"/kas.AccessService/LegacyPublicKey": EndpointSync.unary(
|
|
166
|
+
method=MethodInfo(
|
|
167
|
+
name="LegacyPublicKey",
|
|
168
|
+
service_name="kas.AccessService",
|
|
169
|
+
input=kas_dot_kas__pb2.LegacyPublicKeyRequest,
|
|
170
|
+
output=google_dot_protobuf_dot_wrappers__pb2.StringValue,
|
|
171
|
+
idempotency_level=IdempotencyLevel.NO_SIDE_EFFECTS,
|
|
172
|
+
),
|
|
173
|
+
function=service.legacy_public_key,
|
|
174
|
+
),
|
|
175
|
+
"/kas.AccessService/Rewrap": EndpointSync.unary(
|
|
176
|
+
method=MethodInfo(
|
|
177
|
+
name="Rewrap",
|
|
178
|
+
service_name="kas.AccessService",
|
|
179
|
+
input=kas_dot_kas__pb2.RewrapRequest,
|
|
180
|
+
output=kas_dot_kas__pb2.RewrapResponse,
|
|
181
|
+
idempotency_level=IdempotencyLevel.UNKNOWN,
|
|
182
|
+
),
|
|
183
|
+
function=service.rewrap,
|
|
184
|
+
),
|
|
185
|
+
},
|
|
186
|
+
interceptors=interceptors,
|
|
187
|
+
read_max_bytes=read_max_bytes,
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
@property
|
|
191
|
+
def path(self) -> str:
|
|
192
|
+
"""Returns the URL path to mount the application to when serving multiple applications."""
|
|
193
|
+
return "/kas.AccessService"
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
class AccessServiceClientSync(ConnectClientSync):
|
|
197
|
+
def public_key(
|
|
198
|
+
self,
|
|
199
|
+
request: kas_dot_kas__pb2.PublicKeyRequest,
|
|
200
|
+
*,
|
|
201
|
+
headers: Headers | Mapping[str, str] | None = None,
|
|
202
|
+
timeout_ms: int | None = None,
|
|
203
|
+
use_get: bool = False,
|
|
204
|
+
) -> kas_dot_kas__pb2.PublicKeyResponse:
|
|
205
|
+
return self.execute_unary(
|
|
206
|
+
request=request,
|
|
207
|
+
method=MethodInfo(
|
|
208
|
+
name="PublicKey",
|
|
209
|
+
service_name="kas.AccessService",
|
|
210
|
+
input=kas_dot_kas__pb2.PublicKeyRequest,
|
|
211
|
+
output=kas_dot_kas__pb2.PublicKeyResponse,
|
|
212
|
+
idempotency_level=IdempotencyLevel.NO_SIDE_EFFECTS,
|
|
213
|
+
),
|
|
214
|
+
headers=headers,
|
|
215
|
+
timeout_ms=timeout_ms,
|
|
216
|
+
use_get=use_get,
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
def legacy_public_key(
|
|
220
|
+
self,
|
|
221
|
+
request: kas_dot_kas__pb2.LegacyPublicKeyRequest,
|
|
222
|
+
*,
|
|
223
|
+
headers: Headers | Mapping[str, str] | None = None,
|
|
224
|
+
timeout_ms: int | None = None,
|
|
225
|
+
use_get: bool = False,
|
|
226
|
+
) -> google_dot_protobuf_dot_wrappers__pb2.StringValue:
|
|
227
|
+
return self.execute_unary(
|
|
228
|
+
request=request,
|
|
229
|
+
method=MethodInfo(
|
|
230
|
+
name="LegacyPublicKey",
|
|
231
|
+
service_name="kas.AccessService",
|
|
232
|
+
input=kas_dot_kas__pb2.LegacyPublicKeyRequest,
|
|
233
|
+
output=google_dot_protobuf_dot_wrappers__pb2.StringValue,
|
|
234
|
+
idempotency_level=IdempotencyLevel.NO_SIDE_EFFECTS,
|
|
235
|
+
),
|
|
236
|
+
headers=headers,
|
|
237
|
+
timeout_ms=timeout_ms,
|
|
238
|
+
use_get=use_get,
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
def rewrap(
|
|
242
|
+
self,
|
|
243
|
+
request: kas_dot_kas__pb2.RewrapRequest,
|
|
244
|
+
*,
|
|
245
|
+
headers: Headers | Mapping[str, str] | None = None,
|
|
246
|
+
timeout_ms: int | None = None,
|
|
247
|
+
) -> kas_dot_kas__pb2.RewrapResponse:
|
|
248
|
+
return self.execute_unary(
|
|
249
|
+
request=request,
|
|
250
|
+
method=MethodInfo(
|
|
251
|
+
name="Rewrap",
|
|
252
|
+
service_name="kas.AccessService",
|
|
253
|
+
input=kas_dot_kas__pb2.RewrapRequest,
|
|
254
|
+
output=kas_dot_kas__pb2.RewrapResponse,
|
|
255
|
+
idempotency_level=IdempotencyLevel.UNKNOWN,
|
|
256
|
+
),
|
|
257
|
+
headers=headers,
|
|
258
|
+
timeout_ms=timeout_ms,
|
|
259
|
+
)
|