Skip to content

Commit 409eb0c

Browse files
authored
Allow requests to return futures (#18)
1 parent 3610ed2 commit 409eb0c

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

pyls_jsonrpc/endpoint.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,10 @@ def _handle_request(self, msg_id, method, params):
186186
request_future = self._executor_service.submit(handler_result)
187187
self._client_request_futures[msg_id] = request_future
188188
request_future.add_done_callback(self._request_callback(msg_id))
189+
elif isinstance(handler_result, futures.Future):
190+
log.debug("Request handler is already a future %s", handler_result)
191+
self._client_request_futures[msg_id] = handler_result
192+
handler_result.add_done_callback(self._request_callback(msg_id))
189193
else:
190194
log.debug("Got result from synchronous request handler: %s", handler_result)
191195
self._consumer({

test/test_endpoint.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# Copyright 2018 Palantir Technologies, Inc.
22
# pylint: disable=redefined-outer-name
3+
from concurrent import futures
34
import time
45
import mock
56
import pytest
@@ -187,6 +188,26 @@ def test_consume_request(endpoint, consumer, dispatcher):
187188
})
188189

189190

191+
def test_consume_future_request(endpoint, consumer, dispatcher):
192+
future_response = futures.ThreadPoolExecutor().submit(lambda: 1234)
193+
handler = mock.Mock(return_value=future_response)
194+
dispatcher['methodName'] = handler
195+
196+
endpoint.consume({
197+
'jsonrpc': '2.0',
198+
'id': MSG_ID,
199+
'method': 'methodName',
200+
'params': {'key': 'value'}
201+
})
202+
203+
handler.assert_called_once_with({'key': 'value'})
204+
await_assertion(lambda: consumer.assert_called_once_with({
205+
'jsonrpc': '2.0',
206+
'id': MSG_ID,
207+
'result': 1234
208+
}))
209+
210+
190211
def test_consume_async_request(endpoint, consumer, dispatcher):
191212
def _async_handler():
192213
return 1234

0 commit comments

Comments
 (0)