fkg 1.1.3 → 1.1.5

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/README.md ADDED
@@ -0,0 +1,71 @@
1
+ ## FKG
2
+ ===================================
3
+
4
+ [![NPM version][npm-v-2]][npm-url]
5
+ [![NPM Install Size][size]][size-url]
6
+ [![NPM Downloads][download]][download-url]
7
+ [![NPM License][license]][license-url]
8
+
9
+ ### FKG Introduction...
10
+ ===================================
11
+
12
+ **Installing FKG**
13
+
14
+ ```shell
15
+ $ npm install fkg -g
16
+ ```
17
+
18
+ **Initialize service**
19
+
20
+ ```shell
21
+ $ cd E:\fkgdb
22
+ $ fkg init
23
+ The security code must consist of no less than 8 strings
24
+ ecurity code :12345678
25
+ Confirm code :12345678
26
+ ```
27
+
28
+
29
+ ```shell
30
+ $ fkg user add
31
+ Enter security code:12345678
32
+ Account Name:admin
33
+ Account Password:admin
34
+ ```
35
+
36
+ ```shell
37
+ $ fkg user edit
38
+ Enter security code:12345678
39
+ Enter account name:admin
40
+ admin:(Allow login)
41
+ Modify login status (1 allows or 0 prohibits):1
42
+ ```
43
+
44
+ ```shell
45
+ $ fkg user dele
46
+ Enter security code:88888888
47
+ Enter account name:admin
48
+ Confirm deletion (yes or no):yes
49
+ ```
50
+
51
+ ```shell
52
+ $ fkg login
53
+ Account Name:admin
54
+ Account Password:admin
55
+ ```
56
+
57
+ ```shell
58
+ $ fkg server 3308 127.0.0.1
59
+ ```
60
+
61
+
62
+
63
+ [npm-v-1]: https://badgen.net/npm/v/fkg
64
+ [npm-v-2]: https://img.shields.io/npm/v/fkg
65
+ [npm-url]: https://www.npmjs.com/package/fkg
66
+ [size]: https://badgen.net/packagephobia/install/fkg
67
+ [size-url]: https://packagephobia.com/result?p=fkg
68
+ [download]: https://badgen.net/npm/dt/fkg
69
+ [download-url]: https://npmcharts.com/compare/fkg?minimal=true
70
+ [license]:https://badgen.net/npm/license/fkg
71
+ [license-url]:https://npmmirror.com/package/fkg/files/LICENSE
@@ -1 +1 @@
1
- ["init","user","run"]
1
+ ["init","user","login","server"]
package/lib/order/init.js CHANGED
@@ -9,7 +9,7 @@ module.exports = async(arg)=>{
9
9
  const list = await dbDir.list();
10
10
  if(list.length===0){
11
11
  // Initialization started
12
- logs.g('The security code must consist of no less than 8 strings');
12
+ logs.g('Security code>=8characters');
13
13
  const input = require('../utils/input')
14
14
  const arr = await input('ecurity code :','Confirm code :');
15
15
  if(arr.length===2){
@@ -49,4 +49,4 @@ module.exports = async(arg)=>{
49
49
  }else{
50
50
  logs.r('Directory does not exist');
51
51
  }
52
- }
52
+ }
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+ const {md5} = require('rrid');
3
+ const oss = require('oss-sdk');
4
+ const logs = require('../utils/logs');
5
+ const input = require('../utils/input');
6
+ module.exports = async(arg)=>{
7
+ // Add administrator
8
+ const user = await input('Account Name:','Account Password:');
9
+ if(!user[0]||!user[1]){
10
+ logs.g('Account password cannot be empty');
11
+ }else{
12
+ const file = oss.file(process.cwd());
13
+ const name = md5(user[0]);
14
+ let data = await file.get('account/'+name);
15
+ if(data){
16
+ try{
17
+ data = JSON.parse(data);
18
+ }catch(err){
19
+ logs.r(err);
20
+ return;
21
+ }
22
+ const key = md5(data.addTime+user[0]+user[1]+data.addTime);
23
+ if(data.key===key){
24
+ if(data.code==1){
25
+ logs.g('Login successful');
26
+ }else{
27
+ logs.r('Login prohibited');
28
+ }
29
+ }else{
30
+ logs.r('Login failed!');
31
+ }
32
+ }else{
33
+ logs.r('Account does not exist');
34
+ }
35
+ }
36
+ }
@@ -0,0 +1,9 @@
1
+ 'use strict';
2
+ const net = require('net');
3
+ module.exports = async(arg)=>{
4
+ const port = arg[0]>0?arg[0]:3308;
5
+ const host = arg[1]?arg[1]:'127.0.0.1';
6
+ const server = net.createServer();
7
+ const clients = new Map(); // 存储在线客户端:key=clientId,value=socket实例
8
+
9
+ }
@@ -0,0 +1,145 @@
1
+ const net = require('net');
2
+ class TCPServer {
3
+ constructor() {
4
+ // 合并默认配置与自定义配置
5
+ this.config = {
6
+ ...serverConfig,
7
+ ...customConfig
8
+ };
9
+ // 创建TCP服务实例
10
+ this.server = net.createServer();
11
+ // 存储在线客户端(key: clientId, value: socket)
12
+ this.clients = new Map();
13
+ this.clientIdCounter = 0; // 客户端唯一ID计数器
14
+
15
+ // 绑定事件(核心通信逻辑)
16
+ this.bindEvents();
17
+ }
18
+
19
+ /**
20
+ * 绑定所有核心事件
21
+ */
22
+ bindEvents() {
23
+ // 1. 新客户端连接事件
24
+ this.server.on('connection', (socket) => this.handleConnection(socket));
25
+ // 2. 服务端启动错误事件
26
+ this.server.on('error', (err) => this.handleServerError(err));
27
+ // 3. 进程退出事件(优雅关闭)
28
+ process.on('SIGINT', () => this.gracefulShutdown());
29
+ }
30
+
31
+ /**
32
+ * 处理新客户端连接
33
+ * @param {net.Socket} socket 客户端Socket实例
34
+ */
35
+ handleConnection(socket) {
36
+ // 生成客户端唯一ID
37
+ const clientId = ++this.clientIdCounter;
38
+ const clientAddr = `${socket.remoteAddress}:${socket.remotePort}`;
39
+
40
+ // 存储客户端Socket
41
+ this.clients.set(clientId, socket);
42
+ console.log(`✅ [客户端${clientId}] ${clientAddr} 接入,当前在线:${this.clients.size}`);
43
+
44
+ // 客户端连接配置
45
+ socket.setTimeout(this.config.timeout);
46
+ socket.write(`欢迎连接TCP服务端(ID:${clientId}),请输入指令\n`);
47
+
48
+ // 缓存未完整接收的消息(解决分片/粘包)
49
+ let buffer = '';
50
+
51
+ // 绑定客户端Socket事件
52
+ socket.on('data', (data) => {
53
+ // 拼接缓存,解决分片问题
54
+ buffer += data.toString();
55
+ // 按结束符分割完整指令
56
+ const cmdList = buffer.split(this.config.commandEndChar);
57
+ // 最后一个元素可能是未完整接收的消息,重新缓存
58
+ buffer = cmdList.pop() || '';
59
+
60
+ // 遍历处理每一条完整指令
61
+ cmdList.forEach((cmdStr) => {
62
+ cmdStr = cmdStr.trim();
63
+ if (cmdStr) {
64
+ console.log(`📥 [客户端${clientId}] 接收指令:${cmdStr}`);
65
+ // 路由到业务逻辑
66
+ commandRouter.route(socket, cmdStr);
67
+ }
68
+ });
69
+ });
70
+
71
+ // 客户端断开连接
72
+ socket.on('end', () => {
73
+ this.clients.delete(clientId);
74
+ console.log(`❌ [客户端${clientId}] ${clientAddr} 断开,当前在线:${this.clients.size}`);
75
+ });
76
+
77
+ // 客户端连接超时
78
+ socket.on('timeout', () => {
79
+ console.log(`⏰ [客户端${clientId}] ${clientAddr} 连接超时`);
80
+ socket.end('连接超时,已断开\n');
81
+ this.clients.delete(clientId);
82
+ });
83
+
84
+ // 客户端连接错误
85
+ socket.on('error', (err) => {
86
+ console.error(`⚠️ [客户端${clientId}] ${clientAddr} 错误:${err.message}`);
87
+ this.clients.delete(clientId);
88
+ });
89
+ }
90
+
91
+ /**
92
+ * 处理服务端启动错误
93
+ * @param {Error} err 错误对象
94
+ */
95
+ handleServerError(err) {
96
+ if (err.code === 'EADDRINUSE') {
97
+ console.error(`❌ 端口${this.config.port}已被占用,请更换端口`);
98
+ } else {
99
+ console.error(`❌ 服务端错误:${err.message}`);
100
+ }
101
+ process.exit(1);
102
+ }
103
+
104
+ /**
105
+ * 优雅关闭服务端
106
+ */
107
+ gracefulShutdown() {
108
+ console.log('\n🛑 正在关闭TCP服务端...');
109
+ // 断开所有客户端连接
110
+ this.clients.forEach((socket, clientId) => {
111
+ socket.end('服务端即将关闭,连接断开\n');
112
+ socket.destroy();
113
+ });
114
+ // 关闭服务端监听
115
+ this.server.close(() => {
116
+ console.log('✅ TCP服务端已优雅关闭');
117
+ process.exit(0);
118
+ });
119
+ }
120
+
121
+ /**
122
+ * 启动服务端(对外暴露的核心API)
123
+ */
124
+ start() {
125
+ this.server.listen(this.config.port, this.config.host, () => {
126
+ console.log(`🚀 TCP服务端已启动:${this.config.host}:${this.config.port}`);
127
+ console.log(`📌 连接超时时间:${this.config.timeout / 1000 / 60}分钟`);
128
+ });
129
+ }
130
+
131
+ /**
132
+ * 广播消息给所有在线客户端(扩展API)
133
+ * @param {string} msg 广播消息
134
+ * @param {number} excludeClientId 排除的客户端ID(避免给自己广播)
135
+ */
136
+ broadcast(msg, excludeClientId = 0) {
137
+ this.clients.forEach((socket, clientId) => {
138
+ if (clientId !== excludeClientId && !socket.destroyed) {
139
+ socket.write(`[广播] ${msg}\n`);
140
+ }
141
+ });
142
+ }
143
+ }
144
+
145
+ module.exports = TCPServer;
@@ -0,0 +1,37 @@
1
+ 'use strict';
2
+ const {md5} = require('rrid');
3
+ const oss = require('oss-sdk');
4
+ const logs = require('../../utils/logs');
5
+ const input = require('../../utils/input');
6
+ module.exports = async(arg)=>{
7
+ // Add administrator
8
+ const user = await input('Account Name:','Account Password:');
9
+ if(!user[0]||!user[1]){
10
+ logs.g('Account password cannot be empty');
11
+ }else{
12
+ const dirs = oss.dir(process.cwd());
13
+ if(await dirs.ok('account')){
14
+ const files = oss.file(process.cwd());
15
+ const name = md5(user[0]);
16
+ if(await files.ok('account/'+name)){
17
+ logs.r('The account already exists');
18
+ }else{
19
+ const info = {};
20
+ info.code = 1;
21
+ info.addTime = Date.now();
22
+ info.key = md5(info.addTime+user[0]+user[1]+info.addTime);
23
+ const dirRes = await dirs.add('database/'+name);
24
+ const fileRes = await files.add('account/'+name,JSON.stringify(info));
25
+ if(dirRes&&fileRes){
26
+ logs.g('Added successfully');
27
+ logs.y('Please remember your account password');
28
+ }else{
29
+ logs.r('Failed to add');
30
+ logs.r('Unknown error');
31
+ }
32
+ }
33
+ }else{
34
+ logs.r('Important folder lost');
35
+ }
36
+ }
37
+ }
@@ -0,0 +1,41 @@
1
+ 'use strict';
2
+ const {md5} = require('rrid');
3
+ const oss = require('oss-sdk');
4
+ const logs = require("../../utils/logs");
5
+ const input = require('../../utils/input');
6
+ module.exports = async()=>{
7
+ const dir = oss.dir(process.cwd());
8
+ const list = await dir.list('account');
9
+ if(list&&list.length>0){
10
+ const res = await input('Enter account name:');
11
+ if(res[0]){
12
+ // Verify account
13
+ const name = md5(res[0]);
14
+ const file = oss.file(process.cwd());
15
+ let ok = await file.ok('account/'+name);
16
+ const ress = await input('Confirm deletion (yes or no):');
17
+ if(ress[0]==='yes'){
18
+ // Does the database exist
19
+ const lists = await dir.list('database/'+name);
20
+ if(lists&&lists.length>0){
21
+ logs.r('Delete the database of this account first');
22
+ }else{
23
+ const dele = await dir.dele('database/'+name);
24
+ const deles = await file.dele('account/'+name);
25
+ if(dele&&deles){
26
+ logs.g('Deleted successfully')
27
+ }else{
28
+ logs.r('Deletion failed')
29
+ }
30
+ }
31
+ }else{
32
+ logs.g('Choose not to delete')
33
+ }
34
+ }else{
35
+ logs.r('Account name cannot be empty');
36
+ }
37
+ }else{
38
+ logs.r('No account exists');
39
+ logs.y('Please add an account');
40
+ }
41
+ }
@@ -0,0 +1,54 @@
1
+ 'use strict';
2
+ const {md5} = require('rrid');
3
+ const oss = require('oss-sdk');
4
+ const logs = require('../../utils/logs');
5
+ const input = require('../../utils/input');
6
+ module.exports = async()=>{
7
+ const dir = oss.dir(process.cwd());
8
+ const list = await dir.list('account');
9
+ if(list&&list.length>0){
10
+ const res = await input('Enter account name:');
11
+ if(res[0]){
12
+ // Verify account
13
+ const name = 'account/'+md5(res[0]);
14
+ const file = oss.file(process.cwd());
15
+ let data = await file.get(name);
16
+ if(data){
17
+ try{
18
+ data = JSON.parse(data);
19
+ if(data.code==1){
20
+ logs.g(res[0]+':(Allow login)');
21
+ }else{
22
+ logs.r(res[0]+':(Login prohibited)');
23
+ }
24
+ const status = await input('Modify login status (1 allows or 0 prohibits):');
25
+ if(data.code==status[0]) {
26
+ logs.g('Modified successfully');
27
+ }else{
28
+ if(status[0]=='0'||status[0]=='1'){
29
+ data.code = status[0];
30
+ data = JSON.stringify(data);
31
+ const edit = await file.edit(name,data);
32
+ if(edit){
33
+ logs.g('Modified successfully');
34
+ }else{
35
+ logs.r('Modification failed');
36
+ }
37
+ }else{
38
+ logs.r('Invalid input:'+status[0]);
39
+ }
40
+ }
41
+ }catch(err){
42
+ logs.r(err);
43
+ }
44
+ }else{
45
+ logs.r('The account does not exist');
46
+ }
47
+ }else{
48
+ logs.r('Account name cannot be empty');
49
+ }
50
+ }else{
51
+ logs.r('No account exists');
52
+ logs.y('Please add an account');
53
+ }
54
+ }
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+ const scode = require('./scode')
3
+ const logs = require('../../utils/logs');
4
+ module.exports = async(arg)=>{
5
+ if(arg[0]===undefined) {
6
+ logs.r('Please enter parameters');
7
+ return;
8
+ }
9
+ const list = ['add','edit','dele'];
10
+ if(list.includes(arg[0])){
11
+ const code = await scode(arg.slice(1));
12
+ if(code) require('./'+arg[0])(arg.slice(1));
13
+ }else{
14
+ logs.r('Wrong parameter');
15
+ }
16
+ }
@@ -0,0 +1,44 @@
1
+ 'use strict';
2
+ const {md5} = require('rrid');
3
+ const oss = require('oss-sdk');
4
+ const logs = require('../../utils/logs');
5
+ const input = require('../../utils/input');
6
+ module.exports = async (arg) => {
7
+ let code;
8
+ if (arg[0]) {
9
+ code = arg[0];
10
+ } else {
11
+ const arr = await input('Enter security code:');
12
+ if (arr.length === 0) {
13
+ logs.r('Unknown error');
14
+ return false;
15
+ } else {
16
+ code = arr[0];
17
+ }
18
+ }
19
+ const file = oss.file(process.cwd());
20
+ let data = await file.get('config');
21
+ if (data === null) {
22
+ logs.r('Configuration file missing');
23
+ return false;
24
+ } else {
25
+ try {
26
+ data = JSON.parse(data);
27
+ } catch (err) {
28
+ logs.r(err);
29
+ return false;
30
+ }
31
+ if (!data.addTime || !data.key) {
32
+ logs.r('bad configuration file');
33
+ return false;
34
+ } else {
35
+ const keys = md5(data.addTime+code+data.addTime);
36
+ if (keys === data.key) {
37
+ return true;
38
+ } else {
39
+ logs.r('Wrong security code');
40
+ return false;
41
+ }
42
+ }
43
+ }
44
+ }
@@ -14,7 +14,7 @@ module.exports = (...arg) => {
14
14
  return new Promise((resolves) => {
15
15
  ps.question('\033[33m'+text, (answer) => {
16
16
  console.log('\033[0m');
17
- resolves(answer);
17
+ resolves(answer.trim());
18
18
  });
19
19
  });
20
20
  }
@@ -1,4 +1,4 @@
1
1
  'use strict';
2
2
  module.exports = {
3
- console.log('100');
4
- };
3
+
4
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fkg",
3
- "version": "1.1.3",
3
+ "version": "1.1.5",
4
4
  "description": "Read and set memory key!",
5
5
  "main": "lib/index.js",
6
6
  "bin": {
@@ -16,9 +16,6 @@
16
16
  ],
17
17
  "author": "weduu",
18
18
  "license": "MIT",
19
- "engines": {
20
- "node": ">=v22.22.1"
21
- },
22
19
  "files": [
23
20
  "lib/",
24
21
  "bin/",
@@ -26,7 +23,7 @@
26
23
  "README.md"
27
24
  ],
28
25
  "dependencies": {
29
- "oss-sdk": "^1.0.3",
30
- "rrid": "^1.0.6"
26
+ "oss-sdk": "^1.0.5",
27
+ "rrid": "^1.0.7"
31
28
  }
32
29
  }
package/lib/order/add.js DELETED
@@ -1,67 +0,0 @@
1
- 'use strict';
2
- const {md5} = require('rrid');
3
- const oss = require('oss-sdk');
4
- const logs = require('../utils/logs');
5
- const input = require('../utils/input');
6
- module.exports = async(arg)=>{
7
- let code;
8
- if(arg[0]) {
9
- code = arg[0];
10
- }else{
11
- const arr = await input('Enter security code:');
12
- if(arr.length===0){
13
- logs.r('Unknown error');
14
- return;
15
- }else{
16
- code = arr[0];
17
- }
18
- }
19
- const file = oss.file(process.cwd());
20
- let data = await file.get('config');
21
- if(data===null){
22
- logs.r('Configuration file missing')
23
- }else{
24
- try{
25
- data = JSON.parse(data);
26
- }catch(err){
27
- logs.r(err);
28
- return;
29
- }
30
- if(!data.addTime||!data.key) {
31
- logs.r('bad configuration file')
32
- }else{
33
- try{
34
- const keys = md5(data.addTime+code+data.addTime);
35
- if(keys===data.key){
36
- // Add administrator
37
- const user = await input('Account Name:','Account Password:');
38
- if(!user[0]||!user[1]){
39
- logs.g('Account password cannot be empty');
40
- }else{
41
- const dirs = oss.dir(process.cwd());
42
- if(await dirs.ok('account')){
43
- const info = {};
44
- info.database = [];
45
- info.addTime = Date.now();
46
- data.key = md5(info.addTime+user[0]+user[1]+data.addTime);
47
- const addRes = await file.add('account/'+md5(user[0]),JSON.stringify(info));
48
- if(addRes){
49
- logs.g('Added successfully');
50
- logs.y('Please remember your account password');
51
- }else{
52
- logs.r('Failed to add');
53
- logs.r('Unknown error');
54
- }
55
- }else{
56
- logs.r('Important folder lost');
57
- }
58
- }
59
- }else{
60
- logs.r('Wrong security code');
61
- }
62
- }catch(err){
63
- logs.r(err);
64
- }
65
- }
66
- }
67
- }
package/lib/order/user.js DELETED
@@ -1,15 +0,0 @@
1
- 'use strict';
2
- const logs = require('../utils/logs');
3
- module.exports = (arg)=>{
4
- if(arg[0]===undefined) {
5
- logs.r('Please enter parameters');
6
- }else if(arg[0]==='add'){
7
- //Add Account
8
- require('./add')(arg.slice(1))
9
- }else if(arg[0]==='dele') {
10
- //Dele Account
11
- }else if(arg[0]==='edit') {
12
- //Edit Account
13
-
14
- }
15
- }