@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 CHANGED
@@ -1,26 +1,26 @@
1
1
  # @gravito/stream
2
2
 
3
- 輕量、高效的隊列系統,借鑑 Laravel 架構但保持 Gravito 的核心價值(高效能、低耗、輕量、AI 友善)。支援多種儲存驅動、內嵌與獨立 Consumer 模式,以及多種 Job 序列化方式。
3
+ Lightweight, high-performance queueing for Gravito. Supports multiple storage drivers, embedded and standalone workers, and flexible job serialization.
4
4
 
5
- > **狀態**:v0.1.0 - 核心功能已完成,支援 MemoryDatabaseRedisKafkaSQS 驅動
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
- - **多驅動支援**:MemoryDatabaseRedisKafkaSQS
11
- - **完全模組化**:按需安裝驅動,核心包極小(< 50KB
12
- - **內嵌與獨立模式**:開發時內嵌運行,生產環境可獨立部署
13
- - **AI 友善**:完整的型別推導、清晰的 JSDoc、直觀的 API
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. 建立 Job
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. 推送 Job
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) // 延遲 60 秒
47
+ .delay(60)
50
48
  ```
51
49
 
52
- ### 3. 配置 OrbitStream
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
- #### 使用 Database Driver
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' // 可選,預設為 '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
- ## 資料庫 Schema
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
- ## 獨立 Consumer(微服務模式)
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
- - [ROADMAP.md](./ROADMAP.md) - 詳細的路線圖和計劃
315
- - [MIGRATION.md](./MIGRATION.md) - 資料庫遷移腳本
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
@@ -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=0D545FB97BC32D9464756E2164756E21
32102
+ //# debugId=4594FD32F9CC842B64756E2164756E21