fix: wait for block height before updating birthday

**Motivations :**
- L'erreur 'Current block height not set' se produit car updateDeviceBlockHeight est appelé avant que le handshake soit complètement traité
- Il faut attendre que this.currentBlockHeight soit défini avant de mettre à jour la date anniversaire

**Modifications :**
- Ajout de la méthode publique getCurrentBlockHeight() dans Services
- Modification de birthday-setup.ts pour attendre que la hauteur de bloc soit définie
- Ajout d'une boucle d'attente avec timeout pour s'assurer que le handshake est traité

**Pages affectées :**
- src/services/service.ts (getCurrentBlockHeight)
- src/pages/birthday-setup/birthday-setup.ts (attente de la hauteur de bloc)
This commit is contained in:
NicolasCantu 2025-10-28 13:37:26 +01:00
parent c2bd615e88
commit 2fad2d507f
4 changed files with 47 additions and 24 deletions

View File

@ -65,6 +65,25 @@ document.addEventListener('DOMContentLoaded', async () => {
// Les relais sont déjà prêts après connectAllRelays
console.log('✅ Communication handshake completed');
// 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');
let attempts = 0;
const maxAttempts = 30;
while (attempts < maxAttempts) {
const blockHeight = services.getCurrentBlockHeight();
if (blockHeight !== -1) {
console.log(`✅ Block height set: ${blockHeight}`);
break;
}
console.log(`⏳ Waiting for block height (attempt ${attempts + 1}/${maxAttempts})...`);
await new Promise(resolve => setTimeout(resolve, 100));
attempts++;
}
if (services.getCurrentBlockHeight() === -1) {
throw new Error('Failed to get block height from relay');
}
// Mettre à jour la date anniversaire du wallet
await services.updateDeviceBlockHeight();
console.log('✅ Birthday updated successfully');

View File

@ -511,14 +511,14 @@ export class Database {
public async getObject(storeName: string, key: string): Promise<any | null> {
console.log(`🔍 DEBUG: Database.getObject - storeName: ${storeName}, key: ${key}`);
// Utiliser directement IndexedDB au lieu du service worker pour éviter les problèmes de synchronisation
const db = await new Promise<IDBDatabase>((resolve, reject) => {
const request = indexedDB.open(this.dbName, this.dbVersion);
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
});
console.log(`🔍 DEBUG: Database.getObject - db obtained directly, objectStoreNames:`, Array.from(db.objectStoreNames));
const tx = db.transaction(storeName, 'readonly');
const store = tx.objectStore(storeName);

View File

@ -1785,6 +1785,10 @@ export default class Services {
}
}
getCurrentBlockHeight(): number {
return this.currentBlockHeight;
}
public dumpDeviceFromMemory(): Device {
try {
return this.sdkClient.dump_device();
@ -1830,17 +1834,17 @@ export default class Services {
async getDeviceFromDatabase(): Promise<Device | null> {
console.log('🔍 DEBUG: getDeviceFromDatabase - attempting to get wallet with key "1"');
// 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);
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
});
const walletStore = DATABASE_CONFIG.stores.wallet.name;
console.log('🔍 DEBUG: getDeviceFromDatabase - db opened directly, objectStoreNames:', Array.from(db.objectStoreNames));
try {
const dbRes = await new Promise<any>((resolve, reject) => {
const tx = db.transaction(walletStore, 'readonly');
@ -1849,7 +1853,7 @@ export default class Services {
getRequest.onsuccess = () => resolve(getRequest.result);
getRequest.onerror = () => reject(getRequest.error);
});
console.log('🔍 DEBUG: getDeviceFromDatabase - db.getObject result:', dbRes);
if (!dbRes) {
console.log('🔍 DEBUG: getDeviceFromDatabase - no data found for key "1"');

View File

@ -42,62 +42,62 @@
</head>
<body>
<h1>Test Birthday Setup - Debug Device Not Found</h1>
<div>
<button onclick="testWalletCreation()">1. Créer Wallet</button>
<button onclick="testDeviceRetrieval()">2. Récupérer Device</button>
<button onclick="testBirthdaySetup()">3. Test Birthday Setup</button>
<button onclick="clearLogs()">Effacer Logs</button>
</div>
<div id="logs" class="log"></div>
<script type="module">
import Services from './src/services/service.js';
import { DATABASE_CONFIG } from './src/services/database-config.js';
const logs = document.getElementById('logs');
function log(message) {
const timestamp = new Date().toLocaleTimeString();
logs.textContent += `[${timestamp}] ${message}\n`;
logs.scrollTop = logs.scrollHeight;
console.log(message);
}
function clearLogs() {
logs.textContent = '';
}
window.clearLogs = clearLogs;
async function testWalletCreation() {
log('🔄 Test: Création du wallet...');
try {
// Simuler la création du wallet comme dans wallet-setup.ts
const services = await Services.getInstance();
log('✅ Services initialisés');
// Créer un device avec le SDK
const device = services.sdkClient.create_device(0);
log('✅ Device créé avec le SDK');
// Sauvegarder le device
await services.saveDeviceInDatabase(device);
log('✅ Device sauvegardé dans la base de données');
log('🎉 Test de création du wallet réussi!');
} catch (error) {
log(`❌ Erreur lors de la création du wallet: ${error.message}`);
}
}
async function testDeviceRetrieval() {
log('🔄 Test: Récupération du device...');
try {
const services = await Services.getInstance();
log('✅ Services initialisés');
const device = await services.getDeviceFromDatabase();
if (device) {
log('✅ Device récupéré avec succès');
@ -113,31 +113,31 @@
log(`❌ Erreur lors de la récupération du device: ${error.message}`);
}
}
async function testBirthdaySetup() {
log('🔄 Test: Birthday Setup complet...');
try {
const services = await Services.getInstance();
log('✅ Services initialisés');
// Connexion aux relais
await services.connectAllRelays();
log('✅ Relays connectés');
// Mettre à jour la date anniversaire
await services.updateDeviceBlockHeight();
log('✅ Birthday updated successfully');
log('🎉 Test de birthday setup réussi!');
} catch (error) {
log(`❌ Erreur lors du birthday setup: ${error.message}`);
}
}
window.testWalletCreation = testWalletCreation;
window.testDeviceRetrieval = testDeviceRetrieval;
window.testBirthdaySetup = testBirthdaySetup;
log('🚀 Test page chargée. Cliquez sur les boutons pour tester.');
</script>
</body>