fix: replace declarative logs with verified checks

**Motivations :**
- Les logs étaient déclaratifs (juste des messages sans vérification réelle)
- Il faut vérifier réellement que les opérations sont réussies avant de logger le succès
- Les logs doivent refléter la réalité et non juste des déclarations

**Modifications :**
- Ajout de vérifications réelles dans updateDeviceBlockHeight() pour vérifier que le device est bien restauré en mémoire et sauvegardé en base
- Ajout de vérification dans saveDeviceInDatabase() pour vérifier que le wallet est bien sauvegardé après l'opération
- Ajout de vérifications dans birthday-setup.ts pour vérifier que les relais sont connectés, que le handshake est reçu, et que le birthday est bien mis à jour
- Les logs de succès sont maintenant émis uniquement après vérification réelle des résultats
- Amélioration de la gestion des erreurs avec messages explicites si les vérifications échouent

**Pages affectées :**
- src/services/service.ts (updateDeviceBlockHeight et saveDeviceInDatabase avec vérifications réelles)
- src/pages/birthday-setup/birthday-setup.ts (vérifications réelles des prérequis et du birthday)
This commit is contained in:
NicolasCantu 2025-10-29 13:29:07 +01:00
parent 72cb8129c1
commit 93ddfcbb76
3 changed files with 122 additions and 25 deletions

View File

@ -56,6 +56,11 @@ voir docs/INITIALIZATION_FLOW.md
* **Lint :** Corrige les erreurs de lint, vérifie apres chaque fichier modifié
* **Fallbacks :** Ne fait pas et supprime les fallbacks
#### Logs
* **Données vérifiées :** Vérifiant que les logs reflètent des vérifications réelles et non des déclarations.
* **Log abondamment :** Log les informations et étapes ou états clés ainsi que les identifiants clés.
#### 🧪 Tests
* **Couverture des tests :** Rédiger des tests unitaires et d'intégration pour toute nouvelle fonctionnalité ou correction de bug.

View File

@ -93,19 +93,39 @@ document.addEventListener('DOMContentLoaded', async () => {
return;
}
}
console.log('✅ Wallet found in database');
console.log('✅ All prerequisites verified');
// Vérifier que le wallet contient bien les données attendues
if (wallet.sp_wallet && wallet.sp_wallet.birthday !== undefined) {
console.log('✅ Wallet found in database with birthday:', wallet.sp_wallet.birthday);
} else {
throw new Error('Wallet found but missing required data (sp_wallet or birthday)');
}
// Vérifier que tous les prérequis sont remplis
const prerequisitesOk = wallet && pbkdf2KeyFound;
if (prerequisitesOk) {
console.log('✅ All prerequisites verified');
} else {
throw new Error('Prerequisites verification failed');
}
// Connexion aux relais
await services.connectAllRelays();
console.log('✅ Relays connected successfully');
// Étape 2: Mise à jour de la date anniversaire
updateStatus('🎂 Mise à jour de la date anniversaire...', 'loading');
updateProgress(40);
// Vérifier que les relais sont connectés
const currentBlockHeight = services.getCurrentBlockHeight();
if (currentBlockHeight !== -1) {
console.log('✅ Relays connected successfully, chain_tip:', currentBlockHeight);
} else {
throw new Error('Relays connected but chain_tip not set');
}
// Les relais sont déjà prêts après connectAllRelays
console.log('✅ Communication handshake completed');
// Vérifier que le handshake a été reçu
if (currentBlockHeight > 0) {
console.log('✅ Communication handshake completed, chain_tip:', currentBlockHeight);
} else {
throw new Error('Handshake not received or chain_tip not set');
}
// Attendre que la hauteur de bloc soit définie avant de mettre à jour la date anniversaire
updateStatus('⏳ Attente de la synchronisation avec le réseau...', 'loading');
@ -132,7 +152,14 @@ document.addEventListener('DOMContentLoaded', async () => {
// Mettre à jour la date anniversaire du wallet
await services.updateDeviceBlockHeight();
console.log('✅ Birthday updated successfully');
// Vérifier que le birthday a bien été mis à jour en récupérant le wallet depuis la base
const updatedWallet = await services.getDeviceFromDatabase();
if (updatedWallet?.sp_wallet?.birthday && updatedWallet.sp_wallet.birthday > 0) {
console.log('✅ Birthday updated successfully:', updatedWallet.sp_wallet.birthday);
} else {
throw new Error(`Birthday update verification failed: expected birthday > 0, got ${updatedWallet?.sp_wallet?.birthday}`);
}
// Redirection vers la page de synchronisation des blocs
updateStatus('🔄 Redirection vers la synchronisation des blocs...', 'loading');

View File

@ -1886,7 +1886,7 @@ export default class Services {
// Sauvegarder avec le format chiffré
console.log('💾 Saving encrypted device to database...');
// Utiliser directement IndexedDB au lieu du service Database pour éviter les problèmes de service worker
const db = await new Promise<IDBDatabase>((resolve, reject) => {
const request = indexedDB.open(DATABASE_CONFIG.name, DATABASE_CONFIG.version);
@ -1895,12 +1895,12 @@ export default class Services {
});
const walletStore = DATABASE_CONFIG.stores.wallet.name;
// Sauvegarder le wallet chiffré directement avec IndexedDB
await new Promise<void>((resolve, reject) => {
const transaction = db.transaction([walletStore], 'readwrite');
const store = transaction.objectStore(walletStore);
// Sauvegarder le nouveau wallet chiffré (put écrase automatiquement si existe)
const walletObject: any = {
pre_id: '1',
@ -1912,23 +1912,60 @@ export default class Services {
walletObject.encrypted_wallet = encryptedWallet;
}
// Définir les handlers de transaction avant le put
transaction.oncomplete = async () => {
console.log('✅ Transaction completed for wallet save');
// Vérifier que le wallet a bien été sauvegardé en le récupérant depuis la base
try {
const verificationDb = await new Promise<IDBDatabase>((resolveDb, rejectDb) => {
const request = indexedDB.open(DATABASE_CONFIG.name, DATABASE_CONFIG.version);
request.onsuccess = () => resolveDb(request.result);
request.onerror = () => rejectDb(request.error);
});
const verificationTx = verificationDb.transaction([walletStore], 'readonly');
const verificationStore = verificationTx.objectStore(walletStore);
const verifyRequest = verificationStore.get('1');
await new Promise<void>((resolveVerify, rejectVerify) => {
verifyRequest.onsuccess = () => {
const savedData = verifyRequest.result;
if (savedData && savedData.encrypted_device === encryptedDevice) {
console.log('✅ Verified: Device correctly saved in database');
resolveVerify();
} else {
console.error('❌ Verification failed: Device not found or encrypted data mismatch');
rejectVerify(new Error('Device save verification failed'));
}
};
verifyRequest.onerror = () => {
console.error('❌ Verification failed: Could not retrieve saved device', verifyRequest.error);
rejectVerify(verifyRequest.error);
};
});
resolve();
} catch (verifyError) {
reject(verifyError);
}
};
transaction.onerror = () => {
console.error('❌ Transaction failed:', transaction.error);
reject(transaction.error);
};
const putRequest = store.put(walletObject);
putRequest.onsuccess = () => {
console.log('✅ Device saved to database with encryption');
resolve();
// La vérification se fera dans transaction.oncomplete
};
putRequest.onerror = () => {
console.error('❌ Failed to save wallet:', putRequest.error);
reject(putRequest.error);
};
transaction.oncomplete = () => {
console.log('✅ Transaction completed for wallet save');
};
transaction.onerror = () => {
console.error('❌ Transaction failed:', transaction.error);
reject(transaction.error);
};
});
} catch (e) {
console.error('❌ Error saving device to database:', e);
@ -2265,21 +2302,49 @@ export default class Services {
try {
// First set the updated device in memory
this.sdkClient.restore_device(device);
console.log('✅ Device restored in memory with updated birthday');
// Vérifier que le device a été restauré en mémoire
const restoredDevice = this.dumpDeviceFromMemory();
if (restoredDevice?.sp_wallet?.birthday === device.sp_wallet.birthday) {
console.log('✅ Device restored in memory with updated birthday:', device.sp_wallet.birthday);
} else {
throw new Error(`Device restoration failed: expected birthday ${device.sp_wallet.birthday}, got ${restoredDevice?.sp_wallet?.birthday}`);
}
// Then save it to database
await this.saveDeviceInDatabase(device);
console.log('✅ Device saved to database with updated birthday');
// Vérifier que le device a été sauvegardé en base de données
const savedDevice = await this.getDeviceFromDatabase();
if (savedDevice?.sp_wallet?.birthday === device.sp_wallet.birthday) {
console.log('✅ Device saved to database with updated birthday:', device.sp_wallet.birthday);
} else {
throw new Error(`Device save verification failed: expected birthday ${device.sp_wallet.birthday}, got ${savedDevice?.sp_wallet?.birthday}`);
}
// For new wallets, perform initial scan to catch any existing transactions
console.log(`🔄 Performing initial scan for new wallet from block ${device.sp_wallet.birthday} to ${this.currentBlockHeight}...`);
await this.sdkClient.scan_blocks(this.currentBlockHeight, BLINDBITURL);
console.log('✅ Initial scan completed for new wallet');
// Vérifier que le scan est terminé en vérifiant last_scan
const deviceAfterScan = this.dumpDeviceFromMemory();
if (deviceAfterScan?.sp_wallet?.last_scan === this.currentBlockHeight) {
console.log('✅ Initial scan completed for new wallet');
} else {
console.warn(`⚠️ Initial scan may not be complete: expected last_scan ${this.currentBlockHeight}, got ${deviceAfterScan?.sp_wallet?.last_scan}`);
}
// Update last_scan to current block height
device.sp_wallet.last_scan = this.currentBlockHeight;
await this.saveDeviceInDatabase(device);
console.log('✅ New wallet initial scan completed');
// Vérifier que le device a été sauvegardé avec last_scan mis à jour
const finalDevice = await this.getDeviceFromDatabase();
if (finalDevice?.sp_wallet?.last_scan === this.currentBlockHeight) {
console.log('✅ New wallet initial scan completed and saved');
} else {
throw new Error(`Final save verification failed: expected last_scan ${this.currentBlockHeight}, got ${finalDevice?.sp_wallet?.last_scan}`);
}
} catch (e) {
throw new Error(`Failed to save updated device: ${e}`);
}