@@ -15,7 +15,7 @@ const mrServer = {
1515 return ;
1616 }
1717
18- logText ( message , 'MRA_CLIENT ' ) ;
18+ logText ( message , 'MPA_CLIENT ' ) ;
1919 } ,
2020 getRandomMediaServer ( ) {
2121 const serverEntries = Array . from ( this . servers . entries ( ) ) ;
@@ -35,6 +35,58 @@ const mrServer = {
3535 port : serverObject . port ,
3636 } ;
3737 } ,
38+ getClosestMediaServer ( lat , lon ) {
39+ const serverEntries = Array . from ( this . servers . entries ( ) ) ;
40+
41+ if ( serverEntries . length === 0 ) {
42+ return null ;
43+ }
44+
45+ if ( ! lat || ! lon ) {
46+ return this . getRandomMediaServer ( ) ;
47+ }
48+
49+ let closestServer : any = null ;
50+ let minDistance = Infinity ;
51+
52+ function getDistanceFromLatLonInKm ( lat1 , lon1 , lat2 , lon2 ) {
53+ var R = 6371 ;
54+ var dLat = deg2rad ( lat2 - lat1 ) ;
55+ var dLon = deg2rad ( lon2 - lon1 ) ;
56+ var a =
57+ Math . sin ( dLat / 2 ) * Math . sin ( dLat / 2 ) +
58+ Math . cos ( deg2rad ( lat1 ) ) * Math . cos ( deg2rad ( lat2 ) ) *
59+ Math . sin ( dLon / 2 ) * Math . sin ( dLon / 2 )
60+ ;
61+ var c = 2 * Math . atan2 ( Math . sqrt ( a ) , Math . sqrt ( 1 - a ) ) ;
62+ var d = R * c ;
63+ return d ;
64+ }
65+
66+ function deg2rad ( deg ) {
67+ return deg * ( Math . PI / 180 )
68+ }
69+
70+ for ( const [ ip , server ] of serverEntries ) {
71+ if ( server . lat === 0 && server . lon === 0 ) continue ;
72+
73+ const dist = getDistanceFromLatLonInKm ( lat , lon , server . lat , server . lon ) ;
74+ if ( dist < minDistance ) {
75+ minDistance = dist ;
76+ closestServer = {
77+ ip : ip ,
78+ socket : server . socket ,
79+ port : server . port
80+ } ;
81+ }
82+ }
83+
84+ if ( ! closestServer ) {
85+ return this . getRandomMediaServer ( ) ;
86+ }
87+
88+ return closestServer ;
89+ } ,
3890 async handleClientConnect ( socket ) {
3991 this . debug ( `Connected to a media server` ) ;
4092
0 commit comments