@geekmidas/events 0.1.0 → 1.0.0
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/CHANGELOG.md +12 -0
- package/dist/{BasicConnection-C4_Y0nIj.d.mts → BasicConnection-BTRsXiuH.d.cts} +3 -2
- package/dist/BasicConnection-BTRsXiuH.d.cts.map +1 -0
- package/dist/BasicConnection-Bz3F2rXA.cjs.map +1 -1
- package/dist/{BasicConnection-CddnULuT.d.cts → BasicConnection-DIxtA7jK.d.mts} +3 -2
- package/dist/BasicConnection-DIxtA7jK.d.mts.map +1 -0
- package/dist/BasicConnection-DOSOFSsW.mjs.map +1 -1
- package/dist/BasicPublisher-CaX8GCUi.mjs.map +1 -1
- package/dist/{BasicPublisher-DCBxaTwC.d.mts → BasicPublisher-CpJFK2oS.d.mts} +5 -3
- package/dist/BasicPublisher-CpJFK2oS.d.mts.map +1 -0
- package/dist/{BasicPublisher-V5hELHG9.d.cts → BasicPublisher-D1q0a2xp.d.cts} +5 -3
- package/dist/BasicPublisher-D1q0a2xp.d.cts.map +1 -0
- package/dist/BasicPublisher-afwuA4Xp.cjs.map +1 -1
- package/dist/{BasicSubscriber-BB3aKeph.d.mts → BasicSubscriber-6w0Af4DD.d.mts} +5 -3
- package/dist/BasicSubscriber-6w0Af4DD.d.mts.map +1 -0
- package/dist/{BasicSubscriber-Ckf3BkxS.cjs → BasicSubscriber-BN9fKRrU.cjs} +2 -4
- package/dist/BasicSubscriber-BN9fKRrU.cjs.map +1 -0
- package/dist/{BasicSubscriber-DPpJNUUY.mjs → BasicSubscriber-BgsKYQmi.mjs} +2 -4
- package/dist/BasicSubscriber-BgsKYQmi.mjs.map +1 -0
- package/dist/{BasicSubscriber-DOwgFw5j.d.cts → BasicSubscriber-DXxQewjc.d.cts} +5 -3
- package/dist/BasicSubscriber-DXxQewjc.d.cts.map +1 -0
- package/dist/{EventConnection-DZhn1Msl.d.cts → EventConnection-BaJRXdg7.d.cts} +2 -2
- package/dist/EventConnection-BaJRXdg7.d.cts.map +1 -0
- package/dist/EventConnection-ClLMoIUU.mjs.map +1 -1
- package/dist/EventConnection-F_N81SXu.cjs.map +1 -1
- package/dist/{EventConnection-DeXfLGom.d.mts → EventConnection-SOhtmxib.d.mts} +2 -2
- package/dist/EventConnection-SOhtmxib.d.mts.map +1 -0
- package/dist/EventConnection.d.cts +2 -2
- package/dist/EventConnection.d.mts +2 -2
- package/dist/{Publisher-C3m8JFXm.d.mts → Publisher-1CfcYRnm.d.mts} +4 -2
- package/dist/Publisher-1CfcYRnm.d.mts.map +1 -0
- package/dist/{Publisher-nXNVjL0e.d.cts → Publisher-BfNgvHwQ.d.cts} +4 -2
- package/dist/Publisher-BfNgvHwQ.d.cts.map +1 -0
- package/dist/Publisher-DS0aOh8r.mjs.map +1 -1
- package/dist/Publisher-ceu6OxCj.cjs.map +1 -1
- package/dist/Publisher.d.cts +2 -2
- package/dist/Publisher.d.mts +2 -2
- package/dist/{RabbitMQConnection-7cWp_-_Q.d.cts → RabbitMQConnection-Bm8VCI2R.d.cts} +3 -2
- package/dist/RabbitMQConnection-Bm8VCI2R.d.cts.map +1 -0
- package/dist/{RabbitMQConnection-BN_GybOv.cjs → RabbitMQConnection-CjBoCd9n.cjs} +2 -2
- package/dist/RabbitMQConnection-CjBoCd9n.cjs.map +1 -0
- package/dist/{RabbitMQConnection-C2HC7J7K.d.mts → RabbitMQConnection-Ck-ktCp_.d.mts} +3 -2
- package/dist/RabbitMQConnection-Ck-ktCp_.d.mts.map +1 -0
- package/dist/{RabbitMQConnection-eVOVS4Dl.mjs → RabbitMQConnection-DFLkr2vq.mjs} +2 -2
- package/dist/RabbitMQConnection-DFLkr2vq.mjs.map +1 -0
- package/dist/{RabbitMQPublisher-CSCn6gMA.cjs → RabbitMQPublisher-C94q6g8q.cjs} +1 -1
- package/dist/RabbitMQPublisher-C94q6g8q.cjs.map +1 -0
- package/dist/{RabbitMQPublisher-CpcbgrXj.d.cts → RabbitMQPublisher-COnxcWEZ.d.mts} +5 -3
- package/dist/RabbitMQPublisher-COnxcWEZ.d.mts.map +1 -0
- package/dist/{RabbitMQPublisher-DDZi15Ro.d.mts → RabbitMQPublisher-qQT7-1-p.d.cts} +5 -3
- package/dist/RabbitMQPublisher-qQT7-1-p.d.cts.map +1 -0
- package/dist/{RabbitMQPublisher-BZX0edgL.mjs → RabbitMQPublisher-yUqWNq-P.mjs} +1 -1
- package/dist/RabbitMQPublisher-yUqWNq-P.mjs.map +1 -0
- package/dist/{RabbitMQSubscriber-B5I-hBaT.mjs → RabbitMQSubscriber-BWniDtFs.mjs} +2 -3
- package/dist/RabbitMQSubscriber-BWniDtFs.mjs.map +1 -0
- package/dist/{RabbitMQSubscriber-BJ9PTGny.d.cts → RabbitMQSubscriber-C_sZjDPU.d.mts} +5 -3
- package/dist/RabbitMQSubscriber-C_sZjDPU.d.mts.map +1 -0
- package/dist/{RabbitMQSubscriber-CIvIw8MG.d.mts → RabbitMQSubscriber-D12sssMb.d.cts} +5 -3
- package/dist/RabbitMQSubscriber-D12sssMb.d.cts.map +1 -0
- package/dist/{RabbitMQSubscriber-Cj7qLIi6.cjs → RabbitMQSubscriber-DGEO-clQ.cjs} +2 -3
- package/dist/RabbitMQSubscriber-DGEO-clQ.cjs.map +1 -0
- package/dist/{SNSConnection-CAImaMM2.d.mts → SNSConnection-BDfQrVBO.d.cts} +3 -2
- package/dist/SNSConnection-BDfQrVBO.d.cts.map +1 -0
- package/dist/{SNSConnection-DVEE3XoC.mjs → SNSConnection-D8a31sJK.mjs} +1 -1
- package/dist/SNSConnection-D8a31sJK.mjs.map +1 -0
- package/dist/{SNSConnection-CZz_U56V.cjs → SNSConnection-DqLbiQ_X.cjs} +1 -1
- package/dist/SNSConnection-DqLbiQ_X.cjs.map +1 -0
- package/dist/{SNSConnection-Cqbr7-Ho.d.cts → SNSConnection-mHb10nQ6.d.mts} +3 -2
- package/dist/SNSConnection-mHb10nQ6.d.mts.map +1 -0
- package/dist/{SNSPublisher-DbWVH-g_.cjs → SNSPublisher-BRgwumLS.cjs} +2 -3
- package/dist/SNSPublisher-BRgwumLS.cjs.map +1 -0
- package/dist/{SNSPublisher-Dkhb4LU-.d.mts → SNSPublisher-CM7UAWtf.d.mts} +7 -6
- package/dist/SNSPublisher-CM7UAWtf.d.mts.map +1 -0
- package/dist/{SNSPublisher-Do-FMUyT.mjs → SNSPublisher-i4w_-RmP.mjs} +2 -3
- package/dist/SNSPublisher-i4w_-RmP.mjs.map +1 -0
- package/dist/{SNSPublisher-RVZFa7kL.d.cts → SNSPublisher-kpsSlGDn.d.cts} +7 -6
- package/dist/SNSPublisher-kpsSlGDn.d.cts.map +1 -0
- package/dist/{SNSSubscriber-e7eG48yJ.mjs → SNSSubscriber-BEf-H4p5.mjs} +5 -9
- package/dist/SNSSubscriber-BEf-H4p5.mjs.map +1 -0
- package/dist/{SNSSubscriber-B31JmkAE.d.mts → SNSSubscriber-DDB3--pm.d.cts} +4 -3
- package/dist/SNSSubscriber-DDB3--pm.d.cts.map +1 -0
- package/dist/{SNSSubscriber-k2UwKUxu.d.cts → SNSSubscriber-Dwo8391f.d.mts} +4 -3
- package/dist/SNSSubscriber-Dwo8391f.d.mts.map +1 -0
- package/dist/{SNSSubscriber-DpEwQ8Tb.cjs → SNSSubscriber-FYqSi346.cjs} +5 -9
- package/dist/SNSSubscriber-FYqSi346.cjs.map +1 -0
- package/dist/{SQSConnection-C5WFqZW7.d.mts → SQSConnection-B5Ep9Tma.d.cts} +3 -2
- package/dist/SQSConnection-B5Ep9Tma.d.cts.map +1 -0
- package/dist/{SQSConnection-geav2Rsn.d.cts → SQSConnection-BI_xOzyJ.d.mts} +3 -2
- package/dist/SQSConnection-BI_xOzyJ.d.mts.map +1 -0
- package/dist/{SQSConnection-BBlDWZLU.mjs → SQSConnection-BwHhXLIu.mjs} +1 -1
- package/dist/SQSConnection-BwHhXLIu.mjs.map +1 -0
- package/dist/{SQSConnection-DWYDtftQ.cjs → SQSConnection-Ctu3XY9E.cjs} +1 -1
- package/dist/SQSConnection-Ctu3XY9E.cjs.map +1 -0
- package/dist/{SQSPublisher-B3lS2zbu.mjs → SQSPublisher-BDGMw1uf.mjs} +1 -1
- package/dist/SQSPublisher-BDGMw1uf.mjs.map +1 -0
- package/dist/{SQSPublisher-CdsayOLV.d.mts → SQSPublisher-BN1ds6SN.d.mts} +5 -3
- package/dist/SQSPublisher-BN1ds6SN.d.mts.map +1 -0
- package/dist/{SQSPublisher-nzbSaXSH.cjs → SQSPublisher-C3Y_gOjV.cjs} +1 -1
- package/dist/SQSPublisher-C3Y_gOjV.cjs.map +1 -0
- package/dist/{SQSPublisher-Utb_FTe5.d.cts → SQSPublisher-DFTqwzRW.d.cts} +5 -3
- package/dist/SQSPublisher-DFTqwzRW.d.cts.map +1 -0
- package/dist/{SQSSubscriber-DcL9BbG1.cjs → SQSSubscriber-BB9TWyLA.cjs} +5 -12
- package/dist/SQSSubscriber-BB9TWyLA.cjs.map +1 -0
- package/dist/{SQSSubscriber-B6iL1EnX.d.cts → SQSSubscriber-BO2me_gs.d.cts} +4 -3
- package/dist/SQSSubscriber-BO2me_gs.d.cts.map +1 -0
- package/dist/{SQSSubscriber-DBeE4XAR.d.mts → SQSSubscriber-FyZFfr2-.d.mts} +4 -3
- package/dist/SQSSubscriber-FyZFfr2-.d.mts.map +1 -0
- package/dist/{SQSSubscriber-84pFnW1z.mjs → SQSSubscriber-ux7QEMdd.mjs} +5 -12
- package/dist/SQSSubscriber-ux7QEMdd.mjs.map +1 -0
- package/dist/Subscriber-Bd9hb_jp.mjs.map +1 -1
- package/dist/{Subscriber-Cff9EIpv.d.mts → Subscriber-BxT-KzFJ.d.mts} +4 -2
- package/dist/Subscriber-BxT-KzFJ.d.mts.map +1 -0
- package/dist/{Subscriber-CpAwcUzb.d.cts → Subscriber-DDD_4Nlx.d.cts} +4 -2
- package/dist/Subscriber-DDD_4Nlx.d.cts.map +1 -0
- package/dist/Subscriber-saVOWuMq.cjs.map +1 -1
- package/dist/Subscriber.d.cts +2 -2
- package/dist/Subscriber.d.mts +2 -2
- package/dist/basic/BasicConnection.d.cts +2 -2
- package/dist/basic/BasicConnection.d.mts +2 -2
- package/dist/basic/BasicPublisher.d.cts +3 -3
- package/dist/basic/BasicPublisher.d.mts +3 -3
- package/dist/basic/BasicSubscriber.cjs +1 -1
- package/dist/basic/BasicSubscriber.d.cts +3 -3
- package/dist/basic/BasicSubscriber.d.mts +3 -3
- package/dist/basic/BasicSubscriber.mjs +1 -1
- package/dist/basic/index.cjs +1 -1
- package/dist/basic/index.d.cts +4 -4
- package/dist/basic/index.d.mts +4 -4
- package/dist/basic/index.mjs +1 -1
- package/dist/index.d.cts +4 -4
- package/dist/index.d.mts +4 -4
- package/dist/rabbitmq/RabbitMQConnection.cjs +1 -1
- package/dist/rabbitmq/RabbitMQConnection.d.cts +2 -2
- package/dist/rabbitmq/RabbitMQConnection.d.mts +2 -2
- package/dist/rabbitmq/RabbitMQConnection.mjs +1 -1
- package/dist/rabbitmq/RabbitMQPublisher.cjs +1 -1
- package/dist/rabbitmq/RabbitMQPublisher.d.cts +3 -3
- package/dist/rabbitmq/RabbitMQPublisher.d.mts +3 -3
- package/dist/rabbitmq/RabbitMQPublisher.mjs +1 -1
- package/dist/rabbitmq/RabbitMQSubscriber.cjs +1 -1
- package/dist/rabbitmq/RabbitMQSubscriber.d.cts +3 -3
- package/dist/rabbitmq/RabbitMQSubscriber.d.mts +3 -3
- package/dist/rabbitmq/RabbitMQSubscriber.mjs +1 -1
- package/dist/rabbitmq/index.cjs +3 -3
- package/dist/rabbitmq/index.d.cts +4 -4
- package/dist/rabbitmq/index.d.mts +4 -4
- package/dist/rabbitmq/index.mjs +3 -3
- package/dist/sns/SNSConnection.cjs +1 -1
- package/dist/sns/SNSConnection.d.cts +2 -2
- package/dist/sns/SNSConnection.d.mts +2 -2
- package/dist/sns/SNSConnection.mjs +1 -1
- package/dist/sns/SNSPublisher.cjs +1 -1
- package/dist/sns/SNSPublisher.d.cts +3 -3
- package/dist/sns/SNSPublisher.d.mts +3 -3
- package/dist/sns/SNSPublisher.mjs +1 -1
- package/dist/sns/SNSSubscriber.cjs +3 -3
- package/dist/sns/SNSSubscriber.d.cts +3 -3
- package/dist/sns/SNSSubscriber.d.mts +3 -3
- package/dist/sns/SNSSubscriber.mjs +3 -3
- package/dist/sns/index.cjs +5 -5
- package/dist/sns/index.d.cts +4 -4
- package/dist/sns/index.d.mts +4 -4
- package/dist/sns/index.mjs +5 -5
- package/dist/sqs/SQSConnection.cjs +1 -1
- package/dist/sqs/SQSConnection.d.cts +2 -2
- package/dist/sqs/SQSConnection.d.mts +2 -2
- package/dist/sqs/SQSConnection.mjs +1 -1
- package/dist/sqs/SQSPublisher.cjs +1 -1
- package/dist/sqs/SQSPublisher.d.cts +3 -3
- package/dist/sqs/SQSPublisher.d.mts +3 -3
- package/dist/sqs/SQSPublisher.mjs +1 -1
- package/dist/sqs/SQSSubscriber.cjs +1 -1
- package/dist/sqs/SQSSubscriber.d.cts +3 -3
- package/dist/sqs/SQSSubscriber.d.mts +3 -3
- package/dist/sqs/SQSSubscriber.mjs +1 -1
- package/dist/sqs/index.cjs +3 -3
- package/dist/sqs/index.d.cts +4 -4
- package/dist/sqs/index.d.mts +4 -4
- package/dist/sqs/index.mjs +3 -3
- package/dist/types-B63qHVOG.mjs.map +1 -1
- package/dist/types-CvSMEO5z.cjs.map +1 -1
- package/dist/{types-D0g-o6wX.d.mts → types-DSVsPgKd.d.mts} +2 -1
- package/dist/types-DSVsPgKd.d.mts.map +1 -0
- package/dist/{types-DEGUg5BA.d.cts → types-Dmbp1U-6.d.cts} +2 -1
- package/dist/types-Dmbp1U-6.d.cts.map +1 -0
- package/dist/types.d.cts +1 -1
- package/dist/types.d.mts +1 -1
- package/package.json +3 -3
- package/src/EventConnection.ts +31 -31
- package/src/Publisher.ts +78 -78
- package/src/Subscriber.ts +91 -91
- package/src/__tests__/EventConnection.spec.ts +42 -0
- package/src/__tests__/Publisher.spec.ts +96 -0
- package/src/__tests__/Subscriber.spec.ts +91 -23
- package/src/basic/BasicConnection.ts +35 -35
- package/src/basic/BasicPublisher.ts +8 -8
- package/src/basic/BasicSubscriber.ts +13 -16
- package/src/basic/__tests__/BasicSubscriber.spec.ts +116 -116
- package/src/index.ts +13 -13
- package/src/rabbitmq/RabbitMQConnection.ts +139 -139
- package/src/rabbitmq/RabbitMQPublisher.ts +48 -48
- package/src/rabbitmq/RabbitMQSubscriber.ts +100 -102
- package/src/rabbitmq/__tests__/RabbitMQPublisher.spec.ts +364 -364
- package/src/rabbitmq/__tests__/RabbitMQSubscriber.spec.ts +204 -204
- package/src/rabbitmq/index.ts +3 -3
- package/src/sns/SNSConnection.ts +76 -76
- package/src/sns/SNSPublisher.ts +54 -56
- package/src/sns/SNSSubscriber.ts +187 -191
- package/src/sns/__tests__/SNS-SQS-Integration.spec.ts +321 -321
- package/src/sns/__tests__/SNSPublisher.spec.ts +449 -0
- package/src/sns/__tests__/SNSSubscriber.spec.ts +527 -0
- package/src/sns/index.ts +3 -3
- package/src/sqs/SQSConnection.ts +75 -75
- package/src/sqs/SQSPublisher.ts +93 -93
- package/src/sqs/SQSSubscriber.ts +157 -165
- package/src/sqs/__tests__/SQSPublisher.spec.ts +178 -178
- package/src/sqs/index.ts +3 -3
- package/src/types.ts +28 -29
- package/tsconfig.json +9 -0
- package/tsdown.config.ts +1 -1
- package/dist/BasicSubscriber-Ckf3BkxS.cjs.map +0 -1
- package/dist/BasicSubscriber-DPpJNUUY.mjs.map +0 -1
- package/dist/RabbitMQConnection-BN_GybOv.cjs.map +0 -1
- package/dist/RabbitMQConnection-eVOVS4Dl.mjs.map +0 -1
- package/dist/RabbitMQPublisher-BZX0edgL.mjs.map +0 -1
- package/dist/RabbitMQPublisher-CSCn6gMA.cjs.map +0 -1
- package/dist/RabbitMQSubscriber-B5I-hBaT.mjs.map +0 -1
- package/dist/RabbitMQSubscriber-Cj7qLIi6.cjs.map +0 -1
- package/dist/SNSConnection-CZz_U56V.cjs.map +0 -1
- package/dist/SNSConnection-DVEE3XoC.mjs.map +0 -1
- package/dist/SNSPublisher-DbWVH-g_.cjs.map +0 -1
- package/dist/SNSPublisher-Do-FMUyT.mjs.map +0 -1
- package/dist/SNSSubscriber-DpEwQ8Tb.cjs.map +0 -1
- package/dist/SNSSubscriber-e7eG48yJ.mjs.map +0 -1
- package/dist/SQSConnection-BBlDWZLU.mjs.map +0 -1
- package/dist/SQSConnection-DWYDtftQ.cjs.map +0 -1
- package/dist/SQSPublisher-B3lS2zbu.mjs.map +0 -1
- package/dist/SQSPublisher-nzbSaXSH.cjs.map +0 -1
- package/dist/SQSSubscriber-84pFnW1z.mjs.map +0 -1
- package/dist/SQSSubscriber-DcL9BbG1.cjs.map +0 -1
|
@@ -3,45 +3,45 @@ import type { EventConnection } from '../types';
|
|
|
3
3
|
import { EventPublisherType } from '../types';
|
|
4
4
|
|
|
5
5
|
export class BasicConnection implements EventConnection {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
readonly type = EventPublisherType.Basic;
|
|
7
|
+
private emitter: EventEmitter;
|
|
8
|
+
private connected = false;
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
constructor() {
|
|
11
|
+
this.emitter = new EventEmitter();
|
|
12
|
+
}
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Create a BasicConnection from a connection string
|
|
16
|
+
* Format: basic://
|
|
17
|
+
*/
|
|
18
|
+
static async fromConnectionString(
|
|
19
|
+
_connectionString: string,
|
|
20
|
+
): Promise<BasicConnection> {
|
|
21
|
+
// Basic connection doesn't need any configuration
|
|
22
|
+
const connection = new BasicConnection();
|
|
23
|
+
await connection.connect();
|
|
24
|
+
return connection;
|
|
25
|
+
}
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
async connect(): Promise<void> {
|
|
28
|
+
this.connected = true;
|
|
29
|
+
}
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
async close(): Promise<void> {
|
|
32
|
+
this.emitter.removeAllListeners();
|
|
33
|
+
this.connected = false;
|
|
34
|
+
}
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
isConnected(): boolean {
|
|
37
|
+
return this.connected;
|
|
38
|
+
}
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
40
|
+
/**
|
|
41
|
+
* Get the underlying EventEmitter
|
|
42
|
+
* Used by BasicPublisher and BasicSubscriber
|
|
43
|
+
*/
|
|
44
|
+
get eventEmitter(): EventEmitter {
|
|
45
|
+
return this.emitter;
|
|
46
|
+
}
|
|
47
47
|
}
|
|
@@ -2,14 +2,14 @@ import type { EventPublisher, PublishableMessage } from '../types';
|
|
|
2
2
|
import type { BasicConnection } from './BasicConnection';
|
|
3
3
|
|
|
4
4
|
export class BasicPublisher<TMessage extends PublishableMessage<string, any>>
|
|
5
|
-
|
|
5
|
+
implements EventPublisher<TMessage>
|
|
6
6
|
{
|
|
7
|
-
|
|
7
|
+
constructor(private connection: BasicConnection) {}
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
async publish(messages: TMessage[]) {
|
|
10
|
+
const emitter = this.connection.eventEmitter;
|
|
11
|
+
for (const message of messages) {
|
|
12
|
+
emitter.emit(message.type, message);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
15
|
}
|
|
@@ -2,23 +2,20 @@ import type { EventSubscriber, PublishableMessage } from '../types';
|
|
|
2
2
|
import type { BasicConnection } from './BasicConnection';
|
|
3
3
|
|
|
4
4
|
export class BasicSubscriber<TMessage extends PublishableMessage<string, any>>
|
|
5
|
-
|
|
5
|
+
implements EventSubscriber<TMessage>
|
|
6
6
|
{
|
|
7
|
-
|
|
7
|
+
constructor(private connection: BasicConnection) {}
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
async subscribe(
|
|
10
|
+
messages: TMessage['type'][],
|
|
11
|
+
listener: (payload: TMessage) => Promise<void>,
|
|
12
|
+
): Promise<void> {
|
|
13
|
+
const emitter = this.connection.eventEmitter;
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
}
|
|
15
|
+
for (const messageType of messages) {
|
|
16
|
+
emitter.on(messageType, (message: TMessage) => {
|
|
17
|
+
listener(message).catch((_error) => {});
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
}
|
|
24
21
|
}
|
|
@@ -7,160 +7,160 @@ import { BasicSubscriber } from '../BasicSubscriber';
|
|
|
7
7
|
type TestMessage = PublishableMessage<'user.created' | 'user.updated', any>;
|
|
8
8
|
|
|
9
9
|
describe('BasicSubscriber', () => {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
it('should receive published messages', async () => {
|
|
11
|
+
const connection = new BasicConnection();
|
|
12
|
+
await connection.connect();
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
const publisher = new BasicPublisher<TestMessage>(connection);
|
|
15
|
+
const subscriber = new BasicSubscriber<TestMessage>(connection);
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
const receivedMessages: TestMessage[] = [];
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
await subscriber.subscribe(['user.created'], async (message) => {
|
|
20
|
+
receivedMessages.push(message);
|
|
21
|
+
});
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
await publisher.publish([
|
|
24
|
+
{ type: 'user.created', payload: { userId: '123' } },
|
|
25
|
+
]);
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
// Give event emitter time to process
|
|
28
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
expect(receivedMessages).toHaveLength(1);
|
|
31
|
+
expect(receivedMessages[0]).toEqual({
|
|
32
|
+
type: 'user.created',
|
|
33
|
+
payload: { userId: '123' },
|
|
34
|
+
});
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
await connection.close();
|
|
37
|
+
});
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
it('should receive multiple message types', async () => {
|
|
40
|
+
const connection = new BasicConnection();
|
|
41
|
+
await connection.connect();
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
const publisher = new BasicPublisher<TestMessage>(connection);
|
|
44
|
+
const subscriber = new BasicSubscriber<TestMessage>(connection);
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
const receivedMessages: TestMessage[] = [];
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
48
|
+
await subscriber.subscribe(
|
|
49
|
+
['user.created', 'user.updated'],
|
|
50
|
+
async (message) => {
|
|
51
|
+
receivedMessages.push(message);
|
|
52
|
+
},
|
|
53
|
+
);
|
|
54
54
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
55
|
+
await publisher.publish([
|
|
56
|
+
{ type: 'user.created', payload: { userId: '1' } },
|
|
57
|
+
{ type: 'user.updated', payload: { userId: '2' } },
|
|
58
|
+
{ type: 'user.created', payload: { userId: '3' } },
|
|
59
|
+
]);
|
|
60
60
|
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
// Give event emitter time to process
|
|
62
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
63
63
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
64
|
+
expect(receivedMessages).toHaveLength(3);
|
|
65
|
+
expect(receivedMessages[0].type).toBe('user.created');
|
|
66
|
+
expect(receivedMessages[1].type).toBe('user.updated');
|
|
67
|
+
expect(receivedMessages[2].type).toBe('user.created');
|
|
68
68
|
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
await connection.close();
|
|
70
|
+
});
|
|
71
71
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
72
|
+
it('should only receive subscribed message types', async () => {
|
|
73
|
+
const connection = new BasicConnection();
|
|
74
|
+
await connection.connect();
|
|
75
75
|
|
|
76
|
-
|
|
77
|
-
|
|
76
|
+
const publisher = new BasicPublisher<TestMessage>(connection);
|
|
77
|
+
const subscriber = new BasicSubscriber<TestMessage>(connection);
|
|
78
78
|
|
|
79
|
-
|
|
79
|
+
const receivedMessages: TestMessage[] = [];
|
|
80
80
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
81
|
+
// Only subscribe to user.created
|
|
82
|
+
await subscriber.subscribe(['user.created'], async (message) => {
|
|
83
|
+
receivedMessages.push(message);
|
|
84
|
+
});
|
|
85
85
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
86
|
+
await publisher.publish([
|
|
87
|
+
{ type: 'user.created', payload: { userId: '1' } },
|
|
88
|
+
{ type: 'user.updated', payload: { userId: '2' } },
|
|
89
|
+
{ type: 'user.created', payload: { userId: '3' } },
|
|
90
|
+
]);
|
|
91
91
|
|
|
92
|
-
|
|
93
|
-
|
|
92
|
+
// Give event emitter time to process
|
|
93
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
94
94
|
|
|
95
|
-
|
|
96
|
-
|
|
95
|
+
expect(receivedMessages).toHaveLength(2);
|
|
96
|
+
expect(receivedMessages.every((m) => m.type === 'user.created')).toBe(true);
|
|
97
97
|
|
|
98
|
-
|
|
99
|
-
|
|
98
|
+
await connection.close();
|
|
99
|
+
});
|
|
100
100
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
101
|
+
it('should handle multiple subscribers on same connection', async () => {
|
|
102
|
+
const connection = new BasicConnection();
|
|
103
|
+
await connection.connect();
|
|
104
104
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
105
|
+
const publisher = new BasicPublisher<TestMessage>(connection);
|
|
106
|
+
const subscriber1 = new BasicSubscriber<TestMessage>(connection);
|
|
107
|
+
const subscriber2 = new BasicSubscriber<TestMessage>(connection);
|
|
108
108
|
|
|
109
|
-
|
|
110
|
-
|
|
109
|
+
const messages1: TestMessage[] = [];
|
|
110
|
+
const messages2: TestMessage[] = [];
|
|
111
111
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
112
|
+
await subscriber1.subscribe(['user.created'], async (message) => {
|
|
113
|
+
messages1.push(message);
|
|
114
|
+
});
|
|
115
115
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
116
|
+
await subscriber2.subscribe(['user.created'], async (message) => {
|
|
117
|
+
messages2.push(message);
|
|
118
|
+
});
|
|
119
119
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
120
|
+
await publisher.publish([
|
|
121
|
+
{ type: 'user.created', payload: { userId: '123' } },
|
|
122
|
+
]);
|
|
123
123
|
|
|
124
|
-
|
|
125
|
-
|
|
124
|
+
// Give event emitter time to process
|
|
125
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
126
126
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
127
|
+
// Both subscribers should receive the message
|
|
128
|
+
expect(messages1).toHaveLength(1);
|
|
129
|
+
expect(messages2).toHaveLength(1);
|
|
130
130
|
|
|
131
|
-
|
|
132
|
-
|
|
131
|
+
await connection.close();
|
|
132
|
+
});
|
|
133
133
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
134
|
+
it('should handle async listener errors gracefully', async () => {
|
|
135
|
+
const connection = new BasicConnection();
|
|
136
|
+
await connection.connect();
|
|
137
137
|
|
|
138
|
-
|
|
139
|
-
|
|
138
|
+
const publisher = new BasicPublisher<TestMessage>(connection);
|
|
139
|
+
const subscriber = new BasicSubscriber<TestMessage>(connection);
|
|
140
140
|
|
|
141
|
-
|
|
141
|
+
const receivedMessages: TestMessage[] = [];
|
|
142
142
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
143
|
+
await subscriber.subscribe(['user.created'], async (message) => {
|
|
144
|
+
if (message.payload.userId === '2') {
|
|
145
|
+
throw new Error('Test error');
|
|
146
|
+
}
|
|
147
|
+
receivedMessages.push(message);
|
|
148
|
+
});
|
|
149
149
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
150
|
+
await publisher.publish([
|
|
151
|
+
{ type: 'user.created', payload: { userId: '1' } },
|
|
152
|
+
{ type: 'user.created', payload: { userId: '2' } },
|
|
153
|
+
{ type: 'user.created', payload: { userId: '3' } },
|
|
154
|
+
]);
|
|
155
155
|
|
|
156
|
-
|
|
157
|
-
|
|
156
|
+
// Give event emitter time to process
|
|
157
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
158
158
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
159
|
+
// Should receive messages 1 and 3 (2 throws error)
|
|
160
|
+
expect(receivedMessages).toHaveLength(2);
|
|
161
|
+
expect(receivedMessages[0].payload.userId).toBe('1');
|
|
162
|
+
expect(receivedMessages[1].payload.userId).toBe('3');
|
|
163
163
|
|
|
164
|
-
|
|
165
|
-
|
|
164
|
+
await connection.close();
|
|
165
|
+
});
|
|
166
166
|
});
|
package/src/index.ts
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
// Generic types and interfaces
|
|
2
|
-
export type {
|
|
3
|
-
EventConnection,
|
|
4
|
-
EventPublisher,
|
|
5
|
-
EventSubscriber,
|
|
6
|
-
ExtractPublisherMessage,
|
|
7
|
-
MappedEvent,
|
|
8
|
-
PublishableMessage,
|
|
9
|
-
} from './types';
|
|
10
|
-
export { EventPublisherType } from './types';
|
|
11
2
|
|
|
12
|
-
|
|
13
|
-
export { Publisher } from './Publisher';
|
|
3
|
+
export { EventConnectionFactory } from './EventConnection';
|
|
14
4
|
export type { EventPublisherConnectionString } from './Publisher';
|
|
15
5
|
|
|
16
|
-
|
|
6
|
+
// Generic factories
|
|
7
|
+
export { Publisher } from './Publisher';
|
|
17
8
|
export type { EventSubscriberConnectionString } from './Subscriber';
|
|
18
9
|
|
|
19
|
-
export {
|
|
10
|
+
export { Subscriber } from './Subscriber';
|
|
11
|
+
export type {
|
|
12
|
+
EventConnection,
|
|
13
|
+
EventPublisher,
|
|
14
|
+
EventSubscriber,
|
|
15
|
+
ExtractPublisherMessage,
|
|
16
|
+
MappedEvent,
|
|
17
|
+
PublishableMessage,
|
|
18
|
+
} from './types';
|
|
19
|
+
export { EventPublisherType } from './types';
|
|
20
20
|
|
|
21
21
|
// Specific integrations should be imported via subpaths:
|
|
22
22
|
// - @geekmidas/events/basic
|