@rsdk/nats.transport 5.4.0-next.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/CHANGELOG.md +10 -0
- package/dist/events.deserializer.d.ts +23 -0
- package/dist/events.deserializer.js +94 -0
- package/dist/events.deserializer.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/metadata.decorator.d.ts +3 -0
- package/dist/metadata.decorator.js +41 -0
- package/dist/metadata.decorator.js.map +1 -0
- package/dist/nats-jetstream-errors.formatter.d.ts +6 -0
- package/dist/nats-jetstream-errors.formatter.js +14 -0
- package/dist/nats-jetstream-errors.formatter.js.map +1 -0
- package/dist/nats-jetstream-transport.module.d.ts +2 -0
- package/dist/nats-jetstream-transport.module.js +17 -0
- package/dist/nats-jetstream-transport.module.js.map +1 -0
- package/dist/nats-jetstream.config.d.ts +5 -0
- package/dist/nats-jetstream.config.js +29 -0
- package/dist/nats-jetstream.config.js.map +1 -0
- package/dist/nats-jetstream.transport.d.ts +20 -0
- package/dist/nats-jetstream.transport.js +73 -0
- package/dist/nats-jetstream.transport.js.map +1 -0
- package/dist/nats.headers.d.ts +10 -0
- package/dist/nats.headers.js +28 -0
- package/dist/nats.headers.js.map +1 -0
- package/dist/payload.decorator.d.ts +8 -0
- package/dist/payload.decorator.js +9 -0
- package/dist/payload.decorator.js.map +1 -0
- package/dist/server.d.ts +136 -0
- package/dist/server.js +365 -0
- package/dist/server.js.map +1 -0
- package/dist/types/consume.options.d.ts +6 -0
- package/dist/types/consume.options.js +3 -0
- package/dist/types/consume.options.js.map +1 -0
- package/dist/types/consumer-info.type.d.ts +5 -0
- package/dist/types/consumer-info.type.js +3 -0
- package/dist/types/consumer-info.type.js.map +1 -0
- package/dist/types/consumers-map.type.d.ts +2 -0
- package/dist/types/consumers-map.type.js +3 -0
- package/dist/types/consumers-map.type.js.map +1 -0
- package/dist/types/event-type-with-options.type.d.ts +6 -0
- package/dist/types/event-type-with-options.type.js +3 -0
- package/dist/types/event-type-with-options.type.js.map +1 -0
- package/dist/types/mapping.type.d.ts +6 -0
- package/dist/types/mapping.type.js +3 -0
- package/dist/types/mapping.type.js.map +1 -0
- package/dist/types/nats-jetstream-transport-options.type.d.ts +2 -0
- package/dist/types/nats-jetstream-transport-options.type.js +3 -0
- package/dist/types/nats-jetstream-transport-options.type.js.map +1 -0
- package/jest.config.js +1 -0
- package/jest.config.unit.js +1 -0
- package/package.json +43 -0
- package/src/events.deserializer.ts +133 -0
- package/src/index.ts +5 -0
- package/src/metadata.decorator.ts +54 -0
- package/src/nats-jetstream-errors.formatter.ts +13 -0
- package/src/nats-jetstream-transport.module.ts +4 -0
- package/src/nats-jetstream.config.ts +14 -0
- package/src/nats-jetstream.transport.ts +94 -0
- package/src/nats.headers.ts +33 -0
- package/src/payload.decorator.ts +17 -0
- package/src/server.ts +491 -0
- package/src/types/consume.options.ts +6 -0
- package/src/types/consumer-info.type.ts +6 -0
- package/src/types/consumers-map.type.ts +3 -0
- package/src/types/event-type-with-options.type.ts +8 -0
- package/src/types/mapping.type.ts +8 -0
- package/src/types/nats-jetstream-transport-options.type.ts +3 -0
- package/tsconfig.build.json +12 -0
- package/tsconfig.json +7 -0
package/dist/server.js
ADDED
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NatsJetStreamServer = void 0;
|
|
4
|
+
const microservices_1 = require("@nestjs/microservices");
|
|
5
|
+
const nestjs_nats_jetstream_transport_1 = require("@nestjs-plugins/nestjs-nats-jetstream-transport");
|
|
6
|
+
const core_1 = require("@rsdk/core");
|
|
7
|
+
const events_common_1 = require("@rsdk/events.common");
|
|
8
|
+
const logging_1 = require("@rsdk/logging");
|
|
9
|
+
const nats_common_1 = require("@rsdk/nats.common");
|
|
10
|
+
const lodash_1 = require("lodash");
|
|
11
|
+
const nats_1 = require("nats");
|
|
12
|
+
const rxjs_1 = require("rxjs");
|
|
13
|
+
const events_deserializer_1 = require("./events.deserializer");
|
|
14
|
+
/**
|
|
15
|
+
* Класс, реализующий сервер NATS JetStream.
|
|
16
|
+
*/
|
|
17
|
+
class NatsJetStreamServer extends microservices_1.Server {
|
|
18
|
+
options;
|
|
19
|
+
config;
|
|
20
|
+
transportId = nestjs_nats_jetstream_transport_1.NATS_JETSTREAM_TRANSPORT;
|
|
21
|
+
logger = logging_1.LoggerFactory.create('NatsJetStreamServer');
|
|
22
|
+
deserializer = new events_deserializer_1.EventsDeserializer();
|
|
23
|
+
nc;
|
|
24
|
+
jsm;
|
|
25
|
+
streams = new Set();
|
|
26
|
+
normalizedApplicationName;
|
|
27
|
+
autoUpdateConsumers;
|
|
28
|
+
/**
|
|
29
|
+
* Конструктор класса NatsJetStreamServer.
|
|
30
|
+
* @param options - Опции для подключения к NATS JetStream.
|
|
31
|
+
* @param config - Конфигурация приложения.
|
|
32
|
+
*/
|
|
33
|
+
constructor(options, config) {
|
|
34
|
+
super();
|
|
35
|
+
this.options = options;
|
|
36
|
+
this.config = config;
|
|
37
|
+
this.normalizedApplicationName = config.appName.replaceAll('.', '-');
|
|
38
|
+
this.autoUpdateConsumers = Boolean(config.autoUpdateConsumers);
|
|
39
|
+
}
|
|
40
|
+
static isNatsContext(maybeNatsContext) {
|
|
41
|
+
return maybeNatsContext instanceof nestjs_nats_jetstream_transport_1.NatsJetStreamContext;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Запускает сервер и устанавливает соединение.
|
|
45
|
+
* @param callback - Функция обратного вызова для выполнения после подключения.
|
|
46
|
+
*/
|
|
47
|
+
async listen(callback) {
|
|
48
|
+
if (!this.nc) {
|
|
49
|
+
this.nc = await (0, nats_1.connect)(this.options.connectionOptions);
|
|
50
|
+
this.options.connectionOptions.connectedHook?.(this.nc);
|
|
51
|
+
}
|
|
52
|
+
this.jsm = await this.nc.jetstreamManager(this.options.jetStreamOptions);
|
|
53
|
+
await this.bindEventHandlers();
|
|
54
|
+
this.bindMessageHandlers();
|
|
55
|
+
callback();
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Закрывает соединение с сервером.
|
|
59
|
+
*/
|
|
60
|
+
async close() {
|
|
61
|
+
await this.nc?.drain();
|
|
62
|
+
delete this.nc;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Добавляет обработчик сообщения.
|
|
66
|
+
* @param pattern Шаблон для сообщения.
|
|
67
|
+
* @param callback Функция-обработчик сообщения.
|
|
68
|
+
* @param isEventHandler Указывает, является ли обработчик обработчиком событий.
|
|
69
|
+
* @param extras Дополнительные параметры.
|
|
70
|
+
*/
|
|
71
|
+
addHandler(pattern, callback, isEventHandler = false, extras = {}) {
|
|
72
|
+
const eventType = this.getEventType(pattern);
|
|
73
|
+
let formattedPattern;
|
|
74
|
+
if ((0, events_common_1.isEventType)(eventType)) {
|
|
75
|
+
this.streams.add(this.getStreamName(pattern));
|
|
76
|
+
formattedPattern = eventType.$type;
|
|
77
|
+
this.deserializer.events.set(formattedPattern, pattern);
|
|
78
|
+
}
|
|
79
|
+
else if (typeof eventType === 'string') {
|
|
80
|
+
formattedPattern = eventType;
|
|
81
|
+
this.streams.add(eventType);
|
|
82
|
+
}
|
|
83
|
+
super.addHandler(formattedPattern, callback, isEventHandler, extras);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Получает тип события из шаблона.
|
|
87
|
+
* @param pattern - Шаблон для получения типа события.
|
|
88
|
+
* @returns Тип события.
|
|
89
|
+
*/
|
|
90
|
+
getEventType(pattern) {
|
|
91
|
+
return typeof pattern === 'object' && 'eventType' in pattern
|
|
92
|
+
? pattern.eventType
|
|
93
|
+
: pattern;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Связывает обработчики событий.
|
|
97
|
+
*/
|
|
98
|
+
async bindEventHandlers() {
|
|
99
|
+
const eventHandlers = [...this.messageHandlers.entries()].filter(([, handler]) => handler.isEventHandler);
|
|
100
|
+
if (!this.nc) {
|
|
101
|
+
throw new core_1.InternalException('Connection must be established');
|
|
102
|
+
}
|
|
103
|
+
const js = this.nc.jetstream(this.options.jetStreamOptions);
|
|
104
|
+
const { orderedConsumers, unorderedConsumers } = this.groupHandlersByOrderType(eventHandlers);
|
|
105
|
+
for (const [consumerName, consumer] of orderedConsumers) {
|
|
106
|
+
await this.createConsumer(js, consumerName, consumer, {
|
|
107
|
+
max_ack_pending: 1,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
for (const [consumerName, consumer] of unorderedConsumers) {
|
|
111
|
+
await this.createConsumer(js, consumerName, consumer, {});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Группирует обработчики по типу порядка (зависимые и независимые от порядка).
|
|
116
|
+
*
|
|
117
|
+
* @param {Array<[string, MessageHandler<any, any, any>]>} eventHandlers - Список обработчиков событий,
|
|
118
|
+
* где каждый элемент представляет собой кортеж из метаданных и обработчика.
|
|
119
|
+
*
|
|
120
|
+
* @returns {{
|
|
121
|
+
* orderedConsumers: ConsumersMap,
|
|
122
|
+
* unorderedConsumers: ConsumersMap
|
|
123
|
+
* }}
|
|
124
|
+
* Объект, содержащий две карты:
|
|
125
|
+
* - orderedConsumers: карта с зависимыми от порядка consumer'ами.
|
|
126
|
+
* - unorderedConsumers: карта с независимыми от порядка consumer'ами.
|
|
127
|
+
*/
|
|
128
|
+
groupHandlersByOrderType(eventHandlers) {
|
|
129
|
+
const orderedConsumers = new Map();
|
|
130
|
+
const unorderedConsumers = new Map();
|
|
131
|
+
for (const [meta, handler] of eventHandlers) {
|
|
132
|
+
const deserializer = this.deserializer.events.get(meta);
|
|
133
|
+
const consumerName = this.getConsumerName(deserializer);
|
|
134
|
+
const streamName = this.getStreamName(deserializer);
|
|
135
|
+
const targetMap = deserializer.options?.maxAckPending
|
|
136
|
+
? orderedConsumers
|
|
137
|
+
: unorderedConsumers;
|
|
138
|
+
const aggregatedConsumer = targetMap.get(consumerName) ?? {
|
|
139
|
+
streamName,
|
|
140
|
+
mapping: new Map(),
|
|
141
|
+
};
|
|
142
|
+
aggregatedConsumer.mapping.set(this.getTypePart(deserializer.eventType), {
|
|
143
|
+
deserializer,
|
|
144
|
+
handler,
|
|
145
|
+
});
|
|
146
|
+
targetMap.set(consumerName, aggregatedConsumer);
|
|
147
|
+
}
|
|
148
|
+
return { orderedConsumers, unorderedConsumers };
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Получает информацию о консьюмере.
|
|
152
|
+
* @param js - Клиент JetStream.
|
|
153
|
+
* @param streamName - Имя потока.
|
|
154
|
+
* @param consumerName - Имя консьюмера.
|
|
155
|
+
* @returns Информация о консьюмере.
|
|
156
|
+
*/
|
|
157
|
+
async getConsumer(js, streamName, consumerName) {
|
|
158
|
+
return js.consumers.get(streamName, consumerName);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Создаёт консьюмера для заданного потока.
|
|
162
|
+
* @param js - Клиент JetStream.
|
|
163
|
+
* @param consumerName - Имя консьюмера.
|
|
164
|
+
* @param consumer - Информация о консьюмере.
|
|
165
|
+
* @param options - Дополнительные параметры конфигурации консьюмера.
|
|
166
|
+
*/
|
|
167
|
+
async createConsumer(js, consumerName, { streamName, mapping }, options) {
|
|
168
|
+
try {
|
|
169
|
+
await js.streams.get(streamName);
|
|
170
|
+
this.logger.trace('Stream %s found', { streamName });
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
this.logger.error('Stream %s not found', { streamName });
|
|
174
|
+
throw new core_1.InternalException(`Stream not found: ${streamName}`, {
|
|
175
|
+
cause: error,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
const jsm = await js.jetstreamManager();
|
|
179
|
+
const expectedSubjects = [...mapping.values()].flatMap((e) => this.getEventSubjects(e.deserializer));
|
|
180
|
+
const consumer = (await this.getConsumer(js, streamName, consumerName).catch(() => null)) ??
|
|
181
|
+
(await jsm.consumers
|
|
182
|
+
.add(streamName, {
|
|
183
|
+
...options,
|
|
184
|
+
durable_name: consumerName,
|
|
185
|
+
filter_subjects: expectedSubjects,
|
|
186
|
+
})
|
|
187
|
+
.then(() => this.getConsumer(js, streamName, consumerName)));
|
|
188
|
+
const info = await consumer.info();
|
|
189
|
+
const receivedSubjects = info.config.filter_subjects;
|
|
190
|
+
await this.handleCorrectness(jsm, streamName, consumerName, expectedSubjects, receivedSubjects);
|
|
191
|
+
this.handleMessages(consumer, mapping, consumerName);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Обрабатывает сообщения из консьюмера.
|
|
195
|
+
* @param consumer - Консьюмер для обработки сообщений.
|
|
196
|
+
* @param mapping - Соответствия между типами сообщений и обработчиками.
|
|
197
|
+
* @param consumerName - Имя консьюмера.
|
|
198
|
+
*/
|
|
199
|
+
async handleMessages(consumer, mapping, consumerName) {
|
|
200
|
+
const msgs = await consumer.consume();
|
|
201
|
+
/**
|
|
202
|
+
* Слушаем все сообщения консьюмера
|
|
203
|
+
* @type {Promise<void>}
|
|
204
|
+
*/
|
|
205
|
+
const done = (async () => {
|
|
206
|
+
for await (const msg of msgs) {
|
|
207
|
+
try {
|
|
208
|
+
const data = this.deserializer.deserialize(msg);
|
|
209
|
+
const context = new nestjs_nats_jetstream_transport_1.NatsJetStreamContext([msg]);
|
|
210
|
+
const contract = mapping.get(this.getTypePart(data.pattern));
|
|
211
|
+
if (!contract) {
|
|
212
|
+
throw new core_1.NotFoundException(`Unknown ${events_common_1.X_TYPE_HEADER} header`);
|
|
213
|
+
}
|
|
214
|
+
const resultOrStream = await contract.handler(data, context);
|
|
215
|
+
if ((0, rxjs_1.isObservable)(resultOrStream)) {
|
|
216
|
+
const connectableSource = (0, rxjs_1.connectable)(resultOrStream, {
|
|
217
|
+
connector: () => new rxjs_1.Subject(),
|
|
218
|
+
resetOnDisconnect: false,
|
|
219
|
+
});
|
|
220
|
+
connectableSource.connect();
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
this.logger.error(error.message, error.stack);
|
|
225
|
+
// specifies that you failed to process the server and instructs
|
|
226
|
+
// the server to not send it again (to any consumer)
|
|
227
|
+
msg.term();
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Потенциально мы можем сюда придти если в одном консюьмере несколько сервисов
|
|
232
|
+
* Это не совсем корректное поведение потому что неясно есть ли такой обработчик, а мы можем встрять и ни разу не двинуть оффсет
|
|
233
|
+
*/
|
|
234
|
+
msg.nak();
|
|
235
|
+
this.logger.warn('Unhandled message: ', { msg });
|
|
236
|
+
}
|
|
237
|
+
})();
|
|
238
|
+
done.then(() => {
|
|
239
|
+
if (this.nc?.isDraining() || this.nc?.isClosed()) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
this.logger.debug(`Unsubscribed ${consumerName}`);
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Проверяет корректность подписки консьюмера.
|
|
247
|
+
* @param jsm - Менеджер JetStream.
|
|
248
|
+
* @param streamName - Имя потока.
|
|
249
|
+
* @param consumerName - Имя консьюмера.
|
|
250
|
+
* @param expectedSubjects - Ожидаемые темы.
|
|
251
|
+
* @param receivedSubjects - Полученные темы.
|
|
252
|
+
*/
|
|
253
|
+
async handleCorrectness(jsm, streamName, consumerName, expectedSubjects, receivedSubjects) {
|
|
254
|
+
if ((0, lodash_1.isEqual)(receivedSubjects, expectedSubjects)) {
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
if (!this.autoUpdateConsumers) {
|
|
258
|
+
throw new core_1.InternalException('Incorrect subjects', {
|
|
259
|
+
cause: {
|
|
260
|
+
expectedSubjects,
|
|
261
|
+
receivedSubjects,
|
|
262
|
+
},
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
await jsm.consumers.update(streamName, consumerName, {
|
|
266
|
+
filter_subjects: expectedSubjects,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Связывает обработчики сообщений.
|
|
271
|
+
*/
|
|
272
|
+
bindMessageHandlers() {
|
|
273
|
+
const messageHandlers = [...this.messageHandlers.entries()].filter(([, handler]) => !handler.isEventHandler);
|
|
274
|
+
for (const [subject, messageHandler] of messageHandlers) {
|
|
275
|
+
const subscriptionOptions = {
|
|
276
|
+
callback: async (err, msg) => {
|
|
277
|
+
if (err) {
|
|
278
|
+
this.logger.error(err.message, err);
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
const payload = this.deserializer.deserialize(msg);
|
|
282
|
+
const context = new nestjs_nats_jetstream_transport_1.NatsContext([msg]);
|
|
283
|
+
const response$ = this.transformToObservable(messageHandler(payload.data, context));
|
|
284
|
+
this.send(response$, (response) => msg.respond(response));
|
|
285
|
+
},
|
|
286
|
+
};
|
|
287
|
+
this.nc?.subscribe(subject, subscriptionOptions);
|
|
288
|
+
this.logger.debug(`Subscribed to ${subject} messages`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Настраивает поток для сервера.
|
|
293
|
+
*/
|
|
294
|
+
async setupStream() {
|
|
295
|
+
const { streamConfig } = this.options;
|
|
296
|
+
const streams = await this.jsm?.streams.list().next();
|
|
297
|
+
const reqStreamConfigs = Array.isArray(streamConfig)
|
|
298
|
+
? streamConfig
|
|
299
|
+
: [streamConfig];
|
|
300
|
+
for (const requiredStreamConfig of reqStreamConfigs) {
|
|
301
|
+
if (!requiredStreamConfig) {
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
const stream = streams?.find((stream) => stream.config.name === requiredStreamConfig?.name);
|
|
305
|
+
if (stream) {
|
|
306
|
+
const streamSubjects = new Set([
|
|
307
|
+
...stream.config.subjects,
|
|
308
|
+
...(requiredStreamConfig?.subjects ?? []),
|
|
309
|
+
]);
|
|
310
|
+
const streamInfo = await this.jsm?.streams.update(stream.config.name, {
|
|
311
|
+
...stream.config,
|
|
312
|
+
...requiredStreamConfig,
|
|
313
|
+
subjects: [...streamSubjects.keys()],
|
|
314
|
+
});
|
|
315
|
+
this.logger.info(`Stream ${streamInfo?.config.name} updated`);
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
const streamInfo = await this.jsm?.streams.add(requiredStreamConfig);
|
|
319
|
+
this.logger.info(`Stream ${streamInfo?.config.name} created`);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Получает имя потока для десериализатора.
|
|
325
|
+
* @param contract - Десериализатор событий.
|
|
326
|
+
* @returns Имя потока.
|
|
327
|
+
*/
|
|
328
|
+
getStreamName(contract) {
|
|
329
|
+
return contract.options?.streamName ?? (0, nats_common_1.getStreamName)(contract.eventType);
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Получает имя консьюмера по десериализатору.
|
|
333
|
+
* @param contract - Десериализатор событий.
|
|
334
|
+
* @returns Имя консьюмера.
|
|
335
|
+
*/
|
|
336
|
+
getConsumerName(contract) {
|
|
337
|
+
const arr = [
|
|
338
|
+
this.normalizedApplicationName,
|
|
339
|
+
this.getStreamName(contract),
|
|
340
|
+
'consumer',
|
|
341
|
+
];
|
|
342
|
+
if (contract.options?.consumerName) {
|
|
343
|
+
arr.unshift(contract.options.consumerName);
|
|
344
|
+
}
|
|
345
|
+
return arr.join('-');
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Получает темы событий для десериализатора.
|
|
349
|
+
* @param contract - Десериализатор событий.
|
|
350
|
+
* @returns Темы событий.
|
|
351
|
+
*/
|
|
352
|
+
getEventSubjects(contract) {
|
|
353
|
+
return contract.options?.subjects ?? [];
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Получает часть типа события.
|
|
357
|
+
* @param eventType - Тип события.
|
|
358
|
+
* @returns Часть типа.
|
|
359
|
+
*/
|
|
360
|
+
getTypePart(eventType) {
|
|
361
|
+
return (typeof eventType === 'string' ? eventType : eventType.$type).replaceAll('.', '-');
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
exports.NatsJetStreamServer = NatsJetStreamServer;
|
|
365
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consume.options.js","sourceRoot":"","sources":["../../src/types/consume.options.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consumer-info.type.js","sourceRoot":"","sources":["../../src/types/consumer-info.type.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consumers-map.type.js","sourceRoot":"","sources":["../../src/types/consumers-map.type.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-type-with-options.type.js","sourceRoot":"","sources":["../../src/types/event-type-with-options.type.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapping.type.js","sourceRoot":"","sources":["../../src/types/mapping.type.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nats-jetstream-transport-options.type.js","sourceRoot":"","sources":["../../src/types/nats-jetstream-transport-options.type.ts"],"names":[],"mappings":""}
|
package/jest.config.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require('@rsdk/jest/jest.config');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require('@rsdk/jest/jest.config.unit');
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@rsdk/nats.transport",
|
|
3
|
+
"version": "5.4.0-next.2",
|
|
4
|
+
"description": "Nats NestJS Transport",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"license": "Apache License 2.0",
|
|
7
|
+
"publishConfig": {
|
|
8
|
+
"access": "public"
|
|
9
|
+
},
|
|
10
|
+
"repository": {
|
|
11
|
+
"url": "https://github.com/R-Vision/rsdk"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@nestjs-plugins/nestjs-nats-jetstream-transport": "^2.2.6",
|
|
15
|
+
"lodash": "^4.17.21",
|
|
16
|
+
"nats": "^2.28.0",
|
|
17
|
+
"typescript": "^5.3.2"
|
|
18
|
+
},
|
|
19
|
+
"peerDependencies": {
|
|
20
|
+
"@grpc/grpc-js": "^1.10.9",
|
|
21
|
+
"@nestjs/common": "^10.0.0",
|
|
22
|
+
"@nestjs/config": "^3.2.3",
|
|
23
|
+
"@nestjs/core": "^10.0.0",
|
|
24
|
+
"@nestjs/microservices": "^10.0.0",
|
|
25
|
+
"@opentelemetry/api": "1.9.0",
|
|
26
|
+
"@rsdk/actx": "*",
|
|
27
|
+
"@rsdk/autodoc.protocol": "*",
|
|
28
|
+
"@rsdk/common": "*",
|
|
29
|
+
"@rsdk/common.nestjs": "*",
|
|
30
|
+
"@rsdk/common.node": "*",
|
|
31
|
+
"@rsdk/core": "*",
|
|
32
|
+
"@rsdk/decorators": "*",
|
|
33
|
+
"@rsdk/events.common": "*",
|
|
34
|
+
"@rsdk/logging": "*",
|
|
35
|
+
"@rsdk/metadata": "*",
|
|
36
|
+
"@rsdk/nats.common": "*",
|
|
37
|
+
"@rsdk/nest-tools": "*",
|
|
38
|
+
"reflect-metadata": "^0.1.12 || ^0.2.0",
|
|
39
|
+
"rxjs": "^7.8.1"
|
|
40
|
+
},
|
|
41
|
+
"nx": {},
|
|
42
|
+
"gitHead": "be4deac03b38b3f923a08116e1dc2b55838905b0"
|
|
43
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import type { IncomingEvent, IncomingRequest } from '@nestjs/microservices';
|
|
2
|
+
import { IncomingRequestDeserializer } from '@nestjs/microservices/deserializers';
|
|
3
|
+
import { InputException } from '@rsdk/core';
|
|
4
|
+
import {
|
|
5
|
+
assertIsPayloadFormat,
|
|
6
|
+
DEFAULT_PAYLOAD_FORMAT,
|
|
7
|
+
JSONEventCodec,
|
|
8
|
+
PayloadFormat,
|
|
9
|
+
ProtoEventCodec,
|
|
10
|
+
X_FORMAT_HEADER,
|
|
11
|
+
X_TYPE_HEADER,
|
|
12
|
+
} from '@rsdk/events.common';
|
|
13
|
+
import { LoggerFactory } from '@rsdk/logging';
|
|
14
|
+
import type { JsMsg } from 'nats';
|
|
15
|
+
|
|
16
|
+
import type { EventTypeWithOptions } from './types/event-type-with-options.type';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* This is a custom deserializer for a Nats request.
|
|
20
|
+
* From Nats comes a buffer, which can be either a proto-buffer or just a string.
|
|
21
|
+
* The string can be a JSON value.
|
|
22
|
+
* It is necessary to take into account all the options and parse the incoming data,
|
|
23
|
+
* or return everything to the user as it is without throwing an error
|
|
24
|
+
*/
|
|
25
|
+
export class EventsDeserializer extends IncomingRequestDeserializer {
|
|
26
|
+
static logger = LoggerFactory.create(EventsDeserializer);
|
|
27
|
+
|
|
28
|
+
events: Map<string, EventTypeWithOptions> = new Map();
|
|
29
|
+
|
|
30
|
+
override deserialize(
|
|
31
|
+
value: any,
|
|
32
|
+
options?: Record<string, any>,
|
|
33
|
+
): IncomingRequest | IncomingEvent {
|
|
34
|
+
return this.mapToSchema(value, options);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
override mapToSchema(
|
|
38
|
+
message: JsMsg,
|
|
39
|
+
options?: Record<string, any>,
|
|
40
|
+
): IncomingRequest | IncomingEvent {
|
|
41
|
+
try {
|
|
42
|
+
return this.tryParseValue(message);
|
|
43
|
+
} catch (error) {
|
|
44
|
+
const value = message?.data ?? message;
|
|
45
|
+
|
|
46
|
+
// todo: если произойдет ошибка некая, то мы эту ошибку не получим на отправляющей стороне и в приложении кроме лога ничего не будет видно, эту ошибку никто не обрабатывает
|
|
47
|
+
// нужно потом найти способ чтобы ошибку эту можно было перехватить, на текущий момент просто возвращаем значение, иначе если выпасть с ошибкой эти евенты продолжат висеть в Nats
|
|
48
|
+
EventsDeserializer.logger.warn(
|
|
49
|
+
`Error in "mapToSchema": ${error}, the original value was used: ${JSON.stringify(
|
|
50
|
+
value,
|
|
51
|
+
)}, options: ${JSON.stringify(options)}`,
|
|
52
|
+
{
|
|
53
|
+
error,
|
|
54
|
+
},
|
|
55
|
+
);
|
|
56
|
+
return {
|
|
57
|
+
data: value,
|
|
58
|
+
pattern: undefined,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Try to parse the incoming value. If an error, return the value as is.
|
|
65
|
+
* @param message nats message
|
|
66
|
+
* @returns parsed or original value
|
|
67
|
+
*/
|
|
68
|
+
private tryParseValue(message: JsMsg): IncomingRequest | IncomingEvent {
|
|
69
|
+
const value = message.data ?? message;
|
|
70
|
+
|
|
71
|
+
if (!value) {
|
|
72
|
+
EventsDeserializer.logger.warn('Received empty value', {
|
|
73
|
+
data: message,
|
|
74
|
+
value,
|
|
75
|
+
});
|
|
76
|
+
return value;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const xFormatType =
|
|
80
|
+
message.headers?.get(X_FORMAT_HEADER) || DEFAULT_PAYLOAD_FORMAT;
|
|
81
|
+
|
|
82
|
+
assertIsPayloadFormat(xFormatType);
|
|
83
|
+
|
|
84
|
+
const type = message.headers?.get(X_TYPE_HEADER);
|
|
85
|
+
const eventType = type && this.events.get(type);
|
|
86
|
+
|
|
87
|
+
if (type && !eventType) {
|
|
88
|
+
EventsDeserializer.logger.warn(
|
|
89
|
+
'headers.type was found, but eventType by value not found, used JSONCodec',
|
|
90
|
+
{
|
|
91
|
+
headers: message.headers,
|
|
92
|
+
eventTypes: [...this.events.keys()],
|
|
93
|
+
},
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const payloadIsJson = xFormatType === PayloadFormat.JSON;
|
|
98
|
+
if (!payloadIsJson && !eventType) {
|
|
99
|
+
throw new InputException('Event type by headers type value not found', {
|
|
100
|
+
details: {
|
|
101
|
+
data: message,
|
|
102
|
+
eventType,
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const codec = payloadIsJson
|
|
108
|
+
? new JSONEventCodec<any>()
|
|
109
|
+
: new ProtoEventCodec(
|
|
110
|
+
(eventType as EventTypeWithOptions | undefined)?.eventType as any,
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
try {
|
|
114
|
+
return {
|
|
115
|
+
data: codec.decode(value as Buffer),
|
|
116
|
+
pattern: (eventType as EventTypeWithOptions | undefined)?.eventType,
|
|
117
|
+
};
|
|
118
|
+
} catch (error) {
|
|
119
|
+
EventsDeserializer.logger.warn(
|
|
120
|
+
`Received data in the wrong format, return raw value`,
|
|
121
|
+
{
|
|
122
|
+
data: message,
|
|
123
|
+
error,
|
|
124
|
+
eventType,
|
|
125
|
+
},
|
|
126
|
+
);
|
|
127
|
+
return {
|
|
128
|
+
data: value,
|
|
129
|
+
pattern: eventType,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|