From 84d6f8e8cb993e82f03e209ffd49d5c44fc780e0 Mon Sep 17 00:00:00 2001 From: Damien George Date: Fri, 19 Apr 2024 12:16:27 +1000 Subject: [PATCH] webassembly/modjsffi: Add jsffi.async_timeout_ms. This function exposes `setTimeout()` as an async function. Signed-off-by: Damien George --- ports/webassembly/modjsffi.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ports/webassembly/modjsffi.c b/ports/webassembly/modjsffi.c index d4e61e368f..cb2f578f8f 100644 --- a/ports/webassembly/modjsffi.c +++ b/ports/webassembly/modjsffi.c @@ -61,12 +61,27 @@ static mp_obj_t mp_jsffi_to_js(mp_obj_t arg) { } static MP_DEFINE_CONST_FUN_OBJ_1(mp_jsffi_to_js_obj, mp_jsffi_to_js); +// *FORMAT-OFF* +EM_JS(void, promise_with_timeout_ms, (double ms, uint32_t * out), { + const ret = new Promise((resolve) => setTimeout(resolve, ms)); + proxy_convert_js_to_mp_obj_jsside(ret, out); +}); +// *FORMAT-ON* + +static mp_obj_t mp_jsffi_async_timeout_ms(mp_obj_t arg) { + uint32_t out[PVN]; + promise_with_timeout_ms(mp_obj_get_float_to_d(arg), out); + return proxy_convert_js_to_mp_obj_cside(out); +} +static MP_DEFINE_CONST_FUN_OBJ_1(mp_jsffi_async_timeout_ms_obj, mp_jsffi_async_timeout_ms); + static const mp_rom_map_elem_t mp_module_jsffi_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_jsffi) }, { MP_ROM_QSTR(MP_QSTR_JsProxy), MP_ROM_PTR(&mp_type_jsproxy) }, { MP_ROM_QSTR(MP_QSTR_create_proxy), MP_ROM_PTR(&mp_jsffi_create_proxy_obj) }, { MP_ROM_QSTR(MP_QSTR_to_js), MP_ROM_PTR(&mp_jsffi_to_js_obj) }, + { MP_ROM_QSTR(MP_QSTR_async_timeout_ms), MP_ROM_PTR(&mp_jsffi_async_timeout_ms_obj) }, }; static MP_DEFINE_CONST_DICT(mp_module_jsffi_globals, mp_module_jsffi_globals_table);