underpost 2.6.3 → 2.7.2
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/.dockerignore +13 -13
- package/.env.development +7 -7
- package/.env.production +7 -7
- package/.env.test +7 -7
- package/.github/workflows/publish.yml +26 -0
- package/.nycrc +9 -9
- package/.prettierignore +12 -12
- package/.prettierrc +9 -9
- package/.vscode/extensions.json +72 -72
- package/.vscode/settings.json +100 -99
- package/AUTHORS.md +10 -0
- package/CHANGELOG.md +91 -0
- package/Dockerfile +89 -89
- package/LICENSE +21 -21
- package/README.md +96 -96
- package/bin/db.js +172 -119
- package/bin/deploy.js +582 -626
- package/bin/dns.js +1 -1
- package/bin/file.js +92 -92
- package/bin/index.js +53 -34
- package/bin/install.js +398 -357
- package/bin/shortcut.js +44 -44
- package/bin/ssl.js +65 -61
- package/bin/util.js +182 -182
- package/bin/vs.js +35 -35
- package/conf.js +251 -249
- package/docker-compose.yml +67 -67
- package/jsconfig.json +7 -7
- package/jsdoc.json +32 -32
- package/nodemon.json +6 -6
- package/package.json +137 -128
- package/prometheus.yml +36 -36
- package/setup.sh +24 -24
- package/src/api/core/core.controller.js +69 -69
- package/src/api/core/core.model.js +11 -11
- package/src/api/core/core.router.js +23 -23
- package/src/api/core/core.service.js +29 -29
- package/src/api/crypto/crypto.controller.js +51 -51
- package/src/api/crypto/crypto.model.js +23 -23
- package/src/api/crypto/crypto.router.js +20 -20
- package/src/api/crypto/crypto.service.js +64 -64
- package/src/api/default/default.controller.js +69 -69
- package/src/api/default/default.model.js +20 -20
- package/src/api/default/default.router.js +23 -23
- package/src/api/default/default.service.js +31 -31
- package/src/api/file/file.controller.js +53 -51
- package/src/api/file/file.model.js +19 -19
- package/src/api/file/file.router.js +21 -20
- package/src/api/file/file.service.js +76 -70
- package/src/api/instance/instance.controller.js +69 -69
- package/src/api/instance/instance.model.js +36 -36
- package/src/api/instance/instance.router.js +33 -33
- package/src/api/instance/instance.service.js +48 -48
- package/src/api/test/test.controller.js +59 -59
- package/src/api/test/test.model.js +14 -14
- package/src/api/test/test.router.js +21 -21
- package/src/api/test/test.service.js +35 -35
- package/src/api/user/user.build.js +16 -0
- package/src/api/user/user.controller.js +70 -70
- package/src/api/user/user.model.js +65 -65
- package/src/api/user/user.router.js +345 -345
- package/src/api/user/user.service.js +479 -479
- package/src/api.js +23 -23
- package/src/client/Default.index.js +40 -40
- package/src/client/components/core/Account.js +290 -290
- package/src/client/components/core/AgGrid.js +160 -160
- package/src/client/components/core/Auth.js +19 -19
- package/src/client/components/core/Badge.js +32 -32
- package/src/client/components/core/BlockChain.js +41 -41
- package/src/client/components/core/Blog.js +9 -9
- package/src/client/components/core/BtnIcon.js +101 -94
- package/src/client/components/core/CalendarCore.js +458 -319
- package/src/client/components/core/Chat.js +64 -64
- package/src/client/components/core/ColorPalette.js +5267 -5267
- package/src/client/components/core/CommonJs.js +735 -732
- package/src/client/components/core/Content.js +193 -49
- package/src/client/components/core/Css.js +1064 -1027
- package/src/client/components/core/CssCore.js +817 -796
- package/src/client/components/core/D3Chart.js +44 -44
- package/src/client/components/core/Docs.js +229 -229
- package/src/client/components/core/DropDown.js +164 -164
- package/src/client/components/core/EventsUI.js +46 -54
- package/src/client/components/core/FileExplorer.js +699 -624
- package/src/client/components/core/FullScreen.js +45 -45
- package/src/client/components/core/Input.js +346 -259
- package/src/client/components/core/JoyStick.js +77 -77
- package/src/client/components/core/Keyboard.js +73 -73
- package/src/client/components/core/LoadingAnimation.js +179 -157
- package/src/client/components/core/LogIn.js +187 -181
- package/src/client/components/core/LogOut.js +58 -52
- package/src/client/components/core/Logger.js +26 -26
- package/src/client/components/core/Modal.js +1612 -1596
- package/src/client/components/core/NotificationManager.js +84 -84
- package/src/client/components/core/Panel.js +613 -413
- package/src/client/components/core/PanelForm.js +468 -0
- package/src/client/components/core/Polyhedron.js +162 -162
- package/src/client/components/core/Recover.js +204 -204
- package/src/client/components/core/Responsive.js +53 -53
- package/src/client/components/core/RichText.js +51 -27
- package/src/client/components/core/Router.js +76 -77
- package/src/client/components/core/Scroll.js +34 -0
- package/src/client/components/core/SignUp.js +125 -125
- package/src/client/components/core/SocketIo.js +72 -72
- package/src/client/components/core/Stream.js +113 -113
- package/src/client/components/core/ToggleSwitch.js +87 -87
- package/src/client/components/core/ToolTip.js +26 -26
- package/src/client/components/core/Translate.js +437 -408
- package/src/client/components/core/Validator.js +100 -100
- package/src/client/components/core/VanillaJs.js +460 -457
- package/src/client/components/core/Wallet.js +106 -106
- package/src/client/components/core/Webhook.js +25 -25
- package/src/client/components/core/Worker.js +272 -272
- package/src/client/components/default/CommonDefault.js +29 -29
- package/src/client/components/default/CssDefault.js +13 -13
- package/src/client/components/default/ElementsDefault.js +38 -38
- package/src/client/components/default/LogInDefault.js +41 -41
- package/src/client/components/default/LogOutDefault.js +28 -28
- package/src/client/components/default/MenuDefault.js +389 -389
- package/src/client/components/default/RoutesDefault.js +48 -48
- package/src/client/components/default/SettingsDefault.js +16 -16
- package/src/client/components/default/SignUpDefault.js +9 -9
- package/src/client/components/default/SocketIoDefault.js +54 -54
- package/src/client/components/default/TranslateDefault.js +7 -7
- package/src/client/public/default/assets/mailer/api-user-check.png +0 -0
- package/src/client/public/default/assets/mailer/api-user-invalid-token.png +0 -0
- package/src/client/public/default/assets/mailer/api-user-recover.png +0 -0
- package/src/client/public/default/browserconfig.xml +11 -11
- package/src/client/public/default/manifest.webmanifest +68 -68
- package/src/client/public/default/plantuml/client-conf.svg +1 -0
- package/src/client/public/default/plantuml/client-schema.svg +1 -0
- package/src/client/public/default/plantuml/cron-conf.svg +1 -0
- package/src/client/public/default/plantuml/cron-schema.svg +1 -0
- package/src/client/public/default/plantuml/server-conf.svg +1 -0
- package/src/client/public/default/plantuml/server-schema.svg +1 -0
- package/src/client/public/default/plantuml/ssr-conf.svg +1 -0
- package/src/client/public/default/plantuml/ssr-schema.svg +1 -0
- package/src/client/public/default/sitemap +147 -147
- package/src/client/public/default/yandex-browser-manifest.json +8 -8
- package/src/client/public/doc/sitemap +147 -147
- package/src/client/public/test/sitemap +147 -147
- package/src/client/services/core/core.service.js +170 -152
- package/src/client/services/crypto/crypto.service.js +70 -70
- package/src/client/services/default/default.management.js +345 -345
- package/src/client/services/default/default.service.js +89 -89
- package/src/client/services/file/file.service.js +70 -70
- package/src/client/services/instance/instance.management.js +74 -74
- package/src/client/services/instance/instance.service.js +89 -89
- package/src/client/services/test/test.service.js +70 -70
- package/src/client/services/user/user.management.js +50 -50
- package/src/client/services/user/user.service.js +89 -89
- package/src/client/ssr/Render.js +16 -16
- package/src/client/ssr/body-components/CacheControl.js +114 -113
- package/src/client/ssr/body-components/DefaultSplashScreen.js +79 -79
- package/src/client/ssr/email-components/DefaultRecoverEmail.js +21 -21
- package/src/client/ssr/email-components/DefaultVerifyEmail.js +17 -17
- package/src/client/ssr/head-components/Css.js +241 -241
- package/src/client/ssr/head-components/DefaultScripts.js +3 -3
- package/src/client/ssr/head-components/Microdata.js +11 -11
- package/src/client/ssr/head-components/Production.js +1 -1
- package/src/client/ssr/head-components/PwaDefault.js +59 -59
- package/src/client/ssr/head-components/Seo.js +14 -14
- package/src/client/sw/default.sw.js +201 -201
- package/src/client/sw/template.sw.js +84 -84
- package/src/client.build.js +22 -22
- package/src/client.dev.js +21 -21
- package/src/cron.js +25 -25
- package/src/db/DataBaseProvider.js +34 -34
- package/src/db/mariadb/MariaDB.js +33 -33
- package/src/db/mongo/MongooseDB.js +46 -46
- package/src/dns.js +22 -22
- package/src/index.js +42 -0
- package/src/mailer/EmailRender.js +69 -69
- package/src/mailer/MailerProvider.js +96 -96
- package/src/proxy.js +22 -22
- package/src/runtime/lampp/Lampp.js +69 -44
- package/src/runtime/nginx/Nginx.js +3 -3
- package/src/runtime/xampp/Xampp.js +49 -49
- package/src/server/auth.js +235 -204
- package/src/server/backup.js +101 -84
- package/src/server/client-build-live.js +72 -72
- package/src/server/client-build.js +705 -699
- package/src/server/client-dev-server.js +60 -58
- package/src/server/client-formatted.js +48 -48
- package/src/server/client-icons.js +149 -150
- package/src/server/conf.js +860 -611
- package/src/server/dns.js +98 -87
- package/src/server/downloader.js +42 -42
- package/src/server/logger.js +180 -135
- package/src/server/network.js +122 -122
- package/src/server/peer.js +33 -33
- package/src/server/process.js +66 -66
- package/src/server/prompt-optimizer.js +28 -0
- package/src/server/proxy.js +118 -118
- package/src/server/runtime.js +444 -393
- package/src/server/ssl.js +109 -107
- package/src/server.js +25 -25
- package/src/ws/IoInterface.js +45 -45
- package/src/ws/IoServer.js +39 -39
- package/src/ws/core/channels/core.ws.chat.js +23 -23
- package/src/ws/core/channels/core.ws.mailer.js +35 -35
- package/src/ws/core/channels/core.ws.stream.js +31 -31
- package/src/ws/core/core.ws.connection.js +28 -28
- package/src/ws/core/core.ws.emit.js +14 -14
- package/src/ws/core/core.ws.server.js +24 -24
- package/src/ws/core/management/core.ws.chat.js +8 -8
- package/src/ws/core/management/core.ws.mailer.js +16 -16
- package/src/ws/core/management/core.ws.stream.js +8 -8
- package/src/ws/default/channels/default.ws.main.js +16 -16
- package/src/ws/default/default.ws.connection.js +22 -22
- package/src/ws/default/default.ws.emit.js +14 -14
- package/src/ws/default/default.ws.server.js +20 -20
- package/src/ws/default/management/default.ws.main.js +8 -8
- package/startup.js +11 -11
- package/supervisord-openssh-server.conf +4 -4
- package/test/api.test.js +60 -60
- package/bin/help.js +0 -110
package/src/server/dns.js
CHANGED
|
@@ -1,87 +1,98 @@
|
|
|
1
|
-
import axios from 'axios';
|
|
2
|
-
import dotenv from 'dotenv';
|
|
3
|
-
import fs from 'fs';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
//
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import dotenv from 'dotenv';
|
|
3
|
+
import fs from 'fs';
|
|
4
|
+
import cron from 'node-cron';
|
|
5
|
+
|
|
6
|
+
import { ip } from './network.js';
|
|
7
|
+
import { loggerFactory } from './logger.js';
|
|
8
|
+
import { isIPv4 } from 'is-ip';
|
|
9
|
+
|
|
10
|
+
dotenv.config();
|
|
11
|
+
|
|
12
|
+
const logger = loggerFactory(import.meta);
|
|
13
|
+
|
|
14
|
+
const Dns = {
|
|
15
|
+
ip: null,
|
|
16
|
+
ipDaemon: null,
|
|
17
|
+
InitIpDaemon: async function () {
|
|
18
|
+
// WAN | NAT-VPS | LAN
|
|
19
|
+
// enabled DMZ Host to proxy IP 80-443 (79-444) sometimes router block first port
|
|
20
|
+
// LAN server or device's local servers port -> 3000-3100 (2999-3101)
|
|
21
|
+
// DNS Records: [ANAME](Address Dynamic) -> [A](ipv4) host | [AAAA](ipv6) host -> [ip]
|
|
22
|
+
// DHCP (Dynamic Host Configuration Protocol) LAN reserver IP -> MAC ID
|
|
23
|
+
// Forward the router's TCP/UDP ports to the LAN device's IP address
|
|
24
|
+
|
|
25
|
+
const privateCronConfPath = `./engine-private/conf/${process.argv[2]}/conf.cron.json`;
|
|
26
|
+
|
|
27
|
+
const confCronPath = fs.existsSync(privateCronConfPath) ? privateCronConfPath : './conf/conf.cron.json';
|
|
28
|
+
|
|
29
|
+
let confCronData = JSON.parse(fs.readFileSync(confCronPath, 'utf8'));
|
|
30
|
+
if (confCronData.ipDaemon.disabled) return;
|
|
31
|
+
Dns.ip = confCronData.ipDaemon.ip;
|
|
32
|
+
logger.info(`Current ip`, Dns.ip);
|
|
33
|
+
if (Dns.ipDaemon) clearInterval(Dns.ipDaemon);
|
|
34
|
+
const callback = async () => {
|
|
35
|
+
let testIp;
|
|
36
|
+
try {
|
|
37
|
+
testIp = await ip.public.ipv4();
|
|
38
|
+
} catch (error) {
|
|
39
|
+
logger.error(error, { testIp, stack: error.stack });
|
|
40
|
+
}
|
|
41
|
+
if (testIp && typeof testIp === 'string' && isIPv4(testIp) && Dns.ip !== testIp) {
|
|
42
|
+
logger.info(`New ip`, testIp);
|
|
43
|
+
Dns.ip = testIp;
|
|
44
|
+
confCronData.ipDaemon.ip = Dns.ip;
|
|
45
|
+
fs.writeFileSync(confCronPath, JSON.stringify(confCronData, null, 4), 'utf8');
|
|
46
|
+
for (const recordType of Object.keys(confCronData.records)) {
|
|
47
|
+
switch (recordType) {
|
|
48
|
+
case 'A':
|
|
49
|
+
for (const dnsProvider of confCronData.records[recordType]) {
|
|
50
|
+
if (typeof Dns.services.updateIp[dnsProvider.dns] === 'function')
|
|
51
|
+
await Dns.services.updateIp[dnsProvider.dns](dnsProvider);
|
|
52
|
+
}
|
|
53
|
+
break;
|
|
54
|
+
|
|
55
|
+
default:
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
await callback();
|
|
62
|
+
// every minute
|
|
63
|
+
cron.schedule(
|
|
64
|
+
'* * * * *',
|
|
65
|
+
async () => {
|
|
66
|
+
await callback();
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
scheduled: true,
|
|
70
|
+
timezone: process.env.TIME_ZONE || 'America/New_York',
|
|
71
|
+
},
|
|
72
|
+
);
|
|
73
|
+
},
|
|
74
|
+
services: {
|
|
75
|
+
updateIp: {
|
|
76
|
+
dondominio: (options) => {
|
|
77
|
+
const { user, api_key, host, dns } = options;
|
|
78
|
+
const url = `https://dondns.dondominio.com/json/?user=${user}&password=${api_key}&host=${host}&ip=${Dns.ip}`;
|
|
79
|
+
logger.info(`${dns} update ip url`, url);
|
|
80
|
+
if (process.env.NODE_ENV !== 'production') return false;
|
|
81
|
+
return new Promise((resolve) => {
|
|
82
|
+
axios
|
|
83
|
+
.get(url)
|
|
84
|
+
.then((response) => {
|
|
85
|
+
logger.info(`${dns} update ip success`, response.data);
|
|
86
|
+
return resolve(true);
|
|
87
|
+
})
|
|
88
|
+
.catch((error) => {
|
|
89
|
+
logger.error(error, `${dns} update ip error`);
|
|
90
|
+
return resolve(false);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export { Dns };
|
package/src/server/downloader.js
CHANGED
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
import axios from 'axios';
|
|
2
|
-
import fs from 'fs';
|
|
3
|
-
import { loggerFactory } from './logger.js';
|
|
4
|
-
import dotenv from 'dotenv';
|
|
5
|
-
import https from 'https';
|
|
6
|
-
|
|
7
|
-
dotenv.config();
|
|
8
|
-
|
|
9
|
-
const httpsAgent = new https.Agent({
|
|
10
|
-
rejectUnauthorized: false,
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
axios.defaults.httpsAgent = httpsAgent;
|
|
14
|
-
|
|
15
|
-
const logger = loggerFactory(import.meta);
|
|
16
|
-
|
|
17
|
-
const Downloader = (url, fullPath, options = { method: 'get', responseType: 'stream' }) =>
|
|
18
|
-
new Promise((resolve, reject) =>
|
|
19
|
-
axios({
|
|
20
|
-
url,
|
|
21
|
-
...options,
|
|
22
|
-
})
|
|
23
|
-
.then((response) => {
|
|
24
|
-
// Create a write stream to save the file to the specified path
|
|
25
|
-
const writer = fs.createWriteStream(fullPath);
|
|
26
|
-
response.data.pipe(writer);
|
|
27
|
-
writer.on('finish', () => {
|
|
28
|
-
logger.info('Download complete. File saved at', fullPath);
|
|
29
|
-
return resolve(fullPath);
|
|
30
|
-
});
|
|
31
|
-
writer.on('error', (error) => {
|
|
32
|
-
logger.error(error, 'Error downloading the file');
|
|
33
|
-
return reject(error);
|
|
34
|
-
});
|
|
35
|
-
})
|
|
36
|
-
.catch((error) => {
|
|
37
|
-
logger.error(error, 'Error in the request');
|
|
38
|
-
return reject(error);
|
|
39
|
-
}),
|
|
40
|
-
);
|
|
41
|
-
|
|
42
|
-
export { Downloader };
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import { loggerFactory } from './logger.js';
|
|
4
|
+
import dotenv from 'dotenv';
|
|
5
|
+
import https from 'https';
|
|
6
|
+
|
|
7
|
+
dotenv.config();
|
|
8
|
+
|
|
9
|
+
const httpsAgent = new https.Agent({
|
|
10
|
+
rejectUnauthorized: false,
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
axios.defaults.httpsAgent = httpsAgent;
|
|
14
|
+
|
|
15
|
+
const logger = loggerFactory(import.meta);
|
|
16
|
+
|
|
17
|
+
const Downloader = (url, fullPath, options = { method: 'get', responseType: 'stream' }) =>
|
|
18
|
+
new Promise((resolve, reject) =>
|
|
19
|
+
axios({
|
|
20
|
+
url,
|
|
21
|
+
...options,
|
|
22
|
+
})
|
|
23
|
+
.then((response) => {
|
|
24
|
+
// Create a write stream to save the file to the specified path
|
|
25
|
+
const writer = fs.createWriteStream(fullPath);
|
|
26
|
+
response.data.pipe(writer);
|
|
27
|
+
writer.on('finish', () => {
|
|
28
|
+
logger.info('Download complete. File saved at', fullPath);
|
|
29
|
+
return resolve(fullPath);
|
|
30
|
+
});
|
|
31
|
+
writer.on('error', (error) => {
|
|
32
|
+
logger.error(error, 'Error downloading the file');
|
|
33
|
+
return reject(error);
|
|
34
|
+
});
|
|
35
|
+
})
|
|
36
|
+
.catch((error) => {
|
|
37
|
+
logger.error(error, 'Error in the request');
|
|
38
|
+
return reject(error);
|
|
39
|
+
}),
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
export { Downloader };
|
package/src/server/logger.js
CHANGED
|
@@ -1,135 +1,180 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
//
|
|
33
|
-
//
|
|
34
|
-
//
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
winston.format.
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
const
|
|
113
|
-
//
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Module for managing logger control and configuration
|
|
3
|
+
* @module src/server/logger.js
|
|
4
|
+
* @namespace Logger
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
import dotenv from 'dotenv';
|
|
10
|
+
import winston from 'winston';
|
|
11
|
+
import morgan from 'morgan';
|
|
12
|
+
import colorize from 'json-colorizer';
|
|
13
|
+
import colors from 'colors';
|
|
14
|
+
import v8 from 'v8';
|
|
15
|
+
import isAdmin from 'is-admin';
|
|
16
|
+
import { clearTerminalStringColor, formatBytes } from '../client/components/core/CommonJs.js';
|
|
17
|
+
|
|
18
|
+
colors.enable();
|
|
19
|
+
dotenv.config();
|
|
20
|
+
|
|
21
|
+
// Define your severity levels.
|
|
22
|
+
// With them, You can create log files,
|
|
23
|
+
// see or hide levels based on the running ENV.
|
|
24
|
+
const levels = {
|
|
25
|
+
error: 0,
|
|
26
|
+
warn: 1,
|
|
27
|
+
info: 2,
|
|
28
|
+
http: 3,
|
|
29
|
+
debug: 4,
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// This method set the current severity based on
|
|
33
|
+
// the current NODE_ENV: show all the log levels
|
|
34
|
+
// if the server was run in development mode; otherwise,
|
|
35
|
+
// if it was run in production, show only warn and error messages.
|
|
36
|
+
const level = () => 'info'; // (process.env.NODE_ENV || 'development' ? 'debug' : 'warn');
|
|
37
|
+
|
|
38
|
+
// Define different colors for each level.
|
|
39
|
+
// Colors make the log message more visible,
|
|
40
|
+
// adding the ability to focus or ignore messages.
|
|
41
|
+
|
|
42
|
+
// Tell winston that you want to link the colors
|
|
43
|
+
// defined above to the severity levels.
|
|
44
|
+
winston.addColors({
|
|
45
|
+
error: 'red',
|
|
46
|
+
warn: 'yellow',
|
|
47
|
+
info: 'green',
|
|
48
|
+
http: 'magenta',
|
|
49
|
+
debug: 'white',
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
// Chose the aspect of your log customizing the log format.
|
|
53
|
+
const format = (meta) =>
|
|
54
|
+
winston.format.combine(
|
|
55
|
+
// winston.format.errors({ stack: true }),
|
|
56
|
+
// Add the message timestamp with the preferred format
|
|
57
|
+
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss:ms' }),
|
|
58
|
+
// Tell Winston that the logs must be colored
|
|
59
|
+
winston.format.colorize({ all: true }),
|
|
60
|
+
// Define the format of the message showing the timestamp, the level and the message
|
|
61
|
+
winston.format.printf((info) => {
|
|
62
|
+
const symbols = Object.getOwnPropertySymbols(info);
|
|
63
|
+
return `${`[${meta}]`.green} ${info.timestamp} ${info.level} ${
|
|
64
|
+
symbols[1]
|
|
65
|
+
? `${clearTerminalStringColor(info.message)}: ${colorize(JSON.stringify(info[symbols[1]][0], null, 4), {
|
|
66
|
+
colors: {
|
|
67
|
+
STRING_KEY: 'green',
|
|
68
|
+
STRING_LITERAL: 'magenta.bold',
|
|
69
|
+
NUMBER_LITERAL: '#FF0000',
|
|
70
|
+
},
|
|
71
|
+
})}`
|
|
72
|
+
: info.message
|
|
73
|
+
}`;
|
|
74
|
+
}),
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Logs information about the current process environment to the console.
|
|
79
|
+
*
|
|
80
|
+
* This function is used to log details about
|
|
81
|
+
* the execution context, such as command-line arguments,
|
|
82
|
+
* environment variables, the process's administrative privileges,
|
|
83
|
+
* and the maximum available heap space size.
|
|
84
|
+
*
|
|
85
|
+
* @param {winston.Logger} logger - A pre-configured Winston logger object.
|
|
86
|
+
* @memberof Logger
|
|
87
|
+
*/
|
|
88
|
+
const setUpInfo = async (logger = new winston.Logger()) => {
|
|
89
|
+
logger.info('argv', process.argv);
|
|
90
|
+
logger.info('env', process.env.NODE_ENV);
|
|
91
|
+
logger.info('admin', await isAdmin());
|
|
92
|
+
logger.info('--max-old-space-size', {
|
|
93
|
+
total_available_size: formatBytes(v8.getHeapStatistics().total_available_size),
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* The function `loggerFactory` creates a logger instance with specified transports for printing out
|
|
99
|
+
* messages.
|
|
100
|
+
* @param meta - The `meta` parameter in the `loggerFactory` function is used to extract the last part
|
|
101
|
+
* of a URL and use it to create log files in a specific directory.
|
|
102
|
+
* @returns {winston.Logger} The `loggerFactory` function returns a logger instance created using Winston logger
|
|
103
|
+
* library. The logger instance is configured with various transports for printing out messages to
|
|
104
|
+
* different destinations such as the terminal, error.log file, and all.log file. The logger instance
|
|
105
|
+
* also has a method `setUpInfo` attached to it for setting up additional information.
|
|
106
|
+
* @memberof Logger
|
|
107
|
+
*/
|
|
108
|
+
const loggerFactory = (meta = { url: '' }) => {
|
|
109
|
+
meta = meta.url.split('/').pop();
|
|
110
|
+
// Define which transports the logger must use to print out messages.
|
|
111
|
+
// In this example, we are using three different transports
|
|
112
|
+
const transports = [
|
|
113
|
+
// Allow the use the terminal to print the messages
|
|
114
|
+
new winston.transports.Console(),
|
|
115
|
+
// Allow to print all the error level messages inside the error.log file
|
|
116
|
+
new winston.transports.File({
|
|
117
|
+
filename: `logs/${meta}/error.log`,
|
|
118
|
+
level: 'error',
|
|
119
|
+
}),
|
|
120
|
+
// Allow to print all the error message inside the all.log file
|
|
121
|
+
// (also the error log that are also printed inside the error.log(
|
|
122
|
+
new winston.transports.File({ filename: `logs/${meta}/all.log` }),
|
|
123
|
+
];
|
|
124
|
+
|
|
125
|
+
// Create the logger instance that has to be exported
|
|
126
|
+
// and used to log messages.
|
|
127
|
+
const logger = winston.createLogger({
|
|
128
|
+
defaultMeta: meta,
|
|
129
|
+
level: level(),
|
|
130
|
+
levels,
|
|
131
|
+
format: format(meta),
|
|
132
|
+
transports,
|
|
133
|
+
// exceptionHandlers: [new winston.transports.File({ filename: 'exceptions.log' })],
|
|
134
|
+
// rejectionHandlers: [new winston.transports.File({ filename: 'rejections.log' })],
|
|
135
|
+
// exitOnError: false,
|
|
136
|
+
});
|
|
137
|
+
logger.setUpInfo = async () => {
|
|
138
|
+
await setUpInfo(logger);
|
|
139
|
+
};
|
|
140
|
+
return logger;
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* The `loggerMiddleware` function creates a middleware for logging HTTP requests using Morgan with
|
|
145
|
+
* custom message format and options.
|
|
146
|
+
* @param meta - The `meta` parameter in the `loggerMiddleware` function is an object that contains
|
|
147
|
+
* information about the request URL. It has a default value of an empty object `{ url: '' }`. This
|
|
148
|
+
* object is used to provide additional metadata for logging purposes.
|
|
149
|
+
* @returns {Handler<any, any>} The `loggerMiddleware` function returns a middleware function that uses the Morgan library
|
|
150
|
+
* to log HTTP request information. The middleware function formats the log message using predefined
|
|
151
|
+
* tokens provided by Morgan and custom tokens like `:host` to include specific request details. The
|
|
152
|
+
* log message format includes information such as remote address, HTTP method, host, URL, status code,
|
|
153
|
+
* content length, and response time in milliseconds. The middleware
|
|
154
|
+
* @memberof Logger
|
|
155
|
+
*/
|
|
156
|
+
const loggerMiddleware = (meta = { url: '' }) => {
|
|
157
|
+
const stream = {
|
|
158
|
+
// Use the http severity
|
|
159
|
+
write: (message) => loggerFactory(meta).http(message),
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
const skip = (req, res) => process.env.NODE_ENV === 'production';
|
|
163
|
+
|
|
164
|
+
morgan.token('host', function (req, res) {
|
|
165
|
+
return req.headers['host'];
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
return morgan(
|
|
169
|
+
// Define message format string (this is the default one).
|
|
170
|
+
// The message format is made from tokens, and each token is
|
|
171
|
+
// defined inside the Morgan library.
|
|
172
|
+
// You can create your custom token to show what do you want from a request.
|
|
173
|
+
`:remote-addr :method :host:url :status :res[content-length] - :response-time ms`,
|
|
174
|
+
// Options: in this case, I overwrote the stream and the skip logic.
|
|
175
|
+
// See the methods above.
|
|
176
|
+
{ stream, skip },
|
|
177
|
+
);
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
export { loggerFactory, loggerMiddleware, setUpInfo };
|