@@ -67,8 +67,6 @@ export class Redbird {
67
67
68
68
this . _defaultResolver . priority = 0 ;
69
69
70
- const _this = this ;
71
-
72
70
if ( ( opts . cluster && typeof opts . cluster !== 'number' ) || opts . cluster > 32 ) {
73
71
throw Error ( 'cluster setting must be an integer less than 32' ) ;
74
72
}
@@ -103,6 +101,25 @@ export class Redbird {
103
101
this . addResolver ( opts . resolvers ) ;
104
102
}
105
103
104
+ const websocketsUpgrade = async ( req , socket , head ) => {
105
+ socket . on ( 'error' , function ( err ) {
106
+ log && log . error ( err , 'WebSockets error' ) ;
107
+ } ) ;
108
+ const src = this . _getSource ( req ) ;
109
+ const target = await this . _getTarget ( src , req ) ;
110
+
111
+ log && log . info ( { headers : req . headers , target : target } , 'upgrade to websockets' ) ;
112
+
113
+ if ( target ) {
114
+ if ( target . useTargetHostHeader === true ) {
115
+ req . headers . host = target . host ;
116
+ }
117
+ proxy . ws ( req , socket , head , { target } ) ;
118
+ } else {
119
+ respondNotFound ( req , socket ) ;
120
+ }
121
+ } ;
122
+
106
123
//
107
124
// Routing table.
108
125
//
@@ -111,17 +128,21 @@ export class Redbird {
111
128
//
112
129
// Create a proxy server with custom application logic
113
130
//
131
+ let agent ;
132
+
133
+ if ( opts . keepAlive ) {
134
+ agent = this . agent = new http . Agent ( {
135
+ keepAlive : true ,
136
+ } ) ;
137
+ }
138
+
114
139
const proxy = ( this . proxy = httpProxy . createProxyServer ( {
115
140
xfwd : opts . xfwd != false ,
116
141
prependPath : false ,
117
142
secure : opts . secure !== false ,
118
143
timeout : opts . timeout ,
119
144
proxyTimeout : opts . proxyTimeout ,
120
- /*
121
- agent: new http.Agent({
122
- keepAlive: true
123
- })
124
- */
145
+ agent,
125
146
} ) ) ;
126
147
127
148
proxy . on ( 'proxyReq' , function ( p , req ) {
@@ -145,8 +166,8 @@ export class Redbird {
145
166
//
146
167
if ( opts . ssl ) {
147
168
if ( _ . isArray ( opts . ssl ) ) {
148
- opts . ssl . forEach ( function ( sslOpts ) {
149
- _this . setupHttpsProxy ( proxy , websocketsUpgrade , log , sslOpts ) ;
169
+ opts . ssl . forEach ( ( sslOpts ) => {
170
+ this . setupHttpsProxy ( proxy , websocketsUpgrade , log , sslOpts ) ;
150
171
} ) ;
151
172
} else {
152
173
this . setupHttpsProxy ( proxy , websocketsUpgrade , log , opts . ssl ) ;
@@ -156,7 +177,7 @@ export class Redbird {
156
177
//
157
178
// Plain HTTP Proxy
158
179
//
159
- const server = this . setupHttpProxy ( proxy , websocketsUpgrade , log , opts ) ;
180
+ const server = ( this . server = this . setupHttpProxy ( proxy , websocketsUpgrade , log , opts ) ) ;
160
181
161
182
server . listen ( opts . port , opts . host ) ;
162
183
@@ -169,24 +190,6 @@ export class Redbird {
169
190
log && log . info ( 'Started a Redbird reverse proxy server on port %s' , opts . port ) ;
170
191
}
171
192
172
- function websocketsUpgrade ( req , socket , head ) {
173
- socket . on ( 'error' , function ( err ) {
174
- log && log . error ( err , 'WebSockets error' ) ;
175
- } ) ;
176
- const src = _this . _getSource ( req ) ;
177
- _this . _getTarget ( src , req ) . then ( function ( target ) {
178
- log && log . info ( { headers : req . headers , target : target } , 'upgrade to websockets' ) ;
179
- if ( target ) {
180
- if ( target . useTargetHostHeader === true ) {
181
- req . headers . host = target . host ;
182
- }
183
- proxy . ws ( req , socket , head , { target : target } ) ;
184
- } else {
185
- respondNotFound ( req , socket ) ;
186
- }
187
- } ) ;
188
- }
189
-
190
193
function handleProxyError ( err , req , res ) {
191
194
//
192
195
// Send a 500 http status if headers have been sent
@@ -214,7 +217,7 @@ export class Redbird {
214
217
215
218
setupHttpProxy ( proxy , websocketsUpgrade , log , opts ) {
216
219
const httpServerModule = opts . serverModule || http ;
217
- const server = ( this . server = httpServerModule . createServer ( ( req , res ) => {
220
+ const server = httpServerModule . createServer ( ( req , res ) => {
218
221
const src = this . _getSource ( req ) ;
219
222
this . _getTarget ( src , req , res ) . then ( ( target ) => {
220
223
if ( target ) {
@@ -230,7 +233,7 @@ export class Redbird {
230
233
respondNotFound ( req , res ) ;
231
234
}
232
235
} ) ;
233
- } ) ) ;
236
+ } ) ;
234
237
235
238
//
236
239
// Listen to the `upgrade` event and proxy the
@@ -265,7 +268,6 @@ export class Redbird {
265
268
}
266
269
267
270
setupHttpsProxy ( proxy , websocketsUpgrade , log , sslOpts ) {
268
- const _this = this ;
269
271
let https ;
270
272
271
273
this . certs = this . certs || { } ;
@@ -309,18 +311,17 @@ export class Redbird {
309
311
https = sslOpts . serverModule || require ( 'https' ) ;
310
312
}
311
313
312
- const httpsServer = ( this . httpsServer = https . createServer ( ssl , function ( req , res ) {
313
- const src = _this . _getSource ( req ) ;
314
- const httpProxyOpts = Object . assign ( { } , _this . opts . httpProxy ) ;
314
+ const httpsServer = ( this . httpsServer = https . createServer ( ssl , async ( req , res ) => {
315
+ const src = this . _getSource ( req ) ;
316
+ const httpProxyOpts = Object . assign ( { } , this . opts . httpProxy ) ;
315
317
316
- _this . _getTarget ( src , req , res ) . then ( function ( target ) {
317
- if ( target ) {
318
- httpProxyOpts . target = target ;
319
- proxy . web ( req , res , httpProxyOpts ) ;
320
- } else {
321
- respondNotFound ( req , res ) ;
322
- }
323
- } ) ;
318
+ const target = await this . _getTarget ( src , req , res ) ;
319
+ if ( target ) {
320
+ httpProxyOpts . target = target ;
321
+ proxy . web ( req , res , httpProxyOpts ) ;
322
+ } else {
323
+ respondNotFound ( req , res ) ;
324
+ }
324
325
} ) ) ;
325
326
326
327
httpsServer . on ( 'upgrade' , websocketsUpgrade ) ;
@@ -344,8 +345,7 @@ export class Redbird {
344
345
resolver = [ resolver ] ;
345
346
}
346
347
347
- const _this = this ;
348
- resolver . forEach ( function ( resolveObj ) {
348
+ resolver . forEach ( ( resolveObj ) => {
349
349
if ( ! _ . isFunction ( resolveObj ) ) {
350
350
throw new Error ( 'Resolver must be an invokable function.' ) ;
351
351
}
@@ -354,10 +354,10 @@ export class Redbird {
354
354
resolveObj . priority = 0 ;
355
355
}
356
356
357
- _this . resolvers . push ( resolveObj ) ;
357
+ this . resolvers . push ( resolveObj ) ;
358
358
} ) ;
359
359
360
- _this . resolvers = _ . sortBy ( _ . uniq ( _this . resolvers ) , [ 'priority' ] ) . reverse ( ) ;
360
+ this . resolvers = _ . sortBy ( _ . uniq ( this . resolvers ) , [ 'priority' ] ) . reverse ( ) ;
361
361
}
362
362
363
363
removeResolver ( resolver ) {
@@ -453,48 +453,47 @@ export class Redbird {
453
453
return this ;
454
454
}
455
455
456
- updateCertificates ( domain , email , production , renewWithin , renew ) {
457
- const _this = this ;
458
- return letsencrypt . getCertificates ( domain , email , production , renew , this . log ) . then (
459
- function ( certs ) {
460
- if ( certs ) {
461
- const opts = {
462
- key : certs . privkey ,
463
- cert : certs . cert + certs . chain ,
464
- } ;
465
- _this . certs [ domain ] = tls . createSecureContext ( opts ) . context ;
466
-
467
- //
468
- // TODO: cluster friendly
469
- //
470
- let renewTime = certs . expiresAt - Date . now ( ) - renewWithin ;
471
- renewTime =
472
- renewTime > 0 ? renewTime : _this . opts . letsencrypt . minRenewTime || 60 * 60 * 1000 ;
473
-
474
- _this . log &&
475
- _this . log . info ( 'Renewal of %s in %s days' , domain , Math . floor ( renewTime / ONE_DAY ) ) ;
476
-
477
- function renewCertificate ( ) {
478
- _this . log && _this . log . info ( 'Renewing letscrypt certificates for %s' , domain ) ;
479
- _this . updateCertificates ( domain , email , production , renewWithin , true ) ;
480
- }
456
+ async updateCertificates ( domain , email , production , renewWithin , renew ) {
457
+ try {
458
+ const certs = await letsencrypt . getCertificates ( domain , email , production , renew , this . log ) ;
459
+ if ( certs ) {
460
+ const opts = {
461
+ key : certs . privkey ,
462
+ cert : certs . cert + certs . chain ,
463
+ } ;
464
+ this . certs [ domain ] = tls . createSecureContext ( opts ) . context ;
481
465
482
- _this . certs [ domain ] . renewalTimeout = safe . setTimeout ( renewCertificate , renewTime ) ;
483
- } else {
484
- //
485
- // TODO: Try again, but we need an exponential backof to avoid getting banned.
486
- //
487
- _this . log && _this . log . info ( 'Could not get any certs for %s' , domain ) ;
488
- }
489
- } ,
490
- function ( err ) {
491
- console . error ( 'Error getting LetsEncrypt certificates' , err ) ;
466
+ //
467
+ // TODO: cluster friendly
468
+ //
469
+ let renewTime = certs . expiresAt - Date . now ( ) - renewWithin ;
470
+ renewTime =
471
+ renewTime > 0 ? renewTime : this . opts . letsencrypt . minRenewTime || 60 * 60 * 1000 ;
472
+
473
+ this . log &&
474
+ this . log . info ( 'Renewal of %s in %s days' , domain , Math . floor ( renewTime / ONE_DAY ) ) ;
475
+
476
+ const renewCertificate = ( ) => {
477
+ this . log && this . log . info ( 'Renewing letscrypt certificates for %s' , domain ) ;
478
+ this . updateCertificates ( domain , email , production , renewWithin , true ) ;
479
+ } ;
480
+
481
+ this . certs [ domain ] . renewalTimeout = safe . setTimeout ( renewCertificate , renewTime ) ;
482
+ } else {
483
+ //
484
+ // TODO: Try again, but we need an exponential backof to avoid getting banned.
485
+ //
486
+ this . log && this . log . info ( 'Could not get any certs for %s' , domain ) ;
492
487
}
493
- ) ;
488
+ } catch ( err ) {
489
+ console . error ( 'Error getting LetsEncrypt certificates' , err ) ;
490
+ }
494
491
}
495
492
496
493
unregister ( src , target ) {
497
- if ( this . opts . cluster && cluster . isMaster ) return this ;
494
+ if ( this . opts . cluster && cluster . isPrimary ) {
495
+ return this ;
496
+ }
498
497
499
498
if ( ! src ) {
500
499
return this ;
@@ -649,15 +648,14 @@ export class Redbird {
649
648
}
650
649
651
650
close ( ) {
652
- try {
653
- return Promise . all (
654
- [ this . server , this . httpsServer ]
655
- . filter ( ( s ) => s )
656
- . map ( ( server ) => new Promise ( ( resolve ) => server . close ( resolve ) ) )
657
- ) ;
658
- } catch ( err ) {
659
- // Ignore for now...
660
- }
651
+ this . proxy . close ( ) ;
652
+ this . agent && this . agent . destroy ( ) ;
653
+
654
+ return Promise . all (
655
+ [ this . server , this . httpsServer ]
656
+ . filter ( ( s ) => s )
657
+ . map ( ( server ) => new Promise ( ( resolve ) => server . close ( resolve ) ) )
658
+ ) ;
661
659
}
662
660
663
661
//
0 commit comments