@tickrorg/common 1.0.10 → 1.0.12

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/dist/index.d.ts CHANGED
@@ -10,4 +10,8 @@ export * from "./middlewares/require-auth";
10
10
  export * from "./middlewares/validate-request";
11
11
  export * from "./middlewares/require-role";
12
12
  export * from "./services/token";
13
+ export * from "./services/rabbitmq";
14
+ export * from "./services/publisher";
15
+ export * from "./services/consumer";
16
+ export * from "./types/events";
13
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,oCAAoC,CAAC;AACnD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,mCAAmC,CAAC;AAElD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAE3C,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,oCAAoC,CAAC;AACnD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,mCAAmC,CAAC;AAElD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAE3C,cAAc,kBAAkB,CAAC;AAEjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAA"}
package/dist/index.js CHANGED
@@ -10,4 +10,8 @@ export * from "./middlewares/require-auth";
10
10
  export * from "./middlewares/validate-request";
11
11
  export * from "./middlewares/require-role";
12
12
  export * from "./services/token";
13
+ export * from "./services/rabbitmq";
14
+ export * from "./services/publisher";
15
+ export * from "./services/consumer";
16
+ export * from "./types/events";
13
17
  //# 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,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,oCAAoC,CAAC;AACnD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,mCAAmC,CAAC;AAElD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAE3C,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,oCAAoC,CAAC;AACnD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,mCAAmC,CAAC;AAElD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAE3C,cAAc,kBAAkB,CAAC;AAEjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAA"}
@@ -0,0 +1,11 @@
1
+ import { Channel, ConsumeMessage } from "amqplib";
2
+ import { Event } from "../types/events";
3
+ export declare abstract class Consumer<T extends Event> {
4
+ abstract subject: T["subject"];
5
+ abstract queueName: string;
6
+ abstract onMessage(data: T["data"], msg: ConsumeMessage): Promise<void>;
7
+ protected channel: Channel;
8
+ constructor(channel: Channel);
9
+ listen(): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=consumer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumer.d.ts","sourceRoot":"","sources":["../../src/services/consumer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAGxC,8BAAsB,QAAQ,CAAC,CAAC,SAAS,KAAK;IAC5C,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAEvE,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC;gBAEf,OAAO,EAAE,OAAO;IAItB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAuB9B"}
@@ -0,0 +1,28 @@
1
+ import { EXCHANGE_NAME } from "./rabbitmq";
2
+ export class Consumer {
3
+ constructor(channel) {
4
+ this.channel = channel;
5
+ }
6
+ async listen() {
7
+ const queue = await this.channel.assertQueue(this.queueName, {
8
+ durable: true,
9
+ });
10
+ await this.channel.bindQueue(queue.queue, EXCHANGE_NAME, this.subject);
11
+ this.channel.prefetch(1);
12
+ await this.channel.consume(queue.queue, async (msg) => {
13
+ if (!msg)
14
+ return;
15
+ try {
16
+ const parsed = JSON.parse(msg.content.toString());
17
+ await this.onMessage(parsed, msg);
18
+ this.channel.ack(msg);
19
+ }
20
+ catch (err) {
21
+ console.error(`[rabbitmq] error in ${this.queueName}`, err);
22
+ this.channel.nack(msg, false, false);
23
+ }
24
+ });
25
+ console.info(`[rabbitmq] consuming ${this.queueName}`);
26
+ }
27
+ }
28
+ //# sourceMappingURL=consumer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumer.js","sourceRoot":"","sources":["../../src/services/consumer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,OAAgB,QAAQ;IAO5B,YAAY,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE;YAC3D,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAEvE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEzB,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACpD,IAAI,CAAC,GAAG;gBAAE,OAAO;YACjB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAc,CAAC;gBAC/D,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBAClC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC;gBAC5D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YACvC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,CAAC,wBAAwB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACzD,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import { Channel } from "amqplib";
2
+ import { Event } from "../types/events";
3
+ export declare abstract class Publisher<T extends Event> {
4
+ protected channel: Channel;
5
+ abstract subject: T["subject"];
6
+ constructor(channel: Channel);
7
+ publish(data: T["data"]): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=publisher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publisher.d.ts","sourceRoot":"","sources":["../../src/services/publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAGxC,8BAAsB,SAAS,CAAC,CAAC,SAAS,KAAK;IAGjC,SAAS,CAAC,OAAO,EAAE,OAAO;IAFtC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;gBAET,OAAO,EAAE,OAAO;IAEhC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAQ9C"}
@@ -0,0 +1,10 @@
1
+ import { EXCHANGE_NAME } from "./rabbitmq";
2
+ export class Publisher {
3
+ constructor(channel) {
4
+ this.channel = channel;
5
+ }
6
+ async publish(data) {
7
+ this.channel.publish(EXCHANGE_NAME, this.subject, Buffer.from(JSON.stringify(data)), { persistent: true, contentType: "application/json" });
8
+ }
9
+ }
10
+ //# sourceMappingURL=publisher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publisher.js","sourceRoot":"","sources":["../../src/services/publisher.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,OAAgB,SAAS;IAG7B,YAAsB,OAAgB;QAAhB,YAAO,GAAP,OAAO,CAAS;IAAG,CAAC;IAE1C,KAAK,CAAC,OAAO,CAAC,IAAe;QAC3B,IAAI,CAAC,OAAO,CAAC,OAAO,CAClB,aAAa,EACb,IAAI,CAAC,OAAO,EACZ,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EACjC,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE,CACtD,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import { Channel } from "amqplib";
2
+ export declare const EXCHANGE_NAME = "tickrorg.events";
3
+ declare class RabbitMQ {
4
+ private connection;
5
+ private channel;
6
+ connect(url: string): Promise<Channel>;
7
+ getChannel(): Channel;
8
+ close(): Promise<void>;
9
+ }
10
+ export declare const rabbit: RabbitMQ;
11
+ export {};
12
+ //# sourceMappingURL=rabbitmq.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabbitmq.d.ts","sourceRoot":"","sources":["../../src/services/rabbitmq.ts"],"names":[],"mappings":"AAAA,OAAa,EAAE,OAAO,EAAgB,MAAM,SAAS,CAAC;AAEtD,eAAO,MAAM,aAAa,oBAAoB,CAAC;AAE/C,cAAM,QAAQ;IACZ,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,OAAO,CAAwB;IAEjC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAwB5C,UAAU,IAAI,OAAO;IAKf,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAS7B;AAED,eAAO,MAAM,MAAM,UAAiB,CAAC"}
@@ -0,0 +1,44 @@
1
+ import amqp from "amqplib";
2
+ export const EXCHANGE_NAME = "tickrorg.events";
3
+ class RabbitMQ {
4
+ constructor() {
5
+ this.connection = null;
6
+ this.channel = null;
7
+ }
8
+ async connect(url) {
9
+ if (this.channel)
10
+ return this.channel;
11
+ this.connection = await amqp.connect(url);
12
+ this.channel = await this.connection.createChannel();
13
+ await this.channel.assertExchange(EXCHANGE_NAME, "topic", {
14
+ durable: true,
15
+ });
16
+ this.connection.on("close", () => {
17
+ this.connection = null;
18
+ this.channel = null;
19
+ console.warn("[rabbitmq] connection closed");
20
+ });
21
+ this.connection.on("error", (err) => {
22
+ console.error("[rabbitmq] connection error", err);
23
+ });
24
+ console.info("[rabbitmq] connected");
25
+ return this.channel;
26
+ }
27
+ getChannel() {
28
+ if (!this.channel)
29
+ throw new Error("RabbitMQ not connected");
30
+ return this.channel;
31
+ }
32
+ async close() {
33
+ try {
34
+ await this.channel?.close();
35
+ await this.connection?.close();
36
+ }
37
+ finally {
38
+ this.channel = null;
39
+ this.connection = null;
40
+ }
41
+ }
42
+ }
43
+ export const rabbit = new RabbitMQ();
44
+ //# sourceMappingURL=rabbitmq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabbitmq.js","sourceRoot":"","sources":["../../src/services/rabbitmq.ts"],"names":[],"mappings":"AAAA,OAAO,IAA+B,MAAM,SAAS,CAAC;AAEtD,MAAM,CAAC,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAE/C,MAAM,QAAQ;IAAd;QACU,eAAU,GAAwB,IAAI,CAAC;QACvC,YAAO,GAAmB,IAAI,CAAC;IAwCzC,CAAC;IAtCC,KAAK,CAAC,OAAO,CAAC,GAAW;QACvB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC;QAEtC,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;QAErD,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,aAAa,EAAE,OAAO,EAAE;YACxD,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAC/B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAClC,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,UAAU;QACR,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC;QACjC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,25 @@
1
+ export interface UserEventData {
2
+ id: string;
3
+ email: string;
4
+ name?: string;
5
+ phoneNumber?: string;
6
+ avatarUrl?: string;
7
+ type: number;
8
+ verified: boolean;
9
+ isActive: boolean;
10
+ version: number;
11
+ }
12
+ export declare enum EventSubjects {
13
+ TicketCreated = "ticket.created",
14
+ TicketUpdated = "ticket.updated",
15
+ OrderCreated = "order.created",
16
+ OrderCancelled = "order.cancelled",
17
+ PaymentSucceeded = "payment.succeeded",
18
+ UserCreated = "user.created",
19
+ UserUpdated = "user.updated"
20
+ }
21
+ export interface Event {
22
+ subject: EventSubjects;
23
+ data: UserEventData | unknown;
24
+ }
25
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/types/events.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AACD,oBAAY,aAAa;IACvB,aAAa,mBAAmB;IAChC,aAAa,mBAAmB;IAChC,YAAY,kBAAkB;IAC9B,cAAc,oBAAoB;IAClC,gBAAgB,sBAAsB;IACtC,WAAW,iBAAiB;IAC5B,WAAW,iBAAiB;CAC7B;AAED,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC;CAC/B"}
@@ -0,0 +1,11 @@
1
+ export var EventSubjects;
2
+ (function (EventSubjects) {
3
+ EventSubjects["TicketCreated"] = "ticket.created";
4
+ EventSubjects["TicketUpdated"] = "ticket.updated";
5
+ EventSubjects["OrderCreated"] = "order.created";
6
+ EventSubjects["OrderCancelled"] = "order.cancelled";
7
+ EventSubjects["PaymentSucceeded"] = "payment.succeeded";
8
+ EventSubjects["UserCreated"] = "user.created";
9
+ EventSubjects["UserUpdated"] = "user.updated";
10
+ })(EventSubjects || (EventSubjects = {}));
11
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/types/events.ts"],"names":[],"mappings":"AAYA,MAAM,CAAN,IAAY,aAQX;AARD,WAAY,aAAa;IACvB,iDAAgC,CAAA;IAChC,iDAAgC,CAAA;IAChC,+CAA8B,CAAA;IAC9B,mDAAkC,CAAA;IAClC,uDAAsC,CAAA;IACtC,6CAA4B,CAAA;IAC5B,6CAA4B,CAAA;AAC9B,CAAC,EARW,aAAa,KAAb,aAAa,QAQxB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tickrorg/common",
3
- "version": "1.0.10",
3
+ "version": "1.0.12",
4
4
  "description": "",
5
5
  "license": "ISC",
6
6
  "author": "",
@@ -13,21 +13,24 @@
13
13
  "package.json"
14
14
  ],
15
15
  "scripts": {
16
+ "clean": "rimraf dist",
16
17
  "build": "npm run clean && tsc",
17
- "clean": "del-cli dist",
18
- "pub": "git add . && git commit -m 'update' && npm version patch && npm run build && npm publish"
18
+ "pub": "git add . && git commit -m 'update' && npm version patch && npm publish"
19
19
  },
20
20
  "dependencies": {
21
- "@types/cookie-parser": "^1.4.10",
22
- "@types/express": "^5.0.6",
23
- "@types/jsonwebtoken": "^9.0.10",
21
+ "amqplib": "^2.2.0",
24
22
  "cookie-parser": "^1.4.7",
25
23
  "express": "^5.2.1",
26
24
  "express-validator": "^7.3.2",
27
25
  "jsonwebtoken": "^9.0.3"
28
26
  },
29
27
  "devDependencies": {
30
- "del-cli": "^7.0.0",
28
+ "@types/amqplib": "^0.10.8",
29
+ "@types/cookie-parser": "^1.4.10",
30
+ "@types/express": "^5.0.6",
31
+ "@types/jsonwebtoken": "^9.0.10",
32
+ "@types/node": "^26.6.4",
33
+ "rimraf": "^6.1.3",
31
34
  "typescript": "^6.0.3"
32
35
  }
33
36
  }