@horizon-republic/nestjs-jetstream 2.2.0 → 2.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +129 -80
- package/dist/index.cjs +2068 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +995 -0
- package/dist/index.d.ts +995 -13
- package/dist/index.js +2068 -39
- package/dist/index.js.map +1 -1
- package/package.json +29 -19
- package/dist/client/index.d.ts +0 -3
- package/dist/client/index.d.ts.map +0 -1
- package/dist/client/index.js +0 -9
- package/dist/client/index.js.map +0 -1
- package/dist/client/jetstream.client.d.ts +0 -76
- package/dist/client/jetstream.client.d.ts.map +0 -1
- package/dist/client/jetstream.client.js +0 -325
- package/dist/client/jetstream.client.js.map +0 -1
- package/dist/client/jetstream.record.d.ts +0 -55
- package/dist/client/jetstream.record.d.ts.map +0 -1
- package/dist/client/jetstream.record.js +0 -84
- package/dist/client/jetstream.record.js.map +0 -1
- package/dist/codec/index.d.ts +0 -2
- package/dist/codec/index.d.ts.map +0 -1
- package/dist/codec/index.js +0 -6
- package/dist/codec/index.js.map +0 -1
- package/dist/codec/json.codec.d.ts +0 -20
- package/dist/codec/json.codec.d.ts.map +0 -1
- package/dist/codec/json.codec.js +0 -30
- package/dist/codec/json.codec.js.map +0 -1
- package/dist/connection/connection.provider.d.ts +0 -50
- package/dist/connection/connection.provider.d.ts.map +0 -1
- package/dist/connection/connection.provider.js +0 -141
- package/dist/connection/connection.provider.js.map +0 -1
- package/dist/connection/index.d.ts +0 -2
- package/dist/connection/index.d.ts.map +0 -1
- package/dist/connection/index.js +0 -6
- package/dist/connection/index.js.map +0 -1
- package/dist/context/index.d.ts +0 -2
- package/dist/context/index.d.ts.map +0 -1
- package/dist/context/index.js +0 -6
- package/dist/context/index.js.map +0 -1
- package/dist/context/rpc.context.d.ts +0 -35
- package/dist/context/rpc.context.d.ts.map +0 -1
- package/dist/context/rpc.context.js +0 -44
- package/dist/context/rpc.context.js.map +0 -1
- package/dist/health/index.d.ts +0 -3
- package/dist/health/index.d.ts.map +0 -1
- package/dist/health/index.js +0 -6
- package/dist/health/index.js.map +0 -1
- package/dist/health/jetstream.health-indicator.d.ts +0 -47
- package/dist/health/jetstream.health-indicator.d.ts.map +0 -1
- package/dist/health/jetstream.health-indicator.js +0 -85
- package/dist/health/jetstream.health-indicator.js.map +0 -1
- package/dist/hooks/event-bus.d.ts +0 -31
- package/dist/hooks/event-bus.d.ts.map +0 -1
- package/dist/hooks/event-bus.js +0 -79
- package/dist/hooks/event-bus.js.map +0 -1
- package/dist/hooks/index.d.ts +0 -2
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/index.js +0 -6
- package/dist/hooks/index.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/interfaces/client.interface.d.ts +0 -14
- package/dist/interfaces/client.interface.d.ts.map +0 -1
- package/dist/interfaces/client.interface.js +0 -3
- package/dist/interfaces/client.interface.js.map +0 -1
- package/dist/interfaces/codec.interface.d.ts +0 -28
- package/dist/interfaces/codec.interface.d.ts.map +0 -1
- package/dist/interfaces/codec.interface.js +0 -3
- package/dist/interfaces/codec.interface.js.map +0 -1
- package/dist/interfaces/hooks.interface.d.ts +0 -71
- package/dist/interfaces/hooks.interface.d.ts.map +0 -1
- package/dist/interfaces/hooks.interface.js +0 -16
- package/dist/interfaces/hooks.interface.js.map +0 -1
- package/dist/interfaces/index.d.ts +0 -8
- package/dist/interfaces/index.d.ts.map +0 -1
- package/dist/interfaces/index.js +0 -6
- package/dist/interfaces/index.js.map +0 -1
- package/dist/interfaces/options.interface.d.ts +0 -142
- package/dist/interfaces/options.interface.d.ts.map +0 -1
- package/dist/interfaces/options.interface.js +0 -3
- package/dist/interfaces/options.interface.js.map +0 -1
- package/dist/interfaces/routing.interface.d.ts +0 -15
- package/dist/interfaces/routing.interface.d.ts.map +0 -1
- package/dist/interfaces/routing.interface.js +0 -3
- package/dist/interfaces/routing.interface.js.map +0 -1
- package/dist/interfaces/stream.interface.d.ts +0 -5
- package/dist/interfaces/stream.interface.d.ts.map +0 -1
- package/dist/interfaces/stream.interface.js +0 -3
- package/dist/interfaces/stream.interface.js.map +0 -1
- package/dist/jetstream.constants.d.ts +0 -58
- package/dist/jetstream.constants.d.ts.map +0 -1
- package/dist/jetstream.constants.js +0 -168
- package/dist/jetstream.constants.js.map +0 -1
- package/dist/jetstream.module.d.ts +0 -89
- package/dist/jetstream.module.d.ts.map +0 -1
- package/dist/jetstream.module.js +0 -410
- package/dist/jetstream.module.js.map +0 -1
- package/dist/server/core-rpc.server.d.ts +0 -31
- package/dist/server/core-rpc.server.d.ts.map +0 -1
- package/dist/server/core-rpc.server.js +0 -95
- package/dist/server/core-rpc.server.js.map +0 -1
- package/dist/server/index.d.ts +0 -5
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/index.js +0 -16
- package/dist/server/index.js.map +0 -1
- package/dist/server/infrastructure/consumer.provider.d.ts +0 -36
- package/dist/server/infrastructure/consumer.provider.d.ts.map +0 -1
- package/dist/server/infrastructure/consumer.provider.js +0 -123
- package/dist/server/infrastructure/consumer.provider.js.map +0 -1
- package/dist/server/infrastructure/index.d.ts +0 -4
- package/dist/server/infrastructure/index.d.ts.map +0 -1
- package/dist/server/infrastructure/index.js +0 -10
- package/dist/server/infrastructure/index.js.map +0 -1
- package/dist/server/infrastructure/message.provider.d.ts +0 -46
- package/dist/server/infrastructure/message.provider.d.ts.map +0 -1
- package/dist/server/infrastructure/message.provider.js +0 -100
- package/dist/server/infrastructure/message.provider.js.map +0 -1
- package/dist/server/infrastructure/stream.provider.d.ts +0 -38
- package/dist/server/infrastructure/stream.provider.d.ts.map +0 -1
- package/dist/server/infrastructure/stream.provider.js +0 -109
- package/dist/server/infrastructure/stream.provider.js.map +0 -1
- package/dist/server/routing/event.router.d.ts +0 -56
- package/dist/server/routing/event.router.d.ts.map +0 -1
- package/dist/server/routing/event.router.js +0 -132
- package/dist/server/routing/event.router.js.map +0 -1
- package/dist/server/routing/index.d.ts +0 -5
- package/dist/server/routing/index.d.ts.map +0 -1
- package/dist/server/routing/index.js +0 -10
- package/dist/server/routing/index.js.map +0 -1
- package/dist/server/routing/pattern-registry.d.ts +0 -39
- package/dist/server/routing/pattern-registry.d.ts.map +0 -1
- package/dist/server/routing/pattern-registry.js +0 -116
- package/dist/server/routing/pattern-registry.js.map +0 -1
- package/dist/server/routing/rpc.router.d.ts +0 -37
- package/dist/server/routing/rpc.router.d.ts.map +0 -1
- package/dist/server/routing/rpc.router.js +0 -121
- package/dist/server/routing/rpc.router.js.map +0 -1
- package/dist/server/strategy.d.ts +0 -55
- package/dist/server/strategy.d.ts.map +0 -1
- package/dist/server/strategy.js +0 -113
- package/dist/server/strategy.js.map +0 -1
- package/dist/shutdown/index.d.ts +0 -2
- package/dist/shutdown/index.d.ts.map +0 -1
- package/dist/shutdown/index.js +0 -6
- package/dist/shutdown/index.js.map +0 -1
- package/dist/shutdown/shutdown.manager.d.ts +0 -27
- package/dist/shutdown/shutdown.manager.d.ts.map +0 -1
- package/dist/shutdown/shutdown.manager.js +0 -45
- package/dist/shutdown/shutdown.manager.js.map +0 -1
- package/dist/utils/index.d.ts +0 -3
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -8
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/serialize-error.d.ts +0 -10
- package/dist/utils/serialize-error.d.ts.map +0 -1
- package/dist/utils/serialize-error.js +0 -21
- package/dist/utils/serialize-error.js.map +0 -1
- package/dist/utils/unwrap-result.d.ts +0 -15
- package/dist/utils/unwrap-result.d.ts.map +0 -1
- package/dist/utils/unwrap-result.js +0 -49
- package/dist/utils/unwrap-result.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAErF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/server/index.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RpcRouter = exports.PatternRegistry = exports.EventRouter = exports.StreamProvider = exports.MessageProvider = exports.ConsumerProvider = exports.CoreRpcServer = exports.JetstreamStrategy = void 0;
|
|
4
|
-
var strategy_1 = require("./strategy");
|
|
5
|
-
Object.defineProperty(exports, "JetstreamStrategy", { enumerable: true, get: function () { return strategy_1.JetstreamStrategy; } });
|
|
6
|
-
var core_rpc_server_1 = require("./core-rpc.server");
|
|
7
|
-
Object.defineProperty(exports, "CoreRpcServer", { enumerable: true, get: function () { return core_rpc_server_1.CoreRpcServer; } });
|
|
8
|
-
var infrastructure_1 = require("./infrastructure");
|
|
9
|
-
Object.defineProperty(exports, "ConsumerProvider", { enumerable: true, get: function () { return infrastructure_1.ConsumerProvider; } });
|
|
10
|
-
Object.defineProperty(exports, "MessageProvider", { enumerable: true, get: function () { return infrastructure_1.MessageProvider; } });
|
|
11
|
-
Object.defineProperty(exports, "StreamProvider", { enumerable: true, get: function () { return infrastructure_1.StreamProvider; } });
|
|
12
|
-
var routing_1 = require("./routing");
|
|
13
|
-
Object.defineProperty(exports, "EventRouter", { enumerable: true, get: function () { return routing_1.EventRouter; } });
|
|
14
|
-
Object.defineProperty(exports, "PatternRegistry", { enumerable: true, get: function () { return routing_1.PatternRegistry; } });
|
|
15
|
-
Object.defineProperty(exports, "RpcRouter", { enumerable: true, get: function () { return routing_1.RpcRouter; } });
|
|
16
|
-
//# sourceMappingURL=index.js.map
|
package/dist/server/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";;;AAAA,uCAA+C;AAAtC,6GAAA,iBAAiB,OAAA;AAE1B,qDAAkD;AAAzC,gHAAA,aAAa,OAAA;AAEtB,mDAAqF;AAA5E,kHAAA,gBAAgB,OAAA;AAAE,iHAAA,eAAe,OAAA;AAAE,gHAAA,cAAc,OAAA;AAE1D,qCAAoE;AAA3D,sGAAA,WAAW,OAAA;AAAE,0GAAA,eAAe,OAAA;AAAE,oGAAA,SAAS,OAAA"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { ConsumerInfo } from 'nats';
|
|
2
|
-
import { ConnectionProvider } from '../../connection';
|
|
3
|
-
import type { JetstreamModuleOptions, StreamKind } from '../../interfaces';
|
|
4
|
-
import { PatternRegistry } from '../routing/pattern-registry';
|
|
5
|
-
import { StreamProvider } from './stream.provider';
|
|
6
|
-
/**
|
|
7
|
-
* Manages JetStream consumer lifecycle: creation and idempotent ensures.
|
|
8
|
-
*
|
|
9
|
-
* Creates durable pull-based consumers that survive restarts.
|
|
10
|
-
* Consumer configuration is merged from defaults and user overrides.
|
|
11
|
-
*/
|
|
12
|
-
export declare class ConsumerProvider {
|
|
13
|
-
private readonly options;
|
|
14
|
-
private readonly connection;
|
|
15
|
-
private readonly streamProvider;
|
|
16
|
-
private readonly patternRegistry;
|
|
17
|
-
private readonly logger;
|
|
18
|
-
constructor(options: JetstreamModuleOptions, connection: ConnectionProvider, streamProvider: StreamProvider, patternRegistry: PatternRegistry);
|
|
19
|
-
/**
|
|
20
|
-
* Ensure consumers exist for the specified kinds.
|
|
21
|
-
*
|
|
22
|
-
* @returns Map of kind -> ConsumerInfo for downstream use.
|
|
23
|
-
*/
|
|
24
|
-
ensureConsumers(kinds: StreamKind[]): Promise<Map<StreamKind, ConsumerInfo>>;
|
|
25
|
-
/** Get the consumer name for a given kind. */
|
|
26
|
-
getConsumerName(kind: StreamKind): string;
|
|
27
|
-
/** Ensure a single consumer exists, creating if needed. */
|
|
28
|
-
private ensureConsumer;
|
|
29
|
-
/** Build consumer config by merging defaults with user overrides. */
|
|
30
|
-
private buildConfig;
|
|
31
|
-
/** Get default config for a consumer kind. */
|
|
32
|
-
private getDefaults;
|
|
33
|
-
/** Get user-provided overrides for a consumer kind. */
|
|
34
|
-
private getOverrides;
|
|
35
|
-
}
|
|
36
|
-
//# sourceMappingURL=consumer.provider.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"consumer.provider.d.ts","sourceRoot":"","sources":["../../../src/server/infrastructure/consumer.provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,YAAY,EAAa,MAAM,MAAM,CAAC;AAE/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAQ3E,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAKnD;;;;;GAKG;AACH,qBAAa,gBAAgB;IAIzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,eAAe;IANlC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;gBAGxC,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,kBAAkB,EAC9B,cAAc,EAAE,cAAc,EAC9B,eAAe,EAAE,eAAe;IAGnD;;;;OAIG;IACU,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAezF,8CAA8C;IACvC,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;IAIhD,2DAA2D;YAC7C,cAAc;IA2B5B,qEAAqE;IAErE,OAAO,CAAC,WAAW;IA4CnB,8CAA8C;IAC9C,OAAO,CAAC,WAAW;IAWnB,uDAAuD;IACvD,OAAO,CAAC,YAAY;CAUrB"}
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ConsumerProvider = void 0;
|
|
4
|
-
const common_1 = require("@nestjs/common");
|
|
5
|
-
const jetstream_constants_1 = require("../../jetstream.constants");
|
|
6
|
-
/** JetStream API error code for missing consumers. */
|
|
7
|
-
const CONSUMER_NOT_FOUND = 10014;
|
|
8
|
-
/**
|
|
9
|
-
* Manages JetStream consumer lifecycle: creation and idempotent ensures.
|
|
10
|
-
*
|
|
11
|
-
* Creates durable pull-based consumers that survive restarts.
|
|
12
|
-
* Consumer configuration is merged from defaults and user overrides.
|
|
13
|
-
*/
|
|
14
|
-
class ConsumerProvider {
|
|
15
|
-
constructor(options, connection, streamProvider, patternRegistry) {
|
|
16
|
-
this.options = options;
|
|
17
|
-
this.connection = connection;
|
|
18
|
-
this.streamProvider = streamProvider;
|
|
19
|
-
this.patternRegistry = patternRegistry;
|
|
20
|
-
this.logger = new common_1.Logger('Jetstream:Consumer');
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Ensure consumers exist for the specified kinds.
|
|
24
|
-
*
|
|
25
|
-
* @returns Map of kind -> ConsumerInfo for downstream use.
|
|
26
|
-
*/
|
|
27
|
-
async ensureConsumers(kinds) {
|
|
28
|
-
const jsm = await this.connection.getJetStreamManager();
|
|
29
|
-
const results = new Map();
|
|
30
|
-
await Promise.all(kinds.map(async (kind) => {
|
|
31
|
-
const info = await this.ensureConsumer(jsm, kind);
|
|
32
|
-
results.set(kind, info);
|
|
33
|
-
}));
|
|
34
|
-
return results;
|
|
35
|
-
}
|
|
36
|
-
/** Get the consumer name for a given kind. */
|
|
37
|
-
getConsumerName(kind) {
|
|
38
|
-
return (0, jetstream_constants_1.consumerName)(this.options.name, kind);
|
|
39
|
-
}
|
|
40
|
-
/** Ensure a single consumer exists, creating if needed. */
|
|
41
|
-
async ensureConsumer(jsm, kind) {
|
|
42
|
-
const stream = this.streamProvider.getStreamName(kind);
|
|
43
|
-
const config = this.buildConfig(kind);
|
|
44
|
-
const name = config.durable_name;
|
|
45
|
-
this.logger.log(`Ensuring consumer: ${name} on stream: ${stream}`);
|
|
46
|
-
try {
|
|
47
|
-
const info = await jsm.consumers.info(stream, name);
|
|
48
|
-
this.logger.debug(`Consumer exists: ${name}`);
|
|
49
|
-
return info;
|
|
50
|
-
}
|
|
51
|
-
catch (err) {
|
|
52
|
-
const natsErr = err;
|
|
53
|
-
if (natsErr.api_error?.err_code === CONSUMER_NOT_FOUND) {
|
|
54
|
-
this.logger.log(`Creating consumer: ${name}`);
|
|
55
|
-
return await jsm.consumers.add(stream, config);
|
|
56
|
-
}
|
|
57
|
-
throw err;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
/** Build consumer config by merging defaults with user overrides. */
|
|
61
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention -- NATS API uses snake_case
|
|
62
|
-
buildConfig(kind) {
|
|
63
|
-
const name = this.getConsumerName(kind);
|
|
64
|
-
const serviceName = (0, jetstream_constants_1.internalName)(this.options.name);
|
|
65
|
-
const defaults = this.getDefaults(kind);
|
|
66
|
-
const overrides = this.getOverrides(kind);
|
|
67
|
-
/* eslint-disable @typescript-eslint/naming-convention -- NATS API uses snake_case */
|
|
68
|
-
if (kind === 'broadcast') {
|
|
69
|
-
// Use specific broadcast patterns from the registry instead of a wildcard
|
|
70
|
-
const broadcastPatterns = this.patternRegistry.getBroadcastPatterns();
|
|
71
|
-
if (broadcastPatterns.length === 1) {
|
|
72
|
-
return {
|
|
73
|
-
...defaults,
|
|
74
|
-
...overrides,
|
|
75
|
-
name,
|
|
76
|
-
durable_name: name,
|
|
77
|
-
filter_subject: broadcastPatterns[0],
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
return {
|
|
81
|
-
...defaults,
|
|
82
|
-
...overrides,
|
|
83
|
-
name,
|
|
84
|
-
durable_name: name,
|
|
85
|
-
filter_subjects: broadcastPatterns,
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
// Build filter_subject based on kind
|
|
89
|
-
const filter_subject = kind === 'ev' ? `${serviceName}.ev.>` : `${serviceName}.cmd.>`;
|
|
90
|
-
return {
|
|
91
|
-
...defaults,
|
|
92
|
-
...overrides,
|
|
93
|
-
name,
|
|
94
|
-
durable_name: name,
|
|
95
|
-
filter_subject,
|
|
96
|
-
};
|
|
97
|
-
/* eslint-enable @typescript-eslint/naming-convention */
|
|
98
|
-
}
|
|
99
|
-
/** Get default config for a consumer kind. */
|
|
100
|
-
getDefaults(kind) {
|
|
101
|
-
switch (kind) {
|
|
102
|
-
case 'ev':
|
|
103
|
-
return jetstream_constants_1.DEFAULT_EVENT_CONSUMER_CONFIG;
|
|
104
|
-
case 'cmd':
|
|
105
|
-
return jetstream_constants_1.DEFAULT_COMMAND_CONSUMER_CONFIG;
|
|
106
|
-
case 'broadcast':
|
|
107
|
-
return jetstream_constants_1.DEFAULT_BROADCAST_CONSUMER_CONFIG;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
/** Get user-provided overrides for a consumer kind. */
|
|
111
|
-
getOverrides(kind) {
|
|
112
|
-
switch (kind) {
|
|
113
|
-
case 'ev':
|
|
114
|
-
return this.options.events?.consumer ?? {};
|
|
115
|
-
case 'cmd':
|
|
116
|
-
return this.options.rpc?.mode === 'jetstream' ? (this.options.rpc.consumer ?? {}) : {};
|
|
117
|
-
case 'broadcast':
|
|
118
|
-
return this.options.broadcast?.consumer ?? {};
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
exports.ConsumerProvider = ConsumerProvider;
|
|
123
|
-
//# sourceMappingURL=consumer.provider.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"consumer.provider.js","sourceRoot":"","sources":["../../../src/server/infrastructure/consumer.provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/infrastructure/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MessageProvider = exports.ConsumerProvider = exports.StreamProvider = void 0;
|
|
4
|
-
var stream_provider_1 = require("./stream.provider");
|
|
5
|
-
Object.defineProperty(exports, "StreamProvider", { enumerable: true, get: function () { return stream_provider_1.StreamProvider; } });
|
|
6
|
-
var consumer_provider_1 = require("./consumer.provider");
|
|
7
|
-
Object.defineProperty(exports, "ConsumerProvider", { enumerable: true, get: function () { return consumer_provider_1.ConsumerProvider; } });
|
|
8
|
-
var message_provider_1 = require("./message.provider");
|
|
9
|
-
Object.defineProperty(exports, "MessageProvider", { enumerable: true, get: function () { return message_provider_1.MessageProvider; } });
|
|
10
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/infrastructure/index.ts"],"names":[],"mappings":";;;AAAA,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AAEvB,yDAAuD;AAA9C,qHAAA,gBAAgB,OAAA;AAEzB,uDAAqD;AAA5C,mHAAA,eAAe,OAAA"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { ConsumerInfo, JsMsg } from 'nats';
|
|
2
|
-
import { Observable } from 'rxjs';
|
|
3
|
-
import { ConnectionProvider } from '../../connection';
|
|
4
|
-
import { EventBus } from '../../hooks';
|
|
5
|
-
import type { StreamKind } from '../../interfaces';
|
|
6
|
-
/**
|
|
7
|
-
* Manages pull-based message consumption from JetStream consumers.
|
|
8
|
-
*
|
|
9
|
-
* Uses `defer()` + `repeat()` pattern for self-healing: when the async
|
|
10
|
-
* iterator completes (e.g., NATS restart), the consumer automatically
|
|
11
|
-
* re-establishes after a short delay.
|
|
12
|
-
*
|
|
13
|
-
* Emits messages to kind-specific RxJS subjects for downstream routing.
|
|
14
|
-
*/
|
|
15
|
-
export declare class MessageProvider {
|
|
16
|
-
private readonly connection;
|
|
17
|
-
private readonly eventBus;
|
|
18
|
-
private readonly logger;
|
|
19
|
-
private readonly destroy$;
|
|
20
|
-
private readonly eventMessages$;
|
|
21
|
-
private readonly commandMessages$;
|
|
22
|
-
private readonly broadcastMessages$;
|
|
23
|
-
constructor(connection: ConnectionProvider, eventBus: EventBus);
|
|
24
|
-
/** Observable stream of workqueue event messages. */
|
|
25
|
-
get events$(): Observable<JsMsg>;
|
|
26
|
-
/** Observable stream of RPC command messages (jetstream mode). */
|
|
27
|
-
get commands$(): Observable<JsMsg>;
|
|
28
|
-
/** Observable stream of broadcast event messages. */
|
|
29
|
-
get broadcasts$(): Observable<JsMsg>;
|
|
30
|
-
/**
|
|
31
|
-
* Start consuming messages from the given consumer infos.
|
|
32
|
-
*
|
|
33
|
-
* Each consumer gets an independent self-healing flow.
|
|
34
|
-
* Call `destroy()` to stop all consumers.
|
|
35
|
-
*/
|
|
36
|
-
start(consumers: Map<StreamKind, ConsumerInfo>): void;
|
|
37
|
-
/** Stop all consumer flows and complete all subjects. */
|
|
38
|
-
destroy(): void;
|
|
39
|
-
/** Create a self-healing consumer flow for a specific kind. */
|
|
40
|
-
private createFlow;
|
|
41
|
-
/** Single iteration: get consumer -> pull messages -> emit to subject. */
|
|
42
|
-
private consumeOnce;
|
|
43
|
-
/** Get the target subject for a consumer kind. */
|
|
44
|
-
private getTargetSubject;
|
|
45
|
-
}
|
|
46
|
-
//# sourceMappingURL=message.provider.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"message.provider.d.ts","sourceRoot":"","sources":["../../../src/server/infrastructure/message.provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,YAAY,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AACrD,OAAO,EAKL,UAAU,EAKX,MAAM,MAAM,CAAC;AAEd,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD;;;;;;;;GAQG;AACH,qBAAa,eAAe;IASxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAT3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAC1D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAEhD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwB;IACvD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAwB;IACzD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAwB;gBAGxC,UAAU,EAAE,kBAAkB,EAC9B,QAAQ,EAAE,QAAQ;IAGrC,qDAAqD;IACrD,IAAW,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,CAEtC;IAED,kEAAkE;IAClE,IAAW,SAAS,IAAI,UAAU,CAAC,KAAK,CAAC,CAExC;IAED,qDAAqD;IACrD,IAAW,WAAW,IAAI,UAAU,CAAC,KAAK,CAAC,CAE1C;IAED;;;;;OAKG;IACI,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,GAAG,IAAI;IAc5D,yDAAyD;IAClD,OAAO,IAAI,IAAI;IAQtB,+DAA+D;IAC/D,OAAO,CAAC,UAAU;IA4BlB,0EAA0E;YAC5D,WAAW;IAUzB,kDAAkD;IAClD,OAAO,CAAC,gBAAgB;CAUzB"}
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MessageProvider = void 0;
|
|
4
|
-
const common_1 = require("@nestjs/common");
|
|
5
|
-
const rxjs_1 = require("rxjs");
|
|
6
|
-
const interfaces_1 = require("../../interfaces");
|
|
7
|
-
/**
|
|
8
|
-
* Manages pull-based message consumption from JetStream consumers.
|
|
9
|
-
*
|
|
10
|
-
* Uses `defer()` + `repeat()` pattern for self-healing: when the async
|
|
11
|
-
* iterator completes (e.g., NATS restart), the consumer automatically
|
|
12
|
-
* re-establishes after a short delay.
|
|
13
|
-
*
|
|
14
|
-
* Emits messages to kind-specific RxJS subjects for downstream routing.
|
|
15
|
-
*/
|
|
16
|
-
class MessageProvider {
|
|
17
|
-
constructor(connection, eventBus) {
|
|
18
|
-
this.connection = connection;
|
|
19
|
-
this.eventBus = eventBus;
|
|
20
|
-
this.logger = new common_1.Logger('Jetstream:Message');
|
|
21
|
-
this.destroy$ = new rxjs_1.Subject();
|
|
22
|
-
this.eventMessages$ = new rxjs_1.Subject();
|
|
23
|
-
this.commandMessages$ = new rxjs_1.Subject();
|
|
24
|
-
this.broadcastMessages$ = new rxjs_1.Subject();
|
|
25
|
-
}
|
|
26
|
-
/** Observable stream of workqueue event messages. */
|
|
27
|
-
get events$() {
|
|
28
|
-
return this.eventMessages$.asObservable();
|
|
29
|
-
}
|
|
30
|
-
/** Observable stream of RPC command messages (jetstream mode). */
|
|
31
|
-
get commands$() {
|
|
32
|
-
return this.commandMessages$.asObservable();
|
|
33
|
-
}
|
|
34
|
-
/** Observable stream of broadcast event messages. */
|
|
35
|
-
get broadcasts$() {
|
|
36
|
-
return this.broadcastMessages$.asObservable();
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Start consuming messages from the given consumer infos.
|
|
40
|
-
*
|
|
41
|
-
* Each consumer gets an independent self-healing flow.
|
|
42
|
-
* Call `destroy()` to stop all consumers.
|
|
43
|
-
*/
|
|
44
|
-
start(consumers) {
|
|
45
|
-
const flows = [];
|
|
46
|
-
for (const [kind, info] of consumers) {
|
|
47
|
-
flows.push(this.createFlow(kind, info));
|
|
48
|
-
}
|
|
49
|
-
if (flows.length > 0) {
|
|
50
|
-
(0, rxjs_1.merge)(...flows)
|
|
51
|
-
.pipe((0, rxjs_1.takeUntil)(this.destroy$))
|
|
52
|
-
.subscribe();
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
/** Stop all consumer flows and complete all subjects. */
|
|
56
|
-
destroy() {
|
|
57
|
-
this.destroy$.next();
|
|
58
|
-
this.destroy$.complete();
|
|
59
|
-
this.eventMessages$.complete();
|
|
60
|
-
this.commandMessages$.complete();
|
|
61
|
-
this.broadcastMessages$.complete();
|
|
62
|
-
}
|
|
63
|
-
/** Create a self-healing consumer flow for a specific kind. */
|
|
64
|
-
createFlow(kind, info) {
|
|
65
|
-
const target$ = this.getTargetSubject(kind);
|
|
66
|
-
return (0, rxjs_1.defer)(() => this.consumeOnce(info, target$)).pipe((0, rxjs_1.catchError)((err) => {
|
|
67
|
-
this.logger.error(`Consumer ${info.name} error, will restart:`, err);
|
|
68
|
-
this.eventBus.emit(interfaces_1.TransportEvent.Error, err instanceof Error ? err : new Error(String(err)), 'message-provider');
|
|
69
|
-
return rxjs_1.EMPTY;
|
|
70
|
-
}), (0, rxjs_1.repeat)({
|
|
71
|
-
delay: () => {
|
|
72
|
-
this.logger.warn(`Consumer ${info.name} stream ended, restarting...`);
|
|
73
|
-
this.eventBus.emit(interfaces_1.TransportEvent.Error, new Error(`Consumer ${info.name} stream ended`), 'message-provider');
|
|
74
|
-
return (0, rxjs_1.timer)(100);
|
|
75
|
-
},
|
|
76
|
-
}), (0, rxjs_1.takeUntil)(this.destroy$));
|
|
77
|
-
}
|
|
78
|
-
/** Single iteration: get consumer -> pull messages -> emit to subject. */
|
|
79
|
-
async consumeOnce(info, target$) {
|
|
80
|
-
const js = (await this.connection.getConnection()).jetstream();
|
|
81
|
-
const consumer = await js.consumers.get(info.stream_name, info.name);
|
|
82
|
-
const messages = await consumer.consume();
|
|
83
|
-
for await (const msg of messages) {
|
|
84
|
-
target$.next(msg);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
/** Get the target subject for a consumer kind. */
|
|
88
|
-
getTargetSubject(kind) {
|
|
89
|
-
switch (kind) {
|
|
90
|
-
case 'ev':
|
|
91
|
-
return this.eventMessages$;
|
|
92
|
-
case 'cmd':
|
|
93
|
-
return this.commandMessages$;
|
|
94
|
-
case 'broadcast':
|
|
95
|
-
return this.broadcastMessages$;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
exports.MessageProvider = MessageProvider;
|
|
100
|
-
//# sourceMappingURL=message.provider.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"message.provider.js","sourceRoot":"","sources":["../../../src/server/infrastructure/message.provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { ConnectionProvider } from '../../connection';
|
|
2
|
-
import type { JetstreamModuleOptions, StreamKind } from '../../interfaces';
|
|
3
|
-
/**
|
|
4
|
-
* Manages JetStream stream lifecycle: creation, updates, and idempotent ensures.
|
|
5
|
-
*
|
|
6
|
-
* Creates up to three stream types depending on configuration:
|
|
7
|
-
* - **Event stream** — workqueue events (always, when consumer enabled)
|
|
8
|
-
* - **Command stream** — RPC commands (only in jetstream RPC mode)
|
|
9
|
-
* - **Broadcast stream** — fan-out events (only if broadcast handlers exist)
|
|
10
|
-
*
|
|
11
|
-
* All operations are idempotent: safe to call on every startup and reconnection.
|
|
12
|
-
*/
|
|
13
|
-
export declare class StreamProvider {
|
|
14
|
-
private readonly options;
|
|
15
|
-
private readonly connection;
|
|
16
|
-
private readonly logger;
|
|
17
|
-
constructor(options: JetstreamModuleOptions, connection: ConnectionProvider);
|
|
18
|
-
/**
|
|
19
|
-
* Ensure all required streams exist with correct configuration.
|
|
20
|
-
*
|
|
21
|
-
* @param kinds Which stream kinds to create. Determined by the module based
|
|
22
|
-
* on RPC mode and registered handler patterns.
|
|
23
|
-
*/
|
|
24
|
-
ensureStreams(kinds: StreamKind[]): Promise<void>;
|
|
25
|
-
/** Get the stream name for a given kind. */
|
|
26
|
-
getStreamName(kind: StreamKind): string;
|
|
27
|
-
/** Get the subjects pattern for a given kind. */
|
|
28
|
-
getSubjects(kind: StreamKind): string[];
|
|
29
|
-
/** Ensure a single stream exists, creating or updating as needed. */
|
|
30
|
-
private ensureStream;
|
|
31
|
-
/** Build the full stream config by merging defaults with user overrides. */
|
|
32
|
-
private buildConfig;
|
|
33
|
-
/** Get default config for a stream kind. */
|
|
34
|
-
private getDefaults;
|
|
35
|
-
/** Get user-provided overrides for a stream kind. */
|
|
36
|
-
private getOverrides;
|
|
37
|
-
}
|
|
38
|
-
//# sourceMappingURL=stream.provider.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stream.provider.d.ts","sourceRoot":"","sources":["../../../src/server/infrastructure/stream.provider.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAY3E;;;;;;;;;GASG;AACH,qBAAa,cAAc;IAIvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAJ7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;gBAGtC,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,kBAAkB;IAGjD;;;;;OAKG;IACU,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9D,4CAA4C;IACrC,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;IAI9C,iDAAiD;IAC1C,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,EAAE;IAa9C,qEAAqE;YACvD,YAAY;IA0B1B,4EAA4E;IAC5E,OAAO,CAAC,WAAW;IAmBnB,4CAA4C;IAC5C,OAAO,CAAC,WAAW;IAWnB,qDAAqD;IACrD,OAAO,CAAC,YAAY;CAUrB"}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.StreamProvider = void 0;
|
|
4
|
-
const common_1 = require("@nestjs/common");
|
|
5
|
-
const jetstream_constants_1 = require("../../jetstream.constants");
|
|
6
|
-
/** JetStream API error code for missing streams. */
|
|
7
|
-
const STREAM_NOT_FOUND = 10059;
|
|
8
|
-
/**
|
|
9
|
-
* Manages JetStream stream lifecycle: creation, updates, and idempotent ensures.
|
|
10
|
-
*
|
|
11
|
-
* Creates up to three stream types depending on configuration:
|
|
12
|
-
* - **Event stream** — workqueue events (always, when consumer enabled)
|
|
13
|
-
* - **Command stream** — RPC commands (only in jetstream RPC mode)
|
|
14
|
-
* - **Broadcast stream** — fan-out events (only if broadcast handlers exist)
|
|
15
|
-
*
|
|
16
|
-
* All operations are idempotent: safe to call on every startup and reconnection.
|
|
17
|
-
*/
|
|
18
|
-
class StreamProvider {
|
|
19
|
-
constructor(options, connection) {
|
|
20
|
-
this.options = options;
|
|
21
|
-
this.connection = connection;
|
|
22
|
-
this.logger = new common_1.Logger('Jetstream:Stream');
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Ensure all required streams exist with correct configuration.
|
|
26
|
-
*
|
|
27
|
-
* @param kinds Which stream kinds to create. Determined by the module based
|
|
28
|
-
* on RPC mode and registered handler patterns.
|
|
29
|
-
*/
|
|
30
|
-
async ensureStreams(kinds) {
|
|
31
|
-
const jsm = await this.connection.getJetStreamManager();
|
|
32
|
-
await Promise.all(kinds.map((kind) => this.ensureStream(jsm, kind)));
|
|
33
|
-
}
|
|
34
|
-
/** Get the stream name for a given kind. */
|
|
35
|
-
getStreamName(kind) {
|
|
36
|
-
return (0, jetstream_constants_1.streamName)(this.options.name, kind);
|
|
37
|
-
}
|
|
38
|
-
/** Get the subjects pattern for a given kind. */
|
|
39
|
-
getSubjects(kind) {
|
|
40
|
-
const name = (0, jetstream_constants_1.internalName)(this.options.name);
|
|
41
|
-
switch (kind) {
|
|
42
|
-
case 'ev':
|
|
43
|
-
return [`${name}.ev.>`];
|
|
44
|
-
case 'cmd':
|
|
45
|
-
return [`${name}.cmd.>`];
|
|
46
|
-
case 'broadcast':
|
|
47
|
-
return ['broadcast.>'];
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
/** Ensure a single stream exists, creating or updating as needed. */
|
|
51
|
-
async ensureStream(jsm, kind) {
|
|
52
|
-
const config = this.buildConfig(kind);
|
|
53
|
-
this.logger.log(`Ensuring stream: ${config.name}`);
|
|
54
|
-
try {
|
|
55
|
-
// Try to get existing stream info
|
|
56
|
-
await jsm.streams.info(config.name);
|
|
57
|
-
// Stream exists — update config
|
|
58
|
-
this.logger.debug(`Stream exists, updating: ${config.name}`);
|
|
59
|
-
return await jsm.streams.update(config.name, config);
|
|
60
|
-
}
|
|
61
|
-
catch (err) {
|
|
62
|
-
const natsErr = err;
|
|
63
|
-
if (natsErr.api_error?.err_code === STREAM_NOT_FOUND) {
|
|
64
|
-
this.logger.log(`Creating stream: ${config.name}`);
|
|
65
|
-
return await jsm.streams.add(config);
|
|
66
|
-
}
|
|
67
|
-
throw err;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
/** Build the full stream config by merging defaults with user overrides. */
|
|
71
|
-
buildConfig(kind) {
|
|
72
|
-
const name = this.getStreamName(kind);
|
|
73
|
-
const subjects = this.getSubjects(kind);
|
|
74
|
-
const description = `JetStream ${kind} stream for ${this.options.name}`;
|
|
75
|
-
const defaults = this.getDefaults(kind);
|
|
76
|
-
const overrides = this.getOverrides(kind);
|
|
77
|
-
return {
|
|
78
|
-
...defaults,
|
|
79
|
-
...overrides,
|
|
80
|
-
name,
|
|
81
|
-
subjects,
|
|
82
|
-
description,
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
/** Get default config for a stream kind. */
|
|
86
|
-
getDefaults(kind) {
|
|
87
|
-
switch (kind) {
|
|
88
|
-
case 'ev':
|
|
89
|
-
return jetstream_constants_1.DEFAULT_EVENT_STREAM_CONFIG;
|
|
90
|
-
case 'cmd':
|
|
91
|
-
return jetstream_constants_1.DEFAULT_COMMAND_STREAM_CONFIG;
|
|
92
|
-
case 'broadcast':
|
|
93
|
-
return jetstream_constants_1.DEFAULT_BROADCAST_STREAM_CONFIG;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
/** Get user-provided overrides for a stream kind. */
|
|
97
|
-
getOverrides(kind) {
|
|
98
|
-
switch (kind) {
|
|
99
|
-
case 'ev':
|
|
100
|
-
return this.options.events?.stream ?? {};
|
|
101
|
-
case 'cmd':
|
|
102
|
-
return this.options.rpc?.mode === 'jetstream' ? (this.options.rpc.stream ?? {}) : {};
|
|
103
|
-
case 'broadcast':
|
|
104
|
-
return this.options.broadcast?.stream ?? {};
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
exports.StreamProvider = StreamProvider;
|
|
109
|
-
//# sourceMappingURL=stream.provider.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stream.provider.js","sourceRoot":"","sources":["../../../src/server/infrastructure/stream.provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { EventBus } from '../../hooks';
|
|
2
|
-
import type { Codec, DeadLetterInfo } from '../../interfaces';
|
|
3
|
-
import { MessageProvider } from '../infrastructure/message.provider';
|
|
4
|
-
import { PatternRegistry } from './pattern-registry';
|
|
5
|
-
/** Options for dead letter queue handling. */
|
|
6
|
-
export interface DeadLetterConfig {
|
|
7
|
-
/**
|
|
8
|
-
* Map of stream name -> max_deliver value.
|
|
9
|
-
* Used to detect when a message from a given stream has exhausted all delivery attempts.
|
|
10
|
-
*/
|
|
11
|
-
maxDeliverByStream: Map<string, number>;
|
|
12
|
-
/** Async callback invoked when a message exhausts all deliveries. */
|
|
13
|
-
onDeadLetter(info: DeadLetterInfo): Promise<void>;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Routes incoming event messages (workqueue and broadcast) to NestJS handlers.
|
|
17
|
-
*
|
|
18
|
-
* Delivery semantics (at-least-once):
|
|
19
|
-
* - Handler executes first
|
|
20
|
-
* - Success -> ack (message consumed)
|
|
21
|
-
* - Handler error -> nak (NATS redelivers, up to `max_deliver` times)
|
|
22
|
-
* - Dead letter (max_deliver reached) -> onDeadLetter hook -> term or nak
|
|
23
|
-
* - Decode error -> term (no retry for malformed payloads)
|
|
24
|
-
* - No handler found -> term (configuration error)
|
|
25
|
-
*
|
|
26
|
-
* Both workqueue and broadcast use the same ack/nak semantics.
|
|
27
|
-
* Each durable consumer tracks delivery independently, so a nak from
|
|
28
|
-
* one broadcast consumer does not affect others.
|
|
29
|
-
*
|
|
30
|
-
* Handlers must be idempotent — NATS may redeliver on failure or timeout.
|
|
31
|
-
*/
|
|
32
|
-
export declare class EventRouter {
|
|
33
|
-
private readonly messageProvider;
|
|
34
|
-
private readonly patternRegistry;
|
|
35
|
-
private readonly codec;
|
|
36
|
-
private readonly eventBus;
|
|
37
|
-
private readonly deadLetterConfig?;
|
|
38
|
-
private readonly logger;
|
|
39
|
-
private readonly subscriptions;
|
|
40
|
-
constructor(messageProvider: MessageProvider, patternRegistry: PatternRegistry, codec: Codec, eventBus: EventBus, deadLetterConfig?: DeadLetterConfig | undefined);
|
|
41
|
-
/** Start routing event and broadcast messages to handlers. */
|
|
42
|
-
start(): void;
|
|
43
|
-
/** Stop routing and unsubscribe from all streams. */
|
|
44
|
-
destroy(): void;
|
|
45
|
-
/** Subscribe to a message stream and route each message. */
|
|
46
|
-
private subscribeToStream;
|
|
47
|
-
/** Handle a single event message: decode -> execute handler -> ack/nak. */
|
|
48
|
-
private handle;
|
|
49
|
-
/** Execute handler, then ack on success or nak/dead-letter on failure. */
|
|
50
|
-
private executeHandler;
|
|
51
|
-
/** Check if the message has exhausted all delivery attempts. */
|
|
52
|
-
private isDeadLetter;
|
|
53
|
-
/** Handle a dead letter: invoke callback, then term or nak based on result. */
|
|
54
|
-
private handleDeadLetter;
|
|
55
|
-
}
|
|
56
|
-
//# sourceMappingURL=event.router.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"event.router.d.ts","sourceRoot":"","sources":["../../../src/server/routing/event.router.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAE9D,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,8CAA8C;AAC9C,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,qEAAqE;IACrE,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,WAAW;IAKpB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IARpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAC9D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsB;gBAGjC,eAAe,EAAE,eAAe,EAChC,eAAe,EAAE,eAAe,EAChC,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,gBAAgB,CAAC,EAAE,gBAAgB,YAAA;IAGtD,8DAA8D;IACvD,KAAK,IAAI,IAAI;IAKpB,qDAAqD;IAC9C,OAAO,IAAI,IAAI;IAQtB,4DAA4D;IAC5D,OAAO,CAAC,iBAAiB;IAczB,2EAA2E;IAC3E,OAAO,CAAC,MAAM;IA0Bd,0EAA0E;YAC5D,cAAc;IAyB5B,gEAAgE;IAChE,OAAO,CAAC,YAAY;IAUpB,+EAA+E;YACjE,gBAAgB;CAwB/B"}
|