@@ -99,128 +99,128 @@ export interface NormalizedServerOptions extends ServerOptions {
99
99
forward ?: NormalizeProxyTarget < ProxyTargetUrl > ;
100
100
}
101
101
102
- export type ErrorCallback =
102
+ export type ErrorCallback < TIncomingMessage extends typeof http . IncomingMessage = typeof http . IncomingMessage , TServerResponse extends typeof http . ServerResponse = typeof http . ServerResponse , TError = Error > =
103
103
(
104
- err : Error ,
105
- req : http . IncomingMessage ,
106
- res : http . ServerResponse | net . Socket ,
104
+ err : TError ,
105
+ req : InstanceType < TIncomingMessage > ,
106
+ res : InstanceType < TServerResponse > | net . Socket ,
107
107
target ?: ProxyTargetUrl ,
108
108
) => void ;
109
109
110
- type ProxyServerEventMap = {
111
- error : Parameters < ErrorCallback > ;
110
+ type ProxyServerEventMap < TIncomingMessage extends typeof http . IncomingMessage = typeof http . IncomingMessage , TServerResponse extends typeof http . ServerResponse = typeof http . ServerResponse , TError = Error > = {
111
+ error : Parameters < ErrorCallback < TIncomingMessage , TServerResponse , TError > > ;
112
112
start : [
113
- req : http . IncomingMessage ,
114
- res : http . ServerResponse ,
113
+ req : InstanceType < TIncomingMessage > ,
114
+ res : InstanceType < TServerResponse > ,
115
115
target : ProxyTargetUrl ,
116
116
] ;
117
117
open : [ socket : net . Socket ] ;
118
118
proxyReq : [
119
119
proxyReq : http . ClientRequest ,
120
- req : http . IncomingMessage ,
121
- res : http . ServerResponse ,
120
+ req : InstanceType < TIncomingMessage > ,
121
+ res : InstanceType < TServerResponse > ,
122
122
options : ServerOptions ,
123
123
socket : net . Socket ,
124
124
] ;
125
125
proxyRes : [
126
- proxyRes : http . IncomingMessage ,
127
- req : http . IncomingMessage ,
128
- res : http . ServerResponse ,
126
+ proxyRes : InstanceType < TIncomingMessage > ,
127
+ req : InstanceType < TIncomingMessage > ,
128
+ res : InstanceType < TServerResponse > ,
129
129
] ;
130
130
proxyReqWs : [
131
131
proxyReq : http . ClientRequest ,
132
- req : http . IncomingMessage ,
132
+ req : InstanceType < TIncomingMessage > ,
133
133
socket : net . Socket ,
134
134
options : ServerOptions ,
135
135
head : any ,
136
136
] ;
137
137
econnreset : [
138
138
err : Error ,
139
- req : http . IncomingMessage ,
140
- res : http . ServerResponse ,
139
+ req : InstanceType < TIncomingMessage > ,
140
+ res : InstanceType < TServerResponse > ,
141
141
target : ProxyTargetUrl ,
142
142
] ;
143
143
end : [
144
- req : http . IncomingMessage ,
145
- res : http . ServerResponse ,
146
- proxyRes : http . IncomingMessage ,
144
+ req : InstanceType < TIncomingMessage > ,
145
+ res : InstanceType < TServerResponse > ,
146
+ proxyRes : InstanceType < TIncomingMessage > ,
147
147
] ;
148
148
close : [
149
- proxyRes : http . IncomingMessage ,
149
+ proxyRes : InstanceType < TIncomingMessage > ,
150
150
proxySocket : net . Socket ,
151
151
proxyHead : any ,
152
152
] ;
153
153
}
154
154
155
- type ProxyMethodArgs = {
155
+ type ProxyMethodArgs < TIncomingMessage extends typeof http . IncomingMessage = typeof http . IncomingMessage , TServerResponse extends typeof http . ServerResponse = typeof http . ServerResponse , TError = Error > = {
156
156
ws : [
157
- req : http . IncomingMessage ,
157
+ req : InstanceType < TIncomingMessage > ,
158
158
socket : any ,
159
159
head : any ,
160
160
...args :
161
- [
162
- options ?: ServerOptions ,
163
- callback ?: ErrorCallback ,
164
- ]
161
+ [
162
+ options ?: ServerOptions ,
163
+ callback ?: ErrorCallback < TIncomingMessage , TServerResponse , TError > ,
164
+ ]
165
165
| [
166
- callback ?: ErrorCallback ,
167
- ]
166
+ callback ?: ErrorCallback < TIncomingMessage , TServerResponse , TError > ,
167
+ ]
168
168
]
169
169
web : [
170
- req : http . IncomingMessage ,
171
- res : http . ServerResponse ,
170
+ req : InstanceType < TIncomingMessage > ,
171
+ res : InstanceType < TServerResponse > ,
172
172
...args :
173
- [
174
- options : ServerOptions ,
175
- callback ?: ErrorCallback ,
176
- ]
177
- | [
178
- callback ?: ErrorCallback
179
- ]
173
+ [
174
+ options : ServerOptions ,
175
+ callback ?: ErrorCallback < TIncomingMessage , TServerResponse , TError > ,
176
+ ]
177
+ | [
178
+ callback ?: ErrorCallback < TIncomingMessage , TServerResponse , TError >
179
+ ]
180
180
]
181
181
}
182
182
183
- type PassFunctions = {
183
+ type PassFunctions < TIncomingMessage extends typeof http . IncomingMessage = typeof http . IncomingMessage , TServerResponse extends typeof http . ServerResponse = typeof http . ServerResponse , TError = Error > = {
184
184
ws : (
185
- req : http . IncomingMessage ,
185
+ req : InstanceType < TIncomingMessage > ,
186
186
socket : net . Socket ,
187
187
options : NormalizedServerOptions ,
188
188
head : Buffer | undefined ,
189
- server : ProxyServer ,
190
- cb ?: ErrorCallback
189
+ server : ProxyServer < TIncomingMessage , TServerResponse , TError > ,
190
+ cb ?: ErrorCallback < TIncomingMessage , TServerResponse , TError >
191
191
) => unknown
192
192
web : (
193
- req : http . IncomingMessage ,
194
- res : http . ServerResponse ,
193
+ req : InstanceType < TIncomingMessage > ,
194
+ res : InstanceType < TServerResponse > ,
195
195
options : NormalizedServerOptions ,
196
196
head : Buffer | undefined ,
197
- server : ProxyServer ,
198
- cb ?: ErrorCallback
197
+ server : ProxyServer < TIncomingMessage , TServerResponse , TError > ,
198
+ cb ?: ErrorCallback < TIncomingMessage , TServerResponse , TError >
199
199
) => unknown
200
200
}
201
201
202
- export class ProxyServer extends EventEmitter < ProxyServerEventMap > {
202
+ export class ProxyServer < TIncomingMessage extends typeof http . IncomingMessage = typeof http . IncomingMessage , TServerResponse extends typeof http . ServerResponse = typeof http . ServerResponse , TError = Error > extends EventEmitter < ProxyServerEventMap < TIncomingMessage , TServerResponse , TError > > {
203
203
/**
204
204
* Used for proxying WS(S) requests
205
205
* @param req - Client request.
206
206
* @param socket - Client socket.
207
207
* @param head - Client head.
208
208
* @param options - Additional options.
209
209
*/
210
- public readonly ws : ( ...args : ProxyMethodArgs [ "ws" ] ) => void ;
210
+ public readonly ws : ( ...args : ProxyMethodArgs < TIncomingMessage , TServerResponse , TError > [ "ws" ] ) => void ;
211
211
212
212
/**
213
213
* Used for proxying regular HTTP(S) requests
214
214
* @param req - Client request.
215
215
* @param res - Client response.
216
216
* @param options - Additional options.
217
217
*/
218
- public readonly web : ( ...args : ProxyMethodArgs [ "web" ] ) => void ;
218
+ public readonly web : ( ...args : ProxyMethodArgs < TIncomingMessage , TServerResponse , TError > [ "web" ] ) => void ;
219
219
220
220
private options : ServerOptions ;
221
- private webPasses : Array < PassFunctions [ 'web' ] > ;
222
- private wsPasses : Array < PassFunctions [ 'ws' ] > ;
223
- private _server ?: http . Server | https . Server | null ;
221
+ private webPasses : Array < PassFunctions < TIncomingMessage , TServerResponse , TError > [ 'web' ] > ;
222
+ private wsPasses : Array < PassFunctions < TIncomingMessage , TServerResponse , TError > [ 'ws' ] > ;
223
+ private _server ?: http . Server < TIncomingMessage , TServerResponse > | https . Server < TIncomingMessage , TServerResponse > | null ;
224
224
225
225
/**
226
226
* Creates the proxy server with specified options.
@@ -233,8 +233,8 @@ export class ProxyServer extends EventEmitter<ProxyServerEventMap> {
233
233
this . options = options ;
234
234
this . web = this . createRightProxy ( "web" ) ( options ) ;
235
235
this . ws = this . createRightProxy ( "ws" ) ( options ) ;
236
- this . webPasses = Object . values ( WEB_PASSES ) ;
237
- this . wsPasses = Object . values ( WS_PASSES ) ;
236
+ this . webPasses = Object . values ( WEB_PASSES ) as Array < PassFunctions < TIncomingMessage , TServerResponse , TError > [ 'web' ] > ;
237
+ this . wsPasses = Object . values ( WS_PASSES ) as Array < PassFunctions < TIncomingMessage , TServerResponse , TError > [ 'ws' ] > ;
238
238
this . on ( "error" , this . onError ) ;
239
239
}
240
240
@@ -243,36 +243,48 @@ export class ProxyServer extends EventEmitter<ProxyServerEventMap> {
243
243
* @param options Config object passed to the proxy
244
244
* @returns Proxy object with handlers for `ws` and `web` requests
245
245
*/
246
- static createProxyServer ( options ?: ServerOptions ) : ProxyServer {
247
- return new ProxyServer ( options ) ;
246
+ static createProxyServer <
247
+ TIncomingMessage extends typeof http . IncomingMessage ,
248
+ TServerResponse extends typeof http . ServerResponse ,
249
+ TError = Error
250
+ > ( options ?: ServerOptions ) : ProxyServer < TIncomingMessage , TServerResponse , TError > {
251
+ return new ProxyServer < TIncomingMessage , TServerResponse , TError > ( options ) ;
248
252
}
249
253
250
254
/**
251
255
* Creates the proxy server with specified options.
252
256
* @param options Config object passed to the proxy
253
257
* @returns Proxy object with handlers for `ws` and `web` requests
254
258
*/
255
- static createServer ( options ?: ServerOptions ) : ProxyServer {
256
- return new ProxyServer ( options ) ;
259
+ static createServer <
260
+ TIncomingMessage extends typeof http . IncomingMessage ,
261
+ TServerResponse extends typeof http . ServerResponse ,
262
+ TError = Error
263
+ > ( options ?: ServerOptions ) : ProxyServer < TIncomingMessage , TServerResponse , TError > {
264
+ return new ProxyServer < TIncomingMessage , TServerResponse , TError > ( options ) ;
257
265
}
258
266
259
267
/**
260
268
* Creates the proxy server with specified options.
261
269
* @param options Config object passed to the proxy
262
270
* @returns Proxy object with handlers for `ws` and `web` requests
263
271
*/
264
- static createProxy ( options ?: ServerOptions ) : ProxyServer {
265
- return new ProxyServer ( options ) ;
272
+ static createProxy <
273
+ TIncomingMessage extends typeof http . IncomingMessage ,
274
+ TServerResponse extends typeof http . ServerResponse ,
275
+ TError = Error
276
+ > ( options ?: ServerOptions ) : ProxyServer < TIncomingMessage , TServerResponse , TError > {
277
+ return new ProxyServer < TIncomingMessage , TServerResponse , TError > ( options ) ;
266
278
}
267
279
268
280
// createRightProxy - Returns a function that when called creates the loader for
269
281
// either `ws` or `web`'s passes.
270
282
createRightProxy = < PT extends ProxyType > ( type : PT ) : Function => {
271
283
log ( "createRightProxy" , { type } ) ;
272
284
return ( options : ServerOptions ) => {
273
- return ( ...args : ProxyMethodArgs [ PT ] /* req, res, [head], [opts] */ ) => {
285
+ return ( ...args : ProxyMethodArgs < TIncomingMessage , TServerResponse , TError > [ PT ] /* req, res, [head], [opts] */ ) => {
274
286
const req = args [ 0 ] ;
275
- log ( "proxy: " , { type, path : req . url } ) ;
287
+ log ( "proxy: " , { type, path : ( req as http . IncomingMessage ) . url } ) ;
276
288
const res = args [ 1 ] ;
277
289
const passes = type === "ws" ? this . wsPasses : this . webPasses ;
278
290
if ( type == "ws" ) {
@@ -284,13 +296,13 @@ export class ProxyServer extends EventEmitter<ProxyServerEventMap> {
284
296
// and there's no way for a user of http-proxy-3 to get ahold
285
297
// of this res object and attach their own error handler until
286
298
// after the passes. So we better attach one ASAP right here:
287
- ( res as net . Socket ) . on ( "error" , ( err ) => {
299
+ ( res as net . Socket ) . on ( "error" , ( err : TError ) => {
288
300
this . emit ( "error" , err , req , res ) ;
289
301
} ) ;
290
302
}
291
303
let counter = args . length - 1 ;
292
304
let head : Buffer | undefined ;
293
- let cb : ErrorCallback | undefined ;
305
+ let cb : ErrorCallback < TIncomingMessage , TServerResponse , TError > | undefined ;
294
306
295
307
// optional args parse begin
296
308
if ( typeof args [ counter ] === "function" ) {
@@ -318,7 +330,7 @@ export class ProxyServer extends EventEmitter<ProxyServerEventMap> {
318
330
}
319
331
320
332
if ( ! requestOptions . target && ! requestOptions . forward ) {
321
- this . emit ( "error" , new Error ( "Must set target or forward" ) , req , res ) ;
333
+ this . emit ( "error" , new Error ( "Must set target or forward" ) as TError , req , res ) ;
322
334
return ;
323
335
}
324
336
@@ -340,7 +352,7 @@ export class ProxyServer extends EventEmitter<ProxyServerEventMap> {
340
352
} ;
341
353
} ;
342
354
343
- onError = ( err : Error ) => {
355
+ onError = ( err : TError ) => {
344
356
// Force people to handle their own errors
345
357
if ( this . listeners ( "error" ) . length === 1 ) {
346
358
throw err ;
@@ -355,12 +367,16 @@ export class ProxyServer extends EventEmitter<ProxyServerEventMap> {
355
367
listen = ( port : number , hostname ?: string ) => {
356
368
log ( "listen" , { port, hostname } ) ;
357
369
370
+ const requestListener = ( req : InstanceType < TIncomingMessage > , res : InstanceType < TServerResponse > ) => {
371
+ this . web ( req , res ) ;
372
+ } ;
373
+
358
374
this . _server = this . options . ssl
359
- ? https . createServer ( this . options . ssl , this . web )
360
- : http . createServer ( this . web ) ;
375
+ ? https . createServer < TIncomingMessage , TServerResponse > ( this . options . ssl , requestListener )
376
+ : http . createServer < TIncomingMessage , TServerResponse > ( requestListener ) ;
361
377
362
378
if ( this . options . ws ) {
363
- this . _server . on ( "upgrade" , ( req , socket , head ) => {
379
+ this . _server . on ( "upgrade" , ( req : InstanceType < TIncomingMessage > , socket , head ) => {
364
380
this . ws ( req , socket , head ) ;
365
381
} ) ;
366
382
}
@@ -390,11 +406,11 @@ export class ProxyServer extends EventEmitter<ProxyServerEventMap> {
390
406
} ) ;
391
407
} ;
392
408
393
- before = < PT extends ProxyType > ( type : PT , passName : string , cb : PassFunctions [ PT ] ) => {
409
+ before = < PT extends ProxyType > ( type : PT , passName : string , cb : PassFunctions < TIncomingMessage , TServerResponse , TError > [ PT ] ) => {
394
410
if ( type !== "ws" && type !== "web" ) {
395
411
throw new Error ( "type must be `web` or `ws`" ) ;
396
412
}
397
- const passes = ( type === "ws" ? this . wsPasses : this . webPasses ) as PassFunctions [ PT ] [ ] ;
413
+ const passes = ( type === "ws" ? this . wsPasses : this . webPasses ) as PassFunctions < TIncomingMessage , TServerResponse , TError > [ PT ] [ ] ;
398
414
let i : false | number = false ;
399
415
400
416
passes . forEach ( ( v , idx ) => {
@@ -410,11 +426,11 @@ export class ProxyServer extends EventEmitter<ProxyServerEventMap> {
410
426
passes . splice ( i , 0 , cb ) ;
411
427
} ;
412
428
413
- after = < PT extends ProxyType > ( type : PT , passName : string , cb : PassFunctions [ PT ] ) => {
429
+ after = < PT extends ProxyType > ( type : PT , passName : string , cb : PassFunctions < TIncomingMessage , TServerResponse , TError > [ PT ] ) => {
414
430
if ( type !== "ws" && type !== "web" ) {
415
431
throw new Error ( "type must be `web` or `ws`" ) ;
416
432
}
417
- const passes = ( type === "ws" ? this . wsPasses : this . webPasses ) as PassFunctions [ PT ] [ ] ;
433
+ const passes = ( type === "ws" ? this . wsPasses : this . webPasses ) as PassFunctions < TIncomingMessage , TServerResponse , TError > [ PT ] [ ] ;
418
434
let i : false | number = false ;
419
435
420
436
passes . forEach ( ( v , idx ) => {
0 commit comments