"use strict"; class trweb { #needsSort = false; #loadcb = function(key) {return localStorage.getItem(`trweb.${key}`)}; #savecb = function(key, value) {localStorage.setItem(`trweb.${key}`, value)}; #logger = function(msg) {}; #logcb = function(module, loglevel, msg) { if (loglevel <= 5) { this.#logger(`${module}: ${msg}`); } }.bind(this); #log(loglevel, msg) { if (this.#logcb !== null) { this.#logcb('TRWEB', loglevel, msg); } } #timer; #container; #guiFooter; #dom_menubar = new trdom_menubar(); #dom_servermanager; #dom_torrentmanagger; constructor (container, loadcb, savecb, logger) { this.#container = container; if (loadcb != null) { this.#loadcb = loadcb; this.#savecb = savecb; } if (logger != null) { this.#logger = logger; } this.#dom_servermanager = new trdom_servermanager(this.#loadcb, this.#savecb, this.#logcb); this.#dom_torrentmanagger = new trdom_torrentmanager(this.#logcb); /* trdom_torrentmanager uses this to add new server controls to existing torrents */ this.#dom_servermanager.addEventListener('torrentserver-added', this.#dom_torrentmanagger); this.#dom_servermanager.addEventListener('torrent-created', this.#dom_torrentmanagger); this.#dom_menubar.addMenuNode('servermanager', this.#dom_servermanager.menuentry); this.#guiFooter = document.createElement('div'); this.#guiFooter.classList.add('trweb_footer'); if (document.readyState === 'complete' || document.readyState === 'interactive') { this.#logger('Document already loaded, jumpstarting'); // we don't want to re-trigger every listener, so call handler directly instead of dispatching an event this.handleEvent({'type': 'DOMContentLoaded'}); } else { this.#logger('Waiting for document to load'); document.addEventListener('DOMContentLoaded', this); } } handleEvent(e) { this.#log(6, `Handling event of type ${e.type}`); switch (e.type) { case 'DOMContentLoaded': this.#logger('Activating TRWEB instance'); this.#container = document.getElementById(this.#container); this.#container.classList.add('trweb_container', 'd-flex', 'flex-column', 'h-100'); this.#container.appendChild(this.#dom_menubar.element); this.#container.appendChild(this.#dom_torrentmanagger.element); this.#container.appendChild(this.#guiFooter); this.#dom_servermanager.loadServers(); this.setTimer(); break; default: this.#log(5, `Event type ${e.type} not supported`); break; } } refresh() { this.#log(6,'Refresh'); for (const [key, value] of Object.entries(this.#dom_servermanager.getServers())) { value.refreshTorrentList(); } } #timercb = function() { this.#log(6,'Timer tick'); this.refresh(); }.bind(this); setTimer() { this.#timer = window.setInterval(this.#timercb, 2000); } haltTimer() { window.clearInterval(this.#timer); } save() { this.#dom_servermanager.saveServers(); } rpc(server, method, args) { this.#dom_servermanager.getServers()[server].rpccall_debug(method, args); } addServer(name, url, user, pass) { this.#dom_servermanager.addServer(name, url, user, pass); } } var trinstance = new trweb('trcontainer', null, null, function(msg) {console.info(`TRWEB: ${msg}`)}); //var trinstance = new trweb('trcontainer', null, null, null);