@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 +3 -1
- package/bin/cli.js +34 -3
- package/dist/index.cjs +74 -8
- package/dist/index.d.cts +28 -1
- package/dist/index.d.ts +28 -1
- package/dist/index.js +76 -10
- package/package.json +2 -2
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,
|
|
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({
|
|
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({
|
|
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.
|
|
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,
|
|
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({
|
|
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.
|
|
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.
|
|
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": "
|
|
50
|
+
"@crossdelta/flowcore": "^0.1.2",
|
|
51
51
|
"cloudevents": "^10.0.0",
|
|
52
52
|
"glob": "^11.1.0",
|
|
53
53
|
"nats": "^2.29.3",
|