@eratu/common 1.0.22 → 1.0.23
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/__tests__/enum/roles.test.d.ts +1 -0
- package/build/__tests__/enum/roles.test.js +31 -0
- package/build/__tests__/errors/bad-request-error.test.d.ts +1 -0
- package/build/__tests__/errors/bad-request-error.test.js +30 -0
- package/build/__tests__/errors/database-connection-error.test.d.ts +1 -0
- package/build/__tests__/errors/database-connection-error.test.js +28 -0
- package/build/__tests__/errors/forbidden-error.test.d.ts +1 -0
- package/build/__tests__/errors/forbidden-error.test.js +39 -0
- package/build/__tests__/errors/not-authorized-error.test.d.ts +1 -0
- package/build/__tests__/errors/not-authorized-error.test.js +39 -0
- package/build/__tests__/errors/not-found-error.test.d.ts +1 -0
- package/build/__tests__/errors/not-found-error.test.js +39 -0
- package/build/__tests__/errors/request-validation-error.test.d.ts +1 -0
- package/build/__tests__/errors/request-validation-error.test.js +99 -0
- package/build/__tests__/events/base-listener.test.d.ts +1 -0
- package/build/__tests__/events/base-listener.test.js +223 -0
- package/build/__tests__/events/base-publisher.test.d.ts +1 -0
- package/build/__tests__/events/base-publisher.test.js +85 -0
- package/build/__tests__/events/streams.test.d.ts +1 -0
- package/build/__tests__/events/streams.test.js +18 -0
- package/build/__tests__/events/subjects.test.d.ts +1 -0
- package/build/__tests__/events/subjects.test.js +79 -0
- package/build/__tests__/middlewares/allow-roles.test.d.ts +1 -0
- package/build/__tests__/middlewares/allow-roles.test.js +112 -0
- package/build/__tests__/middlewares/current-user.test.d.ts +1 -0
- package/build/__tests__/middlewares/current-user.test.js +261 -0
- package/build/__tests__/middlewares/error-handler.test.d.ts +1 -0
- package/build/__tests__/middlewares/error-handler.test.js +102 -0
- package/build/__tests__/middlewares/require-auth.test.d.ts +1 -0
- package/build/__tests__/middlewares/require-auth.test.js +57 -0
- package/build/__tests__/middlewares/validation.test.d.ts +1 -0
- package/build/__tests__/middlewares/validation.test.js +198 -0
- package/build/__tests__/nats-wrapper.test.d.ts +1 -0
- package/build/__tests__/nats-wrapper.test.js +159 -0
- package/build/__tests__/redis-wrapper.test.d.ts +1 -0
- package/build/__tests__/redis-wrapper.test.js +159 -0
- package/build/enum/image.d.ts +14 -0
- package/build/enum/image.js +18 -0
- package/build/enum/roles.d.ts +6 -0
- package/build/enum/roles.js +10 -0
- package/build/errors/bad-request-error.d.ts +9 -0
- package/build/errors/bad-request-error.js +16 -0
- package/build/errors/conflict-error.d.ts +9 -0
- package/build/errors/conflict-error.js +16 -0
- package/build/errors/custom-error.d.ts +8 -0
- package/build/errors/custom-error.js +10 -0
- package/build/errors/database-connection-error.d.ts +9 -0
- package/build/errors/database-connection-error.js +16 -0
- package/build/errors/forbidden-error.d.ts +9 -0
- package/build/errors/forbidden-error.js +16 -0
- package/build/errors/internal-error.d.ts +9 -0
- package/build/errors/internal-error.js +16 -0
- package/build/errors/not-authorized-error.d.ts +8 -0
- package/build/errors/not-authorized-error.js +15 -0
- package/build/errors/not-found-error.d.ts +9 -0
- package/build/errors/not-found-error.js +16 -0
- package/build/errors/request-validation-error.d.ts +14 -0
- package/build/errors/request-validation-error.js +22 -0
- package/build/events/event-types/auth/admin-deleted-event.d.ts +11 -0
- package/build/events/event-types/auth/admin-deleted-event.js +2 -0
- package/build/events/event-types/auth/admin-signed-up-event.d.ts +13 -0
- package/build/events/event-types/auth/admin-signed-up-event.js +2 -0
- package/build/events/event-types/auth/admin-updated-event.d.ts +14 -0
- package/build/events/event-types/auth/admin-updated-event.js +2 -0
- package/build/events/event-types/auth/author-deleted-event.d.ts +11 -0
- package/build/events/event-types/auth/author-deleted-event.js +2 -0
- package/build/events/event-types/auth/author-signed-in-event.d.ts +12 -0
- package/build/events/event-types/auth/author-signed-in-event.js +2 -0
- package/build/events/event-types/auth/author-signed-out-event.d.ts +11 -0
- package/build/events/event-types/auth/author-signed-out-event.js +2 -0
- package/build/events/event-types/auth/author-signed-up-event.d.ts +13 -0
- package/build/events/event-types/auth/author-signed-up-event.js +2 -0
- package/build/events/event-types/auth/author-updated-event.d.ts +14 -0
- package/build/events/event-types/auth/author-updated-event.js +2 -0
- package/build/events/event-types/auth/author-verified-event.d.ts +14 -0
- package/build/events/event-types/auth/author-verified-event.js +2 -0
- package/build/events/event-types/auth/reader-deleted-event.d.ts +11 -0
- package/build/events/event-types/auth/reader-deleted-event.js +2 -0
- package/build/events/event-types/auth/reader-signed-in-event.d.ts +13 -0
- package/build/events/event-types/auth/reader-signed-in-event.js +2 -0
- package/build/events/event-types/auth/reader-signed-out-event.d.ts +11 -0
- package/build/events/event-types/auth/reader-signed-out-event.js +2 -0
- package/build/events/event-types/auth/reader-signed-up-event.d.ts +13 -0
- package/build/events/event-types/auth/reader-signed-up-event.js +2 -0
- package/build/events/event-types/auth/reader-updated-event.d.ts +14 -0
- package/build/events/event-types/auth/reader-updated-event.js +2 -0
- package/build/events/event-types/auth/reader-verified-event.d.ts +14 -0
- package/build/events/event-types/auth/reader-verified-event.js +2 -0
- package/build/events/event-types/books/book-created-event.d.ts +34 -0
- package/build/events/event-types/books/book-created-event.js +2 -0
- package/build/events/event-types/books/book-deleted-event.d.ts +10 -0
- package/build/events/event-types/books/book-deleted-event.js +2 -0
- package/build/events/event-types/books/book-updated-event.d.ts +35 -0
- package/build/events/event-types/books/book-updated-event.js +2 -0
- package/build/events/event-types/books/chapter-created-event.d.ts +16 -0
- package/build/events/event-types/books/chapter-created-event.js +2 -0
- package/build/events/event-types/books/chapter-deleted-event.d.ts +10 -0
- package/build/events/event-types/books/chapter-deleted-event.js +2 -0
- package/build/events/event-types/books/chapter-updated-event.d.ts +17 -0
- package/build/events/event-types/books/chapter-updated-event.js +2 -0
- package/build/events/event-types/books/genre-created-event.d.ts +13 -0
- package/build/events/event-types/books/genre-created-event.js +2 -0
- package/build/events/event-types/books/genre-deleted-event.d.ts +9 -0
- package/build/events/event-types/books/genre-deleted-event.js +2 -0
- package/build/events/event-types/books/genre-updated-event.d.ts +13 -0
- package/build/events/event-types/books/genre-updated-event.js +2 -0
- package/build/events/event-types/books/subgenre-created-event.d.ts +14 -0
- package/build/events/event-types/books/subgenre-created-event.js +2 -0
- package/build/events/event-types/books/subgenre-deleted-event.d.ts +9 -0
- package/build/events/event-types/books/subgenre-deleted-event.js +2 -0
- package/build/events/event-types/books/subgenre-updated-event.d.ts +14 -0
- package/build/events/event-types/books/subgenre-updated-event.js +2 -0
- package/build/events/event-types/books/tag-created-event.d.ts +12 -0
- package/build/events/event-types/books/tag-created-event.js +2 -0
- package/build/events/event-types/books/tag-deleted-event.d.ts +9 -0
- package/build/events/event-types/books/tag-deleted-event.js +2 -0
- package/build/events/event-types/books/tag-updated-event.d.ts +12 -0
- package/build/events/event-types/books/tag-updated-event.js +2 -0
- package/build/events/event-types/books/trigger-created-event.d.ts +12 -0
- package/build/events/event-types/books/trigger-created-event.js +2 -0
- package/build/events/event-types/books/trigger-deleted-event.d.ts +9 -0
- package/build/events/event-types/books/trigger-deleted-event.js +2 -0
- package/build/events/event-types/books/trigger-updated-event.d.ts +12 -0
- package/build/events/event-types/books/trigger-updated-event.js +2 -0
- package/build/events/event-types/books/trope-created-event.d.ts +12 -0
- package/build/events/event-types/books/trope-created-event.js +2 -0
- package/build/events/event-types/books/trope-deleted-event.d.ts +9 -0
- package/build/events/event-types/books/trope-deleted-event.js +2 -0
- package/build/events/event-types/books/trope-updated-event.d.ts +12 -0
- package/build/events/event-types/books/trope-updated-event.js +2 -0
- package/build/events/event-types/media/avatar-uploaded-event.d.ts +14 -0
- package/build/events/event-types/media/avatar-uploaded-event.js +2 -0
- package/build/events/event-types/orders/order-created-event.d.ts +12 -0
- package/build/events/event-types/orders/order-created-event.js +2 -0
- package/build/events/listeners/base-listener.d.ts +23 -0
- package/build/events/listeners/base-listener.js +97 -0
- package/build/events/publishers/base-publisher.d.ts +14 -0
- package/build/events/publishers/base-publisher.js +27 -0
- package/build/events/streams.d.ts +6 -0
- package/build/events/streams.js +10 -0
- package/build/events/subjects.d.ts +41 -0
- package/build/events/subjects.js +52 -0
- package/build/index.d.ts +60 -0
- package/build/index.js +89 -0
- package/build/middlewares/allow-roles.d.ts +3 -0
- package/build/middlewares/allow-roles.js +18 -0
- package/build/middlewares/current-user.d.ts +40 -0
- package/build/middlewares/current-user.js +88 -0
- package/build/middlewares/error-handler.d.ts +2 -0
- package/build/middlewares/error-handler.js +14 -0
- package/build/middlewares/require-auth.d.ts +2 -0
- package/build/middlewares/require-auth.js +11 -0
- package/build/middlewares/validation.d.ts +3 -0
- package/build/middlewares/validation.js +56 -0
- package/build/nats-wrapper.d.ts +17 -0
- package/build/nats-wrapper.js +92 -0
- package/build/redis-wrapper.d.ts +20 -0
- package/build/redis-wrapper.js +77 -0
- package/build/test/setup.d.ts +8 -0
- package/build/test/setup.js +45 -0
- package/package.json +1 -1
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Streams } from '../../streams';
|
|
2
|
+
import { Subjects } from '../../subjects';
|
|
3
|
+
export interface GenreUpdatedEvent {
|
|
4
|
+
subject: Subjects.GenreUpdated;
|
|
5
|
+
stream: Streams.BookServiceStream;
|
|
6
|
+
data: {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
description: string | null;
|
|
10
|
+
sortOrder: number;
|
|
11
|
+
isActive: boolean;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Streams } from '../../streams';
|
|
2
|
+
import { Subjects } from '../../subjects';
|
|
3
|
+
export interface SubgenreCreatedEvent {
|
|
4
|
+
subject: Subjects.SubgenreCreated;
|
|
5
|
+
stream: Streams.BookServiceStream;
|
|
6
|
+
data: {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
description: string | null;
|
|
10
|
+
sortOrder: number;
|
|
11
|
+
isActive: boolean;
|
|
12
|
+
genreId: string;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Streams } from '../../streams';
|
|
2
|
+
import { Subjects } from '../../subjects';
|
|
3
|
+
export interface SubgenreUpdatedEvent {
|
|
4
|
+
subject: Subjects.SubgenreUpdated;
|
|
5
|
+
stream: Streams.BookServiceStream;
|
|
6
|
+
data: {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
description: string | null;
|
|
10
|
+
sortOrder: number;
|
|
11
|
+
isActive: boolean;
|
|
12
|
+
genreId: string;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Streams } from '../../streams';
|
|
2
|
+
import { Subjects } from '../../subjects';
|
|
3
|
+
export interface TagCreatedEvent {
|
|
4
|
+
subject: Subjects.TagCreated;
|
|
5
|
+
stream: Streams.BookServiceStream;
|
|
6
|
+
data: {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
description: string | null;
|
|
10
|
+
isActive: boolean;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Streams } from '../../streams';
|
|
2
|
+
import { Subjects } from '../../subjects';
|
|
3
|
+
export interface TagUpdatedEvent {
|
|
4
|
+
subject: Subjects.TagUpdated;
|
|
5
|
+
stream: Streams.BookServiceStream;
|
|
6
|
+
data: {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
description: string | null;
|
|
10
|
+
isActive: boolean;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Streams } from '../../streams';
|
|
2
|
+
import { Subjects } from '../../subjects';
|
|
3
|
+
export interface TriggerCreatedEvent {
|
|
4
|
+
subject: Subjects.TriggerCreated;
|
|
5
|
+
stream: Streams.BookServiceStream;
|
|
6
|
+
data: {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
description: string | null;
|
|
10
|
+
isActive: boolean;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Streams } from '../../streams';
|
|
2
|
+
import { Subjects } from '../../subjects';
|
|
3
|
+
export interface TriggerUpdatedEvent {
|
|
4
|
+
subject: Subjects.TriggerUpdated;
|
|
5
|
+
stream: Streams.BookServiceStream;
|
|
6
|
+
data: {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
description: string | null;
|
|
10
|
+
isActive: boolean;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Streams } from '../../streams';
|
|
2
|
+
import { Subjects } from '../../subjects';
|
|
3
|
+
export interface TropeCreatedEvent {
|
|
4
|
+
subject: Subjects.TropeCreated;
|
|
5
|
+
stream: Streams.BookServiceStream;
|
|
6
|
+
data: {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
description: string | null;
|
|
10
|
+
isActive: boolean;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Streams } from '../../streams';
|
|
2
|
+
import { Subjects } from '../../subjects';
|
|
3
|
+
export interface TropeUpdatedEvent {
|
|
4
|
+
subject: Subjects.TropeUpdated;
|
|
5
|
+
stream: Streams.BookServiceStream;
|
|
6
|
+
data: {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
description: string | null;
|
|
10
|
+
isActive: boolean;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Streams } from '../../streams';
|
|
2
|
+
import { Subjects } from '../../subjects';
|
|
3
|
+
export interface AvatarUploadedEvent {
|
|
4
|
+
subject: Subjects.AvatarUploaded;
|
|
5
|
+
stream: Streams.MediaServiceStream;
|
|
6
|
+
data: {
|
|
7
|
+
userId: string;
|
|
8
|
+
imageId: string;
|
|
9
|
+
variants: {
|
|
10
|
+
original: string;
|
|
11
|
+
thumbnail: string;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Streams } from '../../streams';
|
|
2
|
+
import { Subjects } from '../../subjects';
|
|
3
|
+
export interface OrderCreatedEvent {
|
|
4
|
+
subject: Subjects.OrderCreated;
|
|
5
|
+
stream: Streams.OrderServiceStream;
|
|
6
|
+
data: {
|
|
7
|
+
id: string;
|
|
8
|
+
version: number;
|
|
9
|
+
userId: string;
|
|
10
|
+
expiresAt: string;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { JetStreamManager, JsMsg, Consumer, JetStreamClient } from 'nats';
|
|
2
|
+
interface Event {
|
|
3
|
+
subject: string;
|
|
4
|
+
stream: string;
|
|
5
|
+
data: any;
|
|
6
|
+
}
|
|
7
|
+
export declare abstract class Listener<T extends Event> {
|
|
8
|
+
abstract subject: T['subject'];
|
|
9
|
+
abstract stream: T['stream'];
|
|
10
|
+
abstract durableName: string;
|
|
11
|
+
abstract onMessage(data: T['data'], msg: JsMsg): void;
|
|
12
|
+
protected jsm: JetStreamManager;
|
|
13
|
+
protected js: JetStreamClient;
|
|
14
|
+
protected consumer: Consumer;
|
|
15
|
+
protected ackWait: number;
|
|
16
|
+
protected codec: import("nats").Codec<unknown>;
|
|
17
|
+
constructor(js: JetStreamClient, jsm: JetStreamManager);
|
|
18
|
+
private waitForStream;
|
|
19
|
+
private createConsumerIfNotExists;
|
|
20
|
+
listen(): Promise<void>;
|
|
21
|
+
private parseMessage;
|
|
22
|
+
}
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,97 @@
|
|
|
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
|
+
var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
12
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
13
|
+
var m = o[Symbol.asyncIterator], i;
|
|
14
|
+
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
15
|
+
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
16
|
+
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
17
|
+
};
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.Listener = void 0;
|
|
20
|
+
const nats_1 = require("nats");
|
|
21
|
+
class Listener {
|
|
22
|
+
constructor(js, jsm) {
|
|
23
|
+
this.ackWait = 5 * 1000;
|
|
24
|
+
this.codec = (0, nats_1.JSONCodec)();
|
|
25
|
+
this.jsm = jsm;
|
|
26
|
+
this.js = js;
|
|
27
|
+
}
|
|
28
|
+
waitForStream() {
|
|
29
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
30
|
+
let retryCount = 0;
|
|
31
|
+
// eslint-disable-next-line no-constant-condition
|
|
32
|
+
while (true) {
|
|
33
|
+
try {
|
|
34
|
+
yield this.jsm.streams.info(this.stream);
|
|
35
|
+
console.log(`✅ Stream "${this.stream}" is ready`);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
catch (_a) {
|
|
39
|
+
console.log(`⏳ Waiting for stream "${this.stream}"...`);
|
|
40
|
+
yield new Promise(res => setTimeout(res, 2000));
|
|
41
|
+
}
|
|
42
|
+
retryCount++;
|
|
43
|
+
if (retryCount > 5) {
|
|
44
|
+
console.error(`❌ Stream "${this.stream}" is not ready after 5 attempts`);
|
|
45
|
+
throw new Error(`Stream "${this.stream}" is not ready`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
createConsumerIfNotExists() {
|
|
51
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
52
|
+
yield this.waitForStream();
|
|
53
|
+
// Ensure durable consumer exists
|
|
54
|
+
try {
|
|
55
|
+
yield this.jsm.consumers.info(this.stream, this.durableName);
|
|
56
|
+
}
|
|
57
|
+
catch (_a) {
|
|
58
|
+
yield this.jsm.consumers.add(this.stream, {
|
|
59
|
+
durable_name: this.durableName,
|
|
60
|
+
ack_policy: nats_1.AckPolicy.Explicit,
|
|
61
|
+
ack_wait: this.ackWait * 1000000, // nanoseconds
|
|
62
|
+
filter_subject: this.subject,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
// Get the consumer object
|
|
66
|
+
this.consumer = yield this.js.consumers.get(this.stream, this.durableName);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
listen() {
|
|
70
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
71
|
+
var _a, e_1, _b, _c;
|
|
72
|
+
yield this.createConsumerIfNotExists();
|
|
73
|
+
const messages = yield this.consumer.consume();
|
|
74
|
+
try {
|
|
75
|
+
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) {
|
|
76
|
+
_c = messages_1_1.value;
|
|
77
|
+
_d = false;
|
|
78
|
+
const msg = _c;
|
|
79
|
+
const data = this.parseMessage(msg);
|
|
80
|
+
yield this.onMessage(data, msg);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
84
|
+
finally {
|
|
85
|
+
try {
|
|
86
|
+
if (!_d && !_a && (_b = messages_1.return)) yield _b.call(messages_1);
|
|
87
|
+
}
|
|
88
|
+
finally { if (e_1) throw e_1.error; }
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
parseMessage(msg) {
|
|
93
|
+
const decoded = this.codec.decode(msg.data);
|
|
94
|
+
return decoded;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
exports.Listener = Listener;
|
|
@@ -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 jsClient: 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.jsClient = js;
|
|
18
|
+
}
|
|
19
|
+
publish(data) {
|
|
20
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
21
|
+
const message = this.codec.encode(data);
|
|
22
|
+
yield this.jsClient.publish(this.subject, message);
|
|
23
|
+
console.log(`Message published to ${this.subject}:`, data);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.Publisher = Publisher;
|
|
@@ -0,0 +1,10 @@
|
|
|
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["AuthServiceStream"] = "auth";
|
|
9
|
+
Streams["MediaServiceStream"] = "media";
|
|
10
|
+
})(Streams || (exports.Streams = Streams = {}));
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export declare enum Subjects {
|
|
2
|
+
AuthorUpdated = "author:updated",
|
|
3
|
+
AuthorDeleted = "author:deleted",
|
|
4
|
+
AuthorSignedUp = "author:signed-up",
|
|
5
|
+
AuthorSignedIn = "author:signed-in",
|
|
6
|
+
AuthorSignedOut = "author:signed-out",
|
|
7
|
+
AuthorVerified = "author:verified",
|
|
8
|
+
ReaderSignedUp = "reader:signed-up",
|
|
9
|
+
ReaderSignedIn = "reader:signed-in",
|
|
10
|
+
ReaderSignedOut = "reader:signed-out",
|
|
11
|
+
ReaderUpdated = "reader:updated",
|
|
12
|
+
ReaderDeleted = "reader:deleted",
|
|
13
|
+
ReaderVerified = "reader:verified",
|
|
14
|
+
AdminSignedUp = "admin:signed-up",
|
|
15
|
+
AdminDeleted = "admin:deleted",
|
|
16
|
+
AdminUpdated = "admin:updated",
|
|
17
|
+
AvatarUploaded = "avatar:uploaded",
|
|
18
|
+
BookCreated = "book:created",
|
|
19
|
+
BookUpdated = "book:updated",
|
|
20
|
+
BookDeleted = "book:deleted",
|
|
21
|
+
GenreCreated = "genre:created",
|
|
22
|
+
GenreUpdated = "genre:updated",
|
|
23
|
+
GenreDeleted = "genre:deleted",
|
|
24
|
+
SubgenreCreated = "subgenre:created",
|
|
25
|
+
SubgenreUpdated = "subgenre:updated",
|
|
26
|
+
SubgenreDeleted = "subgenre:deleted",
|
|
27
|
+
TagCreated = "tag:created",
|
|
28
|
+
TagUpdated = "tag:updated",
|
|
29
|
+
TagDeleted = "tag:deleted",
|
|
30
|
+
TropeCreated = "trope:created",
|
|
31
|
+
TropeUpdated = "trope:updated",
|
|
32
|
+
TropeDeleted = "trope:deleted",
|
|
33
|
+
TriggerCreated = "trigger:created",
|
|
34
|
+
TriggerUpdated = "trigger:updated",
|
|
35
|
+
TriggerDeleted = "trigger:deleted",
|
|
36
|
+
ChapterCreated = "chapter:created",
|
|
37
|
+
ChapterUpdated = "chapter:updated",
|
|
38
|
+
ChapterDeleted = "chapter:deleted",
|
|
39
|
+
OrderCreated = "order:created",
|
|
40
|
+
OrderCancelled = "order:cancelled"
|
|
41
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Subjects = void 0;
|
|
4
|
+
var Subjects;
|
|
5
|
+
(function (Subjects) {
|
|
6
|
+
// Authors related event subjects
|
|
7
|
+
Subjects["AuthorUpdated"] = "author:updated";
|
|
8
|
+
Subjects["AuthorDeleted"] = "author:deleted";
|
|
9
|
+
Subjects["AuthorSignedUp"] = "author:signed-up";
|
|
10
|
+
Subjects["AuthorSignedIn"] = "author:signed-in";
|
|
11
|
+
Subjects["AuthorSignedOut"] = "author:signed-out";
|
|
12
|
+
Subjects["AuthorVerified"] = "author:verified";
|
|
13
|
+
// Readers related event subjects
|
|
14
|
+
Subjects["ReaderSignedUp"] = "reader:signed-up";
|
|
15
|
+
Subjects["ReaderSignedIn"] = "reader:signed-in";
|
|
16
|
+
Subjects["ReaderSignedOut"] = "reader:signed-out";
|
|
17
|
+
Subjects["ReaderUpdated"] = "reader:updated";
|
|
18
|
+
Subjects["ReaderDeleted"] = "reader:deleted";
|
|
19
|
+
Subjects["ReaderVerified"] = "reader:verified";
|
|
20
|
+
// Admins related event subjects
|
|
21
|
+
Subjects["AdminSignedUp"] = "admin:signed-up";
|
|
22
|
+
Subjects["AdminDeleted"] = "admin:deleted";
|
|
23
|
+
Subjects["AdminUpdated"] = "admin:updated";
|
|
24
|
+
// Media event subjects
|
|
25
|
+
Subjects["AvatarUploaded"] = "avatar:uploaded";
|
|
26
|
+
// Books related event subjects
|
|
27
|
+
Subjects["BookCreated"] = "book:created";
|
|
28
|
+
Subjects["BookUpdated"] = "book:updated";
|
|
29
|
+
Subjects["BookDeleted"] = "book:deleted";
|
|
30
|
+
Subjects["GenreCreated"] = "genre:created";
|
|
31
|
+
Subjects["GenreUpdated"] = "genre:updated";
|
|
32
|
+
Subjects["GenreDeleted"] = "genre:deleted";
|
|
33
|
+
Subjects["SubgenreCreated"] = "subgenre:created";
|
|
34
|
+
Subjects["SubgenreUpdated"] = "subgenre:updated";
|
|
35
|
+
Subjects["SubgenreDeleted"] = "subgenre:deleted";
|
|
36
|
+
Subjects["TagCreated"] = "tag:created";
|
|
37
|
+
Subjects["TagUpdated"] = "tag:updated";
|
|
38
|
+
Subjects["TagDeleted"] = "tag:deleted";
|
|
39
|
+
Subjects["TropeCreated"] = "trope:created";
|
|
40
|
+
Subjects["TropeUpdated"] = "trope:updated";
|
|
41
|
+
Subjects["TropeDeleted"] = "trope:deleted";
|
|
42
|
+
Subjects["TriggerCreated"] = "trigger:created";
|
|
43
|
+
Subjects["TriggerUpdated"] = "trigger:updated";
|
|
44
|
+
Subjects["TriggerDeleted"] = "trigger:deleted";
|
|
45
|
+
// Chapters related event subjects
|
|
46
|
+
Subjects["ChapterCreated"] = "chapter:created";
|
|
47
|
+
Subjects["ChapterUpdated"] = "chapter:updated";
|
|
48
|
+
Subjects["ChapterDeleted"] = "chapter:deleted";
|
|
49
|
+
// Orders related event subjects
|
|
50
|
+
Subjects["OrderCreated"] = "order:created";
|
|
51
|
+
Subjects["OrderCancelled"] = "order:cancelled";
|
|
52
|
+
})(Subjects || (exports.Subjects = Subjects = {}));
|
package/build/index.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export * from './errors/bad-request-error';
|
|
2
|
+
export * from './errors/custom-error';
|
|
3
|
+
export * from './errors/database-connection-error';
|
|
4
|
+
export * from './errors/not-authorized-error';
|
|
5
|
+
export * from './errors/not-found-error';
|
|
6
|
+
export * from './errors/request-validation-error';
|
|
7
|
+
export * from './errors/forbidden-error';
|
|
8
|
+
export * from './errors/internal-error';
|
|
9
|
+
export * from './errors/conflict-error';
|
|
10
|
+
export * from './middlewares/current-user';
|
|
11
|
+
export * from './middlewares/require-auth';
|
|
12
|
+
export * from './middlewares/validation';
|
|
13
|
+
export * from './middlewares/error-handler';
|
|
14
|
+
export * from './middlewares/allow-roles';
|
|
15
|
+
export * from './enum/roles';
|
|
16
|
+
export * from './enum/image';
|
|
17
|
+
export * from './events/listeners/base-listener';
|
|
18
|
+
export * from './events/publishers/base-publisher';
|
|
19
|
+
export * from './events/event-types/books/book-created-event';
|
|
20
|
+
export * from './events/event-types/books/book-updated-event';
|
|
21
|
+
export * from './events/event-types/books/book-deleted-event';
|
|
22
|
+
export * from './events/event-types/books/genre-created-event';
|
|
23
|
+
export * from './events/event-types/books/genre-updated-event';
|
|
24
|
+
export * from './events/event-types/books/genre-deleted-event';
|
|
25
|
+
export * from './events/event-types/books/subgenre-created-event';
|
|
26
|
+
export * from './events/event-types/books/subgenre-updated-event';
|
|
27
|
+
export * from './events/event-types/books/subgenre-deleted-event';
|
|
28
|
+
export * from './events/event-types/books/tag-created-event';
|
|
29
|
+
export * from './events/event-types/books/tag-updated-event';
|
|
30
|
+
export * from './events/event-types/books/tag-deleted-event';
|
|
31
|
+
export * from './events/event-types/books/trope-created-event';
|
|
32
|
+
export * from './events/event-types/books/trope-updated-event';
|
|
33
|
+
export * from './events/event-types/books/trope-deleted-event';
|
|
34
|
+
export * from './events/event-types/books/trigger-created-event';
|
|
35
|
+
export * from './events/event-types/books/trigger-updated-event';
|
|
36
|
+
export * from './events/event-types/books/trigger-deleted-event';
|
|
37
|
+
export * from './events/event-types/books/chapter-created-event';
|
|
38
|
+
export * from './events/event-types/books/chapter-updated-event';
|
|
39
|
+
export * from './events/event-types/books/chapter-deleted-event';
|
|
40
|
+
export * from './events/event-types/auth/author-updated-event';
|
|
41
|
+
export * from './events/event-types/auth/author-deleted-event';
|
|
42
|
+
export * from './events/event-types/auth/author-verified-event';
|
|
43
|
+
export * from './events/event-types/auth/author-signed-up-event';
|
|
44
|
+
export * from './events/event-types/auth/author-signed-in-event';
|
|
45
|
+
export * from './events/event-types/auth/author-signed-out-event';
|
|
46
|
+
export * from './events/event-types/auth/reader-updated-event';
|
|
47
|
+
export * from './events/event-types/auth/reader-deleted-event';
|
|
48
|
+
export * from './events/event-types/auth/reader-signed-up-event';
|
|
49
|
+
export * from './events/event-types/auth/reader-signed-in-event';
|
|
50
|
+
export * from './events/event-types/auth/reader-signed-out-event';
|
|
51
|
+
export * from './events/event-types/auth/reader-verified-event';
|
|
52
|
+
export * from './events/event-types/auth/admin-signed-up-event';
|
|
53
|
+
export * from './events/event-types/auth/admin-deleted-event';
|
|
54
|
+
export * from './events/event-types/auth/admin-updated-event';
|
|
55
|
+
export * from './events/event-types/media/avatar-uploaded-event';
|
|
56
|
+
export * from './events/event-types/orders/order-created-event';
|
|
57
|
+
export * from './events/subjects';
|
|
58
|
+
export * from './events/streams';
|
|
59
|
+
export * from './nats-wrapper';
|
|
60
|
+
export * from './redis-wrapper';
|