UNPKG

@gftdcojp/ksqldb-orm

Version:

ksqldb-orm - Server-Side TypeScript ORM for ksqlDB with enterprise security extensions

285 lines 8.99 kB
"use strict"; /** * 環境検出ユーティリティ */ Object.defineProperty(exports, "__esModule", { value: true }); exports.isNode = isNode; exports.isNextJS = isNextJS; exports.isServerSide = isServerSide; exports.isDevelopment = isDevelopment; exports.isProduction = isProduction; exports.getEnvVar = getEnvVar; exports.getRequiredEnvVar = getRequiredEnvVar; exports.validateEnvironmentVariables = validateEnvironmentVariables; exports.validateAndLogEnvironment = validateAndLogEnvironment; exports.getEnvironmentInfo = getEnvironmentInfo; const logger_1 = require("./logger"); /** * アプリケーションで使用する環境変数の定義 */ const ENV_VARS_CONFIG = { GFTD_JWT_SECRET: { required: true, description: 'JWT署名用の秘密鍵(64文字以上推奨)', validator: (value) => value.length >= 32, securityLevel: 'critical' }, GFTD_KSQLDB_URL: { required: true, description: 'ksqlDBサーバーのURL', validator: (value) => { try { const url = new URL(value); return url.protocol === 'https:' || url.protocol === 'http:'; } catch { return false; } }, securityLevel: 'high' }, GFTD_KSQLDB_API_KEY: { required: false, description: 'ksqlDB API認証キー', securityLevel: 'high' }, GFTD_KSQLDB_API_SECRET: { required: false, description: 'ksqlDB API認証シークレット', securityLevel: 'high' }, GFTD_JWT_EXPIRES_IN: { required: false, description: 'JWTアクセストークンの有効期限', defaultValue: '15m', validator: (value) => /^\d+[smhd]$/.test(value), securityLevel: 'medium' }, GFTD_JWT_REFRESH_EXPIRES_IN: { required: false, description: 'JWTリフレッシュトークンの有効期限', defaultValue: '7d', validator: (value) => /^\d+[smhd]$/.test(value), securityLevel: 'medium' }, GFTD_JWT_ISSUER: { required: false, description: 'JWT発行者', defaultValue: 'gftd-orm', securityLevel: 'low' }, GFTD_JWT_AUDIENCE: { required: false, description: 'JWT対象者', defaultValue: 'gftd-orm-client', securityLevel: 'low' }, GFTD_CORS_ORIGINS: { required: false, description: 'CORS許可オリジン(カンマ区切り)', validator: (value) => { const origins = value.split(','); return origins.every(origin => { try { new URL(origin.trim()); return true; } catch { return origin.trim() === '*' || origin.trim() === 'localhost'; } }); }, securityLevel: 'high' }, NODE_ENV: { required: false, description: 'アプリケーション実行環境', defaultValue: 'development', validator: (value) => ['development', 'production', 'test'].includes(value), securityLevel: 'medium' }, GFTD_LOG_LEVEL: { required: false, description: 'ログレベル', defaultValue: 'info', validator: (value) => ['debug', 'info', 'warn', 'error'].includes(value), securityLevel: 'low' } }; /** * Node.js環境かどうかを判定 */ function isNode() { return typeof process !== 'undefined' && process.versions && Boolean(process.versions.node); } /** * Next.js環境かどうかを判定 */ function isNextJS() { try { return typeof process !== 'undefined' && process.env && process.env.NEXT_RUNTIME !== undefined; } catch { return false; } } /** * サーバーサイド環境かどうかを判定 */ function isServerSide() { return isNode(); } /** * 開発環境かどうかを判定 */ function isDevelopment() { try { return typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'development'; } catch { return false; } } /** * 本番環境かどうかを判定 */ function isProduction() { try { return typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'production'; } catch { return false; } } /** * 環境変数を安全に取得 * @param key 環境変数名 * @param defaultValue デフォルト値 */ function getEnvVar(key, defaultValue) { try { if (typeof process !== 'undefined' && process.env) { return process.env[key] || defaultValue; } return defaultValue; } catch { return defaultValue; } } /** * 必須環境変数を取得(存在しない場合はエラー) * @param key 環境変数名 * @param errorMessage エラーメッセージ */ function getRequiredEnvVar(key, errorMessage) { const value = getEnvVar(key); if (!value) { throw new Error(errorMessage || `Required environment variable ${key} is not set`); } return value; } /** * 環境変数の検証を実行 * @param envVarsConfig 検証設定(省略時はデフォルト設定を使用) */ function validateEnvironmentVariables(envVarsConfig = ENV_VARS_CONFIG) { const result = { valid: true, errors: [], warnings: [], securityIssues: [], missingRequired: [], invalidValues: [] }; // サーバーサイドでのみ検証を実行 if (!isServerSide()) { return result; } for (const [key, config] of Object.entries(envVarsConfig)) { const value = getEnvVar(key, config.defaultValue); // 必須チェック if (config.required && !value) { result.errors.push(`Required environment variable ${key} is missing: ${config.description}`); result.missingRequired.push(key); result.valid = false; continue; } // 値の検証 if (value && config.validator && !config.validator(value)) { result.errors.push(`Invalid value for environment variable ${key}: ${config.description}`); result.invalidValues.push(key); result.valid = false; } // セキュリティレベルチェック if (config.securityLevel === 'critical' && !value) { result.securityIssues.push(`CRITICAL: ${key} must be set for security: ${config.description}`); } else if (config.securityLevel === 'high' && !value) { result.securityIssues.push(`HIGH: ${key} should be set for security: ${config.description}`); } } // 本番環境での追加チェック if (isProduction()) { // 本番環境でのHTTPS必須チェック const dbUrl = getEnvVar('GFTD_KSQLDB_URL'); if (dbUrl && !dbUrl.startsWith('https://')) { result.securityIssues.push('CRITICAL: GFTD_KSQLDB_URL should use HTTPS in production'); } // 本番環境でのCORS設定チェック const corsOrigins = getEnvVar('GFTD_CORS_ORIGINS'); if (!corsOrigins || corsOrigins.includes('*')) { result.securityIssues.push('HIGH: GFTD_CORS_ORIGINS should not allow all origins (*) in production'); } // 本番環境でのログレベルチェック const logLevel = getEnvVar('GFTD_LOG_LEVEL', 'info'); if (logLevel === 'debug') { result.warnings.push('WARNING: Debug logging enabled in production may expose sensitive information'); } } return result; } /** * 環境変数の検証を実行し、結果をログ出力 */ function validateAndLogEnvironment() { const result = validateEnvironmentVariables(); if (result.errors.length > 0) { logger_1.log.error('Environment validation failed', { errors: result.errors }); } if (result.warnings.length > 0) { result.warnings.forEach(warning => logger_1.log.warn(warning)); } if (result.securityIssues.length > 0) { result.securityIssues.forEach(issue => { if (issue.startsWith('CRITICAL')) { logger_1.log.error(issue); } else { logger_1.log.warn(issue); } }); } if (result.valid) { logger_1.log.info('Environment validation passed'); } else { logger_1.log.error('Environment validation failed - please check configuration'); } return result.valid; } /** * 環境情報を取得 */ function getEnvironmentInfo() { const isNodeEnv = isNode(); return { isNode: isNodeEnv, isNextJS: isNextJS(), isServerSide: isServerSide(), isDevelopment: isDevelopment(), isProduction: isProduction(), platform: isNodeEnv ? 'node' : 'unknown', }; } //# sourceMappingURL=env.js.map