feat(M06-A): 建立MQTT连接与Broker基础

This commit is contained in:
Codex
2026-06-22 17:25:33 +08:00
parent a8c3e7d2fe
commit c140613718
15 changed files with 875 additions and 36 deletions
+21 -3
View File
@@ -21,8 +21,12 @@ const configSchema = z.object({
QIPAI_PROFIT_SHARE_MOCK_ENABLED: z.enum(['true', 'false']).default('false'),
QIPAI_THIRD_PARTY_CREDENTIALS: z.string().default('{}'),
QIPAI_MQTT_URL: z.string().url().default('mqtt://101.42.38.246:1883'),
QIPAI_MQTT_CLIENT_ID: z.string().min(1).max(128).default('qipai-backend'),
QIPAI_MQTT_USERNAME: z.string().default(''),
QIPAI_MQTT_PASSWORD: z.string().default('')
QIPAI_MQTT_PASSWORD: z.string().default(''),
QIPAI_MQTT_RECONNECT_MS: z.coerce.number().int().min(1000).max(60000).default(3000),
QIPAI_MQTT_CONNECT_TIMEOUT_MS: z.coerce.number().int().min(1000).max(60000).default(10000),
QIPAI_MQTT_MAX_MESSAGE_BYTES: z.coerce.number().int().min(1024).max(1048576).default(65536)
});
export type AppConfig = ReturnType<typeof loadConfig>;
@@ -35,6 +39,14 @@ export function loadConfig(env: NodeJS.ProcessEnv = process.env) {
) {
throw new Error('QIPAI_JWT_SECRET must be explicitly configured in production.');
}
const mqttUsernameConfigured = parsed.QIPAI_MQTT_USERNAME.length > 0;
const mqttPasswordConfigured = parsed.QIPAI_MQTT_PASSWORD.length > 0;
if (mqttUsernameConfigured !== mqttPasswordConfigured) {
throw new Error('QIPAI_MQTT_USERNAME and QIPAI_MQTT_PASSWORD must be configured together.');
}
if (parsed.NODE_ENV === 'production' && !mqttUsernameConfigured) {
throw new Error('MQTT credentials must be explicitly configured in production.');
}
return {
nodeEnv: parsed.NODE_ENV,
@@ -69,8 +81,14 @@ export function loadConfig(env: NodeJS.ProcessEnv = process.env) {
},
mqtt: {
url: parsed.QIPAI_MQTT_URL,
usernameConfigured: parsed.QIPAI_MQTT_USERNAME.length > 0,
passwordConfigured: parsed.QIPAI_MQTT_PASSWORD.length > 0
clientId: parsed.QIPAI_MQTT_CLIENT_ID,
username: parsed.QIPAI_MQTT_USERNAME,
credential: parsed.QIPAI_MQTT_PASSWORD,
usernameConfigured: mqttUsernameConfigured,
passwordConfigured: mqttPasswordConfigured,
reconnectPeriodMs: parsed.QIPAI_MQTT_RECONNECT_MS,
connectTimeoutMs: parsed.QIPAI_MQTT_CONNECT_TIMEOUT_MS,
maxMessageBytes: parsed.QIPAI_MQTT_MAX_MESSAGE_BYTES
}
};
}