@gravito/core 1.6.1 → 2.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.
- package/README.md +100 -6
- package/README.zh-TW.md +101 -6
- package/dist/Application.d.ts +256 -0
- package/dist/CommandKernel.d.ts +33 -0
- package/dist/ConfigManager.d.ts +65 -0
- package/dist/Container/RequestScopeManager.d.ts +62 -0
- package/dist/Container/RequestScopeMetrics.d.ts +144 -0
- package/dist/Container.d.ts +153 -0
- package/dist/ErrorHandler.d.ts +66 -0
- package/dist/Event.d.ts +5 -0
- package/dist/EventManager.d.ts +123 -0
- package/dist/GlobalErrorHandlers.d.ts +47 -0
- package/dist/GravitoServer.d.ts +28 -0
- package/dist/HookManager.d.ts +435 -0
- package/dist/Listener.d.ts +4 -0
- package/dist/Logger.d.ts +20 -0
- package/dist/PlanetCore.d.ts +402 -0
- package/dist/RequestContext.d.ts +97 -0
- package/dist/Route.d.ts +36 -0
- package/dist/Router.d.ts +270 -0
- package/dist/ServiceProvider.d.ts +178 -0
- package/dist/adapters/GravitoEngineAdapter.d.ts +27 -0
- package/dist/adapters/bun/AdaptiveAdapter.d.ts +99 -0
- package/dist/adapters/bun/BunContext.d.ts +54 -0
- package/dist/adapters/bun/BunNativeAdapter.d.ts +66 -0
- package/dist/adapters/bun/BunRequest.d.ts +31 -0
- package/dist/adapters/bun/BunWebSocketHandler.d.ts +48 -0
- package/dist/adapters/bun/RadixNode.d.ts +19 -0
- package/dist/adapters/bun/RadixRouter.d.ts +32 -0
- package/dist/adapters/bun/index.d.ts +7 -0
- package/dist/adapters/bun/types.d.ts +20 -0
- package/dist/adapters/index.d.ts +12 -0
- package/dist/adapters/types.d.ts +235 -0
- package/dist/binary/BinaryUtils.d.ts +105 -0
- package/dist/binary/index.d.ts +5 -0
- package/dist/cli/queue-commands.d.ts +6 -0
- package/dist/compat/async-local-storage.browser.d.ts +9 -0
- package/dist/compat/async-local-storage.d.ts +7 -0
- package/dist/compat/crypto.browser.d.ts +5 -0
- package/dist/compat/crypto.d.ts +6 -0
- package/dist/compat.d.ts +23 -1
- package/dist/compat.js +3 -0
- package/dist/compat.js.map +9 -0
- package/dist/engine/AOTRouter.d.ts +139 -0
- package/dist/engine/FastContext.d.ts +141 -0
- package/dist/engine/Gravito.d.ts +131 -0
- package/dist/engine/MinimalContext.d.ts +102 -0
- package/dist/engine/analyzer.d.ts +113 -0
- package/dist/engine/constants.d.ts +23 -0
- package/dist/engine/index.d.ts +14 -910
- package/dist/engine/index.js +623 -622
- package/dist/engine/index.js.map +23 -0
- package/dist/engine/path.d.ts +26 -0
- package/dist/engine/pool.d.ts +83 -0
- package/dist/engine/types.d.ts +149 -0
- package/dist/error-handling/RequestScopeErrorContext.d.ts +126 -0
- package/dist/events/BackpressureManager.d.ts +215 -0
- package/dist/events/CircuitBreaker.d.ts +229 -0
- package/dist/events/DeadLetterQueue.d.ts +219 -0
- package/dist/events/EventBackend.d.ts +12 -0
- package/dist/events/EventOptions.d.ts +204 -0
- package/dist/events/EventPriorityQueue.d.ts +63 -0
- package/dist/events/FlowControlStrategy.d.ts +109 -0
- package/dist/events/IdempotencyCache.d.ts +60 -0
- package/dist/events/MessageQueueBridge.d.ts +184 -0
- package/dist/events/PriorityEscalationManager.d.ts +82 -0
- package/dist/events/RetryScheduler.d.ts +104 -0
- package/dist/events/WorkerPool.d.ts +98 -0
- package/dist/events/WorkerPoolConfig.d.ts +153 -0
- package/dist/events/WorkerPoolMetrics.d.ts +65 -0
- package/dist/events/aggregation/AggregationWindow.d.ts +77 -0
- package/dist/events/aggregation/DeduplicationManager.d.ts +135 -0
- package/dist/events/aggregation/EventAggregationManager.d.ts +108 -0
- package/dist/events/aggregation/EventBatcher.d.ts +99 -0
- package/dist/events/aggregation/index.d.ts +10 -0
- package/dist/events/aggregation/types.d.ts +117 -0
- package/dist/events/index.d.ts +26 -0
- package/dist/events/observability/EventMetrics.d.ts +132 -0
- package/dist/events/observability/EventTracer.d.ts +68 -0
- package/dist/events/observability/EventTracing.d.ts +161 -0
- package/dist/events/observability/OTelEventMetrics.d.ts +332 -0
- package/dist/events/observability/ObservableHookManager.d.ts +108 -0
- package/dist/events/observability/StreamWorkerMetrics.d.ts +76 -0
- package/dist/events/observability/index.d.ts +24 -0
- package/dist/events/observability/metrics-types.d.ts +16 -0
- package/dist/events/queue-core.d.ts +77 -0
- package/dist/events/task-executor.d.ts +51 -0
- package/dist/events/types.d.ts +134 -0
- package/dist/exceptions/AuthenticationException.d.ts +8 -0
- package/dist/exceptions/AuthorizationException.d.ts +8 -0
- package/dist/exceptions/CircularDependencyException.d.ts +9 -0
- package/dist/exceptions/GravitoException.d.ts +23 -0
- package/dist/exceptions/HttpException.d.ts +9 -0
- package/dist/exceptions/ModelNotFoundException.d.ts +10 -0
- package/dist/exceptions/ValidationException.d.ts +22 -0
- package/dist/exceptions/index.d.ts +7 -0
- package/dist/ffi/NativeAccelerator.d.ts +69 -0
- package/dist/ffi/NativeHasher.d.ts +139 -0
- package/dist/ffi/cbor-fallback.d.ts +96 -0
- package/dist/ffi/hash-fallback.d.ts +33 -0
- package/dist/ffi/index.d.ts +10 -0
- package/dist/ffi/index.js +131 -0
- package/dist/ffi/index.js.map +11 -0
- package/dist/ffi/types.d.ts +135 -0
- package/dist/health/HealthProvider.d.ts +67 -0
- package/dist/helpers/Arr.d.ts +19 -0
- package/dist/helpers/Str.d.ts +38 -0
- package/dist/helpers/data.d.ts +25 -0
- package/dist/helpers/errors.d.ts +34 -0
- package/dist/helpers/response.d.ts +41 -0
- package/dist/helpers.d.ts +338 -0
- package/dist/hooks/ActionManager.d.ts +132 -0
- package/dist/hooks/AsyncDetector.d.ts +84 -0
- package/dist/hooks/FilterManager.d.ts +71 -0
- package/dist/hooks/MigrationWarner.d.ts +24 -0
- package/dist/hooks/dlq-operations.d.ts +60 -0
- package/dist/hooks/index.d.ts +11 -0
- package/dist/hooks/types.d.ts +107 -0
- package/dist/http/CookieJar.d.ts +51 -0
- package/dist/http/cookie.d.ts +29 -0
- package/dist/http/index.d.ts +12 -0
- package/dist/{compat-CI8hiulX.d.cts → http/types.d.ts} +35 -16
- package/dist/index.browser.d.ts +34 -0
- package/dist/index.d.ts +60 -10981
- package/dist/index.js +10808 -11273
- package/dist/index.js.map +166 -0
- package/dist/observability/QueueDashboard.d.ts +136 -0
- package/dist/observability/contracts.d.ts +137 -0
- package/dist/observability/index.d.ts +13 -0
- package/dist/reliability/DeadLetterQueueManager.d.ts +349 -0
- package/dist/reliability/RetryPolicy.d.ts +217 -0
- package/dist/reliability/index.d.ts +6 -0
- package/dist/router/ControllerDispatcher.d.ts +12 -0
- package/dist/router/RequestValidator.d.ts +20 -0
- package/dist/runtime/adapter-bun.d.ts +12 -0
- package/dist/runtime/adapter-deno.d.ts +12 -0
- package/dist/runtime/adapter-node.d.ts +12 -0
- package/dist/runtime/adapter-unknown.d.ts +13 -0
- package/dist/runtime/archive.d.ts +17 -0
- package/dist/runtime/compression.d.ts +21 -0
- package/dist/runtime/deep-equals.d.ts +56 -0
- package/dist/runtime/detection.d.ts +22 -0
- package/dist/runtime/escape.d.ts +34 -0
- package/dist/runtime/index.browser.d.ts +20 -0
- package/dist/runtime/index.d.ts +44 -0
- package/dist/runtime/markdown.d.ts +44 -0
- package/dist/runtime/types.d.ts +436 -0
- package/dist/runtime-helpers.d.ts +67 -0
- package/dist/runtime.d.ts +11 -0
- package/dist/security/Encrypter.d.ts +33 -0
- package/dist/security/Hasher.d.ts +29 -0
- package/dist/testing/HttpTester.d.ts +39 -0
- package/dist/testing/TestResponse.d.ts +78 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/transpiler-utils.d.ts +170 -0
- package/dist/types/events.d.ts +94 -0
- package/dist/types.d.ts +13 -0
- package/package.json +25 -56
- package/src/ffi/native/cbor.c +1148 -0
- package/dist/Metrics-VOWWRNNR.js +0 -219
- package/dist/chunk-R5U7XKVJ.js +0 -16
- package/dist/compat-CI8hiulX.d.ts +0 -376
- package/dist/compat.cjs +0 -18
- package/dist/compat.d.cts +0 -1
- package/dist/engine/index.cjs +0 -1764
- package/dist/engine/index.d.cts +0 -922
- package/dist/index.cjs +0 -14906
- package/dist/index.d.cts +0 -11008
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker Pool Configuration and Types
|
|
3
|
+
*
|
|
4
|
+
* Defines configuration interfaces and data types for worker pool management.
|
|
5
|
+
*
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
import type { EventTask } from './types';
|
|
9
|
+
/**
|
|
10
|
+
* Task source interface for fetching and acknowledging tasks.
|
|
11
|
+
* Supports integration with external task systems like Bull Queue.
|
|
12
|
+
*/
|
|
13
|
+
export interface TaskSource {
|
|
14
|
+
/**
|
|
15
|
+
* Fetch the next task from the source.
|
|
16
|
+
* Returns null if no tasks available.
|
|
17
|
+
*/
|
|
18
|
+
fetchTask(): Promise<EventTask | null>;
|
|
19
|
+
/**
|
|
20
|
+
* Acknowledge successful task completion.
|
|
21
|
+
*/
|
|
22
|
+
acknowledgeCompletion(taskId: string): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Acknowledge task failure.
|
|
25
|
+
*/
|
|
26
|
+
acknowledgeFailure(taskId: string, error: Error): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Worker Pool Configuration
|
|
30
|
+
*/
|
|
31
|
+
export interface WorkerPoolConfig {
|
|
32
|
+
/**
|
|
33
|
+
* Maximum number of concurrent tasks being processed.
|
|
34
|
+
* @default 4
|
|
35
|
+
*/
|
|
36
|
+
concurrency?: number;
|
|
37
|
+
/**
|
|
38
|
+
* Number of worker threads to maintain.
|
|
39
|
+
* @default Number of CPU cores
|
|
40
|
+
*/
|
|
41
|
+
workerThreads?: number;
|
|
42
|
+
/**
|
|
43
|
+
* Task execution timeout in milliseconds.
|
|
44
|
+
* @default 30000
|
|
45
|
+
*/
|
|
46
|
+
taskTimeout?: number;
|
|
47
|
+
/**
|
|
48
|
+
* Maximum number of retries for failed tasks.
|
|
49
|
+
* @default 3
|
|
50
|
+
*/
|
|
51
|
+
maxRetries?: number;
|
|
52
|
+
/**
|
|
53
|
+
* Enable automatic scaling based on load.
|
|
54
|
+
* @default true
|
|
55
|
+
*/
|
|
56
|
+
enableAutoScaling?: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Minimum number of workers for auto-scaling.
|
|
59
|
+
* @default 1
|
|
60
|
+
*/
|
|
61
|
+
minWorkers?: number;
|
|
62
|
+
/**
|
|
63
|
+
* Maximum number of workers for auto-scaling.
|
|
64
|
+
* @default 2 * CPU cores
|
|
65
|
+
*/
|
|
66
|
+
maxWorkers?: number;
|
|
67
|
+
/**
|
|
68
|
+
* Worker utilization threshold for scaling up (0-1).
|
|
69
|
+
* @default 0.8
|
|
70
|
+
*/
|
|
71
|
+
scaleUpThreshold?: number;
|
|
72
|
+
/**
|
|
73
|
+
* Worker utilization threshold for scaling down (0-1).
|
|
74
|
+
* @default 0.2
|
|
75
|
+
*/
|
|
76
|
+
scaleDownThreshold?: number;
|
|
77
|
+
/**
|
|
78
|
+
* Interval for collecting metrics in milliseconds.
|
|
79
|
+
* @default 5000
|
|
80
|
+
*/
|
|
81
|
+
metricsInterval?: number;
|
|
82
|
+
/**
|
|
83
|
+
* External task source (e.g., Bull Queue).
|
|
84
|
+
* When provided, workers fetch tasks from this source.
|
|
85
|
+
*/
|
|
86
|
+
taskSource?: TaskSource;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Worker State
|
|
90
|
+
*/
|
|
91
|
+
export type WorkerState = 'idle' | 'busy' | 'terminated';
|
|
92
|
+
/**
|
|
93
|
+
* Worker Statistics
|
|
94
|
+
*/
|
|
95
|
+
export interface WorkerStats {
|
|
96
|
+
/**
|
|
97
|
+
* Unique worker identifier.
|
|
98
|
+
*/
|
|
99
|
+
id: string;
|
|
100
|
+
/**
|
|
101
|
+
* Current worker state.
|
|
102
|
+
*/
|
|
103
|
+
state: WorkerState;
|
|
104
|
+
/**
|
|
105
|
+
* Total tasks processed by this worker.
|
|
106
|
+
*/
|
|
107
|
+
tasksProcessed: number;
|
|
108
|
+
/**
|
|
109
|
+
* Total successful tasks.
|
|
110
|
+
*/
|
|
111
|
+
tasksSuccess: number;
|
|
112
|
+
/**
|
|
113
|
+
* Total failed tasks.
|
|
114
|
+
*/
|
|
115
|
+
tasksFailed: number;
|
|
116
|
+
/**
|
|
117
|
+
* Average task execution duration in milliseconds.
|
|
118
|
+
*/
|
|
119
|
+
avgDurationMs: number;
|
|
120
|
+
/**
|
|
121
|
+
* Worker uptime in milliseconds.
|
|
122
|
+
*/
|
|
123
|
+
uptime: number;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Worker Pool Statistics
|
|
127
|
+
*/
|
|
128
|
+
export interface WorkerPoolStats {
|
|
129
|
+
/**
|
|
130
|
+
* Total tasks in queue.
|
|
131
|
+
*/
|
|
132
|
+
queueDepth: number;
|
|
133
|
+
/**
|
|
134
|
+
* Worker utilization (0-1).
|
|
135
|
+
*/
|
|
136
|
+
utilization: number;
|
|
137
|
+
/**
|
|
138
|
+
* Current number of active workers.
|
|
139
|
+
*/
|
|
140
|
+
activeWorkers: number;
|
|
141
|
+
/**
|
|
142
|
+
* Total tasks processed.
|
|
143
|
+
*/
|
|
144
|
+
totalTasksProcessed: number;
|
|
145
|
+
/**
|
|
146
|
+
* Total successful tasks.
|
|
147
|
+
*/
|
|
148
|
+
totalSuccess: number;
|
|
149
|
+
/**
|
|
150
|
+
* Total failed tasks.
|
|
151
|
+
*/
|
|
152
|
+
totalFailures: number;
|
|
153
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker Pool Metrics for OpenTelemetry integration.
|
|
3
|
+
*
|
|
4
|
+
* Tracks worker pool statistics and emits metrics using OpenTelemetry.
|
|
5
|
+
* Follows the Provider Callback pattern for dynamic metric collection.
|
|
6
|
+
*
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
import type { Meter } from '@opentelemetry/api';
|
|
10
|
+
/**
|
|
11
|
+
* Worker Pool Metrics Recorder
|
|
12
|
+
*/
|
|
13
|
+
export declare class WorkerPoolMetrics {
|
|
14
|
+
private meter;
|
|
15
|
+
private taskDurationHistogram?;
|
|
16
|
+
private taskCounter?;
|
|
17
|
+
private autoScalingCounter?;
|
|
18
|
+
private poolSizeCallback?;
|
|
19
|
+
private utilizationCallback?;
|
|
20
|
+
private queueDepthCallback?;
|
|
21
|
+
constructor(meter: Meter);
|
|
22
|
+
/**
|
|
23
|
+
* Initialize OpenTelemetry metrics
|
|
24
|
+
*/
|
|
25
|
+
private initializeMetrics;
|
|
26
|
+
/**
|
|
27
|
+
* Set provider callback for pool size metric
|
|
28
|
+
*/
|
|
29
|
+
setPoolSizeProvider(callback: () => number): void;
|
|
30
|
+
/**
|
|
31
|
+
* Set provider callback for utilization metric
|
|
32
|
+
*/
|
|
33
|
+
setUtilizationProvider(callback: () => number): void;
|
|
34
|
+
/**
|
|
35
|
+
* Set provider callback for queue depth metric
|
|
36
|
+
*/
|
|
37
|
+
setQueueDepthProvider(callback: () => number): void;
|
|
38
|
+
/**
|
|
39
|
+
* Record task execution
|
|
40
|
+
*
|
|
41
|
+
* @param durationMs - Task execution duration in milliseconds
|
|
42
|
+
* @param priority - Task priority level
|
|
43
|
+
* @param success - Whether task succeeded
|
|
44
|
+
*/
|
|
45
|
+
recordTaskExecution(durationMs: number, priority: string, success: boolean): void;
|
|
46
|
+
/**
|
|
47
|
+
* Record auto-scaling event
|
|
48
|
+
*
|
|
49
|
+
* @param action - 'scale-up' or 'scale-down'
|
|
50
|
+
* @param reason - Reason for scaling
|
|
51
|
+
*/
|
|
52
|
+
recordAutoScaling(action: 'scale-up' | 'scale-down', reason: string): void;
|
|
53
|
+
/**
|
|
54
|
+
* Get the current pool size (for provider callbacks)
|
|
55
|
+
*/
|
|
56
|
+
getPoolSize(): number;
|
|
57
|
+
/**
|
|
58
|
+
* Get the current utilization (for provider callbacks)
|
|
59
|
+
*/
|
|
60
|
+
getUtilization(): number;
|
|
61
|
+
/**
|
|
62
|
+
* Get the current queue depth (for provider callbacks)
|
|
63
|
+
*/
|
|
64
|
+
getQueueDepth(): number;
|
|
65
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Aggregation window with backpressure awareness (FS-102)
|
|
3
|
+
*
|
|
4
|
+
* Adjusts batching window based on backpressure state:
|
|
5
|
+
* - NORMAL: 200ms (optimal aggregation)
|
|
6
|
+
* - WARNING: 150ms (accelerate processing)
|
|
7
|
+
* - CRITICAL: 100ms (fast drain)
|
|
8
|
+
* - OVERFLOW: 50ms (minimum latency)
|
|
9
|
+
*
|
|
10
|
+
* FS-103 增強:
|
|
11
|
+
* - 與 BackpressureManager 雙向反饋
|
|
12
|
+
* - 窗口調整通知機制
|
|
13
|
+
*/
|
|
14
|
+
import type { BackpressureManager } from '../BackpressureManager';
|
|
15
|
+
import { BackpressureState } from '../BackpressureManager';
|
|
16
|
+
import type { WindowStats } from './types';
|
|
17
|
+
/**
|
|
18
|
+
* Aggregation window manager with backpressure awareness.
|
|
19
|
+
*/
|
|
20
|
+
export declare class AggregationWindow {
|
|
21
|
+
private currentWindowMs;
|
|
22
|
+
private readonly minWindowMs;
|
|
23
|
+
private readonly maxWindowMs;
|
|
24
|
+
private stats;
|
|
25
|
+
private backpressureManager?;
|
|
26
|
+
/**
|
|
27
|
+
* Create an aggregation window.
|
|
28
|
+
*
|
|
29
|
+
* @param initialWindowMs - Initial window size (default 200ms)
|
|
30
|
+
*/
|
|
31
|
+
constructor(initialWindowMs?: number);
|
|
32
|
+
/**
|
|
33
|
+
* Set the BackpressureManager for feedback loop (FS-103).
|
|
34
|
+
*
|
|
35
|
+
* @param manager - BackpressureManager instance
|
|
36
|
+
*/
|
|
37
|
+
setBackpressureManager(manager: BackpressureManager): void;
|
|
38
|
+
/**
|
|
39
|
+
* Adjust window based on backpressure state.
|
|
40
|
+
*
|
|
41
|
+
* @param state - Current backpressure state
|
|
42
|
+
*/
|
|
43
|
+
adjustWindow(state: BackpressureState): number;
|
|
44
|
+
/**
|
|
45
|
+
* Notify BackpressureManager of window adjustment (FS-103).
|
|
46
|
+
* Part of the backpressure feedback loop for automatic state recovery.
|
|
47
|
+
*
|
|
48
|
+
* @param oldWindowMs - Previous window size
|
|
49
|
+
* @param newWindowMs - New window size
|
|
50
|
+
* @private
|
|
51
|
+
*/
|
|
52
|
+
private notifyBackpressureManager;
|
|
53
|
+
/**
|
|
54
|
+
* Get current window size.
|
|
55
|
+
*/
|
|
56
|
+
getCurrentWindow(): number;
|
|
57
|
+
/**
|
|
58
|
+
* Get minimum window size.
|
|
59
|
+
*/
|
|
60
|
+
getMinWindow(): number;
|
|
61
|
+
/**
|
|
62
|
+
* Get maximum window size.
|
|
63
|
+
*/
|
|
64
|
+
getMaxWindow(): number;
|
|
65
|
+
/**
|
|
66
|
+
* Get statistics.
|
|
67
|
+
*/
|
|
68
|
+
getStats(): WindowStats;
|
|
69
|
+
/**
|
|
70
|
+
* Reset statistics.
|
|
71
|
+
*/
|
|
72
|
+
resetStats(): void;
|
|
73
|
+
/**
|
|
74
|
+
* Reset window to initial size.
|
|
75
|
+
*/
|
|
76
|
+
reset(windowMs?: number): void;
|
|
77
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event deduplication manager (FS-102)
|
|
3
|
+
*
|
|
4
|
+
* Merges events with the same pattern/idempotency key to reduce duplicates.
|
|
5
|
+
* - Pattern-based deduplication
|
|
6
|
+
* - Priority-aware merge strategy
|
|
7
|
+
* - Wildcard pattern aggregation
|
|
8
|
+
* - Deduplication rate tracking
|
|
9
|
+
*
|
|
10
|
+
* Ported from: examples/flash-sale-fullstack/src/cache/events/EventDeduplicator.ts
|
|
11
|
+
*/
|
|
12
|
+
import type { EventTask } from '../types';
|
|
13
|
+
import type { AggregationConfig, DeduplicationStats } from './types';
|
|
14
|
+
/**
|
|
15
|
+
* Event deduplication manager using pattern matching.
|
|
16
|
+
*/
|
|
17
|
+
export declare class DeduplicationManager {
|
|
18
|
+
private patternMap;
|
|
19
|
+
private stats;
|
|
20
|
+
private regexCache;
|
|
21
|
+
private cachedDeduplicated;
|
|
22
|
+
private deduplicatedDirty;
|
|
23
|
+
private config;
|
|
24
|
+
private patternTimestamps;
|
|
25
|
+
private cleanupTimer;
|
|
26
|
+
/**
|
|
27
|
+
* Create a deduplication manager.
|
|
28
|
+
*/
|
|
29
|
+
constructor(config?: Partial<AggregationConfig>);
|
|
30
|
+
/**
|
|
31
|
+
* Add an event for deduplication.
|
|
32
|
+
*
|
|
33
|
+
* Rules:
|
|
34
|
+
* 1. Events with same pattern are merged into one
|
|
35
|
+
* 2. Higher priority events are kept, lower priority removed
|
|
36
|
+
* 3. If new event has higher priority, it replaces old event
|
|
37
|
+
*/
|
|
38
|
+
addEvent(event: EventTask): void;
|
|
39
|
+
/**
|
|
40
|
+
* Add multiple events.
|
|
41
|
+
*/
|
|
42
|
+
addEvents(events: EventTask[]): void;
|
|
43
|
+
/**
|
|
44
|
+
* Get all deduplicated events.
|
|
45
|
+
* Result is cached until next addEvent() call.
|
|
46
|
+
*/
|
|
47
|
+
getDeduplicated(): EventTask[];
|
|
48
|
+
/**
|
|
49
|
+
* Optimize patterns by merging overlapping patterns.
|
|
50
|
+
*
|
|
51
|
+
* Example: ['product:1', 'product:2', 'product:3'] -> ['product:*']
|
|
52
|
+
*/
|
|
53
|
+
optimizePatterns(patterns: string[]): string[];
|
|
54
|
+
/**
|
|
55
|
+
* Clear the deduplication manager.
|
|
56
|
+
*/
|
|
57
|
+
clear(): void;
|
|
58
|
+
/**
|
|
59
|
+
* Get statistics.
|
|
60
|
+
*/
|
|
61
|
+
getStats(): DeduplicationStats;
|
|
62
|
+
/**
|
|
63
|
+
* Reset statistics (but keep deduplication data).
|
|
64
|
+
*/
|
|
65
|
+
resetStats(): void;
|
|
66
|
+
/**
|
|
67
|
+
* Get deduplication rate percentage.
|
|
68
|
+
*/
|
|
69
|
+
getDeduplicationRate(): number;
|
|
70
|
+
/**
|
|
71
|
+
* Get pattern count.
|
|
72
|
+
*/
|
|
73
|
+
getPatternCount(): number;
|
|
74
|
+
/**
|
|
75
|
+
* Get event for specific pattern.
|
|
76
|
+
*/
|
|
77
|
+
getEventForPattern(pattern: string): EventTask | undefined;
|
|
78
|
+
/**
|
|
79
|
+
* Check if pattern exists.
|
|
80
|
+
*/
|
|
81
|
+
hasPattern(pattern: string): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Remove specific pattern.
|
|
84
|
+
*/
|
|
85
|
+
removePattern(pattern: string): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Remove patterns by prefix.
|
|
88
|
+
*/
|
|
89
|
+
removePatternByPrefix(prefix: string): number;
|
|
90
|
+
/**
|
|
91
|
+
* Get all patterns.
|
|
92
|
+
*/
|
|
93
|
+
getPatterns(): string[];
|
|
94
|
+
/**
|
|
95
|
+
* Find events matching invalidation pattern.
|
|
96
|
+
* Supports wildcard patterns.
|
|
97
|
+
*/
|
|
98
|
+
findEventsByPattern(invalidationPattern: string): EventTask[];
|
|
99
|
+
/**
|
|
100
|
+
* Shutdown the manager (cleanup resources).
|
|
101
|
+
*/
|
|
102
|
+
shutdown(): void;
|
|
103
|
+
/**
|
|
104
|
+
* Generate deduplication pattern from event.
|
|
105
|
+
*/
|
|
106
|
+
private generatePattern;
|
|
107
|
+
/**
|
|
108
|
+
* Get pattern regex (cached).
|
|
109
|
+
*/
|
|
110
|
+
private getPatternRegex;
|
|
111
|
+
/**
|
|
112
|
+
* Convert pattern to regex.
|
|
113
|
+
*/
|
|
114
|
+
private patternToRegex;
|
|
115
|
+
/**
|
|
116
|
+
* Update deduplication rate.
|
|
117
|
+
*/
|
|
118
|
+
private updateDeduplicationRate;
|
|
119
|
+
/**
|
|
120
|
+
* Start automatic cleanup timer.
|
|
121
|
+
*/
|
|
122
|
+
private startCleanup;
|
|
123
|
+
/**
|
|
124
|
+
* Stop cleanup timer.
|
|
125
|
+
*/
|
|
126
|
+
private stopCleanup;
|
|
127
|
+
/**
|
|
128
|
+
* Perform TTL-based cleanup.
|
|
129
|
+
*/
|
|
130
|
+
private performCleanup;
|
|
131
|
+
/**
|
|
132
|
+
* Internal method for testing.
|
|
133
|
+
*/
|
|
134
|
+
__getPatternMap(): Map<string, EventTask>;
|
|
135
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event aggregation manager (FS-102)
|
|
3
|
+
*
|
|
4
|
+
* Coordinates deduplication and batching for optimal event processing:
|
|
5
|
+
* - Event deduplication (pattern-based or idempotency-key based)
|
|
6
|
+
* - Micro-batching (time and size dual-trigger)
|
|
7
|
+
* - Backpressure-aware window adjustment
|
|
8
|
+
* - Complete statistics tracking
|
|
9
|
+
*
|
|
10
|
+
* Ported from: examples/flash-sale-fullstack/src/cache/events/EventAggregator.ts
|
|
11
|
+
*/
|
|
12
|
+
import type { BackpressureManager } from '../BackpressureManager';
|
|
13
|
+
import type { EventTask } from '../types';
|
|
14
|
+
import { AggregationWindow } from './AggregationWindow';
|
|
15
|
+
import { DeduplicationManager } from './DeduplicationManager';
|
|
16
|
+
import { EventBatcher } from './EventBatcher';
|
|
17
|
+
import type { AggregationConfig, AggregationStats } from './types';
|
|
18
|
+
/**
|
|
19
|
+
* Event aggregation manager.
|
|
20
|
+
*/
|
|
21
|
+
export declare class EventAggregationManager {
|
|
22
|
+
private deduplicator;
|
|
23
|
+
private batcher;
|
|
24
|
+
private window;
|
|
25
|
+
private config;
|
|
26
|
+
private backpressureManager?;
|
|
27
|
+
private submitToQueueFn?;
|
|
28
|
+
private disabled;
|
|
29
|
+
/**
|
|
30
|
+
* Create an event aggregation manager.
|
|
31
|
+
*/
|
|
32
|
+
constructor(config?: Partial<AggregationConfig>);
|
|
33
|
+
/**
|
|
34
|
+
* Set backpressure manager for window adjustment.
|
|
35
|
+
* FS-103:Also sets BackpressureManager on AggregationWindow for feedback loop.
|
|
36
|
+
*/
|
|
37
|
+
setBackpressureManager(backpressure: BackpressureManager): void;
|
|
38
|
+
/**
|
|
39
|
+
* Set the actual queue submission function.
|
|
40
|
+
*/
|
|
41
|
+
setSubmitToQueueFn(fn: (tasks: EventTask[]) => Promise<void>): void;
|
|
42
|
+
/**
|
|
43
|
+
* Submit an event for aggregation.
|
|
44
|
+
*
|
|
45
|
+
* Returns true if accepted, false if rejected due to backpressure.
|
|
46
|
+
*/
|
|
47
|
+
submit(task: EventTask): Promise<boolean>;
|
|
48
|
+
/**
|
|
49
|
+
* Submit multiple events.
|
|
50
|
+
*/
|
|
51
|
+
submitBatch(tasks: EventTask[]): Promise<number>;
|
|
52
|
+
/**
|
|
53
|
+
* Flush current batch to queue.
|
|
54
|
+
*/
|
|
55
|
+
flush(): Promise<EventTask[]>;
|
|
56
|
+
/**
|
|
57
|
+
* Get aggregation statistics.
|
|
58
|
+
*/
|
|
59
|
+
getStats(): AggregationStats;
|
|
60
|
+
/**
|
|
61
|
+
* Reset statistics.
|
|
62
|
+
*/
|
|
63
|
+
resetStats(): void;
|
|
64
|
+
/**
|
|
65
|
+
* Clear aggregation state.
|
|
66
|
+
*/
|
|
67
|
+
clear(): void;
|
|
68
|
+
/**
|
|
69
|
+
* Check if there are pending events.
|
|
70
|
+
*/
|
|
71
|
+
hasPending(): boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Get pending event count.
|
|
74
|
+
*/
|
|
75
|
+
getPendingCount(): number;
|
|
76
|
+
/**
|
|
77
|
+
* Disable the aggregation manager.
|
|
78
|
+
*/
|
|
79
|
+
disable(): void;
|
|
80
|
+
/**
|
|
81
|
+
* Enable the aggregation manager.
|
|
82
|
+
*/
|
|
83
|
+
enable(): void;
|
|
84
|
+
/**
|
|
85
|
+
* Check if aggregation manager is enabled.
|
|
86
|
+
*/
|
|
87
|
+
isEnabled(): boolean;
|
|
88
|
+
/**
|
|
89
|
+
* Shutdown the aggregation manager.
|
|
90
|
+
*/
|
|
91
|
+
shutdown(): Promise<EventTask[]>;
|
|
92
|
+
/**
|
|
93
|
+
* Submit deduplicated events to queue.
|
|
94
|
+
*/
|
|
95
|
+
private submitToQueue;
|
|
96
|
+
/**
|
|
97
|
+
* Get deduplication manager (for testing).
|
|
98
|
+
*/
|
|
99
|
+
__getDeduplicator(): DeduplicationManager;
|
|
100
|
+
/**
|
|
101
|
+
* Get event batcher (for testing).
|
|
102
|
+
*/
|
|
103
|
+
__getBatcher(): EventBatcher;
|
|
104
|
+
/**
|
|
105
|
+
* Get aggregation window (for testing).
|
|
106
|
+
*/
|
|
107
|
+
__getWindow(): AggregationWindow;
|
|
108
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event batcher for microbatching optimization (FS-102)
|
|
3
|
+
*
|
|
4
|
+
* Implements dual-trigger batching:
|
|
5
|
+
* - Time window trigger (default 50ms)
|
|
6
|
+
* - Batch size trigger (default 50 events)
|
|
7
|
+
*
|
|
8
|
+
* Expected improvements: 10-15% throughput increase
|
|
9
|
+
*
|
|
10
|
+
* Ported from: examples/flash-sale-fullstack/src/cache/events/BatchSubmitter.ts
|
|
11
|
+
*/
|
|
12
|
+
import type { EventTask } from '../types';
|
|
13
|
+
import type { BatchStats } from './types';
|
|
14
|
+
/**
|
|
15
|
+
* Event batcher for optimizing submission throughput.
|
|
16
|
+
*/
|
|
17
|
+
export declare class EventBatcher {
|
|
18
|
+
private queue;
|
|
19
|
+
private readonly batchSize;
|
|
20
|
+
private readonly flushIntervalMs;
|
|
21
|
+
private flushTimer;
|
|
22
|
+
private stats;
|
|
23
|
+
private submitFn;
|
|
24
|
+
/**
|
|
25
|
+
* Create an event batcher.
|
|
26
|
+
*
|
|
27
|
+
* @param batchSize - Batch size threshold (default 50)
|
|
28
|
+
* @param flushIntervalMs - Time window (ms, default 50)
|
|
29
|
+
* @param submitFn - Function to submit batches
|
|
30
|
+
*/
|
|
31
|
+
constructor(batchSize: number, flushIntervalMs: number, submitFn: (tasks: EventTask[]) => Promise<void>);
|
|
32
|
+
/**
|
|
33
|
+
* Enqueue an event.
|
|
34
|
+
*
|
|
35
|
+
* Automatically triggers flush if:
|
|
36
|
+
* 1. Batch size is reached
|
|
37
|
+
* 2. Time window expires
|
|
38
|
+
*/
|
|
39
|
+
enqueue(task: EventTask): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Enqueue multiple events.
|
|
42
|
+
*/
|
|
43
|
+
enqueueBatch(tasks: EventTask[]): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Flush queued events.
|
|
46
|
+
*
|
|
47
|
+
* @param auto - Whether this is an auto-triggered flush
|
|
48
|
+
* @returns Array of flushed events
|
|
49
|
+
*/
|
|
50
|
+
flush(auto?: boolean): Promise<EventTask[]>;
|
|
51
|
+
/**
|
|
52
|
+
* Get statistics.
|
|
53
|
+
*/
|
|
54
|
+
getStats(): BatchStats;
|
|
55
|
+
/**
|
|
56
|
+
* Get pending event count.
|
|
57
|
+
*/
|
|
58
|
+
getPendingCount(): number;
|
|
59
|
+
/**
|
|
60
|
+
* Check if there are pending events.
|
|
61
|
+
*/
|
|
62
|
+
hasPending(): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Clear the queue.
|
|
65
|
+
*/
|
|
66
|
+
clear(): void;
|
|
67
|
+
/**
|
|
68
|
+
* Reset statistics.
|
|
69
|
+
*/
|
|
70
|
+
resetStats(): void;
|
|
71
|
+
/**
|
|
72
|
+
* Stop the batcher and flush remaining events.
|
|
73
|
+
*/
|
|
74
|
+
stop(): Promise<EventTask[]>;
|
|
75
|
+
/**
|
|
76
|
+
* Start time-window timer.
|
|
77
|
+
*/
|
|
78
|
+
private startTimer;
|
|
79
|
+
/**
|
|
80
|
+
* Clear timer.
|
|
81
|
+
*/
|
|
82
|
+
private clearTimer;
|
|
83
|
+
/**
|
|
84
|
+
* Adjust batch size.
|
|
85
|
+
*/
|
|
86
|
+
setBatchSize(newSize: number): void;
|
|
87
|
+
/**
|
|
88
|
+
* Adjust flush interval.
|
|
89
|
+
*/
|
|
90
|
+
setFlushInterval(_newIntervalMs: number): void;
|
|
91
|
+
/**
|
|
92
|
+
* Get batch size.
|
|
93
|
+
*/
|
|
94
|
+
getBatchSize(): number;
|
|
95
|
+
/**
|
|
96
|
+
* Get flush interval.
|
|
97
|
+
*/
|
|
98
|
+
getFlushInterval(): number;
|
|
99
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event aggregation and deduplication module (FS-102)
|
|
3
|
+
* @public
|
|
4
|
+
*/
|
|
5
|
+
export { AggregationWindow } from './AggregationWindow';
|
|
6
|
+
export { DeduplicationManager } from './DeduplicationManager';
|
|
7
|
+
export { EventAggregationManager } from './EventAggregationManager';
|
|
8
|
+
export { EventBatcher } from './EventBatcher';
|
|
9
|
+
export type { AggregationConfig, AggregationStats, BatchStats, DeduplicationStats, WindowAdjustmentConfig, WindowStats, } from './types';
|
|
10
|
+
export { DEFAULT_AGGREGATION_CONFIG, DEFAULT_WINDOW_ADJUSTMENT, getSuggestedWindow, PRIORITY_ORDER, } from './types';
|