Skip to content

Commit 8c34501

Browse files
authored
Merge branch 'main' into offset-tracking-example
2 parents 95a0ef1 + aa4b2a4 commit 8c34501

17 files changed

+259
-81
lines changed

.github/workflows/main.yml

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,18 @@ jobs:
2121
services:
2222
rabbitmq:
2323
image: rabbitmq:3.13-rc-management
24-
options: --hostname test-node
24+
options: --hostname test-node --name test-node
2525
env:
2626
RABBITMQ_DEFAULT_USER: "test-user"
2727
RABBITMQ_DEFAULT_PASS: "test-password"
28+
volumes:
29+
# these directories will be empty until checkout, but they will be
30+
# populated by the time we restart the service
31+
- ${{ github.workspace }}/conf:/etc/rabbitmq
32+
- ${{ github.workspace }}/certs:/certs
2833
ports:
2934
- 5552:5552
35+
- 5551:5551
3036
- 5672:5672
3137
- 15672:15672
3238
- 1883:1883
@@ -41,17 +47,32 @@ jobs:
4147
with:
4248
node-version: ${{ matrix.node-version }}
4349
cache: "npm"
44-
- name: Enable RabbitMQ Plugins
45-
run: docker exec $(docker ps --filter ancestor=rabbitmq:3.13-rc-management -q) rabbitmq-plugins enable rabbitmq_stream rabbitmq_stream_management
50+
- name: Generate certificates
51+
env:
52+
CN: test-node
53+
run: |
54+
git clone https://github.com/rabbitmq/tls-gen tls-gen
55+
cd tls-gen/basic
56+
make
57+
cd ../..
58+
cp -a tls-gen/basic/result certs/
59+
sudo chown -R 999:999 certs
60+
sudo mv certs/server_test-node_certificate.pem certs/server_rabbitmq_certificate.pem
61+
sudo mv certs/server_test-node_key.pem certs/server_rabbitmq_key.pem
4662
- name: Restart RabbitMQ
47-
run: docker restart $(docker ps --filter ancestor=rabbitmq:3.13-rc-management -q)
48-
- name: Wait for rabbit instance restart
49-
run: sleep 10
63+
run: |
64+
docker restart test-node
65+
sleep 2
66+
docker exec test-node rabbitmqctl await_startup
5067
- name: Create SuperStream
51-
run: docker exec $(docker ps --filter ancestor=rabbitmq:3.13-rc-management -q) rabbitmq-streams add_super_stream super-stream-test --partitions 2
68+
run: docker exec test-node rabbitmq-streams add_super_stream super-stream-test --partitions 2
5269
- run: npm ci
5370
- run: npm run check
5471
- run: npm run build --if-present
72+
- run: |
73+
docker exec test-node rabbitmqctl add_user 'O=client,CN=test-node' ''
74+
docker exec test-node rabbitmqctl clear_password 'O=client,CN=test-node'
75+
docker exec test-node rabbitmqctl set_permissions 'O=client,CN=test-node' '.*' '.*' '.*'
5576
- run: npm test
5677
env:
5778
RABBITMQ_USER: "test-user"

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ dist/
22
node_modules/
33
performance_test/node_modules
44
.envrc
5+
tls-gen/

Makefile

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,18 @@ rabbitmq-cluster:
44
mv cluster/tls-gen/basic/result/server_*_certificate.pem cluster/tls-gen/basic/result/server_certificate.pem
55
mv cluster/tls-gen/basic/result/server_*key.pem cluster/tls-gen/basic/result/server_key.pem
66
cd cluster; docker build -t haproxy-rabbitmq-cluster .
7-
cd cluster; chmod 755 -R tls-gen
7+
cd cluster; chmod -R 755 tls-gen
88
cd cluster; docker compose down
9-
cd cluster; docker compose up -d
9+
cd cluster; docker compose up -d
10+
11+
rabbitmq-test:
12+
rm -rf tls-gen;
13+
git clone https://github.com/rabbitmq/tls-gen tls-gen; cd tls-gen/basic; CN=rabbitmq make
14+
chmod -R 755 tls-gen
15+
docker compose down
16+
docker compose up -d
17+
sleep 5
18+
docker exec rabbitmq-stream rabbitmqctl await_startup
19+
docker exec rabbitmq-stream rabbitmqctl add_user 'O=client,CN=rabbitmq' ''
20+
docker exec rabbitmq-stream rabbitmqctl clear_password 'O=client,CN=rabbitmq'
21+
docker exec rabbitmq-stream rabbitmqctl set_permissions 'O=client,CN=rabbitmq' '.*' '.*' '.*'

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ npm i
374374
run the docker-compose to launch a rabbit instance already stream enabled
375375

376376
```shell
377-
docker-compose up -d
377+
make rabbitmq-test
378378
```
379379

380380
add this line to your host file (on linux `/etc/hosts`) to correctly resolve rabbitmq
@@ -400,8 +400,8 @@ npm run build
400400
Test:
401401

402402
```shell
403-
docker-compose up -d
404-
npm run test
403+
make rabbitmq-test
404+
RABBIT_MQ_TEST_NODES=rabbitmq:5552 npm run test
405405
```
406406

407407
Check everything:

conf/enabled_plugins

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
[rabbitmq_management,rabbitmq_prometheus,rabbitmq_stream_management].
1+
[rabbitmq_management,rabbitmq_prometheus,rabbitmq_stream_management,rabbitmq_auth_mechanism_ssl].

conf/rabbitmq.conf

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
loopback_users.guest = false
2+
3+
ssl_options.cacertfile = /certs/ca_certificate.pem
4+
ssl_options.certfile = /certs/server_rabbitmq_certificate.pem
5+
ssl_options.keyfile = /certs/server_rabbitmq_key.pem
6+
listeners.ssl.default = 5671
7+
listeners.tcp.default = 5672
8+
stream.listeners.tcp.default = 5552
9+
stream.listeners.ssl.default = 5551
10+
auth_mechanisms.1 = PLAIN
11+
auth_mechanisms.2 = EXTERNAL
12+
ssl_options.verify = verify_peer
13+
ssl_options.fail_if_no_peer_cert = false
14+
log.file.level = debug
15+
log.console = true

docker-compose.yaml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
version: "2"
2-
31
services:
42
rabbitmq-stream:
53
image: rabbitmq:3.13-rc-management
@@ -8,10 +6,13 @@ services:
86
hostname: "rabbitmq"
97
ports:
108
- "15672:15672"
9+
- "5671:5671"
1110
- "5672:5672"
11+
- "5551:5551"
1212
- "5552:5552"
1313
environment:
1414
RABBITMQ_DEFAULT_USER: "rabbit"
1515
RABBITMQ_DEFAULT_PASS: "rabbit"
1616
volumes:
17-
- ./conf/enabled_plugins:/etc/rabbitmq/enabled_plugins
17+
- ./conf/:/etc/rabbitmq/
18+
- "./tls-gen/basic/result/:/certs"

example/package-lock.json

Lines changed: 20 additions & 20 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
const rabbit = require("rabbitmq-stream-js-client")
2+
3+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms))
4+
5+
async function main() {
6+
console.log("Connecting...")
7+
const client = await rabbit.connect({
8+
hostname: "localhost",
9+
port: 5552,
10+
username: "rabbit",
11+
password: "rabbit",
12+
vhost: "/",
13+
})
14+
15+
console.log("Making sure the stream exists...")
16+
const streamName = "stream-offset-tracking-javascript"
17+
await client.createStream({ stream: streamName, arguments: {} })
18+
19+
const consumerRef = "offset-tracking-tutorial"
20+
let firstOffset = undefined
21+
let offsetSpecification = rabbit.Offset.first()
22+
try {
23+
const offset = await client.queryOffset({ reference: consumerRef, stream: streamName })
24+
offsetSpecification = rabbit.Offset.offset(offset + 1n)
25+
} catch (e) {}
26+
27+
let lastOffset = offsetSpecification.value
28+
let messageCount = 0
29+
const consumer = await client.declareConsumer(
30+
{ stream: streamName, offset: offsetSpecification, consumerRef },
31+
async (message) => {
32+
messageCount++
33+
if (!firstOffset && messageCount === 1) {
34+
firstOffset = message.offset
35+
console.log("First message received")
36+
}
37+
if (messageCount % 10 === 0) {
38+
await consumer.storeOffset(message.offset)
39+
}
40+
if (message.content.toString() === "marker") {
41+
console.log("Marker found")
42+
lastOffset = message.offset
43+
await consumer.storeOffset(message.offset)
44+
await consumer.close()
45+
}
46+
}
47+
)
48+
49+
console.log(`Start consuming...`)
50+
await sleep(2000)
51+
console.log(`Done consuming, first offset was ${firstOffset}, last offset was ${lastOffset}`)
52+
}
53+
54+
main()
55+
.then(() => process.exit(0))
56+
.catch((res) => {
57+
console.log("Error while receiving message!", res)
58+
process.exit(-1)
59+
})
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
const rabbit = require("rabbitmq-stream-js-client")
2+
3+
async function main() {
4+
console.log("Connecting...")
5+
const client = await rabbit.connect({
6+
vhost: "/",
7+
port: 5552,
8+
hostname: "localhost",
9+
username: "rabbit",
10+
password: "rabbit",
11+
})
12+
13+
console.log("Making sure the stream exists...")
14+
const streamName = "stream-offset-tracking-javascript"
15+
await client.createStream({ stream: streamName, arguments: {} })
16+
17+
console.log("Creating the publisher...")
18+
const publisher = await client.declarePublisher({ stream: streamName })
19+
20+
const messageCount = 100
21+
console.log(`Publishing ${messageCount} messages`)
22+
for (let i = 0; i < messageCount; i++) {
23+
const body = i === messageCount - 1 ? "marker" : `hello ${i}`
24+
await publisher.send(Buffer.from(body))
25+
}
26+
27+
console.log("Closing the connection...")
28+
await client.close()
29+
}
30+
31+
main()
32+
.then(() => console.log("done!"))
33+
.catch((res) => {
34+
console.log("Error in publishing message!", res)
35+
process.exit(-1)
36+
})

0 commit comments

Comments
 (0)