@gravito/stream 1.0.0-alpha.2 → 1.0.0-alpha.6
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 +28 -190
- package/README.zh-TW.md +34 -0
- package/dist/index.cjs +2 -1
- package/dist/index.cjs.map +4 -4
- package/dist/index.mjs +2 -1
- package/dist/index.mjs.map +4 -4
- package/package.json +3 -4
package/README.md
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
# @gravito/stream
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Lightweight, high-performance queueing for Gravito. Supports multiple storage drivers, embedded and standalone workers, and flexible job serialization.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**Status**: v0.1.0 - core features complete with Memory, Database, Redis, Kafka, and SQS drivers.
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## Features
|
|
8
8
|
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
- **AI
|
|
9
|
+
- **Zero runtime overhead**: Thin wrappers that delegate to drivers
|
|
10
|
+
- **Multi-driver support**: Memory, Database, Redis, Kafka, SQS
|
|
11
|
+
- **Modular**: Install only the driver you need (core < 50KB)
|
|
12
|
+
- **Embedded or standalone workers**: Run in-process during development or standalone in production
|
|
13
|
+
- **AI-friendly**: Strong typing, clear JSDoc, and predictable APIs
|
|
14
14
|
|
|
15
|
-
##
|
|
15
|
+
## Installation
|
|
16
16
|
|
|
17
17
|
```bash
|
|
18
18
|
bun add @gravito/stream
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
##
|
|
21
|
+
## Quick Start
|
|
22
22
|
|
|
23
|
-
### 1.
|
|
23
|
+
### 1. Define a job
|
|
24
24
|
|
|
25
25
|
```typescript
|
|
26
26
|
import { Job } from '@gravito/stream'
|
|
@@ -31,27 +31,23 @@ export class SendWelcomeEmail extends Job {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
async handle(): Promise<void> {
|
|
34
|
-
// 處理邏輯
|
|
35
34
|
const user = await User.find(this.userId)
|
|
36
35
|
await mail.send(new WelcomeEmail(user))
|
|
37
36
|
}
|
|
38
37
|
}
|
|
39
38
|
```
|
|
40
39
|
|
|
41
|
-
### 2.
|
|
40
|
+
### 2. Enqueue a job
|
|
42
41
|
|
|
43
42
|
```typescript
|
|
44
|
-
// 在 Controller 中
|
|
45
43
|
const queue = c.get('queue')
|
|
46
44
|
|
|
47
45
|
await queue.push(new SendWelcomeEmail(user.id))
|
|
48
46
|
.onQueue('emails')
|
|
49
|
-
.delay(60)
|
|
47
|
+
.delay(60)
|
|
50
48
|
```
|
|
51
49
|
|
|
52
|
-
### 3.
|
|
53
|
-
|
|
54
|
-
#### 使用 Memory Driver(開發用)
|
|
50
|
+
### 3. Configure OrbitStream (Memory driver)
|
|
55
51
|
|
|
56
52
|
```typescript
|
|
57
53
|
import { OrbitStream } from '@gravito/stream'
|
|
@@ -72,7 +68,7 @@ const core = await PlanetCore.boot({
|
|
|
72
68
|
})
|
|
73
69
|
```
|
|
74
70
|
|
|
75
|
-
|
|
71
|
+
## Database Driver Example
|
|
76
72
|
|
|
77
73
|
```typescript
|
|
78
74
|
import { OrbitStream } from '@gravito/stream'
|
|
@@ -84,93 +80,9 @@ const core = await PlanetCore.boot({
|
|
|
84
80
|
OrbitStream.configure({
|
|
85
81
|
default: 'database',
|
|
86
82
|
connections: {
|
|
87
|
-
database: {
|
|
83
|
+
database: {
|
|
88
84
|
driver: 'database',
|
|
89
|
-
table: 'jobs'
|
|
90
|
-
// dbService 會自動從 Context 取得(如果 OrbitDB 已安裝)
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
})
|
|
94
|
-
]
|
|
95
|
-
})
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
#### 使用 Redis Driver
|
|
99
|
-
|
|
100
|
-
```typescript
|
|
101
|
-
import { OrbitStream } from '@gravito/stream'
|
|
102
|
-
import Redis from 'ioredis'
|
|
103
|
-
|
|
104
|
-
const redis = new Redis('redis://localhost:6379')
|
|
105
|
-
|
|
106
|
-
const core = await PlanetCore.boot({
|
|
107
|
-
orbits: [
|
|
108
|
-
OrbitStream.configure({
|
|
109
|
-
default: 'redis',
|
|
110
|
-
connections: {
|
|
111
|
-
redis: {
|
|
112
|
-
driver: 'redis',
|
|
113
|
-
client: redis,
|
|
114
|
-
prefix: 'queue:' // 可選
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
})
|
|
118
|
-
]
|
|
119
|
-
})
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
#### 使用 Kafka Driver
|
|
123
|
-
|
|
124
|
-
```typescript
|
|
125
|
-
import { OrbitStream } from '@gravito/stream'
|
|
126
|
-
import { Kafka } from 'kafkajs'
|
|
127
|
-
|
|
128
|
-
const kafka = new Kafka({
|
|
129
|
-
brokers: ['localhost:9092'],
|
|
130
|
-
clientId: 'gravito-app'
|
|
131
|
-
})
|
|
132
|
-
|
|
133
|
-
const core = await PlanetCore.boot({
|
|
134
|
-
orbits: [
|
|
135
|
-
OrbitStream.configure({
|
|
136
|
-
default: 'kafka',
|
|
137
|
-
connections: {
|
|
138
|
-
kafka: {
|
|
139
|
-
driver: 'kafka',
|
|
140
|
-
client: kafka,
|
|
141
|
-
consumerGroupId: 'gravito-workers'
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
})
|
|
145
|
-
]
|
|
146
|
-
})
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
#### 使用 SQS Driver
|
|
150
|
-
|
|
151
|
-
```typescript
|
|
152
|
-
import { OrbitStream } from '@gravito/stream'
|
|
153
|
-
import { SQSClient } from '@aws-sdk/client-sqs'
|
|
154
|
-
|
|
155
|
-
const sqs = new SQSClient({
|
|
156
|
-
region: 'us-east-1',
|
|
157
|
-
credentials: {
|
|
158
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
159
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
160
|
-
}
|
|
161
|
-
})
|
|
162
|
-
|
|
163
|
-
const core = await PlanetCore.boot({
|
|
164
|
-
orbits: [
|
|
165
|
-
OrbitStream.configure({
|
|
166
|
-
default: 'sqs',
|
|
167
|
-
connections: {
|
|
168
|
-
sqs: {
|
|
169
|
-
driver: 'sqs',
|
|
170
|
-
client: sqs,
|
|
171
|
-
queueUrlPrefix: 'https://sqs.us-east-1.amazonaws.com/123456789012', // 可選
|
|
172
|
-
visibilityTimeout: 30, // 可選
|
|
173
|
-
waitTimeSeconds: 20 // 可選,長輪詢
|
|
85
|
+
table: 'jobs'
|
|
174
86
|
}
|
|
175
87
|
}
|
|
176
88
|
})
|
|
@@ -178,9 +90,7 @@ const core = await PlanetCore.boot({
|
|
|
178
90
|
})
|
|
179
91
|
```
|
|
180
92
|
|
|
181
|
-
##
|
|
182
|
-
|
|
183
|
-
如果使用 Database Driver,需要建立以下資料表:
|
|
93
|
+
## Database Schema
|
|
184
94
|
|
|
185
95
|
```sql
|
|
186
96
|
CREATE TABLE jobs (
|
|
@@ -197,29 +107,16 @@ CREATE INDEX idx_jobs_queue_available ON jobs(queue, available_at);
|
|
|
197
107
|
CREATE INDEX idx_jobs_reserved ON jobs(reserved_at);
|
|
198
108
|
```
|
|
199
109
|
|
|
200
|
-
##
|
|
110
|
+
## Standalone Worker
|
|
201
111
|
|
|
202
112
|
```bash
|
|
203
|
-
# 使用 Database
|
|
204
113
|
bun run packages/orbit-queue/cli/queue-worker.ts \
|
|
205
114
|
--connection=database \
|
|
206
115
|
--queues=default,emails \
|
|
207
116
|
--workers=4
|
|
208
|
-
|
|
209
|
-
# 使用 Kafka
|
|
210
|
-
bun run packages/orbit-queue/cli/queue-worker.ts \
|
|
211
|
-
--connection=kafka \
|
|
212
|
-
--queues=default,emails \
|
|
213
|
-
--consumer-group=gravito-workers
|
|
214
|
-
|
|
215
|
-
# 使用 SQS
|
|
216
|
-
bun run packages/orbit-queue/cli/queue-worker.ts \
|
|
217
|
-
--connection=sqs \
|
|
218
|
-
--queues=default,emails \
|
|
219
|
-
--region=us-east-1
|
|
220
117
|
```
|
|
221
118
|
|
|
222
|
-
## API
|
|
119
|
+
## API Reference
|
|
223
120
|
|
|
224
121
|
### Job
|
|
225
122
|
|
|
@@ -227,7 +124,7 @@ bun run packages/orbit-queue/cli/queue-worker.ts \
|
|
|
227
124
|
abstract class Job implements Queueable {
|
|
228
125
|
abstract handle(): Promise<void>
|
|
229
126
|
async failed(error: Error): Promise<void>
|
|
230
|
-
|
|
127
|
+
|
|
231
128
|
onQueue(queue: string): this
|
|
232
129
|
onConnection(connection: string): this
|
|
233
130
|
delay(seconds: number): this
|
|
@@ -247,73 +144,14 @@ class QueueManager {
|
|
|
247
144
|
}
|
|
248
145
|
```
|
|
249
146
|
|
|
250
|
-
##
|
|
251
|
-
|
|
252
|
-
- **高效能**:零運行時開銷,直接委派給驅動,支援批量操作
|
|
253
|
-
- **低耗**:最小化依賴,重用現有連接(DatabaseDriver 重用 orbit-db)
|
|
254
|
-
- **輕量**:核心包極小(< 50KB),驅動完全模組化,按需載入
|
|
255
|
-
- **AI 友善**:完整的型別推導,清晰的 JSDoc,直觀的 API
|
|
256
|
-
|
|
257
|
-
## 已實作的驅動
|
|
258
|
-
|
|
259
|
-
### 基礎驅動
|
|
260
|
-
|
|
261
|
-
- ✅ **MemoryDriver** - 記憶體驅動(開發用,零配置)
|
|
262
|
-
- ✅ **DatabaseDriver** - 資料庫驅動(PostgreSQL、MySQL、SQLite)
|
|
263
|
-
- ✅ **RedisDriver** - Redis 驅動(支援延遲執行)
|
|
264
|
-
|
|
265
|
-
### 企業級 Broker 驅動
|
|
266
|
-
|
|
267
|
-
- ✅ **KafkaDriver** - Apache Kafka 驅動(支援 Topic、Consumer Groups)
|
|
268
|
-
- ✅ **SQSDriver** - AWS SQS 驅動(支援標準/FIFO 隊列、長輪詢)
|
|
269
|
-
|
|
270
|
-
## 未來規劃
|
|
271
|
-
|
|
272
|
-
以下 broker 驅動計劃在後續版本中實作:
|
|
273
|
-
|
|
274
|
-
### 計劃中的驅動
|
|
275
|
-
|
|
276
|
-
- 🔜 **RabbitMQDriver** - RabbitMQ 驅動
|
|
277
|
-
- 支援 Exchange 和 Queue 管理
|
|
278
|
-
- 支援多種 Exchange 類型(direct、topic、fanout、headers)
|
|
279
|
-
- 支援持久化隊列
|
|
280
|
-
- 支援確認機制
|
|
281
|
-
|
|
282
|
-
- 🔜 **NATSDriver** - NATS 驅動
|
|
283
|
-
- 支援 JetStream(持久化消息)
|
|
284
|
-
- 支援訂閱模式
|
|
285
|
-
- 支援請求/回應模式
|
|
286
|
-
|
|
287
|
-
- 🔜 **GooglePubSubDriver** - Google Cloud Pub/Sub 驅動
|
|
288
|
-
- 支援 Topic 和 Subscription 管理
|
|
289
|
-
- 支援批量操作
|
|
290
|
-
- 支援死信主題(Dead Letter Topic)
|
|
291
|
-
|
|
292
|
-
- 🔜 **AzureServiceBusDriver** - Azure Service Bus 驅動
|
|
293
|
-
- 支援 Queue 和 Topic 管理
|
|
294
|
-
- 支援會話(Sessions)
|
|
295
|
-
- 支援死信隊列
|
|
296
|
-
|
|
297
|
-
- 🔜 **BeanstalkdDriver** - Beanstalkd 驅動
|
|
298
|
-
- 輕量級消息隊列
|
|
299
|
-
- 支援優先級和延遲
|
|
300
|
-
- 支援 TTR(Time To Run)
|
|
301
|
-
|
|
302
|
-
### 貢獻指南
|
|
303
|
-
|
|
304
|
-
如果您想為 Gravito Queue 添加新的 broker 驅動,請:
|
|
305
|
-
|
|
306
|
-
1. 實作 `QueueDriver` 介面
|
|
307
|
-
2. 確保符合核心原則(高效能、低耗、輕量、AI 友善)
|
|
308
|
-
3. 添加完整的 JSDoc 註解
|
|
309
|
-
4. 添加單元測試
|
|
310
|
-
5. 更新 README 文件
|
|
311
|
-
|
|
312
|
-
## 相關文件
|
|
147
|
+
## Implemented Drivers
|
|
313
148
|
|
|
314
|
-
-
|
|
315
|
-
-
|
|
149
|
+
- **MemoryDriver** - in-memory (development)
|
|
150
|
+
- **DatabaseDriver** - PostgreSQL/MySQL/SQLite
|
|
151
|
+
- **RedisDriver** - delayed jobs supported
|
|
152
|
+
- **KafkaDriver** - topics and consumer groups
|
|
153
|
+
- **SQSDriver** - standard/FIFO queues and long polling
|
|
316
154
|
|
|
317
|
-
##
|
|
155
|
+
## License
|
|
318
156
|
|
|
319
157
|
MIT
|
package/README.zh-TW.md
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# @gravito/stream
|
|
2
|
+
|
|
3
|
+
> Gravito 的佇列模組,支援多種驅動與獨立 Worker。
|
|
4
|
+
|
|
5
|
+
## 安裝
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
bun add @gravito/stream
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 快速開始
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { Job } from '@gravito/stream'
|
|
15
|
+
|
|
16
|
+
export class SendWelcomeEmail extends Job {
|
|
17
|
+
constructor(private userId: string) {
|
|
18
|
+
super()
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async handle(): Promise<void> {
|
|
22
|
+
const user = await User.find(this.userId)
|
|
23
|
+
await mail.send(new WelcomeEmail(user))
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
const queue = c.get('queue')
|
|
30
|
+
|
|
31
|
+
await queue.push(new SendWelcomeEmail(user.id))
|
|
32
|
+
.onQueue('emails')
|
|
33
|
+
.delay(60)
|
|
34
|
+
```
|
package/dist/index.cjs
CHANGED
|
@@ -32069,6 +32069,7 @@ class OrbitStream {
|
|
|
32069
32069
|
}
|
|
32070
32070
|
c3.set("queue", this.queueManager);
|
|
32071
32071
|
await next();
|
|
32072
|
+
return;
|
|
32072
32073
|
});
|
|
32073
32074
|
core.logger.info("[OrbitStream] Installed");
|
|
32074
32075
|
if (this.options.autoStartWorker && true && this.options.workerOptions) {
|
|
@@ -32098,4 +32099,4 @@ class OrbitStream {
|
|
|
32098
32099
|
}
|
|
32099
32100
|
})
|
|
32100
32101
|
|
|
32101
|
-
//# debugId=
|
|
32102
|
+
//# debugId=4594FD32F9CC842B64756E2164756E21
|