@a_jackie_z/event-bus 1.0.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../lib/tests/broadcast-consumer.ts"],"sourcesContent":["import { EventBusConsumer, type QueueHandlers, type ExchangeBindings, type EventHandler } from '../consumer.js';\nimport { logger } from '@a_jackie_z/logger';\nimport { spawn } from 'child_process';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\n\n// Check if this is a child consumer process\nconst isChildConsumer = process.env.IS_CHILD_CONSUMER === 'true';\nconst consumerId = process.env.CONSUMER_ID || '1';\n\nif (isChildConsumer) {\n // Child consumer logic\n const notificationHandler: EventHandler = async (data) => {\n logger.info({ data, consumerId }, `[Consumer ${consumerId}] Received broadcast notification`);\n // Process notification\n };\n\n const alertHandler: EventHandler = async (data) => {\n logger.info({ data, consumerId }, `[Consumer ${consumerId}] Received broadcast alert`);\n // Process alert\n };\n\n const queueHandlers: QueueHandlers = new Map([\n ['notifications', [notificationHandler]],\n ['alerts', [alertHandler]]\n ]);\n\n const exchangeBindings: ExchangeBindings = new Map([\n ['notifications', 'notification_broadcast'],\n ['alerts', 'alert_broadcast']\n ]);\n\n const consumer = new EventBusConsumer({\n rabbitMqUrl: 'amqp://rabbitmq:12345678@192.168.2.151:5672',\n queueHandlers,\n onStateChange: (state, reconnectCount) => {\n logger.info({ state, reconnectCount, consumerId }, `[Consumer ${consumerId}] State change`);\n },\n exchangeBindings\n });\n\n async function runConsumer() {\n try {\n logger.info({ consumerId }, `[Consumer ${consumerId}] Starting...`);\n await consumer.connect();\n logger.info({ consumerId }, `[Consumer ${consumerId}] Connected and listening for broadcasts`);\n\n process.on('SIGINT', async () => {\n logger.info({ consumerId }, `[Consumer ${consumerId}] Disconnecting...`);\n await consumer.disconnect();\n process.exit(0);\n });\n\n process.on('SIGTERM', async () => {\n logger.info({ consumerId }, `[Consumer ${consumerId}] Disconnecting...`);\n await consumer.disconnect();\n process.exit(0);\n });\n } catch (error) {\n logger.error({ error, consumerId }, `[Consumer ${consumerId}] Failed to start`);\n process.exit(1);\n }\n }\n\n runConsumer();\n} else {\n // Parent process - spawn 2 consumer instances\n logger.info('=== Starting 2 Broadcast Consumers Demo ===');\n logger.info('Press Ctrl+C to stop all consumers');\n logger.info('');\n\n const consumers: any[] = [];\n\n // Spawn Consumer 1\n const consumer1 = spawn(process.execPath, [__filename], {\n env: {\n ...process.env,\n IS_CHILD_CONSUMER: 'true',\n CONSUMER_ID: '1'\n },\n stdio: 'inherit'\n });\n\n consumers.push(consumer1);\n logger.info('✓ Consumer 1 launched');\n\n // Spawn Consumer 2\n const consumer2 = spawn(process.execPath, [__filename], {\n env: {\n ...process.env,\n IS_CHILD_CONSUMER: 'true',\n CONSUMER_ID: '2'\n },\n stdio: 'inherit'\n });\n\n consumers.push(consumer2);\n logger.info('✓ Consumer 2 launched');\n logger.info('');\n logger.info('Both consumers are now listening for broadcast messages...');\n\n // Handle parent process signals\n process.on('SIGINT', () => {\n logger.info('');\n logger.info('Stopping all consumers...');\n consumers.forEach(c => c.kill('SIGINT'));\n setTimeout(() => process.exit(0), 2000);\n });\n\n process.on('SIGTERM', () => {\n logger.info('Stopping all consumers...');\n consumers.forEach(c => c.kill('SIGTERM'));\n setTimeout(() => process.exit(0), 2000);\n });\n\n // Handle child process exits\n consumer1.on('exit', (code) => {\n logger.info({ code }, 'Consumer 1 exited');\n if (code !== 0) {\n logger.error('Consumer 1 exited with error, stopping all...');\n consumers.forEach(c => c.kill());\n process.exit(1);\n }\n });\n\n consumer2.on('exit', (code) => {\n logger.info({ code }, 'Consumer 2 exited');\n if (code !== 0) {\n logger.error('Consumer 2 exited with error, stopping all...');\n consumers.forEach(c => c.kill());\n process.exit(1);\n }\n });\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,2 @@
1
+
2
+ export { }
@@ -0,0 +1,57 @@
1
+ import {
2
+ EventBusProducer
3
+ } from "../../chunk-YP7YVSEN.js";
4
+ import "../../chunk-JBE5KWYZ.js";
5
+
6
+ // lib/tests/broadcast-producer.ts
7
+ import { logger } from "@a_jackie_z/logger";
8
+ async function main() {
9
+ const producer = new EventBusProducer({
10
+ rabbitMqUrl: "amqp://rabbitmq:12345678@192.168.2.151:5672",
11
+ onStateChange: (state, reconnectCount) => {
12
+ logger.info({ state, reconnectCount }, "Broadcast producer state change");
13
+ }
14
+ });
15
+ try {
16
+ await producer.connect();
17
+ logger.info("Broadcast producer connected and ready");
18
+ logger.debug("Broadcasting notification 1");
19
+ await producer.broadcast("notification_broadcast", {
20
+ type: "system",
21
+ message: "System maintenance scheduled for tonight",
22
+ priority: "high",
23
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
24
+ });
25
+ logger.debug("Broadcasting notification 2");
26
+ await producer.broadcast("notification_broadcast", {
27
+ type: "update",
28
+ message: "New features released in version 2.0",
29
+ priority: "medium",
30
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
31
+ });
32
+ logger.debug("Broadcasting alert 1");
33
+ await producer.broadcast("alert_broadcast", {
34
+ level: "warning",
35
+ message: "High CPU usage detected",
36
+ threshold: 85,
37
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
38
+ });
39
+ logger.debug("Broadcasting alert 2");
40
+ await producer.broadcast("alert_broadcast", {
41
+ level: "critical",
42
+ message: "Database connection pool exhausted",
43
+ threshold: 100,
44
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
45
+ });
46
+ logger.info("All broadcast messages sent successfully");
47
+ await new Promise((resolve) => setTimeout(resolve, 2e3));
48
+ await producer.disconnect();
49
+ logger.info("Broadcast producer disconnected");
50
+ } catch (error) {
51
+ logger.error({ error }, "Failed to broadcast messages");
52
+ await producer.disconnect();
53
+ process.exit(1);
54
+ }
55
+ }
56
+ main();
57
+ //# sourceMappingURL=broadcast-producer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../lib/tests/broadcast-producer.ts"],"sourcesContent":["import { EventBusProducer } from '../producer.js';\nimport { logger } from '@a_jackie_z/logger';\n\nasync function main() {\n // Create producer with state change callback\n const producer = new EventBusProducer({\n rabbitMqUrl: 'amqp://rabbitmq:12345678@192.168.2.151:5672',\n onStateChange: (state, reconnectCount) => {\n logger.info({ state, reconnectCount }, 'Broadcast producer state change');\n }\n });\n\n try {\n // Connect to RabbitMQ\n await producer.connect();\n logger.info('Broadcast producer connected and ready');\n\n // Broadcast notifications (all consumers will receive these)\n logger.debug('Broadcasting notification 1');\n await producer.broadcast('notification_broadcast', {\n type: 'system',\n message: 'System maintenance scheduled for tonight',\n priority: 'high',\n timestamp: new Date().toISOString()\n });\n\n logger.debug('Broadcasting notification 2');\n await producer.broadcast('notification_broadcast', {\n type: 'update',\n message: 'New features released in version 2.0',\n priority: 'medium',\n timestamp: new Date().toISOString()\n });\n\n // Broadcast alerts (all consumers will receive these)\n logger.debug('Broadcasting alert 1');\n await producer.broadcast('alert_broadcast', {\n level: 'warning',\n message: 'High CPU usage detected',\n threshold: 85,\n timestamp: new Date().toISOString()\n });\n\n logger.debug('Broadcasting alert 2');\n await producer.broadcast('alert_broadcast', {\n level: 'critical',\n message: 'Database connection pool exhausted',\n threshold: 100,\n timestamp: new Date().toISOString()\n });\n\n logger.info('All broadcast messages sent successfully');\n\n // Wait a bit before disconnecting to ensure messages are processed\n await new Promise(resolve => setTimeout(resolve, 2000));\n\n // Disconnect\n await producer.disconnect();\n logger.info('Broadcast producer disconnected');\n } catch (error) {\n logger.error({ error }, 'Failed to broadcast messages');\n await producer.disconnect();\n process.exit(1);\n }\n}\n\nmain();\n"],"mappings":";;;;;;AACA,SAAS,cAAc;AAEvB,eAAe,OAAO;AAEpB,QAAM,WAAW,IAAI,iBAAiB;AAAA,IACpC,aAAa;AAAA,IACb,eAAe,CAAC,OAAO,mBAAmB;AACxC,aAAO,KAAK,EAAE,OAAO,eAAe,GAAG,iCAAiC;AAAA,IAC1E;AAAA,EACF,CAAC;AAED,MAAI;AAEF,UAAM,SAAS,QAAQ;AACvB,WAAO,KAAK,wCAAwC;AAGpD,WAAO,MAAM,6BAA6B;AAC1C,UAAM,SAAS,UAAU,0BAA0B;AAAA,MACjD,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AAED,WAAO,MAAM,6BAA6B;AAC1C,UAAM,SAAS,UAAU,0BAA0B;AAAA,MACjD,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AAGD,WAAO,MAAM,sBAAsB;AACnC,UAAM,SAAS,UAAU,mBAAmB;AAAA,MAC1C,OAAO;AAAA,MACP,SAAS;AAAA,MACT,WAAW;AAAA,MACX,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AAED,WAAO,MAAM,sBAAsB;AACnC,UAAM,SAAS,UAAU,mBAAmB;AAAA,MAC1C,OAAO;AAAA,MACP,SAAS;AAAA,MACT,WAAW;AAAA,MACX,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AAED,WAAO,KAAK,0CAA0C;AAGtD,UAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,GAAI,CAAC;AAGtD,UAAM,SAAS,WAAW;AAC1B,WAAO,KAAK,iCAAiC;AAAA,EAC/C,SAAS,OAAO;AACd,WAAO,MAAM,EAAE,MAAM,GAAG,8BAA8B;AACtD,UAAM,SAAS,WAAW;AAC1B,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,KAAK;","names":[]}
@@ -0,0 +1,2 @@
1
+
2
+ export { }
@@ -0,0 +1,62 @@
1
+ import {
2
+ EventBusConsumer
3
+ } from "../../chunk-5DMUVWFR.js";
4
+ import "../../chunk-JBE5KWYZ.js";
5
+
6
+ // lib/tests/consumer.ts
7
+ import { logger } from "@a_jackie_z/logger";
8
+ var userCreatedHandler = async (data) => {
9
+ logger.info({ data }, "Handler 1: User created");
10
+ };
11
+ var sendWelcomeEmailHandler = async (data) => {
12
+ logger.info({ email: data.email }, "Handler 2: Sending welcome email");
13
+ };
14
+ var orderProcessedHandler = async (data) => {
15
+ logger.info({ data }, "Handler: Order processed");
16
+ };
17
+ var queueHandlers = /* @__PURE__ */ new Map([
18
+ ["user_events", [userCreatedHandler, sendWelcomeEmailHandler]],
19
+ ["order_events", [orderProcessedHandler]]
20
+ ]);
21
+ var consumer = new EventBusConsumer({
22
+ rabbitMqUrl: "amqp://rabbitmq:12345678@192.168.2.151:5672",
23
+ queueHandlers,
24
+ onStateChange: (state, reconnectCount) => {
25
+ logger.info({ state, reconnectCount, consumerId: 1 }, "State change");
26
+ }
27
+ });
28
+ async function main() {
29
+ try {
30
+ const queueHandlers2 = /* @__PURE__ */ new Map([
31
+ ["user_events", [userCreatedHandler, sendWelcomeEmailHandler]],
32
+ ["order_events", [orderProcessedHandler]]
33
+ ]);
34
+ const consumer2 = new EventBusConsumer({
35
+ rabbitMqUrl: "amqp://rabbitmq:12345678@192.168.2.151:5672",
36
+ queueHandlers: queueHandlers2,
37
+ onStateChange: (state, reconnectCount) => {
38
+ logger.info({ state, reconnectCount, consumerId: 2 }, "State change");
39
+ }
40
+ });
41
+ await Promise.all([
42
+ consumer.connect().then(() => logger.info({ consumerId: 1 }, "Consumer connected and ready")),
43
+ consumer2.connect().then(() => logger.info({ consumerId: 2 }, "Consumer connected and ready"))
44
+ ]);
45
+ logger.info("Both consumers are running. Press Ctrl+C to exit.");
46
+ logger.info("Events will be distributed across both consumers");
47
+ process.on("SIGINT", async () => {
48
+ logger.info("Shutting down gracefully");
49
+ await Promise.all([
50
+ consumer.disconnect(),
51
+ consumer2.disconnect()
52
+ ]);
53
+ logger.info("Both consumers disconnected");
54
+ process.exit(0);
55
+ });
56
+ } catch (error) {
57
+ logger.error({ error }, "Failed to start consumers");
58
+ process.exit(1);
59
+ }
60
+ }
61
+ main();
62
+ //# sourceMappingURL=consumer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../lib/tests/consumer.ts"],"sourcesContent":["import { EventBusConsumer, type QueueHandlers, type EventHandler } from '../consumer.js';\nimport { logger } from '@a_jackie_z/logger';\n\n// Example: Define event handlers\nconst userCreatedHandler: EventHandler = async (data) => {\n logger.info({ data }, 'Handler 1: User created');\n // Process user creation event\n};\n\nconst sendWelcomeEmailHandler: EventHandler = async (data) => {\n logger.info({ email: data.email }, 'Handler 2: Sending welcome email');\n // Send welcome email\n};\n\nconst orderProcessedHandler: EventHandler = async (data) => {\n logger.info({ data }, 'Handler: Order processed');\n // Process order\n};\n\n// Setup queue handlers mapping\nconst queueHandlers: QueueHandlers = new Map([\n ['user_events', [userCreatedHandler, sendWelcomeEmailHandler]],\n ['order_events', [orderProcessedHandler]]\n]);\n\n// Create consumer with state change callback\nconst consumer = new EventBusConsumer({\n rabbitMqUrl: 'amqp://rabbitmq:12345678@192.168.2.151:5672',\n queueHandlers,\n onStateChange: (state, reconnectCount) => {\n logger.info({ state, reconnectCount, consumerId: 1 }, 'State change');\n }\n});\n\n// Connect and start consuming with 2 parallel consumers\nasync function main() {\n try {\n // Create second consumer with different handlers for testing\n const queueHandlers2: QueueHandlers = new Map([\n ['user_events', [userCreatedHandler, sendWelcomeEmailHandler]],\n ['order_events', [orderProcessedHandler]]\n ]);\n\n const consumer2 = new EventBusConsumer({\n rabbitMqUrl: 'amqp://rabbitmq:12345678@192.168.2.151:5672',\n queueHandlers: queueHandlers2,\n onStateChange: (state, reconnectCount) => {\n logger.info({ state, reconnectCount, consumerId: 2 }, 'State change');\n }\n });\n\n // Connect both consumers in parallel\n await Promise.all([\n consumer.connect().then(() => logger.info({ consumerId: 1 }, 'Consumer connected and ready')),\n consumer2.connect().then(() => logger.info({ consumerId: 2 }, 'Consumer connected and ready'))\n ]);\n\n logger.info('Both consumers are running. Press Ctrl+C to exit.');\n logger.info('Events will be distributed across both consumers');\n\n // Handle graceful shutdown for both consumers\n process.on('SIGINT', async () => {\n logger.info('Shutting down gracefully');\n await Promise.all([\n consumer.disconnect(),\n consumer2.disconnect()\n ]);\n logger.info('Both consumers disconnected');\n process.exit(0);\n });\n } catch (error) {\n logger.error({ error }, 'Failed to start consumers');\n process.exit(1);\n }\n}\n\nmain();\n"],"mappings":";;;;;;AACA,SAAS,cAAc;AAGvB,IAAM,qBAAmC,OAAO,SAAS;AACvD,SAAO,KAAK,EAAE,KAAK,GAAG,yBAAyB;AAEjD;AAEA,IAAM,0BAAwC,OAAO,SAAS;AAC5D,SAAO,KAAK,EAAE,OAAO,KAAK,MAAM,GAAG,kCAAkC;AAEvE;AAEA,IAAM,wBAAsC,OAAO,SAAS;AAC1D,SAAO,KAAK,EAAE,KAAK,GAAG,0BAA0B;AAElD;AAGA,IAAM,gBAA+B,oBAAI,IAAI;AAAA,EAC3C,CAAC,eAAe,CAAC,oBAAoB,uBAAuB,CAAC;AAAA,EAC7D,CAAC,gBAAgB,CAAC,qBAAqB,CAAC;AAC1C,CAAC;AAGD,IAAM,WAAW,IAAI,iBAAiB;AAAA,EACpC,aAAa;AAAA,EACb;AAAA,EACA,eAAe,CAAC,OAAO,mBAAmB;AACxC,WAAO,KAAK,EAAE,OAAO,gBAAgB,YAAY,EAAE,GAAG,cAAc;AAAA,EACtE;AACF,CAAC;AAGD,eAAe,OAAO;AACpB,MAAI;AAEF,UAAM,iBAAgC,oBAAI,IAAI;AAAA,MAC5C,CAAC,eAAe,CAAC,oBAAoB,uBAAuB,CAAC;AAAA,MAC7D,CAAC,gBAAgB,CAAC,qBAAqB,CAAC;AAAA,IAC1C,CAAC;AAED,UAAM,YAAY,IAAI,iBAAiB;AAAA,MACrC,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe,CAAC,OAAO,mBAAmB;AACxC,eAAO,KAAK,EAAE,OAAO,gBAAgB,YAAY,EAAE,GAAG,cAAc;AAAA,MACtE;AAAA,IACF,CAAC;AAGD,UAAM,QAAQ,IAAI;AAAA,MAChB,SAAS,QAAQ,EAAE,KAAK,MAAM,OAAO,KAAK,EAAE,YAAY,EAAE,GAAG,8BAA8B,CAAC;AAAA,MAC5F,UAAU,QAAQ,EAAE,KAAK,MAAM,OAAO,KAAK,EAAE,YAAY,EAAE,GAAG,8BAA8B,CAAC;AAAA,IAC/F,CAAC;AAED,WAAO,KAAK,mDAAmD;AAC/D,WAAO,KAAK,kDAAkD;AAG9D,YAAQ,GAAG,UAAU,YAAY;AAC/B,aAAO,KAAK,0BAA0B;AACtC,YAAM,QAAQ,IAAI;AAAA,QAChB,SAAS,WAAW;AAAA,QACpB,UAAU,WAAW;AAAA,MACvB,CAAC;AACD,aAAO,KAAK,6BAA6B;AACzC,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AAAA,EACH,SAAS,OAAO;AACd,WAAO,MAAM,EAAE,MAAM,GAAG,2BAA2B;AACnD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,KAAK;","names":[]}
@@ -0,0 +1,2 @@
1
+
2
+ export { }
@@ -0,0 +1,117 @@
1
+ import {
2
+ EventBusConsumer
3
+ } from "../../chunk-5DMUVWFR.js";
4
+ import "../../chunk-JBE5KWYZ.js";
5
+
6
+ // lib/tests/mixed-consumer.ts
7
+ import { logger } from "@a_jackie_z/logger";
8
+ import { spawn } from "child_process";
9
+ import { fileURLToPath } from "url";
10
+ var __filename = fileURLToPath(import.meta.url);
11
+ var isChildConsumer = process.env.IS_CHILD_CONSUMER === "true";
12
+ var consumerId = process.env.CONSUMER_ID || "1";
13
+ if (isChildConsumer) {
14
+ const orderHandler = async (data) => {
15
+ logger.info({ data, consumerId }, `[Consumer ${consumerId}] Processing direct order`);
16
+ };
17
+ const announcementHandler = async (data) => {
18
+ logger.info({ data, consumerId }, `[Consumer ${consumerId}] Received broadcast announcement`);
19
+ };
20
+ const queueHandlers = /* @__PURE__ */ new Map([
21
+ ["orders", [orderHandler]],
22
+ // Direct queue (1-1)
23
+ ["announcements", [announcementHandler]]
24
+ // Broadcast queue (1-n)
25
+ ]);
26
+ const exchangeBindings = /* @__PURE__ */ new Map([
27
+ ["announcements", "announcement_broadcast"]
28
+ // Bind announcements to fanout exchange
29
+ // 'orders' is NOT bound to an exchange, so it remains a direct queue
30
+ ]);
31
+ const consumer = new EventBusConsumer({
32
+ rabbitMqUrl: "amqp://rabbitmq:12345678@192.168.2.151:5672",
33
+ queueHandlers,
34
+ onStateChange: (state, reconnectCount) => {
35
+ logger.info({ state, reconnectCount, consumerId }, `[Consumer ${consumerId}] State change`);
36
+ },
37
+ exchangeBindings
38
+ });
39
+ async function runConsumer() {
40
+ try {
41
+ logger.info({ consumerId }, `[Consumer ${consumerId}] Starting mixed mode consumer (1-1 and 1-n)`);
42
+ await consumer.connect();
43
+ logger.info({ consumerId }, `[Consumer ${consumerId}] Connected - listening to direct queues and broadcasts`);
44
+ process.on("SIGINT", async () => {
45
+ logger.info({ consumerId }, `[Consumer ${consumerId}] Disconnecting...`);
46
+ await consumer.disconnect();
47
+ process.exit(0);
48
+ });
49
+ process.on("SIGTERM", async () => {
50
+ logger.info({ consumerId }, `[Consumer ${consumerId}] Disconnecting...`);
51
+ await consumer.disconnect();
52
+ process.exit(0);
53
+ });
54
+ } catch (error) {
55
+ logger.error({ error, consumerId }, `[Consumer ${consumerId}] Failed to start`);
56
+ process.exit(1);
57
+ }
58
+ }
59
+ runConsumer();
60
+ } else {
61
+ logger.info("=== Starting 2 Mixed Mode Consumers Demo ===");
62
+ logger.info("Direct queue (orders): Only ONE consumer will process each message");
63
+ logger.info("Broadcast (announcements): BOTH consumers will receive ALL messages");
64
+ logger.info("Press Ctrl+C to stop all consumers");
65
+ logger.info("");
66
+ const consumers = [];
67
+ const consumer1 = spawn(process.execPath, [__filename], {
68
+ env: {
69
+ ...process.env,
70
+ IS_CHILD_CONSUMER: "true",
71
+ CONSUMER_ID: "1"
72
+ },
73
+ stdio: "inherit"
74
+ });
75
+ consumers.push(consumer1);
76
+ logger.info("\u2713 Consumer 1 launched");
77
+ const consumer2 = spawn(process.execPath, [__filename], {
78
+ env: {
79
+ ...process.env,
80
+ IS_CHILD_CONSUMER: "true",
81
+ CONSUMER_ID: "2"
82
+ },
83
+ stdio: "inherit"
84
+ });
85
+ consumers.push(consumer2);
86
+ logger.info("\u2713 Consumer 2 launched");
87
+ logger.info("");
88
+ logger.info("Both consumers ready - demonstrating 1-1 and 1-n patterns...");
89
+ process.on("SIGINT", () => {
90
+ logger.info("");
91
+ logger.info("Stopping all consumers...");
92
+ consumers.forEach((c) => c.kill("SIGINT"));
93
+ setTimeout(() => process.exit(0), 2e3);
94
+ });
95
+ process.on("SIGTERM", () => {
96
+ logger.info("Stopping all consumers...");
97
+ consumers.forEach((c) => c.kill("SIGTERM"));
98
+ setTimeout(() => process.exit(0), 2e3);
99
+ });
100
+ consumer1.on("exit", (code) => {
101
+ logger.info({ code }, "Consumer 1 exited");
102
+ if (code !== 0) {
103
+ logger.error("Consumer 1 exited with error, stopping all...");
104
+ consumers.forEach((c) => c.kill());
105
+ process.exit(1);
106
+ }
107
+ });
108
+ consumer2.on("exit", (code) => {
109
+ logger.info({ code }, "Consumer 2 exited");
110
+ if (code !== 0) {
111
+ logger.error("Consumer 2 exited with error, stopping all...");
112
+ consumers.forEach((c) => c.kill());
113
+ process.exit(1);
114
+ }
115
+ });
116
+ }
117
+ //# sourceMappingURL=mixed-consumer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../lib/tests/mixed-consumer.ts"],"sourcesContent":["import { EventBusConsumer, type QueueHandlers, type ExchangeBindings, type EventHandler } from '../consumer.js';\nimport { logger } from '@a_jackie_z/logger';\nimport { spawn } from 'child_process';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\n\n// Check if this is a child consumer process\nconst isChildConsumer = process.env.IS_CHILD_CONSUMER === 'true';\nconst consumerId = process.env.CONSUMER_ID || '1';\n\nif (isChildConsumer) {\n // Child consumer logic\n // Example: Handlers for direct queue messages (1-1)\n const orderHandler: EventHandler = async (data) => {\n logger.info({ data, consumerId }, `[Consumer ${consumerId}] Processing direct order`);\n // Process order - only one consumer will handle this\n };\n\n // Example: Handlers for broadcast messages (1-n)\n const announcementHandler: EventHandler = async (data) => {\n logger.info({ data, consumerId }, `[Consumer ${consumerId}] Received broadcast announcement`);\n // All consumers will receive this\n };\n\n // Setup queue handlers - mix of direct and broadcast queues\n const queueHandlers: QueueHandlers = new Map([\n ['orders', [orderHandler]], // Direct queue (1-1)\n ['announcements', [announcementHandler]] // Broadcast queue (1-n)\n ]);\n\n // Setup exchange bindings - only for broadcast queues\n const exchangeBindings: ExchangeBindings = new Map([\n ['announcements', 'announcement_broadcast'] // Bind announcements to fanout exchange\n // 'orders' is NOT bound to an exchange, so it remains a direct queue\n ]);\n\n // Create consumer supporting both patterns\n const consumer = new EventBusConsumer({\n rabbitMqUrl: 'amqp://rabbitmq:12345678@192.168.2.151:5672',\n queueHandlers,\n onStateChange: (state, reconnectCount) => {\n logger.info({ state, reconnectCount, consumerId }, `[Consumer ${consumerId}] State change`);\n },\n exchangeBindings\n });\n\n async function runConsumer() {\n try {\n logger.info({ consumerId }, `[Consumer ${consumerId}] Starting mixed mode consumer (1-1 and 1-n)`);\n\n await consumer.connect();\n logger.info({ consumerId }, `[Consumer ${consumerId}] Connected - listening to direct queues and broadcasts`);\n\n // Keep the process running\n process.on('SIGINT', async () => {\n logger.info({ consumerId }, `[Consumer ${consumerId}] Disconnecting...`);\n await consumer.disconnect();\n process.exit(0);\n });\n\n process.on('SIGTERM', async () => {\n logger.info({ consumerId }, `[Consumer ${consumerId}] Disconnecting...`);\n await consumer.disconnect();\n process.exit(0);\n });\n } catch (error) {\n logger.error({ error, consumerId }, `[Consumer ${consumerId}] Failed to start`);\n process.exit(1);\n }\n }\n\n runConsumer();\n} else {\n // Parent process - spawn 2 consumer instances\n logger.info('=== Starting 2 Mixed Mode Consumers Demo ===');\n logger.info('Direct queue (orders): Only ONE consumer will process each message');\n logger.info('Broadcast (announcements): BOTH consumers will receive ALL messages');\n logger.info('Press Ctrl+C to stop all consumers');\n logger.info('');\n\n const consumers: any[] = [];\n\n // Spawn Consumer 1\n const consumer1 = spawn(process.execPath, [__filename], {\n env: {\n ...process.env,\n IS_CHILD_CONSUMER: 'true',\n CONSUMER_ID: '1'\n },\n stdio: 'inherit'\n });\n\n consumers.push(consumer1);\n logger.info('✓ Consumer 1 launched');\n\n // Spawn Consumer 2\n const consumer2 = spawn(process.execPath, [__filename], {\n env: {\n ...process.env,\n IS_CHILD_CONSUMER: 'true',\n CONSUMER_ID: '2'\n },\n stdio: 'inherit'\n });\n\n consumers.push(consumer2);\n logger.info('✓ Consumer 2 launched');\n logger.info('');\n logger.info('Both consumers ready - demonstrating 1-1 and 1-n patterns...');\n\n // Handle parent process signals\n process.on('SIGINT', () => {\n logger.info('');\n logger.info('Stopping all consumers...');\n consumers.forEach(c => c.kill('SIGINT'));\n setTimeout(() => process.exit(0), 2000);\n });\n\n process.on('SIGTERM', () => {\n logger.info('Stopping all consumers...');\n consumers.forEach(c => c.kill('SIGTERM'));\n setTimeout(() => process.exit(0), 2000);\n });\n\n // Handle child process exits\n consumer1.on('exit', (code) => {\n logger.info({ code }, 'Consumer 1 exited');\n if (code !== 0) {\n logger.error('Consumer 1 exited with error, stopping all...');\n consumers.forEach(c => c.kill());\n process.exit(1);\n }\n });\n\n consumer2.on('exit', (code) => {\n logger.info({ code }, 'Consumer 2 exited');\n if (code !== 0) {\n logger.error('Consumer 2 exited with error, stopping all...');\n consumers.forEach(c => c.kill());\n process.exit(1);\n }\n });\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,2 @@
1
+
2
+ export { }
@@ -0,0 +1,59 @@
1
+ import {
2
+ EventBusProducer
3
+ } from "../../chunk-YP7YVSEN.js";
4
+ import "../../chunk-JBE5KWYZ.js";
5
+
6
+ // lib/tests/mixed-producer.ts
7
+ import { logger } from "@a_jackie_z/logger";
8
+ async function main() {
9
+ const producer = new EventBusProducer({
10
+ rabbitMqUrl: "amqp://rabbitmq:12345678@192.168.2.151:5672",
11
+ onStateChange: (state, reconnectCount) => {
12
+ logger.info({ state, reconnectCount }, "Mixed producer state change");
13
+ }
14
+ });
15
+ try {
16
+ await producer.connect();
17
+ logger.info("Mixed producer connected and ready");
18
+ logger.debug("Sending direct order message");
19
+ await producer.publish("orders", {
20
+ orderId: 1001,
21
+ customerId: 5001,
22
+ items: ["item1", "item2"],
23
+ total: 99.99,
24
+ status: "pending",
25
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
26
+ });
27
+ await producer.publish("orders", {
28
+ orderId: 1002,
29
+ customerId: 5002,
30
+ items: ["item3"],
31
+ total: 49.99,
32
+ status: "pending",
33
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
34
+ });
35
+ logger.debug("Broadcasting announcement");
36
+ await producer.broadcast("announcement_broadcast", {
37
+ title: "New Product Launch",
38
+ message: "Exciting new product features available now!",
39
+ category: "product",
40
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
41
+ });
42
+ await producer.broadcast("announcement_broadcast", {
43
+ title: "System Update",
44
+ message: "All services will be updated to version 3.0",
45
+ category: "system",
46
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
47
+ });
48
+ logger.info("All messages sent successfully (both direct and broadcast)");
49
+ await new Promise((resolve) => setTimeout(resolve, 2e3));
50
+ await producer.disconnect();
51
+ logger.info("Mixed producer disconnected");
52
+ } catch (error) {
53
+ logger.error({ error }, "Failed to send mixed messages");
54
+ await producer.disconnect();
55
+ process.exit(1);
56
+ }
57
+ }
58
+ main();
59
+ //# sourceMappingURL=mixed-producer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../lib/tests/mixed-producer.ts"],"sourcesContent":["import { EventBusProducer } from '../producer.js';\nimport { logger } from '@a_jackie_z/logger';\n\nasync function main() {\n const producer = new EventBusProducer({\n rabbitMqUrl: 'amqp://rabbitmq:12345678@192.168.2.151:5672',\n onStateChange: (state, reconnectCount) => {\n logger.info({ state, reconnectCount }, 'Mixed producer state change');\n }\n });\n\n try {\n await producer.connect();\n logger.info('Mixed producer connected and ready');\n\n // Send direct messages (1-1 pattern) - only one consumer will process\n logger.debug('Sending direct order message');\n await producer.publish('orders', {\n orderId: 1001,\n customerId: 5001,\n items: ['item1', 'item2'],\n total: 99.99,\n status: 'pending',\n timestamp: new Date().toISOString()\n });\n\n await producer.publish('orders', {\n orderId: 1002,\n customerId: 5002,\n items: ['item3'],\n total: 49.99,\n status: 'pending',\n timestamp: new Date().toISOString()\n });\n\n // Broadcast messages (1-n pattern) - all consumers will receive\n logger.debug('Broadcasting announcement');\n await producer.broadcast('announcement_broadcast', {\n title: 'New Product Launch',\n message: 'Exciting new product features available now!',\n category: 'product',\n timestamp: new Date().toISOString()\n });\n\n await producer.broadcast('announcement_broadcast', {\n title: 'System Update',\n message: 'All services will be updated to version 3.0',\n category: 'system',\n timestamp: new Date().toISOString()\n });\n\n logger.info('All messages sent successfully (both direct and broadcast)');\n\n await new Promise(resolve => setTimeout(resolve, 2000));\n\n await producer.disconnect();\n logger.info('Mixed producer disconnected');\n } catch (error) {\n logger.error({ error }, 'Failed to send mixed messages');\n await producer.disconnect();\n process.exit(1);\n }\n}\n\nmain();\n"],"mappings":";;;;;;AACA,SAAS,cAAc;AAEvB,eAAe,OAAO;AACpB,QAAM,WAAW,IAAI,iBAAiB;AAAA,IACpC,aAAa;AAAA,IACb,eAAe,CAAC,OAAO,mBAAmB;AACxC,aAAO,KAAK,EAAE,OAAO,eAAe,GAAG,6BAA6B;AAAA,IACtE;AAAA,EACF,CAAC;AAED,MAAI;AACF,UAAM,SAAS,QAAQ;AACvB,WAAO,KAAK,oCAAoC;AAGhD,WAAO,MAAM,8BAA8B;AAC3C,UAAM,SAAS,QAAQ,UAAU;AAAA,MAC/B,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,OAAO,CAAC,SAAS,OAAO;AAAA,MACxB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AAED,UAAM,SAAS,QAAQ,UAAU;AAAA,MAC/B,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,OAAO,CAAC,OAAO;AAAA,MACf,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AAGD,WAAO,MAAM,2BAA2B;AACxC,UAAM,SAAS,UAAU,0BAA0B;AAAA,MACjD,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AAED,UAAM,SAAS,UAAU,0BAA0B;AAAA,MACjD,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AAED,WAAO,KAAK,4DAA4D;AAExE,UAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,GAAI,CAAC;AAEtD,UAAM,SAAS,WAAW;AAC1B,WAAO,KAAK,6BAA6B;AAAA,EAC3C,SAAS,OAAO;AACd,WAAO,MAAM,EAAE,MAAM,GAAG,+BAA+B;AACvD,UAAM,SAAS,WAAW;AAC1B,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,KAAK;","names":[]}
@@ -0,0 +1,2 @@
1
+
2
+ export { }
@@ -0,0 +1,60 @@
1
+ import {
2
+ EventBusProducer
3
+ } from "../../chunk-YP7YVSEN.js";
4
+ import "../../chunk-JBE5KWYZ.js";
5
+
6
+ // lib/tests/producer.ts
7
+ import { logger } from "@a_jackie_z/logger";
8
+ async function main() {
9
+ const producer = new EventBusProducer({
10
+ rabbitMqUrl: "amqp://rabbitmq:12345678@192.168.2.151:5672",
11
+ onStateChange: (state, reconnectCount) => {
12
+ logger.info({ state, reconnectCount }, "Producer state change");
13
+ }
14
+ });
15
+ try {
16
+ await producer.connect();
17
+ logger.info("Producer connected and ready");
18
+ logger.debug("Publishing user events");
19
+ await producer.publish("user_events", {
20
+ userId: 1001,
21
+ username: "john_doe",
22
+ email: "john@example.com",
23
+ createdAt: (/* @__PURE__ */ new Date()).toISOString()
24
+ });
25
+ await producer.publish("user_events", {
26
+ userId: 1002,
27
+ username: "jane_smith",
28
+ email: "jane@example.com",
29
+ createdAt: (/* @__PURE__ */ new Date()).toISOString()
30
+ });
31
+ logger.debug("Publishing order events");
32
+ await producer.publish("order_events", {
33
+ orderId: 5001,
34
+ userId: 1001,
35
+ items: ["laptop", "mouse"],
36
+ total: 1299.99,
37
+ status: "processed",
38
+ processedAt: (/* @__PURE__ */ new Date()).toISOString()
39
+ });
40
+ await producer.publish("order_events", {
41
+ orderId: 5002,
42
+ userId: 1002,
43
+ items: ["keyboard", "monitor"],
44
+ total: 599.99,
45
+ status: "processed",
46
+ processedAt: (/* @__PURE__ */ new Date()).toISOString()
47
+ });
48
+ logger.info("All messages published successfully");
49
+ logger.info("Disconnecting producer");
50
+ await producer.disconnect();
51
+ logger.info("Producer disconnected");
52
+ process.exit(0);
53
+ } catch (error) {
54
+ logger.error({ error }, "Error publishing messages");
55
+ await producer.disconnect();
56
+ process.exit(1);
57
+ }
58
+ }
59
+ main();
60
+ //# sourceMappingURL=producer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../lib/tests/producer.ts"],"sourcesContent":["import { EventBusProducer } from '../producer.ts';\nimport { logger } from '@a_jackie_z/logger';\n\nasync function main() {\n // Create producer with state change callback\n const producer = new EventBusProducer({\n rabbitMqUrl: 'amqp://rabbitmq:12345678@192.168.2.151:5672',\n onStateChange: (state, reconnectCount) => {\n logger.info({ state, reconnectCount }, 'Producer state change');\n }\n });\n\n try {\n // Connect to RabbitMQ\n await producer.connect();\n logger.info('Producer connected and ready');\n\n // Publish user events\n logger.debug('Publishing user events');\n await producer.publish('user_events', {\n userId: 1001,\n username: 'john_doe',\n email: 'john@example.com',\n createdAt: new Date().toISOString()\n });\n\n await producer.publish('user_events', {\n userId: 1002,\n username: 'jane_smith',\n email: 'jane@example.com',\n createdAt: new Date().toISOString()\n });\n\n // Publish order events\n logger.debug('Publishing order events');\n await producer.publish('order_events', {\n orderId: 5001,\n userId: 1001,\n items: ['laptop', 'mouse'],\n total: 1299.99,\n status: 'processed',\n processedAt: new Date().toISOString()\n });\n\n await producer.publish('order_events', {\n orderId: 5002,\n userId: 1002,\n items: ['keyboard', 'monitor'],\n total: 599.99,\n status: 'processed',\n processedAt: new Date().toISOString()\n });\n\n logger.info('All messages published successfully');\n\n // Graceful shutdown\n logger.info('Disconnecting producer');\n await producer.disconnect();\n logger.info('Producer disconnected');\n process.exit(0);\n } catch (error) {\n logger.error({ error }, 'Error publishing messages');\n await producer.disconnect();\n process.exit(1);\n }\n}\n\nmain();\n"],"mappings":";;;;;;AACA,SAAS,cAAc;AAEvB,eAAe,OAAO;AAEpB,QAAM,WAAW,IAAI,iBAAiB;AAAA,IACpC,aAAa;AAAA,IACb,eAAe,CAAC,OAAO,mBAAmB;AACxC,aAAO,KAAK,EAAE,OAAO,eAAe,GAAG,uBAAuB;AAAA,IAChE;AAAA,EACF,CAAC;AAED,MAAI;AAEF,UAAM,SAAS,QAAQ;AACvB,WAAO,KAAK,8BAA8B;AAG1C,WAAO,MAAM,wBAAwB;AACrC,UAAM,SAAS,QAAQ,eAAe;AAAA,MACpC,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,OAAO;AAAA,MACP,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AAED,UAAM,SAAS,QAAQ,eAAe;AAAA,MACpC,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,OAAO;AAAA,MACP,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AAGD,WAAO,MAAM,yBAAyB;AACtC,UAAM,SAAS,QAAQ,gBAAgB;AAAA,MACrC,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAO,CAAC,UAAU,OAAO;AAAA,MACzB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACtC,CAAC;AAED,UAAM,SAAS,QAAQ,gBAAgB;AAAA,MACrC,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAO,CAAC,YAAY,SAAS;AAAA,MAC7B,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACtC,CAAC;AAED,WAAO,KAAK,qCAAqC;AAGjD,WAAO,KAAK,wBAAwB;AACpC,UAAM,SAAS,WAAW;AAC1B,WAAO,KAAK,uBAAuB;AACnC,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,OAAO;AACd,WAAO,MAAM,EAAE,MAAM,GAAG,2BAA2B;AACnD,UAAM,SAAS,WAAW;AAC1B,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,KAAK;","names":[]}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@a_jackie_z/event-bus",
3
+ "version": "1.0.1",
4
+ "description": "An event bus using RabbitMQ",
5
+ "license": "MIT",
6
+ "author": "Sang Lu <connect.with.sang@gmail.com>",
7
+ "type": "module",
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsup",
21
+ "test:consumer": "LOG_PRETTY=true LOG_LEVEL=debug node dist/lib/tests/consumer.js",
22
+ "test:producer": "LOG_PRETTY=true LOG_LEVEL=debug node dist/lib/tests/producer.js",
23
+ "test:broadcast-consumer": "LOG_PRETTY=true LOG_LEVEL=debug node dist/lib/tests/broadcast-consumer.js",
24
+ "test:broadcast-producer": "LOG_PRETTY=true LOG_LEVEL=debug node dist/lib/tests/broadcast-producer.js",
25
+ "test:mixed-consumer": "LOG_PRETTY=true LOG_LEVEL=debug node dist/lib/tests/mixed-consumer.js",
26
+ "test:mixed-producer": "LOG_PRETTY=true LOG_LEVEL=debug node dist/lib/tests/mixed-producer.js"
27
+ },
28
+ "dependencies": {
29
+ "@a_jackie_z/logger": "^1.0.0",
30
+ "amqplib": "^0.10.9"
31
+ },
32
+ "devDependencies": {
33
+ "@types/amqplib": "^0.10.8",
34
+ "@types/node": "^25.0.9",
35
+ "ts-node": "^10.9.2",
36
+ "tsup": "^8.5.1",
37
+ "typescript": "^5.9.3"
38
+ }
39
+ }