spindb 0.44.0 → 0.45.0

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.
Files changed (66) hide show
  1. package/README.md +22 -10
  2. package/dist/cli/commands/create.js +16 -1
  3. package/dist/cli/commands/create.js.map +1 -1
  4. package/dist/cli/commands/engines.js +39 -0
  5. package/dist/cli/commands/engines.js.map +1 -1
  6. package/dist/cli/commands/menu/backup-handlers.js +5 -0
  7. package/dist/cli/commands/menu/backup-handlers.js.map +1 -1
  8. package/dist/cli/commands/menu/settings-handlers.js +3 -0
  9. package/dist/cli/commands/menu/settings-handlers.js.map +1 -1
  10. package/dist/cli/commands/menu/shell-handlers.js +31 -1
  11. package/dist/cli/commands/menu/shell-handlers.js.map +1 -1
  12. package/dist/cli/commands/start.js.map +1 -1
  13. package/dist/cli/constants.js +4 -0
  14. package/dist/cli/constants.js.map +1 -1
  15. package/dist/cli/helpers.js +53 -2
  16. package/dist/cli/helpers.js.map +1 -1
  17. package/dist/config/backup-formats.js +18 -0
  18. package/dist/config/backup-formats.js.map +1 -1
  19. package/dist/config/engine-defaults.js +13 -0
  20. package/dist/config/engine-defaults.js.map +1 -1
  21. package/dist/config/engines.json +18 -0
  22. package/dist/config/version.js +1 -1
  23. package/dist/core/config-manager.js +4 -1
  24. package/dist/core/config-manager.js.map +1 -1
  25. package/dist/core/credential-manager.js +2 -0
  26. package/dist/core/credential-manager.js.map +1 -1
  27. package/dist/core/database-capabilities.js +8 -0
  28. package/dist/core/database-capabilities.js.map +1 -1
  29. package/dist/core/dependency-manager.js +2 -0
  30. package/dist/core/dependency-manager.js.map +1 -1
  31. package/dist/core/docker-exporter.js +12 -0
  32. package/dist/core/docker-exporter.js.map +1 -1
  33. package/dist/core/remote-container.js +2 -0
  34. package/dist/core/remote-container.js.map +1 -1
  35. package/dist/engines/couchdb/index.js +7 -5
  36. package/dist/engines/couchdb/index.js.map +1 -1
  37. package/dist/engines/ferretdb/index.js +1 -1
  38. package/dist/engines/index.js +5 -1
  39. package/dist/engines/index.js.map +1 -1
  40. package/dist/engines/libsql/api-client.js +134 -0
  41. package/dist/engines/libsql/api-client.js.map +1 -0
  42. package/dist/engines/libsql/backup.js +151 -0
  43. package/dist/engines/libsql/backup.js.map +1 -0
  44. package/dist/engines/libsql/binary-manager.js +31 -0
  45. package/dist/engines/libsql/binary-manager.js.map +1 -0
  46. package/dist/engines/libsql/binary-urls.js +50 -0
  47. package/dist/engines/libsql/binary-urls.js.map +1 -0
  48. package/dist/engines/libsql/hostdb-releases.js +21 -0
  49. package/dist/engines/libsql/hostdb-releases.js.map +1 -0
  50. package/dist/engines/libsql/index.js +578 -0
  51. package/dist/engines/libsql/index.js.map +1 -0
  52. package/dist/engines/libsql/restore.js +214 -0
  53. package/dist/engines/libsql/restore.js.map +1 -0
  54. package/dist/engines/libsql/version-maps.js +63 -0
  55. package/dist/engines/libsql/version-maps.js.map +1 -0
  56. package/dist/engines/libsql/version-validator.js +115 -0
  57. package/dist/engines/libsql/version-validator.js.map +1 -0
  58. package/dist/engines/questdb/index.js +5 -63
  59. package/dist/engines/questdb/index.js.map +1 -1
  60. package/dist/engines/redis/index.js +1 -1
  61. package/dist/engines/redis/index.js.map +1 -1
  62. package/dist/engines/valkey/index.js +1 -1
  63. package/dist/engines/valkey/index.js.map +1 -1
  64. package/dist/types/index.js +2 -0
  65. package/dist/types/index.js.map +1 -1
  66. package/package.json +2 -1
@@ -0,0 +1,578 @@
1
+ import { generateKeyPairSync, sign } from 'crypto';
2
+ import { spawn } from 'child_process';
3
+ import { existsSync, openSync, closeSync } from 'fs';
4
+ import { mkdir, writeFile, readFile, unlink, stat } from 'fs/promises';
5
+ import { join } from 'path';
6
+ import { BaseEngine } from '../base-engine.js';
7
+ import { paths } from '../../config/paths.js';
8
+ import { getEngineDefaults } from '../../config/defaults.js';
9
+ import { platformService, isWindows } from '../../core/platform-service.js';
10
+ import { configManager } from '../../core/config-manager.js';
11
+ import { logDebug, UnsupportedOperationError, assertValidUsername, } from '../../core/error-handler.js';
12
+ import { processManager } from '../../core/process-manager.js';
13
+ import { portManager } from '../../core/port-manager.js';
14
+ import { loadCredentials, saveCredentials, getDefaultUsername, credentialsExist, } from '../../core/credential-manager.js';
15
+ import { libsqlBinaryManager } from './binary-manager.js';
16
+ import { getBinaryUrl } from './binary-urls.js';
17
+ import { normalizeVersion, SUPPORTED_MAJOR_VERSIONS } from './version-maps.js';
18
+ import { fetchAvailableVersions as fetchHostdbVersions } from './hostdb-releases.js';
19
+ import { detectBackupFormat as detectBackupFormatImpl, restoreBackup, } from './restore.js';
20
+ import { createBackup } from './backup.js';
21
+ import { libsqlQuery, hranaValueToJs, libsqlApiRequest } from './api-client.js';
22
+ import { Engine, } from '../../types/index.js';
23
+ const ENGINE = 'libsql';
24
+ const engineDef = getEngineDefaults(ENGINE);
25
+ const START_CHECK_DELAY_MS = isWindows() ? 2000 : 500;
26
+ const JWT_KEY_FILE = 'jwt-key.pem';
27
+ /**
28
+ * Load the auth token for a container from credential-manager, if available.
29
+ * Returns undefined when no credentials are stored.
30
+ */
31
+ async function loadAuthToken(containerName) {
32
+ const username = getDefaultUsername(Engine.LibSQL);
33
+ const creds = await loadCredentials(containerName, Engine.LibSQL, username);
34
+ return creds?.apiKey ?? undefined;
35
+ }
36
+ /** Default JWT TTL: 10 years (effectively non-expiring for local dev) */
37
+ const DEFAULT_JWT_TTL_SECONDS = 10 * 365 * 24 * 60 * 60;
38
+ /**
39
+ * Create a JWT token signed with an Ed25519 private key.
40
+ * Header: {"alg":"EdDSA","typ":"JWT"}
41
+ * Payload: {"a":"rw","exp":...} (read-write access with expiration)
42
+ */
43
+ function createJwt(privateKey, ttlSeconds = DEFAULT_JWT_TTL_SECONDS) {
44
+ const header = Buffer.from(JSON.stringify({ alg: 'EdDSA', typ: 'JWT' })).toString('base64url');
45
+ const exp = Math.floor(Date.now() / 1000) + ttlSeconds;
46
+ const payload = Buffer.from(JSON.stringify({ a: 'rw', exp })).toString('base64url');
47
+ const signingInput = `${header}.${payload}`;
48
+ const signature = sign(null, Buffer.from(signingInput), privateKey).toString('base64url');
49
+ return `${signingInput}.${signature}`;
50
+ }
51
+ export class LibSQLEngine extends BaseEngine {
52
+ name = ENGINE;
53
+ displayName = 'libSQL';
54
+ defaultPort = engineDef.defaultPort;
55
+ supportedVersions = SUPPORTED_MAJOR_VERSIONS;
56
+ getPlatformInfo() {
57
+ return platformService.getPlatformInfo();
58
+ }
59
+ async fetchAvailableVersions() {
60
+ return fetchHostdbVersions();
61
+ }
62
+ async fetchDeprecatedVersions() {
63
+ return new Set();
64
+ }
65
+ getBinaryUrl(version, platform, arch) {
66
+ return getBinaryUrl(version, platform, arch);
67
+ }
68
+ resolveFullVersion(version) {
69
+ return normalizeVersion(version);
70
+ }
71
+ getBinaryPath(version) {
72
+ const fullVersion = this.resolveFullVersion(version);
73
+ const { platform: p, arch: a } = this.getPlatformInfo();
74
+ return paths.getBinaryPath({
75
+ engine: 'libsql',
76
+ version: fullVersion,
77
+ platform: p,
78
+ arch: a,
79
+ });
80
+ }
81
+ async verifyBinary(binPath) {
82
+ const ext = platformService.getExecutableExtension();
83
+ const serverPath = join(binPath, 'bin', `sqld${ext}`);
84
+ return existsSync(serverPath);
85
+ }
86
+ async isBinaryInstalled(version) {
87
+ const { platform, arch } = this.getPlatformInfo();
88
+ return libsqlBinaryManager.isInstalled(version, platform, arch);
89
+ }
90
+ async ensureBinaries(version, onProgress) {
91
+ const { platform, arch } = this.getPlatformInfo();
92
+ const binPath = await libsqlBinaryManager.ensureInstalled(version, platform, arch, onProgress);
93
+ const ext = platformService.getExecutableExtension();
94
+ const sqldPath = join(binPath, 'bin', `sqld${ext}`);
95
+ if (existsSync(sqldPath)) {
96
+ await configManager.setBinaryPath('sqld', sqldPath, 'bundled');
97
+ }
98
+ return binPath;
99
+ }
100
+ async initDataDir(containerName, _version, _options = {}) {
101
+ const dataDir = paths.getContainerDataPath(containerName, {
102
+ engine: ENGINE,
103
+ });
104
+ const containerDir = paths.getContainerPath(containerName, {
105
+ engine: ENGINE,
106
+ });
107
+ if (!existsSync(containerDir)) {
108
+ await mkdir(containerDir, { recursive: true });
109
+ }
110
+ if (!existsSync(dataDir)) {
111
+ await mkdir(dataDir, { recursive: true });
112
+ logDebug(`Created libSQL data directory: ${dataDir}`);
113
+ }
114
+ return dataDir;
115
+ }
116
+ async getSqldServerPath(version) {
117
+ const { platform, arch } = this.getPlatformInfo();
118
+ const fullVersion = normalizeVersion(version);
119
+ const binPath = paths.getBinaryPath({
120
+ engine: 'libsql',
121
+ version: fullVersion,
122
+ platform,
123
+ arch,
124
+ });
125
+ const ext = platformService.getExecutableExtension();
126
+ const serverPath = join(binPath, 'bin', `sqld${ext}`);
127
+ if (existsSync(serverPath)) {
128
+ return serverPath;
129
+ }
130
+ throw new Error(`libSQL ${version} is not installed. Run: spindb engines download libsql ${version}`);
131
+ }
132
+ async getSqldPath(version) {
133
+ const cached = await configManager.getBinaryPath('sqld');
134
+ if (cached && existsSync(cached)) {
135
+ return cached;
136
+ }
137
+ if (version) {
138
+ const { platform, arch } = this.getPlatformInfo();
139
+ const fullVersion = normalizeVersion(version);
140
+ const binPath = paths.getBinaryPath({
141
+ engine: 'libsql',
142
+ version: fullVersion,
143
+ platform,
144
+ arch,
145
+ });
146
+ const ext = platformService.getExecutableExtension();
147
+ const sqldPath = join(binPath, 'bin', `sqld${ext}`);
148
+ if (existsSync(sqldPath)) {
149
+ return sqldPath;
150
+ }
151
+ }
152
+ throw new Error('sqld not found. Run: spindb engines download libsql <version>');
153
+ }
154
+ /**
155
+ * Start libSQL server (sqld)
156
+ * CLI: sqld --http-listen-addr 127.0.0.1:PORT --db-path /path/to/data.db
157
+ */
158
+ async start(container, onProgress) {
159
+ const { name, port, version, binaryPath } = container;
160
+ const alreadyRunning = await processManager.isRunning(name, {
161
+ engine: ENGINE,
162
+ });
163
+ if (alreadyRunning) {
164
+ return {
165
+ port,
166
+ connectionString: this.getConnectionString(container),
167
+ };
168
+ }
169
+ let sqldServer = null;
170
+ if (binaryPath && existsSync(binaryPath)) {
171
+ const ext = platformService.getExecutableExtension();
172
+ const serverPath = join(binaryPath, 'bin', `sqld${ext}`);
173
+ if (existsSync(serverPath)) {
174
+ sqldServer = serverPath;
175
+ logDebug(`Using stored binary path: ${sqldServer}`);
176
+ }
177
+ }
178
+ if (!sqldServer) {
179
+ try {
180
+ sqldServer = await this.getSqldServerPath(version);
181
+ }
182
+ catch (error) {
183
+ const originalMessage = error instanceof Error ? error.message : String(error);
184
+ throw new Error(`libSQL ${version} is not installed. Run: spindb engines download libsql ${version}\n` +
185
+ ` Original error: ${originalMessage}`);
186
+ }
187
+ }
188
+ logDebug(`Using sqld for version ${version}: ${sqldServer}`);
189
+ const containerDir = paths.getContainerPath(name, { engine: ENGINE });
190
+ const dataDir = paths.getContainerDataPath(name, { engine: ENGINE });
191
+ const logFile = paths.getContainerLogPath(name, { engine: ENGINE });
192
+ const pidFile = join(containerDir, 'libsql.pid');
193
+ const dbPath = join(dataDir, 'data.db');
194
+ // Check if HTTP port is available
195
+ if (!(await portManager.isPortAvailable(port))) {
196
+ throw new Error(`HTTP port ${port} is already in use.`);
197
+ }
198
+ onProgress?.({ stage: 'starting', message: 'Starting libSQL...' });
199
+ const bindAddr = container.bindAddress ?? '127.0.0.1';
200
+ const args = [
201
+ '--http-listen-addr',
202
+ `${bindAddr}:${port}`,
203
+ '--db-path',
204
+ dbPath,
205
+ ];
206
+ // If a JWT key file exists, enable JWT authentication
207
+ const jwtKeyPath = join(containerDir, JWT_KEY_FILE);
208
+ if (existsSync(jwtKeyPath)) {
209
+ args.push('--auth-jwt-key-file', jwtKeyPath);
210
+ logDebug(`JWT auth enabled via key file: ${jwtKeyPath}`);
211
+ }
212
+ logDebug(`Starting sqld with args: ${args.join(' ')}`);
213
+ const checkLogForError = async () => {
214
+ try {
215
+ const logContent = await readFile(logFile, 'utf-8');
216
+ const recentLog = logContent.slice(-2000);
217
+ if (recentLog.includes('Address already in use') ||
218
+ recentLog.includes('bind: Address already in use')) {
219
+ return `Port ${port} is already in use`;
220
+ }
221
+ }
222
+ catch {
223
+ // Log file might not exist yet
224
+ }
225
+ return null;
226
+ };
227
+ // Spawn detached process with stderr redirected to logFile for debugging
228
+ const logFd = openSync(logFile, 'a');
229
+ const spawnOpts = {
230
+ cwd: containerDir,
231
+ stdio: ['ignore', 'ignore', logFd],
232
+ detached: true,
233
+ };
234
+ const proc = spawn(sqldServer, args, spawnOpts);
235
+ // Write PID file
236
+ if (proc.pid) {
237
+ await writeFile(pidFile, proc.pid.toString());
238
+ logDebug(`libSQL server PID: ${proc.pid}`);
239
+ }
240
+ proc.unref();
241
+ closeSync(logFd);
242
+ // Wait for server to be ready
243
+ await new Promise((resolve) => setTimeout(resolve, START_CHECK_DELAY_MS));
244
+ // Health check loop
245
+ const maxRetries = 30;
246
+ const retryDelay = 500;
247
+ let ready = false;
248
+ for (let i = 0; i < maxRetries; i++) {
249
+ try {
250
+ const response = await libsqlApiRequest(port, 'GET', '/health', 2000);
251
+ if (response.status === 200) {
252
+ ready = true;
253
+ break;
254
+ }
255
+ }
256
+ catch {
257
+ // Not ready yet
258
+ }
259
+ // Check for startup errors in log
260
+ const logError = await checkLogForError();
261
+ if (logError) {
262
+ throw new Error(`libSQL failed to start: ${logError}`);
263
+ }
264
+ await new Promise((resolve) => setTimeout(resolve, retryDelay));
265
+ }
266
+ if (!ready) {
267
+ throw new Error(`libSQL failed to start after ${(maxRetries * retryDelay) / 1000}s. Check logs: ${logFile}`);
268
+ }
269
+ onProgress?.({ stage: 'ready', message: 'libSQL is ready' });
270
+ return {
271
+ port,
272
+ connectionString: this.getConnectionString(container),
273
+ };
274
+ }
275
+ /**
276
+ * Stop libSQL server
277
+ */
278
+ async stop(container) {
279
+ const { name, port } = container;
280
+ const containerDir = paths.getContainerPath(name, { engine: ENGINE });
281
+ const pidFile = join(containerDir, 'libsql.pid');
282
+ logDebug(`Stopping libSQL container "${name}" on port ${port}`);
283
+ let pid = null;
284
+ if (existsSync(pidFile)) {
285
+ try {
286
+ const content = await readFile(pidFile, 'utf8');
287
+ pid = parseInt(content.trim(), 10);
288
+ }
289
+ catch {
290
+ // Ignore
291
+ }
292
+ }
293
+ if (pid && platformService.isProcessRunning(pid)) {
294
+ logDebug(`Killing libSQL process ${pid}`);
295
+ try {
296
+ await platformService.terminateProcess(pid, false);
297
+ await new Promise((resolve) => setTimeout(resolve, 2000));
298
+ if (platformService.isProcessRunning(pid)) {
299
+ logDebug(`Graceful termination failed, force killing ${pid}`);
300
+ await platformService.terminateProcess(pid, true);
301
+ }
302
+ }
303
+ catch (error) {
304
+ logDebug(`Process termination error: ${error}`);
305
+ }
306
+ }
307
+ // Kill any processes still listening on the port
308
+ const portPids = await platformService.findProcessByPort(port);
309
+ for (const portPid of portPids) {
310
+ if (platformService.isProcessRunning(portPid)) {
311
+ logDebug(`Killing process ${portPid} still on port ${port}`);
312
+ try {
313
+ await platformService.terminateProcess(portPid, true);
314
+ }
315
+ catch {
316
+ // Ignore
317
+ }
318
+ }
319
+ }
320
+ // Cleanup PID file
321
+ if (existsSync(pidFile)) {
322
+ try {
323
+ await unlink(pidFile);
324
+ }
325
+ catch {
326
+ // Ignore
327
+ }
328
+ }
329
+ }
330
+ /**
331
+ * Check if libSQL is running
332
+ */
333
+ async status(container) {
334
+ const { name, port } = container;
335
+ const running = await processManager.isRunning(name, { engine: ENGINE });
336
+ if (running) {
337
+ // Verify server is responsive
338
+ try {
339
+ const response = await libsqlApiRequest(port, 'GET', '/health', 2000);
340
+ if (response.status === 200) {
341
+ return { running: true, message: `libSQL is running on port ${port}` };
342
+ }
343
+ }
344
+ catch {
345
+ // Process exists but not responding
346
+ }
347
+ return {
348
+ running: true,
349
+ message: `libSQL process is running but not responding on port ${port}`,
350
+ };
351
+ }
352
+ return { running: false, message: 'libSQL is not running' };
353
+ }
354
+ /**
355
+ * Connect to libSQL - opens the HTTP URL
356
+ * libSQL is a REST API engine with no native CLI shell
357
+ */
358
+ async connect(container, _database) {
359
+ const { name, port } = container;
360
+ const url = `http://127.0.0.1:${port}`;
361
+ console.log(`libSQL HTTP API: ${url}`);
362
+ console.log(`Query endpoint: ${url}/v2/pipeline`);
363
+ console.log(`Health check: ${url}/health`);
364
+ const authToken = await loadAuthToken(name);
365
+ if (authToken) {
366
+ console.log('');
367
+ console.log('Authentication is enabled. Include the auth token header:');
368
+ console.log(` Authorization: Bearer ${authToken}`);
369
+ }
370
+ console.log('');
371
+ console.log('Use any HTTP client or libSQL SDK to connect.');
372
+ console.log('Example with curl:');
373
+ const authHeader = authToken
374
+ ? ` -H "Authorization: Bearer ${authToken}"`
375
+ : '';
376
+ console.log(` curl -s ${url}/v2/pipeline -H "Content-Type: application/json"${authHeader} -d '{"requests":[{"type":"execute","stmt":{"sql":"SELECT 1"}},{"type":"close"}]}'`);
377
+ }
378
+ getConnectionString(container, _database) {
379
+ return `http://127.0.0.1:${container.port}`;
380
+ }
381
+ /**
382
+ * Execute a SQL query via the Hrana HTTP protocol
383
+ */
384
+ async executeQuery(container, query, _options) {
385
+ const port = container.port;
386
+ // Load auth token from credentials if available
387
+ const authToken = await loadAuthToken(container.name);
388
+ const result = await libsqlQuery(port, query, {
389
+ authToken,
390
+ });
391
+ const columns = result.cols.map((col) => col.name);
392
+ const rows = result.rows.map((row) => {
393
+ const obj = {};
394
+ result.cols.forEach((col, i) => {
395
+ obj[col.name] = hranaValueToJs(row[i]);
396
+ });
397
+ return obj;
398
+ });
399
+ return {
400
+ columns,
401
+ rows,
402
+ rowCount: rows.length,
403
+ };
404
+ }
405
+ /**
406
+ * List databases - libSQL runs a single database per instance
407
+ */
408
+ async listDatabases(_container) {
409
+ return ['main'];
410
+ }
411
+ /**
412
+ * Create database - not supported (single database per instance)
413
+ */
414
+ async createDatabase(_container, _database) {
415
+ throw new UnsupportedOperationError('createDatabase', 'libSQL', 'libSQL runs a single SQLite database per server instance. Use "spindb create" to make a new instance.');
416
+ }
417
+ /**
418
+ * Drop database - not supported (single database per instance)
419
+ */
420
+ async dropDatabase(_container, _database) {
421
+ throw new UnsupportedOperationError('dropDatabase', 'libSQL', 'libSQL runs a single SQLite database per server instance. Use "spindb delete" to remove the instance.');
422
+ }
423
+ /**
424
+ * Create a backup
425
+ */
426
+ async backup(container, outputPath, options) {
427
+ return createBackup(container, outputPath, options);
428
+ }
429
+ /**
430
+ * Restore from a backup
431
+ */
432
+ async restore(container, backupPath, options) {
433
+ const containerDir = paths.getContainerPath(container.name, {
434
+ engine: ENGINE,
435
+ });
436
+ const dataDir = join(containerDir, 'data');
437
+ return restoreBackup(backupPath, {
438
+ containerName: container.name,
439
+ dataDir,
440
+ port: container.port,
441
+ format: options?.format,
442
+ });
443
+ }
444
+ /**
445
+ * Detect backup format from file
446
+ */
447
+ async detectBackupFormat(filePath) {
448
+ return detectBackupFormatImpl(filePath);
449
+ }
450
+ /**
451
+ * Dump from a remote connection string
452
+ */
453
+ async dumpFromConnectionString(connectionString, outputPath) {
454
+ // Parse the connection string to get host:port
455
+ let url;
456
+ let normalized = connectionString.trim();
457
+ if (!normalized.startsWith('http://') &&
458
+ !normalized.startsWith('https://')) {
459
+ normalized = `http://${normalized}`;
460
+ }
461
+ try {
462
+ url = new URL(normalized);
463
+ }
464
+ catch {
465
+ throw new Error(`Invalid libSQL connection string: ${connectionString}\n` +
466
+ 'Expected format: http://host:port');
467
+ }
468
+ const port = parseInt(url.port || '8080', 10);
469
+ // Create a temporary container config for the backup
470
+ const tmpContainer = {
471
+ name: '__remote_dump__',
472
+ engine: 'libsql',
473
+ version: '0',
474
+ port,
475
+ database: 'main',
476
+ created: new Date().toISOString(),
477
+ status: 'running',
478
+ };
479
+ const result = await createBackup(tmpContainer, outputPath, {
480
+ database: 'main',
481
+ format: 'sql',
482
+ });
483
+ return {
484
+ filePath: result.path,
485
+ };
486
+ }
487
+ /**
488
+ * Get database size
489
+ */
490
+ async getDatabaseSize(container) {
491
+ const containerDir = paths.getContainerPath(container.name, {
492
+ engine: ENGINE,
493
+ });
494
+ // sqld's data.db is a directory; the actual SQLite file is inside
495
+ const sqliteFile = join(containerDir, 'data', 'data.db', 'dbs', 'default', 'data');
496
+ if (!existsSync(sqliteFile)) {
497
+ return null;
498
+ }
499
+ try {
500
+ const { size } = await stat(sqliteFile);
501
+ return size;
502
+ }
503
+ catch {
504
+ return null;
505
+ }
506
+ }
507
+ /**
508
+ * Run a script file - not supported for REST API engines
509
+ */
510
+ async runScript(_container, _options) {
511
+ throw new UnsupportedOperationError('runScript', 'libSQL', 'libSQL is a REST API engine. Use the HTTP API or a libSQL SDK to run scripts.');
512
+ }
513
+ /**
514
+ * Create a JWT auth token for libSQL.
515
+ *
516
+ * Generates an Ed25519 key pair, writes the public key to the container
517
+ * directory so sqld can verify tokens, creates a JWT with read-write
518
+ * access, and stores it via credential-manager.
519
+ *
520
+ * Idempotent: if the key file and credentials already exist, returns
521
+ * the existing credentials without regenerating.
522
+ */
523
+ async createUser(container, options) {
524
+ const { username } = options;
525
+ assertValidUsername(username);
526
+ const containerDir = paths.getContainerPath(container.name, {
527
+ engine: ENGINE,
528
+ });
529
+ const jwtKeyPath = join(containerDir, JWT_KEY_FILE);
530
+ // Idempotent: if key file exists and credentials are stored, return existing
531
+ if (existsSync(jwtKeyPath) &&
532
+ credentialsExist(container.name, Engine.LibSQL, username)) {
533
+ const existing = await loadCredentials(container.name, Engine.LibSQL, username);
534
+ if (existing) {
535
+ logDebug(`Found existing libSQL JWT credentials for ${username}`);
536
+ return existing;
537
+ }
538
+ }
539
+ // Generate Ed25519 key pair
540
+ const { publicKey, privateKey } = generateKeyPairSync('ed25519');
541
+ // Write the public key in PEM format for sqld
542
+ const publicKeyPem = publicKey.export({
543
+ type: 'spki',
544
+ format: 'pem',
545
+ });
546
+ await writeFile(jwtKeyPath, publicKeyPem, {
547
+ encoding: 'utf-8',
548
+ mode: 0o600,
549
+ });
550
+ logDebug(`Wrote JWT public key to ${jwtKeyPath}`);
551
+ // Create a JWT token with read-write access
552
+ const token = createJwt(privateKey);
553
+ // Restart sqld so it picks up the new key file
554
+ const isRunning = await processManager.isRunning(container.name, {
555
+ engine: ENGINE,
556
+ });
557
+ if (isRunning) {
558
+ logDebug('Restarting sqld to pick up JWT key file');
559
+ await this.stop(container);
560
+ await this.start(container);
561
+ }
562
+ // Store credentials via credential-manager
563
+ const connectionString = this.getConnectionString(container);
564
+ const credentials = {
565
+ username,
566
+ password: '',
567
+ connectionString,
568
+ engine: container.engine,
569
+ container: container.name,
570
+ apiKey: token,
571
+ };
572
+ await saveCredentials(container.name, Engine.LibSQL, credentials);
573
+ logDebug(`Saved libSQL JWT credentials for ${username}`);
574
+ return credentials;
575
+ }
576
+ }
577
+ export const libsqlEngine = new LibSQLEngine();
578
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../engines/libsql/index.ts"],"names":[],"mappings":"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"}