@nitra/nats 3.1.1 → 3.1.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/package.json +3 -4
- package/src/consumer.js +4 -3
- package/src/nats.js +4 -3
- package/src/pending-count.js +2 -1
- package/src/publish.js +2 -1
- package/src/stream.js +3 -2
- package/src/worker.js +5 -3
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nitra/nats",
|
|
3
3
|
"description": "nats helper",
|
|
4
|
-
"version": "3.1.
|
|
4
|
+
"version": "3.1.2",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
7
7
|
"src"
|
|
@@ -21,9 +21,8 @@
|
|
|
21
21
|
"homepage": "https://github.com/nitra/nats",
|
|
22
22
|
"license": "MIT",
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@nitra/check-env": "^
|
|
25
|
-
"@nitra/
|
|
26
|
-
"@nitra/pino": "^1.7.1",
|
|
24
|
+
"@nitra/check-env": "^4.0.0",
|
|
25
|
+
"@nitra/pino": "^2.3.0",
|
|
27
26
|
"nats": "^2.29.3"
|
|
28
27
|
},
|
|
29
28
|
"engines": {
|
package/src/consumer.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsm, AckPolicy, stream } from './nats.js'
|
|
2
2
|
import { checkSubjectFormat } from './utils.js'
|
|
3
|
+
import log from '@nitra/pino'
|
|
3
4
|
// import { ensureStream } from './stream.js'
|
|
4
5
|
|
|
5
6
|
// Set для зберігання існуючих consumer
|
|
@@ -13,7 +14,7 @@ const consumerReady = new Set()
|
|
|
13
14
|
*/
|
|
14
15
|
export async function ensureConsumer(subject, consumers = [{ durableName: subject, filterSubjects: [subject] }]) {
|
|
15
16
|
if (consumers.every(c => consumerReady.has(c.durableName))) {
|
|
16
|
-
|
|
17
|
+
log.debug(`✅ Consumers: ${consumers.map(c => c.durableName)} already exists`)
|
|
17
18
|
return
|
|
18
19
|
}
|
|
19
20
|
|
|
@@ -31,7 +32,7 @@ export async function ensureConsumer(subject, consumers = [{ durableName: subjec
|
|
|
31
32
|
|
|
32
33
|
// якщо не існує consumer-а який слухає subject, то створюємо за замовчуванням (durable_name = subject)
|
|
33
34
|
if (isExists) {
|
|
34
|
-
|
|
35
|
+
log.debug(`✅ Consumer «${c.durableName}» already exists`)
|
|
35
36
|
} else {
|
|
36
37
|
await jsm.consumers.add(stream, {
|
|
37
38
|
durable_name: c.durableName,
|
|
@@ -40,7 +41,7 @@ export async function ensureConsumer(subject, consumers = [{ durableName: subjec
|
|
|
40
41
|
deliver_policy: 'all' // 'all' - всі непрочитані повідомлення
|
|
41
42
|
})
|
|
42
43
|
|
|
43
|
-
|
|
44
|
+
log.debug(`🔥 Consumer «${c.durableName}» created`)
|
|
44
45
|
}
|
|
45
46
|
|
|
46
47
|
consumerReady.add(c.durableName)
|
package/src/nats.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { checkEnv, env } from '@nitra/check-env'
|
|
2
2
|
import { connect, JSONCodec } from 'nats'
|
|
3
|
+
|
|
4
|
+
checkEnv(['NATS_URL', 'NATS_STREAM'])
|
|
5
|
+
|
|
3
6
|
// AckPolicy
|
|
4
7
|
export { AckPolicy } from 'nats'
|
|
5
8
|
|
|
6
|
-
checkEnv(['NATS_URL'])
|
|
7
|
-
|
|
8
9
|
// Connect to NATS
|
|
9
10
|
const nc = await connect({ servers: env.NATS_URL })
|
|
10
11
|
|
|
@@ -18,4 +19,4 @@ export const js = nc.jetstream()
|
|
|
18
19
|
export const jsm = await nc.jetstreamManager()
|
|
19
20
|
|
|
20
21
|
// Stream name
|
|
21
|
-
export const stream =
|
|
22
|
+
export const stream = env.NATS_STREAM
|
package/src/pending-count.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsm, stream } from './nats.js'
|
|
2
|
+
import log from '@nitra/pino'
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Повертає кількість непрочитаних (pending) повідомлень для durable consumer.
|
|
@@ -10,7 +11,7 @@ export async function getPendingCount(consumer) {
|
|
|
10
11
|
const info = await jsm.consumers.info(stream, consumer)
|
|
11
12
|
return info.num_pending + info.num_ack_pending
|
|
12
13
|
} catch {
|
|
13
|
-
|
|
14
|
+
log.error(`consumer ${consumer} not found`)
|
|
14
15
|
return 0
|
|
15
16
|
}
|
|
16
17
|
}
|
package/src/publish.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jc, js, stream } from './nats.js'
|
|
2
2
|
import { ensureConsumer } from './consumer.js'
|
|
3
|
+
import log from '@nitra/pino'
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Публікує повідомлення у JetStream для вказаного subject.
|
|
@@ -13,7 +14,7 @@ export async function publish(subject, data, consumers) {
|
|
|
13
14
|
// Ensure consumer if not exists
|
|
14
15
|
await ensureConsumer(subject, consumers)
|
|
15
16
|
|
|
16
|
-
|
|
17
|
+
log.debug('publish:', data)
|
|
17
18
|
// Publish message
|
|
18
19
|
return js.publish(`${stream}.${subject}`, jc.encode(data))
|
|
19
20
|
}
|
package/src/stream.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsm, stream } from './nats.js'
|
|
2
|
+
import log from '@nitra/pino'
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Перевіряє наявність або створює JetStream stream.
|
|
@@ -7,7 +8,7 @@ import { jsm, stream } from './nats.js'
|
|
|
7
8
|
export async function ensureStream() {
|
|
8
9
|
try {
|
|
9
10
|
await jsm.streams.info(stream)
|
|
10
|
-
|
|
11
|
+
log.debug('✅ Stream already exists')
|
|
11
12
|
} catch {
|
|
12
13
|
await jsm.streams.add({
|
|
13
14
|
name: stream,
|
|
@@ -16,6 +17,6 @@ export async function ensureStream() {
|
|
|
16
17
|
replicas: 1, // кількість реплік у кластері TODO: проговорити кількість реплік
|
|
17
18
|
storage: 'file' //'memory' TODO: проговорити які параметри потрібні для кластера
|
|
18
19
|
})
|
|
19
|
-
|
|
20
|
+
log.debug('✅ Stream created')
|
|
20
21
|
}
|
|
21
22
|
}
|
package/src/worker.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { js, jc, stream } from './nats.js'
|
|
2
2
|
import { state } from './utils.js'
|
|
3
|
+
import { exit } from 'node:process'
|
|
4
|
+
import log from '@nitra/pino'
|
|
3
5
|
|
|
4
6
|
/**
|
|
5
7
|
* Зчитує одне повідомлення з JetStream для вказаного consumer-а.
|
|
@@ -12,7 +14,7 @@ export async function read(consumer) {
|
|
|
12
14
|
const iter = await consumerObj.fetch({ max_messages: 1, expires: 1000 })
|
|
13
15
|
for await (const msg of iter) {
|
|
14
16
|
state.msg = msg
|
|
15
|
-
|
|
17
|
+
log.debug('read msg', jc.decode(msg.data))
|
|
16
18
|
|
|
17
19
|
// Реєструємо хук на завершення процесу. якщо не підтвердили повідомлення або помилка - відправляємо повідомлення назад в чергу
|
|
18
20
|
for (const signal of ['exit', 'SIGINT', 'uncaughtException', 'unhandledRejection']) {
|
|
@@ -22,6 +24,6 @@ export async function read(consumer) {
|
|
|
22
24
|
return jc.decode(msg.data)
|
|
23
25
|
}
|
|
24
26
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
+
log.info(`${consumer} - no msg...`)
|
|
28
|
+
exit(0) // якщо не було жодного повідомлення
|
|
27
29
|
}
|