@@ -133,21 +133,9 @@ def __init__(self, server_context: "ServerInvocationContext", name, serde) -> No
133
133
super ().__init__ (name = name , serde = JsonSerde () if serde is None else serde )
134
134
self .server_context = server_context
135
135
136
- def value (self ) -> Awaitable [Any ]:
137
- vm : VMWrapper = self .server_context .vm
138
- handle = vm .sys_get_promise (self .name )
139
- coro = self .server_context .create_poll_or_cancel_coroutine ([handle ])
140
- serde = self .serde
141
- assert serde is not None
142
-
143
- async def await_point ():
144
- await coro
145
- res = self .server_context .must_take_notification (handle )
146
- if res is None :
147
- return None
148
- return serde .deserialize (res )
149
-
150
- return await_point ()
136
+ def value (self ) -> RestateDurableFuture [Any ]:
137
+ handle = self .server_context .vm .sys_get_promise (self .name )
138
+ return self .server_context .create_future (handle , self .serde )
151
139
152
140
def resolve (self , value : Any ) -> Awaitable [None ]:
153
141
vm : VMWrapper = self .server_context .vm
@@ -156,36 +144,31 @@ def resolve(self, value: Any) -> Awaitable[None]:
156
144
handle = vm .sys_complete_promise_success (self .name , value_buffer )
157
145
158
146
async def await_point ():
159
- await self .server_context .create_poll_or_cancel_coroutine ([handle ])
147
+ if not self .server_context .vm .is_completed (handle ):
148
+ await self .server_context .create_poll_or_cancel_coroutine ([handle ])
160
149
self .server_context .must_take_notification (handle )
161
150
162
- return await_point ( )
151
+ return ServerDurableFuture ( self . server_context , handle , await_point )
163
152
164
153
def reject (self , message : str , code : int = 500 ) -> Awaitable [None ]:
165
154
vm : VMWrapper = self .server_context .vm
166
155
py_failure = Failure (code = code , message = message )
167
156
handle = vm .sys_complete_promise_failure (self .name , py_failure )
168
157
169
158
async def await_point ():
170
- await self .server_context .create_poll_or_cancel_coroutine ([handle ])
159
+ if not self .server_context .vm .is_completed (handle ):
160
+ await self .server_context .create_poll_or_cancel_coroutine ([handle ])
171
161
self .server_context .must_take_notification (handle )
172
162
173
- return await_point ( )
163
+ return ServerDurableFuture ( self . server_context , handle , await_point )
174
164
175
165
def peek (self ) -> Awaitable [Any | None ]:
176
166
vm : VMWrapper = self .server_context .vm
177
167
handle = vm .sys_peek_promise (self .name )
178
168
serde = self .serde
179
169
assert serde is not None
180
170
181
- async def await_point ():
182
- await self .server_context .create_poll_or_cancel_coroutine ([handle ])
183
- res = self .server_context .must_take_notification (handle )
184
- if res is None :
185
- return None
186
- return serde .deserialize (res )
187
-
188
- return await_point ()
171
+ return self .server_context .create_future (handle , serde )
189
172
190
173
191
174
# disable too many public method
0 commit comments