prepare(" SELECT r.id, r.passenger_id, d.name as driver_name FROM ride r JOIN driver d ON d.id = r.driver_id WHERE r.id = :rid AND r.driver_id = :did AND r.status IN ('accepted', 'arrived', 'started', 'begin') LIMIT 1 "); $stmt->execute([':rid' => $rideId, ':did' => $user_id]); $ride = $stmt->fetch(); if (!$ride) { printFailure('No active ride found matching request', 404); exit; } $passengerId = $ride['passenger_id']; $callerName = trim($ride['driver_name']); // 2. Query Node.js signaling server to establish session $url = (getenv('VOICE_CALL_SERVER_URL') ?: 'https://calls.intaleqapp.com') . '/sessions'; $apiKey = getenv('VOICE_CALL_API_KEY') ?: ''; $ch = curl_init($url); $payload = json_encode([ 'ride_id' => (string)$rideId, 'driver_id' => (string)$user_id, 'passenger_id' => (string)$passengerId ]); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => $payload, CURLOPT_HTTPHEADER => [ "x-api-key: $apiKey", "Content-Type: application/json" ], CURLOPT_TIMEOUT => 5, CURLOPT_SSL_VERIFYPEER => false ]); $result = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($httpCode !== 200) { error_log("[driver_create_call_session.php] Signaling server session mapping failed: $result (HTTP $httpCode)"); printFailure('Signaling server error', 502); exit; } $sessionData = json_decode($result, true); if (!isset($sessionData['session_id'])) { printFailure('Invalid response schema from signaling server'); exit; } $sessionId = $sessionData['session_id']; // 3. Dispatch data-only FCM call trigger to Passenger $stmtToken = $con->prepare(" SELECT token FROM tokens WHERE passengerID = :pid ORDER BY id DESC LIMIT 1 "); $stmtToken->execute([':pid' => $passengerId]); $passengerTokenRow = $stmtToken->fetch(); if ($passengerTokenRow && !empty($passengerTokenRow['token'])) { sendFcmNotification( $passengerTokenRow['token'], 'Incoming Call', 'Incoming WebRTC voice call', [ 'type' => 'incoming_call', 'session_id' => (string)$sessionId, 'caller_name' => $callerName, 'caller_avatar' => '', 'ride_id' => (string)$rideId ], 'Call', 'ding' ); } printSuccess('Call session created successfully', [ 'session_id' => $sessionId, 'expires_in' => $sessionData['expires_in'] ?? 60 ]); } catch (Throwable $e) { error_log("[driver_create_call_session.php] Critical exception: " . $e->getMessage()); printFailure('Server error', 500); }