@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.
- package/build/events/base-listener.d.ts +18 -0
- package/build/events/base-listener.js +47 -0
- package/build/events/base-listener.js.map +1 -0
- package/build/events/base-publisher.d.ts +13 -0
- package/build/events/base-publisher.js +26 -0
- package/build/events/base-publisher.js.map +1 -0
- package/build/events/subjects.d.ts +4 -0
- package/build/events/subjects.js +9 -0
- package/build/events/subjects.js.map +1 -0
- package/build/events/ticket-created-event.d.ts +9 -0
- package/build/events/ticket-created-event.js +3 -0
- package/build/events/ticket-created-event.js.map +1 -0
- package/build/events/ticket-updated-event.d.ts +10 -0
- package/build/events/ticket-updated-event.js +3 -0
- package/build/events/ticket-updated-event.js.map +1 -0
- package/build/index.d.ts +5 -0
- package/build/index.js +5 -0
- package/build/index.js.map +1 -1
- package/package.json +7 -6
|
@@ -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,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 @@
|
|
|
1
|
+
{"version":3,"file":"ticket-created-event.js","sourceRoot":"","sources":["../../src/events/ticket-created-event.ts"],"names":[],"mappings":""}
|
|
@@ -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
|
package/build/index.js.map
CHANGED
|
@@ -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.
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
}
|