odac 0.9.0
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/.editorconfig +21 -0
- package/.github/workflows/auto-pr-description.yml +49 -0
- package/.github/workflows/release.yml +32 -0
- package/.github/workflows/test-coverage.yml +58 -0
- package/.husky/pre-commit +2 -0
- package/.kiro/steering/code-style.md +56 -0
- package/.kiro/steering/product.md +20 -0
- package/.kiro/steering/structure.md +77 -0
- package/.kiro/steering/tech.md +87 -0
- package/.prettierrc +10 -0
- package/.releaserc.js +134 -0
- package/AGENTS.md +84 -0
- package/CHANGELOG.md +181 -0
- package/CODE_OF_CONDUCT.md +83 -0
- package/CONTRIBUTING.md +63 -0
- package/LICENSE +661 -0
- package/README.md +57 -0
- package/SECURITY.md +26 -0
- package/bin/candy +10 -0
- package/bin/candypack +10 -0
- package/cli/index.js +3 -0
- package/cli/src/Cli.js +348 -0
- package/cli/src/Connector.js +93 -0
- package/cli/src/Monitor.js +416 -0
- package/core/Candy.js +87 -0
- package/core/Commands.js +239 -0
- package/core/Config.js +1094 -0
- package/core/Lang.js +52 -0
- package/core/Log.js +43 -0
- package/core/Process.js +26 -0
- package/docs/backend/01-overview/01-whats-in-the-candy-box.md +9 -0
- package/docs/backend/01-overview/02-super-handy-helper-functions.md +9 -0
- package/docs/backend/01-overview/03-development-server.md +79 -0
- package/docs/backend/02-structure/01-typical-project-layout.md +39 -0
- package/docs/backend/03-config/00-configuration-overview.md +214 -0
- package/docs/backend/03-config/01-database-connection.md +60 -0
- package/docs/backend/03-config/02-static-route-mapping-optional.md +20 -0
- package/docs/backend/03-config/03-request-timeout.md +11 -0
- package/docs/backend/03-config/04-environment-variables.md +227 -0
- package/docs/backend/03-config/05-early-hints.md +352 -0
- package/docs/backend/04-routing/01-basic-page-routes.md +28 -0
- package/docs/backend/04-routing/02-controller-less-view-routes.md +43 -0
- package/docs/backend/04-routing/03-api-and-data-routes.md +20 -0
- package/docs/backend/04-routing/04-authentication-aware-routes.md +48 -0
- package/docs/backend/04-routing/05-advanced-routing.md +14 -0
- package/docs/backend/04-routing/06-error-pages.md +101 -0
- package/docs/backend/04-routing/07-cron-jobs.md +149 -0
- package/docs/backend/05-controllers/01-how-to-build-a-controller.md +17 -0
- package/docs/backend/05-controllers/02-your-trusty-candy-assistant.md +20 -0
- package/docs/backend/05-controllers/03-controller-classes.md +93 -0
- package/docs/backend/05-forms/01-custom-forms.md +395 -0
- package/docs/backend/05-forms/02-automatic-database-insert.md +297 -0
- package/docs/backend/06-request-and-response/01-the-request-object-what-is-the-user-asking-for.md +96 -0
- package/docs/backend/06-request-and-response/02-sending-a-response-replying-to-the-user.md +40 -0
- package/docs/backend/07-views/01-the-view-directory.md +73 -0
- package/docs/backend/07-views/02-rendering-a-view.md +179 -0
- package/docs/backend/07-views/03-template-syntax.md +181 -0
- package/docs/backend/07-views/03-variables.md +328 -0
- package/docs/backend/07-views/04-request-data.md +231 -0
- package/docs/backend/07-views/05-conditionals.md +290 -0
- package/docs/backend/07-views/06-loops.md +353 -0
- package/docs/backend/07-views/07-translations.md +358 -0
- package/docs/backend/07-views/08-backend-javascript.md +398 -0
- package/docs/backend/07-views/09-comments.md +297 -0
- package/docs/backend/08-database/01-database-connection.md +99 -0
- package/docs/backend/08-database/02-using-mysql.md +322 -0
- package/docs/backend/09-validation/01-the-validator-service.md +424 -0
- package/docs/backend/10-authentication/01-user-logins-with-authjs.md +53 -0
- package/docs/backend/10-authentication/02-foiling-villains-with-csrf-protection.md +55 -0
- package/docs/backend/10-authentication/03-register.md +134 -0
- package/docs/backend/10-authentication/04-candy-register-forms.md +676 -0
- package/docs/backend/10-authentication/05-session-management.md +159 -0
- package/docs/backend/10-authentication/06-candy-login-forms.md +596 -0
- package/docs/backend/11-mail/01-the-mail-service.md +42 -0
- package/docs/backend/12-streaming/01-streaming-overview.md +300 -0
- package/docs/backend/13-utilities/01-candy-var.md +504 -0
- package/docs/frontend/01-overview/01-introduction.md +146 -0
- package/docs/frontend/02-ajax-navigation/01-quick-start.md +608 -0
- package/docs/frontend/02-ajax-navigation/02-configuration.md +370 -0
- package/docs/frontend/02-ajax-navigation/03-advanced-usage.md +519 -0
- package/docs/frontend/03-forms/01-form-handling.md +420 -0
- package/docs/frontend/04-api-requests/01-get-post.md +443 -0
- package/docs/frontend/05-streaming/01-client-streaming.md +163 -0
- package/docs/index.json +452 -0
- package/docs/server/01-installation/01-quick-install.md +19 -0
- package/docs/server/01-installation/02-manual-installation-via-npm.md +9 -0
- package/docs/server/02-get-started/01-core-concepts.md +7 -0
- package/docs/server/02-get-started/02-basic-commands.md +57 -0
- package/docs/server/02-get-started/03-cli-reference.md +276 -0
- package/docs/server/02-get-started/04-cli-quick-reference.md +102 -0
- package/docs/server/03-service/01-start-a-new-service.md +57 -0
- package/docs/server/03-service/02-delete-a-service.md +48 -0
- package/docs/server/04-web/01-create-a-website.md +36 -0
- package/docs/server/04-web/02-list-websites.md +9 -0
- package/docs/server/04-web/03-delete-a-website.md +29 -0
- package/docs/server/05-subdomain/01-create-a-subdomain.md +32 -0
- package/docs/server/05-subdomain/02-list-subdomains.md +33 -0
- package/docs/server/05-subdomain/03-delete-a-subdomain.md +41 -0
- package/docs/server/06-ssl/01-renew-an-ssl-certificate.md +34 -0
- package/docs/server/07-mail/01-create-a-mail-account.md +23 -0
- package/docs/server/07-mail/02-delete-a-mail-account.md +20 -0
- package/docs/server/07-mail/03-list-mail-accounts.md +20 -0
- package/docs/server/07-mail/04-change-account-password.md +23 -0
- package/eslint.config.mjs +120 -0
- package/framework/index.js +4 -0
- package/framework/src/Auth.js +309 -0
- package/framework/src/Candy.js +81 -0
- package/framework/src/Config.js +79 -0
- package/framework/src/Env.js +60 -0
- package/framework/src/Lang.js +57 -0
- package/framework/src/Mail.js +83 -0
- package/framework/src/Mysql.js +575 -0
- package/framework/src/Request.js +301 -0
- package/framework/src/Route/Cron.js +128 -0
- package/framework/src/Route/Internal.js +439 -0
- package/framework/src/Route.js +455 -0
- package/framework/src/Server.js +15 -0
- package/framework/src/Stream.js +163 -0
- package/framework/src/Token.js +37 -0
- package/framework/src/Validator.js +271 -0
- package/framework/src/Var.js +211 -0
- package/framework/src/View/EarlyHints.js +190 -0
- package/framework/src/View/Form.js +600 -0
- package/framework/src/View.js +513 -0
- package/framework/web/candy.js +838 -0
- package/jest.config.js +22 -0
- package/locale/de-DE.json +80 -0
- package/locale/en-US.json +79 -0
- package/locale/es-ES.json +80 -0
- package/locale/fr-FR.json +80 -0
- package/locale/pt-BR.json +80 -0
- package/locale/ru-RU.json +80 -0
- package/locale/tr-TR.json +85 -0
- package/locale/zh-CN.json +80 -0
- package/package.json +86 -0
- package/server/index.js +5 -0
- package/server/src/Api.js +88 -0
- package/server/src/DNS.js +940 -0
- package/server/src/Hub.js +535 -0
- package/server/src/Mail.js +571 -0
- package/server/src/SSL.js +180 -0
- package/server/src/Server.js +27 -0
- package/server/src/Service.js +248 -0
- package/server/src/Subdomain.js +64 -0
- package/server/src/Web/Firewall.js +170 -0
- package/server/src/Web/Proxy.js +134 -0
- package/server/src/Web.js +451 -0
- package/server/src/mail/imap.js +1091 -0
- package/server/src/mail/server.js +32 -0
- package/server/src/mail/smtp.js +786 -0
- package/test/cli/Cli.test.js +36 -0
- package/test/core/Candy.test.js +234 -0
- package/test/core/Commands.test.js +538 -0
- package/test/core/Config.test.js +1435 -0
- package/test/core/Lang.test.js +250 -0
- package/test/core/Process.test.js +156 -0
- package/test/framework/Route.test.js +239 -0
- package/test/framework/View/EarlyHints.test.js +282 -0
- package/test/scripts/check-coverage.js +132 -0
- package/test/server/Api.test.js +647 -0
- package/test/server/Client.test.js +338 -0
- package/test/server/DNS.test.js +2050 -0
- package/test/server/DNS.test.js.bak +2084 -0
- package/test/server/Log.test.js +73 -0
- package/test/server/Mail.account.test_.js +460 -0
- package/test/server/Mail.init.test_.js +411 -0
- package/test/server/Mail.test_.js +1340 -0
- package/test/server/SSL.test_.js +1491 -0
- package/test/server/Server.test.js +765 -0
- package/test/server/Service.test_.js +1127 -0
- package/test/server/Subdomain.test.js +440 -0
- package/test/server/Web/Firewall.test.js +175 -0
- package/test/server/Web.test_.js +1562 -0
- package/test/server/__mocks__/acme-client.js +17 -0
- package/test/server/__mocks__/bcrypt.js +50 -0
- package/test/server/__mocks__/child_process.js +389 -0
- package/test/server/__mocks__/crypto.js +432 -0
- package/test/server/__mocks__/fs.js +450 -0
- package/test/server/__mocks__/globalCandy.js +227 -0
- package/test/server/__mocks__/http-proxy.js +105 -0
- package/test/server/__mocks__/http.js +575 -0
- package/test/server/__mocks__/https.js +272 -0
- package/test/server/__mocks__/index.js +249 -0
- package/test/server/__mocks__/mail/server.js +100 -0
- package/test/server/__mocks__/mail/smtp.js +31 -0
- package/test/server/__mocks__/mailparser.js +81 -0
- package/test/server/__mocks__/net.js +369 -0
- package/test/server/__mocks__/node-forge.js +328 -0
- package/test/server/__mocks__/os.js +320 -0
- package/test/server/__mocks__/path.js +291 -0
- package/test/server/__mocks__/selfsigned.js +8 -0
- package/test/server/__mocks__/server/src/mail/server.js +100 -0
- package/test/server/__mocks__/server/src/mail/smtp.js +31 -0
- package/test/server/__mocks__/smtp-server.js +106 -0
- package/test/server/__mocks__/sqlite3.js +394 -0
- package/test/server/__mocks__/testFactories.js +299 -0
- package/test/server/__mocks__/testHelpers.js +363 -0
- package/test/server/__mocks__/tls.js +229 -0
- package/watchdog/index.js +3 -0
- package/watchdog/src/Watchdog.js +156 -0
- package/web/config.json +5 -0
- package/web/controller/page/about.js +27 -0
- package/web/controller/page/index.js +34 -0
- package/web/package.json +18 -0
- package/web/public/assets/css/style.css +1835 -0
- package/web/public/assets/js/app.js +96 -0
- package/web/route/www.js +19 -0
- package/web/skeleton/main.html +22 -0
- package/web/view/content/about.html +65 -0
- package/web/view/content/home.html +205 -0
- package/web/view/footer/main.html +11 -0
- package/web/view/head/main.html +5 -0
- package/web/view/header/main.html +14 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Restart CandyPack Server": "重启 CandyPack 服务器",
|
|
3
|
+
"Login to CandyPack Server": "登录 CandyPack 服务器",
|
|
4
|
+
"Status": "状态",
|
|
5
|
+
"Starting CandyPack Server...": "正在启动 CandyPack 服务器...",
|
|
6
|
+
"Uptime": "运行时间",
|
|
7
|
+
"Running": "运行中",
|
|
8
|
+
"Auth": "认证",
|
|
9
|
+
"Online": "在线",
|
|
10
|
+
"%s Services": "%s 个服务",
|
|
11
|
+
"Not logged in": "未登录",
|
|
12
|
+
"Login on %s to manage all your server operations.": "在 %s 上登录以管理您的所有服务器操作。",
|
|
13
|
+
"Start a CandyPack Service": "启动 CandyPack 服务",
|
|
14
|
+
"Create a new Website": "创建新网站",
|
|
15
|
+
"Delete a website": "删除网站",
|
|
16
|
+
"List all CandyPack Services": "列出所有 CandyPack 服务",
|
|
17
|
+
"List all CandyPack Websites": "列出所有 CandyPack 网站",
|
|
18
|
+
"Websites": "网站",
|
|
19
|
+
"Services": "服务",
|
|
20
|
+
"Website %s doesn't have index.js file.": "网站 %s 没有 index.js 文件。",
|
|
21
|
+
"Monitor Website or Service": "监控网站或服务",
|
|
22
|
+
"Offline": "离线",
|
|
23
|
+
"Restarting CandyPack Server...": "正在重启 CandyPack 服务器...",
|
|
24
|
+
"Define your server to your CandyPack account": "将您的服务器定义到您的 CandyPack 帐户",
|
|
25
|
+
"Insert Domain (example.com): ": "输入域名 (example.com): ",
|
|
26
|
+
"Commands:": "命令:",
|
|
27
|
+
"Create a new Subdomain": "创建新子域",
|
|
28
|
+
"List all available commands": "列出所有可用命令",
|
|
29
|
+
"Website Management": "网站管理",
|
|
30
|
+
"Help": "帮助",
|
|
31
|
+
"Add a new subdomain": "添加新子域",
|
|
32
|
+
"WEBSITE MANAGEMENT": "网站管理",
|
|
33
|
+
"HELP": "帮助",
|
|
34
|
+
"Debug CandyPack Server": "调试 CandyPack 服务器",
|
|
35
|
+
"Add a new Service": "添加新服务",
|
|
36
|
+
"Domains": "域名",
|
|
37
|
+
"Service %s added.": "服务 %s 已添加。",
|
|
38
|
+
"Name": "名称",
|
|
39
|
+
"Active": "活跃",
|
|
40
|
+
"Errored": "出错",
|
|
41
|
+
"Create a new mail account": "创建新邮件帐户",
|
|
42
|
+
"Delete a mail account": "删除邮件帐户",
|
|
43
|
+
"List all domain mail accounts": "列出所有域邮件帐户",
|
|
44
|
+
"Change mail account password": "更改邮件帐户密码",
|
|
45
|
+
"Renew SSL certificate for a domain": "续订域的 SSL 证书",
|
|
46
|
+
"List all domain subdomains": "列出所有域子域",
|
|
47
|
+
"'%s' is not a valid command.": "'%s' 不是有效命令。",
|
|
48
|
+
"List all websites": "列出所有网站",
|
|
49
|
+
"No websites found.": "未找到网站。",
|
|
50
|
+
"Service %s is not running.": "服务 %s 未运行。",
|
|
51
|
+
"Service %s not found.": "未找到服务 %s。",
|
|
52
|
+
"Enter the path to the website (%s): ": "输入网站路径 (%s): ",
|
|
53
|
+
"Website %s created.": "网站 %s 已创建。",
|
|
54
|
+
"Websites:": "网站:",
|
|
55
|
+
"Website %s deleted.": "网站 %s 已删除。",
|
|
56
|
+
"Invalid domain.": "无效的域名。",
|
|
57
|
+
"Website %s1 created at %s2.": "网站 %s1 已创建于 %s2。",
|
|
58
|
+
"Enter the domain name: ": "输入域名: ",
|
|
59
|
+
"Modules": "模块",
|
|
60
|
+
"Logs": "日志",
|
|
61
|
+
"Navigate": "导航",
|
|
62
|
+
"Select": "选择",
|
|
63
|
+
"Exit": "退出",
|
|
64
|
+
"Website %s already exists.": "网站 %s 已存在。",
|
|
65
|
+
"Website %s not found.": "未找到网站 %s。",
|
|
66
|
+
"Create a new website": "创建新网站",
|
|
67
|
+
"Setting up domain %s...": "正在设置域名 %s...",
|
|
68
|
+
"Domain %s set.": "域名 %s 已设置。",
|
|
69
|
+
"Setting up website files for %s...": "正在设置网站文件 %s...",
|
|
70
|
+
"Website files for %s set.": "网站文件 %s 已设置。",
|
|
71
|
+
"Setting up DNS records for %s...": "正在设置 DNS 记录 %s...",
|
|
72
|
+
"DNS records for %s set.": "DNS 记录 %s 已设置。",
|
|
73
|
+
"Setting up SSL certificate for %s...": "正在设置 SSL 证书 %s...",
|
|
74
|
+
"SSL certificate for domain %s renewed successfully.": "域名 %s 的 SSL 证书已成功续订。",
|
|
75
|
+
"Subdomain %s1 created successfully for domain %s2.": "子域名 %s1 已成功创建,属于域名 %s2。",
|
|
76
|
+
"Invalid subdomain name.": "无效的子域名。",
|
|
77
|
+
"Subdomain %s1 deleted successfully from domain %s2.": "子域名 %s1 已成功从域名 %s2 中删除。",
|
|
78
|
+
"%s is a domain.": "%s 是一个域名。",
|
|
79
|
+
"Enter the subdomain name (subdomain.example.com): ": "输入子域名 (subdomain.example.com): "
|
|
80
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "odac",
|
|
3
|
+
"description": "🍭 Next-Gen Server & Framework: Web, DNS, Mail, SSL & Monitoring in one CLI.",
|
|
4
|
+
"homepage": "https://candypack.dev",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "emre.red",
|
|
7
|
+
"email": "mail@emre.red",
|
|
8
|
+
"url": "https://emre.red"
|
|
9
|
+
},
|
|
10
|
+
"version": "0.9.0",
|
|
11
|
+
"license": "AGPL-3.0",
|
|
12
|
+
"engines": {
|
|
13
|
+
"node": ">=18.0.0"
|
|
14
|
+
},
|
|
15
|
+
"main": "framework/index.js",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "https://github.com/CandyPack/CandyPack.git"
|
|
19
|
+
},
|
|
20
|
+
"directories": {
|
|
21
|
+
"bin": "./bin",
|
|
22
|
+
"cli": "./cli",
|
|
23
|
+
"core": "./core",
|
|
24
|
+
"docs": "./docs",
|
|
25
|
+
"framework": "./framework",
|
|
26
|
+
"locale": "./locale",
|
|
27
|
+
"server": "./server",
|
|
28
|
+
"test": "./test",
|
|
29
|
+
"watchdog": "./watchdog",
|
|
30
|
+
"web": "./web"
|
|
31
|
+
},
|
|
32
|
+
"bin": {
|
|
33
|
+
"candy": "bin/candy",
|
|
34
|
+
"candypack": "bin/candypack"
|
|
35
|
+
},
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"acme-client": "^5.1.0",
|
|
38
|
+
"axios": "^1.7.9",
|
|
39
|
+
"bcrypt": "^5.1.1",
|
|
40
|
+
"dkim-signer": "^0.2.2",
|
|
41
|
+
"find-process": "^2.0.0",
|
|
42
|
+
"http-proxy": "^1.18.1",
|
|
43
|
+
"mailparser": "^3.7.1",
|
|
44
|
+
"mysql2": "^3.6.5",
|
|
45
|
+
"native-dns": "^0.7.0",
|
|
46
|
+
"node-forge": "^1.3.1",
|
|
47
|
+
"selfsigned": "^2.4.1",
|
|
48
|
+
"smtp-server": "^3.13.4",
|
|
49
|
+
"sqlite3": "^5.1.7",
|
|
50
|
+
"ssh2": "^1.15.0",
|
|
51
|
+
"ws": "^8.18.0"
|
|
52
|
+
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"@eslint/js": "^9.33.0",
|
|
55
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
56
|
+
"@semantic-release/commit-analyzer": "^13.0.1",
|
|
57
|
+
"@semantic-release/git": "^10.0.1",
|
|
58
|
+
"@semantic-release/github": "^11.0.4",
|
|
59
|
+
"@semantic-release/npm": "^12.0.2",
|
|
60
|
+
"@semantic-release/release-notes-generator": "^14.0.3",
|
|
61
|
+
"conventional-changelog-conventionalcommits": "^9.1.0",
|
|
62
|
+
"eslint": "^9.33.0",
|
|
63
|
+
"eslint-config-prettier": "^10.1.8",
|
|
64
|
+
"eslint-plugin-prettier": "^5.5.4",
|
|
65
|
+
"globals": "^16.3.0",
|
|
66
|
+
"husky": "^9.1.7",
|
|
67
|
+
"jest": "^30.0.5",
|
|
68
|
+
"lint-staged": "^16.1.5",
|
|
69
|
+
"prettier": "3.6.2",
|
|
70
|
+
"semantic-release": "^24.2.7"
|
|
71
|
+
},
|
|
72
|
+
"scripts": {
|
|
73
|
+
"lint": "eslint .",
|
|
74
|
+
"lint:fix": "eslint . --fix",
|
|
75
|
+
"prepare": "husky || true",
|
|
76
|
+
"test": "jest --coverage",
|
|
77
|
+
"test:watch": "jest --watch",
|
|
78
|
+
"release": "semantic-release"
|
|
79
|
+
},
|
|
80
|
+
"lint-staged": {
|
|
81
|
+
"*.js": [
|
|
82
|
+
"eslint --fix",
|
|
83
|
+
"prettier --write"
|
|
84
|
+
]
|
|
85
|
+
}
|
|
86
|
+
}
|
package/server/index.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
const net = require('net')
|
|
2
|
+
const nodeCrypto = require('crypto')
|
|
3
|
+
|
|
4
|
+
class Api {
|
|
5
|
+
#commands = {
|
|
6
|
+
auth: (...args) => Candy.server('Hub').auth(...args),
|
|
7
|
+
'mail.create': (...args) => Candy.server('Mail').create(...args),
|
|
8
|
+
'mail.delete': (...args) => Candy.server('Mail').delete(...args),
|
|
9
|
+
'mail.list': (...args) => Candy.server('Mail').list(...args),
|
|
10
|
+
'mail.password': (...args) => Candy.server('Mail').password(...args),
|
|
11
|
+
'mail.send': (...args) => Candy.server('Mail').send(...args),
|
|
12
|
+
'service.start': (...args) => Candy.server('Service').start(...args),
|
|
13
|
+
'service.delete': (...args) => Candy.server('Service').delete(...args),
|
|
14
|
+
'server.stop': () => Candy.server('Server').stop(),
|
|
15
|
+
'ssl.renew': (...args) => Candy.server('SSL').renew(...args),
|
|
16
|
+
'subdomain.create': (...args) => Candy.server('Subdomain').create(...args),
|
|
17
|
+
'subdomain.delete': (...args) => Candy.server('Subdomain').delete(...args),
|
|
18
|
+
'subdomain.list': (...args) => Candy.server('Subdomain').list(...args),
|
|
19
|
+
'web.create': (...args) => Candy.server('Web').create(...args),
|
|
20
|
+
'web.delete': (...args) => Candy.server('Web').delete(...args),
|
|
21
|
+
'web.list': (...args) => Candy.server('Web').list(...args)
|
|
22
|
+
}
|
|
23
|
+
#connections = {}
|
|
24
|
+
|
|
25
|
+
init() {
|
|
26
|
+
if (!Candy.core('Config').config.api) Candy.core('Config').config.api = {}
|
|
27
|
+
// Regenerate auth token every start
|
|
28
|
+
Candy.core('Config').config.api.auth = nodeCrypto.randomBytes(32).toString('hex')
|
|
29
|
+
|
|
30
|
+
const server = net.createServer()
|
|
31
|
+
|
|
32
|
+
server.on('connection', socket => {
|
|
33
|
+
// Only allow localhost
|
|
34
|
+
if (socket.remoteAddress !== '::ffff:127.0.0.1' && socket.remoteAddress !== '127.0.0.1') {
|
|
35
|
+
socket.destroy()
|
|
36
|
+
return
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
let id = Math.random().toString(36).substring(7)
|
|
40
|
+
|
|
41
|
+
this.#connections[id] = socket
|
|
42
|
+
|
|
43
|
+
socket.on('data', async raw => {
|
|
44
|
+
let payload
|
|
45
|
+
try {
|
|
46
|
+
payload = JSON.parse(raw.toString())
|
|
47
|
+
} catch {
|
|
48
|
+
return socket.write(JSON.stringify(this.result(false, 'invalid_json')))
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const {auth, action, data} = payload || {}
|
|
52
|
+
if (!auth || auth !== Candy.core('Config').config.api.auth) {
|
|
53
|
+
return socket.write(JSON.stringify({id, ...this.result(false, 'unauthorized')}))
|
|
54
|
+
}
|
|
55
|
+
if (!action || !this.#commands[action]) {
|
|
56
|
+
return socket.write(JSON.stringify({id, ...this.result(false, 'unknown_action')}))
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
const result = await this.#commands[action](...(data ?? []), (process, status, message) => {
|
|
60
|
+
this.send(id, process, status, message)
|
|
61
|
+
})
|
|
62
|
+
socket.write(JSON.stringify({id, ...result}))
|
|
63
|
+
socket.destroy()
|
|
64
|
+
} catch (err) {
|
|
65
|
+
socket.write(JSON.stringify({id, ...this.result(false, err.message || 'error')}))
|
|
66
|
+
socket.destroy()
|
|
67
|
+
}
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
socket.on('close', () => {
|
|
71
|
+
delete this.#connections[id]
|
|
72
|
+
})
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
server.listen(1453)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
send(id, process, status, message) {
|
|
79
|
+
if (!this.#connections[id]) return
|
|
80
|
+
return this.#connections[id].write(JSON.stringify({process, status, message}) + '\r\n')
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
result(result, message) {
|
|
84
|
+
return {result, message}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
module.exports = new Api()
|