@cfticketing/common 1.0.13 → 1.0.15

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,18 @@
1
+ import { Message, Stan } from "node-nats-streaming";
2
+ import { Subjects } from "./subjects";
3
+ interface Event {
4
+ subject: Subjects;
5
+ data: any;
6
+ }
7
+ export declare abstract class Listener<T extends Event> {
8
+ abstract subject: T["subject"];
9
+ abstract queueGroupName: string;
10
+ abstract onMessage(data: T["data"], msg: Message): void;
11
+ private client;
12
+ protected ackWait: number;
13
+ constructor(client: Stan);
14
+ subscriptionOptions(): import("node-nats-streaming").SubscriptionOptions;
15
+ listen(): void;
16
+ parseMessage(msg: Message): any;
17
+ }
18
+ export {};
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Listener = void 0;
4
+ // Abstract class for a NATS event listener
5
+ // Cannot be instantiated directly — must be extended by a subclass
6
+ class Listener {
7
+ // Constructor: must provide a NATS client when creating a subclass
8
+ constructor(client) {
9
+ // Protected property: accessible inside this class and subclasses
10
+ this.ackWait = 5 * 1000; // 5 seconds to acknowledge messages
11
+ this.client = client; // store client in private property
12
+ }
13
+ // Method to configure subscription options for NATS
14
+ subscriptionOptions() {
15
+ return this.client
16
+ .subscriptionOptions()
17
+ .setManualAckMode(true) // require manual ack of messages
18
+ .setAckWait(this.ackWait) // wait time before message is redelivered
19
+ .setDurableName(this.queueGroupName); // durable subscription: remembers last processed message
20
+ }
21
+ // Main method to start listening to NATS messages
22
+ listen() {
23
+ const subscription = this.client.subscribe(this.subject, // topic
24
+ this.queueGroupName, // queue group
25
+ this.subscriptionOptions());
26
+ // Event handler for when a message arrives
27
+ subscription.on("message", (msg) => {
28
+ console.log(`Received message: ${this.subject} / ${this.queueGroupName}`);
29
+ // Parse the message into JSON
30
+ const parsedData = this.parseMessage(msg);
31
+ console.log(`Parsed data: ${JSON.stringify(parsedData)}`);
32
+ // Call the subclass's implementation of onMessage
33
+ this.onMessage(parsedData, msg);
34
+ // Automatically ack the message after processing
35
+ msg.ack();
36
+ });
37
+ }
38
+ // Helper method to parse incoming NATS messages
39
+ parseMessage(msg) {
40
+ const data = msg.getData();
41
+ return typeof data === "string"
42
+ ? JSON.parse(data) // if message is a string
43
+ : JSON.parse(data.toString("utf8")); // if message is a buffer
44
+ }
45
+ }
46
+ exports.Listener = Listener;
47
+ //# sourceMappingURL=base-listener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-listener.js","sourceRoot":"","sources":["../../src/events/base-listener.ts"],"names":[],"mappings":";;;AAQA,2CAA2C;AAC3C,mEAAmE;AAEnE,MAAsB,QAAQ;IAY5B,mEAAmE;IACnE,YAAY,MAAY;QAJxB,kEAAkE;QACxD,YAAO,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,oCAAoC;QAIhE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,mCAAmC;IAC3D,CAAC;IAED,oDAAoD;IACpD,mBAAmB;QACjB,OAAO,IAAI,CAAC,MAAM;aACf,mBAAmB,EAAE;aACrB,gBAAgB,CAAC,IAAI,CAAC,CAAC,iCAAiC;aACxD,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,0CAA0C;aACnE,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,yDAAyD;IACnG,CAAC;IAED,kDAAkD;IAClD,MAAM;QACJ,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CACxC,IAAI,CAAC,OAAO,EAAE,QAAQ;QACtB,IAAI,CAAC,cAAc,EAAE,cAAc;QACnC,IAAI,CAAC,mBAAmB,EAAE,CAC3B,CAAC;QAEF,2CAA2C;QAC3C,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAY,EAAE,EAAE;YAC1C,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,OAAO,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;YAE1E,8BAA8B;YAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAE1D,kDAAkD;YAClD,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;YAEhC,iDAAiD;YACjD,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,gDAAgD;IAChD,YAAY,CAAC,GAAY;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;QAC3B,OAAO,OAAO,IAAI,KAAK,QAAQ;YAC7B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,yBAAyB;YAC5C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,yBAAyB;IAClE,CAAC;CACF;AAzDD,4BAyDC"}
@@ -0,0 +1,13 @@
1
+ import { Stan } from "node-nats-streaming";
2
+ import { Subjects } from "./subjects";
3
+ interface Event {
4
+ subject: Subjects;
5
+ data: any;
6
+ }
7
+ export declare abstract class Publisher<T extends Event> {
8
+ abstract subject: T["subject"];
9
+ private client;
10
+ constructor(client: Stan);
11
+ publish(data: T["data"]): Promise<void>;
12
+ }
13
+ export {};
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Publisher = void 0;
4
+ // Abstract class for a NATS event publisher
5
+ // Cannot be instantiated directly — must be extended by a subclass
6
+ class Publisher {
7
+ // Constructor: must provide a NATS client when creating a subclass
8
+ constructor(client) {
9
+ this.client = client; // store client in private property
10
+ }
11
+ // Method to publish an event to NATS
12
+ publish(data) {
13
+ return new Promise((resolve, reject) => {
14
+ this.client.publish(this.subject, JSON.stringify(data), (err) => {
15
+ if (err) {
16
+ console.error(`Error publishing ${this.subject}: ${err.message}`);
17
+ return reject(err);
18
+ }
19
+ console.log(`Event Published to subject${this.subject}`);
20
+ resolve();
21
+ });
22
+ });
23
+ }
24
+ }
25
+ exports.Publisher = Publisher;
26
+ //# sourceMappingURL=base-publisher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-publisher.js","sourceRoot":"","sources":["../../src/events/base-publisher.ts"],"names":[],"mappings":";;;AAQA,4CAA4C;AAC5C,mEAAmE;AACnE,MAAsB,SAAS;IAO7B,mEAAmE;IACnE,YAAY,MAAY;QACtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,mCAAmC;IAC3D,CAAC;IAED,qCAAqC;IACrC,OAAO,CAAC,IAAe;QACrB,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC9D,IAAI,GAAG,EAAE,CAAC;oBACR,OAAO,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;oBAClE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;gBACzD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAzBD,8BAyBC"}
@@ -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,9 @@
1
+ import { Subjects } from "./subjects";
2
+ export interface TicketCreatedEvent {
3
+ subject: Subjects.TicketCreated;
4
+ data: {
5
+ id: string;
6
+ title: string;
7
+ price: number;
8
+ };
9
+ }
@@ -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,10 @@
1
+ import { Subjects } from "./subjects";
2
+ export interface TicketUpdatedEvent {
3
+ subject: Subjects.TicketUpdated;
4
+ data: {
5
+ id: string;
6
+ title: string;
7
+ price: number;
8
+ userId: string;
9
+ };
10
+ }
@@ -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":""}
package/build/index.d.ts CHANGED
@@ -8,3 +8,8 @@ export * from "./middlewares/current-user.js";
8
8
  export * from "./middlewares/error-handler.js";
9
9
  export * from "./middlewares/require-auth.js";
10
10
  export * from "./middlewares/validate-request.js";
11
+ export * from "./events/base-listener";
12
+ export * from "./events/base-publisher";
13
+ export * from "./events/subjects";
14
+ export * from "./events/ticket-updated-event";
15
+ export * from "./events/ticket-created-event";
package/build/index.js CHANGED
@@ -24,4 +24,9 @@ __exportStar(require("./middlewares/current-user.js"), exports);
24
24
  __exportStar(require("./middlewares/error-handler.js"), exports);
25
25
  __exportStar(require("./middlewares/require-auth.js"), exports);
26
26
  __exportStar(require("./middlewares/validate-request.js"), exports);
27
+ __exportStar(require("./events/base-listener"), exports);
28
+ __exportStar(require("./events/base-publisher"), exports);
29
+ __exportStar(require("./events/subjects"), exports);
30
+ __exportStar(require("./events/ticket-updated-event"), exports);
31
+ __exportStar(require("./events/ticket-created-event"), exports);
27
32
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8DAA4C;AAC5C,gEAA8C;AAC9C,wEAAsD;AACtD,mEAAiD;AACjD,uEAAqD;AACrD,2DAAyC;AAEzC,gEAA8C;AAC9C,iEAA+C;AAC/C,gEAA8C;AAC9C,oEAAkD"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8DAA4C;AAC5C,gEAA8C;AAC9C,wEAAsD;AACtD,mEAAiD;AACjD,uEAAqD;AACrD,2DAAyC;AAEzC,gEAA8C;AAC9C,iEAA+C;AAC/C,gEAA8C;AAC9C,oEAAkD;AAElD,yDAAuC;AACvC,0DAAwC;AACxC,oDAAkC;AAClC,gEAA8C;AAC9C,gEAA8C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cfticketing/common",
3
- "version": "1.0.13",
3
+ "version": "1.0.15",
4
4
  "description": "",
5
5
  "main": "./build/index.js",
6
6
  "types": "./build/index.d.ts",
@@ -19,16 +19,17 @@
19
19
  "express": "^4.18.0 || ^5.0.0"
20
20
  },
21
21
  "devDependencies": {
22
- "typescript": "^5.9.3",
22
+ "@types/cookie-session": "^2.0.49",
23
+ "@types/express": "^4.17.25",
24
+ "@types/jsonwebtoken": "^9.0.10",
23
25
  "del-cli": "^7.0.0",
24
26
  "express": "^4.21.2",
25
- "@types/express": "^4.17.25",
26
- "@types/cookie-session": "^2.0.49",
27
- "@types/jsonwebtoken": "^9.0.10"
27
+ "typescript": "^5.9.3"
28
28
  },
29
29
  "dependencies": {
30
30
  "cookie-session": "^2.1.1",
31
31
  "express-validator": "^7.3.1",
32
- "jsonwebtoken": "^9.0.3"
32
+ "jsonwebtoken": "^9.0.3",
33
+ "node-nats-streaming": "^0.3.2"
33
34
  }
34
35
  }