import { z } from 'zod';
/**
* Configuration schema for the bridge
*/
export const ConfigSchema = z.object({
bridge: z.object({
privateKey: z.string().regex(/^[0-9a-f]{64}$/i, 'Invalid hex private key'),
port: z.number().default(4000),
host: z.string().default('0.0.0.0'),
logLevel: z.enum(['debug', 'info', 'warn', 'error']).default('info'),
}),
relay: z.object({
url: z.string().url(),
urlExternal: z.string().url().optional(),
}),
mcp: z.object({
encryptionMode: z.enum(['OPTIONAL', 'REQUIRED', 'DISABLED']).default('OPTIONAL'),
publicAnnouncement: z.boolean().default(true),
}),
dvm: z.object({
responseTimeout: z.number().default(30000),
}),
api: z.object({
baseUrl: z.string().url().optional(),
}),
rateLimit: z.object({
enabled: z.boolean().default(true),
maxRequests: z.number().default(100),
windowMs: z.number().default(60000),
}),
});
export type Config = z.infer<typeof ConfigSchema>;
/**
* Load configuration from environment variables
*/
export function loadConfig(): Config {
const config: Config = {
bridge: {
privateKey: process.env.BRIDGE_PRIVATE_KEY || '',
port: parseInt(process.env.BRIDGE_PORT || '4000'),
host: process.env.BRIDGE_HOST || '0.0.0.0',
logLevel: (process.env.LOG_LEVEL as any) || 'info',
},
relay: {
url: process.env.RELAY_URL || 'ws://localhost:8080',
urlExternal: process.env.RELAY_URL_EXTERNAL,
},
mcp: {
encryptionMode: (process.env.MCP_ENCRYPTION_MODE as any) || 'OPTIONAL',
publicAnnouncement: process.env.MCP_PUBLIC_ANNOUNCEMENT !== 'false',
},
dvm: {
responseTimeout: parseInt(process.env.DVM_RESPONSE_TIMEOUT || '30000'),
},
api: {
baseUrl: process.env.API_BASE_URL,
},
rateLimit: {
enabled: process.env.RATE_LIMIT_ENABLED !== 'false',
maxRequests: parseInt(process.env.RATE_LIMIT_MAX_REQUESTS || '100'),
windowMs: parseInt(process.env.RATE_LIMIT_WINDOW_MS || '60000'),
},
};
// Validate config
return ConfigSchema.parse(config);
}