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); }); } }