@@ -81,45 +81,66 @@ export class Client extends Emitter<ClientEvents> {
81
81
this . status = Status . Connecting ;
82
82
this . initSocket ( ) ;
83
83
84
- this . timer = setInterval ( ( ) => this . emit ( "tick" ) , 20 ) ;
84
+ this . timer = setInterval ( ( ) => this . emit ( "tick" ) , 50 ) ;
85
85
86
86
try {
87
87
const advertisement = await this . ping ( ) ;
88
88
if ( ! advertisement ) throw new Error ( "Failed to get server advertisement" ) ;
89
89
90
90
return new Promise ( ( resolve , reject ) => {
91
91
let isResolved = false ;
92
+ let shouldContinueSending = true ;
92
93
93
- const connectionTimeout = setTimeout ( ( ) => {
94
+ const cleanup = ( ) => {
95
+ clearTimeout ( connectionTimeout ) ;
96
+ clearInterval ( requestInterval ) ;
94
97
if ( ! isResolved ) {
98
+ Logger . error ( "Could not resolve connection." ) ;
95
99
this . cleanup ( ) ;
96
- reject ( new Error ( "Connection timed out" ) ) ;
97
100
}
101
+ } ;
102
+
103
+ const connectionTimeout = setTimeout ( ( ) => {
104
+ cleanup ( ) ;
105
+ reject ( new Error ( "Connection timed out" ) ) ;
98
106
} , this . options . timeout ) ;
99
107
100
108
const request = new OpenConnectionRequestOne ( ) ;
101
109
request . mtu = this . options . mtuSize ;
102
110
request . protocol = this . options . protocolVersion ;
103
111
112
+ this . on ( "open-connection-reply-two" , ( packet ) => {
113
+ const mtu = packet . mtu ;
114
+ if ( mtu > 400 && mtu < 1500 ) {
115
+ shouldContinueSending = false ;
116
+ } else {
117
+ cleanup ( ) ;
118
+ reject ( new Error ( `Invalid MTU size: ${ mtu } ` ) ) ;
119
+ }
120
+ } ) ;
121
+
104
122
this . emit ( "open-connection-request-one" , request ) ;
105
123
this . send ( request . serialize ( ) ) ;
106
124
107
125
const requestInterval = setInterval ( ( ) => {
108
- if ( ! isResolved ) {
126
+ if ( ! isResolved && shouldContinueSending ) {
109
127
this . send ( request . serialize ( ) ) ;
110
128
}
111
- } , 20 ) ;
129
+ } , 50 ) ;
112
130
113
131
this . onceAfter ( "new-incoming-connection" , ( ) => {
114
132
if ( ! isResolved ) {
115
- clearTimeout ( connectionTimeout ) ;
116
- clearInterval ( requestInterval ) ;
117
133
isResolved = true ;
118
134
this . emit ( "connect" ) ;
119
135
this . status = Status . Connected ;
120
136
resolve ( advertisement ) ;
121
137
}
122
138
} ) ;
139
+
140
+ this . once ( "error" , ( error ) => {
141
+ cleanup ( ) ;
142
+ reject ( error ) ;
143
+ } ) ;
123
144
} ) ;
124
145
} catch ( error ) {
125
146
this . status = Status . Disconnected ;
0 commit comments