function haversineMeters(lat1, lon1, lat2, lon2) { const toRad = (deg) => (deg * Math.PI) / 180 const dLat = toRad(lat2 - lat1) const dLon = toRad(lon2 - lon1) const a = Math.sin(dLat / 2) ** 2 + Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLon / 2) ** 2 return 6371000 * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)) } function filterPostsByDistance(posts, viewerLat, viewerLng, radiusMeters) { const parsedLat = parseFloat(viewerLat) const parsedLng = parseFloat(viewerLng) if (!Number.isFinite(parsedLat) || !Number.isFinite(parsedLng)) return [] return posts.filter((post) => { const postLat = parseFloat(post.lat) const postLng = parseFloat(post.lng) if (!Number.isFinite(postLat) || !Number.isFinite(postLng)) return false return haversineMeters(parsedLat, parsedLng, postLat, postLng) <= radiusMeters }) } module.exports = { haversineMeters, filterPostsByDistance, }