From e7864f715430d82c72b728c2429d59e5a7edd01e Mon Sep 17 00:00:00 2001 From: ImBenji Date: Wed, 20 Aug 2025 08:43:13 +0100 Subject: [PATCH] Initialize rolling codes service in heartbeat isolate and enhance registration process --- lib/services/supabase_heartbeat.dart | 54 ++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/lib/services/supabase_heartbeat.dart b/lib/services/supabase_heartbeat.dart index 72df789..5cffea7 100644 --- a/lib/services/supabase_heartbeat.dart +++ b/lib/services/supabase_heartbeat.dart @@ -8,20 +8,34 @@ import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:waylume_server/config/supabase_config.dart'; import 'package:waylume_server/services/rolling_codes_service.dart'; +import 'package:waylume_server/core/utils.dart'; void initHeartbeat() { // Run this on a separate thread. Isolate.spawn((_) async { + + // Initialize rolling codes service in this isolate + await RollingCodesService.initialize(); - // To avoid server deadlock - await Future.delayed(Duration(seconds: Random().nextInt(5))); + // To avoid server deadlock and wait for main registration + await Future.delayed(Duration(seconds: 10 + Random().nextInt(5))); + + // The heartbeat isolate needs to have the operational seed + // Since isolates don't share memory, we need to register again in this isolate + // This will get the same operational seed since the server_id is the same + try { + await _registerInHeartbeatIsolate(); + } catch (e) { + print("Failed to register in heartbeat isolate: $e"); + return; + } while (true) { DateTime now = DateTime.now().toUtc(); try { - // Wait until rolling codes service is initialized and has operational seed + // Wait until rolling codes service has operational seed if (!RollingCodesService.isRegistered) { print("Server not registered yet, skipping heartbeat"); await Future.delayed(Duration(seconds: 10)); // Check more frequently during startup @@ -75,6 +89,40 @@ void initHeartbeat() { } +Future _registerInHeartbeatIsolate() async { + // Generate registration rolling code + String registrationAuth = RollingCodesService.generateRegistrationCode(); + + // Call server-manager registration endpoint + String serverManagerUrl = 'https://lsdrctuvnwdrzrdyoqzu.supabase.co/functions/v1/server-manager'; + + Map requestBody = { + 'server_id': fromEnivronment('SERVER_ID')!, + 'registration_auth': registrationAuth, + }; + + final response = await http.post( + Uri.parse(serverManagerUrl), + headers: { + 'Content-Type': 'application/json', + }, + body: jsonEncode(requestBody), + ); + + if (response.statusCode == 200) { + final responseData = jsonDecode(response.body); + if (responseData['success']) { + // Store operational seed in memory for this isolate + RollingCodesService.setOperationalSeed(responseData['operational_seed']); + print('Heartbeat isolate registered successfully'); + } else { + throw Exception('Heartbeat isolate registration failed: ${responseData['error']}'); + } + } else { + throw Exception('Heartbeat isolate registration request failed: ${response.statusCode}'); + } +} + Future> _getServerStatus() async { // Get basic server status information // This is a simplified implementation - could be enhanced with actual metrics