summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2024-04-19 12:16:27 +1000
committerDamien George <damien@micropython.org>2024-04-24 16:24:00 +1000
commit84d6f8e8cb993e82f03e209ffd49d5c44fc780e0 (patch)
treeba601e4cca5c62cd95373395e9da82ef9e329896
parent967ad38ac7e09270e9f5734c59baebf2d1eb3723 (diff)
webassembly/modjsffi: Add jsffi.async_timeout_ms.
This function exposes `setTimeout()` as an async function. Signed-off-by: Damien George <damien@micropython.org>
-rw-r--r--ports/webassembly/modjsffi.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/ports/webassembly/modjsffi.c b/ports/webassembly/modjsffi.c
index d4e61e368..cb2f578f8 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);