@er3tickets/common 0.0.8 → 0.0.9

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,28 @@
1
+ import { Consumer, EachMessagePayload, Message } from "kafkajs";
2
+ import { Kafka } from 'kafkajs';
3
+ import { Subjects } from "./subjects";
4
+ import { Topics } from "./topics";
5
+ interface Event {
6
+ topic: Topics;
7
+ subject: Subjects;
8
+ data: any;
9
+ }
10
+ export interface ConsumerMessage<T extends Event> {
11
+ key?: Message['key'];
12
+ value: T['data'];
13
+ partition: number;
14
+ offset: string;
15
+ }
16
+ export declare abstract class BaseConsumer<T extends Event> {
17
+ protected abstract topic: T['topic'];
18
+ protected abstract subject: T['subject'];
19
+ protected abstract consumerGroupId: string;
20
+ protected abstract onMessage(data: ConsumerMessage<T>): void;
21
+ private client;
22
+ protected consumer: Consumer;
23
+ constructor(client: Kafka);
24
+ start(): Promise<void>;
25
+ protected parseMessage({ partition, message }: EachMessagePayload): ConsumerMessage<T>;
26
+ private setupGracefulShutdown;
27
+ }
28
+ export {};
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseConsumer = void 0;
4
+ class BaseConsumer {
5
+ client;
6
+ consumer;
7
+ constructor(client) {
8
+ this.client = client;
9
+ }
10
+ async start() {
11
+ this.consumer = this.client.consumer({
12
+ groupId: this.consumerGroupId,
13
+ });
14
+ this.setupGracefulShutdown();
15
+ try {
16
+ await this.consumer.connect();
17
+ await this.consumer.subscribe({
18
+ topic: this.topic,
19
+ fromBeginning: false,
20
+ });
21
+ await this.consumer.run({
22
+ autoCommit: true,
23
+ eachMessage: async (payload) => {
24
+ const parsedData = this.parseMessage(payload);
25
+ this.onMessage(parsedData);
26
+ },
27
+ });
28
+ }
29
+ catch (err) {
30
+ console.error('Consumer processing failed!', err);
31
+ process.exit(1);
32
+ }
33
+ }
34
+ parseMessage({ partition, message }) {
35
+ let value = null;
36
+ try {
37
+ value = message.value
38
+ ? JSON.parse(message.value.toString())
39
+ : null;
40
+ }
41
+ catch (err) {
42
+ console.error('Invalid JSON message', err);
43
+ }
44
+ return {
45
+ partition,
46
+ offset: message.offset,
47
+ key: message.key?.toString(),
48
+ value,
49
+ };
50
+ }
51
+ setupGracefulShutdown() {
52
+ let shuttingDown = false;
53
+ const shutdown = async () => {
54
+ if (shuttingDown)
55
+ return;
56
+ shuttingDown = true;
57
+ console.log('Disconnecting consumer...');
58
+ try {
59
+ await this.consumer.disconnect();
60
+ }
61
+ finally {
62
+ process.exit(0);
63
+ }
64
+ };
65
+ process.once('SIGINT', shutdown);
66
+ process.once('SIGTERM', shutdown);
67
+ }
68
+ }
69
+ exports.BaseConsumer = BaseConsumer;
70
+ //# sourceMappingURL=base-consumer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-consumer.js","sourceRoot":"","sources":["../../src/events/base-consumer.ts"],"names":[],"mappings":";;;AAkBA,MAAsB,YAAY;IAKxB,MAAM,CAAO;IACX,QAAQ,CAAW;IAE7B,YAAY,MAAa;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YACnC,OAAO,EAAE,IAAI,CAAC,eAAe;SAC9B,CAAC,CAAC;QACH,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAC5B,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;YAEH,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACtB,UAAU,EAAE,IAAI;gBAChB,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;oBAE7B,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;oBAC9C,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;gBAC7B,CAAC;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAES,YAAY,CAAC,EAAE,SAAS,EAAE,OAAO,EAAsB;QAC/D,IAAI,KAAK,GAAG,IAAI,CAAC;QAEjB,IAAI,CAAC;YACH,KAAK,GAAG,OAAO,CAAC,KAAK;gBACnB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACtC,CAAC,CAAC,IAAI,CAAC;QACX,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO;YACL,SAAS;YACT,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE;YAC5B,KAAK;SACN,CAAC;IACJ,CAAC;IAEO,qBAAqB;QAC3B,IAAI,YAAY,GAAG,KAAK,CAAC;QAEzB,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;YAC1B,IAAI,YAAY;gBAAE,OAAO;YACzB,YAAY,GAAG,IAAI,CAAC;YAEpB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YACzC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YACnC,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CAAC;QAEF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC;CACF;AA3ED,oCA2EC"}
@@ -0,0 +1,25 @@
1
+ import { Kafka, Message, Producer } from "kafkajs";
2
+ import { Subjects } from "./subjects";
3
+ import { Topics } from "./topics";
4
+ interface Event {
5
+ topic: Topics;
6
+ subject: Subjects;
7
+ data: any;
8
+ }
9
+ export interface ProducerMessage<T extends Event> {
10
+ key?: Message['key'];
11
+ value: T['data'];
12
+ }
13
+ export declare abstract class BaseProducer<T extends Event> {
14
+ protected abstract topic: T['topic'];
15
+ protected abstract subject: T['subject'];
16
+ private client;
17
+ protected producer: Producer;
18
+ constructor(client: Kafka);
19
+ send(messages: ProducerMessage<T>[]): Promise<void>;
20
+ serializeMessage(data: ProducerMessage<T>[]): {
21
+ key: string | Buffer<ArrayBufferLike> | null | undefined;
22
+ value: string;
23
+ }[];
24
+ }
25
+ export {};
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseProducer = void 0;
4
+ class BaseProducer {
5
+ client;
6
+ producer;
7
+ constructor(client) {
8
+ this.client = client;
9
+ }
10
+ async send(messages) {
11
+ this.producer = this.client.producer({});
12
+ const serialzedMessages = this.serializeMessage(messages);
13
+ try {
14
+ await this.producer.connect();
15
+ await this.producer.send({
16
+ topic: this.topic,
17
+ messages: serialzedMessages
18
+ });
19
+ console.log('Messages sent', { serialzedMessages });
20
+ await this.producer.disconnect();
21
+ }
22
+ catch (err) {
23
+ console.error('Producer processing failed!', err);
24
+ process.exit(1);
25
+ }
26
+ }
27
+ serializeMessage(data) {
28
+ return data.map(d => ({
29
+ key: d.key,
30
+ value: JSON.stringify(d.value)
31
+ }));
32
+ }
33
+ }
34
+ exports.BaseProducer = BaseProducer;
35
+ //# sourceMappingURL=base-producer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-producer.js","sourceRoot":"","sources":["../../src/events/base-producer.ts"],"names":[],"mappings":";;;AAeA,MAAsB,YAAY;IAGxB,MAAM,CAAO;IACX,QAAQ,CAAU;IAG5B,YAAY,MAAa;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAA8B;QACvC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAGpC,CAAC,CAAC;QAEH,MAAM,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;QAEzD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACvB,KAAK,EAAE,IAAI,CAAC,KAAK;gBAEjB,QAAQ,EAAE,iBAAiB;aAC5B,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,iBAAiB,EAAE,CAAC,CAAC;YACpD,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,gBAAgB,CAAC,IAA0B;QACzC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpB,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;SAC/B,CAAC,CAAC,CAAA;IACL,CAAC;CACF;AAzCD,oCAyCC"}
@@ -0,0 +1,4 @@
1
+ export declare enum Subjects {
2
+ TicketCreated = "ticket-created",
3
+ TicketUpdated = "ticket-updated"
4
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Subjects = void 0;
4
+ var Subjects;
5
+ (function (Subjects) {
6
+ Subjects["TicketCreated"] = "ticket-created";
7
+ Subjects["TicketUpdated"] = "ticket-updated";
8
+ })(Subjects || (exports.Subjects = Subjects = {}));
9
+ //# sourceMappingURL=subjects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subjects.js","sourceRoot":"","sources":["../../src/events/subjects.ts"],"names":[],"mappings":";;;AAAA,IAAY,QAGX;AAHD,WAAY,QAAQ;IAClB,4CAAgC,CAAA;IAChC,4CAAgC,CAAA;AAClC,CAAC,EAHW,QAAQ,wBAAR,QAAQ,QAGnB"}
@@ -0,0 +1,12 @@
1
+ import { Subjects } from './subjects';
2
+ import { Topics } from './topics';
3
+ export interface TicketCreatedEvent {
4
+ topic: Topics;
5
+ subject: Subjects.TicketCreated;
6
+ data: {
7
+ id: string;
8
+ title: string;
9
+ price: number;
10
+ userId: string;
11
+ };
12
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ticket-created-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticket-created-event.js","sourceRoot":"","sources":["../../src/events/ticket-created-event.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import { Subjects } from './subjects';
2
+ import { Topics } from './topics';
3
+ export interface TicketUpdatedEvent {
4
+ topic: Topics;
5
+ subject: Subjects.TicketUpdated;
6
+ data: {
7
+ id: string;
8
+ title: string;
9
+ price: number;
10
+ userId: string;
11
+ };
12
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ticket-updated-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticket-updated-event.js","sourceRoot":"","sources":["../../src/events/ticket-updated-event.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export declare enum Topics {
2
+ TicketEvent = "ticket-events"
3
+ }
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Topics = void 0;
4
+ var Topics;
5
+ (function (Topics) {
6
+ Topics["TicketEvent"] = "ticket-events";
7
+ })(Topics || (exports.Topics = Topics = {}));
8
+ //# sourceMappingURL=topics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topics.js","sourceRoot":"","sources":["../../src/events/topics.ts"],"names":[],"mappings":";;;AAAA,IAAY,MAEX;AAFD,WAAY,MAAM;IAChB,uCAA6B,CAAA;AAC/B,CAAC,EAFW,MAAM,sBAAN,MAAM,QAEjB"}
package/dist/index.d.ts CHANGED
@@ -7,4 +7,10 @@ export * from './errors/request-validation-error';
7
7
  export * from './middlewares/current-user.middleware';
8
8
  export * from './middlewares/cookie-session.middleware';
9
9
  export * from './middlewares/require-auth.middleware';
10
+ export * from './events/base-consumer';
11
+ export * from './events/base-producer';
12
+ export * from './events/subjects';
13
+ export * from './events/topics';
14
+ export * from './events/ticket-created-event';
15
+ export * from './events/ticket-updated-event';
10
16
  export * from './filters/custom-exception.filter';
package/dist/index.js CHANGED
@@ -23,5 +23,11 @@ __exportStar(require("./errors/request-validation-error"), exports);
23
23
  __exportStar(require("./middlewares/current-user.middleware"), exports);
24
24
  __exportStar(require("./middlewares/cookie-session.middleware"), exports);
25
25
  __exportStar(require("./middlewares/require-auth.middleware"), exports);
26
+ __exportStar(require("./events/base-consumer"), exports);
27
+ __exportStar(require("./events/base-producer"), exports);
28
+ __exportStar(require("./events/subjects"), exports);
29
+ __exportStar(require("./events/topics"), exports);
30
+ __exportStar(require("./events/ticket-created-event"), exports);
31
+ __exportStar(require("./events/ticket-updated-event"), exports);
26
32
  __exportStar(require("./filters/custom-exception.filter"), exports);
27
33
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6DAA2C;AAC3C,wDAAsC;AACtC,qEAAmD;AACnD,gEAA8C;AAC9C,2DAAyC;AACzC,oEAAkD;AAElD,wEAAsD;AACtD,0EAAwD;AACxD,wEAAsD;AAEtD,oEAAkD"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6DAA2C;AAC3C,wDAAsC;AACtC,qEAAmD;AACnD,gEAA8C;AAC9C,2DAAyC;AACzC,oEAAkD;AAElD,wEAAsD;AACtD,0EAAwD;AACxD,wEAAsD;AAEtD,yDAAuC;AACvC,yDAAuC;AACvC,oDAAkC;AAClC,kDAAgC;AAChC,gEAA8C;AAC9C,gEAA8C;AAE9C,oEAAkD"}