@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.
Files changed (153) hide show
  1. package/dist/email/dto/email.dto.d.ts +70 -0
  2. package/dist/email/dto/email.dto.d.ts.map +1 -0
  3. package/dist/email/dto/email.dto.js +58 -0
  4. package/dist/email/dto/email.dto.js.map +1 -0
  5. package/dist/email/email.module.d.ts +3 -0
  6. package/dist/email/email.module.d.ts.map +1 -0
  7. package/dist/email/email.module.js +38 -0
  8. package/dist/email/email.module.js.map +1 -0
  9. package/dist/email/email.service.d.ts +61 -0
  10. package/dist/email/email.service.d.ts.map +1 -0
  11. package/dist/email/email.service.js +191 -0
  12. package/dist/email/email.service.js.map +1 -0
  13. package/dist/email/index.d.ts +5 -0
  14. package/dist/email/index.d.ts.map +1 -0
  15. package/dist/email/index.js +26 -0
  16. package/dist/email/index.js.map +1 -0
  17. package/dist/file-storage/bucket-resolver.d.ts +174 -0
  18. package/dist/file-storage/bucket-resolver.d.ts.map +1 -0
  19. package/dist/file-storage/bucket-resolver.js +270 -0
  20. package/dist/file-storage/bucket-resolver.js.map +1 -0
  21. package/dist/file-storage/file-storage.factory.d.ts +183 -0
  22. package/dist/file-storage/file-storage.factory.d.ts.map +1 -0
  23. package/dist/file-storage/file-storage.factory.js +300 -0
  24. package/dist/file-storage/file-storage.factory.js.map +1 -0
  25. package/dist/file-storage/file-storage.module.d.ts +49 -0
  26. package/dist/file-storage/file-storage.module.d.ts.map +1 -0
  27. package/dist/file-storage/file-storage.module.js +74 -0
  28. package/dist/file-storage/file-storage.module.js.map +1 -0
  29. package/dist/file-storage/file-storage.service.d.ts +381 -0
  30. package/dist/file-storage/file-storage.service.d.ts.map +1 -0
  31. package/dist/file-storage/file-storage.service.js +598 -0
  32. package/dist/file-storage/file-storage.service.js.map +1 -0
  33. package/dist/file-storage/index.d.ts +43 -0
  34. package/dist/file-storage/index.d.ts.map +1 -0
  35. package/dist/file-storage/index.js +65 -0
  36. package/dist/file-storage/index.js.map +1 -0
  37. package/dist/file-storage/types.d.ts +187 -0
  38. package/dist/file-storage/types.d.ts.map +1 -0
  39. package/dist/file-storage/types.js +21 -0
  40. package/dist/file-storage/types.js.map +1 -0
  41. package/dist/index.d.ts +20 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +35 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/ip-geo/continent-mapping.d.ts +31 -0
  46. package/dist/ip-geo/continent-mapping.d.ts.map +1 -0
  47. package/dist/ip-geo/continent-mapping.js +246 -0
  48. package/dist/ip-geo/continent-mapping.js.map +1 -0
  49. package/dist/ip-geo/index.d.ts +33 -0
  50. package/dist/ip-geo/index.d.ts.map +1 -0
  51. package/dist/ip-geo/index.js +41 -0
  52. package/dist/ip-geo/index.js.map +1 -0
  53. package/dist/ip-geo/ip-geo.module.d.ts +8 -0
  54. package/dist/ip-geo/ip-geo.module.d.ts.map +1 -0
  55. package/dist/ip-geo/ip-geo.module.js +34 -0
  56. package/dist/ip-geo/ip-geo.module.js.map +1 -0
  57. package/dist/ip-geo/ip-geo.service.d.ts +43 -0
  58. package/dist/ip-geo/ip-geo.service.d.ts.map +1 -0
  59. package/dist/ip-geo/ip-geo.service.js +153 -0
  60. package/dist/ip-geo/ip-geo.service.js.map +1 -0
  61. package/dist/ip-info/index.d.ts +7 -0
  62. package/dist/ip-info/index.d.ts.map +1 -0
  63. package/dist/ip-info/index.js +13 -0
  64. package/dist/ip-info/index.js.map +1 -0
  65. package/dist/ip-info/ip-info.client.d.ts +32 -0
  66. package/dist/ip-info/ip-info.client.d.ts.map +1 -0
  67. package/dist/ip-info/ip-info.client.js +73 -0
  68. package/dist/ip-info/ip-info.client.js.map +1 -0
  69. package/dist/ip-info/ip-info.module.d.ts +3 -0
  70. package/dist/ip-info/ip-info.module.d.ts.map +1 -0
  71. package/dist/ip-info/ip-info.module.js +45 -0
  72. package/dist/ip-info/ip-info.module.js.map +1 -0
  73. package/dist/ip-info/ip-info.service.d.ts +50 -0
  74. package/dist/ip-info/ip-info.service.d.ts.map +1 -0
  75. package/dist/ip-info/ip-info.service.js +177 -0
  76. package/dist/ip-info/ip-info.service.js.map +1 -0
  77. package/dist/ocr/index.d.ts +33 -0
  78. package/dist/ocr/index.d.ts.map +1 -0
  79. package/dist/ocr/index.js +53 -0
  80. package/dist/ocr/index.js.map +1 -0
  81. package/dist/ocr/ocr.module.d.ts +41 -0
  82. package/dist/ocr/ocr.module.d.ts.map +1 -0
  83. package/dist/ocr/ocr.module.js +61 -0
  84. package/dist/ocr/ocr.module.js.map +1 -0
  85. package/dist/ocr/ocr.service.d.ts +111 -0
  86. package/dist/ocr/ocr.service.d.ts.map +1 -0
  87. package/dist/ocr/ocr.service.js +214 -0
  88. package/dist/ocr/ocr.service.js.map +1 -0
  89. package/dist/sms/index.d.ts +5 -0
  90. package/dist/sms/index.d.ts.map +1 -0
  91. package/dist/sms/index.js +29 -0
  92. package/dist/sms/index.js.map +1 -0
  93. package/dist/sms/sms.factory.d.ts +140 -0
  94. package/dist/sms/sms.factory.d.ts.map +1 -0
  95. package/dist/sms/sms.factory.js +276 -0
  96. package/dist/sms/sms.factory.js.map +1 -0
  97. package/dist/sms/sms.module.d.ts +3 -0
  98. package/dist/sms/sms.module.d.ts.map +1 -0
  99. package/dist/sms/sms.module.js +38 -0
  100. package/dist/sms/sms.module.js.map +1 -0
  101. package/dist/sms/sms.service.d.ts +139 -0
  102. package/dist/sms/sms.service.d.ts.map +1 -0
  103. package/dist/sms/sms.service.js +278 -0
  104. package/dist/sms/sms.service.js.map +1 -0
  105. package/dist/sms/types.d.ts +204 -0
  106. package/dist/sms/types.d.ts.map +1 -0
  107. package/dist/sms/types.js +44 -0
  108. package/dist/sms/types.js.map +1 -0
  109. package/dist/streaming-asr/index.d.ts +45 -0
  110. package/dist/streaming-asr/index.d.ts.map +1 -0
  111. package/dist/streaming-asr/index.js +66 -0
  112. package/dist/streaming-asr/index.js.map +1 -0
  113. package/dist/streaming-asr/streaming-asr.module.d.ts +37 -0
  114. package/dist/streaming-asr/streaming-asr.module.d.ts.map +1 -0
  115. package/dist/streaming-asr/streaming-asr.module.js +59 -0
  116. package/dist/streaming-asr/streaming-asr.module.js.map +1 -0
  117. package/dist/streaming-asr/streaming-asr.service.d.ts +276 -0
  118. package/dist/streaming-asr/streaming-asr.service.d.ts.map +1 -0
  119. package/dist/streaming-asr/streaming-asr.service.js +1120 -0
  120. package/dist/streaming-asr/streaming-asr.service.js.map +1 -0
  121. package/dist/streaming-asr/types.d.ts +194 -0
  122. package/dist/streaming-asr/types.d.ts.map +1 -0
  123. package/dist/streaming-asr/types.js +8 -0
  124. package/dist/streaming-asr/types.js.map +1 -0
  125. package/dist/system-health/index.d.ts +7 -0
  126. package/dist/system-health/index.d.ts.map +1 -0
  127. package/dist/system-health/index.js +25 -0
  128. package/dist/system-health/index.js.map +1 -0
  129. package/dist/system-health/system-health.controller.d.ts +43 -0
  130. package/dist/system-health/system-health.controller.d.ts.map +1 -0
  131. package/dist/system-health/system-health.controller.js +86 -0
  132. package/dist/system-health/system-health.controller.js.map +1 -0
  133. package/dist/system-health/system-health.module.d.ts +3 -0
  134. package/dist/system-health/system-health.module.d.ts.map +1 -0
  135. package/dist/system-health/system-health.module.js +29 -0
  136. package/dist/system-health/system-health.module.js.map +1 -0
  137. package/dist/system-health/system-health.service.d.ts +14 -0
  138. package/dist/system-health/system-health.service.d.ts.map +1 -0
  139. package/dist/system-health/system-health.service.js +87 -0
  140. package/dist/system-health/system-health.service.js.map +1 -0
  141. package/dist/uploader/index.d.ts +3 -0
  142. package/dist/uploader/index.d.ts.map +1 -0
  143. package/dist/uploader/index.js +8 -0
  144. package/dist/uploader/index.js.map +1 -0
  145. package/dist/uploader/uploader.module.d.ts +3 -0
  146. package/dist/uploader/uploader.module.d.ts.map +1 -0
  147. package/dist/uploader/uploader.module.js +25 -0
  148. package/dist/uploader/uploader.module.js.map +1 -0
  149. package/dist/uploader/uploader.service.d.ts +86 -0
  150. package/dist/uploader/uploader.service.d.ts.map +1 -0
  151. package/dist/uploader/uploader.service.js +188 -0
  152. package/dist/uploader/uploader.service.js.map +1 -0
  153. 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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"}