@@ -315,21 +315,45 @@ export default class RedisClient<
315315 return RedisClient . factory ( options ) ( options ) ;
316316 }
317317
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+ } {
319338 // https://www.iana.org/assignments/uri-schemes/prov/redis
320339 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+ } = {
322345 socket : {
323- host : hostname
346+ host : hostname ,
347+ tls : false
324348 }
325349 } ;
326350
327- if ( protocol === 'rediss:' ) {
328- parsed ! . socket ! . tls = true ;
329- } else if ( protocol !== 'redis:' ) {
351+ if ( protocol !== 'redis:' && protocol !== 'rediss:' ) {
330352 throw new TypeError ( 'Invalid protocol' ) ;
331353 }
332354
355+ parsed . socket . tls = protocol === 'rediss:' ;
356+
333357 if ( port ) {
334358 ( parsed . socket as TcpSocketConnectOpts ) . port = Number ( port ) ;
335359 }
@@ -464,15 +488,6 @@ export default class RedisClient<
464488 } ;
465489 }
466490
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-
476491 if ( options ?. database ) {
477492 this . _self . #selectedDB = options . database ;
478493 }
@@ -481,6 +496,10 @@ export default class RedisClient<
481496 this . _commandOptions = options . commandOptions ;
482497 }
483498
499+ if ( options ) {
500+ return RedisClient . parseOptions ( options ) ;
501+ }
502+
484503 return options ;
485504 }
486505
0 commit comments