@gravito/echo 3.0.1 → 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +211 -0
- package/dist/atlas/src/DB.d.ts +348 -0
- package/dist/atlas/src/OrbitAtlas.d.ts +9 -0
- package/dist/atlas/src/config/defineConfig.d.ts +14 -0
- package/dist/atlas/src/config/index.d.ts +7 -0
- package/dist/atlas/src/config/loadConfig.d.ts +41 -0
- package/dist/atlas/src/connection/Connection.d.ts +112 -0
- package/dist/atlas/src/connection/ConnectionManager.d.ts +180 -0
- package/dist/atlas/src/connection/ReplicaConnectionPool.d.ts +54 -0
- package/dist/atlas/src/drivers/BunSQLDriver.d.ts +32 -0
- package/dist/atlas/src/drivers/BunSQLPreparedStatement.d.ts +118 -0
- package/dist/atlas/src/drivers/MongoDBDriver.d.ts +36 -0
- package/dist/atlas/src/drivers/MySQLDriver.d.ts +79 -0
- package/dist/atlas/src/drivers/PostgresDriver.d.ts +96 -0
- package/dist/atlas/src/drivers/RedisDriver.d.ts +43 -0
- package/dist/atlas/src/drivers/SQLiteDriver.d.ts +45 -0
- package/dist/atlas/src/drivers/types.d.ts +260 -0
- package/dist/atlas/src/errors/index.d.ts +45 -0
- package/dist/atlas/src/grammar/Grammar.d.ts +342 -0
- package/dist/atlas/src/grammar/MongoGrammar.d.ts +47 -0
- package/dist/atlas/src/grammar/MySQLGrammar.d.ts +54 -0
- package/dist/atlas/src/grammar/NullGrammar.d.ts +35 -0
- package/dist/atlas/src/grammar/PostgresGrammar.d.ts +62 -0
- package/dist/atlas/src/grammar/SQLiteGrammar.d.ts +32 -0
- package/dist/atlas/src/index.d.ts +79 -0
- package/dist/atlas/src/migration/Migration.d.ts +64 -0
- package/dist/atlas/src/migration/MigrationRepository.d.ts +65 -0
- package/dist/atlas/src/migration/Migrator.d.ts +110 -0
- package/dist/atlas/src/migration/index.d.ts +6 -0
- package/dist/atlas/src/observability/AtlasMetrics.d.ts +33 -0
- package/dist/atlas/src/observability/AtlasObservability.d.ts +15 -0
- package/dist/atlas/src/observability/AtlasTracer.d.ts +12 -0
- package/dist/atlas/src/observability/index.d.ts +9 -0
- package/dist/atlas/src/orm/Repository.d.ts +247 -0
- package/dist/atlas/src/orm/index.d.ts +6 -0
- package/dist/atlas/src/orm/model/DirtyTracker.d.ts +121 -0
- package/dist/atlas/src/orm/model/Model.d.ts +458 -0
- package/dist/atlas/src/orm/model/ModelRegistry.d.ts +20 -0
- package/dist/atlas/src/orm/model/concerns/HasAttributes.d.ts +150 -0
- package/dist/atlas/src/orm/model/concerns/HasEvents.d.ts +36 -0
- package/dist/atlas/src/orm/model/concerns/HasPersistence.d.ts +92 -0
- package/dist/atlas/src/orm/model/concerns/HasRelationships.d.ts +117 -0
- package/dist/atlas/src/orm/model/concerns/HasSerialization.d.ts +64 -0
- package/dist/atlas/src/orm/model/concerns/applyMixins.d.ts +15 -0
- package/dist/atlas/src/orm/model/concerns/index.d.ts +12 -0
- package/dist/atlas/src/orm/model/decorators.d.ts +138 -0
- package/dist/atlas/src/orm/model/errors.d.ts +52 -0
- package/dist/atlas/src/orm/model/index.d.ts +10 -0
- package/dist/atlas/src/orm/model/relationships.d.ts +207 -0
- package/dist/atlas/src/orm/model/types.d.ts +12 -0
- package/dist/atlas/src/orm/schema/SchemaRegistry.d.ts +124 -0
- package/dist/atlas/src/orm/schema/SchemaSniffer.d.ts +54 -0
- package/dist/atlas/src/orm/schema/index.d.ts +6 -0
- package/dist/atlas/src/orm/schema/types.d.ts +85 -0
- package/dist/atlas/src/pool/AdaptivePoolManager.d.ts +98 -0
- package/dist/atlas/src/pool/PoolHealthChecker.d.ts +91 -0
- package/dist/atlas/src/pool/PoolStrategy.d.ts +129 -0
- package/dist/atlas/src/pool/PoolWarmer.d.ts +92 -0
- package/dist/atlas/src/query/Expression.d.ts +60 -0
- package/dist/atlas/src/query/NPlusOneDetector.d.ts +10 -0
- package/dist/atlas/src/query/QueryBuilder.d.ts +643 -0
- package/dist/atlas/src/query/RelationshipResolver.d.ts +23 -0
- package/dist/atlas/src/query/clauses/GroupByClause.d.ts +51 -0
- package/dist/atlas/src/query/clauses/HavingClause.d.ts +70 -0
- package/dist/atlas/src/query/clauses/JoinClause.d.ts +87 -0
- package/dist/atlas/src/query/clauses/LimitClause.d.ts +82 -0
- package/dist/atlas/src/query/clauses/OrderByClause.d.ts +69 -0
- package/dist/atlas/src/query/clauses/SelectClause.d.ts +71 -0
- package/dist/atlas/src/query/clauses/WhereClause.d.ts +167 -0
- package/dist/atlas/src/query/clauses/index.d.ts +11 -0
- package/dist/atlas/src/schema/Blueprint.d.ts +276 -0
- package/dist/atlas/src/schema/ColumnDefinition.d.ts +154 -0
- package/dist/atlas/src/schema/ForeignKeyDefinition.d.ts +37 -0
- package/dist/atlas/src/schema/MigrationGenerator.d.ts +45 -0
- package/dist/atlas/src/schema/Schema.d.ts +131 -0
- package/dist/atlas/src/schema/SchemaDiff.d.ts +73 -0
- package/dist/atlas/src/schema/TypeGenerator.d.ts +57 -0
- package/dist/atlas/src/schema/TypeWriter.d.ts +42 -0
- package/dist/atlas/src/schema/grammars/MySQLSchemaGrammar.d.ts +23 -0
- package/dist/atlas/src/schema/grammars/PostgresSchemaGrammar.d.ts +26 -0
- package/dist/atlas/src/schema/grammars/SQLiteSchemaGrammar.d.ts +28 -0
- package/dist/atlas/src/schema/grammars/SchemaGrammar.d.ts +97 -0
- package/dist/atlas/src/schema/grammars/index.d.ts +7 -0
- package/dist/atlas/src/schema/index.d.ts +8 -0
- package/dist/atlas/src/seed/Factory.d.ts +90 -0
- package/dist/atlas/src/seed/Seeder.d.ts +28 -0
- package/dist/atlas/src/seed/SeederRunner.d.ts +74 -0
- package/dist/atlas/src/seed/index.d.ts +6 -0
- package/dist/atlas/src/sharding/ShardingManager.d.ts +59 -0
- package/dist/atlas/src/types/index.d.ts +1182 -0
- package/dist/atlas/src/utils/CursorEncoding.d.ts +63 -0
- package/dist/atlas/src/utils/levenshtein.d.ts +9 -0
- package/dist/core/src/Application.d.ts +43 -17
- package/dist/core/src/CommandKernel.d.ts +33 -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 +123 -14
- package/dist/core/src/ErrorHandler.d.ts +3 -0
- package/dist/core/src/HookManager.d.ts +517 -8
- package/dist/core/src/PlanetCore.d.ts +141 -7
- package/dist/core/src/RequestContext.d.ts +97 -0
- package/dist/core/src/Router.d.ts +41 -7
- package/dist/core/src/ServiceProvider.d.ts +36 -8
- package/dist/core/src/adapters/GravitoEngineAdapter.d.ts +1 -0
- package/dist/core/src/adapters/PhotonAdapter.d.ts +5 -0
- package/dist/core/src/adapters/bun/BunContext.d.ts +4 -0
- package/dist/core/src/adapters/bun/BunNativeAdapter.d.ts +1 -0
- package/dist/core/src/adapters/types.d.ts +39 -0
- package/dist/core/src/cli/queue-commands.d.ts +6 -0
- package/dist/core/src/engine/AOTRouter.d.ts +7 -12
- package/dist/core/src/engine/FastContext.d.ts +27 -2
- package/dist/core/src/engine/Gravito.d.ts +1 -2
- package/dist/core/src/engine/MinimalContext.d.ts +25 -2
- package/dist/core/src/engine/types.d.ts +9 -1
- 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/CircuitBreaker.d.ts +229 -0
- package/dist/core/src/events/DeadLetterQueue.d.ts +219 -0
- package/dist/core/src/events/EventBackend.d.ts +12 -0
- package/dist/core/src/events/EventOptions.d.ts +204 -0
- package/dist/core/src/events/EventPriorityQueue.d.ts +301 -0
- package/dist/core/src/events/FlowControlStrategy.d.ts +109 -0
- package/dist/core/src/events/IdempotencyCache.d.ts +60 -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 +25 -0
- package/dist/core/src/events/observability/EventMetrics.d.ts +132 -0
- package/dist/core/src/events/observability/EventTracer.d.ts +68 -0
- package/dist/core/src/events/observability/EventTracing.d.ts +161 -0
- package/dist/core/src/events/observability/OTelEventMetrics.d.ts +332 -0
- package/dist/core/src/events/observability/ObservableHookManager.d.ts +108 -0
- package/dist/core/src/events/observability/StreamWorkerMetrics.d.ts +76 -0
- package/dist/core/src/events/observability/index.d.ts +24 -0
- package/dist/core/src/events/observability/metrics-types.d.ts +16 -0
- package/dist/core/src/events/types.d.ts +134 -0
- package/dist/core/src/exceptions/CircularDependencyException.d.ts +9 -0
- package/dist/core/src/exceptions/index.d.ts +1 -0
- package/dist/core/src/health/HealthProvider.d.ts +67 -0
- package/dist/core/src/http/cookie.d.ts +29 -0
- package/dist/core/src/http/types.d.ts +40 -0
- package/dist/core/src/index.d.ts +26 -4
- package/dist/core/src/instrumentation/index.d.ts +35 -0
- package/dist/core/src/instrumentation/opentelemetry.d.ts +178 -0
- package/dist/core/src/instrumentation/types.d.ts +182 -0
- package/dist/core/src/observability/Metrics.d.ts +244 -0
- package/dist/core/src/observability/QueueDashboard.d.ts +136 -0
- package/dist/core/src/reliability/DeadLetterQueueManager.d.ts +350 -0
- package/dist/core/src/reliability/RetryPolicy.d.ts +217 -0
- package/dist/core/src/reliability/index.d.ts +6 -0
- package/dist/core/src/router/ControllerDispatcher.d.ts +12 -0
- package/dist/core/src/router/RequestValidator.d.ts +20 -0
- package/dist/echo/src/OrbitEcho.d.ts +71 -16
- package/dist/echo/src/dlq/DeadLetterQueue.d.ts +94 -0
- package/dist/echo/src/dlq/MemoryDeadLetterQueue.d.ts +36 -0
- package/dist/echo/src/dlq/index.d.ts +2 -0
- package/dist/echo/src/index.d.ts +31 -15
- package/dist/echo/src/middleware/RequestBufferMiddleware.d.ts +62 -0
- package/dist/echo/src/middleware/index.d.ts +8 -0
- package/dist/echo/src/observability/index.d.ts +3 -0
- package/dist/echo/src/observability/logging/ConsoleEchoLogger.d.ts +37 -0
- package/dist/echo/src/observability/logging/EchoLogger.d.ts +38 -0
- package/dist/echo/src/observability/logging/index.d.ts +2 -0
- package/dist/echo/src/observability/metrics/MetricsProvider.d.ts +69 -0
- package/dist/echo/src/observability/metrics/NoopMetricsProvider.d.ts +17 -0
- package/dist/echo/src/observability/metrics/PrometheusMetricsProvider.d.ts +39 -0
- package/dist/echo/src/observability/metrics/index.d.ts +3 -0
- package/dist/echo/src/observability/tracing/NoopTracer.d.ts +33 -0
- package/dist/echo/src/observability/tracing/Tracer.d.ts +75 -0
- package/dist/echo/src/observability/tracing/index.d.ts +2 -0
- package/dist/echo/src/providers/GenericProvider.d.ts +37 -18
- package/dist/echo/src/providers/GitHubProvider.d.ts +21 -12
- package/dist/echo/src/providers/LinearProvider.d.ts +27 -0
- package/dist/echo/src/providers/PaddleProvider.d.ts +31 -0
- package/dist/echo/src/providers/ShopifyProvider.d.ts +27 -0
- package/dist/echo/src/providers/SlackProvider.d.ts +27 -0
- package/dist/echo/src/providers/StripeProvider.d.ts +20 -12
- package/dist/echo/src/providers/TwilioProvider.d.ts +31 -0
- package/dist/echo/src/providers/base/BaseProvider.d.ts +87 -0
- package/dist/echo/src/providers/base/HeaderUtils.d.ts +34 -0
- package/dist/echo/src/providers/index.d.ts +14 -3
- package/dist/echo/src/receive/SignatureValidator.d.ts +33 -0
- package/dist/echo/src/receive/WebhookReceiver.d.ts +139 -21
- package/dist/echo/src/replay/WebhookReplayService.d.ts +35 -0
- package/dist/echo/src/replay/index.d.ts +1 -0
- package/dist/echo/src/resilience/CircuitBreaker.d.ts +117 -0
- package/dist/echo/src/resilience/index.d.ts +10 -0
- package/dist/echo/src/rotation/KeyRotationManager.d.ts +127 -0
- package/dist/echo/src/rotation/index.d.ts +10 -0
- package/dist/echo/src/send/WebhookDispatcher.d.ts +159 -15
- package/dist/echo/src/storage/MemoryWebhookStore.d.ts +14 -0
- package/dist/echo/src/storage/WebhookStore.d.ts +236 -0
- package/dist/echo/src/storage/index.d.ts +2 -0
- package/dist/echo/src/types.d.ts +656 -64
- package/dist/index.js +1327 -189
- package/dist/index.js.map +28 -10
- package/dist/monitor/src/MonitorOrbit.d.ts +43 -0
- package/dist/monitor/src/config.d.ts +106 -0
- package/dist/monitor/src/health/HealthController.d.ts +28 -0
- package/dist/monitor/src/health/HealthRegistry.d.ts +80 -0
- package/dist/monitor/src/health/index.d.ts +36 -0
- package/dist/monitor/src/index.d.ts +13 -0
- package/dist/monitor/src/metrics/MetricsController.d.ts +22 -0
- package/dist/monitor/src/metrics/MetricsRegistry.d.ts +136 -0
- package/dist/monitor/src/metrics/index.d.ts +11 -0
- package/dist/monitor/src/tracing/TracingManager.d.ts +97 -0
- package/dist/monitor/src/tracing/index.d.ts +10 -0
- package/dist/photon/src/index.d.ts +74 -5
- package/dist/photon/src/middleware/binary.d.ts +12 -15
- package/dist/photon/src/middleware/htmx.d.ts +39 -0
- package/dist/photon/src/middleware/ratelimit-redis.d.ts +50 -0
- package/dist/photon/src/middleware/ratelimit.d.ts +161 -0
- package/dist/photon/src/openapi.d.ts +19 -0
- package/package.json +8 -6
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @gravito/atlas - Cursor Encoding Utility
|
|
3
|
+
* @description Base64 encode/decode for cursor-based pagination cursors.
|
|
4
|
+
*
|
|
5
|
+
* Cursor format: base64(JSON({ id, sortValue, sortColumn, direction }))
|
|
6
|
+
* This enables O(1) pagination using tuple comparison SQL:
|
|
7
|
+
* WHERE (sort_col, id) > (val, id_val)
|
|
8
|
+
*/
|
|
9
|
+
export interface CursorPayload {
|
|
10
|
+
/**
|
|
11
|
+
* Primary key value of the last/first record in the current page
|
|
12
|
+
*/
|
|
13
|
+
id: unknown;
|
|
14
|
+
/**
|
|
15
|
+
* Value of the sort column at the cursor boundary
|
|
16
|
+
*/
|
|
17
|
+
sortValue: unknown;
|
|
18
|
+
/**
|
|
19
|
+
* Column name used for sorting
|
|
20
|
+
*/
|
|
21
|
+
sortColumn: string;
|
|
22
|
+
/**
|
|
23
|
+
* Sort direction
|
|
24
|
+
*/
|
|
25
|
+
direction: 'asc' | 'desc';
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Encode a cursor payload to an opaque base64 string.
|
|
29
|
+
*
|
|
30
|
+
* @param payload - Cursor data to encode
|
|
31
|
+
* @returns Base64-encoded cursor string
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* const cursor = encodeCursor({ id: 42, sortValue: '2026-01-01', sortColumn: 'created_at', direction: 'asc' })
|
|
35
|
+
*/
|
|
36
|
+
export declare function encodeCursor(payload: CursorPayload): string;
|
|
37
|
+
/**
|
|
38
|
+
* Decode a cursor string back to its payload.
|
|
39
|
+
*
|
|
40
|
+
* @param cursor - Base64 cursor string
|
|
41
|
+
* @returns Decoded cursor payload
|
|
42
|
+
* @throws {Error} If the cursor is malformed or tampered with
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* const payload = decodeCursor(cursor)
|
|
46
|
+
* // payload.id, payload.sortValue, etc.
|
|
47
|
+
*/
|
|
48
|
+
export declare function decodeCursor(cursor: string): CursorPayload;
|
|
49
|
+
/**
|
|
50
|
+
* Build the WHERE clause raw SQL and bindings for cursor pagination.
|
|
51
|
+
*
|
|
52
|
+
* For ascending sort: WHERE (sort_col, id) > (sort_val, id_val)
|
|
53
|
+
* For descending sort: WHERE (sort_col, id) < (sort_val, id_val)
|
|
54
|
+
*
|
|
55
|
+
* Uses tuple comparison which is O(1) on indexed columns in Postgres & MySQL.
|
|
56
|
+
*
|
|
57
|
+
* @param payload - Decoded cursor payload
|
|
58
|
+
* @returns { sql, bindings } ready for whereRaw()
|
|
59
|
+
*/
|
|
60
|
+
export declare function buildCursorWhereClause(payload: CursorPayload, idColumn?: string): {
|
|
61
|
+
sql: string;
|
|
62
|
+
bindings: unknown[];
|
|
63
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calculate Levenshtein distance between two strings
|
|
3
|
+
* Used for "Did you mean?" suggestions
|
|
4
|
+
*/
|
|
5
|
+
export declare function levenshtein(a: string, b: string): number;
|
|
6
|
+
/**
|
|
7
|
+
* Find similar strings from a list
|
|
8
|
+
*/
|
|
9
|
+
export declare function findSimilar(target: string, candidates: string[], maxDistance?: number, maxResults?: number): string[];
|
|
@@ -115,15 +115,21 @@ export declare class Application {
|
|
|
115
115
|
private booted;
|
|
116
116
|
constructor(options: ApplicationConfig);
|
|
117
117
|
/**
|
|
118
|
-
* Boot the application.
|
|
118
|
+
* Boot the application and its dependencies.
|
|
119
119
|
*
|
|
120
|
-
* This
|
|
121
|
-
* 1.
|
|
122
|
-
* 2. Auto-
|
|
123
|
-
* 3.
|
|
124
|
-
* 4.
|
|
120
|
+
* This method orchestrates the full application lifecycle:
|
|
121
|
+
* 1. Configuration: Loads all config files from the config directory.
|
|
122
|
+
* 2. Discovery: Auto-discovers ServiceProviders from the providers directory.
|
|
123
|
+
* 3. Registration: Registers all discovered and explicit providers.
|
|
124
|
+
* 4. Bootstrapping: Triggers the PlanetCore bootstrap sequence.
|
|
125
125
|
*
|
|
126
|
-
* @returns Promise that resolves
|
|
126
|
+
* @returns Promise that resolves to the application instance for chaining.
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```typescript
|
|
130
|
+
* const app = new Application({ basePath: import.meta.dir });
|
|
131
|
+
* await app.boot();
|
|
132
|
+
* ```
|
|
127
133
|
*/
|
|
128
134
|
boot(): Promise<this>;
|
|
129
135
|
/**
|
|
@@ -139,10 +145,19 @@ export declare class Application {
|
|
|
139
145
|
*/
|
|
140
146
|
private discoverProviders;
|
|
141
147
|
/**
|
|
142
|
-
*
|
|
148
|
+
* Resolve a service instance from the IoC container.
|
|
143
149
|
*
|
|
144
|
-
*
|
|
145
|
-
*
|
|
150
|
+
* This is a convenience wrapper around `container.make()`.
|
|
151
|
+
*
|
|
152
|
+
* @template T - The expected type of the service.
|
|
153
|
+
* @param key - The unique identifier or class name of the service.
|
|
154
|
+
* @returns The resolved service instance.
|
|
155
|
+
* @throws Error if the service is not bound in the container.
|
|
156
|
+
*
|
|
157
|
+
* @example
|
|
158
|
+
* ```typescript
|
|
159
|
+
* const db = app.make<Database>('db');
|
|
160
|
+
* ```
|
|
146
161
|
*/
|
|
147
162
|
make<T>(key: string): T;
|
|
148
163
|
/**
|
|
@@ -153,18 +168,29 @@ export declare class Application {
|
|
|
153
168
|
*/
|
|
154
169
|
has(key: string): boolean;
|
|
155
170
|
/**
|
|
156
|
-
*
|
|
171
|
+
* Retrieve a configuration value using dot notation.
|
|
172
|
+
*
|
|
173
|
+
* @template T - The expected type of the configuration value.
|
|
174
|
+
* @param key - The configuration key (e.g., 'app.name', 'database.connections.mysql').
|
|
175
|
+
* @param defaultValue - Optional value to return if the key is not found.
|
|
176
|
+
* @returns The configuration value or the default value.
|
|
157
177
|
*
|
|
158
|
-
* @
|
|
159
|
-
*
|
|
160
|
-
*
|
|
178
|
+
* @example
|
|
179
|
+
* ```typescript
|
|
180
|
+
* const port = app.getConfig<number>('app.port', 3000);
|
|
181
|
+
* ```
|
|
161
182
|
*/
|
|
162
183
|
getConfig<T>(key: string, defaultValue?: T): T;
|
|
163
184
|
/**
|
|
164
|
-
*
|
|
185
|
+
* Resolve an absolute path relative to the application base path.
|
|
186
|
+
*
|
|
187
|
+
* @param segments - Path segments to join with the base path.
|
|
188
|
+
* @returns The absolute path string.
|
|
165
189
|
*
|
|
166
|
-
* @
|
|
167
|
-
*
|
|
190
|
+
* @example
|
|
191
|
+
* ```typescript
|
|
192
|
+
* const storagePath = app.path('storage', 'logs');
|
|
193
|
+
* ```
|
|
168
194
|
*/
|
|
169
195
|
path(...segments: string[]): string;
|
|
170
196
|
/**
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Container } from './Container';
|
|
2
|
+
/**
|
|
3
|
+
* CommandHandler type for custom CLI commands.
|
|
4
|
+
*/
|
|
5
|
+
export type CommandHandler = (args: string[], container: Container) => Promise<void> | void;
|
|
6
|
+
/**
|
|
7
|
+
* CommandKernel - Structured CLI Command handling.
|
|
8
|
+
*
|
|
9
|
+
* Manages registration and execution of custom CLI commands that can
|
|
10
|
+
* reuse the application container and providers.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const kernel = new CommandKernel(container);
|
|
15
|
+
* kernel.register('greet', (args) => console.log('Hello', args[0]));
|
|
16
|
+
* await kernel.handle(['greet', 'Universe']);
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare class CommandKernel {
|
|
20
|
+
private container;
|
|
21
|
+
private commands;
|
|
22
|
+
constructor(container: Container);
|
|
23
|
+
/**
|
|
24
|
+
* Register a new command handler.
|
|
25
|
+
*/
|
|
26
|
+
register(name: string, handler: CommandHandler): void;
|
|
27
|
+
/**
|
|
28
|
+
* Handle an incoming CLI command.
|
|
29
|
+
*
|
|
30
|
+
* @param argv - Array of command line arguments (e.g. process.argv.slice(2))
|
|
31
|
+
*/
|
|
32
|
+
handle(argv: string[]): Promise<void>;
|
|
33
|
+
}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration manager (ConfigManager)
|
|
3
|
+
*
|
|
4
|
+
* Unifies environment variables and application configuration access.
|
|
5
|
+
*/
|
|
6
|
+
import type { ZodSchema } from 'zod';
|
|
1
7
|
/**
|
|
2
8
|
* ConfigManager - Central configuration store.
|
|
3
9
|
* Supports loading from environment variables and initial objects.
|
|
@@ -5,6 +11,7 @@
|
|
|
5
11
|
*/
|
|
6
12
|
export declare class ConfigManager {
|
|
7
13
|
private config;
|
|
14
|
+
private schema;
|
|
8
15
|
constructor(initialConfig?: Record<string, unknown>);
|
|
9
16
|
/**
|
|
10
17
|
* Load all environment variables from the active runtime.
|
|
@@ -23,4 +30,36 @@ export declare class ConfigManager {
|
|
|
23
30
|
* Check whether a key exists.
|
|
24
31
|
*/
|
|
25
32
|
has(key: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Define a Zod schema for configuration validation.
|
|
35
|
+
*
|
|
36
|
+
* @param schema - Zod schema for validation
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* config.defineSchema(z.object({
|
|
41
|
+
* DATABASE_URL: z.string().url(),
|
|
42
|
+
* PORT: z.number().default(3000),
|
|
43
|
+
* }))
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
defineSchema(schema: ZodSchema): void;
|
|
47
|
+
/**
|
|
48
|
+
* Validate configuration against the defined schema.
|
|
49
|
+
*
|
|
50
|
+
* Should be called during bootstrap to catch configuration errors early.
|
|
51
|
+
*
|
|
52
|
+
* @throws Error if validation fails with details about missing/invalid fields
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* try {
|
|
57
|
+
* config.validate()
|
|
58
|
+
* } catch (error) {
|
|
59
|
+
* console.error('Config validation failed:', error.message)
|
|
60
|
+
* process.exit(1)
|
|
61
|
+
* }
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
validate(): void;
|
|
26
65
|
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { ServiceKey } from '../Container';
|
|
2
|
+
import { RequestScopeMetrics, type RequestScopeObserver } from './RequestScopeMetrics';
|
|
3
|
+
/**
|
|
4
|
+
* Manages request-scoped service instances within a single HTTP request.
|
|
5
|
+
*
|
|
6
|
+
* Each request gets its own RequestScopeManager instance with isolated state.
|
|
7
|
+
* Services are cached within the request and automatically cleaned up when
|
|
8
|
+
* the request ends.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* const scope = new RequestScopeManager()
|
|
13
|
+
* const cache = scope.resolve('productCache', () => new ProductCache())
|
|
14
|
+
* // ... use cache ...
|
|
15
|
+
* await scope.cleanup() // Called automatically by Gravito engine
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export declare class RequestScopeManager {
|
|
19
|
+
private scoped;
|
|
20
|
+
private metadata;
|
|
21
|
+
private metrics;
|
|
22
|
+
private observer;
|
|
23
|
+
constructor(observer?: RequestScopeObserver);
|
|
24
|
+
/**
|
|
25
|
+
* Set observer for monitoring scope lifecycle
|
|
26
|
+
*/
|
|
27
|
+
setObserver(observer: RequestScopeObserver): void;
|
|
28
|
+
/**
|
|
29
|
+
* Get metrics for this scope
|
|
30
|
+
*/
|
|
31
|
+
getMetrics(): RequestScopeMetrics;
|
|
32
|
+
/**
|
|
33
|
+
* Resolve or retrieve a request-scoped service instance.
|
|
34
|
+
*
|
|
35
|
+
* If the service already exists in this scope, returns the cached instance.
|
|
36
|
+
* Otherwise, calls the factory function to create a new instance and caches it.
|
|
37
|
+
*
|
|
38
|
+
* Automatically detects and records services with cleanup methods.
|
|
39
|
+
*
|
|
40
|
+
* @template T - The type of the service.
|
|
41
|
+
* @param key - The service key (for caching).
|
|
42
|
+
* @param factory - Factory function to create the instance if not cached.
|
|
43
|
+
* @returns The cached or newly created instance.
|
|
44
|
+
*/
|
|
45
|
+
resolve<T>(key: ServiceKey, factory: () => T): T;
|
|
46
|
+
/**
|
|
47
|
+
* Clean up all request-scoped instances.
|
|
48
|
+
*
|
|
49
|
+
* Calls the cleanup() method on each service that has one.
|
|
50
|
+
* Silently ignores cleanup errors to prevent cascading failures.
|
|
51
|
+
* Called automatically by the Gravito engine in the request finally block.
|
|
52
|
+
*
|
|
53
|
+
* @returns Promise that resolves when all cleanup is complete.
|
|
54
|
+
*/
|
|
55
|
+
cleanup(): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* Get the number of services in this scope (for monitoring).
|
|
58
|
+
*
|
|
59
|
+
* @returns The count of cached services.
|
|
60
|
+
*/
|
|
61
|
+
size(): number;
|
|
62
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RequestScopeMetrics - Observability for RequestScope lifecycle
|
|
3
|
+
*
|
|
4
|
+
* Tracks cleanup execution time, scope size, and service counts
|
|
5
|
+
* for performance monitoring and diagnostics.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const metrics = new RequestScopeMetrics()
|
|
10
|
+
* metrics.recordCleanupStart()
|
|
11
|
+
* await scope.cleanup()
|
|
12
|
+
* metrics.recordCleanupEnd()
|
|
13
|
+
*
|
|
14
|
+
* console.log(metrics.toJSON())
|
|
15
|
+
* // { cleanupDuration: 2.5, scopeSize: 3, servicesCleaned: 3 }
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export declare class RequestScopeMetrics {
|
|
19
|
+
private cleanupStartTime;
|
|
20
|
+
private cleanupDuration;
|
|
21
|
+
private scopeSize;
|
|
22
|
+
private servicesCleaned;
|
|
23
|
+
private errorsOccurred;
|
|
24
|
+
/**
|
|
25
|
+
* Record start of cleanup operation
|
|
26
|
+
*/
|
|
27
|
+
recordCleanupStart(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Record end of cleanup operation
|
|
30
|
+
*
|
|
31
|
+
* @param scopeSize - Number of services in the scope
|
|
32
|
+
* @param servicesCleaned - Number of services that had cleanup called
|
|
33
|
+
* @param errorsOccurred - Number of cleanup errors
|
|
34
|
+
*/
|
|
35
|
+
recordCleanupEnd(scopeSize: number, servicesCleaned: number, errorsOccurred?: number): void;
|
|
36
|
+
/**
|
|
37
|
+
* Get cleanup duration in milliseconds
|
|
38
|
+
*
|
|
39
|
+
* @returns Duration in ms, or null if cleanup not completed
|
|
40
|
+
*/
|
|
41
|
+
getCleanupDuration(): number | null;
|
|
42
|
+
/**
|
|
43
|
+
* Check if cleanup took longer than threshold (default 2ms)
|
|
44
|
+
* Useful for detecting slow cleanups
|
|
45
|
+
*
|
|
46
|
+
* @param thresholdMs - Threshold in milliseconds
|
|
47
|
+
* @returns True if cleanup exceeded threshold
|
|
48
|
+
*/
|
|
49
|
+
isSlowCleanup(thresholdMs?: number): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Export metrics as JSON for logging/monitoring
|
|
52
|
+
*/
|
|
53
|
+
toJSON(): {
|
|
54
|
+
cleanupDuration: number | null;
|
|
55
|
+
scopeSize: number;
|
|
56
|
+
servicesCleaned: number;
|
|
57
|
+
errorsOccurred: number;
|
|
58
|
+
hasErrors: boolean;
|
|
59
|
+
isSlowCleanup: boolean;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Export metrics as compact string for logging
|
|
63
|
+
*/
|
|
64
|
+
toString(): string;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* RequestScopeObserver - Hook for monitoring RequestScope lifecycle
|
|
68
|
+
*
|
|
69
|
+
* Implement this interface to receive callbacks during scope operations
|
|
70
|
+
*/
|
|
71
|
+
export interface RequestScopeObserver {
|
|
72
|
+
/**
|
|
73
|
+
* Called when a service is resolved in the scope
|
|
74
|
+
*/
|
|
75
|
+
onServiceResolved?(key: string | symbol, isFromCache: boolean): void;
|
|
76
|
+
/**
|
|
77
|
+
* Called when cleanup starts
|
|
78
|
+
*/
|
|
79
|
+
onCleanupStart?(): void;
|
|
80
|
+
/**
|
|
81
|
+
* Called when cleanup completes
|
|
82
|
+
*/
|
|
83
|
+
onCleanupEnd?(metrics: RequestScopeMetrics): void;
|
|
84
|
+
/**
|
|
85
|
+
* Called when cleanup encounters an error
|
|
86
|
+
*/
|
|
87
|
+
onCleanupError?(error: Error): void;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* RequestScopeMetricsCollector - Aggregates metrics across multiple scopes
|
|
91
|
+
*
|
|
92
|
+
* Used for application-level monitoring and performance tracking
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```typescript
|
|
96
|
+
* const collector = new RequestScopeMetricsCollector()
|
|
97
|
+
*
|
|
98
|
+
* // Record metrics from multiple requests
|
|
99
|
+
* collector.record(metrics1)
|
|
100
|
+
* collector.record(metrics2)
|
|
101
|
+
* collector.record(metrics3)
|
|
102
|
+
*
|
|
103
|
+
* // Get aggregated stats
|
|
104
|
+
* const stats = collector.getStats()
|
|
105
|
+
* console.log(stats.averageCleanupTime) // 3.5ms
|
|
106
|
+
* ```
|
|
107
|
+
*/
|
|
108
|
+
export declare class RequestScopeMetricsCollector {
|
|
109
|
+
private metrics;
|
|
110
|
+
/**
|
|
111
|
+
* Record metrics from a request scope
|
|
112
|
+
*/
|
|
113
|
+
record(metrics: RequestScopeMetrics): void;
|
|
114
|
+
/**
|
|
115
|
+
* Get aggregated statistics
|
|
116
|
+
*/
|
|
117
|
+
getStats(): {
|
|
118
|
+
count: number;
|
|
119
|
+
averageCleanupTime: number | null;
|
|
120
|
+
maxCleanupTime: number | null;
|
|
121
|
+
minCleanupTime: number | null;
|
|
122
|
+
totalErrorCount: number;
|
|
123
|
+
errorRate: number;
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* Clear collected metrics
|
|
127
|
+
*/
|
|
128
|
+
clear(): void;
|
|
129
|
+
/**
|
|
130
|
+
* Get number of recorded metrics
|
|
131
|
+
*/
|
|
132
|
+
size(): number;
|
|
133
|
+
/**
|
|
134
|
+
* Export metrics as JSON array
|
|
135
|
+
*/
|
|
136
|
+
toJSON(): {
|
|
137
|
+
cleanupDuration: number | null;
|
|
138
|
+
scopeSize: number;
|
|
139
|
+
servicesCleaned: number;
|
|
140
|
+
errorsOccurred: number;
|
|
141
|
+
hasErrors: boolean;
|
|
142
|
+
isSlowCleanup: boolean;
|
|
143
|
+
}[];
|
|
144
|
+
}
|
|
@@ -1,8 +1,28 @@
|
|
|
1
|
+
import type { RequestScopeManager } from './Container/RequestScopeManager';
|
|
1
2
|
/**
|
|
2
3
|
* Factory type for creating service instances
|
|
3
4
|
*/
|
|
4
5
|
export type Factory<T> = (container: Container) => T;
|
|
5
|
-
|
|
6
|
+
/**
|
|
7
|
+
* ServiceMap interface for type-safe IoC resolution.
|
|
8
|
+
*
|
|
9
|
+
* Extend this interface via module augmentation to get type inference:
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* declare module '@gravito/core' {
|
|
13
|
+
* interface ServiceMap {
|
|
14
|
+
* logger: Logger
|
|
15
|
+
* db: DatabaseConnection
|
|
16
|
+
* }
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export type ServiceMap = {};
|
|
21
|
+
/**
|
|
22
|
+
* ServiceKey represents the allowed keys for service resolution.
|
|
23
|
+
* Includes keys from ServiceMap, generic strings, or symbols.
|
|
24
|
+
*/
|
|
25
|
+
export type ServiceKey = keyof ServiceMap | (string & {}) | symbol;
|
|
6
26
|
/**
|
|
7
27
|
* Container - Simple Dependency Injection Container.
|
|
8
28
|
* Manages service bindings and singleton instances.
|
|
@@ -11,34 +31,123 @@ export type BindingKey = string | symbol;
|
|
|
11
31
|
export declare class Container {
|
|
12
32
|
private bindings;
|
|
13
33
|
private instances;
|
|
34
|
+
private resolutionStack;
|
|
35
|
+
/**
|
|
36
|
+
* Run a function within a request scope context.
|
|
37
|
+
*
|
|
38
|
+
* All service resolutions within the function will use the provided scope,
|
|
39
|
+
* enabling request-scoped service instances to be properly isolated.
|
|
40
|
+
*
|
|
41
|
+
* @template T - The return type of the function.
|
|
42
|
+
* @param scope - The RequestScopeManager for this request.
|
|
43
|
+
* @param fn - The function to execute within the scope.
|
|
44
|
+
* @returns The result of the function.
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* const scope = new RequestScopeManager()
|
|
49
|
+
* const result = await Container.runWithScope(scope, async () => {
|
|
50
|
+
* const service = container.make('requestScoped')
|
|
51
|
+
* return service.doSomething()
|
|
52
|
+
* })
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
static runWithScope<T>(scope: RequestScopeManager, fn: () => T | Promise<T>): T | Promise<T>;
|
|
14
56
|
/**
|
|
15
57
|
* Bind a service to the container.
|
|
16
|
-
*
|
|
58
|
+
*
|
|
59
|
+
* A new instance will be created by the factory function every time the
|
|
60
|
+
* service is resolved from the container.
|
|
61
|
+
*
|
|
62
|
+
* @template T - The type of the service being bound.
|
|
63
|
+
* @param key - The unique identifier for the service.
|
|
64
|
+
* @param factory - The factory function that creates the service instance.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* container.bind('logger', (c) => new ConsoleLogger());
|
|
69
|
+
* ```
|
|
17
70
|
*/
|
|
18
|
-
bind<T>(key:
|
|
71
|
+
bind<T>(key: ServiceKey, factory: Factory<T>): void;
|
|
19
72
|
/**
|
|
20
73
|
* Bind a shared service to the container (Singleton).
|
|
21
|
-
*
|
|
74
|
+
*
|
|
75
|
+
* The factory function will be called only once, and the same instance
|
|
76
|
+
* will be returned on every subsequent resolution.
|
|
77
|
+
*
|
|
78
|
+
* @template T - The type of the service being bound.
|
|
79
|
+
* @param key - The unique identifier for the service.
|
|
80
|
+
* @param factory - The factory function that creates the service instance.
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```typescript
|
|
84
|
+
* container.singleton('db', (c) => new DatabaseConnection());
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
singleton<T>(key: ServiceKey, factory: Factory<T>): void;
|
|
88
|
+
/**
|
|
89
|
+
* Bind a request-scoped service to the container.
|
|
90
|
+
*
|
|
91
|
+
* A new instance will be created for each request and cached within that request.
|
|
92
|
+
* The service is automatically cleaned up when the request ends.
|
|
93
|
+
*
|
|
94
|
+
* @template T - The type of the service being bound.
|
|
95
|
+
* @param key - The unique identifier for the service.
|
|
96
|
+
* @param factory - The factory function that creates the service instance.
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```typescript
|
|
100
|
+
* container.scoped('requestCache', (c) => new RequestProductCache());
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
scoped<T>(key: ServiceKey, factory: Factory<T>): void;
|
|
104
|
+
/**
|
|
105
|
+
* Register an existing instance as a shared service.
|
|
106
|
+
*
|
|
107
|
+
* @param key - The unique identifier for the service.
|
|
108
|
+
* @param instance - The instance to register.
|
|
22
109
|
*/
|
|
23
|
-
|
|
110
|
+
instance<T>(key: ServiceKey, instance: T): void;
|
|
24
111
|
/**
|
|
25
|
-
*
|
|
112
|
+
* Check if a service is request-scoped.
|
|
113
|
+
*
|
|
114
|
+
* @param key - The service key to check.
|
|
115
|
+
* @returns True if the service is request-scoped.
|
|
26
116
|
*/
|
|
27
|
-
|
|
117
|
+
isRequestScoped(key: ServiceKey): boolean;
|
|
28
118
|
/**
|
|
29
|
-
* Resolve a service from the container.
|
|
119
|
+
* Resolve a service instance from the container.
|
|
120
|
+
*
|
|
121
|
+
* Automatically handles singleton caching and factory execution.
|
|
122
|
+
*
|
|
123
|
+
* @template T - The expected type of the service.
|
|
124
|
+
* @param key - The unique identifier for the service.
|
|
125
|
+
* @returns The resolved service instance.
|
|
126
|
+
* @throws Error if the service key is not found in the container.
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```typescript
|
|
130
|
+
* const logger = container.make<Logger>('logger');
|
|
131
|
+
* ```
|
|
30
132
|
*/
|
|
31
|
-
make<
|
|
133
|
+
make<K extends keyof ServiceMap>(key: K): ServiceMap[K];
|
|
134
|
+
make<T>(key: ServiceKey): T;
|
|
32
135
|
/**
|
|
33
|
-
* Check if a service is bound.
|
|
136
|
+
* Check if a service is bound or has an instance in the container.
|
|
137
|
+
*
|
|
138
|
+
* @param key - The service key to check.
|
|
139
|
+
* @returns True if the service exists.
|
|
34
140
|
*/
|
|
35
|
-
has(key:
|
|
141
|
+
has(key: ServiceKey): boolean;
|
|
36
142
|
/**
|
|
37
|
-
* Flush all instances and bindings.
|
|
143
|
+
* Flush all instances and bindings from the container.
|
|
144
|
+
* Resets the container to an empty state.
|
|
38
145
|
*/
|
|
39
146
|
flush(): void;
|
|
40
147
|
/**
|
|
41
|
-
* Forget a specific instance
|
|
148
|
+
* Forget a specific instance while keeping its binding.
|
|
149
|
+
*
|
|
150
|
+
* @param key - The service key to forget.
|
|
42
151
|
*/
|
|
43
|
-
forget(key:
|
|
152
|
+
forget(key: ServiceKey): void;
|
|
44
153
|
}
|
|
@@ -42,6 +42,9 @@ export declare class ErrorHandler {
|
|
|
42
42
|
constructor(deps: ErrorHandlerDeps);
|
|
43
43
|
/**
|
|
44
44
|
* Handle application errors
|
|
45
|
+
*
|
|
46
|
+
* Integrates RequestScope cleanup to ensure proper resource management
|
|
47
|
+
* even when errors occur during request processing.
|
|
45
48
|
*/
|
|
46
49
|
handleError(err: unknown, c: GravitoContext): Promise<Response>;
|
|
47
50
|
/**
|