@dbcube/core 1.0.26 → 1.0.30

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/bin.cjs CHANGED
@@ -151,7 +151,11 @@ var path = __toESM(require("path"));
151
151
  var os2 = __toESM(require("os"));
152
152
  var import_follow_redirects = require("follow-redirects");
153
153
  var unzipper = __toESM(require("unzipper"));
154
+ var import_ora = __toESM(require("ora"));
155
+ var import_chalk = __toESM(require("chalk"));
154
156
  var Downloader = class {
157
+ static mainSpinner = null;
158
+ static currentSpinner = null;
155
159
  static get(prefix) {
156
160
  const arch2 = new Arquitecture();
157
161
  const platform2 = arch2.getPlatform();
@@ -163,7 +167,7 @@ var Downloader = class {
163
167
  };
164
168
  const archMap = {
165
169
  x86_64: "x64",
166
- arm64: "arm64"
170
+ aarch64: "arm64"
167
171
  };
168
172
  const plat = platformMap[platform2];
169
173
  const archSuffix = archMap[architecture];
@@ -185,149 +189,203 @@ var Downloader = class {
185
189
  schema_engine: ""
186
190
  };
187
191
  }
188
- static async download() {
192
+ static async download(targetDir) {
189
193
  const binaries = ["schema", "query", "sqlite"];
190
- const binDir = path.resolve(__dirname, "..", "bin");
194
+ const binDir = targetDir || this.getDefaultBinDir();
191
195
  fs.mkdirSync(binDir, { recursive: true });
192
- for (const prefix of binaries) {
193
- const maxRetries = 2;
196
+ this.mainSpinner = (0, import_ora.default)({
197
+ text: import_chalk.default.blue("Descargando binarios necesarios..."),
198
+ spinner: "dots12"
199
+ }).start();
200
+ for (let i = 0; i < binaries.length; i++) {
201
+ const prefix = binaries[i];
202
+ const maxRetries = 3;
194
203
  let attempt = 0;
195
204
  while (attempt <= maxRetries) {
196
205
  try {
197
- console.log(`==> Empezando descarga para: ${prefix} (intento ${attempt + 1}/${maxRetries + 1})`);
198
206
  const binaryInfo = this.get(prefix);
199
- console.log(`Descargando: ${binaryInfo.name}`);
200
- console.log(`URL: ${binaryInfo.url}`);
201
- if (!binaryInfo.name) {
202
- throw new Error("Unsupported platform or architecture");
207
+ if (!binaryInfo.name || !binaryInfo.url) {
208
+ throw new Error("Plataforma o arquitectura no soportada");
203
209
  }
204
- const tempZipPath = path.join(os2.tmpdir(), `binary-${prefix}-${Date.now()}.zip`);
210
+ const tempZipPath = path.join(os2.tmpdir(), `dbcube-${prefix}-${Date.now()}.zip`);
205
211
  const finalBinaryPath = path.join(binDir, binaryInfo.name);
206
212
  if (fs.existsSync(finalBinaryPath)) {
207
- console.log(`\u26A0\uFE0F El binario ya existe, omitiendo: ${finalBinaryPath}`);
213
+ this.updateMainProgress(prefix, i + 1, binaries.length, "exists");
208
214
  break;
209
215
  }
210
- await new Promise((resolve2, reject) => {
211
- console.log(`Iniciando descarga de ${prefix}...`);
212
- const request = import_follow_redirects.https.get(binaryInfo.url, (response) => {
213
- console.log(`HTTP ${response.statusCode} para ${prefix}`);
214
- if (response.statusCode === 302 || response.statusCode === 301) {
215
- const redirectUrl = response.headers.location;
216
- if (redirectUrl) {
217
- console.log(`Redirigiendo a: ${redirectUrl}`);
218
- import_follow_redirects.https.get(redirectUrl, handleResponse);
219
- return;
220
- }
221
- }
222
- if (response.statusCode !== 200) {
223
- reject(new Error(`HTTP ${response.statusCode} para ${prefix}`));
224
- return;
225
- }
226
- handleResponse(response);
227
- });
228
- function handleResponse(response) {
229
- const file = fs.createWriteStream(tempZipPath);
230
- const totalBytes = parseInt(response.headers["content-length"] || "0", 10);
231
- let downloadedBytes = 0;
232
- console.log(`Descargando ${(totalBytes / 1024 / 1024).toFixed(1)}MB para ${prefix}...`);
233
- response.on("data", (chunk) => {
234
- downloadedBytes += chunk.length;
235
- file.write(chunk);
236
- });
237
- response.on("end", () => {
238
- file.end();
239
- console.log(`\u2705 Descarga completada para ${prefix}`);
240
- resolve2();
241
- });
242
- response.on("error", (err) => {
243
- file.close();
244
- try {
245
- fs.unlinkSync(tempZipPath);
246
- } catch {
247
- }
248
- reject(err);
249
- });
250
- file.on("error", (err) => {
251
- file.close();
252
- try {
253
- fs.unlinkSync(tempZipPath);
254
- } catch {
255
- }
256
- reject(err);
257
- });
258
- }
259
- request.on("error", (err) => {
260
- reject(err);
261
- });
262
- request.setTimeout(12e4, () => {
263
- request.destroy();
264
- reject(new Error(`Timeout descargando ${prefix}`));
265
- });
266
- });
267
- console.log(`Zip descargado para ${prefix}, extrayendo...`);
268
- await new Promise((resolve2, reject) => {
269
- let extracted = false;
270
- fs.createReadStream(tempZipPath).pipe(unzipper.Parse()).on("entry", (entry) => {
271
- const fileName = entry.path;
272
- const type2 = entry.type;
273
- console.log(`Encontrado en ZIP: ${fileName} (${type2})`);
274
- if (type2 === "File" && !extracted) {
275
- extracted = true;
276
- const writeStream = fs.createWriteStream(finalBinaryPath);
277
- entry.pipe(writeStream);
278
- writeStream.on("finish", () => {
279
- if (process.platform !== "win32") {
280
- fs.chmodSync(finalBinaryPath, 493);
281
- }
282
- try {
283
- fs.unlinkSync(tempZipPath);
284
- } catch {
285
- }
286
- console.log(`Binario extra\xEDdo y guardado: ${finalBinaryPath}`);
287
- resolve2();
288
- });
289
- writeStream.on("error", (err) => {
290
- try {
291
- fs.unlinkSync(tempZipPath);
292
- } catch {
293
- }
294
- reject(err);
295
- });
296
- } else {
297
- entry.autodrain();
298
- }
299
- }).on("error", (err) => {
300
- try {
301
- fs.unlinkSync(tempZipPath);
302
- } catch {
303
- }
304
- reject(err);
305
- }).on("close", () => {
306
- if (!extracted) {
307
- try {
308
- fs.unlinkSync(tempZipPath);
309
- } catch {
310
- }
311
- reject(new Error(`No se encontr\xF3 ning\xFAn archivo v\xE1lido en el ZIP para ${prefix}`));
312
- }
313
- });
314
- });
315
- console.log(`==> Finaliz\xF3 descarga y extracci\xF3n para: ${prefix}`);
216
+ this.updateMainProgress(prefix, i + 1, binaries.length, "downloading");
217
+ await this.downloadFileWithProgress(binaryInfo.url, tempZipPath, prefix);
218
+ this.updateMainProgress(prefix, i + 1, binaries.length, "extracting");
219
+ await this.extractBinary(tempZipPath, finalBinaryPath, prefix);
220
+ this.updateMainProgress(prefix, i + 1, binaries.length, "completed");
316
221
  break;
317
222
  } catch (error) {
318
223
  const errorMessage = error instanceof Error ? error.message : "Error desconocido";
319
- if (attempt < maxRetries && (errorMessage.includes("ECONNRESET") || errorMessage.includes("timeout"))) {
320
- console.warn(`\u26A0\uFE0F Error de conexi\xF3n para ${prefix}: ${errorMessage}`);
321
- console.log(`\u{1F504} Reintentando en 2 segundos...`);
224
+ if (attempt < maxRetries && (errorMessage.includes("ECONNRESET") || errorMessage.includes("timeout") || errorMessage.includes("ETIMEDOUT") || errorMessage.includes("ENOTFOUND"))) {
322
225
  attempt++;
226
+ this.updateMainProgress(prefix, i + 1, binaries.length, "retrying", attempt);
323
227
  await new Promise((resolve2) => setTimeout(resolve2, 2e3));
324
228
  } else {
325
- console.error(`\u274C Error final descargando ${prefix} despu\xE9s de ${attempt + 1} intentos:`, errorMessage);
229
+ this.mainSpinner.fail(import_chalk.default.red(`Error descargando ${prefix}: ${errorMessage}`));
326
230
  throw error;
327
231
  }
328
232
  }
329
233
  }
330
234
  }
235
+ this.mainSpinner.succeed(import_chalk.default.green("Binarios descargados correctamente"));
236
+ }
237
+ static updateMainProgress(binary, current, total, status, attempt) {
238
+ const progressBar = this.createProgressBar(current, total);
239
+ const statusEmojis = {
240
+ downloading: "\u{1F4E5}",
241
+ extracting: "\u{1F4E6}",
242
+ completed: "\u2705",
243
+ exists: "\u2705",
244
+ retrying: "\u{1F504}"
245
+ };
246
+ const statusMessages = {
247
+ downloading: import_chalk.default.blue("descargando"),
248
+ extracting: import_chalk.default.yellow("extrayendo"),
249
+ completed: import_chalk.default.green("completado"),
250
+ exists: import_chalk.default.gray("existe"),
251
+ retrying: import_chalk.default.orange(`reintentando (${attempt}/${3})`)
252
+ };
253
+ const emoji = statusEmojis[status] || "\u{1F4E5}";
254
+ const message = statusMessages[status] || status;
255
+ this.mainSpinner.text = `${progressBar} ${emoji} ${import_chalk.default.bold(binary)} - ${message}`;
256
+ }
257
+ static createProgressBar(current, total, width = 20) {
258
+ const filled = Math.round(current / total * width);
259
+ const empty = width - filled;
260
+ const filledBar = import_chalk.default.green("\u2588".repeat(filled));
261
+ const emptyBar = import_chalk.default.gray("\u2591".repeat(empty));
262
+ const percentage = import_chalk.default.bold(`${current}/${total}`);
263
+ return `[${filledBar}${emptyBar}] ${percentage}`;
264
+ }
265
+ static downloadFileWithProgress(url, outputPath, prefix) {
266
+ return new Promise((resolve2, reject) => {
267
+ const request = import_follow_redirects.https.get(url, { timeout: 6e4 }, (response) => {
268
+ if (response.statusCode === 302 || response.statusCode === 301) {
269
+ const redirectUrl = response.headers.location;
270
+ if (redirectUrl) {
271
+ return this.downloadFileWithProgress(redirectUrl, outputPath, prefix).then(resolve2).catch(reject);
272
+ }
273
+ }
274
+ if (response.statusCode !== 200) {
275
+ reject(new Error(`HTTP ${response.statusCode} para ${prefix}`));
276
+ return;
277
+ }
278
+ const file = fs.createWriteStream(outputPath);
279
+ const totalBytes = parseInt(response.headers["content-length"] || "0", 10);
280
+ let downloadedBytes = 0;
281
+ response.on("data", (chunk) => {
282
+ downloadedBytes += chunk.length;
283
+ file.write(chunk);
284
+ if (totalBytes > 0) {
285
+ const progress = {
286
+ downloaded: downloadedBytes,
287
+ total: totalBytes,
288
+ percentage: downloadedBytes / totalBytes * 100
289
+ };
290
+ this.updateDownloadProgress(prefix, progress);
291
+ }
292
+ });
293
+ response.on("end", () => {
294
+ file.end();
295
+ resolve2();
296
+ });
297
+ response.on("error", (err) => {
298
+ file.close();
299
+ this.cleanupFile(outputPath);
300
+ reject(err);
301
+ });
302
+ file.on("error", (err) => {
303
+ file.close();
304
+ this.cleanupFile(outputPath);
305
+ reject(err);
306
+ });
307
+ });
308
+ request.on("error", reject);
309
+ request.on("timeout", () => {
310
+ request.destroy();
311
+ reject(new Error(`Timeout descargando ${prefix}`));
312
+ });
313
+ });
314
+ }
315
+ static updateDownloadProgress(binary, progress) {
316
+ const percentage = progress.percentage.toFixed(1);
317
+ const downloaded = (progress.downloaded / 1024 / 1024).toFixed(1);
318
+ const total = (progress.total / 1024 / 1024).toFixed(1);
319
+ const barWidth = 15;
320
+ const filled = Math.round(progress.percentage / 100 * barWidth);
321
+ const empty = barWidth - filled;
322
+ const progressBar = import_chalk.default.green("\u2588".repeat(filled)) + import_chalk.default.gray("\u2591".repeat(empty));
323
+ const progressText = `[${progressBar}] ${percentage}% (${downloaded}/${total}MB)`;
324
+ this.mainSpinner.text = `\u{1F4E5} ${import_chalk.default.bold(binary)} - ${progressText}`;
325
+ }
326
+ static extractBinary(zipPath, outputPath, prefix) {
327
+ return new Promise((resolve2, reject) => {
328
+ let extracted = false;
329
+ fs.createReadStream(zipPath).pipe(unzipper.Parse()).on("entry", (entry) => {
330
+ if (entry.type === "File" && !extracted) {
331
+ extracted = true;
332
+ const writeStream = fs.createWriteStream(outputPath);
333
+ entry.pipe(writeStream);
334
+ writeStream.on("finish", () => {
335
+ if (process.platform !== "win32") {
336
+ fs.chmodSync(outputPath, 493);
337
+ }
338
+ this.cleanupFile(zipPath);
339
+ resolve2();
340
+ });
341
+ writeStream.on("error", (err) => {
342
+ this.cleanupFile(zipPath);
343
+ reject(err);
344
+ });
345
+ } else {
346
+ entry.autodrain();
347
+ }
348
+ }).on("error", (err) => {
349
+ this.cleanupFile(zipPath);
350
+ reject(err);
351
+ }).on("close", () => {
352
+ if (!extracted) {
353
+ this.cleanupFile(zipPath);
354
+ reject(new Error(`No se encontr\xF3 archivo v\xE1lido en el ZIP para ${prefix}`));
355
+ }
356
+ });
357
+ });
358
+ }
359
+ static cleanupFile(filePath) {
360
+ try {
361
+ if (fs.existsSync(filePath)) {
362
+ fs.unlinkSync(filePath);
363
+ }
364
+ } catch {
365
+ }
366
+ }
367
+ static getDefaultBinDir() {
368
+ const possibleDirs = [
369
+ path.resolve(process.cwd(), "bin"),
370
+ path.resolve(process.cwd(), "node_modules", ".dbcube", "bin"),
371
+ path.resolve(__dirname, "..", "bin")
372
+ ];
373
+ for (const dir of possibleDirs) {
374
+ try {
375
+ if (!fs.existsSync(dir)) {
376
+ fs.mkdirSync(dir, { recursive: true });
377
+ }
378
+ const testFile = path.join(dir, ".test");
379
+ fs.writeFileSync(testFile, "test");
380
+ fs.unlinkSync(testFile);
381
+ return dir;
382
+ } catch {
383
+ continue;
384
+ }
385
+ }
386
+ const tempDir = path.join(os2.tmpdir(), "dbcube-bin");
387
+ fs.mkdirSync(tempDir, { recursive: true });
388
+ return tempDir;
331
389
  }
332
390
  };
333
391
 
package/dist/bin.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/Arquitecture.ts","../src/lib/Donwloader.ts","../src/bin.ts"],"sourcesContent":["import * as os from 'os';\r\nimport * as path from 'path';\r\nimport * as fs from 'fs';\r\n\r\ninterface SystemInfo {\r\n platform: string;\r\n arch: string;\r\n release: string;\r\n type: string;\r\n endianness: string;\r\n cpus: number;\r\n}\r\n\r\ninterface BinaryInfo {\r\n name: string;\r\n path: string;\r\n exists: boolean;\r\n executable: boolean;\r\n}\r\n\r\nclass Arquitecture {\r\n private systemInfo: SystemInfo;\r\n\r\n constructor() {\r\n this.systemInfo = this.detectSystemInfo();\r\n }\r\n\r\n /**\r\n * Detecta información completa del sistema\r\n */\r\n private detectSystemInfo(): SystemInfo {\r\n return {\r\n platform: os.platform(),\r\n arch: os.arch(),\r\n release: os.release(),\r\n type: os.type(),\r\n endianness: os.endianness(),\r\n cpus: os.cpus().length\r\n };\r\n }\r\n\r\n /**\r\n * Obtiene la plataforma normalizada\r\n */\r\n getPlatform(): string {\r\n const platform = this.systemInfo.platform;\r\n \r\n switch (platform) {\r\n case 'win32':\r\n return 'windows';\r\n case 'darwin':\r\n return 'macos';\r\n case 'linux':\r\n return 'linux';\r\n case 'freebsd':\r\n return 'freebsd';\r\n case 'openbsd':\r\n return 'openbsd';\r\n case 'sunos':\r\n return 'solaris';\r\n default:\r\n return platform;\r\n }\r\n }\r\n\r\n /**\r\n * Obtiene la arquitectura normalizada\r\n */\r\n getArchitecture(): string {\r\n const arch = this.systemInfo.arch;\r\n \r\n switch (arch) {\r\n case 'x64':\r\n return 'x86_64';\r\n case 'x32':\r\n case 'ia32':\r\n return 'i686';\r\n case 'arm64':\r\n return 'aarch64';\r\n case 'arm':\r\n return 'armv7';\r\n case 'ppc64':\r\n return 'powerpc64';\r\n case 'ppc':\r\n return 'powerpc';\r\n case 's390x':\r\n return 's390x';\r\n case 'mips':\r\n return 'mips';\r\n case 'mipsel':\r\n return 'mipsel';\r\n default:\r\n return arch;\r\n }\r\n }\r\n\r\n /**\r\n * Genera el nombre del binario basado en la arquitectura\r\n */\r\n getBinaryName(baseName: string): string {\r\n const platform = this.getPlatform();\r\n const arch = this.getArchitecture();\r\n const extension = platform === 'windows' ? '.exe' : '';\r\n \r\n return `${baseName}-${platform}-${arch}${extension}`;\r\n }\r\n\r\n /**\r\n * Obtiene información completa del sistema\r\n */\r\n getSystemInfo(): SystemInfo {\r\n return { ...this.systemInfo };\r\n }\r\n\r\n /**\r\n * Obtiene el triple de destino (target triple) para Rust\r\n */\r\n getRustTargetTriple(): string {\r\n const platform = this.getPlatform();\r\n const arch = this.getArchitecture();\r\n \r\n // Mapeo de plataformas y arquitecturas a target triples de Rust\r\n const targetMap: { [key: string]: string } = {\r\n 'linux-x86_64': 'x86_64-unknown-linux-gnu',\r\n 'linux-i686': 'i686-unknown-linux-gnu',\r\n 'linux-aarch64': 'aarch64-unknown-linux-gnu',\r\n 'linux-armv7': 'armv7-unknown-linux-gnueabihf',\r\n 'macos-x86_64': 'x86_64-apple-darwin',\r\n 'macos-aarch64': 'aarch64-apple-darwin',\r\n 'windows-x86_64': 'x86_64-pc-windows-msvc',\r\n 'windows-i686': 'i686-pc-windows-msvc',\r\n 'windows-aarch64': 'aarch64-pc-windows-msvc',\r\n 'freebsd-x86_64': 'x86_64-unknown-freebsd',\r\n };\r\n \r\n const key = `${platform}-${arch}`;\r\n return targetMap[key] || `${arch}-unknown-${platform}`;\r\n }\r\n\r\n /**\r\n * Muestra información detallada del sistema\r\n */\r\n printSystemInfo(): void {\r\n console.log('🖥️ System Information:');\r\n console.log('├─ Platform:', this.getPlatform());\r\n console.log('├─ Arquitecture:', this.getArchitecture());\r\n console.log('├─ OS Type:', this.systemInfo.type);\r\n console.log('├─ OS Release:', this.systemInfo.release);\r\n console.log('├─ Endianness:', this.systemInfo.endianness);\r\n console.log('├─ CPUs:', this.systemInfo.cpus);\r\n console.log('└─ Rust Target:', this.getRustTargetTriple());\r\n }\r\n}\r\n\r\nexport { \r\n Arquitecture, \r\n SystemInfo,\r\n BinaryInfo\r\n};","import { BinaryType } from \"../@types/Binary\";\r\nimport { Arquitecture } from \"./Arquitecture\";\r\nimport * as fs from \"fs\";\r\nimport * as path from \"path\";\r\nimport * as os from \"os\";\r\nimport { https } from 'follow-redirects';\r\nimport * as unzipper from \"unzipper\";\r\nimport { IncomingMessage } from 'http';\r\n\r\nclass Downloader {\r\n static get(prefix: string): BinaryType & { name: string; url: string } {\r\n const arch = new Arquitecture();\r\n const platform = arch.getPlatform();\r\n const architecture = arch.getArchitecture();\r\n \r\n const platformMap: Record<string, string> = {\r\n windows: \"windows\",\r\n linux: \"linux\",\r\n darwin: \"macos\"\r\n };\r\n \r\n const archMap: Record<string, string> = {\r\n x86_64: \"x64\",\r\n arm64: \"arm64\"\r\n };\r\n \r\n const plat = platformMap[platform];\r\n const archSuffix = archMap[architecture];\r\n \r\n if (plat && archSuffix) {\r\n const baseName = `${prefix}-engine-${plat}-${archSuffix}`;\r\n const binaryName = platform === \"windows\" ? `${baseName}.exe` : baseName;\r\n \r\n const url = `https://github.com/Dbcube/binaries/releases/download/${prefix}-engine/${prefix}-engine-latest-${plat}-${archSuffix}.zip`;\r\n return {\r\n name: binaryName,\r\n url,\r\n query_engine: binaryName,\r\n schema_engine: `${prefix}-engine-${plat}-${archSuffix}${platform === \"windows\" ? \".exe\" : \"\"}`\r\n };\r\n }\r\n \r\n return {\r\n name: \"\",\r\n url: \"\",\r\n query_engine: \"\",\r\n schema_engine: \"\"\r\n };\r\n }\r\n\r\n static async download(): Promise<void> {\r\n const binaries = ['schema', 'query', 'sqlite'];\r\n const binDir = path.resolve(__dirname, \"..\", \"bin\");\r\n fs.mkdirSync(binDir, { recursive: true });\r\n\r\n for (const prefix of binaries) {\r\n const maxRetries = 2;\r\n let attempt = 0;\r\n \r\n while (attempt <= maxRetries) {\r\n try {\r\n console.log(`==> Empezando descarga para: ${prefix} (intento ${attempt + 1}/${maxRetries + 1})`);\r\n const binaryInfo = this.get(prefix);\r\n console.log(`Descargando: ${binaryInfo.name}`);\r\n console.log(`URL: ${binaryInfo.url}`);\r\n\r\n if (!binaryInfo.name) {\r\n throw new Error(\"Unsupported platform or architecture\");\r\n }\r\n\r\n const tempZipPath = path.join(os.tmpdir(), `binary-${prefix}-${Date.now()}.zip`);\r\n const finalBinaryPath = path.join(binDir, binaryInfo.name);\r\n\r\n if (fs.existsSync(finalBinaryPath)) {\r\n console.log(`⚠️ El binario ya existe, omitiendo: ${finalBinaryPath}`);\r\n break;\r\n }\r\n\r\n // Descargar el archivo ZIP de forma más robusta\r\n await new Promise<void>((resolve, reject) => {\r\n console.log(`Iniciando descarga de ${prefix}...`);\r\n \r\n const request = https.get(binaryInfo.url, (response: IncomingMessage) => {\r\n console.log(`HTTP ${response.statusCode} para ${prefix}`);\r\n \r\n if (response.statusCode === 302 || response.statusCode === 301) {\r\n // Manejar redirección\r\n const redirectUrl = response.headers.location;\r\n if (redirectUrl) {\r\n console.log(`Redirigiendo a: ${redirectUrl}`);\r\n https.get(redirectUrl, handleResponse);\r\n return;\r\n }\r\n }\r\n \r\n if (response.statusCode !== 200) {\r\n reject(new Error(`HTTP ${response.statusCode} para ${prefix}`));\r\n return;\r\n }\r\n\r\n handleResponse(response);\r\n });\r\n\r\n function handleResponse(response: IncomingMessage) {\r\n const file = fs.createWriteStream(tempZipPath);\r\n const totalBytes = parseInt(response.headers['content-length'] || '0', 10);\r\n let downloadedBytes = 0;\r\n \r\n console.log(`Descargando ${(totalBytes / 1024 / 1024).toFixed(1)}MB para ${prefix}...`);\r\n\r\n response.on('data', (chunk) => {\r\n downloadedBytes += chunk.length;\r\n file.write(chunk);\r\n });\r\n\r\n response.on('end', () => {\r\n file.end();\r\n console.log(`✅ Descarga completada para ${prefix}`);\r\n resolve();\r\n });\r\n\r\n response.on('error', (err) => {\r\n file.close();\r\n try { fs.unlinkSync(tempZipPath); } catch {}\r\n reject(err);\r\n });\r\n\r\n file.on('error', (err) => {\r\n file.close();\r\n try { fs.unlinkSync(tempZipPath); } catch {}\r\n reject(err);\r\n });\r\n }\r\n\r\n request.on('error', (err) => {\r\n reject(err);\r\n });\r\n\r\n // Timeout de 2 minutos\r\n request.setTimeout(120000, () => {\r\n request.destroy();\r\n reject(new Error(`Timeout descargando ${prefix}`));\r\n });\r\n });\r\n\r\n console.log(`Zip descargado para ${prefix}, extrayendo...`);\r\n\r\n // Extraer el archivo ZIP\r\n await new Promise<void>((resolve, reject) => {\r\n let extracted = false;\r\n \r\n fs.createReadStream(tempZipPath)\r\n .pipe(unzipper.Parse())\r\n .on('entry', (entry: unzipper.Entry) => {\r\n const fileName: string = entry.path;\r\n const type: string = entry.type;\r\n \r\n console.log(`Encontrado en ZIP: ${fileName} (${type})`);\r\n \r\n if (type === 'File' && !extracted) {\r\n extracted = true;\r\n const writeStream = fs.createWriteStream(finalBinaryPath);\r\n \r\n entry.pipe(writeStream);\r\n \r\n writeStream.on('finish', () => {\r\n // Hacer el archivo ejecutable en sistemas Unix\r\n if (process.platform !== 'win32') {\r\n fs.chmodSync(finalBinaryPath, 0o755);\r\n }\r\n \r\n // Limpiar archivo temporal\r\n try { fs.unlinkSync(tempZipPath); } catch {}\r\n \r\n console.log(`Binario extraído y guardado: ${finalBinaryPath}`);\r\n resolve();\r\n });\r\n \r\n writeStream.on('error', (err: Error) => {\r\n try { fs.unlinkSync(tempZipPath); } catch {}\r\n reject(err);\r\n });\r\n } else {\r\n entry.autodrain();\r\n }\r\n })\r\n .on('error', (err: Error) => {\r\n try { fs.unlinkSync(tempZipPath); } catch {}\r\n reject(err);\r\n })\r\n .on('close', () => {\r\n if (!extracted) {\r\n try { fs.unlinkSync(tempZipPath); } catch {}\r\n reject(new Error(`No se encontró ningún archivo válido en el ZIP para ${prefix}`));\r\n }\r\n });\r\n });\r\n\r\n console.log(`==> Finalizó descarga y extracción para: ${prefix}`);\r\n break; // Éxito, salir del loop de reintentos\r\n\r\n } catch (error: unknown) {\r\n const errorMessage = error instanceof Error ? error.message : 'Error desconocido';\r\n \r\n if (attempt < maxRetries && (errorMessage.includes('ECONNRESET') || errorMessage.includes('timeout'))) {\r\n console.warn(`⚠️ Error de conexión para ${prefix}: ${errorMessage}`);\r\n console.log(`🔄 Reintentando en 2 segundos...`);\r\n attempt++;\r\n await new Promise(resolve => setTimeout(resolve, 2000));\r\n } else {\r\n console.error(`❌ Error final descargando ${prefix} después de ${attempt + 1} intentos:`, errorMessage);\r\n throw error; // Re-lanzar después de todos los intentos\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport { Downloader };","#!/usr/bin/env node\r\n\r\nimport { Downloader } from \"./lib/Donwloader\";\r\n\r\n/**\r\n * Script CLI para descargar binarios manualmente\r\n */\r\nasync function main() {\r\n const args = process.argv.slice(2);\r\n const command = args[0];\r\n\r\n switch (command) {\r\n case 'install':\r\n case 'download':\r\n console.log('🚀 Iniciando descarga de binarios DBCube...');\r\n try {\r\n await Downloader.download();\r\n console.log('✅ ¡Todos los binarios descargados exitosamente!');\r\n } catch (error) {\r\n console.error('❌ Error descargando binarios:', error);\r\n process.exit(1);\r\n }\r\n break;\r\n \r\n case 'check':\r\n console.log('🔍 Verificando binarios...');\r\n const binaries = ['schema', 'query', 'sqlite'];\r\n for (const prefix of binaries) {\r\n const binary = Downloader.get(prefix);\r\n console.log(`${prefix}-engine: ${binary.name}`);\r\n console.log(` URL: ${binary.url}`);\r\n }\r\n break;\r\n \r\n default:\r\n console.log('DBCube Binary Manager');\r\n console.log('');\r\n console.log('Comandos disponibles:');\r\n console.log(' install|download - Descargar todos los binarios');\r\n console.log(' check - Verificar información de binarios');\r\n console.log('');\r\n console.log('Uso:');\r\n console.log(' npx @dbcube/core install');\r\n console.log(' npx @dbcube/core check');\r\n }\r\n}\r\n\r\nmain().catch(error => {\r\n console.error('Error:', error);\r\n process.exit(1);\r\n});"],"mappings":"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","names":["platform","arch","os","arch","platform","resolve","type"]}
1
+ {"version":3,"sources":["../src/lib/Arquitecture.ts","../src/lib/Donwloader.ts","../src/bin.ts"],"sourcesContent":["import * as os from 'os';\r\nimport * as path from 'path';\r\nimport * as fs from 'fs';\r\n\r\ninterface SystemInfo {\r\n platform: string;\r\n arch: string;\r\n release: string;\r\n type: string;\r\n endianness: string;\r\n cpus: number;\r\n}\r\n\r\ninterface BinaryInfo {\r\n name: string;\r\n path: string;\r\n exists: boolean;\r\n executable: boolean;\r\n}\r\n\r\nclass Arquitecture {\r\n private systemInfo: SystemInfo;\r\n\r\n constructor() {\r\n this.systemInfo = this.detectSystemInfo();\r\n }\r\n\r\n /**\r\n * Detecta información completa del sistema\r\n */\r\n private detectSystemInfo(): SystemInfo {\r\n return {\r\n platform: os.platform(),\r\n arch: os.arch(),\r\n release: os.release(),\r\n type: os.type(),\r\n endianness: os.endianness(),\r\n cpus: os.cpus().length\r\n };\r\n }\r\n\r\n /**\r\n * Obtiene la plataforma normalizada\r\n */\r\n getPlatform(): string {\r\n const platform = this.systemInfo.platform;\r\n \r\n switch (platform) {\r\n case 'win32':\r\n return 'windows';\r\n case 'darwin':\r\n return 'macos';\r\n case 'linux':\r\n return 'linux';\r\n case 'freebsd':\r\n return 'freebsd';\r\n case 'openbsd':\r\n return 'openbsd';\r\n case 'sunos':\r\n return 'solaris';\r\n default:\r\n return platform;\r\n }\r\n }\r\n\r\n /**\r\n * Obtiene la arquitectura normalizada\r\n */\r\n getArchitecture(): string {\r\n const arch = this.systemInfo.arch;\r\n \r\n switch (arch) {\r\n case 'x64':\r\n return 'x86_64';\r\n case 'x32':\r\n case 'ia32':\r\n return 'i686';\r\n case 'arm64':\r\n return 'aarch64';\r\n case 'arm':\r\n return 'armv7';\r\n case 'ppc64':\r\n return 'powerpc64';\r\n case 'ppc':\r\n return 'powerpc';\r\n case 's390x':\r\n return 's390x';\r\n case 'mips':\r\n return 'mips';\r\n case 'mipsel':\r\n return 'mipsel';\r\n default:\r\n return arch;\r\n }\r\n }\r\n\r\n /**\r\n * Genera el nombre del binario basado en la arquitectura\r\n */\r\n getBinaryName(baseName: string): string {\r\n const platform = this.getPlatform();\r\n const arch = this.getArchitecture();\r\n const extension = platform === 'windows' ? '.exe' : '';\r\n \r\n return `${baseName}-${platform}-${arch}${extension}`;\r\n }\r\n\r\n /**\r\n * Obtiene información completa del sistema\r\n */\r\n getSystemInfo(): SystemInfo {\r\n return { ...this.systemInfo };\r\n }\r\n\r\n /**\r\n * Obtiene el triple de destino (target triple) para Rust\r\n */\r\n getRustTargetTriple(): string {\r\n const platform = this.getPlatform();\r\n const arch = this.getArchitecture();\r\n \r\n // Mapeo de plataformas y arquitecturas a target triples de Rust\r\n const targetMap: { [key: string]: string } = {\r\n 'linux-x86_64': 'x86_64-unknown-linux-gnu',\r\n 'linux-i686': 'i686-unknown-linux-gnu',\r\n 'linux-aarch64': 'aarch64-unknown-linux-gnu',\r\n 'linux-armv7': 'armv7-unknown-linux-gnueabihf',\r\n 'macos-x86_64': 'x86_64-apple-darwin',\r\n 'macos-aarch64': 'aarch64-apple-darwin',\r\n 'windows-x86_64': 'x86_64-pc-windows-msvc',\r\n 'windows-i686': 'i686-pc-windows-msvc',\r\n 'windows-aarch64': 'aarch64-pc-windows-msvc',\r\n 'freebsd-x86_64': 'x86_64-unknown-freebsd',\r\n };\r\n \r\n const key = `${platform}-${arch}`;\r\n return targetMap[key] || `${arch}-unknown-${platform}`;\r\n }\r\n\r\n /**\r\n * Muestra información detallada del sistema\r\n */\r\n printSystemInfo(): void {\r\n console.log('🖥️ System Information:');\r\n console.log('├─ Platform:', this.getPlatform());\r\n console.log('├─ Arquitecture:', this.getArchitecture());\r\n console.log('├─ OS Type:', this.systemInfo.type);\r\n console.log('├─ OS Release:', this.systemInfo.release);\r\n console.log('├─ Endianness:', this.systemInfo.endianness);\r\n console.log('├─ CPUs:', this.systemInfo.cpus);\r\n console.log('└─ Rust Target:', this.getRustTargetTriple());\r\n }\r\n}\r\n\r\nexport { \r\n Arquitecture, \r\n SystemInfo,\r\n BinaryInfo\r\n};","import { BinaryType } from \"../@types/Binary\";\r\nimport { Arquitecture } from \"./Arquitecture\";\r\nimport * as fs from \"fs\";\r\nimport * as path from \"path\";\r\nimport * as os from \"os\";\r\nimport { https } from 'follow-redirects';\r\nimport * as unzipper from \"unzipper\";\r\nimport { IncomingMessage } from 'http';\r\nimport ora from \"ora\";\r\nimport chalk from \"chalk\";\r\n\r\ninterface DownloadProgress {\r\n downloaded: number;\r\n total: number;\r\n percentage: number;\r\n}\r\n\r\nclass Downloader {\r\n private static mainSpinner: any = null;\r\n private static currentSpinner: any = null;\r\n \r\n static get(prefix: string): BinaryType & { name: string; url: string } {\r\n const arch = new Arquitecture();\r\n const platform = arch.getPlatform();\r\n const architecture = arch.getArchitecture();\r\n \r\n const platformMap: Record<string, string> = {\r\n windows: \"windows\",\r\n linux: \"linux\",\r\n darwin: \"macos\"\r\n };\r\n \r\n const archMap: Record<string, string> = {\r\n x86_64: \"x64\",\r\n aarch64: \"arm64\"\r\n };\r\n \r\n const plat = platformMap[platform];\r\n const archSuffix = archMap[architecture];\r\n \r\n if (plat && archSuffix) {\r\n const baseName = `${prefix}-engine-${plat}-${archSuffix}`;\r\n const binaryName = platform === \"windows\" ? `${baseName}.exe` : baseName;\r\n \r\n const url = `https://github.com/Dbcube/binaries/releases/download/${prefix}-engine/${prefix}-engine-latest-${plat}-${archSuffix}.zip`;\r\n return {\r\n name: binaryName,\r\n url,\r\n query_engine: binaryName,\r\n schema_engine: `${prefix}-engine-${plat}-${archSuffix}${platform === \"windows\" ? \".exe\" : \"\"}`\r\n };\r\n }\r\n \r\n return {\r\n name: \"\",\r\n url: \"\",\r\n query_engine: \"\",\r\n schema_engine: \"\"\r\n };\r\n }\r\n\r\n static async download(targetDir?: string): Promise<void> {\r\n const binaries = ['schema', 'query', 'sqlite'];\r\n const binDir = targetDir || this.getDefaultBinDir();\r\n fs.mkdirSync(binDir, { recursive: true });\r\n\r\n // Initialize main spinner\r\n this.mainSpinner = ora({\r\n text: chalk.blue('Descargando binarios necesarios...'),\r\n spinner: 'dots12'\r\n }).start();\r\n\r\n for (let i = 0; i < binaries.length; i++) {\r\n const prefix = binaries[i];\r\n const maxRetries = 3;\r\n let attempt = 0;\r\n \r\n while (attempt <= maxRetries) {\r\n try {\r\n const binaryInfo = this.get(prefix);\r\n\r\n if (!binaryInfo.name || !binaryInfo.url) {\r\n throw new Error(\"Plataforma o arquitectura no soportada\");\r\n }\r\n\r\n const tempZipPath = path.join(os.tmpdir(), `dbcube-${prefix}-${Date.now()}.zip`);\r\n const finalBinaryPath = path.join(binDir, binaryInfo.name);\r\n\r\n // Skip if already exists\r\n if (fs.existsSync(finalBinaryPath)) {\r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'exists');\r\n break;\r\n }\r\n\r\n // Update main spinner for current binary\r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'downloading');\r\n \r\n // Download with progress tracking\r\n await this.downloadFileWithProgress(binaryInfo.url, tempZipPath, prefix);\r\n \r\n // Extract\r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'extracting');\r\n await this.extractBinary(tempZipPath, finalBinaryPath, prefix);\r\n \r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'completed');\r\n break;\r\n\r\n } catch (error: unknown) {\r\n const errorMessage = error instanceof Error ? error.message : 'Error desconocido';\r\n \r\n if (attempt < maxRetries && (\r\n errorMessage.includes('ECONNRESET') || \r\n errorMessage.includes('timeout') ||\r\n errorMessage.includes('ETIMEDOUT') ||\r\n errorMessage.includes('ENOTFOUND')\r\n )) {\r\n attempt++;\r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'retrying', attempt);\r\n await new Promise(resolve => setTimeout(resolve, 2000));\r\n } else {\r\n this.mainSpinner.fail(chalk.red(`Error descargando ${prefix}: ${errorMessage}`));\r\n throw error;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Complete successfully\r\n this.mainSpinner.succeed(chalk.green('Binarios descargados correctamente'));\r\n }\r\n\r\n private static updateMainProgress(binary: string, current: number, total: number, status: string, attempt?: number) {\r\n const progressBar = this.createProgressBar(current, total);\r\n const statusEmojis = {\r\n downloading: '📥',\r\n extracting: '📦', \r\n completed: '✅',\r\n exists: '✅',\r\n retrying: '🔄'\r\n };\r\n \r\n const statusMessages = {\r\n downloading: chalk.blue('descargando'),\r\n extracting: chalk.yellow('extrayendo'),\r\n completed: chalk.green('completado'),\r\n exists: chalk.gray('existe'),\r\n retrying: chalk.orange(`reintentando (${attempt}/${3})`)\r\n };\r\n\r\n const emoji = statusEmojis[status as keyof typeof statusEmojis] || '📥';\r\n const message = statusMessages[status as keyof typeof statusMessages] || status;\r\n \r\n this.mainSpinner.text = `${progressBar} ${emoji} ${chalk.bold(binary)} - ${message}`;\r\n }\r\n\r\n private static createProgressBar(current: number, total: number, width: number = 20): string {\r\n const filled = Math.round((current / total) * width);\r\n const empty = width - filled;\r\n const filledBar = chalk.green('█'.repeat(filled));\r\n const emptyBar = chalk.gray('░'.repeat(empty));\r\n const percentage = chalk.bold(`${current}/${total}`);\r\n return `[${filledBar}${emptyBar}] ${percentage}`;\r\n }\r\n\r\n private static downloadFileWithProgress(url: string, outputPath: string, prefix: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const request = https.get(url, { timeout: 60000 }, (response: IncomingMessage) => {\r\n if (response.statusCode === 302 || response.statusCode === 301) {\r\n const redirectUrl = response.headers.location;\r\n if (redirectUrl) {\r\n return this.downloadFileWithProgress(redirectUrl, outputPath, prefix).then(resolve).catch(reject);\r\n }\r\n }\r\n \r\n if (response.statusCode !== 200) {\r\n reject(new Error(`HTTP ${response.statusCode} para ${prefix}`));\r\n return;\r\n }\r\n\r\n const file = fs.createWriteStream(outputPath);\r\n const totalBytes = parseInt(response.headers['content-length'] || '0', 10);\r\n let downloadedBytes = 0;\r\n\r\n response.on('data', (chunk) => {\r\n downloadedBytes += chunk.length;\r\n file.write(chunk);\r\n \r\n if (totalBytes > 0) {\r\n const progress: DownloadProgress = {\r\n downloaded: downloadedBytes,\r\n total: totalBytes,\r\n percentage: (downloadedBytes / totalBytes) * 100\r\n };\r\n this.updateDownloadProgress(prefix, progress);\r\n }\r\n });\r\n\r\n response.on('end', () => {\r\n file.end();\r\n resolve();\r\n });\r\n\r\n response.on('error', (err) => {\r\n file.close();\r\n this.cleanupFile(outputPath);\r\n reject(err);\r\n });\r\n\r\n file.on('error', (err) => {\r\n file.close();\r\n this.cleanupFile(outputPath);\r\n reject(err);\r\n });\r\n });\r\n\r\n request.on('error', reject);\r\n request.on('timeout', () => {\r\n request.destroy();\r\n reject(new Error(`Timeout descargando ${prefix}`));\r\n });\r\n });\r\n }\r\n\r\n private static updateDownloadProgress(binary: string, progress: DownloadProgress) {\r\n const percentage = progress.percentage.toFixed(1);\r\n const downloaded = (progress.downloaded / 1024 / 1024).toFixed(1);\r\n const total = (progress.total / 1024 / 1024).toFixed(1);\r\n \r\n // Create a mini progress bar for the binary\r\n const barWidth = 15;\r\n const filled = Math.round((progress.percentage / 100) * barWidth);\r\n const empty = barWidth - filled;\r\n const progressBar = chalk.green('█'.repeat(filled)) + chalk.gray('░'.repeat(empty));\r\n \r\n const progressText = `[${progressBar}] ${percentage}% (${downloaded}/${total}MB)`;\r\n this.mainSpinner.text = `📥 ${chalk.bold(binary)} - ${progressText}`;\r\n }\r\n\r\n private static extractBinary(zipPath: string, outputPath: string, prefix: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n let extracted = false;\r\n \r\n fs.createReadStream(zipPath)\r\n .pipe(unzipper.Parse())\r\n .on('entry', (entry: unzipper.Entry) => {\r\n if (entry.type === 'File' && !extracted) {\r\n extracted = true;\r\n const writeStream = fs.createWriteStream(outputPath);\r\n \r\n entry.pipe(writeStream);\r\n \r\n writeStream.on('finish', () => {\r\n if (process.platform !== 'win32') {\r\n fs.chmodSync(outputPath, 0o755);\r\n }\r\n this.cleanupFile(zipPath);\r\n resolve();\r\n });\r\n \r\n writeStream.on('error', (err: Error) => {\r\n this.cleanupFile(zipPath);\r\n reject(err);\r\n });\r\n } else {\r\n entry.autodrain();\r\n }\r\n })\r\n .on('error', (err: Error) => {\r\n this.cleanupFile(zipPath);\r\n reject(err);\r\n })\r\n .on('close', () => {\r\n if (!extracted) {\r\n this.cleanupFile(zipPath);\r\n reject(new Error(`No se encontró archivo válido en el ZIP para ${prefix}`));\r\n }\r\n });\r\n });\r\n }\r\n\r\n private static cleanupFile(filePath: string): void {\r\n try {\r\n if (fs.existsSync(filePath)) {\r\n fs.unlinkSync(filePath);\r\n }\r\n } catch {\r\n // Ignore cleanup errors\r\n }\r\n }\r\n\r\n private static getDefaultBinDir(): string {\r\n // Try to find a suitable directory for binaries in order of preference\r\n const possibleDirs = [\r\n path.resolve(process.cwd(), 'bin'),\r\n path.resolve(process.cwd(), 'node_modules', '.dbcube', 'bin'),\r\n path.resolve(__dirname, '..', 'bin'),\r\n ];\r\n\r\n // Use the first one that can be created or already exists\r\n for (const dir of possibleDirs) {\r\n try {\r\n if (!fs.existsSync(dir)) {\r\n fs.mkdirSync(dir, { recursive: true });\r\n }\r\n // Test write permissions\r\n const testFile = path.join(dir, '.test');\r\n fs.writeFileSync(testFile, 'test');\r\n fs.unlinkSync(testFile);\r\n return dir;\r\n } catch {\r\n // Try next directory\r\n continue;\r\n }\r\n }\r\n\r\n // Fallback to temp directory\r\n const tempDir = path.join(os.tmpdir(), 'dbcube-bin');\r\n fs.mkdirSync(tempDir, { recursive: true });\r\n return tempDir;\r\n }\r\n}\r\n\r\nexport { Downloader };","#!/usr/bin/env node\r\n\r\nimport { Downloader } from \"./lib/Donwloader\";\r\n\r\n/**\r\n * Script CLI para descargar binarios manualmente\r\n */\r\nasync function main() {\r\n const args = process.argv.slice(2);\r\n const command = args[0];\r\n\r\n switch (command) {\r\n case 'install':\r\n case 'download':\r\n console.log('🚀 Iniciando descarga de binarios DBCube...');\r\n try {\r\n await Downloader.download();\r\n console.log('✅ ¡Todos los binarios descargados exitosamente!');\r\n } catch (error) {\r\n console.error('❌ Error descargando binarios:', error);\r\n process.exit(1);\r\n }\r\n break;\r\n \r\n case 'check':\r\n console.log('🔍 Verificando binarios...');\r\n const binaries = ['schema', 'query', 'sqlite'];\r\n for (const prefix of binaries) {\r\n const binary = Downloader.get(prefix);\r\n console.log(`${prefix}-engine: ${binary.name}`);\r\n console.log(` URL: ${binary.url}`);\r\n }\r\n break;\r\n \r\n default:\r\n console.log('DBCube Binary Manager');\r\n console.log('');\r\n console.log('Comandos disponibles:');\r\n console.log(' install|download - Descargar todos los binarios');\r\n console.log(' check - Verificar información de binarios');\r\n console.log('');\r\n console.log('Uso:');\r\n console.log(' npx @dbcube/core install');\r\n console.log(' npx @dbcube/core check');\r\n }\r\n}\r\n\r\nmain().catch(error => {\r\n console.error('Error:', error);\r\n process.exit(1);\r\n});"],"mappings":"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","names":["platform","arch","os","arch","platform","ora","chalk","resolve"]}