(function () { const browser = typeof chrome !== 'undefined' && chrome.storage ? chrome : typeof browser !== 'undefined' ? browser : chrome; const KEY = 'bridgeSwarmSettings'; const DEFAULTS = { defaultAppName: 'bridge-swarm', defaultRequestTimeoutMs: 0, defaultMaxPeers: 0, readyTimeoutMs: 0, disableOnFileUrls: false, notifyOnDisconnect: false, debug: false }; const defaultAppNameEl = document.getElementById('defaultAppName'); const defaultRequestTimeoutMsEl = document.getElementById('defaultRequestTimeoutMs'); const defaultMaxPeersEl = document.getElementById('defaultMaxPeers'); const readyTimeoutMsEl = document.getElementById('readyTimeoutMs'); const disableOnFileUrlsEl = document.getElementById('disableOnFileUrls'); const notifyOnDisconnectEl = document.getElementById('notifyOnDisconnect'); const debugEl = document.getElementById('debug'); const btnSave = document.getElementById('btnSave'); const btnReset = document.getElementById('btnReset'); const toastEl = document.getElementById('toast'); function showToast(msg, isError) { toastEl.textContent = msg; toastEl.className = 'toast show' + (isError ? ' err' : ''); clearTimeout(showToast._t); showToast._t = setTimeout(function () { toastEl.classList.remove('show'); }, 2500); } function load() { browser.storage.local.get(KEY, function (result) { const s = result[KEY] || {}; defaultAppNameEl.value = s.defaultAppName != null ? s.defaultAppName : DEFAULTS.defaultAppName; defaultRequestTimeoutMsEl.value = s.defaultRequestTimeoutMs != null ? s.defaultRequestTimeoutMs : DEFAULTS.defaultRequestTimeoutMs; defaultMaxPeersEl.value = s.defaultMaxPeers != null ? s.defaultMaxPeers : DEFAULTS.defaultMaxPeers; readyTimeoutMsEl.value = s.readyTimeoutMs != null ? s.readyTimeoutMs : DEFAULTS.readyTimeoutMs; disableOnFileUrlsEl.checked = s.disableOnFileUrls === true; notifyOnDisconnectEl.checked = s.notifyOnDisconnect === true; debugEl.checked = s.debug === true; }); } function validate() { const appName = (defaultAppNameEl.value || '').trim(); const timeout = parseInt(defaultRequestTimeoutMsEl.value, 10); if (isNaN(timeout) || timeout < 0) { showToast('Request timeout must be 0 or a positive number.', true); return null; } if (timeout > 300000) { showToast('Request timeout cannot exceed 300000 ms.', true); return null; } const maxPeers = parseInt(defaultMaxPeersEl.value, 10); if (isNaN(maxPeers) || maxPeers < 0) { showToast('Max peers must be 0 or a positive number.', true); return null; } const readyTimeout = parseInt(readyTimeoutMsEl.value, 10); if (isNaN(readyTimeout) || readyTimeout < 0) { showToast('Ready timeout must be 0 or a positive number.', true); return null; } if (readyTimeout > 60000) { showToast('Ready timeout cannot exceed 60000 ms.', true); return null; } return { defaultAppName: appName || DEFAULTS.defaultAppName, defaultRequestTimeoutMs: timeout, defaultMaxPeers: maxPeers, readyTimeoutMs: readyTimeout, disableOnFileUrls: disableOnFileUrlsEl.checked, notifyOnDisconnect: notifyOnDisconnectEl.checked, debug: debugEl.checked }; } btnSave.addEventListener('click', function () { const s = validate(); if (!s) return; browser.storage.local.set({ [KEY]: s }, function () { if (browser.runtime.lastError) { showToast('Save failed: ' + browser.runtime.lastError.message, true); return; } showToast('Saved.'); }); }); btnReset.addEventListener('click', function () { defaultAppNameEl.value = DEFAULTS.defaultAppName; defaultRequestTimeoutMsEl.value = DEFAULTS.defaultRequestTimeoutMs; defaultMaxPeersEl.value = DEFAULTS.defaultMaxPeers; readyTimeoutMsEl.value = DEFAULTS.readyTimeoutMs; disableOnFileUrlsEl.checked = DEFAULTS.disableOnFileUrls; notifyOnDisconnectEl.checked = DEFAULTS.notifyOnDisconnect; debugEl.checked = DEFAULTS.debug; browser.storage.local.set({ [KEY]: DEFAULTS }, function () { if (browser.runtime.lastError) { showToast('Reset failed: ' + browser.runtime.lastError.message, true); return; } showToast('Reset to defaults.'); }); }); load(); })();