@dbcube/core 5.2.4 → 5.2.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/dist/index.cjs +167 -77
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +28 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.js +188 -99
- 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);
|
|
@@ -616,6 +618,9 @@ var Binary = class {
|
|
|
616
618
|
return;
|
|
617
619
|
}
|
|
618
620
|
const binDir = this.getBinDir();
|
|
621
|
+
if (this.binariesPresent(binDir)) {
|
|
622
|
+
return;
|
|
623
|
+
}
|
|
619
624
|
if (!this.isDownloading) {
|
|
620
625
|
this.isDownloading = true;
|
|
621
626
|
this.downloadPromise = this.downloadBinaries();
|
|
@@ -627,6 +632,17 @@ var Binary = class {
|
|
|
627
632
|
}
|
|
628
633
|
}
|
|
629
634
|
}
|
|
635
|
+
/** ¿Están ya presentes query-engine y schema-engine en binDir? */
|
|
636
|
+
static binariesPresent(binDir) {
|
|
637
|
+
try {
|
|
638
|
+
const files = fs2.readdirSync(binDir);
|
|
639
|
+
const hasQuery = files.some((f) => /^query-engine-/.test(f));
|
|
640
|
+
const hasSchema = files.some((f) => /^schema-engine-/.test(f));
|
|
641
|
+
return hasQuery && hasSchema;
|
|
642
|
+
} catch {
|
|
643
|
+
return false;
|
|
644
|
+
}
|
|
645
|
+
}
|
|
630
646
|
static async downloadBinaries() {
|
|
631
647
|
try {
|
|
632
648
|
const binDir = this.getBinDir();
|
|
@@ -746,6 +762,67 @@ var Config = class {
|
|
|
746
762
|
}
|
|
747
763
|
};
|
|
748
764
|
|
|
765
|
+
// src/lib/EnvLoader.ts
|
|
766
|
+
var fs3 = __toESM(require("fs"));
|
|
767
|
+
var path3 = __toESM(require("path"));
|
|
768
|
+
var EnvLoader = class _EnvLoader {
|
|
769
|
+
/**
|
|
770
|
+
* Carga el archivo .env indicado (o ./.env del cwd) en process.env.
|
|
771
|
+
* Silencioso si el archivo no existe. Devuelve true si cargó algo.
|
|
772
|
+
*/
|
|
773
|
+
static load(envPath) {
|
|
774
|
+
const file = envPath || path3.resolve(process.cwd(), ".env");
|
|
775
|
+
if (!fs3.existsSync(file)) return false;
|
|
776
|
+
const proc = process;
|
|
777
|
+
if (typeof proc.loadEnvFile === "function") {
|
|
778
|
+
try {
|
|
779
|
+
proc.loadEnvFile(file);
|
|
780
|
+
return true;
|
|
781
|
+
} catch {
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
try {
|
|
785
|
+
const parsed = _EnvLoader.parse(fs3.readFileSync(file, "utf8"));
|
|
786
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
787
|
+
if (process.env[key] === void 0) {
|
|
788
|
+
process.env[key] = value;
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
return true;
|
|
792
|
+
} catch {
|
|
793
|
+
return false;
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
/**
|
|
797
|
+
* Parser mínimo de formato .env. Soporta:
|
|
798
|
+
* KEY=value · KEY="value con espacios" · KEY='literal' · export KEY=value
|
|
799
|
+
* comentarios con # · líneas en blanco · \n \t en comillas dobles.
|
|
800
|
+
*/
|
|
801
|
+
static parse(content) {
|
|
802
|
+
const out = {};
|
|
803
|
+
for (const rawLine of content.split(/\r?\n/)) {
|
|
804
|
+
const line = rawLine.trim();
|
|
805
|
+
if (!line || line.startsWith("#")) continue;
|
|
806
|
+
const withoutExport = line.startsWith("export ") ? line.slice(7).trim() : line;
|
|
807
|
+
const eq = withoutExport.indexOf("=");
|
|
808
|
+
if (eq === -1) continue;
|
|
809
|
+
const key = withoutExport.slice(0, eq).trim();
|
|
810
|
+
if (!key) continue;
|
|
811
|
+
let value = withoutExport.slice(eq + 1).trim();
|
|
812
|
+
if (value.length >= 2 && value[0] === '"' && value[value.length - 1] === '"') {
|
|
813
|
+
value = value.slice(1, -1).replace(/\\n/g, "\n").replace(/\\t/g, " ").replace(/\\"/g, '"');
|
|
814
|
+
} else if (value.length >= 2 && value[0] === "'" && value[value.length - 1] === "'") {
|
|
815
|
+
value = value.slice(1, -1);
|
|
816
|
+
} else {
|
|
817
|
+
const hash = value.indexOf(" #");
|
|
818
|
+
if (hash !== -1) value = value.slice(0, hash).trim();
|
|
819
|
+
}
|
|
820
|
+
out[key] = value;
|
|
821
|
+
}
|
|
822
|
+
return out;
|
|
823
|
+
}
|
|
824
|
+
};
|
|
825
|
+
|
|
749
826
|
// src/lib/Engine.ts
|
|
750
827
|
var import_child_process2 = require("child_process");
|
|
751
828
|
var import_module = require("module");
|
|
@@ -875,22 +952,22 @@ var DaemonClient = class _DaemonClient {
|
|
|
875
952
|
child.unref();
|
|
876
953
|
}
|
|
877
954
|
tryConnect(port) {
|
|
878
|
-
return new Promise((
|
|
955
|
+
return new Promise((resolve6) => {
|
|
879
956
|
const socket = import_net.default.createConnection({ host: "127.0.0.1", port }, async () => {
|
|
880
957
|
socket.setNoDelay(true);
|
|
881
958
|
this.attach(socket);
|
|
882
959
|
try {
|
|
883
960
|
const pong = await this.send({ action: "ping" }, 2e3);
|
|
884
|
-
|
|
961
|
+
resolve6(pong.status === 200);
|
|
885
962
|
} catch {
|
|
886
963
|
this.detach();
|
|
887
|
-
|
|
964
|
+
resolve6(false);
|
|
888
965
|
}
|
|
889
966
|
});
|
|
890
|
-
socket.once("error", () =>
|
|
967
|
+
socket.once("error", () => resolve6(false));
|
|
891
968
|
socket.setTimeout(3e3, () => {
|
|
892
969
|
socket.destroy();
|
|
893
|
-
|
|
970
|
+
resolve6(false);
|
|
894
971
|
});
|
|
895
972
|
});
|
|
896
973
|
}
|
|
@@ -938,7 +1015,7 @@ var DaemonClient = class _DaemonClient {
|
|
|
938
1015
|
* single socket, so pending requests resolve in send order.
|
|
939
1016
|
*/
|
|
940
1017
|
send(payload, timeoutMs) {
|
|
941
|
-
return new Promise((
|
|
1018
|
+
return new Promise((resolve6, reject) => {
|
|
942
1019
|
if (!this.socket || this.socket.destroyed) {
|
|
943
1020
|
reject(new Error("Daemon not connected"));
|
|
944
1021
|
return;
|
|
@@ -949,7 +1026,7 @@ var DaemonClient = class _DaemonClient {
|
|
|
949
1026
|
reject(new Error("Daemon request timeout"));
|
|
950
1027
|
this.detach();
|
|
951
1028
|
}, timeoutMs ?? this.requestTimeout);
|
|
952
|
-
this.pending.push({ resolve:
|
|
1029
|
+
this.pending.push({ resolve: resolve6, reject, timer });
|
|
953
1030
|
this.socket.write(JSON.stringify(payload) + "\n");
|
|
954
1031
|
});
|
|
955
1032
|
}
|
|
@@ -1083,6 +1160,7 @@ var Engine = class {
|
|
|
1083
1160
|
}
|
|
1084
1161
|
setArguments() {
|
|
1085
1162
|
let args = [];
|
|
1163
|
+
const motor = this.config.type === "postgres" ? "postgresql" : this.config.type;
|
|
1086
1164
|
if (this.config.type == "sqlite") {
|
|
1087
1165
|
args = [
|
|
1088
1166
|
"--id",
|
|
@@ -1092,7 +1170,7 @@ var Engine = class {
|
|
|
1092
1170
|
"--database",
|
|
1093
1171
|
this.config.config.DATABASE + ".db",
|
|
1094
1172
|
"--motor",
|
|
1095
|
-
|
|
1173
|
+
motor
|
|
1096
1174
|
];
|
|
1097
1175
|
} else {
|
|
1098
1176
|
args = [
|
|
@@ -1107,7 +1185,7 @@ var Engine = class {
|
|
|
1107
1185
|
"--port",
|
|
1108
1186
|
String(this.config.config.PORT),
|
|
1109
1187
|
"--motor",
|
|
1110
|
-
|
|
1188
|
+
motor
|
|
1111
1189
|
];
|
|
1112
1190
|
if (this.config.config.USER != null && this.config.config.USER !== "") {
|
|
1113
1191
|
args.push("--user", this.config.config.USER);
|
|
@@ -1120,8 +1198,10 @@ var Engine = class {
|
|
|
1120
1198
|
}
|
|
1121
1199
|
setConfig(name) {
|
|
1122
1200
|
const configInstance = new Config();
|
|
1201
|
+
EnvLoader.load();
|
|
1123
1202
|
try {
|
|
1124
|
-
const
|
|
1203
|
+
const cjsPath = import_path4.default.resolve(process.cwd(), "dbcube.config.cjs");
|
|
1204
|
+
const configFilePath = fs5.existsSync(cjsPath) ? cjsPath : import_path4.default.resolve(process.cwd(), "dbcube.config.js");
|
|
1125
1205
|
const requireUrl = typeof __filename !== "undefined" ? __filename : process.cwd();
|
|
1126
1206
|
const require2 = (0, import_module.createRequire)(requireUrl);
|
|
1127
1207
|
if (require2.cache && require2.resolve) {
|
|
@@ -1153,7 +1233,7 @@ var Engine = class {
|
|
|
1153
1233
|
if (!this.binary) {
|
|
1154
1234
|
throw new Error("Binary not initialized");
|
|
1155
1235
|
}
|
|
1156
|
-
return new Promise((
|
|
1236
|
+
return new Promise((resolve6, reject) => {
|
|
1157
1237
|
const child = (0, import_child_process2.spawn)(this.binary[binary], [...this.arguments, ...args]);
|
|
1158
1238
|
let stdoutBuffer = "";
|
|
1159
1239
|
let stderrBuffer = "";
|
|
@@ -1169,7 +1249,7 @@ var Engine = class {
|
|
|
1169
1249
|
if (!isResolved) {
|
|
1170
1250
|
isResolved = true;
|
|
1171
1251
|
clearTimeout(timeoutId);
|
|
1172
|
-
|
|
1252
|
+
resolve6(response);
|
|
1173
1253
|
}
|
|
1174
1254
|
};
|
|
1175
1255
|
const tryParseLines = (buffer) => {
|
|
@@ -1196,16 +1276,21 @@ var Engine = class {
|
|
|
1196
1276
|
}
|
|
1197
1277
|
return buffer;
|
|
1198
1278
|
};
|
|
1279
|
+
const showEngineOutput = process.env.DBCUBE_DEBUG === "1" || process.env.DBCUBE_DEBUG === "true";
|
|
1199
1280
|
child.stdout.on("data", (data) => {
|
|
1200
1281
|
const text = data.toString();
|
|
1201
|
-
|
|
1202
|
-
|
|
1282
|
+
if (showEngineOutput) {
|
|
1283
|
+
const visible = text.split("\n").filter((l) => l.trim() && !l.includes("PROCESS_RESPONSE:")).join("\n");
|
|
1284
|
+
if (visible) console.log(visible);
|
|
1285
|
+
}
|
|
1203
1286
|
stdoutBuffer = tryParseLines(stdoutBuffer + text);
|
|
1204
1287
|
});
|
|
1205
1288
|
child.stderr.on("data", (data) => {
|
|
1206
1289
|
const text = data.toString();
|
|
1207
|
-
|
|
1208
|
-
|
|
1290
|
+
if (showEngineOutput) {
|
|
1291
|
+
const visible = text.split("\n").filter((l) => l.trim() && !l.includes("PROCESS_RESPONSE:")).join("\n");
|
|
1292
|
+
if (visible) console.log(visible);
|
|
1293
|
+
}
|
|
1209
1294
|
stderrBuffer = tryParseLines(stderrBuffer + text);
|
|
1210
1295
|
});
|
|
1211
1296
|
child.on("close", (code) => {
|
|
@@ -1235,10 +1320,11 @@ var Engine = class {
|
|
|
1235
1320
|
|
|
1236
1321
|
// src/lib/QueryEngine.ts
|
|
1237
1322
|
var import_path5 = __toESM(require("path"));
|
|
1323
|
+
var fs7 = __toESM(require("fs"));
|
|
1238
1324
|
|
|
1239
1325
|
// src/lib/EmbeddedEngine.ts
|
|
1240
|
-
var
|
|
1241
|
-
var
|
|
1326
|
+
var fs6 = __toESM(require("fs"));
|
|
1327
|
+
var path6 = __toESM(require("path"));
|
|
1242
1328
|
if (!process.env.UV_THREADPOOL_SIZE) {
|
|
1243
1329
|
process.env.UV_THREADPOOL_SIZE = "16";
|
|
1244
1330
|
}
|
|
@@ -1254,11 +1340,11 @@ function platTag() {
|
|
|
1254
1340
|
}
|
|
1255
1341
|
function findFile(name) {
|
|
1256
1342
|
const candidates = [
|
|
1257
|
-
|
|
1258
|
-
|
|
1343
|
+
path6.resolve(process.cwd(), ".dbcube", "bin", name),
|
|
1344
|
+
path6.resolve(process.cwd(), "node_modules", ".dbcube", "bin", name)
|
|
1259
1345
|
];
|
|
1260
1346
|
for (const c of candidates) {
|
|
1261
|
-
if (
|
|
1347
|
+
if (fs6.existsSync(c)) return c;
|
|
1262
1348
|
}
|
|
1263
1349
|
return null;
|
|
1264
1350
|
}
|
|
@@ -1366,10 +1452,10 @@ function loadKoffiBackend() {
|
|
|
1366
1452
|
return { status: 500, message: `Invalid embedded response: ${e.message}`, data: null };
|
|
1367
1453
|
}
|
|
1368
1454
|
};
|
|
1369
|
-
const call = (fn, ...args) => new Promise((
|
|
1455
|
+
const call = (fn, ...args) => new Promise((resolve6, reject) => {
|
|
1370
1456
|
fn.async(...args, (err, ptr) => {
|
|
1371
1457
|
if (err) return reject(err);
|
|
1372
|
-
|
|
1458
|
+
resolve6(take(ptr));
|
|
1373
1459
|
});
|
|
1374
1460
|
});
|
|
1375
1461
|
return {
|
|
@@ -1523,12 +1609,12 @@ var QueryEngine = class {
|
|
|
1523
1609
|
throw new Error("No available ports found in range 9900-9944");
|
|
1524
1610
|
}
|
|
1525
1611
|
isPortAvailable(port) {
|
|
1526
|
-
return new Promise((
|
|
1612
|
+
return new Promise((resolve6) => {
|
|
1527
1613
|
const tester = net2.createServer();
|
|
1528
|
-
tester.once("error", () =>
|
|
1614
|
+
tester.once("error", () => resolve6(false));
|
|
1529
1615
|
tester.once("listening", () => {
|
|
1530
1616
|
tester.close();
|
|
1531
|
-
|
|
1617
|
+
resolve6(true);
|
|
1532
1618
|
});
|
|
1533
1619
|
tester.listen(port, "127.0.0.1");
|
|
1534
1620
|
});
|
|
@@ -1540,6 +1626,7 @@ var QueryEngine = class {
|
|
|
1540
1626
|
}
|
|
1541
1627
|
setArguments() {
|
|
1542
1628
|
let args = [];
|
|
1629
|
+
const motor = this.config.type === "postgres" ? "postgresql" : this.config.type;
|
|
1543
1630
|
if (this.config.type == "sqlite") {
|
|
1544
1631
|
args = [
|
|
1545
1632
|
"--id",
|
|
@@ -1549,7 +1636,7 @@ var QueryEngine = class {
|
|
|
1549
1636
|
"--database",
|
|
1550
1637
|
this.config.config.DATABASE + ".db",
|
|
1551
1638
|
"--motor",
|
|
1552
|
-
|
|
1639
|
+
motor
|
|
1553
1640
|
];
|
|
1554
1641
|
} else {
|
|
1555
1642
|
args = [
|
|
@@ -1564,7 +1651,7 @@ var QueryEngine = class {
|
|
|
1564
1651
|
"--port",
|
|
1565
1652
|
String(this.config.config.PORT),
|
|
1566
1653
|
"--motor",
|
|
1567
|
-
|
|
1654
|
+
motor
|
|
1568
1655
|
];
|
|
1569
1656
|
if (this.config.config.USER != null && this.config.config.USER !== "") {
|
|
1570
1657
|
args.push("--user", this.config.config.USER);
|
|
@@ -1588,8 +1675,10 @@ var QueryEngine = class {
|
|
|
1588
1675
|
}
|
|
1589
1676
|
setConfig(name) {
|
|
1590
1677
|
const configInstance = new Config();
|
|
1678
|
+
EnvLoader.load();
|
|
1591
1679
|
try {
|
|
1592
|
-
const
|
|
1680
|
+
const cjsPath = import_path5.default.resolve(process.cwd(), "dbcube.config.cjs");
|
|
1681
|
+
const configFilePath = fs7.existsSync(cjsPath) ? cjsPath : import_path5.default.resolve(process.cwd(), "dbcube.config.js");
|
|
1593
1682
|
const requireUrl = typeof __filename !== "undefined" ? __filename : process.cwd();
|
|
1594
1683
|
const require2 = (0, import_module2.createRequire)(requireUrl);
|
|
1595
1684
|
if (require2.cache && require2.resolve) {
|
|
@@ -1761,7 +1850,7 @@ var QueryEngine = class {
|
|
|
1761
1850
|
throw e;
|
|
1762
1851
|
}
|
|
1763
1852
|
}
|
|
1764
|
-
return new Promise((
|
|
1853
|
+
return new Promise((resolve6) => pool.waiters.push(resolve6));
|
|
1765
1854
|
}
|
|
1766
1855
|
releaseSocket(socket, broken) {
|
|
1767
1856
|
const pool = socketPools.get(this.connectionId);
|
|
@@ -1800,25 +1889,25 @@ var QueryEngine = class {
|
|
|
1800
1889
|
throw new Error("TCP server failed to become ready within timeout");
|
|
1801
1890
|
}
|
|
1802
1891
|
async isServerResponding(port) {
|
|
1803
|
-
return new Promise((
|
|
1892
|
+
return new Promise((resolve6) => {
|
|
1804
1893
|
const client = new net2.Socket();
|
|
1805
1894
|
const timeout = setTimeout(() => {
|
|
1806
1895
|
client.destroy();
|
|
1807
|
-
|
|
1896
|
+
resolve6(false);
|
|
1808
1897
|
}, 1e3);
|
|
1809
1898
|
client.connect(port, "127.0.0.1", () => {
|
|
1810
1899
|
clearTimeout(timeout);
|
|
1811
1900
|
client.destroy();
|
|
1812
|
-
|
|
1901
|
+
resolve6(true);
|
|
1813
1902
|
});
|
|
1814
1903
|
client.on("error", () => {
|
|
1815
1904
|
clearTimeout(timeout);
|
|
1816
|
-
|
|
1905
|
+
resolve6(false);
|
|
1817
1906
|
});
|
|
1818
1907
|
});
|
|
1819
1908
|
}
|
|
1820
1909
|
sleep(ms) {
|
|
1821
|
-
return new Promise((
|
|
1910
|
+
return new Promise((resolve6) => setTimeout(resolve6, ms));
|
|
1822
1911
|
}
|
|
1823
1912
|
getCachedDML(dmlJson) {
|
|
1824
1913
|
if (queryCache.has(dmlJson)) {
|
|
@@ -1838,7 +1927,7 @@ var QueryEngine = class {
|
|
|
1838
1927
|
throw new Error("Binary not initialized");
|
|
1839
1928
|
}
|
|
1840
1929
|
this.tcpPort = await this.findAvailablePort(this.tcpPort);
|
|
1841
|
-
return new Promise((
|
|
1930
|
+
return new Promise((resolve6, reject) => {
|
|
1842
1931
|
const serverArgs = [...this.arguments, "--action", "server", "--tcp-port", this.tcpPort.toString()];
|
|
1843
1932
|
const serverProcess = (0, import_child_process3.spawn)(this.binary["query_engine"], serverArgs);
|
|
1844
1933
|
let started = false;
|
|
@@ -1858,7 +1947,7 @@ var QueryEngine = class {
|
|
|
1858
1947
|
port: this.tcpPort,
|
|
1859
1948
|
process: serverProcess
|
|
1860
1949
|
});
|
|
1861
|
-
|
|
1950
|
+
resolve6();
|
|
1862
1951
|
}
|
|
1863
1952
|
}
|
|
1864
1953
|
});
|
|
@@ -1877,7 +1966,7 @@ var QueryEngine = class {
|
|
|
1877
1966
|
});
|
|
1878
1967
|
}
|
|
1879
1968
|
async createNewConnection(port) {
|
|
1880
|
-
return new Promise((
|
|
1969
|
+
return new Promise((resolve6, reject) => {
|
|
1881
1970
|
const client = new net2.Socket();
|
|
1882
1971
|
client.setNoDelay(true);
|
|
1883
1972
|
client.setKeepAlive(true, 6e4);
|
|
@@ -1887,7 +1976,7 @@ var QueryEngine = class {
|
|
|
1887
1976
|
}, 5e3);
|
|
1888
1977
|
client.connect(port, "127.0.0.1", () => {
|
|
1889
1978
|
clearTimeout(timeout);
|
|
1890
|
-
|
|
1979
|
+
resolve6(client);
|
|
1891
1980
|
});
|
|
1892
1981
|
client.on("error", (error) => {
|
|
1893
1982
|
clearTimeout(timeout);
|
|
@@ -1896,7 +1985,7 @@ var QueryEngine = class {
|
|
|
1896
1985
|
});
|
|
1897
1986
|
}
|
|
1898
1987
|
async executeOnConnection(connection, command) {
|
|
1899
|
-
return new Promise((
|
|
1988
|
+
return new Promise((resolve6, reject) => {
|
|
1900
1989
|
let responseBuffer = "";
|
|
1901
1990
|
let isResolved = false;
|
|
1902
1991
|
const timeout = setTimeout(() => {
|
|
@@ -1921,7 +2010,7 @@ var QueryEngine = class {
|
|
|
1921
2010
|
connection.removeListener("error", onError);
|
|
1922
2011
|
try {
|
|
1923
2012
|
const response = JSON.parse(line.slice(marker + "PROCESS_RESPONSE:".length));
|
|
1924
|
-
|
|
2013
|
+
resolve6({
|
|
1925
2014
|
status: response.status,
|
|
1926
2015
|
message: response.message,
|
|
1927
2016
|
data: response.data
|
|
@@ -1950,7 +2039,7 @@ var QueryEngine = class {
|
|
|
1950
2039
|
if (!this.binary) {
|
|
1951
2040
|
throw new Error("Binary not initialized");
|
|
1952
2041
|
}
|
|
1953
|
-
return new Promise((
|
|
2042
|
+
return new Promise((resolve6, reject) => {
|
|
1954
2043
|
const child = (0, import_child_process3.spawn)(this.binary[binary], [...this.arguments, ...args]);
|
|
1955
2044
|
let stdoutBuffer = "";
|
|
1956
2045
|
let stderrBuffer = "";
|
|
@@ -1966,7 +2055,7 @@ var QueryEngine = class {
|
|
|
1966
2055
|
if (!isResolved) {
|
|
1967
2056
|
isResolved = true;
|
|
1968
2057
|
clearTimeout(timeoutId);
|
|
1969
|
-
|
|
2058
|
+
resolve6(response);
|
|
1970
2059
|
}
|
|
1971
2060
|
};
|
|
1972
2061
|
const tryParseLines = (buffer) => {
|
|
@@ -2053,9 +2142,9 @@ var QueryEngine = class {
|
|
|
2053
2142
|
};
|
|
2054
2143
|
|
|
2055
2144
|
// src/lib/DbConfig.ts
|
|
2056
|
-
var
|
|
2145
|
+
var path8 = __toESM(require("path"));
|
|
2057
2146
|
var import_fs2 = __toESM(require("fs"));
|
|
2058
|
-
var rootPath =
|
|
2147
|
+
var rootPath = path8.resolve(process.cwd(), ".dbcube");
|
|
2059
2148
|
var SQLite = class {
|
|
2060
2149
|
database;
|
|
2061
2150
|
engine = null;
|
|
@@ -2064,14 +2153,14 @@ var SQLite = class {
|
|
|
2064
2153
|
}
|
|
2065
2154
|
/** Ruta del archivo SQLite interno (.dbcube/<database>.db). */
|
|
2066
2155
|
dbFilePath() {
|
|
2067
|
-
return
|
|
2156
|
+
return path8.join(rootPath, this.database + ".db");
|
|
2068
2157
|
}
|
|
2069
2158
|
/** QueryEngine sqlite apuntando al archivo interno, con config explícito
|
|
2070
2159
|
* (no vive en dbcube.config.js). La ruta relativa `.dbcube/<db>` deja que
|
|
2071
2160
|
* QueryEngine le añada `.db` → `.dbcube/<db>.db`, relativo al CWD. */
|
|
2072
2161
|
getEngine() {
|
|
2073
2162
|
if (!this.engine) {
|
|
2074
|
-
const relativeDb =
|
|
2163
|
+
const relativeDb = path8.join(".dbcube", this.database).replace(/\\/g, "/");
|
|
2075
2164
|
this.engine = new QueryEngine(`dbcube-internal-${this.database}`, 3e4, {
|
|
2076
2165
|
type: "sqlite",
|
|
2077
2166
|
config: { DATABASE: relativeDb }
|
|
@@ -2203,8 +2292,8 @@ var DbConfig = new SQLite({ DATABASE: "config" });
|
|
|
2203
2292
|
var DbConfig_default = DbConfig;
|
|
2204
2293
|
|
|
2205
2294
|
// src/lib/FileLogger.ts
|
|
2206
|
-
var
|
|
2207
|
-
var
|
|
2295
|
+
var fs9 = __toESM(require("fs"));
|
|
2296
|
+
var path9 = __toESM(require("path"));
|
|
2208
2297
|
var import_events = require("events");
|
|
2209
2298
|
var FileLogger = class _FileLogger extends import_events.EventEmitter {
|
|
2210
2299
|
static watchers = /* @__PURE__ */ new Map();
|
|
@@ -2219,9 +2308,9 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
|
|
|
2219
2308
|
*/
|
|
2220
2309
|
static async write(filePath, message, level = "INFO", append = true) {
|
|
2221
2310
|
try {
|
|
2222
|
-
const dir =
|
|
2223
|
-
if (!
|
|
2224
|
-
|
|
2311
|
+
const dir = path9.dirname(filePath);
|
|
2312
|
+
if (!fs9.existsSync(dir)) {
|
|
2313
|
+
fs9.mkdirSync(dir, { recursive: true });
|
|
2225
2314
|
}
|
|
2226
2315
|
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
2227
2316
|
const formattedMessage = `[${timestamp}] [${level}] ${message}
|
|
@@ -2231,9 +2320,9 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
|
|
|
2231
2320
|
return true;
|
|
2232
2321
|
}
|
|
2233
2322
|
if (append) {
|
|
2234
|
-
await
|
|
2323
|
+
await fs9.promises.appendFile(filePath, formattedMessage, "utf8");
|
|
2235
2324
|
} else {
|
|
2236
|
-
await
|
|
2325
|
+
await fs9.promises.writeFile(filePath, formattedMessage, "utf8");
|
|
2237
2326
|
}
|
|
2238
2327
|
return true;
|
|
2239
2328
|
} catch (error) {
|
|
@@ -2258,12 +2347,12 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
|
|
|
2258
2347
|
const buffer = _FileLogger.buffers.get(filePath);
|
|
2259
2348
|
if (buffer && buffer.length > 0) {
|
|
2260
2349
|
try {
|
|
2261
|
-
const dir =
|
|
2262
|
-
if (!
|
|
2263
|
-
|
|
2350
|
+
const dir = path9.dirname(filePath);
|
|
2351
|
+
if (!fs9.existsSync(dir)) {
|
|
2352
|
+
fs9.mkdirSync(dir, { recursive: true });
|
|
2264
2353
|
}
|
|
2265
2354
|
const content = buffer.join("");
|
|
2266
|
-
await
|
|
2355
|
+
await fs9.promises.appendFile(filePath, content, "utf8");
|
|
2267
2356
|
_FileLogger.buffers.delete(filePath);
|
|
2268
2357
|
return true;
|
|
2269
2358
|
} catch (error) {
|
|
@@ -2399,10 +2488,10 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
|
|
|
2399
2488
|
// Si debe retornar como array de líneas
|
|
2400
2489
|
} = options;
|
|
2401
2490
|
try {
|
|
2402
|
-
if (!
|
|
2491
|
+
if (!fs9.existsSync(filePath)) {
|
|
2403
2492
|
return asArray ? [] : "";
|
|
2404
2493
|
}
|
|
2405
|
-
let content = await
|
|
2494
|
+
let content = await fs9.promises.readFile(filePath, "utf8");
|
|
2406
2495
|
if (asArray) {
|
|
2407
2496
|
let linesArray = content.split("\n").filter((line) => line.trim() !== "");
|
|
2408
2497
|
if (lines !== null) {
|
|
@@ -2445,15 +2534,15 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
|
|
|
2445
2534
|
} = options;
|
|
2446
2535
|
let lastSize = 0;
|
|
2447
2536
|
let lastPosition = 0;
|
|
2448
|
-
if (
|
|
2449
|
-
const stats =
|
|
2537
|
+
if (fs9.existsSync(filePath)) {
|
|
2538
|
+
const stats = fs9.statSync(filePath);
|
|
2450
2539
|
lastSize = stats.size;
|
|
2451
2540
|
lastPosition = fromEnd ? stats.size : 0;
|
|
2452
2541
|
}
|
|
2453
2542
|
const listener = async (curr, prev) => {
|
|
2454
2543
|
try {
|
|
2455
2544
|
if (curr.size > lastSize) {
|
|
2456
|
-
const stream =
|
|
2545
|
+
const stream = fs9.createReadStream(filePath, {
|
|
2457
2546
|
start: lastPosition,
|
|
2458
2547
|
end: curr.size - 1,
|
|
2459
2548
|
encoding: "utf8"
|
|
@@ -2481,7 +2570,7 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
|
|
|
2481
2570
|
console.error("Error en watcher:", error);
|
|
2482
2571
|
}
|
|
2483
2572
|
};
|
|
2484
|
-
|
|
2573
|
+
fs9.watchFile(filePath, { persistent, interval }, listener);
|
|
2485
2574
|
const watcherId = `${filePath}_${Date.now()}`;
|
|
2486
2575
|
_FileLogger.watchers.set(watcherId, listener);
|
|
2487
2576
|
return {
|
|
@@ -2489,7 +2578,7 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
|
|
|
2489
2578
|
stop: () => {
|
|
2490
2579
|
const storedListener = _FileLogger.watchers.get(watcherId);
|
|
2491
2580
|
if (storedListener) {
|
|
2492
|
-
|
|
2581
|
+
fs9.unwatchFile(filePath, storedListener);
|
|
2493
2582
|
_FileLogger.watchers.delete(watcherId);
|
|
2494
2583
|
}
|
|
2495
2584
|
},
|
|
@@ -2502,7 +2591,7 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
|
|
|
2502
2591
|
static stopAllWatchers() {
|
|
2503
2592
|
for (const [watcherId] of _FileLogger.watchers) {
|
|
2504
2593
|
const filePath = watcherId.split("_")[0];
|
|
2505
|
-
|
|
2594
|
+
fs9.unwatchFile(filePath);
|
|
2506
2595
|
}
|
|
2507
2596
|
_FileLogger.watchers.clear();
|
|
2508
2597
|
}
|
|
@@ -2532,7 +2621,7 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
|
|
|
2532
2621
|
if (lines.length > maxLines) {
|
|
2533
2622
|
const keepLines = lines.slice(-maxLines);
|
|
2534
2623
|
const content = keepLines.join("\n") + "\n";
|
|
2535
|
-
await
|
|
2624
|
+
await fs9.promises.writeFile(filePath, content, "utf8");
|
|
2536
2625
|
return lines.length - maxLines;
|
|
2537
2626
|
}
|
|
2538
2627
|
return 0;
|
|
@@ -2547,8 +2636,8 @@ var FileLogger = class _FileLogger extends import_events.EventEmitter {
|
|
|
2547
2636
|
*/
|
|
2548
2637
|
static async deleteLogFile(filePath) {
|
|
2549
2638
|
try {
|
|
2550
|
-
if (
|
|
2551
|
-
await
|
|
2639
|
+
if (fs9.existsSync(filePath)) {
|
|
2640
|
+
await fs9.promises.unlink(filePath);
|
|
2552
2641
|
return true;
|
|
2553
2642
|
}
|
|
2554
2643
|
return false;
|
|
@@ -2964,6 +3053,7 @@ function convertToType(value, type2) {
|
|
|
2964
3053
|
DaemonClient,
|
|
2965
3054
|
DbConfig,
|
|
2966
3055
|
Engine,
|
|
3056
|
+
EnvLoader,
|
|
2967
3057
|
FileLogger,
|
|
2968
3058
|
QueryEngine,
|
|
2969
3059
|
TableProcessor,
|