mirror of
https://github.com/Shik3i/KoalaSync.git
synced 2026-08-27 19:17:11 +00:00
Logic: Capped reconnection (5m) and manual retry UI
This commit is contained in:
+36
-3
@@ -12,6 +12,8 @@ let currentTabTitle = null; // New: for Smart Matching
|
|||||||
let logs = [];
|
let logs = [];
|
||||||
let history = []; // New: for Action History
|
let history = []; // New: for Action History
|
||||||
let reconnectTimer = null;
|
let reconnectTimer = null;
|
||||||
|
let reconnectStartTime = null; // New: track when reconnection started
|
||||||
|
let reconnectFailed = false; // New: true if we hit the 5-min cap
|
||||||
|
|
||||||
// Force Sync Coordination
|
// Force Sync Coordination
|
||||||
let isForceSyncInitiator = false;
|
let isForceSyncInitiator = false;
|
||||||
@@ -58,9 +60,12 @@ async function connect() {
|
|||||||
if (socket && (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING)) return;
|
if (socket && (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING)) return;
|
||||||
if (!navigator.onLine) {
|
if (!navigator.onLine) {
|
||||||
addLog('Browser is offline. Waiting...', 'warn');
|
addLog('Browser is offline. Waiting...', 'warn');
|
||||||
|
broadcastConnectionStatus('offline');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (reconnectFailed) return; // Wait for manual retry
|
||||||
|
|
||||||
if (!peerId) peerId = await getPeerId();
|
if (!peerId) peerId = await getPeerId();
|
||||||
const settings = await getSettings();
|
const settings = await getSettings();
|
||||||
|
|
||||||
@@ -110,6 +115,8 @@ async function connect() {
|
|||||||
reconnectDelay = 1000;
|
reconnectDelay = 1000;
|
||||||
addLog('WebSocket Connection Opened', 'success');
|
addLog('WebSocket Connection Opened', 'success');
|
||||||
broadcastConnectionStatus('connected');
|
broadcastConnectionStatus('connected');
|
||||||
|
reconnectStartTime = null;
|
||||||
|
reconnectFailed = false;
|
||||||
|
|
||||||
// Socket.IO Handshake: Send "40" to join default namespace
|
// Socket.IO Handshake: Send "40" to join default namespace
|
||||||
socket.send('40');
|
socket.send('40');
|
||||||
@@ -180,7 +187,15 @@ function broadcastConnectionStatus(status) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function updateBadgeStatus() {
|
function updateBadgeStatus() {
|
||||||
if (currentTabId) {
|
const status = socket ? (socket.readyState === WebSocket.OPEN ? 'connected' : (isConnecting || socket.readyState === WebSocket.CONNECTING ? 'connecting' : 'disconnected')) : 'disconnected';
|
||||||
|
|
||||||
|
if (reconnectFailed) {
|
||||||
|
chrome.action.setBadgeText({ text: 'ERR' });
|
||||||
|
chrome.action.setBadgeBackgroundColor({ color: '#ef4444' });
|
||||||
|
} else if (status === 'connecting') {
|
||||||
|
chrome.action.setBadgeText({ text: '...' });
|
||||||
|
chrome.action.setBadgeBackgroundColor({ color: '#fbbf24' });
|
||||||
|
} else if (currentTabId) {
|
||||||
chrome.action.setBadgeText({ text: 'ON' });
|
chrome.action.setBadgeText({ text: 'ON' });
|
||||||
chrome.action.setBadgeBackgroundColor({ color: '#22c55e' });
|
chrome.action.setBadgeBackgroundColor({ color: '#22c55e' });
|
||||||
} else {
|
} else {
|
||||||
@@ -204,7 +219,17 @@ function showNotification(senderName, action) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function scheduleReconnect() {
|
function scheduleReconnect() {
|
||||||
if (reconnectTimer) return; // Already scheduled
|
if (reconnectTimer || reconnectFailed) return;
|
||||||
|
|
||||||
|
if (!reconnectStartTime) reconnectStartTime = Date.now();
|
||||||
|
|
||||||
|
// Check 5 minute cap (300,000ms)
|
||||||
|
if (Date.now() - reconnectStartTime > 300000) {
|
||||||
|
reconnectFailed = true;
|
||||||
|
addLog('Reconnection failed after 5 minutes. Please try again manually.', 'error');
|
||||||
|
broadcastConnectionStatus('reconnect_failed');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
reconnectTimer = setTimeout(() => {
|
reconnectTimer = setTimeout(() => {
|
||||||
reconnectTimer = null;
|
reconnectTimer = null;
|
||||||
@@ -378,9 +403,17 @@ chrome.alarms.onAlarm.addListener((alarm) => {
|
|||||||
// --- Extension Message Listeners ---
|
// --- Extension Message Listeners ---
|
||||||
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
||||||
if (message.type === 'CONNECT') {
|
if (message.type === 'CONNECT') {
|
||||||
|
reconnectFailed = false;
|
||||||
|
reconnectStartTime = null;
|
||||||
|
connect();
|
||||||
|
} else if (message.type === 'RETRY_CONNECT') {
|
||||||
|
reconnectFailed = false;
|
||||||
|
reconnectStartTime = null;
|
||||||
|
reconnectDelay = 1000;
|
||||||
connect();
|
connect();
|
||||||
} else if (message.type === 'GET_STATUS') {
|
} else if (message.type === 'GET_STATUS') {
|
||||||
const status = socket ? (socket.readyState === WebSocket.OPEN ? 'connected' : (isConnecting || socket.readyState === WebSocket.CONNECTING ? 'connecting' : 'disconnected')) : 'disconnected';
|
let status = socket ? (socket.readyState === WebSocket.OPEN ? 'connected' : (isConnecting || socket.readyState === WebSocket.CONNECTING ? 'connecting' : 'disconnected')) : 'disconnected';
|
||||||
|
if (reconnectFailed) status = 'reconnect_failed';
|
||||||
sendResponse({ status, peerId, peers: currentRoom ? currentRoom.peers : [] });
|
sendResponse({ status, peerId, peers: currentRoom ? currentRoom.peers : [] });
|
||||||
// Global return true at the end handles this
|
// Global return true at the end handles this
|
||||||
} else if (message.type === 'LEAVE_ROOM') {
|
} else if (message.type === 'LEAVE_ROOM') {
|
||||||
|
|||||||
@@ -277,9 +277,10 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<label>Connection Status</label>
|
<label>Connection Status</label>
|
||||||
<div id="connStatus" class="info-card" style="display:flex; align-items:center;">
|
<div id="connStatus" class="info-card" style="display:flex; align-items:center; gap: 10px;">
|
||||||
<span id="connDot" class="status-dot status-offline"></span>
|
<span id="connDot" class="status-dot status-offline"></span>
|
||||||
<span id="connText" style="flex:1;">Disconnected</span>
|
<span id="connText" style="flex:1;">Disconnected</span>
|
||||||
|
<button id="retryBtn" class="secondary" style="display:none; width: auto; padding: 4px 8px; font-size: 10px; margin: 0;">RETRY</button>
|
||||||
<button id="copyLogs" class="btn secondary" style="width: auto; padding: 4px 10px; font-size: 11px;">Copy Logs</button>
|
<button id="copyLogs" class="btn secondary" style="width: auto; padding: 4px 10px; font-size: 11px;">Copy Logs</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
+17
-3
@@ -35,7 +35,8 @@ const elements = {
|
|||||||
createRoomBtn: document.getElementById('createRoomBtn'),
|
createRoomBtn: document.getElementById('createRoomBtn'),
|
||||||
publicRooms: document.getElementById('publicRooms'),
|
publicRooms: document.getElementById('publicRooms'),
|
||||||
refreshRooms: document.getElementById('refreshRooms'),
|
refreshRooms: document.getElementById('refreshRooms'),
|
||||||
roomError: document.getElementById('roomError')
|
roomError: document.getElementById('roomError'),
|
||||||
|
retryBtn: document.getElementById('retryBtn')
|
||||||
};
|
};
|
||||||
|
|
||||||
let localPeerId = null;
|
let localPeerId = null;
|
||||||
@@ -183,8 +184,17 @@ async function populateTabs(providedPeers = null) {
|
|||||||
function applyConnectionStatus(status) {
|
function applyConnectionStatus(status) {
|
||||||
const connected = status === 'connected';
|
const connected = status === 'connected';
|
||||||
const connecting = status === 'connecting';
|
const connecting = status === 'connecting';
|
||||||
elements.connDot.className = 'status-dot ' + (connected ? 'status-online' : 'status-offline');
|
const failed = status === 'reconnect_failed';
|
||||||
elements.connText.textContent = connected ? 'Connected' : (connecting ? 'Connecting...' : 'Disconnected');
|
|
||||||
|
elements.connDot.className = 'status-dot ' + (connected ? 'status-online' : (failed ? 'status-offline' : (connecting ? 'status-online' : 'status-offline')));
|
||||||
|
|
||||||
|
// Custom colors for states
|
||||||
|
if (connecting) elements.connDot.style.background = '#fbbf24';
|
||||||
|
else if (failed) elements.connDot.style.background = '#ef4444';
|
||||||
|
else elements.connDot.style.background = '';
|
||||||
|
|
||||||
|
elements.connText.textContent = connected ? 'Connected' : (connecting ? 'Connecting...' : (failed ? 'Failed' : 'Disconnected'));
|
||||||
|
elements.retryBtn.style.display = failed ? 'block' : 'none';
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateHistory(history) {
|
function updateHistory(history) {
|
||||||
@@ -349,6 +359,10 @@ elements.refreshRooms.addEventListener('click', () => {
|
|||||||
chrome.runtime.sendMessage({ type: 'GET_ROOM_LIST' });
|
chrome.runtime.sendMessage({ type: 'GET_ROOM_LIST' });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
elements.retryBtn.addEventListener('click', () => {
|
||||||
|
chrome.runtime.sendMessage({ type: 'RETRY_CONNECT' });
|
||||||
|
});
|
||||||
|
|
||||||
elements.targetTab.addEventListener('change', async () => {
|
elements.targetTab.addEventListener('change', async () => {
|
||||||
await chrome.storage.sync.set({ targetTabId: elements.targetTab.value });
|
await chrome.storage.sync.set({ targetTabId: elements.targetTab.value });
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user