@gftdcojp/ksqldb-orm
Version:
ksqldb-orm - Server-Side TypeScript ORM for ksqlDB with enterprise security extensions
285 lines • 8.99 kB
JavaScript
;
/**
* 環境検出ユーティリティ
*/
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