@nitra/nats 3.0.4 → 3.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -7
- package/package.json +1 -1
- package/src/consumer.js +5 -0
- package/src/pending-count.js +4 -9
- package/src/publish.js +9 -7
- package/src/stream.js +0 -3
- package/src/worker.js +9 -7
package/README.md
CHANGED
|
@@ -48,7 +48,7 @@ import { publish } from '@nitra/nats'
|
|
|
48
48
|
await publish('project:subject', { id: 1, foo: 'bar' })
|
|
49
49
|
```
|
|
50
50
|
|
|
51
|
-
- Stream
|
|
51
|
+
- Stream і Consumer будуть створені автоматично, якщо не існують.
|
|
52
52
|
- Повідомлення публікується у subject `stream.project:subject`.
|
|
53
53
|
|
|
54
54
|
---
|
|
@@ -64,7 +64,6 @@ await finish() // підтвердження (ack) повідомлення
|
|
|
64
64
|
```
|
|
65
65
|
|
|
66
66
|
- Якщо не викликати `finish()`, повідомлення буде повернуто у чергу (`nak`) при завершенні процесу або помилці.
|
|
67
|
-
- Stream і consumer створюються автоматично при першому запуску воркера для кожного subject.
|
|
68
67
|
|
|
69
68
|
---
|
|
70
69
|
|
|
@@ -77,20 +76,17 @@ const count = await getPendingCount('project:subject')
|
|
|
77
76
|
console.log('pending:', count)
|
|
78
77
|
```
|
|
79
78
|
|
|
80
|
-
- Якщо consumer для subject ще не існує, він буде створений автоматично.
|
|
81
|
-
|
|
82
79
|
---
|
|
83
80
|
|
|
84
81
|
## Як це працює
|
|
85
82
|
|
|
86
83
|
- **publish(subject, data):**
|
|
87
84
|
|
|
88
|
-
- Перевіряє/створює stream (один раз за процес).
|
|
85
|
+
- Перевіряє/створює stream і consumer для subject (один раз за процес).
|
|
89
86
|
- Публікує повідомлення у subject `stream.${subject}`.
|
|
90
87
|
|
|
91
88
|
- **read(subject):**
|
|
92
89
|
|
|
93
|
-
- Перевіряє/створює stream і consumer для subject (один раз за процес).
|
|
94
90
|
- Читає одне повідомлення з черги для subject.
|
|
95
91
|
|
|
96
92
|
- **finish():**
|
|
@@ -98,7 +94,7 @@ console.log('pending:', count)
|
|
|
98
94
|
- Підтверджує (ack) повідомлення.
|
|
99
95
|
|
|
100
96
|
- **getPendingCount(subject):**
|
|
101
|
-
- Повертає кількість непрочитаних повідомлень для consumer `durable_${subject}
|
|
97
|
+
- Повертає кількість непрочитаних повідомлень для consumer `durable_${subject}`.
|
|
102
98
|
|
|
103
99
|
---
|
|
104
100
|
|
package/package.json
CHANGED
package/src/consumer.js
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import { jsm, AckPolicy } from './nats.js'
|
|
2
|
+
import { ensureStream } from './stream.js'
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Перевіряє наявність або створює durable consumer для subject.
|
|
6
|
+
* Stream створюється автоматично, якщо не існує.
|
|
5
7
|
* @param {string} subject - subject у форматі project:subject
|
|
6
8
|
* @returns {Promise<void>}
|
|
7
9
|
*/
|
|
8
10
|
export async function ensureConsumer(subject) {
|
|
11
|
+
// створюємо stream якщо не існує
|
|
12
|
+
await ensureStream(subject)
|
|
13
|
+
|
|
9
14
|
try {
|
|
10
15
|
await jsm.consumers.info('stream', `durable_${subject}`)
|
|
11
16
|
console.debug('✅ Durable consumer already exists')
|
package/src/pending-count.js
CHANGED
|
@@ -1,24 +1,19 @@
|
|
|
1
1
|
import { jsm } from './nats.js'
|
|
2
|
-
import { ensureConsumer } from './consumer.js'
|
|
3
2
|
import { checkSubjectFormat } from './utils.js'
|
|
4
3
|
|
|
5
4
|
/**
|
|
6
5
|
* Повертає кількість непрочитаних (pending) повідомлень для durable consumer, пов’язаного з subject.
|
|
7
|
-
* Consumer створюється автоматично, якщо не існує.
|
|
8
6
|
* @param {string} subject - subject у форматі project:subject
|
|
9
7
|
* @returns {Promise<number>} - кількість непрочитаних повідомлень
|
|
10
8
|
*/
|
|
11
9
|
export async function getPendingCount(subject) {
|
|
12
10
|
checkSubjectFormat(subject)
|
|
13
11
|
|
|
14
|
-
let info
|
|
15
12
|
try {
|
|
16
|
-
info = await jsm.consumers.info('stream', `durable_${subject}`)
|
|
13
|
+
const info = await jsm.consumers.info('stream', `durable_${subject}`)
|
|
14
|
+
return info.num_pending
|
|
17
15
|
} catch {
|
|
18
|
-
console.
|
|
19
|
-
|
|
20
|
-
info = await jsm.consumers.info('stream', `durable_${subject}`)
|
|
16
|
+
console.error('consumer not found for subject:', subject)
|
|
17
|
+
return 0
|
|
21
18
|
}
|
|
22
|
-
|
|
23
|
-
return info?.num_pending || 0
|
|
24
19
|
}
|
package/src/publish.js
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
import { client, jc } from './nats.js'
|
|
2
|
-
import {
|
|
2
|
+
import { ensureConsumer } from './consumer.js'
|
|
3
|
+
import { checkSubjectFormat } from './utils.js'
|
|
3
4
|
|
|
4
|
-
|
|
5
|
+
const consumerReady = new Set()
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* Публікує повідомлення у JetStream для вказаного subject.
|
|
8
|
-
* Stream
|
|
9
|
+
* Stream і Consumer створюються автоматично, якщо не існують.
|
|
9
10
|
* @param {string} subject - subject у форматі project:subject
|
|
10
11
|
* @param {object} data - дані для публікації
|
|
11
12
|
* @returns {Promise<void>}
|
|
12
13
|
*/
|
|
13
14
|
export async function publish(subject, data) {
|
|
14
|
-
// Ensure stream if not exists
|
|
15
|
-
if (!
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
// Ensure stream and consumer if not exists
|
|
16
|
+
if (!consumerReady.has(subject)) {
|
|
17
|
+
checkSubjectFormat(subject)
|
|
18
|
+
await ensureConsumer(subject)
|
|
19
|
+
consumerReady.add(subject)
|
|
18
20
|
}
|
|
19
21
|
console.debug('publish', data)
|
|
20
22
|
// Publish message
|
package/src/stream.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { jsm } from './nats.js'
|
|
2
|
-
import { checkSubjectFormat } from './utils.js'
|
|
3
2
|
|
|
4
3
|
/**
|
|
5
4
|
* Перевіряє наявність або створює JetStream stream.
|
|
@@ -7,8 +6,6 @@ import { checkSubjectFormat } from './utils.js'
|
|
|
7
6
|
* @returns {Promise<void>}
|
|
8
7
|
*/
|
|
9
8
|
export async function ensureStream(subject) {
|
|
10
|
-
checkSubjectFormat(subject)
|
|
11
|
-
|
|
12
9
|
try {
|
|
13
10
|
await jsm.streams.info('stream')
|
|
14
11
|
console.debug('✅ Stream already exists')
|
package/src/worker.js
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
import { js, jc } from './nats.js'
|
|
2
|
-
import { ensureStream } from './stream.js'
|
|
3
|
-
import { ensureConsumer } from './consumer.js'
|
|
4
2
|
import { state } from './utils.js'
|
|
3
|
+
import { checkSubjectFormat } from './utils.js'
|
|
5
4
|
|
|
6
5
|
/**
|
|
7
6
|
* Зчитує одне повідомлення з JetStream для вказаного subject.
|
|
8
|
-
* Consumer створюється автоматично, якщо не існує.
|
|
9
7
|
* @param {string} subject - subject у форматі project:subject
|
|
10
8
|
* @returns {Promise<object>} - декодовані дані повідомлення
|
|
11
9
|
*/
|
|
12
10
|
export async function read(subject) {
|
|
13
|
-
|
|
14
|
-
await ensureStream(subject)
|
|
15
|
-
await ensureConsumer(subject)
|
|
11
|
+
checkSubjectFormat(subject)
|
|
16
12
|
|
|
17
|
-
|
|
13
|
+
let consumer
|
|
14
|
+
try {
|
|
15
|
+
consumer = await js.consumers.get('stream', `durable_${subject}`)
|
|
16
|
+
} catch (e) {
|
|
17
|
+
console.error('consumer not found for subject:', subject)
|
|
18
|
+
return {}
|
|
19
|
+
}
|
|
18
20
|
|
|
19
21
|
const iter = await consumer.fetch({ max_messages: 1 })
|
|
20
22
|
for await (const msg of iter) {
|