exodus-framework 2.1.1049 → 2.1.1051
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/lib/app/classes/socket/ssehandler.d.ts +8 -0
- package/lib/app/classes/socket/ssehandler.d.ts.map +1 -1
- package/lib/app/classes/socket/ssehandler.js +38 -1
- package/lib/services/rabitmq.d.ts +1 -0
- package/lib/services/rabitmq.d.ts.map +1 -1
- package/lib/services/rabitmq.js +24 -4
- package/package.json +1 -1
@@ -6,6 +6,8 @@ declare class SSEHandler extends System {
|
|
6
6
|
protected response: Response;
|
7
7
|
protected side: eExecutionSide;
|
8
8
|
protected active: boolean;
|
9
|
+
protected security: boolean;
|
10
|
+
private secretKey;
|
9
11
|
protected ticketInterval: number;
|
10
12
|
private tickInterval;
|
11
13
|
constructor(request: Request, response: Response);
|
@@ -18,8 +20,14 @@ declare class SSEHandler extends System {
|
|
18
20
|
getSide(): eExecutionSide;
|
19
21
|
getActive(): boolean;
|
20
22
|
protected getTicketInterval(): number;
|
23
|
+
/**
|
24
|
+
* Envia dados através do SSE (Server-Sent Events)
|
25
|
+
* @param event Nome do evento
|
26
|
+
* @param data Dados a serem enviados (serão criptografados se security=true)
|
27
|
+
*/
|
21
28
|
protected send(event: string, data: any): void;
|
22
29
|
static handle(): (request: Request, res: Response) => Promise<void>;
|
30
|
+
private encryptData;
|
23
31
|
}
|
24
32
|
export default SSEHandler;
|
25
33
|
//# sourceMappingURL=ssehandler.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ssehandler.d.ts","sourceRoot":"","sources":["../../../../src/app/classes/socket/ssehandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,MAAM,MAAM,WAAW,CAAC;
|
1
|
+
{"version":3,"file":"ssehandler.d.ts","sourceRoot":"","sources":["../../../../src/app/classes/socket/ssehandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,MAAM,MAAM,WAAW,CAAC;AAG/B,cAAM,UAAW,SAAQ,MAAM;IAS3B,SAAS,CAAC,OAAO,EAAE,OAAO;IAC1B,SAAS,CAAC,QAAQ,EAAE,QAAQ;IAT9B,SAAS,CAAC,IAAI,EAAE,cAAc,CAAC;IAC/B,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC;IACjC,OAAO,CAAC,YAAY,CAAwB;gBAGhC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ;IAKvB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAO9B,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAiBjC,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAgBtC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAUpC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAUjC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAG9B,OAAO;IAGP,SAAS;IAGhB,SAAS,CAAC,iBAAiB;IAI3B;;;;OAIG;IACH,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG;WAazB,MAAM,cACK,OAAO,OAAO,QAAQ;IAS/C,OAAO,CAAC,WAAW;CAsBpB;AAED,eAAe,UAAU,CAAC"}
|
@@ -6,10 +6,13 @@ Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
exports.default = void 0;
|
7
7
|
var _core = require("../../../contracts/core");
|
8
8
|
var _system = _interopRequireDefault(require("../system"));
|
9
|
+
var _crypto = _interopRequireDefault(require("crypto"));
|
9
10
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
10
11
|
class SSEHandler extends _system.default {
|
11
12
|
side;
|
12
13
|
active;
|
14
|
+
security;
|
15
|
+
secretKey;
|
13
16
|
ticketInterval;
|
14
17
|
tickInterval;
|
15
18
|
constructor(request, response) {
|
@@ -20,6 +23,7 @@ class SSEHandler extends _system.default {
|
|
20
23
|
onInit() {
|
21
24
|
this.side = _core.eExecutionSide.ANY;
|
22
25
|
this.active = true;
|
26
|
+
this.security = false;
|
23
27
|
this.ticketInterval = 3000;
|
24
28
|
}
|
25
29
|
onConnect() {
|
@@ -37,6 +41,9 @@ class SSEHandler extends _system.default {
|
|
37
41
|
});
|
38
42
|
}
|
39
43
|
onAfterConnect() {
|
44
|
+
if (this.security) {
|
45
|
+
this.secretKey = _crypto.default.pbkdf2Sync(this.request.auth.account.uuid, this.request.tenant.id, 100000, 32, 'sha256');
|
46
|
+
}
|
40
47
|
this.tickInterval = setInterval(() => {
|
41
48
|
this.onTick();
|
42
49
|
}, this.ticketInterval);
|
@@ -69,10 +76,20 @@ class SSEHandler extends _system.default {
|
|
69
76
|
getTicketInterval() {
|
70
77
|
return this.ticketInterval;
|
71
78
|
}
|
79
|
+
|
80
|
+
/**
|
81
|
+
* Envia dados através do SSE (Server-Sent Events)
|
82
|
+
* @param event Nome do evento
|
83
|
+
* @param data Dados a serem enviados (serão criptografados se security=true)
|
84
|
+
*/
|
72
85
|
send(event, data) {
|
73
86
|
if (!this.response.destroyed) {
|
87
|
+
let dataToSend = data;
|
88
|
+
if (this.security && this.secretKey) {
|
89
|
+
dataToSend = this.encryptData(data);
|
90
|
+
}
|
74
91
|
this.response.write(`event: ${event}\n`);
|
75
|
-
this.response.write(`data: ${JSON.stringify(
|
92
|
+
this.response.write(`data: ${JSON.stringify(dataToSend)}\n\n`);
|
76
93
|
}
|
77
94
|
}
|
78
95
|
static handle() {
|
@@ -83,5 +100,25 @@ class SSEHandler extends _system.default {
|
|
83
100
|
await handler.onAfterConnect();
|
84
101
|
};
|
85
102
|
}
|
103
|
+
encryptData(data) {
|
104
|
+
if (this.security && this.secretKey) {
|
105
|
+
try {
|
106
|
+
const key = new Uint8Array(this.secretKey);
|
107
|
+
const iv = _crypto.default.randomBytes(16);
|
108
|
+
const cipher = _crypto.default.createCipheriv('aes-256-cbc', key, new Uint8Array(iv));
|
109
|
+
let encrypted = cipher.update(JSON.stringify(data), 'utf8', 'hex');
|
110
|
+
encrypted += cipher.final('hex');
|
111
|
+
return {
|
112
|
+
encrypted,
|
113
|
+
iv: iv.toString('hex')
|
114
|
+
};
|
115
|
+
} catch (error) {
|
116
|
+
console.warn('SSE encryption failed:', error);
|
117
|
+
return data;
|
118
|
+
}
|
119
|
+
} else {
|
120
|
+
return data;
|
121
|
+
}
|
122
|
+
}
|
86
123
|
}
|
87
124
|
var _default = exports.default = SSEHandler;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"rabitmq.d.ts","sourceRoot":"","sources":["../../src/services/rabitmq.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGtD,OAAO,OAAO,MAAM,wBAAwB,CAAC;AAC7C,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACtB,kBAAkB,EACnB,MAAM,cAAc,CAAC;
|
1
|
+
{"version":3,"file":"rabitmq.d.ts","sourceRoot":"","sources":["../../src/services/rabitmq.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGtD,OAAO,OAAO,MAAM,wBAAwB,CAAC;AAC7C,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACtB,kBAAkB,EACnB,MAAM,cAAc,CAAC;AAKtB;;;;;;GAMG;AACH,cAAM,eAAgB,SAAQ,OAAO;IACnC,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,oBAAoB,CAA0D;IACtF,OAAO,CAAC,QAAQ,CAAsB;IAEtC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,WAAW,CAAS;IAEf,aAAa;IAgBb,OAAO;IAMP,eAAe;IAWf,WAAW;IAKX,OAAO;IAgCP,eAAe;IA2BrB,iBAAiB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,OAAO,EAAE,sBAAsB;IAKtF,OAAO,CAAC,iBAAiB;IAYzB;;;;;;;;;OASG;IACG,WAAW,CAAC,CAAC,SAAS,MAAM,oBAAoB,EACpD,KAAK,EAAE,CAAC,EACR,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,EAC7B,aAAa,CAAC,EAAE,MAAM;IAKxB;;;;;;;;OAQG;IACG,OAAO,CAAC,CAAC,SAAS,MAAM,oBAAoB,EAChD,KAAK,EAAE,CAAC,EACR,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,EAC7B,aAAa,CAAC,EAAE,MAAM;IAqBlB,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc;IA6CjD,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc;IAiBhD,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,wBAAwB;IAI/C,aAAa,CAAC,CAAC,SAAS,MAAM,oBAAoB,EACvD,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,sBAAsB,CAAC,CAAC,CAAC;IAY9B,cAAc,CAAC,CAAC,SAAS,MAAM,oBAAoB,EAAE,KAAK,EAAE,CAAC;IAW7D,YAAY,CACjB,CAAC,SAAS,MAAM,oBAAoB,EACpC,CAAC,SAAS,MAAM,oBAAoB,EACpC,IAAI,EAAE;QACN,IAAI,EAAE;YAAE,KAAK,EAAE,CAAC,CAAC;YAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAA;SAAE,CAAC;QAClD,MAAM,EAAE;YACN,KAAK,EAAE,CAAC,CAAC;YACT,QAAQ,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAC;YACpC,SAAS,EAAE,MAAM,IAAI,CAAC;YACtB,OAAO,CAAC,EAAE,MAAM,CAAC;SAClB,CAAC;KACH;CAwBF;AAED,eAAe,eAAe,CAAC"}
|
package/lib/services/rabitmq.js
CHANGED
@@ -8,6 +8,7 @@ var _amqplib = _interopRequireDefault(require("amqplib"));
|
|
8
8
|
var _crypto = require("crypto");
|
9
9
|
var _app = require("../app");
|
10
10
|
var _service = _interopRequireDefault(require("../app/classes/service"));
|
11
|
+
var _core = require("../contracts/core");
|
11
12
|
var _messaging = _interopRequireDefault(require("../routes/messaging"));
|
12
13
|
var _logger = _interopRequireDefault(require("../services/logger"));
|
13
14
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
@@ -27,6 +28,7 @@ class RabbitMQService extends _service.default {
|
|
27
28
|
attempts;
|
28
29
|
exchangeName;
|
29
30
|
queueName;
|
31
|
+
workersQueueName;
|
30
32
|
isReconnecting = false;
|
31
33
|
isConnected = false;
|
32
34
|
async onServiceInit() {
|
@@ -37,6 +39,7 @@ class RabbitMQService extends _service.default {
|
|
37
39
|
this.attempts = new Map();
|
38
40
|
this.exchangeName = _app.Core.settings.getMessaging().exchanges.main;
|
39
41
|
this.queueName = _app.Core.settings.getAppication().appId;
|
42
|
+
this.workersQueueName = `${this.queueName}-workers`;
|
40
43
|
this.eventCustomListeners = new Map();
|
41
44
|
this.mainRouter = {
|
42
45
|
..._messaging.default,
|
@@ -49,7 +52,8 @@ class RabbitMQService extends _service.default {
|
|
49
52
|
}
|
50
53
|
async onExodusStarted() {
|
51
54
|
await super.onExodusStarted();
|
52
|
-
|
55
|
+
const queueToConsume = this.isCluster() ? this.workersQueueName : this.queueName;
|
56
|
+
await this.channel.consume(queueToConsume, this.consumeFromQueue.bind(this), {
|
53
57
|
noAck: false
|
54
58
|
});
|
55
59
|
}
|
@@ -70,7 +74,10 @@ class RabbitMQService extends _service.default {
|
|
70
74
|
await this.channel.assertExchange(mainExchanges, 'topic', {
|
71
75
|
durable: true
|
72
76
|
});
|
73
|
-
await this.channel.assertQueue(
|
77
|
+
await this.channel.assertQueue(this.queueName, {
|
78
|
+
durable: true
|
79
|
+
});
|
80
|
+
await this.channel.assertQueue(this.workersQueueName, {
|
74
81
|
durable: true
|
75
82
|
});
|
76
83
|
this.isConnected = true;
|
@@ -90,9 +97,18 @@ class RabbitMQService extends _service.default {
|
|
90
97
|
if (Array.isArray(handler)) {
|
91
98
|
const [side] = handler;
|
92
99
|
if (this.getExecutionSide() != side) continue;
|
93
|
-
|
100
|
+
const targetQueue = side === _core.eExecutionSide.MASTER ? this.queueName : this.workersQueueName;
|
101
|
+
await this.channel.bindQueue(targetQueue, this.exchangeName, topic);
|
94
102
|
} else {
|
95
|
-
|
103
|
+
if (this.isMaster()) {
|
104
|
+
await this.channel.bindQueue(this.queueName, this.exchangeName, topic);
|
105
|
+
}
|
106
|
+
}
|
107
|
+
}
|
108
|
+
for (const [topic, handler] of Object.entries(this.decoratorRouter)) {
|
109
|
+
if (handler) {
|
110
|
+
const targetQueue = this.isCluster() ? this.workersQueueName : this.queueName;
|
111
|
+
await this.channel.bindQueue(targetQueue, this.exchangeName, topic);
|
96
112
|
}
|
97
113
|
}
|
98
114
|
}
|
@@ -164,6 +180,7 @@ class RabbitMQService extends _service.default {
|
|
164
180
|
const topic = msg.fields.routingKey;
|
165
181
|
const content = JSON.parse(msg.content.toString());
|
166
182
|
const callBack = this.mainRouter[topic];
|
183
|
+
const decoratorCallback = this.decoratorRouter[topic];
|
167
184
|
if (callBack) {
|
168
185
|
if (Array.isArray(callBack)) {
|
169
186
|
const [side, cb] = callBack;
|
@@ -174,6 +191,9 @@ class RabbitMQService extends _service.default {
|
|
174
191
|
await callBack(content.data, () => {}, content.serviceId, content.transactionId);
|
175
192
|
}
|
176
193
|
}
|
194
|
+
if (decoratorCallback && typeof decoratorCallback === 'function') {
|
195
|
+
await decoratorCallback(content.data, () => {}, content.serviceId, content.transactionId);
|
196
|
+
}
|
177
197
|
this.channel.ack(msg);
|
178
198
|
if (this.eventCustomListeners.has(topic)) {
|
179
199
|
const cb = this.eventCustomListeners.get(topic);
|