2
2
3
3
const {
4
4
InvalidArgumentError,
5
- NotSupportedError
5
+ NotSupportedError,
6
+ AbortError
6
7
} = require ( './errors' )
7
8
const assert = require ( 'node:assert' )
9
+ const { parseHeaders } = require ( './util' )
8
10
const {
9
11
isValidHTTPToken,
10
12
isValidHeaderChar,
@@ -25,6 +27,45 @@ const { headerNameLowerCasedRecord } = require('./constants')
25
27
const invalidPathRegex = / [ ^ \u0021 - \u00ff ] /
26
28
27
29
const kHandler = Symbol ( 'handler' )
30
+ const kResume = Symbol ( 'resume' )
31
+ const kAbort = Symbol ( 'abort' )
32
+
33
+ class Controller {
34
+ #paused = false
35
+ #reason = null
36
+ #abort = null
37
+
38
+ constructor ( abort ) {
39
+ this . #abort = abort
40
+ this [ kResume ] = null
41
+ }
42
+
43
+ pause ( ) {
44
+ this . #paused = true
45
+ }
46
+
47
+ resume ( ) {
48
+ this . #paused = false
49
+ this [ kResume ] ?. ( )
50
+ }
51
+
52
+ abort ( reason ) {
53
+ this . #reason = reason ?? new AbortError ( )
54
+ this [ kAbort ] ?. ( this . #reason)
55
+ }
56
+
57
+ get paused ( ) {
58
+ return this . #paused
59
+ }
60
+
61
+ get aborted ( ) {
62
+ return this . #reason !== null
63
+ }
64
+
65
+ get reason ( ) {
66
+ return this . #reason
67
+ }
68
+ }
28
69
29
70
class Request {
30
71
constructor ( origin , {
@@ -91,6 +132,8 @@ class Request {
91
132
92
133
this . abort = null
93
134
135
+ this . controller = new Controller ( )
136
+
94
137
if ( body == null ) {
95
138
this . body = null
96
139
} else if ( isStream ( body ) ) {
@@ -192,12 +235,11 @@ class Request {
192
235
}
193
236
194
237
onBodySent ( chunk ) {
195
- if ( this [ kHandler ] . onBodySent ) {
196
- try {
197
- return this [ kHandler ] . onBodySent ( chunk )
198
- } catch ( err ) {
199
- this . abort ( err )
200
- }
238
+ try {
239
+ this [ kHandler ] . onRequestData ?. ( chunk )
240
+ this [ kHandler ] . onBodySent ?. ( chunk )
241
+ } catch ( err ) {
242
+ this . abort ( err )
201
243
}
202
244
}
203
245
@@ -206,19 +248,20 @@ class Request {
206
248
channels . bodySent . publish ( { request : this } )
207
249
}
208
250
209
- if ( this [ kHandler ] . onRequestSent ) {
210
- try {
211
- return this [ kHandler ] . onRequestSent ( )
212
- } catch ( err ) {
213
- this . abort ( err )
214
- }
251
+ try {
252
+ this [ kHandler ] . onRequestEnd ?. ( )
253
+ this [ kHandler ] . onRequestSent ?. ( )
254
+ } catch ( err ) {
255
+ this . abort ( err )
215
256
}
216
257
}
217
258
218
259
onConnect ( abort ) {
219
260
assert ( ! this . aborted )
220
261
assert ( ! this . completed )
221
262
263
+ this . controller [ kAbort ] = abort
264
+
222
265
if ( this . error ) {
223
266
abort ( this . error )
224
267
} else {
@@ -228,7 +271,12 @@ class Request {
228
271
}
229
272
230
273
onResponseStarted ( ) {
231
- return this [ kHandler ] . onResponseStarted ?. ( )
274
+ try {
275
+ this [ kHandler ] . onResponseStart ?. ( this . controller )
276
+ return this [ kHandler ] . onResponseStarted ?. ( )
277
+ } catch ( err ) {
278
+ this . abort ( err )
279
+ }
232
280
}
233
281
234
282
onHeaders ( statusCode , headers , resume , statusText ) {
@@ -239,8 +287,16 @@ class Request {
239
287
channels . headers . publish ( { request : this , response : { statusCode, headers, statusText } } )
240
288
}
241
289
290
+ this . controller [ kResume ] = resume
291
+
242
292
try {
243
- return this [ kHandler ] . onHeaders ( statusCode , headers , resume , statusText )
293
+ this [ kHandler ] . onResponseHeaders ?. ( parseHeaders ( headers ) , statusCode , statusText )
294
+
295
+ if ( this [ kHandler ] . onHeaders ?. ( statusCode , headers , ( ) => this . controller . resume ( ) , statusText ) === false ) {
296
+ this . controller . pause ( )
297
+ }
298
+
299
+ return ! this . controller . paused
244
300
} catch ( err ) {
245
301
this . abort ( err )
246
302
}
@@ -251,7 +307,13 @@ class Request {
251
307
assert ( ! this . completed )
252
308
253
309
try {
254
- return this [ kHandler ] . onData ( chunk )
310
+ this [ kHandler ] . onResponseData ?. ( chunk )
311
+
312
+ if ( this [ kHandler ] . onData ?. ( chunk ) === false ) {
313
+ this . controller . pause ( )
314
+ }
315
+
316
+ return ! this . controller . paused
255
317
} catch ( err ) {
256
318
this . abort ( err )
257
319
return false
@@ -276,7 +338,10 @@ class Request {
276
338
}
277
339
278
340
try {
279
- return this [ kHandler ] . onComplete ( trailers )
341
+ this [ kHandler ] . onResponseTrailers ?. ( parseHeaders ( trailers ) )
342
+ this [ kHandler ] . onResponseEnd ?. ( )
343
+
344
+ this [ kHandler ] . onComplete ( trailers )
280
345
} catch ( err ) {
281
346
// TODO (fix): This might be a bad idea?
282
347
this . onError ( err )
0 commit comments