From b2f155c0b44c439e759fdf9f21dbab170e025d64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Feh=C3=A9r=20Roland?= Date: Thu, 9 Oct 2025 13:08:24 +0200 Subject: [PATCH] Use EventTarget Getting torrent info from servers now uses Events instead of magic callbacks. --- js/trdom_servermanager.js | 37 ++++++++++++++++++++++++++++++++++--- js/trserver.js | 15 ++++++++++++--- js/trweb.js | 14 +++++++++++++- 3 files changed, 59 insertions(+), 7 deletions(-) diff --git a/js/trdom_servermanager.js b/js/trdom_servermanager.js index e2eddd6..b4bef39 100644 --- a/js/trdom_servermanager.js +++ b/js/trdom_servermanager.js @@ -1,6 +1,6 @@ "use strict"; -class trdom_servermanager { +class trdom_servermanager extends EventTarget { #logcb; #log(loglevel, msg) { @@ -14,7 +14,12 @@ class trdom_servermanager { return this.#servers; } - #registerServer; + #registerServer = function(name, initdata) { + let server = new trserver(initdata, function(msg) {this.#logcb(`server:${name}`, 6, msg);}.bind(this)); + this.#servers[name] = server; + server.addEventListener('torrent-update', this); + server.refreshTorrentList(); + } #loadcb; #loadServers() { @@ -49,12 +54,38 @@ class trdom_servermanager { } constructor (loadcb = null, savecb = null, logcb = null, registerServer = null) { + super(); this.#loadcb = loadcb; this.#savecb = savecb; this.#logcb = logcb - this.#registerServer = registerServer; + //this.#registerServer = registerServer; //this.#servers = this.#loadServers(); } + + handleEvent(e) { + this.#log(6, `Handling event of type ${e.type}`); + switch (e.type) { + case 'torrent-update': + for (const [srv, server] of Object.entries(this.#servers)) { + if (e.target == server) { + let newEvent = new CustomEvent('torrent-update', { + 'detail': { + 'torrentHash': e.detail.torrentHash, + 'torrentInfo': e.detail.torrentInfo, + 'serverName': srv + } + }); + this.dispatchEvent(newEvent); + return; + } + } + this.#log(2, `Got update event for unknown server:\n${JSON.stringify(e.detail)}`); + break; + default: + this.#log(5, `Event type ${e.type} not supported`); + break; + } + } } diff --git a/js/trserver.js b/js/trserver.js index a6f6940..cd7e4b9 100644 --- a/js/trserver.js +++ b/js/trserver.js @@ -1,6 +1,6 @@ "use strict"; -class trserver { +class trserver extends EventTarget { #rpcurl; #authHeader; #sessionHeader; @@ -9,9 +9,18 @@ class trserver { #isOnline = false; #logger = function(msg) {}; - #torrentCallback = function(hash, torrentInfo) {}; + #torrentCallback = function(hash, torrentInfo) { + let e = new CustomEvent('torrent-update', { + 'detail': { + 'torrentHash': hash, + 'torrentInfo': torrentInfo + } + }); + this.dispatchEvent(e); + }; - constructor (initdata, logger, tcb) { + constructor (initdata, logger = null, tcb = null) { + super(); this.#rpcurl = initdata.rpcurl; if (logger != null) { this.#logger = logger; diff --git a/js/trweb.js b/js/trweb.js index 7b02ef3..12260fe 100644 --- a/js/trweb.js +++ b/js/trweb.js @@ -34,7 +34,9 @@ class trweb { this.#logger = logger; } - this.#dom_servermanager = new trdom_servermanager(this.#loadcb, this.#savecb, this.#logcb, this.#registerServer) + this.#dom_servermanager = new trdom_servermanager(this.#loadcb, this.#savecb, this.#logcb, this.#registerServer); + + this.#dom_servermanager.addEventListener('torrent-update', this); this.#guiFooter = document.createElement('div'); this.#guiFooter.classList.add('trweb_footer'); @@ -182,6 +184,16 @@ class trweb { this.#dom_servermanager.saveServers(); this.setTimer(); break; + case 'torrent-update': + let mergedTorrentInfo = this.#knownTorrents[e.detail.torrentHash]; + if (mergedTorrentInfo == null) { + mergedTorrentInfo = this.#createTorrentEntry(e.detail.torrentHash); + } + mergedTorrentInfo.setStatus(e.detail.serverName, e.detail.torrentInfo); + mergedTorrentInfo.name = e.detail.torrentInfo.name; + + this.#updateTorrentDisplay(mergedTorrentInfo); + break; } }