From 5a52532c993fa2415ad24d007d91168bfe4059a0 Mon Sep 17 00:00:00 2001 From: Francis Dinh Date: Mon, 19 Sep 2022 23:50:48 -0400 Subject: [PATCH 1/4] allow redis family to be specified as a string This makes it consistent with `outgoingAddressFamily`, reducing potential confusion. For compatibility reasons, numbers are still permitted for `redis.family` with the following mapping: - `dual` = `0` - `ipv4` = `4` - `ipv6` = `6` Changelog: Changed --- .config/example.yml | 2 +- packages/backend/src/config/types.ts | 11 ++++++++--- packages/backend/src/db/redis.ts | 14 ++++++++++++-- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/.config/example.yml b/.config/example.yml index 03ee6e272..e206ccd34 100644 --- a/.config/example.yml +++ b/.config/example.yml @@ -57,7 +57,7 @@ db: redis: host: localhost port: 6379 - #family: 0 # 0=Both, 4=IPv4, 6=IPv6 + #family: dual # can be either a number or string (0/dual, 4/ipv4, 6/ipv6) #pass: example-pass #prefix: example-prefix #db: 1 diff --git a/packages/backend/src/config/types.ts b/packages/backend/src/config/types.ts index 89eafb093..cd74df343 100644 --- a/packages/backend/src/config/types.ts +++ b/packages/backend/src/config/types.ts @@ -1,5 +1,10 @@ /** - * ユーザーが設定する必要のある情報 + * IP address family + */ +export type IpFamily = 'ipv4' | 'ipv6' | 'dual'; + +/** + * Configuration options set up by the user */ export type Source = { repository_url?: string; @@ -19,7 +24,7 @@ export type Source = { redis: { host: string; port: number; - family?: number; + family?: number | IpFamily; pass: string; db?: number; prefix?: string; @@ -47,7 +52,7 @@ export type Source = { id: string; - outgoingAddressFamily?: 'ipv4' | 'ipv6' | 'dual'; + outgoingAddressFamily?: IpFamily; deliverJobConcurrency?: number; inboxJobConcurrency?: number; diff --git a/packages/backend/src/db/redis.ts b/packages/backend/src/db/redis.ts index cd9c81eb3..e576f5e35 100644 --- a/packages/backend/src/db/redis.ts +++ b/packages/backend/src/db/redis.ts @@ -1,11 +1,21 @@ import Redis from 'ioredis'; import config from '@/config/index.js'; +import { IpFamily } from '@/config/types.js'; -export function createConnection() { +function getRedisFamily(family?: IpFamily | number): number { + switch (family) { + case 'ipv4': return 4; + case 'ipv6': return 6; + case 'dual': return 0; + default: return family ?? 0; + } +} + +export function createConnection(): Redis.Redis { return new Redis({ port: config.redis.port, host: config.redis.host, - family: config.redis.family ?? 0, + family: getRedisFamily(config.redis.family), password: config.redis.pass, keyPrefix: `${config.redis.prefix}:`, db: config.redis.db || 0, From 508748ac0d25e3e754693188af584f4de3ea21d2 Mon Sep 17 00:00:00 2001 From: Francis Dinh Date: Wed, 21 Sep 2022 09:55:05 -0400 Subject: [PATCH 2/4] backend: refactor Redis option loading --- packages/backend/src/config/redis.ts | 35 ++++++++++++++++++++++++ packages/backend/src/db/postgre.ts | 10 ++----- packages/backend/src/db/redis.ts | 20 ++------------ packages/backend/src/queue/initialize.ts | 11 ++------ 4 files changed, 42 insertions(+), 34 deletions(-) create mode 100644 packages/backend/src/config/redis.ts diff --git a/packages/backend/src/config/redis.ts b/packages/backend/src/config/redis.ts new file mode 100644 index 000000000..fa4b7a2f5 --- /dev/null +++ b/packages/backend/src/config/redis.ts @@ -0,0 +1,35 @@ +import Logger from '@/services/logger.js'; +import { IpFamily } from './types.js'; +import config from './index.js'; + +const logger = new Logger('config:redis', 'gray', false); + +function getRedisFamily(family?: IpFamily | number): number { + const familyMap = { + ipv4: 4, + ipv6: 6, + dual: 0, + }; + if (typeof family === 'string' && family in familyMap) { + return familyMap[family]; + } else if (typeof family === 'number' && Object.values(familyMap).includes(family)) { + return family; + } + + if (typeof family !== 'undefined') { + logger.warn(`redis family "${family}" is invalid, defaulting to "both"`); + } + + return 0; +} + +export function getRedisOptions(keyPrefix?: string): Record { + return { + port: config.redis.port, + host: config.redis.host, + family: getRedisFamily(config.redis.family), + password: config.redis.pass, + db: config.redis.db || 0, + keyPrefix, + }; +} diff --git a/packages/backend/src/db/postgre.ts b/packages/backend/src/db/postgre.ts index 363671268..ec56fb54f 100644 --- a/packages/backend/src/db/postgre.ts +++ b/packages/backend/src/db/postgre.ts @@ -68,6 +68,7 @@ import { UserPending } from '@/models/entities/user-pending.js'; import { entities as charts } from '@/services/chart/entities.js'; import { Webhook } from '@/models/entities/webhook.js'; +import { getRedisOptions } from '@/config/redis.js'; import { dbLogger } from './logger.js'; import { redisClient } from './redis.js'; @@ -186,14 +187,7 @@ export const db = new DataSource({ dropSchema: process.env.NODE_ENV === 'test', cache: !config.db.disableCache ? { type: 'ioredis', - options: { - host: config.redis.host, - port: config.redis.port, - family: config.redis.family ?? 0, - password: config.redis.pass, - keyPrefix: `${config.redis.prefix}:query:`, - db: config.redis.db || 0, - }, + options: getRedisOptions(`${config.redis.prefix}:query:`), } : false, logging: log, logger: log ? new MyCustomLogger() : undefined, diff --git a/packages/backend/src/db/redis.ts b/packages/backend/src/db/redis.ts index e576f5e35..f4eadce58 100644 --- a/packages/backend/src/db/redis.ts +++ b/packages/backend/src/db/redis.ts @@ -1,25 +1,9 @@ import Redis from 'ioredis'; import config from '@/config/index.js'; -import { IpFamily } from '@/config/types.js'; - -function getRedisFamily(family?: IpFamily | number): number { - switch (family) { - case 'ipv4': return 4; - case 'ipv6': return 6; - case 'dual': return 0; - default: return family ?? 0; - } -} +import { getRedisOptions } from '@/config/redis.js'; export function createConnection(): Redis.Redis { - return new Redis({ - port: config.redis.port, - host: config.redis.host, - family: getRedisFamily(config.redis.family), - password: config.redis.pass, - keyPrefix: `${config.redis.prefix}:`, - db: config.redis.db || 0, - }); + return new Redis(getRedisOptions(`${config.redis.prefix}:`)); } export const subscriber = createConnection(); diff --git a/packages/backend/src/queue/initialize.ts b/packages/backend/src/queue/initialize.ts index 4f251388b..10f47de12 100644 --- a/packages/backend/src/queue/initialize.ts +++ b/packages/backend/src/queue/initialize.ts @@ -1,15 +1,10 @@ import Bull from 'bull'; import config from '@/config/index.js'; +import { getRedisOptions } from '@/config/redis.js'; -export function initialize(name: string, limitPerSec = -1) { +export function initialize(name: string, limitPerSec = -1): Bull.Queue { return new Bull(name, { - redis: { - port: config.redis.port, - host: config.redis.host, - family: config.redis.family ?? 0, - password: config.redis.pass, - db: config.redis.db || 0, - }, + redis: getRedisOptions(), prefix: config.redis.prefix ? `${config.redis.prefix}:queue` : 'queue', limiter: limitPerSec > 0 ? { max: limitPerSec, From 29164740b9f851c87d1bba04758a7d2687ee94e4 Mon Sep 17 00:00:00 2001 From: Francis Dinh Date: Wed, 21 Sep 2022 11:45:45 -0400 Subject: [PATCH 3/4] fix warning message --- packages/backend/src/config/redis.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/src/config/redis.ts b/packages/backend/src/config/redis.ts index fa4b7a2f5..f61f19327 100644 --- a/packages/backend/src/config/redis.ts +++ b/packages/backend/src/config/redis.ts @@ -17,7 +17,7 @@ function getRedisFamily(family?: IpFamily | number): number { } if (typeof family !== 'undefined') { - logger.warn(`redis family "${family}" is invalid, defaulting to "both"`); + logger.warn(`redis family "${family}" is invalid, defaulting to "dual"`); } return 0; From 8ca544c45df952fa4dac225483adf7f6eff373c5 Mon Sep 17 00:00:00 2001 From: Francis Dinh Date: Fri, 30 Sep 2022 11:05:34 -0400 Subject: [PATCH 4/4] remove outgoingAddressFamily --- .config/example.yml | 3 --- packages/backend/src/config/redis.ts | 3 +-- packages/backend/src/config/types.ts | 9 +-------- 3 files changed, 2 insertions(+), 13 deletions(-) diff --git a/.config/example.yml b/.config/example.yml index e206ccd34..85ab0e141 100644 --- a/.config/example.yml +++ b/.config/example.yml @@ -93,9 +93,6 @@ redis: # deliverJobMaxAttempts: 12 # inboxJobMaxAttempts: 8 -# IP address family used for outgoing requests (ipv4, ipv6 or dual) -#outgoingAddressFamily: ipv4 - # Syslog option #syslog: # host: localhost diff --git a/packages/backend/src/config/redis.ts b/packages/backend/src/config/redis.ts index f61f19327..b234ff689 100644 --- a/packages/backend/src/config/redis.ts +++ b/packages/backend/src/config/redis.ts @@ -1,10 +1,9 @@ import Logger from '@/services/logger.js'; -import { IpFamily } from './types.js'; import config from './index.js'; const logger = new Logger('config:redis', 'gray', false); -function getRedisFamily(family?: IpFamily | number): number { +function getRedisFamily(family?: string | number): number { const familyMap = { ipv4: 4, ipv6: 6, diff --git a/packages/backend/src/config/types.ts b/packages/backend/src/config/types.ts index cd74df343..a359c7b0b 100644 --- a/packages/backend/src/config/types.ts +++ b/packages/backend/src/config/types.ts @@ -1,8 +1,3 @@ -/** - * IP address family - */ -export type IpFamily = 'ipv4' | 'ipv6' | 'dual'; - /** * Configuration options set up by the user */ @@ -24,7 +19,7 @@ export type Source = { redis: { host: string; port: number; - family?: number | IpFamily; + family?: number | 'dual' | 'ipv4' | 'ipv6'; pass: string; db?: number; prefix?: string; @@ -52,8 +47,6 @@ export type Source = { id: string; - outgoingAddressFamily?: IpFamily; - deliverJobConcurrency?: number; inboxJobConcurrency?: number; deliverJobPerSec?: number;