From 6dfd8db0a6b7772d65ecfaa275459b43d27c8ad2 Mon Sep 17 00:00:00 2001 From: BordedDev <> Date: Thu, 24 Jul 2025 15:59:17 +0200 Subject: [PATCH] Add support for once event listeners and improve event removal --- src/snek/static/event-handler.js | 20 +++++++++++++++++++- src/snek/static/socket.js | 5 ++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/snek/static/event-handler.js b/src/snek/static/event-handler.js index e3dbe76..7299982 100644 --- a/src/snek/static/event-handler.js +++ b/src/snek/static/event-handler.js @@ -3,8 +3,15 @@ export class EventHandler { this.subscribers = {}; } - addEventListener(type, handler) { + addEventListener(type, handler, { once = false } = {}) { if (!this.subscribers[type]) this.subscribers[type] = []; + if (once) { + const originalHandler = handler; + handler = (...args) => { + originalHandler(...args); + this.removeEventListener(type, handler); + }; + } this.subscribers[type].push(handler); } @@ -12,4 +19,15 @@ export class EventHandler { if (this.subscribers[type]) this.subscribers[type].forEach((handler) => handler(...data)); } + + removeEventListener(type, handler) { + if (!this.subscribers[type]) return; + this.subscribers[type] = this.subscribers[type].filter( + (h) => h !== handler + ); + + if (this.subscribers[type].length === 0) { + delete this.subscribers[type]; + } + } } diff --git a/src/snek/static/socket.js b/src/snek/static/socket.js index 1131e8f..3c1dced 100644 --- a/src/snek/static/socket.js +++ b/src/snek/static/socket.js @@ -142,10 +142,9 @@ export class Socket extends EventHandler { method, args, }; - const me = this; return new Promise((resolve) => { - me.addEventListener(call.callId, (data) => resolve(data)); - me.sendJson(call); + this.addEventListener(call.callId, (data) => resolve(data), { once: true}); + this.sendJson(call); }); } }