From 2309d09ca1072b179dc0e06194f87f5393c2e7c2 Mon Sep 17 00:00:00 2001 From: Leibale Date: Thu, 15 Feb 2024 09:57:25 -0500 Subject: [PATCH] fix socket type issues --- packages/client/lib/cluster/cluster-slots.ts | 10 +- packages/client/lib/sentinel/index.ts | 114 +++++++++--------- packages/client/lib/sentinel/pub-sub-proxy.ts | 20 ++- 3 files changed, 68 insertions(+), 76 deletions(-) diff --git a/packages/client/lib/cluster/cluster-slots.ts b/packages/client/lib/cluster/cluster-slots.ts index f78dad984c..824cf2ae81 100644 --- a/packages/client/lib/cluster/cluster-slots.ts +++ b/packages/client/lib/cluster/cluster-slots.ts @@ -5,6 +5,7 @@ import { EventEmitter } from 'node:stream'; import { ChannelListeners, PUBSUB_TYPE, PubSubTypeListeners } from '../client/pub-sub'; import { RedisArgument, RedisFunctions, RedisModules, RedisScripts, RespVersions, TypeMapping } from '../RESP/types'; import calculateSlot from 'cluster-key-slot'; +import { RedisSocketOptions } from '../client/socket'; interface NodeAddress { host: string; @@ -102,8 +103,8 @@ export default class RedisClusterSlots< > { static #SLOTS = 16384; - readonly #options: RedisClusterOptions; - readonly #clientFactory: ReturnType>; + readonly #options; + readonly #clientFactory; readonly #emit: EventEmitter['emit']; slots = new Array>(RedisClusterSlots.#SLOTS); masters = new Array>(); @@ -271,7 +272,7 @@ export default class RedisClusterSlots< return { ...this.#options.defaults, ...options, - socket + socket: socket as RedisSocketOptions }; } @@ -316,8 +317,7 @@ export default class RedisClusterSlots< host: node.host, port: node.port }, - readonly, - RESP: this.#options.RESP + readonly }) ).on('error', err => console.error(err)); } diff --git a/packages/client/lib/sentinel/index.ts b/packages/client/lib/sentinel/index.ts index 3625304475..210bf954ea 100644 --- a/packages/client/lib/sentinel/index.ts +++ b/packages/client/lib/sentinel/index.ts @@ -649,19 +649,15 @@ class RedisSentinelInternal< } #createClient(node: RedisNode, clientOptions: RedisClientOptions, reconnectStrategy?: undefined | false) { - const options = { ...clientOptions } as RedisClientOptions; - - if (clientOptions.socket) { - options.socket = { ...clientOptions.socket }; - } else { - options.socket = {}; - } - - options.socket.host = node.host; - options.socket.port = node.port; - options.socket.reconnectStrategy = reconnectStrategy; - - return RedisClient.create(options); + return RedisClient.create({ + ...clientOptions, + socket: { + ...clientOptions.socket, + host: node.host, + port: node.port, + reconnectStrategy + } + }); } getClientLease(): ClientInfo | Promise { @@ -1332,16 +1328,16 @@ export class RedisSentinelFactory extends EventEmitter { async updateSentinelRootNodes() { for (const node of this.#sentinelRootNodes) { - const options: RedisClientOptions = { ...this.options.sentinelClientOptions }; - if (options.socket === undefined) { - options.socket = {}; - } - options.socket.host = node.host; - options.socket.port = node.port; - options.socket.reconnectStrategy = false; - options.modules = RedisSentinelModule; - - const client = RedisClient.create(options).on('error', (err) => this.emit(`updateSentinelRootNodes: ${err}`)); + const client = RedisClient.create({ + ...this.options.sentinelClientOptions, + socket: { + ...this.options.sentinelClientOptions?.socket, + host: node.host, + port: node.port, + reconnectStrategy: false + }, + modules: RedisSentinelModule + }).on('error', (err) => this.emit(`updateSentinelRootNodes: ${err}`)); try { await client.connect(); } catch { @@ -1367,16 +1363,16 @@ export class RedisSentinelFactory extends EventEmitter { let connected = false; for (const node of this.#sentinelRootNodes) { - const options: RedisClientOptions = { ...this.options.sentinelClientOptions }; - if (options.socket === undefined) { - options.socket = {}; - } - options.socket.host = node.host; - options.socket.port = node.port; - options.socket.reconnectStrategy = false; - options.modules = RedisSentinelModule; - - const client = RedisClient.create(options).on('error', err => this.emit(`getMasterNode: ${err}`)); + const client = RedisClient.create({ + ...this.options.sentinelClientOptions, + socket: { + ...this.options.sentinelClientOptions?.socket, + host: node.host, + port: node.port, + reconnectStrategy: false + }, + modules: RedisSentinelModule + }).on('error', err => this.emit(`getMasterNode: ${err}`)); try { await client.connect(); @@ -1412,30 +1408,30 @@ export class RedisSentinelFactory extends EventEmitter { async getMasterClient() { const master = await this.getMasterNode(); - const options: RedisClientOptions = { ...this.options.nodeClientOptions }; - if (options.socket === undefined) { - options.socket = {}; - } - options.socket.host = master.host; - options.socket.port = master.port; - - return RedisClient.create(options);; + return RedisClient.create({ + ...this.options.nodeClientOptions, + socket: { + ...this.options.nodeClientOptions?.socket, + host: master.host, + port: master.port + } + }); } async getReplicaNodes() { let connected = false; for (const node of this.#sentinelRootNodes) { - const options: RedisClientOptions = { ...this.options.sentinelClientOptions }; - if (options.socket === undefined) { - options.socket = {}; - } - options.socket.host = node.host; - options.socket.port = node.port; - options.socket.reconnectStrategy = false; - options.modules = RedisSentinelModule; - - const client = RedisClient.create(options).on('error', err => this.emit(`getReplicaNodes: ${err}`)); + const client = RedisClient.create({ + ...this.options.sentinelClientOptions, + socket: { + ...this.options.sentinelClientOptions?.socket, + host: node.host, + port: node.port, + reconnectStrategy: false + }, + modules: RedisSentinelModule + }).on('error', err => this.emit(`getReplicaNodes: ${err}`)); try { await client.connect(); @@ -1480,13 +1476,13 @@ export class RedisSentinelFactory extends EventEmitter { this.#replicaIdx = 0; } - const options: RedisClientOptions = { ...this.options.nodeClientOptions }; - if (options.socket === undefined) { - options.socket = {}; - } - options.socket.host = replicas[this.#replicaIdx].host; - options.socket.port = replicas[this.#replicaIdx].port; - - return RedisClient.create(options); + return RedisClient.create({ + ...this.options.nodeClientOptions, + socket: { + ...this.options.nodeClientOptions?.socket, + host: replicas[this.#replicaIdx].host, + port: replicas[this.#replicaIdx].port + } + }); } } diff --git a/packages/client/lib/sentinel/pub-sub-proxy.ts b/packages/client/lib/sentinel/pub-sub-proxy.ts index a27f6e50c9..68a6c3b58e 100644 --- a/packages/client/lib/sentinel/pub-sub-proxy.ts +++ b/packages/client/lib/sentinel/pub-sub-proxy.ts @@ -45,18 +45,14 @@ export class PubSubProxy extends EventEmitter { throw new Error("pubSubProxy: didn't define node to do pubsub against"); } - const options = { ...this.#clientOptions }; - - if (this.#clientOptions.socket) { - options.socket = { ...this.#clientOptions.socket }; - } else { - options.socket = {}; - } - - options.socket.host = this.#node.host; - options.socket.port = this.#node.port; - - return new RedisClient(options); + return new RedisClient({ + ...this.#clientOptions, + socket: { + ...this.#clientOptions.socket, + host: this.#node.host, + port: this.#node.port + } + }); } async #initiatePubSubClient(withSubscriptions = false) {