2
2
import inspect
3
3
import itertools
4
4
5
- from typing import Any , List , Optional , Type
5
+ from typing import Any , List , Optional , Type , Union
6
6
7
7
import functools
8
8
9
9
import attr
10
10
11
+ from jsii .errors import JSIIError
11
12
from jsii import _reference_map
12
13
from jsii ._utils import Singleton
13
14
from jsii ._kernel .providers import BaseProvider , ProcessProvider
14
15
from jsii ._kernel .types import JSClass , Referenceable
16
+ from jsii ._kernel .types import Callback
15
17
from jsii ._kernel .types import (
16
18
EnumRef ,
17
19
LoadRequest ,
18
20
BeginRequest ,
19
21
CallbacksRequest ,
20
22
CreateRequest ,
23
+ CreateResponse ,
21
24
CompleteRequest ,
22
25
DeleteRequest ,
23
26
EndRequest ,
30
33
StatsRequest ,
31
34
ObjRef ,
32
35
Override ,
36
+ CompleteRequest ,
37
+ CompleteResponse ,
38
+ GetResponse ,
39
+ SetResponse ,
40
+ InvokeResponse ,
41
+ KernelResponse ,
42
+ BeginResponse
33
43
)
34
44
35
45
@@ -40,12 +50,6 @@ class Object:
40
50
__jsii_type__ = "Object"
41
51
42
52
43
- def _handle_callback (kernel , callback ):
44
- obj = _reference_map .resolve_id (callback .invoke .objref .ref )
45
- method = getattr (obj , callback .cookie )
46
- return method (* callback .invoke .args )
47
-
48
-
49
53
def _get_overides (klass : JSClass , obj : Any ) -> List [Override ]:
50
54
overrides = []
51
55
@@ -120,6 +124,39 @@ def _make_reference_for_native(kernel, d):
120
124
return d
121
125
122
126
127
+ def _handle_callback (kernel , callback ):
128
+ # need to handle get, set requests here as well as invoke requests
129
+ if callback .invoke :
130
+ obj = _reference_map .resolve_id (callback .invoke .objref .ref )
131
+ method = getattr (obj , callback .cookie )
132
+ return method (* callback .invoke .args )
133
+ elif callback .get :
134
+ obj = _reference_map .resolve_id (callback .get .objref .ref )
135
+ return getattr (obj , callback .cookie )
136
+ elif callback .set :
137
+ obj = _reference_map .resolve_id (callback .set .objref .ref )
138
+ return setattr (obj , callback .cookie , callback .set .value )
139
+ else :
140
+ raise JSIIError ("Callback does not contain invoke|get|set" )
141
+
142
+
143
+ def _callback_till_result (kernel , response : Callback , response_type : Type [KernelResponse ]) -> Any :
144
+ while isinstance (response , Callback ):
145
+ try :
146
+ result = _handle_callback (kernel , response )
147
+ except Exception as exc :
148
+ response = kernel .sync_complete (response .cbid , str (exc ), None , response_type )
149
+ else :
150
+ response = kernel .sync_complete (response .cbid , None , result , response_type )
151
+
152
+ if isinstance (response , InvokeResponse ):
153
+ return response .result
154
+ elif isinstance (response , GetResponse ):
155
+ return response .value
156
+ else :
157
+ return response
158
+
159
+
123
160
@attr .s (auto_attribs = True , frozen = True , slots = True )
124
161
class Statistics :
125
162
@@ -155,33 +192,42 @@ def create(
155
192
156
193
overrides = _get_overides (klass , obj )
157
194
158
- obj . __jsii_ref__ = self .provider .create (
195
+ response = self .provider .create (
159
196
CreateRequest (
160
197
fqn = klass .__jsii_type__ ,
161
198
args = _make_reference_for_native (self , args ),
162
199
overrides = overrides ,
163
200
)
164
201
)
165
-
202
+ if isinstance (response , Callback ):
203
+ obj .__jsii_ref__ = _callback_till_result (self , response , CreateResponse )
204
+ else :
205
+ obj .__jsii_ref__ = response
166
206
return obj .__jsii_ref__
167
207
168
208
def delete (self , ref : ObjRef ) -> None :
169
209
self .provider .delete (DeleteRequest (objref = ref ))
170
210
171
211
@_dereferenced
172
212
def get (self , obj : Referenceable , property : str ) -> Any :
173
- return self .provider .get (
213
+ response = self .provider .get (
174
214
GetRequest (objref = obj .__jsii_ref__ , property = property )
175
- ).value
215
+ )
216
+ if isinstance (response , Callback ):
217
+ return _callback_till_result (self , response , GetResponse )
218
+ else :
219
+ return response .value
176
220
177
221
def set (self , obj : Referenceable , property : str , value : Any ) -> None :
178
- self .provider .set (
222
+ response = self .provider .set (
179
223
SetRequest (
180
224
objref = obj .__jsii_ref__ ,
181
225
property = property ,
182
226
value = _make_reference_for_native (self , value ),
183
227
)
184
228
)
229
+ if isinstance (response , Callback ):
230
+ _callback_till_result (self , response , SetResponse )
185
231
186
232
@_dereferenced
187
233
def sget (self , klass : JSClass , property : str ) -> Any :
@@ -205,13 +251,17 @@ def invoke(
205
251
if args is None :
206
252
args = []
207
253
208
- return self .provider .invoke (
254
+ response = self .provider .invoke (
209
255
InvokeRequest (
210
256
objref = obj .__jsii_ref__ ,
211
257
method = method ,
212
258
args = _make_reference_for_native (self , args ),
213
259
)
214
- ).result
260
+ )
261
+ if isinstance (response , Callback ):
262
+ return _callback_till_result (self , response , InvokeResponse )
263
+ else :
264
+ return response .result
215
265
216
266
@_dereferenced
217
267
def sinvoke (
@@ -229,6 +279,28 @@ def sinvoke(
229
279
).result
230
280
231
281
@_dereferenced
282
+ def complete (
283
+ self , cbid : str , err : Optional [str ], result : Any
284
+ ) -> Any :
285
+ return self .provider .complete (
286
+ CompleteRequest (
287
+ cbid = cbid ,
288
+ err = err ,
289
+ result = result
290
+ )
291
+ )
292
+
293
+ def sync_complete (
294
+ self , cbid : str , err : Optional [str ], result : Any , response_type : Type [KernelResponse ]
295
+ ) -> Any :
296
+ return self .provider .sync_complete (
297
+ CompleteRequest (
298
+ cbid = cbid ,
299
+ err = err ,
300
+ result = result ),
301
+ response_type = response_type
302
+ )
303
+
232
304
def ainvoke (
233
305
self , obj : Referenceable , method : str , args : Optional [List [Any ]] = None
234
306
) -> Any :
@@ -242,6 +314,8 @@ def ainvoke(
242
314
args = _make_reference_for_native (self , args ),
243
315
)
244
316
)
317
+ if isinstance (promise , Callback ):
318
+ promise = _callback_till_result (self , promise , BeginResponse )
245
319
246
320
callbacks = self .provider .callbacks (CallbacksRequest ()).callbacks
247
321
while callbacks :
0 commit comments