@gravito/ripple 3.1.0 → 4.0.0
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 +260 -19
- package/dist/atlas/src/DB.d.ts +301 -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 +48 -0
- package/dist/atlas/src/connection/Connection.d.ts +108 -0
- package/dist/atlas/src/connection/ConnectionManager.d.ts +111 -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 +66 -0
- package/dist/atlas/src/drivers/PostgresDriver.d.ts +83 -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 +67 -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 +11 -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/index.d.ts +5 -0
- package/dist/atlas/src/orm/model/DirtyTracker.d.ts +121 -0
- package/dist/atlas/src/orm/model/Model.d.ts +449 -0
- package/dist/atlas/src/orm/model/ModelRegistry.d.ts +20 -0
- package/dist/atlas/src/orm/model/concerns/HasAttributes.d.ts +136 -0
- package/dist/atlas/src/orm/model/concerns/HasEvents.d.ts +36 -0
- package/dist/atlas/src/orm/model/concerns/HasPersistence.d.ts +87 -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 +109 -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 +123 -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/query/Expression.d.ts +60 -0
- package/dist/atlas/src/query/NPlusOneDetector.d.ts +10 -0
- package/dist/atlas/src/query/QueryBuilder.d.ts +573 -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/Schema.d.ts +131 -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/types/index.d.ts +1100 -0
- package/dist/atlas/src/utils/levenshtein.d.ts +9 -0
- package/dist/core/src/CommandKernel.d.ts +33 -0
- package/dist/core/src/Container.d.ts +41 -11
- package/dist/core/src/HookManager.d.ts +416 -4
- package/dist/core/src/Router.d.ts +1 -5
- package/dist/core/src/adapters/GravitoEngineAdapter.d.ts +1 -0
- package/dist/core/src/adapters/PhotonAdapter.d.ts +1 -0
- package/dist/core/src/adapters/bun/BunNativeAdapter.d.ts +1 -0
- package/dist/core/src/adapters/types.d.ts +27 -0
- package/dist/core/src/engine/AOTRouter.d.ts +1 -11
- package/dist/core/src/engine/FastContext.d.ts +4 -2
- package/dist/core/src/engine/MinimalContext.d.ts +4 -2
- package/dist/core/src/engine/types.d.ts +6 -1
- package/dist/core/src/events/CircuitBreaker.d.ts +229 -0
- package/dist/core/src/events/DeadLetterQueue.d.ts +145 -0
- package/dist/core/src/events/EventBackend.d.ts +11 -0
- package/dist/core/src/events/EventOptions.d.ts +109 -0
- package/dist/core/src/events/EventPriorityQueue.d.ts +202 -0
- package/dist/core/src/events/IdempotencyCache.d.ts +60 -0
- package/dist/core/src/events/index.d.ts +14 -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 +240 -0
- package/dist/core/src/events/observability/ObservableHookManager.d.ts +108 -0
- package/dist/core/src/events/observability/index.d.ts +20 -0
- package/dist/core/src/events/observability/metrics-types.d.ts +16 -0
- package/dist/core/src/events/types.d.ts +75 -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/http/types.d.ts +21 -0
- package/dist/core/src/index.d.ts +12 -3
- 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/reliability/DeadLetterQueueManager.d.ts +316 -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/index.js +5944 -9486
- package/dist/index.js.map +62 -62
- package/dist/photon/src/index.d.ts +14 -0
- package/dist/photon/src/middleware/ratelimit.d.ts +157 -0
- package/dist/photon/src/openapi.d.ts +19 -0
- package/dist/proto/ripple.proto +120 -0
- package/dist/ripple/src/RippleServer.d.ts +64 -444
- package/dist/ripple/src/channels/ChannelManager.d.ts +25 -10
- package/dist/ripple/src/drivers/NATSDriver.d.ts +87 -0
- package/dist/ripple/src/drivers/RedisDriver.d.ts +30 -1
- package/dist/ripple/src/drivers/index.d.ts +1 -0
- package/dist/ripple/src/engines/BunEngine.d.ts +98 -0
- package/dist/ripple/src/engines/IRippleEngine.d.ts +205 -0
- package/dist/ripple/src/engines/index.d.ts +11 -0
- package/dist/ripple/src/index.d.ts +2 -0
- package/dist/ripple/src/middleware/InterceptorManager.d.ts +21 -0
- package/dist/ripple/src/observability/RippleMetrics.d.ts +24 -0
- package/dist/ripple/src/reliability/AckManager.d.ts +48 -0
- package/dist/ripple/src/serializers/ISerializer.d.ts +39 -0
- package/dist/ripple/src/serializers/JsonSerializer.d.ts +19 -0
- package/dist/ripple/src/serializers/ProtobufSerializer.d.ts +38 -0
- package/dist/ripple/src/serializers/index.d.ts +3 -0
- package/dist/ripple/src/tracking/SessionManager.d.ts +104 -0
- package/dist/ripple/src/tracking/index.d.ts +1 -0
- package/dist/ripple/src/types.d.ts +177 -12
- package/dist/ripple/src/utils/MessageSerializer.d.ts +33 -23
- package/dist/ripple/src/utils/TokenBucket.d.ts +25 -0
- package/package.json +23 -7
package/README.md
CHANGED
|
@@ -1,22 +1,26 @@
|
|
|
1
1
|
# @gravito/ripple
|
|
2
2
|
|
|
3
|
-
> 🌊 High-performance WebSocket broadcasting for real-time applications.
|
|
3
|
+
> 🌊 High-performance WebSocket broadcasting for real-time applications. Multi-Runtime Support (Bun, Node.js).
|
|
4
4
|
|
|
5
5
|
[]()
|
|
6
6
|
[]()
|
|
7
|
-
[](
|
|
8
|
-
|
|
7
|
+
[](https
|
|
8
|
+
://www.typescriptlang.org/)
|
|
9
|
+
[](https://bun.sh)
|
|
10
|
+
[](https://nodejs.org)
|
|
9
11
|
|
|
10
12
|
## Features
|
|
11
13
|
|
|
12
|
-
- ⚡ **
|
|
14
|
+
- ⚡ **Multi-Runtime Support** - Run on Bun (native WebSocket), Node.js (uWebSockets.js or ws)
|
|
15
|
+
- 🚀 **Simplified API** - Single `start()` method to initialize and run your server
|
|
13
16
|
- 📡 **Channel-based Broadcasting** - Public, Private, and Presence channels
|
|
14
17
|
- 🔒 **Secure Authorization** - Flexible callback-based authorization system
|
|
15
18
|
- 📊 **Production Ready** - 95.24% test coverage, battle-tested architecture
|
|
16
|
-
-
|
|
17
|
-
- 🔍 **Full Observability** - Built-in logging, health checks, and connection tracking
|
|
18
|
-
- 💪 **Type-Safe** - Comprehensive TypeScript support with
|
|
19
|
+
- 🌐 **Horizontal Scaling** - Redis or NATS driver for multi-server deployments
|
|
20
|
+
- 🔍 **Full Observability** - Built-in logging, health checks, metrics, and connection tracking
|
|
21
|
+
- 💪 **Type-Safe** - Comprehensive TypeScript support with runtime-agnostic types
|
|
19
22
|
- 🎯 **Laravel Echo Compatible** - Familiar API for Laravel developers
|
|
23
|
+
- 🔄 **Backward Compatible** - Seamless upgrade from v4.x
|
|
20
24
|
|
|
21
25
|
## Why Ripple?
|
|
22
26
|
|
|
@@ -44,20 +48,75 @@ bun add @gravito/ripple
|
|
|
44
48
|
|
|
45
49
|
## Quick Start
|
|
46
50
|
|
|
47
|
-
### Server
|
|
51
|
+
### Basic Server (v5.0+)
|
|
52
|
+
|
|
53
|
+
The simplest way to start a Ripple server with the new v5.0 API:
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
import { RippleServer } from '@gravito/ripple'
|
|
57
|
+
|
|
58
|
+
const ripple = new RippleServer({
|
|
59
|
+
port: 3000,
|
|
60
|
+
authorizer: async (channel, userId, socketId) => {
|
|
61
|
+
// Return true for authorized, false for denied
|
|
62
|
+
// For presence channels, return { id: userId, info: { name: '...' } }
|
|
63
|
+
if (channel.startsWith('private-orders.')) {
|
|
64
|
+
return userId !== undefined
|
|
65
|
+
}
|
|
66
|
+
return true
|
|
67
|
+
}
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
// Start the server (that's it!)
|
|
71
|
+
await ripple.start()
|
|
72
|
+
|
|
73
|
+
console.log('🌊 Ripple server running on port 3000')
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Runtime Selection
|
|
77
|
+
|
|
78
|
+
Ripple automatically detects your runtime, but you can specify it explicitly:
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
// Use Bun native WebSocket (highest performance)
|
|
82
|
+
const ripple = new RippleServer({
|
|
83
|
+
port: 3000,
|
|
84
|
+
runtime: 'bun',
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
// Use uWebSockets.js on Node.js (high performance)
|
|
88
|
+
// Requires: npm install uWebSockets.js@uNetworking/uWebSockets.js#v20.44.0
|
|
89
|
+
const ripple = new RippleServer({
|
|
90
|
+
port: 3000,
|
|
91
|
+
runtime: 'node-uws',
|
|
92
|
+
// Optional uWS specific config
|
|
93
|
+
compression: 1, // SHARED_COMPRESSOR
|
|
94
|
+
maxPayloadLength: 16 * 1024 * 1024,
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
// Use ws package on Node.js (best compatibility)
|
|
98
|
+
// Requires: npm install ws
|
|
99
|
+
const ripple = new RippleServer({
|
|
100
|
+
port: 3000,
|
|
101
|
+
runtime: 'node-ws',
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
await ripple.start()
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Integration with Gravito Core
|
|
48
108
|
|
|
49
109
|
```typescript
|
|
50
110
|
import { PlanetCore } from '@gravito/core'
|
|
51
|
-
import { OrbitRipple
|
|
111
|
+
import { OrbitRipple } from '@gravito/ripple'
|
|
52
112
|
|
|
53
113
|
const core = new PlanetCore()
|
|
54
114
|
|
|
55
115
|
// Install Ripple WebSocket module
|
|
56
116
|
core.install(new OrbitRipple({
|
|
117
|
+
port: 3000,
|
|
57
118
|
path: '/ws',
|
|
58
119
|
authorizer: async (channel, userId, socketId) => {
|
|
59
|
-
// Return true for authorized, false for denied
|
|
60
|
-
// For presence channels, return { id: userId, info: { name: '...' } }
|
|
61
120
|
if (channel.startsWith('private-orders.')) {
|
|
62
121
|
return userId !== undefined
|
|
63
122
|
}
|
|
@@ -68,20 +127,40 @@ core.install(new OrbitRipple({
|
|
|
68
127
|
// Get the Ripple module
|
|
69
128
|
const ripple = core.container.make<OrbitRipple>('ripple')
|
|
70
129
|
|
|
71
|
-
// Start
|
|
130
|
+
// Start the integrated server
|
|
131
|
+
await ripple.start()
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Legacy Setup (v4.x - Still Supported)
|
|
135
|
+
|
|
136
|
+
The old manual setup still works for backward compatibility:
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
import { RippleServer } from '@gravito/ripple'
|
|
140
|
+
|
|
141
|
+
const ripple = new RippleServer({
|
|
142
|
+
path: '/ws',
|
|
143
|
+
authorizer: async (channel, userId) => {
|
|
144
|
+
// Authorization logic
|
|
145
|
+
return true
|
|
146
|
+
}
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
await ripple.init()
|
|
150
|
+
|
|
151
|
+
// Manual Bun.serve() setup
|
|
72
152
|
Bun.serve({
|
|
73
153
|
port: 3000,
|
|
74
154
|
fetch: (req, server) => {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
// Regular HTTP handling
|
|
79
|
-
return core.adapter.fetch(req, server)
|
|
155
|
+
if (ripple.upgrade(req, server)) return
|
|
156
|
+
return new Response('Not found', { status: 404 })
|
|
80
157
|
},
|
|
81
158
|
websocket: ripple.getHandler()
|
|
82
159
|
})
|
|
83
160
|
```
|
|
84
161
|
|
|
162
|
+
**Note:** The legacy API (`upgrade()`, `getHandler()`, `init()`) is deprecated and will be removed in v6.0. Please migrate to the new `start()` API.
|
|
163
|
+
|
|
85
164
|
### Broadcasting Events
|
|
86
165
|
|
|
87
166
|
```typescript
|
|
@@ -194,14 +273,23 @@ ripple.join(`chat.${roomId}`)
|
|
|
194
273
|
|
|
195
274
|
```typescript
|
|
196
275
|
interface RippleConfig {
|
|
276
|
+
/** Runtime to use (auto-detected if not specified) */
|
|
277
|
+
runtime?: 'bun' | 'node-uws' | 'node-ws'
|
|
278
|
+
|
|
279
|
+
/** Port to listen on (required for v5.0 start() API) */
|
|
280
|
+
port?: number
|
|
281
|
+
|
|
282
|
+
/** Hostname to bind to (default: '0.0.0.0') */
|
|
283
|
+
hostname?: string
|
|
284
|
+
|
|
197
285
|
/** WebSocket endpoint path (default: '/ws') */
|
|
198
286
|
path?: string
|
|
199
287
|
|
|
200
288
|
/** Authentication endpoint for private/presence channels */
|
|
201
289
|
authEndpoint?: string
|
|
202
290
|
|
|
203
|
-
/** Driver to use ('local' | 'redis') */
|
|
204
|
-
driver?: 'local' | 'redis'
|
|
291
|
+
/** Driver to use ('local' | 'redis' | 'nats') */
|
|
292
|
+
driver?: 'local' | 'redis' | 'nats'
|
|
205
293
|
|
|
206
294
|
/** Redis configuration (if using redis driver) */
|
|
207
295
|
redis?: {
|
|
@@ -211,6 +299,13 @@ interface RippleConfig {
|
|
|
211
299
|
db?: number
|
|
212
300
|
}
|
|
213
301
|
|
|
302
|
+
/** NATS configuration (if using nats driver) */
|
|
303
|
+
nats?: {
|
|
304
|
+
servers?: string[]
|
|
305
|
+
user?: string
|
|
306
|
+
pass?: string
|
|
307
|
+
}
|
|
308
|
+
|
|
214
309
|
/** Channel authorizer function */
|
|
215
310
|
authorizer?: ChannelAuthorizer
|
|
216
311
|
|
|
@@ -273,6 +368,50 @@ new RippleServer({
|
|
|
273
368
|
})
|
|
274
369
|
```
|
|
275
370
|
|
|
371
|
+
## Runtime Performance
|
|
372
|
+
|
|
373
|
+
Ripple v5.0 supports multiple runtimes, each with different performance characteristics:
|
|
374
|
+
|
|
375
|
+
### Bun (Recommended)
|
|
376
|
+
- **Native WebSocket** - Fastest option, written in Zig
|
|
377
|
+
- **Native pub/sub** - Zero-copy broadcasting with `server.publish()`
|
|
378
|
+
- **Zero overhead** - Direct access to C++ layer
|
|
379
|
+
- **Best for:** Production deployments where maximum performance is critical
|
|
380
|
+
|
|
381
|
+
### Node.js with uWebSockets.js
|
|
382
|
+
- **High performance** - Close to Bun performance (~90%)
|
|
383
|
+
- **Native pub/sub** - Efficient broadcasting via C++ bindings
|
|
384
|
+
- **Requires compilation** - May need build tools (node-gyp)
|
|
385
|
+
- **Best for:** Node.js environments where high performance is needed
|
|
386
|
+
|
|
387
|
+
### Node.js with ws
|
|
388
|
+
- **Best compatibility** - Pure JavaScript, works everywhere
|
|
389
|
+
- **Application-layer pub/sub** - Slightly slower broadcasting
|
|
390
|
+
- **No compilation** - Zero native dependencies
|
|
391
|
+
- **Best for:** Development, testing, or environments without build tools
|
|
392
|
+
|
|
393
|
+
### Choosing a Runtime
|
|
394
|
+
|
|
395
|
+
```typescript
|
|
396
|
+
// Production (Bun) - Highest performance
|
|
397
|
+
const ripple = new RippleServer({
|
|
398
|
+
port: 3000,
|
|
399
|
+
runtime: 'bun',
|
|
400
|
+
})
|
|
401
|
+
|
|
402
|
+
// Production (Node.js) - High performance
|
|
403
|
+
const ripple = new RippleServer({
|
|
404
|
+
port: 3000,
|
|
405
|
+
runtime: 'node-uws',
|
|
406
|
+
})
|
|
407
|
+
|
|
408
|
+
// Development/Testing - Best compatibility
|
|
409
|
+
const ripple = new RippleServer({
|
|
410
|
+
port: 3000,
|
|
411
|
+
runtime: 'node-ws',
|
|
412
|
+
})
|
|
413
|
+
```
|
|
414
|
+
|
|
276
415
|
## Performance
|
|
277
416
|
|
|
278
417
|
### Benchmarks (10,000 connections, 100KB message)
|
|
@@ -324,6 +463,108 @@ bun test --coverage
|
|
|
324
463
|
|
|
325
464
|
## Changelog
|
|
326
465
|
|
|
466
|
+
### v5.0.0 (2026-02-05) - Multi-Runtime Support
|
|
467
|
+
|
|
468
|
+
**🚀 Major Features**
|
|
469
|
+
|
|
470
|
+
- ✅ **Multi-Runtime Support** - Run on Bun, Node.js with uWebSockets.js, or Node.js with ws
|
|
471
|
+
- Automatic runtime detection
|
|
472
|
+
- Explicit runtime selection via `runtime` config option
|
|
473
|
+
- Runtime-agnostic `RippleSocket` abstraction
|
|
474
|
+
- Zero-overhead wrapper for each runtime
|
|
475
|
+
- ✅ **Simplified API** - New `start()` method replaces manual server setup
|
|
476
|
+
- Single method to initialize and start the server
|
|
477
|
+
- Automatic driver and serializer initialization
|
|
478
|
+
- Cleaner, more intuitive developer experience
|
|
479
|
+
- ✅ **Engine-Based Architecture** - Pluggable WebSocket engine system
|
|
480
|
+
- `IRippleEngine` interface for runtime abstraction
|
|
481
|
+
- `BunEngine` for Bun native WebSocket
|
|
482
|
+
- Ready for `uWebSocketsEngine` and `WsEngine` (Phase 2 & 3)
|
|
483
|
+
|
|
484
|
+
**🔧 Improvements**
|
|
485
|
+
|
|
486
|
+
- ✅ **Type Safety** - Complete migration to runtime-agnostic types
|
|
487
|
+
- `RippleSocket` replaces `RippleWebSocket` throughout codebase
|
|
488
|
+
- Updated `RippleContext`, `ChannelManager`, `InterceptorManager`
|
|
489
|
+
- Full TypeScript support with strict null checks
|
|
490
|
+
- ✅ **Binary Message Handling** - Cross-platform binary message support
|
|
491
|
+
- Replaced Buffer-specific methods with standard JavaScript APIs
|
|
492
|
+
- Use `DataView` for reading integers
|
|
493
|
+
- Use `TextDecoder` for string decoding
|
|
494
|
+
- ✅ **Configuration** - Enhanced configuration options
|
|
495
|
+
- `port` - Server port (required for `start()` API)
|
|
496
|
+
- `hostname` - Bind hostname (default: '0.0.0.0')
|
|
497
|
+
- `runtime` - Explicit runtime selection
|
|
498
|
+
- `nats` - NATS driver configuration
|
|
499
|
+
|
|
500
|
+
**📚 Documentation**
|
|
501
|
+
|
|
502
|
+
- ✅ **Migration Guide** - Comprehensive v4 → v5 migration guide
|
|
503
|
+
- ✅ **Examples** - New v5.0 basic server example
|
|
504
|
+
- ✅ **README** - Updated with v5.0 features and API
|
|
505
|
+
- ✅ **Runtime Performance** - Detailed runtime comparison guide
|
|
506
|
+
|
|
507
|
+
**🧪 Testing**
|
|
508
|
+
|
|
509
|
+
- ✅ **New Test Suite** - 30+ tests for v5.0 features
|
|
510
|
+
- Runtime selection tests
|
|
511
|
+
- Engine abstraction tests
|
|
512
|
+
- Backward compatibility tests
|
|
513
|
+
- Driver selection tests
|
|
514
|
+
|
|
515
|
+
**🔄 Backward Compatibility**
|
|
516
|
+
|
|
517
|
+
- ✅ **Deprecated APIs** - All v4.x APIs still work
|
|
518
|
+
- `upgrade()` method (deprecated, use `start()`)
|
|
519
|
+
- `getHandler()` method (deprecated, use `start()`)
|
|
520
|
+
- `init()` method (deprecated, use `start()`)
|
|
521
|
+
- `RippleWebSocket` type (deprecated, use `RippleSocket`)
|
|
522
|
+
- ⚠️ **Removal in v6.0** - Deprecated APIs will be removed in next major version
|
|
523
|
+
|
|
524
|
+
**📊 Progress**
|
|
525
|
+
|
|
526
|
+
- Phase 1: 100% Complete (Multi-runtime architecture)
|
|
527
|
+
- Phase 2: Planned (uWebSockets.js engine)
|
|
528
|
+
- Phase 3: Planned (Node.js ws engine)
|
|
529
|
+
|
|
530
|
+
### v4.0.0-alpha.1 (2026-02-04)
|
|
531
|
+
|
|
532
|
+
**🚀 Major Features**
|
|
533
|
+
|
|
534
|
+
- ✅ **NATS Driver**: High-performance distributed broadcasting with NATS JetStream
|
|
535
|
+
- Sub-millisecond latency for million-level QPS
|
|
536
|
+
- Native message persistence and replay support
|
|
537
|
+
- ⚠️ Note: Presence persistence (NATS KV Store) planned for beta release
|
|
538
|
+
- ✅ **Message Interceptors**: Server and client-side middleware system
|
|
539
|
+
- Onion model execution pattern (like Koa.js)
|
|
540
|
+
- Use cases: logging, data masking, authentication, rate limiting
|
|
541
|
+
- Full TypeScript support with async/await
|
|
542
|
+
- ✅ **Enhanced Client SDK** (`@gravito/ripple-client` v4.0.0-alpha.1)
|
|
543
|
+
- Interceptor support with `.use()` API
|
|
544
|
+
- Automatic reconnection with session token recovery
|
|
545
|
+
- ACK confirmation for reliable message delivery
|
|
546
|
+
- Binary message support
|
|
547
|
+
|
|
548
|
+
**🔧 Improvements**
|
|
549
|
+
|
|
550
|
+
- ✅ **ACK Manager**: Ensures critical messages are delivered and confirmed
|
|
551
|
+
- ✅ **Session Manager**: Server-assisted reconnection with state recovery
|
|
552
|
+
- ✅ **Metrics**: Enhanced observability with RippleMetrics
|
|
553
|
+
- ✅ **Redis Driver**: Presence persistence across multiple nodes
|
|
554
|
+
|
|
555
|
+
**📚 Documentation**
|
|
556
|
+
|
|
557
|
+
- ✅ Updated architecture specs to v4.0.0-alpha
|
|
558
|
+
- ✅ Added NATS driver configuration examples
|
|
559
|
+
- ✅ Documented interceptor patterns and use cases
|
|
560
|
+
- ✅ Added limitations and known issues section
|
|
561
|
+
|
|
562
|
+
**🧪 Testing**
|
|
563
|
+
|
|
564
|
+
- ✅ New test suites: NATS driver, interceptors, session management
|
|
565
|
+
- ✅ Integration tests for reconnection flows
|
|
566
|
+
- ✅ Redis presence persistence tests
|
|
567
|
+
|
|
327
568
|
### v3.0.0 (2025-01-24)
|
|
328
569
|
|
|
329
570
|
**Phase 1: Type Safety & Architecture**
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import { type AtlasMetrics, type AtlasTracer } from './observability';
|
|
2
|
+
import type { AtlasConfig, CacheInterface, ConnectionConfig, ConnectionContract, QueryBuilderContract, QueryResult } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* DB Facade - Static entry point for database operations.
|
|
5
|
+
*
|
|
6
|
+
* Provides a Laravel-style static interface for managing connections,
|
|
7
|
+
* building queries, and executing transactions. Acts as the primary
|
|
8
|
+
* gateway for application-level database interaction.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* // Setup
|
|
13
|
+
* DB.configure({
|
|
14
|
+
* default: 'main',
|
|
15
|
+
* connections: { main: { driver: 'sqlite', database: ':memory:' } }
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* // Fluent Querying
|
|
19
|
+
* const users = await DB.table('users').where('id', 1).get();
|
|
20
|
+
*
|
|
21
|
+
* // Raw Execution
|
|
22
|
+
* const stats = await DB.raw('SELECT count(*) FROM users');
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare class DB {
|
|
26
|
+
private static manager;
|
|
27
|
+
private static initialized;
|
|
28
|
+
private static cache;
|
|
29
|
+
private static _debug;
|
|
30
|
+
private static _queryLog;
|
|
31
|
+
private static readonly MAX_LOG_SIZE;
|
|
32
|
+
private static queryListener?;
|
|
33
|
+
/**
|
|
34
|
+
* Sets the global cache provider for query results.
|
|
35
|
+
*
|
|
36
|
+
* @param cache - Implementation of CacheInterface (e.g., Redis, In-Memory).
|
|
37
|
+
*/
|
|
38
|
+
static setCache(cache: CacheInterface): void;
|
|
39
|
+
/**
|
|
40
|
+
* Retrieves the active global cache provider.
|
|
41
|
+
*
|
|
42
|
+
* @returns The cache interface or undefined if none is configured.
|
|
43
|
+
*/
|
|
44
|
+
static getCache(): CacheInterface | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Toggles debug mode for query logging.
|
|
47
|
+
*
|
|
48
|
+
* When enabled, executed queries are stored in an internal log with
|
|
49
|
+
* performance metrics.
|
|
50
|
+
*
|
|
51
|
+
* @param enabled - Whether to enable logging.
|
|
52
|
+
*/
|
|
53
|
+
static debug(enabled?: boolean): void;
|
|
54
|
+
/**
|
|
55
|
+
* Indicates if debug mode is currently active.
|
|
56
|
+
*/
|
|
57
|
+
static isDebug(): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Retrieves the last executed SQL statement with interpolated values.
|
|
60
|
+
*
|
|
61
|
+
* Useful for debugging and integration testing.
|
|
62
|
+
*
|
|
63
|
+
* @returns The full SQL string or null if no queries were run.
|
|
64
|
+
*/
|
|
65
|
+
static getLastQuery(): string | null;
|
|
66
|
+
/**
|
|
67
|
+
* Retrieves the complete query log for the current session.
|
|
68
|
+
*
|
|
69
|
+
* @returns A copy of the query log array.
|
|
70
|
+
*/
|
|
71
|
+
static getQueryLog(): typeof this._queryLog;
|
|
72
|
+
/**
|
|
73
|
+
* Flushes the internal query log.
|
|
74
|
+
*/
|
|
75
|
+
static clearQueryLog(): void;
|
|
76
|
+
/**
|
|
77
|
+
* Records a query execution event.
|
|
78
|
+
*
|
|
79
|
+
* @param sql - The SQL statement.
|
|
80
|
+
* @param bindings - The parameter values.
|
|
81
|
+
* @param duration - Time taken in ms.
|
|
82
|
+
* @internal
|
|
83
|
+
*/
|
|
84
|
+
static logQuery(sql: string, bindings: unknown[], duration: number): void;
|
|
85
|
+
/**
|
|
86
|
+
* Interpolates bindings into a SQL string for display purposes.
|
|
87
|
+
*
|
|
88
|
+
* Warning: This is only for logging/debugging and NOT for execution
|
|
89
|
+
* to avoid SQL injection risks.
|
|
90
|
+
*
|
|
91
|
+
* @param sql - The SQL template with placeholders.
|
|
92
|
+
* @param bindings - The values to inject.
|
|
93
|
+
* @returns The readable SQL string.
|
|
94
|
+
*/
|
|
95
|
+
private static interpolateBindings;
|
|
96
|
+
/**
|
|
97
|
+
* Executes a callback in "pretend" mode where queries are captured but not run.
|
|
98
|
+
*
|
|
99
|
+
* Ideal for verifying generated SQL without side effects.
|
|
100
|
+
*
|
|
101
|
+
* @param callback - Logic to simulate.
|
|
102
|
+
* @returns Captured SQL strings and the callback result.
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```typescript
|
|
106
|
+
* const { queries } = await DB.pretend(() => User.create({ name: 'Test' }));
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
static pretend<T>(callback: () => Promise<T>): Promise<{
|
|
110
|
+
queries: string[];
|
|
111
|
+
result?: T;
|
|
112
|
+
}>;
|
|
113
|
+
private constructor();
|
|
114
|
+
/**
|
|
115
|
+
* Retrieves performance metrics from the SQL compiler cache.
|
|
116
|
+
*
|
|
117
|
+
* @returns Stats including hit rate and cache utilization.
|
|
118
|
+
*/
|
|
119
|
+
static getCacheStats(): {
|
|
120
|
+
size: number;
|
|
121
|
+
maxSize: number;
|
|
122
|
+
hitRate: number;
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* Initializes the database subsystem with the provided configuration.
|
|
126
|
+
*
|
|
127
|
+
* Configures the connection manager and observability (Tracing/Metrics).
|
|
128
|
+
* This method must be called before any database operations.
|
|
129
|
+
*
|
|
130
|
+
* @param config - The Atlas configuration object.
|
|
131
|
+
* @throws {Error} If configuration is invalid.
|
|
132
|
+
*/
|
|
133
|
+
static configure(config: AtlasConfig): void;
|
|
134
|
+
/**
|
|
135
|
+
* Retrieves the global tracer for manual span creation.
|
|
136
|
+
*/
|
|
137
|
+
static getTracer(): AtlasTracer | undefined;
|
|
138
|
+
/**
|
|
139
|
+
* Retrieves the global metrics reporter.
|
|
140
|
+
*/
|
|
141
|
+
static getMetrics(): AtlasMetrics | undefined;
|
|
142
|
+
/**
|
|
143
|
+
* Configures the database using environment variables.
|
|
144
|
+
*
|
|
145
|
+
* Looks for standard DB_* variables or DATABASE_URL.
|
|
146
|
+
*
|
|
147
|
+
* @param connectionName - The name to assign to the primary connection.
|
|
148
|
+
*/
|
|
149
|
+
static configureFromEnv(connectionName?: string): void;
|
|
150
|
+
/**
|
|
151
|
+
* Loads configuration from a file.
|
|
152
|
+
*
|
|
153
|
+
* Automatically detects common patterns like config/database.ts.
|
|
154
|
+
*
|
|
155
|
+
* @param configPath - Explicit path to the config file.
|
|
156
|
+
*/
|
|
157
|
+
static configureFromFile(configPath?: string): Promise<void>;
|
|
158
|
+
/**
|
|
159
|
+
* Best-effort configuration using file detection then environment variables.
|
|
160
|
+
*
|
|
161
|
+
* @param configPath - Optional path to try first.
|
|
162
|
+
*/
|
|
163
|
+
static autoConfigure(configPath?: string): Promise<void>;
|
|
164
|
+
/**
|
|
165
|
+
* Manually adds a connection to the manager.
|
|
166
|
+
*
|
|
167
|
+
* @param name - Unique connection name.
|
|
168
|
+
* @param config - Connection settings.
|
|
169
|
+
*/
|
|
170
|
+
static addConnection(name: string, config: ConnectionConfig): void;
|
|
171
|
+
/**
|
|
172
|
+
* Adds a connection configured via prefixed environment variables.
|
|
173
|
+
*
|
|
174
|
+
* @param name - Connection name.
|
|
175
|
+
* @param prefix - Env variable prefix (e.g. "READ_ONLY").
|
|
176
|
+
*/
|
|
177
|
+
static addConnectionFromEnv(name: string, prefix?: string): void;
|
|
178
|
+
/**
|
|
179
|
+
* Sets the global default connection.
|
|
180
|
+
*
|
|
181
|
+
* @param name - The connection identifier.
|
|
182
|
+
*/
|
|
183
|
+
static setDefaultConnection(name: string): void;
|
|
184
|
+
/**
|
|
185
|
+
* Returns the name of the current default connection.
|
|
186
|
+
*/
|
|
187
|
+
static getDefaultConnection(): string;
|
|
188
|
+
/**
|
|
189
|
+
* Retrieves a connection instance.
|
|
190
|
+
*
|
|
191
|
+
* @param name - Name of the connection (defaults to the global default).
|
|
192
|
+
* @returns The active connection instance.
|
|
193
|
+
* @throws {Error} If DB is not configured or connection name is unknown.
|
|
194
|
+
*/
|
|
195
|
+
static connection(name?: string): ConnectionContract;
|
|
196
|
+
/**
|
|
197
|
+
* Checks if a specific connection has been configured.
|
|
198
|
+
*/
|
|
199
|
+
static hasConnection(name: string): boolean;
|
|
200
|
+
/**
|
|
201
|
+
* Lists all configured connection identifiers.
|
|
202
|
+
*/
|
|
203
|
+
static getConnectionNames(): string[];
|
|
204
|
+
/**
|
|
205
|
+
* Retrieves the raw configuration for a connection.
|
|
206
|
+
*/
|
|
207
|
+
static getConnectionConfig(name?: string): ConnectionConfig | undefined;
|
|
208
|
+
/**
|
|
209
|
+
* Initializes a fluent query builder for a specific table.
|
|
210
|
+
*
|
|
211
|
+
* @template T - The row type.
|
|
212
|
+
* @param tableName - The database table name.
|
|
213
|
+
* @returns A QueryBuilder instance.
|
|
214
|
+
*/
|
|
215
|
+
static table<T = Record<string, unknown>>(tableName: string): QueryBuilderContract<T>;
|
|
216
|
+
/**
|
|
217
|
+
* Executes a raw SQL statement with telemetry tracking.
|
|
218
|
+
*
|
|
219
|
+
* @template T - The expected row type.
|
|
220
|
+
* @param sql - The SQL string with placeholders.
|
|
221
|
+
* @param bindings - Array of values.
|
|
222
|
+
* @returns The raw query result.
|
|
223
|
+
*
|
|
224
|
+
* @example
|
|
225
|
+
* ```typescript
|
|
226
|
+
* const users = await DB.raw('SELECT * FROM users WHERE active = ?', [true]);
|
|
227
|
+
* ```
|
|
228
|
+
*/
|
|
229
|
+
static raw<T = Record<string, unknown>>(sql: string, bindings?: unknown[]): Promise<QueryResult<T>>;
|
|
230
|
+
/**
|
|
231
|
+
* Alias for {@link raw}.
|
|
232
|
+
*/
|
|
233
|
+
static rawQuery<T = Record<string, unknown>>(sql: string, bindings?: unknown[]): Promise<QueryResult<T>>;
|
|
234
|
+
/**
|
|
235
|
+
* Executes logic within a managed database transaction.
|
|
236
|
+
*
|
|
237
|
+
* Automatically commits on success and rolls back on error.
|
|
238
|
+
* Receives a connection instance scoped to the transaction.
|
|
239
|
+
*
|
|
240
|
+
* @template T - Logic result type.
|
|
241
|
+
* @param callback - The transactional logic.
|
|
242
|
+
* @param connectionName - Optional specific connection.
|
|
243
|
+
* @returns The callback's return value.
|
|
244
|
+
*/
|
|
245
|
+
static transaction<T>(callback: (connection: ConnectionContract) => Promise<T>, connectionName?: string): Promise<T>;
|
|
246
|
+
/**
|
|
247
|
+
* Manually starts a database transaction.
|
|
248
|
+
*
|
|
249
|
+
* Caller is responsible for calling commit() or rollback().
|
|
250
|
+
*
|
|
251
|
+
* @param connectionName - Connection to use.
|
|
252
|
+
* @returns A transaction-scoped connection.
|
|
253
|
+
* @throws {Error} If the driver does not support transactions.
|
|
254
|
+
*/
|
|
255
|
+
static beginTransaction(connectionName?: string): Promise<ConnectionContract>;
|
|
256
|
+
/**
|
|
257
|
+
* Closes the specified connection.
|
|
258
|
+
*/
|
|
259
|
+
static disconnect(name?: string): Promise<void>;
|
|
260
|
+
/**
|
|
261
|
+
* Closes all managed connections.
|
|
262
|
+
*/
|
|
263
|
+
static disconnectAll(): Promise<void>;
|
|
264
|
+
/**
|
|
265
|
+
* Safely shuts down the database subsystem.
|
|
266
|
+
*/
|
|
267
|
+
static shutdown(): Promise<void>;
|
|
268
|
+
/**
|
|
269
|
+
* Closes and re-opens a connection.
|
|
270
|
+
*/
|
|
271
|
+
static reconnect(name?: string): Promise<ConnectionContract>;
|
|
272
|
+
/**
|
|
273
|
+
* Removes a connection from the internal cache without closing it.
|
|
274
|
+
*/
|
|
275
|
+
static purge(name?: string): void;
|
|
276
|
+
/**
|
|
277
|
+
* Shortcut for starting a query with specific columns.
|
|
278
|
+
*/
|
|
279
|
+
static select<T = Record<string, unknown>>(tableName: string, columns?: string[]): QueryBuilderContract<T>;
|
|
280
|
+
/**
|
|
281
|
+
* Shortcut for inserting records.
|
|
282
|
+
*/
|
|
283
|
+
static insert<T = Record<string, unknown>>(tableName: string, data: Partial<T> | Partial<T>[]): Promise<T[]>;
|
|
284
|
+
/**
|
|
285
|
+
* Shortcut for updating records based on key-value filters.
|
|
286
|
+
*/
|
|
287
|
+
static update<T = Record<string, unknown>>(tableName: string, where: Record<string, unknown>, data: Partial<T>): Promise<number>;
|
|
288
|
+
/**
|
|
289
|
+
* Shortcut for deleting records based on key-value filters.
|
|
290
|
+
*/
|
|
291
|
+
static delete(tableName: string, where: Record<string, unknown>): Promise<number>;
|
|
292
|
+
/**
|
|
293
|
+
* Ensures the DB facade is ready for use.
|
|
294
|
+
*/
|
|
295
|
+
private static ensureConfigured;
|
|
296
|
+
/**
|
|
297
|
+
* Internal reset for testing.
|
|
298
|
+
* @internal
|
|
299
|
+
*/
|
|
300
|
+
static _reset(): Promise<void>;
|
|
301
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { GravitoOrbit, PlanetCore } from '@gravito/core';
|
|
2
|
+
/**
|
|
3
|
+
* Atlas Orbit - Database & ORM Integration
|
|
4
|
+
* Integrates the Atlas ORM engine into the Gravito Core ecosystem.
|
|
5
|
+
* @public
|
|
6
|
+
*/
|
|
7
|
+
export declare class OrbitAtlas implements GravitoOrbit {
|
|
8
|
+
install(core: PlanetCore): Promise<void>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AtlasConfig, AtlasObservabilityConfig, ConnectionConfig, PostgresConfig } from '../types';
|
|
2
|
+
export type { AtlasConfig, AtlasObservabilityConfig, ConnectionConfig, PostgresConfig };
|
|
3
|
+
/**
|
|
4
|
+
* Define configuration with type checking
|
|
5
|
+
*/
|
|
6
|
+
export declare function defineConfig(config: AtlasConfig): AtlasConfig;
|
|
7
|
+
/**
|
|
8
|
+
* Load configuration from environment variables with optional prefix
|
|
9
|
+
* Supports both DATABASE_URL and individual DB_* variables
|
|
10
|
+
*
|
|
11
|
+
* @param connectionName - Name for the connection
|
|
12
|
+
* @param prefix - Optional prefix for environment variables (e.g., 'READ' for DB_READ_*)
|
|
13
|
+
*/
|
|
14
|
+
export declare function fromEnv(connectionName?: string, prefix?: string): AtlasConfig;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Module
|
|
3
|
+
* @description Database configuration utilities
|
|
4
|
+
*/
|
|
5
|
+
export type { AtlasConfig, ConnectionConfig } from '../types';
|
|
6
|
+
export { defineConfig, fromEnv } from './defineConfig';
|
|
7
|
+
export { autoConfigure, loadConfig, loadConfigFile } from './loadConfig';
|