@dofe/infra-shared-services 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/email/dto/email.dto.d.ts +70 -0
- package/dist/email/dto/email.dto.d.ts.map +1 -0
- package/dist/email/dto/email.dto.js +58 -0
- package/dist/email/dto/email.dto.js.map +1 -0
- package/dist/email/email.module.d.ts +3 -0
- package/dist/email/email.module.d.ts.map +1 -0
- package/dist/email/email.module.js +38 -0
- package/dist/email/email.module.js.map +1 -0
- package/dist/email/email.service.d.ts +61 -0
- package/dist/email/email.service.d.ts.map +1 -0
- package/dist/email/email.service.js +191 -0
- package/dist/email/email.service.js.map +1 -0
- package/dist/email/index.d.ts +5 -0
- package/dist/email/index.d.ts.map +1 -0
- package/dist/email/index.js +26 -0
- package/dist/email/index.js.map +1 -0
- package/dist/file-storage/bucket-resolver.d.ts +174 -0
- package/dist/file-storage/bucket-resolver.d.ts.map +1 -0
- package/dist/file-storage/bucket-resolver.js +270 -0
- package/dist/file-storage/bucket-resolver.js.map +1 -0
- package/dist/file-storage/file-storage.factory.d.ts +183 -0
- package/dist/file-storage/file-storage.factory.d.ts.map +1 -0
- package/dist/file-storage/file-storage.factory.js +300 -0
- package/dist/file-storage/file-storage.factory.js.map +1 -0
- package/dist/file-storage/file-storage.module.d.ts +49 -0
- package/dist/file-storage/file-storage.module.d.ts.map +1 -0
- package/dist/file-storage/file-storage.module.js +74 -0
- package/dist/file-storage/file-storage.module.js.map +1 -0
- package/dist/file-storage/file-storage.service.d.ts +381 -0
- package/dist/file-storage/file-storage.service.d.ts.map +1 -0
- package/dist/file-storage/file-storage.service.js +598 -0
- package/dist/file-storage/file-storage.service.js.map +1 -0
- package/dist/file-storage/index.d.ts +43 -0
- package/dist/file-storage/index.d.ts.map +1 -0
- package/dist/file-storage/index.js +65 -0
- package/dist/file-storage/index.js.map +1 -0
- package/dist/file-storage/types.d.ts +187 -0
- package/dist/file-storage/types.d.ts.map +1 -0
- package/dist/file-storage/types.js +21 -0
- package/dist/file-storage/types.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/ip-geo/continent-mapping.d.ts +31 -0
- package/dist/ip-geo/continent-mapping.d.ts.map +1 -0
- package/dist/ip-geo/continent-mapping.js +246 -0
- package/dist/ip-geo/continent-mapping.js.map +1 -0
- package/dist/ip-geo/index.d.ts +33 -0
- package/dist/ip-geo/index.d.ts.map +1 -0
- package/dist/ip-geo/index.js +41 -0
- package/dist/ip-geo/index.js.map +1 -0
- package/dist/ip-geo/ip-geo.module.d.ts +8 -0
- package/dist/ip-geo/ip-geo.module.d.ts.map +1 -0
- package/dist/ip-geo/ip-geo.module.js +34 -0
- package/dist/ip-geo/ip-geo.module.js.map +1 -0
- package/dist/ip-geo/ip-geo.service.d.ts +43 -0
- package/dist/ip-geo/ip-geo.service.d.ts.map +1 -0
- package/dist/ip-geo/ip-geo.service.js +153 -0
- package/dist/ip-geo/ip-geo.service.js.map +1 -0
- package/dist/ip-info/index.d.ts +7 -0
- package/dist/ip-info/index.d.ts.map +1 -0
- package/dist/ip-info/index.js +13 -0
- package/dist/ip-info/index.js.map +1 -0
- package/dist/ip-info/ip-info.client.d.ts +32 -0
- package/dist/ip-info/ip-info.client.d.ts.map +1 -0
- package/dist/ip-info/ip-info.client.js +73 -0
- package/dist/ip-info/ip-info.client.js.map +1 -0
- package/dist/ip-info/ip-info.module.d.ts +3 -0
- package/dist/ip-info/ip-info.module.d.ts.map +1 -0
- package/dist/ip-info/ip-info.module.js +45 -0
- package/dist/ip-info/ip-info.module.js.map +1 -0
- package/dist/ip-info/ip-info.service.d.ts +50 -0
- package/dist/ip-info/ip-info.service.d.ts.map +1 -0
- package/dist/ip-info/ip-info.service.js +177 -0
- package/dist/ip-info/ip-info.service.js.map +1 -0
- package/dist/ocr/index.d.ts +33 -0
- package/dist/ocr/index.d.ts.map +1 -0
- package/dist/ocr/index.js +53 -0
- package/dist/ocr/index.js.map +1 -0
- package/dist/ocr/ocr.module.d.ts +41 -0
- package/dist/ocr/ocr.module.d.ts.map +1 -0
- package/dist/ocr/ocr.module.js +61 -0
- package/dist/ocr/ocr.module.js.map +1 -0
- package/dist/ocr/ocr.service.d.ts +111 -0
- package/dist/ocr/ocr.service.d.ts.map +1 -0
- package/dist/ocr/ocr.service.js +214 -0
- package/dist/ocr/ocr.service.js.map +1 -0
- package/dist/sms/index.d.ts +5 -0
- package/dist/sms/index.d.ts.map +1 -0
- package/dist/sms/index.js +29 -0
- package/dist/sms/index.js.map +1 -0
- package/dist/sms/sms.factory.d.ts +140 -0
- package/dist/sms/sms.factory.d.ts.map +1 -0
- package/dist/sms/sms.factory.js +276 -0
- package/dist/sms/sms.factory.js.map +1 -0
- package/dist/sms/sms.module.d.ts +3 -0
- package/dist/sms/sms.module.d.ts.map +1 -0
- package/dist/sms/sms.module.js +38 -0
- package/dist/sms/sms.module.js.map +1 -0
- package/dist/sms/sms.service.d.ts +139 -0
- package/dist/sms/sms.service.d.ts.map +1 -0
- package/dist/sms/sms.service.js +278 -0
- package/dist/sms/sms.service.js.map +1 -0
- package/dist/sms/types.d.ts +204 -0
- package/dist/sms/types.d.ts.map +1 -0
- package/dist/sms/types.js +44 -0
- package/dist/sms/types.js.map +1 -0
- package/dist/streaming-asr/index.d.ts +45 -0
- package/dist/streaming-asr/index.d.ts.map +1 -0
- package/dist/streaming-asr/index.js +66 -0
- package/dist/streaming-asr/index.js.map +1 -0
- package/dist/streaming-asr/streaming-asr.module.d.ts +37 -0
- package/dist/streaming-asr/streaming-asr.module.d.ts.map +1 -0
- package/dist/streaming-asr/streaming-asr.module.js +59 -0
- package/dist/streaming-asr/streaming-asr.module.js.map +1 -0
- package/dist/streaming-asr/streaming-asr.service.d.ts +276 -0
- package/dist/streaming-asr/streaming-asr.service.d.ts.map +1 -0
- package/dist/streaming-asr/streaming-asr.service.js +1120 -0
- package/dist/streaming-asr/streaming-asr.service.js.map +1 -0
- package/dist/streaming-asr/types.d.ts +194 -0
- package/dist/streaming-asr/types.d.ts.map +1 -0
- package/dist/streaming-asr/types.js +8 -0
- package/dist/streaming-asr/types.js.map +1 -0
- package/dist/system-health/index.d.ts +7 -0
- package/dist/system-health/index.d.ts.map +1 -0
- package/dist/system-health/index.js +25 -0
- package/dist/system-health/index.js.map +1 -0
- package/dist/system-health/system-health.controller.d.ts +43 -0
- package/dist/system-health/system-health.controller.d.ts.map +1 -0
- package/dist/system-health/system-health.controller.js +86 -0
- package/dist/system-health/system-health.controller.js.map +1 -0
- package/dist/system-health/system-health.module.d.ts +3 -0
- package/dist/system-health/system-health.module.d.ts.map +1 -0
- package/dist/system-health/system-health.module.js +29 -0
- package/dist/system-health/system-health.module.js.map +1 -0
- package/dist/system-health/system-health.service.d.ts +14 -0
- package/dist/system-health/system-health.service.d.ts.map +1 -0
- package/dist/system-health/system-health.service.js +87 -0
- package/dist/system-health/system-health.service.js.map +1 -0
- package/dist/uploader/index.d.ts +3 -0
- package/dist/uploader/index.d.ts.map +1 -0
- package/dist/uploader/index.js +8 -0
- package/dist/uploader/index.js.map +1 -0
- package/dist/uploader/uploader.module.d.ts +3 -0
- package/dist/uploader/uploader.module.d.ts.map +1 -0
- package/dist/uploader/uploader.module.js +25 -0
- package/dist/uploader/uploader.module.js.map +1 -0
- package/dist/uploader/uploader.service.d.ts +86 -0
- package/dist/uploader/uploader.service.d.ts.map +1 -0
- package/dist/uploader/uploader.service.js +188 -0
- package/dist/uploader/uploader.service.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview 流式语音识别服务
|
|
3
|
+
*
|
|
4
|
+
* 本服务提供流式语音识别的核心业务逻辑,包括:
|
|
5
|
+
* - 创建和管理流式识别会话
|
|
6
|
+
* - 音频数据传输
|
|
7
|
+
* - 实时识别结果处理
|
|
8
|
+
* - 与会议记录的集成
|
|
9
|
+
*
|
|
10
|
+
* @module streaming-asr/service
|
|
11
|
+
*/
|
|
12
|
+
import { OnModuleDestroy } from '@nestjs/common';
|
|
13
|
+
import { Logger } from 'winston';
|
|
14
|
+
import { ConfigService } from '@nestjs/config';
|
|
15
|
+
import { JwtService } from '@nestjs/jwt';
|
|
16
|
+
import { RedisService } from '@dofe/infra-redis';
|
|
17
|
+
import { CreateStreamingSessionDto, StreamingSessionResult, CompleteStreamingSessionDto, CompleteStreamingSessionResult, SessionStatusResult, StreamingAsrEvent } from './types';
|
|
18
|
+
/**
|
|
19
|
+
* 流式语音识别服务
|
|
20
|
+
*
|
|
21
|
+
* @description 提供流式语音识别的业务逻辑处理:
|
|
22
|
+
*
|
|
23
|
+
* 1. **创建会话** - `createSession`
|
|
24
|
+
* 创建流式识别会话,建立 WebSocket 连接
|
|
25
|
+
*
|
|
26
|
+
* 2. **发送音频** - `sendAudio`
|
|
27
|
+
* 发送音频数据到识别服务
|
|
28
|
+
*
|
|
29
|
+
* 3. **完成会话** - `completeSession`
|
|
30
|
+
* 结束识别会话,获取最终结果
|
|
31
|
+
*
|
|
32
|
+
* 4. **查询状态** - `getSessionStatus`
|
|
33
|
+
* 获取会话的实时状态和结果
|
|
34
|
+
*
|
|
35
|
+
* 5. **事件订阅** - `subscribeToSession`
|
|
36
|
+
* 订阅实时识别结果事件
|
|
37
|
+
*
|
|
38
|
+
* @class StreamingAsrService
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* @Injectable()
|
|
43
|
+
* class StreamingAsrController {
|
|
44
|
+
* constructor(private readonly streamingAsr: StreamingAsrService) {}
|
|
45
|
+
*
|
|
46
|
+
* async startSession(dto: CreateStreamingSessionDto) {
|
|
47
|
+
* const result = await this.streamingAsr.createSession(dto);
|
|
48
|
+
* return result;
|
|
49
|
+
* }
|
|
50
|
+
*
|
|
51
|
+
* async sendAudioChunk(connectionId: string, audioData: Buffer) {
|
|
52
|
+
* await this.streamingAsr.sendAudio(connectionId, audioData);
|
|
53
|
+
* }
|
|
54
|
+
* }
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export declare class StreamingAsrService implements OnModuleDestroy {
|
|
58
|
+
private readonly config;
|
|
59
|
+
private readonly jwt;
|
|
60
|
+
private readonly redis;
|
|
61
|
+
private readonly logger;
|
|
62
|
+
/**
|
|
63
|
+
* 流式识别 Provider
|
|
64
|
+
*/
|
|
65
|
+
private provider;
|
|
66
|
+
/**
|
|
67
|
+
* 会话信息存储
|
|
68
|
+
* key: sessionId
|
|
69
|
+
*/
|
|
70
|
+
private readonly sessions;
|
|
71
|
+
/**
|
|
72
|
+
* connectionId -> sessionId 映射
|
|
73
|
+
*/
|
|
74
|
+
private readonly connectionToSession;
|
|
75
|
+
/**
|
|
76
|
+
* 事件发射器(用于 SSE 推送)
|
|
77
|
+
*/
|
|
78
|
+
private readonly eventEmitter;
|
|
79
|
+
/**
|
|
80
|
+
* 会话超时清理定时器
|
|
81
|
+
*/
|
|
82
|
+
private cleanupTimer;
|
|
83
|
+
constructor(config: ConfigService, jwt: JwtService, redis: RedisService, logger: Logger);
|
|
84
|
+
/**
|
|
85
|
+
* 模块销毁时清理资源
|
|
86
|
+
*/
|
|
87
|
+
onModuleDestroy(): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* 初始化流式识别 Provider
|
|
90
|
+
*/
|
|
91
|
+
private initProvider;
|
|
92
|
+
/**
|
|
93
|
+
* 检查 Provider 是否可用
|
|
94
|
+
*/
|
|
95
|
+
private ensureProviderAvailable;
|
|
96
|
+
/**
|
|
97
|
+
* 创建流式识别会话
|
|
98
|
+
*
|
|
99
|
+
* @param {CreateStreamingSessionDto} dto - 创建会话参数
|
|
100
|
+
* @returns {Promise<StreamingSessionResult>} 会话创建结果
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* ```typescript
|
|
104
|
+
* const session = await streamingAsrService.createSession({
|
|
105
|
+
* userId: 'user-uuid',
|
|
106
|
+
* meetingRecordId: 'meeting-uuid', // 可选
|
|
107
|
+
* audioFormat: 'pcm',
|
|
108
|
+
* });
|
|
109
|
+
* console.log('Session ID:', session.sessionId);
|
|
110
|
+
* console.log('Connection ID:', session.connectionId);
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
createSession(dto: CreateStreamingSessionDto): Promise<StreamingSessionResult>;
|
|
114
|
+
/**
|
|
115
|
+
* 发送音频数据
|
|
116
|
+
*
|
|
117
|
+
* @param {string} sessionIdOrConnectionId - 会话 ID 或连接 ID
|
|
118
|
+
* @param {Buffer} audioData - 音频数据
|
|
119
|
+
* @param {boolean} [isLast=false] - 是否为最后一帧
|
|
120
|
+
*
|
|
121
|
+
* @description
|
|
122
|
+
* 此方法同时支持传入 sessionId 或 connectionId(向后兼容):
|
|
123
|
+
* - 优先作为 sessionId 查找(API 设计的主要方式,路径参数为 sessionId)
|
|
124
|
+
* - 如果找不到,再尝试作为 connectionId 查找(向后兼容)
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* ```typescript
|
|
128
|
+
* // 使用 sessionId 发送音频数据(推荐,符合 API 设计)
|
|
129
|
+
* await streamingAsrService.sendAudio(sessionId, audioBuffer);
|
|
130
|
+
*
|
|
131
|
+
* // 使用 connectionId 发送音频数据(向后兼容)
|
|
132
|
+
* await streamingAsrService.sendAudio(connectionId, audioBuffer);
|
|
133
|
+
*
|
|
134
|
+
* // 发送最后一帧
|
|
135
|
+
* await streamingAsrService.sendAudio(sessionId, lastBuffer, true);
|
|
136
|
+
* ```
|
|
137
|
+
*/
|
|
138
|
+
sendAudio(sessionIdOrConnectionId: string, audioData: Buffer, isLast?: boolean): Promise<void>;
|
|
139
|
+
/**
|
|
140
|
+
* 完成流式识别会话
|
|
141
|
+
*
|
|
142
|
+
* @param {CompleteStreamingSessionDto} dto - 完成会话参数
|
|
143
|
+
* @returns {Promise<CompleteStreamingSessionResult>} 完成结果
|
|
144
|
+
*/
|
|
145
|
+
completeSession(dto: CompleteStreamingSessionDto): Promise<CompleteStreamingSessionResult>;
|
|
146
|
+
/**
|
|
147
|
+
* 更新会话活动时间(心跳)
|
|
148
|
+
*
|
|
149
|
+
* @param {string} sessionId - 会话 ID
|
|
150
|
+
* @returns {Promise<{ success: boolean; lastActivityAt: Date }>} 更新结果
|
|
151
|
+
*/
|
|
152
|
+
updateSessionActivity(sessionId: string): Promise<{
|
|
153
|
+
success: boolean;
|
|
154
|
+
lastActivityAt: Date;
|
|
155
|
+
}>;
|
|
156
|
+
/**
|
|
157
|
+
* 获取会话状态
|
|
158
|
+
*
|
|
159
|
+
* @param {string} sessionId - 会话 ID
|
|
160
|
+
* @returns {SessionStatusResult} 会话状态
|
|
161
|
+
*/
|
|
162
|
+
getSessionStatus(sessionId: string): Promise<SessionStatusResult>;
|
|
163
|
+
/**
|
|
164
|
+
* 获取会话的 sessionToken
|
|
165
|
+
* 如果不存在则重新生成
|
|
166
|
+
*
|
|
167
|
+
* @param {string} sessionId - 会话 ID
|
|
168
|
+
* @returns {Promise<string>} sessionToken
|
|
169
|
+
*/
|
|
170
|
+
getSessionToken(sessionId: string): Promise<string>;
|
|
171
|
+
/**
|
|
172
|
+
* 取消/断开会话
|
|
173
|
+
*
|
|
174
|
+
* @param {string} sessionId - 会话 ID
|
|
175
|
+
*/
|
|
176
|
+
cancelSession(sessionId: string): Promise<void>;
|
|
177
|
+
/**
|
|
178
|
+
* 订阅会话事件(用于 SSE)
|
|
179
|
+
*
|
|
180
|
+
* @param {string} sessionId - 会话 ID
|
|
181
|
+
* @param {function} callback - 事件回调
|
|
182
|
+
* @returns {function} 取消订阅函数
|
|
183
|
+
*/
|
|
184
|
+
subscribeToSession(sessionId: string, callback: (event: StreamingAsrEvent) => void): () => void;
|
|
185
|
+
/**
|
|
186
|
+
* 获取活跃会话数
|
|
187
|
+
*/
|
|
188
|
+
getActiveSessionCount(): number;
|
|
189
|
+
/**
|
|
190
|
+
* 根据 connectionId 获取 sessionId
|
|
191
|
+
*/
|
|
192
|
+
getSessionIdByConnectionId(connectionId: string): string | undefined;
|
|
193
|
+
/**
|
|
194
|
+
* 处理连接建立事件
|
|
195
|
+
*/
|
|
196
|
+
private handleConnected;
|
|
197
|
+
/**
|
|
198
|
+
* 处理识别结果事件
|
|
199
|
+
*/
|
|
200
|
+
private handleResult;
|
|
201
|
+
/**
|
|
202
|
+
* 处理错误事件
|
|
203
|
+
*/
|
|
204
|
+
private handleError;
|
|
205
|
+
/**
|
|
206
|
+
* 处理断开连接事件
|
|
207
|
+
*/
|
|
208
|
+
private handleDisconnected;
|
|
209
|
+
/**
|
|
210
|
+
* 发送事件
|
|
211
|
+
*/
|
|
212
|
+
private emitEvent;
|
|
213
|
+
/**
|
|
214
|
+
* 清理会话
|
|
215
|
+
*/
|
|
216
|
+
private cleanupSession;
|
|
217
|
+
/**
|
|
218
|
+
* 启动会话清理定时器
|
|
219
|
+
*/
|
|
220
|
+
private startCleanupTimer;
|
|
221
|
+
/**
|
|
222
|
+
* 停止会话清理定时器
|
|
223
|
+
*/
|
|
224
|
+
private stopCleanupTimer;
|
|
225
|
+
/**
|
|
226
|
+
* 检查并清理超时会话
|
|
227
|
+
*/
|
|
228
|
+
private checkAndCleanupSessions;
|
|
229
|
+
/**
|
|
230
|
+
* 自动完成会议(超时时调用)
|
|
231
|
+
* @private
|
|
232
|
+
*/
|
|
233
|
+
private autoCompleteMeeting;
|
|
234
|
+
/**
|
|
235
|
+
* 保存会话数据到 Redis(用于服务重启后恢复)
|
|
236
|
+
*
|
|
237
|
+
* ⚠️ P2: Redis 持久化 - 保存转写数据,避免服务重启导致数据丢失
|
|
238
|
+
*/
|
|
239
|
+
private saveSessionToRedis;
|
|
240
|
+
/**
|
|
241
|
+
* 从 Redis 恢复会话数据(用于服务重启后恢复)
|
|
242
|
+
*
|
|
243
|
+
* ⚠️ P2: Redis 持久化 - 服务重启时恢复会话数据
|
|
244
|
+
*/
|
|
245
|
+
private restoreSessionFromRedis;
|
|
246
|
+
/**
|
|
247
|
+
* 强制清理会话(用于超时清理)
|
|
248
|
+
*/
|
|
249
|
+
private forceCleanupSession;
|
|
250
|
+
/**
|
|
251
|
+
* 清理所有会话
|
|
252
|
+
*/
|
|
253
|
+
private cleanupAllSessions;
|
|
254
|
+
/**
|
|
255
|
+
* 获取会话统计信息
|
|
256
|
+
*/
|
|
257
|
+
getSessionStats(): {
|
|
258
|
+
activeCount: number;
|
|
259
|
+
streamingCount: number;
|
|
260
|
+
completedCount: number;
|
|
261
|
+
errorCount: number;
|
|
262
|
+
};
|
|
263
|
+
/**
|
|
264
|
+
* 生成 session token
|
|
265
|
+
*
|
|
266
|
+
* @description
|
|
267
|
+
* 生成长期有效的 session token (4小时),用于音频发送认证
|
|
268
|
+
* 解决 JWT token refresh 导致的音频数据丢失问题
|
|
269
|
+
*
|
|
270
|
+
* @param sessionId - Session ID
|
|
271
|
+
* @param userId - User ID
|
|
272
|
+
* @returns Session token
|
|
273
|
+
*/
|
|
274
|
+
private generateSessionToken;
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=streaming-asr.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming-asr.service.d.ts","sourceRoot":"","sources":["../../src/streaming-asr/streaming-asr.service.ts"],"names":[],"mappings":"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"}
|