@crossdelta/cloudevents 0.5.6 → 0.6.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 +48 -28
- package/dist/index.cjs +1602 -0
- package/dist/index.d.mts +812 -0
- package/dist/index.d.ts +812 -9
- package/dist/index.js +1574 -6
- package/package.json +20 -18
- package/dist/adapters/cloudevents/cloudevents.d.ts +0 -14
- package/dist/adapters/cloudevents/cloudevents.js +0 -58
- package/dist/adapters/cloudevents/index.d.ts +0 -8
- package/dist/adapters/cloudevents/index.js +0 -7
- package/dist/adapters/cloudevents/parsers/binary-mode.d.ts +0 -5
- package/dist/adapters/cloudevents/parsers/binary-mode.js +0 -32
- package/dist/adapters/cloudevents/parsers/pubsub.d.ts +0 -5
- package/dist/adapters/cloudevents/parsers/pubsub.js +0 -54
- package/dist/adapters/cloudevents/parsers/raw-event.d.ts +0 -5
- package/dist/adapters/cloudevents/parsers/raw-event.js +0 -17
- package/dist/adapters/cloudevents/parsers/structured-mode.d.ts +0 -5
- package/dist/adapters/cloudevents/parsers/structured-mode.js +0 -18
- package/dist/adapters/cloudevents/types.d.ts +0 -29
- package/dist/adapters/cloudevents/types.js +0 -1
- package/dist/domain/contract-helper.d.ts +0 -63
- package/dist/domain/contract-helper.js +0 -61
- package/dist/domain/discovery.d.ts +0 -24
- package/dist/domain/discovery.js +0 -201
- package/dist/domain/handler-factory.d.ts +0 -49
- package/dist/domain/handler-factory.js +0 -169
- package/dist/domain/index.d.ts +0 -6
- package/dist/domain/index.js +0 -4
- package/dist/domain/types.d.ts +0 -108
- package/dist/domain/types.js +0 -6
- package/dist/domain/validation.d.ts +0 -37
- package/dist/domain/validation.js +0 -53
- package/dist/infrastructure/errors.d.ts +0 -53
- package/dist/infrastructure/errors.js +0 -54
- package/dist/infrastructure/index.d.ts +0 -4
- package/dist/infrastructure/index.js +0 -2
- package/dist/infrastructure/logging.d.ts +0 -18
- package/dist/infrastructure/logging.js +0 -27
- package/dist/middlewares/cloudevents-middleware.d.ts +0 -171
- package/dist/middlewares/cloudevents-middleware.js +0 -276
- package/dist/middlewares/index.d.ts +0 -1
- package/dist/middlewares/index.js +0 -1
- package/dist/processing/dlq-safe.d.ts +0 -82
- package/dist/processing/dlq-safe.js +0 -108
- package/dist/processing/handler-cache.d.ts +0 -36
- package/dist/processing/handler-cache.js +0 -94
- package/dist/processing/idempotency.d.ts +0 -51
- package/dist/processing/idempotency.js +0 -112
- package/dist/processing/index.d.ts +0 -4
- package/dist/processing/index.js +0 -4
- package/dist/processing/validation.d.ts +0 -41
- package/dist/processing/validation.js +0 -48
- package/dist/publishing/index.d.ts +0 -2
- package/dist/publishing/index.js +0 -2
- package/dist/publishing/nats.publisher.d.ts +0 -19
- package/dist/publishing/nats.publisher.js +0 -115
- package/dist/publishing/pubsub.publisher.d.ts +0 -39
- package/dist/publishing/pubsub.publisher.js +0 -84
- package/dist/transports/nats/base-message-processor.d.ts +0 -44
- package/dist/transports/nats/base-message-processor.js +0 -118
- package/dist/transports/nats/index.d.ts +0 -5
- package/dist/transports/nats/index.js +0 -5
- package/dist/transports/nats/jetstream-consumer.d.ts +0 -217
- package/dist/transports/nats/jetstream-consumer.js +0 -367
- package/dist/transports/nats/jetstream-message-processor.d.ts +0 -9
- package/dist/transports/nats/jetstream-message-processor.js +0 -32
- package/dist/transports/nats/nats-consumer.d.ts +0 -36
- package/dist/transports/nats/nats-consumer.js +0 -84
- package/dist/transports/nats/nats-message-processor.d.ts +0 -11
- package/dist/transports/nats/nats-message-processor.js +0 -32
package/README.md
CHANGED
|
@@ -40,18 +40,18 @@ import { handleEvent } from '@crossdelta/cloudevents'
|
|
|
40
40
|
import { z } from 'zod'
|
|
41
41
|
|
|
42
42
|
// Export schema for mock generation
|
|
43
|
-
export const
|
|
43
|
+
export const OrderCreatedSchema = z.object({
|
|
44
44
|
orderId: z.string(),
|
|
45
45
|
total: z.number(),
|
|
46
46
|
})
|
|
47
47
|
|
|
48
48
|
// Export type for use in use-cases
|
|
49
|
-
export type
|
|
49
|
+
export type OrderCreatedEvent = z.infer<typeof OrderCreatedSchema>
|
|
50
50
|
|
|
51
51
|
export default handleEvent(
|
|
52
52
|
{
|
|
53
|
-
schema:
|
|
54
|
-
type: '
|
|
53
|
+
schema: OrderCreatedSchema,
|
|
54
|
+
type: 'order.created',
|
|
55
55
|
},
|
|
56
56
|
async (data) => {
|
|
57
57
|
console.log(`New order: ${data.orderId}, total: ${data.total}`)
|
|
@@ -76,7 +76,7 @@ consumeJetStreams({
|
|
|
76
76
|
```typescript
|
|
77
77
|
import { publish } from '@crossdelta/cloudevents'
|
|
78
78
|
|
|
79
|
-
await publish('
|
|
79
|
+
await publish('order.created', { orderId: 'ord_123', total: 99.99 })
|
|
80
80
|
```
|
|
81
81
|
|
|
82
82
|
That's it. Handlers are auto-discovered, validated with Zod, and messages persist in JetStream.
|
|
@@ -104,7 +104,7 @@ That's it. Handlers are auto-discovered, validated with Zod, and messages persis
|
|
|
104
104
|
|
|
105
105
|
**Important distinction:**
|
|
106
106
|
|
|
107
|
-
- **Event Type** (`
|
|
107
|
+
- **Event Type** (`order.created`): Lives in the CloudEvent **envelope** (`ce.type`). Used for routing and handler matching.
|
|
108
108
|
- **Event Data** (`{ orderId, total }`): The actual payload. Does **not** include the type.
|
|
109
109
|
|
|
110
110
|
```typescript
|
|
@@ -115,7 +115,7 @@ const Schema = z.object({
|
|
|
115
115
|
export default handleEvent(
|
|
116
116
|
{
|
|
117
117
|
schema: Schema,
|
|
118
|
-
type: '
|
|
118
|
+
type: 'order.created',
|
|
119
119
|
},
|
|
120
120
|
async (data) => { ... }
|
|
121
121
|
)
|
|
@@ -140,7 +140,7 @@ export type UserSignupEvent = z.infer<typeof UserSignupSchema>
|
|
|
140
140
|
export default handleEvent(
|
|
141
141
|
{
|
|
142
142
|
schema: UserSignupSchema,
|
|
143
|
-
type: '
|
|
143
|
+
type: 'user.signup',
|
|
144
144
|
},
|
|
145
145
|
async (data) => {
|
|
146
146
|
await sendWelcomeEmail(data.email)
|
|
@@ -151,7 +151,7 @@ export default handleEvent(
|
|
|
151
151
|
### Publishing
|
|
152
152
|
|
|
153
153
|
```typescript
|
|
154
|
-
await publish('
|
|
154
|
+
await publish('order.created', orderData)
|
|
155
155
|
```
|
|
156
156
|
|
|
157
157
|
### Stream Setup
|
|
@@ -209,6 +209,26 @@ NATS_USER=myuser # optional
|
|
|
209
209
|
NATS_PASSWORD=mypass # optional
|
|
210
210
|
```
|
|
211
211
|
|
|
212
|
+
### Optional: Google Cloud Pub/Sub
|
|
213
|
+
|
|
214
|
+
To use Google Cloud Pub/Sub instead of NATS, install the optional dependency:
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
bun add @google-cloud/pubsub
|
|
218
|
+
# or
|
|
219
|
+
npm install @google-cloud/pubsub
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
Then use the `publishToPubSub` function:
|
|
223
|
+
|
|
224
|
+
```typescript
|
|
225
|
+
import { publishToPubSub } from '@crossdelta/cloudevents'
|
|
226
|
+
|
|
227
|
+
await publishToPubSub('order.created', { orderId: 'ord_123', total: 99.99 })
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
**Note:** `@google-cloud/pubsub` is not bundled with this library to keep the package size small. Install it only if you need Google Cloud Pub/Sub support.
|
|
231
|
+
|
|
212
232
|
### Stream Options
|
|
213
233
|
|
|
214
234
|
```typescript
|
|
@@ -244,7 +264,7 @@ consumeJetStreams({
|
|
|
244
264
|
|
|
245
265
|
// Optional
|
|
246
266
|
servers: 'nats://localhost:4222',
|
|
247
|
-
filterSubjects: ['
|
|
267
|
+
filterSubjects: ['order.created'], // Filter specific subjects
|
|
248
268
|
maxDeliver: 5, // Retry attempts
|
|
249
269
|
ackWait: 30_000, // Timeout per attempt (ms)
|
|
250
270
|
quarantineTopic: 'dlq', // For poison messages
|
|
@@ -269,10 +289,10 @@ import { createContract } from '@crossdelta/cloudevents'
|
|
|
269
289
|
import { z } from 'zod'
|
|
270
290
|
|
|
271
291
|
export const OrdersCreatedContract = createContract({
|
|
272
|
-
type: '
|
|
292
|
+
type: 'order.created',
|
|
273
293
|
channel: {
|
|
274
294
|
stream: 'ORDERS',
|
|
275
|
-
// subject defaults to '
|
|
295
|
+
// subject defaults to 'order.created' if omitted
|
|
276
296
|
},
|
|
277
297
|
schema: z.object({
|
|
278
298
|
orderId: z.string(),
|
|
@@ -300,7 +320,7 @@ interface ChannelConfig {
|
|
|
300
320
|
// Auto-pluralized subject
|
|
301
321
|
createContract({
|
|
302
322
|
type: 'order.created', // Event type: singular
|
|
303
|
-
channel: { stream: 'ORDERS' }, // Subject:
|
|
323
|
+
channel: { stream: 'ORDERS' }, // Subject: order.created (plural)
|
|
304
324
|
})
|
|
305
325
|
|
|
306
326
|
// Custom subject (no auto-pluralization)
|
|
@@ -316,31 +336,31 @@ createContract({
|
|
|
316
336
|
### Multiple Events, Same Stream
|
|
317
337
|
|
|
318
338
|
```typescript
|
|
319
|
-
//
|
|
339
|
+
// order.created → ORDERS stream
|
|
320
340
|
export const OrdersCreatedContract = createContract({
|
|
321
|
-
type: '
|
|
341
|
+
type: 'order.created',
|
|
322
342
|
channel: { stream: 'ORDERS' },
|
|
323
343
|
schema: OrderCreatedSchema,
|
|
324
344
|
})
|
|
325
345
|
|
|
326
|
-
//
|
|
346
|
+
// order.updated → ORDERS stream (same stream!)
|
|
327
347
|
export const OrdersUpdatedContract = createContract({
|
|
328
|
-
type: '
|
|
348
|
+
type: 'order.updated',
|
|
329
349
|
channel: { stream: 'ORDERS' },
|
|
330
350
|
schema: OrderUpdatedSchema,
|
|
331
351
|
})
|
|
332
352
|
```
|
|
333
353
|
|
|
334
|
-
**Result:** Both events share the `ORDERS` stream with subjects `
|
|
354
|
+
**Result:** Both events share the `ORDERS` stream with subjects `order.created` and `order.updated`.
|
|
335
355
|
|
|
336
356
|
### Infrastructure Materialization
|
|
337
357
|
|
|
338
358
|
Channel metadata is **conceptual** - it defines routing, not infrastructure policy.
|
|
339
359
|
|
|
340
360
|
**Contracts define:**
|
|
341
|
-
- Event type (`
|
|
361
|
+
- Event type (`order.created`)
|
|
342
362
|
- Stream routing (`ORDERS`)
|
|
343
|
-
- Subject mapping (`
|
|
363
|
+
- Subject mapping (`order.created`)
|
|
344
364
|
|
|
345
365
|
**Infrastructure defines:**
|
|
346
366
|
- Retention (7 days, 14 days, etc.)
|
|
@@ -356,7 +376,7 @@ import { ensureJetStreams } from '@crossdelta/cloudevents'
|
|
|
356
376
|
|
|
357
377
|
// Collect from contracts
|
|
358
378
|
const streams = collectStreamDefinitions()
|
|
359
|
-
// [{ stream: 'ORDERS', subjects: ['
|
|
379
|
+
// [{ stream: 'ORDERS', subjects: ['order.created', 'order.updated'] }]
|
|
360
380
|
|
|
361
381
|
// Materialize with policies
|
|
362
382
|
await ensureJetStreams({
|
|
@@ -406,16 +426,16 @@ When multiple services consume the same event, use `createContract` to create sh
|
|
|
406
426
|
import { createContract } from '@crossdelta/cloudevents'
|
|
407
427
|
import { z } from 'zod'
|
|
408
428
|
|
|
409
|
-
export const
|
|
429
|
+
export const OrderCreatedSchema = z.object({
|
|
410
430
|
orderId: z.string(),
|
|
411
431
|
total: z.number(),
|
|
412
432
|
})
|
|
413
433
|
|
|
414
|
-
export type
|
|
434
|
+
export type OrderCreatedData = z.infer<typeof OrderCreatedSchema>
|
|
415
435
|
|
|
416
436
|
export const OrdersCreatedContract = createContract({
|
|
417
|
-
type: '
|
|
418
|
-
schema:
|
|
437
|
+
type: 'order.created',
|
|
438
|
+
schema: OrderCreatedSchema,
|
|
419
439
|
})
|
|
420
440
|
```
|
|
421
441
|
|
|
@@ -428,7 +448,7 @@ import { OrdersCreatedContract } from '@my-org/contracts'
|
|
|
428
448
|
export default handleEvent(
|
|
429
449
|
OrdersCreatedContract,
|
|
430
450
|
async (data) => {
|
|
431
|
-
// data is typed as
|
|
451
|
+
// data is typed as OrderCreatedData
|
|
432
452
|
console.log(data.orderId)
|
|
433
453
|
},
|
|
434
454
|
)
|
|
@@ -448,7 +468,7 @@ Filter events by tenant:
|
|
|
448
468
|
|
|
449
469
|
```typescript
|
|
450
470
|
export default handleEvent({
|
|
451
|
-
type: '
|
|
471
|
+
type: 'order.created',
|
|
452
472
|
schema: OrderSchema,
|
|
453
473
|
tenantId: 'tenant-a', // Only process tenant-a events
|
|
454
474
|
}, async (data) => { ... })
|
|
@@ -463,7 +483,7 @@ Add custom filter logic:
|
|
|
463
483
|
|
|
464
484
|
```typescript
|
|
465
485
|
export default handleEvent({
|
|
466
|
-
type: '
|
|
486
|
+
type: 'order.created',
|
|
467
487
|
schema: OrderSchema,
|
|
468
488
|
match: (event) => event.data.total > 100, // Only high-value orders
|
|
469
489
|
}, async (data) => { ... })
|