underpost 2.6.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 +14 -0
- package/.env.development +8 -0
- package/.env.production +8 -0
- package/.env.test +8 -0
- package/.nycrc +9 -0
- package/.prettierignore +13 -0
- package/.prettierrc +9 -0
- package/.vscode/extensions.json +72 -0
- package/.vscode/settings.json +99 -0
- package/Dockerfile +88 -0
- package/LICENSE +21 -0
- package/README.md +51 -0
- package/bin/db.js +119 -0
- package/bin/deploy.js +600 -0
- package/bin/dns.js +1 -0
- package/bin/file.js +92 -0
- package/bin/help.js +110 -0
- package/bin/index.js +29 -0
- package/bin/install.js +357 -0
- package/bin/shortcut.js +44 -0
- package/bin/ssl.js +61 -0
- package/bin/util.js +182 -0
- package/bin/vs.js +35 -0
- package/conf.js +244 -0
- package/docker-compose.yml +67 -0
- package/jsconfig.json +7 -0
- package/jsdoc.json +32 -0
- package/nodemon.json +6 -0
- package/package.json +128 -0
- package/prometheus.yml +36 -0
- package/setup.sh +25 -0
- package/src/api/core/core.controller.js +69 -0
- package/src/api/core/core.model.js +11 -0
- package/src/api/core/core.router.js +23 -0
- package/src/api/core/core.service.js +29 -0
- package/src/api/crypto/crypto.controller.js +51 -0
- package/src/api/crypto/crypto.model.js +23 -0
- package/src/api/crypto/crypto.router.js +20 -0
- package/src/api/crypto/crypto.service.js +64 -0
- package/src/api/default/default.controller.js +69 -0
- package/src/api/default/default.model.js +20 -0
- package/src/api/default/default.router.js +23 -0
- package/src/api/default/default.service.js +31 -0
- package/src/api/file/file.controller.js +51 -0
- package/src/api/file/file.model.js +19 -0
- package/src/api/file/file.router.js +20 -0
- package/src/api/file/file.service.js +70 -0
- package/src/api/instance/instance.controller.js +69 -0
- package/src/api/instance/instance.model.js +36 -0
- package/src/api/instance/instance.router.js +33 -0
- package/src/api/instance/instance.service.js +48 -0
- package/src/api/test/test.controller.js +59 -0
- package/src/api/test/test.model.js +14 -0
- package/src/api/test/test.router.js +21 -0
- package/src/api/test/test.service.js +35 -0
- package/src/api/user/user.controller.js +70 -0
- package/src/api/user/user.model.js +65 -0
- package/src/api/user/user.router.js +345 -0
- package/src/api/user/user.service.js +479 -0
- package/src/api.js +23 -0
- package/src/client/Default.index.js +40 -0
- package/src/client/components/core/Account.js +290 -0
- package/src/client/components/core/AgGrid.js +160 -0
- package/src/client/components/core/Auth.js +19 -0
- package/src/client/components/core/Badge.js +32 -0
- package/src/client/components/core/BlockChain.js +41 -0
- package/src/client/components/core/Blog.js +9 -0
- package/src/client/components/core/BtnIcon.js +91 -0
- package/src/client/components/core/CalendarCore.js +319 -0
- package/src/client/components/core/Chat.js +64 -0
- package/src/client/components/core/ColorPalette.js +5267 -0
- package/src/client/components/core/CommonJs.js +708 -0
- package/src/client/components/core/Content.js +49 -0
- package/src/client/components/core/Css.js +1027 -0
- package/src/client/components/core/CssCore.js +792 -0
- package/src/client/components/core/D3Chart.js +44 -0
- package/src/client/components/core/Docs.js +130 -0
- package/src/client/components/core/DropDown.js +164 -0
- package/src/client/components/core/EventsUI.js +54 -0
- package/src/client/components/core/FileExplorer.js +624 -0
- package/src/client/components/core/FullScreen.js +45 -0
- package/src/client/components/core/Input.js +259 -0
- package/src/client/components/core/JoyStick.js +77 -0
- package/src/client/components/core/Keyboard.js +73 -0
- package/src/client/components/core/LoadingAnimation.js +157 -0
- package/src/client/components/core/LogIn.js +181 -0
- package/src/client/components/core/LogOut.js +52 -0
- package/src/client/components/core/Logger.js +26 -0
- package/src/client/components/core/Modal.js +1596 -0
- package/src/client/components/core/NotificationManager.js +84 -0
- package/src/client/components/core/Panel.js +413 -0
- package/src/client/components/core/Polyhedron.js +162 -0
- package/src/client/components/core/Recover.js +204 -0
- package/src/client/components/core/Responsive.js +53 -0
- package/src/client/components/core/RichText.js +27 -0
- package/src/client/components/core/Router.js +77 -0
- package/src/client/components/core/SignUp.js +125 -0
- package/src/client/components/core/SocketIo.js +72 -0
- package/src/client/components/core/Stream.js +113 -0
- package/src/client/components/core/ToggleSwitch.js +87 -0
- package/src/client/components/core/ToolTip.js +26 -0
- package/src/client/components/core/Translate.js +408 -0
- package/src/client/components/core/Validator.js +100 -0
- package/src/client/components/core/VanillaJs.js +454 -0
- package/src/client/components/core/Wallet.js +106 -0
- package/src/client/components/core/Webhook.js +25 -0
- package/src/client/components/core/Worker.js +272 -0
- package/src/client/components/default/CommonDefault.js +29 -0
- package/src/client/components/default/CssDefault.js +13 -0
- package/src/client/components/default/ElementsDefault.js +38 -0
- package/src/client/components/default/LogInDefault.js +41 -0
- package/src/client/components/default/LogOutDefault.js +28 -0
- package/src/client/components/default/MenuDefault.js +389 -0
- package/src/client/components/default/RoutesDefault.js +48 -0
- package/src/client/components/default/SettingsDefault.js +16 -0
- package/src/client/components/default/SignUpDefault.js +9 -0
- package/src/client/components/default/SocketIoDefault.js +54 -0
- package/src/client/components/default/TranslateDefault.js +7 -0
- package/src/client/public/default/android-chrome-144x144.png +0 -0
- package/src/client/public/default/android-chrome-192x192.png +0 -0
- package/src/client/public/default/android-chrome-256x256.png +0 -0
- package/src/client/public/default/android-chrome-36x36.png +0 -0
- package/src/client/public/default/android-chrome-384x384.png +0 -0
- package/src/client/public/default/android-chrome-48x48.png +0 -0
- package/src/client/public/default/android-chrome-512x512.png +0 -0
- package/src/client/public/default/android-chrome-72x72.png +0 -0
- package/src/client/public/default/android-chrome-96x96.png +0 -0
- package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
- package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
- package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
- package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
- package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
- package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
- package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
- package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
- package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
- package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
- package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
- package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
- package/src/client/public/default/assets/background/white.jpg +0 -0
- package/src/client/public/default/assets/background/white0-min.jpg +0 -0
- package/src/client/public/default/assets/background/white0.jpg +0 -0
- package/src/client/public/default/assets/logo/base-icon.png +0 -0
- package/src/client/public/default/browserconfig.xml +12 -0
- package/src/client/public/default/favicon-16x16.png +0 -0
- package/src/client/public/default/favicon-32x32.png +0 -0
- package/src/client/public/default/favicon-48x48.png +0 -0
- package/src/client/public/default/favicon.ico +0 -0
- package/src/client/public/default/manifest.webmanifest +69 -0
- package/src/client/public/default/mstile-144x144.png +0 -0
- package/src/client/public/default/mstile-150x150.png +0 -0
- package/src/client/public/default/mstile-310x150.png +0 -0
- package/src/client/public/default/mstile-310x310.png +0 -0
- package/src/client/public/default/mstile-70x70.png +0 -0
- package/src/client/public/default/sitemap +148 -0
- package/src/client/public/default/yandex-browser-50x50.png +0 -0
- package/src/client/public/default/yandex-browser-manifest.json +9 -0
- package/src/client/public/doc/favicon.ico +0 -0
- package/src/client/public/doc/sitemap +148 -0
- package/src/client/public/test/favicon.ico +0 -0
- package/src/client/public/test/sitemap +148 -0
- package/src/client/services/core/core.service.js +152 -0
- package/src/client/services/crypto/crypto.service.js +70 -0
- package/src/client/services/default/default.management.js +345 -0
- package/src/client/services/default/default.service.js +89 -0
- package/src/client/services/file/file.service.js +70 -0
- package/src/client/services/instance/instance.management.js +74 -0
- package/src/client/services/instance/instance.service.js +89 -0
- package/src/client/services/test/test.service.js +70 -0
- package/src/client/services/user/user.management.js +50 -0
- package/src/client/services/user/user.service.js +89 -0
- package/src/client/ssr/Render.js +16 -0
- package/src/client/ssr/body-components/CacheControl.js +113 -0
- package/src/client/ssr/body-components/DefaultSplashScreen.js +79 -0
- package/src/client/ssr/email-components/DefaultRecoverEmail.js +21 -0
- package/src/client/ssr/email-components/DefaultVerifyEmail.js +17 -0
- package/src/client/ssr/head-components/Css.js +241 -0
- package/src/client/ssr/head-components/DefaultScripts.js +3 -0
- package/src/client/ssr/head-components/Microdata.js +11 -0
- package/src/client/ssr/head-components/Production.js +1 -0
- package/src/client/ssr/head-components/PwaDefault.js +60 -0
- package/src/client/ssr/head-components/Seo.js +14 -0
- package/src/client/sw/default.sw.js +201 -0
- package/src/client/sw/template.sw.js +84 -0
- package/src/client.build.js +22 -0
- package/src/client.dev.js +21 -0
- package/src/cron.js +25 -0
- package/src/db/DataBaseProvider.js +34 -0
- package/src/db/mariadb/MariaDB.js +33 -0
- package/src/db/mongo/MongooseDB.js +46 -0
- package/src/dns.js +22 -0
- package/src/mailer/EmailRender.js +69 -0
- package/src/mailer/MailerProvider.js +96 -0
- package/src/proxy.js +22 -0
- package/src/runtime/lampp/Lampp.js +44 -0
- package/src/runtime/nginx/Nginx.js +3 -0
- package/src/runtime/xampp/Xampp.js +49 -0
- package/src/server/auth.js +204 -0
- package/src/server/backup.js +83 -0
- package/src/server/client-build-live.js +72 -0
- package/src/server/client-build.js +688 -0
- package/src/server/client-dev-server.js +58 -0
- package/src/server/client-formatted.js +48 -0
- package/src/server/client-icons.js +150 -0
- package/src/server/conf.js +611 -0
- package/src/server/dns.js +87 -0
- package/src/server/downloader.js +42 -0
- package/src/server/logger.js +135 -0
- package/src/server/network.js +122 -0
- package/src/server/peer.js +33 -0
- package/src/server/process.js +66 -0
- package/src/server/proxy.js +118 -0
- package/src/server/runtime.js +393 -0
- package/src/server/ssl.js +107 -0
- package/src/server.js +25 -0
- package/src/ws/IoInterface.js +45 -0
- package/src/ws/IoServer.js +39 -0
- package/src/ws/core/channels/core.ws.chat.js +23 -0
- package/src/ws/core/channels/core.ws.mailer.js +35 -0
- package/src/ws/core/channels/core.ws.stream.js +31 -0
- package/src/ws/core/core.ws.connection.js +28 -0
- package/src/ws/core/core.ws.emit.js +14 -0
- package/src/ws/core/core.ws.server.js +24 -0
- package/src/ws/core/management/core.ws.chat.js +8 -0
- package/src/ws/core/management/core.ws.mailer.js +16 -0
- package/src/ws/core/management/core.ws.stream.js +8 -0
- package/src/ws/default/channels/default.ws.main.js +16 -0
- package/src/ws/default/default.ws.connection.js +22 -0
- package/src/ws/default/default.ws.emit.js +14 -0
- package/src/ws/default/default.ws.server.js +20 -0
- package/src/ws/default/management/default.ws.main.js +8 -0
- package/startup.js +11 -0
- package/supervisord-openssh-server.conf +5 -0
- package/test/api.test.js +60 -0
|
@@ -0,0 +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 };
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
import dotenv from 'dotenv';
|
|
4
|
+
import winston from 'winston';
|
|
5
|
+
import morgan from 'morgan';
|
|
6
|
+
import colorize from 'json-colorizer';
|
|
7
|
+
import colors from 'colors';
|
|
8
|
+
import v8 from 'v8';
|
|
9
|
+
import isAdmin from 'is-admin';
|
|
10
|
+
import { clearTerminalStringColor, formatBytes } from '../client/components/core/CommonJs.js';
|
|
11
|
+
|
|
12
|
+
colors.enable();
|
|
13
|
+
dotenv.config();
|
|
14
|
+
|
|
15
|
+
// Define your severity levels.
|
|
16
|
+
// With them, You can create log files,
|
|
17
|
+
// see or hide levels based on the running ENV.
|
|
18
|
+
const levels = {
|
|
19
|
+
error: 0,
|
|
20
|
+
warn: 1,
|
|
21
|
+
info: 2,
|
|
22
|
+
http: 3,
|
|
23
|
+
debug: 4,
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// This method set the current severity based on
|
|
27
|
+
// the current NODE_ENV: show all the log levels
|
|
28
|
+
// if the server was run in development mode; otherwise,
|
|
29
|
+
// if it was run in production, show only warn and error messages.
|
|
30
|
+
const level = () => 'info'; // (process.env.NODE_ENV || 'development' ? 'debug' : 'warn');
|
|
31
|
+
|
|
32
|
+
// Define different colors for each level.
|
|
33
|
+
// Colors make the log message more visible,
|
|
34
|
+
// adding the ability to focus or ignore messages.
|
|
35
|
+
|
|
36
|
+
// Tell winston that you want to link the colors
|
|
37
|
+
// defined above to the severity levels.
|
|
38
|
+
winston.addColors({
|
|
39
|
+
error: 'red',
|
|
40
|
+
warn: 'yellow',
|
|
41
|
+
info: 'green',
|
|
42
|
+
http: 'magenta',
|
|
43
|
+
debug: 'white',
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// Chose the aspect of your log customizing the log format.
|
|
47
|
+
const format = (meta) =>
|
|
48
|
+
winston.format.combine(
|
|
49
|
+
// winston.format.errors({ stack: true }),
|
|
50
|
+
// Add the message timestamp with the preferred format
|
|
51
|
+
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss:ms' }),
|
|
52
|
+
// Tell Winston that the logs must be colored
|
|
53
|
+
winston.format.colorize({ all: true }),
|
|
54
|
+
// Define the format of the message showing the timestamp, the level and the message
|
|
55
|
+
winston.format.printf((info) => {
|
|
56
|
+
const symbols = Object.getOwnPropertySymbols(info);
|
|
57
|
+
return `${`[${meta}]`.green} ${info.timestamp} ${info.level} ${
|
|
58
|
+
symbols[1]
|
|
59
|
+
? `${clearTerminalStringColor(info.message)}: ${colorize(JSON.stringify(info[symbols[1]][0], null, 4), {
|
|
60
|
+
colors: {
|
|
61
|
+
STRING_KEY: 'green',
|
|
62
|
+
STRING_LITERAL: 'magenta.bold',
|
|
63
|
+
NUMBER_LITERAL: '#FF0000',
|
|
64
|
+
},
|
|
65
|
+
})}`
|
|
66
|
+
: info.message
|
|
67
|
+
}`;
|
|
68
|
+
}),
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
const loggerFactory = (meta) => {
|
|
72
|
+
meta = meta.url.split('/').pop();
|
|
73
|
+
// Define which transports the logger must use to print out messages.
|
|
74
|
+
// In this example, we are using three different transports
|
|
75
|
+
const transports = [
|
|
76
|
+
// Allow the use the terminal to print the messages
|
|
77
|
+
new winston.transports.Console(),
|
|
78
|
+
// Allow to print all the error level messages inside the error.log file
|
|
79
|
+
new winston.transports.File({
|
|
80
|
+
filename: `logs/${meta}/error.log`,
|
|
81
|
+
level: 'error',
|
|
82
|
+
}),
|
|
83
|
+
// Allow to print all the error message inside the all.log file
|
|
84
|
+
// (also the error log that are also printed inside the error.log(
|
|
85
|
+
new winston.transports.File({ filename: `logs/${meta}/all.log` }),
|
|
86
|
+
];
|
|
87
|
+
|
|
88
|
+
// Create the logger instance that has to be exported
|
|
89
|
+
// and used to log messages.
|
|
90
|
+
const logger = winston.createLogger({
|
|
91
|
+
defaultMeta: meta,
|
|
92
|
+
level: level(),
|
|
93
|
+
levels,
|
|
94
|
+
format: format(meta),
|
|
95
|
+
transports,
|
|
96
|
+
// exceptionHandlers: [new winston.transports.File({ filename: 'exceptions.log' })],
|
|
97
|
+
// rejectionHandlers: [new winston.transports.File({ filename: 'rejections.log' })],
|
|
98
|
+
// exitOnError: false,
|
|
99
|
+
});
|
|
100
|
+
logger.setUpInfo = async () => {
|
|
101
|
+
logger.info('argv', process.argv);
|
|
102
|
+
logger.info('env', process.env.NODE_ENV);
|
|
103
|
+
logger.info('admin', await isAdmin());
|
|
104
|
+
logger.info('--max-old-space-size', {
|
|
105
|
+
total_available_size: formatBytes(v8.getHeapStatistics().total_available_size),
|
|
106
|
+
});
|
|
107
|
+
};
|
|
108
|
+
return logger;
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
const loggerMiddleware = (meta) => {
|
|
112
|
+
const stream = {
|
|
113
|
+
// Use the http severity
|
|
114
|
+
write: (message) => loggerFactory(meta).http(message),
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
const skip = (req, res) => process.env.NODE_ENV === 'production';
|
|
118
|
+
|
|
119
|
+
morgan.token('host', function (req, res) {
|
|
120
|
+
return req.headers['host'];
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
return morgan(
|
|
124
|
+
// Define message format string (this is the default one).
|
|
125
|
+
// The message format is made from tokens, and each token is
|
|
126
|
+
// defined inside the Morgan library.
|
|
127
|
+
// You can create your custom token to show what do you want from a request.
|
|
128
|
+
`:remote-addr :method :host:url :status :res[content-length] - :response-time ms`,
|
|
129
|
+
// Options: in this case, I overwrote the stream and the skip logic.
|
|
130
|
+
// See the methods above.
|
|
131
|
+
{ stream, skip },
|
|
132
|
+
);
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
export { loggerFactory, loggerMiddleware };
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import detect from 'detect-port';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
|
|
4
|
+
import { publicIp, publicIpv4, publicIpv6 } from 'public-ip';
|
|
5
|
+
import { killPortProcess } from 'kill-port-process';
|
|
6
|
+
import { loggerFactory } from './logger.js';
|
|
7
|
+
import { orderArrayFromAttrInt } from '../client/components/core/CommonJs.js';
|
|
8
|
+
|
|
9
|
+
// Network Address Translation Management
|
|
10
|
+
|
|
11
|
+
// import dotenv from 'dotenv';
|
|
12
|
+
// dotenv.config();
|
|
13
|
+
|
|
14
|
+
const logger = loggerFactory(import.meta);
|
|
15
|
+
|
|
16
|
+
const network = {
|
|
17
|
+
port: {
|
|
18
|
+
status: async (ports) => {
|
|
19
|
+
const status = [];
|
|
20
|
+
for (const port of ports) {
|
|
21
|
+
status.push({
|
|
22
|
+
port,
|
|
23
|
+
open: await new Promise((resolve) =>
|
|
24
|
+
detect(port)
|
|
25
|
+
.then((_port) => {
|
|
26
|
+
if (port == _port)
|
|
27
|
+
// `port: ${port} was not occupied`
|
|
28
|
+
return resolve(false);
|
|
29
|
+
|
|
30
|
+
// `port: ${port} was occupied, try port: ${_port}`
|
|
31
|
+
return resolve(true);
|
|
32
|
+
})
|
|
33
|
+
.catch((error) => resolve(`${error.message}`)),
|
|
34
|
+
),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return status;
|
|
38
|
+
},
|
|
39
|
+
kill: async (ports) => await killPortProcess(ports),
|
|
40
|
+
portClean: async function (port) {
|
|
41
|
+
const [portStatus] = await this.status([port]);
|
|
42
|
+
// logger.info('port status', portStatus);
|
|
43
|
+
if (portStatus.open) await this.kill([port]);
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const ip = {
|
|
49
|
+
public: {
|
|
50
|
+
get: async () => await publicIp(), // => 'fe80::200:f8ff:fe21:67cf'
|
|
51
|
+
ipv4: async () => await publicIpv4(), // => '46.5.21.123'
|
|
52
|
+
ipv6: async () => await publicIpv6(), // => 'fe80::200:f8ff:fe21:67cf'
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
let ipInstance = '';
|
|
57
|
+
const networkRouter = {};
|
|
58
|
+
|
|
59
|
+
const logRuntimeRouter = () => {
|
|
60
|
+
const displayLog = {};
|
|
61
|
+
|
|
62
|
+
for (const host of Object.keys(networkRouter))
|
|
63
|
+
for (const path of Object.keys(networkRouter[host]))
|
|
64
|
+
displayLog[networkRouter[host][path].publicHost] = networkRouter[host][path].local;
|
|
65
|
+
|
|
66
|
+
logger.info('Runtime network', displayLog);
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const saveRuntimeRouter = () =>
|
|
70
|
+
fs.writeFileSync(
|
|
71
|
+
`./tmp/runtime-router.${process.argv[3] ? process.argv[3] : 'default'}.json`,
|
|
72
|
+
JSON.stringify(networkRouter, null, 4),
|
|
73
|
+
'utf-8',
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
const listenServerFactory = (logic = async () => {}) => {
|
|
77
|
+
return {
|
|
78
|
+
listen: async (...args) => (logic ? await logic(...args) : undefined, args[1]()),
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const listenPortController = async (server, port, metadata) =>
|
|
83
|
+
new Promise((resolve) => {
|
|
84
|
+
try {
|
|
85
|
+
if (!server) server = listenServerFactory();
|
|
86
|
+
|
|
87
|
+
const { host, path, client, runtime, meta } = metadata;
|
|
88
|
+
const error = [];
|
|
89
|
+
if (port === undefined) error.push(`port`);
|
|
90
|
+
if (host === undefined) error.push(`host`);
|
|
91
|
+
if (path === undefined) error.push(`path`);
|
|
92
|
+
if (client === undefined) error.push(`client`);
|
|
93
|
+
if (runtime === undefined) error.push(`runtime`);
|
|
94
|
+
if (meta === undefined) error.push(`meta`);
|
|
95
|
+
if (error.length > 0) throw new Error('Listen port controller requires values: ' + error.join(', '));
|
|
96
|
+
|
|
97
|
+
server.listen(port, () => {
|
|
98
|
+
if (!networkRouter[host]) networkRouter[host] = {};
|
|
99
|
+
networkRouter[host][path] = {
|
|
100
|
+
meta,
|
|
101
|
+
client,
|
|
102
|
+
runtime,
|
|
103
|
+
port,
|
|
104
|
+
public: `http://${ipInstance}:${port}${path}`,
|
|
105
|
+
publicHost:
|
|
106
|
+
port === 80
|
|
107
|
+
? `http://${host}${path}`
|
|
108
|
+
: port === 443
|
|
109
|
+
? `https://${host}${path}`
|
|
110
|
+
: `http://${host}:${port}${path}`,
|
|
111
|
+
local: `http://localhost:${port}${path}`,
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
return resolve(true);
|
|
115
|
+
});
|
|
116
|
+
} catch (error) {
|
|
117
|
+
logger.error(error, { metadata, port, stack: error.stack });
|
|
118
|
+
resolve(false);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
export { ip, network, listenPortController, networkRouter, saveRuntimeRouter, logRuntimeRouter, listenServerFactory };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { PeerServer } from 'peer';
|
|
2
|
+
import dotenv from 'dotenv';
|
|
3
|
+
import { loggerFactory } from './logger.js';
|
|
4
|
+
import fs from 'fs-extra';
|
|
5
|
+
import { listenServerFactory } from './network.js';
|
|
6
|
+
|
|
7
|
+
dotenv.config();
|
|
8
|
+
|
|
9
|
+
const logger = loggerFactory(import.meta);
|
|
10
|
+
|
|
11
|
+
// https://github.com/peers/peerjs
|
|
12
|
+
// https://github.com/peers/peerjs-server
|
|
13
|
+
|
|
14
|
+
const createPeerServer = async ({ port, devPort, origins, host, path }) => {
|
|
15
|
+
if (process.env.NODE_ENV === 'development' && devPort) origins.push(`http://localhost:${devPort}`);
|
|
16
|
+
/** @type {import('peer').IConfig} */
|
|
17
|
+
const options = {
|
|
18
|
+
port,
|
|
19
|
+
path: `${path === '/' ? '' : path}/peer`,
|
|
20
|
+
corsOptions: {
|
|
21
|
+
origin: origins,
|
|
22
|
+
},
|
|
23
|
+
proxied: true,
|
|
24
|
+
// key: fs.readFileSync(''),
|
|
25
|
+
// cert: fs.readFileSync(''),
|
|
26
|
+
// ca: fs.readFileSync(''),
|
|
27
|
+
};
|
|
28
|
+
const peerServer = listenServerFactory(() => PeerServer(options));
|
|
29
|
+
|
|
30
|
+
return { options, peerServer, meta: import.meta };
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export { createPeerServer };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// https://nodejs.org/api/process
|
|
2
|
+
|
|
3
|
+
import shell from 'shelljs';
|
|
4
|
+
import dotenv from 'dotenv';
|
|
5
|
+
import fs from 'fs-extra';
|
|
6
|
+
|
|
7
|
+
import { loggerFactory } from './logger.js';
|
|
8
|
+
|
|
9
|
+
dotenv.config();
|
|
10
|
+
|
|
11
|
+
const logger = loggerFactory(import.meta);
|
|
12
|
+
|
|
13
|
+
// process.exit();
|
|
14
|
+
|
|
15
|
+
const getRootDirectory = () => process.cwd().replace(/\\/g, '/');
|
|
16
|
+
|
|
17
|
+
const ProcessController = {
|
|
18
|
+
SIG: [
|
|
19
|
+
'SIGPIPE',
|
|
20
|
+
'SIGHUP',
|
|
21
|
+
'SIGTERM',
|
|
22
|
+
'SIGINT',
|
|
23
|
+
'SIGBREAK',
|
|
24
|
+
'SIGWINCH',
|
|
25
|
+
// 'SIGKILL',
|
|
26
|
+
// 'SIGSTOP',
|
|
27
|
+
'SIGBUS',
|
|
28
|
+
'SIGFPE',
|
|
29
|
+
'SIGSEGV',
|
|
30
|
+
'SIGILL',
|
|
31
|
+
],
|
|
32
|
+
onSigListen: function () {
|
|
33
|
+
return this.SIG.map((sig) =>
|
|
34
|
+
process.on(sig, (...args) => {
|
|
35
|
+
this.logger.info(`process on ${sig}`, args);
|
|
36
|
+
switch (sig) {
|
|
37
|
+
case 'SIGINT':
|
|
38
|
+
return process.exit();
|
|
39
|
+
|
|
40
|
+
default:
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
}),
|
|
44
|
+
);
|
|
45
|
+
},
|
|
46
|
+
init: function (logger) {
|
|
47
|
+
this.logger = logger;
|
|
48
|
+
process.on('exit', (...args) => {
|
|
49
|
+
this.logger.info(`process on exit`, args);
|
|
50
|
+
});
|
|
51
|
+
this.onSigListen();
|
|
52
|
+
if (fs.existsSync(`./tmp/await-deploy`)) fs.remove(`./tmp/await-deploy`);
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const shellExec = (cmd, options = { silent: false, async: false, stdout: false }) => {
|
|
57
|
+
logger.info(`cmd`, cmd);
|
|
58
|
+
return options.stdout ? shell.exec(cmd, options).stdout : shell.exec(cmd, options);
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const shellCd = (cd) => {
|
|
62
|
+
logger.info(`cd`, cd);
|
|
63
|
+
return shell.cd(cd);
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export { ProcessController, getRootDirectory, shellExec, shellCd };
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
import express from 'express';
|
|
4
|
+
import fs from 'fs-extra';
|
|
5
|
+
import dotenv from 'dotenv';
|
|
6
|
+
|
|
7
|
+
import { createProxyMiddleware } from 'http-proxy-middleware';
|
|
8
|
+
import { loggerFactory, loggerMiddleware } from './logger.js';
|
|
9
|
+
import { listenPortController, network } from './network.js';
|
|
10
|
+
import { orderArrayFromAttrInt } from '../client/components/core/CommonJs.js';
|
|
11
|
+
import { createSslServer, sslRedirectMiddleware } from './ssl.js';
|
|
12
|
+
import { buildProxyRouter } from './conf.js';
|
|
13
|
+
|
|
14
|
+
dotenv.config();
|
|
15
|
+
|
|
16
|
+
const logger = loggerFactory(import.meta);
|
|
17
|
+
|
|
18
|
+
const buildProxy = async () => {
|
|
19
|
+
// default target
|
|
20
|
+
await network.port.portClean(process.env.PORT);
|
|
21
|
+
express().listen(process.env.PORT);
|
|
22
|
+
|
|
23
|
+
const proxyRouter = buildProxyRouter();
|
|
24
|
+
|
|
25
|
+
for (let port of Object.keys(proxyRouter)) {
|
|
26
|
+
port = parseInt(port);
|
|
27
|
+
const hosts = proxyRouter[port];
|
|
28
|
+
const app = express();
|
|
29
|
+
|
|
30
|
+
// set logger
|
|
31
|
+
app.use(loggerMiddleware(import.meta));
|
|
32
|
+
|
|
33
|
+
// instance proxy options
|
|
34
|
+
// https://github.com/chimurai/http-proxy-middleware/tree/v2.0.4#readme
|
|
35
|
+
|
|
36
|
+
// proxy middleware options
|
|
37
|
+
/** @type {import('http-proxy-middleware/dist/types').Options} */
|
|
38
|
+
const options = {
|
|
39
|
+
ws: true,
|
|
40
|
+
// changeOrigin: true,
|
|
41
|
+
// autoRewrite: false,
|
|
42
|
+
target: `http://localhost:${process.env.PORT}`,
|
|
43
|
+
router: {},
|
|
44
|
+
xfwd: true, // adds x-forward headers
|
|
45
|
+
// preserveHeaderKeyCase: true,
|
|
46
|
+
// secure: true, warn validator
|
|
47
|
+
onProxyReq: (proxyReq, req, res, options) => {
|
|
48
|
+
sslRedirectMiddleware(req, res, port, proxyRouter);
|
|
49
|
+
},
|
|
50
|
+
pathRewrite: {
|
|
51
|
+
// only add path
|
|
52
|
+
// '^/target-path': '/',
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
// build router
|
|
57
|
+
Object.keys(hosts).map((hostKey) => {
|
|
58
|
+
let { host, path, target, proxy, peer } = hosts[hostKey];
|
|
59
|
+
if (process.env.NODE_ENV === 'development') host = `localhost`;
|
|
60
|
+
|
|
61
|
+
if (!proxy.includes(port)) return;
|
|
62
|
+
const absoluteHost = [80, 443].includes(port)
|
|
63
|
+
? `${host}${path === '/' ? '' : path}`
|
|
64
|
+
: `${host}:${port}${path === '/' ? '' : path}`;
|
|
65
|
+
|
|
66
|
+
if (!(absoluteHost in options.router)) options.router[absoluteHost] = target;
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
// order router
|
|
70
|
+
const router = {};
|
|
71
|
+
for (const absoluteHostKey of orderArrayFromAttrInt(Object.keys(options.router), 'length'))
|
|
72
|
+
router[absoluteHostKey] = options.router[absoluteHostKey];
|
|
73
|
+
options.router = router;
|
|
74
|
+
|
|
75
|
+
if (Object.keys(options.router).length === 0) continue;
|
|
76
|
+
|
|
77
|
+
// instance proxy server
|
|
78
|
+
|
|
79
|
+
const proxyPath = '/';
|
|
80
|
+
const proxyHost = 'localhost';
|
|
81
|
+
|
|
82
|
+
const filter = false
|
|
83
|
+
? (pathname, req) => {
|
|
84
|
+
// return pathname.match('^/api') && req.method === 'GET';
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
: proxyPath;
|
|
88
|
+
app.use(proxyPath, createProxyMiddleware(filter, options));
|
|
89
|
+
await network.port.portClean(port);
|
|
90
|
+
|
|
91
|
+
const runningData = { host: proxyHost, path: proxyPath, client: null, runtime: 'nodejs', meta: import.meta };
|
|
92
|
+
|
|
93
|
+
switch (process.env.NODE_ENV) {
|
|
94
|
+
case 'production':
|
|
95
|
+
switch (port) {
|
|
96
|
+
case 443:
|
|
97
|
+
const { ServerSSL } = await createSslServer(app, hosts);
|
|
98
|
+
await listenPortController(ServerSSL, port, runningData);
|
|
99
|
+
break;
|
|
100
|
+
|
|
101
|
+
default:
|
|
102
|
+
await listenPortController(app, port, runningData);
|
|
103
|
+
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
break;
|
|
108
|
+
|
|
109
|
+
default:
|
|
110
|
+
await listenPortController(app, port, runningData);
|
|
111
|
+
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
logger.info('Proxy running', { port, options });
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
export { buildProxy };
|