@@ -31,6 +31,15 @@ class UnexpectedDataError extends Error {
31
31
}
32
32
}
33
33
34
+ class TimeoutError extends Error {
35
+ constructor ( ) {
36
+ super ( `Socket timeout reached.` ) ;
37
+ Object . setPrototypeOf ( this , TimeoutError . prototype ) ;
38
+ this . name = 'TimeoutError' ;
39
+ Error . captureStackTrace ( this , TimeoutError ) ;
40
+ }
41
+ }
42
+
34
43
Bluebird . config ( {
35
44
// Enable warnings
36
45
// warnings: true,
@@ -46,6 +55,7 @@ export default class Parser {
46
55
public static FailError = FailError ;
47
56
public static PrematureEOFError = PrematureEOFError ;
48
57
public static UnexpectedDataError = UnexpectedDataError ;
58
+ public static TimeoutError = TimeoutError ;
49
59
private ended = false ;
50
60
51
61
constructor ( public stream : Duplex ) {
@@ -59,6 +69,7 @@ export default class Parser {
59
69
let tryRead : ( ) => void ;
60
70
let errorListener : ( error : Error ) => void ;
61
71
let endListener : ( ) => void ;
72
+ let timeoutListener : ( ) => void ;
62
73
return new Bluebird < boolean > ( ( resolve , reject , onCancel ) => {
63
74
tryRead = ( ) => {
64
75
while ( this . stream . read ( ) ) {
@@ -72,9 +83,14 @@ export default class Parser {
72
83
this . ended = true ;
73
84
return resolve ( true ) ;
74
85
} ;
86
+ timeoutListener = ( ) => {
87
+ this . stream . end ( )
88
+ return reject ( new Parser . TimeoutError ( ) ) ;
89
+ } ;
75
90
this . stream . on ( 'readable' , tryRead ) ;
76
91
this . stream . on ( 'error' , errorListener ) ;
77
92
this . stream . on ( 'end' , endListener ) ;
93
+ this . stream . on ( 'timeout' , timeoutListener ) ;
78
94
this . stream . read ( 0 ) ;
79
95
this . stream . end ( ) ;
80
96
onCancel ( ( ) => {
@@ -84,6 +100,7 @@ export default class Parser {
84
100
this . stream . removeListener ( 'readable' , tryRead ) ;
85
101
this . stream . removeListener ( 'error' , errorListener ) ;
86
102
this . stream . removeListener ( 'end' , endListener ) ;
103
+ this . stream . removeListener ( 'timeout' , timeoutListener ) ;
87
104
// return r;
88
105
} ) ;
89
106
}
@@ -98,6 +115,7 @@ export default class Parser {
98
115
let tryRead : ( ) => void ;
99
116
let errorListener : ( error : Error ) => void ;
100
117
let endListener : ( ) => void ;
118
+ let timeoutListener : ( ) => void ;
101
119
102
120
return new Bluebird < Buffer > ( ( resolve , reject , onCancel ) => {
103
121
tryRead = ( ) => {
@@ -116,9 +134,14 @@ export default class Parser {
116
134
this . ended = true ;
117
135
return resolve ( all ) ;
118
136
} ;
137
+ timeoutListener = ( ) => {
138
+ this . stream . end ( )
139
+ return reject ( new Parser . TimeoutError ( ) ) ;
140
+ } ;
119
141
this . stream . on ( 'readable' , tryRead ) ;
120
142
this . stream . on ( 'error' , errorListener ) ;
121
143
this . stream . on ( 'end' , endListener ) ;
144
+ this . stream . on ( 'timeout' , timeoutListener ) ;
122
145
tryRead ( ) ;
123
146
onCancel ( ( ) => {
124
147
// console.log('2-onCanceled');
@@ -127,6 +150,7 @@ export default class Parser {
127
150
this . stream . removeListener ( 'readable' , tryRead ) ;
128
151
this . stream . removeListener ( 'error' , errorListener ) ;
129
152
this . stream . removeListener ( 'end' , endListener ) ;
153
+ this . stream . removeListener ( 'timeout' , timeoutListener ) ;
130
154
} ) ;
131
155
}
132
156
@@ -138,6 +162,7 @@ export default class Parser {
138
162
let tryRead : ( ) => void ;
139
163
let errorListener : ( error : Error ) => void ;
140
164
let endListener : ( ) => void ;
165
+ let timeoutListener : ( ) => void ;
141
166
return new Bluebird < Buffer > ( ( resolve , reject /*, onCancel*/ ) => {
142
167
tryRead = ( ) => {
143
168
if ( howMany ) {
@@ -161,23 +186,30 @@ export default class Parser {
161
186
this . ended = true ;
162
187
return reject ( new Parser . PrematureEOFError ( howMany ) ) ;
163
188
} ;
189
+ timeoutListener = ( ) => {
190
+ this . stream . end ( )
191
+ return reject ( new Parser . TimeoutError ( ) ) ;
192
+ } ;
164
193
errorListener = ( err ) => reject ( err ) ;
165
194
this . stream . on ( 'readable' , tryRead ) ;
166
195
this . stream . on ( 'error' , errorListener ) ;
167
196
this . stream . on ( 'end' , endListener ) ;
197
+ this . stream . on ( 'timeout' , timeoutListener ) ;
168
198
tryRead ( ) ;
169
199
// onCancel(() => {});
170
200
} ) . finally ( ( ) => {
171
201
this . stream . removeListener ( 'readable' , tryRead ) ;
172
202
this . stream . removeListener ( 'error' , errorListener ) ;
173
203
this . stream . removeListener ( 'end' , endListener ) ;
204
+ this . stream . removeListener ( 'timeout' , timeoutListener ) ;
174
205
} ) ;
175
206
}
176
207
177
208
public readByteFlow ( howMany : number , targetStream : Duplex ) : Bluebird < void > {
178
209
let tryRead : ( ) => void ;
179
210
let errorListener : ( error : Error ) => void ;
180
211
let endListener : ( ) => void ;
212
+ let timeoutListener : ( ) => void ;
181
213
return new Bluebird < void > ( ( resolve , reject /*, onCancel*/ ) => {
182
214
tryRead = ( ) => {
183
215
if ( howMany ) {
@@ -206,15 +238,21 @@ export default class Parser {
206
238
errorListener = function ( err ) {
207
239
return reject ( err ) ;
208
240
} ;
241
+ timeoutListener = ( ) => {
242
+ this . stream . end ( )
243
+ return reject ( new Parser . TimeoutError ( ) ) ;
244
+ } ;
209
245
this . stream . on ( 'readable' , tryRead ) ;
210
246
this . stream . on ( 'error' , errorListener ) ;
211
247
this . stream . on ( 'end' , endListener ) ;
248
+ this . stream . on ( 'timeout' , timeoutListener ) ;
212
249
tryRead ( ) ;
213
250
// onCancel(() => {});
214
251
} ) . finally ( ( ) => {
215
252
this . stream . removeListener ( 'readable' , tryRead ) ;
216
253
this . stream . removeListener ( 'error' , errorListener ) ;
217
254
this . stream . removeListener ( 'end' , endListener ) ;
255
+ this . stream . removeListener ( 'timeout' , timeoutListener ) ;
218
256
} ) ;
219
257
}
220
258
0 commit comments