@crossdelta/cloudevents 0.5.0 → 0.5.2
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
|
@@ -58,21 +58,20 @@ export default handleEvent(
|
|
|
58
58
|
**2. Ensure stream exists** (once, during setup):
|
|
59
59
|
|
|
60
60
|
```typescript
|
|
61
|
-
import {
|
|
61
|
+
import { ensureJetStreams } from '@crossdelta/cloudevents'
|
|
62
62
|
|
|
63
|
-
await
|
|
64
|
-
stream: 'ORDERS',
|
|
65
|
-
subjects: ['orders.*'],
|
|
63
|
+
await ensureJetStreams({
|
|
64
|
+
streams: [{ stream: 'ORDERS', subjects: ['orders.*'] }],
|
|
66
65
|
})
|
|
67
66
|
```
|
|
68
67
|
|
|
69
68
|
**3. Start consuming:**
|
|
70
69
|
|
|
71
70
|
```typescript
|
|
72
|
-
import {
|
|
71
|
+
import { consumeJetStreams } from '@crossdelta/cloudevents'
|
|
73
72
|
|
|
74
|
-
|
|
75
|
-
|
|
73
|
+
consumeJetStreams({
|
|
74
|
+
streams: ['ORDERS'],
|
|
76
75
|
consumer: 'my-service',
|
|
77
76
|
discover: './src/events/**/*.event.ts',
|
|
78
77
|
})
|
|
@@ -162,27 +161,32 @@ await publish('orders.created', orderData)
|
|
|
162
161
|
Create the stream once during infrastructure setup:
|
|
163
162
|
|
|
164
163
|
```typescript
|
|
165
|
-
import {
|
|
166
|
-
|
|
167
|
-
await
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
164
|
+
import { ensureJetStreams } from '@crossdelta/cloudevents'
|
|
165
|
+
|
|
166
|
+
await ensureJetStreams({
|
|
167
|
+
streams: [
|
|
168
|
+
{
|
|
169
|
+
stream: 'ORDERS',
|
|
170
|
+
subjects: ['orders.>'],
|
|
171
|
+
config: {
|
|
172
|
+
maxAge: 7 * 24 * 60 * 60 * 1000, // 7 days retention
|
|
173
|
+
replicas: 3, // For HA
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
],
|
|
174
177
|
})
|
|
175
178
|
```
|
|
176
179
|
|
|
177
180
|
### Consuming
|
|
178
181
|
|
|
179
182
|
```typescript
|
|
183
|
+
import { consumeJetStreams } from '@crossdelta/cloudevents'
|
|
184
|
+
|
|
180
185
|
// JetStream (recommended) — persistent, retries, exactly-once
|
|
181
|
-
|
|
182
|
-
|
|
186
|
+
consumeJetStreams({
|
|
187
|
+
streams: ['ORDERS'],
|
|
183
188
|
consumer: 'billing',
|
|
184
189
|
discover: './src/events/**/*.event.ts',
|
|
185
|
-
filterSubjects: ['orders.created', 'orders.updated'], // Optional: filter at consumer level
|
|
186
190
|
})
|
|
187
191
|
|
|
188
192
|
// Core NATS — fire-and-forget, simpler
|
|
@@ -207,28 +211,33 @@ NATS_PASSWORD=mypass # optional
|
|
|
207
211
|
### Stream Options
|
|
208
212
|
|
|
209
213
|
```typescript
|
|
210
|
-
await
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
214
|
+
await ensureJetStreams({
|
|
215
|
+
streams: [
|
|
216
|
+
{
|
|
217
|
+
// Required
|
|
218
|
+
stream: 'ORDERS',
|
|
219
|
+
subjects: ['orders.>'],
|
|
220
|
+
|
|
221
|
+
// Optional
|
|
222
|
+
config: {
|
|
223
|
+
maxAge: 7 * 24 * 60 * 60 * 1000, // Message retention (ms)
|
|
224
|
+
replicas: 1, // Replication factor
|
|
225
|
+
storage: 'file', // 'file' or 'memory'
|
|
226
|
+
retention: 'limits', // 'limits', 'interest', or 'workqueue'
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
],
|
|
215
230
|
// Optional
|
|
216
231
|
servers: 'nats://localhost:4222',
|
|
217
|
-
config: {
|
|
218
|
-
maxAge: 7 * 24 * 60 * 60 * 1000, // Message retention (ms)
|
|
219
|
-
replicas: 1, // Replication factor
|
|
220
|
-
storage: 'file', // 'file' or 'memory'
|
|
221
|
-
retention: 'limits', // 'limits', 'interest', or 'workqueue'
|
|
222
|
-
}
|
|
223
232
|
})
|
|
224
233
|
```
|
|
225
234
|
|
|
226
235
|
### Consumer Options
|
|
227
236
|
|
|
228
237
|
```typescript
|
|
229
|
-
|
|
238
|
+
consumeJetStreams({
|
|
230
239
|
// Required
|
|
231
|
-
|
|
240
|
+
streams: ['ORDERS'],
|
|
232
241
|
consumer: 'my-service',
|
|
233
242
|
discover: './src/events/**/*.event.ts',
|
|
234
243
|
|
|
@@ -331,8 +340,10 @@ const redisStore = {
|
|
|
331
340
|
add: (id, ttl) => redis.set(`idem:${id}`, '1', 'PX', ttl),
|
|
332
341
|
}
|
|
333
342
|
|
|
334
|
-
await
|
|
335
|
-
|
|
343
|
+
await consumeJetStreams({
|
|
344
|
+
streams: ['ORDERS'],
|
|
345
|
+
consumer: 'my-service',
|
|
346
|
+
discover: './src/events/**/*.event.ts',
|
|
336
347
|
idempotencyStore: redisStore,
|
|
337
348
|
})
|
|
338
349
|
```
|
|
@@ -345,13 +356,17 @@ await consumeJetStreamEvents({
|
|
|
345
356
|
Invalid messages are quarantined, not lost:
|
|
346
357
|
|
|
347
358
|
```typescript
|
|
348
|
-
await
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
359
|
+
await consumeJetStreams({
|
|
360
|
+
streams: ['ORDERS'],
|
|
361
|
+
consumer: 'my-service',
|
|
362
|
+
discover: './src/events/**/*.event.ts',
|
|
363
|
+
quarantineTopic: 'events.quarantine', // For malformed messages
|
|
364
|
+
errorTopic: 'events.errors', // For handler errors
|
|
352
365
|
})
|
|
353
366
|
```
|
|
354
367
|
|
|
368
|
+
Messages that fail validation go to `quarantineTopic`, messages that crash handlers go to `errorTopic`.
|
|
369
|
+
|
|
355
370
|
</details>
|
|
356
371
|
|
|
357
372
|
<details>
|
|
@@ -375,8 +390,9 @@ app.use('/events', cloudEvents({ discover: 'src/events/**/*.event.ts' }))
|
|
|
375
390
|
|----------|---------|
|
|
376
391
|
| `handleEvent(options, handler)` | Create a handler |
|
|
377
392
|
| `createContract(options)` | Create shared event contract |
|
|
378
|
-
| `
|
|
379
|
-
| `
|
|
393
|
+
| `ensureJetStreams(options)` | Create/update JetStream streams (preferred) |
|
|
394
|
+
| `consumeJetStreams(options)` | Consume from multiple streams (preferred) |
|
|
395
|
+
| `consumeJetStreamEvents(options)` | Consume single stream (legacy) |
|
|
380
396
|
| `consumeNatsEvents(options)` | Consume fire-and-forget |
|
|
381
397
|
| `publish(type, data)` | Publish event |
|
|
382
398
|
|
package/dist/index.d.ts
CHANGED
|
@@ -6,4 +6,4 @@ export { clearHandlerCache, cloudEvents } from './middlewares';
|
|
|
6
6
|
export { checkAndMarkProcessed, createInMemoryIdempotencyStore, getDefaultIdempotencyStore, resetDefaultIdempotencyStore, } from './processing/idempotency';
|
|
7
7
|
export * from './publishing';
|
|
8
8
|
export type { JetStreamConsumerOptions, JetStreamStreamOptions, JetStreamStreamsConsumerOptions, JetStreamStreamsOptions, StreamConfig, StreamDefinition, } from './transports/nats';
|
|
9
|
-
export { consumeJetStreamEvents, consumeJetStreamStreams, consumeNatsEvents, ensureJetStreamStream, ensureJetStreamStreams, } from './transports/nats';
|
|
9
|
+
export { consumeJetStreamEvents, consumeJetStreamStreams, consumeJetStreams, consumeNatsEvents, ensureJetStreamStream, ensureJetStreamStreams, ensureJetStreams, } from './transports/nats';
|
package/dist/index.js
CHANGED
|
@@ -3,4 +3,4 @@ export { createContract, eventSchema, extractTypeFromSchema, handleEvent } from
|
|
|
3
3
|
export { clearHandlerCache, cloudEvents } from './middlewares';
|
|
4
4
|
export { checkAndMarkProcessed, createInMemoryIdempotencyStore, getDefaultIdempotencyStore, resetDefaultIdempotencyStore, } from './processing/idempotency';
|
|
5
5
|
export * from './publishing';
|
|
6
|
-
export { consumeJetStreamEvents, consumeJetStreamStreams, consumeNatsEvents, ensureJetStreamStream, ensureJetStreamStreams, } from './transports/nats';
|
|
6
|
+
export { consumeJetStreamEvents, consumeJetStreamStreams, consumeJetStreams, consumeNatsEvents, ensureJetStreamStream, ensureJetStreamStreams, ensureJetStreams, } from './transports/nats';
|
|
@@ -205,3 +205,13 @@ export interface JetStreamStreamsConsumerOptions extends Pick<CloudEventsOptions
|
|
|
205
205
|
* ```
|
|
206
206
|
*/
|
|
207
207
|
export declare function consumeJetStreamStreams(options: JetStreamStreamsConsumerOptions): Promise<ConsumerMessages[]>;
|
|
208
|
+
/**
|
|
209
|
+
* Alias for ensureJetStreamStreams - shorter name
|
|
210
|
+
* @see ensureJetStreamStreams
|
|
211
|
+
*/
|
|
212
|
+
export declare const ensureJetStreams: typeof ensureJetStreamStreams;
|
|
213
|
+
/**
|
|
214
|
+
* Alias for consumeJetStreamStreams - shorter name
|
|
215
|
+
* @see consumeJetStreamStreams
|
|
216
|
+
*/
|
|
217
|
+
export declare const consumeJetStreams: typeof consumeJetStreamStreams;
|
|
@@ -355,3 +355,13 @@ export async function consumeJetStreamStreams(options) {
|
|
|
355
355
|
}
|
|
356
356
|
return allMessages;
|
|
357
357
|
}
|
|
358
|
+
/**
|
|
359
|
+
* Alias for ensureJetStreamStreams - shorter name
|
|
360
|
+
* @see ensureJetStreamStreams
|
|
361
|
+
*/
|
|
362
|
+
export const ensureJetStreams = ensureJetStreamStreams;
|
|
363
|
+
/**
|
|
364
|
+
* Alias for consumeJetStreamStreams - shorter name
|
|
365
|
+
* @see consumeJetStreamStreams
|
|
366
|
+
*/
|
|
367
|
+
export const consumeJetStreams = consumeJetStreamStreams;
|