Smart-Sync, Scope-Fix, Auto-Refresh, defaults.local.json
- Background-Sync: SHA-Check alle 5s, voller Pull nur bei Änderung - Sync-Hashes werden nach Pull im Storage geschrieben → grüne Dots - UI refreshed automatisch bei Background-Sync (storage.onChanged) - Scope-Badge-Bug gefixt (folderToScope normalisiert den Vergleich) - defaults.local.json: optionale vorkonfigurierte Verbindungsdaten - README: Doku für defaults.local.json und XPI-Build mit/ohne Defaults
This commit is contained in:
@@ -3,7 +3,8 @@
|
||||
const SYNC_CONFIG_KEY = 'gitea_config';
|
||||
const SYNC_STATE_KEY = 'sync_state';
|
||||
const TEMPLATE_STORAGE_KEY = 'message_templates';
|
||||
const SYNC_INTERVAL_MS = 15 * 60 * 1000; // 15 minutes
|
||||
const SHA_CHECK_INTERVAL_MS = 5 * 1000; // 5 seconds — lightweight SHA check
|
||||
const FULL_SYNC_COOLDOWN_MS = 10 * 1000; // min 10s between full pulls
|
||||
const SHARED_FOLDER = '_gemeinsam';
|
||||
const USER_FOLDER = '_benutzer';
|
||||
const CONFIG_FOLDER = '_config';
|
||||
@@ -762,24 +763,66 @@ browser.runtime.onMessage.addListener(async (msg, sender) => {
|
||||
|
||||
// ── Auto-sync on startup (pull only) ──
|
||||
|
||||
async function autoSync() {
|
||||
let lastKnownShas = null;
|
||||
let lastFullSync = 0;
|
||||
let syncInProgress = false;
|
||||
const HASH_STORAGE_KEY_BG = 'sync_hashes';
|
||||
|
||||
function simpleHashBg(str) {
|
||||
let h = 0;
|
||||
for (let i = 0; i < str.length; i++) {
|
||||
h = ((h << 5) - h + str.charCodeAt(i)) | 0;
|
||||
}
|
||||
return h;
|
||||
}
|
||||
|
||||
async function updateSyncHashes() {
|
||||
const templates = await syncManager.getLocalTemplates();
|
||||
const result = await browser.storage.local.get(HASH_STORAGE_KEY_BG);
|
||||
const data = result[HASH_STORAGE_KEY_BG] || {};
|
||||
data.tpl = {};
|
||||
for (const t of templates) {
|
||||
data.tpl[t.id] = simpleHashBg(t.content || '');
|
||||
}
|
||||
await browser.storage.local.set({ [HASH_STORAGE_KEY_BG]: data });
|
||||
}
|
||||
|
||||
async function smartSync() {
|
||||
if (syncInProgress) return;
|
||||
try {
|
||||
const initialized = await syncManager.init();
|
||||
if (!initialized) return;
|
||||
|
||||
if (syncManager.department) {
|
||||
console.log('[Sync] Auto-pull Vorlagen gestartet...');
|
||||
const result = await syncManager.pullTemplates();
|
||||
console.log('[Sync] Auto-pull Vorlagen abgeschlossen:', result);
|
||||
}
|
||||
// Lightweight SHA check
|
||||
const shaResult = await syncManager.checkRemoteShas();
|
||||
if (!shaResult?.success) return;
|
||||
|
||||
console.log('[Sync] Auto-pull Signaturen gestartet...');
|
||||
const sigResult = await syncManager.pullSignatures();
|
||||
console.log('[Sync] Auto-pull Signaturen abgeschlossen:', sigResult);
|
||||
const currentShas = JSON.stringify(shaResult.remoteShas);
|
||||
|
||||
// First run or SHAs changed → full pull
|
||||
if (lastKnownShas === null || currentShas !== lastKnownShas) {
|
||||
const now = Date.now();
|
||||
if (now - lastFullSync < FULL_SYNC_COOLDOWN_MS) return;
|
||||
|
||||
syncInProgress = true;
|
||||
lastFullSync = now;
|
||||
console.log('[Sync] Änderung erkannt, lade Vorlagen...');
|
||||
|
||||
const result = await syncManager.pullTemplates();
|
||||
console.log('[Sync] Vorlagen geladen:', result);
|
||||
await updateSyncHashes();
|
||||
|
||||
const sigResult = await syncManager.pullSignatures();
|
||||
console.log('[Sync] Signaturen geladen:', sigResult);
|
||||
|
||||
lastKnownShas = JSON.stringify((await syncManager.checkRemoteShas()).remoteShas || {});
|
||||
syncInProgress = false;
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('[Sync] Auto-pull fehlgeschlagen:', err);
|
||||
console.error('[Sync] Check fehlgeschlagen:', err);
|
||||
syncInProgress = false;
|
||||
}
|
||||
}
|
||||
|
||||
autoSync();
|
||||
setInterval(autoSync, SYNC_INTERVAL_MS);
|
||||
smartSync();
|
||||
setInterval(smartSync, SHA_CHECK_INTERVAL_MS);
|
||||
|
||||
Reference in New Issue
Block a user