@scriptdb/server 1.1.0 → 1.1.2
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/README.md +1 -1
- package/dist/index.d.mts +3 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +840 -3470
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +3147 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +6 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/protocal.ts","../src/utils/basePath.ts","../src/utils/homeDir.ts","../src/index.ts","../src/utils/setupDir.ts","../src/wsProxy.ts","../../client/src/index.ts"],"sourcesContent":["import * as net from \"net\";\nimport * as tls from \"tls\";\nimport * as fs from \"fs\";\nimport * as jwt from \"jsonwebtoken\";\nimport * as crypto from \"crypto\";\n// import * as bcrypt from \"bcryptjs\";\nimport Bottleneck from \"bottleneck\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { Worker } from \"worker_threads\";\nimport { LRUCache } from \"lru-cache\";\nimport getBasePath from \"./utils/basePath\";\nimport { getHomeDir } from \"./utils/homeDir\";\n// import VM from \"@scriptdb/vm\";\n// Try to import getBasePath, but provide a fallback if it doesn't exist\n// let getBasePath: (() => string) | undefined;\n// try {\n// const basePathModule = require(\"../basePath.js\");\n// getBasePath = basePathModule.getBasePath;\n// } catch (e) {\n// // Fallback implementation\n// getBasePath = () => process.cwd();\n// }\n\n// Try to import VM, but provide a fallback if it doesn't exist\n// let VM: any;\n// try {\n// const vmModule = require(\"@scriptdb/vm\");\n// VM = vmModule && vmModule.VM ? vmModule.VM : vmModule;\n// } catch (e) {\n// VM = null;\n// }\n\n// Types definition\ninterface User {\n username: string;\n password?: string;\n hash?: boolean;\n algorithm?: 'bcrypt' | 'sha256' | 'sha512';\n}\n\ninterface FileConfig {\n host?: string;\n port?: number;\n secure?: boolean;\n users?: User[];\n serverSecret?: string;\n folder?: string;\n connectionTimeoutMs?: number;\n tlsOptions?: tls.TlsOptions;\n payloadSchema?: Record<string, string>;\n ipFailWindowMs?: number;\n maxLoginAttempts?: number;\n lockDurationMs?: number;\n enableIpLockout?: boolean;\n}\n\ninterface LoginAttemptRecord {\n attempts: number;\n lockedUntil: number;\n expiresAt: number;\n}\n\ninterface PendingRequest {\n resolve: (value: any) => void;\n reject: (reason: any) => void;\n timer: NodeJS.Timeout;\n start?: number;\n}\n\ninterface Metrics {\n bcryptPending: () => number;\n vmPending: () => number;\n vmWorkers: () => number;\n activeConnections: number;\n validatorPending: () => number;\n validatorWorkers: () => number;\n bcryptAvgLatency: () => number;\n vmAvgLatency: () => number;\n validatorAvgLatency: () => number;\n compactActive: () => number;\n compactTripped: () => boolean;\n}\n\ninterface ProtocalOptions {\n host?: string;\n port?: number;\n secure?: boolean;\n users?: User[] | User;\n vm?: any;\n serverSecret?: string;\n folder?: string;\n validatorPoolSize?: number;\n ipFailWindowMs?: number;\n maxLoginAttempts?: number;\n lockDurationMs?: number;\n enableIpLockout?: boolean;\n maxMessageBytes?: number;\n maxMessagesPerConnection?: number;\n connectionTimeoutMs?: number;\n tlsOptions?: tls.TlsOptions;\n requireTlsInProduction?: boolean;\n payloadSchema?: Record<string, string>;\n allowPerUserSigning?: boolean;\n payloadMaxDepth?: number;\n payloadMaxNodes?: number;\n payloadMaxBytes?: number;\n sanitizeMaxDepth?: number;\n sanitizeMaxNodes?: number;\n sanitizeMaxString?: number;\n attemptCacheTTL?: number;\n alertPendingThreshold?: number;\n bcryptPoolSize?: number;\n bcryptMaxPoolSize?: number;\n bcryptLatencyWindow?: number;\n bcryptFailureWindowMs?: number;\n bcryptFailureThreshold?: number;\n bcryptCircuitCooldownMs?: number;\n bcryptWorkerTimeoutMs?: number;\n vmWorkerPoolSize?: number;\n vmMaxPoolSize?: number;\n vmLatencyWindow?: number;\n vmFailureWindowMs?: number;\n vmFailureThreshold?: number;\n vmCircuitCooldownMs?: number;\n vmWorkerTimeoutMs?: number;\n validatorTimeoutMs?: number;\n validatorLatencyWindow?: number;\n validatorFailureWindowMs?: number;\n validatorFailureThreshold?: number;\n validatorCircuitCooldownMs?: number;\n maxConnections?: number;\n backlog?: number;\n runTimeoutMs?: number;\n autoscaleIntervalMs?: number;\n storage?: any;\n}\n\n// Load optional file config safely (don't throw if missing)\nlet fileConfig: FileConfig = {};\ntry {\n const configPath = path.join(getHomeDir(), \".scriptdb\", \"config.json\");\n if (fs.existsSync(configPath)) {\n const configContent = fs.readFileSync(configPath, 'utf8');\n fileConfig = JSON.parse(configContent);\n // console.log('Loaded config from:', configPath);\n // console.log('Config users:', fileConfig.users);\n } else {\n console.log('No config file found at:', configPath, '- using defaults');\n }\n} catch (e) {\n console.error('Failed to load config:', e);\n fileConfig = {};\n}\n\nexport class Protocal {\n // Server configuration\n host: string;\n port: number;\n secure: boolean;\n users: User[];\n vm: any;\n serverSecret: string | null;\n validatorPoolSize: number;\n \n // Rate limiting and security\n ipLimiterGroup: Bottleneck.Group;\n loginAttemptCache: Map<string, LoginAttemptRecord>;\n ipAttemptCache: Map<string, LoginAttemptRecord>;\n IP_FAIL_WINDOW_MS: number;\n MAX_LOGIN_ATTEMPTS: number;\n LOCK_DURATION_MS: number;\n ENABLE_IP_LOCKOUT: boolean;\n MAX_MESSAGE_BYTES: number;\n MAX_MESSAGES_PER_CONNECTION: number;\n CONNECTION_TIMEOUT_MS: number;\n tlsOptions: tls.TlsOptions | null;\n requireTlsInProduction: boolean;\n payloadSchema: Record<string, string>;\n allowPerUserSigning: boolean;\n \n // Validation limits\n _payloadMaxDepth: number;\n _payloadMaxNodes: number;\n _payloadMaxBytes: number;\n _sanitizeMaxDepth: number;\n _sanitizeMaxNodes: number;\n _sanitizeMaxString: number;\n _attemptCacheTTL: number;\n _attemptCacheCleanupInterval: NodeJS.Timeout;\n \n // Worker pools\n _bcryptWorkers: Worker[];\n _bcryptNext: number;\n _bcryptPending: Map<string, PendingRequest>;\n bcryptPoolSize: number;\n bcryptMaxPoolSize: number;\n _bcryptLatencies: number[];\n _bcryptLatencyWindow: number;\n _bcryptFailures: number[];\n _bcryptFailureWindowMs: number;\n _bcryptFailureThreshold: number;\n _bcryptCircuitCooldownMs: number;\n _bcryptTrippedUntil: number;\n bcryptWorkerTimeoutMs: number;\n \n // Token verification\n _tokenVerifyCache: any;\n \n // Storage\n storage: any;\n \n // Alerting\n alertPendingThreshold: number;\n \n // VM Worker pool\n _vmWorkers: Worker[];\n _vmNext: number;\n _vmPending: Map<string, PendingRequest>;\n vmMaxPoolSize?: number;\n _vmLatencies: number[];\n _vmLatencyWindow: number;\n _vmFailures: number[];\n _vmFailureWindowMs: number;\n _vmFailureThreshold: number;\n _vmCircuitCooldownMs: number;\n _vmTrippedUntil: number;\n vmWorkerTimeoutMs: number;\n \n // Validator worker pool\n _validatorWorkers: Worker[];\n _validatorNext: number;\n _validatorPending: Map<string, PendingRequest>;\n _validatorLatencies: number[];\n _validatorLatencyWindow: number;\n _validatorFailures: number[];\n _validatorFailureWindowMs: number;\n _validatorFailureThreshold: number;\n _validatorCircuitCooldownMs: number;\n _validatorTrippedUntil: number;\n _validatorTimeoutMs?: number;\n \n // Metrics\n metrics: Metrics;\n \n // Connection limits\n maxConnections: number;\n backlog: number;\n \n // Autoscale\n _autoscaleIntervalMs: number;\n _autoscaleTimer: NodeJS.Timeout | null;\n \n // Server instance\n server?: net.Server | tls.Server;\n audit: (event: string, meta?: any) => void;\n\n // Helper to get the effective secret for JWT operations\n private getEffectiveSecret(): string {\n return this.serverSecret || 'default-dev-secret-change-in-production';\n }\n\n constructor(options: ProtocalOptions = {}) {\n this.host = options.host || fileConfig.host || \"localhost\";\n this.port = Number.isFinite(Number(options.port))\n ? Number(options.port)\n : fileConfig.port || 1234;\n \n // Get secure setting from options or config file\n this.secure = options.secure !== undefined ? options.secure : (fileConfig.secure !== undefined ? fileConfig.secure : true);\n \n // normalize users to array\n if (Array.isArray(options.users)) {\n this.users = options.users;\n console.log('Using users from options:', this.users.length, 'users');\n } else if (options.users && typeof options.users === \"object\") {\n this.users = [options.users];\n console.log('Using single user from options');\n } else if (Array.isArray(fileConfig.users)) {\n this.users = fileConfig.users;\n console.log('Using users from fileConfig:', this.users.length, 'users');\n } else {\n this.users = [];\n console.log('No users configured!');\n }\n \n // Log first user for debugging\n if (this.users.length > 0) {\n console.log('First user config:', {\n username: this.users[0].username,\n hasPassword: !!this.users[0].password,\n hash: this.users[0].hash,\n algorithm: this.users[0].algorithm\n });\n }\n\n // prefer injected vm, otherwise try to create one lazily\n if (options.vm) {\n this.vm = options.vm;\n } else {\n try {\n const basePath = getBasePath ? getBasePath() : process.cwd();\n const folder = options.folder || fileConfig.folder || \"databases\";\n } catch (err) {\n // don't throw during construction; log and allow server to start\n console.error(\n \"Failed to create internal VM:\",\n (err && (err as Error).message) ? (err as Error).message : err\n );\n this.vm = null;\n }\n }\n\n // server-side secret for signing JWTs. Prefer an explicit env or file-based secret\n this.serverSecret =\n options.serverSecret ||\n process.env.SCRIPTDB_JWT_SECRET ||\n fileConfig.serverSecret ||\n null;\n if (!this.serverSecret) {\n console.warn(\n \"Protocal: No serverSecret configured. In production a serverSecret is required.\"\n );\n }\n\n // In production require a server-wide signing secret (do not allow fallback)\n const cpuCount = os.cpus && os.cpus().length ? os.cpus().length : 1;\n const defaultValidatorPool = Math.max(\n 0,\n Math.min(2, Math.floor(cpuCount / 4))\n );\n this.validatorPoolSize =\n typeof options.validatorPoolSize === \"number\"\n ? options.validatorPoolSize\n : defaultValidatorPool;\n\n // rate limiting: per-IP and per-username login attempts\n // Use a Bottleneck.Group to create per-IP limiters (enforced with await)\n this.ipLimiterGroup = new Bottleneck.Group({\n maxConcurrent: 1,\n minTime: 50,\n });\n \n // per-username attempts: { attempts, lockedUntil, expiresAt }\n this.loginAttemptCache = new Map(); // username -> { attempts, lockedUntil, expiresAt }\n // per-IP attempts tracking to detect abusive IPs\n this.ipAttemptCache = new Map(); // ip -> { attempts, lockedUntil, expiresAt }\n this.IP_FAIL_WINDOW_MS = options.ipFailWindowMs || fileConfig.ipFailWindowMs || 15 * 60 * 1000; // 15 minutes sliding window\n this.MAX_LOGIN_ATTEMPTS = options.maxLoginAttempts || fileConfig.maxLoginAttempts || 5;\n this.LOCK_DURATION_MS = options.lockDurationMs || fileConfig.lockDurationMs || 15 * 60 * 1000; // 15 minutes lockout\n this.ENABLE_IP_LOCKOUT = options.enableIpLockout !== undefined ? options.enableIpLockout : (fileConfig.enableIpLockout !== undefined ? fileConfig.enableIpLockout : true);\n this.MAX_MESSAGE_BYTES = options.maxMessageBytes || 64 * 1024; // 64 KB per NDJSON message\n this.MAX_MESSAGES_PER_CONNECTION = options.maxMessagesPerConnection || 1000;\n \n // By default do not set a server-side connection timeout (0 = disabled).\n // Prefer explicit option, then fileConfig, otherwise 0.\n this.CONNECTION_TIMEOUT_MS =\n typeof options.connectionTimeoutMs === \"number\"\n ? options.connectionTimeoutMs\n : typeof fileConfig.connectionTimeoutMs === \"number\"\n ? fileConfig.connectionTimeoutMs\n : 0;\n this.tlsOptions = options.tlsOptions || fileConfig.tlsOptions || null;\n this.requireTlsInProduction =\n options.requireTlsInProduction !== undefined\n ? options.requireTlsInProduction\n : true;\n\n // optional payload schema (simple white-listing). If provided, it should be an object\n // mapping allowed top-level fields to expected types: { command: 'string', args: 'object' }\n this.payloadSchema = options.payloadSchema ||\n fileConfig.payloadSchema || { \n command: \"string\", \n args: \"object\",\n code: \"string\",\n databaseName: \"string\"\n };\n\n // controls whether per-user signingSecret is allowed as a fallback\n this.allowPerUserSigning = options.allowPerUserSigning || false;\n\n // sanitizer and payload validation limits\n this._payloadMaxDepth = options.payloadMaxDepth || 4;\n this._payloadMaxNodes = options.payloadMaxNodes || 1000;\n this._payloadMaxBytes = options.payloadMaxBytes || 16 * 1024; // 16KB\n this._sanitizeMaxDepth = options.sanitizeMaxDepth || 6;\n this._sanitizeMaxNodes = options.sanitizeMaxNodes || 2000;\n this._sanitizeMaxString = options.sanitizeMaxString || 1000; // chars\n\n // cleanup timer to evict expired attempt records and prevent unbounded growth\n this._attemptCacheTTL = options.attemptCacheTTL || 60 * 60 * 1000; // 1 hour default\n this._attemptCacheCleanupInterval = setInterval(() => {\n const now = Date.now();\n this.loginAttemptCache.forEach((v, k) => {\n if (v.expiresAt && v.expiresAt <= now) this.loginAttemptCache.delete(k);\n });\n this.ipAttemptCache.forEach((v, k) => {\n if (v.expiresAt && v.expiresAt <= now) this.ipAttemptCache.delete(k);\n });\n }, Math.max(30 * 1000, this._attemptCacheTTL / 4));\n\n // simple audit logger (avoid writing secrets). Use structured object for later integration with logging systems.\n this.audit = function (event: string, meta?: any) {\n try {\n const safeMeta = Object.assign({}, meta || {});\n // redact sensitive keys if present\n if (safeMeta.token) safeMeta.token = \"[REDACTED]\";\n if (safeMeta.password) safeMeta.password = \"[REDACTED]\";\n if (safeMeta.passwordHash) safeMeta.passwordHash = \"[REDACTED]\";\n if (safeMeta.signingSecret) safeMeta.signingSecret = \"[REDACTED]\";\n console.warn(\n JSON.stringify({\n ts: new Date().toISOString(),\n event,\n meta: safeMeta,\n })\n );\n } catch (e) {}\n };\n\n // worker pools\n this._bcryptWorkers = [];\n this._bcryptNext = 0;\n this._bcryptPending = new Map();\n const defaultBcrypt = Math.max(1, Math.min(4, Math.floor(cpuCount / 2)));\n this.bcryptPoolSize =\n typeof options.bcryptPoolSize === \"number\"\n ? options.bcryptPoolSize\n : defaultBcrypt;\n this.bcryptMaxPoolSize =\n options.bcryptMaxPoolSize || Math.max(4, this.bcryptPoolSize * 4);\n \n for (let i = 0; i < this.bcryptPoolSize; i++) {\n const w = new Worker(path.join(__dirname, \"workers\", \"bcrypt-worker.js\"));\n w.on(\"message\", (m) => {\n const p = this._bcryptPending.get(m.id);\n if (p) {\n const start = p.start || 0;\n const lat = start ? Date.now() - start : 0;\n if (lat > 0)\n this._recordLatency(\n this._bcryptLatencies,\n lat,\n this._bcryptLatencyWindow\n );\n clearTimeout(p.timer);\n this._bcryptPending.delete(m.id);\n if (m.error) {\n this._bcryptFailures.push(Date.now());\n p.reject(new Error(m.error));\n } else {\n p.resolve(m.ok);\n }\n }\n // opportunistic autoscale\n try {\n this._autoscalePools();\n } catch (e) {}\n });\n w.on(\"error\", (e) => {\n console.error(\"bcrypt worker error\", (e && (e as Error).message));\n this._bcryptFailures.push(Date.now());\n try {\n this._autoscalePools();\n } catch (e) {}\n });\n this._bcryptWorkers.push(w);\n }\n\n // bcrypt metrics and simple latency window\n this._bcryptLatencies = [];\n this._bcryptLatencyWindow = options.bcryptLatencyWindow || 100; // keep last N latencies\n\n // bcrypt circuit-breaker\n this._bcryptFailures = [];\n this._bcryptFailureWindowMs = options.bcryptFailureWindowMs || 60 * 1000; // 1min\n this._bcryptFailureThreshold = options.bcryptFailureThreshold || 5; // trips after N failures in window\n this._bcryptCircuitCooldownMs =\n options.bcryptCircuitCooldownMs || 2 * 60 * 1000; // 2min\n this._bcryptTrippedUntil = 0;\n\n // token verification cache (LRU) to reduce jwt.verify calls\n this._tokenVerifyCache = new LRUCache({ max: 1000, ttl: 1000 * 60 * 5 }); // 5m default\n\n // attach optional storage instance if provided (so server.metrics can reference compact state)\n this.storage = options.storage || null;\n\n // alerting thresholds\n this.alertPendingThreshold =\n typeof options.alertPendingThreshold === \"number\"\n ? options.alertPendingThreshold\n : 50;\n\n // optional VM worker pool\n this._vmWorkers = [];\n this._vmNext = 0;\n this._vmPending = new Map();\n this._vmLatencies = [];\n this._vmLatencyWindow = options.vmLatencyWindow || 100;\n this._vmFailures = [];\n this._vmFailureWindowMs = options.vmFailureWindowMs || 60 * 1000;\n this._vmFailureThreshold = options.vmFailureThreshold || 3;\n this._vmCircuitCooldownMs = options.vmCircuitCooldownMs || 2 * 60 * 1000;\n this._vmTrippedUntil = 0;\n \n if (options.vmWorkerPoolSize && options.vmWorkerPoolSize > 0) {\n const defaultVmPool = Math.max(\n 0,\n Math.min(2, Math.max(1, Math.floor(cpuCount / 2)) - 1)\n );\n const vmPool =\n typeof options.vmWorkerPoolSize === \"number\"\n ? options.vmWorkerPoolSize\n : defaultVmPool;\n \n for (let i = 0; i < vmPool; i++) {\n const w = new Worker(path.join(__dirname, \"vm-worker.js\"));\n // init VM worker\n w.postMessage({\n id: `init-${i}`,\n action: \"init\",\n options: {\n baseDir: options.folder\n ? path.join(getBasePath ? getBasePath() : process.cwd(), options.folder)\n : undefined,\n },\n });\n \n w.on(\"message\", (m) => {\n const p = this._vmPending.get(m.id);\n if (p) {\n const start = p.start || 0;\n const lat = start ? Date.now() - start : 0;\n if (lat > 0)\n this._recordLatency(\n this._vmLatencies,\n lat,\n this._vmLatencyWindow\n );\n clearTimeout(p.timer);\n this._vmPending.delete(m.id);\n if (m.error) {\n this._vmFailures.push(Date.now());\n p.reject(new Error(m.error));\n } else {\n p.resolve(m.res);\n }\n }\n try {\n this._autoscalePools();\n } catch (e) {}\n });\n \n w.on(\"error\", (e) => {\n console.error(\"vm worker error\", (e && (e as Error).message));\n this._vmFailures.push(Date.now());\n try {\n this._autoscalePools();\n } catch (e) {}\n });\n this._vmWorkers.push(w);\n }\n }\n\n // validator worker pool (offload heavy validate/sanitize)\n this._validatorWorkers = [];\n this._validatorNext = 0;\n this._validatorPending = new Map();\n const validatorPoolSize = options.validatorPoolSize || 0;\n this.validatorPoolSize = validatorPoolSize;\n this._validatorLatencies = [];\n this._validatorLatencyWindow = options.validatorLatencyWindow || 100;\n this._validatorFailures = [];\n this._validatorFailureWindowMs =\n options.validatorFailureWindowMs || 60 * 1000;\n this._validatorFailureThreshold = options.validatorFailureThreshold || 5;\n this._validatorCircuitCooldownMs =\n options.validatorCircuitCooldownMs || 2 * 60 * 1000;\n this._validatorTrippedUntil = 0;\n \n if (validatorPoolSize > 0) {\n for (let i = 0; i < validatorPoolSize; i++) {\n const vw = new Worker(path.join(__dirname, \"validator-worker.js\"));\n vw.on(\"message\", (m) => {\n const p = this._validatorPending.get(m.id);\n if (p) {\n const start = p.start || 0;\n const lat = start ? Date.now() - start : 0;\n if (lat > 0)\n this._recordLatency(\n this._validatorLatencies,\n lat,\n this._validatorLatencyWindow\n );\n clearTimeout(p.timer);\n this._validatorPending.delete(m.id);\n if (m.error) {\n this._validatorFailures.push(Date.now());\n p.reject(new Error(m.error));\n } else {\n p.resolve(m.res);\n }\n }\n });\n vw.on(\"error\", (e) => {\n console.error(\"validator worker error\", (e && (e as Error).message));\n this._validatorFailures.push(Date.now());\n });\n this._validatorWorkers.push(vw);\n }\n }\n\n // metrics\n this.metrics = {\n bcryptPending: () => this._bcryptPending.size,\n vmPending: () => this._vmPending.size,\n vmWorkers: () => this._vmWorkers.length,\n activeConnections: 0,\n validatorPending: () => this._validatorPending.size,\n validatorWorkers: () => this._validatorWorkers.length,\n bcryptAvgLatency: () => {\n const a = this._bcryptLatencies;\n return a.length ? a.reduce((s, v) => s + v, 0) / a.length : 0;\n },\n vmAvgLatency: () => {\n const a = this._vmLatencies;\n return a.length ? a.reduce((s, v) => s + v, 0) / a.length : 0;\n },\n validatorAvgLatency: () => {\n const a = this._validatorLatencies;\n return a.length ? a.reduce((s, v) => s + v, 0) / a.length : 0;\n },\n compactActive: () =>\n this.storage && this.storage._compactActive\n ? this.storage._compactActive\n : 0,\n compactTripped: () =>\n this.storage &&\n this.storage._compactTrippedUntil &&\n Date.now() < this.storage._compactTrippedUntil\n ? true\n : false,\n };\n\n // connection limits\n this.maxConnections = options.maxConnections || 1000;\n this.backlog = options.backlog || 128;\n\n // worker timeouts\n this.bcryptWorkerTimeoutMs = options.bcryptWorkerTimeoutMs || 5000;\n this.vmWorkerTimeoutMs =\n options.vmWorkerTimeoutMs ||\n (options.runTimeoutMs ? options.runTimeoutMs + 500 : 5000);\n\n // autoscale check interval (for bcrypt & vm pools)\n this._autoscaleIntervalMs = options.autoscaleIntervalMs || 2000;\n this._autoscaleTimer = null;\n }\n\n // simple helper to record latency into a fixed window\n _recordLatency(arr: number[], val: number, cap: number) {\n try {\n arr.push(val);\n if (arr.length > cap) arr.shift();\n } catch (e) {}\n }\n\n // check and perform simple autoscaling for bcrypt pool\n _autoscalePools() {\n try {\n // bcrypt: scale up if pending queue depth is large\n const pending = this._bcryptPending.size;\n const workers = this._bcryptWorkers.length;\n if (pending > workers * 2 && workers < this.bcryptMaxPoolSize) {\n // spawn one worker\n const w = new Worker(path.join(__dirname, \"workers\", \"bcrypt-worker.js\"));\n w.on(\"message\", (m) => {\n const p = this._bcryptPending.get(m.id);\n if (p) {\n clearTimeout(p.timer);\n this._bcryptPending.delete(m.id);\n if (m.error) p.reject(new Error(m.error));\n else p.resolve(m.ok);\n }\n });\n w.on(\"error\", (e) => {\n console.error(\"bcrypt worker error (autoscale)\", (e && (e as Error).message));\n });\n this._bcryptWorkers.push(w);\n }\n // alert if exceptionally high backlog\n if (pending > Math.max(this.alertPendingThreshold, workers * 5)) {\n try {\n this.audit(\"queue.high\", { type: \"bcrypt\", pending, workers });\n } catch (e) {}\n }\n \n // vm: scale up similarly (only if configured to allow dynamic expansion)\n const vmPending = this._vmPending.size;\n const vmWorkers = this._vmWorkers.length;\n const vmMax = Math.max(\n this._vmWorkers.length,\n this.vmMaxPoolSize || this._vmWorkers.length + 4\n );\n \n if (vmPending > vmWorkers * 2 && vmWorkers < vmMax) {\n const w = new Worker(path.join(__dirname, \"vm-worker.js\"));\n w.postMessage({\n id: `init-auto-${Date.now()}`,\n action: \"init\",\n options: { baseDir: undefined },\n });\n \n w.on(\"message\", (m) => {\n const p = this._vmPending.get(m.id);\n if (p) {\n clearTimeout(p.timer);\n this._vmPending.delete(m.id);\n if (m.error) p.reject(new Error(m.error));\n else p.resolve(m.res);\n }\n });\n \n w.on(\"error\", (e) => {\n console.error(\"vm worker error (autoscale)\", (e && (e as Error).message));\n });\n this._vmWorkers.push(w);\n }\n \n if (vmPending > Math.max(this.alertPendingThreshold, vmWorkers * 5)) {\n try {\n this.audit(\"queue.high\", {\n type: \"vm\",\n pending: vmPending,\n workers: vmWorkers,\n });\n } catch (e) {}\n }\n } catch (e) {}\n }\n\n start() {\n const createListener = async (socket: net.Socket | tls.TLSSocket) => {\n // enforce connection limit\n if (this.metrics.activeConnections >= this.maxConnections) {\n try {\n socket.end();\n } catch (e) {}\n return;\n }\n this.metrics.activeConnections++;\n console.log(\"Client connected\");\n \n // do not store the socket on the server instance (multiple clients)\n // handle socket errors to avoid crashing the server when clients disconnect abruptly\n socket.on(\"error\", (err) => {\n console.error(\"Socket error:\", (err && (err as Error).message) ? (err as Error).message : err);\n });\n \n socket.on(\"close\", (hadError: boolean) => {\n // informative log; don't throw\n console.log(\"Socket closed\", hadError ? \"(due to error)\" : \"\");\n this.metrics.activeConnections = Math.max(\n 0,\n this.metrics.activeConnections - 1\n );\n });\n \n // support multiple JSON messages over the same socket by using newline-delimited JSON (NDJSON)\n let recvBuf = \"\";\n let messagesReceived = 0;\n socket.setTimeout(this.CONNECTION_TIMEOUT_MS);\n \n socket.on(\"timeout\", () => {\n try {\n sendWithBackpressure({ command: \"error\", message: \"TIMEOUT\" });\n } catch (e) {}\n socket.end();\n });\n\n // helper to write JSON respecting backpressure\n const sendWithBackpressure = (obj: any) => {\n try {\n const s = JSON.stringify(obj) + \"\\n\";\n console.log('sendWithBackpressure: sending message to socket:', socket.remoteAddress, socket.remotePort, ':', s.trim());\n const ok = socket.write(s);\n console.log('sendWithBackpressure: write returned:', ok);\n if (!ok) {\n socket.pause();\n socket.once(\"drain\", () => socket.resume());\n }\n } catch (e) {\n console.error('sendWithBackpressure error:', e);\n }\n };\n\n // Async version for critical messages that need to be delivered\n const sendCritical = (obj: any): Promise<void> => {\n return new Promise((resolve, reject) => {\n try {\n const s = JSON.stringify(obj) + \"\\n\";\n console.log('sendCritical writing:', s.trim());\n socket.write(s, (err) => {\n if (err) {\n console.error('sendCritical write error:', err);\n return reject(err);\n }\n console.log('sendCritical write callback called, waiting 50ms...');\n // Give time for OS to flush the write buffer\n setTimeout(() => {\n console.log('sendCritical resolved after 50ms');\n resolve();\n }, 50);\n });\n } catch (e) {\n console.error('sendCritical exception:', e);\n reject(e);\n }\n });\n };\n\n socket.on(\"data\", async (data: Buffer) => {\n // enforce per-message size limit\n if (data.length > this.MAX_MESSAGE_BYTES) {\n try {\n sendWithBackpressure({\n command: \"error\",\n message: \"MSG_TOO_LARGE\",\n });\n } catch (e) {}\n socket.end();\n return;\n }\n \n recvBuf += data.toString();\n let idx;\n while ((idx = recvBuf.indexOf(\"\\n\")) !== -1) {\n if (++messagesReceived > this.MAX_MESSAGES_PER_CONNECTION) {\n try {\n sendWithBackpressure({\n command: \"error\",\n message: \"TOO_MANY_MESSAGES\",\n });\n } catch (e) {}\n socket.end();\n return;\n }\n \n const line = recvBuf.slice(0, idx).trim();\n recvBuf = recvBuf.slice(idx + 1);\n if (!line) continue;\n \n let object: any;\n try {\n object = JSON.parse(line);\n } catch (err) {\n console.error(\n \"Invalid JSON from client:\",\n (err && (err as Error).message) ? (err as Error).message : err\n );\n try {\n sendWithBackpressure({\n command: \"error\",\n message: \"INVALID_JSON\",\n });\n } catch (e) {}\n // do not close immediately; continue to next message\n continue;\n }\n\n // Support both 'command' and 'action' fields for compatibility\n const commandOrAction = object.command || object.action;\n\n switch (commandOrAction) {\n case \"login\":\n // Check secure mode\n const username = object.data?.username || '';\n const password = object.data?.password || '';\n \n console.log('Login attempt:', { username, hasPassword: !!password, objectId: object.id, secure: this.secure });\n \n // If secure mode is false, allow anonymous access automatically\n if (!this.secure) {\n console.log('Secure mode disabled - allowing anonymous access');\n const secretToUse = this.getEffectiveSecret();\n const token = jwt.sign(\n { username: username || '', role: 'anonymous' },\n secretToUse,\n { expiresIn: '24h' }\n );\n \n try {\n sendWithBackpressure({\n id: object.id,\n action: \"login\",\n command: \"login\",\n message: \"AUTH OK\",\n data: { token },\n });\n console.log('Anonymous AUTH OK sent (secure=false)');\n } catch (e) {\n console.error('Error sending AUTH OK:', e);\n }\n break;\n }\n \n // Secure mode is true - username and password are REQUIRED\n if (!username || !password) {\n console.log('Secure mode enabled - credentials required but not provided');\n try {\n await sendCritical({\n id: object.id,\n action: \"login\",\n command: \"login\",\n message: \"AUTH FAIL\",\n data: \"Username and password are required in secure mode\",\n });\n console.log('AUTH FAIL message sent and flushed, now closing socket...');\n // Close socket after message is sent\n socket.end();\n console.log('Socket closed after AUTH FAIL');\n } catch (e) {\n console.error('Error sending AUTH FAIL:', e);\n socket.end();\n }\n return;\n }\n\n // rate-limit per-IP (enforced). Use a per-IP limiter and await schedule.\n const remoteIP =\n (socket as any).remoteAddress || (socket as any).remoteAddress || \"unknown\";\n try {\n const ipLimiter = this.ipLimiterGroup.key(remoteIP);\n await ipLimiter.schedule(() => Promise.resolve());\n } catch (e) {\n // If limiter scheduling fails, audit and continue\n this.audit(\"limiter.schedule.error\", {\n ip: remoteIP,\n err: ((e as Error) && (e as Error).message) || String(e),\n });\n }\n\n // bump per-IP counter (only if IP lockout is enabled)\n if (this.ENABLE_IP_LOCKOUT) {\n const nowTs = Date.now();\n const ipRec = this.ipAttemptCache.get(remoteIP) || {\n attempts: 0,\n lockedUntil: 0,\n expiresAt: nowTs + this._attemptCacheTTL,\n };\n ipRec.attempts = (ipRec.attempts || 0) + 1;\n ipRec.expiresAt = nowTs + this._attemptCacheTTL;\n // if IP exceeds attempts threshold, lock it\n if (ipRec.attempts >= this.MAX_LOGIN_ATTEMPTS) {\n ipRec.lockedUntil = nowTs + this.LOCK_DURATION_MS;\n this.audit(\"ip.lockout\", {\n ip: remoteIP,\n attempts: ipRec.attempts,\n });\n }\n this.ipAttemptCache.set(remoteIP, ipRec);\n if (ipRec.lockedUntil && ipRec.lockedUntil > nowTs) {\n this.audit(\"ip.locked\", { ip: remoteIP });\n try {\n sendWithBackpressure({\n command: \"login\",\n message: \"LOCKED_IP\",\n data: null,\n });\n } catch (e) {}\n break;\n }\n }\n\n // simple account lockout\n const now = Date.now();\n const record = this.loginAttemptCache.get(username) || {\n attempts: 0,\n lockedUntil: 0,\n expiresAt: now + this._attemptCacheTTL,\n };\n if (record.lockedUntil && record.lockedUntil > now) {\n try {\n sendWithBackpressure({\n command: \"login\",\n message: \"LOCKED\",\n data: null,\n });\n } catch (e) {}\n break;\n }\n\n // find user record\n const user = this.users.find((u) => u.username === username);\n if (!user) {\n // increment attempts and set expiry\n record.attempts = (record.attempts || 0) + 1;\n record.expiresAt = Date.now() + this._attemptCacheTTL;\n if (record.attempts >= this.MAX_LOGIN_ATTEMPTS) {\n record.lockedUntil = now + this.LOCK_DURATION_MS;\n // observe failed auth\n this.audit(\"login.lockout\", { user: username, ip: remoteIP });\n }\n this.loginAttemptCache.set(username, record);\n try {\n sendWithBackpressure({\n id: object.id,\n action: \"login\",\n command: \"login\",\n message: \"AUTH FAIL\",\n data: null,\n });\n } catch (e) {}\n break;\n }\n\n // Debug: log user found and password received\n console.log('User found:', {\n username: user.username,\n hasPassword: !!user.password,\n passwordValue: user.password,\n hash: user.hash,\n algorithm: user.algorithm\n });\n console.log('Password received:', password);\n\n // Check if using plain password or hashed password\n let matches = false;\n \n // Determine authentication method based on user config\n if (user.hash === false && user.password) {\n // Plain password comparison (hash disabled)\n console.log('Using plain password authentication (hash: false)');\n matches = user.password === password;\n } else if (user.hash === true && user.password) {\n // Need to hash the password first based on algorithm\n console.log('Using password hashing with algorithm:', user.algorithm || 'bcrypt');\n const algorithm = user.algorithm || 'bcrypt';\n \n if (algorithm === 'bcrypt') {\n // Use bcrypt worker for hashing and comparison\n const doBcryptCompare = (password: string, hash: string): Promise<boolean> =>\n new Promise((resolve, reject) => {\n if (!this._bcryptWorkers || this._bcryptWorkers.length === 0)\n return resolve(false);\n \n const id = Math.random().toString(36).slice(2);\n const wIndex =\n this._bcryptNext++ % this._bcryptWorkers.length;\n const start = Date.now();\n const timer = setTimeout(() => {\n const p = this._bcryptPending.get(id);\n if (p) {\n this._bcryptPending.delete(id);\n p.reject(new Error(\"bcrypt worker timeout\"));\n }\n try {\n this._bcryptWorkers[wIndex].terminate();\n } catch (e) {}\n const nw = new Worker(\n path.join(__dirname, \"workers\", \"bcrypt-worker.js\")\n );\n this._bcryptWorkers[wIndex] = nw;\n }, this.bcryptWorkerTimeoutMs);\n \n this._bcryptPending.set(id, {\n resolve,\n reject,\n timer,\n start,\n });\n \n try {\n this._bcryptWorkers[wIndex].postMessage({\n id,\n password,\n hash,\n });\n } catch (e) {\n clearTimeout(timer);\n this._bcryptPending.delete(id);\n return resolve(false);\n }\n });\n \n try {\n // Hash the stored password if it's not already hashed\n // For now, we'll assume user.password is the plain text to compare\n // In production, you should pre-hash passwords and store in passwordHash\n matches = user.password === password;\n } catch (e) {\n matches = false;\n }\n } else if (algorithm === 'sha256' || algorithm === 'sha512') {\n // Use crypto for SHA hashing\n const hashedPassword = crypto.createHash(algorithm).update(password).digest('hex');\n matches = user.password === hashedPassword;\n }\n }\n \n if (!matches) {\n record.attempts = (record.attempts || 0) + 1;\n record.expiresAt = Date.now() + this._attemptCacheTTL;\n if (record.attempts >= this.MAX_LOGIN_ATTEMPTS) {\n record.lockedUntil = now + this.LOCK_DURATION_MS;\n this.audit(\"login.lockout\", { user: username, ip: remoteIP });\n }\n this.loginAttemptCache.set(username, record);\n try {\n sendWithBackpressure({\n id: object.id,\n action: \"login\",\n command: \"login\",\n message: \"AUTH FAIL\",\n data: null,\n });\n } catch (e) {}\n break;\n }\n\n // reset attempts on success\n this.loginAttemptCache.delete(username);\n\n // sign token using serverSecret (with fallback for dev mode)\n let token: string;\n try {\n token = jwt.sign({ username: user.username }, this.getEffectiveSecret(), {\n expiresIn: \"1d\",\n });\n } catch (e) {\n try {\n sendWithBackpressure({\n id: object.id,\n action: \"login\",\n command: \"login\",\n message: \"ERROR\",\n data: { error: ((e as Error) && (e as Error).message) || String(e) },\n });\n } catch (e) {}\n break;\n }\n \n try {\n sendWithBackpressure({\n id: object.id,\n action: \"login\",\n command: \"login\",\n message: \"AUTH OK\",\n data: { token },\n });\n } catch (e) {}\n break;\n \n case \"script-code\":\n console.log(\"script-code command\", object);\n \n try {\n // accept token either at top-level or inside data\n const token =\n object.token || (object.data && object.data.token);\n if (!token) throw new Error(\"Missing token\");\n\n // guard: token size cap (avoid huge tokens)\n if (\n typeof token === \"string\" &&\n Buffer.byteLength(token, \"utf8\") > 4096\n )\n throw new Error(\"Token too large\");\n \n const decodedUnverified = jwt.decode(token) as any;\n if (!decodedUnverified)\n throw new Error(\"Invalid token payload\");\n \n // For anonymous users, username might be empty but role should be \"anonymous\"\n const username = decodedUnverified.username || (decodedUnverified.role === 'anonymous' ? '' : null);\n if (username === null)\n throw new Error(\"Invalid token payload\");\n\n // Find user record, allow anonymous if secure is disabled\n const userRecord = this.users.find(\n (u) => u.username === username\n );\n if (!userRecord) {\n // Allow anonymous access if secure mode is disabled\n if (username === '' && !this.secure) {\n // Continue with anonymous user\n } else {\n throw new Error(\"Unknown user\");\n }\n }\n\n // Verify token using serverSecret\n let decoded: any;\n // check cache first\n const cacheKey = `${token}:${this.serverSecret}`;\n const cached = this._tokenVerifyCache.get(cacheKey);\n if (cached) {\n decoded = cached;\n } else {\n try {\n decoded = jwt.verify(token, this.getEffectiveSecret());\n this._tokenVerifyCache.set(cacheKey, decoded);\n } catch (eServer) {\n this.audit(\"jwt.verify.failed\", {\n user: username,\n });\n throw new Error(\"Invalid token after verify\");\n }\n }\n if (!decoded)\n throw new Error(\"Invalid token after verify\");\n\n console.log('script-code: token verified, checking VM...');\n \n // now run the vm command\n if (!this.vm || typeof this.vm.run !== \"function\") {\n console.error('script-code: VM not available');\n sendWithBackpressure({\n command: \"script-code\",\n message: \"ERROR\",\n data: \"VM_NOT_AVAILABLE\",\n });\n break;\n }\n \n console.log('script-code: VM available, preparing data...');\n \n // Validate and sanitize payload before passing to VM. Only allow a constrained shape.\n const data =\n object.data && typeof object.data === \"object\"\n ? object.data\n : {};\n \n // offload heavy validation to validator worker when available to avoid blocking\n const validateViaWorker = (payload: any): Promise<any> =>\n new Promise((resolve, reject) => {\n try {\n if (\n !this._validatorWorkers ||\n this._validatorWorkers.length === 0\n )\n return resolve(null);\n // circuit-breaker: if validator tripped, refuse\n if (Date.now() < (this._validatorTrippedUntil || 0))\n return resolve(null);\n const wIndex =\n this._validatorNext++ % this._validatorWorkers.length;\n const w = this._validatorWorkers[wIndex];\n const id = Math.random().toString(36).slice(2);\n const timer = setTimeout(\n () => {\n const p = this._validatorPending.get(id);\n if (p) {\n this._validatorPending.delete(id);\n p.reject(new Error(\"validator worker timeout\"));\n }\n try {\n w.terminate();\n } catch (e) {}\n // mark failure\n this._validatorFailures.push(Date.now());\n // if failures exceed threshold in window, trip\n const recent = this._validatorFailures.filter(\n (t) =>\n t > Date.now() - this._validatorFailureWindowMs\n );\n if (recent.length >= this._validatorFailureThreshold)\n this._validatorTrippedUntil =\n Date.now() + this._validatorCircuitCooldownMs;\n },\n this._validatorTimeoutMs || 3000\n );\n this._validatorPending.set(id, {\n resolve,\n reject,\n timer,\n start: Date.now(),\n });\n w.postMessage({\n id,\n action: \"validate\",\n payload,\n options: {\n schema: this.payloadSchema,\n maxDepth: this._payloadMaxDepth,\n maxNodes: this._payloadMaxNodes,\n },\n });\n } catch (e) {\n return resolve(null);\n }\n });\n\n const sanitizeViaWorker = (payload: any): Promise<any> =>\n new Promise((resolve, reject) => {\n try {\n if (\n !this._validatorWorkers ||\n this._validatorWorkers.length === 0\n )\n return resolve(null);\n if (Date.now() < (this._validatorTrippedUntil || 0))\n return resolve(null);\n const wIndex =\n this._validatorNext++ % this._validatorWorkers.length;\n const w = this._validatorWorkers[wIndex];\n const id = Math.random().toString(36).slice(2);\n const timer = setTimeout(\n () => {\n const p = this._validatorPending.get(id);\n if (p) {\n this._validatorPending.delete(id);\n p.reject(new Error(\"validator worker timeout\"));\n }\n try {\n w.terminate();\n } catch (e) {}\n this._validatorFailures.push(Date.now());\n const recent = this._validatorFailures.filter(\n (t) =>\n t > Date.now() - this._validatorFailureWindowMs\n );\n if (recent.length >= this._validatorFailureThreshold)\n this._validatorTrippedUntil =\n Date.now() + this._validatorCircuitCooldownMs;\n },\n this._validatorTimeoutMs || 3000\n );\n this._validatorPending.set(id, {\n resolve,\n reject,\n timer,\n start: Date.now(),\n });\n w.postMessage({\n id,\n action: \"sanitize\",\n payload,\n options: {\n allowedKeys: [\n \"result\",\n \"value\",\n \"items\",\n \"length\",\n \"status\",\n \"message\",\n ],\n maxNodes: this._sanitizeMaxNodes,\n maxDepth: this._sanitizeMaxDepth,\n maxString: this._sanitizeMaxString,\n },\n });\n } catch (e) {\n return resolve(null);\n }\n });\n\n const localValidate = (payload: any) => {\n const out: any = {};\n let nodes = 0;\n const checkDepth = (obj: any, depth: number): boolean => {\n if (depth > this._payloadMaxDepth) return false;\n if (nodes++ > this._payloadMaxNodes) return false;\n if (obj && typeof obj === \"object\") {\n for (const k of Object.keys(obj)) {\n const expected = (this.payloadSchema || {})[k];\n if (!expected) continue; // not allowed\n const val = obj[k];\n if (expected === \"string\" && typeof val === \"string\")\n out[k] = val;\n else if (\n expected === \"number\" &&\n typeof val === \"number\"\n )\n out[k] = val;\n else if (\n expected === \"object\" &&\n val &&\n typeof val === \"object\"\n ) {\n if (depth + 1 <= this._payloadMaxDepth) {\n out[k] = {};\n for (const nk of Object.keys(val)) {\n if ((this.payloadSchema || {})[nk])\n out[k][nk] = val[nk];\n }\n }\n }\n }\n return true;\n }\n return false;\n };\n if (!checkDepth(payload, 0)) return {};\n return out;\n };\n\n // Try validator worker first (if present), otherwise fallback to local validate\n let allowed: any = {};\n try {\n if (\n this._validatorWorkers &&\n this._validatorWorkers.length > 0\n ) {\n const res = await Promise.race([\n validateViaWorker(data).catch(() => null),\n new Promise((r) => setTimeout(() => r(null), 1500)),\n ]);\n if (res && typeof res === \"object\") allowed = res;\n else allowed = localValidate(data);\n } else {\n allowed = localValidate(data);\n }\n } catch (e) {\n allowed = localValidate(data);\n }\n \n console.log('script-code: validation complete, allowed keys:', Object.keys(allowed));\n \n // if no allowed fields and schema required, reject\n if (Object.keys(allowed).length === 0) {\n console.error('script-code: empty payload after validation');\n try {\n sendWithBackpressure({\n id: object.id,\n command: \"script-code\",\n message: \"ERROR\",\n data: \"INVALID_PAYLOAD\",\n });\n } catch (e) {}\n break;\n }\n\n // Ensure the VM runs in a promise. If VM worker pool exists, dispatch to a worker.\n const runInVmWorker = (payload: any): Promise<any> =>\n new Promise((resolve, reject) => {\n if (!this._vmWorkers || this._vmWorkers.length === 0)\n return resolve(null);\n const wIndex = this._vmNext++ % this._vmWorkers.length;\n const w = this._vmWorkers[wIndex];\n const id = Math.random().toString(36).slice(2);\n const timer = setTimeout(() => {\n const p = this._vmPending.get(id);\n if (p) {\n this._vmPending.delete(id);\n p.reject(new Error(\"vm worker timeout\"));\n }\n try {\n w.terminate();\n } catch (e) {}\n // replace worker\n const nw = new Worker(\n path.join(__dirname, \"vm-worker.js\")\n );\n nw.on(\"message\", (m) => {\n const p = this._vmPending.get(m.id);\n if (p) {\n clearTimeout(p.timer);\n this._vmPending.delete(m.id);\n if (m.error) p.reject(new Error(m.error));\n else p.resolve(m.res);\n }\n });\n this._vmWorkers[wIndex] = nw;\n }, this.vmWorkerTimeoutMs);\n this._vmPending.set(id, {\n resolve,\n reject,\n timer,\n start: Date.now(),\n });\n try {\n w.postMessage({ id, action: \"run\", payload });\n } catch (e) {\n clearTimeout(timer);\n this._vmPending.delete(id);\n return resolve(null);\n }\n });\n\n // Extract code and databaseName from allowed object\n const code = allowed.code;\n const databaseName = allowed.databaseName;\n \n if (!code || typeof code !== 'string') {\n console.error('script-code: invalid code type');\n try {\n sendWithBackpressure({\n id: object.id,\n command: \"script-code\",\n message: \"ERROR\",\n data: \"Missing or invalid code\",\n });\n } catch (e) {}\n break;\n }\n\n console.log('script-code: running code for database:', databaseName);\n \n const runPromise =\n this._vmWorkers && this._vmWorkers.length > 0\n ? runInVmWorker(code)\n : Promise.resolve(this.vm.run(code, databaseName));\n\n console.log('script-code: calling VM...');\n \n // handle runPromise resolution and sanitize via validator worker when possible\n Promise.resolve(runPromise)\n .then(async (res) => {\n console.log('script-code: VM returned result:', typeof res);\n try {\n let out: any;\n if (\n this._validatorWorkers &&\n this._validatorWorkers.length > 0\n ) {\n try {\n const wres = await Promise.race([\n sanitizeViaWorker(res).catch(() => null),\n new Promise((r) => setTimeout(() => r(null), 1500)),\n ]);\n out = wres && typeof wres === \"object\" ? wres : null;\n } catch (e) {\n out = null;\n }\n }\n if (!out) {\n // fallback local sanitize\n const allowedKeys = [\n \"result\",\n \"value\",\n \"items\",\n \"length\",\n \"status\",\n \"message\",\n \"namespace\",\n \"logs\",\n // Log object properties\n \"type\",\n \"args\",\n // Database properties\n \"name\",\n \"id\",\n \"data\",\n \"properties\",\n \"fields\",\n \"records\",\n \"rows\",\n \"columns\",\n // Allow database name from request\n databaseName,\n ];\n let nodes = 0;\n const rec = (input: any, depth = 0, isTopLevel = false, path: string[] = []): any => {\n if (nodes++ > this._sanitizeMaxNodes)\n return \"[REDACTED_NODES]\";\n if (depth > this._sanitizeMaxDepth)\n return \"[REDACTED_DEPTH]\";\n if (input === null || input === undefined)\n return input;\n if (typeof input === \"string\") {\n if (input.length > this._sanitizeMaxString)\n return (\n input.slice(0, this._sanitizeMaxString) +\n \"...[TRUNC]\"\n );\n return input;\n }\n if (\n typeof input === \"number\" ||\n typeof input === \"boolean\"\n )\n return input;\n if (typeof input === \"function\") {\n // Allow functions inside namespace (user exports)\n const isInsideNamespace = path.includes('namespace');\n if (isInsideNamespace) {\n return `[Function: ${input.name || 'anonymous'}]`;\n }\n return \"[REDACTED]\";\n }\n if (Array.isArray(input))\n return input.map((v) => rec(v, depth + 1, false, path));\n if (typeof input === \"object\") {\n const out2: any = {};\n // Check if we're inside namespace or logs\n const isInsideNamespace = path.includes('namespace');\n const isInsideLogs = path.includes('logs');\n for (const k of Object.keys(input)) {\n // At top level, allow all keys for maximum flexibility\n // Also allow all keys inside 'namespace' and 'logs' objects\n if (isTopLevel || allowedKeys.includes(k) || isInsideNamespace || isInsideLogs) {\n out2[k] = rec(input[k], depth + 1, false, [...path, k]);\n } else {\n out2[k] = \"[REDACTED]\";\n }\n }\n return out2;\n }\n return \"[REDACTED]\";\n };\n out = rec(res, 0, true, []);\n }\n console.log('script-code: sanitized result:', typeof out, out);\n try {\n console.log('script-code: sending OK response with id:', object.id);\n sendWithBackpressure({\n id: object.id,\n command: \"script-code\",\n message: \"OK\",\n data: out,\n });\n } catch (e) {\n console.error('script-code: failed to send OK response:', e);\n }\n } catch (e) {\n console.error('script-code: error during sanitize:', e);\n try {\n sendWithBackpressure({\n id: object.id,\n command: \"script-code\",\n message: \"ERROR\",\n data: ((e as Error) && (e as Error).message) || String(e),\n });\n } catch (ee) {}\n }\n })\n .catch((err) => {\n console.error('script-code: VM error:', err);\n try {\n sendWithBackpressure({\n id: object.id,\n command: \"script-code\",\n message: \"ERROR\",\n data: ((err as Error) && (err as Error).message) || String(err),\n });\n } catch (e) {\n console.error('script-code: failed to send ERROR response:', e);\n }\n });\n } catch (err) {\n try {\n await sendCritical({\n command: \"script-code\",\n message: \"AUTH FAIL\",\n data: ((err as Error) && (err as Error).message) || null,\n });\n console.log('Token verification AUTH FAIL sent and flushed - client will close');\n // Don't close socket - let client handle it after receiving message\n } catch (e) {\n console.error('Error sending token AUTH FAIL:', e);\n }\n return;\n }\n // Handle script-code command\n break;\n \n case \"create-db\":\n console.log(\"create-db command\", object);\n try {\n // Verify token first\n const token = object.token || (object.data && object.data.token);\n if (!token) throw new Error(\"Missing token\");\n \n // Verify token\n const decoded = jwt.verify(token, this.getEffectiveSecret()) as any;\n if (!decoded) throw new Error(\"Invalid token\");\n \n const username = decoded.username || decoded.role || 'anonymous';\n \n // Get database name\n const databaseName = object.data?.databaseName;\n if (!databaseName || typeof databaseName !== 'string') {\n throw new Error(\"Missing or invalid databaseName\");\n }\n \n // Validate database name\n if (!/^[a-zA-Z0-9_-]+$/.test(databaseName)) {\n throw new Error(\"Invalid database name. Use only alphanumeric characters, hyphens, and underscores.\");\n }\n \n // Create database file using storage\n if (!this.storage) {\n throw new Error(\"Storage not available\");\n }\n \n console.log(`Creating database: ${databaseName} for user: ${username}`);\n \n // Create initial database content\n const initialContent = `// Database: ${databaseName}\\n// Created: ${new Date().toISOString()}\\n// Author: ${username}\\n\\nexport const ${databaseName} = {};\\n`;\n \n const result = await this.storage.addFile(`${databaseName}.ts`, initialContent);\n \n console.log('Storage addFile result:', result);\n \n if (!result.success) {\n throw new Error(result.message);\n }\n \n sendWithBackpressure({\n id: object.id,\n action: commandOrAction,\n command: commandOrAction,\n message: \"SUCCESS\",\n data: {\n success: true,\n databaseName,\n path: result.path,\n message: `Database '${databaseName}' created successfully`\n },\n });\n } catch (err) {\n try {\n sendWithBackpressure({\n id: object.id,\n action: commandOrAction,\n command: commandOrAction,\n message: \"ERROR\",\n data: ((err as Error) && (err as Error).message) || String(err),\n });\n } catch (e) {}\n }\n break;\n \n case \"list-dbs\":\n console.log(\"list-dbs command\", object);\n try {\n // Verify token first\n const token = object.token || (object.data && object.data.token);\n if (!token) throw new Error(\"Missing token\");\n \n console.log(\"list-dbs: verifying token...\");\n // Verify token\n const decoded = jwt.verify(token, this.getEffectiveSecret()) as any;\n if (!decoded) throw new Error(\"Invalid token\");\n \n console.log(\"list-dbs: token verified, listing files...\");\n // Get list of database files\n if (!this.storage) {\n throw new Error(\"Storage not available\");\n }\n \n const files = await this.storage.listFiles();\n console.log(\"list-dbs: found files:\", files);\n \n // Filter only .ts files and remove extension\n const databases = files\n .filter((file: string) => file.endsWith('.ts'))\n .map((file: string) => {\n const name = file.replace(/\\.ts$/, '');\n return { name, path: file };\n });\n \n console.log(\"list-dbs: sending response with\", databases.length, \"databases\");\n sendWithBackpressure({\n id: object.id,\n action: commandOrAction,\n command: commandOrAction,\n message: \"SUCCESS\",\n data: {\n databases,\n count: databases.length\n },\n });\n } catch (err) {\n console.error(\"list-dbs ERROR:\", err);\n try {\n sendWithBackpressure({\n id: object.id,\n action: commandOrAction,\n command: commandOrAction,\n message: \"ERROR\",\n data: ((err as Error) && (err as Error).message) || String(err),\n });\n } catch (e) {\n console.error(\"Failed to send error response:\", e);\n }\n }\n break;\n \n case \"remove-db\":\n console.log(\"remove-db command\", object);\n try {\n // Verify token first\n const token = object.token || (object.data && object.data.token);\n if (!token) throw new Error(\"Missing token\");\n \n // Verify token\n const decoded = jwt.verify(token, this.getEffectiveSecret()) as any;\n if (!decoded) throw new Error(\"Invalid token\");\n \n const username = decoded.username || decoded.role || 'anonymous';\n \n // Get database name\n const databaseName = object.data?.databaseName;\n if (!databaseName || typeof databaseName !== 'string') {\n throw new Error(\"Missing or invalid databaseName\");\n }\n \n // Delete database file using storage\n if (!this.storage) {\n throw new Error(\"Storage not available\");\n }\n \n console.log(`Removing database: ${databaseName} by user: ${username}`);\n \n const result = await this.storage.deleteFile(`${databaseName}.ts`);\n \n console.log('Storage deleteFile result:', result);\n \n if (!result.success) {\n throw new Error(result.message);\n }\n \n sendWithBackpressure({\n id: object.id,\n action: commandOrAction,\n command: commandOrAction,\n message: \"SUCCESS\",\n data: {\n success: true,\n databaseName,\n message: `Database '${databaseName}' removed successfully`\n },\n });\n } catch (err) {\n console.error(\"remove-db ERROR:\", err);\n try {\n sendWithBackpressure({\n id: object.id,\n action: commandOrAction,\n command: commandOrAction,\n message: \"ERROR\",\n data: ((err as Error) && (err as Error).message) || String(err),\n });\n } catch (e) {\n console.error(\"Failed to send error response:\", e);\n }\n }\n break;\n \n case \"rename-db\":\n console.log(\"rename-db command\", object);\n try {\n // Verify token first\n const token = object.token || (object.data && object.data.token);\n if (!token) throw new Error(\"Missing token\");\n \n // Verify token\n const decoded = jwt.verify(token, this.getEffectiveSecret()) as any;\n if (!decoded) throw new Error(\"Invalid token\");\n \n const username = decoded.username || decoded.role || 'anonymous';\n \n // Get database names\n const databaseName = object.data?.databaseName;\n const newName = object.data?.newName;\n \n if (!databaseName || typeof databaseName !== 'string') {\n throw new Error(\"Missing or invalid databaseName\");\n }\n if (!newName || typeof newName !== 'string') {\n throw new Error(\"Missing or invalid newName\");\n }\n \n // Validate new database name\n if (!/^[a-zA-Z0-9_-]+$/.test(newName)) {\n throw new Error(\"Invalid new database name. Use only alphanumeric characters, hyphens, and underscores.\");\n }\n \n // Rename database file using storage\n if (!this.storage) {\n throw new Error(\"Storage not available\");\n }\n \n console.log(`Renaming database: ${databaseName} to ${newName} by user: ${username}`);\n \n // Read old file content\n const getResult = await this.storage.getFile(`${databaseName}.ts`);\n if (!getResult.success) {\n throw new Error(getResult.message || `Database '${databaseName}' not found`);\n }\n \n // Update content with new name in comments and exports\n let content = getResult.content || '';\n content = content\n .replace(new RegExp(`// Database: ${databaseName}`, 'g'), `// Database: ${newName}`)\n .replace(new RegExp(`export const ${databaseName}`, 'g'), `export const ${newName}`);\n \n // Create new file\n const addResult = await this.storage.addFile(`${newName}.ts`, content);\n if (!addResult.success) {\n throw new Error(addResult.message);\n }\n \n // Delete old file\n const deleteResult = await this.storage.deleteFile(`${databaseName}.ts`);\n if (!deleteResult.success) {\n // Rollback: delete the new file\n await this.storage.deleteFile(`${newName}.ts`);\n throw new Error(deleteResult.message);\n }\n \n console.log('Database renamed successfully');\n \n sendWithBackpressure({\n id: object.id,\n action: commandOrAction,\n command: commandOrAction,\n message: \"SUCCESS\",\n data: {\n success: true,\n oldName: databaseName,\n newName: newName,\n message: `Database '${databaseName}' renamed to '${newName}' successfully`\n },\n });\n } catch (err) {\n console.error(\"rename-db ERROR:\", err);\n try {\n sendWithBackpressure({\n id: object.id,\n action: commandOrAction,\n command: commandOrAction,\n message: \"ERROR\",\n data: ((err as Error) && (err as Error).message) || String(err),\n });\n } catch (e) {\n console.error(\"Failed to send error response:\", e);\n }\n }\n break;\n \n case \"get-db\":\n console.log(\"get-db command\", object);\n try {\n // Verify token first\n const token = object.token || (object.data && object.data.token);\n if (!token) throw new Error(\"Missing token\");\n\n // Verify token\n const decoded = jwt.verify(token, this.getEffectiveSecret()) as any;\n if (!decoded) throw new Error(\"Invalid token\");\n\n // Get database name\n const databaseName = object.data?.databaseName;\n if (!databaseName || typeof databaseName !== 'string') {\n throw new Error(\"Missing or invalid databaseName\");\n }\n\n // Get database file content using storage\n if (!this.storage) {\n throw new Error(\"Storage not available\");\n }\n\n console.log(`Getting database: ${databaseName}`);\n\n const result = await this.storage.getFile(`${databaseName}.ts`);\n\n console.log('Storage getFile result:', result);\n\n if (!result.success) {\n throw new Error(result.message);\n }\n\n sendWithBackpressure({\n id: object.id,\n action: commandOrAction,\n command: commandOrAction,\n message: \"SUCCESS\",\n data: {\n success: true,\n databaseName,\n content: result.content || '',\n path: result.path\n },\n });\n } catch (err) {\n console.error(\"get-db ERROR:\", err);\n try {\n sendWithBackpressure({\n id: object.id,\n action: commandOrAction,\n command: commandOrAction,\n message: \"ERROR\",\n data: ((err as Error) && (err as Error).message) || String(err),\n });\n } catch (e) {\n console.error(\"Failed to send error response:\", e);\n }\n }\n break;\n\n case \"save-db\":\n case \"update-db\":\n case \"get-info\":\n console.log(`Command ${commandOrAction} not yet implemented`);\n try {\n sendWithBackpressure({\n id: object.id,\n action: commandOrAction,\n command: commandOrAction,\n message: \"ERROR\",\n data: `Command ${commandOrAction} not yet implemented in protocol server`,\n });\n } catch (e) {}\n break;\n \n default:\n console.log('Unknown command:', commandOrAction, 'object:', object);\n socket.write(\n JSON.stringify({\n command: \"error\",\n message: \"UNKNOWN_COMMAND\",\n }) + \"\\n\"\n );\n socket.end();\n return;\n }\n }\n });\n \n socket.on(\"end\", () => {\n console.log(\"Client disconnected\");\n });\n };\n\n // enforce TLS in production if required\n if (this.requireTlsInProduction && process.env.NODE_ENV === \"production\") {\n if (!(this.tlsOptions && (this.tlsOptions.key || this.tlsOptions.cert))) {\n throw new Error(\n \"TLS is required in production but tlsOptions are not configured\"\n );\n }\n }\n\n // create actual server (TLS if configured)\n let serverImpl: net.Server | tls.Server;\n if (this.tlsOptions && (this.tlsOptions.key || this.tlsOptions.cert)) {\n const tlsOpts = Object.assign({}, this.tlsOptions);\n // allow paths to key/cert\n try {\n if (typeof tlsOpts.key === \"string\" && fs.existsSync(tlsOpts.key))\n tlsOpts.key = fs.readFileSync(tlsOpts.key);\n if (typeof tlsOpts.cert === \"string\" && fs.existsSync(tlsOpts.cert))\n tlsOpts.cert = fs.readFileSync(tlsOpts.cert);\n } catch (e) {}\n serverImpl = tls.createServer(tlsOpts, createListener);\n } else {\n serverImpl = net.createServer(createListener);\n }\n\n this.server = serverImpl;\n\n this.server.listen(this.port, this.host, () => {\n // If a user is configured with username/password, include credentials in the URI for convenience.\n let cred = \"\";\n try {\n if (this.users && Array.isArray(this.users) && this.users.length > 0) {\n const u: User = this.users[0] || { username: \"\" };\n const uname = u.username || null;\n // Mask password with asterisks for security\n if (uname && typeof u.password === \"string\" && u.password) {\n cred =\n encodeURIComponent(String(uname)) +\n \":\" +\n \"*****\" +\n \"@\";\n } else if (uname) {\n cred = encodeURIComponent(String(uname)) + \"@\";\n }\n }\n } catch (e) {\n /* ignore and show no creds */\n }\n console.log(\n `Server listening on scriptdb://${cred}${this.host}:${this.port}`\n );\n // start autoscale timer\n try {\n if (!this._autoscaleTimer && this._autoscaleIntervalMs > 0) {\n this._autoscaleTimer = setInterval(() => {\n try {\n this._autoscalePools();\n } catch (e) {}\n }, this._autoscaleIntervalMs);\n }\n } catch (e) {}\n });\n \n this.server.on(\"close\", () => {\n try {\n if (this._autoscaleTimer) {\n clearInterval(this._autoscaleTimer);\n this._autoscaleTimer = null;\n }\n } catch (e) {}\n });\n }\n}\n\nexport default Protocal;","import * as fs from \"fs\";\n\nexport function getBasePath() {\n // เมื่อเรียกจากไฟล์ที่อยู่ใน root (เช่น index.js) __dirname จะเป็น project base\n return fs.realpathSync(\".\");\n // หรือถ้าต้องการแน่นอนจาก process working dir:\n // return process.cwd();\n}\n\nexport default getBasePath;","import * as os from \"os\";\nimport * as path from \"path\";\n\n/**\n * Gets the home directory path for the current user\n * @returns The absolute path to the user's home directory\n */\nexport function getHomeDir(): string {\n return os.homedir();\n}\n\n/**\n * Gets the path to a file or directory relative to the user's home directory\n * @param relativePath - The path relative to the home directory\n * @returns The absolute path to the specified location in the home directory\n */\nexport function getHomePath(relativePath: string): string {\n return path.join(getHomeDir(), relativePath);\n}\n\n/**\n * Gets the path to the user's Documents directory\n * @returns The absolute path to the Documents folder\n */\nexport function getDocumentsDir(): string {\n const platform = os.platform();\n \n if (platform === 'win32') {\n return getHomePath('Documents');\n } else if (platform === 'darwin') {\n return getHomePath('Documents');\n } else {\n // For Linux and other Unix-like systems\n const xdgDocs = process.env.XDG_DOCUMENTS_DIR;\n if (xdgDocs) {\n return xdgDocs;\n }\n return getHomePath('Documents');\n }\n}\n\n/**\n * Gets the path to the user's Downloads directory\n * @returns The absolute path to the Downloads folder\n */\nexport function getDownloadsDir(): string {\n const platform = os.platform();\n \n if (platform === 'win32') {\n return getHomePath('Downloads');\n } else if (platform === 'darwin') {\n return getHomePath('Downloads');\n } else {\n // For Linux and other Unix-like systems\n return getHomePath('Downloads');\n }\n}\n\n/**\n * Gets the path to the user's Desktop directory\n * @returns The absolute path to the Desktop folder\n */\nexport function getDesktopDir(): string {\n const platform = os.platform();\n \n if (platform === 'win32') {\n return getHomePath('Desktop');\n } else if (platform === 'darwin') {\n return getHomePath('Desktop');\n } else {\n // For Linux and other Unix-like systems\n const xdgDesktop = process.env.XDG_DESKTOP_DIR;\n if (xdgDesktop) {\n return xdgDesktop;\n }\n return getHomePath('Desktop');\n }\n}\n\n/**\n * Creates a ScriptDB directory in the user's home directory\n * @param dirName - Optional custom directory name (defaults to 'scriptdb')\n * @returns The path to the created ScriptDB directory\n */\nexport function createScriptDBDir(dirName: string = 'scriptdb'): string {\n const scriptdbPath = getHomePath(dirName);\n \n const fs = require('fs');\n if (!fs.existsSync(scriptdbPath)) {\n fs.mkdirSync(scriptdbPath, { recursive: true });\n }\n \n return scriptdbPath;\n}\n\n/**\n * Gets the default ScriptDB directory path\n * @returns The path to the ScriptDB directory in the user's home folder\n */\nexport function getScriptDBDir(): string {\n return getHomePath('scriptdb');\n}\n\n/**\n * Checks if a path exists in the user's home directory\n * @param relativePath - The path relative to the home directory to check\n * @returns True if the path exists, false otherwise\n */\nexport function homePathExists(relativePath: string): boolean {\n const fs = require('fs');\n return fs.existsSync(getHomePath(relativePath));\n}\n\nexport default {\n getHomeDir,\n getHomePath,\n getDocumentsDir,\n getDownloadsDir,\n getDesktopDir,\n createScriptDBDir,\n getScriptDBDir,\n homePathExists\n};","import { Protocal } from \"./protocal\";\nimport * as path from \"path\";\nimport * as fs from \"fs\";\nimport VM from \"@scriptdb/vm\";\nimport { Storage } from \"@scriptdb/storage\";\nimport { getHomeDir } from \"./utils/homeDir\";\nimport { setupDir } from \"./utils/setupDir\";\nimport { createWebSocketProxy } from \"./wsProxy\";\nimport SystemModuleResolver from \"@scriptdb/system-modules\";\n\n// Type definitions\ninterface User {\n username: string;\n password?: string;\n hash?: boolean;\n algorithm?: 'bcrypt' | 'sha256' | 'sha512';\n}\n\ninterface Config {\n host: string;\n port: number;\n users: User[];\n folder: string;\n secure?: boolean;\n}\n\ninterface ParsedConfig {\n host?: string;\n port?: number;\n users?: User[] | string[] | User;\n folder?: string;\n secure?: boolean;\n}\n\n// Helper to print error and exit\nfunction exitWithError(message: string, err?: Error | unknown): void {\n console.error(message);\n if (err) console.error(err);\n process.exit(1);\n}\n\nexport async function server(): Promise<void> {\n // กำหนดค่า base path สำหรับ VM\n let basePath = path.join(getHomeDir(), '.scriptdb');\n\n // Setup directory structure (จะตรวจสอบและสร้างไฟล์ที่จำเป็นถ้ายังไม่มี)\n try {\n console.log(\"Setting up scriptdb directory...\");\n await setupDir();\n console.log(\"Setup complete\");\n } catch (err) {\n exitWithError(\"Failed to setup scriptdb directory\", err);\n }\n\n console.log(\"Loading configuration...\");\n let config: Config = {\n host: \"localhost\",\n port: 1234,\n users: [\n {\n username: \"\",\n password: undefined,\n },\n ],\n folder: \"databases\",\n secure: false,\n };\n\n // Read config file if present (safely)\n const configPath: string = path.join(basePath, \"config.json\");\n if (fs.existsSync(configPath)) {\n try {\n const fileContent: string = fs.readFileSync(configPath, \"utf8\");\n const parsed: unknown = JSON.parse(fileContent);\n if (parsed && typeof parsed === \"object\") {\n const parsedConfig = parsed as ParsedConfig;\n // Only merge known top-level keys to avoid injecting unexpected values\n const allowed: Partial<Config> = {};\n if (typeof parsedConfig.host === 'string') allowed.host = parsedConfig.host;\n if (parsedConfig.port !== undefined) allowed.port = parsedConfig.port;\n if (parsedConfig.users !== undefined) {\n // Normalize users to User[] format\n if (Array.isArray(parsedConfig.users)) {\n if (parsedConfig.users.length === 0) {\n allowed.users = [];\n } else if (typeof parsedConfig.users[0] === 'string') {\n // string[] format: convert to User[] with hash=false\n allowed.users = (parsedConfig.users as string[]).map((username: string) => ({\n username,\n password: '',\n hash: false\n }));\n } else {\n // Already User[] format\n allowed.users = parsedConfig.users as User[];\n }\n } else {\n // Single User object, wrap in array\n allowed.users = [parsedConfig.users as User];\n }\n }\n if (typeof parsedConfig.folder === 'string') allowed.folder = parsedConfig.folder;\n if (typeof parsedConfig.secure === 'boolean') allowed.secure = parsedConfig.secure;\n config = { ...config, ...allowed };\n } else {\n console.warn(\"config.json parsed to a non-object, ignoring\");\n }\n } catch (err) {\n console.warn(\"Failed to read/parse config.json, using defaults:\", err);\n }\n }\n\n // Normalize and validate config values\n if (typeof config.port === \"string\") {\n const p = parseInt(config.port, 10);\n if (!Number.isNaN(p)) config.port = p;\n }\n if (!Number.isFinite(config.port)) config.port = 1234;\n // validate port range\n if (config.port < 1 || config.port > 65535) {\n console.warn('Configured port out of range, falling back to 1234');\n config.port = 1234;\n }\n // Normalize users: allow a single object, array of objects, or array of strings\n if (!Array.isArray(config.users)) {\n if (config.users && typeof config.users === \"object\") config.users = [config.users];\n else config.users = [{ username: \"\", password: undefined }];\n }\n config.users = config.users.map((u: any): User => {\n if (!u) return { username: \"\", password: undefined };\n if (typeof u === 'string') return { username: u, password: undefined };\n if (typeof u === 'object') {\n return {\n username: typeof u.username === 'string' ? u.username : \"\",\n password: typeof u.password === 'string' ? u.password : undefined,\n hash: typeof u.hash === 'boolean' ? u.hash : undefined,\n algorithm: (u.algorithm === 'bcrypt' || u.algorithm === 'sha256' || u.algorithm === 'sha512') ? u.algorithm : undefined,\n };\n }\n return { username: \"\", password: undefined };\n });\n\n // Ensure the configured folder exists and is a directory\n const baseDir: string = path.resolve(basePath, String(config.folder || \"databases\")); // โฟลเดอร์ที่อนุญาต\n const pluginDir: string = path.resolve(basePath, \"plugins\"); // โฟลเดอร์ที่อนุญาตสำหรับปลั๊กอิน\n try {\n if (!fs.existsSync(baseDir)) {\n fs.mkdirSync(baseDir, { recursive: true });\n console.log(`Created folder for databases at ${baseDir}`);\n } else if (!fs.statSync(baseDir).isDirectory()) {\n exitWithError(`Configured folder exists but is not a directory: ${baseDir}`);\n }\n } catch (err) {\n exitWithError(\"Failed to ensure database folder exists\", err);\n }\n\n // Initialize VM and server with defensive checks\n let vm: any;\n try {\n // VM constructor expects an options object with a `language` and `registerModules` properties.\n vm = new VM({ language: 'ts', registerModules: {} });\n\n // DatabaseManager and PluginManager are async, must await them\n console.log(\"Loading databases and plugins into VM...\");\n const systemModules = await SystemModuleResolver();\n // vm.register(databases);\n vm.register(systemModules);\n // vm.register(plugins);\n console.log(\"VM initialized with databases and plugins\");\n } catch (err) {\n exitWithError(\"Failed to initialize VM\", err);\n }\n\n // Initialize Storage with git at basePath (not baseDir)\n let storage: Storage | null = null;\n try {\n storage = new Storage(baseDir, basePath); // Pass basePath as gitRoot\n await storage.initialize();\n console.log(`Storage initialized at ${baseDir} (git at ${basePath})`);\n } catch (err) {\n exitWithError(\"Failed to initialize Storage\", err);\n }\n\n // Ensure storage was initialized\n if (!storage) {\n exitWithError(\"Storage was not initialized\");\n }\n\n let scriptDBServer: any;\n try {\n scriptDBServer = new Protocal({\n host: config.host,\n port: config.port,\n users: config.users,\n vm: vm,\n storage: storage,\n });\n if (typeof scriptDBServer.start !== \"function\") {\n exitWithError(\"Protocal.start is not a function\");\n }\n scriptDBServer.start();\n console.log(`ScriptDB server started on ${config.host}:${config.port}`);\n } catch (err) {\n exitWithError(\"Failed to start Protocal\", err);\n }\n\n // Start WebSocket proxy for browser clients\n try {\n const wsPort = config.port + 1;\n await createWebSocketProxy({\n wsPort,\n scriptdbHost: config.host,\n scriptdbPort: config.port,\n secure: config.secure !== undefined ? config.secure : false,\n logger: {\n debug: console.log,\n info: console.log,\n warn: console.warn,\n error: console.error,\n },\n });\n console.log(`WebSocket proxy started on port ${wsPort}`);\n } catch (err) {\n console.warn(\"Failed to start WebSocket proxy (browser support disabled)\", err);\n }\n}\n\nexport default server;","import path from \"node:path\";\nimport fs from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { getHomeDir } from \"./homeDir\";\nimport Storage from \"@scriptdb/storage\";\n\nconst pkgData: string = `{\n \"name\": \"scriptdb-workspace\",\n \"version\": \"1.1.2\",\n \"description\": \"ScriptDB workspace for custom scripts, services, and databases\",\n \"private\": true,\n \"devDependencies\": {\n \"@types/bun\": \"^1.3.2\",\n \"@types/node\": \"^20.0.0\",\n \"@typescript-eslint/eslint-plugin\": \"^6.0.0\",\n \"@typescript-eslint/parser\": \"^6.0.0\",\n \"bun-types\": \"latest\",\n \"eslint\": \"^8.0.0\",\n \"typescript\": \"^5.0.0\"\n },\n \"dependencies\": {\n \"lodash\": \"^4.17.21\"\n }\n}\n`;\nconst tsconfigData: string = `\n{\n \"compilerOptions\": {\n \"target\": \"ES2020\",\n \"lib\": [\"ES2020\", \"DOM\"],\n \"module\": \"ESNext\",\n \"moduleResolution\": \"node\",\n \"allowSyntheticDefaultImports\": true,\n \"esModuleInterop\": true,\n \"allowJs\": true,\n \"strict\": true,\n \"noEmit\": false,\n \"declaration\": true,\n \"declarationMap\": true,\n \"sourceMap\": true,\n \"removeComments\": false,\n \"skipLibCheck\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"resolveJsonModule\": true,\n \"isolatedModules\": true,\n \"incremental\": true,\n \"composite\": true,\n \"types\": [\"node\"]\n }\n}\n`;\n\nconst dotGitignoreData: string = `\n# Ignore all files in this directory\nnode_modules/\nbin/\n`;\n\nconst ecosystemData: string = `\nmodule.exports = {\n apps: [{\n name: 'scriptdb',\n script: process.platform === 'win32'\n ? require('path').join(require('os').homedir(), '.scriptdb', 'bin', 'scriptdb.exe')\n : 'scriptdb',\n args: 'start --force',\n cwd: require('path').join(require('os').homedir(), '.scriptdb'),\n instances: 1,\n autorestart: true,\n watch: false,\n max_memory_restart: '1G',\n env: {\n NODE_ENV: 'production'\n },\n error_file: require('path').join(require('os').homedir(), '.scriptdb', 'pm2-error.log'),\n out_file: require('path').join(require('os').homedir(), '.scriptdb', 'pm2-out.log'),\n log_file: require('path').join(require('os').homedir(), '.scriptdb', 'pm2-combined.log'),\n time: true,\n log_date_format: 'YYYY-MM-DD HH:mm:ss Z',\n merge_logs: true\n }]\n};\n`;\n\nconst configDefault = {\n PORT: 3800,\n HOST: \"127.0.0.1\",\n secure: false,\n jwtSecret: \"scriptdb_secret_key\",\n maxConnections: 100,\n logLevel: \"info\",\n DB_USERNAME: \"admin\",\n DB_PASSWORD: \"password\",\n GITHUB_USERNAME: \"\",\n GITHUB_EMAIL: \"\",\n GITHUB_URL: \"\",\n GITHUB_TOKEN: \"\",\n GITHUB_BRANCH: \"main\",\n enableIpLockout: true,\n ipFailWindowMs: 900000,\n maxLoginAttempts: 5,\n lockDurationMs: 900000,\n users: [\n {\n username: \"admin\",\n password: \"password\",\n hash: false,\n algorithm: \"bcrypt\"\n }\n ]\n};\n\nfunction isGitUrl(url: string) {\n const regex = /^(git@[\\w.-]+:[\\w./-]+\\.git|https?:\\/\\/[\\w.-]+\\/[\\w./-]+\\.git)$/;\n return regex.test(url);\n}\n\nfunction injectGitToken(url: string, token: string) {\n const newUrl = url.replace(\n \"https://\",\n `https://${token}@`\n );\n return newUrl;\n}\n\nfunction installPackage(scriptdbDir?: string): Promise<void> {\n return new Promise((resolve, reject) => {\n console.log(\"Installing plugins in:\", scriptdbDir);\n\n const proc = spawn(\"bun\", [\"i\"], {\n cwd: scriptdbDir,\n stdio: \"inherit\",\n shell: true\n });\n\n proc.on(\"close\", (code) => {\n if (code === 0) {\n console.log(\"bun i finished successfully\");\n resolve();\n } else {\n console.error(\"bun i failed with code:\", code);\n reject(new Error(`bun install failed with code ${code}`));\n }\n });\n\n proc.on(\"error\", (err) => {\n console.error(\"Failed to spawn bun install:\", err);\n reject(err);\n });\n });\n}\n\nasync function setupStorage(scriptdbDir: string) {\n try {\n console.log(\"Initializing storage...\");\n const storage = new Storage(scriptdbDir)\n\n const configStr = fs.readFileSync(path.join(scriptdbDir, \"config.json\"), \"utf8\");\n const config = JSON.parse(configStr);\n\n await storage.initialize(scriptdbDir)\n console.log(\"Storage initialized\");\n\n // Only set git config if username and email are provided\n if (config.GITHUB_USERNAME && config.GITHUB_EMAIL) {\n const gitConfig = {\n userName: config.GITHUB_USERNAME,\n userEmail: config.GITHUB_EMAIL\n }\n await storage.setConfig(gitConfig);\n console.log(\"Git config set\");\n } else {\n console.log(\"Git config not set (configure later with 'scriptdb config')\");\n }\n\n // Only setup remote if URL is provided and valid\n if (config.GITHUB_URL && isGitUrl(config.GITHUB_URL)) {\n const remoteUrl = injectGitToken(config.GITHUB_URL, config.GITHUB_TOKEN);\n await storage.addRemote(\"origin\", config.GITHUB_TOKEN ? remoteUrl : config.GITHUB_URL);\n await storage.pull(\"origin\", config.GITHUB_BRANCH || \"main\");\n console.log(\"Remote repository configured\");\n } else {\n console.log(\"Remote repository not configured (configure later with 'scriptdb config')\");\n }\n\n console.log(\"Storage setup complete\");\n } catch (err) {\n console.warn(\"Storage setup failed (non-critical):\", err);\n }\n}\n\nexport async function setupDir() {\n const scriptdbDir = path.join(getHomeDir(), \".scriptdb\");\n const databasesDir = path.join(scriptdbDir, \"databases\");\n const servicesDir = path.join(scriptdbDir, \"services\");\n const clientsDir = path.join(scriptdbDir, \"clients\");\n const binDir = path.join(scriptdbDir, \"bin\");\n const configFile = path.join(scriptdbDir, \"config.json\");\n const gitignoreFile = path.join(scriptdbDir, \".gitignore\");\n const packageJsonFile = path.join(scriptdbDir, \"package.json\");\n const tsconfigFile = path.join(scriptdbDir, \"tsconfig.json\");\n const ecosystemFile = path.join(scriptdbDir, \"ecosystem.config.js\");\n\n // Check if all required files and directories exist\n const isFullySetup = fs.existsSync(scriptdbDir) &&\n fs.existsSync(databasesDir) &&\n fs.existsSync(servicesDir) &&\n fs.existsSync(clientsDir) &&\n fs.existsSync(binDir) &&\n fs.existsSync(configFile) &&\n fs.existsSync(gitignoreFile) &&\n fs.existsSync(packageJsonFile) &&\n fs.existsSync(tsconfigFile) &&\n fs.existsSync(ecosystemFile);\n\n if (isFullySetup) {\n console.log(\"ScriptDB directory already fully configured:\", scriptdbDir);\n return;\n }\n\n console.log(\"Setting up scriptdb directory...\");\n\n if (!fs.existsSync(scriptdbDir)) {\n fs.mkdirSync(scriptdbDir, { recursive: true });\n fs.mkdirSync(databasesDir, { recursive: true });\n fs.mkdirSync(servicesDir, { recursive: true });\n fs.mkdirSync(clientsDir, { recursive: true });\n fs.mkdirSync(binDir, { recursive: true });\n fs.writeFileSync(configFile, JSON.stringify(configDefault, null, 2), \"utf8\");\n fs.writeFileSync(gitignoreFile, dotGitignoreData, \"utf8\");\n fs.writeFileSync(packageJsonFile, pkgData, \"utf8\");\n fs.writeFileSync(tsconfigFile, tsconfigData, \"utf8\");\n fs.writeFileSync(ecosystemFile, ecosystemData, \"utf8\");\n console.log(\"Created:\", scriptdbDir);\n await installPackage(scriptdbDir);\n await setupStorage(scriptdbDir);\n } else {\n // Ensure all required directories exist\n if (!fs.existsSync(databasesDir)) {\n fs.mkdirSync(databasesDir, { recursive: true });\n }\n\n if (!fs.existsSync(servicesDir)) {\n fs.mkdirSync(servicesDir, { recursive: true });\n }\n\n if (!fs.existsSync(clientsDir)) {\n fs.mkdirSync(clientsDir, { recursive: true });\n }\n\n if (!fs.existsSync(binDir)) {\n fs.mkdirSync(binDir, { recursive: true });\n }\n\n // Ensure all required files exist\n if (!fs.existsSync(configFile)) {\n fs.writeFileSync(configFile, JSON.stringify(configDefault, null, 2), \"utf8\");\n }\n\n if (!fs.existsSync(gitignoreFile)) {\n fs.writeFileSync(gitignoreFile, dotGitignoreData, \"utf8\");\n }\n\n if (!fs.existsSync(packageJsonFile)) {\n fs.writeFileSync(packageJsonFile, pkgData, \"utf8\");\n }\n\n if (!fs.existsSync(tsconfigFile)) {\n fs.writeFileSync(tsconfigFile, tsconfigData, \"utf8\");\n }\n\n if (!fs.existsSync(ecosystemFile)) {\n fs.writeFileSync(ecosystemFile, ecosystemData, \"utf8\");\n }\n\n // Check if node_modules exists, if not run install\n if (!fs.existsSync(path.join(scriptdbDir, \"node_modules\"))) {\n await installPackage(scriptdbDir);\n }\n\n console.log(\"Setup complete\");\n await setupStorage(scriptdbDir);\n }\n}","/**\n * WebSocket Proxy Server\n *\n * This proxy receives WebSocket connections from browsers and forwards\n * the messages to the ScriptDB TCP/TLS server using @scriptdb/client.\n * This allows browsers to use the full @scriptdb/client functionality.\n */\n\nimport { WebSocketServer, WebSocket } from 'ws';\nimport ScriptDBClient from '../../client/src/index';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\n\nconst execPromise = promisify(exec);\n\ninterface ProxyOptions {\n wsPort: number;\n scriptdbHost: string;\n scriptdbPort: number;\n secure?: boolean;\n logger?: {\n debug?: (...args: any[]) => void;\n info?: (...args: any[]) => void;\n warn?: (...args: any[]) => void;\n error?: (...args: any[]) => void;\n };\n}\n\ninterface ClientSession {\n ws: WebSocket;\n client: ScriptDBClient | null;\n authenticated: boolean;\n}\n\nconst noopLogger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n};\n\nexport class WebSocketProxy {\n private wss: WebSocketServer | null = null;\n private options: ProxyOptions;\n private logger: any;\n private sessions: Map<WebSocket, ClientSession> = new Map();\n\n constructor(options: ProxyOptions) {\n this.options = options;\n this.logger = options.logger || noopLogger;\n }\n\n /**\n * Start the WebSocket proxy server\n */\n start(): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n this.wss = new WebSocketServer({ port: this.options.wsPort });\n\n this.wss.on('listening', () => {\n this.logger.info?.(`WebSocket proxy listening on port ${this.options.wsPort}`);\n resolve();\n });\n\n this.wss.on('error', (error) => {\n this.logger.error?.('WebSocket server error:', error);\n reject(error);\n });\n\n this.wss.on('connection', (ws) => {\n this.handleConnection(ws);\n });\n\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Handle new WebSocket connection\n */\n private handleConnection(ws: WebSocket) {\n this.logger.info?.('New WebSocket connection');\n\n const session: ClientSession = {\n ws,\n client: null,\n authenticated: false,\n };\n\n this.sessions.set(ws, session);\n\n ws.on('message', async (data) => {\n await this.handleMessage(session, data);\n });\n\n ws.on('close', () => {\n this.handleClose(session);\n });\n\n ws.on('error', (error) => {\n this.logger.error?.('WebSocket error:', error);\n this.handleClose(session);\n });\n }\n\n /**\n * Handle incoming message from browser\n */\n private async handleMessage(session: ClientSession, data: any) {\n try {\n const message = JSON.parse(data.toString());\n const { id, action, data: payload } = message;\n\n // Handle login specially to create ScriptDB client connection\n if (action === 'login') {\n await this.handleLogin(session, id, payload);\n return;\n }\n\n // Check if authenticated\n if (!session.authenticated || !session.client) {\n this.sendError(session.ws, id, 'Not authenticated');\n return;\n }\n\n // Forward other actions to ScriptDB client\n await this.forwardAction(session, id, action, payload);\n\n } catch (error: any) {\n this.logger.error?.('Error handling message:', error);\n this.sendError(session.ws, undefined, error.message);\n }\n }\n\n /**\n * Handle login action\n */\n private async handleLogin(session: ClientSession, id: number, payload: any) {\n try {\n const { username, password, secure: clientSecure } = payload;\n \n // Get server secure mode from options (already loaded from config)\n const serverSecure = this.options.secure !== undefined ? this.options.secure : false;\n \n console.log('Login validation:', { clientSecure, serverSecure, username: username || '(empty)' });\n \n // Validate client secure mode matches server config\n if (clientSecure !== undefined && clientSecure !== serverSecure) {\n const errorMsg = serverSecure \n ? 'Server is in secure mode (secure: true). Please uncheck \"Anonymous Connection\" and provide credentials.'\n : 'Server is in non-secure mode (secure: false). Please check \"Anonymous Connection\".';\n this.logger.warn?.('Secure mode mismatch:', { clientSecure, serverSecure });\n throw new Error(errorMsg);\n }\n\n // Create ScriptDB client URI\n let uri: string;\n if (username && username !== '') {\n // With credentials\n uri = `scriptdb://${username}:${password || ''}@${this.options.scriptdbHost}:${this.options.scriptdbPort}`;\n } else {\n // Without credentials (anonymous)\n uri = `scriptdb://${this.options.scriptdbHost}:${this.options.scriptdbPort}`;\n }\n \n this.logger.info?.('Creating ScriptDB client with URI:', uri.replace(/:[^:@]+@/, ':****@'));\n \n const client = new ScriptDBClient(uri, {\n secure: false, // Always use plain TCP (secure option controls authentication, not transport)\n logger: this.logger,\n requestTimeout: 0, // Disable timeout - let browser handle it\n retries: 0, // No retries in proxy\n });\n\n // Connect and authenticate\n console.log('Connecting to ScriptDB server...');\n this.logger.info?.('Connecting to ScriptDB server...');\n \n const connectStartTime = Date.now();\n \n // Wrap client.connect() to suppress error logging from internal rejections\n await client.connect().catch((err) => {\n // Re-throw to be caught by outer try-catch\n throw err;\n });\n \n const connectDuration = Date.now() - connectStartTime;\n \n console.log(`ScriptDB client connected and authenticated in ${connectDuration}ms`);\n this.logger.info?.('ScriptDB client connected and authenticated');\n\n // Store client in session\n session.client = client;\n session.authenticated = true;\n\n // Send success response to browser\n console.log('Sending AUTH OK to browser with id:', id);\n this.logger.info?.('Sending AUTH OK to browser');\n this.sendResponse(session.ws, id, 'login', 'AUTH OK', { token: 'proxy-session' });\n console.log('AUTH OK sent to browser');\n\n } catch (error: any) {\n this.logger.error?.('Login failed:', error);\n this.sendResponse(session.ws, id, 'login', 'AUTH FAILED', error.message);\n \n // Cleanup client if it was created\n if (session.client) {\n try {\n session.client.destroy();\n } catch (e) {}\n session.client = null;\n }\n \n // Remove session from map\n this.sessions.delete(session.ws);\n \n // Close WebSocket connection\n session.ws.close();\n }\n }\n\n /**\n * Forward action to ScriptDB client\n */\n private async forwardAction(session: ClientSession, id: number, action: string, payload: any) {\n try {\n console.log('Forwarding action:', action, 'payload:', payload);\n const client = session.client!;\n let result: any;\n\n switch (action) {\n case 'logout':\n console.log('Executing logout');\n result = await client.execute({ action: 'logout' });\n session.authenticated = false;\n session.client = null;\n break;\n\n case 'list-dbs':\n console.log('Executing list-dbs');\n result = await client.execute({ action: 'list-dbs' });\n console.log('list-dbs result:', result);\n break;\n\n case 'create-db':\n result = await client.execute({ \n action: 'create-db', \n data: { databaseName: payload.databaseName } \n });\n break;\n\n case 'remove-db':\n result = await client.execute({ \n action: 'remove-db', \n data: { databaseName: payload.databaseName } \n });\n break;\n\n case 'rename-db':\n result = await client.execute({ \n action: 'rename-db', \n data: { \n databaseName: payload.databaseName, \n newName: payload.newName \n } \n });\n break;\n\n case 'script-code':\n console.log('wsProxy: executing script-code');\n result = await client.execute({ \n action: 'script-code', \n data: { \n code: payload.code, \n databaseName: payload.databaseName \n } \n });\n console.log('wsProxy: script-code result:', result);\n break;\n\n case 'save-db':\n result = await client.execute({ \n action: 'save-db', \n data: { databaseName: payload.databaseName } \n });\n break;\n\n case 'update-db':\n result = await client.execute({ \n action: 'update-db', \n data: payload \n });\n break;\n\n case 'get-info':\n result = await client.execute({ action: 'get-info' });\n break;\n\n case 'get-db':\n result = await client.execute({\n action: 'get-db',\n data: { databaseName: payload.databaseName }\n });\n break;\n\n case 'shell-command':\n // Execute shell command on server\n result = await this.executeShellCommand(payload.command);\n break;\n\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n\n // Send response back to browser\n this.sendResponse(session.ws, id, action, 'OK', result);\n\n } catch (error: any) {\n this.logger.error?.(`Error executing ${action}:`, error);\n this.sendResponse(session.ws, id, action, 'ERROR', error.message);\n }\n }\n\n /**\n * Send response to browser\n */\n private sendResponse(ws: WebSocket, id: number | undefined, action: string, message: string, data?: any) {\n if (!ws || ws.readyState !== WebSocket.OPEN) {\n console.error('Cannot send response - WebSocket not ready:', { \n exists: !!ws, \n readyState: ws?.readyState,\n expectedState: WebSocket.OPEN \n });\n this.logger.error?.('Cannot send response: WebSocket not ready');\n return;\n }\n\n const response = {\n id,\n action,\n message,\n data,\n };\n\n console.log('Sending response to browser:', response);\n this.logger.info?.('Sending response to browser:', { id, action, message });\n \n try {\n ws.send(JSON.stringify(response));\n console.log('Response sent successfully via ws.send()');\n this.logger.info?.('Response sent successfully');\n } catch (error) {\n console.error('Failed to send response:', error);\n this.logger.error?.('Failed to send response:', error);\n }\n }\n\n /**\n * Send error to browser\n */\n private sendError(ws: WebSocket, id: number | undefined, error: string) {\n this.sendResponse(ws, id, 'error', 'ERROR', error);\n }\n\n /**\n * Execute shell command\n */\n private async executeShellCommand(command: string): Promise<{ stdout: string; stderr: string }> {\n try {\n this.logger.info?.(`Executing shell command: ${command}`);\n\n // Security: limit command length\n if (command.length > 1000) {\n throw new Error('Command too long');\n }\n\n const { stdout, stderr } = await execPromise(command, {\n timeout: 30000, // 30 second timeout\n maxBuffer: 1024 * 1024, // 1MB buffer\n cwd: process.cwd()\n });\n\n return {\n stdout: stdout || '',\n stderr: stderr || ''\n };\n } catch (error: any) {\n this.logger.error?.('Shell command failed:', error);\n return {\n stdout: '',\n stderr: error.message || String(error)\n };\n }\n }\n\n /**\n * Handle connection close\n */\n private handleClose(session: ClientSession) {\n this.logger.info?.('WebSocket connection closed');\n\n if (session.client) {\n try {\n session.client.destroy();\n } catch (error) {\n this.logger.error?.('Error destroying client:', error);\n }\n session.client = null;\n }\n\n this.sessions.delete(session.ws);\n }\n\n /**\n * Stop the WebSocket proxy server\n */\n async stop(): Promise<void> {\n return new Promise((resolve) => {\n // Close all sessions\n this.sessions.forEach((session) => {\n if (session.client) {\n try {\n session.client.destroy();\n } catch (error) {\n this.logger.error?.('Error destroying client:', error);\n }\n }\n session.ws.close();\n });\n\n this.sessions.clear();\n\n if (this.wss) {\n this.wss.close(() => {\n this.logger.info?.('WebSocket proxy stopped');\n resolve();\n });\n } else {\n resolve();\n }\n });\n }\n}\n\n/**\n * Create and start a WebSocket proxy server\n */\nexport async function createWebSocketProxy(options: ProxyOptions): Promise<WebSocketProxy> {\n const proxy = new WebSocketProxy(options);\n await proxy.start();\n return proxy;\n}\n\nexport default createWebSocketProxy;\n","import * as net from \"net\";\nimport * as tls from \"tls\";\nimport { URL } from \"url\";\nimport * as crypto from \"crypto\";\n\ntype Action = 'script-code' | 'save-db' | 'remove-db' | 'rename-db' | 'login' | 'logout' | 'get-info' | 'list-dbs' | 'create-db' | 'update-db' | 'get-db' | 'shell-command' | 'string';\n\ninterface DataOptions {\n code?: string | any;\n databaseName?: string | any;\n token?: string | any;\n username?: string | any;\n password?: string | any;\n newName?: string | any;\n}\n\ninterface PayloadOptions {\n id?: number;\n action?: Action;\n data?: DataOptions;\n}\n// Type definitions\ninterface Logger {\n debug?: (...args: any[]) => void;\n info?: (...args: any[]) => void;\n warn?: (...args: any[]) => void;\n error?: (...args: any[]) => void;\n}\n\ninterface ClientOptions {\n secure?: boolean;\n logger?: Logger;\n requestTimeout?: number;\n socketTimeout?: number;\n retries?: number;\n retryDelay?: number;\n tlsOptions?: tls.TlsOptions;\n frame?: 'ndjson' | 'length-prefix';\n preferLengthPrefix?: boolean;\n maxPending?: number;\n maxQueue?: number;\n maxMessageSize?: number;\n signing?: {\n secret: string;\n algorithm?: string;\n };\n stringify?: (obj: any) => string;\n username?: string;\n password?: string;\n tokenRefresh?: () => Promise<{ token: string; expiresAt?: number }>;\n}\n\ninterface PendingRequest {\n resolve: (value: any) => void;\n reject: (error: Error) => void;\n timer: NodeJS.Timeout | null;\n}\n\ninterface QueuedRequest extends PendingRequest {\n payloadBase: PayloadOptions;\n id: number;\n}\n\ninterface Message {\n id?: number;\n action?: Action;\n command?: string;\n message?: string;\n data?: DataOptions;\n token?: string;\n signature?: string;\n payload?: any;\n}\n\n// Minimal no-op logger\nconst noopLogger = {\n debug: () => { },\n info: () => { },\n warn: () => { },\n error: () => { },\n};\n\nexport class ScriptDBClient {\n // Properties\n private options: ClientOptions;\n private socketTimeout: number = 0;\n private maxMessageSize: number = 0;\n private _mask: (obj: any) => any = () => { };\n private _maskArgs: (args: any[]) => any[] = () => [];\n private logger?: Logger = {};\n private secure: boolean = true;\n private requestTimeout: number = 0;\n private retries: number = 0;\n private retryDelay: number = 0;\n private frame: 'ndjson' | 'length-prefix' = 'ndjson';\n private uri: string = '';\n private protocolName: string = '';\n private username: string | null = null;\n private password: string | null = null;\n private host: string = '';\n private port: number = 0;\n private database: string | null = null;\n private client: net.Socket | tls.TLSSocket | null = null;\n private buffer: Buffer = Buffer.alloc(0);\n private _nextId: number = 1;\n private _pending: Map<number, PendingRequest> = new Map();\n private _maxPending: number = 0;\n private _maxQueue: number = 0;\n private _pendingQueue: QueuedRequest[] = [];\n private _connected: boolean = false;\n private _authenticating: boolean = false;\n private token: string | null = null;\n private _currentRetries: number = 0;\n private tokenExpiry: number | null = null;\n private _destroyed: boolean = false;\n private _reconnectTimer: NodeJS.Timeout | null = null;\n private signing: { secret: string; algorithm?: string } | null = null;\n private _stringify: (obj: any) => string = JSON.stringify;\n private ready: Promise<any> = Promise.resolve();\n private _resolveReadyFn: ((value: any) => void) | null = null;\n private _rejectReadyFn: ((err: Error) => void) | null = null;\n private _connecting: Promise<any> | null = null;\n private _authPendingId: number | null = null;\n\n /**\n * Create a new client. Do NOT auto-connect in constructor — call connect()\n * @param uri - Connection URI\n * @param options - Client options\n * @param options.secure - use TLS\n * @param options.logger - { debug, info, warn, error }\n * @param options.requestTimeout - Request timeout in ms\n * @param options.retries - Reconnection retries\n * @param options.retryDelay - Initial retry delay in ms\n * @param options.tlsOptions - Passed to tls.connect when secure\n */\n constructor(uri: string, options: ClientOptions = {}) {\n if (!uri || typeof uri !== \"string\") throw new Error(\"uri required\");\n this.options = Object.assign({}, options);\n // sensible default socket timeout (ms). 0 = disabled (no socket timeout)\n this.socketTimeout = Number.isFinite(this.options.socketTimeout)\n ? this.options.socketTimeout!\n : 0;\n // sensible default max message size (bytes)\n this.maxMessageSize = Number.isFinite(this.options.maxMessageSize)\n ? this.options.maxMessageSize!\n : 5 * 1024 * 1024; // 5MB\n\n // masking helper (used to hide tokens/passwords from logs)\n this._mask = (obj) => {\n try {\n if (!obj || typeof obj !== \"object\") return obj;\n const copy = Array.isArray(obj) ? obj.slice() : Object.assign({}, obj);\n if (copy.token) copy.token = \"****\";\n if (copy.password) copy.password = \"****\";\n if (copy.data && copy.data.password) copy.data.password = \"****\";\n return copy;\n } catch (e) {\n return obj;\n }\n };\n\n // helper to mask any arguments passed to logger methods\n const rawLogger =\n this.options.logger && typeof this.options.logger === \"object\"\n ? this.options.logger\n : noopLogger;\n this._maskArgs = (args) => {\n return args.map((a) => {\n if (!a) return a;\n if (typeof a === \"string\") return a;\n return this._mask(a);\n });\n };\n\n // wrapper logger that masks sensitive fields in objects before delegating\n this.logger = {\n debug: (...args) =>\n rawLogger.debug && rawLogger.debug(...this._maskArgs(args)),\n info: (...args) =>\n rawLogger.info && rawLogger.info(...this._maskArgs(args)),\n warn: (...args) =>\n rawLogger.warn && rawLogger.warn(...this._maskArgs(args)),\n error: (...args) =>\n rawLogger.error && rawLogger.error(...this._maskArgs(args)),\n };\n // secure by default; warn if user explicitly disables secure\n this.secure =\n typeof this.options.secure === \"boolean\" ? !!this.options.secure : true;\n if (!this.secure)\n this.logger.warn?.(\n \"Warning: connecting in insecure mode (secure=false). This is not recommended.\"\n );\n // By default do not set a per-request timeout (0 = disabled).\n this.requestTimeout = Number.isFinite(this.options.requestTimeout)\n ? this.options.requestTimeout!\n : 0;\n this.retries = Number.isFinite(this.options.retries)\n ? this.options.retries!\n : 3;\n this.retryDelay = Number.isFinite(this.options.retryDelay)\n ? this.options.retryDelay!\n : 1000;\n // framing: 'ndjson' (default) or 'length-prefix'. If the caller prefers higher throughput\n // they can set options.preferLengthPrefix = true or options.frame = 'length-prefix'.\n this.frame =\n this.options.frame === \"length-prefix\" || this.options.preferLengthPrefix\n ? \"length-prefix\"\n : \"ndjson\";\n\n // Validate and parse URI - only accept scriptdb:// protocol\n let parsed;\n try {\n parsed = new URL(uri);\n } catch (e) {\n throw new Error(\"Invalid uri\");\n }\n\n // Validate protocol\n if (parsed.protocol !== \"scriptdb:\") {\n throw new Error(\"URI must use scriptdb:// protocol\");\n }\n\n this.uri = uri;\n this.protocolName = parsed.protocol\n ? parsed.protocol.replace(\":\", \"\")\n : \"scriptdb\";\n // prefer explicit credentials passed in options over credentials embedded in the URI\n this.username =\n (typeof this.options.username === \"string\"\n ? this.options.username\n : parsed.username) || null;\n this.password =\n (typeof this.options.password === \"string\"\n ? this.options.password\n : parsed.password) || null;\n if (parsed.username && !(typeof this.options.username === \"string\")) {\n this.logger.warn?.(\n \"Credentials found in URI — consider passing credentials via options instead of embedding in URI\"\n );\n }\n // do not keep credentials in the stored URI representation\n try {\n parsed.username = \"\";\n parsed.password = \"\";\n this.uri = parsed.toString();\n } catch (e) {\n // fallback to original uri\n this.uri = uri;\n }\n this.host = parsed.hostname || \"localhost\";\n this.port = parsed.port ? parseInt(parsed.port, 10) : 1234;\n this.database =\n parsed.pathname && parsed.pathname.length > 1\n ? parsed.pathname.slice(1)\n : null;\n\n // internal state\n this.client = null;\n this.buffer = Buffer.alloc(0);\n this._nextId = 1; // request id generator\n this._pending = new Map(); // id -> {resolve,reject,timer}\n this._maxPending = Number.isFinite(this.options.maxPending)\n ? this.options.maxPending!\n : 100;\n this._maxQueue = Number.isFinite(this.options.maxQueue)\n ? this.options.maxQueue!\n : 1000;\n this._pendingQueue = []; // queued requests when pending >= max\n this._connected = false;\n this._authenticating = false;\n this.token = null;\n this._currentRetries = 0;\n this.tokenExpiry = null; // ms timestamp when token expires\n this._destroyed = false;\n this._reconnectTimer = null;\n\n // signing options: { secret: '...', algorithm: 'sha256' }\n this.signing =\n this.options.signing && this.options.signing.secret\n ? this.options.signing\n : null;\n\n // fast stringify support: allow user to pass a custom stringify function (e.g. fast-json-stringify)\n this._stringify =\n typeof this.options.stringify === \"function\"\n ? this.options.stringify\n : JSON.stringify;\n\n // ready promise lifecycle managed by helpers to avoid race conditions\n this._createReady();\n }\n\n _createReady() {\n this.ready = new Promise((resolve, reject) => {\n this._resolveReadyFn = resolve;\n this._rejectReadyFn = reject;\n });\n }\n\n _resolveReady(value: any) {\n if (this._resolveReadyFn) {\n try {\n this._resolveReadyFn(value);\n } catch (e) { }\n this._resolveReadyFn = null;\n this._rejectReadyFn = null;\n }\n }\n\n _rejectReady(err: Error) {\n if (this._rejectReadyFn) {\n // Use process.nextTick to defer the rejection, preventing unhandled errors\n // when called from event handlers\n const rejectFn = this._rejectReadyFn;\n this._resolveReadyFn = null;\n this._rejectReadyFn = null;\n\n process.nextTick(() => {\n try {\n rejectFn(err);\n } catch (e) {\n // Silently ignore - promise already rejected\n }\n });\n }\n }\n\n /**\n * Check if connected\n */\n get connected(): boolean {\n return this._connected;\n }\n\n /**\n * Connect to server and authenticate. Returns a Promise that resolves when authenticated.\n */\n connect() {\n // avoid double connect\n if (this._connecting) return this._connecting;\n\n this._connecting = new Promise((resolve, reject) => {\n const opts = { host: this.host, port: this.port };\n const onConnect = () => {\n console.log(\"ScriptDBClient: Connected to server at\", opts.host, opts.port);\n this.logger?.info?.(\"Connected to server\");\n this._connected = true;\n this._currentRetries = 0;\n console.log(\"ScriptDBClient: Setting up listeners...\");\n this._setupListeners();\n console.log(\"ScriptDBClient: Authenticating...\");\n this.authenticate()\n .then(() => {\n // reset pending queue processing after auth\n this._processQueue();\n resolve(this);\n })\n .catch((err) => {\n reject(err);\n });\n };\n\n try {\n if (this.secure) {\n // Create a separate object for host and port to avoid type conflicts\n const connectionOpts = { host: opts.host, port: opts.port };\n const tlsOptions: any = Object.assign(\n {},\n this.options.tlsOptions || {},\n connectionOpts\n );\n // safe default\n if (typeof tlsOptions.rejectUnauthorized === \"undefined\")\n tlsOptions.rejectUnauthorized = true;\n this.client = tls.connect(tlsOptions as tls.ConnectionOptions, onConnect);\n } else {\n this.client = net.createConnection(opts, onConnect);\n }\n } catch (e) {\n const error = e as Error;\n this.logger?.error?.(\"Connection failed\", error.message);\n // reject ready if present and clear handlers\n this._rejectReady(error);\n // make sure ready is recreated on next attempt\n this._createReady();\n // allow future connect attempts\n this._connecting = null;\n return reject(error);\n }\n\n // Guard against client not being set (shouldn't happen, but TypeScript needs it)\n if (!this.client) {\n const error = new Error(\"Failed to create client socket\");\n this.logger?.error?.(\"Connection failed\", error.message);\n this._connecting = null;\n return reject(error);\n }\n\n // attach top-level handlers for errors/close to trigger reconnect logic\n const onError = (err: Error) => {\n this.logger?.error?.(\n \"Client socket error:\",\n err && err.message ? err.message : err\n );\n this._handleDisconnect(err);\n };\n const onClose = (hadError: boolean) => {\n this.logger?.info?.(\"Server closed connection\");\n // Don't pass error to avoid double error throwing\n this._handleDisconnect(null);\n };\n this.client.on(\"error\", onError);\n this.client.on(\"close\", onClose);\n // socket timeouts\n if (this.socketTimeout > 0 && this.client) {\n this.client.setTimeout(this.socketTimeout);\n this.client.on(\"timeout\", () => {\n this.logger?.warn?.(\"Socket timeout, destroying connection\");\n try {\n this.client?.destroy();\n } catch (e) { }\n });\n }\n }).catch((err) => {\n // Ensure errors are properly propagated without additional throwing\n this._connecting = null;\n throw err;\n });\n\n return this._connecting;\n }\n\n _setupListeners() {\n if (!this.client) return;\n console.log(\"ScriptDBClient _setupListeners: called, client exists:\", !!this.client);\n // clear any previous data listeners and reset buffer\n this.client.removeAllListeners(\"data\");\n this.buffer = Buffer.alloc(0);\n\n console.log(\"ScriptDBClient _setupListeners: frame mode:\", this.frame);\n\n // Parser depends on framing\n if (this.frame === \"length-prefix\") {\n // length-prefixed framing: [uint32BE length][payload]\n this.client.on(\"data\", (chunk) => {\n if (!Buffer.isBuffer(chunk)) {\n try {\n chunk = Buffer.from(chunk);\n } catch (e) {\n return;\n }\n }\n // fast path: append and scan (we keep concat here for simplicity)\n this.buffer = Buffer.concat([this.buffer, chunk]);\n while (this.buffer.length >= 4) {\n const len = this.buffer.readUInt32BE(0);\n // enforce max message/frame size\n if (len > this.maxMessageSize) {\n this.logger?.error?.(\n \"Incoming length-prefixed frame exceeds maxMessageSize — closing connection\"\n );\n try {\n this.client?.destroy();\n } catch (e) { }\n return;\n }\n if (this.buffer.length < 4 + len) break;\n const payload = this.buffer.slice(4, 4 + len);\n this.buffer = this.buffer.slice(4 + len);\n let msg;\n try {\n msg = JSON.parse(payload.toString(\"utf8\"));\n } catch (e) {\n this.logger?.error?.(\n \"Invalid JSON frame\",\n e && (e as Error).message ? (e as Error).message : e\n );\n continue;\n }\n // validate schema\n if (!msg || typeof msg !== \"object\") continue;\n const validSchema =\n (typeof msg.id === \"undefined\" || typeof msg.id === \"number\") &&\n (typeof msg.action === \"string\" ||\n typeof msg.action === \"undefined\") &&\n (typeof msg.command === \"string\" ||\n typeof msg.command === \"undefined\") &&\n (typeof msg.message === \"string\" ||\n typeof msg.message === \"undefined\") &&\n (typeof msg.data === \"object\" ||\n typeof msg.data === \"undefined\" ||\n msg.data === null);\n if (!validSchema) {\n this.logger?.warn?.(\"Message failed schema validation — ignoring\");\n continue;\n }\n this._handleMessage(msg);\n }\n });\n } else {\n // Buffer-aware NDJSON parser: avoid repeated string concatenation\n console.log(\"ScriptDBClient _setupListeners: Setting up NDJSON data listener\");\n this.client.on(\"data\", (chunk) => {\n console.log(\"ScriptDBClient: Received data chunk, length:\", chunk.length);\n if (!Buffer.isBuffer(chunk)) {\n try {\n chunk = Buffer.from(chunk);\n } catch (e) {\n return;\n }\n }\n\n // If buffer is empty and chunk contains no trailing partial line, avoid concat\n const idxLastNewline = chunk.indexOf(0x0a);\n if (this.buffer.length === 0 && idxLastNewline === chunk.length - 1) {\n // chunk ends with newline and no previous partial: process in-place\n let start = 0;\n let idx;\n while ((idx = chunk.indexOf(0x0a, start)) !== -1) {\n const lineBuf = chunk.slice(start, idx);\n start = idx + 1;\n if (lineBuf.length === 0) continue;\n let msg;\n try {\n msg = JSON.parse(lineBuf.toString(\"utf8\"));\n } catch (e: any) {\n this.logger?.error?.(\n \"Invalid JSON from server\",\n e && e.message ? e.message : e\n );\n continue;\n }\n // schema check\n if (!msg || typeof msg !== \"object\") continue;\n const validSchema =\n (typeof msg.id === \"undefined\" || typeof msg.id === \"number\") &&\n (typeof msg.action === \"string\" ||\n typeof msg.action === \"undefined\") &&\n (typeof msg.command === \"string\" ||\n typeof msg.command === \"undefined\") &&\n (typeof msg.message === \"string\" ||\n typeof msg.message === \"undefined\");\n if (!validSchema) continue;\n this._handleMessage(msg);\n }\n return;\n }\n\n // fallback: append chunk to buffer (infrequent), then scan\n this.buffer = Buffer.concat([this.buffer, chunk]);\n\n // enforce max message size\n // enforce max message size using configured value\n if (this.buffer.length > this.maxMessageSize) {\n this.logger?.error?.(\n \"Incoming message exceeds maxMessageSize — closing connection\"\n );\n try {\n this.client?.destroy();\n } catch (e) { }\n return;\n }\n\n let idx;\n while ((idx = this.buffer.indexOf(0x0a)) !== -1) {\n const lineBuf = this.buffer.slice(0, idx);\n this.buffer = this.buffer.slice(idx + 1);\n if (lineBuf.length === 0) continue;\n let msg;\n try {\n msg = JSON.parse(lineBuf.toString(\"utf8\"));\n } catch (e: any) {\n this.logger?.error?.(\n \"Invalid JSON from server\",\n e && (e as Error).message ? (e as Error).message : e\n );\n continue;\n }\n\n const validSchema =\n (typeof msg.id === \"undefined\" || typeof msg.id === \"number\") &&\n (typeof msg.action === \"string\" ||\n typeof msg.action === \"undefined\") &&\n (typeof msg.command === \"string\" ||\n typeof msg.command === \"undefined\") &&\n (typeof msg.message === \"string\" ||\n typeof msg.message === \"undefined\");\n if (!validSchema) {\n this.logger?.warn?.(\"Message failed schema validation — ignoring\");\n continue;\n }\n\n this._handleMessage(msg);\n }\n });\n }\n }\n\n // build the final buffer for sending using current token and signing settings\n _buildFinalBuffer(payloadBase: Message, id: number) {\n // payloadBase is { action, data }\n const payloadObj: Message = Object.assign(\n { id, action: payloadBase.action },\n payloadBase.data !== undefined ? { data: payloadBase.data } : {}\n );\n // attach current token at send time\n if (this.token) payloadObj.token = this.token;\n\n const payloadStr = this._stringify(payloadObj);\n\n if (this.signing && this.signing.secret) {\n const hmac = crypto.createHmac(\n this.signing.algorithm || \"sha256\",\n this.signing.secret\n );\n hmac.update(payloadStr);\n const sig = hmac.digest(\"hex\");\n const envelope = { id, signature: sig, payload: payloadObj };\n const envelopeStr = this._stringify(envelope);\n if (this.frame === \"length-prefix\") {\n const body = Buffer.from(envelopeStr, \"utf8\");\n const buf = Buffer.allocUnsafe(4 + body.length);\n buf.writeUInt32BE(body.length, 0);\n body.copy(buf, 4);\n return buf;\n }\n return Buffer.from(envelopeStr + \"\\n\", \"utf8\");\n }\n\n // no signing\n if (this.frame === \"length-prefix\") {\n const body = Buffer.from(payloadStr, \"utf8\");\n const buf = Buffer.allocUnsafe(4 + body.length);\n buf.writeUInt32BE(body.length, 0);\n body.copy(buf, 4);\n return buf;\n }\n return Buffer.from(payloadStr + \"\\n\", \"utf8\");\n }\n\n _handleMessage(msg: Message) {\n console.log('ScriptDBClient _handleMessage:', JSON.stringify(msg));\n console.log('ScriptDBClient _handleMessage msg.id:', msg.id, 'msg.action:', msg.action, 'msg.command:', (msg as any).command, 'msg.message:', msg.message);\n\n // message with id for request/response mapping (check this FIRST)\n if (msg && typeof msg.id !== \"undefined\") {\n console.log('Handling message with id:', msg.id, 'action:', msg.action, 'message:', msg.message);\n const pending = this._pending.get(msg.id);\n if (!pending) {\n console.log('No pending request for id', msg.id, 'pending map size:', this._pending.size);\n this.logger?.debug?.(\"No pending request for id\", msg.id);\n return;\n }\n const { resolve, reject, timer } = pending;\n if (timer) clearTimeout(timer);\n this._pending.delete(msg.id);\n // process next queued request if any\n this._processQueue();\n\n // Handle login responses with id\n if (msg.action === \"login\" || msg.command === \"login\") {\n console.log('Processing login response with id');\n if (msg.message === \"AUTH OK\") {\n console.log('AUTH OK - setting token and resolving');\n this.token = msg.data && msg.data.token ? msg.data.token : null;\n this._resolveReady(null);\n return resolve(msg.data);\n } else {\n console.log('AUTH FAILED:', msg.data);\n this._rejectReady(new Error(\"Authentication failed\"));\n const errorMsg = msg.data || \"Authentication failed\";\n // Close the connection after receiving AUTH FAIL\n try {\n this.client?.end();\n } catch (e) { }\n return reject(new Error(typeof errorMsg === 'string' ? errorMsg : \"Authentication failed\"));\n }\n }\n\n if ((msg.action === \"script-code\" || msg.command === \"script-code\") && msg.message === \"OK\")\n return resolve(msg.data);\n if ((msg.action === \"script-code\" || msg.command === \"script-code\") && msg.message === \"ERROR\")\n return reject(new Error(typeof msg.data === 'string' ? msg.data : \"Server returned ERROR\"));\n\n // Handle create-db responses\n if (msg.action === \"create-db\" && msg.message === \"SUCCESS\")\n return resolve(msg.data);\n if (msg.action === \"create-db\" && msg.message === \"ERROR\")\n return reject(new Error(typeof msg.data === 'string' ? msg.data : \"Failed to create database\"));\n\n // Default: resolve for OK/SUCCESS, reject for ERROR\n if (msg.message === \"OK\" || msg.message === \"SUCCESS\") {\n return resolve(msg.data);\n } else if (msg.message === \"ERROR\") {\n return reject(new Error(typeof msg.data === 'string' ? msg.data : \"Request failed\"));\n }\n\n return reject(new Error(\"Invalid response from server\"));\n }\n\n // otherwise, unhandled message\n console.log('Unhandled message:', msg);\n this.logger?.debug?.(\"Unhandled message from server\", this._mask(msg));\n }\n\n authenticate() {\n if (this._authenticating)\n return Promise.reject(new Error(\"Already authenticating\"));\n this._authenticating = true;\n\n return new Promise((resolve, reject) => {\n const id = this._nextId++;\n const payload: Message = {\n id,\n action: \"login\",\n data: { username: this.username, password: this.password },\n };\n\n // create a timer only when requestTimeout is enabled (>0)\n let timer: any = null;\n if (this.requestTimeout > 0) {\n timer = setTimeout(() => {\n this._pending.delete(id);\n this._authenticating = false;\n reject(new Error(\"Auth timeout\"));\n this.close();\n }, this.requestTimeout);\n }\n\n this._pending.set(id, {\n resolve: (data: any) => {\n if (timer) clearTimeout(timer);\n this._authenticating = false;\n // server may still send a login message; set token if present\n if (data && (data as any).token) this.token = (data as any).token;\n resolve(data);\n },\n reject: (err: any) => {\n if (timer) clearTimeout(timer);\n this._authenticating = false;\n reject(err);\n },\n timer,\n });\n\n try {\n // use _write to respect backpressure\n const buf = Buffer.from(JSON.stringify(payload) + \"\\n\", \"utf8\");\n this._write(buf).catch((err: any) => {\n if (timer) clearTimeout(timer);\n this._pending.delete(id);\n this._authenticating = false;\n reject(err);\n });\n } catch (e: any) {\n clearTimeout(timer);\n this._pending.delete(id);\n this._authenticating = false;\n reject(e);\n }\n })\n .then((data: any) => {\n // mark ready if token present\n if (data && (data as any).token) {\n this.token = (data as any).token;\n this._resolveReady(null);\n }\n return data;\n })\n .catch((err: any) => {\n this._rejectReady(err);\n throw err;\n });\n }\n\n // internal write helper that respects backpressure\n _write(buf: any) {\n return new Promise((resolve, reject) => {\n if (!this.client || !this._connected)\n return reject(new Error(\"Not connected\"));\n try {\n const ok = this.client.write(buf, (err) => {\n if (err) return reject(err);\n resolve(undefined);\n });\n if (!ok) {\n // wait for drain\n this.client.once(\"drain\", () => resolve(undefined));\n }\n // if ok was true, the callback above resolves\n } catch (e) {\n reject(e);\n }\n });\n }\n\n async _processQueue() {\n while (\n this._pending.size < this._maxPending &&\n this._pendingQueue.length > 0\n ) {\n const item: any = this._pendingQueue.shift();\n const { payloadBase, id, resolve, reject, timer } = item;\n // ensure token valid or attempt refresh\n if (this.tokenExpiry && Date.now() >= this.tokenExpiry) {\n const refreshed = await this._maybeRefreshToken();\n if (!refreshed) {\n clearTimeout(timer);\n try {\n reject(new Error(\"Token expired and refresh failed\"));\n } catch (e) { }\n continue;\n }\n }\n\n // build final buffer at send time so token is fresh and we don't store tokens in queue\n let buf;\n try {\n buf = this._buildFinalBuffer(payloadBase, id);\n } catch (e) {\n clearTimeout(timer);\n try {\n reject(e);\n } catch (er) { }\n continue;\n }\n\n // register pending before writing so that responses arriving quickly are handled\n this._pending.set(id, { resolve, reject, timer });\n // write with backpressure\n try {\n await this._write(buf);\n } catch (e) {\n clearTimeout(timer);\n this._pending.delete(id);\n try {\n reject(e);\n } catch (er) { }\n }\n }\n }\n\n /**\n * Execute a command. Supports concurrent requests via request id mapping.\n * Returns a Promise resolved with response.data or rejected on ERROR/timeout.\n */\n async execute(payload: Message) {\n // wait until authenticated\n try {\n await this.ready;\n } catch (err: any) {\n throw new Error(\n \"Not authenticated: \" + (err && err.message ? err.message : err)\n );\n }\n\n if (!this.token) throw new Error(\"Not authenticated\");\n\n const id = this._nextId++;\n\n // payloadBase stored in queue; final buffer will be built at send time\n const payloadBase: PayloadOptions = { action: payload.action, data: payload.data };\n\n // if token expired, try refresh before proceeding\n if (this.tokenExpiry && Date.now() >= this.tokenExpiry) {\n const refreshed = await this._maybeRefreshToken();\n if (!refreshed) throw new Error(\"Token expired\");\n }\n\n return new Promise((resolve, reject) => {\n // create request timer only if requestTimeout > 0\n let timer: any = null;\n if (this.requestTimeout > 0) {\n timer = setTimeout(() => {\n if (this._pending.has(id)) {\n this._pending.delete(id);\n reject(new Error(\"Request timeout\"));\n }\n }, this.requestTimeout);\n }\n\n // if too many pending, queue this request\n if (this._pending.size >= this._maxPending) {\n if (this._pendingQueue.length >= this._maxQueue) {\n if (timer) clearTimeout(timer);\n return reject(new Error(\"Pending queue full\"));\n }\n // enqueue payload base so we don't store tokens in the queue\n this._pendingQueue.push({ payloadBase, id, resolve, reject, timer });\n // try to process queue (async)\n this._processQueue().catch(() => { });\n return;\n }\n\n // build final buffer now using current token\n let finalBuf;\n try {\n finalBuf = this._buildFinalBuffer(payloadBase, id);\n } catch (e) {\n clearTimeout(timer);\n return reject(e);\n }\n\n this._pending.set(id, { resolve, reject, timer });\n // write with backpressure handling\n this._write(finalBuf).catch((e) => {\n if (timer) clearTimeout(timer);\n this._pending.delete(id);\n reject(e);\n });\n });\n }\n /**\n * Attempt to refresh token using provided tokenRefresh option if token expired.\n * options.tokenRefresh should be async function that returns { token, expiresAt }\n */\n async _maybeRefreshToken() {\n if (\n !this.options.tokenRefresh ||\n typeof this.options.tokenRefresh !== \"function\"\n )\n return false;\n try {\n const res = await this.options.tokenRefresh();\n if (res && res.token) {\n this.token = res.token;\n if (res.expiresAt) this.tokenExpiry = res.expiresAt;\n return true;\n }\n } catch (e) {\n this.logger?.error?.(\n \"Token refresh failed\",\n e && (e as Error).message ? (e as Error).message : String(e)\n );\n }\n return false;\n }\n\n destroy() {\n this._destroyed = true;\n if (this._reconnectTimer) {\n clearTimeout(this._reconnectTimer);\n this._reconnectTimer = null;\n }\n // reject ready and clear queues/pending\n this._rejectReady(new Error(\"Client destroyed\"));\n this._pending.forEach((pending, id) => {\n if (pending.timer) clearTimeout(pending.timer);\n try {\n pending.reject(new Error(\"Client destroyed\"));\n } catch (e: any) { }\n this._pending.delete(id);\n });\n this._pendingQueue = [];\n try {\n if (this.client) this.client.destroy();\n } catch (e: any) { }\n this.client = null;\n }\n\n _handleDisconnect(err: any) {\n // Prevent handling disconnect multiple times\n if (!this._connected && !this._authenticating) {\n return;\n }\n\n // Check if we're disconnecting during authentication - likely an AUTH FAIL\n const wasAuthenticating = this._authenticating;\n\n // cleanup pending requests\n this._pending.forEach((pending, id) => {\n if (pending.timer) clearTimeout(pending.timer);\n\n // Defer rejection to next tick to allow outer promise chain to catch it\n const errorMsg = wasAuthenticating\n ? \"Authentication failed - credentials may be required\"\n : (err && err.message ? err.message : \"Disconnected\");\n\n process.nextTick(() => {\n try {\n // Create Error here to avoid Bun logging it immediately\n pending.reject(new Error(errorMsg));\n } catch (e: any) {\n // Ignore - rejection already handled\n }\n });\n\n this._pending.delete(id);\n });\n\n this._connected = false;\n // allow new connect() calls to create a fresh connection\n this._connecting = null;\n // reset authenticating state so future connect/auth attempts are clean\n this._authenticating = false;\n\n // DON'T reconnect on auth failure when retries is 0\n if (wasAuthenticating && this.retries === 0) {\n const rejectErr = err || new Error(\"Authentication failed and no retries configured\");\n try {\n this._rejectReady(rejectErr);\n } catch (e: any) { }\n return;\n }\n\n // try reconnect\n if (this._currentRetries < this.retries) {\n // create a fresh ready promise for the reconnect attempt\n this._createReady();\n // add jitter to avoid thundering herd\n const base = Math.min(\n this.retryDelay * Math.pow(2, this._currentRetries),\n 30000\n );\n const jitter = Math.floor(Math.random() * Math.min(1000, base));\n const delay = base + jitter;\n this._currentRetries += 1;\n this.logger?.info?.(\n \"Attempting reconnect in \" +\n delay +\n \"ms (attempt \" +\n this._currentRetries +\n \")\"\n );\n // clear token/state before reconnect attempt\n this.token = null;\n setTimeout(() => {\n // clear any lingering pending queue when reconnecting to fresh state\n // we keep queued requests but they will be reprocessed after connect\n this.connect().catch((e: any) => {\n this.logger?.error?.(\"Reconnect failed\", e && e.message ? e.message : e);\n });\n }, delay);\n } else {\n // give up\n try {\n this._rejectReady(err || new Error(\"Disconnected and no retries left\"));\n } catch (e: any) { }\n }\n }\n\n close() {\n if (!this.client) return;\n try {\n this.client.removeAllListeners(\"data\");\n this.client.removeAllListeners(\"error\");\n this.client.removeAllListeners(\"close\");\n this.client.end();\n } catch (e: any) { }\n this.client = null;\n }\n\n /**\n * Disconnect (alias for close)\n */\n disconnect() {\n this.close();\n }\n\n /**\n * Send request helper (for public API methods)\n */\n async sendRequest(action: Action, data: any = {}): Promise<any> {\n return this.execute({ action, data });\n }\n\n // ========== Public API Methods ==========\n\n /**\n * Login with username and password\n */\n async login(username: string, password: string): Promise<any> {\n return this.sendRequest('login', { username, password });\n }\n\n /**\n * Logout from server\n */\n async logout(): Promise<any> {\n return this.sendRequest('logout', {});\n }\n\n /**\n * List all databases\n */\n async listDatabases(): Promise<any> {\n return this.sendRequest('list-dbs', {});\n }\n\n /**\n * Create a new database\n */\n async createDatabase(name: string): Promise<any> {\n return this.sendRequest('create-db', { databaseName: name });\n }\n\n /**\n * Remove a database\n */\n async removeDatabase(name: string): Promise<any> {\n return this.sendRequest('remove-db', { databaseName: name });\n }\n\n /**\n * Rename a database\n */\n async renameDatabase(oldName: string, newName: string): Promise<any> {\n return this.sendRequest('rename-db', { databaseName: oldName, newName });\n }\n\n /**\n * Execute code in a database\n */\n async run(code: string|Function, databaseName: string): Promise<any> {\n let stringCode: string;\n if (typeof code === 'function') {\n const funcStr = code.toString();\n // ตัด arrow function หรือ function keyword และ opening brace ออก\n const arrowMatch = funcStr.match(/^[\\s]*\\(?\\s*\\)?\\s*=>\\s*{?/);\n const functionMatch = funcStr.match(/^[\\s]*function\\s*\\(?[\\w\\s]*\\)?\\s*{/);\n const match = arrowMatch || functionMatch;\n const start = match ? match[0].length : 0;\n const end = funcStr.lastIndexOf('}');\n stringCode = funcStr.substring(start, end);\n // Trim leading newline, spaces, and trailing\n stringCode = stringCode.replace(/^[\\s\\r\\n]+/, '').replace(/[\\s\\r\\n]+$/, '');\n\n // Transform import(aa).from(\"module\") to import aa from \"module\"\n stringCode = stringCode.replace(\n /import\\s*\\(\\s*([^)]+?)\\s*\\)\\s*\\.from\\s*\\(\\s*(['\"])([^'\"]+)\\2\\s*\\)/g,\n (_, importArg, quote, modulePath) => {\n // Check if importArg is wrapped in braces (destructuring)\n const trimmed = importArg.trim();\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n // Destructuring: import({bb}) -> import { bb }\n const inner = trimmed.slice(1, -1).trim();\n return `import { ${inner} } from ${quote}${modulePath}${quote}`;\n } else {\n // Default: import(aa) -> import aa\n return `import ${trimmed} from ${quote}${modulePath}${quote}`;\n }\n }\n );\n\n // Trim leading whitespace from each line\n stringCode = stringCode.split('\\n').map(line => line.trim()).join('\\n').trim();\n } else {\n stringCode = code;\n }\n return this.sendRequest('script-code', { code: stringCode, databaseName });\n }\n\n /**\n * Save a database to disk\n */\n async saveDatabase(databaseName: string): Promise<any> {\n return this.sendRequest('save-db', { databaseName });\n }\n\n /**\n * Update database metadata\n */\n async updateDatabase(databaseName: string, data: any): Promise<any> {\n return this.sendRequest('update-db', { databaseName, ...data });\n }\n\n /**\n * Get server information\n */\n async getInfo(): Promise<any> {\n return this.sendRequest('get-info', {});\n }\n\n /**\n * Execute shell command on server\n */\n async executeShell(command: string): Promise<{ stdout: string; stderr: string }> {\n return this.sendRequest('shell-command', { command });\n }\n}\n\nexport default ScriptDBClient;\n"],"mappings":"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","names":["fs","os","e","resolve","token","password","username","data","p","path","path","fs","Storage","path","fs","resolve","fs","path","net","tls","crypto","resolve","idx","noopLogger","resolve","Storage"]}
|