@gravito/ripple 4.0.0 → 4.0.3
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/README.md +26 -10
- package/dist/{ripple/src/OrbitRipple.d.ts → OrbitRipple.d.ts} +1 -0
- package/dist/{ripple/src/RippleServer.d.ts → RippleServer.d.ts} +32 -2
- package/dist/core/src/Application.d.ts +41 -0
- package/dist/core/src/ConfigManager.d.ts +39 -0
- package/dist/core/src/Container/RequestScopeManager.d.ts +62 -0
- package/dist/core/src/Container/RequestScopeMetrics.d.ts +144 -0
- package/dist/core/src/Container.d.ts +45 -0
- package/dist/core/src/ErrorHandler.d.ts +3 -0
- package/dist/core/src/HookManager.d.ts +104 -165
- package/dist/core/src/PlanetCore.d.ts +114 -1
- package/dist/core/src/RequestContext.d.ts +97 -0
- package/dist/core/src/Router.d.ts +32 -46
- package/dist/core/src/ServiceProvider.d.ts +22 -0
- package/dist/core/src/adapters/bun/BunContext.d.ts +10 -1
- package/dist/core/src/adapters/bun/BunNativeAdapter.d.ts +35 -0
- package/dist/core/src/adapters/bun/BunWebSocketHandler.d.ts +48 -0
- package/dist/core/src/adapters/bun/RadixRouter.d.ts +1 -0
- package/dist/core/src/adapters/bun/index.d.ts +7 -0
- package/dist/core/src/binary/BinaryUtils.d.ts +105 -0
- package/dist/core/src/binary/index.d.ts +5 -0
- package/dist/core/src/cli/queue-commands.d.ts +6 -0
- package/dist/core/src/compat/async-local-storage.d.ts +7 -0
- package/dist/core/src/compat/crypto.d.ts +6 -0
- package/dist/core/src/engine/AOTRouter.d.ts +16 -1
- package/dist/core/src/engine/FastContext.d.ts +42 -1
- package/dist/core/src/engine/Gravito.d.ts +13 -19
- package/dist/core/src/engine/MinimalContext.d.ts +23 -0
- package/dist/core/src/engine/analyzer.d.ts +92 -6
- package/dist/core/src/engine/types.d.ts +6 -0
- package/dist/core/src/error-handling/RequestScopeErrorContext.d.ts +126 -0
- package/dist/core/src/events/BackpressureManager.d.ts +215 -0
- package/dist/core/src/events/DeadLetterQueue.d.ts +75 -1
- package/dist/core/src/events/EventBackend.d.ts +2 -1
- package/dist/core/src/events/EventOptions.d.ts +99 -4
- package/dist/core/src/events/EventPriorityQueue.d.ts +36 -175
- package/dist/core/src/events/FlowControlStrategy.d.ts +109 -0
- package/dist/core/src/events/MessageQueueBridge.d.ts +184 -0
- package/dist/core/src/events/PriorityEscalationManager.d.ts +82 -0
- package/dist/core/src/events/RetryScheduler.d.ts +104 -0
- package/dist/core/src/events/WorkerPool.d.ts +98 -0
- package/dist/core/src/events/WorkerPoolConfig.d.ts +153 -0
- package/dist/core/src/events/WorkerPoolMetrics.d.ts +65 -0
- package/dist/core/src/events/aggregation/AggregationWindow.d.ts +77 -0
- package/dist/core/src/events/aggregation/DeduplicationManager.d.ts +135 -0
- package/dist/core/src/events/aggregation/EventAggregationManager.d.ts +108 -0
- package/dist/core/src/events/aggregation/EventBatcher.d.ts +99 -0
- package/dist/core/src/events/aggregation/types.d.ts +117 -0
- package/dist/core/src/events/index.d.ts +18 -6
- package/dist/core/src/events/observability/OTelEventMetrics.d.ts +92 -0
- package/dist/core/src/events/observability/StreamWorkerMetrics.d.ts +76 -0
- package/dist/core/src/events/observability/index.d.ts +4 -0
- package/dist/core/src/events/queue-core.d.ts +77 -0
- package/dist/core/src/events/task-executor.d.ts +51 -0
- package/dist/core/src/events/types.d.ts +59 -0
- package/dist/core/src/ffi/NativeAccelerator.d.ts +62 -0
- package/dist/core/src/ffi/NativeHasher.d.ts +139 -0
- package/dist/core/src/ffi/cbor-fallback.d.ts +96 -0
- package/dist/core/src/ffi/hash-fallback.d.ts +33 -0
- package/dist/core/src/ffi/index.d.ts +10 -0
- package/dist/core/src/ffi/types.d.ts +135 -0
- package/dist/core/src/health/HealthProvider.d.ts +67 -0
- package/dist/core/src/helpers/Str.d.ts +15 -0
- package/dist/core/src/hooks/ActionManager.d.ts +132 -0
- package/dist/core/src/hooks/AsyncDetector.d.ts +84 -0
- package/dist/core/src/hooks/FilterManager.d.ts +71 -0
- package/dist/core/src/hooks/MigrationWarner.d.ts +24 -0
- package/dist/core/src/hooks/dlq-operations.d.ts +60 -0
- package/dist/core/src/hooks/types.d.ts +107 -0
- package/dist/core/src/http/CookieJar.d.ts +2 -2
- package/dist/core/src/http/types.d.ts +43 -3
- package/dist/core/src/index.d.ts +504 -15
- package/dist/core/src/observability/QueueDashboard.d.ts +136 -0
- package/dist/core/src/observability/contracts.d.ts +137 -0
- package/dist/core/src/reliability/DeadLetterQueueManager.d.ts +36 -3
- package/dist/core/src/runtime/adapter-bun.d.ts +12 -0
- package/dist/core/src/runtime/adapter-deno.d.ts +12 -0
- package/dist/core/src/runtime/adapter-node.d.ts +12 -0
- package/dist/core/src/runtime/adapter-unknown.d.ts +13 -0
- package/dist/core/src/runtime/archive.d.ts +17 -0
- package/dist/core/src/runtime/compression.d.ts +21 -0
- package/dist/core/src/runtime/deep-equals.d.ts +56 -0
- package/dist/core/src/runtime/detection.d.ts +22 -0
- package/dist/core/src/runtime/escape.d.ts +34 -0
- package/dist/core/src/runtime/index.d.ts +44 -0
- package/dist/core/src/runtime/markdown.d.ts +44 -0
- package/dist/core/src/runtime/types.d.ts +436 -0
- package/dist/core/src/runtime-helpers.d.ts +67 -0
- package/dist/core/src/runtime.d.ts +10 -118
- package/dist/core/src/testing/HttpTester.d.ts +1 -0
- package/dist/core/src/transpiler-utils.d.ts +170 -0
- package/dist/{ripple/src/engines → engines}/BunEngine.d.ts +11 -0
- package/dist/engines/UWebSocketsEngine.d.ts +97 -0
- package/dist/engines/WsEngine.d.ts +69 -0
- package/dist/{ripple/src/engines → engines}/index.d.ts +4 -0
- package/dist/index.js +1 -7139
- package/dist/index.js.map +3 -69
- package/dist/{ripple/src/serializers → serializers}/ISerializer.d.ts +1 -1
- package/dist/{ripple/src/serializers → serializers}/JsonSerializer.d.ts +1 -1
- package/dist/{ripple/src/serializers → serializers}/ProtobufSerializer.d.ts +6 -3
- package/dist/{ripple/src/types.d.ts → types.d.ts} +11 -0
- package/package.json +7 -2
- package/dist/atlas/src/DB.d.ts +0 -301
- package/dist/atlas/src/OrbitAtlas.d.ts +0 -9
- package/dist/atlas/src/config/defineConfig.d.ts +0 -14
- package/dist/atlas/src/config/index.d.ts +0 -7
- package/dist/atlas/src/config/loadConfig.d.ts +0 -48
- package/dist/atlas/src/connection/Connection.d.ts +0 -108
- package/dist/atlas/src/connection/ConnectionManager.d.ts +0 -111
- package/dist/atlas/src/drivers/BunSQLDriver.d.ts +0 -32
- package/dist/atlas/src/drivers/BunSQLPreparedStatement.d.ts +0 -118
- package/dist/atlas/src/drivers/MongoDBDriver.d.ts +0 -36
- package/dist/atlas/src/drivers/MySQLDriver.d.ts +0 -66
- package/dist/atlas/src/drivers/PostgresDriver.d.ts +0 -83
- package/dist/atlas/src/drivers/RedisDriver.d.ts +0 -43
- package/dist/atlas/src/drivers/SQLiteDriver.d.ts +0 -45
- package/dist/atlas/src/drivers/types.d.ts +0 -260
- package/dist/atlas/src/errors/index.d.ts +0 -45
- package/dist/atlas/src/grammar/Grammar.d.ts +0 -342
- package/dist/atlas/src/grammar/MongoGrammar.d.ts +0 -47
- package/dist/atlas/src/grammar/MySQLGrammar.d.ts +0 -54
- package/dist/atlas/src/grammar/NullGrammar.d.ts +0 -35
- package/dist/atlas/src/grammar/PostgresGrammar.d.ts +0 -62
- package/dist/atlas/src/grammar/SQLiteGrammar.d.ts +0 -32
- package/dist/atlas/src/index.d.ts +0 -67
- package/dist/atlas/src/migration/Migration.d.ts +0 -64
- package/dist/atlas/src/migration/MigrationRepository.d.ts +0 -65
- package/dist/atlas/src/migration/Migrator.d.ts +0 -110
- package/dist/atlas/src/migration/index.d.ts +0 -6
- package/dist/atlas/src/observability/AtlasMetrics.d.ts +0 -11
- package/dist/atlas/src/observability/AtlasObservability.d.ts +0 -15
- package/dist/atlas/src/observability/AtlasTracer.d.ts +0 -12
- package/dist/atlas/src/observability/index.d.ts +0 -9
- package/dist/atlas/src/orm/index.d.ts +0 -5
- package/dist/atlas/src/orm/model/DirtyTracker.d.ts +0 -121
- package/dist/atlas/src/orm/model/Model.d.ts +0 -449
- package/dist/atlas/src/orm/model/ModelRegistry.d.ts +0 -20
- package/dist/atlas/src/orm/model/concerns/HasAttributes.d.ts +0 -136
- package/dist/atlas/src/orm/model/concerns/HasEvents.d.ts +0 -36
- package/dist/atlas/src/orm/model/concerns/HasPersistence.d.ts +0 -87
- package/dist/atlas/src/orm/model/concerns/HasRelationships.d.ts +0 -117
- package/dist/atlas/src/orm/model/concerns/HasSerialization.d.ts +0 -64
- package/dist/atlas/src/orm/model/concerns/applyMixins.d.ts +0 -15
- package/dist/atlas/src/orm/model/concerns/index.d.ts +0 -12
- package/dist/atlas/src/orm/model/decorators.d.ts +0 -109
- package/dist/atlas/src/orm/model/errors.d.ts +0 -52
- package/dist/atlas/src/orm/model/index.d.ts +0 -10
- package/dist/atlas/src/orm/model/relationships.d.ts +0 -207
- package/dist/atlas/src/orm/model/types.d.ts +0 -12
- package/dist/atlas/src/orm/schema/SchemaRegistry.d.ts +0 -123
- package/dist/atlas/src/orm/schema/SchemaSniffer.d.ts +0 -54
- package/dist/atlas/src/orm/schema/index.d.ts +0 -6
- package/dist/atlas/src/orm/schema/types.d.ts +0 -85
- package/dist/atlas/src/query/Expression.d.ts +0 -60
- package/dist/atlas/src/query/NPlusOneDetector.d.ts +0 -10
- package/dist/atlas/src/query/QueryBuilder.d.ts +0 -573
- package/dist/atlas/src/query/clauses/GroupByClause.d.ts +0 -51
- package/dist/atlas/src/query/clauses/HavingClause.d.ts +0 -70
- package/dist/atlas/src/query/clauses/JoinClause.d.ts +0 -87
- package/dist/atlas/src/query/clauses/LimitClause.d.ts +0 -82
- package/dist/atlas/src/query/clauses/OrderByClause.d.ts +0 -69
- package/dist/atlas/src/query/clauses/SelectClause.d.ts +0 -71
- package/dist/atlas/src/query/clauses/WhereClause.d.ts +0 -167
- package/dist/atlas/src/query/clauses/index.d.ts +0 -11
- package/dist/atlas/src/schema/Blueprint.d.ts +0 -276
- package/dist/atlas/src/schema/ColumnDefinition.d.ts +0 -154
- package/dist/atlas/src/schema/ForeignKeyDefinition.d.ts +0 -37
- package/dist/atlas/src/schema/Schema.d.ts +0 -131
- package/dist/atlas/src/schema/grammars/MySQLSchemaGrammar.d.ts +0 -23
- package/dist/atlas/src/schema/grammars/PostgresSchemaGrammar.d.ts +0 -26
- package/dist/atlas/src/schema/grammars/SQLiteSchemaGrammar.d.ts +0 -28
- package/dist/atlas/src/schema/grammars/SchemaGrammar.d.ts +0 -97
- package/dist/atlas/src/schema/grammars/index.d.ts +0 -7
- package/dist/atlas/src/schema/index.d.ts +0 -8
- package/dist/atlas/src/seed/Factory.d.ts +0 -90
- package/dist/atlas/src/seed/Seeder.d.ts +0 -28
- package/dist/atlas/src/seed/SeederRunner.d.ts +0 -74
- package/dist/atlas/src/seed/index.d.ts +0 -6
- package/dist/atlas/src/types/index.d.ts +0 -1100
- package/dist/atlas/src/utils/levenshtein.d.ts +0 -9
- package/dist/core/src/adapters/PhotonAdapter.d.ts +0 -171
- package/dist/core/src/adapters/photon-types.d.ts +0 -73
- package/dist/core/src/http/middleware/BodySizeLimit.d.ts +0 -16
- package/dist/core/src/http/middleware/Cors.d.ts +0 -24
- package/dist/core/src/http/middleware/Csrf.d.ts +0 -23
- package/dist/core/src/http/middleware/HeaderTokenGate.d.ts +0 -28
- package/dist/core/src/http/middleware/SecurityHeaders.d.ts +0 -29
- package/dist/core/src/http/middleware/ThrottleRequests.d.ts +0 -18
- package/dist/core/src/instrumentation/index.d.ts +0 -35
- package/dist/core/src/instrumentation/opentelemetry.d.ts +0 -178
- package/dist/core/src/instrumentation/types.d.ts +0 -182
- package/dist/photon/src/index.d.ts +0 -84
- package/dist/photon/src/middleware/binary.d.ts +0 -31
- package/dist/photon/src/middleware/htmx.d.ts +0 -39
- package/dist/photon/src/middleware/ratelimit.d.ts +0 -157
- package/dist/photon/src/openapi.d.ts +0 -19
- /package/dist/{ripple/src/channels → channels}/Channel.d.ts +0 -0
- /package/dist/{ripple/src/channels → channels}/ChannelManager.d.ts +0 -0
- /package/dist/{ripple/src/channels → channels}/index.d.ts +0 -0
- /package/dist/{ripple/src/drivers → drivers}/LocalDriver.d.ts +0 -0
- /package/dist/{ripple/src/drivers → drivers}/NATSDriver.d.ts +0 -0
- /package/dist/{ripple/src/drivers → drivers}/RedisDriver.d.ts +0 -0
- /package/dist/{ripple/src/drivers → drivers}/index.d.ts +0 -0
- /package/dist/{ripple/src/engines → engines}/IRippleEngine.d.ts +0 -0
- /package/dist/{ripple/src/errors → errors}/RippleError.d.ts +0 -0
- /package/dist/{ripple/src/errors → errors}/index.d.ts +0 -0
- /package/dist/{ripple/src/events → events}/BroadcastEvent.d.ts +0 -0
- /package/dist/{ripple/src/events → events}/BroadcastManager.d.ts +0 -0
- /package/dist/{ripple/src/events → events}/Broadcaster.d.ts +0 -0
- /package/dist/{ripple/src/events → events}/index.d.ts +0 -0
- /package/dist/{ripple/src/health → health}/HealthChecker.d.ts +0 -0
- /package/dist/{ripple/src/health → health}/index.d.ts +0 -0
- /package/dist/{ripple/src/index.d.ts → index.d.ts} +0 -0
- /package/dist/{ripple/src/logging → logging}/Logger.d.ts +0 -0
- /package/dist/{ripple/src/logging → logging}/index.d.ts +0 -0
- /package/dist/{ripple/src/middleware → middleware}/InterceptorManager.d.ts +0 -0
- /package/dist/{ripple/src/observability → observability}/RippleMetrics.d.ts +0 -0
- /package/dist/{ripple/src/reliability → reliability}/AckManager.d.ts +0 -0
- /package/dist/{ripple/src/serializers → serializers}/index.d.ts +0 -0
- /package/dist/{ripple/src/tracking → tracking}/ConnectionTracker.d.ts +0 -0
- /package/dist/{ripple/src/tracking → tracking}/SessionManager.d.ts +0 -0
- /package/dist/{ripple/src/tracking → tracking}/index.d.ts +0 -0
- /package/dist/{ripple/src/utils → utils}/MessageSerializer.d.ts +0 -0
- /package/dist/{ripple/src/utils → utils}/TokenBucket.d.ts +0 -0
- /package/dist/{ripple/src/utils → utils}/index.d.ts +0 -0
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*
|
|
12
12
|
* @module @gravito/core/engine
|
|
13
13
|
*/
|
|
14
|
+
import { RequestScopeManager } from '../Container/RequestScopeManager';
|
|
14
15
|
import type { FastRequest, FastContext as IFastContext } from './types';
|
|
15
16
|
/**
|
|
16
17
|
* Minimal request wrapper
|
|
@@ -21,6 +22,10 @@ declare class MinimalRequest implements FastRequest {
|
|
|
21
22
|
private readonly _path;
|
|
22
23
|
private readonly _routePattern?;
|
|
23
24
|
private _searchParams;
|
|
25
|
+
private _cachedQueries;
|
|
26
|
+
private _cachedJsonPromise;
|
|
27
|
+
private _cachedTextPromise;
|
|
28
|
+
private _cachedFormDataPromise;
|
|
24
29
|
constructor(_request: Request, _params: Record<string, string>, _path: string, _routePattern?: string | undefined);
|
|
25
30
|
get url(): string;
|
|
26
31
|
get method(): string;
|
|
@@ -39,6 +44,7 @@ declare class MinimalRequest implements FastRequest {
|
|
|
39
44
|
json<T = unknown>(): Promise<T>;
|
|
40
45
|
text(): Promise<string>;
|
|
41
46
|
formData(): Promise<FormData>;
|
|
47
|
+
get cookies(): Record<string, string>;
|
|
42
48
|
get raw(): Request;
|
|
43
49
|
}
|
|
44
50
|
/**
|
|
@@ -53,6 +59,7 @@ declare class MinimalRequest implements FastRequest {
|
|
|
53
59
|
export declare class MinimalContext implements IFastContext {
|
|
54
60
|
readonly req: MinimalRequest;
|
|
55
61
|
private _resHeaders;
|
|
62
|
+
private _requestScope;
|
|
56
63
|
constructor(request: Request, params: Record<string, string>, path: string, routePattern?: string);
|
|
57
64
|
private getHeaders;
|
|
58
65
|
json<T>(data: T, status?: number): Response;
|
|
@@ -69,8 +76,24 @@ export declare class MinimalContext implements IFastContext {
|
|
|
69
76
|
unauthorized(message?: string): Response;
|
|
70
77
|
badRequest(message?: string): Response;
|
|
71
78
|
forward(target: string, _options?: any): Promise<Response>;
|
|
79
|
+
escape(html: string): string;
|
|
72
80
|
get<T>(_key: string): T;
|
|
73
81
|
set(_key: string, _value: any): void;
|
|
82
|
+
/**
|
|
83
|
+
* Get the request-scoped service manager for this request.
|
|
84
|
+
*
|
|
85
|
+
* @returns The RequestScopeManager for this request.
|
|
86
|
+
*/
|
|
87
|
+
requestScope(): RequestScopeManager;
|
|
88
|
+
/**
|
|
89
|
+
* Resolve a request-scoped service (convenience method).
|
|
90
|
+
*
|
|
91
|
+
* @template T - The service type.
|
|
92
|
+
* @param key - The service key for caching.
|
|
93
|
+
* @param factory - Factory function to create the service.
|
|
94
|
+
* @returns The cached or newly created service instance.
|
|
95
|
+
*/
|
|
96
|
+
scoped<T>(key: string | symbol, factory: () => T): T;
|
|
74
97
|
route: (name: string, params?: any, query?: any) => string;
|
|
75
98
|
get native(): this;
|
|
76
99
|
init(_request: Request, _params?: Record<string, string>, _path?: string): this;
|
|
@@ -1,27 +1,113 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Handler
|
|
2
|
+
* @fileoverview Handler 靜態分析器(Elysia-inspired,升級版)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* 分析 handler 函式,偵測其存取了哪些請求屬性,
|
|
5
|
+
* 以選擇最優化的 Context 類型(minimal/fast/full)。
|
|
6
|
+
*
|
|
7
|
+
* ## 版本歷史
|
|
8
|
+
*
|
|
9
|
+
* ### v2(目前版本)- 使用 Bun.Transpiler
|
|
10
|
+
* - 精確度:~99%(AST 層級分析)
|
|
11
|
+
* - 正確處理假陽性:`const header = '...'` 不再誤判
|
|
12
|
+
* - 支援解構賦值:`const { header } = ctx.req`
|
|
13
|
+
* - 支援 Minified 代碼(transformSync 先標準化)
|
|
14
|
+
* - Fallback:若 Transpiler 失敗,退回字串匹配
|
|
15
|
+
*
|
|
16
|
+
* ### v1(原版本)- 字串匹配
|
|
17
|
+
* - 精確度:~85%
|
|
18
|
+
* - 假陽性:變數名稱包含目標字串會誤判
|
|
19
|
+
* - 假陰性:解構賦值無法偵測
|
|
20
|
+
* - Minified 代碼可能失效
|
|
21
|
+
*
|
|
22
|
+
* @module @gravito/core/engine/analyzer
|
|
23
|
+
* @since 3.0.0
|
|
6
24
|
*/
|
|
7
25
|
/**
|
|
8
|
-
*
|
|
26
|
+
* Handler 靜態分析結果
|
|
27
|
+
*
|
|
28
|
+
* 記錄 handler 函式使用了哪些請求屬性,
|
|
29
|
+
* 用於選擇最優化的 Context 類型。
|
|
9
30
|
*
|
|
10
31
|
* @public
|
|
11
32
|
* @since 3.0.0
|
|
12
33
|
*/
|
|
13
34
|
export interface HandlerAnalysis {
|
|
35
|
+
/** 是否存取了 request headers */
|
|
14
36
|
usesHeaders: boolean;
|
|
37
|
+
/** 是否存取了 query string 參數 */
|
|
15
38
|
usesQuery: boolean;
|
|
39
|
+
/** 是否存取了 request body */
|
|
16
40
|
usesBody: boolean;
|
|
41
|
+
/** 是否存取了 route 路徑參數 */
|
|
17
42
|
usesParams: boolean;
|
|
43
|
+
/** 是否為非同步函式(含 async/await) */
|
|
18
44
|
isAsync: boolean;
|
|
19
45
|
}
|
|
20
46
|
/**
|
|
21
|
-
*
|
|
47
|
+
* 分析 handler 函式,偵測其使用了哪些請求屬性
|
|
48
|
+
*
|
|
49
|
+
* 使用 Bun.Transpiler 進行 AST 層級的精確分析(精確度 ~99%)。
|
|
50
|
+
* 若 Transpiler 不可用,自動 fallback 到字串匹配(精確度 ~85%)。
|
|
51
|
+
*
|
|
52
|
+
* ## 精確度提升說明
|
|
53
|
+
*
|
|
54
|
+
* **假陽性修復**(原本誤判,現在正確):
|
|
55
|
+
* ```typescript
|
|
56
|
+
* // 這個 handler 原本會誤判 usesHeaders = true
|
|
57
|
+
* // 因為字串 'header' 出現在變數名稱中
|
|
58
|
+
* function handler(ctx) {
|
|
59
|
+
* const header = 'Content-Type' // ← 變數名稱,不是 API 呼叫
|
|
60
|
+
* return ctx.json({ header })
|
|
61
|
+
* }
|
|
62
|
+
* // 現在:usesHeaders = false ✅
|
|
63
|
+
* ```
|
|
64
|
+
*
|
|
65
|
+
* **假陰性修復**(原本漏偵測,現在正確):
|
|
66
|
+
* ```typescript
|
|
67
|
+
* // 這個 handler 原本會漏偵測解構賦值
|
|
68
|
+
* function handler(ctx) {
|
|
69
|
+
* const { header, query } = ctx.req // ← 解構賦值
|
|
70
|
+
* return ctx.json({ header })
|
|
71
|
+
* }
|
|
72
|
+
* // 現在:usesHeaders = true, usesQuery = true ✅
|
|
73
|
+
* ```
|
|
74
|
+
*
|
|
75
|
+
* @param handler - 要分析的 handler 函式
|
|
76
|
+
* @returns HandlerAnalysis 分析結果
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```typescript
|
|
80
|
+
* const handler = async (ctx) => {
|
|
81
|
+
* const name = ctx.req.query('name')
|
|
82
|
+
* return ctx.json({ name })
|
|
83
|
+
* }
|
|
84
|
+
*
|
|
85
|
+
* const analysis = analyzeHandler(handler)
|
|
86
|
+
* // analysis.usesQuery === true
|
|
87
|
+
* // analysis.usesHeaders === false
|
|
88
|
+
* // analysis.isAsync === true
|
|
89
|
+
*
|
|
90
|
+
* const type = getOptimalContextType(analysis)
|
|
91
|
+
* // type === 'fast'
|
|
92
|
+
* ```
|
|
22
93
|
*/
|
|
23
94
|
export declare function analyzeHandler(handler: Function): HandlerAnalysis;
|
|
24
95
|
/**
|
|
25
|
-
*
|
|
96
|
+
* 根據分析結果決定最優化的 Context 類型
|
|
97
|
+
*
|
|
98
|
+
* Context 類型由輕到重:
|
|
99
|
+
* - `minimal`:僅支援路徑參數與靜態回應,零 overhead
|
|
100
|
+
* - `fast`:支援 headers 與 query,使用物件池
|
|
101
|
+
* - `full`:支援完整功能含 body 解析(async)
|
|
102
|
+
*
|
|
103
|
+
* 選擇邏輯(優先順序):
|
|
104
|
+
* 1. 若存取 headers → `fast`(header 設置需要完整支援)
|
|
105
|
+
* 2. 若不存取任何屬性 → `minimal`
|
|
106
|
+
* 3. 若僅存取 params → `minimal`(params 在 minimal 中也可用)
|
|
107
|
+
* 4. 若存取 body → `full`(async body 解析需要完整 context)
|
|
108
|
+
* 5. 其他 → `fast`
|
|
109
|
+
*
|
|
110
|
+
* @param analysis - HandlerAnalysis 分析結果
|
|
111
|
+
* @returns 最優化的 context 類型
|
|
26
112
|
*/
|
|
27
113
|
export declare function getOptimalContextType(analysis: HandlerAnalysis): 'minimal' | 'fast' | 'full';
|
|
@@ -25,6 +25,7 @@ export interface FastContext {
|
|
|
25
25
|
unauthorized(message?: string): Response;
|
|
26
26
|
badRequest(message?: string): Response;
|
|
27
27
|
forward(target: string, options?: any): Promise<Response>;
|
|
28
|
+
escape(html: string): string;
|
|
28
29
|
/** Header management */
|
|
29
30
|
header(name: string): string | undefined;
|
|
30
31
|
header(name: string, value: string): void;
|
|
@@ -32,6 +33,9 @@ export interface FastContext {
|
|
|
32
33
|
/** Context Variables */
|
|
33
34
|
get<T>(key: string): T;
|
|
34
35
|
set(key: string, value: any): void;
|
|
36
|
+
/** Request Scope Management */
|
|
37
|
+
requestScope(): any;
|
|
38
|
+
scoped<T>(key: string | symbol, factory: () => T): T;
|
|
35
39
|
/** Lifecycle helpers */
|
|
36
40
|
route: (name: string, params?: any, query?: any) => string;
|
|
37
41
|
readonly native: any;
|
|
@@ -67,6 +71,8 @@ export interface FastRequest {
|
|
|
67
71
|
header(name: string): string | undefined;
|
|
68
72
|
/** Get all headers */
|
|
69
73
|
headers(): Record<string, string>;
|
|
74
|
+
/** Get all cookies (Native Bun 1.39+ / Lazy Parsed) */
|
|
75
|
+
readonly cookies: Record<string, string>;
|
|
70
76
|
/** Parse JSON body */
|
|
71
77
|
json<T = unknown>(): Promise<T>;
|
|
72
78
|
/** Parse text body */
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RequestScope-Aware Error Handling
|
|
3
|
+
*
|
|
4
|
+
* Integrates RequestScope lifecycle with error handling to provide:
|
|
5
|
+
* - Error context with request-scoped resources
|
|
6
|
+
* - Automatic cleanup of scoped services on error
|
|
7
|
+
* - Request tracing and diagnostics
|
|
8
|
+
* - Resource leak detection
|
|
9
|
+
*/
|
|
10
|
+
import type { RequestScopeManager } from '../Container/RequestScopeManager';
|
|
11
|
+
import type { RequestScopeMetrics } from '../Container/RequestScopeMetrics';
|
|
12
|
+
import type { GravitoContext } from '../http/types';
|
|
13
|
+
/**
|
|
14
|
+
* Extended error context with RequestScope information
|
|
15
|
+
*
|
|
16
|
+
* Provides error handlers access to request-scoped resources
|
|
17
|
+
* for proper resource cleanup and error diagnostics.
|
|
18
|
+
*/
|
|
19
|
+
export interface RequestScopeErrorContext {
|
|
20
|
+
/**
|
|
21
|
+
* The original error that was thrown
|
|
22
|
+
*/
|
|
23
|
+
error: unknown;
|
|
24
|
+
/**
|
|
25
|
+
* HTTP context where error occurred
|
|
26
|
+
*/
|
|
27
|
+
context: GravitoContext;
|
|
28
|
+
/**
|
|
29
|
+
* RequestScope manager for this request
|
|
30
|
+
* Allows error handlers to access or clean up scoped resources
|
|
31
|
+
*/
|
|
32
|
+
scope?: RequestScopeManager;
|
|
33
|
+
/**
|
|
34
|
+
* Metrics about the request scope state
|
|
35
|
+
* Useful for diagnostics and understanding resource usage
|
|
36
|
+
*/
|
|
37
|
+
scopeMetrics?: RequestScopeMetrics;
|
|
38
|
+
/**
|
|
39
|
+
* Number of scoped services at time of error
|
|
40
|
+
* High numbers might indicate resource leaks
|
|
41
|
+
*/
|
|
42
|
+
scopeSize?: number;
|
|
43
|
+
/**
|
|
44
|
+
* Request processing time in milliseconds
|
|
45
|
+
* Useful for timeout errors
|
|
46
|
+
*/
|
|
47
|
+
duration?: number;
|
|
48
|
+
/**
|
|
49
|
+
* Additional diagnostic information
|
|
50
|
+
*/
|
|
51
|
+
diagnostics?: {
|
|
52
|
+
servicesCleanedUp?: string[];
|
|
53
|
+
cleanupErrors?: Array<{
|
|
54
|
+
service: string;
|
|
55
|
+
error: unknown;
|
|
56
|
+
}>;
|
|
57
|
+
peakMemoryMb?: number;
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Error that occurred during RequestScope cleanup
|
|
62
|
+
*
|
|
63
|
+
* Wraps original error with cleanup context for proper error reporting
|
|
64
|
+
*/
|
|
65
|
+
export declare class RequestScopeCleanupError extends Error {
|
|
66
|
+
originalError: unknown;
|
|
67
|
+
cleanupErrors: Array<{
|
|
68
|
+
service: string;
|
|
69
|
+
error: unknown;
|
|
70
|
+
}>;
|
|
71
|
+
constructor(message: string, originalError: unknown, cleanupErrors: Array<{
|
|
72
|
+
service: string;
|
|
73
|
+
error: unknown;
|
|
74
|
+
}>);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Helper to extract RequestScope context from GravitoContext
|
|
78
|
+
*
|
|
79
|
+
* @param ctx - Gravito context
|
|
80
|
+
* @returns RequestScope error context with available information
|
|
81
|
+
*/
|
|
82
|
+
export declare function extractRequestScopeErrorContext(ctx: GravitoContext, error: unknown): RequestScopeErrorContext;
|
|
83
|
+
/**
|
|
84
|
+
* Cleanup scoped services safely during error handling
|
|
85
|
+
*
|
|
86
|
+
* Ensures all scoped services are cleaned up even if some fail,
|
|
87
|
+
* and collects cleanup errors for diagnostics.
|
|
88
|
+
*
|
|
89
|
+
* @param scope - RequestScope manager
|
|
90
|
+
* @returns Array of cleanup errors if any occurred
|
|
91
|
+
*/
|
|
92
|
+
export declare function cleanupRequestScopeOnError(scope?: RequestScopeManager): Promise<Array<{
|
|
93
|
+
service: string;
|
|
94
|
+
error: unknown;
|
|
95
|
+
}>>;
|
|
96
|
+
/**
|
|
97
|
+
* Safe error handler wrapper that manages RequestScope cleanup
|
|
98
|
+
*
|
|
99
|
+
* Ensures scoped services are properly cleaned up before returning error response.
|
|
100
|
+
* Use this to wrap error handlers to make them RequestScope-aware.
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* ```typescript
|
|
104
|
+
* const errorHandler = withRequestScopeCleanup(async (ctx, error) => {
|
|
105
|
+
* // Handle error...
|
|
106
|
+
* return ctx.json({ error: error.message }, 500)
|
|
107
|
+
* })
|
|
108
|
+
*
|
|
109
|
+
* // In your app:
|
|
110
|
+
* try {
|
|
111
|
+
* // Handle request...
|
|
112
|
+
* } catch (error) {
|
|
113
|
+
* return errorHandler(ctx, error)
|
|
114
|
+
* }
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
export declare function withRequestScopeCleanup<T extends (ctx: GravitoContext, error: unknown) => Promise<Response>>(handler: T): T;
|
|
118
|
+
/**
|
|
119
|
+
* Detect potential resource leaks in RequestScope
|
|
120
|
+
*
|
|
121
|
+
* Returns diagnostic information about suspicious resource usage patterns
|
|
122
|
+
*/
|
|
123
|
+
export declare function detectRequestScopeLeaks(context: RequestScopeErrorContext): {
|
|
124
|
+
potentialLeaks: boolean;
|
|
125
|
+
warnings: string[];
|
|
126
|
+
};
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @gravito/core - Event System Backpressure Management
|
|
3
|
+
*
|
|
4
|
+
* Implements a backpressure management system to prevent high-priority events
|
|
5
|
+
* from starving low-priority events when the queue is under resource constraints.
|
|
6
|
+
*
|
|
7
|
+
* 背壓管理器:在資源受限時進行智慧型流量控制,防止優先級飢餓。
|
|
8
|
+
*
|
|
9
|
+
* FS-103 增強:
|
|
10
|
+
* - 多優先級隊列深度監控
|
|
11
|
+
* - 背壓反饋迴路支持
|
|
12
|
+
* - 智能 DLQ 路由決策
|
|
13
|
+
*/
|
|
14
|
+
import type { DeadLetterDecision, MultiPriorityQueueDepth } from './types';
|
|
15
|
+
/**
|
|
16
|
+
* 背壓狀態枚舉。
|
|
17
|
+
*
|
|
18
|
+
* 狀態轉換:Normal → Warning → Critical → Overflow
|
|
19
|
+
* 恢復方向:遲滯設計(需降至觸發閾值的 80%)
|
|
20
|
+
*
|
|
21
|
+
* @public
|
|
22
|
+
*/
|
|
23
|
+
export declare enum BackpressureState {
|
|
24
|
+
/** 正常運作,無背壓 */
|
|
25
|
+
NORMAL = "NORMAL",
|
|
26
|
+
/** 警告狀態,開始限制低優先級事件 */
|
|
27
|
+
WARNING = "WARNING",
|
|
28
|
+
/** 危急狀態,僅允許高優先級事件 */
|
|
29
|
+
CRITICAL = "CRITICAL",
|
|
30
|
+
/** 溢位狀態,全部拒絕 */
|
|
31
|
+
OVERFLOW = "OVERFLOW"
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 背壓配置選項。
|
|
35
|
+
*
|
|
36
|
+
* @public
|
|
37
|
+
*/
|
|
38
|
+
export interface BackpressureConfig {
|
|
39
|
+
/** 是否啟用背壓管理器(預設 true) */
|
|
40
|
+
enabled?: boolean;
|
|
41
|
+
/** 總隊列深度限制(預設無限) */
|
|
42
|
+
maxQueueSize?: number;
|
|
43
|
+
/** 分優先級隊列深度限制 */
|
|
44
|
+
maxSizeByPriority?: {
|
|
45
|
+
critical?: number;
|
|
46
|
+
high?: number;
|
|
47
|
+
normal?: number;
|
|
48
|
+
low?: number;
|
|
49
|
+
};
|
|
50
|
+
/** 每秒最大入隊速率(events/sec,預設無限) */
|
|
51
|
+
maxEnqueueRate?: number;
|
|
52
|
+
/** 速率限制滑動視窗大小(ms,預設 1000) */
|
|
53
|
+
rateLimitWindowMs?: number;
|
|
54
|
+
/** 背壓狀態閾值(佔 maxQueueSize 的百分比) */
|
|
55
|
+
thresholds?: {
|
|
56
|
+
/** WARNING 觸發百分比(預設 0.6 = 60%) */
|
|
57
|
+
warning?: number;
|
|
58
|
+
/** CRITICAL 觸發百分比(預設 0.85 = 85%) */
|
|
59
|
+
critical?: number;
|
|
60
|
+
/** OVERFLOW 觸發百分比(預設 1.0 = 100%) */
|
|
61
|
+
overflow?: number;
|
|
62
|
+
};
|
|
63
|
+
/** 被拒絕事件的處理策略(預設 'drop-with-callback') */
|
|
64
|
+
rejectionPolicy?: 'throw' | 'drop-silent' | 'drop-with-callback';
|
|
65
|
+
/** 當 rejectionPolicy 為 'drop-with-callback' 時的回呼 */
|
|
66
|
+
onRejected?: (eventName: string, priority: string, reason: string) => void;
|
|
67
|
+
/** 背壓狀態變更回呼 */
|
|
68
|
+
onStateChange?: (from: BackpressureState, to: BackpressureState) => void;
|
|
69
|
+
/** 低優先級事件在 WARNING 狀態下的延遲入隊時間(ms,預設 100) */
|
|
70
|
+
lowPriorityDelayMs?: number;
|
|
71
|
+
/** 是否啟用優先級反轉防護(預設 true) */
|
|
72
|
+
enableStarvationProtection?: boolean;
|
|
73
|
+
/** 低優先級事件最大等待時間,超過則提升優先級(ms,預設 5000) */
|
|
74
|
+
starvationTimeoutMs?: number;
|
|
75
|
+
/** 當進入 OVERFLOW 狀態時,是否將被拒絕事件路由到 DLQ(預設 false) */
|
|
76
|
+
dlqOnOverflow?: boolean;
|
|
77
|
+
/** OVERFLOW 時的重試策略(預設 'dlq-only') */
|
|
78
|
+
overflowRetryStrategy?: 'immediate' | 'delayed' | 'dlq-only';
|
|
79
|
+
/** OVERFLOW 延遲重試的基礎延遲時間(ms,預設 5000) */
|
|
80
|
+
overflowRetryDelayMs?: number;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 背壓決策結果。
|
|
84
|
+
*
|
|
85
|
+
* @public
|
|
86
|
+
*/
|
|
87
|
+
export interface BackpressureDecision {
|
|
88
|
+
/** 是否允許入隊 */
|
|
89
|
+
allowed: boolean;
|
|
90
|
+
/** 拒絕原因(若不允許) */
|
|
91
|
+
reason?: string;
|
|
92
|
+
/** 是否需要延遲入隊 */
|
|
93
|
+
delayed?: boolean;
|
|
94
|
+
/** 延遲時間(ms) */
|
|
95
|
+
delayMs?: number;
|
|
96
|
+
/** 建議降級後的優先級(若降級) */
|
|
97
|
+
degradedPriority?: 'high' | 'normal' | 'low';
|
|
98
|
+
/** 是否是由於 OVERFLOW 狀態被拒絕 */
|
|
99
|
+
isOverflow?: boolean;
|
|
100
|
+
/** OVERFLOW 時的重試策略建議('immediate'、'delayed'、'dlq-only') */
|
|
101
|
+
retryStrategy?: 'immediate' | 'delayed' | 'dlq-only';
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 背壓指標快照。
|
|
105
|
+
*
|
|
106
|
+
* @public
|
|
107
|
+
*/
|
|
108
|
+
export interface BackpressureMetricsSnapshot {
|
|
109
|
+
state: BackpressureState;
|
|
110
|
+
totalDepth: number;
|
|
111
|
+
depthByPriority: {
|
|
112
|
+
critical: number;
|
|
113
|
+
high: number;
|
|
114
|
+
normal: number;
|
|
115
|
+
low: number;
|
|
116
|
+
};
|
|
117
|
+
enqueueRate: number;
|
|
118
|
+
rejectedCount: number;
|
|
119
|
+
degradedCount: number;
|
|
120
|
+
stateTransitions: number;
|
|
121
|
+
dlqRouteCount?: number;
|
|
122
|
+
windowAdjustmentCount?: number;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* 背壓管理器。
|
|
126
|
+
*
|
|
127
|
+
* 根據隊列深度、速率、優先級等因素,決定是否允許新事件入隊,
|
|
128
|
+
* 以及是否需要降級優先級或延遲入隊。
|
|
129
|
+
*
|
|
130
|
+
* @public
|
|
131
|
+
*/
|
|
132
|
+
export declare class BackpressureManager {
|
|
133
|
+
private enabled;
|
|
134
|
+
private config;
|
|
135
|
+
private onRejected?;
|
|
136
|
+
private onStateChange?;
|
|
137
|
+
private state;
|
|
138
|
+
private rejectedCount;
|
|
139
|
+
private degradedCount;
|
|
140
|
+
private stateTransitions;
|
|
141
|
+
private rateCounter;
|
|
142
|
+
private depthByPriority;
|
|
143
|
+
private windowAdjustmentHistory;
|
|
144
|
+
private dlqRouteCount;
|
|
145
|
+
constructor(config?: BackpressureConfig);
|
|
146
|
+
/**
|
|
147
|
+
* 評估是否允許新事件入隊。
|
|
148
|
+
*
|
|
149
|
+
* @param eventName 事件名稱
|
|
150
|
+
* @param priority 事件優先級
|
|
151
|
+
* @param queueDepth 當前隊列深度
|
|
152
|
+
* @param depthByPriority 分優先級隊列深度
|
|
153
|
+
* @returns 背壓決策結果
|
|
154
|
+
*/
|
|
155
|
+
evaluate(eventName: string, priority: 'critical' | 'high' | 'normal' | 'low', queueDepth: number, depthByPriority: {
|
|
156
|
+
critical: number;
|
|
157
|
+
high: number;
|
|
158
|
+
normal: number;
|
|
159
|
+
low: number;
|
|
160
|
+
}): BackpressureDecision;
|
|
161
|
+
/**
|
|
162
|
+
* 獲取當前背壓狀態。
|
|
163
|
+
*/
|
|
164
|
+
getState(): BackpressureState;
|
|
165
|
+
/**
|
|
166
|
+
* 獲取背壓指標快照。
|
|
167
|
+
*/
|
|
168
|
+
getMetrics(): BackpressureMetricsSnapshot;
|
|
169
|
+
/**
|
|
170
|
+
* 重置背壓管理器狀態。
|
|
171
|
+
*/
|
|
172
|
+
reset(): void;
|
|
173
|
+
/**
|
|
174
|
+
* 同步隊列深度(由 EventPriorityQueue 調用)。
|
|
175
|
+
* FS-103:多優先級隊列深度監控
|
|
176
|
+
*/
|
|
177
|
+
updateQueueDepth(depths: MultiPriorityQueueDepth): void;
|
|
178
|
+
/**
|
|
179
|
+
* 獲取各優先級的隊列深度。
|
|
180
|
+
* FS-103:提供實時隊列深度快照
|
|
181
|
+
*/
|
|
182
|
+
getQueueDepthByPriority(): MultiPriorityQueueDepth;
|
|
183
|
+
/**
|
|
184
|
+
* 獲取總隊列深度。
|
|
185
|
+
*/
|
|
186
|
+
getTotalQueueDepth(): number;
|
|
187
|
+
/**
|
|
188
|
+
* 接收來自 AggregationWindow 的窗口調整通知。
|
|
189
|
+
* FS-103:背壓反饋迴路
|
|
190
|
+
*/
|
|
191
|
+
notifyWindowAdjustment(oldWindowMs: number, newWindowMs: number): void;
|
|
192
|
+
/**
|
|
193
|
+
* 檢查是否可以從 CRITICAL 或更高級別降級。
|
|
194
|
+
* FS-103:自動狀態恢復機制
|
|
195
|
+
*/
|
|
196
|
+
private checkStateRecovery;
|
|
197
|
+
/**
|
|
198
|
+
* 決定是否應該將事件路由到死信隊列。
|
|
199
|
+
* FS-103:智能 DLQ 路由決策
|
|
200
|
+
*/
|
|
201
|
+
makeDeadLetterDecision(_eventName: string, priority: 'critical' | 'high' | 'normal' | 'low'): DeadLetterDecision;
|
|
202
|
+
/**
|
|
203
|
+
* 更新背壓狀態。
|
|
204
|
+
* 使用遲滯設計(80% 回復比例)避免邊界震盪。
|
|
205
|
+
*/
|
|
206
|
+
private updateState;
|
|
207
|
+
/**
|
|
208
|
+
* 執行狀態轉換。
|
|
209
|
+
*/
|
|
210
|
+
private transitionTo;
|
|
211
|
+
/**
|
|
212
|
+
* 建立決策結果並記錄拒絕。
|
|
213
|
+
*/
|
|
214
|
+
private createDecision;
|
|
215
|
+
}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import type { EventOptions } from './EventOptions';
|
|
2
|
+
/**
|
|
3
|
+
* Source of DLQ entry - reason why event entered the DLQ.
|
|
4
|
+
* @public
|
|
5
|
+
*/
|
|
6
|
+
export type DLQEntrySource = 'retry_exhausted' | 'circuit_breaker' | 'backpressure_overflow' | 'manual';
|
|
2
7
|
/**
|
|
3
8
|
* Dead Letter Queue entry representing a failed event.
|
|
4
9
|
* @public
|
|
@@ -44,6 +49,10 @@ export interface DLQEntry {
|
|
|
44
49
|
* Timestamp when the event was last retried (if any).
|
|
45
50
|
*/
|
|
46
51
|
lastRetriedAt?: number;
|
|
52
|
+
/**
|
|
53
|
+
* Source of the DLQ entry - reason why event entered the DLQ.
|
|
54
|
+
*/
|
|
55
|
+
source: DLQEntrySource;
|
|
47
56
|
}
|
|
48
57
|
/**
|
|
49
58
|
* Filter options for querying DLQ entries.
|
|
@@ -67,6 +76,11 @@ export interface DLQFilter {
|
|
|
67
76
|
*/
|
|
68
77
|
limit?: number;
|
|
69
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* Callback type for DLQ entry events.
|
|
81
|
+
* @public
|
|
82
|
+
*/
|
|
83
|
+
export type DLQEntryCallback = (entry: DLQEntry) => void;
|
|
70
84
|
/**
|
|
71
85
|
* Dead Letter Queue Manager for handling failed events.
|
|
72
86
|
*
|
|
@@ -78,6 +92,15 @@ export interface DLQFilter {
|
|
|
78
92
|
export declare class DeadLetterQueue {
|
|
79
93
|
private entries;
|
|
80
94
|
private entryIdCounter;
|
|
95
|
+
private maxEntries?;
|
|
96
|
+
private onEntryAdded?;
|
|
97
|
+
private onEntryRemoved?;
|
|
98
|
+
/**
|
|
99
|
+
* Create a new DeadLetterQueue instance.
|
|
100
|
+
*
|
|
101
|
+
* @param maxEntries - Maximum number of entries to keep (optional, no limit if not set)
|
|
102
|
+
*/
|
|
103
|
+
constructor(maxEntries?: number);
|
|
81
104
|
/**
|
|
82
105
|
* Add a failed event to the Dead Letter Queue.
|
|
83
106
|
*
|
|
@@ -87,9 +110,10 @@ export declare class DeadLetterQueue {
|
|
|
87
110
|
* @param error - Error that caused the failure
|
|
88
111
|
* @param retryCount - Number of retry attempts made
|
|
89
112
|
* @param firstFailedAt - Timestamp of first failure
|
|
113
|
+
* @param source - Source of the DLQ entry (default: 'retry_exhausted')
|
|
90
114
|
* @returns DLQ entry ID
|
|
91
115
|
*/
|
|
92
|
-
add(eventName: string, payload: unknown, options: EventOptions, error: Error, retryCount: number, firstFailedAt: number): string;
|
|
116
|
+
add(eventName: string, payload: unknown, options: EventOptions, error: Error, retryCount: number, firstFailedAt: number, source?: DLQEntrySource): string;
|
|
93
117
|
/**
|
|
94
118
|
* Get a specific DLQ entry by ID.
|
|
95
119
|
*
|
|
@@ -142,4 +166,54 @@ export declare class DeadLetterQueue {
|
|
|
142
166
|
* @internal
|
|
143
167
|
*/
|
|
144
168
|
updateLastRetried(entryId: string): void;
|
|
169
|
+
/**
|
|
170
|
+
* Evict the oldest entry from the DLQ.
|
|
171
|
+
* Used when capacity limit is reached.
|
|
172
|
+
*
|
|
173
|
+
* @private
|
|
174
|
+
*/
|
|
175
|
+
private evictOldest;
|
|
176
|
+
/**
|
|
177
|
+
* Get the oldest entry in the DLQ.
|
|
178
|
+
*
|
|
179
|
+
* @returns Oldest DLQ entry or undefined if empty
|
|
180
|
+
*/
|
|
181
|
+
getOldestEntry(): DLQEntry | undefined;
|
|
182
|
+
/**
|
|
183
|
+
* Get the newest entry in the DLQ.
|
|
184
|
+
*
|
|
185
|
+
* @returns Newest DLQ entry or undefined if empty
|
|
186
|
+
*/
|
|
187
|
+
getNewestEntry(): DLQEntry | undefined;
|
|
188
|
+
/**
|
|
189
|
+
* Get all entries grouped by source.
|
|
190
|
+
*
|
|
191
|
+
* @param source - Source to filter by
|
|
192
|
+
* @returns Array of entries matching the source
|
|
193
|
+
*/
|
|
194
|
+
getEntriesBySource(source: DLQEntrySource): DLQEntry[];
|
|
195
|
+
/**
|
|
196
|
+
* Set callback for when an entry is added to the DLQ.
|
|
197
|
+
*
|
|
198
|
+
* @param callback - Callback function or undefined to clear
|
|
199
|
+
*/
|
|
200
|
+
setOnEntryAdded(callback?: DLQEntryCallback): void;
|
|
201
|
+
/**
|
|
202
|
+
* Set callback for when an entry is removed from the DLQ.
|
|
203
|
+
*
|
|
204
|
+
* @param callback - Callback function or undefined to clear
|
|
205
|
+
*/
|
|
206
|
+
setOnEntryRemoved(callback?: DLQEntryCallback): void;
|
|
207
|
+
/**
|
|
208
|
+
* Get the maximum number of entries allowed in the DLQ.
|
|
209
|
+
*
|
|
210
|
+
* @returns Max entries limit or undefined if no limit
|
|
211
|
+
*/
|
|
212
|
+
getMaxEntries(): number | undefined;
|
|
213
|
+
/**
|
|
214
|
+
* Set the maximum number of entries allowed in the DLQ.
|
|
215
|
+
*
|
|
216
|
+
* @param maxEntries - Maximum entries or undefined to remove limit
|
|
217
|
+
*/
|
|
218
|
+
setMaxEntries(maxEntries?: number): void;
|
|
145
219
|
}
|
|
@@ -6,6 +6,7 @@ export interface EventBackend {
|
|
|
6
6
|
/**
|
|
7
7
|
* Enqueue an event for processing.
|
|
8
8
|
* @param task - The event task to process
|
|
9
|
+
* @returns Task ID or 'dropped' if event was rejected (can be async for some backends)
|
|
9
10
|
*/
|
|
10
|
-
enqueue(task: EventTask):
|
|
11
|
+
enqueue(task: EventTask): string | Promise<void>;
|
|
11
12
|
}
|