diff --git a/client/fragments/notify_ws_events.js b/client/fragments/notify_ws_events.js new file mode 100644 index 0000000..dffb26c --- /dev/null +++ b/client/fragments/notify_ws_events.js @@ -0,0 +1,5 @@ +/* INSERT +Module\[['"]websocket['"]\]\.emit\(['"]message['"], ?sock\.stream\.fd\) +*/ +; ws_events.dispatchEvent(new Event("message")); + diff --git a/client/javascript/main.js b/client/javascript/main.js index 9af1bb4..9ca619f 100644 --- a/client/javascript/main.js +++ b/client/javascript/main.js @@ -30,6 +30,8 @@ var wasm_ready = false; var version_dict = null; var api = null; var main_session = null; +const ws_events = new EventTarget(); + const libcurl_version = "__library_version__"; const wisp_version = "__wisp_version__"; diff --git a/client/javascript/session.js b/client/javascript/session.js index c6c8d9a..91981b6 100644 --- a/client/javascript/session.js +++ b/client/javascript/session.js @@ -20,6 +20,9 @@ class CurlSession { }, "viii"); this.request_callbacks = {}; this.last_request_id = 0; + + this.ws_event_listener = () => {this.event_loop_func()}; + ws_events.addEventListener("message", this.ws_event_listener); } assert_ready() { @@ -97,7 +100,7 @@ class CurlSession { if (this.event_loop) { return; } - + this.event_loop = setInterval(() => { this.event_loop_func(); }, 0); @@ -108,7 +111,7 @@ class CurlSession { if (libcurl_active || this.active_requests) { _session_perform(this.session_ptr); } - else { + else if (this.event_loop) { clearInterval(this.event_loop); this.event_loop = null; } @@ -120,6 +123,7 @@ class CurlSession { } _session_cleanup(this.session_ptr); this.session_ptr = null; + ws_events.removeEventListener(this.ws_event_listener); Module.removeFunction(this.end_callback_ptr); Module.removeFunction(this.headers_callback_ptr); Module.removeFunction(this.data_callback_ptr);