@crossdelta/cloudevents 0.7.10 → 0.7.12

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
@@ -596,7 +596,9 @@ app.use('/events', cloudEvents({ discover: 'src/events/**/*.handler.ts' }))
596
596
  | `consumeNatsEvents(options)` | Consume fire-and-forget |
597
597
  | `publish(type, data)` | Publish event (fire-and-forget) |
598
598
  | `request(type, data, opts?)` | Publish event and await reply (Request-Reply) |
599
- | `isNatsConnected()` | Check if NATS connection is live (for health checks) |
599
+ | `isNatsConnected()` | Check if NATS publisher connection is live (for health checks) |
600
+ | `isConsumerConnected()` | Check if any NATS consumer connection is live (for readiness probes) |
601
+ | `configureNatsPublisher(config)` | Set connection options for the publisher singleton |
600
602
  | `closeConnection()` | Drain and close the NATS connection (for CLI tools) |
601
603
  ---
602
604
 
package/bin/cli.js CHANGED
@@ -4,7 +4,7 @@ import * as fs from 'fs';
4
4
  import { existsSync, readdirSync, statSync } from 'fs';
5
5
  import * as path from 'path';
6
6
  import { join } from 'path';
7
- import { createFlow, createGenerationResult, input, initGenerationContext, trackChange, printGenerationSummary, change, runFlow } from '@crossdelta/flowcore';
7
+ import { createFlow, createGenerationResult, input, initGenerationContext, trackChange, printGenerationSummary, runFlow, change } from '@crossdelta/flowcore';
8
8
  import 'url';
9
9
  import 'glob';
10
10
  import 'zod';
@@ -733,11 +733,34 @@ var init_domain = __esm({
733
733
  }
734
734
  });
735
735
 
736
+ // src/transports/nats/connection.ts
737
+ var LONG_LIVED_DEFAULTS, SHORT_LIVED_DEFAULTS, buildConnectOptions;
738
+ var init_connection = __esm({
739
+ "src/transports/nats/connection.ts"() {
740
+ LONG_LIVED_DEFAULTS = {
741
+ waitOnFirstConnect: true,
742
+ maxReconnectAttempts: -1
743
+ };
744
+ SHORT_LIVED_DEFAULTS = {
745
+ waitOnFirstConnect: true,
746
+ maxReconnectAttempts: 10
747
+ };
748
+ buildConnectOptions = (config, mode) => {
749
+ const defaults = mode === "long-lived" ? LONG_LIVED_DEFAULTS : SHORT_LIVED_DEFAULTS;
750
+ return {
751
+ waitOnFirstConnect: config?.waitOnFirstConnect ?? defaults.waitOnFirstConnect,
752
+ maxReconnectAttempts: config?.maxReconnectAttempts ?? defaults.maxReconnectAttempts
753
+ };
754
+ };
755
+ }
756
+ });
757
+
736
758
  // src/publishing/nats.publisher.ts
737
759
  var nats_publisher_exports = {};
738
760
  __export(nats_publisher_exports, {
739
761
  __resetNatsPublisher: () => __resetNatsPublisher,
740
762
  closeConnection: () => closeConnection,
763
+ configureNatsPublisher: () => configureNatsPublisher,
741
764
  connectNats: () => connectNats,
742
765
  deriveStreamFromType: () => deriveStreamFromType,
743
766
  deriveSubjectFromType: () => deriveSubjectFromType,
@@ -747,11 +770,12 @@ __export(nats_publisher_exports, {
747
770
  publishNatsRawEvent: () => publishNatsRawEvent,
748
771
  request: () => request
749
772
  });
750
- var sc, natsConnectionPromise, deriveSubjectFromEventType, getNatsConnection, closeConnection, connectNats, isNatsConnected, __resetNatsPublisher, deriveSubjectFromType, deriveStreamFromType, publishNatsRawEvent, publishNatsEvent, publish, DEFAULT_REQUEST_TIMEOUT, request;
773
+ var sc, natsConnectionPromise, deriveSubjectFromEventType, connectionConfig, configureNatsPublisher, getNatsConnection, closeConnection, connectNats, isNatsConnected, __resetNatsPublisher, deriveSubjectFromType, deriveStreamFromType, publishNatsRawEvent, publishNatsEvent, publish, DEFAULT_REQUEST_TIMEOUT, request;
751
774
  var init_nats_publisher = __esm({
752
775
  "src/publishing/nats.publisher.ts"() {
753
776
  init_domain();
754
777
  init_infrastructure();
778
+ init_connection();
755
779
  init_utils();
756
780
  sc = StringCodec();
757
781
  natsConnectionPromise = null;
@@ -763,10 +787,16 @@ var init_nats_publisher = __esm({
763
787
  const pluralDomain = pluralize(domain);
764
788
  return `${pluralDomain}.${action}`;
765
789
  };
790
+ configureNatsPublisher = (config) => {
791
+ connectionConfig = config;
792
+ };
766
793
  getNatsConnection = async (servers) => {
767
794
  if (!natsConnectionPromise) {
768
795
  const url = servers ?? process.env.NATS_URL ?? "nats://localhost:4222";
769
- natsConnectionPromise = connect({ servers: url }).then((connection) => {
796
+ natsConnectionPromise = connect({
797
+ servers: url,
798
+ ...buildConnectOptions(connectionConfig, "long-lived")
799
+ }).then((connection) => {
770
800
  logger.debug(`[NATS] connected to ${url}`);
771
801
  return connection;
772
802
  }).catch((error) => {
@@ -805,6 +835,7 @@ var init_nats_publisher = __esm({
805
835
  };
806
836
  __resetNatsPublisher = async () => {
807
837
  await closeConnection();
838
+ connectionConfig = void 0;
808
839
  };
809
840
  deriveSubjectFromType = (eventType, config) => {
810
841
  if (!config?.typeToSubjectMap) {
package/dist/index.cjs CHANGED
@@ -1367,11 +1367,55 @@ var init_domain = __esm({
1367
1367
  }
1368
1368
  });
1369
1369
 
1370
+ // src/transports/nats/connection.ts
1371
+ var LONG_LIVED_DEFAULTS, SHORT_LIVED_DEFAULTS, buildConnectOptions, CONNECTION_REGISTRY_KEY, getConnectionRegistry, registerConnection, unregisterConnection; exports.isConsumerConnected = void 0;
1372
+ var init_connection = __esm({
1373
+ "src/transports/nats/connection.ts"() {
1374
+ LONG_LIVED_DEFAULTS = {
1375
+ waitOnFirstConnect: true,
1376
+ maxReconnectAttempts: -1
1377
+ };
1378
+ SHORT_LIVED_DEFAULTS = {
1379
+ waitOnFirstConnect: true,
1380
+ maxReconnectAttempts: 10
1381
+ };
1382
+ buildConnectOptions = (config, mode) => {
1383
+ const defaults = mode === "long-lived" ? LONG_LIVED_DEFAULTS : SHORT_LIVED_DEFAULTS;
1384
+ return {
1385
+ waitOnFirstConnect: config?.waitOnFirstConnect ?? defaults.waitOnFirstConnect,
1386
+ maxReconnectAttempts: config?.maxReconnectAttempts ?? defaults.maxReconnectAttempts
1387
+ };
1388
+ };
1389
+ CONNECTION_REGISTRY_KEY = "__crossdelta_nats_connections__";
1390
+ getConnectionRegistry = () => {
1391
+ if (!globalThis[CONNECTION_REGISTRY_KEY]) {
1392
+ globalThis[CONNECTION_REGISTRY_KEY] = /* @__PURE__ */ new Map();
1393
+ }
1394
+ return globalThis[CONNECTION_REGISTRY_KEY];
1395
+ };
1396
+ registerConnection = (name, connection) => {
1397
+ getConnectionRegistry().set(name, connection);
1398
+ };
1399
+ unregisterConnection = (name) => {
1400
+ getConnectionRegistry().delete(name);
1401
+ };
1402
+ exports.isConsumerConnected = () => {
1403
+ const registry = getConnectionRegistry();
1404
+ if (registry.size === 0) return false;
1405
+ for (const connection of registry.values()) {
1406
+ if (!connection.isClosed() && !connection.isDraining()) return true;
1407
+ }
1408
+ return false;
1409
+ };
1410
+ }
1411
+ });
1412
+
1370
1413
  // src/publishing/nats.publisher.ts
1371
1414
  var nats_publisher_exports = {};
1372
1415
  __export(nats_publisher_exports, {
1373
1416
  __resetNatsPublisher: () => exports.__resetNatsPublisher,
1374
1417
  closeConnection: () => exports.closeConnection,
1418
+ configureNatsPublisher: () => exports.configureNatsPublisher,
1375
1419
  connectNats: () => exports.connectNats,
1376
1420
  deriveStreamFromType: () => exports.deriveStreamFromType,
1377
1421
  deriveSubjectFromType: () => exports.deriveSubjectFromType,
@@ -1381,11 +1425,12 @@ __export(nats_publisher_exports, {
1381
1425
  publishNatsRawEvent: () => exports.publishNatsRawEvent,
1382
1426
  request: () => exports.request
1383
1427
  });
1384
- var sc, natsConnectionPromise, deriveSubjectFromEventType, getNatsConnection; exports.closeConnection = void 0; exports.connectNats = void 0; exports.isNatsConnected = void 0; exports.__resetNatsPublisher = void 0; exports.deriveSubjectFromType = void 0; exports.deriveStreamFromType = void 0; exports.publishNatsRawEvent = void 0; exports.publishNatsEvent = void 0; exports.publish = void 0; var DEFAULT_REQUEST_TIMEOUT; exports.request = void 0;
1428
+ var sc, natsConnectionPromise, deriveSubjectFromEventType, connectionConfig; exports.configureNatsPublisher = void 0; var getNatsConnection; exports.closeConnection = void 0; exports.connectNats = void 0; exports.isNatsConnected = void 0; exports.__resetNatsPublisher = void 0; exports.deriveSubjectFromType = void 0; exports.deriveStreamFromType = void 0; exports.publishNatsRawEvent = void 0; exports.publishNatsEvent = void 0; exports.publish = void 0; var DEFAULT_REQUEST_TIMEOUT; exports.request = void 0;
1385
1429
  var init_nats_publisher = __esm({
1386
1430
  "src/publishing/nats.publisher.ts"() {
1387
1431
  init_domain();
1388
1432
  init_infrastructure();
1433
+ init_connection();
1389
1434
  init_utils();
1390
1435
  sc = nats.StringCodec();
1391
1436
  natsConnectionPromise = null;
@@ -1397,10 +1442,16 @@ var init_nats_publisher = __esm({
1397
1442
  const pluralDomain = exports.pluralize(domain);
1398
1443
  return `${pluralDomain}.${action}`;
1399
1444
  };
1445
+ exports.configureNatsPublisher = (config) => {
1446
+ connectionConfig = config;
1447
+ };
1400
1448
  getNatsConnection = async (servers) => {
1401
1449
  if (!natsConnectionPromise) {
1402
1450
  const url = servers ?? process.env.NATS_URL ?? "nats://localhost:4222";
1403
- natsConnectionPromise = nats.connect({ servers: url }).then((connection) => {
1451
+ natsConnectionPromise = nats.connect({
1452
+ servers: url,
1453
+ ...buildConnectOptions(connectionConfig, "long-lived")
1454
+ }).then((connection) => {
1404
1455
  logger.debug(`[NATS] connected to ${url}`);
1405
1456
  return connection;
1406
1457
  }).catch((error) => {
@@ -1439,6 +1490,7 @@ var init_nats_publisher = __esm({
1439
1490
  };
1440
1491
  exports.__resetNatsPublisher = async () => {
1441
1492
  await exports.closeConnection();
1493
+ connectionConfig = void 0;
1442
1494
  };
1443
1495
  exports.deriveSubjectFromType = (eventType, config) => {
1444
1496
  if (!config?.typeToSubjectMap) {
@@ -2182,7 +2234,7 @@ function cloudEvents(options = {}) {
2182
2234
  // package.json
2183
2235
  var package_default = {
2184
2236
  name: "@crossdelta/cloudevents",
2185
- version: "0.7.10",
2237
+ version: "0.7.12",
2186
2238
  description: "CloudEvents toolkit for TypeScript - Zod validation, handler discovery, NATS JetStream & Core"};
2187
2239
 
2188
2240
  // src/plugin.ts
@@ -2415,9 +2467,13 @@ function createBaseMessageProcessor(deps) {
2415
2467
  };
2416
2468
  }
2417
2469
 
2470
+ // src/transports/nats/index.ts
2471
+ init_connection();
2472
+
2418
2473
  // src/transports/nats/jetstream-consumer.ts
2419
2474
  init_domain();
2420
2475
  init_logging();
2476
+ init_connection();
2421
2477
 
2422
2478
  // src/transports/nats/jetstream-message-processor.ts
2423
2479
  var createJetStreamMessageProcessor = (deps) => {
@@ -2473,7 +2529,8 @@ async function ensureJetStreamStream(options) {
2473
2529
  const pass = options.pass ?? process.env.NATS_PASSWORD;
2474
2530
  const nc = await nats.connect({
2475
2531
  servers,
2476
- ...user && pass ? { user, pass } : {}
2532
+ ...user && pass ? { user, pass } : {},
2533
+ ...buildConnectOptions(options.connection, "short-lived")
2477
2534
  });
2478
2535
  try {
2479
2536
  const jsm = await nc.jetstreamManager();
@@ -2514,7 +2571,8 @@ async function ensureJetStreamStreams(options) {
2514
2571
  const pass = options.pass ?? process.env.NATS_PASSWORD;
2515
2572
  const nc = await nats.connect({
2516
2573
  servers,
2517
- ...user && pass ? { user, pass } : {}
2574
+ ...user && pass ? { user, pass } : {},
2575
+ ...buildConnectOptions(options.connection, "short-lived")
2518
2576
  });
2519
2577
  try {
2520
2578
  const jsm = await nc.jetstreamManager();
@@ -2566,8 +2624,10 @@ async function consumeJetStreamEvents(options) {
2566
2624
  logger.info(`[${name}] discovered ${processedHandlers.length} handler(s): ${handlerNames}`);
2567
2625
  const nc = await nats.connect({
2568
2626
  servers,
2569
- ...user && pass ? { user, pass } : {}
2627
+ ...user && pass ? { user, pass } : {},
2628
+ ...buildConnectOptions(options.connection, "long-lived")
2570
2629
  });
2630
+ registerConnection(name, nc);
2571
2631
  logger.info(`[${name}] connected to NATS: ${servers}${user ? " (authenticated)" : ""}`);
2572
2632
  const jsm = await nc.jetstreamManager();
2573
2633
  const js = nc.jetstream();
@@ -2634,8 +2694,10 @@ async function consumeJetStreamStreams(options) {
2634
2694
  logger.info(`[${name}] discovered ${processedHandlers.length} handler(s): ${handlerNames}`);
2635
2695
  const nc = await nats.connect({
2636
2696
  servers,
2637
- ...user && pass ? { user, pass } : {}
2697
+ ...user && pass ? { user, pass } : {},
2698
+ ...buildConnectOptions(options.connection, "long-lived")
2638
2699
  });
2700
+ registerConnection(name, nc);
2639
2701
  logger.info(`[${name}] connected to NATS: ${servers}${user ? " (authenticated)" : ""}`);
2640
2702
  const jsm = await nc.jetstreamManager();
2641
2703
  const js = nc.jetstream();
@@ -2703,6 +2765,7 @@ var consumeJetStreams = consumeJetStreamStreams;
2703
2765
  // src/transports/nats/nats-consumer.ts
2704
2766
  init_domain();
2705
2767
  init_logging();
2768
+ init_connection();
2706
2769
  var sc3 = nats.StringCodec();
2707
2770
  var isRequestMessage = (msg) => Boolean(msg.reply);
2708
2771
  var sendReply = (msg, payload) => {
@@ -2762,6 +2825,7 @@ async function cleanupConsumer(name) {
2762
2825
  consumer.subscription.unsubscribe();
2763
2826
  await consumer.connection.drain();
2764
2827
  registry.delete(name);
2828
+ unregisterConnection(name);
2765
2829
  }
2766
2830
  }
2767
2831
  async function consumeNatsEvents(options) {
@@ -2777,12 +2841,14 @@ async function consumeNatsEvents(options) {
2777
2841
  logger.info(`[${name}] discovered ${processedHandlers.length} handler(s): ${handlerNames}`);
2778
2842
  const nc = await nats.connect({
2779
2843
  servers,
2780
- ...user && pass ? { user, pass } : {}
2844
+ ...user && pass ? { user, pass } : {},
2845
+ ...buildConnectOptions(options.connection, "long-lived")
2781
2846
  });
2782
2847
  logger.info(`[${name}] connected to NATS: ${servers}${user ? " (authenticated)" : ""}`);
2783
2848
  const sub = nc.subscribe(subject, { queue: name });
2784
2849
  logger.info(`[${name}] subscribed to subject: ${subject} (queue: ${name})`);
2785
2850
  getConsumerRegistry().set(name, { subscription: sub, connection: nc });
2851
+ registerConnection(name, nc);
2786
2852
  const dlqEnabled = Boolean(options.quarantineTopic || options.errorTopic);
2787
2853
  const { handleMessage, handleUnhandledProcessingError } = createNatsMessageProcessor({
2788
2854
  name,
package/dist/index.d.cts CHANGED
@@ -1298,6 +1298,18 @@ interface CloudEventsPfPluginOptions {
1298
1298
  }
1299
1299
  declare const createPfPlugin: (options?: CloudEventsPfPluginOptions) => PfPlugin;
1300
1300
 
1301
+ interface NatsConnectionConfig {
1302
+ /** Retry the initial connection instead of failing immediately. @default true */
1303
+ waitOnFirstConnect?: boolean;
1304
+ /** Maximum reconnect attempts (-1 = unlimited). @default -1 */
1305
+ maxReconnectAttempts?: number;
1306
+ }
1307
+ /**
1308
+ * Returns true if at least one registered consumer connection is alive.
1309
+ * Returns false if no consumers are registered or all are closed/draining.
1310
+ */
1311
+ declare const isConsumerConnected: () => boolean;
1312
+
1301
1313
  interface RequestNatsEventOptions {
1302
1314
  servers?: string;
1303
1315
  source?: string;
@@ -1314,6 +1326,11 @@ interface PublishNatsEventOptions {
1314
1326
  /** Close connection after publishing (for CLI tools) */
1315
1327
  closeAfterPublish?: boolean;
1316
1328
  }
1329
+ /**
1330
+ * Configure connection defaults for the publisher singleton.
1331
+ * Call before any publish/request to override defaults.
1332
+ */
1333
+ declare const configureNatsPublisher: (config: NatsConnectionConfig) => void;
1317
1334
  /**
1318
1335
  * Close the NATS connection and reset state
1319
1336
  */
@@ -1408,6 +1425,8 @@ interface JetStreamStreamOptions {
1408
1425
  subjects: string[];
1409
1426
  /** Stream configuration */
1410
1427
  config?: StreamConfig;
1428
+ /** NATS connection tuning */
1429
+ connection?: NatsConnectionConfig;
1411
1430
  }
1412
1431
  /**
1413
1432
  * Stream definition for batch operations
@@ -1432,6 +1451,8 @@ interface JetStreamStreamsOptions {
1432
1451
  pass?: string;
1433
1452
  /** Array of stream definitions */
1434
1453
  streams: StreamDefinition[];
1454
+ /** NATS connection tuning */
1455
+ connection?: NatsConnectionConfig;
1435
1456
  }
1436
1457
  /**
1437
1458
  * JetStream consumer configuration
@@ -1487,6 +1508,8 @@ interface JetStreamConsumerOptions extends Pick<CloudEventsOptions, 'quarantineT
1487
1508
  * @default 86400000 (24 hours)
1488
1509
  */
1489
1510
  idempotencyTtl?: number;
1511
+ /** NATS connection tuning */
1512
+ connection?: NatsConnectionConfig;
1490
1513
  }
1491
1514
  /**
1492
1515
  * Ensures a JetStream stream exists with the given configuration.
@@ -1570,6 +1593,8 @@ interface JetStreamStreamsConsumerOptions extends Pick<CloudEventsOptions, 'quar
1570
1593
  idempotencyStore?: IdempotencyStore | false;
1571
1594
  /** TTL for idempotency records in milliseconds @default 86400000 */
1572
1595
  idempotencyTtl?: number;
1596
+ /** NATS connection tuning */
1597
+ connection?: NatsConnectionConfig;
1573
1598
  }
1574
1599
  /**
1575
1600
  * Consume CloudEvents from multiple JetStream streams with a single connection.
@@ -1619,6 +1644,8 @@ interface NatsConsumerOptions extends Pick<CloudEventsOptions, 'quarantineTopic'
1619
1644
  user?: string;
1620
1645
  /** NATS password for authentication (defaults to NATS_PASSWORD env var) */
1621
1646
  pass?: string;
1647
+ /** NATS connection tuning */
1648
+ connection?: NatsConnectionConfig;
1622
1649
  }
1623
1650
  /**
1624
1651
  * Connects to NATS, discovers matching event handlers, and processes incoming CloudEvents.
@@ -1631,4 +1658,4 @@ interface NatsConsumerOptions extends Pick<CloudEventsOptions, 'quarantineTopic'
1631
1658
  */
1632
1659
  declare function consumeNatsEvents(options: NatsConsumerOptions): Promise<Subscription>;
1633
1660
 
1634
- export { type ChannelConfig, type ChannelMetadata, type CloudEventsPfPluginOptions, type ContractCreatedEffect, type ContractPaths, type CreateEventContext, type CreateEventOptions, type DomainEffect, type EnrichedEvent, type EventContext, type EventNames, type EventTypeValidation, type FileSystem, type HandleEventOptions, type HandlerCreatedEffect, type IdempotencyStore, type InferEventData, type JetStreamConsumerOptions, type JetStreamStreamOptions, type JetStreamStreamsConsumerOptions, type JetStreamStreamsOptions, type ListEventsContext, type NatsRequestResponse, type PublishEventContext, type PublishEventOptions, type PublishNatsEventOptions, type RequestNatsEventOptions, type RoutingConfig, type SchemaField, type StreamConfig, type StreamDefinition, type StreamWiredEffect, __resetNatsPublisher, checkAndMarkProcessed, clearHandlerCache, closeConnection, cloudEvents, connectNats, consumeJetStreamEvents, consumeJetStreamStreams, consumeJetStreams, consumeNatsEvents, contractCreated, createContract, createEvent, createEventFlowSteps, createInMemoryIdempotencyStore, createMemoryFileSystem, createPfPlugin, deriveEventNames, deriveStreamFromType, deriveSubjectFromType, discoverEventTypes, ensureJetStreamStream, ensureJetStreamStreams, ensureJetStreams, eventSchema, extractTypeFromSchema, generateContract, generateContractContent, generateEventHandler, generateEventHandlerContent, generateJsonMock, generateJsonMockFromContract, generateMock, generateMockContent, getContractFilePath, getContractPaths, getDefaultIdempotencyStore, getHandlerFilePath, getHandlerPath, getJsonMockPath, getMockFilePath, getStreamName, handleEvent, handlerCreated, initFaker, isNatsConnected, isValidEventType, jsonMockExists, listEvents, listEventsFlowSteps, loadJsonMock, normalizeSubject, parseDataInput, parseEventFromContext, parseEventTypeFromContract, parseEventTypeFromHandler, parseFieldsInput, pluralize, publish, publishEvent, publishEventFlowSteps, publishNatsEvent, publishNatsRawEvent, publishRawEvent, request, resetDefaultIdempotencyStore, singularize, streamWired, toKebabCase, toPascalCase, validateEventType };
1661
+ export { type ChannelConfig, type ChannelMetadata, type CloudEventsPfPluginOptions, type ContractCreatedEffect, type ContractPaths, type CreateEventContext, type CreateEventOptions, type DomainEffect, type EnrichedEvent, type EventContext, type EventNames, type EventTypeValidation, type FileSystem, type HandleEventOptions, type HandlerCreatedEffect, type IdempotencyStore, type InferEventData, type JetStreamConsumerOptions, type JetStreamStreamOptions, type JetStreamStreamsConsumerOptions, type JetStreamStreamsOptions, type ListEventsContext, type NatsConnectionConfig, type NatsRequestResponse, type PublishEventContext, type PublishEventOptions, type PublishNatsEventOptions, type RequestNatsEventOptions, type RoutingConfig, type SchemaField, type StreamConfig, type StreamDefinition, type StreamWiredEffect, __resetNatsPublisher, checkAndMarkProcessed, clearHandlerCache, closeConnection, cloudEvents, configureNatsPublisher, connectNats, consumeJetStreamEvents, consumeJetStreamStreams, consumeJetStreams, consumeNatsEvents, contractCreated, createContract, createEvent, createEventFlowSteps, createInMemoryIdempotencyStore, createMemoryFileSystem, createPfPlugin, deriveEventNames, deriveStreamFromType, deriveSubjectFromType, discoverEventTypes, ensureJetStreamStream, ensureJetStreamStreams, ensureJetStreams, eventSchema, extractTypeFromSchema, generateContract, generateContractContent, generateEventHandler, generateEventHandlerContent, generateJsonMock, generateJsonMockFromContract, generateMock, generateMockContent, getContractFilePath, getContractPaths, getDefaultIdempotencyStore, getHandlerFilePath, getHandlerPath, getJsonMockPath, getMockFilePath, getStreamName, handleEvent, handlerCreated, initFaker, isConsumerConnected, isNatsConnected, isValidEventType, jsonMockExists, listEvents, listEventsFlowSteps, loadJsonMock, normalizeSubject, parseDataInput, parseEventFromContext, parseEventTypeFromContract, parseEventTypeFromHandler, parseFieldsInput, pluralize, publish, publishEvent, publishEventFlowSteps, publishNatsEvent, publishNatsRawEvent, publishRawEvent, request, resetDefaultIdempotencyStore, singularize, streamWired, toKebabCase, toPascalCase, validateEventType };
package/dist/index.d.ts CHANGED
@@ -1298,6 +1298,18 @@ interface CloudEventsPfPluginOptions {
1298
1298
  }
1299
1299
  declare const createPfPlugin: (options?: CloudEventsPfPluginOptions) => PfPlugin;
1300
1300
 
1301
+ interface NatsConnectionConfig {
1302
+ /** Retry the initial connection instead of failing immediately. @default true */
1303
+ waitOnFirstConnect?: boolean;
1304
+ /** Maximum reconnect attempts (-1 = unlimited). @default -1 */
1305
+ maxReconnectAttempts?: number;
1306
+ }
1307
+ /**
1308
+ * Returns true if at least one registered consumer connection is alive.
1309
+ * Returns false if no consumers are registered or all are closed/draining.
1310
+ */
1311
+ declare const isConsumerConnected: () => boolean;
1312
+
1301
1313
  interface RequestNatsEventOptions {
1302
1314
  servers?: string;
1303
1315
  source?: string;
@@ -1314,6 +1326,11 @@ interface PublishNatsEventOptions {
1314
1326
  /** Close connection after publishing (for CLI tools) */
1315
1327
  closeAfterPublish?: boolean;
1316
1328
  }
1329
+ /**
1330
+ * Configure connection defaults for the publisher singleton.
1331
+ * Call before any publish/request to override defaults.
1332
+ */
1333
+ declare const configureNatsPublisher: (config: NatsConnectionConfig) => void;
1317
1334
  /**
1318
1335
  * Close the NATS connection and reset state
1319
1336
  */
@@ -1408,6 +1425,8 @@ interface JetStreamStreamOptions {
1408
1425
  subjects: string[];
1409
1426
  /** Stream configuration */
1410
1427
  config?: StreamConfig;
1428
+ /** NATS connection tuning */
1429
+ connection?: NatsConnectionConfig;
1411
1430
  }
1412
1431
  /**
1413
1432
  * Stream definition for batch operations
@@ -1432,6 +1451,8 @@ interface JetStreamStreamsOptions {
1432
1451
  pass?: string;
1433
1452
  /** Array of stream definitions */
1434
1453
  streams: StreamDefinition[];
1454
+ /** NATS connection tuning */
1455
+ connection?: NatsConnectionConfig;
1435
1456
  }
1436
1457
  /**
1437
1458
  * JetStream consumer configuration
@@ -1487,6 +1508,8 @@ interface JetStreamConsumerOptions extends Pick<CloudEventsOptions, 'quarantineT
1487
1508
  * @default 86400000 (24 hours)
1488
1509
  */
1489
1510
  idempotencyTtl?: number;
1511
+ /** NATS connection tuning */
1512
+ connection?: NatsConnectionConfig;
1490
1513
  }
1491
1514
  /**
1492
1515
  * Ensures a JetStream stream exists with the given configuration.
@@ -1570,6 +1593,8 @@ interface JetStreamStreamsConsumerOptions extends Pick<CloudEventsOptions, 'quar
1570
1593
  idempotencyStore?: IdempotencyStore | false;
1571
1594
  /** TTL for idempotency records in milliseconds @default 86400000 */
1572
1595
  idempotencyTtl?: number;
1596
+ /** NATS connection tuning */
1597
+ connection?: NatsConnectionConfig;
1573
1598
  }
1574
1599
  /**
1575
1600
  * Consume CloudEvents from multiple JetStream streams with a single connection.
@@ -1619,6 +1644,8 @@ interface NatsConsumerOptions extends Pick<CloudEventsOptions, 'quarantineTopic'
1619
1644
  user?: string;
1620
1645
  /** NATS password for authentication (defaults to NATS_PASSWORD env var) */
1621
1646
  pass?: string;
1647
+ /** NATS connection tuning */
1648
+ connection?: NatsConnectionConfig;
1622
1649
  }
1623
1650
  /**
1624
1651
  * Connects to NATS, discovers matching event handlers, and processes incoming CloudEvents.
@@ -1631,4 +1658,4 @@ interface NatsConsumerOptions extends Pick<CloudEventsOptions, 'quarantineTopic'
1631
1658
  */
1632
1659
  declare function consumeNatsEvents(options: NatsConsumerOptions): Promise<Subscription>;
1633
1660
 
1634
- export { type ChannelConfig, type ChannelMetadata, type CloudEventsPfPluginOptions, type ContractCreatedEffect, type ContractPaths, type CreateEventContext, type CreateEventOptions, type DomainEffect, type EnrichedEvent, type EventContext, type EventNames, type EventTypeValidation, type FileSystem, type HandleEventOptions, type HandlerCreatedEffect, type IdempotencyStore, type InferEventData, type JetStreamConsumerOptions, type JetStreamStreamOptions, type JetStreamStreamsConsumerOptions, type JetStreamStreamsOptions, type ListEventsContext, type NatsRequestResponse, type PublishEventContext, type PublishEventOptions, type PublishNatsEventOptions, type RequestNatsEventOptions, type RoutingConfig, type SchemaField, type StreamConfig, type StreamDefinition, type StreamWiredEffect, __resetNatsPublisher, checkAndMarkProcessed, clearHandlerCache, closeConnection, cloudEvents, connectNats, consumeJetStreamEvents, consumeJetStreamStreams, consumeJetStreams, consumeNatsEvents, contractCreated, createContract, createEvent, createEventFlowSteps, createInMemoryIdempotencyStore, createMemoryFileSystem, createPfPlugin, deriveEventNames, deriveStreamFromType, deriveSubjectFromType, discoverEventTypes, ensureJetStreamStream, ensureJetStreamStreams, ensureJetStreams, eventSchema, extractTypeFromSchema, generateContract, generateContractContent, generateEventHandler, generateEventHandlerContent, generateJsonMock, generateJsonMockFromContract, generateMock, generateMockContent, getContractFilePath, getContractPaths, getDefaultIdempotencyStore, getHandlerFilePath, getHandlerPath, getJsonMockPath, getMockFilePath, getStreamName, handleEvent, handlerCreated, initFaker, isNatsConnected, isValidEventType, jsonMockExists, listEvents, listEventsFlowSteps, loadJsonMock, normalizeSubject, parseDataInput, parseEventFromContext, parseEventTypeFromContract, parseEventTypeFromHandler, parseFieldsInput, pluralize, publish, publishEvent, publishEventFlowSteps, publishNatsEvent, publishNatsRawEvent, publishRawEvent, request, resetDefaultIdempotencyStore, singularize, streamWired, toKebabCase, toPascalCase, validateEventType };
1661
+ export { type ChannelConfig, type ChannelMetadata, type CloudEventsPfPluginOptions, type ContractCreatedEffect, type ContractPaths, type CreateEventContext, type CreateEventOptions, type DomainEffect, type EnrichedEvent, type EventContext, type EventNames, type EventTypeValidation, type FileSystem, type HandleEventOptions, type HandlerCreatedEffect, type IdempotencyStore, type InferEventData, type JetStreamConsumerOptions, type JetStreamStreamOptions, type JetStreamStreamsConsumerOptions, type JetStreamStreamsOptions, type ListEventsContext, type NatsConnectionConfig, type NatsRequestResponse, type PublishEventContext, type PublishEventOptions, type PublishNatsEventOptions, type RequestNatsEventOptions, type RoutingConfig, type SchemaField, type StreamConfig, type StreamDefinition, type StreamWiredEffect, __resetNatsPublisher, checkAndMarkProcessed, clearHandlerCache, closeConnection, cloudEvents, configureNatsPublisher, connectNats, consumeJetStreamEvents, consumeJetStreamStreams, consumeJetStreams, consumeNatsEvents, contractCreated, createContract, createEvent, createEventFlowSteps, createInMemoryIdempotencyStore, createMemoryFileSystem, createPfPlugin, deriveEventNames, deriveStreamFromType, deriveSubjectFromType, discoverEventTypes, ensureJetStreamStream, ensureJetStreamStreams, ensureJetStreams, eventSchema, extractTypeFromSchema, generateContract, generateContractContent, generateEventHandler, generateEventHandlerContent, generateJsonMock, generateJsonMockFromContract, generateMock, generateMockContent, getContractFilePath, getContractPaths, getDefaultIdempotencyStore, getHandlerFilePath, getHandlerPath, getJsonMockPath, getMockFilePath, getStreamName, handleEvent, handlerCreated, initFaker, isConsumerConnected, isNatsConnected, isValidEventType, jsonMockExists, listEvents, listEventsFlowSteps, loadJsonMock, normalizeSubject, parseDataInput, parseEventFromContext, parseEventTypeFromContract, parseEventTypeFromHandler, parseFieldsInput, pluralize, publish, publishEvent, publishEventFlowSteps, publishNatsEvent, publishNatsRawEvent, publishRawEvent, request, resetDefaultIdempotencyStore, singularize, streamWired, toKebabCase, toPascalCase, validateEventType };
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ import * as fs from 'fs';
4
4
  import { existsSync, readdirSync, statSync } from 'fs';
5
5
  import * as path from 'path';
6
6
  import { join, dirname } from 'path';
7
- import { createFlow, createGenerationResult, input, initGenerationContext, trackChange, printGenerationSummary, change, runFlow } from '@crossdelta/flowcore';
7
+ import { createFlow, createGenerationResult, input, initGenerationContext, trackChange, printGenerationSummary, runFlow, change } from '@crossdelta/flowcore';
8
8
  import { fileURLToPath } from 'url';
9
9
  import { glob } from 'glob';
10
10
  import { z } from 'zod';
@@ -1342,11 +1342,55 @@ var init_domain = __esm({
1342
1342
  }
1343
1343
  });
1344
1344
 
1345
+ // src/transports/nats/connection.ts
1346
+ var LONG_LIVED_DEFAULTS, SHORT_LIVED_DEFAULTS, buildConnectOptions, CONNECTION_REGISTRY_KEY, getConnectionRegistry, registerConnection, unregisterConnection, isConsumerConnected;
1347
+ var init_connection = __esm({
1348
+ "src/transports/nats/connection.ts"() {
1349
+ LONG_LIVED_DEFAULTS = {
1350
+ waitOnFirstConnect: true,
1351
+ maxReconnectAttempts: -1
1352
+ };
1353
+ SHORT_LIVED_DEFAULTS = {
1354
+ waitOnFirstConnect: true,
1355
+ maxReconnectAttempts: 10
1356
+ };
1357
+ buildConnectOptions = (config, mode) => {
1358
+ const defaults = mode === "long-lived" ? LONG_LIVED_DEFAULTS : SHORT_LIVED_DEFAULTS;
1359
+ return {
1360
+ waitOnFirstConnect: config?.waitOnFirstConnect ?? defaults.waitOnFirstConnect,
1361
+ maxReconnectAttempts: config?.maxReconnectAttempts ?? defaults.maxReconnectAttempts
1362
+ };
1363
+ };
1364
+ CONNECTION_REGISTRY_KEY = "__crossdelta_nats_connections__";
1365
+ getConnectionRegistry = () => {
1366
+ if (!globalThis[CONNECTION_REGISTRY_KEY]) {
1367
+ globalThis[CONNECTION_REGISTRY_KEY] = /* @__PURE__ */ new Map();
1368
+ }
1369
+ return globalThis[CONNECTION_REGISTRY_KEY];
1370
+ };
1371
+ registerConnection = (name, connection) => {
1372
+ getConnectionRegistry().set(name, connection);
1373
+ };
1374
+ unregisterConnection = (name) => {
1375
+ getConnectionRegistry().delete(name);
1376
+ };
1377
+ isConsumerConnected = () => {
1378
+ const registry = getConnectionRegistry();
1379
+ if (registry.size === 0) return false;
1380
+ for (const connection of registry.values()) {
1381
+ if (!connection.isClosed() && !connection.isDraining()) return true;
1382
+ }
1383
+ return false;
1384
+ };
1385
+ }
1386
+ });
1387
+
1345
1388
  // src/publishing/nats.publisher.ts
1346
1389
  var nats_publisher_exports = {};
1347
1390
  __export(nats_publisher_exports, {
1348
1391
  __resetNatsPublisher: () => __resetNatsPublisher,
1349
1392
  closeConnection: () => closeConnection,
1393
+ configureNatsPublisher: () => configureNatsPublisher,
1350
1394
  connectNats: () => connectNats,
1351
1395
  deriveStreamFromType: () => deriveStreamFromType,
1352
1396
  deriveSubjectFromType: () => deriveSubjectFromType,
@@ -1356,11 +1400,12 @@ __export(nats_publisher_exports, {
1356
1400
  publishNatsRawEvent: () => publishNatsRawEvent,
1357
1401
  request: () => request
1358
1402
  });
1359
- var sc, natsConnectionPromise, deriveSubjectFromEventType, getNatsConnection, closeConnection, connectNats, isNatsConnected, __resetNatsPublisher, deriveSubjectFromType, deriveStreamFromType, publishNatsRawEvent, publishNatsEvent, publish, DEFAULT_REQUEST_TIMEOUT, request;
1403
+ var sc, natsConnectionPromise, deriveSubjectFromEventType, connectionConfig, configureNatsPublisher, getNatsConnection, closeConnection, connectNats, isNatsConnected, __resetNatsPublisher, deriveSubjectFromType, deriveStreamFromType, publishNatsRawEvent, publishNatsEvent, publish, DEFAULT_REQUEST_TIMEOUT, request;
1360
1404
  var init_nats_publisher = __esm({
1361
1405
  "src/publishing/nats.publisher.ts"() {
1362
1406
  init_domain();
1363
1407
  init_infrastructure();
1408
+ init_connection();
1364
1409
  init_utils();
1365
1410
  sc = StringCodec();
1366
1411
  natsConnectionPromise = null;
@@ -1372,10 +1417,16 @@ var init_nats_publisher = __esm({
1372
1417
  const pluralDomain = pluralize(domain);
1373
1418
  return `${pluralDomain}.${action}`;
1374
1419
  };
1420
+ configureNatsPublisher = (config) => {
1421
+ connectionConfig = config;
1422
+ };
1375
1423
  getNatsConnection = async (servers) => {
1376
1424
  if (!natsConnectionPromise) {
1377
1425
  const url = servers ?? process.env.NATS_URL ?? "nats://localhost:4222";
1378
- natsConnectionPromise = connect({ servers: url }).then((connection) => {
1426
+ natsConnectionPromise = connect({
1427
+ servers: url,
1428
+ ...buildConnectOptions(connectionConfig, "long-lived")
1429
+ }).then((connection) => {
1379
1430
  logger.debug(`[NATS] connected to ${url}`);
1380
1431
  return connection;
1381
1432
  }).catch((error) => {
@@ -1414,6 +1465,7 @@ var init_nats_publisher = __esm({
1414
1465
  };
1415
1466
  __resetNatsPublisher = async () => {
1416
1467
  await closeConnection();
1468
+ connectionConfig = void 0;
1417
1469
  };
1418
1470
  deriveSubjectFromType = (eventType, config) => {
1419
1471
  if (!config?.typeToSubjectMap) {
@@ -2157,7 +2209,7 @@ function cloudEvents(options = {}) {
2157
2209
  // package.json
2158
2210
  var package_default = {
2159
2211
  name: "@crossdelta/cloudevents",
2160
- version: "0.7.10",
2212
+ version: "0.7.12",
2161
2213
  description: "CloudEvents toolkit for TypeScript - Zod validation, handler discovery, NATS JetStream & Core"};
2162
2214
 
2163
2215
  // src/plugin.ts
@@ -2390,9 +2442,13 @@ function createBaseMessageProcessor(deps) {
2390
2442
  };
2391
2443
  }
2392
2444
 
2445
+ // src/transports/nats/index.ts
2446
+ init_connection();
2447
+
2393
2448
  // src/transports/nats/jetstream-consumer.ts
2394
2449
  init_domain();
2395
2450
  init_logging();
2451
+ init_connection();
2396
2452
 
2397
2453
  // src/transports/nats/jetstream-message-processor.ts
2398
2454
  var createJetStreamMessageProcessor = (deps) => {
@@ -2448,7 +2504,8 @@ async function ensureJetStreamStream(options) {
2448
2504
  const pass = options.pass ?? process.env.NATS_PASSWORD;
2449
2505
  const nc = await connect({
2450
2506
  servers,
2451
- ...user && pass ? { user, pass } : {}
2507
+ ...user && pass ? { user, pass } : {},
2508
+ ...buildConnectOptions(options.connection, "short-lived")
2452
2509
  });
2453
2510
  try {
2454
2511
  const jsm = await nc.jetstreamManager();
@@ -2489,7 +2546,8 @@ async function ensureJetStreamStreams(options) {
2489
2546
  const pass = options.pass ?? process.env.NATS_PASSWORD;
2490
2547
  const nc = await connect({
2491
2548
  servers,
2492
- ...user && pass ? { user, pass } : {}
2549
+ ...user && pass ? { user, pass } : {},
2550
+ ...buildConnectOptions(options.connection, "short-lived")
2493
2551
  });
2494
2552
  try {
2495
2553
  const jsm = await nc.jetstreamManager();
@@ -2541,8 +2599,10 @@ async function consumeJetStreamEvents(options) {
2541
2599
  logger.info(`[${name}] discovered ${processedHandlers.length} handler(s): ${handlerNames}`);
2542
2600
  const nc = await connect({
2543
2601
  servers,
2544
- ...user && pass ? { user, pass } : {}
2602
+ ...user && pass ? { user, pass } : {},
2603
+ ...buildConnectOptions(options.connection, "long-lived")
2545
2604
  });
2605
+ registerConnection(name, nc);
2546
2606
  logger.info(`[${name}] connected to NATS: ${servers}${user ? " (authenticated)" : ""}`);
2547
2607
  const jsm = await nc.jetstreamManager();
2548
2608
  const js = nc.jetstream();
@@ -2609,8 +2669,10 @@ async function consumeJetStreamStreams(options) {
2609
2669
  logger.info(`[${name}] discovered ${processedHandlers.length} handler(s): ${handlerNames}`);
2610
2670
  const nc = await connect({
2611
2671
  servers,
2612
- ...user && pass ? { user, pass } : {}
2672
+ ...user && pass ? { user, pass } : {},
2673
+ ...buildConnectOptions(options.connection, "long-lived")
2613
2674
  });
2675
+ registerConnection(name, nc);
2614
2676
  logger.info(`[${name}] connected to NATS: ${servers}${user ? " (authenticated)" : ""}`);
2615
2677
  const jsm = await nc.jetstreamManager();
2616
2678
  const js = nc.jetstream();
@@ -2678,6 +2740,7 @@ var consumeJetStreams = consumeJetStreamStreams;
2678
2740
  // src/transports/nats/nats-consumer.ts
2679
2741
  init_domain();
2680
2742
  init_logging();
2743
+ init_connection();
2681
2744
  var sc3 = StringCodec();
2682
2745
  var isRequestMessage = (msg) => Boolean(msg.reply);
2683
2746
  var sendReply = (msg, payload) => {
@@ -2737,6 +2800,7 @@ async function cleanupConsumer(name) {
2737
2800
  consumer.subscription.unsubscribe();
2738
2801
  await consumer.connection.drain();
2739
2802
  registry.delete(name);
2803
+ unregisterConnection(name);
2740
2804
  }
2741
2805
  }
2742
2806
  async function consumeNatsEvents(options) {
@@ -2752,12 +2816,14 @@ async function consumeNatsEvents(options) {
2752
2816
  logger.info(`[${name}] discovered ${processedHandlers.length} handler(s): ${handlerNames}`);
2753
2817
  const nc = await connect({
2754
2818
  servers,
2755
- ...user && pass ? { user, pass } : {}
2819
+ ...user && pass ? { user, pass } : {},
2820
+ ...buildConnectOptions(options.connection, "long-lived")
2756
2821
  });
2757
2822
  logger.info(`[${name}] connected to NATS: ${servers}${user ? " (authenticated)" : ""}`);
2758
2823
  const sub = nc.subscribe(subject, { queue: name });
2759
2824
  logger.info(`[${name}] subscribed to subject: ${subject} (queue: ${name})`);
2760
2825
  getConsumerRegistry().set(name, { subscription: sub, connection: nc });
2826
+ registerConnection(name, nc);
2761
2827
  const dlqEnabled = Boolean(options.quarantineTopic || options.errorTopic);
2762
2828
  const { handleMessage, handleUnhandledProcessingError } = createNatsMessageProcessor({
2763
2829
  name,
@@ -2782,4 +2848,4 @@ async function consumeNatsEvents(options) {
2782
2848
  // src/index.ts
2783
2849
  init_utils();
2784
2850
 
2785
- export { __resetNatsPublisher, checkAndMarkProcessed, clearHandlerCache, closeConnection, cloudEvents, connectNats, consumeJetStreamEvents, consumeJetStreamStreams, consumeJetStreams, consumeNatsEvents, contractCreated, createContract, createEvent, createEventFlowSteps, createInMemoryIdempotencyStore, createMemoryFileSystem, createPfPlugin, deriveEventNames, deriveStreamFromType, deriveSubjectFromType, discoverEventTypes, ensureJetStreamStream, ensureJetStreamStreams, ensureJetStreams, eventSchema, extractTypeFromSchema, generateContract, generateContractContent, generateEventHandler, generateEventHandlerContent, generateJsonMock, generateJsonMockFromContract, generateMock, generateMockContent, getContractFilePath, getContractPaths, getDefaultIdempotencyStore, getHandlerFilePath, getHandlerPath, getJsonMockPath, getMockFilePath, getStreamName, handleEvent, handlerCreated, initFaker, isNatsConnected, isValidEventType, jsonMockExists, listEvents, listEventsFlowSteps, loadJsonMock, normalizeSubject, parseDataInput, parseEventFromContext, parseEventTypeFromContract, parseEventTypeFromHandler, parseFieldsInput, pluralize, publish, publishEvent, publishEventFlowSteps, publishNatsEvent, publishNatsRawEvent, publishRawEvent, request, resetDefaultIdempotencyStore, singularize, streamWired, toKebabCase, toPascalCase, validateEventType };
2851
+ export { __resetNatsPublisher, checkAndMarkProcessed, clearHandlerCache, closeConnection, cloudEvents, configureNatsPublisher, connectNats, consumeJetStreamEvents, consumeJetStreamStreams, consumeJetStreams, consumeNatsEvents, contractCreated, createContract, createEvent, createEventFlowSteps, createInMemoryIdempotencyStore, createMemoryFileSystem, createPfPlugin, deriveEventNames, deriveStreamFromType, deriveSubjectFromType, discoverEventTypes, ensureJetStreamStream, ensureJetStreamStreams, ensureJetStreams, eventSchema, extractTypeFromSchema, generateContract, generateContractContent, generateEventHandler, generateEventHandlerContent, generateJsonMock, generateJsonMockFromContract, generateMock, generateMockContent, getContractFilePath, getContractPaths, getDefaultIdempotencyStore, getHandlerFilePath, getHandlerPath, getJsonMockPath, getMockFilePath, getStreamName, handleEvent, handlerCreated, initFaker, isConsumerConnected, isNatsConnected, isValidEventType, jsonMockExists, listEvents, listEventsFlowSteps, loadJsonMock, normalizeSubject, parseDataInput, parseEventFromContext, parseEventTypeFromContract, parseEventTypeFromHandler, parseFieldsInput, pluralize, publish, publishEvent, publishEventFlowSteps, publishNatsEvent, publishNatsRawEvent, publishRawEvent, request, resetDefaultIdempotencyStore, singularize, streamWired, toKebabCase, toPascalCase, validateEventType };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crossdelta/cloudevents",
3
- "version": "0.7.10",
3
+ "version": "0.7.12",
4
4
  "description": "CloudEvents toolkit for TypeScript - Zod validation, handler discovery, NATS JetStream & Core",
5
5
  "author": "crossdelta",
6
6
  "license": "MIT",
@@ -47,7 +47,7 @@
47
47
  "prepublishOnly": "bun run build"
48
48
  },
49
49
  "dependencies": {
50
- "@crossdelta/flowcore": "workspace:*",
50
+ "@crossdelta/flowcore": "^0.1.2",
51
51
  "cloudevents": "^10.0.0",
52
52
  "glob": "^11.1.0",
53
53
  "nats": "^2.29.3",