@rsdk/nats.transport 5.8.0-next.4 → 5.8.0-next.6
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/dist/jetstream/constants.d.ts +1 -0
- package/dist/jetstream/constants.js +2 -1
- package/dist/jetstream/constants.js.map +1 -1
- package/dist/jetstream/server.d.ts +10 -10
- package/dist/jetstream/server.js +159 -37
- package/dist/jetstream/server.js.map +1 -1
- package/dist/jetstream/types/consume.options.d.ts +1 -0
- package/dist/jetstream/types/consumer-info.type.d.ts +1 -0
- package/package.json +2 -2
- package/src/jetstream/constants.ts +2 -0
- package/src/jetstream/server.ts +314 -45
- package/src/jetstream/types/consume.options.ts +1 -0
- package/src/jetstream/types/consumer-info.type.ts +1 -0
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.NATS_PROTOCOL = exports.NATS_JETSTREAM_PROTOCOL = void 0;
|
|
3
|
+
exports.DEFAULT_MAX_ACK_PENDING = exports.NATS_PROTOCOL = exports.NATS_JETSTREAM_PROTOCOL = void 0;
|
|
4
4
|
exports.NATS_JETSTREAM_PROTOCOL = 'nats-jetstream';
|
|
5
5
|
/**
|
|
6
6
|
* @deprecated use NATS_JETSTREAM_PROTOCOL instead
|
|
7
7
|
*/
|
|
8
8
|
exports.NATS_PROTOCOL = exports.NATS_JETSTREAM_PROTOCOL;
|
|
9
|
+
exports.DEFAULT_MAX_ACK_PENDING = 1000;
|
|
9
10
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/jetstream/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,uBAAuB,GAAG,gBAAgB,CAAC;AAExD;;GAEG;AACU,QAAA,aAAa,GAAG,+BAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/jetstream/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,uBAAuB,GAAG,gBAAgB,CAAC;AAExD;;GAEG;AACU,QAAA,aAAa,GAAG,+BAAuB,CAAC;AAExC,QAAA,uBAAuB,GAAG,IAAI,CAAC"}
|
|
@@ -14,7 +14,6 @@ export declare class NatsJetStreamServer extends Server implements CustomTranspo
|
|
|
14
14
|
logger: import("@rsdk/logging").ILogger;
|
|
15
15
|
readonly deserializer: EventsDeserializer<EventTypeWithOptions>;
|
|
16
16
|
private nc?;
|
|
17
|
-
private jsm?;
|
|
18
17
|
private readonly streams;
|
|
19
18
|
private readonly normalizedApplicationName;
|
|
20
19
|
private readonly autoUpdateConsumers;
|
|
@@ -58,20 +57,20 @@ export declare class NatsJetStreamServer extends Server implements CustomTranspo
|
|
|
58
57
|
*/
|
|
59
58
|
private bindEventHandlers;
|
|
60
59
|
/**
|
|
61
|
-
* Группирует обработчики
|
|
60
|
+
* Группирует обработчики в консьюмеры.
|
|
62
61
|
*
|
|
63
62
|
* @param {Array<[string, MessageHandler<any, any, any>]>} eventHandlers - Список обработчиков событий,
|
|
64
63
|
* где каждый элемент представляет собой кортеж из метаданных и обработчика.
|
|
65
64
|
*
|
|
66
|
-
* @returns
|
|
67
|
-
* orderedConsumers: ConsumersMap,
|
|
68
|
-
* unorderedConsumers: ConsumersMap
|
|
69
|
-
* }}
|
|
70
|
-
* Объект, содержащий две карты:
|
|
71
|
-
* - orderedConsumers: карта с зависимыми от порядка consumer'ами.
|
|
72
|
-
* - unorderedConsumers: карта с независимыми от порядка consumer'ами.
|
|
65
|
+
* @returns ConsumersMap
|
|
73
66
|
*/
|
|
74
|
-
private
|
|
67
|
+
private groupHandlersByConsumers;
|
|
68
|
+
private getStreamsAndOldConsumers;
|
|
69
|
+
private hasSubjectConflict;
|
|
70
|
+
private resolveConsumerConflicts;
|
|
71
|
+
private resolveConsumerConflictsWithPause;
|
|
72
|
+
private resolveConsumerConflictsWithoutPause;
|
|
73
|
+
private getUpdatedMinSeqs;
|
|
75
74
|
/**
|
|
76
75
|
* Получает информацию о консьюмере.
|
|
77
76
|
* @param js - Клиент JetStream.
|
|
@@ -128,4 +127,5 @@ export declare class NatsJetStreamServer extends Server implements CustomTranspo
|
|
|
128
127
|
* @returns Часть типа.
|
|
129
128
|
*/
|
|
130
129
|
private getTypePart;
|
|
130
|
+
private isNatsVersionAtLeast;
|
|
131
131
|
}
|
package/dist/jetstream/server.js
CHANGED
|
@@ -12,6 +12,7 @@ const lodash_1 = require("lodash");
|
|
|
12
12
|
const nats_1 = require("nats");
|
|
13
13
|
const rxjs_1 = require("rxjs");
|
|
14
14
|
const events_deserializer_1 = require("../events.deserializer");
|
|
15
|
+
const constants_1 = require("./constants");
|
|
15
16
|
/**
|
|
16
17
|
* Класс, реализующий сервер NATS JetStream.
|
|
17
18
|
*/
|
|
@@ -22,7 +23,6 @@ class NatsJetStreamServer extends microservices_1.Server {
|
|
|
22
23
|
logger = logging_1.LoggerFactory.create(NatsJetStreamServer.name);
|
|
23
24
|
deserializer = new events_deserializer_1.EventsDeserializer();
|
|
24
25
|
nc;
|
|
25
|
-
jsm;
|
|
26
26
|
streams = new Set();
|
|
27
27
|
normalizedApplicationName;
|
|
28
28
|
autoUpdateConsumers;
|
|
@@ -51,7 +51,6 @@ class NatsJetStreamServer extends microservices_1.Server {
|
|
|
51
51
|
this.nc = await (0, nats_1.connect)(this.options.connectionOptions);
|
|
52
52
|
this.options.connectionOptions.connectedHook?.(this.nc);
|
|
53
53
|
}
|
|
54
|
-
this.jsm = await this.nc.jetstreamManager(this.options.jetStreamOptions);
|
|
55
54
|
await this.bindEventHandlers();
|
|
56
55
|
callback();
|
|
57
56
|
}
|
|
@@ -117,51 +116,165 @@ class NatsJetStreamServer extends microservices_1.Server {
|
|
|
117
116
|
throw new core_1.InternalException('Connection must be established');
|
|
118
117
|
}
|
|
119
118
|
const js = this.nc.jetstream(this.options.jetStreamOptions);
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
119
|
+
const jsm = await js.jetstreamManager();
|
|
120
|
+
const relevantConsumers = this.groupHandlersByConsumers(eventHandlers);
|
|
121
|
+
const relevantConsumerNames = new Set(relevantConsumers.keys());
|
|
122
|
+
const expectedSubjectsByConsumer = new Map();
|
|
123
|
+
const { streamsMap, oldConsumersByStreamMap } = await this.getStreamsAndOldConsumers(jsm);
|
|
124
|
+
/**
|
|
125
|
+
* Первая попытка создать без конфликта
|
|
126
|
+
*/
|
|
127
|
+
for (const [relevantConsumerName, relevantConsumer] of relevantConsumers) {
|
|
128
|
+
const expectedSubjects = [
|
|
129
|
+
...relevantConsumer.mapping.values(),
|
|
130
|
+
].flatMap((e) => this.getEventSubjects(e.deserializer));
|
|
131
|
+
expectedSubjectsByConsumer.set(relevantConsumerName, expectedSubjects);
|
|
132
|
+
const oldConsumers = oldConsumersByStreamMap.get(relevantConsumer.streamName);
|
|
133
|
+
const conflictOldConsumer = [...oldConsumers.values()].find((oldConsumer) => this.hasSubjectConflict(oldConsumer, expectedSubjects));
|
|
134
|
+
const sameNameOldConsumer = oldConsumers.get(relevantConsumerName);
|
|
135
|
+
const canCreateDirectly = !conflictOldConsumer ||
|
|
136
|
+
(sameNameOldConsumer &&
|
|
137
|
+
expectedSubjects.every((subject) => sameNameOldConsumer.config.filter_subjects?.includes(subject)));
|
|
138
|
+
/**
|
|
139
|
+
* Создаем, если нужных subject'ов нет в других консьюмерах,
|
|
140
|
+
* либо все нужные subject'ы присутствуют в консьюмере с актуальным названием
|
|
141
|
+
*/
|
|
142
|
+
if (canCreateDirectly) {
|
|
143
|
+
this.logger.trace(`Create consumer without conflict`, {
|
|
144
|
+
consumerName: relevantConsumerName,
|
|
145
|
+
});
|
|
146
|
+
await this.createConsumer(js, relevantConsumerName, relevantConsumer, {
|
|
147
|
+
filter_subjects: expectedSubjects,
|
|
148
|
+
});
|
|
149
|
+
relevantConsumers.delete(relevantConsumerName);
|
|
150
|
+
}
|
|
125
151
|
}
|
|
126
|
-
|
|
127
|
-
|
|
152
|
+
/**
|
|
153
|
+
* Решение конфликтов
|
|
154
|
+
*/
|
|
155
|
+
for (const [consumerName, consumer] of relevantConsumers) {
|
|
156
|
+
const oldConsumers = oldConsumersByStreamMap.get(consumer.streamName);
|
|
157
|
+
const expectedSubjects = expectedSubjectsByConsumer.get(consumerName);
|
|
158
|
+
const { lowestLastAckSeq, lowestStartSeq } = await this.resolveConsumerConflicts(jsm, expectedSubjects, consumer, relevantConsumerNames, oldConsumers);
|
|
159
|
+
const isWorkQueue = streamsMap.get(consumer.streamName)?.config.retention ===
|
|
160
|
+
nats_1.RetentionPolicy.Workqueue;
|
|
161
|
+
const options = isWorkQueue || (!lowestLastAckSeq && !lowestStartSeq)
|
|
162
|
+
? {
|
|
163
|
+
deliver_policy: nats_1.DeliverPolicy.All,
|
|
164
|
+
}
|
|
165
|
+
: {
|
|
166
|
+
opt_start_seq: Math.max(lowestLastAckSeq + 1, lowestStartSeq ?? 0),
|
|
167
|
+
deliver_policy: nats_1.DeliverPolicy.StartSequence,
|
|
168
|
+
};
|
|
169
|
+
this.logger.trace(`Create consumer after conflicts resolving`, {
|
|
170
|
+
consumerName,
|
|
171
|
+
});
|
|
172
|
+
await this.createConsumer(js, consumerName, consumer, {
|
|
173
|
+
filter_subjects: expectedSubjects,
|
|
174
|
+
...options,
|
|
175
|
+
});
|
|
128
176
|
}
|
|
129
177
|
}
|
|
130
178
|
/**
|
|
131
|
-
* Группирует обработчики
|
|
179
|
+
* Группирует обработчики в консьюмеры.
|
|
132
180
|
*
|
|
133
181
|
* @param {Array<[string, MessageHandler<any, any, any>]>} eventHandlers - Список обработчиков событий,
|
|
134
182
|
* где каждый элемент представляет собой кортеж из метаданных и обработчика.
|
|
135
183
|
*
|
|
136
|
-
* @returns
|
|
137
|
-
* orderedConsumers: ConsumersMap,
|
|
138
|
-
* unorderedConsumers: ConsumersMap
|
|
139
|
-
* }}
|
|
140
|
-
* Объект, содержащий две карты:
|
|
141
|
-
* - orderedConsumers: карта с зависимыми от порядка consumer'ами.
|
|
142
|
-
* - unorderedConsumers: карта с независимыми от порядка consumer'ами.
|
|
184
|
+
* @returns ConsumersMap
|
|
143
185
|
*/
|
|
144
|
-
|
|
145
|
-
const
|
|
146
|
-
const unorderedConsumers = new Map();
|
|
186
|
+
groupHandlersByConsumers(eventHandlers) {
|
|
187
|
+
const consumers = new Map();
|
|
147
188
|
for (const [meta, handler] of eventHandlers) {
|
|
148
189
|
const deserializer = this.deserializer.events.get(meta);
|
|
149
190
|
const consumerName = this.getConsumerName(deserializer);
|
|
150
191
|
const streamName = this.getStreamName(deserializer);
|
|
151
|
-
const
|
|
152
|
-
? orderedConsumers
|
|
153
|
-
: unorderedConsumers;
|
|
154
|
-
const aggregatedConsumer = targetMap.get(consumerName) ?? {
|
|
192
|
+
const aggregatedConsumer = consumers.get(consumerName) ?? {
|
|
155
193
|
streamName,
|
|
156
194
|
mapping: new Map(),
|
|
195
|
+
maxAckPending: deserializer.options?.maxAckPending ?? constants_1.DEFAULT_MAX_ACK_PENDING,
|
|
157
196
|
};
|
|
158
197
|
aggregatedConsumer.mapping.set(this.getTypePart(deserializer.type), {
|
|
159
198
|
deserializer,
|
|
160
199
|
handler,
|
|
161
200
|
});
|
|
162
|
-
|
|
201
|
+
consumers.set(consumerName, aggregatedConsumer);
|
|
202
|
+
}
|
|
203
|
+
return consumers;
|
|
204
|
+
}
|
|
205
|
+
async getStreamsAndOldConsumers(jsm) {
|
|
206
|
+
const streamsMap = new Map();
|
|
207
|
+
const oldConsumersByStreamMap = new Map();
|
|
208
|
+
await Promise.all(Array.from(this.streams.values()).map(async (streamName) => {
|
|
209
|
+
oldConsumersByStreamMap.set(streamName, new Map());
|
|
210
|
+
const oldConsumers = oldConsumersByStreamMap.get(streamName);
|
|
211
|
+
streamsMap.set(streamName, await jsm.streams.info(streamName));
|
|
212
|
+
for await (const consumer of jsm.consumers.list(streamName)) {
|
|
213
|
+
if (consumer.config.durable_name?.includes(this.normalizedApplicationName)) {
|
|
214
|
+
oldConsumers.set(consumer.config.durable_name, consumer);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}));
|
|
218
|
+
return { streamsMap, oldConsumersByStreamMap };
|
|
219
|
+
}
|
|
220
|
+
hasSubjectConflict(consumer, expectedSubjects) {
|
|
221
|
+
const filterSubjects = consumer.config.filter_subjects;
|
|
222
|
+
const filterSubject = consumer.config.filter_subject;
|
|
223
|
+
return !!((!filterSubjects && !filterSubject) ||
|
|
224
|
+
(filterSubjects &&
|
|
225
|
+
filterSubjects.some((s) => expectedSubjects.includes(s))) ||
|
|
226
|
+
(filterSubject && expectedSubjects.includes(filterSubject)));
|
|
227
|
+
}
|
|
228
|
+
async resolveConsumerConflicts(jsm, expectedSubjects, consumer, relevantConsumerNames, oldConsumers) {
|
|
229
|
+
const conflictOldConsumers = [...oldConsumers.values()].filter((oldConsumer) => this.hasSubjectConflict(oldConsumer, expectedSubjects));
|
|
230
|
+
/**
|
|
231
|
+
* NOTE: пауза позволяет дождаться все pending ack'и и избежать race condition.
|
|
232
|
+
* Но пауза появилась только в nats-server версии 2.11.0.
|
|
233
|
+
*/
|
|
234
|
+
return this.isNatsVersionAtLeast(this.nc.info.version, 2, 11, 0)
|
|
235
|
+
? this.resolveConsumerConflictsWithPause(jsm, consumer, conflictOldConsumers, relevantConsumerNames)
|
|
236
|
+
: this.resolveConsumerConflictsWithoutPause(jsm, consumer, conflictOldConsumers, relevantConsumerNames);
|
|
237
|
+
}
|
|
238
|
+
async resolveConsumerConflictsWithPause(jsm, relevantConsumer, conflictOldConsumers, relevantConsumerNames) {
|
|
239
|
+
let lowestLastAckSeq = Infinity;
|
|
240
|
+
let lowestStartSeq = undefined;
|
|
241
|
+
for (const oldConsumer of conflictOldConsumers) {
|
|
242
|
+
const conflictDurableName = oldConsumer.config.durable_name;
|
|
243
|
+
this.logger.trace(`Pause conflict consumer`, { conflictDurableName });
|
|
244
|
+
await jsm.consumers.pause(relevantConsumer.streamName, conflictDurableName, new Date(Date.now() + 60000));
|
|
245
|
+
const oldConsumerInfoAfterPause = await jsm.consumers.info(relevantConsumer.streamName, conflictDurableName);
|
|
246
|
+
({ lowestLastAckSeq, lowestStartSeq } = this.getUpdatedMinSeqs(oldConsumerInfoAfterPause, lowestLastAckSeq, lowestStartSeq));
|
|
247
|
+
if (relevantConsumerNames.has(conflictDurableName)) {
|
|
248
|
+
this.logger.trace(`Resume conflict consumer`, { conflictDurableName });
|
|
249
|
+
jsm.consumers.resume(relevantConsumer.streamName, conflictDurableName);
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
this.logger.trace(`Delete conflict consumer`, { conflictDurableName });
|
|
253
|
+
jsm.consumers.delete(relevantConsumer.streamName, conflictDurableName);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return { lowestLastAckSeq, lowestStartSeq };
|
|
257
|
+
}
|
|
258
|
+
async resolveConsumerConflictsWithoutPause(jsm, relevantConsumer, conflictOldConsumers, relevantConsumerNames) {
|
|
259
|
+
let lowestLastAckSeq = Infinity;
|
|
260
|
+
let lowestStartSeq = undefined;
|
|
261
|
+
for (const oldConsumer of conflictOldConsumers) {
|
|
262
|
+
const conflictDurableName = oldConsumer.config.durable_name;
|
|
263
|
+
({ lowestLastAckSeq, lowestStartSeq } = this.getUpdatedMinSeqs(oldConsumer, lowestLastAckSeq, lowestStartSeq));
|
|
264
|
+
if (!relevantConsumerNames.has(conflictDurableName)) {
|
|
265
|
+
this.logger.trace(`Delete conflict consumer`, { conflictDurableName });
|
|
266
|
+
await jsm.consumers.delete(relevantConsumer.streamName, conflictDurableName);
|
|
267
|
+
}
|
|
163
268
|
}
|
|
164
|
-
return {
|
|
269
|
+
return { lowestLastAckSeq, lowestStartSeq };
|
|
270
|
+
}
|
|
271
|
+
getUpdatedMinSeqs(oldConsumer, lowestLastAckSeq, lowestStartSeq) {
|
|
272
|
+
lowestLastAckSeq = Math.min(lowestLastAckSeq, oldConsumer.ack_floor.stream_seq);
|
|
273
|
+
const startSeq = oldConsumer.config.opt_start_seq;
|
|
274
|
+
if (startSeq !== undefined) {
|
|
275
|
+
lowestStartSeq = Math.min(lowestStartSeq ?? Infinity, startSeq);
|
|
276
|
+
}
|
|
277
|
+
return { lowestLastAckSeq, lowestStartSeq };
|
|
165
278
|
}
|
|
166
279
|
/**
|
|
167
280
|
* Получает информацию о консьюмере.
|
|
@@ -180,7 +293,7 @@ class NatsJetStreamServer extends microservices_1.Server {
|
|
|
180
293
|
* @param consumer - Информация о консьюмере.
|
|
181
294
|
* @param options - Дополнительные параметры конфигурации консьюмера.
|
|
182
295
|
*/
|
|
183
|
-
async createConsumer(js, consumerName, { streamName, mapping }, options) {
|
|
296
|
+
async createConsumer(js, consumerName, { streamName, mapping, maxAckPending }, options) {
|
|
184
297
|
try {
|
|
185
298
|
await js.streams.get(streamName);
|
|
186
299
|
this.logger.trace('Stream %s found', { streamName });
|
|
@@ -192,20 +305,19 @@ class NatsJetStreamServer extends microservices_1.Server {
|
|
|
192
305
|
});
|
|
193
306
|
}
|
|
194
307
|
const jsm = await js.jetstreamManager();
|
|
195
|
-
const expectedSubjects = [...mapping.values()].flatMap((e) => this.getEventSubjects(e.deserializer));
|
|
196
308
|
const ackPolicy = [...mapping.values()][0].deserializer.options?.ackPolicy;
|
|
197
309
|
const consumer = (await this.getConsumer(js, streamName, consumerName).catch(() => null)) ??
|
|
198
310
|
(await jsm.consumers
|
|
199
311
|
.add(streamName, (0, common_1.omitUndefined)({
|
|
200
312
|
...options,
|
|
313
|
+
max_ack_pending: maxAckPending,
|
|
201
314
|
ack_policy: ackPolicy,
|
|
202
315
|
durable_name: consumerName,
|
|
203
|
-
filter_subjects: expectedSubjects,
|
|
204
316
|
}))
|
|
205
317
|
.then(() => this.getConsumer(js, streamName, consumerName)));
|
|
206
318
|
const info = await consumer.info();
|
|
207
319
|
const receivedSubjects = info.config.filter_subjects;
|
|
208
|
-
await this.handleCorrectness(jsm, streamName, consumerName,
|
|
320
|
+
await this.handleCorrectness(jsm, streamName, consumerName, options.filter_subjects, receivedSubjects);
|
|
209
321
|
this.handleEventMessages(consumer, mapping, consumerName);
|
|
210
322
|
}
|
|
211
323
|
/**
|
|
@@ -291,14 +403,14 @@ class NatsJetStreamServer extends microservices_1.Server {
|
|
|
291
403
|
* @returns Имя консьюмера.
|
|
292
404
|
*/
|
|
293
405
|
getConsumerName(contract) {
|
|
294
|
-
const arr = [
|
|
295
|
-
this.normalizedApplicationName,
|
|
296
|
-
this.getStreamName(contract),
|
|
297
|
-
'consumer',
|
|
298
|
-
];
|
|
406
|
+
const arr = [];
|
|
299
407
|
if (contract.options?.consumerName) {
|
|
300
|
-
arr.
|
|
408
|
+
arr.push(contract.options.consumerName);
|
|
301
409
|
}
|
|
410
|
+
const maxAckPending = `${contract.options?.maxAckPending === -1
|
|
411
|
+
? 'infinite'
|
|
412
|
+
: (contract.options?.maxAckPending ?? constants_1.DEFAULT_MAX_ACK_PENDING)}`;
|
|
413
|
+
arr.push(this.normalizedApplicationName, this.getStreamName(contract), 'maxAckPending', maxAckPending, 'ackPolicy', contract.options?.ackPolicy ?? nats_1.AckPolicy.None);
|
|
302
414
|
return arr.join('-');
|
|
303
415
|
}
|
|
304
416
|
/**
|
|
@@ -307,7 +419,9 @@ class NatsJetStreamServer extends microservices_1.Server {
|
|
|
307
419
|
* @returns Темы событий.
|
|
308
420
|
*/
|
|
309
421
|
getEventSubjects(contract) {
|
|
310
|
-
return contract.options?.subjects ?? [
|
|
422
|
+
return (contract.options?.subjects ?? [
|
|
423
|
+
(0, nats_common_1.getSubjectName)(contract.type, contract.options?.partition),
|
|
424
|
+
]);
|
|
311
425
|
}
|
|
312
426
|
/**
|
|
313
427
|
* Получает часть типа события.
|
|
@@ -317,6 +431,14 @@ class NatsJetStreamServer extends microservices_1.Server {
|
|
|
317
431
|
getTypePart(eventType) {
|
|
318
432
|
return (typeof eventType === 'string' ? eventType : eventType.$type).replaceAll('.', '-');
|
|
319
433
|
}
|
|
434
|
+
isNatsVersionAtLeast(version, minMajor, minMinor, minPatch) {
|
|
435
|
+
const [major, minor, patch] = version.split('-')[0].split('.').map(Number);
|
|
436
|
+
if (major !== minMajor)
|
|
437
|
+
return major > minMajor;
|
|
438
|
+
if (minor !== minMinor)
|
|
439
|
+
return minor > minMinor;
|
|
440
|
+
return patch >= minPatch;
|
|
441
|
+
}
|
|
320
442
|
}
|
|
321
443
|
exports.NatsJetStreamServer = NatsJetStreamServer;
|
|
322
444
|
//# sourceMappingURL=server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/jetstream/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/jetstream/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rsdk/nats.transport",
|
|
3
|
-
"version": "5.8.0-next.
|
|
3
|
+
"version": "5.8.0-next.6",
|
|
4
4
|
"description": "Nats NestJS Transport",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"license": "Apache License 2.0",
|
|
@@ -37,5 +37,5 @@
|
|
|
37
37
|
"rxjs": "^7.1.0"
|
|
38
38
|
},
|
|
39
39
|
"nx": {},
|
|
40
|
-
"gitHead": "
|
|
40
|
+
"gitHead": "317e239c10a0601b489b6a1347f8de88a730e8d8"
|
|
41
41
|
}
|
package/src/jetstream/server.ts
CHANGED
|
@@ -14,20 +14,27 @@ import { InternalException, NotFoundException } from '@rsdk/core';
|
|
|
14
14
|
import type { EventType } from '@rsdk/events.common';
|
|
15
15
|
import { isEventType, X_TYPE_HEADER } from '@rsdk/events.common';
|
|
16
16
|
import { LoggerFactory } from '@rsdk/logging';
|
|
17
|
-
import {
|
|
17
|
+
import {
|
|
18
|
+
getStreamName,
|
|
19
|
+
getSubjectName,
|
|
20
|
+
isMessageType,
|
|
21
|
+
} from '@rsdk/nats.common';
|
|
18
22
|
import { isEqual } from 'lodash';
|
|
19
23
|
import type {
|
|
20
24
|
Consumer,
|
|
21
25
|
ConsumerConfig,
|
|
26
|
+
ConsumerInfo as NativeConsumerInfo,
|
|
22
27
|
JetStreamClient,
|
|
23
28
|
JetStreamManager,
|
|
24
29
|
NatsConnection,
|
|
30
|
+
StreamInfo,
|
|
25
31
|
} from 'nats';
|
|
26
|
-
import { connect } from 'nats';
|
|
32
|
+
import { AckPolicy, connect, DeliverPolicy, RetentionPolicy } from 'nats';
|
|
27
33
|
import { connectable, isObservable, Subject } from 'rxjs';
|
|
28
34
|
|
|
29
35
|
import { EventsDeserializer } from '../events.deserializer';
|
|
30
36
|
|
|
37
|
+
import { DEFAULT_MAX_ACK_PENDING } from './constants';
|
|
31
38
|
import type {
|
|
32
39
|
ConsumerInfo,
|
|
33
40
|
ConsumersMap,
|
|
@@ -48,7 +55,6 @@ export class NatsJetStreamServer
|
|
|
48
55
|
new EventsDeserializer<EventTypeWithOptions>();
|
|
49
56
|
|
|
50
57
|
private nc?: NatsConnection;
|
|
51
|
-
private jsm?: JetStreamManager;
|
|
52
58
|
private readonly streams = new Set<string>();
|
|
53
59
|
|
|
54
60
|
private readonly normalizedApplicationName: string;
|
|
@@ -89,7 +95,6 @@ export class NatsJetStreamServer
|
|
|
89
95
|
this.nc = await connect(this.options.connectionOptions);
|
|
90
96
|
this.options.connectionOptions!.connectedHook?.(this.nc);
|
|
91
97
|
}
|
|
92
|
-
this.jsm = await this.nc.jetstreamManager(this.options.jetStreamOptions);
|
|
93
98
|
|
|
94
99
|
await this.bindEventHandlers();
|
|
95
100
|
callback();
|
|
@@ -181,64 +186,303 @@ export class NatsJetStreamServer
|
|
|
181
186
|
if (!this.nc) {
|
|
182
187
|
throw new InternalException('Connection must be established');
|
|
183
188
|
}
|
|
189
|
+
|
|
184
190
|
const js = this.nc.jetstream(this.options.jetStreamOptions);
|
|
191
|
+
const jsm = await js.jetstreamManager();
|
|
192
|
+
const relevantConsumers = this.groupHandlersByConsumers(eventHandlers);
|
|
193
|
+
const relevantConsumerNames = new Set<string>(relevantConsumers.keys());
|
|
194
|
+
const expectedSubjectsByConsumer = new Map<string, string[]>();
|
|
185
195
|
|
|
186
|
-
const {
|
|
187
|
-
this.
|
|
196
|
+
const { streamsMap, oldConsumersByStreamMap } =
|
|
197
|
+
await this.getStreamsAndOldConsumers(jsm);
|
|
188
198
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
199
|
+
/**
|
|
200
|
+
* Первая попытка создать без конфликта
|
|
201
|
+
*/
|
|
202
|
+
for (const [relevantConsumerName, relevantConsumer] of relevantConsumers) {
|
|
203
|
+
const expectedSubjects: string[] = [
|
|
204
|
+
...relevantConsumer.mapping.values(),
|
|
205
|
+
].flatMap((e) => this.getEventSubjects(e.deserializer));
|
|
206
|
+
|
|
207
|
+
expectedSubjectsByConsumer.set(relevantConsumerName, expectedSubjects);
|
|
208
|
+
|
|
209
|
+
const oldConsumers = oldConsumersByStreamMap.get(
|
|
210
|
+
relevantConsumer.streamName,
|
|
211
|
+
)!;
|
|
212
|
+
|
|
213
|
+
const conflictOldConsumer = [...oldConsumers.values()].find(
|
|
214
|
+
(oldConsumer) => this.hasSubjectConflict(oldConsumer, expectedSubjects),
|
|
215
|
+
);
|
|
216
|
+
|
|
217
|
+
const sameNameOldConsumer = oldConsumers.get(relevantConsumerName);
|
|
218
|
+
const canCreateDirectly =
|
|
219
|
+
!conflictOldConsumer ||
|
|
220
|
+
(sameNameOldConsumer &&
|
|
221
|
+
expectedSubjects.every((subject) =>
|
|
222
|
+
sameNameOldConsumer.config.filter_subjects?.includes(subject),
|
|
223
|
+
));
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Создаем, если нужных subject'ов нет в других консьюмерах,
|
|
227
|
+
* либо все нужные subject'ы присутствуют в консьюмере с актуальным названием
|
|
228
|
+
*/
|
|
229
|
+
if (canCreateDirectly) {
|
|
230
|
+
this.logger.trace(`Create consumer without conflict`, {
|
|
231
|
+
consumerName: relevantConsumerName,
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
await this.createConsumer(js, relevantConsumerName, relevantConsumer, {
|
|
235
|
+
filter_subjects: expectedSubjects,
|
|
236
|
+
});
|
|
237
|
+
relevantConsumers.delete(relevantConsumerName);
|
|
238
|
+
}
|
|
193
239
|
}
|
|
194
240
|
|
|
195
|
-
|
|
196
|
-
|
|
241
|
+
/**
|
|
242
|
+
* Решение конфликтов
|
|
243
|
+
*/
|
|
244
|
+
for (const [consumerName, consumer] of relevantConsumers) {
|
|
245
|
+
const oldConsumers = oldConsumersByStreamMap.get(consumer.streamName)!;
|
|
246
|
+
const expectedSubjects = expectedSubjectsByConsumer.get(consumerName)!;
|
|
247
|
+
|
|
248
|
+
const { lowestLastAckSeq, lowestStartSeq } =
|
|
249
|
+
await this.resolveConsumerConflicts(
|
|
250
|
+
jsm,
|
|
251
|
+
expectedSubjects,
|
|
252
|
+
consumer,
|
|
253
|
+
relevantConsumerNames,
|
|
254
|
+
oldConsumers,
|
|
255
|
+
);
|
|
256
|
+
|
|
257
|
+
const isWorkQueue =
|
|
258
|
+
streamsMap.get(consumer.streamName)?.config.retention ===
|
|
259
|
+
RetentionPolicy.Workqueue;
|
|
260
|
+
|
|
261
|
+
const options =
|
|
262
|
+
isWorkQueue || (!lowestLastAckSeq && !lowestStartSeq)
|
|
263
|
+
? {
|
|
264
|
+
deliver_policy: DeliverPolicy.All,
|
|
265
|
+
}
|
|
266
|
+
: {
|
|
267
|
+
opt_start_seq: Math.max(
|
|
268
|
+
lowestLastAckSeq + 1,
|
|
269
|
+
lowestStartSeq ?? 0,
|
|
270
|
+
),
|
|
271
|
+
deliver_policy: DeliverPolicy.StartSequence,
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
this.logger.trace(`Create consumer after conflicts resolving`, {
|
|
275
|
+
consumerName,
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
await this.createConsumer(js, consumerName, consumer, {
|
|
279
|
+
filter_subjects: expectedSubjects,
|
|
280
|
+
...options,
|
|
281
|
+
});
|
|
197
282
|
}
|
|
198
283
|
}
|
|
199
284
|
|
|
200
285
|
/**
|
|
201
|
-
* Группирует обработчики
|
|
286
|
+
* Группирует обработчики в консьюмеры.
|
|
202
287
|
*
|
|
203
288
|
* @param {Array<[string, MessageHandler<any, any, any>]>} eventHandlers - Список обработчиков событий,
|
|
204
289
|
* где каждый элемент представляет собой кортеж из метаданных и обработчика.
|
|
205
290
|
*
|
|
206
|
-
* @returns
|
|
207
|
-
* orderedConsumers: ConsumersMap,
|
|
208
|
-
* unorderedConsumers: ConsumersMap
|
|
209
|
-
* }}
|
|
210
|
-
* Объект, содержащий две карты:
|
|
211
|
-
* - orderedConsumers: карта с зависимыми от порядка consumer'ами.
|
|
212
|
-
* - unorderedConsumers: карта с независимыми от порядка consumer'ами.
|
|
291
|
+
* @returns ConsumersMap
|
|
213
292
|
*/
|
|
214
|
-
private
|
|
293
|
+
private groupHandlersByConsumers(
|
|
215
294
|
eventHandlers: [string, MessageHandler<any, any, any>][],
|
|
216
|
-
):
|
|
217
|
-
const
|
|
218
|
-
const unorderedConsumers: ConsumersMap = new Map();
|
|
295
|
+
): ConsumersMap {
|
|
296
|
+
const consumers: ConsumersMap = new Map();
|
|
219
297
|
|
|
220
298
|
for (const [meta, handler] of eventHandlers) {
|
|
221
299
|
const deserializer = this.deserializer.events.get(meta)!;
|
|
222
300
|
const consumerName = this.getConsumerName(deserializer);
|
|
223
301
|
const streamName = this.getStreamName(deserializer);
|
|
224
302
|
|
|
225
|
-
const
|
|
226
|
-
? orderedConsumers
|
|
227
|
-
: unorderedConsumers;
|
|
228
|
-
|
|
229
|
-
const aggregatedConsumer = targetMap.get(consumerName) ?? {
|
|
303
|
+
const aggregatedConsumer = consumers.get(consumerName) ?? {
|
|
230
304
|
streamName,
|
|
231
305
|
mapping: new Map() as Mapping,
|
|
306
|
+
maxAckPending:
|
|
307
|
+
deserializer.options?.maxAckPending ?? DEFAULT_MAX_ACK_PENDING,
|
|
232
308
|
};
|
|
233
309
|
|
|
234
310
|
aggregatedConsumer.mapping.set(this.getTypePart(deserializer.type), {
|
|
235
311
|
deserializer,
|
|
236
312
|
handler,
|
|
237
313
|
});
|
|
238
|
-
|
|
314
|
+
consumers.set(consumerName, aggregatedConsumer);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
return consumers;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
private async getStreamsAndOldConsumers(jsm: JetStreamManager): Promise<{
|
|
321
|
+
streamsMap: Map<string, StreamInfo>;
|
|
322
|
+
oldConsumersByStreamMap: Map<string, Map<string, NativeConsumerInfo>>;
|
|
323
|
+
}> {
|
|
324
|
+
const streamsMap = new Map<string, StreamInfo>();
|
|
325
|
+
const oldConsumersByStreamMap = new Map<
|
|
326
|
+
string,
|
|
327
|
+
Map<string, NativeConsumerInfo>
|
|
328
|
+
>();
|
|
329
|
+
|
|
330
|
+
await Promise.all(
|
|
331
|
+
Array.from(this.streams.values()).map(async (streamName) => {
|
|
332
|
+
oldConsumersByStreamMap.set(streamName, new Map());
|
|
333
|
+
const oldConsumers = oldConsumersByStreamMap.get(streamName)!;
|
|
334
|
+
|
|
335
|
+
streamsMap.set(streamName, await jsm.streams.info(streamName));
|
|
336
|
+
|
|
337
|
+
for await (const consumer of jsm.consumers.list(streamName)) {
|
|
338
|
+
if (
|
|
339
|
+
consumer.config.durable_name?.includes(
|
|
340
|
+
this.normalizedApplicationName,
|
|
341
|
+
)
|
|
342
|
+
) {
|
|
343
|
+
oldConsumers.set(consumer.config.durable_name, consumer);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}),
|
|
347
|
+
);
|
|
348
|
+
|
|
349
|
+
return { streamsMap, oldConsumersByStreamMap };
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
private hasSubjectConflict(
|
|
353
|
+
consumer: NativeConsumerInfo,
|
|
354
|
+
expectedSubjects: string[],
|
|
355
|
+
): boolean {
|
|
356
|
+
const filterSubjects = consumer.config.filter_subjects;
|
|
357
|
+
const filterSubject = consumer.config.filter_subject;
|
|
358
|
+
|
|
359
|
+
return !!(
|
|
360
|
+
(!filterSubjects && !filterSubject) ||
|
|
361
|
+
(filterSubjects &&
|
|
362
|
+
filterSubjects.some((s) => expectedSubjects.includes(s))) ||
|
|
363
|
+
(filterSubject && expectedSubjects.includes(filterSubject))
|
|
364
|
+
);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
private async resolveConsumerConflicts(
|
|
368
|
+
jsm: JetStreamManager,
|
|
369
|
+
expectedSubjects: string[],
|
|
370
|
+
consumer: ConsumerInfo,
|
|
371
|
+
relevantConsumerNames: Set<string>,
|
|
372
|
+
oldConsumers: Map<string, NativeConsumerInfo>,
|
|
373
|
+
): Promise<{ lowestLastAckSeq: number; lowestStartSeq: number | undefined }> {
|
|
374
|
+
const conflictOldConsumers = [...oldConsumers.values()].filter(
|
|
375
|
+
(oldConsumer) => this.hasSubjectConflict(oldConsumer, expectedSubjects),
|
|
376
|
+
);
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* NOTE: пауза позволяет дождаться все pending ack'и и избежать race condition.
|
|
380
|
+
* Но пауза появилась только в nats-server версии 2.11.0.
|
|
381
|
+
*/
|
|
382
|
+
return this.isNatsVersionAtLeast(this.nc!.info!.version, 2, 11, 0)
|
|
383
|
+
? this.resolveConsumerConflictsWithPause(
|
|
384
|
+
jsm,
|
|
385
|
+
consumer,
|
|
386
|
+
conflictOldConsumers,
|
|
387
|
+
relevantConsumerNames,
|
|
388
|
+
)
|
|
389
|
+
: this.resolveConsumerConflictsWithoutPause(
|
|
390
|
+
jsm,
|
|
391
|
+
consumer,
|
|
392
|
+
conflictOldConsumers,
|
|
393
|
+
relevantConsumerNames,
|
|
394
|
+
);
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
private async resolveConsumerConflictsWithPause(
|
|
398
|
+
jsm: JetStreamManager,
|
|
399
|
+
relevantConsumer: ConsumerInfo,
|
|
400
|
+
conflictOldConsumers: NativeConsumerInfo[],
|
|
401
|
+
relevantConsumerNames: Set<string>,
|
|
402
|
+
): Promise<{ lowestLastAckSeq: number; lowestStartSeq: number | undefined }> {
|
|
403
|
+
let lowestLastAckSeq = Infinity;
|
|
404
|
+
let lowestStartSeq: number | undefined = undefined;
|
|
405
|
+
|
|
406
|
+
for (const oldConsumer of conflictOldConsumers) {
|
|
407
|
+
const conflictDurableName = oldConsumer.config.durable_name!;
|
|
408
|
+
|
|
409
|
+
this.logger.trace(`Pause conflict consumer`, { conflictDurableName });
|
|
410
|
+
|
|
411
|
+
await jsm.consumers.pause(
|
|
412
|
+
relevantConsumer.streamName,
|
|
413
|
+
conflictDurableName,
|
|
414
|
+
new Date(Date.now() + 60000),
|
|
415
|
+
);
|
|
416
|
+
|
|
417
|
+
const oldConsumerInfoAfterPause = await jsm.consumers.info(
|
|
418
|
+
relevantConsumer.streamName,
|
|
419
|
+
conflictDurableName,
|
|
420
|
+
);
|
|
421
|
+
|
|
422
|
+
({ lowestLastAckSeq, lowestStartSeq } = this.getUpdatedMinSeqs(
|
|
423
|
+
oldConsumerInfoAfterPause,
|
|
424
|
+
lowestLastAckSeq,
|
|
425
|
+
lowestStartSeq,
|
|
426
|
+
));
|
|
427
|
+
|
|
428
|
+
if (relevantConsumerNames.has(conflictDurableName)) {
|
|
429
|
+
this.logger.trace(`Resume conflict consumer`, { conflictDurableName });
|
|
430
|
+
jsm.consumers.resume(relevantConsumer.streamName, conflictDurableName);
|
|
431
|
+
} else {
|
|
432
|
+
this.logger.trace(`Delete conflict consumer`, { conflictDurableName });
|
|
433
|
+
jsm.consumers.delete(relevantConsumer.streamName, conflictDurableName);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
return { lowestLastAckSeq, lowestStartSeq };
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
private async resolveConsumerConflictsWithoutPause(
|
|
441
|
+
jsm: JetStreamManager,
|
|
442
|
+
relevantConsumer: ConsumerInfo,
|
|
443
|
+
conflictOldConsumers: NativeConsumerInfo[],
|
|
444
|
+
relevantConsumerNames: Set<string>,
|
|
445
|
+
): Promise<{ lowestLastAckSeq: number; lowestStartSeq: number | undefined }> {
|
|
446
|
+
let lowestLastAckSeq = Infinity;
|
|
447
|
+
let lowestStartSeq: number | undefined = undefined;
|
|
448
|
+
|
|
449
|
+
for (const oldConsumer of conflictOldConsumers) {
|
|
450
|
+
const conflictDurableName = oldConsumer.config.durable_name!;
|
|
451
|
+
|
|
452
|
+
({ lowestLastAckSeq, lowestStartSeq } = this.getUpdatedMinSeqs(
|
|
453
|
+
oldConsumer,
|
|
454
|
+
lowestLastAckSeq,
|
|
455
|
+
lowestStartSeq,
|
|
456
|
+
));
|
|
457
|
+
|
|
458
|
+
if (!relevantConsumerNames.has(conflictDurableName)) {
|
|
459
|
+
this.logger.trace(`Delete conflict consumer`, { conflictDurableName });
|
|
460
|
+
await jsm.consumers.delete(
|
|
461
|
+
relevantConsumer.streamName,
|
|
462
|
+
conflictDurableName,
|
|
463
|
+
);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
return { lowestLastAckSeq, lowestStartSeq };
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
private getUpdatedMinSeqs(
|
|
471
|
+
oldConsumer: NativeConsumerInfo,
|
|
472
|
+
lowestLastAckSeq: number,
|
|
473
|
+
lowestStartSeq: number | undefined,
|
|
474
|
+
): { lowestLastAckSeq: number; lowestStartSeq: number | undefined } {
|
|
475
|
+
lowestLastAckSeq = Math.min(
|
|
476
|
+
lowestLastAckSeq,
|
|
477
|
+
oldConsumer.ack_floor.stream_seq,
|
|
478
|
+
);
|
|
479
|
+
|
|
480
|
+
const startSeq = oldConsumer.config.opt_start_seq;
|
|
481
|
+
if (startSeq !== undefined) {
|
|
482
|
+
lowestStartSeq = Math.min(lowestStartSeq ?? Infinity, startSeq);
|
|
239
483
|
}
|
|
240
484
|
|
|
241
|
-
return {
|
|
485
|
+
return { lowestLastAckSeq, lowestStartSeq };
|
|
242
486
|
}
|
|
243
487
|
|
|
244
488
|
/**
|
|
@@ -266,8 +510,8 @@ export class NatsJetStreamServer
|
|
|
266
510
|
private async createConsumer(
|
|
267
511
|
js: JetStreamClient,
|
|
268
512
|
consumerName: string,
|
|
269
|
-
{ streamName, mapping }: ConsumerInfo,
|
|
270
|
-
options: Partial<ConsumerConfig
|
|
513
|
+
{ streamName, mapping, maxAckPending }: ConsumerInfo,
|
|
514
|
+
options: Partial<ConsumerConfig> & { filter_subjects: string[] },
|
|
271
515
|
): Promise<void> {
|
|
272
516
|
try {
|
|
273
517
|
await js.streams.get(streamName);
|
|
@@ -280,9 +524,7 @@ export class NatsJetStreamServer
|
|
|
280
524
|
}
|
|
281
525
|
|
|
282
526
|
const jsm = await js.jetstreamManager();
|
|
283
|
-
|
|
284
|
-
this.getEventSubjects(e.deserializer),
|
|
285
|
-
);
|
|
527
|
+
|
|
286
528
|
const ackPolicy = [...mapping.values()][0].deserializer.options?.ackPolicy;
|
|
287
529
|
|
|
288
530
|
const consumer: Consumer =
|
|
@@ -294,9 +536,9 @@ export class NatsJetStreamServer
|
|
|
294
536
|
streamName,
|
|
295
537
|
omitUndefined({
|
|
296
538
|
...options,
|
|
539
|
+
max_ack_pending: maxAckPending,
|
|
297
540
|
ack_policy: ackPolicy,
|
|
298
541
|
durable_name: consumerName,
|
|
299
|
-
filter_subjects: expectedSubjects,
|
|
300
542
|
}),
|
|
301
543
|
)
|
|
302
544
|
.then(() => this.getConsumer(js, streamName, consumerName)));
|
|
@@ -308,7 +550,7 @@ export class NatsJetStreamServer
|
|
|
308
550
|
jsm,
|
|
309
551
|
streamName,
|
|
310
552
|
consumerName,
|
|
311
|
-
|
|
553
|
+
options.filter_subjects,
|
|
312
554
|
receivedSubjects,
|
|
313
555
|
);
|
|
314
556
|
|
|
@@ -417,16 +659,27 @@ export class NatsJetStreamServer
|
|
|
417
659
|
* @returns Имя консьюмера.
|
|
418
660
|
*/
|
|
419
661
|
private getConsumerName(contract: EventTypeWithOptions): string {
|
|
420
|
-
const arr = [
|
|
421
|
-
this.normalizedApplicationName,
|
|
422
|
-
this.getStreamName(contract),
|
|
423
|
-
'consumer',
|
|
424
|
-
];
|
|
662
|
+
const arr: string[] = [];
|
|
425
663
|
|
|
426
664
|
if (contract.options?.consumerName) {
|
|
427
|
-
arr.
|
|
665
|
+
arr.push(contract.options.consumerName);
|
|
428
666
|
}
|
|
429
667
|
|
|
668
|
+
const maxAckPending = `${
|
|
669
|
+
contract.options?.maxAckPending === -1
|
|
670
|
+
? 'infinite'
|
|
671
|
+
: (contract.options?.maxAckPending ?? DEFAULT_MAX_ACK_PENDING)
|
|
672
|
+
}`;
|
|
673
|
+
|
|
674
|
+
arr.push(
|
|
675
|
+
this.normalizedApplicationName,
|
|
676
|
+
this.getStreamName(contract),
|
|
677
|
+
'maxAckPending',
|
|
678
|
+
maxAckPending,
|
|
679
|
+
'ackPolicy',
|
|
680
|
+
contract.options?.ackPolicy ?? AckPolicy.None,
|
|
681
|
+
);
|
|
682
|
+
|
|
430
683
|
return arr.join('-');
|
|
431
684
|
}
|
|
432
685
|
|
|
@@ -436,7 +689,11 @@ export class NatsJetStreamServer
|
|
|
436
689
|
* @returns Темы событий.
|
|
437
690
|
*/
|
|
438
691
|
private getEventSubjects(contract: EventTypeWithOptions): string[] {
|
|
439
|
-
return
|
|
692
|
+
return (
|
|
693
|
+
contract.options?.subjects ?? [
|
|
694
|
+
getSubjectName(contract.type, contract.options?.partition),
|
|
695
|
+
]
|
|
696
|
+
);
|
|
440
697
|
}
|
|
441
698
|
|
|
442
699
|
/**
|
|
@@ -449,4 +706,16 @@ export class NatsJetStreamServer
|
|
|
449
706
|
typeof eventType === 'string' ? eventType : eventType.$type
|
|
450
707
|
).replaceAll('.', '-');
|
|
451
708
|
}
|
|
709
|
+
|
|
710
|
+
private isNatsVersionAtLeast(
|
|
711
|
+
version: string,
|
|
712
|
+
minMajor: number,
|
|
713
|
+
minMinor: number,
|
|
714
|
+
minPatch: number,
|
|
715
|
+
): boolean {
|
|
716
|
+
const [major, minor, patch] = version.split('-')[0].split('.').map(Number);
|
|
717
|
+
if (major !== minMajor) return major > minMajor;
|
|
718
|
+
if (minor !== minMinor) return minor > minMinor;
|
|
719
|
+
return patch >= minPatch;
|
|
720
|
+
}
|
|
452
721
|
}
|