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 // Les relais sont déjà prêts après connectAllRelays
console.log('✅ Communication handshake completed'); 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 // Mettre à jour la date anniversaire du wallet
await services.updateDeviceBlockHeight(); await services.updateDeviceBlockHeight();
console.log('✅ Birthday updated successfully'); console.log('✅ Birthday updated successfully');

View File

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

View File

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

View File

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