fdb2 1.0.4 → 1.0.6
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/bin/fdb2.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
const { exec, spawn, execSync, spawnSync } = require('child_process');
|
|
4
4
|
const path = require('path');
|
|
5
5
|
const fs = require('fs');
|
|
6
|
+
const net = require('net');
|
|
6
7
|
|
|
7
8
|
// 项目根目录
|
|
8
9
|
const projectRoot = path.resolve(__dirname, '..');
|
|
@@ -28,12 +29,52 @@ switch (command) {
|
|
|
28
29
|
break;
|
|
29
30
|
}
|
|
30
31
|
|
|
32
|
+
// 检查端口是否可用
|
|
33
|
+
function isPortAvailable(port) {
|
|
34
|
+
return new Promise((resolve) => {
|
|
35
|
+
const server = net.createServer();
|
|
36
|
+
|
|
37
|
+
server.once('error', (err) => {
|
|
38
|
+
if (err.code === 'EADDRINUSE') {
|
|
39
|
+
resolve(false);
|
|
40
|
+
} else {
|
|
41
|
+
resolve(false);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
server.once('listening', () => {
|
|
46
|
+
server.close();
|
|
47
|
+
resolve(true);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
server.listen(port);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// 查找可用端口
|
|
55
|
+
async function findAvailablePort(startPort) {
|
|
56
|
+
let port = startPort;
|
|
57
|
+
let attempts = 0;
|
|
58
|
+
const maxAttempts = 100;
|
|
59
|
+
|
|
60
|
+
while (attempts < maxAttempts) {
|
|
61
|
+
const available = await isPortAvailable(port);
|
|
62
|
+
if (available) {
|
|
63
|
+
return port;
|
|
64
|
+
}
|
|
65
|
+
attempts++;
|
|
66
|
+
port++;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
throw new Error(`无法找到可用端口,已尝试 ${maxAttempts} 次`);
|
|
70
|
+
}
|
|
71
|
+
|
|
31
72
|
// 启动项目
|
|
32
|
-
function startProject() {
|
|
73
|
+
async function startProject() {
|
|
33
74
|
console.log('Starting FDB2 project...');
|
|
34
75
|
|
|
35
76
|
// 检查 PID 文件是否存在,如果存在则说明服务器已经在运行
|
|
36
|
-
const pidFilePath = path.join(projectRoot, 'server.pid');
|
|
77
|
+
const pidFilePath = path.join(projectRoot, 'fdb2.server.pid');
|
|
37
78
|
if (fs.existsSync(pidFilePath)) {
|
|
38
79
|
try {
|
|
39
80
|
const pid = parseInt(fs.readFileSync(pidFilePath, 'utf8'));
|
|
@@ -55,6 +96,18 @@ function startProject() {
|
|
|
55
96
|
port = parseInt(commandArgs[portIndex + 1]);
|
|
56
97
|
}
|
|
57
98
|
|
|
99
|
+
// 查找可用端口
|
|
100
|
+
console.log(`Checking port ${port} availability...`);
|
|
101
|
+
try {
|
|
102
|
+
port = await findAvailablePort(port);
|
|
103
|
+
if (port !== parseInt(commandArgs[portIndex + 1] || 9800)) {
|
|
104
|
+
console.log(`Port ${commandArgs[portIndex + 1] || 9800} is in use, using port ${port} instead`);
|
|
105
|
+
}
|
|
106
|
+
} catch (error) {
|
|
107
|
+
console.error('Error:', error.message);
|
|
108
|
+
process.exit(1);
|
|
109
|
+
}
|
|
110
|
+
|
|
58
111
|
// 命令和参数
|
|
59
112
|
let cmd, args;
|
|
60
113
|
|
|
@@ -95,7 +148,7 @@ function stopProject() {
|
|
|
95
148
|
console.log('Stopping FDB2 project...');
|
|
96
149
|
|
|
97
150
|
// 读取 PID 文件
|
|
98
|
-
const pidFilePath = path.join(projectRoot, 'server.pid');
|
|
151
|
+
const pidFilePath = path.join(projectRoot, 'fdb2.server.pid');
|
|
99
152
|
|
|
100
153
|
if (!fs.existsSync(pidFilePath)) {
|
|
101
154
|
console.log('No server process found (PID file not exists)');
|
|
@@ -143,7 +196,7 @@ function restartProject() {
|
|
|
143
196
|
console.log('Waiting for server process to stop...');
|
|
144
197
|
for (let i = 0; i < 10; i++) {
|
|
145
198
|
// 检查 PID 文件是否存在
|
|
146
|
-
const pidFilePath = path.join(projectRoot, 'server.pid');
|
|
199
|
+
const pidFilePath = path.join(projectRoot, 'fdb2.server.pid');
|
|
147
200
|
if (!fs.existsSync(pidFilePath)) {
|
|
148
201
|
break;
|
|
149
202
|
}
|
|
@@ -53,7 +53,7 @@ class ConnectionService {
|
|
|
53
53
|
*/
|
|
54
54
|
activeConnections = new Map();
|
|
55
55
|
constructor() {
|
|
56
|
-
const dataDir = process.env.DB_TOOL_DATA_DIR || path.join(os.homedir(), '.
|
|
56
|
+
const dataDir = process.env.DB_TOOL_DATA_DIR || path.join(os.homedir(), '.fdb2');
|
|
57
57
|
this.configPath = path.join(dataDir, 'connections.json');
|
|
58
58
|
}
|
|
59
59
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.service.js","sourceRoot":"","sources":["../../../server/service/connection.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAEzB,qCAA6D;AAE7D;;;GAGG;AACH,MAAa,iBAAiB;IAE5B;;;OAGG;IACc,UAAU,CAAS;IAEpC;;OAEG;IACK,iBAAiB,GAA4B,IAAI,GAAG,EAAE,CAAC;IAE/D;QACE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"connection.service.js","sourceRoot":"","sources":["../../../server/service/connection.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAEzB,qCAA6D;AAE7D;;;GAGG;AACH,MAAa,iBAAiB;IAE5B;;;OAGG;IACc,UAAU,CAAS;IAEpC;;OAEG;IACK,iBAAiB,GAA4B,IAAI,GAAG,EAAE,CAAC;IAE/D;QACE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;QACjF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB;QACrB,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpC,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACtD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAuB,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAClC,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,EAAU;QAChC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACnD,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,UAA4B;QAC9C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEnD,WAAW;QACX,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QAED,aAAa;QACb,UAAU,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,UAAU,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAClC,UAAU,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAClC,UAAU,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAElF,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7B,MAAM,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAExC,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,EAAU,EAAE,OAAkC;QACnE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAE5D,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QAED,SAAS;QACT,IAAI,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,IAAI,GAAG,KAAK,KAAK,CAAC,EAAE,CAAC;YACjG,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QACD,aAAa;QACb,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;QAClF,MAAM,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QACxC,aAAa;QACb,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,EAAU;QAC/B,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACnD,MAAM,mBAAmB,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAEvE,IAAI,mBAAmB,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QAED,SAAS;QACT,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;YAChD,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,UAA4B;QAC/C,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YAChC,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;YACtE,MAAM,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACvC,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,EAAU,EAAE,QAAiB;QACrD,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC3C,aAAa;YACb,IAAI,EAAE,EAAE,aAAa,EAAE,CAAC;gBACtB,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,eAAe;gBACf,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAED,oBAAoB;QACpB,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;YACtC,UAAU;YACV,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;YACnE,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC/D,IAAI,CAAC;gBACH,MAAM,gBAAgB,EAAE,OAAO,EAAE,CAAC;YACpC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,SAAS,SAAS,MAAM,EAAE,KAAK,CAAC,CAAC;YACjD,CAAC;YACD,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QAED,sBAAsB;QACtB,MAAM,uBAAuB,GAAqB;YAChD,GAAG,gBAAgB;YACnB,QAAQ,EAAE,QAAQ,IAAI,gBAAgB,CAAC,QAAQ;SAChD,CAAC;QAEF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,uBAAuB,CAAC,CAAC;QAC/E,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAE5C,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,EAAU,EAAE,QAAiB;QACjD,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC;YACjD,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrC,CAAC;QACD,gBAAgB;QAChB,IAAI,QAAQ,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;YAChD,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,wBAAwB,CAAC,YAAoB;QACjD,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvD,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,GAAG,GAAG,CAAC,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;gBAC/D,IAAI,CAAC;oBACH,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;oBAC3B,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACzB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,MAAM,EAAE,KAAK,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;QACD,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB;QACvB,KAAK,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACtD,IAAI,CAAC;gBACH,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;YAC7B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;IACjC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,uBAAuB,CAAC,gBAAkC;QACtE,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;QACnE,OAAO,IAAI,oBAAU,CAAC,iBAAiB,CAAC,CAAC,UAAU,EAAE,CAAC;IACxD,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,gBAAkC;QAC1D,MAAM,WAAW,GAAG;YAClB,IAAI,EAAE,gBAAgB,CAAC,IAAW;YAClC,IAAI,EAAE,gBAAgB,CAAC,IAAI;YAC3B,IAAI,EAAE,gBAAgB,CAAC,IAAI;YAC3B,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;YACnC,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;YACnC,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;YACnC,WAAW,EAAE,KAAK;YAClB,OAAO,EAAE,KAAK;YACd,eAAe;YACf,KAAK,EAAE;gBACL,kBAAkB,EAAE,IAAI;aACzB;YACD,GAAG,gBAAgB,CAAC,OAAO;SAC5B,CAAC;QAEF,cAAc;QACd,QAAQ,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YAC5C,KAAK,QAAQ;gBACX,OAAO;oBACL,GAAG,WAAW;oBACd,IAAI,EAAE,QAAe;oBACrB,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;oBACnC,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,SAAS;oBACf,QAAQ,EAAE,SAAS;oBACnB,QAAQ,EAAE,SAAS;iBACpB,CAAC;YACJ,KAAK,UAAU,CAAC;YAChB,KAAK,YAAY;gBACf,OAAO;oBACL,GAAG,WAAW;oBACd,IAAI,EAAE,UAAiB;oBACvB,GAAG,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,IAAI,KAAK;iBAC5C,CAAC;YACJ,KAAK,QAAQ;gBACX,OAAO;oBACL,GAAG,WAAW;oBACd,IAAI,EAAE,QAAe;oBACrB,aAAa,EAAE,GAAG,gBAAgB,CAAC,IAAI,IAAI,gBAAgB,CAAC,IAAI,IAAI,gBAAgB,CAAC,QAAQ,EAAE;oBAC/F,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,SAAS;oBACf,QAAQ,EAAE,SAAS;oBACnB,KAAK,EAAE;wBACL,iBAAiB,EAAE,KAAK;wBACxB,OAAO,EAAE,EAAE;wBACX,OAAO,EAAE,CAAC;wBACV,aAAa,EAAE,CAAC;qBACjB;iBACF,CAAC;YACJ,KAAK,OAAO,CAAC;YACb,KAAK,WAAW;gBACd,OAAO;oBACL,GAAG,WAAW;oBACd,IAAI,EAAE,OAAc;oBACpB,OAAO,EAAE;wBACP,OAAO,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,IAAI,KAAK;wBACnD,sBAAsB,EAAE,IAAI;qBAC7B;oBACD,KAAK,EAAE;wBACL,iBAAiB,EAAE,KAAK;wBACxB,cAAc,EAAE,KAAK;qBACtB;iBACF,CAAC;YACJ;gBACE,OAAO,WAAW,CAAC;QACvB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe,CAAC,WAA+B;QAC3D,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,CAAC;YACD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAClF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAClC,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,UAAU;QAChB,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;CACF;AA1UD,8CA0UC"}
|
|
@@ -22,7 +22,7 @@ export class ConnectionService {
|
|
|
22
22
|
private activeConnections: Map<string, DataSource> = new Map();
|
|
23
23
|
|
|
24
24
|
constructor() {
|
|
25
|
-
const dataDir = process.env.DB_TOOL_DATA_DIR || path.join(os.homedir(), '.
|
|
25
|
+
const dataDir = process.env.DB_TOOL_DATA_DIR || path.join(os.homedir(), '.fdb2');
|
|
26
26
|
this.configPath = path.join(dataDir, 'connections.json');
|
|
27
27
|
}
|
|
28
28
|
|
package/package.json
CHANGED
package/scripts/preinstall.js
CHANGED
|
@@ -1,38 +1,112 @@
|
|
|
1
1
|
const { execSync } = require('child_process');
|
|
2
2
|
const path = require('path');
|
|
3
3
|
const fs = require('fs');
|
|
4
|
+
const os = require('os');
|
|
4
5
|
|
|
5
6
|
console.log('Checking for running fdb2 instances...');
|
|
6
7
|
|
|
7
8
|
try {
|
|
8
|
-
|
|
9
|
-
const pidFilePath = path.join(projectRoot, 'server.pid');
|
|
9
|
+
let pid = null;
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
// 检查当前目录的 PID 文件
|
|
12
|
+
const currentDirPidPath = path.join(process.cwd(), 'fdb2.server.pid');
|
|
13
|
+
if (fs.existsSync(currentDirPidPath)) {
|
|
12
14
|
try {
|
|
13
|
-
|
|
15
|
+
pid = parseInt(fs.readFileSync(currentDirPidPath, 'utf8'));
|
|
14
16
|
process.kill(pid, 0);
|
|
15
17
|
console.log('Found running fdb2 instance with PID:', pid);
|
|
16
|
-
|
|
18
|
+
} catch (error) {
|
|
19
|
+
if (error.code !== 'ESRCH') {
|
|
20
|
+
throw error;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
17
24
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
// 如果没有找到,尝试从全局安装目录查找
|
|
26
|
+
if (!pid) {
|
|
27
|
+
try {
|
|
28
|
+
const globalPath = execSync('npm root -g', { encoding: 'utf8' }).trim();
|
|
29
|
+
const globalPidPath = path.join(globalPath, 'fdb2', 'fdb2.server.pid');
|
|
30
|
+
|
|
31
|
+
if (fs.existsSync(globalPidPath)) {
|
|
32
|
+
try {
|
|
33
|
+
pid = parseInt(fs.readFileSync(globalPidPath, 'utf8'));
|
|
34
|
+
process.kill(pid, 0);
|
|
35
|
+
console.log('Found running fdb2 instance with PID:', pid);
|
|
36
|
+
} catch (error) {
|
|
37
|
+
if (error.code !== 'ESRCH') {
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
26
41
|
}
|
|
27
42
|
} catch (error) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
43
|
+
// 忽略全局路径查找失败
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// 如果找到了运行中的进程,尝试停止它
|
|
48
|
+
if (pid) {
|
|
49
|
+
console.log('Stopping fdb2...');
|
|
50
|
+
|
|
51
|
+
try {
|
|
52
|
+
if (os.platform() === 'win32') {
|
|
53
|
+
// Windows: 使用 taskkill
|
|
54
|
+
execSync(`taskkill /F /PID ${pid}`, { stdio: 'inherit' });
|
|
55
|
+
} else {
|
|
56
|
+
// Unix-like: 使用 kill
|
|
57
|
+
process.kill(pid, 'SIGTERM');
|
|
58
|
+
|
|
59
|
+
// 等待进程结束
|
|
60
|
+
let attempts = 0;
|
|
61
|
+
while (attempts < 10) {
|
|
62
|
+
try {
|
|
63
|
+
process.kill(pid, 0);
|
|
64
|
+
attempts++;
|
|
65
|
+
// 等待 100ms
|
|
66
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 100);
|
|
67
|
+
} catch (error) {
|
|
68
|
+
if (error.code === 'ESRCH') {
|
|
69
|
+
// 进程已结束
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// 如果进程还在运行,强制终止
|
|
76
|
+
try {
|
|
77
|
+
process.kill(pid, 0);
|
|
78
|
+
process.kill(pid, 'SIGKILL');
|
|
79
|
+
} catch (error) {
|
|
80
|
+
if (error.code !== 'ESRCH') {
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
31
84
|
}
|
|
85
|
+
|
|
86
|
+
console.log('fdb2 stopped successfully');
|
|
87
|
+
} catch (stopError) {
|
|
88
|
+
console.warn('Failed to stop fdb2:', stopError.message);
|
|
89
|
+
console.warn('Please manually stop the fdb2 process before installation');
|
|
32
90
|
}
|
|
33
91
|
} else {
|
|
34
92
|
console.log('No running fdb2 instance found');
|
|
35
93
|
}
|
|
94
|
+
|
|
95
|
+
// 清理 PID 文件
|
|
96
|
+
if (fs.existsSync(currentDirPidPath)) {
|
|
97
|
+
fs.unlinkSync(currentDirPidPath);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
try {
|
|
101
|
+
const globalPath = execSync('npm root -g', { encoding: 'utf8' }).trim();
|
|
102
|
+
const globalPidPath = path.join(globalPath, 'fdb2', 'fdb2.server.pid');
|
|
103
|
+
if (fs.existsSync(globalPidPath)) {
|
|
104
|
+
fs.unlinkSync(globalPidPath);
|
|
105
|
+
}
|
|
106
|
+
} catch (error) {
|
|
107
|
+
// 忽略全局路径清理失败
|
|
108
|
+
}
|
|
109
|
+
|
|
36
110
|
} catch (error) {
|
|
37
111
|
console.warn('Pre-install check failed:', error.message);
|
|
38
112
|
}
|
package/server.js
CHANGED
|
@@ -122,7 +122,7 @@ const PORT = portFromArgs || process.env.PORT || 9800;
|
|
|
122
122
|
app.listen(PORT, () => {
|
|
123
123
|
|
|
124
124
|
// 将 PID 写入 PID 文件
|
|
125
|
-
const pidFilePath = path.join(__dirname, 'server.pid');
|
|
125
|
+
const pidFilePath = path.join(__dirname, 'fdb2.server.pid');
|
|
126
126
|
fs.writeFileSync(pidFilePath, process.pid.toString());
|
|
127
127
|
console.log(`PID ${process.pid} written to ${pidFilePath}`);
|
|
128
128
|
|