Initialize rolling codes service in heartbeat isolate and enhance registration process
This commit is contained in:
@@ -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<void> _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<String, dynamic> 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<Map<String, dynamic>> _getServerStatus() async {
|
||||
// Get basic server status information
|
||||
// This is a simplified implementation - could be enhanced with actual metrics
|
||||
|
||||
Reference in New Issue
Block a user