badmfck-api-server 3.9.7 → 3.9.9
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/dist/apiServer/APIService.d.ts +0 -1
- package/dist/apiServer/APIService.js +2 -3
- package/dist/apiServer/BaseEndpoint.js +2 -2
- package/dist/apiServer/DBService.d.ts +1 -1
- package/dist/apiServer/helper/UID.js +2 -2
- package/dist/apiServer/helper/Validator.d.ts +10 -4
- package/dist/apiServer/helper/Validator.js +71 -66
- package/dist/apiServer/helper/ZipUtils.d.ts +8 -0
- package/dist/apiServer/helper/ZipUtils.js +28 -0
- package/dist/apiServer/interceptors/IntHmacSha256.d.ts +5 -0
- package/dist/apiServer/interceptors/IntHmacSha256.js +22 -0
- package/dist/apiServer/structures/DefaultErrors.d.ts +4 -3
- package/dist/apiServer/structures/DefaultErrors.js +5 -4
- package/dist/index.d.ts +2 -1
- package/dist/index.js +3 -1
- package/package.json +1 -1
- package/dist/apiServer/APIService.js.map +0 -1
- package/dist/apiServer/BaseEndpoint.js.map +0 -1
- package/dist/apiServer/BaseService.js.map +0 -1
- package/dist/apiServer/ClusterService.d.ts +0 -30
- package/dist/apiServer/ClusterService.js +0 -81
- package/dist/apiServer/ClusterService.js.map +0 -1
- package/dist/apiServer/DocumentService.js.map +0 -1
- package/dist/apiServer/HUBService.d.ts +0 -37
- package/dist/apiServer/HUBService.js +0 -132
- package/dist/apiServer/HUBService.js.map +0 -1
- package/dist/apiServer/LocalRequest.js.map +0 -1
- package/dist/apiServer/LogService.js.map +0 -1
- package/dist/apiServer/MysqlService.js.map +0 -1
- package/dist/apiServer/WSAPITransport.js.map +0 -1
- package/dist/apiServer/WebSocketHandler.js.map +0 -1
- package/dist/apiServer/Websocket.d.ts +0 -8
- package/dist/apiServer/Websocket.js +0 -15
- package/dist/apiServer/WebsocketService.d.ts +0 -8
- package/dist/apiServer/WebsocketService.js +0 -18
- package/dist/apiServer/WebsocketService.js.map +0 -1
- package/dist/apiServer/cluster/HUBConnection.d.ts +0 -39
- package/dist/apiServer/cluster/HUBConnection.js +0 -251
- package/dist/apiServer/cluster/HUBConnection.js.map +0 -1
- package/dist/apiServer/cluster/HUBHandlres.d.ts +0 -0
- package/dist/apiServer/cluster/HUBHandlres.js +0 -2
- package/dist/apiServer/cluster/HUBHandlres.js.map +0 -1
- package/dist/apiServer/deployment/Deployment.js.map +0 -1
- package/dist/apiServer/helper/DataProvider.js.map +0 -1
- package/dist/apiServer/helper/Sleep.js.map +0 -1
- package/dist/apiServer/helper/UID.js.map +0 -1
- package/dist/apiServer/helper/Validator.js.map +0 -1
- package/dist/apiServer/monitor/Monitor.js.map +0 -1
- package/dist/apiServer/routes/Liveness.js.map +0 -1
- package/dist/apiServer/routes/Monitor.d.ts +0 -9
- package/dist/apiServer/routes/Monitor.js +0 -77
- package/dist/apiServer/routes/Readiness.js.map +0 -1
- package/dist/apiServer/structures/DefaultErrors.js.map +0 -1
- package/dist/apiServer/structures/HTTPStatus.js.map +0 -1
- package/dist/apiServer/structures/Interfaces.js.map +0 -1
@@ -1,81 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
-
};
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
exports.ClusterService = void 0;
|
7
|
-
const ws_1 = __importDefault(require("ws"));
|
8
|
-
const BaseService_1 = require("./BaseService");
|
9
|
-
const LogService_1 = require("./LogService");
|
10
|
-
const HUBConnection_1 = require("./cluster/HUBConnection");
|
11
|
-
const badmfck_signal_1 = __importDefault(require("badmfck-signal"));
|
12
|
-
const DefaultErrors_1 = require("./structures/DefaultErrors");
|
13
|
-
const Sleep_1 = require("./helper/Sleep");
|
14
|
-
class ClusterService extends BaseService_1.BaseService {
|
15
|
-
options;
|
16
|
-
ws = null;
|
17
|
-
handlers = [];
|
18
|
-
parites = new Map();
|
19
|
-
constructor(opt) {
|
20
|
-
super("ClusterService");
|
21
|
-
this.options = opt;
|
22
|
-
this.handlers = [
|
23
|
-
new badmfck_signal_1.default("S_PARTY_AVAILABLE", undefined, async (req) => {
|
24
|
-
this.addPartyHost(req.data);
|
25
|
-
})
|
26
|
-
];
|
27
|
-
}
|
28
|
-
async init() {
|
29
|
-
(0, LogService_1.logInfo)("ClusterService: initialized");
|
30
|
-
this.connectToHUB();
|
31
|
-
}
|
32
|
-
async close() {
|
33
|
-
(0, LogService_1.logInfo)("ClusterService: closing");
|
34
|
-
if (this.ws)
|
35
|
-
this.ws.close();
|
36
|
-
this.parites.clear();
|
37
|
-
}
|
38
|
-
async connectToHUB() {
|
39
|
-
(0, LogService_1.logInfo)("ClusterService: connecting to HUB");
|
40
|
-
if (this.ws)
|
41
|
-
this.ws.close();
|
42
|
-
this.ws = new HUBConnection_1.HUBConnection({
|
43
|
-
direction: "outgoing",
|
44
|
-
ws: new ws_1.default(this.options.targetURL),
|
45
|
-
hostID: this.options.hostID,
|
46
|
-
hostPrivateKey: this.options.hostPrivateKey,
|
47
|
-
hostPublicKey: this.options.hostPublicKey,
|
48
|
-
hostURL: this.options.hostURL,
|
49
|
-
targetID: this.options.targetID,
|
50
|
-
targetPublicKey: this.options.targetPublicKey,
|
51
|
-
targetURL: this.options.targetURL,
|
52
|
-
handlers: this.handlers,
|
53
|
-
onAuthorized: async () => {
|
54
|
-
(0, LogService_1.logInfo)("ClusterService: connected to HUB");
|
55
|
-
await (0, Sleep_1.Sleep)(1000);
|
56
|
-
const parites = this.options.party.map((party) => party.name);
|
57
|
-
const response = await this.ws?.send({
|
58
|
-
method: "REQ_PARTY",
|
59
|
-
data: parites,
|
60
|
-
callbackID: 1
|
61
|
-
});
|
62
|
-
if (DefaultErrors_1.ErrorUtils.isError(response)) {
|
63
|
-
(0, LogService_1.logError)("ClusterService: error while registrating parties", response);
|
64
|
-
return;
|
65
|
-
}
|
66
|
-
for (let i of response)
|
67
|
-
this.addPartyHost(i);
|
68
|
-
},
|
69
|
-
onClose: () => {
|
70
|
-
console.log("ClusterService: connection to HUB closed");
|
71
|
-
this.connectToHUB();
|
72
|
-
},
|
73
|
-
});
|
74
|
-
}
|
75
|
-
addPartyHost(party) {
|
76
|
-
(0, LogService_1.logInfo)("ClusterService: add party host", party);
|
77
|
-
this.parites.set(party.id, party);
|
78
|
-
}
|
79
|
-
}
|
80
|
-
exports.ClusterService = ClusterService;
|
81
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2x1c3RlclNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpU2VydmVyL0NsdXN0ZXJTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRDQUF3QztBQUN4QywrQ0FBNEM7QUFDNUMsNkNBQWlEO0FBQ2pELDJEQUF3RTtBQUV4RSxvRUFBNkM7QUFFN0MsOERBQXdEO0FBQ3hELDBDQUF1QztBQTJCdkMsTUFBYSxjQUFlLFNBQVEseUJBQVc7SUFHM0MsT0FBTyxDQUF1QjtJQUM5QixFQUFFLEdBQW9CLElBQUksQ0FBQztJQUMzQixRQUFRLEdBQThELEVBQUUsQ0FBQztJQUN6RSxPQUFPLEdBQTBCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFM0MsWUFBWSxHQUF5QjtRQUNqQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztRQUVuQixJQUFJLENBQUMsUUFBUSxHQUFHO1lBQ1osSUFBSSx3QkFBTSxDQUFtQixtQkFBbUIsRUFBQyxTQUFTLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBQyxFQUFFO2dCQUVwRSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUM7U0FDTCxDQUFBO0lBRUwsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ04sSUFBQSxvQkFBTyxFQUFDLDZCQUE2QixDQUFDLENBQUE7UUFDdEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSztRQUNQLElBQUEsb0JBQU8sRUFBQyx5QkFBeUIsQ0FBQyxDQUFBO1FBQ2xDLElBQUcsSUFBSSxDQUFDLEVBQUU7WUFDTixJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZO1FBRWQsSUFBQSxvQkFBTyxFQUFDLG1DQUFtQyxDQUFDLENBQUE7UUFFNUMsSUFBRyxJQUFJLENBQUMsRUFBRTtZQUNOLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFcEIsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLDZCQUFhLENBQUM7WUFDeEIsU0FBUyxFQUFDLFVBQVU7WUFDcEIsRUFBRSxFQUFDLElBQUksWUFBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1lBRXhDLE1BQU0sRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07WUFDMUIsY0FBYyxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYztZQUMxQyxhQUFhLEVBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhO1lBQ3hDLE9BQU8sRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU87WUFFNUIsUUFBUSxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUTtZQUM5QixlQUFlLEVBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlO1lBQzVDLFNBQVMsRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVM7WUFFaEMsUUFBUSxFQUFDLElBQUksQ0FBQyxRQUFRO1lBRXRCLFlBQVksRUFBQyxLQUFLLElBQUcsRUFBRTtnQkFDbkIsSUFBQSxvQkFBTyxFQUFDLGtDQUFrQyxDQUFDLENBQUE7Z0JBRTNDLE1BQU0sSUFBQSxhQUFLLEVBQUMsSUFBSSxDQUFDLENBQUE7Z0JBR2pCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBQyxFQUFFLENBQUEsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM1RCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDO29CQUNqQyxNQUFNLEVBQUUsV0FBVztvQkFDbkIsSUFBSSxFQUFFLE9BQU87b0JBQ2IsVUFBVSxFQUFDLENBQUM7aUJBQ2YsQ0FBaUIsQ0FBQTtnQkFFbEIsSUFBRywwQkFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBQztvQkFDNUIsSUFBQSxxQkFBUSxFQUFDLGtEQUFrRCxFQUFDLFFBQVEsQ0FBQyxDQUFBO29CQUVyRSxPQUFPO2lCQUNWO2dCQUVELEtBQUksSUFBSSxDQUFDLElBQUksUUFBUTtvQkFDakIsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixDQUFDO1lBR0QsT0FBTyxFQUFDLEdBQUUsRUFBRTtnQkFDUixPQUFPLENBQUMsR0FBRyxDQUFDLDBDQUEwQyxDQUFDLENBQUE7Z0JBQ3ZELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QixDQUFDO1NBQ0osQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUdELFlBQVksQ0FBQyxLQUFnQjtRQUN6QixJQUFBLG9CQUFPLEVBQUMsZ0NBQWdDLEVBQUMsS0FBSyxDQUFDLENBQUE7UUFDL0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBQyxLQUFLLENBQUMsQ0FBQztJQUNyQyxDQUFDO0NBRUo7QUE1RkQsd0NBNEZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFdlYlNvY2tldCwgeyBSYXdEYXRhIH0gZnJvbSBcIndzXCI7XG5pbXBvcnQgeyBCYXNlU2VydmljZSB9IGZyb20gXCIuL0Jhc2VTZXJ2aWNlXCI7XG5pbXBvcnQgeyBsb2dFcnJvciwgbG9nSW5mbyB9IGZyb20gXCIuL0xvZ1NlcnZpY2VcIjtcbmltcG9ydCB7IEhVQkNvbm5lY3Rpb24sIElDbHVzdGVyUGFja2V0IH0gZnJvbSBcIi4vY2x1c3Rlci9IVUJDb25uZWN0aW9uXCI7XG5pbXBvcnQgeyBwcml2YXRlRGVjcnlwdCwgU2lnbiB9IGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCBTaWduYWwsIHsgUmVxIH0gZnJvbSBcImJhZG1mY2stc2lnbmFsXCI7XG5pbXBvcnQgeyBIVUJTZXJ2aWNlT3B0aW9ucywgSVdlYnNvY2tldFBhY2tldCB9IGZyb20gXCIuL2V4dGVybmFsL0V4dGVybmFsU2VydmljZVwiO1xuaW1wb3J0IHsgRXJyb3JVdGlscyB9IGZyb20gXCIuL3N0cnVjdHVyZXMvRGVmYXVsdEVycm9yc1wiO1xuaW1wb3J0IHsgU2xlZXAgfSBmcm9tIFwiLi9oZWxwZXIvU2xlZXBcIjtcblxuXG5leHBvcnQgaW50ZXJmYWNlIElQYXJ0eXtcbiAgICBuYW1lOnN0cmluZyxcbiAgICBoYW5kbGVyczooU2lnbmFsPElXZWJzb2NrZXRQYWNrZXQ+fFJlcTxJV2Vic29ja2V0UGFja2V0LGFueT4pW10sXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBhcnR5SG9zdHtcbiAgICB1cmw6c3RyaW5nLFxuXHRwdWJsaWNLZXk6c3RyaW5nLFxuXHRpZDpzdHJpbmdcdFxufVxuXG4vKipcbiAqIENsdXN0ZXJTZXJ2aWNlT3B0aW9uc1xuICogaWQ6IHN0cmluZyAtIGlkIG9mIHRoZSBzZXJ2aWNlLCBtdXN0IGJlIHNoYTI1NiBoYXNoIG9yIHN0cm9uZ2VyXG4gKiBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbHVzdGVyU2VydmljZU9wdGlvbnMgZXh0ZW5kcyBIVUJTZXJ2aWNlT3B0aW9uc3tcbiAgICBcbiAgICB0YXJnZXRJRDpzdHJpbmcsXG4gICAgdGFyZ2V0UHVibGljS2V5OnN0cmluZyxcbiAgICB0YXJnZXRVUkw6c3RyaW5nLFxuICAgIHBhcnR5OklQYXJ0eVtdLCAvLyBsaXN0IG9mIGlkcyBvZiBwYXJ0aWVzIHRoYXQgSSBjYW4gY29ubmVjdCB0b1xufVxuXG5leHBvcnQgY2xhc3MgQ2x1c3RlclNlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZXtcbiAgICBcbiAgIFxuICAgIG9wdGlvbnM6Q2x1c3RlclNlcnZpY2VPcHRpb25zO1xuICAgIHdzOkhVQkNvbm5lY3Rpb258bnVsbD1udWxsO1xuICAgIGhhbmRsZXJzOiAoU2lnbmFsPElXZWJzb2NrZXRQYWNrZXQ+IHwgUmVxPElXZWJzb2NrZXRQYWNrZXQsIGFueT4pW10gPSBbXTtcbiAgICBwYXJpdGVzOk1hcDxzdHJpbmcsSVBhcnR5SG9zdD4gPSBuZXcgTWFwKCk7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHQ6Q2x1c3RlclNlcnZpY2VPcHRpb25zKXtcbiAgICAgICAgc3VwZXIoXCJDbHVzdGVyU2VydmljZVwiKVxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHQ7XG5cbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IFtcbiAgICAgICAgICAgIG5ldyBTaWduYWw8SVdlYnNvY2tldFBhY2tldD4oXCJTX1BBUlRZX0FWQUlMQUJMRVwiLHVuZGVmaW5lZCxhc3luYyAocmVxKT0+e1xuICAgICAgICAgICAgICAgIC8vIGdvdCBpbmZvIGFib3V0IHBhcnR5XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRQYXJ0eUhvc3QocmVxLmRhdGEpO1xuICAgICAgICAgICAgfSkgICAgICAgICAgICBcbiAgICAgICAgXVxuICAgIFxuICAgIH1cblxuICAgIGFzeW5jIGluaXQoKXtcbiAgICAgICAgbG9nSW5mbyhcIkNsdXN0ZXJTZXJ2aWNlOiBpbml0aWFsaXplZFwiKVxuICAgICAgICB0aGlzLmNvbm5lY3RUb0hVQigpO1xuICAgIH1cblxuICAgIGFzeW5jIGNsb3NlKCl7XG4gICAgICAgIGxvZ0luZm8oXCJDbHVzdGVyU2VydmljZTogY2xvc2luZ1wiKVxuICAgICAgICBpZih0aGlzLndzKVxuICAgICAgICAgICAgdGhpcy53cy5jbG9zZSgpO1xuICAgICAgICB0aGlzLnBhcml0ZXMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBhc3luYyBjb25uZWN0VG9IVUIoKXtcblxuICAgICAgICBsb2dJbmZvKFwiQ2x1c3RlclNlcnZpY2U6IGNvbm5lY3RpbmcgdG8gSFVCXCIpXG5cbiAgICAgICAgaWYodGhpcy53cylcbiAgICAgICAgICAgIHRoaXMud3MuY2xvc2UoKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMud3MgPSBuZXcgSFVCQ29ubmVjdGlvbih7XG4gICAgICAgICAgICBkaXJlY3Rpb246XCJvdXRnb2luZ1wiLFxuICAgICAgICAgICAgd3M6bmV3IFdlYlNvY2tldCh0aGlzLm9wdGlvbnMudGFyZ2V0VVJMKSxcblxuICAgICAgICAgICAgaG9zdElEOnRoaXMub3B0aW9ucy5ob3N0SUQsXG4gICAgICAgICAgICBob3N0UHJpdmF0ZUtleTp0aGlzLm9wdGlvbnMuaG9zdFByaXZhdGVLZXksXG4gICAgICAgICAgICBob3N0UHVibGljS2V5OnRoaXMub3B0aW9ucy5ob3N0UHVibGljS2V5LFxuICAgICAgICAgICAgaG9zdFVSTDp0aGlzLm9wdGlvbnMuaG9zdFVSTCxcblxuICAgICAgICAgICAgdGFyZ2V0SUQ6dGhpcy5vcHRpb25zLnRhcmdldElELFxuICAgICAgICAgICAgdGFyZ2V0UHVibGljS2V5OnRoaXMub3B0aW9ucy50YXJnZXRQdWJsaWNLZXksXG4gICAgICAgICAgICB0YXJnZXRVUkw6dGhpcy5vcHRpb25zLnRhcmdldFVSTCxcblxuICAgICAgICAgICAgaGFuZGxlcnM6dGhpcy5oYW5kbGVycyxcblxuICAgICAgICAgICAgb25BdXRob3JpemVkOmFzeW5jICgpPT57XG4gICAgICAgICAgICAgICAgbG9nSW5mbyhcIkNsdXN0ZXJTZXJ2aWNlOiBjb25uZWN0ZWQgdG8gSFVCXCIpXG5cbiAgICAgICAgICAgICAgICBhd2FpdCBTbGVlcCgxMDAwKVxuXG4gICAgICAgICAgICAgICAgLy8gcmVnaXN0cmF0ZSBwYXJ0aWVzXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyaXRlcyA9IHRoaXMub3B0aW9ucy5wYXJ0eS5tYXAoKHBhcnR5KT0+cGFydHkubmFtZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLndzPy5zZW5kKHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcIlJFUV9QQVJUWVwiLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBwYXJpdGVzLFxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0lEOjFcbiAgICAgICAgICAgICAgICB9KSBhcyBJUGFydHlIb3N0W11cblxuICAgICAgICAgICAgICAgIGlmKEVycm9yVXRpbHMuaXNFcnJvcihyZXNwb25zZSkpe1xuICAgICAgICAgICAgICAgICAgICBsb2dFcnJvcihcIkNsdXN0ZXJTZXJ2aWNlOiBlcnJvciB3aGlsZSByZWdpc3RyYXRpbmcgcGFydGllc1wiLHJlc3BvbnNlKVxuICAgICAgICAgICAgICAgICAgICAvL3RvZG8gcmV0YWtlIHBhcml0ZXNcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBmb3IobGV0IGkgb2YgcmVzcG9uc2UpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkUGFydHlIb3N0KGkpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgXG4gICAgICAgICAgICBvbkNsb3NlOigpPT57XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJDbHVzdGVyU2VydmljZTogY29ubmVjdGlvbiB0byBIVUIgY2xvc2VkXCIpXG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0VG9IVUIoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgfVxuXG5cbiAgICBhZGRQYXJ0eUhvc3QocGFydHk6SVBhcnR5SG9zdCl7XG4gICAgICAgIGxvZ0luZm8oXCJDbHVzdGVyU2VydmljZTogYWRkIHBhcnR5IGhvc3RcIixwYXJ0eSlcbiAgICAgICAgdGhpcy5wYXJpdGVzLnNldChwYXJ0eS5pZCxwYXJ0eSk7XG4gICAgfVxuXG59Il19
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"ClusterService.js","sourceRoot":"","sources":["../../src/apiServer/ClusterService.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAwC;AACxC,+CAA4C;AAC5C,6CAAiD;AACjD,2DAAwE;AAIxE,8DAAwD;AACxD,0CAAuC;AA2BvC,MAAa,cAAe,SAAQ,yBAAW;IAG3C,OAAO,CAAuB;IAC9B,EAAE,GAAoB,IAAI,CAAC;IAE3B,OAAO,GAAsB,IAAI,GAAG,EAAE,CAAC;IAEvC,YAAY,GAAyB;QACjC,KAAK,CAAC,gBAAgB,CAAC,CAAA;QACvB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,IAAI;QACN,IAAA,oBAAO,EAAC,6BAA6B,CAAC,CAAA;QACtC,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,YAAY;QAEd,IAAA,oBAAO,EAAC,mCAAmC,CAAC,CAAA;QAE5C,IAAG,IAAI,CAAC,EAAE;YACN,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAEpB,IAAI,CAAC,EAAE,GAAG,IAAI,6BAAa,CAAC;YACxB,SAAS,EAAC,UAAU;YACpB,EAAE,EAAC,IAAI,YAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YAExC,MAAM,EAAC,IAAI,CAAC,OAAO,CAAC,MAAM;YAC1B,cAAc,EAAC,IAAI,CAAC,OAAO,CAAC,cAAc;YAC1C,aAAa,EAAC,IAAI,CAAC,OAAO,CAAC,aAAa;YACxC,OAAO,EAAC,IAAI,CAAC,OAAO,CAAC,OAAO;YAE5B,QAAQ,EAAC,IAAI,CAAC,OAAO,CAAC,QAAQ;YAC9B,eAAe,EAAC,IAAI,CAAC,OAAO,CAAC,eAAe;YAC5C,SAAS,EAAC,IAAI,CAAC,OAAO,CAAC,SAAS;YAEhC,QAAQ,EAAC,EAAE;YAEX,YAAY,EAAC,KAAK,IAAG,EAAE;gBACnB,IAAA,oBAAO,EAAC,kCAAkC,CAAC,CAAA;gBAE3C,MAAM,IAAA,aAAK,EAAC,IAAI,CAAC,CAAA;gBAGjB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAC,EAAE,CAAA,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC5D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC;oBACjC,MAAM,EAAE,WAAW;oBACnB,IAAI,EAAE,OAAO;oBACb,UAAU,EAAC,CAAC;iBACf,CAAiB,CAAA;gBAElB,IAAG,0BAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAC;oBAC5B,IAAA,qBAAQ,EAAC,kDAAkD,EAAC,QAAQ,CAAC,CAAA;oBAErE,OAAO;iBACV;gBAED,KAAI,IAAI,CAAC,IAAI,QAAQ;oBACjB,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC7B,CAAC;YAGD,OAAO,EAAC,GAAE,EAAE;gBACR,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAA;gBACvD,IAAI,CAAC,YAAY,EAAE,CAAC;YACxB,CAAC;SACJ,CAAC,CAAA;IACN,CAAC;IAGD,YAAY,CAAC,IAAe;QACxB,IAAA,oBAAO,EAAC,gCAAgC,EAAC,IAAI,CAAC,CAAA;IAClD,CAAC;CAEJ;AA5ED,wCA4EC","sourcesContent":["import WebSocket, { RawData } from \"ws\";\nimport { BaseService } from \"./BaseService\";\nimport { logError, logInfo } from \"./LogService\";\nimport { HUBConnection, IClusterPacket } from \"./cluster/HUBConnection\";\nimport { privateDecrypt } from \"crypto\";\nimport Signal, { Req } from \"badmfck-signal\";\nimport { HUBServiceOptions, IWebsocketPacket } from \"./HUBService\";\nimport { ErrorUtils } from \"./structures/DefaultErrors\";\nimport { Sleep } from \"./helper/Sleep\";\n\n\nexport interface IParty{\n name:string,\n handlers:(Signal<IWebsocketPacket>|Req<IWebsocketPacket,any>)[],\n}\n\nexport interface IPartyHost{\n url:string,\n\tpublicKey:string,\n\tid:string\t\n}\n\n/**\n * ClusterServiceOptions\n * id: string - id of the service, must be sha256 hash or stronger\n * \n */\nexport interface ClusterServiceOptions extends HUBServiceOptions{\n \n targetID:string,\n targetPublicKey:string,\n targetURL:string,\n party:IParty[], // list of ids of parties that I can connect to\n}\n\nexport class ClusterService extends BaseService{\n \n \n options:ClusterServiceOptions;\n ws:HUBConnection|null=null;\n\n parites:Map<string,IParty> = new Map();\n\n constructor(opt:ClusterServiceOptions){\n super(\"ClusterService\")\n this.options = opt;\n }\n\n async init(){\n logInfo(\"ClusterService: initialized\")\n this.connectToHUB();\n }\n\n async connectToHUB(){\n\n logInfo(\"ClusterService: connecting to HUB\")\n\n if(this.ws)\n this.ws.close();\n \n this.ws = new HUBConnection({\n direction:\"outgoing\",\n ws:new WebSocket(this.options.targetURL),\n\n hostID:this.options.hostID,\n hostPrivateKey:this.options.hostPrivateKey,\n hostPublicKey:this.options.hostPublicKey,\n hostURL:this.options.hostURL,\n\n targetID:this.options.targetID,\n targetPublicKey:this.options.targetPublicKey,\n targetURL:this.options.targetURL,\n\n handlers:[],\n\n onAuthorized:async ()=>{\n logInfo(\"ClusterService: connected to HUB\")\n\n await Sleep(1000)\n\n // registrate parties\n const parites = this.options.party.map((party)=>party.name);\n const response = await this.ws?.send({\n method: \"REQ_PARTY\",\n data: parites,\n callbackID:1\n }) as IPartyHost[]\n\n if(ErrorUtils.isError(response)){\n logError(\"ClusterService: error while registrating parties\",response)\n //todo retake parites\n return;\n }\n \n for(let i of response)\n this.addPartyHost(i);\n },\n\n \n onClose:()=>{\n console.log(\"ClusterService: connection to HUB closed\")\n this.connectToHUB();\n },\n })\n }\n\n\n addPartyHost(host:IPartyHost){\n logInfo(\"ClusterService: add party host\",host)\n }\n\n}"]}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"DocumentService.js","sourceRoot":"","sources":["../../src/apiServer/DocumentService.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport { parse, Spec } from \"comment-parser\";\n\n//TODO: api endpoint, sourcepath, .doc file - from config\n\ndeclare type DocumentGeneratorConfig = {\n\tsourcePath: string;\n\tapiEndpoint: string;\n\tsavePath: string;\n\tsavePathFileName: string;\n};\n\ndeclare type DocumentGeneratorDocumentation = {\n\t[baseEndpointName: string]: {\n\t\t[endPointName: string]: DocumentGeneratorDocumentationEndpoint;\n\t};\n};\n\ndeclare type DocumentGeneratorDocumentationEndpoint = {\n\thandler: string;\n\tfullPath: string;\n\tignoreInterceptor?: string;\n\n\tdescription?: string;\n\tparameters: DocumentGeneratorDocumentationEndpointParameter[];\n\treturns?: Omit<DocumentGeneratorDocumentationEndpointParameter, \"optional\">;\n\texample?: string[];\n\tthrows?: Omit<DocumentGeneratorDocumentationEndpointParameter, \"optional\">[];\n};\n\ndeclare type DocumentGeneratorDocumentationEndpointParameter = {\n\tname: string;\n\ttype: string;\n\tdescription: string;\n\toptional?: boolean;\n};\n\nexport class DocumentGenerator {\n\tprivate documentation: DocumentGeneratorDocumentation = {};\n\tprivate config: DocumentGeneratorConfig;\n\n\tconstructor(config: DocumentGeneratorConfig) {\n\t\tthis.config = config;\n\n\t\tthis.generateDocumentation();\n\t}\n\n\tprivate getFiles(): string[] {\n\t\treturn fs.readdirSync(this.config.sourcePath);\n\t}\n\n\tprivate getFileContent(file: string) {\n\t\treturn fs.readFileSync(path.resolve(this.config.sourcePath, file), \"utf-8\");\n\t}\n\n\tprivate generateDocumentation = () => {\n\t\tfor (const file of this.getFiles()) {\n\t\t\tconst fileContent = this.getFileContent(file);\n\n\t\t\t// get base endpoint\n\t\t\tconst baseEndpoint = fileContent.match(/super\\(['\"](.*?)['\"]\\)/);\n\t\t\tif (!baseEndpoint) {\n\t\t\t\tconsole.error(`No base endpoint found in ${file}`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst nodeEndpoint = this.config.apiEndpoint + \"/\" + baseEndpoint[1];\n\n\t\t\t// get all endpoints\n\t\t\tconst regex = /{\\s*endpoint:\\s*\"(.*?)\",\\s*handler:\\s*this\\.(.*?)(?:,\\s*ignoreInterceptor:\\s*(true|false))?\\s*}/g;\n\n\t\t\tconst endpoints = fileContent.matchAll(regex);\n\n\t\t\tfor (const match of endpoints) {\n\t\t\t\tconst endpointName: string = match[1];\n\t\t\t\tconst handler = match[2];\n\t\t\t\tconst ignoreInterceptor = match[3];\n\n\t\t\t\tif (!this.documentation.hasOwnProperty(nodeEndpoint)) {\n\t\t\t\t\tthis.documentation[nodeEndpoint] = {};\n\t\t\t\t}\n\n\t\t\t\tconst endpoint: DocumentGeneratorDocumentationEndpoint = {\n\t\t\t\t\thandler,\n\t\t\t\t\tignoreInterceptor,\n\t\t\t\t\tfullPath: nodeEndpoint + \"/\" + endpointName,\n\t\t\t\t\tdescription: \"\",\n\t\t\t\t\tparameters: [],\n\t\t\t\t};\n\n\t\t\t\tthis.documentation[nodeEndpoint][endpointName] = this.parseEndPointComments(\n\t\t\t\t\tthis.getCommentsByEndpoint(fileContent, handler),\n\t\t\t\t\tendpoint,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tthis.saveDocumentation();\n\n\t\tconsole.log(\"Documentation generated and saved successfully\");\n\t};\n\n\tprivate getCommentsByEndpoint(fileContent: string, handler: string): string {\n\t\tlet comments: string = \"\";\n\n\t\t//TODO: change to regex\n\t\t//const regex = new RegExp(`/\\\\*\\\\*([\\\\s\\\\S]*?)\\\\*/\\\\s*async\\\\s+${handler}\\\\s*\\\\(`, \"g\");\n\t\t//const regex = new RegExp(`/\\\\*\\\\*([\\\\s\\\\S]*?)\\\\*\\\\/\\\\s*async\\\\s+${handler}\\\\s*\\\\(`, \"g\");\n\t\t//const match2 = fileContent.match(regex);\n\n\t\t//if (match2) {\n\t\t// \tcomments = match2[0];\n\t\t// \t// formatJavaDoc(match2[0], description);\n\t\t//}\n\n\t\tconst regex = new RegExp(`(async )*${handler}(\\\\s*)\\\\(`, \"g\");\n\t\tconst match = fileContent.match(regex);\n\n\t\tif (match) {\n\t\t\t// const indexHandler = fileContent.indexOf(`async ${handler}(`);\n\t\t\tconst indexHandler = fileContent.indexOf(`${match[0]}`);\n\n\t\t\t// if (indexHandler === -1) {\n\t\t\t// \tindexHandler = fileContent.indexOf(`${handler}(`);\n\t\t\t// }\n\n\t\t\tif (indexHandler != -1) {\n\t\t\t\tconst indexCommentStart = fileContent.lastIndexOf(\"/**\", indexHandler);\n\t\t\t\tif (indexCommentStart != -1) {\n\t\t\t\t\tconst indexCommentEnd = fileContent.indexOf(\"*/\", indexCommentStart);\n\n\t\t\t\t\tif (indexCommentEnd != -1) {\n\t\t\t\t\t\tconst commentsSubstring = fileContent.substring(indexCommentStart, indexCommentEnd + 2);\n\n\t\t\t\t\t\tif (commentsSubstring) {\n\t\t\t\t\t\t\tconst regexToCheckCommentWithMethod = new RegExp(\n\t\t\t\t\t\t\t\t`${commentsSubstring.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}([\\\\s]*?)(async )*${handler}(\\\\s*)\\\\(`,\n\t\t\t\t\t\t\t\t\"g\",\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tconst matchToCheckCommentWithMethod = fileContent.match(regexToCheckCommentWithMethod);\n\n\t\t\t\t\t\t\tif (matchToCheckCommentWithMethod) {\n\t\t\t\t\t\t\t\tcomments = commentsSubstring;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn comments;\n\t}\n\n\tprivate parseEndPointComments(\n\t\tcomments: string,\n\t\tendpoint: DocumentGeneratorDocumentationEndpoint,\n\t): DocumentGeneratorDocumentationEndpoint {\n\t\tif (comments) {\n\t\t\tconst parsed = parse(comments, { spacing: \"preserve\" });\n\t\t\tif (parsed[0]) {\n\t\t\t\tconst firstParsed = parsed[0];\n\t\t\t\t// console.log(firstParsed.tags);\n\n\t\t\t\tendpoint.description = this.tagModifications(firstParsed.description);\n\n\t\t\t\tfirstParsed.tags.forEach((tag) => {\n\t\t\t\t\tendpoint = this.tagToEndpoint(tag, endpoint);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn endpoint;\n\t}\n\n\t/**\n\t * From comment-parser library to json\n\t *\n\t * @param tag\n\t * @param endpoint\n\t * @returns\n\t */\n\tprivate tagToEndpoint(\n\t\ttag: Spec,\n\t\tendpoint: DocumentGeneratorDocumentationEndpoint,\n\t): DocumentGeneratorDocumentationEndpoint {\n\t\tswitch (tag.tag) {\n\t\t\tcase \"param\":\n\t\t\t\tendpoint.parameters.push({\n\t\t\t\t\tname: this.tagModifications(tag.name, \"name\"),\n\t\t\t\t\ttype: tag.type,\n\t\t\t\t\tdescription: this.tagModifications(tag.description),\n\t\t\t\t\toptional: tag.optional,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase \"description\":\n\t\t\t\tendpoint.description = this.tagModifications(tag.description);\n\t\t\t\tbreak;\n\t\t\tcase \"example\":\n\t\t\t\tif (!endpoint.example) {\n\t\t\t\t\tendpoint.example = [];\n\t\t\t\t}\n\n\t\t\t\tendpoint.example.push(this.tagModifications(tag.description));\n\t\t\t\tbreak;\n\t\t\tcase \"returns\":\n\t\t\t\tendpoint.returns = {\n\t\t\t\t\tname: this.tagModifications(tag.name, \"name\"),\n\t\t\t\t\ttype: tag.type,\n\t\t\t\t\tdescription: this.tagModifications(tag.description),\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tcase \"throws\":\n\t\t\t\tif (!endpoint.throws) {\n\t\t\t\t\tendpoint.throws = [];\n\t\t\t\t}\n\n\t\t\t\tendpoint.throws.push({\n\t\t\t\t\tname: this.tagModifications(tag.name, \"name\"),\n\t\t\t\t\ttype: tag.type,\n\t\t\t\t\tdescription: this.tagModifications(tag.description),\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn endpoint;\n\t}\n\n\t/**\n\t *\n\t * modification after comment-parser library parsings with \"-\" in description\n\t *\n\t * @param text\n\t * @param field\n\t * @returns\n\t */\n\tprivate tagModifications(text: string, field: string = \"description\"): string {\n\t\tswitch (field) {\n\t\t\tcase \"description\":\n\t\t\t\ttext = text\n\t\t\t\t\t.trim()\n\t\t\t\t\t.replace(/^(\\-.)/, \"\")\n\t\t\t\t\t.trim();\n\n\t\t\t\tbreak;\n\n\t\t\tcase \"name\":\n\t\t\t\tif (text === \"-\") {\n\t\t\t\t\ttext = \"\";\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn text;\n\t}\n\n\tprivate saveDocumentation(): void {\n\t\t// const formatForSave = { data: this.documentation };\n\t\tconst formatForSave = this.documentation;\n\t\tconst filePath = this.config.savePath + this.config.savePathFileName;\n\n\t\tfs.writeFileSync(filePath, JSON.stringify(formatForSave, null, 2));\n\t}\n\n\tpublic getDocumentation(): DocumentGeneratorDocumentation {\n\t\treturn this.documentation;\n\t}\n\n\t// const formatJavaDoc = (comment, finalDescription) => {\n\t// \t// Регулярные выражения для различных частей комментария\n\t// \tconst descriptionRegex = /\\/\\*\\*([\\s\\S]*?)(?=\\s*\\*\\s*@|\\s*\\*\\/)/g;\n\t// \tconst paramRegex = /@param\\s+(\\w+)\\s+([^\\s]+)\\s*-\\s*(.+?)(?=\\s+\\*|$)/g;\n\t// \tconst returnRegex = /@returns?\\s+([^\\s]+)\\s*-\\s*(.+?)(?=\\s+\\*|$)/g;\n\t// \tconst throwsRegex = /@throws\\s+([^\\s]+)\\s*-\\s*(.+?)(?=\\s+\\*|$)/g;\n\t// \tconst seeRegex = /@see\\s+([^\\s]+)(?=\\s+\\*|$)/g;\n\n\t// \t// Извлекаем описание\n\t// \tconst descriptionMatch = descriptionRegex.exec(comment);\n\t// \tconst description = descriptionMatch ? descriptionMatch[1].trim().replace(/\\*\\s+/g, \"\").replace(/\\n/g, \" \") : \"\";\n\n\t// \tfinalDescription.info = description;\n\n\t// \t// Извлекаем параметры\n\t// \tconst params = [];\n\t// \tlet paramMatch;\n\t// \twhile ((paramMatch = paramRegex.exec(comment)) !== null) {\n\t// \t\tparams.push({\n\t// \t\t\tname: paramMatch[1],\n\t// \t\t\ttype: paramMatch[2],\n\t// \t\t\tdescription: paramMatch[3].trim(),\n\t// \t\t});\n\t// \t}\n\t// \tdescription.params = params;\n\n\t// \t// Извлекаем возвращаемое значение\n\t// \tconst returnMatch = returnRegex.exec(comment);\n\t// \tconst returnType = returnMatch ? returnMatch[1] : \"\";\n\t// \tconst returnDescription = returnMatch ? returnMatch[2].trim() : \"\";\n\n\t// \tfinalDescription.return = {\n\t// \t\ttype: returnType,\n\t// \t\tdescription: returnDescription,\n\t// \t};\n\n\t// \t// Извлекаем исключения\n\t// \tconst throws = [];\n\t// \tlet throwsMatch;\n\t// \twhile ((throwsMatch = throwsRegex.exec(comment)) !== null) {\n\t// \t\tthrows.push({\n\t// \t\t\texception: throwsMatch[1],\n\t// \t\t\tdescription: throwsMatch[2].trim(),\n\t// \t\t});\n\t// \t}\n\t// \tdescription.throws = throws;\n\n\t// \t// Извлекаем теги @see\n\t// \tconst seeReferences = [];\n\t// \tlet seeMatch;\n\t// \twhile ((seeMatch = seeRegex.exec(comment)) !== null) {\n\t// \t\tseeReferences.push(seeMatch[1]);\n\t// \t}\n\n\t// \tdescription.see = seeReferences;\n\t// };\n}\n\n// const documentGenerator =\nnew DocumentGenerator({\n\tsourcePath: \"./src/api\",\n\tapiEndpoint: \"api/v1\",\n\tsavePath: \"./bin/\",\n\tsavePathFileName: \"doc.json\",\n});\n\n// console.log(documentGenerator.getDocumentation());"]}
|
@@ -1,37 +0,0 @@
|
|
1
|
-
import { BaseService } from "./BaseService";
|
2
|
-
import { HUBConnection } from "./cluster/HUBConnection";
|
3
|
-
import Signal, { Req } from "badmfck-signal";
|
4
|
-
import { IError } from "./structures/Interfaces";
|
5
|
-
export interface HUBServiceOptions {
|
6
|
-
hostID: string;
|
7
|
-
hostPublicKey: string;
|
8
|
-
hostPrivateKey: string;
|
9
|
-
hostURL: string;
|
10
|
-
}
|
11
|
-
export interface IClusterNode {
|
12
|
-
clusterID: string;
|
13
|
-
url: string;
|
14
|
-
publicKey: string;
|
15
|
-
privateKey: string;
|
16
|
-
ws: HUBConnection[];
|
17
|
-
watchlist: string[];
|
18
|
-
}
|
19
|
-
export interface IWebsocketPacket<T = any> {
|
20
|
-
data: T;
|
21
|
-
authorized: boolean;
|
22
|
-
connection: HUBConnection;
|
23
|
-
}
|
24
|
-
export declare const REQ_CLUSTER_NODE: Req<string, IError | {
|
25
|
-
url: string;
|
26
|
-
publicKey: string;
|
27
|
-
}>;
|
28
|
-
export declare class HUBService extends BaseService {
|
29
|
-
options: HUBServiceOptions;
|
30
|
-
nodes: Map<string, IClusterNode>;
|
31
|
-
handlers: (Signal<IWebsocketPacket> | Req<IWebsocketPacket, any>)[];
|
32
|
-
constructor(options: HUBServiceOptions);
|
33
|
-
init(): Promise<void>;
|
34
|
-
applicationReady(): Promise<void>;
|
35
|
-
onConnectionAuthorized(conn: HUBConnection): void;
|
36
|
-
onConnectionClosed(conn: HUBConnection): void;
|
37
|
-
}
|
@@ -1,132 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
-
};
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
exports.HUBService = exports.REQ_CLUSTER_NODE = void 0;
|
7
|
-
const ws_1 = require("ws");
|
8
|
-
const APIService_1 = require("./APIService");
|
9
|
-
const BaseService_1 = require("./BaseService");
|
10
|
-
const HUBConnection_1 = require("./cluster/HUBConnection");
|
11
|
-
const LogService_1 = require("./LogService");
|
12
|
-
const badmfck_signal_1 = require("badmfck-signal");
|
13
|
-
const DefaultErrors_1 = __importDefault(require("./structures/DefaultErrors"));
|
14
|
-
exports.REQ_CLUSTER_NODE = new badmfck_signal_1.Req(undefined, "REQ_CLUSTER_NODE");
|
15
|
-
class HUBService extends BaseService_1.BaseService {
|
16
|
-
options;
|
17
|
-
nodes = new Map();
|
18
|
-
handlers = [];
|
19
|
-
constructor(options) {
|
20
|
-
super("HUBService");
|
21
|
-
this.options = options;
|
22
|
-
this.handlers = [
|
23
|
-
new badmfck_signal_1.Req(async (req) => {
|
24
|
-
if (!req.data || !Array.isArray(req.data))
|
25
|
-
return { ...DefaultErrors_1.default.BAD_REQUEST, details: "data array is not set" };
|
26
|
-
const incomingCluster = this.nodes.get(req.connection.options.targetID ?? "");
|
27
|
-
if (!incomingCluster)
|
28
|
-
return { ...DefaultErrors_1.default.BAD_REQUEST, details: "cluster for incoming connection not found" };
|
29
|
-
const result = [];
|
30
|
-
for (let i of req.data) {
|
31
|
-
const clusterNode = this.nodes.get(i);
|
32
|
-
if (clusterNode) {
|
33
|
-
result.push({
|
34
|
-
url: clusterNode.url,
|
35
|
-
publicKey: clusterNode.publicKey,
|
36
|
-
id: clusterNode.clusterID
|
37
|
-
});
|
38
|
-
}
|
39
|
-
if (incomingCluster.watchlist.filter(x => x === i).length === 0)
|
40
|
-
incomingCluster.watchlist.push(i + "");
|
41
|
-
}
|
42
|
-
return result;
|
43
|
-
}, "REQ_PARTY")
|
44
|
-
];
|
45
|
-
}
|
46
|
-
async init() {
|
47
|
-
super.init();
|
48
|
-
}
|
49
|
-
async applicationReady() {
|
50
|
-
const server = await APIService_1.REQ_HTTP_SERVER.request();
|
51
|
-
const wss = new ws_1.WebSocketServer({
|
52
|
-
server: server.http,
|
53
|
-
path: "/hub"
|
54
|
-
});
|
55
|
-
wss.on("connection", (ws) => {
|
56
|
-
const conn = new HUBConnection_1.HUBConnection({
|
57
|
-
ws: ws,
|
58
|
-
direction: "incoming",
|
59
|
-
hostID: this.options.hostID,
|
60
|
-
hostPrivateKey: this.options.hostPrivateKey,
|
61
|
-
hostPublicKey: this.options.hostPublicKey,
|
62
|
-
hostURL: this.options.hostURL + "/hub",
|
63
|
-
targetID: null,
|
64
|
-
targetPublicKey: null,
|
65
|
-
targetURL: null,
|
66
|
-
onAuthorized: () => this.onConnectionAuthorized(conn),
|
67
|
-
onClose: () => this.onConnectionClosed(conn),
|
68
|
-
handlers: this.handlers
|
69
|
-
});
|
70
|
-
});
|
71
|
-
wss.on("error", (err) => {
|
72
|
-
console.error("HUBService: error: ", err);
|
73
|
-
});
|
74
|
-
}
|
75
|
-
onConnectionAuthorized(conn) {
|
76
|
-
if (!conn.options.targetID) {
|
77
|
-
(0, LogService_1.logError)("HUBService: connection targetID is not set");
|
78
|
-
return;
|
79
|
-
}
|
80
|
-
let clusterNode = this.nodes.get(conn.options.targetID);
|
81
|
-
if (!clusterNode) {
|
82
|
-
(0, LogService_1.logInfo)("HUBService: new cluster node connected");
|
83
|
-
clusterNode = {
|
84
|
-
clusterID: conn.options.targetID,
|
85
|
-
url: conn.options.targetURL,
|
86
|
-
publicKey: conn.options.targetPublicKey,
|
87
|
-
privateKey: conn.options.hostPrivateKey,
|
88
|
-
ws: [],
|
89
|
-
watchlist: []
|
90
|
-
};
|
91
|
-
this.nodes.set(conn.options.targetID, clusterNode);
|
92
|
-
}
|
93
|
-
clusterNode.ws.push(conn);
|
94
|
-
(0, LogService_1.logInfo)("HUBService: new authorized connection added to cluster node");
|
95
|
-
for (let [id, cluster] of this.nodes) {
|
96
|
-
for (let i of cluster.watchlist) {
|
97
|
-
if (i === clusterNode.clusterID) {
|
98
|
-
cluster.ws.forEach(x => {
|
99
|
-
x.send({
|
100
|
-
method: "S_PARTY_AVAILABLE",
|
101
|
-
data: {
|
102
|
-
url: clusterNode.url,
|
103
|
-
publicKey: clusterNode.publicKey,
|
104
|
-
id: clusterNode.clusterID
|
105
|
-
},
|
106
|
-
callbackID: 0
|
107
|
-
});
|
108
|
-
});
|
109
|
-
}
|
110
|
-
}
|
111
|
-
}
|
112
|
-
}
|
113
|
-
onConnectionClosed(conn) {
|
114
|
-
if (!conn.options.targetID) {
|
115
|
-
(0, LogService_1.logError)("HUBService: connection targetID is not set");
|
116
|
-
return;
|
117
|
-
}
|
118
|
-
const clusterNode = this.nodes.get(conn.options.targetID);
|
119
|
-
if (!clusterNode) {
|
120
|
-
(0, LogService_1.logError)("HUBService: cluster node not found");
|
121
|
-
return;
|
122
|
-
}
|
123
|
-
clusterNode.ws = clusterNode.ws.filter(x => x !== conn);
|
124
|
-
(0, LogService_1.logInfo)("HUBService: connection closed");
|
125
|
-
if (!clusterNode.ws.length) {
|
126
|
-
(0, LogService_1.logInfo)("HUBService: cluster node disconnected");
|
127
|
-
this.nodes.delete(conn.options.targetID);
|
128
|
-
}
|
129
|
-
}
|
130
|
-
}
|
131
|
-
exports.HUBService = HUBService;
|
132
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSFVCU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGlTZXJ2ZXIvSFVCU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyQkFBZ0Q7QUFDaEQsNkNBQStDO0FBQy9DLCtDQUE0QztBQUM1QywyREFBd0Q7QUFDeEQsNkNBQWlEO0FBQ2pELG1EQUE2QztBQUU3QywrRUFBdUQ7QUEwQjFDLFFBQUEsZ0JBQWdCLEdBQUcsSUFBSSxvQkFBRyxDQUFzRCxTQUFTLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztBQUU1SCxNQUFhLFVBQVcsU0FBUSx5QkFBVztJQUUxQyxPQUFPLENBQW9CO0lBQzNCLEtBQUssR0FBOEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUM3QyxRQUFRLEdBQThELEVBQUUsQ0FBQztJQUV6RSxZQUFZLE9BQTBCO1FBQ3JDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHO1lBQ2YsSUFBSSxvQkFBRyxDQUF3QyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBRTVELElBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO29CQUN2QyxPQUFPLEVBQUMsR0FBRyx1QkFBYSxDQUFDLFdBQVcsRUFBQyxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsQ0FBQTtnQkFHdEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUM5RSxJQUFHLENBQUMsZUFBZTtvQkFDbEIsT0FBTyxFQUFDLEdBQUcsdUJBQWEsQ0FBQyxXQUFXLEVBQUMsT0FBTyxFQUFDLDJDQUEyQyxFQUFDLENB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LENBQUMsUUFBUSxFQUFFO1lBQzNCLElBQUEscUJBQVEsRUFBQyw0Q0FBNEMsQ0FBQyxDQUFBO1lBQ3RELE9BQU87U0FDUDtRQUVELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFMUQsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNqQixJQUFBLHFCQUFRLEVBQUMsb0NBQW9DLENBQUMsQ0FBQTtZQUM5QyxPQUFPO1NBQ1A7UUFFRCxXQUFXLENBQUMsRUFBRSxHQUFHLFdBQVcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBRXhELElBQUEsb0JBQU8sRUFBQywrQkFBK0IsQ0FBQyxDQUFBO1FBQ3hDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRTtZQUMzQixJQUFBLG9CQUFPLEVBQUMsdUNBQXVDLENBQUMsQ0FBQTtZQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBRXpDO0lBQ0YsQ0FBQztDQUNEO0FBdkpELGdDQXVKQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBXZWJTb2NrZXQsIHsgV2ViU29ja2V0U2VydmVyIH0gZnJvbSBcIndzXCI7XG5pbXBvcnQgeyBSRVFfSFRUUF9TRVJWRVIgfSBmcm9tIFwiLi9BUElTZXJ2aWNlXCI7XG5pbXBvcnQgeyBCYXNlU2VydmljZSB9IGZyb20gXCIuL0Jhc2VTZXJ2aWNlXCI7XG5pbXBvcnQgeyBIVUJDb25uZWN0aW9uIH0gZnJvbSBcIi4vY2x1c3Rlci9IVUJDb25uZWN0aW9uXCI7XG5pbXBvcnQgeyBsb2dFcnJvciwgbG9nSW5mbyB9IGZyb20gXCIuL0xvZ1NlcnZpY2VcIjtcbmltcG9ydCBTaWduYWwsIHsgUmVxIH0gZnJvbSBcImJhZG1mY2stc2lnbmFsXCI7XG5pbXBvcnQgeyBJRXJyb3IgfSBmcm9tIFwiLi9zdHJ1Y3R1cmVzL0ludGVyZmFjZXNcIjtcbmltcG9ydCBEZWZhdWx0RXJyb3JzIGZyb20gXCIuL3N0cnVjdHVyZXMvRGVmYXVsdEVycm9yc1wiO1xuaW1wb3J0IHsgSVBhcnR5SG9zdCB9IGZyb20gXCIuL0NsdXN0ZXJTZXJ2aWNlXCI7XG5cblxuZXhwb3J0IGludGVyZmFjZSBIVUJTZXJ2aWNlT3B0aW9ucyB7XG5cdGhvc3RJRDogc3RyaW5nLFxuXHRob3N0UHVibGljS2V5OiBzdHJpbmcsXG5cdGhvc3RQcml2YXRlS2V5OiBzdHJpbmcsXG5cdGhvc3RVUkw6IHN0cmluZyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2x1c3Rlck5vZGUge1xuXHRjbHVzdGVySUQ6IHN0cmluZyxcblx0dXJsOiBzdHJpbmcsXG5cdHB1YmxpY0tleTogc3RyaW5nLFxuXHRwcml2YXRlS2V5OiBzdHJpbmcsXG5cdHdzOiBIVUJDb25uZWN0aW9uW10sXG5cdHdhdGNobGlzdDpzdHJpbmdbXSAvLyBwYXJ0aWVzIGlkIHRoYXQgdGhpcyBjbHVzdGVyIGNhbiBjb25uZWN0IHRvXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYnNvY2tldFBhY2tldDxUID0gYW55PiB7XG5cdGRhdGE6IFQsXG5cdGF1dGhvcml6ZWQ6IGJvb2xlYW5cblx0Y29ubmVjdGlvbjogSFVCQ29ubmVjdGlvblxufVxuXG5leHBvcnQgY29uc3QgUkVRX0NMVVNURVJfTk9ERSA9IG5ldyBSZXE8c3RyaW5nLCB7IHVybDogc3RyaW5nLCBwdWJsaWNLZXk6IHN0cmluZyB9IHwgSUVycm9yPih1bmRlZmluZWQsIFwiUkVRX0NMVVNURVJfTk9ERVwiKTtcblxuZXhwb3J0IGNsYXNzIEhVQlNlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZSB7XG5cblx0b3B0aW9uczogSFVCU2VydmljZU9wdGlvbnM7XG5cdG5vZGVzOiBNYXA8c3RyaW5nLCBJQ2x1c3Rlck5vZGU+ID0gbmV3IE1hcCgpO1xuXHRoYW5kbGVyczogKFNpZ25hbDxJV2Vic29ja2V0UGFja2V0PiB8IFJlcTxJV2Vic29ja2V0UGFja2V0LCBhbnk+KVtdID0gW107XG5cblx0Y29uc3RydWN0b3Iob3B0aW9uczogSFVCU2VydmljZU9wdGlvbnMpIHtcblx0XHRzdXBlcihcIkhVQlNlcnZpY2VcIilcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXHRcdHRoaXMuaGFuZGxlcnMgPSBbXG5cdFx0XHRuZXcgUmVxPElXZWJzb2NrZXRQYWNrZXQsIElQYXJ0eUhvc3RbXXxJRXJyb3I+KGFzeW5jIChyZXEpID0+IHtcblx0XHRcdFx0Ly8gY2hlY2sgaW5jb21pbmcgcGFyYW1zXG5cdFx0XHRcdGlmKCFyZXEuZGF0YSB8fCAhQXJyYXkuaXNBcnJheShyZXEuZGF0YSkpXG5cdFx0XHRcdFx0cmV0dXJuIHsuLi5EZWZhdWx0RXJyb3JzLkJBRF9SRVFVRVNULGRldGFpbHM6XCJkYXRhIGFycmF5IGlzIG5vdCBzZXRcIn1cblxuXHRcdFx0XHQvLyBnZXQgaW5jb21pbmcgY2x1c3RlclxuXHRcdFx0XHRjb25zdCBpbmNvbWluZ0NsdXN0ZXIgPSB0aGlzLm5vZGVzLmdldChyZXEuY29ubmVjdGlvbi5vcHRpb25zLnRhcmdldElEID8/IFwiXCIpO1xuXHRcdFx0XHRpZighaW5jb21pbmdDbHVzdGVyKVxuXHRcdFx0XHRcdHJldHVybiB7Li4uRGVmYXVsdEVycm9ycy5CQURfUkVRVUVTVCxkZXRhaWxzOlwiY2x1c3RlciBmb3IgaW5jb21pbmcgY29ubmVjdGlvbiBub3QgZm91bmRcIn1cblxuXHRcdFx0XHQvLyBjaGVja1xuXHRcdFx0XHRjb25zdCByZXN1bHQgPSBbXTsgXG5cdFx0XHRcdGZvcihsZXQgaSBvZiByZXEuZGF0YSl7XG5cdFx0XHRcdFx0Y29uc3QgY2x1c3Rlck5vZGUgPSB0aGlzLm5vZGVzLmdldChpKTtcblx0XHRcdFx0XHRpZihjbHVzdGVyTm9kZSl7XG5cdFx0XHRcdFx0XHRyZXN1bHQucHVzaCh7XG5cdFx0XHRcdFx0XHRcdHVybDpjbHVzdGVyTm9kZS51cmwsXG5cdFx0XHRcdFx0XHRcdHB1YmxpY0tleTpjbHVzdGVyTm9kZS5wdWJsaWNLZXksXG5cdFx0XHRcdFx0XHRcdGlkOmNsdXN0ZXJOb2RlLmNsdXN0ZXJJRFx0XHRcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYoaW5jb21pbmdDbHVzdGVyLndhdGNobGlzdC5maWx0ZXIoeD0+eD09PWkpLmxlbmd0aD09PTApXG5cdFx0XHRcdFx0XHRpbmNvbWluZ0NsdXN0ZXIud2F0Y2hsaXN0LnB1c2goaStcIlwiKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cblx0XHRcdH0sIFwiUkVRX1BBUlRZXCIpXG5cdFx0XTtcblx0fVxuXG5cdGFzeW5jIGluaXQoKSB7XG5cdFx0c3VwZXIuaW5pdCgpO1xuXHR9XG5cblx0YXN5bmMgYXBwbGljYXRpb25SZWFkeSgpIHtcblx0XHRjb25zdCBzZXJ2ZXIgPSBhd2FpdCBSRVFfSFRUUF9TRVJWRVIucmVxdWVzdCgpO1xuXG5cdFx0Y29uc3Qgd3NzID0gbmV3IFdlYlNvY2tldFNlcnZlcih7XG5cdFx0XHRzZXJ2ZXI6IHNlcnZlci5odHRwLFxuXHRcdFx0cGF0aDogXCIvaHViXCJcblx0XHR9KVxuXG5cdFx0d3NzLm9uKFwiY29ubmVjdGlvblwiLCAod3MpID0+IHtcblx0XHRcdGNvbnN0IGNvbm46IEhVQkNvbm5lY3Rpb24gPSBuZXcgSFVCQ29ubmVjdGlvbih7XG5cdFx0XHRcdHdzOiB3cyxcblx0XHRcdFx0ZGlyZWN0aW9uOiBcImluY29taW5nXCIsXG5cblx0XHRcdFx0aG9zdElEOiB0aGlzLm9wdGlvbnMuaG9zdElELFxuXHRcdFx0XHRob3N0UHJpdmF0ZUtleTogdGhpcy5vcHRpb25zLmhvc3RQcml2YXRlS2V5LFxuXHRcdFx0XHRob3N0UHVibGljS2V5OiB0aGlzLm9wdGlvbnMuaG9zdFB1YmxpY0tleSxcblx0XHRcdFx0aG9zdFVSTDogdGhpcy5vcHRpb25zLmhvc3RVUkwgKyBcIi9odWJcIixcblxuXHRcdFx0XHQvLyB3aWxsIGJlIGZpbGxlZCBhZnRlciBhdXRob3JpemF0aW9uXG5cdFx0XHRcdHRhcmdldElEOiBudWxsLFxuXHRcdFx0XHR0YXJnZXRQdWJsaWNLZXk6IG51bGwsXG5cdFx0XHRcdHRhcmdldFVSTDogbnVsbCxcblxuXHRcdFx0XHRvbkF1dGhvcml6ZWQ6ICgpID0+IHRoaXMub25Db25uZWN0aW9uQXV0aG9yaXplZChjb25uKSxcblx0XHRcdFx0b25DbG9zZTogKCkgPT4gdGhpcy5vbkNvbm5lY3Rpb25DbG9zZWQoY29ubiksXG5cdFx0XHRcdGhhbmRsZXJzOiB0aGlzLmhhbmRsZXJzXG5cdFx0XHR9KVxuXHRcdH0pXG5cblx0XHR3c3Mub24oXCJlcnJvclwiLCAoZXJyKSA9PiB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiSFVCU2VydmljZTogZXJyb3I6IFwiLCBlcnIpXG5cdFx0fSlcblxuXHR9XG5cblx0b25Db25uZWN0aW9uQXV0aG9yaXplZChjb25uOiBIVUJDb25uZWN0aW9uKSB7XG5cdFx0XG5cdFx0aWYgKCFjb25uLm9wdGlvbnMudGFyZ2V0SUQpIHtcblx0XHRcdGxvZ0Vycm9yKFwiSFVCU2VydmljZTogY29ubmVjdGlvbiB0YXJnZXRJRCBpcyBub3Qgc2V0XCIpXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bGV0IGNsdXN0ZXJOb2RlID0gdGhpcy5ub2Rlcy5nZXQoY29ubi5vcHRpb25zLnRhcmdldElEKVxuXG5cdFx0aWYgKCFjbHVzdGVyTm9kZSkge1xuXHRcdFx0bG9nSW5mbyhcIkhVQlNlcnZpY2U6IG5ldyBjbHVzdGVyIG5vZGUgY29ubmVjdGVkXCIpXG5cdFx0XHRjbHVzdGVyTm9kZSA9IHtcblx0XHRcdFx0Y2x1c3RlcklEOiBjb25uLm9wdGlvbnMudGFyZ2V0SUQsXG5cdFx0XHRcdHVybDogY29ubi5vcHRpb25zLnRhcmdldFVSTCEsXG5cdFx0XHRcdHB1YmxpY0tleTogY29ubi5vcHRpb25zLnRhcmdldFB1YmxpY0tleSEsXG5cdFx0XHRcdHByaXZhdGVLZXk6IGNvbm4ub3B0aW9ucy5ob3N0UHJpdmF0ZUtleSxcblx0XHRcdFx0d3M6IFtdLFxuXHRcdFx0XHR3YXRjaGxpc3Q6W11cblx0XHRcdH1cblx0XHRcdHRoaXMubm9kZXMuc2V0KGNvbm4ub3B0aW9ucy50YXJnZXRJRCwgY2x1c3Rlck5vZGUpO1xuXHRcdH1cblxuXHRcdGNsdXN0ZXJOb2RlLndzLnB1c2goY29ubik7XG5cdFx0bG9nSW5mbyhcIkhVQlNlcnZpY2U6IG5ldyBhdXRob3JpemVkIGNvbm5lY3Rpb24gYWRkZWQgdG8gY2x1c3RlciBub2RlXCIpXG5cblx0XHQvLyBGSU5EIElOIFdBVENITElTVFxuXHRcdGZvcihsZXQgW2lkLGNsdXN0ZXJdIG9mIHRoaXMubm9kZXMpe1xuXHRcdFx0Zm9yKGxldCBpIG9mIGNsdXN0ZXIud2F0Y2hsaXN0KXtcblx0XHRcdFx0aWYoaT09PWNsdXN0ZXJOb2RlLmNsdXN0ZXJJRCl7XG5cdFx0XHRcdFx0Ly8gc2VuZCB0byBjbHVzdGVyXG5cdFx0XHRcdFx0Y2x1c3Rlci53cy5mb3JFYWNoKHg9Pntcblx0XHRcdFx0XHRcdHguc2VuZCh7XG5cdFx0XHRcdFx0XHRcdG1ldGhvZDpcIlNfUEFSVFlfQVZBSUxBQkxFXCIsXG5cdFx0XHRcdFx0XHRcdGRhdGE6e1xuXHRcdFx0XHRcdFx0XHRcdHVybDpjbHVzdGVyTm9kZSEudXJsLFxuXHRcdFx0XHRcdFx0XHRcdHB1YmxpY0tleTpjbHVzdGVyTm9kZSEucHVibGljS2V5LFxuXHRcdFx0XHRcdFx0XHRcdGlkOmNsdXN0ZXJOb2RlIS5jbHVzdGVySURcdFx0XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdGNhbGxiYWNrSUQ6MFxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblxuXHRvbkNvbm5lY3Rpb25DbG9zZWQoY29ubjogSFVCQ29ubmVjdGlvbikge1xuXHRcdFxuXHRcdGlmICghY29ubi5vcHRpb25zLnRhcmdldElEKSB7XG5cdFx0XHRsb2dFcnJvcihcIkhVQlNlcnZpY2U6IGNvbm5lY3Rpb24gdGFyZ2V0SUQgaXMgbm90IHNldFwiKVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRcblx0XHRjb25zdCBjbHVzdGVyTm9kZSA9IHRoaXMubm9kZXMuZ2V0KGNvbm4ub3B0aW9ucy50YXJnZXRJRCk7XG5cblx0XHRpZiAoIWNsdXN0ZXJOb2RlKSB7XG5cdFx0XHRsb2dFcnJvcihcIkhVQlNlcnZpY2U6IGNsdXN0ZXIgbm9kZSBub3QgZm91bmRcIilcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjbHVzdGVyTm9kZS53cyA9IGNsdXN0ZXJOb2RlLndzLmZpbHRlcih4ID0+IHggIT09IGNvbm4pO1xuXG5cdFx0bG9nSW5mbyhcIkhVQlNlcnZpY2U6IGNvbm5lY3Rpb24gY2xvc2VkXCIpXG5cdFx0aWYgKCFjbHVzdGVyTm9kZS53cy5sZW5ndGgpIHtcblx0XHRcdGxvZ0luZm8oXCJIVUJTZXJ2aWNlOiBjbHVzdGVyIG5vZGUgZGlzY29ubmVjdGVkXCIpXG5cdFx0XHR0aGlzLm5vZGVzLmRlbGV0ZShjb25uLm9wdGlvbnMudGFyZ2V0SUQpO1xuXHRcdFx0XG5cdFx0fVxuXHR9XG59Il19
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"HUBService.js","sourceRoot":"","sources":["../../src/apiServer/HUBService.ts"],"names":[],"mappings":"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","sourcesContent":["import WebSocket, { WebSocketServer } from \"ws\";\nimport { REQ_HTTP_SERVER } from \"./APIService\";\nimport { BaseService } from \"./BaseService\";\nimport { HUBConnection } from \"./cluster/HUBConnection\";\nimport { logError, logInfo } from \"./LogService\";\nimport Signal, { Req } from \"badmfck-signal\";\nimport { IError } from \"./structures/Interfaces\";\nimport DefaultErrors from \"./structures/DefaultErrors\";\nimport { IPartyHost } from \"./ClusterService\";\n\n\nexport interface HUBServiceOptions {\n\thostID: string,\n\thostPublicKey: string,\n\thostPrivateKey: string,\n\thostURL: string,\n}\n\nexport interface IClusterNode {\n\tclusterID: string,\n\turl: string,\n\tpublicKey: string,\n\tprivateKey: string,\n\tws: HUBConnection[],\n\twatchlist:string[] // parties id that this cluster can connect to\n}\n\nexport interface IWebsocketPacket<T = any> {\n\tdata: T,\n\tauthorized: boolean\n\tconnection: HUBConnection\n}\n\nexport const REQ_CLUSTER_NODE = new Req<string, { url: string, publicKey: string } | IError>(undefined, \"REQ_CLUSTER_NODE\");\n\nexport class HUBService extends BaseService {\n\n\toptions: HUBServiceOptions;\n\tnodes: Map<string, IClusterNode> = new Map();\n\thandlers: (Signal<IWebsocketPacket> | Req<IWebsocketPacket, any>)[] = [];\n\n\tconstructor(options: HUBServiceOptions) {\n\t\tsuper(\"HUBService\")\n\t\tthis.options = options;\n\t\tthis.handlers = [\n\t\t\tnew Req<IWebsocketPacket, IPartyHost[]|IError>(async (req) => {\n\t\t\t\t// check incoming params\n\t\t\t\tif(!req.data || !Array.isArray(req.data))\n\t\t\t\t\treturn {...DefaultErrors.BAD_REQUEST,details:\"data array is not set\"}\n\n\t\t\t\t// get incoming cluster\n\t\t\t\tconst incomingCluster = this.nodes.get(req.connection.options.targetID ?? \"\");\n\t\t\t\tif(!incomingCluster)\n\t\t\t\t\treturn {...DefaultErrors.BAD_REQUEST,details:\"cluster for incoming connection not found\"}\n\n\t\t\t\t// check\n\t\t\t\tconst result = []; \n\t\t\t\tfor(let i of req.data){\n\t\t\t\t\tconst clusterNode = this.nodes.get(i);\n\t\t\t\t\tif(clusterNode){\n\t\t\t\t\t\tresult.push({\n\t\t\t\t\t\t\turl:clusterNode.url,\n\t\t\t\t\t\t\tpublicKey:clusterNode.publicKey,\n\t\t\t\t\t\t\tid:clusterNode.clusterID\t\t\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\n\t\t\t\t\tif(incomingCluster.watchlist.filter(x=>x===i).length===0)\n\t\t\t\t\t\tincomingCluster.watchlist.push(i+\"\");\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\n\t\t\t}, \"REQ_PARTY\")\n\t\t];\n\t}\n\n\tasync init() {\n\t\tsuper.init();\n\t}\n\n\tasync applicationReady() {\n\t\tconst server = await REQ_HTTP_SERVER.request();\n\n\t\tconst wss = new WebSocketServer({\n\t\t\tserver: server.http,\n\t\t\tpath: \"/hub\"\n\t\t})\n\n\t\twss.on(\"connection\", (ws) => {\n\t\t\tconst conn: HUBConnection = new HUBConnection({\n\t\t\t\tws: ws,\n\t\t\t\tdirection: \"incoming\",\n\n\t\t\t\thostID: this.options.hostID,\n\t\t\t\thostPrivateKey: this.options.hostPrivateKey,\n\t\t\t\thostPublicKey: this.options.hostPublicKey,\n\t\t\t\thostURL: this.options.hostURL + \"/hub\",\n\n\t\t\t\t// will be filled after authorization\n\t\t\t\ttargetID: null,\n\t\t\t\ttargetPublicKey: null,\n\t\t\t\ttargetURL: null,\n\n\t\t\t\tonAuthorized: () => this.onConnectionAuthorized(conn),\n\t\t\t\tonClose: () => this.onConnectionClosed(conn),\n\t\t\t\thandlers: this.handlers\n\t\t\t})\n\t\t})\n\n\t\twss.on(\"error\", (err) => {\n\t\t\tconsole.error(\"HUBService: error: \", err)\n\t\t})\n\n\t}\n\n\tonConnectionAuthorized(conn: HUBConnection) {\n\t\t\n\t\tif (!conn.options.targetID) {\n\t\t\tlogError(\"HUBService: connection targetID is not set\")\n\t\t\treturn;\n\t\t}\n\n\t\tlet clusterNode = this.nodes.get(conn.options.targetID)\n\n\t\tif (!clusterNode) {\n\t\t\tlogInfo(\"HUBService: new cluster node connected\")\n\t\t\tclusterNode = {\n\t\t\t\tclusterID: conn.options.targetID,\n\t\t\t\turl: conn.options.targetURL!,\n\t\t\t\tpublicKey: conn.options.targetPublicKey!,\n\t\t\t\tprivateKey: conn.options.hostPrivateKey,\n\t\t\t\tws: [],\n\t\t\t\twatchlist:[]\n\t\t\t}\n\t\t\tthis.nodes.set(conn.options.targetID, clusterNode);\n\t\t}\n\n\t\tclusterNode.ws.push(conn);\n\t\tlogInfo(\"HUBService: new authorized connection added to cluster node\")\n\n\t\t// FIND IN WATCHLIST\n\t\tfor(let [id,cluster] of this.nodes){\n\t\t\tconsole.log(\"find id in watchlist throught clusters\")\n\t\t\tfor(let i of cluster.watchlist){\n\t\t\t\tif(i===clusterNode.clusterID){\n\t\t\t\t\t// send to cluster\n\t\t\t\t\tcluster.ws.forEach(x=>{\n\t\t\t\t\t\tx.send({\n\t\t\t\t\t\t\tmethod:\"S_PARTY_AVAILABLE\",\n\t\t\t\t\t\t\tdata:{\n\t\t\t\t\t\t\t\turl:clusterNode!.url,\n\t\t\t\t\t\t\t\tpublicKey:clusterNode!.publicKey,\n\t\t\t\t\t\t\t\tid:clusterNode!.clusterID\t\t\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tcallbackID:1\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\n\tonConnectionClosed(conn: HUBConnection) {\n\t\t\n\t\tif (!conn.options.targetID) {\n\t\t\tlogError(\"HUBService: connection targetID is not set\")\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tconst clusterNode = this.nodes.get(conn.options.targetID);\n\n\t\tif (!clusterNode) {\n\t\t\tlogError(\"HUBService: cluster node not found\")\n\t\t\treturn;\n\t\t}\n\n\t\tclusterNode.ws = clusterNode.ws.filter(x => x !== conn);\n\n\t\tlogInfo(\"HUBService: connection closed\")\n\t\tif (!clusterNode.ws.length) {\n\t\t\tlogInfo(\"HUBService: cluster node disconnected\")\n\t\t\tthis.nodes.delete(conn.options.targetID);\n\t\t}\n\t}\n}"]}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"LocalRequest.js","sourceRoot":"","sources":["../../src/apiServer/LocalRequest.ts"],"names":[],"mappings":";;;;;;AAAA,kDAAwE;AAsCjE,MAAM,YAAY,GAAG,KAAK,EAAE,EAAU,EAAE,IAAU,EAAE,MAAe,EAAC,OAA8B,EAAE,EAAE;IAC5G,IAAI,CAAC,GAAG,KAAK,CAAA;IACb,IAAI,MAAM;QACT,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAC1B,IAAI,IAAI,IAAI,CAAC,MAAM;QAClB,CAAC,GAAG,MAAM,CAAA;IAEX,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QACrB,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACrB,IAAI,GAAG,GAAG,wBAAwB,GAAG,EAAE,CAAC;IAExC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QACtC,GAAG,GAAG,EAAE,CAAC;IAEV,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,CAAA;IAC9B,IAAI;QACH,IAAI,CAAC,KAAK,KAAK;YACd,IAAI,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,GAAG,EAAC,EAAC,OAAO,EAAC,OAAO,EAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,MAAM;YACf,IAAI,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAC,EAAC,OAAO,EAAC,OAAO,EAAC,CAAC,CAAA;KACrD;IAAC,OAAO,CAAC,EAAE;QACX,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAC,CAAC,CAAC,CAAA;KACrC;IACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AAClB,CAAC,CAAA;AAzBY,QAAA,YAAY,gBAyBxB","sourcesContent":["import axios, { AxiosResponse, InternalAxiosRequestConfig } from \"axios\"\n\n/*axios.interceptors.request.use((x:InternalAxiosRequestConfig<any>)=>{\n\tconsole.log(`AXIOS REQ:\\n\\turl:${x.url}\\n\\tmethod: ${x.method}\\n\\tdata: ${(()=>{\n\t\tif(typeof x.data === \"string\" )\n\t\t\treturn x.data\n\n\t\treturn JSON.stringify(x.data,null,\"\\t\\t\");\n\t})()}\\n\\theaders:\\n${(()=>{\n\t\tlet h = \"\";\n\t\tfor(let i in x.headers){\n\t\t\tif(h!==\"\")\n\t\t\t\th+=\"\\n\"\n\t\t\th+=\"\\t\\t\"+i+\" = \"+x.headers[i]\n\t\t}\n\t\treturn h\n\t})()}`)\n\treturn x;\n})\n\naxios.interceptors.response.use((x:AxiosResponse)=>{\n\tconsole.log(`AXIOS RESP:\\n\\tdata: ${(()=>{\n\t\tif(typeof x.data === \"string\" )\n\t\t\treturn x.data\n\n\t\treturn JSON.stringify(x.data,null,\"\\t\\t\");\n\t})()}\\n\\theaders:\\n${(()=>{\n\t\tlet h = \"\";\n\t\tfor(let i in x.headers){\n\t\t\tif(h!==\"\")\n\t\t\t\th+=\"\\n\"\n\t\t\th+=\"\\t\\t\"+i+\" = \"+x.headers[i]\n\t\t}\n\t\treturn h\n\t})()}`)\n\treturn x;\n})*/\n\nexport const LocalRequest = async (ep: string, data?: any, method?: string,headers?:{[key:string]:string}) => {\n\tlet m = \"get\"\n\tif (method)\n\t\tm = method.toLowerCase();\n\tif (data && !method)\n\t\tm = \"post\"\n\n\tif (ep.startsWith(\"/\"))\n\t\tep = ep.substring(1)\n\tlet url = \"http://localhost:8091/\" + ep;\n\t\n\tif (ep.toLowerCase().startsWith(\"http\"))\n\t\turl = ep;\n\n\tlet resp = null;\n\tconsole.log(\"open url: \", url)\n\ttry {\n\t\tif (m === \"get\")\n\t\t\tresp = await axios.get(url,{headers:headers});\n\t\tif (m === \"post\")\n\t\t\tresp = await axios.post(url, data,{headers:headers})\n\t} catch (e) {\n\t\tconsole.log(\"ERROR! cant open url\",e)\n\t}\n\tconsole.log(resp)\n}\n"]}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"LogService.js","sourceRoot":"","sources":["../../src/apiServer/LogService.ts"],"names":[],"mappings":"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","sourcesContent":["import Signal, { Req } from \"badmfck-signal\";\nimport { BaseService } from \"./BaseService\";\n\nexport enum LOG_LEVEL{\n ALL=0,\n INFO=1,\n WARN=2,\n ERROR=3,\n CRIT=4\n}\nexport interface ILogItem{\n id:number,\n level:LOG_LEVEL,\n time:number,\n text:string\n date:string\n source:string\n}\n\nexport interface ILogServiceOptions{\n output?:(data:ILogItem)=>void,\n stackSize:number\n level:LOG_LEVEL\n textLimit:number\n watchFor?:string[]\n}\n\nexport const getDefaultLogOptions=():ILogServiceOptions=>{\n return {\n stackSize:100,\n textLimit:1024,\n level:LOG_LEVEL.ALL\n }\n}\n\nexport const logInfo=(message:any,...optional:any[])=>{S_LOG.invoke({level:LOG_LEVEL.INFO,data:[message,optional]})}\nexport const logWarn=(message:any,...optional:any[])=>{S_LOG.invoke({level:LOG_LEVEL.WARN,data:[message,optional]})}\nexport const logCrit=(message:any,...optional:any[])=>{S_LOG.invoke({level:LOG_LEVEL.CRIT,data:[message,optional]})}\nexport const logError=(message:any,...optional:any[])=>{S_LOG.invoke({level:LOG_LEVEL.ERROR,data:[message,optional]})}\n\n\nexport const S_LOG=new Signal<{level:LOG_LEVEL,data:any[]}>()\nexport const S_LOG_CREATED=new Signal<ILogItem>()\nexport const S_LOG_CHANGE_LEVEL=new Signal<LOG_LEVEL>();\nexport const S_LOG_FLUSH=new Signal<void>();\nexport const S_LOG_ADD_SERVICE_TO_WATCH=new Signal<string>();\nexport const S_LOG_REMOVE_SERVICE_FROM_WATCH=new Signal<string>();\nexport const S_LOG_SET_TEXT_LIMIT=new Signal<number>();\nexport const REQ_LOG=new Req<{lastID:number}|null|undefined,ILogItem[]>();\nexport const REQ_LOG_UNIQUE_SERVICES=new Req<void,{name:string,count:number}[]>();\n\nexport class LogService extends BaseService{\n\n static nextID=0;\n log:ILogItem[]=[];\n options:ILogServiceOptions\n level:LOG_LEVEL=LOG_LEVEL.ALL\n \n uniqueServices:Map<string,number>=new Map() // service name (name.js) & count of log requests\n\n constructor(opt?:ILogServiceOptions){\n super(\"LogService\");\n if(!opt)\n opt=getDefaultLogOptions();\n this.options=opt;\n this.level = opt.level\n this.checkTextLimit();\n }\n\n async init(){\n \n REQ_LOG_UNIQUE_SERVICES.listener = async ()=>{\n const arr=[];\n for(let i of this.uniqueServices)\n arr.push({name:i[0],count:i[1]})\n return arr;\n }\n\n REQ_LOG.listener = async (req) => {\n if(req && req.lastID){ \n let result=this.log.filter(val=>val.id>req.lastID)\n return result\n }else\n return [...this.log]\n }\n\n S_LOG_SET_TEXT_LIMIT.subscribe(l=>{\n this.options.textLimit=l;\n this.checkTextLimit();\n })\n \n S_LOG_ADD_SERVICE_TO_WATCH.subscribe(service=>{\n if(!this.options.watchFor)\n this.options.watchFor=[];\n\n if(this.options.watchFor.find(val=>val===service)){\n logCrit(\"${LogService.js}\",\"Service \\\"\"+service+\"\\\" aleready added\");\n return;\n }\n this.options.watchFor.push(service);\n })\n\n S_LOG_REMOVE_SERVICE_FROM_WATCH.subscribe(service=>{\n if(!this.options.watchFor)\n return;\n\n try{\n const i = this.options.watchFor.findIndex(val=>val===service)\n if(i>-1)\n this.options.watchFor.splice(i,1);\n }catch(e){\n logCrit(\"${LogService.js}\",\"Service \\\"\"+service+\"\\\" not deleted\");\n }\n })\n\n S_LOG_CHANGE_LEVEL.subscribe(l=>{this.level=l})\n\n S_LOG_FLUSH.subscribe(()=>this.log=[])\n\n S_LOG.subscribe((log)=>{\n\n if(log.level<this.level)\n return;\n\n const msg=log.data[0];\n const optional=log.data[1];\n let text = this.createText(msg,log.level);\n let source=\"\";\n if(text.startsWith(\"${\") && text.endsWith(\"}\") && text.indexOf(\".js\")!==-1){\n source=text.substring(2,text.length-1);\n text = \"\"\n }\n\n const usc=this.uniqueServices.get(source) ?? 0;\n this.uniqueServices.set(source,usc+1)\n\n let showlog=true;\n if(this.options && this.options.watchFor && Array.isArray(this.options.watchFor) && this.options.watchFor.length>0){\n showlog=false;\n for(let i of this.options.watchFor){\n if(source.toLowerCase().indexOf(i.toLowerCase())!==-1){\n showlog=true;\n break;\n }\n }\n }\n\n if(!showlog && this.level===LOG_LEVEL.CRIT)\n showlog=true;\n\n if(optional){\n for(let i of optional)\n text+=\", \"+this.createText(i,this.level);\n }\n\n const d = new Date();\n const logitem:ILogItem={\n level:log.level,\n id:LogService.nextID++,\n text:text,\n time:d.getTime(),\n date:this.createDate(d),\n source:source\n }\n\n // output as string\n if(this.options.output){ \n this.options.output(logitem);\n }\n\n // fire log item\n S_LOG_CREATED.invoke(logitem)\n\n // add log item to stack\n this.log.push(logitem);\n let limit = this.options.stackSize ?? 100\n if(limit>1000)\n limit = 1000\n if(this.log.length>limit)\n this.log.shift();\n\n })\n\n super.init();\n }\n\n checkTextLimit(){\n if(this.options.textLimit>1024*4)\n this.options.textLimit=1024*4\n }\n\n createDate(d?:Date):string{\n if(!d)\n d=new Date();\n return d.getFullYear()+\"-\"+this.leadZero(d.getMonth()+1)+\"-\"+this.leadZero(d.getDate())+\" \"+this.leadZero(d.getHours())+\":\"+this.leadZero(d.getMinutes())+\":\"+this.leadZero(d.getSeconds());\n }\n\n leadZero(num:number):string{\n if(num<10)\n return \"0\"+num;\n return num+\"\"\n }\n\n createText(data:any,level:LOG_LEVEL){\n \n if(data === null)\n return \"null\"\n\n if(data === undefined)\n return \"undefined\"\n\n let res=\"\"\n \n if(typeof data ===\"object\"){\n \n try{\n const tmp =JSON.stringify(data,null,\"\\t\")\n res = tmp ?? \"\";\n }catch(e){\n if(\"toString\" in data && data.toString && typeof data.toString === \"function\")\n res = data.toString()\n }\n \n\n if(`${data}`===\"[object Map]\" && \"size\" in data){\n // try to parse map!\n try{\n const arr=[];\n for(let i of data)\n arr.push({key:i[0],value:i[1]})\n res = \"MAP (size:\"+data.size+\") \\n\"+JSON.stringify(arr,null,\"\\t\");\n }catch(e){}\n }\n \n if(Array.isArray(data))\n res+\", total items: \"+data.length \n\n }else{\n res=data+\"\"\n }\n\n if(res.length>this.options.textLimit && level===LOG_LEVEL.INFO)\n res=res.substring(0,this.options.textLimit)+\"... (total: \"+res.length+\")\"\n return res\n }\n}"]}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"MysqlService.js","sourceRoot":"","sources":["../../src/apiServer/MysqlService.ts"],"names":[],"mappings":"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","sourcesContent":["//import mysql, { FieldInfo, MysqlError, Pool, PoolConnection } from \"mysql\"\n\nimport { BaseService } from \"./BaseService\";\nimport Signal, { Req } from \"badmfck-signal\";\nimport { createCipheriv, createDecipheriv, createHash } from \"crypto\"\nimport { logCrit, logError, logInfo, logWarn } from \"./LogService\";\nimport * as mysql from \"mysql2/promise\"\nimport fs from \"fs\"\nimport path from \"path\"\nimport { IError } from \"./structures/Interfaces\";\n\nexport const S_MYSQL_STARTED=new Signal<void>()\nexport const REQ_MYSQL_QUERY = new Req<MySqlQuery|MySqlQuery[],MysqlResult[]>(undefined,\"REQ_MYSQL_QUERY\");\n//export const REQ_MYSQL_TRANSACTION = new Req<MySqlQuery[],MysqlResult>(undefined,\"REQ_MYSQL_TRANSACTION\");\n\nexport const REQ_MYSQL_TBEGIN = new Req<void,MysqlError|number>(undefined,\"REQ_MYSQL_TRANSACTION_BEGING\"); // return transaction id or mysql error\nexport const REQ_MYSQL_TQUERY=new Req<{query:MySqlQuery,tid:number},MysqlResult>(undefined,\"REQ_MYSQL_TRANSACTION_ADD_OPERATION\"); // tid means transaction id\nexport const REQ_MYSQL_TCOMMIT=new Req<number,MysqlError|null>(undefined,\"REQ_MYSQL_TCOMMIT\"); // tid\nexport const REQ_MYSQL_TROLLBACK=new Req<number,MysqlError|null>(undefined,\"REQ_MYSQL_TROLLBACK\"); // tid\n\nexport const executeQuery = async (query:MySqlQuery|MySqlQuery[]):Promise<MysqlResult[]>=>{return await REQ_MYSQL_QUERY.request(query)}\n\nexport interface MysqlServiceOptions{\n connectionLimit:number,\n host:string,\n user:string,\n password:string,\n port:number,\n database:string, \n queueLimit?:number,\n transactionFailReport?:(trx:ITransaction,message:string)=>void,\n transactionFailReportDir?:string,\n debug?:boolean,\n naxTransactionWaitTime?:number,\n\tmigrations?:{\n\t\tdir:string,\n\t\tcallback:()=>void\n\t}|null\n}\n\nexport interface MysqlError{\n code: string,\n errno: number,\n sql: string,\n name:string,\n message:string\n fatal?:boolean\n}\n\nexport interface MysqlResult{\n error?:MysqlError|null,\n rollbackError?:MysqlError|null,\n isDuplicateError?:boolean\n data:any\n}\n\nexport interface MySqlQuery{\n query:string\n fields:MysqlQueryField[]|MysqlQueryFieldObject,\n rollbackQuery?:string|null\n transactionID?:number\n}\n\nexport interface MysqlQueryField{\n name:string,\n value:string|number|boolean|null|undefined,\n system?:boolean,\n ignoreInInsert?:boolean,\n ignoreInUpdate?:boolean\n useInReplace?:boolean,\n _parsedValue?:string|number|boolean|null\n}\n\nexport interface ITransaction{\n id:number\n timestamp:number,\n conn:mysql.PoolConnection,\n queries:{sql:string,status:string}[]\n}\n\nexport interface MysqlQueryFieldObject extends Record<string,string|number|boolean|null|undefined|{name?:string|null,value:string|number|boolean|null|undefined,system?:boolean,ignoreInInsert?:boolean,ignoreInUpdate?:boolean,useInReplace?:boolean}>{\n\n}\n \n\n/**\n * Mysql Services, execute queries\n * MySqlQuery.query:\n * @fields - replaced by field's names\n * @values - replaced by parsed values\n * @onupdate - repalced by pair field name = value\n * @onduplicate - replaced by pair field name = value\n */\n\nexport class MysqlService extends BaseService{\n\n reconnectionTimeout=1000*3;\n reconnecting=false;\n pool:mysql.Pool|null=null;\n options:MysqlServiceOptions;\n serviceStarted=false;\n timeoutID:any\n\n debug=false;\n\n queries=[]; // TODO: STORE QUERIES SENTS BEFORE THE SERVICE IS STARTED!\n static nextTransactionID=1;\n transactions:ITransaction[]=[]\n\n maxTransactionWaitTime = 1000*60*1; // 1 min and detelete transaction\n\n failReportFileStream:fs.WriteStream|null=null;\n failReportFileStreamName:string|null=null;\n failReportLastAccessTime:number=0;\n\n constructor(options:MysqlServiceOptions){\n super(\"mysql\");\n this.options = options;\n \n\n // decrypt when needed\n if(this.options.host.startsWith(\"_\"))\n this.options.host = decrypt(this.options.host.substring(1)) ?? this.options.host\n if(this.options.user.startsWith(\"_\"))\n this.options.user = decrypt(this.options.user.substring(1)) ?? this.options.user\n if(this.options.database.startsWith(\"_\"))\n this.options.database = decrypt(this.options.database.substring(1)) ?? this.options.database\n if(this.options.password.startsWith(\"_\"))\n this.options.password = decrypt(this.options.password.substring(1)) ?? this.options.password\n\n if(this.options.debug)\n this.debug = true\n if(this.options.naxTransactionWaitTime)\n this.maxTransactionWaitTime = this.options.naxTransactionWaitTime;\n\n setInterval(()=>{\n // check transactions\n const now = Date.now();\n const count = this.transactions.length;\n const removedIDs:number[]=[];\n for(let i of this.transactions){\n if(now-i.timestamp>this.maxTransactionWaitTime){\n logError(\"Release transaction connection due to timeout\")\n this.rollbackTransaction(i,true);\n removedIDs.push(i.id)\n }\n }\n\n this.transactions = this.transactions.filter(i=>!removedIDs.includes(i.id))\n \n if(this.debug)\n console.log(\"Removed: \",count-this.transactions.length)\n\n \n\n },1000*30)\n\n setInterval(()=>{\n if(!this.failReportFileStream)\n return;\n \n // after 15 min of inactivity, close file\n if(Date.now()-this.failReportLastAccessTime>1000*60*15){\n this.failReportFileStream.end();\n this.failReportFileStream=null;\n }\n\n },1000*60*5)\n\n if(options.transactionFailReportDir){\n try{\n if (!fs.existsSync(options.transactionFailReportDir)){\n fs.mkdirSync(options.transactionFailReportDir);\n }\n }catch(e){\n options.transactionFailReportDir=undefined;\n logCrit(\"${MysqlService.js}\",\"Can't create transaction fail report dir\")\n }\n }\n }\n\n static async executeQuery (query:MySqlQuery|MySqlQuery[]):Promise<MysqlResult[]>{ return await REQ_MYSQL_QUERY.request(query) }\n\n async init(){\n super.init();\n\n // setup process exit handlers interrupt (ctrl+c)\n process.on('SIGINT', async () => {\n await this.finishApp();\n process.exit(0);\n });\n \n // terminate (kill)\n process.on('SIGTERM',async () => {\n await this.finishApp();\n process.exit(0);\n });\n\n this.serviceStarted=false;\n let poolCreated:boolean = false;\n\n while(!poolCreated){\n logInfo(\"${MysqlService.js}\",\"Connecting to MYSQL!\")\n poolCreated = await this.recreatePool();\n if(!poolCreated){\n logCrit(\"${MysqlService.js}\",\"Can't connect to MYSQL! Retrying in 3 seconds...\")\n await new Promise((resolve)=>setTimeout(resolve,3000))\n }\n }\n\n REQ_MYSQL_QUERY.listener=async data =>{\n if(!Array.isArray(data))\n data=[data];\n const promises=[]\n for(let i of data){\n const query = MysqlService.prepareQuery(i.query,i.fields);\n promises.push(this.execute(query,i.rollbackQuery ?? null,i.transactionID ?? 0));\n }\n \n if(this.debug)\n console.log(\"Execute queries: \",data.length)\n \n return await Promise.all(promises);\n }\n\n REQ_MYSQL_TBEGIN.listener=async ()=>{ \n const conn = await this.pool?.getConnection();\n if(!conn)\n return {code:\"NO_POOL\",errno:100000,fatal:true,sql:\"\",name:\"NO_POOL\",message:\"Mysql pool not created\"}\n\n // find conn in transactions\n for(let i of this.transactions){\n if(i.conn===conn){\n logInfo(\"Your connection is in transaction\")\n return {code:\"CONN_IN_TRX\",errno:100005,fatal:true,sql:\"\",name:\"CONN_IN_TRX\",message:\"Connection is in transaction\"}\n }\n }\n\n const tid = MysqlService.nextTransactionID++;\n if(this.debug)\n console.log(\"Begin transaction with id \",tid)\n\n try{\n \n // await conn.beginTransaction();\n await conn.query(\"START TRANSACTION\");\n //const res = await conn.query(\"SET autocommit=0\");\n if(this.debug)\n console.log(\"Transaction started\")\n\n }catch(e){\n this.rollbackTransaction({id:tid,conn:conn,timestamp:Date.now(),queries:[{sql:\"START TRANSACTION\",status:\"error\"}]})\n return this.createMysqlQueryError(e);\n }\n\n this.transactions.push({\n id:tid,\n timestamp:Date.now(),\n conn:conn,\n queries:[]\n })\n\n if(this.debug)\n console.log(\"Transactions pool: \",this.transactions)\n\n return tid;\n }\n \n REQ_MYSQL_TQUERY.listener=async data=>{\n const trx = this.transactions.find(i=>i.id===data.tid);\n if(!trx)\n return {err: {\n code:\"NO_TRX\",\n errno:100004,\n fatal:true,\n sql:\"\",\n name:\"NO_TRX\",\n message:\"Transaction not found\"\n },data:null,rollbackError:null}\n\n const query = MysqlService.prepareQuery(data.query.query,data.query.fields);\n let err=null;\n let sqlData = null;\n\n if(this.debug)\n console.log(\"Execute query on transaction: \",trx)\n\n try{\n sqlData = await trx.conn.query(query);\n }catch(e){ err = this.createMysqlQueryError(e);}\n\n if(err)\n this.rollbackTransaction(trx);\n\n if(this.debug)\n console.log(\"Query execution status:\",err?err.message:\"completed\")\n\n trx.queries.push({sql:query,status:err?err.message:\"completed\"})\n\n return {\n data:sqlData?sqlData[0]:null,\n error:err,\n };\n }\n\n REQ_MYSQL_TROLLBACK.listener=async (tid:number)=>{\n const trx = this.transactions.find(i=>i.id===tid);\n if(!trx){\n return {\n code:\"NO_TRX\",\n errno:100004,\n fatal:true,\n sql:\"\",\n name:\"NO_TRX\",\n message:\"Transaction not found\"\n }\n }\n\n await this.rollbackTransaction(trx);\n return null;\n }\n\n REQ_MYSQL_TCOMMIT.listener=async (tid:number)=>{\n const trx = this.transactions.find(i=>i.id===tid);\n if(!trx){\n return {\n code:\"NO_TRX\",\n errno:100004,\n fatal:true,\n sql:\"\",\n name:\"NO_TRX\",\n message:\"Transaction not found\"\n }\n }\n\n\n if(this.debug)\n console.log(\"Commit transaction:\",trx)\n \n // remove from transactions\n this.transactions = this.transactions.filter(i=>i.id!==tid);\n\n if(this.debug)\n console.log(\"Transaction pool:\",this.transactions )\n \n const err = await this.commit(trx);\n\n return err;\n }\n }\n\n async commit(trx:ITransaction):Promise<MysqlError|null>{\n \n try{\n await trx.conn.commit();\n //await trx.conn.query(\"COMMIT\");\n trx.conn.removeAllListeners();\n trx.conn.release();\n }catch(e){\n await this.rollbackTransaction(trx);\n return this.createMysqlQueryError(e);\n }\n return null;\n\n }\n\n async rollbackTransaction(trx:ITransaction,donNotRemove?:boolean):Promise<MysqlError|null>{\n let err=null;\n try{\n console.log(\"Rollback started\",trx.conn)\n await trx.conn.rollback();\n await trx.conn.commit();\n //await trx.conn.query(\"ROLLBACK\");\n trx.conn.removeAllListeners();\n trx.conn.release();\n if(!donNotRemove)\n this.transactions = this.transactions.filter(i=>i.id!==trx.id);\n if(this.debug)\n console.log(\"Rollback complete\",trx.conn)\n }catch(e){\n logCrit(\"${MysqlService.js}\",\"Can't rollback transaction\",trx)\n err = this.createMysqlQueryError(e);\n }\n this.storeTransactionAsProblem(trx,\"rollback\")\n return err;\n }\n\n async finishApp(){\n console.log(\"Finishing mysql service\")\n for(let i of this.transactions)\n this.rollbackTransaction(i);\n\n if(this.pool){\n try{await this.pool.end();}catch(e){\n logCrit(\"${MysqlService.js}\",\"Can't close MYSQL pool!\")\n }\n }\n\n if(this.failReportFileStream)\n this.failReportFileStream.end();\n this.failReportFileStream=null;\n }\n\n async storeTransactionAsProblem(trx:ITransaction,message:string){\n\n if(!this.options.transactionFailReport && !this.options.transactionFailReportDir){\n logCrit(\"${MysqlService.js}\",\"Can't report failed transaction, no report function: transactionFailReport in options, and transactionFailReportDir isnt set\")\n return;\n }\n\n\n if(this.options.transactionFailReportDir){\n const yyymmdd = new Date().toISOString().substring(0,10).replaceAll(\"-\",\"\");\n\n //store transaction\n const date = new Date();\n const file = path.resolve(this.options.transactionFailReportDir,yyymmdd+\".json\");\n if(this.failReportFileStream){\n if(this.failReportFileStreamName!==file){\n this.failReportFileStream.end();\n this.failReportFileStream=null;\n }\n }\n\n\n if(this.failReportFileStreamName){\n this.failReportFileStream = fs.createWriteStream(file,{flags:'a'});\n this.failReportFileStreamName=file;\n }\n \n if(this.debug)\n console.log(\"Store transaction fail report: \",file,trx,message)\n\n if(!this.failReportFileStream)\n this.failReportFileStream = fs.createWriteStream(file,{flags:'a'});\n\n this.failReportFileStream.write(JSON.stringify({queries:trx.queries,time:trx.timestamp,date,message})+\"\\n}EOB{\\n\",err=>{\n if(err)\n logCrit(\"${MysqlService.js}\",\"Can't write to transaction fail report file\")\n else\n logInfo(\"${MysqlService.js}\",\"Transaction fail report stored\")\n });\n\n this.failReportLastAccessTime = Date.now();\n\n }\n\n \n if(this.options.transactionFailReport)\n this.options.transactionFailReport(trx,message);\n }\n\n\n async recreatePool():Promise<boolean>{\n\n logInfo(\"${MysqlService.js}\",\"Connecting to mysql: \\n HOST: \"+this.options.host+'\\n PORT:'+this.options.port)\n\n if(this.pool){\n this.pool.removeAllListeners();\n try{await this.pool.end();}catch(e){\n logCrit(\"${MysqlService.js}\",\"Can't close MYSQL pool!\")\n }\n this.pool = null;\n }\n\n try{\n this.pool =mysql.createPool({\n host: this.options.host\n ,user: this.options.user\n ,password: this.options.password\n ,database: this.options.database\n ,port: this.options.port\n ,connectionLimit: this.options.connectionLimit\n ,queueLimit: 10\n ,multipleStatements: true\n });\n }catch(e){\n logCrit(\"${MysqlService.js}\",\"Can't connect to MYSQL!\")\n return false;\n }\n\n this.pool?.on('connection', (connection) => {\n logInfo(\"${MysqlService.js}\",\"MYSQL CONNECTION CREATED\")\n });\n this.pool?.on('acquire', (connection) => {\n logInfo(\"${MysqlService.js}\",\"MYSQL CONNECTION ACQUIRED\")\n })\n this.pool?.on('release', (connection) => {\n logInfo(\"${MysqlService.js}\",\"MYSQL CONNECTION RELEASED\")\n })\n this.pool?.on('enqueue', () => {\n logInfo(\"${MysqlService.js}\",\"MYSQL CONNECTION ENQUEUED\")\n })\n \n // Check connection\n if(this.debug)\n console.log(\"Check mysql connection\")\n return new Promise(async (resolve,reject)=>{\n try{\n const conn = await this.pool?.getConnection()\n if(conn){\n conn?.release();\n logInfo(\"${MysqlService.js}\",\"Connected to MYSQL!\")\n resolve(true)\n \n }else\n resolve(false)\n }catch(e){\n logCrit(\"${MysqlService.js}\",\"Can't connect to MYSQL!\")\n resolve(false)\n }\n });\n\n }\n\n async onApplicationReady() {}\n\n\n static fieldsToObject(fields:MysqlQueryField[]|MysqlQueryFieldObject,ignoreSystemParameters?:boolean):MysqlQueryFieldObject{\n if(!Array.isArray(fields))\n return fields;\n const obj:MysqlQueryFieldObject={};\n for(let i of fields){\n if(!i.name)\n continue;\n if(typeof i.value!== \"object\")\n obj[i.name]=i.value;\n else{\n if(!ignoreSystemParameters){\n obj[i.name]={\n value:i.value,\n system:i.system,\n ignoreInInsert:i.ignoreInInsert,\n ignoreInUpdate:i.ignoreInUpdate,\n useInReplace:i.useInReplace,\n name:i.name\n }\n }else\n obj[i.name]=i.value\n }\n\n }\n return obj;\n }\n\n static objectToFields(obj:MysqlQueryFieldObject|MysqlQueryField[]):MysqlQueryField[]{\n if(Array.isArray(obj))\n return obj;\n const fields:MysqlQueryField[]=[];\n for(let i in obj){\n if(obj[i] && typeof obj[i] === \"object\"){\n let mo = obj[i] as Record<string,string|number|boolean|null|undefined>;\n if(!mo){\n mo={\n name:i,\n value:null,\n system:false,\n ignoreInInsert:false,\n ignoreInUpdate:false,\n useInReplace:false\n }\n }\n fields.push({\n name:mo.name as string ?? i,\n value:mo.value,\n system:mo.system as boolean,\n ignoreInInsert:mo.system as boolean,\n ignoreInUpdate:mo.system as boolean,\n useInReplace:mo.system as boolean\n })\n }else{\n fields.push({\n name:i,\n value:obj[i] as string|number|boolean|null|undefined\n })\n }\n }\n return fields;\n }\n\n static prepareQuery(query:string,fields:MysqlQueryField[]|MysqlQueryFieldObject):string{\n \n if(!Array.isArray(fields))\n fields = MysqlService.objectToFields(fields);\n\n for(let i of fields){\n const val =this.prepareQueryFieldValue(i.value,i.system);\n i._parsedValue=val;\n query=query.replaceAll(\"@\"+i.name,val+\"\")\n }\n\n const tmp = query.toLowerCase();\n if(tmp.indexOf(\"select\")===0 && tmp.indexOf(\"limit\")===-1)\n query+=\" LIMIT 100\"\n \n query = query.replaceAll(\"@NOLIMIT\",\"\")\n\n\n if(query.indexOf(\"@fields\")!==-1){\n let insertFieldNames=[]\n let insertFieldValues=[]\n for(let i of fields){\n if(i.ignoreInInsert)\n continue;\n\n insertFieldNames.push('`'+i.name.replaceAll(\"`\",'').replaceAll('\\\"',\"\").replaceAll('\\'',\"\")+'`')\n insertFieldValues.push(i._parsedValue)\n }\n\n query=query\n .replaceAll('@fields',insertFieldNames.join(\",\"))\n .replaceAll('@values',insertFieldValues.join(\",\"))\n }\n\n if(query.indexOf(\"@insert\")!==-1){\n let oninsertNames=[]\n let oninsertValues=[]\n for(let i of fields){\n if(i.ignoreInInsert)\n continue;\n oninsertNames.push(i.name)\n oninsertValues.push(i._parsedValue)\n }\n query = query.replaceAll(\"@insert\",`(${oninsertNames.join(\",\")}) VALUES (${oninsertValues.join(\",\")})`)\n }\n\n if(query.indexOf(\"@onupdate\")!==-1){\n let onUpdate=[]\n for(let i of fields){\n if(i.ignoreInUpdate)\n continue;\n onUpdate.push('`'+i.name.replaceAll(\"`\",'').replaceAll('\\\"',\"\").replaceAll('\\'',\"\")+'` = '+i._parsedValue)\n }\n query = query.replaceAll(\"@onupdate\",onUpdate.join(\" , \"))\n \n }\n\n if(query.indexOf('@onduplicate')!==-1){\n let onDuplicate=[];\n for(let i of fields){\n if(!i.useInReplace)\n continue;\n onDuplicate.push('`'+i.name.replaceAll(\"`\",'').replaceAll('\\\"',\"\").replaceAll('\\'',\"\")+'` = '+i._parsedValue)\n }\n query = query.replaceAll(\"@onduplicate\",onDuplicate.join(\" , \"))\n }\n \n \n return query;\n }\n\n static prepareQueryFieldValue(value:string|number|boolean|null|undefined,system?:boolean):string|number|boolean|null|undefined{\n if(!system && typeof value === \"string\"){\n value = value?value.replaceAll('\"','\\\\\"'):null\n if(value!==null)\n value = '\"'+value+'\"'\n else\n value = \"NULL\"\n }\n if(value === null || value === undefined)\n return \"NULL\"\n return value;\n }\n\n\n async execute(query:string,rollbackQuery:string|null,transactionID:number):Promise<MysqlResult>{\n return new Promise(async (resolve:(data:MysqlResult)=>void,reject)=>{\n // Check pool\n if(!this.pool){\n logError(\"${MysqlService.js}\",\"No pool\")\n resolve({\n error:{\n code: \"NO_POOL\",\n errno: 100000,\n fatal: true,\n sql: query,\n name:\"NO_POOL\",\n message:\"Mysql pool not created\"\n },\n data:null,\n })\n return;\n }\n\n \n try{\n let conn:mysql.PoolConnection|null=null\n if(transactionID && transactionID>0){\n conn = this.transactions.find(i=>i.id===transactionID)?.conn ?? null;\n if(this.debug)\n console.log(\"Execute query on transaction: \",conn)\n }else{\n conn = await this.pool.getConnection();\n }\n\n if(this.debug)\n console.log(\"Execute query\",conn)\n\n // if connection not created\n if(!conn){\n logCrit(\"${MysqlService.js}\",`No connection created!`)\n resolve({\n error:{\n code: \"NO_CONN\",\n errno: 100001,\n fatal: true,\n sql: query,\n name:\"NO_CONN\",\n message:\"Mysql pool cant get connection\"\n },\n data:null,\n })\n return;\n }\n\n // Do send query\n for(let i of this.transactions){\n if(i.conn===conn){\n logInfo(\"Your connection is in transaction\")\n break;\n }\n }\n this.sendQuery(conn,query,resolve,rollbackQuery);\n\n }catch(e){\n logError(\"${MysqlService.js}\",e);\n \n // recreate pool, connection error\n if(`${e}`.indexOf('ECONNREFUSED')!==-1)\n this.recreatePool();\n \n resolve({\n error:{\n code: \"NO_CONN\",\n errno: 100001,\n fatal: true,\n sql: query,\n name:\"NO_CONN\",\n message:(e && typeof e === \"object\" && \"message\" in e as any)?(e as any).message:\"Mysql cant get connection\"\n },\n data:null\n })\n return;\n }\n });\n }\n\n async sendQuery(conn:mysql.PoolConnection,query:string,resolve:(data:MysqlResult)=>void,rollback:string|null){\n \n let errCatched=false;\n\n conn.on(\"error\",async err=>{\n errCatched=true;\n\n let rollbackError = null;\n if(rollback)\n rollbackError=(await this.queryAsync(conn,rollback)).err\n \n logError(\"${MysqlService.js}->conn.on('error')\",err)\n\n // close conn on success\n try{\n conn.release();\n conn.removeAllListeners();\n }catch(e){}\n \n resolve({\n error:{\n code: \"CONN_ERR\",\n errno: 100003,\n fatal: true,\n sql: query,\n name:\"CONN_ERR\",\n message:\"Error: \"+err\n },\n data:null,\n rollbackError:rollbackError\n })\n })\n\n\n\n logInfo(\"${MysqlService.js}\",query)\n\n // send query\n const queryResult = await this.queryAsync(conn,query);\n\n // handle error\n if(queryResult.err){\n \n // rollback\n let rollbackError=null;\n if(rollback)\n rollbackError=(await this.queryAsync(conn,rollback)).err\n\n // close connection\n try{\n conn.release();\n conn.removeAllListeners();\n }catch(e){}\n\n // determine duplicate error\n const dup = `${queryResult.err}`.toLowerCase().indexOf(\"er_dup_entry\")!==-1;\n\n logError(\"${MysqlService.js}->query error\",queryResult.err);\n\n resolve({\n error:queryResult.err,\n data:null,\n rollbackError:rollbackError,\n isDuplicateError:dup\n })\n }\n\n\n // close conn on success\n try{\n conn.release();\n conn.removeAllListeners();\n }catch(e){}\n\n // handle success\n resolve({\n error:queryResult.err,\n data:queryResult.results,\n })\n\n }\n\n\n // Async query wrapper to conn.query\n async queryAsync(conn:mysql.PoolConnection,query:string):Promise<{err:MysqlError|null,results?:any}>{\n\n let result=null;\n try{\n result = await conn.query(query);\n }catch(e){\n return {err:this.createMysqlQueryError(e)};\n }\n\n return {\n err:null,\n results:result[0],\n }\n }\n\n createMysqlQueryError(err:any):MysqlError{\n if(err && typeof err===\"object\" && \"code\" in err && \"errno\" in err && \"sql\" in err && \"name\" in err && \"message\" in err){\n return {\n code: err.code,\n errno: err.errno,\n sql: err.sql,\n name:err.name,\n message:err.message\n \n }\n }else{\n return {\n code: \"QUERY_ERR\",\n errno: 100002,\n fatal: true,\n sql: \"no query\",\n name:\"QUERY_ERR\",\n message:\"Error: \"+(err)?err:\"\"\n }\n }\n }\n}\n\n\nconst secret_key=\"AKLWkajw%^&dgwqhw#98453i23bfk23rn2knknglrgjeit\"\nconst secret_iv=\"rthadrfk23rn2kn#*FNKA@gt44df3tslrgj##!it\"\n\n// Generate secret hash with crypto to use for encryption\nconst key = createHash('sha512').update(secret_key).digest('hex').substring(0, 32)\nconst iv = createHash('sha512').update(secret_iv).digest('hex').substring(0, 16)\n\nconst decrypt =(encrypted:string):string|null=>{\n try{\n encrypted = Buffer.from(encrypted, 'base64').toString('binary');\n const decipher = createDecipheriv('aes-256-cbc', key, iv);\n let decrypted = decipher.update(encrypted, 'binary', 'utf8');\n decrypted += decipher.final('utf8');\n return decrypted;\n }catch(e){\n return null;\n }\n}\n\nconst encrypt = (txt:string):string|null=>{\n try{\n let encipher = createCipheriv('aes-256-cbc', key, iv),\n encrypted = encipher.update(txt, 'utf8', 'binary');\n encrypted += encipher.final('binary');\n return Buffer.from(encrypted, 'binary').toString('base64');\n }catch(e){\n return null;\n }\n}\n\nexport default MysqlService;"]}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"WSAPITransport.js","sourceRoot":"","sources":["../../src/apiServer/WSAPITransport.ts"],"names":[],"mappings":"","sourcesContent":[""]}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"WebSocketHandler.js","sourceRoot":"","sources":["../../src/apiServer/WebSocketHandler.ts"],"names":[],"mappings":"","sourcesContent":[""]}
|
@@ -1,15 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.Websocket = void 0;
|
4
|
-
const getDefaultWebSocketServiceOptions = () => {
|
5
|
-
return {
|
6
|
-
endpoint: "/ws"
|
7
|
-
};
|
8
|
-
};
|
9
|
-
class Websocket {
|
10
|
-
options;
|
11
|
-
constructor(opt) {
|
12
|
-
this.options = { ...getDefaultWebSocketServiceOptions(), opt };
|
13
|
-
}
|
14
|
-
}
|
15
|
-
exports.Websocket = Websocket;
|
@@ -1,8 +0,0 @@
|
|
1
|
-
import { BaseService } from "./BaseService";
|
2
|
-
export interface IWebSocketServiceOptions {
|
3
|
-
}
|
4
|
-
export declare class WebsocketService extends BaseService {
|
5
|
-
options: IWebSocketServiceOptions;
|
6
|
-
constructor(opt?: IWebSocketServiceOptions);
|
7
|
-
init(): Promise<void>;
|
8
|
-
}
|