From e26942424414f8d4942f013c0c1ce437da5730d0 Mon Sep 17 00:00:00 2001 From: Gionata Mettifogo Date: Thu, 8 Aug 2024 15:57:00 +0200 Subject: [PATCH 1/2] Examples of sending/receiving queue messages --- bun.lockb | Bin 289585 -> 294210 bytes package.json | 4 +- src/realtime/amqp-async.ts | 51 ++++++++++++++++++++++ src/realtime/amqp-callbacks.ts | 75 +++++++++++++++++++++++++++++++++ 4 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 src/realtime/amqp-async.ts create mode 100644 src/realtime/amqp-callbacks.ts diff --git a/bun.lockb b/bun.lockb index e3abaae14f3d76f1bf95c2587b5b29c28d3dcdfb..8caf0d4dabfd1e934ee985d64d5757d3962ffc9d 100755 GIT binary patch delta 52254 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 delta 49542 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

JLA)Cyj%!`B>j2O+?o0mP_`;Y5i>n)erLj2*? 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 { + if (msg !== null) { + try { + const jsonMsg = JSON.parse(msg.content.toString()) // Parse the message content to JSON + //const jsonMsg = msg.content.toJSON() + console.log(jsonMsg, msg.fields, msg.properties) + } catch (error) { + console.error(`Error while parsing ${msg.content.toString()}`, error) + } + + // console.log('Received:', msg.content.toString()) + ch1.ack(msg) + } else { + console.log('Consumer cancelled by server') + } + }) + + // Sender + const ch2 = await conn.createChannel() + + setInterval(() => { + const buffer = crypto.randomBytes(64 * 1024) // Generate 64KB of random bytes + const base64Buffer = buffer.toString('base64') // Encode the buffer as a base64 string + + const jsonMsg = { task: 'something to do', buffer: base64Buffer } // Create a JSON object + const sent = ch2.sendToQueue(queue, Buffer.from(JSON.stringify(jsonMsg)), { + contentType: 'application/json' + }) + //console.debug(`sent: ${sent}`) + }, 1000) +} + +void performExperiment() diff --git a/src/realtime/amqp-callbacks.ts b/src/realtime/amqp-callbacks.ts new file mode 100644 index 0000000..2da00ec --- /dev/null +++ b/src/realtime/amqp-callbacks.ts @@ -0,0 +1,75 @@ +// +// +// + +import { error } from 'console' +import crypto from 'crypto' // Import the crypto module +// https://amqp-node.github.io/amqplib/ +import amqplib from 'amqplib/callback_api' + +const rabbit_url = process.env.SQLITECLOUD_AMQP as string // 'amqp://user:cKZWUkrGMOrdcsqZ@rabbitmq.aws-eu1.sqlite.tech' + +// docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=xxx rabbitmq:3.13-management + +// https://rabbitmq.aws-eu1.sqlite.tech:15672/#/ + +const topic = 'messaggini' + +const queue = 'jsontasks' + +amqplib.connect(rabbit_url, (err, conn) => { + if (err) { + console.debug(`amqplib.connect - error: ${error}`) + throw err + } + console.debug(`amqplib.connect - connected`, conn) + + // Listener + + conn.createChannel((err, ch2) => { + if (err) throw err + + ch2.assertQueue(queue) + ch2.consume(queue, msg => { + if (msg !== null) { + try { + const jsonMsg = JSON.parse(msg.content.toString()) // Parse the message content to JSON + //const jsonMsg = msg.content.toJSON() + console.debug(`content:`, jsonMsg) + console.debug(`headers:`, msg.properties.headers) + console.debug(`fields:`, msg.fields) + + // console.log(jsonMsg, msg.fields, msg.properties) + } catch (error) { + console.error(`Error while parsing ${msg.content.toString()}`, error) + } + ch2.ack(msg) + } else { + console.log('Consumer cancelled by server') + } + }) + }) + + // Sender + conn.createChannel((err, ch1) => { + if (err) throw err + + ch1.assertQueue(queue) + + setInterval(() => { + const buffer = crypto.randomBytes(64 * 1024) // Generate 64KB of random bytes + const base64Buffer = buffer.toString('base64') // Encode the buffer as a base64 string + + const jsonMsg = { task: 'something to do', data: base64Buffer } // Create a JSON object + const sent = ch1.sendToQueue(queue, Buffer.from(JSON.stringify(jsonMsg)), { + contentType: 'application/json', + headers: { + headerOne: 'value1', + headerTwo: 2 + } + // persistent: true + }) + console.debug(`sent: ${sent}`) + }, 100) + }) +}) From 806f5f7ce6edfb7e71a1a5e1b7349b57a68b3b69 Mon Sep 17 00:00:00 2001 From: Gionata Mettifogo Date: Thu, 8 Aug 2024 16:04:07 +0200 Subject: [PATCH 2/2] Url example --- src/realtime/amqp-callbacks.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/realtime/amqp-callbacks.ts b/src/realtime/amqp-callbacks.ts index 2da00ec..a7d0866 100644 --- a/src/realtime/amqp-callbacks.ts +++ b/src/realtime/amqp-callbacks.ts @@ -7,14 +7,13 @@ import crypto from 'crypto' // Import the crypto module // https://amqp-node.github.io/amqplib/ import amqplib from 'amqplib/callback_api' -const rabbit_url = process.env.SQLITECLOUD_AMQP as string // 'amqp://user:cKZWUkrGMOrdcsqZ@rabbitmq.aws-eu1.sqlite.tech' +const rabbit_url = process.env.SQLITECLOUD_AMQP as string +// eg. amqp://user:password@rabbitmq.aws-eu1.sqlite.tech // docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=xxx rabbitmq:3.13-management // https://rabbitmq.aws-eu1.sqlite.tech:15672/#/ -const topic = 'messaggini' - const queue = 'jsontasks' amqplib.connect(rabbit_url, (err, conn) => {