@eratu/common 1.0.1 → 1.0.3

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.
@@ -1,6 +1,8 @@
1
+ import { Streams } from "./streams";
1
2
  import { Subjects } from "./subjects";
2
- export interface BookCreated {
3
+ export interface BookCreatedEvent {
3
4
  subject: Subjects.BookCreated;
5
+ stream: Streams.BookServiceStream;
4
6
  data: {
5
7
  id: string;
6
8
  version: number;
@@ -15,7 +15,8 @@ export declare abstract class Listener<T extends Event> {
15
15
  protected ackWait: number;
16
16
  protected codec: import("nats").Codec<unknown>;
17
17
  constructor(js: JetStreamClient, jsm: JetStreamManager);
18
- private ensureStreamAndConsumer;
18
+ private waitForStream;
19
+ private createConsumerIfNotExists;
19
20
  listen(): Promise<void>;
20
21
  private parseMessage;
21
22
  }
@@ -25,23 +25,35 @@ class Listener {
25
25
  this.jsm = jsm;
26
26
  this.js = js;
27
27
  }
28
- ensureStreamAndConsumer() {
28
+ waitForStream() {
29
29
  return __awaiter(this, void 0, void 0, function* () {
30
- // 1. Ensure stream exists
31
- try {
32
- yield this.jsm.streams.info(this.stream);
33
- }
34
- catch (_a) {
35
- yield this.jsm.streams.add({
36
- name: this.stream,
37
- subjects: [this.subject],
38
- });
30
+ let retryCount = 0;
31
+ while (true) {
32
+ try {
33
+ yield this.jsm.streams.info(this.stream);
34
+ console.log(`✅ Stream "${this.stream}" is ready`);
35
+ return;
36
+ }
37
+ catch (_a) {
38
+ console.log(`⏳ Waiting for stream "${this.stream}"...`);
39
+ yield new Promise((res) => setTimeout(res, 2000));
40
+ }
41
+ retryCount++;
42
+ if (retryCount > 5) {
43
+ console.error(`❌ Stream "${this.stream}" is not ready after 5 attempts`);
44
+ throw new Error(`Stream "${this.stream}" is not ready`);
45
+ }
39
46
  }
40
- // 2. Ensure durable consumer exists
47
+ });
48
+ }
49
+ createConsumerIfNotExists() {
50
+ return __awaiter(this, void 0, void 0, function* () {
51
+ yield this.waitForStream();
52
+ // Ensure durable consumer exists
41
53
  try {
42
54
  yield this.jsm.consumers.info(this.stream, this.durableName);
43
55
  }
44
- catch (_b) {
56
+ catch (_a) {
45
57
  yield this.jsm.consumers.add(this.stream, {
46
58
  durable_name: this.durableName,
47
59
  ack_policy: nats_1.AckPolicy.Explicit,
@@ -49,14 +61,14 @@ class Listener {
49
61
  filter_subject: this.subject,
50
62
  });
51
63
  }
52
- // 3. Get the consumer object
64
+ // Get the consumer object
53
65
  this.consumer = yield this.js.consumers.get(this.stream, this.durableName);
54
66
  });
55
67
  }
56
68
  listen() {
57
69
  return __awaiter(this, void 0, void 0, function* () {
58
70
  var _a, e_1, _b, _c;
59
- yield this.ensureStreamAndConsumer();
71
+ yield this.createConsumerIfNotExists();
60
72
  const messages = yield this.consumer.consume();
61
73
  try {
62
74
  for (var _d = true, messages_1 = __asyncValues(messages), messages_1_1; messages_1_1 = yield messages_1.next(), _a = messages_1_1.done, !_a; _d = true) {
@@ -0,0 +1,14 @@
1
+ import { JetStreamClient } from "nats";
2
+ export interface Event {
3
+ subject: string;
4
+ stream: string;
5
+ data: any;
6
+ }
7
+ export declare abstract class Publisher<T extends Event> {
8
+ abstract subject: T["subject"];
9
+ abstract stream: T["stream"];
10
+ protected js: JetStreamClient;
11
+ protected codec: import("nats").Codec<unknown>;
12
+ constructor(js: JetStreamClient);
13
+ publish(data: T["data"]): Promise<void>;
14
+ }
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.Publisher = void 0;
13
+ const nats_1 = require("nats");
14
+ class Publisher {
15
+ constructor(js) {
16
+ this.codec = (0, nats_1.JSONCodec)();
17
+ this.js = js;
18
+ }
19
+ publish(data) {
20
+ return __awaiter(this, void 0, void 0, function* () {
21
+ const message = this.codec.encode(data);
22
+ yield this.js.publish(this.subject, message);
23
+ console.log(`Message published to ${this.subject}:`, data);
24
+ });
25
+ }
26
+ }
27
+ exports.Publisher = Publisher;
@@ -0,0 +1,5 @@
1
+ export declare enum Streams {
2
+ OrderServiceStream = "orders",
3
+ BookServiceStream = "books",
4
+ UserServiceStream = "users"
5
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Streams = void 0;
4
+ var Streams;
5
+ (function (Streams) {
6
+ Streams["OrderServiceStream"] = "orders";
7
+ Streams["BookServiceStream"] = "books";
8
+ Streams["UserServiceStream"] = "users";
9
+ })(Streams || (exports.Streams = Streams = {}));
package/build/index.d.ts CHANGED
@@ -4,6 +4,8 @@ export * from "./errors/database-connection-error";
4
4
  export * from "./errors/not-authorized-error";
5
5
  export * from "./errors/not-found-error";
6
6
  export * from "./errors/request-validation-error";
7
- export * from "./events/base-listener";
7
+ export * from "./events/listeners/base-listener";
8
+ export * from "./events/publishers/base-publisher";
8
9
  export * from "./events/book-created-event";
9
10
  export * from "./events/subjects";
11
+ export * from "./events/streams";
package/build/index.js CHANGED
@@ -20,6 +20,8 @@ __exportStar(require("./errors/database-connection-error"), exports);
20
20
  __exportStar(require("./errors/not-authorized-error"), exports);
21
21
  __exportStar(require("./errors/not-found-error"), exports);
22
22
  __exportStar(require("./errors/request-validation-error"), exports);
23
- __exportStar(require("./events/base-listener"), exports);
23
+ __exportStar(require("./events/listeners/base-listener"), exports);
24
+ __exportStar(require("./events/publishers/base-publisher"), exports);
24
25
  __exportStar(require("./events/book-created-event"), exports);
25
26
  __exportStar(require("./events/subjects"), exports);
27
+ __exportStar(require("./events/streams"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eratu/common",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "A package for shared code across microservices",
5
5
  "main": "./build/index.js",
6
6
  "types": "./build/index.d.ts",