@gftdcojp/gftd-orm
Version:
Enterprise-grade real-time data platform with ksqlDB, inspired by Supabase architecture
188 lines • 4.96 kB
JavaScript
/**
* クライアントサイド専用設定管理
* process.env を使わずに設定を管理
*/
import { isBrowser } from './utils/env';
/**
* グローバル設定のキャッシュ
*/
let globalClientConfig = null;
/**
* ブラウザ環境検証
*/
function validateBrowserEnvironment() {
if (!isBrowser()) {
throw new Error('Client configuration can only be used in browser environment');
}
}
/**
* クライアント設定を設定
*/
export function setClientConfig(config) {
validateBrowserEnvironment();
globalClientConfig = { ...config };
}
/**
* クライアント設定を取得
*/
export function getClientConfig() {
validateBrowserEnvironment();
return globalClientConfig;
}
/**
* 必須設定を取得(エラーチェック付き)
*/
export function getRequiredClientConfig() {
const config = getClientConfig();
if (!config) {
throw new Error('Client configuration is not set. Call setClientConfig() first.');
}
return config;
}
/**
* データベース設定を取得
*/
export function getDatabaseConfig() {
const config = getRequiredClientConfig();
if (!config.database) {
throw new Error('Database configuration is not set');
}
return config.database;
}
/**
* ksqlDB設定を取得
*/
export function getKsqlDbConfig() {
const dbConfig = getDatabaseConfig();
if (!dbConfig.ksql) {
throw new Error('ksqlDB configuration is not set');
}
return dbConfig.ksql;
}
/**
* Schema Registry設定を取得
*/
export function getSchemaRegistryConfig() {
const dbConfig = getDatabaseConfig();
if (!dbConfig.schemaRegistry) {
throw new Error('Schema Registry configuration is not set');
}
return dbConfig.schemaRegistry;
}
/**
* リアルタイム設定を取得
*/
export function getRealtimeConfig() {
const config = getRequiredClientConfig();
if (!config.realtime) {
throw new Error('Realtime configuration is not set');
}
return config.realtime;
}
/**
* グローバル設定を取得
*/
export function getGlobalConfig() {
const config = getRequiredClientConfig();
return config.global || {};
}
/**
* デフォルト設定を作成
*/
export function createDefaultConfig(baseUrl) {
return {
url: baseUrl,
database: {
ksql: {
url: baseUrl,
},
schemaRegistry: {
url: baseUrl.replace(':8088', ':8081'), // デフォルトポート変更
},
},
realtime: {
url: baseUrl.replace('http', 'ws'),
autoReconnect: true,
reconnectInterval: 1000,
maxReconnectAttempts: 5,
},
global: {
timeout: 30000,
retries: 3,
},
};
}
/**
* 設定を検証
*/
export function validateClientConfig(config) {
if (!config.url) {
throw new Error('Base URL is required');
}
if (config.database) {
if (config.database.ksql && !config.database.ksql.url) {
throw new Error('ksqlDB URL is required');
}
if (config.database.schemaRegistry && !config.database.schemaRegistry.url) {
throw new Error('Schema Registry URL is required');
}
}
if (config.realtime && !config.realtime.url) {
throw new Error('Realtime URL is required');
}
}
/**
* 設定を初期化
*/
export function initializeClientConfig(config) {
validateClientConfig(config);
setClientConfig(config);
}
/**
* 設定をリセット
*/
export function resetClientConfig() {
globalClientConfig = null;
}
/**
* 設定が初期化されているかチェック
*/
export function isClientConfigInitialized() {
return globalClientConfig !== null;
}
/**
* 設定をマージ
*/
export function mergeClientConfig(additionalConfig) {
const currentConfig = getClientConfig();
if (currentConfig) {
const mergedConfig = {
...currentConfig,
...additionalConfig,
};
// 個別にマージが必要な場合のみ処理
if (currentConfig.database && additionalConfig.database) {
mergedConfig.database = {
...currentConfig.database,
...additionalConfig.database,
};
}
if (currentConfig.realtime && additionalConfig.realtime) {
mergedConfig.realtime = {
...currentConfig.realtime,
...additionalConfig.realtime,
};
}
if (currentConfig.global && additionalConfig.global) {
mergedConfig.global = {
...currentConfig.global,
...additionalConfig.global,
};
}
setClientConfig(mergedConfig);
}
else {
throw new Error('Cannot merge configuration: no base configuration set');
}
}
//# sourceMappingURL=client-config.js.map