@dbcube/core 5.2.4 → 5.2.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/dist/index.cjs +144 -73
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +26 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.js +165 -95
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -37,6 +37,7 @@ __export(index_exports, {
|
|
|
37
37
|
DaemonClient: () => DaemonClient,
|
|
38
38
|
DbConfig: () => DbConfig,
|
|
39
39
|
Engine: () => Engine,
|
|
40
|
+
EnvLoader: () => EnvLoader,
|
|
40
41
|
FileLogger: () => FileLogger,
|
|
41
42
|
QueryEngine: () => QueryEngine,
|
|
42
43
|
TableProcessor: () => TableProcessor,
|
|
@@ -46,6 +47,7 @@ module.exports = __toCommonJS(index_exports);
|
|
|
46
47
|
|
|
47
48
|
// src/lib/Engine.ts
|
|
48
49
|
var import_path4 = __toESM(require("path"));
|
|
50
|
+
var fs5 = __toESM(require("fs"));
|
|
49
51
|
|
|
50
52
|
// src/lib/Arquitecture.ts
|
|
51
53
|
var os = __toESM(require("os"));
|
|
@@ -193,7 +195,7 @@ var Downloader = class {
|
|
|
193
195
|
*/
|
|
194
196
|
static async fetchLatestVersion(prefix) {
|
|
195
197
|
const url = this.VERSION_URLS[prefix];
|
|
196
|
-
return new Promise((
|
|
198
|
+
return new Promise((resolve6, reject) => {
|
|
197
199
|
https.get(url, (response) => {
|
|
198
200
|
let data = "";
|
|
199
201
|
response.on("data", (chunk) => {
|
|
@@ -203,7 +205,7 @@ var Downloader = class {
|
|
|
203
205
|
try {
|
|
204
206
|
const versions = JSON.parse(data);
|
|
205
207
|
if (versions && versions.length > 0) {
|
|
206
|
-
|
|
208
|
+
resolve6(versions[0].version);
|
|
207
209
|
} else {
|
|
208
210
|
reject(new Error("No versions found"));
|
|
209
211
|
}
|
|
@@ -412,7 +414,7 @@ var Downloader = class {
|
|
|
412
414
|
if (attempt < maxRetries && (errorMessage.includes("ECONNRESET") || errorMessage.includes("timeout") || errorMessage.includes("ETIMEDOUT") || errorMessage.includes("ENOTFOUND"))) {
|
|
413
415
|
attempt++;
|
|
414
416
|
console.log(`\u{1F504} Retrying ${binary.prefix}-engine (${attempt}/${maxRetries})...`);
|
|
415
|
-
await new Promise((
|
|
417
|
+
await new Promise((resolve6) => setTimeout(resolve6, 1e3 + Math.random() * 1e3));
|
|
416
418
|
} else {
|
|
417
419
|
throw new Error(`Error downloading ${binary.prefix}: ${errorMessage}`);
|
|
418
420
|
}
|
|
@@ -460,12 +462,12 @@ var Downloader = class {
|
|
|
460
462
|
return `[${filledBar}${emptyBar}] ${percentage}`;
|
|
461
463
|
}
|
|
462
464
|
static downloadFileWithProgress(url, outputPath, prefix) {
|
|
463
|
-
return new Promise((
|
|
465
|
+
return new Promise((resolve6, reject) => {
|
|
464
466
|
const request = https.get(url, { timeout: 0 }, (response) => {
|
|
465
467
|
if (response.statusCode === 302 || response.statusCode === 301) {
|
|
466
468
|
const redirectUrl = response.headers.location;
|
|
467
469
|
if (redirectUrl) {
|
|
468
|
-
return this.downloadFileWithProgress(redirectUrl, outputPath, prefix).then(
|
|
470
|
+
return this.downloadFileWithProgress(redirectUrl, outputPath, prefix).then(resolve6).catch(reject);
|
|
469
471
|
}
|
|
470
472
|
}
|
|
471
473
|
if (response.statusCode !== 200) {
|
|
@@ -488,7 +490,7 @@ var Downloader = class {
|
|
|
488
490
|
}
|
|
489
491
|
});
|
|
490
492
|
response.on("end", () => {
|
|
491
|
-
file.end(() =>
|
|
493
|
+
file.end(() => resolve6());
|
|
492
494
|
});
|
|
493
495
|
response.on("error", (err) => {
|
|
494
496
|
file.close();
|
|
@@ -520,7 +522,7 @@ var Downloader = class {
|
|
|
520
522
|
this.mainSpinner.text = `\u{1F4E5} ${import_chalk.default.bold(binary)} - ${progressText}`;
|
|
521
523
|
}
|
|
522
524
|
static extractBinary(zipPath, outputPath, prefix) {
|
|
523
|
-
return new Promise((
|
|
525
|
+
return new Promise((resolve6, reject) => {
|
|
524
526
|
const outDir = path.dirname(outputPath);
|
|
525
527
|
let extracted = 0;
|
|
526
528
|
const pending = [];
|
|
@@ -555,7 +557,7 @@ var Downloader = class {
|
|
|
555
557
|
if (extracted === 0) {
|
|
556
558
|
reject(new Error(`No se encontr\xF3 archivo v\xE1lido en el ZIP para ${prefix}`));
|
|
557
559
|
} else {
|
|
558
|
-
|
|
560
|
+
resolve6();
|
|
559
561
|
}
|
|
560
562
|
}).catch((err) => {
|
|
561
563
|
this.cleanupFile(zipPath);
|
|
@@ -746,6 +748,67 @@ var Config = class {
|
|
|
746
748
|
}
|
|
747
749
|
};
|
|
748
750
|
|
|
751
|
+
// src/lib/EnvLoader.ts
|
|
752
|
+
var fs3 = __toESM(require("fs"));
|
|
753
|
+
var path3 = __toESM(require("path"));
|
|
754
|
+
var EnvLoader = class _EnvLoader {
|
|
755
|
+
/**
|
|
756
|
+
* Carga el archivo .env indicado (o ./.env del cwd) en process.env.
|
|
757
|
+
* Silencioso si el archivo no existe. Devuelve true si cargó algo.
|
|
758
|
+
*/
|
|
759
|
+
static load(envPath) {
|
|
760
|
+
const file = envPath || path3.resolve(process.cwd(), ".env");
|
|
761
|
+
if (!fs3.existsSync(file)) return false;
|
|
762
|
+
const proc = process;
|
|
763
|
+
if (typeof proc.loadEnvFile === "function") {
|
|
764
|
+
try {
|
|
765
|
+
proc.loadEnvFile(file);
|
|
766
|
+
return true;
|
|
767
|
+
} catch {
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
try {
|
|
771
|
+
const parsed = _EnvLoader.parse(fs3.readFileSync(file, "utf8"));
|
|
772
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
773
|
+
if (process.env[key] === void 0) {
|
|
774
|
+
process.env[key] = value;
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
return true;
|
|
778
|
+
} catch {
|
|
779
|
+
return false;
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
/**
|
|
783
|
+
* Parser mínimo de formato .env. Soporta:
|
|
784
|
+
* KEY=value · KEY="value con espacios" · KEY='literal' · export KEY=value
|
|
785
|
+
* comentarios con # · líneas en blanco · \n \t en comillas dobles.
|
|
786
|
+
*/
|
|
787
|
+
static parse(content) {
|
|
788
|
+
const out = {};
|
|
789
|
+
for (const rawLine of content.split(/\r?\n/)) {
|
|
790
|
+
const line = rawLine.trim();
|
|
791
|
+
if (!line || line.startsWith("#")) continue;
|
|
792
|
+
const withoutExport = line.startsWith("export ") ? line.slice(7).trim() : line;
|
|
793
|
+
const eq = withoutExport.indexOf("=");
|
|
794
|
+
if (eq === -1) continue;
|
|
795
|
+
const key = withoutExport.slice(0, eq).trim();
|
|
796
|
+
if (!key) continue;
|
|
797
|
+
let value = withoutExport.slice(eq + 1).trim();
|
|
798
|
+
if (value.length >= 2 && value[0] === '"' && value[value.length - 1] === '"') {
|
|
799
|
+
value = value.slice(1, -1).replace(/\\n/g, "\n").replace(/\\t/g, " ").replace(/\\"/g, '"');
|
|
800
|
+
} else if (value.length >= 2 && value[0] === "'" && value[value.length - 1] === "'") {
|
|
801
|
+
value = value.slice(1, -1);
|
|
802
|
+
} else {
|
|
803
|
+
const hash = value.indexOf(" #");
|
|
804
|
+
if (hash !== -1) value = value.slice(0, hash).trim();
|
|
805
|
+
}
|
|
806
|
+
out[key] = value;
|
|
807
|
+
}
|
|
808
|
+
return out;
|
|
809
|
+
}
|
|
810
|
+
};
|
|
811
|
+
|
|
749
812
|
// src/lib/Engine.ts
|
|
750
813
|
var import_child_process2 = require("child_process");
|
|
751
814
|
var import_module = require("module");
|
|
@@ -875,22 +938,22 @@ var DaemonClient = class _DaemonClient {
|
|
|
875
938
|
child.unref();
|
|
876
939
|
}
|
|
877
940
|
tryConnect(port) {
|
|
878
|
-
return new Promise((
|
|
941
|
+
return new Promise((resolve6) => {
|
|
879
942
|
const socket = import_net.default.createConnection({ host: "127.0.0.1", port }, async () => {
|
|
880
943
|
socket.setNoDelay(true);
|
|
881
944
|
this.attach(socket);
|
|
882
945
|
try {
|
|
883
946
|
const pong = await this.send({ action: "ping" }, 2e3);
|
|
884
|
-
|
|
947
|
+
resolve6(pong.status === 200);
|
|
885
948
|
} catch {
|
|
886
949
|
this.detach();
|
|
887
|
-
|
|
950
|
+
resolve6(false);
|
|
888
951
|
}
|
|
889
952
|
});
|
|
890
|
-
socket.once("error", () =>
|
|
953
|
+
socket.once("error", () => resolve6(false));
|
|
891
954
|
socket.setTimeout(3e3, () => {
|
|
892
955
|
socket.destroy();
|
|
893
|
-
|
|
956
|
+
resolve6(false);
|
|
894
957
|
});
|
|
895
958
|
});
|
|
896
959
|
}
|
|
@@ -938,7 +1001,7 @@ var DaemonClient = class _DaemonClient {
|
|
|
938
1001
|
* single socket, so pending requests resolve in send order.
|
|
939
1002
|
*/
|
|
940
1003
|
send(payload, timeoutMs) {
|
|
941
|
-
return new Promise((
|
|
1004
|
+
return new Promise((resolve6, reject) => {
|
|
942
1005
|
if (!this.socket || this.socket.destroyed) {
|
|
943
1006
|
reject(new Error("Daemon not connected"));
|
|
944
1007
|
return;
|
|
@@ -949,7 +1012,7 @@ var DaemonClient = class _DaemonClient {
|
|
|
949
1012
|
reject(new Error("Daemon request timeout"));
|
|
950
1013
|
this.detach();
|
|
951
1014
|
}, timeoutMs ?? this.requestTimeout);
|
|
952
|
-
this.pending.push({ resolve:
|
|
1015
|
+
this.pending.push({ resolve: resolve6, reject, timer });
|
|
953
1016
|
this.socket.write(JSON.stringify(payload) + "\n");
|
|
954
1017
|
});
|
|
955
1018
|
}
|
|
@@ -1083,6 +1146,7 @@ var Engine = class {
|
|
|
1083
1146
|
}
|
|
1084
1147
|
setArguments() {
|
|
1085
1148
|
let args = [];
|
|
1149
|
+
const motor = this.config.type === "postgres" ? "postgresql" : this.config.type;
|
|
1086
1150
|
if (this.config.type == "sqlite") {
|
|
1087
1151
|
args = [
|
|
1088
1152
|
"--id",
|
|
@@ -1092,7 +1156,7 @@ var Engine = class {
|
|
|
1092
1156
|
"--database",
|
|
1093
1157
|
this.config.config.DATABASE + ".db",
|
|
1094
1158
|
"--motor",
|
|
1095
|
-
|
|
1159
|
+
motor
|
|
1096
1160
|
];
|
|
1097
1161
|
} else {
|
|
1098
1162
|
args = [
|
|
@@ -1107,7 +1171,7 @@ var Engine = class {
|
|
|
1107
1171
|
"--port",
|
|
1108
1172
|
String(this.config.config.PORT),
|
|
1109
1173
|
"--motor",
|
|
1110
|
-
|
|
1174
|
+
motor
|
|
1111
1175
|
];
|
|
1112
1176
|
if (this.config.config.USER != null && this.config.config.USER !== "") {
|
|
1113
1177
|
args.push("--user", this.config.config.USER);
|
|
@@ -1120,8 +1184,10 @@ var Engine = class {
|
|
|
1120
1184
|
}
|
|
1121
1185
|
setConfig(name) {
|
|
1122
1186
|
const configInstance = new Config();
|
|
1187
|
+
EnvLoader.load();
|
|
1123
1188
|
try {
|
|
1124
|
-
const
|
|
1189
|
+
const cjsPath = import_path4.default.resolve(process.cwd(), "dbcube.config.cjs");
|
|
1190
|
+
const configFilePath = fs5.existsSync(cjsPath) ? cjsPath : import_path4.default.resolve(process.cwd(), "dbcube.config.js");
|
|
1125
1191
|
const requireUrl = typeof __filename !== "undefined" ? __filename : process.cwd();
|
|
1126
1192
|
const require2 = (0, import_module.createRequire)(requireUrl);
|
|
1127
1193
|
if (require2.cache && require2.resolve) {
|
|
@@ -1153,7 +1219,7 @@ var Engine = class {
|
|
|
1153
1219
|
if (!this.binary) {
|
|
1154
1220
|
throw new Error("Binary not initialized");
|
|
1155
1221
|
}
|
|
1156
|
-
return new Promise((
|
|
1222
|
+
return new Promise((resolve6, reject) => {
|
|
1157
1223
|
const child = (0, import_child_process2.spawn)(this.binary[binary], [...this.arguments, ...args]);
|
|
1158
1224
|
let stdoutBuffer = "";
|
|
1159
1225
|
let stderrBuffer = "";
|
|
@@ -1169,7 +1235,7 @@ var Engine = class {
|
|
|
1169
1235
|
if (!isResolved) {
|
|
1170
1236
|
isResolved = true;
|
|
1171
1237
|
clearTimeout(timeoutId);
|
|
1172
|
-
|
|
1238
|
+
resolve6(response);
|
|
1173
1239
|
}
|
|
1174
1240
|
};
|
|
1175
1241
|
const tryParseLines = (buffer) => {
|
|
@@ -1235,10 +1301,11 @@ var Engine = class {
|
|
|
1235
1301
|
|
|
1236
1302
|
// src/lib/QueryEngine.ts
|
|
1237
1303
|
var import_path5 = __toESM(require("path"));
|
|
1304
|
+
var fs7 = __toESM(require("fs"));
|
|
1238
1305
|
|
|
1239
1306
|
// src/lib/EmbeddedEngine.ts
|
|
1240
|
-
var
|
|
1241
|
-
var
|
|
1307
|
+
var fs6 = __toESM(require("fs"));
|
|
1308
|
+
var path6 = __toESM(require("path"));
|
|
1242
1309
|
if (!process.env.UV_THREADPOOL_SIZE) {
|
|
1243
1310
|
process.env.UV_THREADPOOL_SIZE = "16";
|
|
1244
1311
|
}
|
|
@@ -1254,11 +1321,11 @@ function platTag() {
|
|
|
1254
1321
|
}
|
|
1255
1322
|
function findFile(name) {
|
|
1256
1323
|
const candidates = [
|
|
1257
|
-
|
|
1258
|
-
|
|
1324
|
+
path6.resolve(process.cwd(), ".dbcube", "bin", name),
|
|
1325
|
+
path6.resolve(process.cwd(), "node_modules", ".dbcube", "bin", name)
|
|
1259
1326
|
];
|
|
1260
1327
|
for (const c of candidates) {
|
|
1261
|
-
if (
|
|
1328
|
+
if (fs6.existsSync(c)) return c;
|
|
1262
1329
|
}
|
|
1263
1330
|
return null;
|
|
1264
1331
|
}
|
|
@@ -1366,10 +1433,10 @@ function loadKoffiBackend() {
|
|
|
1366
1433
|
return { status: 500, message: `Invalid embedded response: ${e.message}`, data: null };
|
|
1367
1434
|
}
|
|
1368
1435
|
};
|
|
1369
|
-
const call = (fn, ...args) => new Promise((
|
|
1436
|
+
const call = (fn, ...args) => new Promise((resolve6, reject) => {
|
|
1370
1437
|
fn.async(...args, (err, ptr) => {
|
|
1371
1438
|
if (err) return reject(err);
|
|
1372
|
-
|
|
1439
|
+
resolve6(take(ptr));
|
|
1373
1440
|
});
|
|
1374
1441
|
});
|
|
1375
1442
|
return {
|
|
@@ -1523,12 +1590,12 @@ var QueryEngine = class {
|
|
|
1523
1590
|
throw new Error("No available ports found in range 9900-9944");
|
|
1524
1591
|
}
|
|
1525
1592
|
isPortAvailable(port) {
|
|
1526
|
-
return new Promise((
|
|
1593
|
+
return new Promise((resolve6) => {
|
|
1527
1594
|
const tester = net2.createServer();
|
|
1528
|
-
tester.once("error", () =>
|
|
1595
|
+
tester.once("error", () => resolve6(false));
|
|
1529
1596
|
tester.once("listening", () => {
|
|
1530
1597
|
tester.close();
|
|
1531
|
-
|
|
1598
|
+
resolve6(true);
|
|
1532
1599
|
});
|
|
1533
1600
|
tester.listen(port, "127.0.0.1");
|
|
1534
1601
|
});
|
|
@@ -1540,6 +1607,7 @@ var QueryEngine = class {
|
|
|
1540
1607
|
}
|
|
1541
1608
|
setArguments() {
|
|
1542
1609
|
let args = [];
|
|
1610
|
+
const motor = this.config.type === "postgres" ? "postgresql" : this.config.type;
|
|
1543
1611
|
if (this.config.type == "sqlite") {
|
|
1544
1612
|
args = [
|
|
1545
1613
|
"--id",
|
|
@@ -1549,7 +1617,7 @@ var QueryEngine = class {
|
|
|
1549
1617
|
"--database",
|
|
1550
1618
|
this.config.config.DATABASE + ".db",
|
|
1551
1619
|
"--motor",
|
|
1552
|
-
|
|
1620
|
+
motor
|
|
1553
1621
|
];
|
|
1554
1622
|
} else {
|
|
1555
1623
|
args = [
|
|
@@ -1564,7 +1632,7 @@ var QueryEngine = class {
|
|
|
1564
1632
|
"--port",
|
|
1565
1633
|
String(this.config.config.PORT),
|
|
1566
1634
|
"--motor",
|
|
1567
|
-
|
|
1635
|
+
motor
|
|
1568
1636
|
];
|
|
1569
1637
|
if (this.config.config.USER != null && this.config.config.USER !== "") {
|
|
1570
1638
|
args.push("--user", this.config.config.USER);
|
|
@@ -1588,8 +1656,10 @@ var QueryEngine = class {
|
|
|
1588
1656
|
}
|
|
1589
1657
|
setConfig(name) {
|
|
1590
1658
|
const configInstance = new Config();
|
|
1659
|
+
EnvLoader.load();
|
|
1591
1660
|
try {
|
|
1592
|
-
const
|
|
1661
|
+
const cjsPath = import_path5.default.resolve(process.cwd(), "dbcube.config.cjs");
|
|
1662
|
+
const configFilePath = fs7.existsSync(cjsPath) ? cjsPath : import_path5.default.resolve(process.cwd(), "dbcube.config.js");
|
|
1593
1663
|
const requireUrl = typeof __filename !== "undefined" ? __filename : process.cwd();
|
|
1594
1664
|
const require2 = (0, import_module2.createRequire)(requireUrl);
|
|
1595
1665
|
if (require2.cache && require2.resolve) {
|
|
@@ -1761,7 +1831,7 @@ var QueryEngine = class {
|
|
|
1761
1831
|
throw e;
|
|
1762
1832
|
}
|
|
1763
1833
|
}
|
|
1764
|
-
return new Promise((
|
|
1834
|
+
return new Promise((resolve6) => pool.waiters.push(resolve6));
|
|
1765
1835
|
}
|
|
1766
1836
|
releaseSocket(socket, broken) {
|
|
1767
1837
|
const pool = socketPools.get(this.connectionId);
|
|
@@ -1800,25 +1870,25 @@ var QueryEngine = class {
|
|
|
1800
1870
|
throw new Error("TCP server failed to become ready within timeout");
|
|
1801
1871
|
}
|
|
1802
1872
|
async isServerResponding(port) {
|
|
1803
|
-
return new Promise((
|
|
1873
|
+
return new Promise((resolve6) => {
|
|
1804
1874
|
const client = new net2.Socket();
|
|
1805
1875
|
const timeout = setTimeout(() => {
|
|
1806
1876
|
client.destroy();
|
|
1807
|
-
|
|
1877
|
+
resolve6(false);
|
|
1808
1878
|
}, 1e3);
|
|
1809
1879
|
client.connect(port, "127.0.0.1", () => {
|
|
1810
1880
|
clearTimeout(timeout);
|
|
1811
1881
|
client.destroy();
|
|
1812
|
-
|
|
1882
|
+
resolve6(true);
|
|
1813
1883
|
});
|
|
1814
1884
|
client.on("error", () => {
|
|
1815
1885
|
clearTimeout(timeout);
|
|
1816
|
-
|
|
1886
|
+
resolve6(false);
|
|
1817
1887
|
});
|
|
1818
1888
|
});
|
|
1819
1889
|
}
|
|
1820
1890
|
sleep(ms) {
|
|
1821
|
-
return new Promise((
|
|
1891
|
+
return new Promise((resolve6) => setTimeout(resolve6, ms));
|
|
1822
1892
|
}
|
|
1823
1893
|
getCachedDML(dmlJson) {
|
|
1824
1894
|
if (queryCache.has(dmlJson)) {
|
|
@@ -1838,7 +1908,7 @@ var QueryEngine = class {
|
|
|
1838
1908
|
throw new Error("Binary not initialized");
|
|
1839
1909
|
}
|
|
1840
1910
|
this.tcpPort = await this.findAvailablePort(this.tcpPort);
|
|
1841
|
-
return new Promise((
|
|
1911
|
+
return new Promise((resolve6, reject) => {
|
|
1842
1912
|
const serverArgs = [...this.arguments, "--action", "server", "--tcp-port", this.tcpPort.toString()];
|
|
1843
1913
|
const serverProcess = (0, import_child_process3.spawn)(this.binary["query_engine"], serverArgs);
|
|
1844
1914
|
let started = false;
|
|
@@ -1858,7 +1928,7 @@ var QueryEngine = class {
|
|
|
1858
1928
|
port: this.tcpPort,
|
|
1859
1929
|
process: serverProcess
|
|
1860
1930
|
});
|
|
1861
|
-
|
|
1931
|
+
resolve6();
|
|
1862
1932
|
}
|
|
1863
1933
|
}
|
|
1864
1934
|
});
|
|
@@ -1877,7 +1947,7 @@ var QueryEngine = class {
|
|
|
1877
1947
|
});
|
|
1878
1948
|
}
|
|
1879
1949
|
async createNewConnection(port) {
|
|
1880
|
-
return new Promise((
|
|
1950
|
+
return new Promise((resolve6, reject) => {
|
|
1881
1951
|
const client = new net2.Socket();
|
|
1882
1952
|
client.setNoDelay(true);
|
|
1883
1953
|
client.setKeepAlive(true, 6e4);
|
|
@@ -1887,7 +1957,7 @@ var QueryEngine = class {
|
|
|
1887
1957
|
}, 5e3);
|
|
1888
1958
|
client.connect(port, "127.0.0.1", () => {
|
|
1889
1959
|
clearTimeout(timeout);
|
|
1890
|
-
|
|
1960
|
+
resolve6(client);
|
|
1891
1961
|
});
|
|
1892
1962
|
client.on("error", (error) => {
|
|
1893
1963
|
clearTimeout(timeout);
|
|
@@ -1896,7 +1966,7 @@ var QueryEngine = class {
|
|
|
1896
1966
|
});
|
|
1897
1967
|
}
|
|
1898
1968
|
async executeOnConnection(connection, command) {
|
|
1899
|
-
return new Promise((
|
|
1969
|
+
return new Promise((resolve6, reject) => {
|
|
1900
1970
|
let responseBuffer = "";
|
|
1901
1971
|
let isResolved = false;
|
|
1902
1972
|
const timeout = setTimeout(() => {
|
|
@@ -1921,7 +1991,7 @@ var QueryEngine = class {
|
|
|
1921
1991
|
connection.removeListener("error", onError);
|
|
1922
1992
|
try {
|
|
1923
1993
|
const response = JSON.parse(line.slice(marker + "PROCESS_RESPONSE:".length));
|
|
1924
|
-
|
|
1994
|
+
resolve6({
|
|
1925
1995
|
status: response.status,
|
|
1926
1996
|
message: response.message,
|
|
1927
1997
|
data: response.data
|
|
@@ -1950,7 +2020,7 @@ var QueryEngine = class {
|
|
|
1950
2020
|
if (!this.binary) {
|
|
1951
2021
|
throw new Error("Binary not initialized");
|
|
1952
2022
|
}
|
|
1953
|
-
return new Promise((
|
|
2023
|
+
return new Promise((resolve6, reject) => {
|
|
1954
2024
|
const child = (0, import_child_process3.spawn)(this.binary[binary], [...this.arguments, ...args]);
|
|
1955
2025
|
let stdoutBuffer = "";
|
|
1956
2026
|
let stderrBuffer = "";
|
|
@@ -1966,7 +2036,7 @@ var QueryEngine = class {
|
|
|
1966
2036
|
if (!isResolved) {
|
|
1967
2037
|
isResolved = true;
|
|
1968
2038
|
clearTimeout(timeoutId);
|
|
1969
|
-
|
|
2039
|
+
resolve6(response);
|
|
1970
2040
|
}
|
|
1971
2041
|
};
|
|
1972
2042
|
const tryParseLines = (buffer) => {
|
|
@@ -2053,9 +2123,9 @@ var QueryEngine = class {
|
|
|
2053
2123
|
};
|
|
2054
2124
|
|
|
2055
2125
|
// src/lib/DbConfig.ts
|
|
2056
|
-
var
|
|
2126
|
+
var path8 = __toESM(require("path"));
|
|
2057
2127
|
var import_fs2 = __toESM(require("fs"));
|
|
2058
|
-
var rootPath =
|
|
2128
|
+
var rootPath = path8.resolve(process.cwd(), ".dbcube");
|
|
2059
2129
|
var SQLite = class {
|
|
2060
2130
|
database;
|
|
2061
2131
|
engine = null;
|
|
@@ -2064,14 +2134,14 @@ var SQLite = class {
|
|
|
2064
2134
|
}
|
|
2065
2135
|
/** Ruta del archivo SQLite interno (.dbcube/<database>.db). */
|
|
2066
2136
|
dbFilePath() {
|
|
2067
|
-
return
|
|
2137
|
+
return path8.join(rootPath, this.database + ".db");
|
|
2068
2138
|
}
|
|
2069
2139
|
/** QueryEngine sqlite apuntando al archivo interno, con config explícito
|
|
2070
2140
|
* (no vive en dbcube.config.js). La ruta relativa `.dbcube/<db>` deja que
|
|
2071
2141
|
* QueryEngine le añada `.db` → `.dbcube/<db>.db`, relativo al CWD. */
|
|
2072
2142
|
getEngine() {
|
|
2073
2143
|
if (!this.engine) {
|
|
2074
|
-
const relativeDb =
|
|
2144
|
+
const relativeDb = path8.join(".dbcube", this.database).replace(/\\/g, "/");
|
|
2075
2145
|
this.engine = new QueryEngine(`dbcube-internal-${this.database}`, 3e4, {
|
|
2076
2146
|
type: "sqlite",
|
|
2077
2147
|
config: { DATABASE: relativeDb }
|
|
@@ -2203,8 +2273,8 @@ var DbConfig = new SQLite({ DATABASE: "config" });
|
|
|
2203
2273
|
var DbConfig_default = DbConfig;
|
|
2204
2274
|
|
|
2205
2275
|
// src/lib/FileLogger.ts
|
|
2206
|
-
var
|
|
2207
|
-
var
|
|
2276
|
+
var fs9 = __toESM(require("fs"));
|
|
2277
|
+
var path9 = __toESM(require("path"));
|
|
2208
2278
|
var import_events = require("events");
|
|
2209
2279
|
var FileLogger = class _FileLogger extends import_events.EventEmitter {
|
|
2210
2280
|
static watchers = /* @__PURE__ */ new Map();
|
|
@@ -2219,9 +2289,9 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
|
|
|
2219
2289
|
*/
|
|
2220
2290
|
static async write(filePath, message, level = "INFO", append = true) {
|
|
2221
2291
|
try {
|
|
2222
|
-
const dir =
|
|
2223
|
-
if (!
|
|
2224
|
-
|
|
2292
|
+
const dir = path9.dirname(filePath);
|
|
2293
|
+
if (!fs9.existsSync(dir)) {
|
|
2294
|
+
fs9.mkdirSync(dir, { recursive: true });
|
|
2225
2295
|
}
|
|
2226
2296
|
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
2227
2297
|
const formattedMessage = `[${timestamp}] [${level}] ${message}
|
|
@@ -2231,9 +2301,9 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
|
|
|
2231
2301
|
return true;
|
|
2232
2302
|
}
|
|
2233
2303
|
if (append) {
|
|
2234
|
-
await
|
|
2304
|
+
await fs9.promises.appendFile(filePath, formattedMessage, "utf8");
|
|
2235
2305
|
} else {
|
|
2236
|
-
await
|
|
2306
|
+
await fs9.promises.writeFile(filePath, formattedMessage, "utf8");
|
|
2237
2307
|
}
|
|
2238
2308
|
return true;
|
|
2239
2309
|
} catch (error) {
|
|
@@ -2258,12 +2328,12 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
|
|
|
2258
2328
|
const buffer = _FileLogger.buffers.get(filePath);
|
|
2259
2329
|
if (buffer && buffer.length > 0) {
|
|
2260
2330
|
try {
|
|
2261
|
-
const dir =
|
|
2262
|
-
if (!
|
|
2263
|
-
|
|
2331
|
+
const dir = path9.dirname(filePath);
|
|
2332
|
+
if (!fs9.existsSync(dir)) {
|
|
2333
|
+
fs9.mkdirSync(dir, { recursive: true });
|
|
2264
2334
|
}
|
|
2265
2335
|
const content = buffer.join("");
|
|
2266
|
-
await
|
|
2336
|
+
await fs9.promises.appendFile(filePath, content, "utf8");
|
|
2267
2337
|
_FileLogger.buffers.delete(filePath);
|
|
2268
2338
|
return true;
|
|
2269
2339
|
} catch (error) {
|
|
@@ -2399,10 +2469,10 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
|
|
|
2399
2469
|
// Si debe retornar como array de líneas
|
|
2400
2470
|
} = options;
|
|
2401
2471
|
try {
|
|
2402
|
-
if (!
|
|
2472
|
+
if (!fs9.existsSync(filePath)) {
|
|
2403
2473
|
return asArray ? [] : "";
|
|
2404
2474
|
}
|
|
2405
|
-
let content = await
|
|
2475
|
+
let content = await fs9.promises.readFile(filePath, "utf8");
|
|
2406
2476
|
if (asArray) {
|
|
2407
2477
|
let linesArray = content.split("\n").filter((line) => line.trim() !== "");
|
|
2408
2478
|
if (lines !== null) {
|
|
@@ -2445,15 +2515,15 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
|
|
|
2445
2515
|
} = options;
|
|
2446
2516
|
let lastSize = 0;
|
|
2447
2517
|
let lastPosition = 0;
|
|
2448
|
-
if (
|
|
2449
|
-
const stats =
|
|
2518
|
+
if (fs9.existsSync(filePath)) {
|
|
2519
|
+
const stats = fs9.statSync(filePath);
|
|
2450
2520
|
lastSize = stats.size;
|
|
2451
2521
|
lastPosition = fromEnd ? stats.size : 0;
|
|
2452
2522
|
}
|
|
2453
2523
|
const listener = async (curr, prev) => {
|
|
2454
2524
|
try {
|
|
2455
2525
|
if (curr.size > lastSize) {
|
|
2456
|
-
const stream =
|
|
2526
|
+
const stream = fs9.createReadStream(filePath, {
|
|
2457
2527
|
start: lastPosition,
|
|
2458
2528
|
end: curr.size - 1,
|
|
2459
2529
|
encoding: "utf8"
|
|
@@ -2481,7 +2551,7 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
|
|
|
2481
2551
|
console.error("Error en watcher:", error);
|
|
2482
2552
|
}
|
|
2483
2553
|
};
|
|
2484
|
-
|
|
2554
|
+
fs9.watchFile(filePath, { persistent, interval }, listener);
|
|
2485
2555
|
const watcherId = `${filePath}_${Date.now()}`;
|
|
2486
2556
|
_FileLogger.watchers.set(watcherId, listener);
|
|
2487
2557
|
return {
|
|
@@ -2489,7 +2559,7 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
|
|
|
2489
2559
|
stop: () => {
|
|
2490
2560
|
const storedListener = _FileLogger.watchers.get(watcherId);
|
|
2491
2561
|
if (storedListener) {
|
|
2492
|
-
|
|
2562
|
+
fs9.unwatchFile(filePath, storedListener);
|
|
2493
2563
|
_FileLogger.watchers.delete(watcherId);
|
|
2494
2564
|
}
|
|
2495
2565
|
},
|
|
@@ -2502,7 +2572,7 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
|
|
|
2502
2572
|
static stopAllWatchers() {
|
|
2503
2573
|
for (const [watcherId] of _FileLogger.watchers) {
|
|
2504
2574
|
const filePath = watcherId.split("_")[0];
|
|
2505
|
-
|
|
2575
|
+
fs9.unwatchFile(filePath);
|
|
2506
2576
|
}
|
|
2507
2577
|
_FileLogger.watchers.clear();
|
|
2508
2578
|
}
|
|
@@ -2532,7 +2602,7 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
|
|
|
2532
2602
|
if (lines.length > maxLines) {
|
|
2533
2603
|
const keepLines = lines.slice(-maxLines);
|
|
2534
2604
|
const content = keepLines.join("\n") + "\n";
|
|
2535
|
-
await
|
|
2605
|
+
await fs9.promises.writeFile(filePath, content, "utf8");
|
|
2536
2606
|
return lines.length - maxLines;
|
|
2537
2607
|
}
|
|
2538
2608
|
return 0;
|
|
@@ -2547,8 +2617,8 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
|
|
|
2547
2617
|
*/
|
|
2548
2618
|
static async deleteLogFile(filePath) {
|
|
2549
2619
|
try {
|
|
2550
|
-
if (
|
|
2551
|
-
await
|
|
2620
|
+
if (fs9.existsSync(filePath)) {
|
|
2621
|
+
await fs9.promises.unlink(filePath);
|
|
2552
2622
|
return true;
|
|
2553
2623
|
}
|
|
2554
2624
|
return false;
|
|
@@ -2964,6 +3034,7 @@ function convertToType(value, type2) {
|
|
|
2964
3034
|
DaemonClient,
|
|
2965
3035
|
DbConfig,
|
|
2966
3036
|
Engine,
|
|
3037
|
+
EnvLoader,
|
|
2967
3038
|
FileLogger,
|
|
2968
3039
|
QueryEngine,
|
|
2969
3040
|
TableProcessor,
|