diff --git a/README.md b/README.md index 9215e0e..de0709f 100644 --- a/README.md +++ b/README.md @@ -138,7 +138,7 @@ gh attestation verify dist/koalasync-chrome.zip \ ---
- Ko-Fi + Support KoalaSync GitGem Badge Built with ❤️ by Shik3i. KoalaSync is Open Source under the MIT License. diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 5f4635c..aefa3af 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -7,7 +7,7 @@ All notable changes to the KoalaSync browser extension and relay server. ## [v2.4.2] — 2026-06-19 ### Changed -- **Extension: Optimized uninstall URL registration** — Extracted registration into a reusable, race-condition-protected `initUninstallURL()` helper. It now generates a unique, anonymous token (`t`) stored in `chrome.storage.local` to securely track uninstalls, and registers the URL on both extension installation/update and browser startup to prevent state loss. +- **Extension: Optimized uninstall URL registration** — Extracted registration into a reusable, race-condition-protected `initUninstallURL()` helper. It registers the uninstall feedback URL with browser context on both extension installation/update and browser startup to prevent state loss, without storing or sending an installation token. ## [v2.4.1] — 2026-06-19 @@ -149,7 +149,7 @@ All notable changes to the KoalaSync browser extension and relay server. - **Feature Hint System**: Generic `dismissedHints` array in sync storage for announcing new features. First hint highlights the Audio Options entry in Settings. Extensible for future features. ### Changed -- **Ko-Fi Support Links**: Static footer badges on the Settings and Status tabs linking to the developer's support page. README and website footer updated with Ko-Fi badge. +- **Support Links**: Static footer badges on the Settings and Status tabs linking to the developer's support page. README and website footer updated with a Support KoalaSync badge. ### Fixed - **Portuguese (PT) locale**: Removed Italian contamination — "sincronizzazione" → "sincronização", "tempo reale" → "tempo real", "Link di Invito" → "Link de Convite", "Sair della Sala" → "Sair da Sala". diff --git a/extension/background.js b/extension/background.js index f184038..ee26bfa 100644 --- a/extension/background.js +++ b/extension/background.js @@ -19,24 +19,8 @@ async function initUninstallURL() { if (UNINSTALL_URL && UNINSTALL_URL.trim() !== '') { try { - if (typeof chrome === 'undefined' || !chrome.storage || !chrome.storage.local) { - console.warn("Storage API not available, skipping uninstall URL token generation"); - return; - } - - const data = await chrome.storage.local.get("koalaByeToken"); - let token = data?.koalaByeToken; - - if (!token) { - token = (typeof self.crypto !== 'undefined' && typeof self.crypto.randomUUID === 'function') - ? self.crypto.randomUUID() - : Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); - await chrome.storage.local.set({ koalaByeToken: token }); - } - const url = new URL(UNINSTALL_URL); url.searchParams.set("browser", BROWSER_TYPE); - url.searchParams.set("t", token); const runtimeAPI = typeof browser !== 'undefined' ? browser.runtime : chrome.runtime; if (runtimeAPI && runtimeAPI.setUninstallURL) { @@ -1751,11 +1735,16 @@ async function handleAsyncMessage(message, sender, sendResponse) { sendResponse({ status: 'ok' }); } else if (message.type === 'CMD_ACK') { const commandSenderId = message.commandSenderId; - if (commandSenderId && commandSenderId !== peerId) { - emit(EVENTS.EVENT_ACK, { - senderId: peerId, + // Only ACK if the command sender is still a known peer in our room. + // If we've already seen their PEER_STATUS 'left', skip the ACK — it would + // only be dropped server-side as an absent-peer ACK anyway. + const senderStillPresent = currentRoom && Array.isArray(currentRoom.peers) && + currentRoom.peers.some(p => (typeof p === 'object' ? p.peerId : p) === commandSenderId); + if (commandSenderId && commandSenderId !== peerId && senderStillPresent) { + emit(EVENTS.EVENT_ACK, { + senderId: peerId, targetId: commandSenderId, - actionTimestamp: message.actionTimestamp + actionTimestamp: message.actionTimestamp }); } sendResponse({ status: 'ok' }); diff --git a/shared/constants.js b/shared/constants.js index dfa1298..7e16878 100644 --- a/shared/constants.js +++ b/shared/constants.js @@ -13,7 +13,6 @@ export const OFFICIAL_SERVER_URL = 'wss://syncserver.koalastuff.net'; export const OFFICIAL_LANDING_PAGE_URL = 'https://sync.koalastuff.net'; export const OFFICIAL_SERVER_TOKEN = '62170b705234c4f4807a9b22420bb93cf1a2aacfa4c5d3b47804482babb8eb50'; export const SUPPORT_URL = 'https://support.koalastuff.net'; -export const KOFI_URL = 'https://ko-fi.com/koaladev'; export const GITHUB_URL = 'https://github.com/Shik3i/KoalaSync'; export function isFirefox() {