Files
fluxer/fluxer_api/pkgs/kv_client/src/KVClientConfig.ts
T

52 lines
1.3 KiB
TypeScript

// SPDX-License-Identifier: AGPL-3.0-or-later
import {DEFAULT_KV_TIMEOUT_MS} from '@fluxer/constants/src/Timeouts';
export interface IKVLogger {
debug(obj: object, msg?: string): void;
error(obj: object, msg?: string): void;
}
export type KVClientMode = 'standalone' | 'cluster';
export interface KVClientConfig {
url: string;
mode?: KVClientMode;
timeoutMs?: number;
logger?: IKVLogger;
}
export interface ResolvedKVClientConfig {
url: string;
mode: KVClientMode;
timeoutMs: number;
logger: IKVLogger;
}
const noopLogger: IKVLogger = {
debug() {},
error() {},
};
export function resolveKVClientConfig(config: KVClientConfig | string): ResolvedKVClientConfig {
const options: KVClientConfig = typeof config === 'string' ? {url: config} : config;
return {
url: normalizeUrl(options.url),
mode: options.mode ?? 'standalone',
timeoutMs: options.timeoutMs ?? DEFAULT_KV_TIMEOUT_MS,
logger: options.logger ?? noopLogger,
};
}
function normalizeUrl(url: string): string {
const trimmed = url.trim();
if (trimmed.length === 0) {
throw new Error('KV client URL must not be empty');
}
const query = new URLSearchParams(trimmed.match(/^[^?#]*(\?[^#]*)/)?.[1]);
if (query.has('stringNumbers')) {
throw new Error('KV client URLs do not support stringNumbers; numeric replies are required');
}
return trimmed;
}