mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-17 21:15:32 +09:00
52 lines
1.3 KiB
TypeScript
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;
|
|
}
|