@gravito/ripple 3.1.0 → 4.0.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 (190) hide show
  1. package/README.md +260 -19
  2. package/dist/atlas/src/DB.d.ts +348 -0
  3. package/dist/atlas/src/OrbitAtlas.d.ts +9 -0
  4. package/dist/atlas/src/config/defineConfig.d.ts +14 -0
  5. package/dist/atlas/src/config/index.d.ts +7 -0
  6. package/dist/atlas/src/config/loadConfig.d.ts +41 -0
  7. package/dist/atlas/src/connection/Connection.d.ts +112 -0
  8. package/dist/atlas/src/connection/ConnectionManager.d.ts +180 -0
  9. package/dist/atlas/src/connection/ReplicaConnectionPool.d.ts +54 -0
  10. package/dist/atlas/src/drivers/BunSQLDriver.d.ts +32 -0
  11. package/dist/atlas/src/drivers/BunSQLPreparedStatement.d.ts +118 -0
  12. package/dist/atlas/src/drivers/MongoDBDriver.d.ts +36 -0
  13. package/dist/atlas/src/drivers/MySQLDriver.d.ts +79 -0
  14. package/dist/atlas/src/drivers/PostgresDriver.d.ts +96 -0
  15. package/dist/atlas/src/drivers/RedisDriver.d.ts +43 -0
  16. package/dist/atlas/src/drivers/SQLiteDriver.d.ts +45 -0
  17. package/dist/atlas/src/drivers/types.d.ts +260 -0
  18. package/dist/atlas/src/errors/index.d.ts +45 -0
  19. package/dist/atlas/src/grammar/Grammar.d.ts +342 -0
  20. package/dist/atlas/src/grammar/MongoGrammar.d.ts +47 -0
  21. package/dist/atlas/src/grammar/MySQLGrammar.d.ts +54 -0
  22. package/dist/atlas/src/grammar/NullGrammar.d.ts +35 -0
  23. package/dist/atlas/src/grammar/PostgresGrammar.d.ts +62 -0
  24. package/dist/atlas/src/grammar/SQLiteGrammar.d.ts +32 -0
  25. package/dist/atlas/src/index.d.ts +79 -0
  26. package/dist/atlas/src/migration/Migration.d.ts +64 -0
  27. package/dist/atlas/src/migration/MigrationRepository.d.ts +65 -0
  28. package/dist/atlas/src/migration/Migrator.d.ts +110 -0
  29. package/dist/atlas/src/migration/index.d.ts +6 -0
  30. package/dist/atlas/src/observability/AtlasMetrics.d.ts +33 -0
  31. package/dist/atlas/src/observability/AtlasObservability.d.ts +15 -0
  32. package/dist/atlas/src/observability/AtlasTracer.d.ts +12 -0
  33. package/dist/atlas/src/observability/index.d.ts +9 -0
  34. package/dist/atlas/src/orm/Repository.d.ts +247 -0
  35. package/dist/atlas/src/orm/index.d.ts +6 -0
  36. package/dist/atlas/src/orm/model/DirtyTracker.d.ts +121 -0
  37. package/dist/atlas/src/orm/model/Model.d.ts +458 -0
  38. package/dist/atlas/src/orm/model/ModelRegistry.d.ts +20 -0
  39. package/dist/atlas/src/orm/model/concerns/HasAttributes.d.ts +150 -0
  40. package/dist/atlas/src/orm/model/concerns/HasEvents.d.ts +36 -0
  41. package/dist/atlas/src/orm/model/concerns/HasPersistence.d.ts +92 -0
  42. package/dist/atlas/src/orm/model/concerns/HasRelationships.d.ts +117 -0
  43. package/dist/atlas/src/orm/model/concerns/HasSerialization.d.ts +64 -0
  44. package/dist/atlas/src/orm/model/concerns/applyMixins.d.ts +15 -0
  45. package/dist/atlas/src/orm/model/concerns/index.d.ts +12 -0
  46. package/dist/atlas/src/orm/model/decorators.d.ts +138 -0
  47. package/dist/atlas/src/orm/model/errors.d.ts +52 -0
  48. package/dist/atlas/src/orm/model/index.d.ts +10 -0
  49. package/dist/atlas/src/orm/model/relationships.d.ts +207 -0
  50. package/dist/atlas/src/orm/model/types.d.ts +12 -0
  51. package/dist/atlas/src/orm/schema/SchemaRegistry.d.ts +124 -0
  52. package/dist/atlas/src/orm/schema/SchemaSniffer.d.ts +54 -0
  53. package/dist/atlas/src/orm/schema/index.d.ts +6 -0
  54. package/dist/atlas/src/orm/schema/types.d.ts +85 -0
  55. package/dist/atlas/src/pool/AdaptivePoolManager.d.ts +98 -0
  56. package/dist/atlas/src/pool/PoolHealthChecker.d.ts +91 -0
  57. package/dist/atlas/src/pool/PoolStrategy.d.ts +129 -0
  58. package/dist/atlas/src/pool/PoolWarmer.d.ts +92 -0
  59. package/dist/atlas/src/query/Expression.d.ts +60 -0
  60. package/dist/atlas/src/query/NPlusOneDetector.d.ts +10 -0
  61. package/dist/atlas/src/query/QueryBuilder.d.ts +643 -0
  62. package/dist/atlas/src/query/RelationshipResolver.d.ts +23 -0
  63. package/dist/atlas/src/query/clauses/GroupByClause.d.ts +51 -0
  64. package/dist/atlas/src/query/clauses/HavingClause.d.ts +70 -0
  65. package/dist/atlas/src/query/clauses/JoinClause.d.ts +87 -0
  66. package/dist/atlas/src/query/clauses/LimitClause.d.ts +82 -0
  67. package/dist/atlas/src/query/clauses/OrderByClause.d.ts +69 -0
  68. package/dist/atlas/src/query/clauses/SelectClause.d.ts +71 -0
  69. package/dist/atlas/src/query/clauses/WhereClause.d.ts +167 -0
  70. package/dist/atlas/src/query/clauses/index.d.ts +11 -0
  71. package/dist/atlas/src/schema/Blueprint.d.ts +276 -0
  72. package/dist/atlas/src/schema/ColumnDefinition.d.ts +154 -0
  73. package/dist/atlas/src/schema/ForeignKeyDefinition.d.ts +37 -0
  74. package/dist/atlas/src/schema/MigrationGenerator.d.ts +45 -0
  75. package/dist/atlas/src/schema/Schema.d.ts +131 -0
  76. package/dist/atlas/src/schema/SchemaDiff.d.ts +73 -0
  77. package/dist/atlas/src/schema/TypeGenerator.d.ts +57 -0
  78. package/dist/atlas/src/schema/TypeWriter.d.ts +42 -0
  79. package/dist/atlas/src/schema/grammars/MySQLSchemaGrammar.d.ts +23 -0
  80. package/dist/atlas/src/schema/grammars/PostgresSchemaGrammar.d.ts +26 -0
  81. package/dist/atlas/src/schema/grammars/SQLiteSchemaGrammar.d.ts +28 -0
  82. package/dist/atlas/src/schema/grammars/SchemaGrammar.d.ts +97 -0
  83. package/dist/atlas/src/schema/grammars/index.d.ts +7 -0
  84. package/dist/atlas/src/schema/index.d.ts +8 -0
  85. package/dist/atlas/src/seed/Factory.d.ts +90 -0
  86. package/dist/atlas/src/seed/Seeder.d.ts +28 -0
  87. package/dist/atlas/src/seed/SeederRunner.d.ts +74 -0
  88. package/dist/atlas/src/seed/index.d.ts +6 -0
  89. package/dist/atlas/src/sharding/ShardingManager.d.ts +59 -0
  90. package/dist/atlas/src/types/index.d.ts +1182 -0
  91. package/dist/atlas/src/utils/CursorEncoding.d.ts +63 -0
  92. package/dist/atlas/src/utils/levenshtein.d.ts +9 -0
  93. package/dist/core/src/CommandKernel.d.ts +33 -0
  94. package/dist/core/src/ConfigManager.d.ts +39 -0
  95. package/dist/core/src/Container/RequestScopeManager.d.ts +62 -0
  96. package/dist/core/src/Container/RequestScopeMetrics.d.ts +144 -0
  97. package/dist/core/src/Container.d.ts +86 -11
  98. package/dist/core/src/ErrorHandler.d.ts +3 -0
  99. package/dist/core/src/HookManager.d.ts +511 -4
  100. package/dist/core/src/PlanetCore.d.ts +89 -0
  101. package/dist/core/src/RequestContext.d.ts +97 -0
  102. package/dist/core/src/Router.d.ts +1 -5
  103. package/dist/core/src/ServiceProvider.d.ts +22 -0
  104. package/dist/core/src/adapters/GravitoEngineAdapter.d.ts +1 -0
  105. package/dist/core/src/adapters/PhotonAdapter.d.ts +5 -0
  106. package/dist/core/src/adapters/bun/BunContext.d.ts +4 -0
  107. package/dist/core/src/adapters/bun/BunNativeAdapter.d.ts +1 -0
  108. package/dist/core/src/adapters/types.d.ts +27 -0
  109. package/dist/core/src/cli/queue-commands.d.ts +6 -0
  110. package/dist/core/src/engine/AOTRouter.d.ts +7 -12
  111. package/dist/core/src/engine/FastContext.d.ts +27 -2
  112. package/dist/core/src/engine/Gravito.d.ts +0 -1
  113. package/dist/core/src/engine/MinimalContext.d.ts +25 -2
  114. package/dist/core/src/engine/types.d.ts +9 -1
  115. package/dist/core/src/error-handling/RequestScopeErrorContext.d.ts +126 -0
  116. package/dist/core/src/events/BackpressureManager.d.ts +215 -0
  117. package/dist/core/src/events/CircuitBreaker.d.ts +229 -0
  118. package/dist/core/src/events/DeadLetterQueue.d.ts +219 -0
  119. package/dist/core/src/events/EventBackend.d.ts +12 -0
  120. package/dist/core/src/events/EventOptions.d.ts +204 -0
  121. package/dist/core/src/events/EventPriorityQueue.d.ts +301 -0
  122. package/dist/core/src/events/FlowControlStrategy.d.ts +109 -0
  123. package/dist/core/src/events/IdempotencyCache.d.ts +60 -0
  124. package/dist/core/src/events/MessageQueueBridge.d.ts +184 -0
  125. package/dist/core/src/events/PriorityEscalationManager.d.ts +82 -0
  126. package/dist/core/src/events/RetryScheduler.d.ts +104 -0
  127. package/dist/core/src/events/WorkerPool.d.ts +98 -0
  128. package/dist/core/src/events/WorkerPoolConfig.d.ts +153 -0
  129. package/dist/core/src/events/WorkerPoolMetrics.d.ts +65 -0
  130. package/dist/core/src/events/aggregation/AggregationWindow.d.ts +77 -0
  131. package/dist/core/src/events/aggregation/DeduplicationManager.d.ts +135 -0
  132. package/dist/core/src/events/aggregation/EventAggregationManager.d.ts +108 -0
  133. package/dist/core/src/events/aggregation/EventBatcher.d.ts +99 -0
  134. package/dist/core/src/events/aggregation/types.d.ts +117 -0
  135. package/dist/core/src/events/index.d.ts +25 -0
  136. package/dist/core/src/events/observability/EventMetrics.d.ts +132 -0
  137. package/dist/core/src/events/observability/EventTracer.d.ts +68 -0
  138. package/dist/core/src/events/observability/EventTracing.d.ts +161 -0
  139. package/dist/core/src/events/observability/OTelEventMetrics.d.ts +332 -0
  140. package/dist/core/src/events/observability/ObservableHookManager.d.ts +108 -0
  141. package/dist/core/src/events/observability/StreamWorkerMetrics.d.ts +76 -0
  142. package/dist/core/src/events/observability/index.d.ts +24 -0
  143. package/dist/core/src/events/observability/metrics-types.d.ts +16 -0
  144. package/dist/core/src/events/types.d.ts +134 -0
  145. package/dist/core/src/exceptions/CircularDependencyException.d.ts +9 -0
  146. package/dist/core/src/exceptions/index.d.ts +1 -0
  147. package/dist/core/src/health/HealthProvider.d.ts +67 -0
  148. package/dist/core/src/http/types.d.ts +40 -0
  149. package/dist/core/src/index.d.ts +25 -4
  150. package/dist/core/src/instrumentation/index.d.ts +35 -0
  151. package/dist/core/src/instrumentation/opentelemetry.d.ts +178 -0
  152. package/dist/core/src/instrumentation/types.d.ts +182 -0
  153. package/dist/core/src/observability/Metrics.d.ts +244 -0
  154. package/dist/core/src/observability/QueueDashboard.d.ts +136 -0
  155. package/dist/core/src/reliability/DeadLetterQueueManager.d.ts +350 -0
  156. package/dist/core/src/reliability/RetryPolicy.d.ts +217 -0
  157. package/dist/core/src/reliability/index.d.ts +6 -0
  158. package/dist/core/src/router/ControllerDispatcher.d.ts +12 -0
  159. package/dist/core/src/router/RequestValidator.d.ts +20 -0
  160. package/dist/index.js +6709 -9888
  161. package/dist/index.js.map +64 -62
  162. package/dist/photon/src/index.d.ts +19 -0
  163. package/dist/photon/src/middleware/ratelimit-redis.d.ts +50 -0
  164. package/dist/photon/src/middleware/ratelimit.d.ts +161 -0
  165. package/dist/photon/src/openapi.d.ts +19 -0
  166. package/dist/proto/ripple.proto +120 -0
  167. package/dist/ripple/src/RippleServer.d.ts +64 -445
  168. package/dist/ripple/src/channels/ChannelManager.d.ts +25 -10
  169. package/dist/ripple/src/drivers/NATSDriver.d.ts +87 -0
  170. package/dist/ripple/src/drivers/RedisDriver.d.ts +30 -1
  171. package/dist/ripple/src/drivers/index.d.ts +1 -0
  172. package/dist/ripple/src/engines/BunEngine.d.ts +98 -0
  173. package/dist/ripple/src/engines/IRippleEngine.d.ts +205 -0
  174. package/dist/ripple/src/engines/UWebSocketsEngine.d.ts +97 -0
  175. package/dist/ripple/src/engines/WsEngine.d.ts +69 -0
  176. package/dist/ripple/src/engines/index.d.ts +15 -0
  177. package/dist/ripple/src/index.d.ts +2 -0
  178. package/dist/ripple/src/middleware/InterceptorManager.d.ts +21 -0
  179. package/dist/ripple/src/observability/RippleMetrics.d.ts +24 -0
  180. package/dist/ripple/src/reliability/AckManager.d.ts +48 -0
  181. package/dist/ripple/src/serializers/ISerializer.d.ts +39 -0
  182. package/dist/ripple/src/serializers/JsonSerializer.d.ts +19 -0
  183. package/dist/ripple/src/serializers/ProtobufSerializer.d.ts +41 -0
  184. package/dist/ripple/src/serializers/index.d.ts +3 -0
  185. package/dist/ripple/src/tracking/SessionManager.d.ts +104 -0
  186. package/dist/ripple/src/tracking/index.d.ts +1 -0
  187. package/dist/ripple/src/types.d.ts +188 -12
  188. package/dist/ripple/src/utils/MessageSerializer.d.ts +33 -23
  189. package/dist/ripple/src/utils/TokenBucket.d.ts +25 -0
  190. package/package.json +25 -8
@@ -0,0 +1,350 @@
1
+ /**
2
+ * @gravito/core - Dead Letter Queue Manager
3
+ *
4
+ * 管理失敗事件的持久化存儲
5
+ * 支持 CRUD、重新入隊、批量重試和統計功能
6
+ */
7
+ import type { ConnectionContract } from '@gravito/atlas';
8
+ import type { EventOptions } from '../events/EventOptions';
9
+ import type { RetryPolicy } from './RetryPolicy';
10
+ /**
11
+ * DLQ 事件的數據庫記錄
12
+ */
13
+ export interface DLQRecord {
14
+ id: number;
15
+ dlq_id: string;
16
+ event_name: string;
17
+ event_payload: unknown;
18
+ event_options: unknown;
19
+ attempt_count: number;
20
+ max_retries: number;
21
+ next_retry_at: string | null;
22
+ last_error: unknown;
23
+ status: 'pending' | 'requeued' | 'resolved' | 'abandoned';
24
+ resolution_notes: string | null;
25
+ failed_at: string;
26
+ created_at: string;
27
+ updated_at: string;
28
+ }
29
+ /**
30
+ * DLQ 事件查詢過濾選項(for DeadLetterQueueManager)
31
+ */
32
+ export interface DLQManagerFilter {
33
+ /** 按事件名稱篩選 */
34
+ eventName?: string;
35
+ /** 按狀態篩選 */
36
+ status?: 'pending' | 'requeued' | 'resolved' | 'abandoned';
37
+ /** 開始時間 */
38
+ from?: Date;
39
+ /** 結束時間 */
40
+ to?: Date;
41
+ /** 結果數量限制 */
42
+ limit?: number;
43
+ /** 分頁偏移 */
44
+ offset?: number;
45
+ }
46
+ /**
47
+ * DLQ 統計信息
48
+ */
49
+ export interface DLQStats {
50
+ /** 事件總數 */
51
+ total: number;
52
+ /** 按事件名稱的統計 */
53
+ byEvent: Record<string, number>;
54
+ /** 按狀態的統計 */
55
+ byStatus: Record<string, number>;
56
+ }
57
+ /**
58
+ * Dead Letter Queue 管理器
59
+ *
60
+ * 負責管理失敗事件的持久化存儲,支持:
61
+ * - 自動將失敗事件移至 DLQ
62
+ * - 查詢和篩選 DLQ 事件
63
+ * - 重新入隊單個或批量事件
64
+ * - 標記事件為已解決或已放棄
65
+ * - 查看統計信息
66
+ *
67
+ * @example
68
+ * ```typescript
69
+ * const db = container.make('db') as ConnectionContract
70
+ * const dlqManager = new DeadLetterQueueManager(db)
71
+ *
72
+ * // 將失敗事件移至 DLQ
73
+ * const dlqId = await dlqManager.moveToDlq(
74
+ * 'order:created',
75
+ * { orderId: '123' },
76
+ * { retry: {...} },
77
+ * error,
78
+ * 3
79
+ * )
80
+ *
81
+ * // 查詢 DLQ 事件
82
+ * const events = await dlqManager.list({ event: 'order:created', status: 'pending' })
83
+ *
84
+ * // 重新入隊
85
+ * await dlqManager.requeue(dlqId)
86
+ *
87
+ * // 批量重試
88
+ * const result = await dlqManager.retryBatch({ eventName: 'order:created' })
89
+ *
90
+ * // 統計
91
+ * const stats = await dlqManager.getStats()
92
+ * ```
93
+ */
94
+ export declare class DeadLetterQueueManager {
95
+ private db;
96
+ private retryEngine;
97
+ constructor(db: ConnectionContract);
98
+ /**
99
+ * 將失敗事件移至死信隊列
100
+ *
101
+ * @param eventName - 事件名稱
102
+ * @param payload - 事件負載
103
+ * @param options - 事件選項
104
+ * @param error - 導致失敗的錯誤
105
+ * @param attemptCount - 當前嘗試次數
106
+ * @param retryPolicy - 重試策略配置
107
+ * @returns DLQ 記錄的 UUID
108
+ *
109
+ * @example
110
+ * ```typescript
111
+ * const dlqId = await dlqManager.moveToDlq(
112
+ * 'order:created',
113
+ * { orderId: 'ORD-123' },
114
+ * { retry: { maxRetries: 3, backoff: 'exponential' } },
115
+ * new Error('Service unavailable'),
116
+ * 3,
117
+ * { maxRetries: 3, backoff: 'exponential', initialDelayMs: 1000, maxDelayMs: 30000 }
118
+ * )
119
+ * ```
120
+ */
121
+ moveToDlq(eventName: string, payload: unknown, options: EventOptions, error: Error, attemptCount: number, retryPolicy?: RetryPolicy): Promise<string>;
122
+ /**
123
+ * 按 DLQ ID 獲取單個事件
124
+ *
125
+ * @param dlqId - DLQ 事件的 UUID
126
+ * @returns DLQ 記錄,若不存在則返回 undefined
127
+ *
128
+ * @example
129
+ * ```typescript
130
+ * const event = await dlqManager.getById('550e8400-e29b-41d4-a716-446655440000')
131
+ * if (event) {
132
+ * console.log(event.event_name, event.status)
133
+ * }
134
+ * ```
135
+ */
136
+ getById(dlqId: string): Promise<DLQRecord | undefined>;
137
+ /**
138
+ * 查詢 DLQ 事件
139
+ *
140
+ * @param filter - 查詢過濾條件
141
+ * @returns DLQ 記錄列表(按失敗時間倒序)
142
+ *
143
+ * @example
144
+ * ```typescript
145
+ * // 查詢特定事件的待處理事件
146
+ * const events = await dlqManager.list({
147
+ * eventName: 'order:created',
148
+ * status: 'pending',
149
+ * limit: 50
150
+ * })
151
+ *
152
+ * // 查詢時間範圍內的所有失敗事件
153
+ * const eventsInRange = await dlqManager.list({
154
+ * from: new Date('2026-02-01'),
155
+ * to: new Date('2026-02-03'),
156
+ * limit: 100
157
+ * })
158
+ * ```
159
+ */
160
+ list(filter?: DLQManagerFilter): Promise<DLQRecord[]>;
161
+ /**
162
+ * 重新入隊單個 DLQ 事件
163
+ *
164
+ * 重新入隊不會自動派發事件,而是標記狀態為 'requeued'
165
+ * 實際的事件派發應由調用者負責處理
166
+ *
167
+ * @param dlqId - DLQ 事件的 UUID
168
+ * @throws 如果事件不存在
169
+ *
170
+ * @example
171
+ * ```typescript
172
+ * const event = await dlqManager.getById(dlqId)
173
+ * if (event) {
174
+ * // 由調用者決定如何派發事件
175
+ * await eventSystem.doActionAsync(
176
+ * event.event_name,
177
+ * event.event_payload,
178
+ * event.event_options
179
+ * )
180
+ *
181
+ * // 標記為已重新入隊
182
+ * await dlqManager.requeue(dlqId)
183
+ * }
184
+ * ```
185
+ */
186
+ requeue(dlqId: string): Promise<void>;
187
+ /**
188
+ * 批量重新入隊 DLQ 事件
189
+ *
190
+ * @param filter - 查詢過濾條件
191
+ * @returns 包含處理結果的統計對象
192
+ *
193
+ * @example
194
+ * ```typescript
195
+ * const result = await dlqManager.retryBatch({
196
+ * eventName: 'order:created',
197
+ * status: 'pending'
198
+ * })
199
+ *
200
+ * console.log(`Success: ${result.succeeded}, Failed: ${result.failed}`)
201
+ * ```
202
+ */
203
+ retryBatch(filter?: DLQManagerFilter): Promise<{
204
+ total: number;
205
+ succeeded: number;
206
+ failed: number;
207
+ }>;
208
+ /**
209
+ * 標記 DLQ 事件為已解決
210
+ *
211
+ * @param dlqId - DLQ 事件的 UUID
212
+ * @param notes - 解決說明
213
+ *
214
+ * @example
215
+ * ```typescript
216
+ * await dlqManager.resolve(dlqId, 'Manual fix applied: Database issue resolved')
217
+ * ```
218
+ */
219
+ resolve(dlqId: string, notes?: string): Promise<void>;
220
+ /**
221
+ * 放棄 DLQ 事件(不再重試)
222
+ *
223
+ * @param dlqId - DLQ 事件的 UUID
224
+ * @param reason - 放棄原因
225
+ *
226
+ * @example
227
+ * ```typescript
228
+ * await dlqManager.abandon(dlqId, 'Data corrupted, cannot recover')
229
+ * ```
230
+ */
231
+ abandon(dlqId: string, reason?: string): Promise<void>;
232
+ /**
233
+ * 更新 DLQ 事件狀態
234
+ *
235
+ * @param dlqId - DLQ 事件的 UUID
236
+ * @param status - 新狀態
237
+ * @param notes - 狀態變更說明
238
+ * @throws 如果事件不存在
239
+ *
240
+ * @internal
241
+ */
242
+ updateStatus(dlqId: string, status: 'pending' | 'requeued' | 'resolved' | 'abandoned', notes?: string): Promise<void>;
243
+ /**
244
+ * 刪除單個 DLQ 事件
245
+ *
246
+ * @param dlqId - DLQ 事件的 UUID
247
+ * @returns true 如果刪除成功,false 如果事件不存在
248
+ *
249
+ * @example
250
+ * ```typescript
251
+ * const deleted = await dlqManager.deleteEntry(dlqId)
252
+ * if (deleted) {
253
+ * console.log('Event deleted')
254
+ * }
255
+ * ```
256
+ */
257
+ deleteEntry(dlqId: string): Promise<boolean>;
258
+ /**
259
+ * 刪除多個 DLQ 事件
260
+ *
261
+ * @param dlqIds - DLQ 事件 UUID 列表
262
+ * @returns 刪除的事件數量
263
+ *
264
+ * @example
265
+ * ```typescript
266
+ * const deletedCount = await dlqManager.deleteEntries([id1, id2, id3])
267
+ * ```
268
+ */
269
+ deleteEntries(dlqIds: string[]): Promise<number>;
270
+ /**
271
+ * 獲取 DLQ 統計信息
272
+ *
273
+ * @returns 包含總數、按事件名稱和狀態的統計信息
274
+ *
275
+ * @example
276
+ * ```typescript
277
+ * const stats = await dlqManager.getStats()
278
+ *
279
+ * console.log(`Total events: ${stats.total}`)
280
+ * console.log('By event:', stats.byEvent)
281
+ * // Output: { 'order:created': 145, 'payment:succeeded': 23 }
282
+ *
283
+ * console.log('By status:', stats.byStatus)
284
+ * // Output: { pending: 120, requeued: 15, resolved: 8, abandoned: 2 }
285
+ * ```
286
+ */
287
+ getStats(): Promise<DLQStats>;
288
+ /**
289
+ * 獲取某個事件名稱的 DLQ 事件數
290
+ *
291
+ * @param eventName - 事件名稱
292
+ * @returns 事件數量
293
+ *
294
+ * @example
295
+ * ```typescript
296
+ * const count = await dlqManager.getCountByEvent('order:created')
297
+ * ```
298
+ */
299
+ getCountByEvent(eventName: string): Promise<number>;
300
+ /**
301
+ * 清空所有 DLQ 事件(慎用!)
302
+ *
303
+ * @param includeResolved - 是否包含已解決的事件
304
+ * @returns 清空的事件數量
305
+ *
306
+ * @example
307
+ * ```typescript
308
+ * // 只清空待處理的事件
309
+ * const count = await dlqManager.clear(false)
310
+ *
311
+ * // 清空所有事件(包括已解決和已放棄)
312
+ * const countAll = await dlqManager.clear(true)
313
+ * ```
314
+ */
315
+ clear(includeResolved?: boolean): Promise<number>;
316
+ /**
317
+ * 通過 Bull Job ID 查找 DLQ 記錄
318
+ *
319
+ * 用於 MessageQueueBridge 集成:當 Bull Queue job 失敗時,
320
+ * 通過 Job ID 查找相應的 DLQ 記錄。
321
+ *
322
+ * @param bullJobId - Bull Queue Job ID
323
+ * @returns DLQ 記錄或 undefined
324
+ *
325
+ * @example
326
+ * ```typescript
327
+ * const record = await dlqManager.findByBullJobId('job-abc123')
328
+ * if (record) {
329
+ * console.log(`Event ${record.event_name} is in DLQ`)
330
+ * }
331
+ * ```
332
+ */
333
+ findByBullJobId(bullJobId: string): Promise<DLQRecord | undefined>;
334
+ /**
335
+ * 調度延遲重試(整合 Bull Queue delayed jobs)
336
+ *
337
+ * 從 DLQ 中提取事件,通過 Bull Queue 的延遲 job 功能進行重試。
338
+ *
339
+ * @param dlqId - DLQ 記錄 ID
340
+ * @param delayMs - 延遲時間(毫秒)
341
+ * @throws 如果記錄不存在
342
+ *
343
+ * @example
344
+ * ```typescript
345
+ * // 延遲 1 小時後重試
346
+ * await dlqManager.scheduleRetry('dlq-uuid-123', 3600000)
347
+ * ```
348
+ */
349
+ scheduleRetry(dlqId: string, delayMs: number): Promise<void>;
350
+ }
@@ -0,0 +1,217 @@
1
+ /**
2
+ * @gravito/core - Retry Policy
3
+ *
4
+ * 重試策略和退避算法的實現
5
+ * 支持指數和線性退避,包含 Jitter 防止雷鳴羊群
6
+ */
7
+ /**
8
+ * 重試策略配置接口
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * const policy: RetryPolicy = {
13
+ * maxRetries: 3,
14
+ * backoff: 'exponential',
15
+ * initialDelayMs: 1000,
16
+ * maxDelayMs: 30000,
17
+ * dlqAfterMaxRetries: true
18
+ * }
19
+ * ```
20
+ */
21
+ export interface RetryPolicy {
22
+ /** 最大重試次數 */
23
+ maxRetries: number;
24
+ /** 退避策略:指數或線性 */
25
+ backoff: 'exponential' | 'linear';
26
+ /** 初始延遲時間(毫秒) */
27
+ initialDelayMs: number;
28
+ /** 最大延遲時間(毫秒) */
29
+ maxDelayMs: number;
30
+ /** 超過最大重試次數後是否發送到死信隊列 */
31
+ dlqAfterMaxRetries?: boolean;
32
+ }
33
+ /**
34
+ * 重試引擎
35
+ *
36
+ * 負責計算重試延遲、判斷是否應該重試等邏輯
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * const engine = new RetryEngine()
41
+ * const delay = engine.calculateDelay(1, policy)
42
+ * const shouldRetry = engine.shouldRetry(3, policy)
43
+ * ```
44
+ */
45
+ export declare class RetryEngine {
46
+ /**
47
+ * 計算下次重試的延遲時間(毫秒)
48
+ *
49
+ * @param attemptCount - 當前嘗試次數(從 1 開始)
50
+ * @param policy - 重試策略配置
51
+ * @returns 延遲時間(毫秒)
52
+ *
53
+ * @description
54
+ * - 指數退避:delay = initialDelay * 2^(attemptCount - 1)
55
+ * - 線性退避:delay = initialDelay * attemptCount
56
+ * - 添加隨機抖動(Jitter),防止雷鳴羊群問題
57
+ * - 結果不超過 maxDelayMs
58
+ *
59
+ * @example
60
+ * ```typescript
61
+ * const policy: RetryPolicy = {
62
+ * maxRetries: 3,
63
+ * backoff: 'exponential',
64
+ * initialDelayMs: 1000,
65
+ * maxDelayMs: 30000
66
+ * }
67
+ *
68
+ * // 第 1 次重試:1000ms * 2^0 = 1000ms (加抖動)
69
+ * const delay1 = engine.calculateDelay(1, policy) // ~1100ms
70
+ *
71
+ * // 第 2 次重試:1000ms * 2^1 = 2000ms (加抖動)
72
+ * const delay2 = engine.calculateDelay(2, policy) // ~2200ms
73
+ *
74
+ * // 第 3 次重試:1000ms * 2^2 = 4000ms (加抖動)
75
+ * const delay3 = engine.calculateDelay(3, policy) // ~4400ms
76
+ * ```
77
+ */
78
+ calculateDelay(attemptCount: number, policy: RetryPolicy): number;
79
+ /**
80
+ * 判斷是否應該重試
81
+ *
82
+ * @param attemptCount - 當前嘗試次數(從 1 開始)
83
+ * @param policy - 重試策略配置
84
+ * @returns 是否應該重試
85
+ *
86
+ * @description
87
+ * 當 attemptCount < maxRetries 時返回 true
88
+ *
89
+ * @example
90
+ * ```typescript
91
+ * const policy = { maxRetries: 3, ... }
92
+ *
93
+ * engine.shouldRetry(1, policy) // true(1 < 3)
94
+ * engine.shouldRetry(3, policy) // false(3 >= 3)
95
+ * engine.shouldRetry(4, policy) // false(4 >= 3)
96
+ * ```
97
+ */
98
+ shouldRetry(attemptCount: number, policy: RetryPolicy): boolean;
99
+ /**
100
+ * 獲取退避時間(包含延遲計算和 Jitter)
101
+ *
102
+ * @param retryCount - 重試次數(從 0 開始)
103
+ * @param policy - 重試策略配置
104
+ * @returns 退避時間(毫秒)
105
+ *
106
+ * @description
107
+ * 這是 calculateDelay 的別名,但接收的是從 0 開始的重試計數
108
+ *
109
+ * @example
110
+ * ```typescript
111
+ * const policy = { maxRetries: 3, initialDelayMs: 1000, maxDelayMs: 30000, backoff: 'exponential' }
112
+ *
113
+ * // 第 0 次重試(第 1 次嘗試失敗)
114
+ * const time1 = engine.getBackoffTime(0, policy) // ~1100ms
115
+ *
116
+ * // 第 1 次重試(第 2 次嘗試失敗)
117
+ * const time2 = engine.getBackoffTime(1, policy) // ~2200ms
118
+ * ```
119
+ */
120
+ getBackoffTime(retryCount: number, policy: RetryPolicy): number;
121
+ /**
122
+ * 計算下次重試的絕對時間
123
+ *
124
+ * @param retryCount - 重試次數(從 0 開始)
125
+ * @param policy - 重試策略配置
126
+ * @param baseTime - 基礎時間戳(默認為當前時間)
127
+ * @returns 下次重試的時間戳(毫秒)
128
+ *
129
+ * @example
130
+ * ```typescript
131
+ * const policy = { maxRetries: 3, initialDelayMs: 1000, maxDelayMs: 30000, backoff: 'exponential' }
132
+ *
133
+ * const now = Date.now()
134
+ * const nextRetryTime = engine.getNextRetryTime(0, policy, now)
135
+ * // 返回大約 now + 1000 + jitter
136
+ * ```
137
+ */
138
+ getNextRetryTime(retryCount: number, policy: RetryPolicy, baseTime?: number): number;
139
+ /**
140
+ * 驗證重試策略配置
141
+ *
142
+ * @param policy - 重試策略配置
143
+ * @returns 是否有效
144
+ *
145
+ * @description
146
+ * 檢查配置是否合理:
147
+ * - maxRetries >= 0
148
+ * - initialDelayMs > 0
149
+ * - maxDelayMs >= initialDelayMs
150
+ *
151
+ * @example
152
+ * ```typescript
153
+ * const validPolicy = { maxRetries: 3, initialDelayMs: 1000, maxDelayMs: 30000, backoff: 'exponential' }
154
+ * engine.isValidPolicy(validPolicy) // true
155
+ *
156
+ * const invalidPolicy = { maxRetries: 3, initialDelayMs: 5000, maxDelayMs: 1000, backoff: 'exponential' }
157
+ * engine.isValidPolicy(invalidPolicy) // false (maxDelayMs < initialDelayMs)
158
+ * ```
159
+ */
160
+ isValidPolicy(policy: RetryPolicy): boolean;
161
+ /**
162
+ * 獲取人類可讀的重試信息
163
+ *
164
+ * @param attemptCount - 當前嘗試次數(從 1 開始)
165
+ * @param policy - 重試策略配置
166
+ * @returns 描述性文本
167
+ *
168
+ * @example
169
+ * ```typescript
170
+ * const policy = { maxRetries: 3, initialDelayMs: 1000, maxDelayMs: 30000, backoff: 'exponential' }
171
+ *
172
+ * engine.getRetryInfo(1, policy) // "Retry 1 of 3, will retry in ~1100ms"
173
+ * engine.getRetryInfo(3, policy) // "Retry 3 of 3 (final attempt), will retry in ~4400ms"
174
+ * engine.getRetryInfo(4, policy) // "Max retries exceeded (4 >= 3)"
175
+ * ```
176
+ */
177
+ getRetryInfo(attemptCount: number, policy: RetryPolicy): string;
178
+ }
179
+ /**
180
+ * 創建默認的重試策略
181
+ *
182
+ * @returns 默認重試策略
183
+ *
184
+ * @description
185
+ * 默認配置:
186
+ * - 最多重試 3 次
187
+ * - 指數退避
188
+ * - 初始延遲 1 秒
189
+ * - 最大延遲 30 秒
190
+ * - 超過最大重試後發送 DLQ
191
+ *
192
+ * @example
193
+ * ```typescript
194
+ * const policy = getDefaultRetryPolicy()
195
+ * // { maxRetries: 3, backoff: 'exponential', initialDelayMs: 1000, maxDelayMs: 30000, dlqAfterMaxRetries: true }
196
+ * ```
197
+ */
198
+ export declare function getDefaultRetryPolicy(): RetryPolicy;
199
+ /**
200
+ * 為不同類型的操作獲取預設的重試策略
201
+ *
202
+ * @param type - 操作類型
203
+ * @returns 推薦的重試策略
204
+ *
205
+ * @example
206
+ * ```typescript
207
+ * // 外部 API 調用:更多重試,更長延遲
208
+ * const apiPolicy = getPresetRetryPolicy('external-api')
209
+ *
210
+ * // 數據庫操作:較少重試,短延遲
211
+ * const dbPolicy = getPresetRetryPolicy('database')
212
+ *
213
+ * // 消息隊列:適中重試
214
+ * const mqPolicy = getPresetRetryPolicy('message-queue')
215
+ * ```
216
+ */
217
+ export declare function getPresetRetryPolicy(type: 'external-api' | 'database' | 'message-queue' | 'default'): RetryPolicy;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Reliability and retry exports.
3
+ * @packageDocumentation
4
+ */
5
+ export { DeadLetterQueueManager, type DLQManagerFilter, type DLQRecord, type DLQStats, } from './DeadLetterQueueManager';
6
+ export { getDefaultRetryPolicy, getPresetRetryPolicy, RetryEngine, type RetryPolicy, } from './RetryPolicy';
@@ -0,0 +1,12 @@
1
+ import type { GravitoHandler } from '../http/types';
2
+ import type { PlanetCore } from '../PlanetCore';
3
+ import type { ControllerClass } from '../Router';
4
+ export declare class ControllerDispatcher {
5
+ private core;
6
+ private controllers;
7
+ constructor(core: PlanetCore);
8
+ /**
9
+ * Resolve Controller Instance and Method
10
+ */
11
+ resolve(CtrlClass: ControllerClass, methodName: string): GravitoHandler;
12
+ }
@@ -0,0 +1,20 @@
1
+ import type { GravitoMiddleware } from '../http/types';
2
+ import { type FormRequestClass } from '../Router';
3
+ /**
4
+ * Handles validation of incoming requests using FormRequest classes.
5
+ * Provides mechanisms to detect and convert FormRequest classes into Gravito middleware.
6
+ */
7
+ export declare class RequestValidator {
8
+ /**
9
+ * Check if a value is a FormRequest class.
10
+ * Optimized with Symbol check, prototype check, and caching.
11
+ * @internal
12
+ */
13
+ static isFormRequestClass(value: unknown): value is FormRequestClass;
14
+ /**
15
+ * Convert a FormRequest class to middleware.
16
+ * Uses instance caching to avoid re-instantiation on every request.
17
+ * @internal
18
+ */
19
+ static formRequestToMiddleware(RequestClass: FormRequestClass): GravitoMiddleware;
20
+ }