Await a JavaScript promise synchronously with a timeout which is implemented via the AbortController :param promise: Javascript promise to await :param timeout: Timeout in seconds :param js_abort_controller: A JavaScript AbortController object, used on
(
promise: Any,
timeout: float,
js_abort_controller: Any,
request: EmscriptenRequest | None,
response: EmscriptenResponse | None,
)
| 624 | |
| 625 | |
| 626 | def _run_sync_with_timeout( |
| 627 | promise: Any, |
| 628 | timeout: float, |
| 629 | js_abort_controller: Any, |
| 630 | request: EmscriptenRequest | None, |
| 631 | response: EmscriptenResponse | None, |
| 632 | ) -> Any: |
| 633 | """ |
| 634 | Await a JavaScript promise synchronously with a timeout which is implemented |
| 635 | via the AbortController |
| 636 | |
| 637 | :param promise: |
| 638 | Javascript promise to await |
| 639 | |
| 640 | :param timeout: |
| 641 | Timeout in seconds |
| 642 | |
| 643 | :param js_abort_controller: |
| 644 | A JavaScript AbortController object, used on timeout |
| 645 | |
| 646 | :param request: |
| 647 | The request being handled |
| 648 | |
| 649 | :param response: |
| 650 | The response being handled (if it exists yet) |
| 651 | |
| 652 | :raises _TimeoutError: If the request times out |
| 653 | :raises _RequestError: If the request raises a JavaScript exception |
| 654 | |
| 655 | :return: The result of awaiting the promise. |
| 656 | """ |
| 657 | timer_id = None |
| 658 | if timeout > 0: |
| 659 | timer_id = js.setTimeout( |
| 660 | js_abort_controller.abort.bind(js_abort_controller), int(timeout * 1000) |
| 661 | ) |
| 662 | try: |
| 663 | from pyodide.ffi import run_sync |
| 664 | |
| 665 | # run_sync here uses WebAssembly JavaScript Promise Integration to |
| 666 | # suspend python until the JavaScript promise resolves. |
| 667 | return run_sync(promise) |
| 668 | except JsException as err: |
| 669 | if err.name == "AbortError": |
| 670 | raise _TimeoutError( |
| 671 | message="Request timed out", request=request, response=response |
| 672 | ) |
| 673 | else: |
| 674 | raise _RequestError(message=err.message, request=request, response=response) |
| 675 | finally: |
| 676 | if timer_id is not None: |
| 677 | js.clearTimeout(timer_id) |
| 678 | |
| 679 | |
| 680 | def has_jspi() -> bool: |
no test coverage detected