diff --git a/src/lock-ops.mjs b/src/lock-ops.mjs index 32891b6..32d923b 100644 --- a/src/lock-ops.mjs +++ b/src/lock-ops.mjs @@ -8,7 +8,7 @@ import { KIND_APP_DATA, MS_PER_SECOND, } from './constants.mjs'; -import { nowUnix } from './utils.mjs'; +import { nowUnix, mergeRelayList } from './utils.mjs'; import { defaultHealthManager, buildRelayHealthConfig, RelayHealthManager } from './relay-health-manager.mjs'; import { publishLock, LockPublisher, secureRandom } from './lock-publisher.mjs'; @@ -69,10 +69,6 @@ function relayListLabel(relays) { return relays.join(', '); } -function mergeRelayList(primaryRelays, fallbackRelays) { - return [...new Set([...primaryRelays, ...fallbackRelays])]; -} - /** * Queries relays for active lock events matching the criteria. * Uses a tiered approach: tries primary relays first, then falls back to others if needed. diff --git a/src/lock-publisher.mjs b/src/lock-publisher.mjs index b506f1b..99f21e7 100644 --- a/src/lock-publisher.mjs +++ b/src/lock-publisher.mjs @@ -6,6 +6,7 @@ import { getRelayFallbacks, getMinActiveRelayPool, } from './torch-config.mjs'; +import { mergeRelayList } from './utils.mjs'; import { defaultHealthManager, buildRelayHealthConfig } from './relay-health-manager.mjs'; function withTimeout(promise, timeoutMs, timeoutMessage) { @@ -22,10 +23,6 @@ function relayListLabel(relays) { return relays.join(', '); } -function mergeRelayList(primaryRelays, fallbackRelays) { - return [...new Set([...primaryRelays, ...fallbackRelays])]; -} - const PUBLISH_ERROR_CODES = { TIMEOUT: 'publish_timeout', DNS: 'dns_resolution', diff --git a/src/utils.mjs b/src/utils.mjs index af844e2..eae7ed9 100644 --- a/src/utils.mjs +++ b/src/utils.mjs @@ -42,6 +42,10 @@ export function detectPlatform() { return null; } +export function mergeRelayList(primaryRelays, fallbackRelays) { + return [...new Set([...primaryRelays, ...fallbackRelays])]; +} + export function ensureDir(dir) { if (!fs.existsSync(dir)) { fs.mkdirSync(dir, { recursive: true }); diff --git a/test/utils.test.mjs b/test/utils.test.mjs index b2d2785..0c59f6a 100644 --- a/test/utils.test.mjs +++ b/test/utils.test.mjs @@ -2,7 +2,7 @@ import { describe, it, after } from 'node:test'; import assert from 'node:assert'; import fs from 'node:fs'; import path from 'node:path'; -import { getIsoWeekStr, todayDateStr, nowUnix, ensureDir, detectPlatform } from '../src/utils.mjs'; +import { getIsoWeekStr, todayDateStr, nowUnix, ensureDir, detectPlatform, mergeRelayList } from '../src/utils.mjs'; describe('Date Utilities', () => { describe('todayDateStr', () => { @@ -59,6 +59,23 @@ describe('Date Utilities', () => { }); }); +describe('Relay Utilities', () => { + describe('mergeRelayList', () => { + it('merges two lists of relays without duplicates', () => { + const primary = ['wss://relay1.com', 'wss://relay2.com']; + const fallback = ['wss://relay2.com', 'wss://relay3.com']; + const merged = mergeRelayList(primary, fallback); + assert.deepStrictEqual(merged, ['wss://relay1.com', 'wss://relay2.com', 'wss://relay3.com']); + }); + + it('handles empty lists', () => { + assert.deepStrictEqual(mergeRelayList([], []), []); + assert.deepStrictEqual(mergeRelayList(['wss://relay1.com'], []), ['wss://relay1.com']); + assert.deepStrictEqual(mergeRelayList([], ['wss://relay1.com']), ['wss://relay1.com']); + }); + }); +}); + describe('Platform Utilities', () => { describe('detectPlatform', () => { const originalEnv = { ...process.env };