P5 阶段交付物: - services/msg: 消息通知服务(NestJS) - notifications: 发送通知 + ES 全文检索 + search - config/elasticsearch.ts: ES Client 单例 - package.json: 补充 @opentelemetry/sdk-node + exporter-trace-otlp-http - services/push-gateway: WebSocket 推送网关(Go Gin) - internal/hub/hub.go: WebSocket 连接池管理(Register/Unregister/SendToUser) - internal/ws/handler.go: JWT 鉴权 + WebSocket 升级 + 内部推送 API - services/ai: AI 辅助服务(Python FastAPI) - /chat + /chat/stream(SSE 流式) - /generate/question + /optimize/expression - config.py: OpenAI 兼容 API 配置 - packages/shared-proto/proto/msg.proto: NotificationService 契约(send/search) - packages/shared-proto/proto/ai.proto: AiService 契约(含 stream 方法)
32 lines
911 B
TypeScript
32 lines
911 B
TypeScript
import 'reflect-metadata';
|
|
import { NestFactory } from '@nestjs/core';
|
|
import { AppModule } from './app.module.js';
|
|
import { GlobalErrorFilter } from './shared/errors/global-error.filter.js';
|
|
import { initTracer, shutdownTracer } from './shared/observability/tracer.js';
|
|
import { env } from './config/env.js';
|
|
import { logger } from './shared/observability/logger.js';
|
|
|
|
async function bootstrap(): Promise<void> {
|
|
initTracer();
|
|
|
|
const app = await NestFactory.create(AppModule, {
|
|
logger: ['log', 'error', 'warn'],
|
|
});
|
|
|
|
app.useGlobalFilters(new GlobalErrorFilter());
|
|
app.enableShutdownHooks();
|
|
|
|
await app.listen(env.PORT);
|
|
logger.info({ port: env.PORT }, 'Msg service started');
|
|
|
|
process.on('SIGTERM', async () => {
|
|
await app.close();
|
|
await shutdownTracer();
|
|
});
|
|
}
|
|
|
|
bootstrap().catch((err: unknown) => {
|
|
logger.error({ err }, 'Failed to start msg service');
|
|
process.exit(1);
|
|
});
|