@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.
Files changed (70) hide show
  1. package/README.md +48 -28
  2. package/dist/index.cjs +1602 -0
  3. package/dist/index.d.mts +812 -0
  4. package/dist/index.d.ts +812 -9
  5. package/dist/index.js +1574 -6
  6. package/package.json +20 -18
  7. package/dist/adapters/cloudevents/cloudevents.d.ts +0 -14
  8. package/dist/adapters/cloudevents/cloudevents.js +0 -58
  9. package/dist/adapters/cloudevents/index.d.ts +0 -8
  10. package/dist/adapters/cloudevents/index.js +0 -7
  11. package/dist/adapters/cloudevents/parsers/binary-mode.d.ts +0 -5
  12. package/dist/adapters/cloudevents/parsers/binary-mode.js +0 -32
  13. package/dist/adapters/cloudevents/parsers/pubsub.d.ts +0 -5
  14. package/dist/adapters/cloudevents/parsers/pubsub.js +0 -54
  15. package/dist/adapters/cloudevents/parsers/raw-event.d.ts +0 -5
  16. package/dist/adapters/cloudevents/parsers/raw-event.js +0 -17
  17. package/dist/adapters/cloudevents/parsers/structured-mode.d.ts +0 -5
  18. package/dist/adapters/cloudevents/parsers/structured-mode.js +0 -18
  19. package/dist/adapters/cloudevents/types.d.ts +0 -29
  20. package/dist/adapters/cloudevents/types.js +0 -1
  21. package/dist/domain/contract-helper.d.ts +0 -63
  22. package/dist/domain/contract-helper.js +0 -61
  23. package/dist/domain/discovery.d.ts +0 -24
  24. package/dist/domain/discovery.js +0 -201
  25. package/dist/domain/handler-factory.d.ts +0 -49
  26. package/dist/domain/handler-factory.js +0 -169
  27. package/dist/domain/index.d.ts +0 -6
  28. package/dist/domain/index.js +0 -4
  29. package/dist/domain/types.d.ts +0 -108
  30. package/dist/domain/types.js +0 -6
  31. package/dist/domain/validation.d.ts +0 -37
  32. package/dist/domain/validation.js +0 -53
  33. package/dist/infrastructure/errors.d.ts +0 -53
  34. package/dist/infrastructure/errors.js +0 -54
  35. package/dist/infrastructure/index.d.ts +0 -4
  36. package/dist/infrastructure/index.js +0 -2
  37. package/dist/infrastructure/logging.d.ts +0 -18
  38. package/dist/infrastructure/logging.js +0 -27
  39. package/dist/middlewares/cloudevents-middleware.d.ts +0 -171
  40. package/dist/middlewares/cloudevents-middleware.js +0 -276
  41. package/dist/middlewares/index.d.ts +0 -1
  42. package/dist/middlewares/index.js +0 -1
  43. package/dist/processing/dlq-safe.d.ts +0 -82
  44. package/dist/processing/dlq-safe.js +0 -108
  45. package/dist/processing/handler-cache.d.ts +0 -36
  46. package/dist/processing/handler-cache.js +0 -94
  47. package/dist/processing/idempotency.d.ts +0 -51
  48. package/dist/processing/idempotency.js +0 -112
  49. package/dist/processing/index.d.ts +0 -4
  50. package/dist/processing/index.js +0 -4
  51. package/dist/processing/validation.d.ts +0 -41
  52. package/dist/processing/validation.js +0 -48
  53. package/dist/publishing/index.d.ts +0 -2
  54. package/dist/publishing/index.js +0 -2
  55. package/dist/publishing/nats.publisher.d.ts +0 -19
  56. package/dist/publishing/nats.publisher.js +0 -115
  57. package/dist/publishing/pubsub.publisher.d.ts +0 -39
  58. package/dist/publishing/pubsub.publisher.js +0 -84
  59. package/dist/transports/nats/base-message-processor.d.ts +0 -44
  60. package/dist/transports/nats/base-message-processor.js +0 -118
  61. package/dist/transports/nats/index.d.ts +0 -5
  62. package/dist/transports/nats/index.js +0 -5
  63. package/dist/transports/nats/jetstream-consumer.d.ts +0 -217
  64. package/dist/transports/nats/jetstream-consumer.js +0 -367
  65. package/dist/transports/nats/jetstream-message-processor.d.ts +0 -9
  66. package/dist/transports/nats/jetstream-message-processor.js +0 -32
  67. package/dist/transports/nats/nats-consumer.d.ts +0 -36
  68. package/dist/transports/nats/nats-consumer.js +0 -84
  69. package/dist/transports/nats/nats-message-processor.d.ts +0 -11
  70. 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 OrdersCreatedSchema = z.object({
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 OrdersCreatedEvent = z.infer<typeof OrdersCreatedSchema>
49
+ export type OrderCreatedEvent = z.infer<typeof OrderCreatedSchema>
50
50
 
51
51
  export default handleEvent(
52
52
  {
53
- schema: OrdersCreatedSchema,
54
- type: 'orders.created',
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('orders.created', { orderId: 'ord_123', total: 99.99 })
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** (`orders.created`): Lives in the CloudEvent **envelope** (`ce.type`). Used for routing and handler matching.
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: 'orders.created',
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: 'users.signup',
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('orders.created', orderData)
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: ['orders.created'], // Filter specific subjects
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: 'orders.created',
292
+ type: 'order.created',
273
293
  channel: {
274
294
  stream: 'ORDERS',
275
- // subject defaults to 'orders.created' if omitted
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: orders.created (plural)
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
- // orders.created → ORDERS stream
339
+ // order.created → ORDERS stream
320
340
  export const OrdersCreatedContract = createContract({
321
- type: 'orders.created',
341
+ type: 'order.created',
322
342
  channel: { stream: 'ORDERS' },
323
343
  schema: OrderCreatedSchema,
324
344
  })
325
345
 
326
- // orders.updated → ORDERS stream (same stream!)
346
+ // order.updated → ORDERS stream (same stream!)
327
347
  export const OrdersUpdatedContract = createContract({
328
- type: 'orders.updated',
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 `orders.created` and `orders.updated`.
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 (`orders.created`)
361
+ - Event type (`order.created`)
342
362
  - Stream routing (`ORDERS`)
343
- - Subject mapping (`orders.created`)
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: ['orders.created', 'orders.updated'] }]
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 OrdersCreatedSchema = z.object({
429
+ export const OrderCreatedSchema = z.object({
410
430
  orderId: z.string(),
411
431
  total: z.number(),
412
432
  })
413
433
 
414
- export type OrdersCreatedData = z.infer<typeof OrdersCreatedSchema>
434
+ export type OrderCreatedData = z.infer<typeof OrderCreatedSchema>
415
435
 
416
436
  export const OrdersCreatedContract = createContract({
417
- type: 'orders.created',
418
- schema: OrdersCreatedSchema,
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 OrdersCreatedData
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: 'orders.created',
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: 'orders.created',
486
+ type: 'order.created',
467
487
  schema: OrderSchema,
468
488
  match: (event) => event.data.total > 100, // Only high-value orders
469
489
  }, async (data) => { ... })