@@ -315,21 +315,45 @@ export default class RedisClient<
315
315
return RedisClient . factory ( options ) ( options ) ;
316
316
}
317
317
318
- static parseURL ( url : string ) : RedisClientOptions {
318
+ static parseOptions < O extends RedisClientOptions > ( options : O ) : O {
319
+ if ( options ?. url ) {
320
+ const parsed = RedisClient . parseURL ( options . url ) ;
321
+ if ( options . socket ) {
322
+ if ( options . socket . tls !== undefined && options . socket . tls !== parsed . socket . tls ) {
323
+ throw new TypeError ( `tls socket option is set to ${ options . socket . tls } which is mismatch with protocol or the URL ${ options . url } passed` )
324
+ }
325
+ parsed . socket = Object . assign ( options . socket , parsed . socket ) ;
326
+ }
327
+
328
+ Object . assign ( options , parsed ) ;
329
+ }
330
+ return options ;
331
+ }
332
+
333
+ static parseURL ( url : string ) : RedisClientOptions & {
334
+ socket : Exclude < RedisClientOptions [ 'socket' ] , undefined > & {
335
+ tls : boolean
336
+ }
337
+ } {
319
338
// https://www.iana.org/assignments/uri-schemes/prov/redis
320
339
const { hostname, port, protocol, username, password, pathname } = new URL ( url ) ,
321
- parsed : RedisClientOptions = {
340
+ parsed : RedisClientOptions & {
341
+ socket : Exclude < RedisClientOptions [ 'socket' ] , undefined > & {
342
+ tls : boolean
343
+ }
344
+ } = {
322
345
socket : {
323
- host : hostname
346
+ host : hostname ,
347
+ tls : false
324
348
}
325
349
} ;
326
350
327
- if ( protocol === 'rediss:' ) {
328
- parsed ! . socket ! . tls = true ;
329
- } else if ( protocol !== 'redis:' ) {
351
+ if ( protocol !== 'redis:' && protocol !== 'rediss:' ) {
330
352
throw new TypeError ( 'Invalid protocol' ) ;
331
353
}
332
354
355
+ parsed . socket . tls = protocol === 'rediss:' ;
356
+
333
357
if ( port ) {
334
358
( parsed . socket as TcpSocketConnectOpts ) . port = Number ( port ) ;
335
359
}
@@ -464,15 +488,6 @@ export default class RedisClient<
464
488
} ;
465
489
}
466
490
467
- if ( options ?. url ) {
468
- const parsed = RedisClient . parseURL ( options . url ) ;
469
- if ( options . socket ) {
470
- parsed . socket = Object . assign ( options . socket , parsed . socket ) ;
471
- }
472
-
473
- Object . assign ( options , parsed ) ;
474
- }
475
-
476
491
if ( options ?. database ) {
477
492
this . _self . #selectedDB = options . database ;
478
493
}
@@ -481,6 +496,10 @@ export default class RedisClient<
481
496
this . _commandOptions = options . commandOptions ;
482
497
}
483
498
499
+ if ( options ) {
500
+ return RedisClient . parseOptions ( options ) ;
501
+ }
502
+
484
503
return options ;
485
504
}
486
505
0 commit comments