@geodedb/client 1.0.0-alpha.20 → 1.0.0-alpha.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +15 -5
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/config.ts","../src/validate.ts","../src/proto.ts","../src/grpc-transport.ts","../src/types.ts","../src/prepared.ts","../src/explain.ts","../src/batch.ts","../src/auth.ts","../src/connection.ts","../src/transport.ts","../src/transaction.ts","../src/result.ts","../src/pool.ts","../src/client.ts","../src/index.ts","../src/query-builder.ts"],"names":["host","port","query","predicate","pattern","path","node","edge","__filename","__dirname","fs2","PROTO_PATH","credentials","resolve","namedParams","q","fs3","GrpcTransport","PreparedStatement","AuthClient"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Geode Client Error Types\n *\n * Implements ISO/IEC 39075:2024 status codes for GQL error handling.\n */\n\n// ISO/IEC 39075 status class constants\nexport const StatusClass = {\n SUCCESS: '00000',\n WARNING: '01000',\n NO_DATA: '02000',\n TRANSACTION_STATE: '25000',\n AUTH: '28000',\n SERIALIZATION: '40001',\n DEADLOCK: '40502',\n SYNTAX: '42000',\n CONSTRAINT: '23000',\n DUPLICATE: '42P07',\n INVALID_PARAM: '22023',\n SYSTEM: '58000',\n} as const;\n\nexport type StatusClassType = (typeof StatusClass)[keyof typeof StatusClass];\n\n/**\n * Base interface for all Geode errors.\n */\nexport interface GeodeError extends Error {\n /** ISO/IEC 39075 status class */\n readonly statusClass: StatusClassType;\n /** Whether this error can be retried */\n readonly isRetryable: boolean;\n}\n\n/**\n * Error returned from the Geode server.\n */\nexport class DriverError extends Error implements GeodeError {\n readonly statusClass: StatusClassType;\n readonly subclass: string;\n readonly code: string;\n readonly anchor?: string;\n readonly additional: string[];\n readonly findings: string[];\n\n constructor(options: {\n statusClass: StatusClassType;\n subclass: string;\n code: string;\n message: string;\n anchor?: string;\n additional?: string[];\n findings?: string[];\n }) {\n const msg = options.message\n ? `geode: ${options.code}: ${options.message}`\n : `geode: ${options.code}`;\n super(msg);\n this.name = 'DriverError';\n this.statusClass = options.statusClass;\n this.subclass = options.subclass;\n this.code = options.code;\n this.anchor = options.anchor;\n this.additional = options.additional ?? [];\n this.findings = options.findings ?? [];\n Object.setPrototypeOf(this, DriverError.prototype);\n }\n\n get isRetryable(): boolean {\n return (\n this.statusClass === StatusClass.SERIALIZATION || this.statusClass === StatusClass.DEADLOCK\n );\n }\n}\n\n/**\n * Transport layer error (QUIC/network failures).\n */\nexport class TransportError extends Error implements GeodeError {\n readonly statusClass = StatusClass.SYSTEM;\n readonly operation: string;\n readonly address?: string;\n readonly cause?: Error;\n\n constructor(options: { operation: string; address?: string; cause?: Error }) {\n const addr = options.address ? ` to ${options.address}` : '';\n const causeMsg = options.cause ? `: ${options.cause.message}` : '';\n super(`geode: transport ${options.operation}${addr}${causeMsg}`);\n this.name = 'TransportError';\n this.operation = options.operation;\n this.address = options.address;\n this.cause = options.cause;\n Object.setPrototypeOf(this, TransportError.prototype);\n }\n\n get isRetryable(): boolean {\n return true; // Transport errors are generally retryable\n }\n}\n\n/**\n * Configuration/DSN parsing error.\n */\n// Fields that should never have their values included in error messages\nconst SENSITIVE_CONFIG_FIELDS = new Set([\n 'password',\n 'pass',\n 'key',\n 'secret',\n 'token',\n 'credential',\n]);\n\nexport class ConfigError extends Error implements GeodeError {\n readonly statusClass = StatusClass.INVALID_PARAM;\n readonly field: string;\n readonly value?: string;\n\n constructor(options: { field: string; value?: string; message: string }) {\n // Redact values for sensitive fields to prevent credential leakage in logs\n const isSensitive = SENSITIVE_CONFIG_FIELDS.has(options.field.toLowerCase());\n const valStr =\n options.value !== undefined && !isSensitive ? `=${JSON.stringify(options.value)}` : '';\n super(`geode: config ${options.field}${valStr}: ${options.message}`);\n this.name = 'ConfigError';\n this.field = options.field;\n // Don't store sensitive values on the error object either\n this.value = isSensitive ? undefined : options.value;\n Object.setPrototypeOf(this, ConfigError.prototype);\n }\n\n get isRetryable(): boolean {\n return false; // Config errors require user intervention\n }\n}\n\n/**\n * Security validation error (TLS, input validation).\n */\nexport class SecurityError extends Error implements GeodeError {\n readonly statusClass = StatusClass.AUTH;\n readonly type: 'tls' | 'input' | 'validation';\n readonly cause?: Error;\n\n constructor(options: { type: 'tls' | 'input' | 'validation'; message: string; cause?: Error }) {\n const causeMsg = options.cause ? `: ${options.cause.message}` : '';\n super(`geode: security ${options.type}: ${options.message}${causeMsg}`);\n this.name = 'SecurityError';\n this.type = options.type;\n this.cause = options.cause;\n Object.setPrototypeOf(this, SecurityError.prototype);\n }\n\n get isRetryable(): boolean {\n return false; // Security errors require user intervention\n }\n}\n\n/**\n * Connection state error.\n */\nexport class StateError extends Error implements GeodeError {\n readonly statusClass = StatusClass.TRANSACTION_STATE;\n readonly currentState: ConnectionState;\n readonly operation: string;\n\n constructor(options: { currentState: ConnectionState; operation: string; message?: string }) {\n const msg = options.message\n ? `geode: state error: ${options.operation} (state=${options.currentState}): ${options.message}`\n : `geode: state error: ${options.operation} (state=${options.currentState})`;\n super(msg);\n this.name = 'StateError';\n this.currentState = options.currentState;\n this.operation = options.operation;\n Object.setPrototypeOf(this, StateError.prototype);\n }\n\n get isRetryable(): boolean {\n return false;\n }\n}\n\n/**\n * Connection state enumeration.\n */\nexport type ConnectionState =\n | 'idle'\n | 'executing'\n | 'in_transaction'\n | 'fetching'\n | 'closed'\n | 'error';\n\n// Sentinel errors\nexport const ErrClosed = new Error('geode: connection closed');\nexport const ErrQueryInProgress = new Error('geode: query already in progress');\nexport const ErrTxInProgress = new Error('geode: transaction already in progress');\nexport const ErrNoTx = new Error('geode: no transaction in progress');\nexport const ErrTxDone = new Error('geode: transaction already committed or rolled back');\nexport const ErrRowsClosed = new Error('geode: rows closed');\nexport const ErrBadConn = new Error('geode: bad connection');\n\n/**\n * Type guard for DriverError.\n */\nexport function isDriverError(err: unknown): err is DriverError {\n return err instanceof DriverError;\n}\n\n/**\n * Type guard for GeodeError.\n */\nexport function isGeodeError(err: unknown): err is GeodeError {\n return (\n err instanceof DriverError ||\n err instanceof TransportError ||\n err instanceof ConfigError ||\n err instanceof SecurityError ||\n err instanceof StateError\n );\n}\n\n/**\n * Check if an error is retryable.\n */\nexport function isRetryableError(err: unknown): boolean {\n if (isGeodeError(err)) {\n return err.isRetryable;\n }\n return false;\n}\n","/**\n * Geode Client Configuration\n *\n * DSN parsing and configuration management.\n * Supports quic:// and grpc:// transport schemes.\n *\n * See geode/docs/DSN.md for the complete DSN specification.\n */\n\nimport { ConfigError } from './errors.js';\n\n// Default configuration values\nexport const DEFAULT_PORT = 3141;\nexport const DEFAULT_GRPC_PORT = 50051;\nexport const DEFAULT_PAGE_SIZE = 1000;\nexport const DEFAULT_HELLO_NAME = 'geode-nodejs';\nexport const DEFAULT_HELLO_VERSION = '1.0.0';\nexport const DEFAULT_CONFORMANCE = 'min';\nexport const MAX_QUERY_LENGTH = 1 << 20; // 1MB\nexport const MAX_PAGE_SIZE = 100000;\nexport const MIN_PORT = 1;\nexport const MAX_PORT = 65535;\n\n/**\n * Transport type for client connections.\n */\nexport type TransportType = 'quic' | 'grpc';\n\n/**\n * Supported DSN schemes.\n */\nexport const SUPPORTED_SCHEMES = ['quic', 'grpc'] as const;\nexport type DSNScheme = (typeof SUPPORTED_SCHEMES)[number];\n\n/**\n * Validate that a port number is within valid TCP/UDP range.\n */\nfunction isValidPort(port: number): boolean {\n return !isNaN(port) && port >= MIN_PORT && port <= MAX_PORT;\n}\n\n/**\n * Geode connection configuration.\n */\nexport interface GeodeConfig {\n /** Server hostname or IP address */\n host: string;\n\n /** Server port (default: 3141 for QUIC, 50051 for gRPC) */\n port: number;\n\n /** Transport type (default: 'quic') */\n transport: TransportType;\n\n /** Number of rows per page (default: 1000) */\n pageSize: number;\n\n /** Client name sent in HELLO message */\n helloName: string;\n\n /** Client version sent in HELLO message */\n helloVersion: string;\n\n /** GQL conformance level (default: \"min\") */\n conformance: string;\n\n /** Username for authentication */\n username?: string;\n\n /** Password for authentication */\n password?: string;\n\n // TLS configuration\n /** Path to CA certificate file */\n tlsCA?: string;\n\n /** CA certificate as PEM string */\n tlsCACert?: string;\n\n /** Path to client certificate file (for mTLS) */\n tlsCert?: string;\n\n /** Client certificate as PEM string (for mTLS) */\n tlsCertPEM?: string;\n\n /** Path to client private key file (for mTLS) */\n tlsKey?: string;\n\n /** Client private key as PEM string (for mTLS) */\n tlsKeyPEM?: string;\n\n /** Skip TLS verification (DEVELOPMENT ONLY, never use in production) */\n insecureSkipVerify?: boolean;\n\n /** SNI server name override */\n serverName?: string;\n\n // Connection options\n /** Connection timeout in milliseconds (default: 30000) */\n connectTimeout?: number;\n\n /** Request timeout in milliseconds (default: 120000) */\n requestTimeout?: number;\n\n /** Keep-alive interval in milliseconds (default: 10000) */\n keepAliveInterval?: number;\n\n /** Maximum idle time in milliseconds (default: 30000) */\n maxIdleTime?: number;\n\n // gRPC-specific options\n /** Enable TLS for gRPC (default: true) */\n tls?: boolean;\n}\n\n/**\n * Connection pool configuration.\n */\nexport interface PoolConfig extends GeodeConfig {\n /** Minimum number of connections in pool (default: 1) */\n minConnections?: number;\n\n /** Maximum number of connections in pool (default: 3) */\n maxConnections?: number;\n\n /** Time to wait for connection in milliseconds (default: 30000) */\n acquireTimeout?: number;\n\n /** Idle connection lifetime in milliseconds (default: 60000) */\n idleTimeout?: number;\n}\n\n/**\n * Create a default configuration.\n */\nexport function defaultConfig(): GeodeConfig {\n return {\n host: 'localhost',\n port: DEFAULT_PORT,\n transport: 'quic',\n pageSize: DEFAULT_PAGE_SIZE,\n helloName: DEFAULT_HELLO_NAME,\n helloVersion: DEFAULT_HELLO_VERSION,\n conformance: DEFAULT_CONFORMANCE,\n connectTimeout: 30000,\n requestTimeout: 120000,\n keepAliveInterval: 10000,\n maxIdleTime: 30000,\n tls: true,\n };\n}\n\n/**\n * Parse a DSN (Data Source Name) string into configuration.\n *\n * Supported formats:\n * - quic://host:port?options (QUIC transport, default)\n * - grpc://host:port?options (gRPC transport)\n * - host:port?options (defaults to QUIC)\n * - host:port\n * - host (uses default port)\n *\n * Supported options:\n * - page_size: Results page size (default: 1000)\n * - hello_name: Client name (default: \"geode-nodejs\")\n * - hello_ver: Client version (default: \"1.0.0\")\n * - conformance: GQL conformance level (default: \"min\")\n * - username/user: Authentication username\n * - password/pass: Authentication password\n * - ca: Path to CA certificate\n * - cert: Path to client certificate (for mTLS)\n * - key: Path to client key (for mTLS)\n * - insecure: Skip TLS verification (testing only)\n * - tls: Enable/disable TLS for gRPC (default: true)\n * - server_name: SNI server name\n * - connect_timeout: Connection timeout in ms\n * - request_timeout: Request timeout in ms\n *\n * Environment variables (used as defaults):\n * - GEODE_HOST: Default host\n * - GEODE_PORT: Default port\n * - GEODE_TLS_CA: Default CA certificate path\n * - GEODE_USERNAME: Default username\n * - GEODE_PASSWORD: Default password\n * - GEODE_TRANSPORT: Default transport type (quic or grpc)\n */\nexport function parseDSN(dsn: string): GeodeConfig {\n // CANARY: REQ=REQ-CLIENT-NODEJS-001; FEATURE=\"NodejsClientConnect\"; ASPECT=DSNParse; STATUS=IMPL; OWNER=clients; UPDATED=2025-02-14\n const cfg = defaultConfig();\n\n // Apply environment variable defaults\n if (process.env['GEODE_HOST']) {\n cfg.host = process.env['GEODE_HOST'];\n }\n if (process.env['GEODE_PORT']) {\n const port = parseInt(process.env['GEODE_PORT'], 10);\n if (isValidPort(port)) {\n cfg.port = port;\n }\n }\n if (process.env['GEODE_TLS_CA']) {\n cfg.tlsCA = process.env['GEODE_TLS_CA'];\n }\n if (process.env['GEODE_USERNAME']) {\n cfg.username = process.env['GEODE_USERNAME'];\n }\n if (process.env['GEODE_PASSWORD']) {\n cfg.password = process.env['GEODE_PASSWORD'];\n }\n if (process.env['GEODE_TRANSPORT']) {\n const transport = process.env['GEODE_TRANSPORT'].toLowerCase();\n if (transport === 'grpc' || transport === 'quic') {\n cfg.transport = transport;\n }\n }\n\n dsn = dsn.trim();\n if (!dsn) {\n return cfg;\n }\n\n // Extract scheme if present\n const schemeMatch = dsn.match(/^([a-z]+):\\/\\//i);\n if (schemeMatch) {\n const scheme = schemeMatch[1]!.toLowerCase();\n\n // Check for unsupported schemes\n if (!SUPPORTED_SCHEMES.includes(scheme as DSNScheme)) {\n throw new ConfigError({\n field: 'scheme',\n value: scheme,\n message: `unsupported scheme '${scheme}'. Supported schemes: ${SUPPORTED_SCHEMES.join(', ')}`,\n });\n }\n\n return parseURLDSN(dsn, cfg, scheme as DSNScheme);\n }\n\n // Parse as host:port?options (default to QUIC)\n return parseSimpleDSN(dsn, cfg);\n}\n\n/**\n * Determine transport type from scheme.\n */\nfunction schemeToTransport(scheme: DSNScheme): TransportType {\n switch (scheme) {\n case 'grpc':\n return 'grpc';\n case 'quic':\n default:\n return 'quic';\n }\n}\n\n/**\n * Get default port for transport type.\n */\nfunction getDefaultPortForTransport(transport: TransportType): number {\n return transport === 'grpc' ? DEFAULT_GRPC_PORT : DEFAULT_PORT;\n}\n\n/**\n * Parse a URL format DSN (quic://, grpc://).\n */\nfunction parseURLDSN(dsn: string, cfg: GeodeConfig, scheme: DSNScheme): GeodeConfig {\n // Set transport based on scheme\n cfg.transport = schemeToTransport(scheme);\n\n // For URL parsing, normalize the scheme to a standard one\n const normalizedDsn = dsn.replace(/^[a-z]+:\\/\\//i, 'http://');\n\n let url: URL;\n try {\n url = new URL(normalizedDsn);\n } catch {\n throw new ConfigError({\n field: 'dsn',\n value: dsn,\n message: 'invalid URL format',\n });\n }\n\n if (!url.hostname) {\n throw new ConfigError({\n field: 'host',\n message: 'host is required',\n });\n }\n\n // Strip brackets from IPv6 addresses (URL class includes them)\n cfg.host = url.hostname.replace(/^\\[/, '').replace(/\\]$/, '');\n\n if (url.port) {\n const port = parseInt(url.port, 10);\n if (!isValidPort(port)) {\n throw new ConfigError({\n field: 'port',\n value: url.port,\n message: `must be a valid port number (${MIN_PORT}-${MAX_PORT})`,\n });\n }\n cfg.port = port;\n } else {\n // Use transport-specific default port\n cfg.port = getDefaultPortForTransport(cfg.transport);\n }\n\n // Parse credentials from URL\n if (url.username) {\n cfg.username = decodeURIComponent(url.username);\n }\n if (url.password) {\n cfg.password = decodeURIComponent(url.password);\n }\n\n // Parse query parameters\n applyQueryParams(url.searchParams, cfg);\n\n return cfg;\n}\n\n/**\n * Parse a simple host:port?options format DSN.\n */\nfunction parseSimpleDSN(dsn: string, cfg: GeodeConfig): GeodeConfig {\n // Split off query string if present\n let queryStr = '';\n const queryIdx = dsn.indexOf('?');\n if (queryIdx >= 0) {\n queryStr = dsn.slice(queryIdx + 1);\n dsn = dsn.slice(0, queryIdx);\n }\n\n // Parse host:port\n if (dsn) {\n const result = parseHostPort(dsn);\n cfg.host = result.host;\n cfg.port = result.port;\n }\n\n // Parse query parameters\n if (queryStr) {\n const params = new URLSearchParams(queryStr);\n applyQueryParams(params, cfg);\n }\n\n return cfg;\n}\n\n/**\n * Parse host:port string with IPv6 support.\n */\nfunction parseHostPort(addr: string): { host: string; port: number } {\n // Check for IPv6 address in brackets\n if (addr.startsWith('[')) {\n const closeBracket = addr.indexOf(']');\n if (closeBracket === -1) {\n throw new ConfigError({\n field: 'host',\n value: addr,\n message: 'invalid IPv6 address format',\n });\n }\n const host = addr.slice(1, closeBracket);\n const rest = addr.slice(closeBracket + 1);\n if (rest.startsWith(':')) {\n const port = parseInt(rest.slice(1), 10);\n if (!isValidPort(port)) {\n throw new ConfigError({\n field: 'port',\n value: rest.slice(1),\n message: `must be a valid port number (${MIN_PORT}-${MAX_PORT})`,\n });\n }\n return { host, port };\n }\n return { host, port: DEFAULT_PORT };\n }\n\n // Regular host:port\n const lastColon = addr.lastIndexOf(':');\n if (lastColon === -1) {\n return { host: addr, port: DEFAULT_PORT };\n }\n\n // Check if there are multiple colons (IPv6 without brackets)\n if (addr.indexOf(':') !== lastColon) {\n // Treat entire string as IPv6 host\n return { host: addr, port: DEFAULT_PORT };\n }\n\n const host = addr.slice(0, lastColon);\n const portStr = addr.slice(lastColon + 1);\n const port = parseInt(portStr, 10);\n\n if (!isValidPort(port)) {\n throw new ConfigError({\n field: 'port',\n value: portStr,\n message: `must be a valid port number (${MIN_PORT}-${MAX_PORT})`,\n });\n }\n\n if (!host) {\n throw new ConfigError({\n field: 'host',\n message: 'host is required',\n });\n }\n\n return { host, port };\n}\n\n/**\n * Apply URL query parameters to configuration.\n */\nfunction applyQueryParams(params: URLSearchParams, cfg: GeodeConfig): void {\n for (const [key, value] of params) {\n switch (key) {\n case 'page_size': {\n const n = parseInt(value, 10);\n if (isNaN(n) || n <= 0) {\n throw new ConfigError({\n field: 'page_size',\n value,\n message: 'must be a positive integer',\n });\n }\n if (n > MAX_PAGE_SIZE) {\n throw new ConfigError({\n field: 'page_size',\n value,\n message: `must not exceed ${MAX_PAGE_SIZE}`,\n });\n }\n cfg.pageSize = n;\n break;\n }\n\n case 'hello_name':\n if (!value) {\n throw new ConfigError({\n field: 'hello_name',\n message: 'cannot be empty',\n });\n }\n cfg.helloName = value;\n break;\n\n case 'hello_ver':\n if (!value) {\n throw new ConfigError({\n field: 'hello_ver',\n message: 'cannot be empty',\n });\n }\n cfg.helloVersion = value;\n break;\n\n case 'conformance':\n cfg.conformance = value;\n break;\n\n case 'username':\n case 'user':\n cfg.username = value;\n break;\n\n case 'password':\n case 'pass':\n cfg.password = value;\n break;\n\n case 'ca':\n case 'ca_cert':\n cfg.tlsCA = value;\n break;\n\n case 'cert':\n case 'client_cert':\n cfg.tlsCert = value;\n break;\n\n case 'key':\n case 'client_key':\n cfg.tlsKey = value;\n break;\n\n case 'insecure_tls_skip_verify':\n case 'insecure':\n case 'skip_verify':\n cfg.insecureSkipVerify =\n value === 'true' || value === '1' || value === 'yes' || value === 'on';\n break;\n\n case 'tls':\n cfg.tls = value !== 'false' && value !== '0';\n break;\n\n case 'server_name':\n cfg.serverName = value;\n break;\n\n case 'connect_timeout':\n case 'timeout': {\n const n = parseInt(value, 10);\n if (!isNaN(n) && n > 0) {\n // If specified in seconds (timeout), convert to ms; connect_timeout is already in ms\n cfg.connectTimeout = key === 'timeout' ? n * 1000 : n;\n }\n break;\n }\n\n case 'request_timeout': {\n const n = parseInt(value, 10);\n if (!isNaN(n) && n > 0) {\n cfg.requestTimeout = n;\n }\n break;\n }\n\n // Ignore unknown parameters for forward compatibility\n }\n }\n\n // Validate mTLS configuration - XOR: one but not both\n if ((cfg.tlsCert && !cfg.tlsKey) || (!cfg.tlsCert && cfg.tlsKey)) {\n throw new ConfigError({\n field: 'tls',\n message: 'both cert and key must be provided for mTLS',\n });\n }\n}\n\n/**\n * Validate configuration.\n */\nexport function validateConfig(cfg: GeodeConfig): void {\n if (!cfg.host) {\n throw new ConfigError({\n field: 'host',\n message: 'host is required',\n });\n }\n\n if (!cfg.port || cfg.port < 1 || cfg.port > 65535) {\n throw new ConfigError({\n field: 'port',\n value: String(cfg.port),\n message: 'must be a valid port number (1-65535)',\n });\n }\n\n if (cfg.pageSize <= 0) {\n throw new ConfigError({\n field: 'pageSize',\n value: String(cfg.pageSize),\n message: 'must be positive',\n });\n }\n\n if (cfg.pageSize > MAX_PAGE_SIZE) {\n throw new ConfigError({\n field: 'pageSize',\n value: String(cfg.pageSize),\n message: `must not exceed ${MAX_PAGE_SIZE}`,\n });\n }\n}\n\n/**\n * Get the server address in host:port format.\n */\nexport function getAddress(cfg: GeodeConfig): string {\n // Handle IPv6 addresses\n if (cfg.host.includes(':')) {\n return `[${cfg.host}]:${cfg.port}`;\n }\n return `${cfg.host}:${cfg.port}`;\n}\n\n/**\n * Clone configuration.\n */\nexport function cloneConfig(cfg: GeodeConfig): GeodeConfig {\n return { ...cfg };\n}\n\n/**\n * Redact credentials from a DSN string for safe logging.\n *\n * Replaces username and password with '***' to prevent credential exposure\n * in logs, error messages, or other output.\n *\n * @example\n * ```typescript\n * redactDSN('quic://admin:secret@localhost:3141')\n * // Returns: 'quic://***:***@localhost:3141'\n *\n * redactDSN('grpc://localhost:50051?username=admin&password=secret')\n * // Returns: 'grpc://localhost:50051?username=***&password=***'\n * ```\n */\nexport function redactDSN(dsn: string): string {\n if (!dsn) {\n return dsn;\n }\n\n // Handle URL format (quic://, grpc://)\n const schemeMatch = dsn.match(/^([a-z]+):\\/\\//i);\n if (schemeMatch) {\n const scheme = schemeMatch[1]!;\n try {\n // Normalize to http:// for URL parsing, then restore original scheme\n const normalizedDsn = dsn.replace(/^[a-z]+:\\/\\//i, 'http://');\n const url = new URL(normalizedDsn);\n\n // Redact username and password in URL\n if (url.username) {\n url.username = '***';\n }\n if (url.password) {\n url.password = '***';\n }\n\n // Redact password/pass query params\n if (url.searchParams.has('password')) {\n url.searchParams.set('password', '***');\n }\n if (url.searchParams.has('pass')) {\n url.searchParams.set('pass', '***');\n }\n if (url.searchParams.has('username')) {\n url.searchParams.set('username', '***');\n }\n if (url.searchParams.has('user')) {\n url.searchParams.set('user', '***');\n }\n\n // Restore original scheme\n return url.toString().replace(/^http:\\/\\//, `${scheme}://`);\n } catch {\n // If URL parsing fails, fall through to string-based redaction\n }\n }\n\n // String-based redaction for simple DSN format\n let result = dsn;\n\n // Redact password in query params\n result = result.replace(/(password|pass)=([^&]*)/gi, '$1=***');\n\n // Redact username in query params\n result = result.replace(/(username|user)=([^&]*)/gi, '$1=***');\n\n return result;\n}\n\n/**\n * Redact credentials from a configuration object for safe logging.\n *\n * Returns a new config object with password set to '***'.\n */\nexport function redactConfig(cfg: GeodeConfig): GeodeConfig {\n return {\n ...cfg,\n password: cfg.password ? '***' : undefined,\n };\n}\n","/**\n * Input Validation Module\n *\n * Security-focused validation for user inputs to prevent injection attacks.\n */\n\nimport * as fs from 'node:fs';\nimport { SecurityError } from './errors.js';\nimport { MAX_QUERY_LENGTH, MAX_PAGE_SIZE } from './config.js';\n\n// Parameter name pattern: alphanumeric with underscores, max 128 chars\nconst PARAM_NAME_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]{0,127}$/;\n\n// GQL identifier pattern: alphanumeric with underscores, max 128 chars\n// Used for labels, relationship types, and property names in queries\nconst GQL_IDENTIFIER_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]{0,127}$/;\n\n// Maximum length for GQL identifiers\nconst MAX_IDENTIFIER_LENGTH = 128;\n\n// Allowed permission actions (uppercase for GQL syntax)\nconst ALLOWED_PERMISSION_ACTIONS = new Set(['READ', 'WRITE', 'DELETE', 'CREATE', 'UPDATE', 'ALL']);\n\n// Allowed permission resources\nconst ALLOWED_PERMISSION_RESOURCES = new Set([\n 'NODE',\n 'EDGE',\n 'RELATIONSHIP',\n 'GRAPH',\n 'PROPERTY',\n 'LABEL',\n 'INDEX',\n 'CONSTRAINT',\n]);\n\n// Allowed RLS policy actions\nconst ALLOWED_RLS_ACTIONS = new Set(['READ', 'WRITE', 'ALL']);\n\n// Reserved keywords that cannot be used as parameter names\nconst RESERVED_KEYWORDS = new Set([\n 'match',\n 'create',\n 'delete',\n 'set',\n 'remove',\n 'return',\n 'where',\n 'with',\n 'order',\n 'by',\n 'skip',\n 'limit',\n 'union',\n 'all',\n 'optional',\n 'and',\n 'or',\n 'not',\n 'xor',\n 'null',\n 'true',\n 'false',\n 'in',\n 'is',\n 'as',\n 'case',\n 'when',\n 'then',\n 'else',\n 'end',\n 'exists',\n 'count',\n 'sum',\n 'avg',\n 'min',\n 'max',\n 'collect',\n 'distinct',\n 'merge',\n 'call',\n 'yield',\n 'unwind',\n 'foreach',\n 'detach',\n 'drop',\n 'graph',\n 'use',\n 'catalog',\n 'constraint',\n 'index',\n 'create',\n 'node',\n 'relationship',\n 'edge',\n 'property',\n 'on',\n 'for',\n 'if',\n 'begin',\n 'commit',\n 'rollback',\n 'transaction',\n]);\n\n/**\n * Validate a GQL query string.\n *\n * @throws SecurityError if validation fails\n */\nexport function validateQuery(query: string): void {\n if (!query) {\n throw new SecurityError({\n type: 'input',\n message: 'query cannot be empty',\n });\n }\n\n if (query.length > MAX_QUERY_LENGTH) {\n throw new SecurityError({\n type: 'input',\n message: `query exceeds maximum length of ${MAX_QUERY_LENGTH} bytes`,\n });\n }\n\n // Check for null bytes (potential injection)\n if (query.includes('\\0')) {\n throw new SecurityError({\n type: 'input',\n message: 'query contains null bytes',\n });\n }\n\n // Check for control characters (except common whitespace)\n // eslint-disable-next-line no-control-regex\n if (/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]/.test(query)) {\n throw new SecurityError({\n type: 'input',\n message: 'query contains invalid control characters',\n });\n }\n}\n\n/**\n * Validate a parameter name.\n *\n * @throws SecurityError if validation fails\n */\nexport function validateParamName(name: string): void {\n if (!name) {\n throw new SecurityError({\n type: 'input',\n message: 'parameter name cannot be empty',\n });\n }\n\n if (!PARAM_NAME_PATTERN.test(name)) {\n // GAP #15: Don't include potentially sensitive parameter name in error\n throw new SecurityError({\n type: 'input',\n message:\n 'invalid parameter name: must start with letter or underscore and contain only alphanumeric characters and underscores',\n });\n }\n\n if (RESERVED_KEYWORDS.has(name.toLowerCase())) {\n // GAP #15: Don't include potentially sensitive parameter name in error\n throw new SecurityError({\n type: 'input',\n message: 'parameter name cannot be a reserved keyword',\n });\n }\n}\n\n/**\n * Validate a parameter value.\n *\n * @throws SecurityError if validation fails\n */\nexport function validateParamValue(value: unknown): void {\n // Check for circular references\n try {\n JSON.stringify(value);\n } catch {\n throw new SecurityError({\n type: 'input',\n message: 'parameter value contains circular reference or is not serializable',\n });\n }\n\n // Recursively validate nested values\n validateValueRecursive(value, 0);\n}\n\n/**\n * Recursively validate a value with depth limit.\n */\nfunction validateValueRecursive(value: unknown, depth: number): void {\n const MAX_DEPTH = 32;\n if (depth > MAX_DEPTH) {\n throw new SecurityError({\n type: 'input',\n message: `parameter value exceeds maximum nesting depth of ${MAX_DEPTH}`,\n });\n }\n\n if (value === null || value === undefined) {\n return;\n }\n\n if (typeof value === 'string') {\n // Check for null bytes\n if (value.includes('\\0')) {\n throw new SecurityError({\n type: 'input',\n message: 'parameter value contains null bytes',\n });\n }\n return;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n validateValueRecursive(item, depth + 1);\n }\n return;\n }\n\n if (typeof value === 'object') {\n for (const [key, val] of Object.entries(value)) {\n validateParamName(key);\n validateValueRecursive(val, depth + 1);\n }\n return;\n }\n\n // Primitives (number, boolean, bigint) are always valid\n}\n\n/**\n * Validate a hostname.\n *\n * @throws SecurityError if validation fails\n */\nexport function validateHostname(hostname: string): void {\n if (!hostname) {\n throw new SecurityError({\n type: 'input',\n message: 'hostname cannot be empty',\n });\n }\n\n // Check length\n if (hostname.length > 253) {\n throw new SecurityError({\n type: 'input',\n message: 'hostname exceeds maximum length',\n });\n }\n\n // Check for valid characters\n // Allow: letters, digits, hyphens, dots, and IPv6 brackets/colons\n if (!/^[a-zA-Z0-9.\\-:[\\]]+$/.test(hostname)) {\n throw new SecurityError({\n type: 'input',\n message: 'hostname contains invalid characters',\n });\n }\n\n // Check for IPv4\n if (/^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/.test(hostname)) {\n const parts = hostname.split('.').map(Number);\n if (parts.some((p) => p < 0 || p > 255)) {\n throw new SecurityError({\n type: 'input',\n message: 'invalid IPv4 address',\n });\n }\n return;\n }\n\n // Check for IPv6 (simplified check)\n if (hostname.includes(':') || hostname.startsWith('[')) {\n // Basic IPv6 validation - allow colons and hex digits\n const addr = hostname.replace(/^\\[|\\]$/g, '');\n if (!/^[a-fA-F0-9:]+$/.test(addr)) {\n throw new SecurityError({\n type: 'input',\n message: 'invalid IPv6 address',\n });\n }\n return;\n }\n\n // Validate as hostname\n const labels = hostname.split('.');\n for (const label of labels) {\n if (!label || label.length > 63) {\n throw new SecurityError({\n type: 'input',\n message: 'hostname label is invalid',\n });\n }\n if (!/^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?$/.test(label)) {\n throw new SecurityError({\n type: 'input',\n message: 'hostname label contains invalid characters',\n });\n }\n }\n}\n\n/**\n * Validate a port number.\n *\n * @throws SecurityError if validation fails\n */\nexport function validatePort(port: number): void {\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new SecurityError({\n type: 'input',\n message: 'port must be an integer between 1 and 65535',\n });\n }\n}\n\n/**\n * Validate a page size.\n *\n * @throws SecurityError if validation fails\n */\nexport function validatePageSize(pageSize: number): void {\n if (!Number.isInteger(pageSize) || pageSize < 1) {\n throw new SecurityError({\n type: 'input',\n message: 'page size must be a positive integer',\n });\n }\n if (pageSize > MAX_PAGE_SIZE) {\n throw new SecurityError({\n type: 'input',\n message: `page size must not exceed ${MAX_PAGE_SIZE}`,\n });\n }\n}\n\n/**\n * Validate a savepoint name.\n *\n * @throws SecurityError if validation fails\n */\nexport function validateSavepointName(name: string): void {\n if (!name) {\n throw new SecurityError({\n type: 'input',\n message: 'savepoint name cannot be empty',\n });\n }\n\n if (name.length > 128) {\n throw new SecurityError({\n type: 'input',\n message: 'savepoint name exceeds maximum length of 128 characters',\n });\n }\n\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {\n throw new SecurityError({\n type: 'input',\n message: 'savepoint name contains invalid characters',\n });\n }\n}\n\n/**\n * Sanitize a string for safe logging (remove sensitive data patterns).\n */\nexport function sanitizeForLog(value: string): string {\n // Replace potential passwords, tokens, etc.\n return value\n .replace(/password\\s*[:=]\\s*\\S+/gi, 'password=***')\n .replace(/token\\s*[:=]\\s*\\S+/gi, 'token=***')\n .replace(/secret\\s*[:=]\\s*\\S+/gi, 'secret=***')\n .replace(/api[_-]?key\\s*[:=]\\s*\\S+/gi, 'api_key=***');\n}\n\n/**\n * Identifier type for validation error messages.\n */\nexport type IdentifierType = 'label' | 'relationship_type' | 'property' | 'variable';\n\n/**\n * Validate a GQL identifier (label, relationship type, property name, or variable).\n *\n * GQL identifiers must:\n * - Start with a letter or underscore\n * - Contain only alphanumeric characters and underscores\n * - Be at most 128 characters long\n * - Not be a reserved keyword (for variable/property names)\n *\n * @param value - The identifier value to validate\n * @param type - The type of identifier for error messages\n * @param checkReserved - Whether to check against reserved keywords (default: false for labels/types)\n * @throws SecurityError if validation fails\n */\nexport function validateIdentifier(\n value: string,\n type: IdentifierType,\n checkReserved = false\n): void {\n if (!value) {\n throw new SecurityError({\n type: 'input',\n message: `${type} cannot be empty`,\n });\n }\n\n if (value.length > MAX_IDENTIFIER_LENGTH) {\n // GAP #15: Avoid leaking potentially sensitive input in error messages\n throw new SecurityError({\n type: 'input',\n message: `${type} exceeds maximum length of ${MAX_IDENTIFIER_LENGTH} characters (got ${value.length})`,\n });\n }\n\n if (!GQL_IDENTIFIER_PATTERN.test(value)) {\n // GAP #15: Don't include full value in error message - only describe the issue\n throw new SecurityError({\n type: 'input',\n message: `invalid ${type}: must start with letter or underscore and contain only alphanumeric characters and underscores`,\n });\n }\n\n if (checkReserved && RESERVED_KEYWORDS.has(value.toLowerCase())) {\n // GAP #15: Don't include potentially sensitive reserved keyword value\n throw new SecurityError({\n type: 'input',\n message: `${type} cannot be a reserved keyword`,\n });\n }\n}\n\n/**\n * Validate a node label.\n *\n * @param label - The label to validate\n * @throws SecurityError if validation fails\n */\nexport function validateLabel(label: string): void {\n validateIdentifier(label, 'label', false);\n}\n\n/**\n * Validate a relationship type.\n *\n * @param type - The relationship type to validate\n * @throws SecurityError if validation fails\n */\nexport function validateRelationshipType(type: string): void {\n validateIdentifier(type, 'relationship_type', false);\n}\n\n/**\n * Validate a property name for safe query interpolation.\n *\n * @param name - The property name to validate\n * @throws SecurityError if validation fails\n */\nexport function validatePropertyName(name: string): void {\n validateIdentifier(name, 'property', true);\n}\n\n/**\n * Validate a variable name.\n *\n * @param name - The variable name to validate\n * @throws SecurityError if validation fails\n */\nexport function validateVariableName(name: string): void {\n validateIdentifier(name, 'variable', true);\n}\n\n/**\n * Validate a permission action.\n *\n * @param action - The action to validate (e.g., 'READ', 'WRITE')\n * @throws SecurityError if validation fails\n */\nexport function validatePermissionAction(action: string): void {\n if (!action) {\n throw new SecurityError({\n type: 'input',\n message: 'permission action cannot be empty',\n });\n }\n\n const upperAction = action.toUpperCase();\n if (!ALLOWED_PERMISSION_ACTIONS.has(upperAction)) {\n throw new SecurityError({\n type: 'input',\n message: `invalid permission action: ${action}. Allowed: ${[...ALLOWED_PERMISSION_ACTIONS].join(', ')}`,\n });\n }\n}\n\n/**\n * Validate a permission resource.\n *\n * @param resource - The resource to validate (e.g., 'NODE', 'EDGE')\n * @throws SecurityError if validation fails\n */\nexport function validatePermissionResource(resource: string): void {\n if (!resource) {\n throw new SecurityError({\n type: 'input',\n message: 'permission resource cannot be empty',\n });\n }\n\n const upperResource = resource.toUpperCase();\n if (!ALLOWED_PERMISSION_RESOURCES.has(upperResource)) {\n throw new SecurityError({\n type: 'input',\n message: `invalid permission resource: ${resource}. Allowed: ${[...ALLOWED_PERMISSION_RESOURCES].join(', ')}`,\n });\n }\n}\n\n/**\n * Validate an RLS policy action.\n *\n * @param action - The RLS action to validate (e.g., 'READ', 'WRITE', 'ALL')\n * @throws SecurityError if validation fails\n */\nexport function validateRLSAction(action: string): void {\n if (!action) {\n throw new SecurityError({\n type: 'input',\n message: 'RLS policy action cannot be empty',\n });\n }\n\n const upperAction = action.toUpperCase();\n if (!ALLOWED_RLS_ACTIONS.has(upperAction)) {\n throw new SecurityError({\n type: 'input',\n message: `invalid RLS policy action: ${action}. Allowed: ${[...ALLOWED_RLS_ACTIONS].join(', ')}`,\n });\n }\n}\n\n/**\n * Validate a role name.\n *\n * @param name - The role name to validate\n * @throws SecurityError if validation fails\n */\nexport function validateRoleName(name: string): void {\n validateIdentifier(name, 'variable', false); // Roles follow identifier rules\n}\n\n/**\n * Validate a username.\n *\n * @param username - The username to validate\n * @throws SecurityError if validation fails\n */\nexport function validateUsername(username: string): void {\n validateIdentifier(username, 'variable', false); // Usernames follow identifier rules\n}\n\n/**\n * Escape a GQL identifier for safe interpolation in queries.\n *\n * This function provides defense-in-depth by both validating and escaping\n * identifiers before they are used in GQL queries. Even though validation\n * should prevent injection, escaping provides an additional safety layer.\n *\n * GQL identifiers that match the simple pattern (starting with letter/underscore,\n * containing only alphanumeric and underscores) are returned as-is.\n * Otherwise, they are wrapped in backticks with internal backticks escaped.\n *\n * @param identifier - The identifier to escape\n * @param type - The type of identifier for validation error messages\n * @returns The escaped identifier safe for query interpolation\n * @throws SecurityError if the identifier fails validation\n *\n * @example\n * ```typescript\n * escapeGQLIdentifier('Person', 'label') // Returns: \"Person\"\n * escapeGQLIdentifier('user_name', 'label') // Returns: \"user_name\"\n * ```\n */\nexport function escapeGQLIdentifier(identifier: string, type: IdentifierType): string {\n // First validate the identifier\n validateIdentifier(identifier, type, false);\n\n // If it matches the simple identifier pattern, return as-is\n if (GQL_IDENTIFIER_PATTERN.test(identifier)) {\n return identifier;\n }\n\n // Otherwise, escape backticks and wrap in backticks\n // Note: After validation, this branch should rarely be reached since\n // validation enforces the simple pattern. This is defense-in-depth.\n const escaped = identifier.replace(/`/g, '``');\n return '`' + escaped + '`';\n}\n\n// RLS Predicate Validation\n//\n// Allowed keywords in predicates: true, false, null, and, or, not, is, in,\n// contains, starts, ends, with, current_user, current_roles, exists, any, all,\n// none, single, size, length, type, labels, keys, properties, id, coalesce,\n// head, last, tail, nodes, relationships\n//\n// Allowed tokens: identifiers, dotted property access (n.prop), parameters ($param),\n// operators (=, <>, <, >, <=, >=, !=, +, -, *, /, %), literals, brackets\n//\n// The validation uses a dangerous-pattern blocking approach rather than allowlist\n// tokenization for better compatibility with valid predicate expressions.\n\n// Dangerous patterns that indicate injection attempts\nconst RLS_PREDICATE_DANGEROUS_PATTERNS = [\n // Statement terminators and chaining\n /;/,\n // DDL/DML keywords that should never appear in predicates\n // These are dangerous as standalone keywords in predicates\n /\\b(create|drop|delete|detach|set|remove|merge|call|load|unwind|foreach)\\b/i,\n // Index hint injection\n /\\busing\\s+(index|scan)\\b/i,\n // Policy/security manipulation commands (more specific patterns)\n // These look for specific command structures, not just the word \"user\"\n /\\b(create|drop|alter)\\s+(policy|role|user|permission)\\b/i,\n /\\b(grant|revoke|deny)\\s+\\w+/i,\n // Comment injection\n /\\/\\*/,\n /\\*\\//,\n /--/,\n /\\/\\//,\n // Line breaks that could be used for injection\n /[\\r\\n]/,\n // Backtick escaping\n /`/,\n // Multiple statements\n /\\}\\s*\\{/,\n];\n\n/**\n * Validate an RLS policy predicate expression.\n *\n * This performs strict validation to prevent GQL injection attacks.\n * Only safe predicate expressions are allowed.\n *\n * @param predicate - The predicate expression to validate\n * @throws SecurityError if the predicate contains potentially dangerous patterns\n *\n * @example\n * ```typescript\n * // Valid predicates\n * validateRLSPredicate('n.owner = current_user()');\n * validateRLSPredicate('n.visibility = \"public\" OR n.owner = $user');\n * validateRLSPredicate('exists((n)-[:MEMBER_OF]->(:Team {id: $teamId}))');\n *\n * // Invalid predicates (will throw)\n * validateRLSPredicate('true; DROP POLICY admin'); // Injection attempt\n * validateRLSPredicate('n.x = 1 CREATE (m:Malicious)'); // DDL injection\n * ```\n */\nexport function validateRLSPredicate(predicate: string): void {\n if (!predicate) {\n throw new SecurityError({\n type: 'input',\n message: 'RLS predicate cannot be empty',\n });\n }\n\n // First, apply basic query validation (null bytes, control chars, length)\n validateQuery(predicate);\n\n // Check for dangerous patterns\n for (const pattern of RLS_PREDICATE_DANGEROUS_PATTERNS) {\n if (pattern.test(predicate)) {\n throw new SecurityError({\n type: 'input',\n message: 'RLS predicate contains disallowed pattern',\n });\n }\n }\n\n // Validate balanced parentheses and brackets\n let parenCount = 0;\n let bracketCount = 0;\n let braceCount = 0;\n let inString: string | null = null;\n\n for (let i = 0; i < predicate.length; i++) {\n const char = predicate[i];\n\n // Handle string literals\n if (inString) {\n // GAP #18: Count consecutive backslashes before quote character\n // to correctly handle escaped backslashes (\\\\) followed by quotes\n // Example: '\\\\' - backslash escaped, quote ends string\n // '\\'' - quote escaped, still in string\n // '\\\\\\' - backslash escaped + quote escaped, still in string\n if (char === inString) {\n let backslashCount = 0;\n let j = i - 1;\n while (j >= 0 && predicate[j] === '\\\\') {\n backslashCount++;\n j--;\n }\n // Quote is escaped only if preceded by odd number of backslashes\n // Even number means the backslashes escape each other, leaving quote unescaped\n if (backslashCount % 2 === 0) {\n inString = null;\n }\n }\n continue;\n }\n\n if (char === \"'\" || char === '\"') {\n inString = char;\n continue;\n }\n\n // Count brackets\n switch (char) {\n case '(':\n parenCount++;\n break;\n case ')':\n parenCount--;\n break;\n case '[':\n bracketCount++;\n break;\n case ']':\n bracketCount--;\n break;\n case '{':\n braceCount++;\n break;\n case '}':\n braceCount--;\n break;\n }\n\n // Check for unbalanced brackets (potential injection)\n if (parenCount < 0 || bracketCount < 0 || braceCount < 0) {\n throw new SecurityError({\n type: 'input',\n message: 'RLS predicate contains unbalanced brackets',\n });\n }\n }\n\n // Ensure all brackets are closed\n if (parenCount !== 0 || bracketCount !== 0 || braceCount !== 0) {\n throw new SecurityError({\n type: 'input',\n message: 'RLS predicate contains unbalanced brackets',\n });\n }\n\n // Ensure string was closed\n if (inString) {\n throw new SecurityError({\n type: 'input',\n message: 'RLS predicate contains unclosed string literal',\n });\n }\n}\n\n/**\n * List of sensitive paths that should never be accessed as TLS certificates.\n * GAP #21: Expanded to include cloud credential paths and user home directories.\n */\nconst SENSITIVE_PATHS = [\n // System files\n '/etc/passwd',\n '/etc/shadow',\n '/etc/hosts',\n '/proc/',\n '/sys/',\n '/dev/',\n // Root home directory\n '/root/',\n // SSH keys\n '/.ssh/',\n // Kubernetes secrets\n '/var/run/secrets/',\n '/run/secrets/',\n // AWS credentials\n '/.aws/',\n '/credentials',\n // GCP credentials\n '/.config/gcloud/',\n '/gcloud/',\n // Azure credentials\n '/.azure/',\n // Environment files\n '/.env',\n '/env',\n];\n\n/**\n * Validate a path string against the sensitive paths blocklist.\n *\n * @param normalizedPath - The normalized path to check\n * @param fieldName - The field name for error messages\n * @throws SecurityError if the path matches a sensitive path\n */\nfunction checkAgainstBlocklist(normalizedPath: string, fieldName: string): void {\n const lowerPath = normalizedPath.toLowerCase();\n for (const sensitive of SENSITIVE_PATHS) {\n if (lowerPath.includes(sensitive)) {\n throw new SecurityError({\n type: 'input',\n message: `${fieldName} path refers to a restricted system file`,\n });\n }\n }\n}\n\n/**\n * Validate a file path for TLS certificate loading.\n *\n * Prevents path traversal attacks by ensuring paths are absolute and don't\n * contain directory traversal sequences. Also resolves symlinks to prevent\n * TOCTOU attacks where a symlink points to a restricted file.\n *\n * @param path - The file path to validate\n * @param fieldName - The field name for error messages (e.g., 'tlsCA', 'tlsCert')\n * @throws SecurityError if the path is invalid or contains traversal sequences\n */\nexport function validateTLSCertPath(path: string, fieldName: string): void {\n if (!path) {\n throw new SecurityError({\n type: 'input',\n message: `${fieldName} path cannot be empty`,\n });\n }\n\n // Check for null bytes\n if (path.includes('\\0')) {\n throw new SecurityError({\n type: 'input',\n message: `${fieldName} path contains null bytes`,\n });\n }\n\n // Normalize the path to detect traversal attempts\n const normalizedPath = path\n .replace(/\\\\/g, '/') // Normalize Windows paths\n .replace(/\\/+/g, '/'); // Remove duplicate slashes\n\n // Check for directory traversal sequences\n if (normalizedPath.includes('/../') || normalizedPath.endsWith('/..')) {\n throw new SecurityError({\n type: 'input',\n message: `${fieldName} path contains directory traversal sequence`,\n });\n }\n\n // Check for traversal at start (../something)\n if (normalizedPath.startsWith('../') || normalizedPath === '..') {\n throw new SecurityError({\n type: 'input',\n message: `${fieldName} path contains directory traversal sequence`,\n });\n }\n\n // Check for encoded traversal attempts\n if (/%2e%2e/i.test(path) || /%252e/i.test(path)) {\n throw new SecurityError({\n type: 'input',\n message: `${fieldName} path contains encoded traversal sequence`,\n });\n }\n\n // GAP #21: Check original path against expanded blocklist\n checkAgainstBlocklist(normalizedPath, fieldName);\n\n // GAP #20: Resolve symlinks to prevent TOCTOU attacks\n // If the file exists, check if it's a symlink and validate the resolved path\n try {\n if (fs.existsSync(path)) {\n const stats = fs.lstatSync(path);\n if (stats.isSymbolicLink()) {\n // Resolve the symlink and validate the target path\n const resolvedPath = fs.realpathSync(path);\n const normalizedResolved = resolvedPath.replace(/\\\\/g, '/').replace(/\\/+/g, '/');\n\n // Check resolved path against blocklist\n checkAgainstBlocklist(normalizedResolved, fieldName);\n\n // Check resolved path for traversal (shouldn't happen after realpath, but defense-in-depth)\n if (normalizedResolved.includes('/../') || normalizedResolved.endsWith('/..')) {\n throw new SecurityError({\n type: 'input',\n message: `${fieldName} symlink resolves to a path with directory traversal`,\n });\n }\n }\n }\n } catch (e) {\n // If it's already a SecurityError, rethrow it\n if (e instanceof SecurityError) {\n throw e;\n }\n // For other errors (e.g., permission denied), we continue with just the string validation\n // The actual file read will fail later with a more specific error\n }\n}\n","/**\n * Geode Protobuf Wire Protocol\n *\n * Uses protobufjs for encoding/decoding protocol messages.\n * Wire format for QUIC: 4-byte Big Endian length prefix + protobuf message body.\n */\n\n// Use default import for CJS/ESM interop (protobufjs is CJS)\nimport protobuf from 'protobufjs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n// Get the directory of this module for proto file resolution\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\nconst PROTO_PATH = path.resolve(__dirname, '..', 'proto', 'geode.proto');\n\n// --- Type definitions matching geode.proto ---\n\nexport interface HelloRequest {\n username: string;\n password: string;\n tenantId?: string;\n clientName: string;\n clientVersion: string;\n wantedConformance: string;\n}\n\nexport interface HelloResponse {\n success: boolean;\n sessionId: string;\n errorMessage: string;\n capabilities: string[];\n}\n\nexport interface Param {\n name: string;\n value: ProtoValue;\n}\n\nexport interface ExecuteRequest {\n sessionId: string;\n query: string;\n params: Param[];\n}\n\nexport interface PullRequest {\n requestId: bigint | number;\n pageSize: number;\n sessionId: string;\n}\n\nexport interface PullResponse {\n response?: ExecutionResponse;\n}\n\nexport interface Status {\n statusClass: string;\n statusSubclass: string;\n additionalStatuses: string[];\n flaggerFindings: string[];\n}\n\nexport interface ColumnDefinition {\n name: string;\n type: string;\n}\n\nexport interface SchemaDefinition {\n columns: ColumnDefinition[];\n}\n\nexport interface ProtoValue {\n nullVal?: NullValue;\n intVal?: IntValue;\n doubleVal?: DoubleValue;\n boolVal?: boolean;\n stringVal?: StringValue;\n decimalVal?: DecimalValue;\n bytesVal?: BytesValue;\n listVal?: ListValue;\n mapVal?: MapValue;\n nodeVal?: NodeValue;\n edgeVal?: EdgeValue;\n pathVal?: PathValue;\n extVal?: ExtendedValue;\n}\n\n// Empty interface for protobuf null value message\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface NullValue {}\n\nexport interface IntValue {\n value: bigint | number;\n kind: number;\n}\n\nexport interface DoubleValue {\n value: number;\n kind: number;\n}\n\nexport interface StringValue {\n value: string;\n kind: number;\n}\n\nexport interface DecimalValue {\n coeff: string;\n scale: number;\n origScale: number;\n origRepr: string;\n}\n\nexport interface BytesValue {\n value: Uint8Array;\n kind: number;\n}\n\nexport interface ListValue {\n values: ProtoValue[];\n}\n\nexport interface MapEntry {\n key: string;\n value: ProtoValue;\n}\n\nexport interface MapValue {\n entries: MapEntry[];\n}\n\nexport interface NodeValue {\n id: bigint | number;\n labels: string[];\n properties: MapEntry[];\n}\n\nexport interface EdgeValue {\n id: bigint | number;\n fromId: bigint | number;\n toId: bigint | number;\n label: string;\n properties: MapEntry[];\n}\n\nexport interface PathValue {\n nodes: NodeValue[];\n edges: EdgeValue[];\n}\n\nexport interface ExtendedValue {\n typeName: string;\n text?: string;\n bytes?: Uint8Array;\n intVal?: bigint | number;\n doubleVal?: number;\n boolVal?: boolean;\n}\n\nexport interface Row {\n values: ProtoValue[];\n}\n\nexport interface DataPage {\n rows: Row[];\n final: boolean;\n ordered: boolean;\n orderKeys: string[];\n}\n\nexport interface ProtoError {\n code: string;\n message: string;\n type: string;\n anchor: string;\n}\n\nexport interface ExecutionMetrics {\n parseDurationNs: bigint | number;\n planDurationNs: bigint | number;\n executeDurationNs: bigint | number;\n totalDurationNs: bigint | number;\n}\n\nexport interface ExplainTotals {\n cost?: number;\n est_rows?: number;\n}\n\nexport interface ExplainPayload {\n schema: string;\n ops: unknown[];\n totals?: ExplainTotals;\n properties: unknown;\n calibration: unknown;\n profileVersion: number;\n}\n\nexport interface ProfileMemory {\n netBytes?: number | bigint;\n peakBytes?: number | bigint;\n totalAllocBytes?: number | bigint;\n}\n\nexport interface ProfilePayload {\n profileVersion: number;\n ops: unknown[];\n peakContributors: unknown[];\n totals: unknown;\n totalTimeNs: bigint | number;\n spills: unknown;\n memory?: ProfileMemory;\n plannerEstimates: unknown;\n memCurve: unknown[];\n setop: unknown;\n hashaggSpills: bigint | number;\n hashaggSpillReason: string;\n committedTxns: bigint | number;\n graphStoreNodes: bigint | number;\n graphStoreEdges: bigint | number;\n graphStoreDirty: boolean;\n flaggerFindings: string[];\n compact: boolean;\n}\n\n// Empty interface for protobuf heartbeat message\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface Heartbeat {}\n\nexport interface ExecutionResponse {\n status?: Status;\n schema?: SchemaDefinition;\n page?: DataPage;\n error?: ProtoError;\n metrics?: ExecutionMetrics;\n explain?: ExplainPayload;\n profile?: ProfilePayload;\n heartbeat?: Heartbeat;\n}\n\n// Empty interface for protobuf ping request message\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface PingRequest {}\nexport interface PingResponse {\n ok: boolean;\n}\n\nexport interface BeginRequest {\n readOnly: boolean;\n sessionId: string;\n}\nexport interface BeginResponse {\n sessionId: string;\n txId: string;\n}\n\nexport interface CommitRequest {\n sessionId: string;\n}\nexport interface CommitResponse {\n success: boolean;\n}\n\nexport interface RollbackRequest {\n sessionId: string;\n}\nexport interface RollbackResponse {\n success: boolean;\n}\n\nexport interface SavepointRequest {\n name: string;\n sessionId: string;\n}\nexport interface SavepointResponse {\n success: boolean;\n}\n\nexport interface RollbackToRequest {\n name: string;\n sessionId: string;\n}\nexport interface RollbackToResponse {\n success: boolean;\n}\n\nexport interface QuicClientMessage {\n hello?: HelloRequest;\n execute?: ExecuteRequest;\n pull?: PullRequest;\n ping?: PingRequest;\n cdcDiag?: unknown;\n cdcCtrl?: unknown;\n begin?: BeginRequest;\n commit?: CommitRequest;\n rollback?: RollbackRequest;\n savepoint?: SavepointRequest;\n rollbackTo?: RollbackToRequest;\n backup?: unknown;\n restore?: unknown;\n uploadBackup?: unknown;\n}\n\nexport interface QuicServerMessage {\n hello?: HelloResponse;\n execute?: ExecutionResponse;\n pull?: PullResponse;\n ping?: PingResponse;\n cdcDiag?: unknown;\n cdcCtrl?: unknown;\n begin?: BeginResponse;\n commit?: CommitResponse;\n rollback?: RollbackResponse;\n savepoint?: SavepointResponse;\n rollbackTo?: RollbackToResponse;\n backup?: unknown;\n restore?: unknown;\n uploadBackup?: unknown;\n}\n\n// --- Protobuf Root and Message Types ---\n\nlet protoRoot: protobuf.Root | null = null;\nlet QuicClientMessageType: protobuf.Type | null = null;\nlet QuicServerMessageType: protobuf.Type | null = null;\n\n/**\n * Initialize protobuf types from the proto file.\n * This is done lazily on first use.\n */\nasync function initProto(): Promise<void> {\n if (protoRoot) return;\n\n protoRoot = await protobuf.load(PROTO_PATH);\n QuicClientMessageType = protoRoot.lookupType('geode.QuicClientMessage');\n QuicServerMessageType = protoRoot.lookupType('geode.QuicServerMessage');\n}\n\n/**\n * Initialize protobuf types synchronously (for use after async init).\n */\nfunction initProtoSync(): void {\n if (protoRoot) return;\n\n protoRoot = protobuf.loadSync(PROTO_PATH);\n QuicClientMessageType = protoRoot.lookupType('geode.QuicClientMessage');\n QuicServerMessageType = protoRoot.lookupType('geode.QuicServerMessage');\n}\n\n// Initialize on module load\ninitProtoSync();\n\n/**\n * Ensure proto is initialized.\n */\nexport async function ensureProtoInitialized(): Promise<void> {\n if (!protoRoot) {\n await initProto();\n }\n}\n\n/**\n * Convert a JavaScript value to a protobuf Value message.\n */\nexport function jsToProtoValue(value: unknown): ProtoValue {\n if (value === null || value === undefined) {\n return { nullVal: {} };\n }\n\n if (typeof value === 'boolean') {\n return { boolVal: value };\n }\n\n if (typeof value === 'number') {\n if (Number.isInteger(value)) {\n return { intVal: { value, kind: 1 } }; // INT\n }\n return { doubleVal: { value, kind: 1 } }; // DOUBLE\n }\n\n if (typeof value === 'bigint') {\n return { intVal: { value, kind: 3 } }; // BIGINT\n }\n\n if (typeof value === 'string') {\n return { stringVal: { value, kind: 1 } }; // STRING\n }\n\n if (Array.isArray(value)) {\n return {\n listVal: {\n values: value.map(jsToProtoValue),\n },\n };\n }\n\n if (value instanceof Uint8Array || Buffer.isBuffer(value)) {\n return { bytesVal: { value: value as Uint8Array, kind: 1 } }; // BYTEA\n }\n\n if (typeof value === 'object') {\n const entries: MapEntry[] = [];\n for (const [k, v] of Object.entries(value)) {\n entries.push({ key: k, value: jsToProtoValue(v) });\n }\n return { mapVal: { entries } };\n }\n\n // Default fallback for symbol/function types - convert to string representation\n // eslint-disable-next-line @typescript-eslint/no-base-to-string -- Intentional fallback for edge cases\n return { stringVal: { value: String(value), kind: 1 } };\n}\n\n/**\n * Convert a protobuf Value to a JavaScript value.\n */\nexport function protoValueToJS(val: ProtoValue): unknown {\n if (val.nullVal !== undefined) return null;\n\n if (val.boolVal !== undefined) return val.boolVal;\n\n if (val.intVal !== undefined) {\n const n = val.intVal.value;\n if (typeof n === 'bigint') {\n if (n >= BigInt(Number.MIN_SAFE_INTEGER) && n <= BigInt(Number.MAX_SAFE_INTEGER)) {\n return Number(n);\n }\n return n;\n }\n return n;\n }\n\n if (val.doubleVal !== undefined) return val.doubleVal.value;\n\n if (val.stringVal !== undefined) return val.stringVal.value;\n\n if (val.decimalVal !== undefined) {\n // Return as string to preserve precision\n return val.decimalVal.origRepr || val.decimalVal.coeff;\n }\n\n if (val.bytesVal !== undefined) return Buffer.from(val.bytesVal.value);\n\n if (val.listVal !== undefined) {\n return val.listVal.values.map(protoValueToJS);\n }\n\n if (val.mapVal !== undefined) {\n const obj: Record<string, unknown> = {};\n for (const entry of val.mapVal.entries) {\n obj[entry.key] = protoValueToJS(entry.value);\n }\n return obj;\n }\n\n if (val.nodeVal !== undefined) {\n const node = val.nodeVal;\n const props: Record<string, unknown> = {};\n for (const entry of node.properties) {\n props[entry.key] = protoValueToJS(entry.value);\n }\n return {\n id: typeof node.id === 'bigint' ? node.id : BigInt(node.id),\n labels: node.labels,\n properties: props,\n };\n }\n\n if (val.edgeVal !== undefined) {\n const edge = val.edgeVal;\n const props: Record<string, unknown> = {};\n for (const entry of edge.properties) {\n props[entry.key] = protoValueToJS(entry.value);\n }\n return {\n id: typeof edge.id === 'bigint' ? edge.id : BigInt(edge.id),\n startNode: typeof edge.fromId === 'bigint' ? edge.fromId : BigInt(edge.fromId),\n endNode: typeof edge.toId === 'bigint' ? edge.toId : BigInt(edge.toId),\n type: edge.label,\n properties: props,\n };\n }\n\n if (val.pathVal !== undefined) {\n const path = val.pathVal;\n return {\n nodes: path.nodes.map((n) => protoValueToJS({ nodeVal: n })),\n edges: path.edges.map((e) => protoValueToJS({ edgeVal: e })),\n };\n }\n\n if (val.extVal !== undefined) {\n const ext = val.extVal;\n if (ext.text !== undefined) return ext.text;\n if (ext.bytes !== undefined) return Buffer.from(ext.bytes);\n if (ext.intVal !== undefined) return ext.intVal;\n if (ext.doubleVal !== undefined) return ext.doubleVal;\n if (ext.boolVal !== undefined) return ext.boolVal;\n return null;\n }\n\n return null;\n}\n\n/**\n * Encode a QuicClientMessage to protobuf bytes.\n */\nexport function encodeQuicClientMessage(msg: QuicClientMessage): Buffer {\n if (!QuicClientMessageType) {\n initProtoSync();\n }\n\n const err = QuicClientMessageType!.verify(msg);\n if (err) {\n throw new Error(`Invalid QuicClientMessage: ${err}`);\n }\n\n const message = QuicClientMessageType!.create(msg);\n const buffer = QuicClientMessageType!.encode(message).finish();\n return Buffer.from(buffer);\n}\n\n/**\n * Encode a QuicClientMessage with 4-byte big-endian length prefix.\n */\nexport function encodeWithLengthPrefix(msg: QuicClientMessage): Buffer {\n const data = encodeQuicClientMessage(msg);\n const lengthBuf = Buffer.alloc(4);\n lengthBuf.writeUInt32BE(data.length, 0);\n return Buffer.concat([lengthBuf, data]);\n}\n\n/**\n * Decode a QuicServerMessage from protobuf bytes.\n */\nexport function decodeQuicServerMessage(data: Buffer | Uint8Array): QuicServerMessage {\n if (!QuicServerMessageType) {\n initProtoSync();\n }\n\n const message = QuicServerMessageType!.decode(data);\n return QuicServerMessageType!.toObject(message, {\n longs: Number,\n enums: Number,\n bytes: Buffer,\n defaults: true,\n }) as QuicServerMessage;\n}\n\n/**\n * Decode 4-byte big-endian length prefix.\n */\nexport function decodeLengthPrefix(data: Buffer): number {\n if (data.length < 4) {\n throw new Error('Insufficient data for length prefix');\n }\n return data.readUInt32BE(0);\n}\n\n/**\n * Build a HelloRequest message.\n */\nexport function buildHelloRequest(\n username: string,\n password: string,\n clientName: string,\n clientVersion: string,\n conformance: string,\n tenantId?: string\n): QuicClientMessage {\n return {\n hello: {\n username,\n password,\n tenantId,\n clientName,\n clientVersion,\n wantedConformance: conformance,\n },\n };\n}\n\n/**\n * Build an ExecuteRequest message.\n */\nexport function buildExecuteRequest(\n sessionId: string,\n query: string,\n params?: Record<string, unknown>\n): QuicClientMessage {\n const protoParams: Param[] = [];\n if (params) {\n for (const [name, value] of Object.entries(params)) {\n protoParams.push({\n name,\n value: jsToProtoValue(value),\n });\n }\n }\n\n return {\n execute: {\n sessionId,\n query,\n params: protoParams,\n },\n };\n}\n\n/**\n * Build a PullRequest message.\n */\nexport function buildPullRequest(\n requestId: number,\n pageSize: number,\n sessionId: string\n): QuicClientMessage {\n return {\n pull: {\n requestId,\n pageSize,\n sessionId,\n },\n };\n}\n\n/**\n * Build a PingRequest message.\n */\nexport function buildPingRequest(): QuicClientMessage {\n return { ping: {} };\n}\n\n/**\n * Build a BeginRequest message.\n */\nexport function buildBeginRequest(readOnly: boolean, sessionId: string): QuicClientMessage {\n return {\n begin: {\n readOnly,\n sessionId,\n },\n };\n}\n\n/**\n * Build a CommitRequest message.\n */\nexport function buildCommitRequest(sessionId: string): QuicClientMessage {\n return {\n commit: {\n sessionId,\n },\n };\n}\n\n/**\n * Build a RollbackRequest message.\n */\nexport function buildRollbackRequest(sessionId: string): QuicClientMessage {\n return {\n rollback: {\n sessionId,\n },\n };\n}\n\n/**\n * Build a SavepointRequest message.\n */\nexport function buildSavepointRequest(name: string, sessionId: string): QuicClientMessage {\n return {\n savepoint: {\n name,\n sessionId,\n },\n };\n}\n\n/**\n * Build a RollbackToRequest message.\n */\nexport function buildRollbackToRequest(name: string, sessionId: string): QuicClientMessage {\n return {\n rollbackTo: {\n name,\n sessionId,\n },\n };\n}\n\n/**\n * Convert a DataPage row to a record of column name -> value.\n */\nexport function rowToRecord(row: Row, columns: ColumnDefinition[]): Record<string, unknown> {\n const record: Record<string, unknown> = {};\n for (let i = 0; i < columns.length && i < row.values.length; i++) {\n const col = columns[i]!;\n const val = row.values[i]!;\n record[col.name] = protoValueToJS(val);\n }\n return record;\n}\n\n/**\n * Get proto file path for gRPC loader.\n */\nexport function getProtoPath(): string {\n return PROTO_PATH;\n}\n","/**\n * gRPC Transport Layer\n *\n * Provides gRPC transport for communication with Geode server.\n * Uses @grpc/grpc-js with dynamic proto loading.\n *\n * Method mapping (QuicClientMessage field -> gRPC service RPC):\n * hello -> Handshake (unary)\n * execute -> Execute (server-streaming: schema + data pages)\n * pull -> reads next buffered message from the Execute stream\n * ping -> Ping (unary)\n * begin -> Begin (unary)\n * commit -> Commit (unary)\n * rollback -> Rollback (unary)\n * savepoint / rollbackTo -> not supported over gRPC\n */\n\nimport * as grpc from '@grpc/grpc-js';\nimport * as protoLoader from '@grpc/proto-loader';\nimport * as fs from 'node:fs';\nimport type { GeodeConfig } from './config.js';\nimport { getAddress } from './config.js';\nimport { TransportError, ErrClosed } from './errors.js';\nimport { validateTLSCertPath } from './validate.js';\nimport {\n getProtoPath,\n type QuicClientMessage,\n type QuicServerMessage,\n type HelloResponse,\n type ExecutionResponse,\n type PingResponse,\n type BeginResponse,\n type CommitResponse,\n type RollbackResponse,\n} from './proto.js';\nimport type { Transport } from './transport.js';\n\n// Get proto path from proto.ts (which handles CJS/ESM compatibility)\nconst PROTO_PATH = getProtoPath();\n\n// Proto loader options\nconst PROTO_LOADER_OPTIONS: protoLoader.Options = {\n keepCase: false,\n longs: Number,\n enums: Number,\n defaults: true,\n oneofs: true,\n};\n\n// Service client type (dynamically loaded).\n// Method names are camelCase of the proto RPC names.\ninterface GeodeServiceClient {\n handshake(\n request: unknown,\n callback: (error: grpc.ServiceError | null, response: unknown) => void\n ): grpc.ClientUnaryCall;\n execute(request: unknown): grpc.ClientReadableStream<unknown>;\n ping(\n request: unknown,\n callback: (error: grpc.ServiceError | null, response: unknown) => void\n ): grpc.ClientUnaryCall;\n begin(\n request: unknown,\n callback: (error: grpc.ServiceError | null, response: unknown) => void\n ): grpc.ClientUnaryCall;\n commit(\n request: unknown,\n callback: (error: grpc.ServiceError | null, response: unknown) => void\n ): grpc.ClientUnaryCall;\n rollback(\n request: unknown,\n callback: (error: grpc.ServiceError | null, response: unknown) => void\n ): grpc.ClientUnaryCall;\n close(): void;\n}\n\n/**\n * gRPC transport for Geode database.\n */\nexport class GrpcTransport implements Transport {\n private _client: GeodeServiceClient | null = null;\n private _closed = false;\n private _address: string;\n private _pendingResponses: QuicServerMessage[] = [];\n private _activeStream: grpc.ClientReadableStream<unknown> | null = null;\n\n constructor(address: string) {\n this._address = address;\n }\n\n /**\n * Connect to the Geode server using gRPC.\n */\n static async connect(cfg: GeodeConfig): Promise<GrpcTransport> {\n const address = getAddress(cfg);\n const transport = new GrpcTransport(address);\n\n try {\n // Load proto definition\n const packageDefinition = await protoLoader.load(PROTO_PATH, PROTO_LOADER_OPTIONS);\n const protoDescriptor = grpc.loadPackageDefinition(packageDefinition) as unknown as {\n geode: {\n GeodeService: new (\n address: string,\n credentials: grpc.ChannelCredentials,\n options?: grpc.ChannelOptions\n ) => GeodeServiceClient;\n };\n };\n\n // Build channel credentials\n let credentials: grpc.ChannelCredentials;\n if (cfg.tls === false || cfg.insecureSkipVerify) {\n credentials = grpc.credentials.createInsecure();\n } else {\n const sslOptions = await buildGrpcSslOptions(cfg);\n credentials = grpc.credentials.createSsl(\n sslOptions.rootCerts,\n sslOptions.privateKey,\n sslOptions.certChain\n );\n }\n\n // Channel options\n const options: grpc.ChannelOptions = {\n 'grpc.max_receive_message_length': 100 * 1024 * 1024, // 100MB\n 'grpc.max_send_message_length': 100 * 1024 * 1024,\n 'grpc.keepalive_time_ms': cfg.keepAliveInterval ?? 10000,\n 'grpc.keepalive_timeout_ms': 5000,\n 'grpc.keepalive_permit_without_calls': 1,\n };\n\n // Create client\n transport._client = new protoDescriptor.geode.GeodeService(address, credentials, options);\n\n return transport;\n } catch (e) {\n await transport.close();\n throw new TransportError({\n operation: 'connect',\n address,\n cause: e instanceof Error ? e : new Error(String(e)),\n });\n }\n }\n\n /**\n * Send a protobuf message and queue the response.\n * For gRPC, this makes the appropriate RPC call based on the message type.\n */\n async sendProto(msg: QuicClientMessage, signal?: AbortSignal): Promise<void> {\n this.checkClosed();\n\n if (signal?.aborted) {\n throw new TransportError({ operation: 'sendProto', cause: new Error('Aborted') });\n }\n\n if (!this._client) {\n throw new TransportError({ operation: 'sendProto', cause: new Error('No client') });\n }\n\n try {\n if (msg.hello) {\n // hello -> Handshake RPC (unary)\n const response = await this.callUnary<HelloResponse>('handshake', msg.hello, signal);\n this._pendingResponses.push({ hello: response });\n } else if (msg.execute) {\n // execute -> Execute RPC (server-streaming)\n // Collects all streamed messages (schema + data pages) into the pending queue.\n await this.callServerStream(msg.execute, signal);\n } else if (msg.pull) {\n // pull -> no separate gRPC RPC; responses are already buffered\n // from the streaming Execute call. If the buffer is empty the\n // caller will get the response via receiveProto which checks\n // the pending queue. Nothing to do here.\n // However, if no buffered responses remain, that means the\n // stream completed (final page was already delivered).\n // Push a synthetic final page so the caller knows we're done.\n if (this._pendingResponses.length === 0) {\n this._pendingResponses.push({\n execute: {\n status: {\n statusClass: '00000',\n statusSubclass: '',\n additionalStatuses: [],\n flaggerFindings: [],\n },\n payload: 'page',\n page: { rows: [], final: true, ordered: false, orderKeys: [] },\n } as ExecutionResponse,\n });\n }\n } else if (msg.ping) {\n const response = await this.callUnary<PingResponse>('ping', msg.ping, signal);\n this._pendingResponses.push({ ping: response });\n } else if (msg.begin) {\n const response = await this.callUnary<BeginResponse>('begin', msg.begin, signal);\n this._pendingResponses.push({ begin: response });\n } else if (msg.commit) {\n const response = await this.callUnary<CommitResponse>('commit', msg.commit, signal);\n this._pendingResponses.push({ commit: response });\n } else if (msg.rollback) {\n const response = await this.callUnary<RollbackResponse>('rollback', msg.rollback, signal);\n this._pendingResponses.push({ rollback: response });\n } else if (msg.savepoint) {\n // Savepoint is not exposed as a gRPC RPC on the server.\n throw new TransportError({\n operation: 'sendProto',\n cause: new Error('Savepoint is not supported over gRPC transport'),\n });\n } else if (msg.rollbackTo) {\n // RollbackTo is not exposed as a gRPC RPC on the server.\n throw new TransportError({\n operation: 'sendProto',\n cause: new Error('RollbackTo is not supported over gRPC transport'),\n });\n } else {\n throw new TransportError({\n operation: 'sendProto',\n cause: new Error('Unknown message type'),\n });\n }\n } catch (e) {\n if (e instanceof TransportError) throw e;\n throw new TransportError({\n operation: 'sendProto',\n address: this._address,\n cause: e instanceof Error ? e : new Error(String(e)),\n });\n }\n }\n\n /**\n * Receive a protobuf message from the queue.\n */\n // eslint-disable-next-line @typescript-eslint/require-await -- Method must be async for interface compatibility\n async receiveProto(signal?: AbortSignal): Promise<QuicServerMessage> {\n this.checkClosed();\n\n if (signal?.aborted) {\n throw new TransportError({ operation: 'receiveProto', cause: new Error('Aborted') });\n }\n\n // Return queued response\n const response = this._pendingResponses.shift();\n if (response) {\n return response;\n }\n\n // No response available - this shouldn't happen with proper sendProto usage\n throw new TransportError({\n operation: 'receiveProto',\n cause: new Error('No response available'),\n });\n }\n\n /**\n * Legacy JSON send (not supported for gRPC).\n */\n // eslint-disable-next-line @typescript-eslint/require-await\n async send(_msg: Record<string, unknown>, _signal?: AbortSignal): Promise<void> {\n throw new TransportError({\n operation: 'send',\n cause: new Error('JSON mode not supported for gRPC transport'),\n });\n }\n\n /**\n * Legacy JSON receive (not supported for gRPC).\n */\n // eslint-disable-next-line @typescript-eslint/require-await\n async receive(_signal?: AbortSignal): Promise<Buffer> {\n throw new TransportError({\n operation: 'receive',\n cause: new Error('JSON mode not supported for gRPC transport'),\n });\n }\n\n /**\n * Close the transport.\n */\n // eslint-disable-next-line @typescript-eslint/require-await\n async close(): Promise<void> {\n if (this._closed) return;\n this._closed = true;\n\n if (this._activeStream) {\n this._activeStream.cancel();\n this._activeStream = null;\n }\n\n if (this._client) {\n this._client.close();\n this._client = null;\n }\n }\n\n /**\n * Check if transport is closed.\n */\n isClosed(): boolean {\n return this._closed;\n }\n\n /**\n * Get remote address.\n */\n getAddress(): string {\n return this._address;\n }\n\n /**\n * Make a unary RPC call.\n */\n private callUnary<T>(method: string, request: unknown, signal?: AbortSignal): Promise<T> {\n return new Promise((resolve, reject) => {\n if (!this._client) {\n reject(new Error('No client'));\n return;\n }\n\n const clientMethod = this._client[method as keyof GeodeServiceClient] as (\n request: unknown,\n callback: (error: grpc.ServiceError | null, response: unknown) => void\n ) => grpc.ClientUnaryCall;\n\n if (typeof clientMethod !== 'function') {\n reject(new Error(`Unknown method: ${method}`));\n return;\n }\n\n const call = clientMethod.call(this._client, request, (error, response) => {\n if (error) {\n reject(\n new TransportError({\n operation: method,\n address: this._address,\n cause: new Error(`gRPC error ${error.code}: ${error.message}`),\n })\n );\n } else {\n resolve(response as T);\n }\n });\n\n if (signal) {\n const onAbort = () => {\n call.cancel();\n reject(new TransportError({ operation: method, cause: new Error('Aborted') }));\n };\n signal.addEventListener('abort', onAbort, { once: true });\n }\n });\n }\n\n /**\n * Call the server-streaming Execute RPC.\n * Collects all streamed ExecutionResponse messages into _pendingResponses.\n */\n private callServerStream(request: unknown, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this._client) {\n reject(new Error('No client'));\n return;\n }\n\n // Cancel any previous stream\n if (this._activeStream) {\n this._activeStream.cancel();\n this._activeStream = null;\n }\n\n const stream = this._client.execute(request);\n this._activeStream = stream;\n\n stream.on('data', (response: unknown) => {\n this._pendingResponses.push({ execute: response as ExecutionResponse });\n });\n\n stream.on('end', () => {\n this._activeStream = null;\n resolve();\n });\n\n stream.on('error', (error: grpc.ServiceError) => {\n this._activeStream = null;\n reject(\n new TransportError({\n operation: 'execute',\n address: this._address,\n cause: new Error(`gRPC error ${error.code}: ${error.message}`),\n })\n );\n });\n\n if (signal) {\n const onAbort = () => {\n stream.cancel();\n reject(new TransportError({ operation: 'execute', cause: new Error('Aborted') }));\n };\n signal.addEventListener('abort', onAbort, { once: true });\n }\n });\n }\n\n /**\n * Check if closed and throw if so.\n */\n private checkClosed(): void {\n if (this._closed) {\n throw ErrClosed;\n }\n }\n}\n\n/**\n * Build SSL options for gRPC from GeodeConfig.\n */\nasync function buildGrpcSslOptions(cfg: GeodeConfig): Promise<{\n rootCerts: Buffer | null;\n privateKey: Buffer | null;\n certChain: Buffer | null;\n}> {\n let rootCerts: Buffer | null = null;\n let privateKey: Buffer | null = null;\n let certChain: Buffer | null = null;\n\n // Load CA certificate\n if (cfg.tlsCACert) {\n rootCerts = Buffer.from(cfg.tlsCACert);\n } else if (cfg.tlsCA) {\n validateTLSCertPath(cfg.tlsCA, 'tlsCA');\n rootCerts = await fs.promises.readFile(cfg.tlsCA);\n }\n\n // Load client certificate for mTLS\n if (cfg.tlsCertPEM) {\n certChain = Buffer.from(cfg.tlsCertPEM);\n } else if (cfg.tlsCert) {\n validateTLSCertPath(cfg.tlsCert, 'tlsCert');\n certChain = await fs.promises.readFile(cfg.tlsCert);\n }\n\n // Load client key for mTLS\n if (cfg.tlsKeyPEM) {\n privateKey = Buffer.from(cfg.tlsKeyPEM);\n } else if (cfg.tlsKey) {\n validateTLSCertPath(cfg.tlsKey, 'tlsKey');\n privateKey = await fs.promises.readFile(cfg.tlsKey);\n }\n\n return { rootCerts, privateKey, certChain };\n}\n","/**\n * GQL Type System\n *\n * Implements the GQL value type system for ISO/IEC 39075:2024 compliance.\n */\n\n// Import Decimal from decimal.js-light\n// The module has compatibility issues with TypeScript ESM declarations, so we use type-only import + runtime require\nimport type { Decimal } from 'decimal.js-light';\n\n// Create Decimal at runtime to avoid TypeScript declaration issues\n// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- Dynamic import requires type assertion\nconst DecimalClass: new (value: string | number) => Decimal =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Module type is incompatible\n (await import('decimal.js-light')).default as any;\n\n// Helper to check if value is Decimal (duck typing)\nfunction isDecimal(value: unknown): value is Decimal {\n return value !== null && typeof value === 'object' && 'toFixed' in value && 'toNumber' in value;\n}\n\n// Helper to create Decimal\nfunction createDecimal(value: string | number | Decimal): Decimal {\n if (isDecimal(value)) return value;\n return new DecimalClass(value);\n}\n\n/**\n * GQL value kind enumeration.\n */\nexport type GQLValueKind =\n | 'NULL'\n | 'BOOL'\n | 'INT'\n | 'FLOAT'\n | 'STRING'\n | 'DECIMAL'\n | 'BYTEA'\n | 'DATE'\n | 'TIME'\n | 'TIMETZ'\n | 'TIMESTAMP'\n | 'TIMESTAMPTZ'\n | 'INTERVAL'\n | 'JSON'\n | 'JSONB'\n | 'XML'\n | 'URL'\n | 'DOMAIN'\n | 'UUID'\n | 'ENUM'\n | 'BIT_STRING'\n | 'RANGE'\n | 'ARRAY'\n | 'OBJECT'\n | 'NODE'\n | 'EDGE'\n | 'PATH'\n | 'UNKNOWN';\n\n/**\n * GQL type enumeration for wire protocol.\n */\nexport type GQLType =\n | 'INT'\n | 'INTEGER'\n | 'BIGINT'\n | 'FLOAT'\n | 'DOUBLE'\n | 'REAL'\n | 'DECIMAL'\n | 'STRING'\n | 'VARCHAR'\n | 'TEXT'\n | 'BOOL'\n | 'BOOLEAN'\n | 'NULL'\n | 'LIST'\n | 'ARRAY'\n | 'MAP'\n | 'RECORD'\n | 'NODE'\n | 'EDGE'\n | 'RELATIONSHIP'\n | 'PATH'\n | 'BYTEA'\n | 'DATE'\n | 'TIME'\n | 'TIMETZ'\n | 'TIMESTAMP'\n | 'TIMESTAMPTZ'\n | 'INTERVAL'\n | 'JSON'\n | 'JSONB'\n | 'XML'\n | 'UUID'\n | 'URL'\n | 'DOMAIN'\n | 'ENUM'\n | 'BIT'\n | 'VARBIT'\n | 'UNKNOWN';\n\n/**\n * Range bounds for GQL range types.\n */\nexport interface GQLRange<T = unknown> {\n lower?: T;\n upper?: T;\n lowerInclusive: boolean;\n upperInclusive: boolean;\n}\n\n/**\n * Type alias for node/edge IDs.\n *\n * IDs can be:\n * - string: String-based IDs or hex format IDs\n * - number: Integer IDs within JavaScript's safe integer range\n * - bigint: Integer IDs larger than Number.MAX_SAFE_INTEGER (2^53 - 1)\n *\n * Note: Geode's internal IDs often exceed JavaScript's safe integer limit,\n * so bigint is used to preserve full precision.\n */\nexport type GQLId = string | number | bigint;\n\n/**\n * Node structure from graph queries.\n */\nexport interface GQLNode {\n id: GQLId;\n labels: string[];\n properties: Record<string, unknown>;\n}\n\n/**\n * Edge structure from graph queries.\n *\n * Note: The server may return edge endpoints as either:\n * - `startNode`/`endNode` (normalized form used by the client)\n * - `from`/`to` (alternative wire format)\n *\n * The client normalizes both formats to `startNode`/`endNode`.\n */\nexport interface GQLEdge {\n id: GQLId;\n type: string;\n startNode: GQLId;\n endNode: GQLId;\n properties: Record<string, unknown>;\n}\n\n/**\n * Raw edge structure as it may appear in wire format.\n * Used internally for parsing before normalization.\n */\nexport interface RawEdge {\n id: GQLId;\n type: string;\n startNode?: GQLId;\n endNode?: GQLId;\n from?: GQLId;\n to?: GQLId;\n properties?: Record<string, unknown>;\n}\n\n/**\n * Path structure from graph queries.\n */\nexport interface GQLPath {\n nodes: GQLNode[];\n edges: GQLEdge[];\n}\n\n/**\n * GQL Value wrapper for type-safe value handling.\n */\nexport class GQLValue {\n readonly kind: GQLValueKind;\n\n private _intValue: bigint = 0n;\n private _floatValue: number = 0;\n private _boolValue: boolean = false;\n private _stringValue: string = '';\n private _decimalValue?: Decimal;\n private _arrayValue: GQLValue[] = [];\n private _objectValue: Map<string, GQLValue> = new Map();\n private _bytesValue: Uint8Array = new Uint8Array();\n private _dateValue?: Date;\n private _rangeValue?: GQLRange;\n private _nodeValue?: GQLNode;\n private _edgeValue?: GQLEdge;\n private _pathValue?: GQLPath;\n private _rawValue?: unknown;\n\n private constructor(kind: GQLValueKind) {\n this.kind = kind;\n }\n\n // Factory methods\n static null(): GQLValue {\n return new GQLValue('NULL');\n }\n\n static bool(value: boolean): GQLValue {\n const v = new GQLValue('BOOL');\n v._boolValue = value;\n return v;\n }\n\n static int(value: number | bigint): GQLValue {\n const v = new GQLValue('INT');\n v._intValue = typeof value === 'bigint' ? value : BigInt(Math.trunc(value));\n return v;\n }\n\n static float(value: number): GQLValue {\n const v = new GQLValue('FLOAT');\n v._floatValue = value;\n return v;\n }\n\n static string(value: string): GQLValue {\n const v = new GQLValue('STRING');\n v._stringValue = value;\n return v;\n }\n\n static decimal(value: string | number | Decimal): GQLValue {\n const v = new GQLValue('DECIMAL');\n v._decimalValue = createDecimal(value);\n return v;\n }\n\n static array(values: GQLValue[]): GQLValue {\n const v = new GQLValue('ARRAY');\n v._arrayValue = values;\n return v;\n }\n\n static object(values: Map<string, GQLValue> | Record<string, GQLValue>): GQLValue {\n const v = new GQLValue('OBJECT');\n v._objectValue = values instanceof Map ? values : new Map(Object.entries(values));\n return v;\n }\n\n static bytes(value: Uint8Array | Buffer): GQLValue {\n const v = new GQLValue('BYTEA');\n v._bytesValue = value instanceof Uint8Array ? value : new Uint8Array(value);\n return v;\n }\n\n static date(value: Date): GQLValue {\n const v = new GQLValue('DATE');\n v._dateValue = value;\n return v;\n }\n\n static time(value: Date): GQLValue {\n const v = new GQLValue('TIME');\n v._dateValue = value;\n return v;\n }\n\n static timestamp(value: Date): GQLValue {\n const v = new GQLValue('TIMESTAMP');\n v._dateValue = value;\n return v;\n }\n\n static uuid(value: string): GQLValue {\n const v = new GQLValue('UUID');\n v._stringValue = value;\n return v;\n }\n\n static json(value: unknown): GQLValue {\n const v = new GQLValue('JSON');\n v._rawValue = value;\n return v;\n }\n\n static node(value: GQLNode): GQLValue {\n const v = new GQLValue('NODE');\n v._nodeValue = value;\n return v;\n }\n\n static edge(value: GQLEdge): GQLValue {\n const v = new GQLValue('EDGE');\n v._edgeValue = value;\n return v;\n }\n\n static path(value: GQLPath): GQLValue {\n const v = new GQLValue('PATH');\n v._pathValue = value;\n return v;\n }\n\n static range<T>(value: GQLRange<T>): GQLValue {\n const v = new GQLValue('RANGE');\n v._rangeValue = value as GQLRange;\n return v;\n }\n\n static unknown(value: unknown): GQLValue {\n const v = new GQLValue('UNKNOWN');\n v._rawValue = value;\n return v;\n }\n\n // Type-safe accessors\n get isNull(): boolean {\n return this.kind === 'NULL';\n }\n\n get asBool(): boolean {\n if (this.kind !== 'BOOL') {\n throw new TypeError(`Cannot convert ${this.kind} to boolean`);\n }\n return this._boolValue;\n }\n\n get asInt(): bigint {\n if (this.kind !== 'INT') {\n throw new TypeError(`Cannot convert ${this.kind} to int`);\n }\n return this._intValue;\n }\n\n get asNumber(): number {\n if (this.kind === 'INT') {\n return Number(this._intValue);\n }\n if (this.kind === 'FLOAT') {\n return this._floatValue;\n }\n if (this.kind === 'DECIMAL') {\n return this._decimalValue?.toNumber() ?? 0;\n }\n throw new TypeError(`Cannot convert ${this.kind} to number`);\n }\n\n get asFloat(): number {\n if (this.kind !== 'FLOAT') {\n throw new TypeError(`Cannot convert ${this.kind} to float`);\n }\n return this._floatValue;\n }\n\n get asString(): string {\n if (this.kind === 'STRING' || this.kind === 'UUID') {\n return this._stringValue;\n }\n // Allow stringification of other types\n return this.toString();\n }\n\n get asDecimal(): Decimal {\n if (this.kind !== 'DECIMAL') {\n throw new TypeError(`Cannot convert ${this.kind} to decimal`);\n }\n return this._decimalValue!;\n }\n\n get asArray(): GQLValue[] {\n if (this.kind !== 'ARRAY') {\n throw new TypeError(`Cannot convert ${this.kind} to array`);\n }\n return this._arrayValue;\n }\n\n get asObject(): Map<string, GQLValue> {\n if (this.kind !== 'OBJECT' && this.kind !== 'NODE' && this.kind !== 'EDGE') {\n throw new TypeError(`Cannot convert ${this.kind} to object`);\n }\n return this._objectValue;\n }\n\n get asBytes(): Uint8Array {\n if (this.kind !== 'BYTEA') {\n throw new TypeError(`Cannot convert ${this.kind} to bytes`);\n }\n return this._bytesValue;\n }\n\n get asDate(): Date {\n if (\n this.kind !== 'DATE' &&\n this.kind !== 'TIME' &&\n this.kind !== 'TIMETZ' &&\n this.kind !== 'TIMESTAMP' &&\n this.kind !== 'TIMESTAMPTZ'\n ) {\n throw new TypeError(`Cannot convert ${this.kind} to date`);\n }\n return this._dateValue!;\n }\n\n get asNode(): GQLNode {\n if (this.kind !== 'NODE') {\n throw new TypeError(`Cannot convert ${this.kind} to node`);\n }\n return this._nodeValue!;\n }\n\n get asEdge(): GQLEdge {\n if (this.kind !== 'EDGE') {\n throw new TypeError(`Cannot convert ${this.kind} to edge`);\n }\n return this._edgeValue!;\n }\n\n get asPath(): GQLPath {\n if (this.kind !== 'PATH') {\n throw new TypeError(`Cannot convert ${this.kind} to path`);\n }\n return this._pathValue!;\n }\n\n get asRange(): GQLRange {\n if (this.kind !== 'RANGE') {\n throw new TypeError(`Cannot convert ${this.kind} to range`);\n }\n return this._rangeValue!;\n }\n\n get asJSON(): unknown {\n if (this.kind !== 'JSON' && this.kind !== 'JSONB') {\n throw new TypeError(`Cannot convert ${this.kind} to JSON`);\n }\n return this._rawValue;\n }\n\n get raw(): unknown {\n return this._rawValue;\n }\n\n toString(): string {\n switch (this.kind) {\n case 'NULL':\n return 'null';\n case 'BOOL':\n return this._boolValue.toString();\n case 'INT':\n return this._intValue.toString();\n case 'FLOAT':\n return this._floatValue.toString();\n case 'STRING':\n case 'UUID':\n return this._stringValue;\n case 'DECIMAL':\n return this._decimalValue?.toString() ?? '0';\n case 'ARRAY':\n return `[${this._arrayValue.map((v) => v.toString()).join(', ')}]`;\n case 'OBJECT':\n return `{${[...this._objectValue.entries()]\n .map(([k, v]) => `${k}: ${v.toString()}`)\n .join(', ')}}`;\n case 'BYTEA':\n return `<bytes:${this._bytesValue.length}>`;\n case 'DATE':\n case 'TIME':\n case 'TIMETZ':\n case 'TIMESTAMP':\n case 'TIMESTAMPTZ':\n return this._dateValue?.toISOString() ?? '';\n case 'NODE':\n return `(${this._nodeValue?.labels.join(':')} {${JSON.stringify(this._nodeValue?.properties)}})`;\n case 'EDGE':\n return `[${this._edgeValue?.type} {${JSON.stringify(this._edgeValue?.properties)}}]`;\n case 'PATH':\n return `<path:${this._pathValue?.nodes.length} nodes>`;\n case 'JSON':\n case 'JSONB':\n return JSON.stringify(this._rawValue);\n default:\n // Fallback for unknown types - safe to stringify\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n return String(this._rawValue ?? '');\n }\n }\n\n /**\n * Convert to a plain JavaScript value.\n */\n toJS(): unknown {\n switch (this.kind) {\n case 'NULL':\n return null;\n case 'BOOL':\n return this._boolValue;\n case 'INT':\n // Return number if safe, bigint otherwise\n if (\n this._intValue >= Number.MIN_SAFE_INTEGER &&\n this._intValue <= Number.MAX_SAFE_INTEGER\n ) {\n return Number(this._intValue);\n }\n return this._intValue;\n case 'FLOAT':\n return this._floatValue;\n case 'STRING':\n case 'UUID':\n return this._stringValue;\n case 'DECIMAL':\n return this._decimalValue?.toString();\n case 'ARRAY':\n return this._arrayValue.map((v) => v.toJS());\n case 'OBJECT':\n return Object.fromEntries([...this._objectValue.entries()].map(([k, v]) => [k, v.toJS()]));\n case 'BYTEA':\n return this._bytesValue;\n case 'DATE':\n case 'TIME':\n case 'TIMETZ':\n case 'TIMESTAMP':\n case 'TIMESTAMPTZ':\n return this._dateValue;\n case 'NODE':\n return this._nodeValue;\n case 'EDGE':\n return this._edgeValue;\n case 'PATH':\n return this._pathValue;\n case 'RANGE':\n return this._rangeValue;\n case 'JSON':\n case 'JSONB':\n return this._rawValue;\n default:\n return this._rawValue;\n }\n }\n\n /**\n * Convert to JSON-serializable format.\n */\n toJSON(): unknown {\n return this.toJS();\n }\n}\n\n/**\n * Parse a GQL type string to GQLValueKind.\n */\nexport function parseGQLType(typeStr: string): GQLValueKind {\n const upper = typeStr.toUpperCase();\n switch (upper) {\n case 'INT':\n case 'INTEGER':\n case 'BIGINT':\n case 'INT8':\n case 'INT16':\n case 'INT32':\n case 'INT64':\n case 'UINT8':\n case 'UINT16':\n case 'UINT32':\n case 'UINT64':\n case 'SMALLINT':\n case 'TINYINT':\n return 'INT';\n case 'FLOAT':\n case 'DOUBLE':\n case 'REAL':\n case 'FLOAT32':\n case 'FLOAT64':\n return 'FLOAT';\n case 'DECIMAL':\n case 'NUMERIC':\n return 'DECIMAL';\n case 'STRING':\n case 'VARCHAR':\n case 'TEXT':\n return 'STRING';\n case 'BOOL':\n case 'BOOLEAN':\n return 'BOOL';\n case 'NULL':\n return 'NULL';\n case 'LIST':\n case 'ARRAY':\n return 'ARRAY';\n case 'MAP':\n case 'RECORD':\n case 'OBJECT':\n return 'OBJECT';\n case 'NODE':\n return 'NODE';\n case 'EDGE':\n case 'RELATIONSHIP':\n return 'EDGE';\n case 'PATH':\n return 'PATH';\n case 'BYTEA':\n case 'BINARY':\n return 'BYTEA';\n case 'DATE':\n return 'DATE';\n case 'TIME':\n return 'TIME';\n case 'TIMETZ':\n case 'TIME WITH TIME ZONE':\n return 'TIMETZ';\n case 'TIMESTAMP':\n return 'TIMESTAMP';\n case 'TIMESTAMPTZ':\n case 'TIMESTAMP WITH TIME ZONE':\n return 'TIMESTAMPTZ';\n case 'INTERVAL':\n return 'INTERVAL';\n case 'JSON':\n return 'JSON';\n case 'JSONB':\n return 'JSONB';\n case 'XML':\n return 'XML';\n case 'UUID':\n return 'UUID';\n case 'URL':\n return 'URL';\n case 'DOMAIN':\n return 'DOMAIN';\n case 'ENUM':\n return 'ENUM';\n case 'BIT':\n case 'VARBIT':\n return 'BIT_STRING';\n default:\n if (upper.includes('RANGE')) {\n return 'RANGE';\n }\n return 'UNKNOWN';\n }\n}\n\n/**\n * Convert a JSON value from the server to a GQLValue.\n */\nexport function fromJSON(value: unknown, typeHint?: GQLValueKind): GQLValue {\n if (value === null || value === undefined) {\n return GQLValue.null();\n }\n\n // If we have a type hint, use it\n if (typeHint) {\n return convertWithType(value, typeHint);\n }\n\n // Infer type from value\n if (typeof value === 'boolean') {\n return GQLValue.bool(value);\n }\n\n if (typeof value === 'number') {\n if (Number.isInteger(value)) {\n return GQLValue.int(value);\n }\n return GQLValue.float(value);\n }\n\n if (typeof value === 'bigint') {\n return GQLValue.int(value);\n }\n\n if (typeof value === 'string') {\n // Check for UUID pattern\n if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value)) {\n return GQLValue.uuid(value);\n }\n // Check for ISO date\n if (/^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2})?/.test(value)) {\n const date = new Date(value);\n if (!isNaN(date.getTime())) {\n return GQLValue.timestamp(date);\n }\n }\n return GQLValue.string(value);\n }\n\n if (Array.isArray(value)) {\n return GQLValue.array(value.map((v) => fromJSON(v)));\n }\n\n if (typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n\n // Check for node structure\n if ('id' in obj && 'labels' in obj && 'properties' in obj) {\n return GQLValue.node(obj as unknown as GQLNode);\n }\n\n // Check for edge structure (supports both startNode/endNode and from/to formats)\n if ('id' in obj && 'type' in obj) {\n const hasStartEnd = 'startNode' in obj && 'endNode' in obj;\n const hasFromTo = 'from' in obj && 'to' in obj;\n\n if (hasStartEnd || hasFromTo) {\n // Normalize to startNode/endNode format\n const rawEdge = obj as unknown as RawEdge;\n const normalizedEdge: GQLEdge = {\n id: rawEdge.id,\n type: rawEdge.type,\n startNode: rawEdge.startNode ?? rawEdge.from ?? '',\n endNode: rawEdge.endNode ?? rawEdge.to ?? '',\n properties: rawEdge.properties ?? {},\n };\n return GQLValue.edge(normalizedEdge);\n }\n }\n\n // Check for path structure\n if ('nodes' in obj && 'edges' in obj && Array.isArray(obj.nodes)) {\n return GQLValue.path(obj as unknown as GQLPath);\n }\n\n // Generic object\n const map = new Map<string, GQLValue>();\n for (const [k, v] of Object.entries(obj)) {\n map.set(k, fromJSON(v));\n }\n return GQLValue.object(map);\n }\n\n return GQLValue.unknown(value);\n}\n\n/**\n * Convert a value with a known type hint.\n */\nfunction convertWithType(value: unknown, type: GQLValueKind): GQLValue {\n switch (type) {\n case 'NULL':\n return GQLValue.null();\n case 'BOOL':\n // Handle string booleans from server\n if (typeof value === 'string') {\n const lower = value.toLowerCase();\n return GQLValue.bool(lower === 'true' || lower === '1' || lower === 't');\n }\n return GQLValue.bool(Boolean(value));\n case 'INT':\n if (typeof value === 'number') {\n return GQLValue.int(value);\n }\n if (typeof value === 'bigint') {\n return GQLValue.int(value);\n }\n if (typeof value === 'string') {\n // Handle empty string or non-numeric gracefully\n const trimmed = value.trim();\n if (trimmed === '' || isNaN(Number(trimmed))) {\n return GQLValue.int(0);\n }\n return GQLValue.int(BigInt(trimmed));\n }\n return GQLValue.int(0);\n case 'FLOAT':\n return GQLValue.float(Number(value));\n case 'DECIMAL':\n return GQLValue.decimal(String(value));\n case 'STRING':\n // If the value is actually a different type (not a string), infer type from value\n // This handles cases where server reports \"text\" but sends typed values\n if (typeof value !== 'string') {\n return fromJSON(value);\n }\n return GQLValue.string(value);\n case 'UUID':\n return GQLValue.uuid(String(value));\n case 'BYTEA':\n if (value instanceof Uint8Array) {\n return GQLValue.bytes(value);\n }\n if (typeof value === 'string') {\n return GQLValue.bytes(Buffer.from(value, 'base64'));\n }\n return GQLValue.bytes(new Uint8Array());\n case 'DATE':\n return GQLValue.date(value instanceof Date ? value : new Date(String(value)));\n case 'TIME':\n case 'TIMETZ':\n return GQLValue.time(value instanceof Date ? value : new Date(String(value)));\n case 'TIMESTAMP':\n case 'TIMESTAMPTZ':\n return GQLValue.timestamp(value instanceof Date ? value : new Date(String(value)));\n case 'JSON':\n case 'JSONB':\n return GQLValue.json(value);\n case 'ARRAY':\n if (Array.isArray(value)) {\n return GQLValue.array(value.map((v) => fromJSON(v)));\n }\n // Handle JSON string arrays from server\n if (typeof value === 'string') {\n try {\n const parsed: unknown = JSON.parse(value);\n if (Array.isArray(parsed)) {\n return GQLValue.array(parsed.map((v: unknown) => fromJSON(v)));\n }\n } catch {\n // Not valid JSON, return empty array\n }\n }\n return GQLValue.array([]);\n case 'OBJECT':\n // Handle JSON string objects from server\n if (typeof value === 'string') {\n try {\n const parsed: unknown = JSON.parse(value);\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return fromJSON(parsed);\n }\n } catch {\n // Not valid JSON\n }\n }\n return fromJSON(value);\n case 'NODE':\n return GQLValue.node(value as GQLNode);\n case 'EDGE': {\n // Normalize edge format (supports both startNode/endNode and from/to)\n const rawEdge = value as RawEdge;\n const normalizedEdge: GQLEdge = {\n id: rawEdge.id,\n type: rawEdge.type,\n startNode: rawEdge.startNode ?? rawEdge.from ?? '',\n endNode: rawEdge.endNode ?? rawEdge.to ?? '',\n properties: rawEdge.properties ?? {},\n };\n return GQLValue.edge(normalizedEdge);\n }\n case 'PATH':\n return GQLValue.path(value as GQLPath);\n default:\n return fromJSON(value);\n }\n}\n\n/**\n * Column definition from SCHEMA response.\n */\nexport interface ColumnDef {\n name: string;\n type: GQLType;\n}\n\n/**\n * Column metadata with parsed type.\n */\nexport interface ColumnInfo {\n name: string;\n type: GQLType;\n kind: GQLValueKind;\n}\n\n/**\n * Query result row.\n */\nexport type Row = Map<string, GQLValue>;\n\n/**\n * Convert raw row data to typed Row.\n */\nexport function parseRow(raw: Record<string, unknown>, columns: ColumnInfo[]): Row {\n const row = new Map<string, GQLValue>();\n for (const col of columns) {\n const value = raw[col.name];\n row.set(col.name, fromJSON(value, col.kind));\n }\n return row;\n}\n\n/**\n * Dangerous keys that could lead to prototype pollution if allowed.\n * These keys are rejected when converting rows to objects.\n */\nconst DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/**\n * Check if a key is safe for object property assignment.\n * Rejects keys that could lead to prototype pollution.\n */\nexport function isSafeObjectKey(key: string): boolean {\n return !DANGEROUS_KEYS.has(key);\n}\n\n/**\n * Convert Row to plain object.\n *\n * Security: Uses Object.create(null) to create a prototype-free object\n * and rejects dangerous keys (__proto__, constructor, prototype) that\n * could lead to prototype pollution attacks.\n *\n * @throws {Error} If a row contains a dangerous key\n */\nexport function rowToObject(row: Row): Record<string, unknown> {\n // GAP #17: Use Object.create(null) for prototype-free object\n const obj = Object.create(null) as Record<string, unknown>;\n for (const [key, value] of row) {\n // GAP #17: Reject dangerous keys to prevent prototype pollution\n if (!isSafeObjectKey(key)) {\n throw new Error(\n `Row contains dangerous key that could cause prototype pollution: column names like '__proto__', 'constructor', or 'prototype' are not allowed`\n );\n }\n obj[key] = value.toJS();\n }\n return obj;\n}\n","/**\n * Prepared Statements\n *\n * Support for parameterized query preparation and efficient repeated execution.\n */\n\nimport type { Connection, QueryOptions, QueryParams } from './connection.js';\nimport type { QueryResult } from './result.js';\nimport { SecurityError, StateError } from './errors.js';\nimport { validateQuery, validateParamName, validateParamValue } from './validate.js';\n\n/**\n * Parameter metadata extracted from a query.\n */\nexport interface ParameterInfo {\n /** Parameter name */\n name: string;\n /** Position in the query (1-indexed) */\n position: number;\n /** Whether this is a positional parameter (?) */\n positional: boolean;\n}\n\n/**\n * Prepared statement for efficient repeated execution.\n *\n * Prepared statements parse the query once and allow multiple executions\n * with different parameter values.\n *\n * @example\n * ```typescript\n * const stmt = conn.prepare('MATCH (n:Person {name: $name}) RETURN n');\n *\n * // Execute with different parameters\n * const result1 = await stmt.query({ name: 'Alice' });\n * const result2 = await stmt.query({ name: 'Bob' });\n *\n * // Close when done\n * stmt.close();\n * ```\n */\nexport class PreparedStatement {\n private _conn: Connection;\n private _query: string;\n private _parameters: ParameterInfo[];\n private _closed = false;\n\n /**\n * Create a new prepared statement.\n *\n * @internal Use Connection.prepare() instead.\n */\n constructor(conn: Connection, query: string) {\n validateQuery(query);\n\n this._conn = conn;\n this._query = query;\n this._parameters = extractParameters(query);\n }\n\n /**\n * Get the query text.\n */\n get query(): string {\n return this._query;\n }\n\n /**\n * Get parameter information.\n */\n get parameters(): ReadonlyArray<ParameterInfo> {\n return this._parameters;\n }\n\n /**\n * Get the number of parameters.\n */\n get parameterCount(): number {\n return this._parameters.length;\n }\n\n /**\n * Get positional parameter count (number of ? placeholders).\n */\n get positionalCount(): number {\n return this._parameters.filter((p) => p.positional).length;\n }\n\n /**\n * Get named parameter names.\n */\n get namedParameters(): string[] {\n return this._parameters.filter((p) => !p.positional).map((p) => p.name);\n }\n\n /**\n * Check if the statement is closed.\n */\n get isClosed(): boolean {\n return this._closed;\n }\n\n /**\n * Execute the prepared statement and return results.\n *\n * @param params - Parameter values (object for named, array for positional)\n * @param options - Additional query options\n * @returns Query result\n */\n async execute(\n params?: QueryParams | unknown[],\n options?: Omit<QueryOptions, 'params'>\n ): Promise<QueryResult> {\n this.checkClosed();\n\n const resolvedParams = this.resolveParams(params);\n return this._conn.query(this._query, { ...options, params: resolvedParams });\n }\n\n /**\n * Execute the prepared statement and return all rows.\n *\n * @param params - Parameter values\n * @param options - Additional query options\n * @returns Array of row objects\n */\n async executeAll(\n params?: QueryParams | unknown[],\n options?: Omit<QueryOptions, 'params'>\n ): Promise<Record<string, unknown>[]> {\n this.checkClosed();\n\n const resolvedParams = this.resolveParams(params);\n return this._conn.queryAll(this._query, { ...options, params: resolvedParams });\n }\n\n /**\n * Execute the prepared statement without returning results.\n *\n * @param params - Parameter values\n * @param options - Additional query options\n */\n async exec(\n params?: QueryParams | unknown[],\n options?: Omit<QueryOptions, 'params'>\n ): Promise<void> {\n this.checkClosed();\n\n const resolvedParams = this.resolveParams(params);\n return this._conn.exec(this._query, { ...options, params: resolvedParams });\n }\n\n /**\n * Validate parameters without executing.\n *\n * @param params - Parameter values to validate\n * @throws SecurityError if validation fails\n */\n validate(params?: QueryParams | unknown[]): void {\n this.checkClosed();\n this.resolveParams(params); // Will throw on validation errors\n }\n\n /**\n * Close the prepared statement.\n *\n * After closing, the statement cannot be executed.\n */\n close(): void {\n this._closed = true;\n }\n\n /**\n * Resolve and validate parameters.\n */\n private resolveParams(params?: QueryParams | unknown[]): QueryParams {\n // Handle no parameters\n if (!params) {\n if (this._parameters.length > 0) {\n throw new SecurityError({\n type: 'validation',\n message: `Expected ${this._parameters.length} parameters, got 0`,\n });\n }\n return {};\n }\n\n // Handle array of positional parameters\n if (Array.isArray(params)) {\n const positionalCount = this.positionalCount;\n if (params.length !== positionalCount) {\n throw new SecurityError({\n type: 'validation',\n message: `Expected ${positionalCount} positional parameters, got ${params.length}`,\n });\n }\n\n // Convert to named parameters\n const namedParams: QueryParams = {};\n let posIndex = 0;\n for (const p of this._parameters) {\n if (p.positional) {\n namedParams[p.name] = params[posIndex];\n validateParamValue(params[posIndex]);\n posIndex++;\n }\n }\n\n return namedParams;\n }\n\n // Handle named parameters\n const namedParams = params;\n\n // Validate all required parameters are present\n for (const p of this._parameters) {\n if (!p.positional && !(p.name in namedParams)) {\n throw new SecurityError({\n type: 'validation',\n message: `Missing required parameter: ${p.name}`,\n });\n }\n }\n\n // Validate parameter values\n for (const [key, value] of Object.entries(namedParams)) {\n validateParamName(key);\n validateParamValue(value);\n }\n\n return namedParams;\n }\n\n /**\n * Check if statement is closed.\n */\n private checkClosed(): void {\n if (this._closed) {\n throw new StateError({\n currentState: 'closed',\n operation: 'execute',\n message: 'PreparedStatement is closed',\n });\n }\n }\n}\n\n/**\n * Extract parameter information from a query string.\n *\n * Supports both positional (?) and named ($name) parameters.\n */\nexport function extractParameters(query: string): ParameterInfo[] {\n const params: ParameterInfo[] = [];\n let i = 0;\n let position = 0;\n\n while (i < query.length) {\n const ch = query[i];\n\n // Skip string literals\n if (ch === \"'\" || ch === '\"') {\n const quote = ch;\n i++;\n while (i < query.length && query[i] !== quote) {\n if (query[i] === '\\\\') {\n i++;\n }\n i++;\n }\n i++;\n continue;\n }\n\n // Skip comments\n if (ch === '/' && i + 1 < query.length && query[i + 1] === '/') {\n while (i < query.length && query[i] !== '\\n') {\n i++;\n }\n continue;\n }\n\n if (ch === '/' && i + 1 < query.length && query[i + 1] === '*') {\n i += 2;\n while (i + 1 < query.length && !(query[i] === '*' && query[i + 1] === '/')) {\n i++;\n }\n i += 2;\n continue;\n }\n\n // Positional parameter\n if (ch === '?') {\n position++;\n params.push({\n name: `p${position}`,\n position,\n positional: true,\n });\n i++;\n continue;\n }\n\n // Named parameter\n if (ch === '$') {\n i++;\n let name = '';\n while (i < query.length && /[a-zA-Z0-9_]/.test(query[i] ?? '')) {\n name += query[i];\n i++;\n }\n if (name) {\n position++;\n // Check if we already have this parameter\n const existing = params.find((p) => p.name === name);\n if (!existing) {\n params.push({\n name,\n position,\n positional: false,\n });\n }\n }\n continue;\n }\n\n i++;\n }\n\n return params;\n}\n\n/**\n * Create a prepared statement from a query string.\n *\n * @param conn - Connection to use\n * @param query - Query text\n * @returns Prepared statement\n */\nexport function prepare(conn: Connection, query: string): PreparedStatement {\n return new PreparedStatement(conn, query);\n}\n","/**\n * Query Explain and Profile\n *\n * Support for query plan analysis and execution profiling using protobuf protocol.\n */\n\nimport type { Connection, QueryOptions } from './connection.js';\nimport { validateQuery, validateParamValue } from './validate.js';\nimport { DriverError, TransportError, StatusClass } from './errors.js';\nimport {\n buildExecuteRequest,\n type ExecutionResponse,\n type ExplainPayload,\n type ProfilePayload,\n} from './proto.js';\n\n/**\n * A single operation in a query plan.\n */\nexport interface PlanOperation {\n /** Operation type (e.g., 'NodeScan', 'Filter', 'Expand') */\n type: string;\n /** Optional operator name */\n operator?: string;\n /** Estimated cost */\n cost?: number;\n /** Estimated rows */\n rows?: number;\n /** Details about the operation */\n details?: Record<string, unknown>;\n /** Child operations */\n children?: PlanOperation[];\n}\n\n/**\n * Query execution plan.\n */\nexport interface QueryPlan {\n /** Root operation */\n root: PlanOperation;\n /** Total estimated cost */\n totalCost?: number;\n /** Total estimated rows */\n totalRows?: number;\n /** Raw plan data from server */\n raw: unknown;\n}\n\n/**\n * Timing information for profiled operations.\n */\nexport interface OperationTiming {\n /** Operation type */\n type: string;\n /** Wall clock time in milliseconds */\n wallTimeMs: number;\n /** CPU time in milliseconds */\n cpuTimeMs?: number;\n /** Actual rows produced */\n rows?: number;\n /** Number of database page hits */\n pageHits?: number;\n /** Number of database page faults */\n pageFaults?: number;\n /** Child operation timings */\n children?: OperationTiming[];\n}\n\n/**\n * Query execution profile.\n */\nexport interface QueryProfile {\n /** Root operation timing */\n root: OperationTiming;\n /** Total execution time in milliseconds */\n totalTimeMs: number;\n /** Total rows processed */\n totalRows?: number;\n /** Planning time in milliseconds */\n planningTimeMs?: number;\n /** Execution time in milliseconds */\n executionTimeMs?: number;\n /** Memory used in bytes */\n memoryBytes?: number;\n /** Raw profile data from server */\n raw: unknown;\n}\n\n/**\n * Options for explain/profile operations.\n */\nexport interface ExplainOptions extends Omit<QueryOptions, 'pageSize'> {\n /** Include verbose details */\n verbose?: boolean;\n /** Analyze query costs */\n analyze?: boolean;\n}\n\n/**\n * Parse plan data from ExplainPayload.\n */\nfunction parseExplainPayload(payload: ExplainPayload): PlanOperation {\n const ops = payload.ops ?? [];\n if (ops.length === 0) {\n return { type: 'Unknown', details: { schema: payload.schema } };\n }\n\n // Build operation tree\n const root: PlanOperation = {\n type: 'Query',\n details: { schema: payload.schema },\n children: ops.map((op: unknown) => {\n const opObj = op as Record<string, unknown>;\n return {\n type: (opObj['kind'] as string) || 'Unknown',\n cost: opObj['cost'] as number | undefined,\n rows: opObj['est_rows'] as number | undefined,\n details: { idx: opObj['idx'] },\n };\n }),\n };\n\n return root;\n}\n\n/**\n * Parse profile data from ProfilePayload.\n */\nfunction parseProfilePayload(payload: ProfilePayload): OperationTiming {\n const ops = payload.ops ?? [];\n if (ops.length === 0) {\n return { type: 'Unknown', wallTimeMs: 0 };\n }\n\n // Build timing tree\n const children: OperationTiming[] = ops.map((op: unknown) => {\n const opObj = op as Record<string, unknown>;\n return {\n type: (opObj['op'] as string) || 'Unknown',\n wallTimeMs: Number(opObj['time_ns'] ?? 0) / 1_000_000,\n cpuTimeMs: Number(opObj['cpu_time_ns'] ?? 0) / 1_000_000,\n rows: Number(opObj['rows'] ?? 0),\n };\n });\n\n return {\n type: 'Query',\n wallTimeMs: Number(payload.totalTimeNs ?? 0) / 1_000_000,\n children,\n };\n}\n\n/**\n * Get the query execution plan without executing.\n */\nexport async function explain(\n conn: Connection,\n query: string,\n options?: ExplainOptions\n): Promise<QueryPlan> {\n validateQuery(query);\n\n const params = options?.params ?? {};\n\n // Validate parameters\n for (const [_key, value] of Object.entries(params)) {\n validateParamValue(value);\n }\n\n // Build EXPLAIN query\n const explainQuery = options?.verbose ? `EXPLAIN VERBOSE ${query}` : `EXPLAIN ${query}`;\n\n // Access private transport through connection\n const connInternal = conn as unknown as {\n _transport: {\n sendProto: (msg: unknown, signal?: AbortSignal) => Promise<void>;\n receiveProto: (signal?: AbortSignal) => Promise<{ execute?: ExecutionResponse }>;\n };\n _sessionId: string;\n };\n\n const msg = buildExecuteRequest(connInternal._sessionId, explainQuery, params);\n await connInternal._transport.sendProto(msg, options?.signal);\n\n const response = await connInternal._transport.receiveProto(options?.signal);\n\n if (!response.execute) {\n throw new TransportError({\n operation: 'explain',\n cause: new Error('Invalid execute response'),\n });\n }\n\n const execResp = response.execute;\n\n if (execResp.error) {\n throw new DriverError({\n statusClass: (execResp.status?.statusClass ??\n StatusClass.SYSTEM) as typeof StatusClass.SYSTEM,\n subclass: '000',\n code: execResp.error.code ?? 'UnknownError',\n message: execResp.error.message ?? 'Unknown error',\n anchor: execResp.error.anchor,\n });\n }\n\n // Check for EXPLAIN response\n if (execResp.explain) {\n const payload = execResp.explain;\n const root = parseExplainPayload(payload);\n\n return {\n root,\n totalCost: payload.totals?.cost,\n totalRows: payload.totals?.est_rows,\n raw: payload,\n };\n }\n\n // Fallback: return raw data as plan\n return {\n root: { type: 'Unknown', details: { response: execResp } },\n raw: execResp,\n };\n}\n\n/**\n * Execute a query with profiling and return execution statistics.\n */\nexport async function profile(\n conn: Connection,\n query: string,\n options?: ExplainOptions\n): Promise<QueryProfile> {\n validateQuery(query);\n\n const params = options?.params ?? {};\n\n // Validate parameters\n for (const [_key, value] of Object.entries(params)) {\n validateParamValue(value);\n }\n\n // Build PROFILE query\n const profileQuery = options?.verbose ? `PROFILE VERBOSE ${query}` : `PROFILE ${query}`;\n\n // Access private transport through connection\n const connInternal = conn as unknown as {\n _transport: {\n sendProto: (msg: unknown, signal?: AbortSignal) => Promise<void>;\n receiveProto: (signal?: AbortSignal) => Promise<{ execute?: ExecutionResponse }>;\n };\n _sessionId: string;\n };\n\n const msg = buildExecuteRequest(connInternal._sessionId, profileQuery, params);\n await connInternal._transport.sendProto(msg, options?.signal);\n\n const response = await connInternal._transport.receiveProto(options?.signal);\n\n if (!response.execute) {\n throw new TransportError({\n operation: 'profile',\n cause: new Error('Invalid execute response'),\n });\n }\n\n const execResp = response.execute;\n\n if (execResp.error) {\n throw new DriverError({\n statusClass: (execResp.status?.statusClass ??\n StatusClass.SYSTEM) as typeof StatusClass.SYSTEM,\n subclass: '000',\n code: execResp.error.code ?? 'UnknownError',\n message: execResp.error.message ?? 'Unknown error',\n anchor: execResp.error.anchor,\n });\n }\n\n // Check for PROFILE response\n if (execResp.profile) {\n const payload = execResp.profile;\n const root = parseProfilePayload(payload);\n\n return {\n root,\n totalTimeMs: Number(payload.totalTimeNs ?? 0) / 1_000_000,\n totalRows: root.rows,\n memoryBytes: Number(payload.memory?.peakBytes ?? 0),\n raw: payload,\n };\n }\n\n // Fallback: return minimal profile\n return {\n root: { type: 'Unknown', wallTimeMs: 0 },\n totalTimeMs: 0,\n raw: execResp,\n };\n}\n\n/**\n * Format a query plan as a human-readable string.\n */\nexport function formatPlan(plan: QueryPlan, indent = 0): string {\n const lines: string[] = [];\n\n function formatOp(op: PlanOperation, depth: number): void {\n const prefix = ' '.repeat(depth);\n let line = `${prefix}${op.type}`;\n if (op.operator && op.operator !== op.type) {\n line += ` (${op.operator})`;\n }\n if (op.cost !== undefined) {\n line += ` cost=${op.cost.toFixed(2)}`;\n }\n if (op.rows !== undefined) {\n line += ` rows=${op.rows}`;\n }\n lines.push(line);\n\n if (op.details && Object.keys(op.details).length > 0) {\n for (const [key, value] of Object.entries(op.details)) {\n lines.push(`${prefix} ${key}: ${JSON.stringify(value)}`);\n }\n }\n\n if (op.children) {\n for (const child of op.children) {\n formatOp(child, depth + 1);\n }\n }\n }\n\n formatOp(plan.root, indent);\n\n if (plan.totalCost !== undefined) {\n lines.push(`Total Cost: ${plan.totalCost.toFixed(2)}`);\n }\n if (plan.totalRows !== undefined) {\n lines.push(`Estimated Rows: ${plan.totalRows}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format a query profile as a human-readable string.\n */\nexport function formatProfile(prof: QueryProfile, indent = 0): string {\n const lines: string[] = [];\n\n function formatTiming(timing: OperationTiming, depth: number): void {\n const prefix = ' '.repeat(depth);\n let line = `${prefix}${timing.type}`;\n line += ` ${timing.wallTimeMs.toFixed(2)}ms`;\n if (timing.rows !== undefined) {\n line += ` ${timing.rows} rows`;\n }\n if (timing.pageHits !== undefined || timing.pageFaults !== undefined) {\n line += ` (hits=${timing.pageHits ?? 0}, faults=${timing.pageFaults ?? 0})`;\n }\n lines.push(line);\n\n if (timing.children) {\n for (const child of timing.children) {\n formatTiming(child, depth + 1);\n }\n }\n }\n\n formatTiming(prof.root, indent);\n\n lines.push('---');\n lines.push(`Total Time: ${prof.totalTimeMs.toFixed(2)}ms`);\n if (prof.planningTimeMs !== undefined) {\n lines.push(`Planning: ${prof.planningTimeMs.toFixed(2)}ms`);\n }\n if (prof.executionTimeMs !== undefined) {\n lines.push(`Execution: ${prof.executionTimeMs.toFixed(2)}ms`);\n }\n if (prof.totalRows !== undefined) {\n lines.push(`Rows: ${prof.totalRows}`);\n }\n if (prof.memoryBytes !== undefined) {\n lines.push(`Memory: ${formatBytes(prof.memoryBytes)}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format bytes as human-readable string.\n */\nfunction formatBytes(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let value = bytes;\n let unitIndex = 0;\n\n while (value >= 1024 && unitIndex < units.length - 1) {\n value /= 1024;\n unitIndex++;\n }\n\n return `${value.toFixed(2)} ${units[unitIndex]}`;\n}\n","/**\n * Batch Query Operations\n *\n * Support for executing multiple queries efficiently.\n */\n\nimport type { Connection, QueryParams } from './connection.js';\nimport { rowToObject } from './types.js';\n\n/**\n * A single query in a batch.\n */\nexport interface BatchQuery {\n /** Query text */\n query: string;\n /** Optional parameters */\n params?: QueryParams;\n}\n\n/**\n * Result of a batch query.\n */\nexport interface BatchResult {\n /** Index in the batch (0-based) */\n index: number;\n /** Query that was executed */\n query: string;\n /** Whether the query succeeded */\n success: boolean;\n /** Rows returned (if query was successful) */\n rows?: Record<string, unknown>[];\n /** Error (if query failed) */\n error?: Error;\n /** Execution time in milliseconds */\n durationMs?: number;\n}\n\n/**\n * Summary of batch execution.\n */\nexport interface BatchSummary {\n /** Total number of queries */\n total: number;\n /** Number of successful queries */\n successful: number;\n /** Number of failed queries */\n failed: number;\n /** Total execution time in milliseconds */\n totalDurationMs: number;\n /** Individual results */\n results: BatchResult[];\n}\n\n/**\n * Options for batch execution.\n */\nexport interface BatchOptions {\n /** Stop on first error (default: false) */\n stopOnError?: boolean;\n /** Maximum concurrent queries (default: 1 - sequential) */\n concurrency?: number;\n /** Abort signal for cancellation */\n signal?: AbortSignal;\n /** Page size for result fetching */\n pageSize?: number;\n /** Execute within a transaction (default: false) */\n transaction?: boolean;\n}\n\n/**\n * Execute multiple queries in a batch.\n *\n * By default, queries are executed sequentially and all results are collected.\n * Set stopOnError to true to abort on the first failure.\n *\n * @param conn - Connection to use\n * @param queries - Array of queries to execute\n * @param options - Batch execution options\n * @returns Batch execution summary\n *\n * @example\n * ```typescript\n * const summary = await batch(conn, [\n * { query: 'CREATE (a:Person {name: \"Alice\"})' },\n * { query: 'CREATE (b:Person {name: \"Bob\"})' },\n * { query: 'MATCH (n:Person) RETURN count(n) AS cnt' },\n * ]);\n *\n * console.log(`${summary.successful}/${summary.total} queries succeeded`);\n * ```\n */\nexport async function batch(\n conn: Connection,\n queries: BatchQuery[],\n options?: BatchOptions\n): Promise<BatchSummary> {\n const results: BatchResult[] = [];\n const startTime = Date.now();\n let successful = 0;\n let failed = 0;\n\n const stopOnError = options?.stopOnError ?? false;\n const inTransaction = options?.transaction ?? false;\n\n // Start transaction if requested\n let tx: { commit: () => Promise<void>; rollback: () => Promise<void> } | null = null;\n if (inTransaction) {\n tx = await conn.begin(options?.signal);\n }\n\n try {\n for (let i = 0; i < queries.length; i++) {\n // Check for cancellation\n if (options?.signal?.aborted) {\n // Mark remaining as failed\n for (let j = i; j < queries.length; j++) {\n const q = queries[j];\n results.push({\n index: j,\n query: q?.query ?? '',\n success: false,\n error: new Error('Batch execution cancelled'),\n });\n failed++;\n }\n break;\n }\n\n const q = queries[i];\n if (!q) continue;\n const queryStart = Date.now();\n\n try {\n const queryResult = await conn.query(q.query, {\n params: q.params,\n signal: options?.signal,\n pageSize: options?.pageSize,\n });\n\n // Collect all rows\n const rows: Record<string, unknown>[] = [];\n for await (const row of queryResult) {\n rows.push(rowToObject(row));\n }\n\n results.push({\n index: i,\n query: q.query,\n success: true,\n rows,\n durationMs: Date.now() - queryStart,\n });\n successful++;\n } catch (error) {\n results.push({\n index: i,\n query: q.query,\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs: Date.now() - queryStart,\n });\n failed++;\n\n if (stopOnError) {\n // Mark remaining as skipped\n for (let j = i + 1; j < queries.length; j++) {\n const skipped = queries[j];\n results.push({\n index: j,\n query: skipped?.query ?? '',\n success: false,\n error: new Error('Skipped due to previous error'),\n });\n failed++;\n }\n break;\n }\n }\n }\n\n // Commit transaction if successful\n if (tx && failed === 0) {\n await tx.commit();\n } else if (tx) {\n await tx.rollback();\n }\n } catch (error) {\n // Rollback on unexpected error\n if (tx) {\n try {\n await tx.rollback();\n } catch {\n // Ignore rollback errors\n }\n }\n throw error;\n }\n\n return {\n total: queries.length,\n successful,\n failed,\n totalDurationMs: Date.now() - startTime,\n results,\n };\n}\n\n/**\n * Execute multiple queries and return only successful results.\n *\n * Failed queries are silently ignored (but logged if a logger is provided).\n *\n * @param conn - Connection to use\n * @param queries - Array of queries to execute\n * @param options - Batch execution options\n * @returns Array of successful row results\n */\nexport async function batchAll(\n conn: Connection,\n queries: BatchQuery[],\n options?: BatchOptions\n): Promise<Record<string, unknown>[][]> {\n const summary = await batch(conn, queries, options);\n\n return summary.results\n .filter(\n (r): r is BatchResult & { rows: Record<string, unknown>[] } =>\n r.success && r.rows !== undefined\n )\n .map((r) => r.rows);\n}\n\n/**\n * Execute queries and return the first successful result.\n *\n * Useful for trying multiple query variants.\n *\n * @param conn - Connection to use\n * @param queries - Array of queries to try\n * @param options - Batch execution options\n * @returns First successful result or null\n */\nexport async function batchFirst(\n conn: Connection,\n queries: BatchQuery[],\n options?: Omit<BatchOptions, 'stopOnError'>\n): Promise<Record<string, unknown>[] | null> {\n for (const q of queries) {\n try {\n const rows = await conn.queryAll(q.query, {\n params: q.params,\n signal: options?.signal,\n pageSize: options?.pageSize,\n });\n return rows;\n } catch {\n // Try next query\n continue;\n }\n }\n return null;\n}\n\n/**\n * Execute a query for each item in an array.\n *\n * @param conn - Connection to use\n * @param queryTemplate - Query with $item parameter placeholder\n * @param items - Array of items to substitute\n * @param options - Batch execution options\n * @returns Batch summary\n *\n * @example\n * ```typescript\n * const summary = await batchMap(\n * conn,\n * 'CREATE (n:Person {name: $name})',\n * [{ name: 'Alice' }, { name: 'Bob' }]\n * );\n * ```\n */\nexport async function batchMap(\n conn: Connection,\n queryTemplate: string,\n items: QueryParams[],\n options?: BatchOptions\n): Promise<BatchSummary> {\n const queries: BatchQuery[] = items.map((params) => ({\n query: queryTemplate,\n params,\n }));\n\n return batch(conn, queries, options);\n}\n\n/**\n * Execute queries in parallel with limited concurrency.\n *\n * Unlike the sequential batch(), this executes multiple queries concurrently\n * up to the specified limit.\n *\n * Note: Results may be returned out of order.\n *\n * @param conn - Connection to use\n * @param queries - Array of queries to execute\n * @param options - Batch execution options with concurrency\n * @returns Batch summary (results in completion order)\n */\nexport async function batchParallel(\n conn: Connection,\n queries: BatchQuery[],\n options?: BatchOptions & { concurrency: number }\n): Promise<BatchSummary> {\n const concurrency = options?.concurrency ?? 5;\n const results: BatchResult[] = [];\n const startTime = Date.now();\n let successful = 0;\n let failed = 0;\n\n async function executeQuery(index: number): Promise<void> {\n const q = queries[index];\n if (!q) return;\n const queryStart = Date.now();\n\n try {\n const queryResult = await conn.query(q.query, {\n params: q.params,\n signal: options?.signal,\n pageSize: options?.pageSize,\n });\n\n const rows: Record<string, unknown>[] = [];\n for await (const row of queryResult) {\n rows.push(rowToObject(row));\n }\n\n results.push({\n index,\n query: q.query,\n success: true,\n rows,\n durationMs: Date.now() - queryStart,\n });\n successful++;\n } catch (error) {\n results.push({\n index,\n query: q.query,\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs: Date.now() - queryStart,\n });\n failed++;\n }\n }\n\n // Process queries with limited concurrency using a simple semaphore pattern\n const executing: Set<Promise<void>> = new Set();\n\n for (let i = 0; i < queries.length; i++) {\n if (options?.signal?.aborted) {\n break;\n }\n\n // Wait if we're at the concurrency limit\n while (executing.size >= concurrency) {\n await Promise.race(executing);\n }\n\n const promise = executeQuery(i).finally(() => {\n executing.delete(promise);\n });\n executing.add(promise);\n }\n\n // Wait for remaining queries to complete\n await Promise.all(executing);\n\n // Sort results by index for consistent output\n results.sort((a, b) => a.index - b.index);\n\n return {\n total: queries.length,\n successful,\n failed,\n totalDurationMs: Date.now() - startTime,\n results,\n };\n}\n","/**\n * Authentication and Authorization Client\n *\n * Support for user management, role-based access control, and row-level security.\n */\n\nimport type { Connection } from './connection.js';\nimport { SecurityError } from './errors.js';\nimport {\n validateLabel,\n validatePermissionAction,\n validatePermissionResource,\n validateRLSAction,\n validateRoleName,\n validateRLSPredicate,\n escapeGQLIdentifier,\n} from './validate.js';\n\n/**\n * User information.\n */\nexport interface User {\n /** Username */\n username: string;\n /** User roles */\n roles: string[];\n /** Whether the user is active */\n active: boolean;\n /** Creation timestamp */\n createdAt?: Date;\n /** Last login timestamp */\n lastLoginAt?: Date;\n /** User metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Role information.\n */\nexport interface Role {\n /** Role name */\n name: string;\n /** Role description */\n description?: string;\n /** Permissions granted to this role */\n permissions: Permission[];\n /** Whether the role is a system role */\n system?: boolean;\n}\n\n/**\n * Permission definition.\n */\nexport interface Permission {\n /** Resource type (e.g., 'NODE', 'EDGE', 'GRAPH') */\n resource: string;\n /** Action allowed (e.g., 'READ', 'WRITE', 'DELETE') */\n action: string;\n /** Optional label filter */\n label?: string;\n /** Optional property filters */\n properties?: string[];\n}\n\n/**\n * Row-Level Security (RLS) policy.\n */\nexport interface RLSPolicy {\n /** Policy name */\n name: string;\n /** Target label */\n label: string;\n /** Policy action ('READ', 'WRITE', 'ALL') */\n action: 'READ' | 'WRITE' | 'ALL';\n /** GQL predicate expression */\n predicate: string;\n /** Roles this policy applies to */\n roles?: string[];\n /** Whether the policy is enabled */\n enabled: boolean;\n}\n\n/**\n * Options for creating a user.\n */\nexport interface CreateUserOptions {\n /** Initial password */\n password: string;\n /** Roles to assign */\n roles?: string[];\n /** User metadata */\n metadata?: Record<string, unknown>;\n /** Whether to activate immediately */\n active?: boolean;\n}\n\n/**\n * Options for creating a role.\n */\nexport interface CreateRoleOptions {\n /** Role description */\n description?: string;\n /** Initial permissions */\n permissions?: Permission[];\n}\n\n/**\n * Options for creating an RLS policy.\n */\nexport interface CreateRLSPolicyOptions {\n /** Roles to apply policy to (empty = all roles) */\n roles?: string[];\n /** Whether to enable immediately */\n enabled?: boolean;\n}\n\n/**\n * Password policy configuration.\n */\nexport interface PasswordPolicy {\n /** Minimum password length (default: 8) */\n minLength?: number;\n /** Maximum password length (default: 256) */\n maxLength?: number;\n /** Require at least one uppercase letter */\n requireUppercase?: boolean;\n /** Require at least one lowercase letter */\n requireLowercase?: boolean;\n /** Require at least one digit */\n requireDigit?: boolean;\n /** Require at least one special character */\n requireSpecialChar?: boolean;\n /** Special characters to accept (default: !@#$%^&*()_+-=[]{}|;:,.<>?) */\n specialChars?: string;\n}\n\n/**\n * Default password policy.\n */\nexport const DEFAULT_PASSWORD_POLICY: Required<PasswordPolicy> = {\n minLength: 8,\n maxLength: 256,\n requireUppercase: false,\n requireLowercase: false,\n requireDigit: false,\n requireSpecialChar: false,\n specialChars: '!@#$%^&*()_+-=[]{}|;:,.<>?',\n};\n\n/**\n * Authentication and authorization client.\n *\n * Provides methods for managing users, roles, and row-level security policies.\n *\n * @example\n * ```typescript\n * const auth = new AuthClient(conn);\n *\n * // Create a user\n * await auth.createUser('alice', { password: 'secret123' });\n *\n * // Create a role\n * await auth.createRole('analyst', {\n * permissions: [{ resource: 'NODE', action: 'READ' }]\n * });\n *\n * // Assign role to user\n * await auth.assignRole('alice', 'analyst');\n * ```\n */\nexport class AuthClient {\n private _conn: Connection;\n private _passwordPolicy: Required<PasswordPolicy>;\n\n /**\n * Create a new auth client.\n *\n * @param conn - Connection to use\n * @param passwordPolicy - Optional password policy configuration\n */\n constructor(conn: Connection, passwordPolicy?: PasswordPolicy) {\n this._conn = conn;\n this._passwordPolicy = {\n ...DEFAULT_PASSWORD_POLICY,\n ...passwordPolicy,\n };\n }\n\n /**\n * Get the current password policy.\n */\n get passwordPolicy(): Readonly<PasswordPolicy> {\n return this._passwordPolicy;\n }\n\n /**\n * Update the password policy.\n */\n setPasswordPolicy(policy: PasswordPolicy): void {\n this._passwordPolicy = {\n ...this._passwordPolicy,\n ...policy,\n };\n }\n\n // User Management\n\n /**\n * Create a new user.\n *\n * @param username - Username for the new user\n * @param options - User creation options\n */\n async createUser(username: string, options: CreateUserOptions): Promise<void> {\n this.validateUsername(username);\n this.validatePassword(options.password);\n\n // Validate role names if provided\n if (options.roles) {\n for (const role of options.roles) {\n validateRoleName(role);\n }\n }\n\n const roles = options.roles?.join(', ') ?? '';\n const active = options.active !== false ? 'true' : 'false';\n\n const gql = `\n CREATE USER $username\n SET password = $password\n ${roles ? `, roles = [${roles}]` : ''}\n , active = ${active}\n `.trim();\n\n // Note: exec() here is Connection.exec() for GQL, not shell execution\n await this._conn.exec(gql, {\n params: {\n username,\n password: options.password,\n },\n });\n }\n\n /**\n * Delete a user.\n *\n * @param username - Username to delete\n */\n async deleteUser(username: string): Promise<void> {\n this.validateUsername(username);\n\n await this._conn.exec('DROP USER $username', {\n params: { username },\n });\n }\n\n /**\n * Get user information.\n *\n * @param username - Username to look up\n * @returns User information or null if not found\n */\n async getUser(username: string): Promise<User | null> {\n this.validateUsername(username);\n\n const result = await this._conn.queryAll('SHOW USER $username', { params: { username } });\n\n if (result.length === 0) {\n return null;\n }\n\n const row = result[0];\n if (!row) {\n return null;\n }\n return {\n username: row['username'] as string,\n roles: (row['roles'] as string[]) ?? [],\n active: (row['active'] as boolean) ?? true,\n createdAt: row['created_at'] ? new Date(row['created_at'] as string) : undefined,\n lastLoginAt: row['last_login'] ? new Date(row['last_login'] as string) : undefined,\n metadata: row['metadata'] as Record<string, unknown> | undefined,\n };\n }\n\n /**\n * List all users.\n *\n * @returns Array of users\n */\n async listUsers(): Promise<User[]> {\n const result = await this._conn.queryAll('SHOW USERS');\n\n return result.map((row) => ({\n username: row['username'] as string,\n roles: (row['roles'] as string[]) ?? [],\n active: (row['active'] as boolean) ?? true,\n createdAt: row['created_at'] ? new Date(row['created_at'] as string) : undefined,\n lastLoginAt: row['last_login'] ? new Date(row['last_login'] as string) : undefined,\n }));\n }\n\n /**\n * Change a user's password.\n *\n * @param username - Username\n * @param newPassword - New password\n */\n async changePassword(username: string, newPassword: string): Promise<void> {\n this.validateUsername(username);\n this.validatePassword(newPassword);\n\n await this._conn.exec('ALTER USER $username SET password = $password', {\n params: { username, password: newPassword },\n });\n }\n\n /**\n * Activate a user.\n *\n * @param username - Username to activate\n */\n async activateUser(username: string): Promise<void> {\n this.validateUsername(username);\n\n await this._conn.exec('ALTER USER $username SET active = true', {\n params: { username },\n });\n }\n\n /**\n * Deactivate a user.\n *\n * @param username - Username to deactivate\n */\n async deactivateUser(username: string): Promise<void> {\n this.validateUsername(username);\n\n await this._conn.exec('ALTER USER $username SET active = false', {\n params: { username },\n });\n }\n\n // Role Management\n\n /**\n * Create a new role.\n *\n * @param name - Role name\n * @param options - Role creation options\n */\n async createRole(name: string, options?: CreateRoleOptions): Promise<void> {\n this.validateRoleName(name);\n\n let query = 'CREATE ROLE $name';\n if (options?.description) {\n query += ' SET description = $description';\n }\n\n await this._conn.exec(query, {\n params: {\n name,\n description: options?.description,\n },\n });\n\n // Add permissions if provided\n if (options?.permissions) {\n for (const perm of options.permissions) {\n await this.grantPermission(name, perm);\n }\n }\n }\n\n /**\n * Delete a role.\n *\n * @param name - Role name to delete\n */\n async deleteRole(name: string): Promise<void> {\n this.validateRoleName(name);\n\n await this._conn.exec('DROP ROLE $name', {\n params: { name },\n });\n }\n\n /**\n * Get role information.\n *\n * @param name - Role name\n * @returns Role information or null if not found\n */\n async getRole(name: string): Promise<Role | null> {\n this.validateRoleName(name);\n\n const result = await this._conn.queryAll('SHOW ROLE $name', { params: { name } });\n\n const row = result[0];\n if (!row) {\n return null;\n }\n return {\n name: row['name'] as string,\n description: row['description'] as string | undefined,\n permissions: (row['permissions'] as Permission[]) ?? [],\n system: row['system'] as boolean | undefined,\n };\n }\n\n /**\n * List all roles.\n *\n * @returns Array of roles\n */\n async listRoles(): Promise<Role[]> {\n const result = await this._conn.queryAll('SHOW ROLES');\n\n return result.map((row) => ({\n name: row['name'] as string,\n description: row['description'] as string | undefined,\n permissions: (row['permissions'] as Permission[]) ?? [],\n system: row['system'] as boolean | undefined,\n }));\n }\n\n /**\n * Assign a role to a user.\n *\n * @param username - Username\n * @param roleName - Role to assign\n */\n async assignRole(username: string, roleName: string): Promise<void> {\n this.validateUsername(username);\n this.validateRoleName(roleName);\n\n await this._conn.exec('GRANT ROLE $role TO $user', {\n params: { role: roleName, user: username },\n });\n }\n\n /**\n * Revoke a role from a user.\n *\n * @param username - Username\n * @param roleName - Role to revoke\n */\n async revokeRole(username: string, roleName: string): Promise<void> {\n this.validateUsername(username);\n this.validateRoleName(roleName);\n\n await this._conn.exec('REVOKE ROLE $role FROM $user', {\n params: { role: roleName, user: username },\n });\n }\n\n /**\n * Grant a permission to a role.\n *\n * @param roleName - Role name\n * @param permission - Permission to grant\n */\n async grantPermission(roleName: string, permission: Permission): Promise<void> {\n this.validateRoleName(roleName);\n\n // Validate permission action and resource against allowlists\n validatePermissionAction(permission.action);\n validatePermissionResource(permission.resource);\n if (permission.label) {\n validateLabel(permission.label);\n }\n\n let gql = `GRANT ${permission.action.toUpperCase()} ON ${permission.resource.toUpperCase()}`;\n if (permission.label) {\n gql += `:${permission.label}`;\n }\n gql += ' TO $role';\n\n // Note: exec() here is Connection.exec() for GQL, not shell execution\n await this._conn.exec(gql, {\n params: { role: roleName },\n });\n }\n\n /**\n * Revoke a permission from a role.\n *\n * @param roleName - Role name\n * @param permission - Permission to revoke\n */\n async revokePermission(roleName: string, permission: Permission): Promise<void> {\n this.validateRoleName(roleName);\n\n // Validate permission action and resource against allowlists\n validatePermissionAction(permission.action);\n validatePermissionResource(permission.resource);\n if (permission.label) {\n validateLabel(permission.label);\n }\n\n let gql = `REVOKE ${permission.action.toUpperCase()} ON ${permission.resource.toUpperCase()}`;\n if (permission.label) {\n gql += `:${permission.label}`;\n }\n gql += ' FROM $role';\n\n // Note: exec() here is Connection.exec() for GQL, not shell execution\n await this._conn.exec(gql, {\n params: { role: roleName },\n });\n }\n\n // Row-Level Security\n\n /**\n * Create an RLS policy.\n *\n * @param name - Policy name\n * @param label - Target label\n * @param action - Policy action\n * @param predicate - GQL predicate expression\n * @param options - Additional options\n */\n async createRLSPolicy(\n name: string,\n label: string,\n action: 'READ' | 'WRITE' | 'ALL',\n predicate: string,\n options?: CreateRLSPolicyOptions\n ): Promise<void> {\n this.validatePolicyName(name);\n // Use strict predicate validation to prevent GQL injection (GAP #11)\n validateRLSPredicate(predicate);\n\n // Validate label, action, and roles\n validateLabel(label);\n validateRLSAction(action);\n if (options?.roles) {\n for (const role of options.roles) {\n validateRoleName(role);\n }\n }\n\n const enabled = options?.enabled !== false ? 'ENABLE' : 'DISABLE';\n const roles = options?.roles?.length ? `FOR ROLES (${options.roles.join(', ')})` : '';\n\n // GAP #14: Use escape function for defense-in-depth\n const escapedLabel = escapeGQLIdentifier(label, 'label');\n const gql = `\n CREATE POLICY $name ON :${escapedLabel}\n FOR ${action}\n ${roles}\n USING (${predicate})\n ${enabled}\n `.trim();\n\n // Note: exec() here is Connection.exec() for GQL, not shell execution\n await this._conn.exec(gql, {\n params: { name },\n });\n }\n\n /**\n * Delete an RLS policy.\n *\n * @param name - Policy name\n * @param label - Target label\n */\n async deleteRLSPolicy(name: string, label: string): Promise<void> {\n this.validatePolicyName(name);\n // GAP #14: Use escape function for defense-in-depth (includes validation)\n const escapedLabel = escapeGQLIdentifier(label, 'label');\n\n // Note: exec() here is Connection.exec() for GQL, not shell execution\n await this._conn.exec(`DROP POLICY $name ON :${escapedLabel}`, {\n params: { name },\n });\n }\n\n /**\n * Get RLS policy information.\n *\n * @param name - Policy name\n * @returns Policy information or null if not found\n */\n async getRLSPolicy(name: string): Promise<RLSPolicy | null> {\n this.validatePolicyName(name);\n\n const result = await this._conn.queryAll('SHOW POLICY $name', { params: { name } });\n\n const row = result[0];\n if (!row) {\n return null;\n }\n return {\n name: row['name'] as string,\n label: row['label'] as string,\n action: row['action'] as 'READ' | 'WRITE' | 'ALL',\n predicate: row['predicate'] as string,\n roles: row['roles'] as string[] | undefined,\n enabled: (row['enabled'] as boolean) ?? true,\n };\n }\n\n /**\n * List all RLS policies.\n *\n * @param label - Optional label to filter by\n * @returns Array of policies\n */\n async listRLSPolicies(label?: string): Promise<RLSPolicy[]> {\n // GAP #14: Use escape function for defense-in-depth (includes validation)\n const escapedLabel = label ? escapeGQLIdentifier(label, 'label') : null;\n\n const gql = escapedLabel ? `SHOW POLICIES ON :${escapedLabel}` : 'SHOW POLICIES';\n const result = await this._conn.queryAll(gql);\n\n return result.map((row) => ({\n name: row['name'] as string,\n label: row['label'] as string,\n action: row['action'] as 'READ' | 'WRITE' | 'ALL',\n predicate: row['predicate'] as string,\n roles: row['roles'] as string[] | undefined,\n enabled: (row['enabled'] as boolean) ?? true,\n }));\n }\n\n /**\n * Enable an RLS policy.\n *\n * @param name - Policy name\n * @param label - Target label\n */\n async enableRLSPolicy(name: string, label: string): Promise<void> {\n this.validatePolicyName(name);\n // GAP #14: Use escape function for defense-in-depth (includes validation)\n const escapedLabel = escapeGQLIdentifier(label, 'label');\n\n // Note: exec() here is Connection.exec() for GQL, not shell execution\n await this._conn.exec(`ALTER POLICY $name ON :${escapedLabel} ENABLE`, {\n params: { name },\n });\n }\n\n /**\n * Disable an RLS policy.\n *\n * @param name - Policy name\n * @param label - Target label\n */\n async disableRLSPolicy(name: string, label: string): Promise<void> {\n this.validatePolicyName(name);\n // GAP #14: Use escape function for defense-in-depth (includes validation)\n const escapedLabel = escapeGQLIdentifier(label, 'label');\n\n // Note: exec() here is Connection.exec() for GQL, not shell execution\n await this._conn.exec(`ALTER POLICY $name ON :${escapedLabel} DISABLE`, {\n params: { name },\n });\n }\n\n // Session Management\n\n /**\n * Get the current session user.\n *\n * @returns Current username\n */\n async currentUser(): Promise<string> {\n const result = await this._conn.queryAll('RETURN current_user() AS user');\n return (result[0]?.['user'] as string) ?? '';\n }\n\n /**\n * Get the current session roles.\n *\n * @returns Current roles\n */\n async currentRoles(): Promise<string[]> {\n const result = await this._conn.queryAll('RETURN current_roles() AS roles');\n return (result[0]?.['roles'] as string[]) ?? [];\n }\n\n /**\n * Check if the current session has a specific permission.\n *\n * @param resource - Resource type\n * @param action - Action to check\n * @param label - Optional label filter\n * @returns Whether permission is granted\n */\n async hasPermission(resource: string, action: string, label?: string): Promise<boolean> {\n // Validate inputs for proper error messages\n validatePermissionResource(resource);\n validatePermissionAction(action);\n // GAP #14: Validate label if provided (the target is parameterized, but validation ensures good error messages)\n if (label) {\n validateLabel(label);\n }\n\n const target = label ? `${resource}:${label}` : resource;\n const result = await this._conn.queryAll('RETURN has_permission($target, $action) AS allowed', {\n params: { target, action },\n });\n return (result[0]?.['allowed'] as boolean) ?? false;\n }\n\n // Validation helpers\n\n private validateUsername(username: string): void {\n if (!username || username.length === 0) {\n throw new SecurityError({\n type: 'validation',\n message: 'Username cannot be empty',\n });\n }\n if (username.length > 128) {\n throw new SecurityError({\n type: 'validation',\n message: 'Username too long (max 128 characters)',\n });\n }\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(username)) {\n throw new SecurityError({\n type: 'validation',\n message: 'Invalid username format',\n });\n }\n }\n\n private validatePassword(password: string): void {\n const policy = this._passwordPolicy;\n\n if (!password || password.length < policy.minLength) {\n throw new SecurityError({\n type: 'validation',\n message: `Password must be at least ${policy.minLength} characters`,\n });\n }\n\n if (password.length > policy.maxLength) {\n throw new SecurityError({\n type: 'validation',\n message: `Password too long (max ${policy.maxLength} characters)`,\n });\n }\n\n if (policy.requireUppercase && !/[A-Z]/.test(password)) {\n throw new SecurityError({\n type: 'validation',\n message: 'Password must contain at least one uppercase letter',\n });\n }\n\n if (policy.requireLowercase && !/[a-z]/.test(password)) {\n throw new SecurityError({\n type: 'validation',\n message: 'Password must contain at least one lowercase letter',\n });\n }\n\n if (policy.requireDigit && !/[0-9]/.test(password)) {\n throw new SecurityError({\n type: 'validation',\n message: 'Password must contain at least one digit',\n });\n }\n\n if (policy.requireSpecialChar) {\n // GAP #19: Escape hyphen to prevent it being interpreted as character range\n // e.g., \"a-z\" should match literal 'a', '-', 'z', not all letters a-z\n const specialCharsEscaped = policy.specialChars.replace(/[.*+?^${}()|[\\]\\\\-]/g, '\\\\$&');\n const specialRegex = new RegExp(`[${specialCharsEscaped}]`);\n if (!specialRegex.test(password)) {\n throw new SecurityError({\n type: 'validation',\n message: `Password must contain at least one special character (${policy.specialChars})`,\n });\n }\n }\n }\n\n private validateRoleName(name: string): void {\n if (!name || name.length === 0) {\n throw new SecurityError({\n type: 'validation',\n message: 'Role name cannot be empty',\n });\n }\n if (name.length > 128) {\n throw new SecurityError({\n type: 'validation',\n message: 'Role name too long (max 128 characters)',\n });\n }\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {\n throw new SecurityError({\n type: 'validation',\n message: 'Invalid role name format',\n });\n }\n }\n\n private validatePolicyName(name: string): void {\n if (!name || name.length === 0) {\n throw new SecurityError({\n type: 'validation',\n message: 'Policy name cannot be empty',\n });\n }\n if (name.length > 128) {\n throw new SecurityError({\n type: 'validation',\n message: 'Policy name too long (max 128 characters)',\n });\n }\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {\n throw new SecurityError({\n type: 'validation',\n message: 'Invalid policy name format',\n });\n }\n }\n}\n\n/**\n * Create an auth client from a connection.\n *\n * @param conn - Connection to use\n * @param passwordPolicy - Optional password policy configuration\n */\nexport function createAuthClient(conn: Connection, passwordPolicy?: PasswordPolicy): AuthClient {\n return new AuthClient(conn, passwordPolicy);\n}\n","/**\n * Geode Connection\n *\n * Connection management and query execution using protobuf wire protocol.\n */\n\nimport type { GeodeConfig } from './config.js';\nimport { validateConfig } from './config.js';\nimport {\n DriverError,\n TransportError,\n StatusClass,\n ErrClosed,\n ErrQueryInProgress,\n ErrTxInProgress,\n type ConnectionState,\n} from './errors.js';\nimport type { Transport } from './transport.js';\nimport { createTransport } from './transport.js';\nimport {\n buildHelloRequest,\n buildExecuteRequest,\n buildPullRequest,\n buildPingRequest,\n buildBeginRequest,\n buildCommitRequest,\n buildRollbackRequest,\n buildSavepointRequest,\n buildRollbackToRequest,\n rowToRecord,\n type QuicServerMessage,\n type ExecutionResponse,\n type ColumnDefinition,\n type DataPage,\n} from './proto.js';\nimport { validateQuery, validateParamValue, validateSavepointName } from './validate.js';\nimport { Transaction } from './transaction.js';\nimport { QueryResult } from './result.js';\nimport type { PreparedStatement } from './prepared.js';\nimport type { QueryPlan, QueryProfile, ExplainOptions } from './explain.js';\nimport type { BatchQuery, BatchSummary, BatchOptions } from './batch.js';\nimport type { ColumnInfo, GQLType } from './types.js';\nimport { parseGQLType } from './types.js';\n\n/**\n * Query parameters type.\n */\nexport type QueryParams = Record<string, unknown>;\n\n/**\n * Query options.\n */\nexport interface QueryOptions {\n /** Query parameters */\n params?: QueryParams;\n /** Abort signal for cancellation */\n signal?: AbortSignal;\n /** Page size for result pagination */\n pageSize?: number;\n}\n\n/**\n * Convert a protobuf ExecutionResponse error to a DriverError.\n */\nfunction protoErrorToDriverError(response: ExecutionResponse, statusClass?: string): DriverError {\n const err = response.error;\n return new DriverError({\n statusClass: (statusClass ?? err?.code ?? StatusClass.SYSTEM) as typeof StatusClass.SYSTEM,\n subclass: '000',\n code: err?.code ?? 'UnknownError',\n message: err?.message ?? 'Unknown error',\n anchor: err?.anchor,\n additional: [],\n findings: response.status?.flaggerFindings ?? [],\n });\n}\n\n/**\n * Check if an ExecutionResponse is an error.\n */\nfunction isErrorResponse(response: ExecutionResponse): boolean {\n return response.error !== undefined;\n}\n\n/**\n * Check if an ExecutionResponse contains a schema.\n */\nfunction isSchemaResponse(response: ExecutionResponse): boolean {\n return response.schema !== undefined;\n}\n\n/**\n * Check if an ExecutionResponse contains a data page.\n */\nfunction isDataPageResponse(response: ExecutionResponse): boolean {\n return response.page !== undefined;\n}\n\n/**\n * Convert protobuf columns to ColumnInfo array.\n */\nfunction columnsToColumnInfo(columns: ColumnDefinition[]): ColumnInfo[] {\n return columns.map((col) => ({\n name: col.name,\n type: col.type as GQLType,\n kind: parseGQLType(col.type),\n }));\n}\n\n/**\n * Convert a DataPage to row records.\n */\nfunction dataPageToRows(page: DataPage, columns: ColumnDefinition[]): Record<string, unknown>[] {\n return page.rows.map((row) => rowToRecord(row, columns));\n}\n\n/**\n * Connection to a Geode database.\n */\nexport class Connection {\n private _config: GeodeConfig;\n private _transport: Transport;\n private _state: ConnectionState = 'idle';\n private _inTransaction = false;\n private _activeResult: QueryResult | null = null;\n private _requestId = 0;\n private _sessionId = '';\n private _columns: ColumnDefinition[] = [];\n\n private constructor(config: GeodeConfig, transport: Transport) {\n this._config = config;\n this._transport = transport;\n }\n\n /**\n * Create a new connection to the Geode server.\n */\n static async connect(config: GeodeConfig): Promise<Connection> {\n validateConfig(config);\n\n const transport = await createTransport(config);\n const conn = new Connection(config, transport);\n\n try {\n await conn.hello();\n return conn;\n } catch (e) {\n await transport.close();\n throw e;\n }\n }\n\n /**\n * Create a connection with a custom transport (for testing).\n */\n static async connectWithTransport(\n config: GeodeConfig,\n transport: Transport\n ): Promise<Connection> {\n const conn = new Connection(config, transport);\n await conn.hello();\n return conn;\n }\n\n /**\n * Get connection configuration.\n */\n get config(): Readonly<GeodeConfig> {\n return this._config;\n }\n\n /**\n * Get current connection state.\n */\n get state(): ConnectionState {\n return this._state;\n }\n\n /**\n * Check if connection is in a transaction.\n */\n get inTransaction(): boolean {\n return this._inTransaction;\n }\n\n /**\n * Check if connection is closed.\n */\n get isClosed(): boolean {\n return this._state === 'closed' || this._transport.isClosed();\n }\n\n /**\n * Get session ID.\n */\n get sessionId(): string {\n return this._sessionId;\n }\n\n /**\n * Perform the HELLO handshake.\n */\n private async hello(): Promise<void> {\n const msg = buildHelloRequest(\n this._config.username ?? '',\n this._config.password ?? '',\n this._config.helloName,\n this._config.helloVersion,\n this._config.conformance\n );\n\n await this._transport.sendProto(msg);\n const response = await this._transport.receiveProto();\n\n if (response.hello) {\n if (!response.hello.success) {\n // Check if this is an auth error when no credentials were provided\n const hasCredentials = Boolean(this._config.username) || Boolean(this._config.password);\n if (!hasCredentials && response.hello.errorMessage.includes('Authentication')) {\n // Ignore auth errors when no credentials - server may still accept connection\n this._sessionId = response.hello.sessionId || '';\n return;\n }\n throw new DriverError({\n statusClass: StatusClass.AUTH,\n subclass: '000',\n code: 'AuthenticationFailed',\n message: response.hello.errorMessage || 'Authentication failed',\n });\n }\n this._sessionId = response.hello.sessionId;\n } else {\n throw new TransportError({\n operation: 'hello',\n cause: new Error('Invalid HELLO response'),\n });\n }\n }\n\n /**\n * Execute a query that returns rows.\n */\n async query(query: string, options?: QueryOptions): Promise<QueryResult> {\n this.checkState('query');\n\n validateQuery(query);\n\n const params = options?.params ?? {};\n\n // Validate parameters\n for (const [_key, value] of Object.entries(params)) {\n validateParamValue(value);\n }\n\n const signal = options?.signal;\n\n try {\n this._state = 'fetching';\n\n // Send Execute request\n const msg = buildExecuteRequest(this._sessionId, query, params);\n await this._transport.sendProto(msg, signal);\n\n // Read response - should be schema or error\n const response = await this._transport.receiveProto(signal);\n\n if (!response.execute) {\n this._state = this._inTransaction ? 'in_transaction' : 'idle';\n throw new TransportError({\n operation: 'query',\n cause: new Error('Invalid execute response'),\n });\n }\n\n const execResp = response.execute;\n\n if (isErrorResponse(execResp)) {\n this._state = this._inTransaction ? 'in_transaction' : 'idle';\n throw protoErrorToDriverError(execResp, execResp.status?.statusClass);\n }\n\n if (!isSchemaResponse(execResp)) {\n this._state = this._inTransaction ? 'in_transaction' : 'idle';\n throw new TransportError({\n operation: 'query',\n cause: new Error('Expected schema response'),\n });\n }\n\n this._columns = execResp.schema!.columns;\n const columns = columnsToColumnInfo(this._columns);\n\n // Check if there's an inline data page\n let initialRows: Record<string, unknown>[] = [];\n let isFinal = false;\n let isOrdered = false;\n let orderKeys: string[] = [];\n\n // Try to receive inline data page with short timeout\n const inlineResponse = await this._tryReceiveInline(signal);\n if (inlineResponse?.execute) {\n const inlineExec = inlineResponse.execute;\n if (isErrorResponse(inlineExec)) {\n this._state = this._inTransaction ? 'in_transaction' : 'idle';\n throw protoErrorToDriverError(inlineExec, inlineExec.status?.statusClass);\n }\n if (isDataPageResponse(inlineExec)) {\n const page = inlineExec.page!;\n initialRows = dataPageToRows(page, this._columns);\n isFinal = page.final;\n isOrdered = page.ordered;\n orderKeys = page.orderKeys;\n }\n }\n\n if (!isFinal && initialRows.length === 0) {\n // Send first PULL\n this._requestId++;\n const pageSize = options?.pageSize ?? this._config.pageSize;\n const pullMsg = buildPullRequest(this._requestId, pageSize, this._sessionId);\n await this._transport.sendProto(pullMsg, signal);\n\n // Read data page response\n const pullResponse = await this._transport.receiveProto(signal);\n\n if (pullResponse.execute) {\n const pullExec = pullResponse.execute;\n if (isErrorResponse(pullExec)) {\n this._state = this._inTransaction ? 'in_transaction' : 'idle';\n throw protoErrorToDriverError(pullExec, pullExec.status?.statusClass);\n }\n if (isDataPageResponse(pullExec)) {\n const page = pullExec.page!;\n initialRows = dataPageToRows(page, this._columns);\n isFinal = page.final;\n isOrdered = page.ordered;\n orderKeys = page.orderKeys;\n }\n }\n }\n\n // Create result\n const result = new QueryResult(\n this,\n columns,\n initialRows,\n isFinal,\n isOrdered,\n orderKeys,\n options?.pageSize ?? this._config.pageSize,\n signal\n );\n\n this._activeResult = result;\n return result;\n } catch (e) {\n this._state = this._inTransaction ? 'in_transaction' : 'idle';\n throw e;\n }\n }\n\n /**\n * Execute a query and return all rows as an array.\n */\n async queryAll(query: string, options?: QueryOptions): Promise<Record<string, unknown>[]> {\n const result = await this.query(query, options);\n const rows: Record<string, unknown>[] = [];\n\n for await (const row of result) {\n // Convert row values to plain objects\n // Row is a Map<string, GQLValue>, so use .get() to access values\n const obj: Record<string, unknown> = {};\n for (const col of result.columns) {\n const value = row.get(col.name);\n obj[col.name] = value?.toJS();\n }\n rows.push(obj);\n }\n\n return rows;\n }\n\n /**\n * Execute a query that doesn't return rows.\n */\n async exec(query: string, options?: QueryOptions): Promise<void> {\n this.checkState('exec');\n\n validateQuery(query);\n\n const params = options?.params ?? {};\n\n // Validate parameters\n for (const [_key, value] of Object.entries(params)) {\n validateParamValue(value);\n }\n\n const signal = options?.signal;\n\n try {\n this._state = 'executing';\n\n // Send Execute request\n const msg = buildExecuteRequest(this._sessionId, query, params);\n await this._transport.sendProto(msg, signal);\n\n // Read response\n const response = await this._transport.receiveProto(signal);\n\n if (!response.execute) {\n throw new TransportError({\n operation: 'exec',\n cause: new Error('Invalid execute response'),\n });\n }\n\n const execResp = response.execute;\n\n if (isErrorResponse(execResp)) {\n throw protoErrorToDriverError(execResp, execResp.status?.statusClass);\n }\n\n // If there's a schema, drain any data pages\n if (isSchemaResponse(execResp)) {\n this._columns = execResp.schema!.columns;\n const inlineResponse = await this._tryReceiveInline(signal);\n if (inlineResponse?.execute && isErrorResponse(inlineResponse.execute)) {\n throw protoErrorToDriverError(\n inlineResponse.execute,\n inlineResponse.execute.status?.statusClass\n );\n }\n }\n } finally {\n this._state = this._inTransaction ? 'in_transaction' : 'idle';\n }\n }\n\n /**\n * Fetch the next page of results (internal).\n */\n async _fetchNextPage(\n pageSize: number,\n signal?: AbortSignal\n ): Promise<{\n rows: Record<string, unknown>[];\n final: boolean;\n }> {\n this._requestId++;\n const pullMsg = buildPullRequest(this._requestId, pageSize, this._sessionId);\n await this._transport.sendProto(pullMsg, signal);\n\n const response = await this._transport.receiveProto(signal);\n\n if (!response.execute) {\n return { rows: [], final: true };\n }\n\n const execResp = response.execute;\n\n if (isErrorResponse(execResp)) {\n throw protoErrorToDriverError(execResp, execResp.status?.statusClass);\n }\n\n if (isDataPageResponse(execResp)) {\n const page = execResp.page!;\n return {\n rows: dataPageToRows(page, this._columns),\n final: page.final,\n };\n }\n\n // Metrics, profile, etc. indicate no more data\n return { rows: [], final: true };\n }\n\n /**\n * Try to receive an inline response with short timeout.\n */\n private async _tryReceiveInline(signal?: AbortSignal): Promise<QuicServerMessage | null> {\n if (signal?.aborted) {\n return null;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000);\n\n try {\n const response = await this._transport.receiveProto(controller.signal);\n return response;\n } catch (err) {\n if (err instanceof TransportError && err.cause?.message === 'Aborted') {\n return null;\n }\n throw err;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Release active result (internal).\n */\n _releaseResult(result: QueryResult): void {\n if (this._activeResult === result) {\n this._activeResult = null;\n this._state = this._inTransaction ? 'in_transaction' : 'idle';\n }\n }\n\n /**\n * Begin a transaction.\n */\n async begin(signal?: AbortSignal): Promise<Transaction> {\n this.checkState('begin');\n\n if (this._inTransaction) {\n throw ErrTxInProgress;\n }\n\n const msg = buildBeginRequest(false, this._sessionId);\n await this._transport.sendProto(msg, signal);\n\n const response = await this._transport.receiveProto(signal);\n\n if (response.begin) {\n if (response.begin.sessionId) {\n this._sessionId = response.begin.sessionId;\n }\n } else {\n throw new TransportError({\n operation: 'begin',\n cause: new Error('Invalid BEGIN response'),\n });\n }\n\n this._inTransaction = true;\n this._state = 'in_transaction';\n\n return new Transaction(this);\n }\n\n /**\n * Commit the current transaction (internal).\n */\n async _commit(signal?: AbortSignal): Promise<void> {\n const msg = buildCommitRequest(this._sessionId);\n await this._transport.sendProto(msg, signal);\n\n const response = await this._transport.receiveProto(signal);\n\n if (!response.commit) {\n throw new TransportError({\n operation: 'commit',\n cause: new Error('Invalid COMMIT response'),\n });\n }\n\n if (!response.commit.success) {\n throw new DriverError({\n statusClass: StatusClass.TRANSACTION_STATE,\n subclass: '000',\n code: 'CommitFailed',\n message: 'Commit failed',\n });\n }\n\n this._inTransaction = false;\n this._state = 'idle';\n }\n\n /**\n * Rollback the current transaction (internal).\n */\n async _rollback(signal?: AbortSignal): Promise<void> {\n const msg = buildRollbackRequest(this._sessionId);\n await this._transport.sendProto(msg, signal);\n\n const response = await this._transport.receiveProto(signal);\n\n if (!response.rollback) {\n throw new TransportError({\n operation: 'rollback',\n cause: new Error('Invalid ROLLBACK response'),\n });\n }\n\n this._inTransaction = false;\n this._state = 'idle';\n }\n\n /**\n * Create a savepoint (internal).\n */\n async _savepoint(name: string, signal?: AbortSignal): Promise<void> {\n validateSavepointName(name);\n\n const msg = buildSavepointRequest(name, this._sessionId);\n await this._transport.sendProto(msg, signal);\n\n const response = await this._transport.receiveProto(signal);\n\n if (!response.savepoint) {\n throw new TransportError({\n operation: 'savepoint',\n cause: new Error('Invalid SAVEPOINT response'),\n });\n }\n\n if (!response.savepoint.success) {\n throw new DriverError({\n statusClass: StatusClass.TRANSACTION_STATE,\n subclass: '000',\n code: 'SavepointFailed',\n message: `Failed to create savepoint: ${name}`,\n });\n }\n }\n\n /**\n * Rollback to a savepoint (internal).\n */\n async _rollbackTo(name: string, signal?: AbortSignal): Promise<void> {\n validateSavepointName(name);\n\n const msg = buildRollbackToRequest(name, this._sessionId);\n await this._transport.sendProto(msg, signal);\n\n const response = await this._transport.receiveProto(signal);\n\n if (!response.rollbackTo) {\n throw new TransportError({\n operation: 'rollback_to',\n cause: new Error('Invalid ROLLBACK TO response'),\n });\n }\n\n if (!response.rollbackTo.success) {\n throw new DriverError({\n statusClass: StatusClass.TRANSACTION_STATE,\n subclass: '000',\n code: 'RollbackToFailed',\n message: `Failed to rollback to savepoint: ${name}`,\n });\n }\n }\n\n /**\n * Ping the server to check connection health.\n */\n async ping(signal?: AbortSignal): Promise<void> {\n if (this._state === 'closed') {\n throw ErrClosed;\n }\n\n const msg = buildPingRequest();\n await this._transport.sendProto(msg, signal);\n\n const response = await this._transport.receiveProto(signal);\n\n if (!response.ping) {\n throw new TransportError({\n operation: 'ping',\n cause: new Error('Invalid PING response'),\n });\n }\n\n if (!response.ping.ok) {\n throw new TransportError({\n operation: 'ping',\n cause: new Error('Server returned not ok'),\n });\n }\n }\n\n /**\n * Reset the connection session.\n */\n async reset(signal?: AbortSignal): Promise<void> {\n if (this._state === 'closed') {\n throw ErrClosed;\n }\n\n // Rollback any active transaction\n if (this._inTransaction) {\n await this._rollback(signal);\n }\n\n this._state = 'idle';\n this._activeResult = null;\n }\n\n /**\n * Close the connection.\n */\n async close(): Promise<void> {\n if (this._state === 'closed') {\n return;\n }\n\n this._state = 'closed';\n\n // Close active result\n if (this._activeResult) {\n this._activeResult._close();\n this._activeResult = null;\n }\n\n await this._transport.close();\n }\n\n /**\n * Create a prepared statement.\n */\n async prepare(query: string): Promise<PreparedStatement> {\n const { PreparedStatement } = await import('./prepared.js');\n return new PreparedStatement(this, query);\n }\n\n /**\n * Get the query execution plan without executing.\n */\n async explain(query: string, options?: ExplainOptions): Promise<QueryPlan> {\n const { explain: doExplain } = await import('./explain.js');\n return doExplain(this, query, options);\n }\n\n /**\n * Execute a query with profiling.\n */\n async profile(query: string, options?: ExplainOptions): Promise<QueryProfile> {\n const { profile: doProfile } = await import('./explain.js');\n return doProfile(this, query, options);\n }\n\n /**\n * Execute multiple queries in a batch.\n */\n async batch(queries: BatchQuery[], options?: BatchOptions): Promise<BatchSummary> {\n const { batch: doBatch } = await import('./batch.js');\n return doBatch(this, queries, options);\n }\n\n /**\n * Check connection state before operation.\n */\n private checkState(operation: string): void {\n if (this._state === 'closed') {\n throw ErrClosed;\n }\n\n if (this._state === 'fetching' || this._activeResult) {\n throw ErrQueryInProgress;\n }\n\n if (operation === 'begin' && this._inTransaction) {\n throw ErrTxInProgress;\n }\n }\n}\n","/**\n * Transport Layer\n *\n * Provides transport abstraction for communication with Geode server.\n * Supports both QUIC (default) and gRPC transports.\n *\n * Wire format for QUIC: 4-byte Big Endian length prefix + protobuf message body.\n */\n\nimport * as tls from 'node:tls';\nimport * as fs from 'node:fs';\nimport * as crypto from 'node:crypto';\nimport type { GeodeConfig } from './config.js';\nimport { getAddress } from './config.js';\nimport { TransportError, ErrClosed } from './errors.js';\nimport { validateTLSCertPath } from './validate.js';\nimport {\n encodeWithLengthPrefix,\n decodeQuicServerMessage,\n decodeLengthPrefix,\n type QuicClientMessage,\n type QuicServerMessage,\n} from './proto.js';\n\n// ALPN protocol for Geode\nconst GEODE_ALPN = ['geode/1'];\n\n/**\n * Transport interface for communication with Geode server.\n */\nexport interface Transport {\n /** Send a protobuf message to the server */\n sendProto(msg: QuicClientMessage, signal?: AbortSignal): Promise<void>;\n\n /** Receive a protobuf message from the server */\n receiveProto(signal?: AbortSignal): Promise<QuicServerMessage>;\n\n /** Close the transport */\n close(): Promise<void>;\n\n /** Check if transport is closed */\n isClosed(): boolean;\n\n /** Get remote address */\n getAddress(): string;\n}\n\n/**\n * Build TLS configuration from GeodeConfig.\n */\nexport async function buildTLSConfig(cfg: GeodeConfig): Promise<tls.SecureContextOptions> {\n const options: tls.SecureContextOptions = {\n minVersion: 'TLSv1.3',\n maxVersion: 'TLSv1.3',\n };\n\n // Load CA certificate\n if (cfg.tlsCACert) {\n options.ca = cfg.tlsCACert;\n } else if (cfg.tlsCA) {\n // GAP #12: Validate path to prevent directory traversal attacks\n validateTLSCertPath(cfg.tlsCA, 'tlsCA');\n try {\n options.ca = await fs.promises.readFile(cfg.tlsCA, 'utf-8');\n } catch (e) {\n throw new TransportError({\n operation: 'load_ca_cert',\n cause: e instanceof Error ? e : new Error(String(e)),\n });\n }\n }\n\n // Load client certificate for mTLS\n if (cfg.tlsCertPEM) {\n options.cert = cfg.tlsCertPEM;\n } else if (cfg.tlsCert) {\n // GAP #12: Validate path to prevent directory traversal attacks\n validateTLSCertPath(cfg.tlsCert, 'tlsCert');\n try {\n options.cert = await fs.promises.readFile(cfg.tlsCert, 'utf-8');\n } catch (e) {\n throw new TransportError({\n operation: 'load_client_cert',\n cause: e instanceof Error ? e : new Error(String(e)),\n });\n }\n }\n\n // Load client key for mTLS\n if (cfg.tlsKeyPEM) {\n options.key = cfg.tlsKeyPEM;\n } else if (cfg.tlsKey) {\n // GAP #12: Validate path to prevent directory traversal attacks\n validateTLSCertPath(cfg.tlsKey, 'tlsKey');\n try {\n options.key = await fs.promises.readFile(cfg.tlsKey, 'utf-8');\n } catch (e) {\n throw new TransportError({\n operation: 'load_client_key',\n cause: e instanceof Error ? e : new Error(String(e)),\n });\n }\n }\n\n return options;\n}\n\n/**\n * Abstract base class for transports.\n */\nexport abstract class BaseTransport implements Transport {\n protected _closed = false;\n protected _address: string;\n\n constructor(address: string) {\n this._address = address;\n }\n\n abstract sendProto(msg: QuicClientMessage, signal?: AbortSignal): Promise<void>;\n abstract receiveProto(signal?: AbortSignal): Promise<QuicServerMessage>;\n abstract close(): Promise<void>;\n\n isClosed(): boolean {\n return this._closed;\n }\n\n getAddress(): string {\n return this._address;\n }\n\n protected checkClosed(): void {\n if (this._closed) {\n throw ErrClosed;\n }\n }\n}\n\n/**\n * QUIC transport using @matrixai/quic.\n *\n * This implementation uses the quiche QUIC library via native bindings.\n * Wire format: 4-byte Big Endian length prefix + protobuf message body.\n */\nexport class QuicTransport extends BaseTransport {\n private _client: unknown = null;\n private _stream: unknown = null;\n private _protoBuffer: Buffer = Buffer.alloc(0);\n private _pendingProtoReads: Array<{\n resolve: (value: QuicServerMessage) => void;\n reject: (error: Error) => void;\n }> = [];\n\n constructor(address: string) {\n super(address);\n }\n\n /**\n * Connect to the Geode server using QUIC.\n */\n static async connect(cfg: GeodeConfig): Promise<QuicTransport> {\n const address = getAddress(cfg);\n const transport = new QuicTransport(address);\n\n try {\n // Dynamically import @matrixai/quic\n const { QUICClient } = await import('@matrixai/quic');\n\n // Parse host and port\n const [host = 'localhost', portStr] = address.includes('[')\n ? [address.slice(1, address.lastIndexOf(']')), address.slice(address.lastIndexOf(':') + 1)]\n : address.split(':');\n const port = parseInt(portStr ?? '3141', 10);\n\n // Create crypto ops using Node.js crypto\n const cryptoOps = {\n ops: {\n randomBytes: (data: ArrayBuffer): Promise<void> => {\n const buf = Buffer.from(data);\n crypto.randomFillSync(buf);\n return Promise.resolve();\n },\n },\n };\n\n // Build TLS config\n const tlsConfig = await buildTLSConfig(cfg);\n\n // Create QUIC client configuration\n const config: Record<string, unknown> = {\n applicationProtos: GEODE_ALPN,\n maxIdleTimeout: cfg.maxIdleTime ?? 30000,\n initialMaxData: 10_000_000,\n initialMaxStreamDataBidiLocal: 1_000_000,\n initialMaxStreamDataBidiRemote: 1_000_000,\n initialMaxStreamsBidi: 100,\n };\n\n // Configure TLS\n if (cfg.insecureSkipVerify) {\n // Security safeguard: warn about insecure configuration\n const isProduction =\n process.env['NODE_ENV'] === 'production' || process.env['GEODE_ENV'] === 'production';\n if (isProduction) {\n // eslint-disable-next-line no-console -- Intentional security warning\n console.warn(\n 'SECURITY WARNING: insecureSkipVerify is enabled in production environment. ' +\n 'This disables TLS certificate verification and exposes the connection to MITM attacks. ' +\n 'Set GEODE_ALLOW_INSECURE_PRODUCTION=true to override this warning.'\n );\n if (process.env['GEODE_ALLOW_INSECURE_PRODUCTION'] !== 'true') {\n throw new TransportError({\n operation: 'connect',\n cause: new Error(\n 'insecureSkipVerify is not allowed in production. ' +\n 'Configure proper TLS certificates or set GEODE_ALLOW_INSECURE_PRODUCTION=true to override.'\n ),\n });\n }\n }\n config.verifyPeer = false;\n }\n if (tlsConfig.ca) {\n config.caCerts = [tlsConfig.ca];\n }\n if (tlsConfig.cert && tlsConfig.key) {\n config.cert = tlsConfig.cert;\n config.key = tlsConfig.key;\n }\n\n // Create QUIC client\n /* eslint-disable @typescript-eslint/await-thenable */\n const client = await QUICClient.createQUICClient(\n {\n host,\n port,\n serverName: cfg.serverName ?? host,\n crypto: cryptoOps,\n config,\n },\n { timer: cfg.connectTimeout ?? 30000 }\n );\n transport._client = client;\n\n // Open a bidirectional stream\n const connection = client.connection;\n const stream = await connection.newStream();\n transport._stream = stream;\n /* eslint-enable @typescript-eslint/await-thenable */\n\n // Start reading from stream\n transport.startReading();\n\n return transport;\n } catch (e) {\n await transport.close();\n throw new TransportError({\n operation: 'connect',\n address,\n cause: e instanceof Error ? e : new Error(String(e)),\n });\n }\n }\n\n /**\n * Start reading from the stream in the background.\n */\n private startReading(): void {\n if (!this._stream) return;\n\n const stream = this._stream as {\n readable: ReadableStream<Uint8Array>;\n };\n\n const reader = stream.readable.getReader();\n\n const read = async () => {\n try {\n while (!this._closed) {\n const { done, value } = await reader.read();\n if (done) {\n // Stream ended - reject any pending reads\n this.rejectPendingReads(\n new TransportError({\n operation: 'read',\n cause: new Error('Stream ended unexpectedly'),\n })\n );\n break;\n }\n if (value) {\n this.processData(Buffer.from(value));\n }\n }\n } catch (err) {\n // Stream error - reject any pending reads with the error\n if (!this._closed) {\n this.rejectPendingReads(\n new TransportError({\n operation: 'read',\n cause: err instanceof Error ? err : new Error(String(err)),\n })\n );\n }\n } finally {\n reader.releaseLock();\n }\n };\n\n void read();\n }\n\n /**\n * Reject all pending reads with an error.\n */\n private rejectPendingReads(error: Error): void {\n const pending = this._pendingProtoReads;\n this._pendingProtoReads = [];\n for (const p of pending) {\n p.reject(error);\n }\n }\n\n /**\n * Process received data (length-prefixed protobuf messages).\n */\n private processData(data: Buffer): void {\n this._protoBuffer = Buffer.concat([this._protoBuffer, data]);\n\n // Try to decode complete messages\n while (this._protoBuffer.length >= 4) {\n const msgLen = decodeLengthPrefix(this._protoBuffer);\n const totalLen = 4 + msgLen;\n\n if (this._protoBuffer.length < totalLen) {\n // Need more data\n break;\n }\n\n // Extract and decode the message\n const msgData = this._protoBuffer.subarray(4, totalLen);\n this._protoBuffer = this._protoBuffer.subarray(totalLen);\n\n try {\n const msg = decodeQuicServerMessage(msgData);\n\n // Resolve pending read or buffer the message\n const pending = this._pendingProtoReads.shift();\n if (pending) {\n pending.resolve(msg);\n }\n // Note: We don't buffer proto messages, they must be consumed immediately\n } catch (err) {\n // Reject pending reads on decode error\n const pending = this._pendingProtoReads.shift();\n if (pending) {\n pending.reject(\n new TransportError({\n operation: 'decode',\n cause: err instanceof Error ? err : new Error(String(err)),\n })\n );\n }\n }\n }\n }\n\n /**\n * Send a protobuf message with length prefix.\n */\n async sendProto(msg: QuicClientMessage, signal?: AbortSignal): Promise<void> {\n this.checkClosed();\n\n if (signal?.aborted) {\n throw new TransportError({ operation: 'sendProto', cause: new Error('Aborted') });\n }\n\n if (!this._stream) {\n throw new TransportError({ operation: 'sendProto', cause: new Error('No stream') });\n }\n\n const data = encodeWithLengthPrefix(msg);\n\n try {\n const stream = this._stream as {\n writable: WritableStream<Uint8Array>;\n };\n\n const writer = stream.writable.getWriter();\n await writer.write(new Uint8Array(data));\n writer.releaseLock();\n } catch (e) {\n throw new TransportError({\n operation: 'sendProto',\n address: this._address,\n cause: e instanceof Error ? e : new Error(String(e)),\n });\n }\n }\n\n /**\n * Receive a protobuf message.\n */\n async receiveProto(signal?: AbortSignal): Promise<QuicServerMessage> {\n this.checkClosed();\n\n if (signal?.aborted) {\n throw new TransportError({ operation: 'receiveProto', cause: new Error('Aborted') });\n }\n\n return new Promise((resolve, reject) => {\n let onAbort: (() => void) | null = null;\n\n const pendingRead = {\n resolve: (value: QuicServerMessage) => {\n if (onAbort && signal) {\n signal.removeEventListener('abort', onAbort);\n }\n resolve(value);\n },\n reject: (error: Error) => {\n if (onAbort && signal) {\n signal.removeEventListener('abort', onAbort);\n }\n reject(error);\n },\n };\n\n this._pendingProtoReads.push(pendingRead);\n\n if (signal) {\n onAbort = () => {\n const idx = this._pendingProtoReads.indexOf(pendingRead);\n if (idx !== -1) {\n this._pendingProtoReads.splice(idx, 1);\n }\n reject(new TransportError({ operation: 'receiveProto', cause: new Error('Aborted') }));\n };\n signal.addEventListener('abort', onAbort, { once: true });\n }\n });\n }\n\n async close(): Promise<void> {\n if (this._closed) return;\n this._closed = true;\n\n // Reject pending reads\n for (const pending of this._pendingProtoReads) {\n pending.reject(ErrClosed);\n }\n this._pendingProtoReads = [];\n\n // Close QUIC client\n if (this._client) {\n try {\n const client = this._client as { destroy: () => Promise<void> };\n await client.destroy();\n } catch {\n // Ignore close errors\n }\n this._client = null;\n }\n\n this._stream = null;\n }\n}\n\n/**\n * Mock transport for testing purposes.\n *\n * This allows unit testing without a real connection.\n */\nexport class MockTransport extends BaseTransport {\n private _protoSendQueue: QuicClientMessage[] = [];\n private _protoReceiveQueue: QuicServerMessage[] = [];\n private _pendingProtoReads: Array<{\n resolve: (value: QuicServerMessage) => void;\n reject: (error: Error) => void;\n }> = [];\n\n constructor(address = 'mock:3141') {\n super(address);\n }\n\n /**\n * Queue a protobuf response.\n */\n queueProtoResponse(response: QuicServerMessage): void {\n // Resolve pending read or queue\n const pending = this._pendingProtoReads.shift();\n if (pending) {\n pending.resolve(response);\n } else {\n this._protoReceiveQueue.push(response);\n }\n }\n\n /**\n * Get all sent protobuf messages.\n */\n getSentProtoMessages(): QuicClientMessage[] {\n return [...this._protoSendQueue];\n }\n\n /**\n * Clear sent messages.\n */\n clearSentMessages(): void {\n this._protoSendQueue = [];\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async sendProto(msg: QuicClientMessage, signal?: AbortSignal): Promise<void> {\n this.checkClosed();\n\n if (signal?.aborted) {\n throw new TransportError({ operation: 'sendProto', cause: new Error('Aborted') });\n }\n\n this._protoSendQueue.push(msg);\n }\n\n async receiveProto(signal?: AbortSignal): Promise<QuicServerMessage> {\n this.checkClosed();\n\n if (signal?.aborted) {\n throw new TransportError({ operation: 'receiveProto', cause: new Error('Aborted') });\n }\n\n const queued = this._protoReceiveQueue.shift();\n if (queued) {\n return queued;\n }\n\n return new Promise((resolve, reject) => {\n let onAbort: (() => void) | null = null;\n\n const pendingRead = {\n resolve: (value: QuicServerMessage) => {\n if (onAbort && signal) {\n signal.removeEventListener('abort', onAbort);\n }\n resolve(value);\n },\n reject: (error: Error) => {\n if (onAbort && signal) {\n signal.removeEventListener('abort', onAbort);\n }\n reject(error);\n },\n };\n\n this._pendingProtoReads.push(pendingRead);\n\n if (signal) {\n onAbort = () => {\n const idx = this._pendingProtoReads.indexOf(pendingRead);\n if (idx !== -1) {\n this._pendingProtoReads.splice(idx, 1);\n }\n reject(new TransportError({ operation: 'receiveProto', cause: new Error('Aborted') }));\n };\n signal.addEventListener('abort', onAbort, { once: true });\n }\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async close(): Promise<void> {\n if (this._closed) return;\n this._closed = true;\n\n for (const pending of this._pendingProtoReads) {\n pending.reject(ErrClosed);\n }\n this._pendingProtoReads = [];\n }\n}\n\n/**\n * Create a transport for the given configuration.\n *\n * Selects between QUIC and gRPC based on config.transport.\n */\nexport async function createTransport(cfg: GeodeConfig): Promise<Transport> {\n if (cfg.transport === 'grpc') {\n const { GrpcTransport } = await import('./grpc-transport.js');\n return GrpcTransport.connect(cfg);\n }\n return QuicTransport.connect(cfg);\n}\n\n// Legacy export aliases\nexport { QuicTransport as MatrixQuicTransport };\nexport { QuicTransport as QuicheTransport };\n","/**\n * Transaction Management\n *\n * Provides transaction and savepoint support.\n */\n\nimport type { Connection, QueryOptions } from './connection.js';\nimport type { QueryResult } from './result.js';\nimport { ErrNoTx, ErrTxDone } from './errors.js';\n\n/**\n * Transaction represents an active database transaction.\n */\nexport class Transaction {\n private _conn: Connection;\n private _done = false;\n private _savepoints: string[] = [];\n\n constructor(conn: Connection) {\n this._conn = conn;\n }\n\n /**\n * Check if transaction is complete (committed or rolled back).\n */\n get isDone(): boolean {\n return this._done;\n }\n\n /**\n * Get the list of active savepoints.\n */\n get savepoints(): readonly string[] {\n return this._savepoints;\n }\n\n /**\n * Execute a query within the transaction.\n */\n async query(query: string, options?: QueryOptions): Promise<QueryResult> {\n this.checkDone();\n return this._conn.query(query, options);\n }\n\n /**\n * Execute a query and return all rows.\n */\n async queryAll(query: string, options?: QueryOptions): Promise<Record<string, unknown>[]> {\n this.checkDone();\n return this._conn.queryAll(query, options);\n }\n\n /**\n * Execute a statement that doesn't return rows.\n */\n async exec(query: string, options?: QueryOptions): Promise<void> {\n this.checkDone();\n return this._conn.exec(query, options);\n }\n\n /**\n * Create a savepoint.\n */\n async savepoint(name: string, signal?: AbortSignal): Promise<void> {\n this.checkDone();\n await this._conn._savepoint(name, signal);\n this._savepoints.push(name);\n }\n\n /**\n * Rollback to a savepoint.\n */\n async rollbackTo(name: string, signal?: AbortSignal): Promise<void> {\n this.checkDone();\n\n const idx = this._savepoints.indexOf(name);\n if (idx === -1) {\n throw new Error(`Savepoint not found: ${name}`);\n }\n\n await this._conn._rollbackTo(name, signal);\n\n // Remove this savepoint and all savepoints created after it\n this._savepoints = this._savepoints.slice(0, idx);\n }\n\n /**\n * Release a savepoint.\n *\n * Note: Geode doesn't have explicit RELEASE SAVEPOINT, but we track it client-side.\n */\n release(name: string): void {\n this.checkDone();\n\n const idx = this._savepoints.indexOf(name);\n if (idx === -1) {\n throw new Error(`Savepoint not found: ${name}`);\n }\n\n // Remove the savepoint\n this._savepoints.splice(idx, 1);\n }\n\n /**\n * Commit the transaction.\n */\n async commit(signal?: AbortSignal): Promise<void> {\n this.checkDone();\n this._done = true;\n await this._conn._commit(signal);\n this._savepoints = [];\n }\n\n /**\n * Rollback the transaction.\n */\n async rollback(signal?: AbortSignal): Promise<void> {\n this.checkDone();\n this._done = true;\n await this._conn._rollback(signal);\n this._savepoints = [];\n }\n\n /**\n * Execute a function within the transaction with automatic commit/rollback.\n */\n async run<T>(fn: (tx: Transaction) => Promise<T>): Promise<T> {\n this.checkDone();\n\n try {\n const result = await fn(this);\n await this.commit();\n return result;\n } catch (e) {\n if (!this._done) {\n await this.rollback();\n }\n throw e;\n }\n }\n\n /**\n * Check if transaction is already done.\n */\n private checkDone(): void {\n if (this._done) {\n throw ErrTxDone;\n }\n if (!this._conn.inTransaction) {\n throw ErrNoTx;\n }\n }\n}\n\n/**\n * Execute a function within a new transaction.\n *\n * Automatically commits on success or rolls back on error.\n */\nexport async function withTransaction<T>(\n conn: Connection,\n fn: (tx: Transaction) => Promise<T>,\n signal?: AbortSignal\n): Promise<T> {\n const tx = await conn.begin(signal);\n return tx.run(fn);\n}\n","/**\n * Query Result Handling\n *\n * Implements async iteration over query results with pagination.\n */\n\nimport type { ColumnInfo, Row } from './types.js';\nimport { parseRow, rowToObject } from './types.js';\nimport type { Connection } from './connection.js';\n\n/**\n * Query result with async iteration support.\n */\nexport class QueryResult implements AsyncIterable<Row> {\n private _conn: Connection;\n private _columns: ColumnInfo[];\n private _buffer: Record<string, unknown>[];\n private _final: boolean;\n private _ordered: boolean;\n private _orderKeys: string[];\n private _pageSize: number;\n private _signal?: AbortSignal;\n private _closed = false;\n private _bufferIndex = 0;\n private _rowCount = 0;\n\n constructor(\n conn: Connection,\n columns: ColumnInfo[],\n initialRows: Record<string, unknown>[],\n final: boolean,\n ordered: boolean,\n orderKeys: string[],\n pageSize: number,\n signal?: AbortSignal\n ) {\n this._conn = conn;\n this._columns = columns;\n this._buffer = initialRows;\n this._final = final;\n this._ordered = ordered;\n this._orderKeys = orderKeys;\n this._pageSize = pageSize;\n this._signal = signal;\n }\n\n /**\n * Get column definitions.\n */\n get columns(): readonly ColumnInfo[] {\n return this._columns;\n }\n\n /**\n * Get column names.\n */\n get columnNames(): string[] {\n return this._columns.map((c) => c.name);\n }\n\n /**\n * Check if results are ordered.\n */\n get ordered(): boolean {\n return this._ordered;\n }\n\n /**\n * Get order keys (if ordered).\n */\n get orderKeys(): readonly string[] {\n return this._orderKeys;\n }\n\n /**\n * Check if all results have been fetched.\n */\n get complete(): boolean {\n return this._final && this._bufferIndex >= this._buffer.length;\n }\n\n /**\n * Check if result is closed.\n */\n get isClosed(): boolean {\n return this._closed;\n }\n\n /**\n * Get the number of rows returned so far.\n */\n get rowCount(): number {\n return this._rowCount;\n }\n\n /**\n * Async iterator implementation.\n */\n async *[Symbol.asyncIterator](): AsyncIterator<Row> {\n try {\n while (!this._closed) {\n // Check signal\n if (this._signal?.aborted) {\n break;\n }\n\n // Return buffered rows\n while (this._bufferIndex < this._buffer.length) {\n const rawRow = this._buffer[this._bufferIndex];\n if (rawRow) {\n this._bufferIndex++;\n this._rowCount++;\n yield parseRow(rawRow, this._columns);\n }\n }\n\n // If final, we're done\n if (this._final) {\n break;\n }\n\n // Fetch next page\n const { rows, final } = await this._conn._fetchNextPage(this._pageSize, this._signal);\n this._buffer = rows;\n this._bufferIndex = 0;\n this._final = final;\n }\n } finally {\n this.close();\n }\n }\n\n /**\n * Get all remaining rows as an array.\n */\n async toArray(): Promise<Row[]> {\n const rows: Row[] = [];\n for await (const row of this) {\n rows.push(row);\n }\n return rows;\n }\n\n /**\n * Get all remaining rows as plain objects.\n */\n async toObjects(): Promise<Record<string, unknown>[]> {\n const rows: Record<string, unknown>[] = [];\n for await (const row of this) {\n rows.push(rowToObject(row));\n }\n return rows;\n }\n\n /**\n * Get the first row (or null if empty).\n */\n async first(): Promise<Row | null> {\n for await (const row of this) {\n this.close();\n return row;\n }\n return null;\n }\n\n /**\n * Get the first row as plain object (or null if empty).\n */\n async firstObject(): Promise<Record<string, unknown> | null> {\n const row = await this.first();\n return row ? rowToObject(row) : null;\n }\n\n /**\n * Apply a function to each row.\n */\n async forEach(fn: (row: Row, index: number) => void | Promise<void>): Promise<void> {\n let index = 0;\n for await (const row of this) {\n await fn(row, index++);\n }\n }\n\n /**\n * Map rows to a new array.\n */\n async map<T>(fn: (row: Row, index: number) => T | Promise<T>): Promise<T[]> {\n const results: T[] = [];\n let index = 0;\n for await (const row of this) {\n results.push(await fn(row, index++));\n }\n return results;\n }\n\n /**\n * Filter rows.\n */\n async filter(predicate: (row: Row, index: number) => boolean | Promise<boolean>): Promise<Row[]> {\n const results: Row[] = [];\n let index = 0;\n for await (const row of this) {\n if (await predicate(row, index++)) {\n results.push(row);\n }\n }\n return results;\n }\n\n /**\n * Reduce rows to a single value.\n */\n async reduce<T>(fn: (acc: T, row: Row, index: number) => T | Promise<T>, initial: T): Promise<T> {\n let acc = initial;\n let index = 0;\n for await (const row of this) {\n acc = await fn(acc, row, index++);\n }\n return acc;\n }\n\n /**\n * Close the result set.\n */\n close(): void {\n if (this._closed) {\n return;\n }\n this._closed = true;\n this._conn._releaseResult(this);\n }\n\n /**\n * Internal close (called by connection).\n */\n _close(): void {\n this._closed = true;\n }\n}\n\n/**\n * Iterator for synchronous access to query results.\n *\n * This wraps the async iterator for cases where results are pre-fetched.\n */\nexport class QueryResultIterator {\n private _result: QueryResult;\n private _iterator: AsyncIterator<Row>;\n\n constructor(result: QueryResult) {\n this._result = result;\n this._iterator = result[Symbol.asyncIterator]();\n }\n\n /**\n * Get the next row.\n */\n async next(): Promise<{ done: boolean; value?: Row }> {\n const result: IteratorResult<Row, void> = await this._iterator.next();\n return {\n done: result.done ?? false,\n value: result.done ? undefined : result.value,\n };\n }\n\n /**\n * Close the iterator.\n */\n close(): void {\n this._result.close();\n }\n}\n","/**\n * Connection Pool\n *\n * Manages a pool of connections for efficient resource utilization.\n */\n\nimport { Connection } from './connection.js';\nimport type { PoolConfig } from './config.js';\nimport { TransportError, ErrClosed } from './errors.js';\nimport type { QueryOptions } from './connection.js';\nimport type { QueryResult } from './result.js';\nimport { Transaction, withTransaction } from './transaction.js';\n\n/**\n * Connection wrapper for pool management.\n */\ninterface PooledConnection {\n connection: Connection;\n createdAt: number;\n lastUsedAt: number;\n inUse: boolean;\n}\n\n/**\n * Rate limiter configuration.\n */\nexport interface RateLimiterConfig {\n /** Maximum number of connection attempts per window (default: 10) */\n maxAttempts: number;\n /** Time window in milliseconds (default: 1000) */\n windowMs: number;\n /** Initial backoff delay in milliseconds (default: 100) */\n initialBackoffMs: number;\n /** Maximum backoff delay in milliseconds (default: 30000) */\n maxBackoffMs: number;\n /** Backoff multiplier (default: 2) */\n backoffMultiplier: number;\n}\n\n/**\n * Default rate limiter configuration.\n */\nconst DEFAULT_RATE_LIMITER_CONFIG: RateLimiterConfig = {\n maxAttempts: 10,\n windowMs: 1000,\n initialBackoffMs: 100,\n maxBackoffMs: 30000,\n backoffMultiplier: 2,\n};\n\n/**\n * Simple sliding window rate limiter.\n */\nclass RateLimiter {\n private _config: RateLimiterConfig;\n private _attempts: number[] = [];\n private _consecutiveFailures = 0;\n\n constructor(config: Partial<RateLimiterConfig> = {}) {\n this._config = { ...DEFAULT_RATE_LIMITER_CONFIG, ...config };\n }\n\n /**\n * Check if a new attempt is allowed.\n */\n isAllowed(): boolean {\n const now = Date.now();\n const windowStart = now - this._config.windowMs;\n\n // Remove old attempts outside the window\n this._attempts = this._attempts.filter((t) => t > windowStart);\n\n return this._attempts.length < this._config.maxAttempts;\n }\n\n /**\n * Record an attempt.\n */\n recordAttempt(): void {\n this._attempts.push(Date.now());\n }\n\n /**\n * Record a successful connection (resets backoff).\n */\n recordSuccess(): void {\n this._consecutiveFailures = 0;\n }\n\n /**\n * Record a failed connection attempt.\n */\n recordFailure(): void {\n this._consecutiveFailures++;\n }\n\n /**\n * Get the current backoff delay based on consecutive failures.\n */\n getBackoffDelay(): number {\n if (this._consecutiveFailures === 0) {\n return 0;\n }\n\n const delay =\n this._config.initialBackoffMs *\n Math.pow(this._config.backoffMultiplier, this._consecutiveFailures - 1);\n\n return Math.min(delay, this._config.maxBackoffMs);\n }\n\n /**\n * Wait for the backoff period.\n */\n async waitForBackoff(): Promise<void> {\n const delay = this.getBackoffDelay();\n if (delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n}\n\n/**\n * Connection pool for managing multiple connections.\n */\nexport class ConnectionPool {\n private _config: PoolConfig;\n private _connections: PooledConnection[] = [];\n private _waitQueue: Array<{\n resolve: (conn: Connection) => void;\n reject: (err: Error) => void;\n signal?: AbortSignal;\n }> = [];\n private _closed = false;\n private _maintenanceInterval?: NodeJS.Timeout;\n private _rateLimiter: RateLimiter;\n\n // Pool configuration with defaults\n private _minConnections: number;\n private _maxConnections: number;\n private _acquireTimeout: number;\n private _idleTimeout: number;\n\n constructor(config: PoolConfig, rateLimiterConfig?: Partial<RateLimiterConfig>) {\n this._config = config;\n this._minConnections = config.minConnections ?? 1;\n this._maxConnections = config.maxConnections ?? 3;\n this._acquireTimeout = config.acquireTimeout ?? 30000;\n this._idleTimeout = config.idleTimeout ?? 60000;\n this._rateLimiter = new RateLimiter(rateLimiterConfig);\n\n // Start maintenance interval\n this._maintenanceInterval = setInterval(() => {\n this.maintenance();\n }, 10000);\n }\n\n /**\n * Create a new connection pool.\n */\n static async create(config: PoolConfig): Promise<ConnectionPool> {\n const pool = new ConnectionPool(config);\n\n // Initialize minimum connections\n const initPromises: Promise<void>[] = [];\n for (let i = 0; i < pool._minConnections; i++) {\n initPromises.push(pool.addConnection());\n }\n\n try {\n await Promise.all(initPromises);\n } catch (e) {\n // Close any successfully created connections\n await pool.close();\n throw e;\n }\n\n return pool;\n }\n\n /**\n * Get pool statistics.\n */\n get stats(): {\n total: number;\n available: number;\n inUse: number;\n waiting: number;\n } {\n const available = this._connections.filter((c) => !c.inUse).length;\n const inUse = this._connections.filter((c) => c.inUse).length;\n\n return {\n total: this._connections.length,\n available,\n inUse,\n waiting: this._waitQueue.length,\n };\n }\n\n /**\n * Check if pool is closed.\n */\n get isClosed(): boolean {\n return this._closed;\n }\n\n /**\n * Acquire a connection from the pool.\n */\n async acquire(signal?: AbortSignal): Promise<Connection> {\n if (this._closed) {\n throw ErrClosed;\n }\n\n if (signal?.aborted) {\n throw new TransportError({ operation: 'acquire', cause: new Error('Aborted') });\n }\n\n // Try to find an available connection\n const available = this._connections.find((c) => !c.inUse && !c.connection.isClosed);\n if (available) {\n available.inUse = true;\n available.lastUsedAt = Date.now();\n return available.connection;\n }\n\n // Try to create a new connection if under max\n if (this._connections.length < this._maxConnections) {\n try {\n await this.addConnection();\n const newConn = this._connections.find((c) => !c.inUse && !c.connection.isClosed);\n if (newConn) {\n newConn.inUse = true;\n newConn.lastUsedAt = Date.now();\n return newConn.connection;\n }\n } catch {\n // Failed to create, fall through to wait\n }\n }\n\n // Wait for a connection to become available\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n const idx = this._waitQueue.findIndex((w) => w.resolve === resolve && w.reject === reject);\n if (idx !== -1) {\n this._waitQueue.splice(idx, 1);\n }\n reject(\n new TransportError({\n operation: 'acquire',\n cause: new Error('Connection pool acquire timeout'),\n })\n );\n }, this._acquireTimeout);\n\n const cleanup = () => {\n clearTimeout(timeout);\n };\n\n if (signal) {\n signal.addEventListener(\n 'abort',\n () => {\n cleanup();\n const idx = this._waitQueue.findIndex(\n (w) => w.resolve === resolve && w.reject === reject\n );\n if (idx !== -1) {\n this._waitQueue.splice(idx, 1);\n }\n reject(new TransportError({ operation: 'acquire', cause: new Error('Aborted') }));\n },\n { once: true }\n );\n }\n\n this._waitQueue.push({\n resolve: (conn) => {\n cleanup();\n resolve(conn);\n },\n reject: (err) => {\n cleanup();\n reject(err);\n },\n signal,\n });\n });\n }\n\n /**\n * Release a connection back to the pool.\n */\n async release(conn: Connection): Promise<void> {\n const pooledConn = this._connections.find((c) => c.connection === conn);\n if (!pooledConn) {\n return;\n }\n\n // Reset connection state if needed\n try {\n if (conn.inTransaction) {\n await conn.reset();\n }\n } catch {\n // Connection is bad, remove it\n await this.removeConnection(pooledConn);\n return;\n }\n\n pooledConn.inUse = false;\n pooledConn.lastUsedAt = Date.now();\n\n // Check if anyone is waiting\n const waiter = this._waitQueue.shift();\n if (waiter) {\n pooledConn.inUse = true;\n waiter.resolve(conn);\n }\n }\n\n /**\n * Execute a function with a connection from the pool.\n */\n async withConnection<T>(fn: (conn: Connection) => Promise<T>, signal?: AbortSignal): Promise<T> {\n const conn = await this.acquire(signal);\n try {\n return await fn(conn);\n } finally {\n await this.release(conn);\n }\n }\n\n /**\n * Execute a query using a pooled connection.\n */\n async query(query: string, options?: QueryOptions): Promise<QueryResult> {\n return this.withConnection((conn) => conn.query(query, options), options?.signal);\n }\n\n /**\n * Execute a query and return all rows.\n */\n async queryAll(query: string, options?: QueryOptions): Promise<Record<string, unknown>[]> {\n return this.withConnection((conn) => conn.queryAll(query, options), options?.signal);\n }\n\n /**\n * Execute a statement that doesn't return rows.\n */\n async exec(query: string, options?: QueryOptions): Promise<void> {\n return this.withConnection((conn) => conn.exec(query, options), options?.signal);\n }\n\n /**\n * Execute a function within a transaction.\n */\n async withTransaction<T>(fn: (tx: Transaction) => Promise<T>, signal?: AbortSignal): Promise<T> {\n return this.withConnection((conn) => withTransaction(conn, fn, signal), signal);\n }\n\n /**\n * Ping to verify pool health.\n */\n async ping(signal?: AbortSignal): Promise<void> {\n return this.withConnection((conn) => conn.ping(signal), signal);\n }\n\n /**\n * Close the pool and all connections.\n */\n async close(): Promise<void> {\n if (this._closed) {\n return;\n }\n\n this._closed = true;\n\n // Clear maintenance interval\n if (this._maintenanceInterval) {\n clearInterval(this._maintenanceInterval);\n this._maintenanceInterval = undefined;\n }\n\n // Reject all waiters\n for (const waiter of this._waitQueue) {\n waiter.reject(ErrClosed);\n }\n this._waitQueue = [];\n\n // Close all connections\n const closePromises = this._connections.map(async (c) => {\n try {\n await c.connection.close();\n } catch {\n // Ignore close errors\n }\n });\n\n await Promise.all(closePromises);\n this._connections = [];\n }\n\n /**\n * Add a new connection to the pool with rate limiting and exponential backoff.\n */\n private async addConnection(): Promise<void> {\n // Check rate limit\n if (!this._rateLimiter.isAllowed()) {\n throw new TransportError({\n operation: 'connect',\n cause: new Error('Connection rate limit exceeded'),\n });\n }\n\n // Wait for backoff if there were previous failures\n await this._rateLimiter.waitForBackoff();\n\n // Record the attempt\n this._rateLimiter.recordAttempt();\n\n try {\n const conn = await Connection.connect(this._config);\n this._rateLimiter.recordSuccess();\n this._connections.push({\n connection: conn,\n createdAt: Date.now(),\n lastUsedAt: Date.now(),\n inUse: false,\n });\n } catch (e) {\n this._rateLimiter.recordFailure();\n throw e;\n }\n }\n\n /**\n * Remove a connection from the pool.\n */\n private async removeConnection(pooledConn: PooledConnection): Promise<void> {\n const idx = this._connections.indexOf(pooledConn);\n if (idx !== -1) {\n this._connections.splice(idx, 1);\n }\n try {\n await pooledConn.connection.close();\n } catch {\n // Ignore close errors\n }\n }\n\n /**\n * Perform pool maintenance.\n */\n private maintenance(): void {\n if (this._closed) {\n return;\n }\n\n const now = Date.now();\n\n // Remove idle connections exceeding minimum\n const idleConnections = this._connections\n .filter((c) => !c.inUse && now - c.lastUsedAt > this._idleTimeout)\n .sort((a, b) => a.lastUsedAt - b.lastUsedAt);\n\n const toRemove = Math.max(0, idleConnections.length - this._minConnections);\n for (let i = 0; i < toRemove; i++) {\n const conn = idleConnections[i];\n if (conn) {\n this.removeConnection(conn).catch(() => {\n // Ignore removal errors\n });\n }\n }\n\n // Remove closed connections\n for (const conn of this._connections.filter((c) => c.connection.isClosed)) {\n this.removeConnection(conn).catch(() => {\n // Ignore removal errors\n });\n }\n\n // Ensure minimum connections\n const available = this._connections.filter((c) => !c.connection.isClosed).length;\n const toCreate = this._minConnections - available;\n for (let i = 0; i < toCreate; i++) {\n this.addConnection().catch(() => {\n // Ignore creation errors during maintenance\n });\n }\n }\n}\n","/**\n * Geode Client\n *\n * High-level client for interacting with Geode graph database.\n */\n\nimport { Connection, type QueryOptions, type QueryParams } from './connection.js';\nimport { ConnectionPool } from './pool.js';\nimport type { GeodeConfig, PoolConfig } from './config.js';\nimport { parseDSN } from './config.js';\nimport type { QueryResult } from './result.js';\nimport { Transaction, withTransaction } from './transaction.js';\nimport type { PreparedStatement } from './prepared.js';\nimport type { QueryPlan, QueryProfile, ExplainOptions } from './explain.js';\nimport type { BatchQuery, BatchSummary, BatchOptions } from './batch.js';\nimport type { AuthClient } from './auth.js';\nimport { validateLabel, validatePropertyName, validateRelationshipType } from './validate.js';\n\n/**\n * Client configuration options.\n */\nexport interface ClientOptions extends Partial<GeodeConfig> {\n /** Use connection pooling */\n pooling?: boolean;\n /** Pool-specific options */\n pool?: {\n min?: number;\n max?: number;\n acquireTimeout?: number;\n idleTimeout?: number;\n };\n}\n\n/**\n * Geode Client - main entry point for database operations.\n */\nexport class GeodeClient {\n private _config: GeodeConfig;\n private _pool?: ConnectionPool;\n private _connection?: Connection;\n\n private constructor(config: GeodeConfig) {\n this._config = config;\n }\n\n /**\n * Create a new client from a DSN string.\n */\n static async connect(dsn: string, options?: ClientOptions): Promise<GeodeClient> {\n const config = parseDSN(dsn);\n\n // Apply additional options\n if (options) {\n Object.assign(config, options);\n }\n\n const usePool = options?.pooling ?? true;\n const client = new GeodeClient(config);\n\n if (usePool) {\n const poolConfig: PoolConfig = {\n ...config,\n minConnections: options?.pool?.min,\n maxConnections: options?.pool?.max,\n acquireTimeout: options?.pool?.acquireTimeout,\n idleTimeout: options?.pool?.idleTimeout,\n };\n client._pool = await ConnectionPool.create(poolConfig);\n } else {\n client._connection = await Connection.connect(config);\n }\n\n return client;\n }\n\n /**\n * Create a new client from configuration.\n */\n static async connectWithConfig(\n config: GeodeConfig,\n options?: ClientOptions\n ): Promise<GeodeClient> {\n const usePool = options?.pooling ?? true;\n const client = new GeodeClient(config);\n\n if (usePool) {\n const poolConfig: PoolConfig = {\n ...config,\n minConnections: options?.pool?.min,\n maxConnections: options?.pool?.max,\n acquireTimeout: options?.pool?.acquireTimeout,\n idleTimeout: options?.pool?.idleTimeout,\n };\n client._pool = await ConnectionPool.create(poolConfig);\n } else {\n client._connection = await Connection.connect(config);\n }\n\n return client;\n }\n\n /**\n * Get the client configuration.\n */\n get config(): Readonly<GeodeConfig> {\n return this._config;\n }\n\n /**\n * Check if client is closed.\n */\n get isClosed(): boolean {\n if (this._pool) {\n return this._pool.isClosed;\n }\n return this._connection?.isClosed ?? true;\n }\n\n /**\n * Get pool statistics (if using pooling).\n */\n get poolStats(): { total: number; available: number; inUse: number; waiting: number } | null {\n return this._pool?.stats ?? null;\n }\n\n /**\n * Execute a query and return results.\n */\n async query(query: string, options?: QueryOptions): Promise<QueryResult> {\n if (this._pool) {\n return this._pool.query(query, options);\n }\n if (!this._connection) {\n throw new Error('Client is not connected');\n }\n return this._connection.query(query, options);\n }\n\n /**\n * Execute a query and return all rows as objects.\n */\n async queryAll(query: string, options?: QueryOptions): Promise<Record<string, unknown>[]> {\n if (this._pool) {\n return this._pool.queryAll(query, options);\n }\n if (!this._connection) {\n throw new Error('Client is not connected');\n }\n return this._connection.queryAll(query, options);\n }\n\n /**\n * Execute a query and return the first row.\n */\n async queryFirst(query: string, options?: QueryOptions): Promise<Record<string, unknown> | null> {\n const result = await this.query(query, options);\n return result.firstObject();\n }\n\n /**\n * Execute a query and return a scalar value.\n */\n async queryScalar<T = unknown>(\n query: string,\n column: string,\n options?: QueryOptions\n ): Promise<T | null> {\n const row = await this.queryFirst(query, options);\n if (!row) {\n return null;\n }\n return row[column] as T;\n }\n\n /**\n * Execute a statement that doesn't return rows.\n */\n async exec(query: string, options?: QueryOptions): Promise<void> {\n if (this._pool) {\n return this._pool.exec(query, options);\n }\n if (!this._connection) {\n throw new Error('Client is not connected');\n }\n return this._connection.exec(query, options);\n }\n\n /**\n * Execute multiple statements.\n */\n async execBatch(queries: Array<{ query: string; params?: QueryParams }>): Promise<void> {\n for (const q of queries) {\n await this.exec(q.query, { params: q.params });\n }\n }\n\n /**\n * Execute a function within a transaction.\n */\n async withTransaction<T>(fn: (tx: Transaction) => Promise<T>, signal?: AbortSignal): Promise<T> {\n if (this._pool) {\n return this._pool.withTransaction(fn, signal);\n }\n if (!this._connection) {\n throw new Error('Client is not connected');\n }\n return withTransaction(this._connection, fn, signal);\n }\n\n /**\n * Get a raw connection from the pool (or the single connection).\n *\n * The connection must be released after use.\n */\n async getConnection(signal?: AbortSignal): Promise<Connection> {\n if (this._pool) {\n return this._pool.acquire(signal);\n }\n if (!this._connection) {\n throw new Error('Client is not connected');\n }\n return this._connection;\n }\n\n /**\n * Release a connection back to the pool.\n *\n * Only needed when using getConnection() with pooling.\n */\n async releaseConnection(conn: Connection): Promise<void> {\n if (this._pool) {\n return this._pool.release(conn);\n }\n // No-op for single connection mode\n }\n\n /**\n * Execute a function with a dedicated connection.\n */\n async withConnection<T>(fn: (conn: Connection) => Promise<T>, signal?: AbortSignal): Promise<T> {\n if (this._pool) {\n return this._pool.withConnection(fn, signal);\n }\n if (!this._connection) {\n throw new Error('Client is not connected');\n }\n return fn(this._connection);\n }\n\n /**\n * Ping the server to check connectivity.\n */\n async ping(signal?: AbortSignal): Promise<void> {\n if (this._pool) {\n return this._pool.ping(signal);\n }\n if (!this._connection) {\n throw new Error('Client is not connected');\n }\n return this._connection.ping(signal);\n }\n\n /**\n * Close the client and release all resources.\n */\n async close(): Promise<void> {\n if (this._pool) {\n await this._pool.close();\n this._pool = undefined;\n }\n if (this._connection) {\n await this._connection.close();\n this._connection = undefined;\n }\n }\n\n // Convenience methods for common graph operations\n\n /**\n * Create a node with labels and properties.\n */\n async createNode(\n labels: string | string[],\n properties?: Record<string, unknown>\n ): Promise<Record<string, unknown>> {\n // Validate labels\n const labelArray = Array.isArray(labels) ? labels : [labels];\n for (const label of labelArray) {\n validateLabel(label);\n }\n const labelStr = labelArray.join(':');\n\n // Validate property keys if provided\n if (properties) {\n for (const key of Object.keys(properties)) {\n validatePropertyName(key);\n }\n }\n\n const propsStr = properties ? ' $props' : '';\n\n const result = await this.queryFirst(\n `CREATE (n:${labelStr}${propsStr}) RETURN n`,\n properties ? { params: { props: properties } } : undefined\n );\n\n return result?.['n'] as Record<string, unknown>;\n }\n\n /**\n * Find nodes by label and optional property filter.\n */\n async findNodes(\n label: string,\n filter?: Record<string, unknown>,\n options?: { limit?: number; skip?: number }\n ): Promise<Record<string, unknown>[]> {\n // Validate label\n validateLabel(label);\n\n // Validate filter property keys\n if (filter) {\n for (const key of Object.keys(filter)) {\n validatePropertyName(key);\n }\n }\n\n let query = `MATCH (n:${label})`;\n\n if (filter && Object.keys(filter).length > 0) {\n const conditions = Object.keys(filter)\n .map((k) => `n.${k} = $${k}`)\n .join(' AND ');\n query += ` WHERE ${conditions}`;\n }\n\n query += ' RETURN n';\n\n if (options?.skip) {\n query += ` SKIP ${options.skip}`;\n }\n if (options?.limit) {\n query += ` LIMIT ${options.limit}`;\n }\n\n const rows = await this.queryAll(query, { params: filter });\n return rows.map((r) => r['n'] as Record<string, unknown>);\n }\n\n /**\n * Find a single node by label and property.\n */\n async findNode(\n label: string,\n property: string,\n value: unknown\n ): Promise<Record<string, unknown> | null> {\n // Validation happens in findNodes, but validate property here for better error messages\n validatePropertyName(property);\n const rows = await this.findNodes(label, { [property]: value }, { limit: 1 });\n return rows[0] ?? null;\n }\n\n /**\n * Create a relationship between two nodes.\n */\n async createRelationship(\n startLabel: string,\n startProp: string,\n startValue: unknown,\n type: string,\n endLabel: string,\n endProp: string,\n endValue: unknown,\n properties?: Record<string, unknown>\n ): Promise<Record<string, unknown>> {\n // Validate all identifiers\n validateLabel(startLabel);\n validateLabel(endLabel);\n validateRelationshipType(type);\n validatePropertyName(startProp);\n validatePropertyName(endProp);\n\n // Validate property keys if provided\n if (properties) {\n for (const key of Object.keys(properties)) {\n validatePropertyName(key);\n }\n }\n\n const propsStr = properties ? ' $props' : '';\n\n const result = await this.queryFirst(\n `MATCH (a:${startLabel}), (b:${endLabel})\n WHERE a.${startProp} = $startValue AND b.${endProp} = $endValue\n CREATE (a)-[r:${type}${propsStr}]->(b)\n RETURN r`,\n {\n params: {\n startValue,\n endValue,\n ...(properties ? { props: properties } : {}),\n },\n }\n );\n\n return result?.['r'] as Record<string, unknown>;\n }\n\n /**\n * Delete a node by label and property.\n */\n async deleteNode(label: string, property: string, value: unknown): Promise<number> {\n // Validate identifiers\n validateLabel(label);\n validatePropertyName(property);\n\n const result = await this.queryFirst(\n `MATCH (n:${label}) WHERE n.${property} = $value DETACH DELETE n RETURN count(n) AS deleted`,\n { params: { value } }\n );\n return (result?.['deleted'] as number) ?? 0;\n }\n\n /**\n * Update node properties.\n */\n async updateNode(\n label: string,\n matchProp: string,\n matchValue: unknown,\n updates: Record<string, unknown>\n ): Promise<Record<string, unknown> | null> {\n // Validate identifiers\n validateLabel(label);\n validatePropertyName(matchProp);\n\n // Validate update property keys\n for (const key of Object.keys(updates)) {\n validatePropertyName(key);\n }\n\n const setStatements = Object.keys(updates)\n .map((k) => `n.${k} = $${k}`)\n .join(', ');\n\n const result = await this.queryFirst(\n `MATCH (n:${label}) WHERE n.${matchProp} = $matchValue SET ${setStatements} RETURN n`,\n { params: { matchValue, ...updates } }\n );\n\n return result?.['n'] as Record<string, unknown> | null;\n }\n\n /**\n * Count nodes by label.\n */\n async countNodes(label: string, filter?: Record<string, unknown>): Promise<number> {\n // Validate label\n validateLabel(label);\n\n // Validate filter property keys\n if (filter) {\n for (const key of Object.keys(filter)) {\n validatePropertyName(key);\n }\n }\n\n let query = `MATCH (n:${label})`;\n\n if (filter && Object.keys(filter).length > 0) {\n const conditions = Object.keys(filter)\n .map((k) => `n.${k} = $${k}`)\n .join(' AND ');\n query += ` WHERE ${conditions}`;\n }\n\n query += ' RETURN count(n) AS count';\n\n const result = await this.queryFirst(query, { params: filter });\n return (result?.['count'] as number) ?? 0;\n }\n\n // Advanced operations\n\n /**\n * Create a prepared statement.\n *\n * @param query - Query text with parameters\n * @returns Prepared statement\n *\n * @example\n * ```typescript\n * const stmt = client.prepare('MATCH (n:Person {name: $name}) RETURN n');\n * const result1 = await stmt.query({ name: 'Alice' });\n * const result2 = await stmt.query({ name: 'Bob' });\n * stmt.close();\n * ```\n */\n async prepare(query: string): Promise<PreparedStatement> {\n const conn = await this.getConnection();\n try {\n return conn.prepare(query);\n } finally {\n await this.releaseConnection(conn);\n }\n }\n\n /**\n * Get the query execution plan without executing.\n *\n * @param query - Query to explain\n * @param options - Options including parameters\n * @returns Query execution plan\n *\n * @example\n * ```typescript\n * const plan = await client.explain('MATCH (n:Person)-[:KNOWS]->(m) RETURN n, m');\n * console.log('Estimated cost:', plan.totalCost);\n * ```\n */\n async explain(query: string, options?: ExplainOptions): Promise<QueryPlan> {\n const conn = await this.getConnection(options?.signal);\n try {\n return await conn.explain(query, options);\n } finally {\n await this.releaseConnection(conn);\n }\n }\n\n /**\n * Execute a query with profiling.\n *\n * @param query - Query to profile\n * @param options - Options including parameters\n * @returns Query execution profile\n *\n * @example\n * ```typescript\n * const profile = await client.profile('MATCH (n:Person) RETURN count(n)');\n * console.log('Execution time:', profile.totalTimeMs, 'ms');\n * ```\n */\n async profile(query: string, options?: ExplainOptions): Promise<QueryProfile> {\n const conn = await this.getConnection(options?.signal);\n try {\n return await conn.profile(query, options);\n } finally {\n await this.releaseConnection(conn);\n }\n }\n\n /**\n * Execute multiple queries in a batch.\n *\n * @param queries - Array of queries to execute\n * @param options - Batch execution options\n * @returns Batch execution summary\n *\n * @example\n * ```typescript\n * const summary = await client.batch([\n * { query: 'CREATE (a:Person {name: \"Alice\"})' },\n * { query: 'CREATE (b:Person {name: \"Bob\"})' },\n * ]);\n * console.log(`${summary.successful}/${summary.total} succeeded`);\n * ```\n */\n async batch(queries: BatchQuery[], options?: BatchOptions): Promise<BatchSummary> {\n const conn = await this.getConnection(options?.signal);\n try {\n return await conn.batch(queries, options);\n } finally {\n await this.releaseConnection(conn);\n }\n }\n\n /**\n * Get an auth client for user and role management.\n *\n * @returns Auth client\n *\n * @example\n * ```typescript\n * const auth = await client.auth();\n * await auth.createUser('alice', { password: 'secret123' });\n * await auth.assignRole('alice', 'analyst');\n * ```\n */\n async auth(): Promise<AuthClient> {\n const { AuthClient } = await import('./auth.js');\n const conn = await this.getConnection();\n return new AuthClient(conn);\n }\n}\n\n/**\n * Create a Geode client from a DSN string.\n *\n * @example\n * ```typescript\n * const client = await createClient('quic://localhost:3141');\n * const rows = await client.queryAll('MATCH (n) RETURN n LIMIT 10');\n * await client.close();\n * ```\n */\nexport async function createClient(dsn: string, options?: ClientOptions): Promise<GeodeClient> {\n return GeodeClient.connect(dsn, options);\n}\n\n/**\n * Create a Geode client from configuration.\n */\nexport async function createClientWithConfig(\n config: GeodeConfig,\n options?: ClientOptions\n): Promise<GeodeClient> {\n return GeodeClient.connectWithConfig(config, options);\n}\n","/**\n * Geode Client for Node.js\n *\n * A high-performance client library for the Geode graph database,\n * implementing ISO/IEC 39075:2024 GQL standard over QUIC + TLS 1.3 or gRPC.\n *\n * @packageDocumentation\n */\n\n// Main client exports\nexport { GeodeClient, createClient, createClientWithConfig, type ClientOptions } from './client.js';\n\n// Connection management\nexport { Connection, type QueryOptions, type QueryParams } from './connection.js';\nexport { ConnectionPool } from './pool.js';\n\n// Configuration\nexport {\n type GeodeConfig,\n type PoolConfig,\n type TransportType,\n type DSNScheme,\n parseDSN,\n defaultConfig,\n validateConfig,\n getAddress,\n cloneConfig,\n redactDSN,\n redactConfig,\n DEFAULT_PORT,\n DEFAULT_GRPC_PORT,\n DEFAULT_PAGE_SIZE,\n DEFAULT_HELLO_NAME,\n DEFAULT_HELLO_VERSION,\n DEFAULT_CONFORMANCE,\n MAX_QUERY_LENGTH,\n MAX_PAGE_SIZE,\n SUPPORTED_SCHEMES,\n} from './config.js';\n\n// Query results\nexport { QueryResult, QueryResultIterator } from './result.js';\n\n// Transactions\nexport { Transaction, withTransaction } from './transaction.js';\n\n// Types\nexport {\n type GQLValueKind,\n type GQLType,\n type GQLRange,\n type GQLId,\n type GQLNode,\n type GQLEdge,\n type RawEdge,\n type GQLPath,\n GQLValue,\n parseGQLType,\n fromJSON,\n type ColumnDef,\n type ColumnInfo,\n type Row,\n parseRow,\n rowToObject,\n} from './types.js';\n\n// Errors\nexport {\n type GeodeError,\n DriverError,\n TransportError,\n ConfigError,\n SecurityError,\n StateError,\n type ConnectionState,\n StatusClass,\n type StatusClassType,\n ErrClosed,\n ErrQueryInProgress,\n ErrTxInProgress,\n ErrNoTx,\n ErrTxDone,\n ErrRowsClosed,\n ErrBadConn,\n isDriverError,\n isGeodeError,\n isRetryableError,\n} from './errors.js';\n\n// Transport (for advanced usage and testing)\nexport {\n type Transport,\n BaseTransport,\n QuicTransport,\n QuicheTransport,\n MockTransport,\n createTransport,\n buildTLSConfig,\n} from './transport.js';\n\n// gRPC Transport\nexport { GrpcTransport } from './grpc-transport.js';\n\n// Validation\nexport {\n validateQuery,\n validateParamName,\n validateParamValue,\n validateHostname,\n validatePort,\n validatePageSize,\n validateSavepointName,\n sanitizeForLog,\n} from './validate.js';\n\n// Query Builder\nexport {\n QueryBuilder,\n PatternBuilder,\n PredicateBuilder,\n NodePatternBuilder,\n EdgePatternBuilder,\n query,\n pattern,\n predicate,\n node,\n edge,\n type EdgeDirection,\n type SortDirection,\n type PredicateOp,\n type NodePattern,\n type EdgePattern,\n type PatternElement,\n} from './query-builder.js';\n\n// Prepared Statements\nexport { PreparedStatement, prepare, extractParameters, type ParameterInfo } from './prepared.js';\n\n// Query Explain/Profile\nexport {\n explain,\n profile,\n formatPlan,\n formatProfile,\n type QueryPlan,\n type QueryProfile,\n type PlanOperation,\n type OperationTiming,\n type ExplainOptions,\n} from './explain.js';\n\n// Batch Operations\nexport {\n batch,\n batchAll,\n batchFirst,\n batchMap,\n batchParallel,\n type BatchQuery,\n type BatchResult,\n type BatchSummary,\n type BatchOptions,\n} from './batch.js';\n\n// Authentication & Authorization\nexport {\n AuthClient,\n createAuthClient,\n type User,\n type Role,\n type Permission,\n type RLSPolicy,\n type CreateUserOptions,\n type CreateRoleOptions,\n type CreateRLSPolicyOptions,\n} from './auth.js';\n\n// Protobuf wire protocol (for advanced usage)\nexport {\n encodeWithLengthPrefix,\n encodeQuicClientMessage,\n decodeQuicServerMessage,\n decodeLengthPrefix,\n protoValueToJS,\n jsToProtoValue,\n buildHelloRequest,\n buildExecuteRequest,\n buildPullRequest,\n buildPingRequest,\n buildBeginRequest,\n buildCommitRequest,\n buildRollbackRequest,\n buildSavepointRequest,\n buildRollbackToRequest,\n rowToRecord,\n getProtoPath,\n ensureProtoInitialized,\n type HelloRequest,\n type HelloResponse,\n type ExecuteRequest,\n type ExecutionResponse,\n type SchemaDefinition,\n type ColumnDefinition,\n type DataPage,\n type Row as ProtoRow,\n type ProtoValue,\n type ProtoError,\n type PingRequest,\n type PingResponse,\n type BeginRequest,\n type BeginResponse,\n type CommitRequest,\n type CommitResponse,\n type RollbackRequest,\n type RollbackResponse,\n type QuicClientMessage,\n type QuicServerMessage,\n type Param,\n type PullRequest,\n type PullResponse,\n type Status,\n} from './proto.js';\n\n// Re-export decimal.js-light for type convenience\nexport type { default as Decimal } from 'decimal.js-light';\n","/**\n * Query Builder\n *\n * Fluent API for building GQL queries programmatically.\n */\n\nimport type { QueryParams } from './connection.js';\nimport {\n validateLabel,\n validateRelationshipType,\n validatePropertyName,\n validateVariableName,\n} from './validate.js';\n\n/**\n * Edge direction for pattern matching.\n */\nexport type EdgeDirection = 'outgoing' | 'incoming' | 'both';\n\n/**\n * Sort direction.\n */\nexport type SortDirection = 'ASC' | 'DESC';\n\n/**\n * Predicate operator.\n */\nexport type PredicateOp =\n | '='\n | '<>'\n | '!='\n | '<'\n | '<='\n | '>'\n | '>='\n | 'IN'\n | 'NOT IN'\n | 'CONTAINS'\n | 'STARTS WITH'\n | 'ENDS WITH'\n | 'IS NULL'\n | 'IS NOT NULL';\n\n/**\n * Node pattern for MATCH clauses.\n */\nexport interface NodePattern {\n variable?: string;\n labels?: string[];\n properties?: Record<string, unknown>;\n}\n\n/**\n * Edge pattern for MATCH clauses.\n */\nexport interface EdgePattern {\n variable?: string;\n type?: string;\n direction: EdgeDirection;\n properties?: Record<string, unknown>;\n minHops?: number;\n maxHops?: number;\n}\n\n/**\n * Pattern element (node or edge).\n */\nexport type PatternElement =\n | { kind: 'node'; pattern: NodePattern }\n | { kind: 'edge'; pattern: EdgePattern };\n\n/**\n * Build a node pattern.\n */\nexport class NodePatternBuilder {\n private _variable?: string;\n private _labels: string[] = [];\n private _properties: Record<string, unknown> = {};\n\n /**\n * Set the variable name.\n */\n as(variable: string): this {\n validateVariableName(variable);\n this._variable = variable;\n return this;\n }\n\n /**\n * Add a label.\n */\n label(label: string): this {\n validateLabel(label);\n this._labels.push(label);\n return this;\n }\n\n /**\n * Add multiple labels.\n */\n labels(...labels: string[]): this {\n for (const l of labels) {\n validateLabel(l);\n }\n this._labels.push(...labels);\n return this;\n }\n\n /**\n * Set a property.\n */\n prop(key: string, value: unknown): this {\n validatePropertyName(key);\n this._properties[key] = value;\n return this;\n }\n\n /**\n * Set multiple properties.\n */\n props(properties: Record<string, unknown>): this {\n for (const key of Object.keys(properties)) {\n validatePropertyName(key);\n }\n Object.assign(this._properties, properties);\n return this;\n }\n\n /**\n * Build the pattern.\n */\n build(): NodePattern {\n return {\n variable: this._variable,\n labels: this._labels.length > 0 ? this._labels : undefined,\n properties: Object.keys(this._properties).length > 0 ? this._properties : undefined,\n };\n }\n\n /**\n * Convert to GQL string.\n */\n toGQL(): string {\n let result = '(';\n\n if (this._variable) {\n result += this._variable;\n }\n\n if (this._labels.length > 0) {\n result += ':' + this._labels.join(':');\n }\n\n if (Object.keys(this._properties).length > 0) {\n result += ' ' + propsToGQL(this._properties);\n }\n\n return result + ')';\n }\n}\n\n/**\n * Build an edge pattern.\n */\nexport class EdgePatternBuilder {\n private _variable?: string;\n private _type?: string;\n private _direction: EdgeDirection = 'outgoing';\n private _properties: Record<string, unknown> = {};\n private _minHops?: number;\n private _maxHops?: number;\n\n /**\n * Set the variable name.\n */\n as(variable: string): this {\n validateVariableName(variable);\n this._variable = variable;\n return this;\n }\n\n /**\n * Set the relationship type.\n */\n type(type: string): this {\n validateRelationshipType(type);\n this._type = type;\n return this;\n }\n\n /**\n * Set outgoing direction.\n */\n outgoing(): this {\n this._direction = 'outgoing';\n return this;\n }\n\n /**\n * Set incoming direction.\n */\n incoming(): this {\n this._direction = 'incoming';\n return this;\n }\n\n /**\n * Set bidirectional.\n */\n both(): this {\n this._direction = 'both';\n return this;\n }\n\n /**\n * Set direction.\n */\n direction(dir: EdgeDirection): this {\n this._direction = dir;\n return this;\n }\n\n /**\n * Set a property.\n */\n prop(key: string, value: unknown): this {\n validatePropertyName(key);\n this._properties[key] = value;\n return this;\n }\n\n /**\n * Set multiple properties.\n */\n props(properties: Record<string, unknown>): this {\n for (const key of Object.keys(properties)) {\n validatePropertyName(key);\n }\n Object.assign(this._properties, properties);\n return this;\n }\n\n /**\n * Set variable length path.\n */\n hops(min?: number, max?: number): this {\n this._minHops = min;\n this._maxHops = max;\n return this;\n }\n\n /**\n * Build the pattern.\n */\n build(): EdgePattern {\n return {\n variable: this._variable,\n type: this._type,\n direction: this._direction,\n properties: Object.keys(this._properties).length > 0 ? this._properties : undefined,\n minHops: this._minHops,\n maxHops: this._maxHops,\n };\n }\n\n /**\n * Convert to GQL string.\n */\n toGQL(): string {\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n const hasContent = this._variable || this._type || Object.keys(this._properties).length > 0;\n\n let inner = '';\n if (hasContent) {\n inner = '[';\n if (this._variable) {\n inner += this._variable;\n }\n if (this._type) {\n inner += ':' + this._type;\n }\n if (this._minHops !== undefined || this._maxHops !== undefined) {\n inner += '*';\n if (this._minHops !== undefined) {\n inner += this._minHops;\n }\n inner += '..';\n if (this._maxHops !== undefined) {\n inner += this._maxHops;\n }\n }\n if (Object.keys(this._properties).length > 0) {\n inner += ' ' + propsToGQL(this._properties);\n }\n inner += ']';\n }\n\n switch (this._direction) {\n case 'outgoing':\n return `-${inner}->`;\n case 'incoming':\n return `<-${inner}-`;\n case 'both':\n return `-${inner}-`;\n }\n }\n}\n\n/**\n * Build a path pattern.\n */\nexport class PatternBuilder {\n private _elements: PatternElement[] = [];\n\n /**\n * Add a node to the pattern.\n */\n node(builder?: (n: NodePatternBuilder) => void): this {\n const nodeBuilder = new NodePatternBuilder();\n if (builder) {\n builder(nodeBuilder);\n }\n this._elements.push({ kind: 'node', pattern: nodeBuilder.build() });\n return this;\n }\n\n /**\n * Add an outgoing edge to the pattern.\n */\n outgoing(builder?: (e: EdgePatternBuilder) => void): this {\n const edgeBuilder = new EdgePatternBuilder().outgoing();\n if (builder) {\n builder(edgeBuilder);\n }\n this._elements.push({ kind: 'edge', pattern: edgeBuilder.build() });\n return this;\n }\n\n /**\n * Add an incoming edge to the pattern.\n */\n incoming(builder?: (e: EdgePatternBuilder) => void): this {\n const edgeBuilder = new EdgePatternBuilder().incoming();\n if (builder) {\n builder(edgeBuilder);\n }\n this._elements.push({ kind: 'edge', pattern: edgeBuilder.build() });\n return this;\n }\n\n /**\n * Add a bidirectional edge to the pattern.\n */\n related(builder?: (e: EdgePatternBuilder) => void): this {\n const edgeBuilder = new EdgePatternBuilder().both();\n if (builder) {\n builder(edgeBuilder);\n }\n this._elements.push({ kind: 'edge', pattern: edgeBuilder.build() });\n return this;\n }\n\n /**\n * Convert to GQL string.\n */\n toGQL(): string {\n let result = '';\n for (const element of this._elements) {\n if (element.kind === 'node') {\n result += nodePatternToGQL(element.pattern);\n } else {\n result += edgePatternToGQL(element.pattern);\n }\n }\n return result;\n }\n}\n\n/**\n * Build a predicate for WHERE clauses.\n */\nexport class PredicateBuilder {\n private _predicates: string[] = [];\n private _params: QueryParams = {};\n private _paramCounter = 0;\n\n /**\n * Add a comparison predicate.\n */\n compare(left: string, op: PredicateOp, right: unknown): this {\n if (op === 'IS NULL') {\n this._predicates.push(`${left} IS NULL`);\n } else if (op === 'IS NOT NULL') {\n this._predicates.push(`${left} IS NOT NULL`);\n } else {\n const paramName = this.nextParam();\n this._predicates.push(`${left} ${op} $${paramName}`);\n this._params[paramName] = right;\n }\n return this;\n }\n\n /**\n * Add an equality predicate.\n */\n eq(left: string, right: unknown): this {\n return this.compare(left, '=', right);\n }\n\n /**\n * Add a not-equal predicate.\n */\n neq(left: string, right: unknown): this {\n return this.compare(left, '<>', right);\n }\n\n /**\n * Add a less-than predicate.\n */\n lt(left: string, right: unknown): this {\n return this.compare(left, '<', right);\n }\n\n /**\n * Add a less-than-or-equal predicate.\n */\n lte(left: string, right: unknown): this {\n return this.compare(left, '<=', right);\n }\n\n /**\n * Add a greater-than predicate.\n */\n gt(left: string, right: unknown): this {\n return this.compare(left, '>', right);\n }\n\n /**\n * Add a greater-than-or-equal predicate.\n */\n gte(left: string, right: unknown): this {\n return this.compare(left, '>=', right);\n }\n\n /**\n * Add an IN predicate.\n */\n in(left: string, values: unknown[]): this {\n const paramName = this.nextParam();\n this._predicates.push(`${left} IN $${paramName}`);\n this._params[paramName] = values;\n return this;\n }\n\n /**\n * Add a NOT IN predicate.\n */\n notIn(left: string, values: unknown[]): this {\n const paramName = this.nextParam();\n this._predicates.push(`${left} NOT IN $${paramName}`);\n this._params[paramName] = values;\n return this;\n }\n\n /**\n * Add a CONTAINS predicate.\n */\n contains(left: string, value: string): this {\n return this.compare(left, 'CONTAINS', value);\n }\n\n /**\n * Add a STARTS WITH predicate.\n */\n startsWith(left: string, value: string): this {\n return this.compare(left, 'STARTS WITH', value);\n }\n\n /**\n * Add an ENDS WITH predicate.\n */\n endsWith(left: string, value: string): this {\n return this.compare(left, 'ENDS WITH', value);\n }\n\n /**\n * Add an IS NULL predicate.\n */\n isNull(expr: string): this {\n return this.compare(expr, 'IS NULL', null);\n }\n\n /**\n * Add an IS NOT NULL predicate.\n */\n isNotNull(expr: string): this {\n return this.compare(expr, 'IS NOT NULL', null);\n }\n\n /**\n * Add a raw predicate expression.\n *\n * **⚠️ SECURITY WARNING: This method bypasses all input validation.**\n *\n * Using raw() with user-supplied input can lead to GQL injection attacks.\n * Only use this method when:\n * 1. The expression is entirely constructed from trusted, hardcoded strings\n * 2. All dynamic values are passed via the `params` argument (using $paramName syntax)\n *\n * @example\n * ```typescript\n * // SAFE: Using parameters for dynamic values\n * predicate().raw('n.custom_field CONTAINS $pattern', { pattern: userInput })\n *\n * // UNSAFE: Never interpolate user input directly\n * predicate().raw(`n.name = '${userInput}'`) // VULNERABLE TO INJECTION!\n * ```\n *\n * Consider using the typed predicate methods (eq, gt, contains, etc.) instead.\n *\n * @param expr - Raw predicate expression (MUST be trusted input)\n * @param params - Parameters to bind (safe for user input)\n * @deprecated Consider using typed predicate methods instead for better security.\n */\n raw(expr: string, params?: QueryParams): this {\n this._predicates.push(expr);\n if (params) {\n Object.assign(this._params, params);\n }\n return this;\n }\n\n /**\n * Combine predicates with AND.\n */\n and(builder: PredicateBuilder): this {\n const sub = builder.build();\n if (sub.predicate) {\n this._predicates.push(`(${sub.predicate})`);\n Object.assign(this._params, sub.params);\n }\n return this;\n }\n\n /**\n * Combine predicates with OR.\n */\n or(builder: PredicateBuilder): this {\n const sub = builder.build();\n if (sub.predicate) {\n if (this._predicates.length > 0) {\n const current = this._predicates.join(' AND ');\n this._predicates = [`(${current}) OR (${sub.predicate})`];\n } else {\n this._predicates.push(sub.predicate);\n }\n Object.assign(this._params, sub.params);\n }\n return this;\n }\n\n /**\n * Build the predicate.\n */\n build(): { predicate: string; params: QueryParams } {\n return {\n predicate: this._predicates.join(' AND '),\n params: this._params,\n };\n }\n\n private nextParam(): string {\n return `pred_${++this._paramCounter}`;\n }\n}\n\n/**\n * GQL Query Builder.\n */\nexport class QueryBuilder {\n private _clauses: string[] = [];\n private _params: QueryParams = {};\n\n /**\n * Add a MATCH clause.\n */\n match(pattern: string | PatternBuilder): this {\n const p = typeof pattern === 'string' ? pattern : pattern.toGQL();\n this._clauses.push(`MATCH ${p}`);\n return this;\n }\n\n /**\n * Add an OPTIONAL MATCH clause.\n */\n optionalMatch(pattern: string | PatternBuilder): this {\n const p = typeof pattern === 'string' ? pattern : pattern.toGQL();\n this._clauses.push(`OPTIONAL MATCH ${p}`);\n return this;\n }\n\n /**\n * Add a WHERE clause.\n *\n * **⚠️ SECURITY WARNING when using string predicates:**\n *\n * When passing a string predicate, this method does NOT validate or sanitize input.\n * Using string predicates with user-supplied data can lead to GQL injection attacks.\n *\n * @example\n * ```typescript\n * // RECOMMENDED: Use PredicateBuilder for type-safe, injection-resistant queries\n * query().where(predicate().eq('n.name', userInput))\n *\n * // SAFE: Using parameters with string predicates\n * query().where('n.name = $name', { name: userInput })\n *\n * // UNSAFE: Never interpolate user input directly in string predicates\n * query().where(`n.name = '${userInput}'`) // VULNERABLE TO INJECTION!\n * ```\n *\n * @param predicate - A PredicateBuilder (recommended) or raw predicate string\n * @param params - Parameters to bind when using string predicates\n */\n where(predicate: string | PredicateBuilder, params?: QueryParams): this {\n if (typeof predicate === 'string') {\n this._clauses.push(`WHERE ${predicate}`);\n if (params) {\n Object.assign(this._params, params);\n }\n } else {\n const built = predicate.build();\n this._clauses.push(`WHERE ${built.predicate}`);\n Object.assign(this._params, built.params);\n }\n return this;\n }\n\n /**\n * Add a WITH clause.\n */\n with(...expressions: string[]): this {\n this._clauses.push(`WITH ${expressions.join(', ')}`);\n return this;\n }\n\n /**\n * Add a RETURN clause.\n */\n return(...expressions: string[]): this {\n this._clauses.push(`RETURN ${expressions.join(', ')}`);\n return this;\n }\n\n /**\n * Add RETURN DISTINCT.\n */\n returnDistinct(...expressions: string[]): this {\n this._clauses.push(`RETURN DISTINCT ${expressions.join(', ')}`);\n return this;\n }\n\n /**\n * Add an ORDER BY clause.\n */\n orderBy(...expressions: Array<string | [string, SortDirection]>): this {\n const parts = expressions.map((e) => {\n if (typeof e === 'string') {\n return e;\n }\n return `${e[0]} ${e[1]}`;\n });\n this._clauses.push(`ORDER BY ${parts.join(', ')}`);\n return this;\n }\n\n /**\n * Add a SKIP clause.\n */\n skip(count: number): this {\n this._clauses.push(`SKIP ${count}`);\n return this;\n }\n\n /**\n * Add a LIMIT clause.\n */\n limit(count: number): this {\n this._clauses.push(`LIMIT ${count}`);\n return this;\n }\n\n /**\n * Add a CREATE clause.\n */\n create(pattern: string | PatternBuilder): this {\n const p = typeof pattern === 'string' ? pattern : pattern.toGQL();\n this._clauses.push(`CREATE ${p}`);\n return this;\n }\n\n /**\n * Add a MERGE clause.\n */\n merge(pattern: string | PatternBuilder): this {\n const p = typeof pattern === 'string' ? pattern : pattern.toGQL();\n this._clauses.push(`MERGE ${p}`);\n return this;\n }\n\n /**\n * Add a DELETE clause.\n */\n delete(...variables: string[]): this {\n this._clauses.push(`DELETE ${variables.join(', ')}`);\n return this;\n }\n\n /**\n * Add a DETACH DELETE clause.\n */\n detachDelete(...variables: string[]): this {\n this._clauses.push(`DETACH DELETE ${variables.join(', ')}`);\n return this;\n }\n\n /**\n * Add a SET clause.\n */\n set(...assignments: string[]): this {\n this._clauses.push(`SET ${assignments.join(', ')}`);\n return this;\n }\n\n /**\n * Add a REMOVE clause.\n */\n remove(...items: string[]): this {\n this._clauses.push(`REMOVE ${items.join(', ')}`);\n return this;\n }\n\n /**\n * Add a raw GQL clause.\n *\n * **⚠️ SECURITY WARNING: This method bypasses all input validation.**\n *\n * Using raw() with user-supplied input can lead to GQL injection attacks.\n * Only use this method when:\n * 1. The clause is entirely constructed from trusted, hardcoded strings\n * 2. All dynamic values are passed via the `params` argument (using $paramName syntax)\n *\n * @example\n * ```typescript\n * // SAFE: Using parameters for dynamic values\n * query().raw('CALL db.index.fulltext.queryNodes(\"idx\", $term)', { term: userInput })\n *\n * // UNSAFE: Never interpolate user input directly\n * query().raw(`MATCH (n:${userLabel})`) // VULNERABLE TO INJECTION!\n * ```\n *\n * Consider using the typed query builder methods instead.\n *\n * @param clause - Raw GQL clause (MUST be trusted input)\n * @param params - Parameters to bind (safe for user input)\n * @deprecated Consider using typed query builder methods instead for better security.\n */\n raw(clause: string, params?: QueryParams): this {\n this._clauses.push(clause);\n if (params) {\n Object.assign(this._params, params);\n }\n return this;\n }\n\n /**\n * Add a parameter.\n */\n param(name: string, value: unknown): this {\n this._params[name] = value;\n return this;\n }\n\n /**\n * Add multiple parameters.\n */\n params(params: QueryParams): this {\n Object.assign(this._params, params);\n return this;\n }\n\n /**\n * Build the query string.\n */\n build(): { query: string; params: QueryParams } {\n return {\n query: this._clauses.join('\\n'),\n params: this._params,\n };\n }\n\n /**\n * Get the query string.\n */\n toGQL(): string {\n return this._clauses.join('\\n');\n }\n\n /**\n * Get the parameters.\n */\n getParams(): QueryParams {\n return { ...this._params };\n }\n}\n\n// Helper functions\n\nfunction propsToGQL(props: Record<string, unknown>): string {\n const entries = Object.entries(props).map(([k, v]) => `${k}: ${valueToGQL(v)}`);\n return `{${entries.join(', ')}}`;\n}\n\nfunction valueToGQL(value: unknown): string {\n if (value === null || value === undefined) {\n return 'null';\n }\n if (typeof value === 'string') {\n // Escape backslashes first, then single quotes\n // This prevents escape sequence injection where \\' becomes \\\\' (escaped backslash + quote)\n return `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map(valueToGQL).join(', ')}]`;\n }\n if (typeof value === 'object') {\n return propsToGQL(value as Record<string, unknown>);\n }\n // At this point, value is a primitive (bigint, symbol, etc.) - safe to stringify\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n return String(value);\n}\n\nfunction nodePatternToGQL(pattern: NodePattern): string {\n let result = '(';\n\n if (pattern.variable) {\n result += pattern.variable;\n }\n\n if (pattern.labels && pattern.labels.length > 0) {\n result += ':' + pattern.labels.join(':');\n }\n\n if (pattern.properties && Object.keys(pattern.properties).length > 0) {\n result += ' ' + propsToGQL(pattern.properties);\n }\n\n return result + ')';\n}\n\nfunction edgePatternToGQL(pattern: EdgePattern): string {\n /* eslint-disable @typescript-eslint/prefer-nullish-coalescing */\n const hasContent =\n pattern.variable ||\n pattern.type ||\n (pattern.properties && Object.keys(pattern.properties).length > 0);\n /* eslint-enable @typescript-eslint/prefer-nullish-coalescing */\n\n let inner = '';\n if (hasContent) {\n inner = '[';\n if (pattern.variable) {\n inner += pattern.variable;\n }\n if (pattern.type) {\n inner += ':' + pattern.type;\n }\n if (pattern.minHops !== undefined || pattern.maxHops !== undefined) {\n inner += '*';\n if (pattern.minHops !== undefined) {\n inner += pattern.minHops;\n }\n inner += '..';\n if (pattern.maxHops !== undefined) {\n inner += pattern.maxHops;\n }\n }\n if (pattern.properties && Object.keys(pattern.properties).length > 0) {\n inner += ' ' + propsToGQL(pattern.properties);\n }\n inner += ']';\n }\n\n switch (pattern.direction) {\n case 'outgoing':\n return `-${inner}->`;\n case 'incoming':\n return `<-${inner}-`;\n case 'both':\n return `-${inner}-`;\n }\n}\n\n// Factory functions\n\n/**\n * Create a new QueryBuilder.\n */\nexport function query(): QueryBuilder {\n return new QueryBuilder();\n}\n\n/**\n * Create a new PatternBuilder.\n */\nexport function pattern(): PatternBuilder {\n return new PatternBuilder();\n}\n\n/**\n * Create a new PredicateBuilder.\n */\nexport function predicate(): PredicateBuilder {\n return new PredicateBuilder();\n}\n\n/**\n * Create a new NodePatternBuilder.\n */\nexport function node(): NodePatternBuilder {\n return new NodePatternBuilder();\n}\n\n/**\n * Create a new EdgePatternBuilder.\n */\nexport function edge(): EdgePatternBuilder {\n return new EdgePatternBuilder();\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/config.ts","../src/validate.ts","../src/proto.ts","../src/grpc-transport.ts","../src/types.ts","../src/prepared.ts","../src/explain.ts","../src/batch.ts","../src/auth.ts","../src/connection.ts","../src/transport.ts","../src/transaction.ts","../src/result.ts","../src/pool.ts","../src/client.ts","../src/index.ts","../src/query-builder.ts"],"names":["host","port","query","predicate","pattern","path","node","edge","__filename","__dirname","fs2","PROTO_PATH","credentials","fs","resolve","namedParams","q","fs3","GrpcTransport","PreparedStatement","AuthClient"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Geode Client Error Types\n *\n * Implements ISO/IEC 39075:2024 status codes for GQL error handling.\n */\n\n// ISO/IEC 39075 status class constants\nexport const StatusClass = {\n SUCCESS: '00000',\n WARNING: '01000',\n NO_DATA: '02000',\n TRANSACTION_STATE: '25000',\n AUTH: '28000',\n SERIALIZATION: '40001',\n DEADLOCK: '40502',\n SYNTAX: '42000',\n CONSTRAINT: '23000',\n DUPLICATE: '42P07',\n INVALID_PARAM: '22023',\n SYSTEM: '58000',\n} as const;\n\nexport type StatusClassType = (typeof StatusClass)[keyof typeof StatusClass];\n\n/**\n * Base interface for all Geode errors.\n */\nexport interface GeodeError extends Error {\n /** ISO/IEC 39075 status class */\n readonly statusClass: StatusClassType;\n /** Whether this error can be retried */\n readonly isRetryable: boolean;\n}\n\n/**\n * Error returned from the Geode server.\n */\nexport class DriverError extends Error implements GeodeError {\n readonly statusClass: StatusClassType;\n readonly subclass: string;\n readonly code: string;\n readonly anchor?: string;\n readonly additional: string[];\n readonly findings: string[];\n\n constructor(options: {\n statusClass: StatusClassType;\n subclass: string;\n code: string;\n message: string;\n anchor?: string;\n additional?: string[];\n findings?: string[];\n }) {\n const msg = options.message\n ? `geode: ${options.code}: ${options.message}`\n : `geode: ${options.code}`;\n super(msg);\n this.name = 'DriverError';\n this.statusClass = options.statusClass;\n this.subclass = options.subclass;\n this.code = options.code;\n this.anchor = options.anchor;\n this.additional = options.additional ?? [];\n this.findings = options.findings ?? [];\n Object.setPrototypeOf(this, DriverError.prototype);\n }\n\n get isRetryable(): boolean {\n return (\n this.statusClass === StatusClass.SERIALIZATION || this.statusClass === StatusClass.DEADLOCK\n );\n }\n}\n\n/**\n * Transport layer error (QUIC/network failures).\n */\nexport class TransportError extends Error implements GeodeError {\n readonly statusClass = StatusClass.SYSTEM;\n readonly operation: string;\n readonly address?: string;\n readonly cause?: Error;\n\n constructor(options: { operation: string; address?: string; cause?: Error }) {\n const addr = options.address ? ` to ${options.address}` : '';\n const causeMsg = options.cause ? `: ${options.cause.message}` : '';\n super(`geode: transport ${options.operation}${addr}${causeMsg}`);\n this.name = 'TransportError';\n this.operation = options.operation;\n this.address = options.address;\n this.cause = options.cause;\n Object.setPrototypeOf(this, TransportError.prototype);\n }\n\n get isRetryable(): boolean {\n return true; // Transport errors are generally retryable\n }\n}\n\n/**\n * Configuration/DSN parsing error.\n */\n// Fields that should never have their values included in error messages\nconst SENSITIVE_CONFIG_FIELDS = new Set([\n 'password',\n 'pass',\n 'key',\n 'secret',\n 'token',\n 'credential',\n]);\n\nexport class ConfigError extends Error implements GeodeError {\n readonly statusClass = StatusClass.INVALID_PARAM;\n readonly field: string;\n readonly value?: string;\n\n constructor(options: { field: string; value?: string; message: string }) {\n // Redact values for sensitive fields to prevent credential leakage in logs\n const isSensitive = SENSITIVE_CONFIG_FIELDS.has(options.field.toLowerCase());\n const valStr =\n options.value !== undefined && !isSensitive ? `=${JSON.stringify(options.value)}` : '';\n super(`geode: config ${options.field}${valStr}: ${options.message}`);\n this.name = 'ConfigError';\n this.field = options.field;\n // Don't store sensitive values on the error object either\n this.value = isSensitive ? undefined : options.value;\n Object.setPrototypeOf(this, ConfigError.prototype);\n }\n\n get isRetryable(): boolean {\n return false; // Config errors require user intervention\n }\n}\n\n/**\n * Security validation error (TLS, input validation).\n */\nexport class SecurityError extends Error implements GeodeError {\n readonly statusClass = StatusClass.AUTH;\n readonly type: 'tls' | 'input' | 'validation';\n readonly cause?: Error;\n\n constructor(options: { type: 'tls' | 'input' | 'validation'; message: string; cause?: Error }) {\n const causeMsg = options.cause ? `: ${options.cause.message}` : '';\n super(`geode: security ${options.type}: ${options.message}${causeMsg}`);\n this.name = 'SecurityError';\n this.type = options.type;\n this.cause = options.cause;\n Object.setPrototypeOf(this, SecurityError.prototype);\n }\n\n get isRetryable(): boolean {\n return false; // Security errors require user intervention\n }\n}\n\n/**\n * Connection state error.\n */\nexport class StateError extends Error implements GeodeError {\n readonly statusClass = StatusClass.TRANSACTION_STATE;\n readonly currentState: ConnectionState;\n readonly operation: string;\n\n constructor(options: { currentState: ConnectionState; operation: string; message?: string }) {\n const msg = options.message\n ? `geode: state error: ${options.operation} (state=${options.currentState}): ${options.message}`\n : `geode: state error: ${options.operation} (state=${options.currentState})`;\n super(msg);\n this.name = 'StateError';\n this.currentState = options.currentState;\n this.operation = options.operation;\n Object.setPrototypeOf(this, StateError.prototype);\n }\n\n get isRetryable(): boolean {\n return false;\n }\n}\n\n/**\n * Connection state enumeration.\n */\nexport type ConnectionState =\n | 'idle'\n | 'executing'\n | 'in_transaction'\n | 'fetching'\n | 'closed'\n | 'error';\n\n// Sentinel errors\nexport const ErrClosed = new Error('geode: connection closed');\nexport const ErrQueryInProgress = new Error('geode: query already in progress');\nexport const ErrTxInProgress = new Error('geode: transaction already in progress');\nexport const ErrNoTx = new Error('geode: no transaction in progress');\nexport const ErrTxDone = new Error('geode: transaction already committed or rolled back');\nexport const ErrRowsClosed = new Error('geode: rows closed');\nexport const ErrBadConn = new Error('geode: bad connection');\n\n/**\n * Type guard for DriverError.\n */\nexport function isDriverError(err: unknown): err is DriverError {\n return err instanceof DriverError;\n}\n\n/**\n * Type guard for GeodeError.\n */\nexport function isGeodeError(err: unknown): err is GeodeError {\n return (\n err instanceof DriverError ||\n err instanceof TransportError ||\n err instanceof ConfigError ||\n err instanceof SecurityError ||\n err instanceof StateError\n );\n}\n\n/**\n * Check if an error is retryable.\n */\nexport function isRetryableError(err: unknown): boolean {\n if (isGeodeError(err)) {\n return err.isRetryable;\n }\n return false;\n}\n","/**\n * Geode Client Configuration\n *\n * DSN parsing and configuration management.\n * Supports quic:// and grpc:// transport schemes.\n *\n * See geode/docs/DSN.md for the complete DSN specification.\n */\n\nimport { ConfigError } from './errors.js';\n\n// Default configuration values\nexport const DEFAULT_PORT = 3141;\nexport const DEFAULT_GRPC_PORT = 50051;\nexport const DEFAULT_PAGE_SIZE = 1000;\nexport const DEFAULT_HELLO_NAME = 'geode-nodejs';\nexport const DEFAULT_HELLO_VERSION = '1.0.0';\nexport const DEFAULT_CONFORMANCE = 'min';\nexport const MAX_QUERY_LENGTH = 1 << 20; // 1MB\nexport const MAX_PAGE_SIZE = 100000;\nexport const MIN_PORT = 1;\nexport const MAX_PORT = 65535;\n\n/**\n * Transport type for client connections.\n */\nexport type TransportType = 'quic' | 'grpc';\n\n/**\n * Supported DSN schemes.\n */\nexport const SUPPORTED_SCHEMES = ['quic', 'grpc'] as const;\nexport type DSNScheme = (typeof SUPPORTED_SCHEMES)[number];\n\n/**\n * Validate that a port number is within valid TCP/UDP range.\n */\nfunction isValidPort(port: number): boolean {\n return !isNaN(port) && port >= MIN_PORT && port <= MAX_PORT;\n}\n\n/**\n * Geode connection configuration.\n */\nexport interface GeodeConfig {\n /** Server hostname or IP address */\n host: string;\n\n /** Server port (default: 3141 for QUIC, 50051 for gRPC) */\n port: number;\n\n /** Transport type (default: 'quic') */\n transport: TransportType;\n\n /** Number of rows per page (default: 1000) */\n pageSize: number;\n\n /** Client name sent in HELLO message */\n helloName: string;\n\n /** Client version sent in HELLO message */\n helloVersion: string;\n\n /** GQL conformance level (default: \"min\") */\n conformance: string;\n\n /** Username for authentication */\n username?: string;\n\n /** Password for authentication */\n password?: string;\n\n // TLS configuration\n /** Path to CA certificate file */\n tlsCA?: string;\n\n /** CA certificate as PEM string */\n tlsCACert?: string;\n\n /** Path to client certificate file (for mTLS) */\n tlsCert?: string;\n\n /** Client certificate as PEM string (for mTLS) */\n tlsCertPEM?: string;\n\n /** Path to client private key file (for mTLS) */\n tlsKey?: string;\n\n /** Client private key as PEM string (for mTLS) */\n tlsKeyPEM?: string;\n\n /** Skip TLS verification (DEVELOPMENT ONLY, never use in production) */\n insecureSkipVerify?: boolean;\n\n /** SNI server name override */\n serverName?: string;\n\n // Connection options\n /** Connection timeout in milliseconds (default: 30000) */\n connectTimeout?: number;\n\n /** Request timeout in milliseconds (default: 120000) */\n requestTimeout?: number;\n\n /** Keep-alive interval in milliseconds (default: 10000) */\n keepAliveInterval?: number;\n\n /** Maximum idle time in milliseconds (default: 30000) */\n maxIdleTime?: number;\n\n // gRPC-specific options\n /** Enable TLS for gRPC (default: true) */\n tls?: boolean;\n}\n\n/**\n * Connection pool configuration.\n */\nexport interface PoolConfig extends GeodeConfig {\n /** Minimum number of connections in pool (default: 1) */\n minConnections?: number;\n\n /** Maximum number of connections in pool (default: 3) */\n maxConnections?: number;\n\n /** Time to wait for connection in milliseconds (default: 30000) */\n acquireTimeout?: number;\n\n /** Idle connection lifetime in milliseconds (default: 60000) */\n idleTimeout?: number;\n}\n\n/**\n * Create a default configuration.\n */\nexport function defaultConfig(): GeodeConfig {\n return {\n host: 'localhost',\n port: DEFAULT_PORT,\n transport: 'quic',\n pageSize: DEFAULT_PAGE_SIZE,\n helloName: DEFAULT_HELLO_NAME,\n helloVersion: DEFAULT_HELLO_VERSION,\n conformance: DEFAULT_CONFORMANCE,\n connectTimeout: 30000,\n requestTimeout: 120000,\n keepAliveInterval: 10000,\n maxIdleTime: 30000,\n tls: true,\n };\n}\n\n/**\n * Parse a DSN (Data Source Name) string into configuration.\n *\n * Supported formats:\n * - quic://host:port?options (QUIC transport, default)\n * - grpc://host:port?options (gRPC transport)\n * - host:port?options (defaults to QUIC)\n * - host:port\n * - host (uses default port)\n *\n * Supported options:\n * - page_size: Results page size (default: 1000)\n * - hello_name: Client name (default: \"geode-nodejs\")\n * - hello_ver: Client version (default: \"1.0.0\")\n * - conformance: GQL conformance level (default: \"min\")\n * - username/user: Authentication username\n * - password/pass: Authentication password\n * - ca: Path to CA certificate\n * - cert: Path to client certificate (for mTLS)\n * - key: Path to client key (for mTLS)\n * - insecure: Skip TLS verification (testing only)\n * - tls: Enable/disable TLS for gRPC (default: true)\n * - server_name: SNI server name\n * - connect_timeout: Connection timeout in ms\n * - request_timeout: Request timeout in ms\n *\n * Environment variables (used as defaults):\n * - GEODE_HOST: Default host\n * - GEODE_PORT: Default port\n * - GEODE_TLS_CA: Default CA certificate path\n * - GEODE_USERNAME: Default username\n * - GEODE_PASSWORD: Default password\n * - GEODE_TRANSPORT: Default transport type (quic or grpc)\n */\nexport function parseDSN(dsn: string): GeodeConfig {\n // CANARY: REQ=REQ-CLIENT-NODEJS-001; FEATURE=\"NodejsClientConnect\"; ASPECT=DSNParse; STATUS=IMPL; OWNER=clients; UPDATED=2025-02-14\n const cfg = defaultConfig();\n\n // Apply environment variable defaults\n if (process.env['GEODE_HOST']) {\n cfg.host = process.env['GEODE_HOST'];\n }\n if (process.env['GEODE_PORT']) {\n const port = parseInt(process.env['GEODE_PORT'], 10);\n if (isValidPort(port)) {\n cfg.port = port;\n }\n }\n if (process.env['GEODE_TLS_CA']) {\n cfg.tlsCA = process.env['GEODE_TLS_CA'];\n }\n if (process.env['GEODE_USERNAME']) {\n cfg.username = process.env['GEODE_USERNAME'];\n }\n if (process.env['GEODE_PASSWORD']) {\n cfg.password = process.env['GEODE_PASSWORD'];\n }\n if (process.env['GEODE_TRANSPORT']) {\n const transport = process.env['GEODE_TRANSPORT'].toLowerCase();\n if (transport === 'grpc' || transport === 'quic') {\n cfg.transport = transport;\n }\n }\n\n dsn = dsn.trim();\n if (!dsn) {\n return cfg;\n }\n\n // Extract scheme if present\n const schemeMatch = dsn.match(/^([a-z]+):\\/\\//i);\n if (schemeMatch) {\n const scheme = schemeMatch[1]!.toLowerCase();\n\n // Check for unsupported schemes\n if (!SUPPORTED_SCHEMES.includes(scheme as DSNScheme)) {\n throw new ConfigError({\n field: 'scheme',\n value: scheme,\n message: `unsupported scheme '${scheme}'. Supported schemes: ${SUPPORTED_SCHEMES.join(', ')}`,\n });\n }\n\n return parseURLDSN(dsn, cfg, scheme as DSNScheme);\n }\n\n // Parse as host:port?options (default to QUIC)\n return parseSimpleDSN(dsn, cfg);\n}\n\n/**\n * Determine transport type from scheme.\n */\nfunction schemeToTransport(scheme: DSNScheme): TransportType {\n switch (scheme) {\n case 'grpc':\n return 'grpc';\n case 'quic':\n default:\n return 'quic';\n }\n}\n\n/**\n * Get default port for transport type.\n */\nfunction getDefaultPortForTransport(transport: TransportType): number {\n return transport === 'grpc' ? DEFAULT_GRPC_PORT : DEFAULT_PORT;\n}\n\n/**\n * Parse a URL format DSN (quic://, grpc://).\n */\nfunction parseURLDSN(dsn: string, cfg: GeodeConfig, scheme: DSNScheme): GeodeConfig {\n // Set transport based on scheme\n cfg.transport = schemeToTransport(scheme);\n\n // For URL parsing, normalize the scheme to a standard one\n const normalizedDsn = dsn.replace(/^[a-z]+:\\/\\//i, 'http://');\n\n let url: URL;\n try {\n url = new URL(normalizedDsn);\n } catch {\n throw new ConfigError({\n field: 'dsn',\n value: dsn,\n message: 'invalid URL format',\n });\n }\n\n if (!url.hostname) {\n throw new ConfigError({\n field: 'host',\n message: 'host is required',\n });\n }\n\n // Strip brackets from IPv6 addresses (URL class includes them)\n cfg.host = url.hostname.replace(/^\\[/, '').replace(/\\]$/, '');\n\n if (url.port) {\n const port = parseInt(url.port, 10);\n if (!isValidPort(port)) {\n throw new ConfigError({\n field: 'port',\n value: url.port,\n message: `must be a valid port number (${MIN_PORT}-${MAX_PORT})`,\n });\n }\n cfg.port = port;\n } else {\n // Use transport-specific default port\n cfg.port = getDefaultPortForTransport(cfg.transport);\n }\n\n // Parse credentials from URL\n if (url.username) {\n cfg.username = decodeURIComponent(url.username);\n }\n if (url.password) {\n cfg.password = decodeURIComponent(url.password);\n }\n\n // Parse query parameters\n applyQueryParams(url.searchParams, cfg);\n\n return cfg;\n}\n\n/**\n * Parse a simple host:port?options format DSN.\n */\nfunction parseSimpleDSN(dsn: string, cfg: GeodeConfig): GeodeConfig {\n // Split off query string if present\n let queryStr = '';\n const queryIdx = dsn.indexOf('?');\n if (queryIdx >= 0) {\n queryStr = dsn.slice(queryIdx + 1);\n dsn = dsn.slice(0, queryIdx);\n }\n\n // Parse host:port\n if (dsn) {\n const result = parseHostPort(dsn);\n cfg.host = result.host;\n cfg.port = result.port;\n }\n\n // Parse query parameters\n if (queryStr) {\n const params = new URLSearchParams(queryStr);\n applyQueryParams(params, cfg);\n }\n\n return cfg;\n}\n\n/**\n * Parse host:port string with IPv6 support.\n */\nfunction parseHostPort(addr: string): { host: string; port: number } {\n // Check for IPv6 address in brackets\n if (addr.startsWith('[')) {\n const closeBracket = addr.indexOf(']');\n if (closeBracket === -1) {\n throw new ConfigError({\n field: 'host',\n value: addr,\n message: 'invalid IPv6 address format',\n });\n }\n const host = addr.slice(1, closeBracket);\n const rest = addr.slice(closeBracket + 1);\n if (rest.startsWith(':')) {\n const port = parseInt(rest.slice(1), 10);\n if (!isValidPort(port)) {\n throw new ConfigError({\n field: 'port',\n value: rest.slice(1),\n message: `must be a valid port number (${MIN_PORT}-${MAX_PORT})`,\n });\n }\n return { host, port };\n }\n return { host, port: DEFAULT_PORT };\n }\n\n // Regular host:port\n const lastColon = addr.lastIndexOf(':');\n if (lastColon === -1) {\n return { host: addr, port: DEFAULT_PORT };\n }\n\n // Check if there are multiple colons (IPv6 without brackets)\n if (addr.indexOf(':') !== lastColon) {\n // Treat entire string as IPv6 host\n return { host: addr, port: DEFAULT_PORT };\n }\n\n const host = addr.slice(0, lastColon);\n const portStr = addr.slice(lastColon + 1);\n const port = parseInt(portStr, 10);\n\n if (!isValidPort(port)) {\n throw new ConfigError({\n field: 'port',\n value: portStr,\n message: `must be a valid port number (${MIN_PORT}-${MAX_PORT})`,\n });\n }\n\n if (!host) {\n throw new ConfigError({\n field: 'host',\n message: 'host is required',\n });\n }\n\n return { host, port };\n}\n\n/**\n * Apply URL query parameters to configuration.\n */\nfunction applyQueryParams(params: URLSearchParams, cfg: GeodeConfig): void {\n for (const [key, value] of params) {\n switch (key) {\n case 'page_size': {\n const n = parseInt(value, 10);\n if (isNaN(n) || n <= 0) {\n throw new ConfigError({\n field: 'page_size',\n value,\n message: 'must be a positive integer',\n });\n }\n if (n > MAX_PAGE_SIZE) {\n throw new ConfigError({\n field: 'page_size',\n value,\n message: `must not exceed ${MAX_PAGE_SIZE}`,\n });\n }\n cfg.pageSize = n;\n break;\n }\n\n case 'hello_name':\n if (!value) {\n throw new ConfigError({\n field: 'hello_name',\n message: 'cannot be empty',\n });\n }\n cfg.helloName = value;\n break;\n\n case 'hello_ver':\n if (!value) {\n throw new ConfigError({\n field: 'hello_ver',\n message: 'cannot be empty',\n });\n }\n cfg.helloVersion = value;\n break;\n\n case 'conformance':\n cfg.conformance = value;\n break;\n\n case 'username':\n case 'user':\n cfg.username = value;\n break;\n\n case 'password':\n case 'pass':\n cfg.password = value;\n break;\n\n case 'ca':\n case 'ca_cert':\n cfg.tlsCA = value;\n break;\n\n case 'cert':\n case 'client_cert':\n cfg.tlsCert = value;\n break;\n\n case 'key':\n case 'client_key':\n cfg.tlsKey = value;\n break;\n\n case 'insecure_tls_skip_verify':\n case 'insecure':\n case 'skip_verify':\n cfg.insecureSkipVerify =\n value === 'true' || value === '1' || value === 'yes' || value === 'on';\n break;\n\n case 'tls':\n cfg.tls = value !== 'false' && value !== '0';\n break;\n\n case 'server_name':\n cfg.serverName = value;\n break;\n\n case 'connect_timeout':\n case 'timeout': {\n const n = parseInt(value, 10);\n if (!isNaN(n) && n > 0) {\n // If specified in seconds (timeout), convert to ms; connect_timeout is already in ms\n cfg.connectTimeout = key === 'timeout' ? n * 1000 : n;\n }\n break;\n }\n\n case 'request_timeout': {\n const n = parseInt(value, 10);\n if (!isNaN(n) && n > 0) {\n cfg.requestTimeout = n;\n }\n break;\n }\n\n // Ignore unknown parameters for forward compatibility\n }\n }\n\n // Validate mTLS configuration - XOR: one but not both\n if ((cfg.tlsCert && !cfg.tlsKey) || (!cfg.tlsCert && cfg.tlsKey)) {\n throw new ConfigError({\n field: 'tls',\n message: 'both cert and key must be provided for mTLS',\n });\n }\n}\n\n/**\n * Validate configuration.\n */\nexport function validateConfig(cfg: GeodeConfig): void {\n if (!cfg.host) {\n throw new ConfigError({\n field: 'host',\n message: 'host is required',\n });\n }\n\n if (!cfg.port || cfg.port < 1 || cfg.port > 65535) {\n throw new ConfigError({\n field: 'port',\n value: String(cfg.port),\n message: 'must be a valid port number (1-65535)',\n });\n }\n\n if (cfg.pageSize <= 0) {\n throw new ConfigError({\n field: 'pageSize',\n value: String(cfg.pageSize),\n message: 'must be positive',\n });\n }\n\n if (cfg.pageSize > MAX_PAGE_SIZE) {\n throw new ConfigError({\n field: 'pageSize',\n value: String(cfg.pageSize),\n message: `must not exceed ${MAX_PAGE_SIZE}`,\n });\n }\n}\n\n/**\n * Get the server address in host:port format.\n */\nexport function getAddress(cfg: GeodeConfig): string {\n // Handle IPv6 addresses\n if (cfg.host.includes(':')) {\n return `[${cfg.host}]:${cfg.port}`;\n }\n return `${cfg.host}:${cfg.port}`;\n}\n\n/**\n * Clone configuration.\n */\nexport function cloneConfig(cfg: GeodeConfig): GeodeConfig {\n return { ...cfg };\n}\n\n/**\n * Redact credentials from a DSN string for safe logging.\n *\n * Replaces username and password with '***' to prevent credential exposure\n * in logs, error messages, or other output.\n *\n * @example\n * ```typescript\n * redactDSN('quic://admin:secret@localhost:3141')\n * // Returns: 'quic://***:***@localhost:3141'\n *\n * redactDSN('grpc://localhost:50051?username=admin&password=secret')\n * // Returns: 'grpc://localhost:50051?username=***&password=***'\n * ```\n */\nexport function redactDSN(dsn: string): string {\n if (!dsn) {\n return dsn;\n }\n\n // Handle URL format (quic://, grpc://)\n const schemeMatch = dsn.match(/^([a-z]+):\\/\\//i);\n if (schemeMatch) {\n const scheme = schemeMatch[1]!;\n try {\n // Normalize to http:// for URL parsing, then restore original scheme\n const normalizedDsn = dsn.replace(/^[a-z]+:\\/\\//i, 'http://');\n const url = new URL(normalizedDsn);\n\n // Redact username and password in URL\n if (url.username) {\n url.username = '***';\n }\n if (url.password) {\n url.password = '***';\n }\n\n // Redact password/pass query params\n if (url.searchParams.has('password')) {\n url.searchParams.set('password', '***');\n }\n if (url.searchParams.has('pass')) {\n url.searchParams.set('pass', '***');\n }\n if (url.searchParams.has('username')) {\n url.searchParams.set('username', '***');\n }\n if (url.searchParams.has('user')) {\n url.searchParams.set('user', '***');\n }\n\n // Restore original scheme\n return url.toString().replace(/^http:\\/\\//, `${scheme}://`);\n } catch {\n // If URL parsing fails, fall through to string-based redaction\n }\n }\n\n // String-based redaction for simple DSN format\n let result = dsn;\n\n // Redact password in query params\n result = result.replace(/(password|pass)=([^&]*)/gi, '$1=***');\n\n // Redact username in query params\n result = result.replace(/(username|user)=([^&]*)/gi, '$1=***');\n\n return result;\n}\n\n/**\n * Redact credentials from a configuration object for safe logging.\n *\n * Returns a new config object with password set to '***'.\n */\nexport function redactConfig(cfg: GeodeConfig): GeodeConfig {\n return {\n ...cfg,\n password: cfg.password ? '***' : undefined,\n };\n}\n","/**\n * Input Validation Module\n *\n * Security-focused validation for user inputs to prevent injection attacks.\n */\n\nimport * as fs from 'node:fs';\nimport { SecurityError } from './errors.js';\nimport { MAX_QUERY_LENGTH, MAX_PAGE_SIZE } from './config.js';\n\n// Parameter name pattern: alphanumeric with underscores, max 128 chars\nconst PARAM_NAME_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]{0,127}$/;\n\n// GQL identifier pattern: alphanumeric with underscores, max 128 chars\n// Used for labels, relationship types, and property names in queries\nconst GQL_IDENTIFIER_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]{0,127}$/;\n\n// Maximum length for GQL identifiers\nconst MAX_IDENTIFIER_LENGTH = 128;\n\n// Allowed permission actions (uppercase for GQL syntax)\nconst ALLOWED_PERMISSION_ACTIONS = new Set(['READ', 'WRITE', 'DELETE', 'CREATE', 'UPDATE', 'ALL']);\n\n// Allowed permission resources\nconst ALLOWED_PERMISSION_RESOURCES = new Set([\n 'NODE',\n 'EDGE',\n 'RELATIONSHIP',\n 'GRAPH',\n 'PROPERTY',\n 'LABEL',\n 'INDEX',\n 'CONSTRAINT',\n]);\n\n// Allowed RLS policy actions\nconst ALLOWED_RLS_ACTIONS = new Set(['READ', 'WRITE', 'ALL']);\n\n// Reserved keywords that cannot be used as parameter names\nconst RESERVED_KEYWORDS = new Set([\n 'match',\n 'create',\n 'delete',\n 'set',\n 'remove',\n 'return',\n 'where',\n 'with',\n 'order',\n 'by',\n 'skip',\n 'limit',\n 'union',\n 'all',\n 'optional',\n 'and',\n 'or',\n 'not',\n 'xor',\n 'null',\n 'true',\n 'false',\n 'in',\n 'is',\n 'as',\n 'case',\n 'when',\n 'then',\n 'else',\n 'end',\n 'exists',\n 'count',\n 'sum',\n 'avg',\n 'min',\n 'max',\n 'collect',\n 'distinct',\n 'merge',\n 'call',\n 'yield',\n 'unwind',\n 'foreach',\n 'detach',\n 'drop',\n 'graph',\n 'use',\n 'catalog',\n 'constraint',\n 'index',\n 'create',\n 'node',\n 'relationship',\n 'edge',\n 'property',\n 'on',\n 'for',\n 'if',\n 'begin',\n 'commit',\n 'rollback',\n 'transaction',\n]);\n\n/**\n * Validate a GQL query string.\n *\n * @throws SecurityError if validation fails\n */\nexport function validateQuery(query: string): void {\n if (!query) {\n throw new SecurityError({\n type: 'input',\n message: 'query cannot be empty',\n });\n }\n\n if (query.length > MAX_QUERY_LENGTH) {\n throw new SecurityError({\n type: 'input',\n message: `query exceeds maximum length of ${MAX_QUERY_LENGTH} bytes`,\n });\n }\n\n // Check for null bytes (potential injection)\n if (query.includes('\\0')) {\n throw new SecurityError({\n type: 'input',\n message: 'query contains null bytes',\n });\n }\n\n // Check for control characters (except common whitespace)\n // eslint-disable-next-line no-control-regex\n if (/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]/.test(query)) {\n throw new SecurityError({\n type: 'input',\n message: 'query contains invalid control characters',\n });\n }\n}\n\n/**\n * Validate a parameter name.\n *\n * @throws SecurityError if validation fails\n */\nexport function validateParamName(name: string): void {\n if (!name) {\n throw new SecurityError({\n type: 'input',\n message: 'parameter name cannot be empty',\n });\n }\n\n if (!PARAM_NAME_PATTERN.test(name)) {\n // GAP #15: Don't include potentially sensitive parameter name in error\n throw new SecurityError({\n type: 'input',\n message:\n 'invalid parameter name: must start with letter or underscore and contain only alphanumeric characters and underscores',\n });\n }\n\n if (RESERVED_KEYWORDS.has(name.toLowerCase())) {\n // GAP #15: Don't include potentially sensitive parameter name in error\n throw new SecurityError({\n type: 'input',\n message: 'parameter name cannot be a reserved keyword',\n });\n }\n}\n\n/**\n * Validate a parameter value.\n *\n * @throws SecurityError if validation fails\n */\nexport function validateParamValue(value: unknown): void {\n // Check for circular references\n try {\n JSON.stringify(value);\n } catch {\n throw new SecurityError({\n type: 'input',\n message: 'parameter value contains circular reference or is not serializable',\n });\n }\n\n // Recursively validate nested values\n validateValueRecursive(value, 0);\n}\n\n/**\n * Recursively validate a value with depth limit.\n */\nfunction validateValueRecursive(value: unknown, depth: number): void {\n const MAX_DEPTH = 32;\n if (depth > MAX_DEPTH) {\n throw new SecurityError({\n type: 'input',\n message: `parameter value exceeds maximum nesting depth of ${MAX_DEPTH}`,\n });\n }\n\n if (value === null || value === undefined) {\n return;\n }\n\n if (typeof value === 'string') {\n // Check for null bytes\n if (value.includes('\\0')) {\n throw new SecurityError({\n type: 'input',\n message: 'parameter value contains null bytes',\n });\n }\n return;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n validateValueRecursive(item, depth + 1);\n }\n return;\n }\n\n if (typeof value === 'object') {\n for (const [key, val] of Object.entries(value)) {\n validateParamName(key);\n validateValueRecursive(val, depth + 1);\n }\n return;\n }\n\n // Primitives (number, boolean, bigint) are always valid\n}\n\n/**\n * Validate a hostname.\n *\n * @throws SecurityError if validation fails\n */\nexport function validateHostname(hostname: string): void {\n if (!hostname) {\n throw new SecurityError({\n type: 'input',\n message: 'hostname cannot be empty',\n });\n }\n\n // Check length\n if (hostname.length > 253) {\n throw new SecurityError({\n type: 'input',\n message: 'hostname exceeds maximum length',\n });\n }\n\n // Check for valid characters\n // Allow: letters, digits, hyphens, dots, and IPv6 brackets/colons\n if (!/^[a-zA-Z0-9.\\-:[\\]]+$/.test(hostname)) {\n throw new SecurityError({\n type: 'input',\n message: 'hostname contains invalid characters',\n });\n }\n\n // Check for IPv4\n if (/^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/.test(hostname)) {\n const parts = hostname.split('.').map(Number);\n if (parts.some((p) => p < 0 || p > 255)) {\n throw new SecurityError({\n type: 'input',\n message: 'invalid IPv4 address',\n });\n }\n return;\n }\n\n // Check for IPv6 (simplified check)\n if (hostname.includes(':') || hostname.startsWith('[')) {\n // Basic IPv6 validation - allow colons and hex digits\n const addr = hostname.replace(/^\\[|\\]$/g, '');\n if (!/^[a-fA-F0-9:]+$/.test(addr)) {\n throw new SecurityError({\n type: 'input',\n message: 'invalid IPv6 address',\n });\n }\n return;\n }\n\n // Validate as hostname\n const labels = hostname.split('.');\n for (const label of labels) {\n if (!label || label.length > 63) {\n throw new SecurityError({\n type: 'input',\n message: 'hostname label is invalid',\n });\n }\n if (!/^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?$/.test(label)) {\n throw new SecurityError({\n type: 'input',\n message: 'hostname label contains invalid characters',\n });\n }\n }\n}\n\n/**\n * Validate a port number.\n *\n * @throws SecurityError if validation fails\n */\nexport function validatePort(port: number): void {\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new SecurityError({\n type: 'input',\n message: 'port must be an integer between 1 and 65535',\n });\n }\n}\n\n/**\n * Validate a page size.\n *\n * @throws SecurityError if validation fails\n */\nexport function validatePageSize(pageSize: number): void {\n if (!Number.isInteger(pageSize) || pageSize < 1) {\n throw new SecurityError({\n type: 'input',\n message: 'page size must be a positive integer',\n });\n }\n if (pageSize > MAX_PAGE_SIZE) {\n throw new SecurityError({\n type: 'input',\n message: `page size must not exceed ${MAX_PAGE_SIZE}`,\n });\n }\n}\n\n/**\n * Validate a savepoint name.\n *\n * @throws SecurityError if validation fails\n */\nexport function validateSavepointName(name: string): void {\n if (!name) {\n throw new SecurityError({\n type: 'input',\n message: 'savepoint name cannot be empty',\n });\n }\n\n if (name.length > 128) {\n throw new SecurityError({\n type: 'input',\n message: 'savepoint name exceeds maximum length of 128 characters',\n });\n }\n\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {\n throw new SecurityError({\n type: 'input',\n message: 'savepoint name contains invalid characters',\n });\n }\n}\n\n/**\n * Sanitize a string for safe logging (remove sensitive data patterns).\n */\nexport function sanitizeForLog(value: string): string {\n // Replace potential passwords, tokens, etc.\n return value\n .replace(/password\\s*[:=]\\s*\\S+/gi, 'password=***')\n .replace(/token\\s*[:=]\\s*\\S+/gi, 'token=***')\n .replace(/secret\\s*[:=]\\s*\\S+/gi, 'secret=***')\n .replace(/api[_-]?key\\s*[:=]\\s*\\S+/gi, 'api_key=***');\n}\n\n/**\n * Identifier type for validation error messages.\n */\nexport type IdentifierType = 'label' | 'relationship_type' | 'property' | 'variable';\n\n/**\n * Validate a GQL identifier (label, relationship type, property name, or variable).\n *\n * GQL identifiers must:\n * - Start with a letter or underscore\n * - Contain only alphanumeric characters and underscores\n * - Be at most 128 characters long\n * - Not be a reserved keyword (for variable/property names)\n *\n * @param value - The identifier value to validate\n * @param type - The type of identifier for error messages\n * @param checkReserved - Whether to check against reserved keywords (default: false for labels/types)\n * @throws SecurityError if validation fails\n */\nexport function validateIdentifier(\n value: string,\n type: IdentifierType,\n checkReserved = false\n): void {\n if (!value) {\n throw new SecurityError({\n type: 'input',\n message: `${type} cannot be empty`,\n });\n }\n\n if (value.length > MAX_IDENTIFIER_LENGTH) {\n // GAP #15: Avoid leaking potentially sensitive input in error messages\n throw new SecurityError({\n type: 'input',\n message: `${type} exceeds maximum length of ${MAX_IDENTIFIER_LENGTH} characters (got ${value.length})`,\n });\n }\n\n if (!GQL_IDENTIFIER_PATTERN.test(value)) {\n // GAP #15: Don't include full value in error message - only describe the issue\n throw new SecurityError({\n type: 'input',\n message: `invalid ${type}: must start with letter or underscore and contain only alphanumeric characters and underscores`,\n });\n }\n\n if (checkReserved && RESERVED_KEYWORDS.has(value.toLowerCase())) {\n // GAP #15: Don't include potentially sensitive reserved keyword value\n throw new SecurityError({\n type: 'input',\n message: `${type} cannot be a reserved keyword`,\n });\n }\n}\n\n/**\n * Validate a node label.\n *\n * @param label - The label to validate\n * @throws SecurityError if validation fails\n */\nexport function validateLabel(label: string): void {\n validateIdentifier(label, 'label', false);\n}\n\n/**\n * Validate a relationship type.\n *\n * @param type - The relationship type to validate\n * @throws SecurityError if validation fails\n */\nexport function validateRelationshipType(type: string): void {\n validateIdentifier(type, 'relationship_type', false);\n}\n\n/**\n * Validate a property name for safe query interpolation.\n *\n * @param name - The property name to validate\n * @throws SecurityError if validation fails\n */\nexport function validatePropertyName(name: string): void {\n validateIdentifier(name, 'property', true);\n}\n\n/**\n * Validate a variable name.\n *\n * @param name - The variable name to validate\n * @throws SecurityError if validation fails\n */\nexport function validateVariableName(name: string): void {\n validateIdentifier(name, 'variable', true);\n}\n\n/**\n * Validate a permission action.\n *\n * @param action - The action to validate (e.g., 'READ', 'WRITE')\n * @throws SecurityError if validation fails\n */\nexport function validatePermissionAction(action: string): void {\n if (!action) {\n throw new SecurityError({\n type: 'input',\n message: 'permission action cannot be empty',\n });\n }\n\n const upperAction = action.toUpperCase();\n if (!ALLOWED_PERMISSION_ACTIONS.has(upperAction)) {\n throw new SecurityError({\n type: 'input',\n message: `invalid permission action: ${action}. Allowed: ${[...ALLOWED_PERMISSION_ACTIONS].join(', ')}`,\n });\n }\n}\n\n/**\n * Validate a permission resource.\n *\n * @param resource - The resource to validate (e.g., 'NODE', 'EDGE')\n * @throws SecurityError if validation fails\n */\nexport function validatePermissionResource(resource: string): void {\n if (!resource) {\n throw new SecurityError({\n type: 'input',\n message: 'permission resource cannot be empty',\n });\n }\n\n const upperResource = resource.toUpperCase();\n if (!ALLOWED_PERMISSION_RESOURCES.has(upperResource)) {\n throw new SecurityError({\n type: 'input',\n message: `invalid permission resource: ${resource}. Allowed: ${[...ALLOWED_PERMISSION_RESOURCES].join(', ')}`,\n });\n }\n}\n\n/**\n * Validate an RLS policy action.\n *\n * @param action - The RLS action to validate (e.g., 'READ', 'WRITE', 'ALL')\n * @throws SecurityError if validation fails\n */\nexport function validateRLSAction(action: string): void {\n if (!action) {\n throw new SecurityError({\n type: 'input',\n message: 'RLS policy action cannot be empty',\n });\n }\n\n const upperAction = action.toUpperCase();\n if (!ALLOWED_RLS_ACTIONS.has(upperAction)) {\n throw new SecurityError({\n type: 'input',\n message: `invalid RLS policy action: ${action}. Allowed: ${[...ALLOWED_RLS_ACTIONS].join(', ')}`,\n });\n }\n}\n\n/**\n * Validate a role name.\n *\n * @param name - The role name to validate\n * @throws SecurityError if validation fails\n */\nexport function validateRoleName(name: string): void {\n validateIdentifier(name, 'variable', false); // Roles follow identifier rules\n}\n\n/**\n * Validate a username.\n *\n * @param username - The username to validate\n * @throws SecurityError if validation fails\n */\nexport function validateUsername(username: string): void {\n validateIdentifier(username, 'variable', false); // Usernames follow identifier rules\n}\n\n/**\n * Escape a GQL identifier for safe interpolation in queries.\n *\n * This function provides defense-in-depth by both validating and escaping\n * identifiers before they are used in GQL queries. Even though validation\n * should prevent injection, escaping provides an additional safety layer.\n *\n * GQL identifiers that match the simple pattern (starting with letter/underscore,\n * containing only alphanumeric and underscores) are returned as-is.\n * Otherwise, they are wrapped in backticks with internal backticks escaped.\n *\n * @param identifier - The identifier to escape\n * @param type - The type of identifier for validation error messages\n * @returns The escaped identifier safe for query interpolation\n * @throws SecurityError if the identifier fails validation\n *\n * @example\n * ```typescript\n * escapeGQLIdentifier('Person', 'label') // Returns: \"Person\"\n * escapeGQLIdentifier('user_name', 'label') // Returns: \"user_name\"\n * ```\n */\nexport function escapeGQLIdentifier(identifier: string, type: IdentifierType): string {\n // First validate the identifier\n validateIdentifier(identifier, type, false);\n\n // If it matches the simple identifier pattern, return as-is\n if (GQL_IDENTIFIER_PATTERN.test(identifier)) {\n return identifier;\n }\n\n // Otherwise, escape backticks and wrap in backticks\n // Note: After validation, this branch should rarely be reached since\n // validation enforces the simple pattern. This is defense-in-depth.\n const escaped = identifier.replace(/`/g, '``');\n return '`' + escaped + '`';\n}\n\n// RLS Predicate Validation\n//\n// Allowed keywords in predicates: true, false, null, and, or, not, is, in,\n// contains, starts, ends, with, current_user, current_roles, exists, any, all,\n// none, single, size, length, type, labels, keys, properties, id, coalesce,\n// head, last, tail, nodes, relationships\n//\n// Allowed tokens: identifiers, dotted property access (n.prop), parameters ($param),\n// operators (=, <>, <, >, <=, >=, !=, +, -, *, /, %), literals, brackets\n//\n// The validation uses a dangerous-pattern blocking approach rather than allowlist\n// tokenization for better compatibility with valid predicate expressions.\n\n// Dangerous patterns that indicate injection attempts\nconst RLS_PREDICATE_DANGEROUS_PATTERNS = [\n // Statement terminators and chaining\n /;/,\n // DDL/DML keywords that should never appear in predicates\n // These are dangerous as standalone keywords in predicates\n /\\b(create|drop|delete|detach|set|remove|merge|call|load|unwind|foreach)\\b/i,\n // Index hint injection\n /\\busing\\s+(index|scan)\\b/i,\n // Policy/security manipulation commands (more specific patterns)\n // These look for specific command structures, not just the word \"user\"\n /\\b(create|drop|alter)\\s+(policy|role|user|permission)\\b/i,\n /\\b(grant|revoke|deny)\\s+\\w+/i,\n // Comment injection\n /\\/\\*/,\n /\\*\\//,\n /--/,\n /\\/\\//,\n // Line breaks that could be used for injection\n /[\\r\\n]/,\n // Backtick escaping\n /`/,\n // Multiple statements\n /\\}\\s*\\{/,\n];\n\n/**\n * Validate an RLS policy predicate expression.\n *\n * This performs strict validation to prevent GQL injection attacks.\n * Only safe predicate expressions are allowed.\n *\n * @param predicate - The predicate expression to validate\n * @throws SecurityError if the predicate contains potentially dangerous patterns\n *\n * @example\n * ```typescript\n * // Valid predicates\n * validateRLSPredicate('n.owner = current_user()');\n * validateRLSPredicate('n.visibility = \"public\" OR n.owner = $user');\n * validateRLSPredicate('exists((n)-[:MEMBER_OF]->(:Team {id: $teamId}))');\n *\n * // Invalid predicates (will throw)\n * validateRLSPredicate('true; DROP POLICY admin'); // Injection attempt\n * validateRLSPredicate('n.x = 1 CREATE (m:Malicious)'); // DDL injection\n * ```\n */\nexport function validateRLSPredicate(predicate: string): void {\n if (!predicate) {\n throw new SecurityError({\n type: 'input',\n message: 'RLS predicate cannot be empty',\n });\n }\n\n // First, apply basic query validation (null bytes, control chars, length)\n validateQuery(predicate);\n\n // Check for dangerous patterns\n for (const pattern of RLS_PREDICATE_DANGEROUS_PATTERNS) {\n if (pattern.test(predicate)) {\n throw new SecurityError({\n type: 'input',\n message: 'RLS predicate contains disallowed pattern',\n });\n }\n }\n\n // Validate balanced parentheses and brackets\n let parenCount = 0;\n let bracketCount = 0;\n let braceCount = 0;\n let inString: string | null = null;\n\n for (let i = 0; i < predicate.length; i++) {\n const char = predicate[i];\n\n // Handle string literals\n if (inString) {\n // GAP #18: Count consecutive backslashes before quote character\n // to correctly handle escaped backslashes (\\\\) followed by quotes\n // Example: '\\\\' - backslash escaped, quote ends string\n // '\\'' - quote escaped, still in string\n // '\\\\\\' - backslash escaped + quote escaped, still in string\n if (char === inString) {\n let backslashCount = 0;\n let j = i - 1;\n while (j >= 0 && predicate[j] === '\\\\') {\n backslashCount++;\n j--;\n }\n // Quote is escaped only if preceded by odd number of backslashes\n // Even number means the backslashes escape each other, leaving quote unescaped\n if (backslashCount % 2 === 0) {\n inString = null;\n }\n }\n continue;\n }\n\n if (char === \"'\" || char === '\"') {\n inString = char;\n continue;\n }\n\n // Count brackets\n switch (char) {\n case '(':\n parenCount++;\n break;\n case ')':\n parenCount--;\n break;\n case '[':\n bracketCount++;\n break;\n case ']':\n bracketCount--;\n break;\n case '{':\n braceCount++;\n break;\n case '}':\n braceCount--;\n break;\n }\n\n // Check for unbalanced brackets (potential injection)\n if (parenCount < 0 || bracketCount < 0 || braceCount < 0) {\n throw new SecurityError({\n type: 'input',\n message: 'RLS predicate contains unbalanced brackets',\n });\n }\n }\n\n // Ensure all brackets are closed\n if (parenCount !== 0 || bracketCount !== 0 || braceCount !== 0) {\n throw new SecurityError({\n type: 'input',\n message: 'RLS predicate contains unbalanced brackets',\n });\n }\n\n // Ensure string was closed\n if (inString) {\n throw new SecurityError({\n type: 'input',\n message: 'RLS predicate contains unclosed string literal',\n });\n }\n}\n\n/**\n * List of sensitive paths that should never be accessed as TLS certificates.\n * GAP #21: Expanded to include cloud credential paths and user home directories.\n */\nconst SENSITIVE_PATHS = [\n // System files\n '/etc/passwd',\n '/etc/shadow',\n '/etc/hosts',\n '/proc/',\n '/sys/',\n '/dev/',\n // Root home directory\n '/root/',\n // SSH keys\n '/.ssh/',\n // Kubernetes secrets\n '/var/run/secrets/',\n '/run/secrets/',\n // AWS credentials\n '/.aws/',\n '/credentials',\n // GCP credentials\n '/.config/gcloud/',\n '/gcloud/',\n // Azure credentials\n '/.azure/',\n // Environment files\n '/.env',\n '/env',\n];\n\n/**\n * Validate a path string against the sensitive paths blocklist.\n *\n * @param normalizedPath - The normalized path to check\n * @param fieldName - The field name for error messages\n * @throws SecurityError if the path matches a sensitive path\n */\nfunction checkAgainstBlocklist(normalizedPath: string, fieldName: string): void {\n const lowerPath = normalizedPath.toLowerCase();\n for (const sensitive of SENSITIVE_PATHS) {\n if (lowerPath.includes(sensitive)) {\n throw new SecurityError({\n type: 'input',\n message: `${fieldName} path refers to a restricted system file`,\n });\n }\n }\n}\n\n/**\n * Validate a file path for TLS certificate loading.\n *\n * Prevents path traversal attacks by ensuring paths are absolute and don't\n * contain directory traversal sequences. Also resolves symlinks to prevent\n * TOCTOU attacks where a symlink points to a restricted file.\n *\n * @param path - The file path to validate\n * @param fieldName - The field name for error messages (e.g., 'tlsCA', 'tlsCert')\n * @throws SecurityError if the path is invalid or contains traversal sequences\n */\nexport function validateTLSCertPath(path: string, fieldName: string): void {\n if (!path) {\n throw new SecurityError({\n type: 'input',\n message: `${fieldName} path cannot be empty`,\n });\n }\n\n // Check for null bytes\n if (path.includes('\\0')) {\n throw new SecurityError({\n type: 'input',\n message: `${fieldName} path contains null bytes`,\n });\n }\n\n // Normalize the path to detect traversal attempts\n const normalizedPath = path\n .replace(/\\\\/g, '/') // Normalize Windows paths\n .replace(/\\/+/g, '/'); // Remove duplicate slashes\n\n // Check for directory traversal sequences\n if (normalizedPath.includes('/../') || normalizedPath.endsWith('/..')) {\n throw new SecurityError({\n type: 'input',\n message: `${fieldName} path contains directory traversal sequence`,\n });\n }\n\n // Check for traversal at start (../something)\n if (normalizedPath.startsWith('../') || normalizedPath === '..') {\n throw new SecurityError({\n type: 'input',\n message: `${fieldName} path contains directory traversal sequence`,\n });\n }\n\n // Check for encoded traversal attempts\n if (/%2e%2e/i.test(path) || /%252e/i.test(path)) {\n throw new SecurityError({\n type: 'input',\n message: `${fieldName} path contains encoded traversal sequence`,\n });\n }\n\n // GAP #21: Check original path against expanded blocklist\n checkAgainstBlocklist(normalizedPath, fieldName);\n\n // GAP #20: Resolve symlinks to prevent TOCTOU attacks\n // If the file exists, check if it's a symlink and validate the resolved path\n try {\n if (fs.existsSync(path)) {\n const stats = fs.lstatSync(path);\n if (stats.isSymbolicLink()) {\n // Resolve the symlink and validate the target path\n const resolvedPath = fs.realpathSync(path);\n const normalizedResolved = resolvedPath.replace(/\\\\/g, '/').replace(/\\/+/g, '/');\n\n // Check resolved path against blocklist\n checkAgainstBlocklist(normalizedResolved, fieldName);\n\n // Check resolved path for traversal (shouldn't happen after realpath, but defense-in-depth)\n if (normalizedResolved.includes('/../') || normalizedResolved.endsWith('/..')) {\n throw new SecurityError({\n type: 'input',\n message: `${fieldName} symlink resolves to a path with directory traversal`,\n });\n }\n }\n }\n } catch (e) {\n // If it's already a SecurityError, rethrow it\n if (e instanceof SecurityError) {\n throw e;\n }\n // For other errors (e.g., permission denied), we continue with just the string validation\n // The actual file read will fail later with a more specific error\n }\n}\n","/**\n * Geode Protobuf Wire Protocol\n *\n * Uses protobufjs for encoding/decoding protocol messages.\n * Wire format for QUIC: 4-byte Big Endian length prefix + protobuf message body.\n */\n\n// Use default import for CJS/ESM interop (protobufjs is CJS)\nimport protobuf from 'protobufjs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n// Get the directory of this module for proto file resolution\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\nconst PROTO_PATH = path.resolve(__dirname, '..', 'proto', 'geode.proto');\n\n// --- Type definitions matching geode.proto ---\n\nexport interface HelloRequest {\n username: string;\n password: string;\n tenantId?: string;\n clientName: string;\n clientVersion: string;\n wantedConformance: string;\n}\n\nexport interface HelloResponse {\n success: boolean;\n sessionId: string;\n errorMessage: string;\n capabilities: string[];\n}\n\nexport interface Param {\n name: string;\n value: ProtoValue;\n}\n\nexport interface ExecuteRequest {\n sessionId: string;\n query: string;\n params: Param[];\n}\n\nexport interface PullRequest {\n requestId: bigint | number;\n pageSize: number;\n sessionId: string;\n}\n\nexport interface PullResponse {\n response?: ExecutionResponse;\n}\n\nexport interface Status {\n statusClass: string;\n statusSubclass: string;\n additionalStatuses: string[];\n flaggerFindings: string[];\n}\n\nexport interface ColumnDefinition {\n name: string;\n type: string;\n}\n\nexport interface SchemaDefinition {\n columns: ColumnDefinition[];\n}\n\nexport interface ProtoValue {\n nullVal?: NullValue;\n intVal?: IntValue;\n doubleVal?: DoubleValue;\n boolVal?: boolean;\n stringVal?: StringValue;\n decimalVal?: DecimalValue;\n bytesVal?: BytesValue;\n listVal?: ListValue;\n mapVal?: MapValue;\n nodeVal?: NodeValue;\n edgeVal?: EdgeValue;\n pathVal?: PathValue;\n extVal?: ExtendedValue;\n}\n\n// Empty interface for protobuf null value message\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface NullValue {}\n\nexport interface IntValue {\n value: bigint | number;\n kind: number;\n}\n\nexport interface DoubleValue {\n value: number;\n kind: number;\n}\n\nexport interface StringValue {\n value: string;\n kind: number;\n}\n\nexport interface DecimalValue {\n coeff: string;\n scale: number;\n origScale: number;\n origRepr: string;\n}\n\nexport interface BytesValue {\n value: Uint8Array;\n kind: number;\n}\n\nexport interface ListValue {\n values: ProtoValue[];\n}\n\nexport interface MapEntry {\n key: string;\n value: ProtoValue;\n}\n\nexport interface MapValue {\n entries: MapEntry[];\n}\n\nexport interface NodeValue {\n id: bigint | number;\n labels: string[];\n properties: MapEntry[];\n}\n\nexport interface EdgeValue {\n id: bigint | number;\n fromId: bigint | number;\n toId: bigint | number;\n label: string;\n properties: MapEntry[];\n}\n\nexport interface PathValue {\n nodes: NodeValue[];\n edges: EdgeValue[];\n}\n\nexport interface ExtendedValue {\n typeName: string;\n text?: string;\n bytes?: Uint8Array;\n intVal?: bigint | number;\n doubleVal?: number;\n boolVal?: boolean;\n}\n\nexport interface Row {\n values: ProtoValue[];\n}\n\nexport interface DataPage {\n rows: Row[];\n final: boolean;\n ordered: boolean;\n orderKeys: string[];\n}\n\nexport interface ProtoError {\n code: string;\n message: string;\n type: string;\n anchor: string;\n}\n\nexport interface ExecutionMetrics {\n parseDurationNs: bigint | number;\n planDurationNs: bigint | number;\n executeDurationNs: bigint | number;\n totalDurationNs: bigint | number;\n}\n\nexport interface ExplainTotals {\n cost?: number;\n est_rows?: number;\n}\n\nexport interface ExplainPayload {\n schema: string;\n ops: unknown[];\n totals?: ExplainTotals;\n properties: unknown;\n calibration: unknown;\n profileVersion: number;\n}\n\nexport interface ProfileMemory {\n netBytes?: number | bigint;\n peakBytes?: number | bigint;\n totalAllocBytes?: number | bigint;\n}\n\nexport interface ProfilePayload {\n profileVersion: number;\n ops: unknown[];\n peakContributors: unknown[];\n totals: unknown;\n totalTimeNs: bigint | number;\n spills: unknown;\n memory?: ProfileMemory;\n plannerEstimates: unknown;\n memCurve: unknown[];\n setop: unknown;\n hashaggSpills: bigint | number;\n hashaggSpillReason: string;\n committedTxns: bigint | number;\n graphStoreNodes: bigint | number;\n graphStoreEdges: bigint | number;\n graphStoreDirty: boolean;\n flaggerFindings: string[];\n compact: boolean;\n}\n\n// Empty interface for protobuf heartbeat message\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface Heartbeat {}\n\nexport interface ExecutionResponse {\n status?: Status;\n schema?: SchemaDefinition;\n page?: DataPage;\n error?: ProtoError;\n metrics?: ExecutionMetrics;\n explain?: ExplainPayload;\n profile?: ProfilePayload;\n heartbeat?: Heartbeat;\n}\n\n// Empty interface for protobuf ping request message\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface PingRequest {}\nexport interface PingResponse {\n ok: boolean;\n}\n\nexport interface BeginRequest {\n readOnly: boolean;\n sessionId: string;\n}\nexport interface BeginResponse {\n sessionId: string;\n txId: string;\n}\n\nexport interface CommitRequest {\n sessionId: string;\n}\nexport interface CommitResponse {\n success: boolean;\n}\n\nexport interface RollbackRequest {\n sessionId: string;\n}\nexport interface RollbackResponse {\n success: boolean;\n}\n\nexport interface SavepointRequest {\n name: string;\n sessionId: string;\n}\nexport interface SavepointResponse {\n success: boolean;\n}\n\nexport interface RollbackToRequest {\n name: string;\n sessionId: string;\n}\nexport interface RollbackToResponse {\n success: boolean;\n}\n\nexport interface QuicClientMessage {\n hello?: HelloRequest;\n execute?: ExecuteRequest;\n pull?: PullRequest;\n ping?: PingRequest;\n cdcDiag?: unknown;\n cdcCtrl?: unknown;\n begin?: BeginRequest;\n commit?: CommitRequest;\n rollback?: RollbackRequest;\n savepoint?: SavepointRequest;\n rollbackTo?: RollbackToRequest;\n backup?: unknown;\n restore?: unknown;\n uploadBackup?: unknown;\n}\n\nexport interface QuicServerMessage {\n hello?: HelloResponse;\n execute?: ExecutionResponse;\n pull?: PullResponse;\n ping?: PingResponse;\n cdcDiag?: unknown;\n cdcCtrl?: unknown;\n begin?: BeginResponse;\n commit?: CommitResponse;\n rollback?: RollbackResponse;\n savepoint?: SavepointResponse;\n rollbackTo?: RollbackToResponse;\n backup?: unknown;\n restore?: unknown;\n uploadBackup?: unknown;\n}\n\n// --- Protobuf Root and Message Types ---\n\nlet protoRoot: protobuf.Root | null = null;\nlet QuicClientMessageType: protobuf.Type | null = null;\nlet QuicServerMessageType: protobuf.Type | null = null;\n\n/**\n * Initialize protobuf types from the proto file.\n * This is done lazily on first use.\n */\nasync function initProto(): Promise<void> {\n if (protoRoot) return;\n\n protoRoot = await protobuf.load(PROTO_PATH);\n QuicClientMessageType = protoRoot.lookupType('geode.QuicClientMessage');\n QuicServerMessageType = protoRoot.lookupType('geode.QuicServerMessage');\n}\n\n/**\n * Initialize protobuf types synchronously (for use after async init).\n */\nfunction initProtoSync(): void {\n if (protoRoot) return;\n\n protoRoot = protobuf.loadSync(PROTO_PATH);\n QuicClientMessageType = protoRoot.lookupType('geode.QuicClientMessage');\n QuicServerMessageType = protoRoot.lookupType('geode.QuicServerMessage');\n}\n\n// Initialize on module load\ninitProtoSync();\n\n/**\n * Ensure proto is initialized.\n */\nexport async function ensureProtoInitialized(): Promise<void> {\n if (!protoRoot) {\n await initProto();\n }\n}\n\n/**\n * Convert a JavaScript value to a protobuf Value message.\n */\nexport function jsToProtoValue(value: unknown): ProtoValue {\n if (value === null || value === undefined) {\n return { nullVal: {} };\n }\n\n if (typeof value === 'boolean') {\n return { boolVal: value };\n }\n\n if (typeof value === 'number') {\n if (Number.isInteger(value)) {\n return { intVal: { value, kind: 1 } }; // INT\n }\n return { doubleVal: { value, kind: 1 } }; // DOUBLE\n }\n\n if (typeof value === 'bigint') {\n return { intVal: { value, kind: 3 } }; // BIGINT\n }\n\n if (typeof value === 'string') {\n return { stringVal: { value, kind: 1 } }; // STRING\n }\n\n if (Array.isArray(value)) {\n return {\n listVal: {\n values: value.map(jsToProtoValue),\n },\n };\n }\n\n if (value instanceof Uint8Array || Buffer.isBuffer(value)) {\n return { bytesVal: { value: value as Uint8Array, kind: 1 } }; // BYTEA\n }\n\n if (typeof value === 'object') {\n const entries: MapEntry[] = [];\n for (const [k, v] of Object.entries(value)) {\n entries.push({ key: k, value: jsToProtoValue(v) });\n }\n return { mapVal: { entries } };\n }\n\n // Default fallback for symbol/function types - convert to string representation\n // eslint-disable-next-line @typescript-eslint/no-base-to-string -- Intentional fallback for edge cases\n return { stringVal: { value: String(value), kind: 1 } };\n}\n\n/**\n * Convert a protobuf Value to a JavaScript value.\n */\nexport function protoValueToJS(val: ProtoValue): unknown {\n if (val.nullVal !== undefined) return null;\n\n if (val.boolVal !== undefined) return val.boolVal;\n\n if (val.intVal !== undefined) {\n const n = val.intVal.value;\n if (typeof n === 'bigint') {\n if (n >= BigInt(Number.MIN_SAFE_INTEGER) && n <= BigInt(Number.MAX_SAFE_INTEGER)) {\n return Number(n);\n }\n return n;\n }\n return n;\n }\n\n if (val.doubleVal !== undefined) return val.doubleVal.value;\n\n if (val.stringVal !== undefined) return val.stringVal.value;\n\n if (val.decimalVal !== undefined) {\n // Return as string to preserve precision\n return val.decimalVal.origRepr || val.decimalVal.coeff;\n }\n\n if (val.bytesVal !== undefined) return Buffer.from(val.bytesVal.value);\n\n if (val.listVal !== undefined) {\n return val.listVal.values.map(protoValueToJS);\n }\n\n if (val.mapVal !== undefined) {\n const obj: Record<string, unknown> = {};\n for (const entry of val.mapVal.entries) {\n obj[entry.key] = protoValueToJS(entry.value);\n }\n return obj;\n }\n\n if (val.nodeVal !== undefined) {\n const node = val.nodeVal;\n const props: Record<string, unknown> = {};\n for (const entry of node.properties) {\n props[entry.key] = protoValueToJS(entry.value);\n }\n return {\n id: typeof node.id === 'bigint' ? node.id : BigInt(node.id),\n labels: node.labels,\n properties: props,\n };\n }\n\n if (val.edgeVal !== undefined) {\n const edge = val.edgeVal;\n const props: Record<string, unknown> = {};\n for (const entry of edge.properties) {\n props[entry.key] = protoValueToJS(entry.value);\n }\n return {\n id: typeof edge.id === 'bigint' ? edge.id : BigInt(edge.id),\n startNode: typeof edge.fromId === 'bigint' ? edge.fromId : BigInt(edge.fromId),\n endNode: typeof edge.toId === 'bigint' ? edge.toId : BigInt(edge.toId),\n type: edge.label,\n properties: props,\n };\n }\n\n if (val.pathVal !== undefined) {\n const path = val.pathVal;\n return {\n nodes: path.nodes.map((n) => protoValueToJS({ nodeVal: n })),\n edges: path.edges.map((e) => protoValueToJS({ edgeVal: e })),\n };\n }\n\n if (val.extVal !== undefined) {\n const ext = val.extVal;\n if (ext.text !== undefined) return ext.text;\n if (ext.bytes !== undefined) return Buffer.from(ext.bytes);\n if (ext.intVal !== undefined) return ext.intVal;\n if (ext.doubleVal !== undefined) return ext.doubleVal;\n if (ext.boolVal !== undefined) return ext.boolVal;\n return null;\n }\n\n return null;\n}\n\n/**\n * Encode a QuicClientMessage to protobuf bytes.\n */\nexport function encodeQuicClientMessage(msg: QuicClientMessage): Buffer {\n if (!QuicClientMessageType) {\n initProtoSync();\n }\n\n const err = QuicClientMessageType!.verify(msg);\n if (err) {\n throw new Error(`Invalid QuicClientMessage: ${err}`);\n }\n\n const message = QuicClientMessageType!.create(msg);\n const buffer = QuicClientMessageType!.encode(message).finish();\n return Buffer.from(buffer);\n}\n\n/**\n * Encode a QuicClientMessage with 4-byte big-endian length prefix.\n */\nexport function encodeWithLengthPrefix(msg: QuicClientMessage): Buffer {\n const data = encodeQuicClientMessage(msg);\n const lengthBuf = Buffer.alloc(4);\n lengthBuf.writeUInt32BE(data.length, 0);\n return Buffer.concat([lengthBuf, data]);\n}\n\n/**\n * Decode a QuicServerMessage from protobuf bytes.\n */\nexport function decodeQuicServerMessage(data: Buffer | Uint8Array): QuicServerMessage {\n if (!QuicServerMessageType) {\n initProtoSync();\n }\n\n const message = QuicServerMessageType!.decode(data);\n return QuicServerMessageType!.toObject(message, {\n longs: Number,\n enums: Number,\n bytes: Buffer,\n defaults: true,\n }) as QuicServerMessage;\n}\n\n/**\n * Decode 4-byte big-endian length prefix.\n */\nexport function decodeLengthPrefix(data: Buffer): number {\n if (data.length < 4) {\n throw new Error('Insufficient data for length prefix');\n }\n return data.readUInt32BE(0);\n}\n\n/**\n * Build a HelloRequest message.\n */\nexport function buildHelloRequest(\n username: string,\n password: string,\n clientName: string,\n clientVersion: string,\n conformance: string,\n tenantId?: string\n): QuicClientMessage {\n return {\n hello: {\n username,\n password,\n tenantId,\n clientName,\n clientVersion,\n wantedConformance: conformance,\n },\n };\n}\n\n/**\n * Build an ExecuteRequest message.\n */\nexport function buildExecuteRequest(\n sessionId: string,\n query: string,\n params?: Record<string, unknown>\n): QuicClientMessage {\n const protoParams: Param[] = [];\n if (params) {\n for (const [name, value] of Object.entries(params)) {\n protoParams.push({\n name,\n value: jsToProtoValue(value),\n });\n }\n }\n\n return {\n execute: {\n sessionId,\n query,\n params: protoParams,\n },\n };\n}\n\n/**\n * Build a PullRequest message.\n */\nexport function buildPullRequest(\n requestId: number,\n pageSize: number,\n sessionId: string\n): QuicClientMessage {\n return {\n pull: {\n requestId,\n pageSize,\n sessionId,\n },\n };\n}\n\n/**\n * Build a PingRequest message.\n */\nexport function buildPingRequest(): QuicClientMessage {\n return { ping: {} };\n}\n\n/**\n * Build a BeginRequest message.\n */\nexport function buildBeginRequest(readOnly: boolean, sessionId: string): QuicClientMessage {\n return {\n begin: {\n readOnly,\n sessionId,\n },\n };\n}\n\n/**\n * Build a CommitRequest message.\n */\nexport function buildCommitRequest(sessionId: string): QuicClientMessage {\n return {\n commit: {\n sessionId,\n },\n };\n}\n\n/**\n * Build a RollbackRequest message.\n */\nexport function buildRollbackRequest(sessionId: string): QuicClientMessage {\n return {\n rollback: {\n sessionId,\n },\n };\n}\n\n/**\n * Build a SavepointRequest message.\n */\nexport function buildSavepointRequest(name: string, sessionId: string): QuicClientMessage {\n return {\n savepoint: {\n name,\n sessionId,\n },\n };\n}\n\n/**\n * Build a RollbackToRequest message.\n */\nexport function buildRollbackToRequest(name: string, sessionId: string): QuicClientMessage {\n return {\n rollbackTo: {\n name,\n sessionId,\n },\n };\n}\n\n/**\n * Convert a DataPage row to a record of column name -> value.\n */\nexport function rowToRecord(row: Row, columns: ColumnDefinition[]): Record<string, unknown> {\n const record: Record<string, unknown> = {};\n for (let i = 0; i < columns.length && i < row.values.length; i++) {\n const col = columns[i]!;\n const val = row.values[i]!;\n record[col.name] = protoValueToJS(val);\n }\n return record;\n}\n\n/**\n * Get proto file path for gRPC loader.\n */\nexport function getProtoPath(): string {\n return PROTO_PATH;\n}\n","/**\n * gRPC Transport Layer\n *\n * Provides gRPC transport for communication with Geode server.\n * Uses @grpc/grpc-js with dynamic proto loading.\n *\n * Method mapping (QuicClientMessage field -> gRPC service RPC):\n * hello -> Handshake (unary)\n * execute -> Execute (server-streaming: schema + data pages)\n * pull -> reads next buffered message from the Execute stream\n * ping -> Ping (unary)\n * begin -> Begin (unary)\n * commit -> Commit (unary)\n * rollback -> Rollback (unary)\n * savepoint / rollbackTo -> not supported over gRPC\n */\n\nimport * as grpc from '@grpc/grpc-js';\nimport * as protoLoader from '@grpc/proto-loader';\nimport * as fs from 'node:fs';\nimport type { GeodeConfig } from './config.js';\nimport { getAddress } from './config.js';\nimport { TransportError, ErrClosed } from './errors.js';\nimport { validateTLSCertPath } from './validate.js';\nimport {\n getProtoPath,\n type QuicClientMessage,\n type QuicServerMessage,\n type HelloResponse,\n type ExecutionResponse,\n type PingResponse,\n type BeginResponse,\n type CommitResponse,\n type RollbackResponse,\n} from './proto.js';\nimport type { Transport } from './transport.js';\n\n// Get proto path from proto.ts (which handles CJS/ESM compatibility)\nconst PROTO_PATH = getProtoPath();\n\n// Proto loader options\nconst PROTO_LOADER_OPTIONS: protoLoader.Options = {\n keepCase: false,\n longs: Number,\n enums: Number,\n defaults: true,\n oneofs: true,\n};\n\n// Service client type (dynamically loaded).\n// Method names are camelCase of the proto RPC names.\ninterface GeodeServiceClient {\n handshake(\n request: unknown,\n callback: (error: grpc.ServiceError | null, response: unknown) => void\n ): grpc.ClientUnaryCall;\n execute(request: unknown): grpc.ClientReadableStream<unknown>;\n ping(\n request: unknown,\n callback: (error: grpc.ServiceError | null, response: unknown) => void\n ): grpc.ClientUnaryCall;\n begin(\n request: unknown,\n callback: (error: grpc.ServiceError | null, response: unknown) => void\n ): grpc.ClientUnaryCall;\n commit(\n request: unknown,\n callback: (error: grpc.ServiceError | null, response: unknown) => void\n ): grpc.ClientUnaryCall;\n rollback(\n request: unknown,\n callback: (error: grpc.ServiceError | null, response: unknown) => void\n ): grpc.ClientUnaryCall;\n close(): void;\n}\n\n/**\n * gRPC transport for Geode database.\n */\nexport class GrpcTransport implements Transport {\n private _client: GeodeServiceClient | null = null;\n private _closed = false;\n private _address: string;\n private _pendingResponses: QuicServerMessage[] = [];\n private _activeStream: grpc.ClientReadableStream<unknown> | null = null;\n\n constructor(address: string) {\n this._address = address;\n }\n\n /**\n * Connect to the Geode server using gRPC.\n */\n static async connect(cfg: GeodeConfig): Promise<GrpcTransport> {\n const address = getAddress(cfg);\n const transport = new GrpcTransport(address);\n\n try {\n // Load proto definition\n const packageDefinition = await protoLoader.load(PROTO_PATH, PROTO_LOADER_OPTIONS);\n const protoDescriptor = grpc.loadPackageDefinition(packageDefinition) as unknown as {\n geode: {\n GeodeService: new (\n address: string,\n credentials: grpc.ChannelCredentials,\n options?: grpc.ChannelOptions\n ) => GeodeServiceClient;\n };\n };\n\n // Build channel credentials\n let credentials: grpc.ChannelCredentials;\n if (cfg.tls === false) {\n credentials = grpc.credentials.createInsecure();\n } else if (cfg.insecureSkipVerify) {\n // Use TLS but skip certificate verification (for self-signed certs)\n // Load CA cert if provided, otherwise use null (skip CA validation)\n let rootCerts: Buffer | null = null;\n if (cfg.tlsCA) {\n rootCerts = await import('fs').then((fs) => fs.promises.readFile(cfg.tlsCA!));\n } else if (cfg.tlsCACert) {\n rootCerts = Buffer.from(cfg.tlsCACert);\n }\n credentials = grpc.credentials.createSsl(rootCerts, null, null, {\n checkServerIdentity: () => undefined,\n });\n } else {\n const sslOptions = await buildGrpcSslOptions(cfg);\n credentials = grpc.credentials.createSsl(\n sslOptions.rootCerts,\n sslOptions.privateKey,\n sslOptions.certChain\n );\n }\n\n // Channel options\n const options: grpc.ChannelOptions = {\n 'grpc.max_receive_message_length': 100 * 1024 * 1024, // 100MB\n 'grpc.max_send_message_length': 100 * 1024 * 1024,\n 'grpc.keepalive_time_ms': cfg.keepAliveInterval ?? 10000,\n 'grpc.keepalive_timeout_ms': 5000,\n 'grpc.keepalive_permit_without_calls': 1,\n };\n\n // Create client\n transport._client = new protoDescriptor.geode.GeodeService(address, credentials, options);\n\n return transport;\n } catch (e) {\n await transport.close();\n throw new TransportError({\n operation: 'connect',\n address,\n cause: e instanceof Error ? e : new Error(String(e)),\n });\n }\n }\n\n /**\n * Send a protobuf message and queue the response.\n * For gRPC, this makes the appropriate RPC call based on the message type.\n */\n async sendProto(msg: QuicClientMessage, signal?: AbortSignal): Promise<void> {\n this.checkClosed();\n\n if (signal?.aborted) {\n throw new TransportError({ operation: 'sendProto', cause: new Error('Aborted') });\n }\n\n if (!this._client) {\n throw new TransportError({ operation: 'sendProto', cause: new Error('No client') });\n }\n\n try {\n if (msg.hello) {\n // hello -> Handshake RPC (unary)\n const response = await this.callUnary<HelloResponse>('handshake', msg.hello, signal);\n this._pendingResponses.push({ hello: response });\n } else if (msg.execute) {\n // execute -> Execute RPC (server-streaming)\n // Collects all streamed messages (schema + data pages) into the pending queue.\n await this.callServerStream(msg.execute, signal);\n } else if (msg.pull) {\n // pull -> no separate gRPC RPC; responses are already buffered\n // from the streaming Execute call. If the buffer is empty the\n // caller will get the response via receiveProto which checks\n // the pending queue. Nothing to do here.\n // However, if no buffered responses remain, that means the\n // stream completed (final page was already delivered).\n // Push a synthetic final page so the caller knows we're done.\n if (this._pendingResponses.length === 0) {\n this._pendingResponses.push({\n execute: {\n status: {\n statusClass: '00000',\n statusSubclass: '',\n additionalStatuses: [],\n flaggerFindings: [],\n },\n payload: 'page',\n page: { rows: [], final: true, ordered: false, orderKeys: [] },\n } as ExecutionResponse,\n });\n }\n } else if (msg.ping) {\n const response = await this.callUnary<PingResponse>('ping', msg.ping, signal);\n this._pendingResponses.push({ ping: response });\n } else if (msg.begin) {\n const response = await this.callUnary<BeginResponse>('begin', msg.begin, signal);\n this._pendingResponses.push({ begin: response });\n } else if (msg.commit) {\n const response = await this.callUnary<CommitResponse>('commit', msg.commit, signal);\n this._pendingResponses.push({ commit: response });\n } else if (msg.rollback) {\n const response = await this.callUnary<RollbackResponse>('rollback', msg.rollback, signal);\n this._pendingResponses.push({ rollback: response });\n } else if (msg.savepoint) {\n // Savepoint is not exposed as a gRPC RPC on the server.\n throw new TransportError({\n operation: 'sendProto',\n cause: new Error('Savepoint is not supported over gRPC transport'),\n });\n } else if (msg.rollbackTo) {\n // RollbackTo is not exposed as a gRPC RPC on the server.\n throw new TransportError({\n operation: 'sendProto',\n cause: new Error('RollbackTo is not supported over gRPC transport'),\n });\n } else {\n throw new TransportError({\n operation: 'sendProto',\n cause: new Error('Unknown message type'),\n });\n }\n } catch (e) {\n if (e instanceof TransportError) throw e;\n throw new TransportError({\n operation: 'sendProto',\n address: this._address,\n cause: e instanceof Error ? e : new Error(String(e)),\n });\n }\n }\n\n /**\n * Receive a protobuf message from the queue.\n */\n // eslint-disable-next-line @typescript-eslint/require-await -- Method must be async for interface compatibility\n async receiveProto(signal?: AbortSignal): Promise<QuicServerMessage> {\n this.checkClosed();\n\n if (signal?.aborted) {\n throw new TransportError({ operation: 'receiveProto', cause: new Error('Aborted') });\n }\n\n // Return queued response\n const response = this._pendingResponses.shift();\n if (response) {\n return response;\n }\n\n // No response available - this shouldn't happen with proper sendProto usage\n throw new TransportError({\n operation: 'receiveProto',\n cause: new Error('No response available'),\n });\n }\n\n /**\n * Legacy JSON send (not supported for gRPC).\n */\n // eslint-disable-next-line @typescript-eslint/require-await\n async send(_msg: Record<string, unknown>, _signal?: AbortSignal): Promise<void> {\n throw new TransportError({\n operation: 'send',\n cause: new Error('JSON mode not supported for gRPC transport'),\n });\n }\n\n /**\n * Legacy JSON receive (not supported for gRPC).\n */\n // eslint-disable-next-line @typescript-eslint/require-await\n async receive(_signal?: AbortSignal): Promise<Buffer> {\n throw new TransportError({\n operation: 'receive',\n cause: new Error('JSON mode not supported for gRPC transport'),\n });\n }\n\n /**\n * Close the transport.\n */\n // eslint-disable-next-line @typescript-eslint/require-await\n async close(): Promise<void> {\n if (this._closed) return;\n this._closed = true;\n\n if (this._activeStream) {\n this._activeStream.cancel();\n this._activeStream = null;\n }\n\n if (this._client) {\n this._client.close();\n this._client = null;\n }\n }\n\n /**\n * Check if transport is closed.\n */\n isClosed(): boolean {\n return this._closed;\n }\n\n /**\n * Get remote address.\n */\n getAddress(): string {\n return this._address;\n }\n\n /**\n * Make a unary RPC call.\n */\n private callUnary<T>(method: string, request: unknown, signal?: AbortSignal): Promise<T> {\n return new Promise((resolve, reject) => {\n if (!this._client) {\n reject(new Error('No client'));\n return;\n }\n\n const clientMethod = this._client[method as keyof GeodeServiceClient] as (\n request: unknown,\n callback: (error: grpc.ServiceError | null, response: unknown) => void\n ) => grpc.ClientUnaryCall;\n\n if (typeof clientMethod !== 'function') {\n reject(new Error(`Unknown method: ${method}`));\n return;\n }\n\n const call = clientMethod.call(this._client, request, (error, response) => {\n if (error) {\n reject(\n new TransportError({\n operation: method,\n address: this._address,\n cause: new Error(`gRPC error ${error.code}: ${error.message}`),\n })\n );\n } else {\n resolve(response as T);\n }\n });\n\n if (signal) {\n const onAbort = () => {\n call.cancel();\n reject(new TransportError({ operation: method, cause: new Error('Aborted') }));\n };\n signal.addEventListener('abort', onAbort, { once: true });\n }\n });\n }\n\n /**\n * Call the server-streaming Execute RPC.\n * Collects all streamed ExecutionResponse messages into _pendingResponses.\n */\n private callServerStream(request: unknown, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this._client) {\n reject(new Error('No client'));\n return;\n }\n\n // Cancel any previous stream\n if (this._activeStream) {\n this._activeStream.cancel();\n this._activeStream = null;\n }\n\n const stream = this._client.execute(request);\n this._activeStream = stream;\n\n stream.on('data', (response: unknown) => {\n this._pendingResponses.push({ execute: response as ExecutionResponse });\n });\n\n stream.on('end', () => {\n this._activeStream = null;\n resolve();\n });\n\n stream.on('error', (error: grpc.ServiceError) => {\n this._activeStream = null;\n reject(\n new TransportError({\n operation: 'execute',\n address: this._address,\n cause: new Error(`gRPC error ${error.code}: ${error.message}`),\n })\n );\n });\n\n if (signal) {\n const onAbort = () => {\n stream.cancel();\n reject(new TransportError({ operation: 'execute', cause: new Error('Aborted') }));\n };\n signal.addEventListener('abort', onAbort, { once: true });\n }\n });\n }\n\n /**\n * Check if closed and throw if so.\n */\n private checkClosed(): void {\n if (this._closed) {\n throw ErrClosed;\n }\n }\n}\n\n/**\n * Build SSL options for gRPC from GeodeConfig.\n */\nasync function buildGrpcSslOptions(cfg: GeodeConfig): Promise<{\n rootCerts: Buffer | null;\n privateKey: Buffer | null;\n certChain: Buffer | null;\n}> {\n let rootCerts: Buffer | null = null;\n let privateKey: Buffer | null = null;\n let certChain: Buffer | null = null;\n\n // Load CA certificate\n if (cfg.tlsCACert) {\n rootCerts = Buffer.from(cfg.tlsCACert);\n } else if (cfg.tlsCA) {\n validateTLSCertPath(cfg.tlsCA, 'tlsCA');\n rootCerts = await fs.promises.readFile(cfg.tlsCA);\n }\n\n // Load client certificate for mTLS\n if (cfg.tlsCertPEM) {\n certChain = Buffer.from(cfg.tlsCertPEM);\n } else if (cfg.tlsCert) {\n validateTLSCertPath(cfg.tlsCert, 'tlsCert');\n certChain = await fs.promises.readFile(cfg.tlsCert);\n }\n\n // Load client key for mTLS\n if (cfg.tlsKeyPEM) {\n privateKey = Buffer.from(cfg.tlsKeyPEM);\n } else if (cfg.tlsKey) {\n validateTLSCertPath(cfg.tlsKey, 'tlsKey');\n privateKey = await fs.promises.readFile(cfg.tlsKey);\n }\n\n return { rootCerts, privateKey, certChain };\n}\n","/**\n * GQL Type System\n *\n * Implements the GQL value type system for ISO/IEC 39075:2024 compliance.\n */\n\n// Import Decimal from decimal.js-light\n// The module has compatibility issues with TypeScript ESM declarations, so we use type-only import + runtime require\nimport type { Decimal } from 'decimal.js-light';\n\n// Create Decimal at runtime to avoid TypeScript declaration issues\n// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- Dynamic import requires type assertion\nconst DecimalClass: new (value: string | number) => Decimal =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Module type is incompatible\n (await import('decimal.js-light')).default as any;\n\n// Helper to check if value is Decimal (duck typing)\nfunction isDecimal(value: unknown): value is Decimal {\n return value !== null && typeof value === 'object' && 'toFixed' in value && 'toNumber' in value;\n}\n\n// Helper to create Decimal\nfunction createDecimal(value: string | number | Decimal): Decimal {\n if (isDecimal(value)) return value;\n return new DecimalClass(value);\n}\n\n/**\n * GQL value kind enumeration.\n */\nexport type GQLValueKind =\n | 'NULL'\n | 'BOOL'\n | 'INT'\n | 'FLOAT'\n | 'STRING'\n | 'DECIMAL'\n | 'BYTEA'\n | 'DATE'\n | 'TIME'\n | 'TIMETZ'\n | 'TIMESTAMP'\n | 'TIMESTAMPTZ'\n | 'INTERVAL'\n | 'JSON'\n | 'JSONB'\n | 'XML'\n | 'URL'\n | 'DOMAIN'\n | 'UUID'\n | 'ENUM'\n | 'BIT_STRING'\n | 'RANGE'\n | 'ARRAY'\n | 'OBJECT'\n | 'NODE'\n | 'EDGE'\n | 'PATH'\n | 'UNKNOWN';\n\n/**\n * GQL type enumeration for wire protocol.\n */\nexport type GQLType =\n | 'INT'\n | 'INTEGER'\n | 'BIGINT'\n | 'FLOAT'\n | 'DOUBLE'\n | 'REAL'\n | 'DECIMAL'\n | 'STRING'\n | 'VARCHAR'\n | 'TEXT'\n | 'BOOL'\n | 'BOOLEAN'\n | 'NULL'\n | 'LIST'\n | 'ARRAY'\n | 'MAP'\n | 'RECORD'\n | 'NODE'\n | 'EDGE'\n | 'RELATIONSHIP'\n | 'PATH'\n | 'BYTEA'\n | 'DATE'\n | 'TIME'\n | 'TIMETZ'\n | 'TIMESTAMP'\n | 'TIMESTAMPTZ'\n | 'INTERVAL'\n | 'JSON'\n | 'JSONB'\n | 'XML'\n | 'UUID'\n | 'URL'\n | 'DOMAIN'\n | 'ENUM'\n | 'BIT'\n | 'VARBIT'\n | 'UNKNOWN';\n\n/**\n * Range bounds for GQL range types.\n */\nexport interface GQLRange<T = unknown> {\n lower?: T;\n upper?: T;\n lowerInclusive: boolean;\n upperInclusive: boolean;\n}\n\n/**\n * Type alias for node/edge IDs.\n *\n * IDs can be:\n * - string: String-based IDs or hex format IDs\n * - number: Integer IDs within JavaScript's safe integer range\n * - bigint: Integer IDs larger than Number.MAX_SAFE_INTEGER (2^53 - 1)\n *\n * Note: Geode's internal IDs often exceed JavaScript's safe integer limit,\n * so bigint is used to preserve full precision.\n */\nexport type GQLId = string | number | bigint;\n\n/**\n * Node structure from graph queries.\n */\nexport interface GQLNode {\n id: GQLId;\n labels: string[];\n properties: Record<string, unknown>;\n}\n\n/**\n * Edge structure from graph queries.\n *\n * Note: The server may return edge endpoints as either:\n * - `startNode`/`endNode` (normalized form used by the client)\n * - `from`/`to` (alternative wire format)\n *\n * The client normalizes both formats to `startNode`/`endNode`.\n */\nexport interface GQLEdge {\n id: GQLId;\n type: string;\n startNode: GQLId;\n endNode: GQLId;\n properties: Record<string, unknown>;\n}\n\n/**\n * Raw edge structure as it may appear in wire format.\n * Used internally for parsing before normalization.\n */\nexport interface RawEdge {\n id: GQLId;\n type: string;\n startNode?: GQLId;\n endNode?: GQLId;\n from?: GQLId;\n to?: GQLId;\n properties?: Record<string, unknown>;\n}\n\n/**\n * Path structure from graph queries.\n */\nexport interface GQLPath {\n nodes: GQLNode[];\n edges: GQLEdge[];\n}\n\n/**\n * GQL Value wrapper for type-safe value handling.\n */\nexport class GQLValue {\n readonly kind: GQLValueKind;\n\n private _intValue: bigint = 0n;\n private _floatValue: number = 0;\n private _boolValue: boolean = false;\n private _stringValue: string = '';\n private _decimalValue?: Decimal;\n private _arrayValue: GQLValue[] = [];\n private _objectValue: Map<string, GQLValue> = new Map();\n private _bytesValue: Uint8Array = new Uint8Array();\n private _dateValue?: Date;\n private _rangeValue?: GQLRange;\n private _nodeValue?: GQLNode;\n private _edgeValue?: GQLEdge;\n private _pathValue?: GQLPath;\n private _rawValue?: unknown;\n\n private constructor(kind: GQLValueKind) {\n this.kind = kind;\n }\n\n // Factory methods\n static null(): GQLValue {\n return new GQLValue('NULL');\n }\n\n static bool(value: boolean): GQLValue {\n const v = new GQLValue('BOOL');\n v._boolValue = value;\n return v;\n }\n\n static int(value: number | bigint): GQLValue {\n const v = new GQLValue('INT');\n v._intValue = typeof value === 'bigint' ? value : BigInt(Math.trunc(value));\n return v;\n }\n\n static float(value: number): GQLValue {\n const v = new GQLValue('FLOAT');\n v._floatValue = value;\n return v;\n }\n\n static string(value: string): GQLValue {\n const v = new GQLValue('STRING');\n v._stringValue = value;\n return v;\n }\n\n static decimal(value: string | number | Decimal): GQLValue {\n const v = new GQLValue('DECIMAL');\n v._decimalValue = createDecimal(value);\n return v;\n }\n\n static array(values: GQLValue[]): GQLValue {\n const v = new GQLValue('ARRAY');\n v._arrayValue = values;\n return v;\n }\n\n static object(values: Map<string, GQLValue> | Record<string, GQLValue>): GQLValue {\n const v = new GQLValue('OBJECT');\n v._objectValue = values instanceof Map ? values : new Map(Object.entries(values));\n return v;\n }\n\n static bytes(value: Uint8Array | Buffer): GQLValue {\n const v = new GQLValue('BYTEA');\n v._bytesValue = value instanceof Uint8Array ? value : new Uint8Array(value);\n return v;\n }\n\n static date(value: Date): GQLValue {\n const v = new GQLValue('DATE');\n v._dateValue = value;\n return v;\n }\n\n static time(value: Date): GQLValue {\n const v = new GQLValue('TIME');\n v._dateValue = value;\n return v;\n }\n\n static timestamp(value: Date): GQLValue {\n const v = new GQLValue('TIMESTAMP');\n v._dateValue = value;\n return v;\n }\n\n static uuid(value: string): GQLValue {\n const v = new GQLValue('UUID');\n v._stringValue = value;\n return v;\n }\n\n static json(value: unknown): GQLValue {\n const v = new GQLValue('JSON');\n v._rawValue = value;\n return v;\n }\n\n static node(value: GQLNode): GQLValue {\n const v = new GQLValue('NODE');\n v._nodeValue = value;\n return v;\n }\n\n static edge(value: GQLEdge): GQLValue {\n const v = new GQLValue('EDGE');\n v._edgeValue = value;\n return v;\n }\n\n static path(value: GQLPath): GQLValue {\n const v = new GQLValue('PATH');\n v._pathValue = value;\n return v;\n }\n\n static range<T>(value: GQLRange<T>): GQLValue {\n const v = new GQLValue('RANGE');\n v._rangeValue = value as GQLRange;\n return v;\n }\n\n static unknown(value: unknown): GQLValue {\n const v = new GQLValue('UNKNOWN');\n v._rawValue = value;\n return v;\n }\n\n // Type-safe accessors\n get isNull(): boolean {\n return this.kind === 'NULL';\n }\n\n get asBool(): boolean {\n if (this.kind !== 'BOOL') {\n throw new TypeError(`Cannot convert ${this.kind} to boolean`);\n }\n return this._boolValue;\n }\n\n get asInt(): bigint {\n if (this.kind !== 'INT') {\n throw new TypeError(`Cannot convert ${this.kind} to int`);\n }\n return this._intValue;\n }\n\n get asNumber(): number {\n if (this.kind === 'INT') {\n return Number(this._intValue);\n }\n if (this.kind === 'FLOAT') {\n return this._floatValue;\n }\n if (this.kind === 'DECIMAL') {\n return this._decimalValue?.toNumber() ?? 0;\n }\n throw new TypeError(`Cannot convert ${this.kind} to number`);\n }\n\n get asFloat(): number {\n if (this.kind !== 'FLOAT') {\n throw new TypeError(`Cannot convert ${this.kind} to float`);\n }\n return this._floatValue;\n }\n\n get asString(): string {\n if (this.kind === 'STRING' || this.kind === 'UUID') {\n return this._stringValue;\n }\n // Allow stringification of other types\n return this.toString();\n }\n\n get asDecimal(): Decimal {\n if (this.kind !== 'DECIMAL') {\n throw new TypeError(`Cannot convert ${this.kind} to decimal`);\n }\n return this._decimalValue!;\n }\n\n get asArray(): GQLValue[] {\n if (this.kind !== 'ARRAY') {\n throw new TypeError(`Cannot convert ${this.kind} to array`);\n }\n return this._arrayValue;\n }\n\n get asObject(): Map<string, GQLValue> {\n if (this.kind !== 'OBJECT' && this.kind !== 'NODE' && this.kind !== 'EDGE') {\n throw new TypeError(`Cannot convert ${this.kind} to object`);\n }\n return this._objectValue;\n }\n\n get asBytes(): Uint8Array {\n if (this.kind !== 'BYTEA') {\n throw new TypeError(`Cannot convert ${this.kind} to bytes`);\n }\n return this._bytesValue;\n }\n\n get asDate(): Date {\n if (\n this.kind !== 'DATE' &&\n this.kind !== 'TIME' &&\n this.kind !== 'TIMETZ' &&\n this.kind !== 'TIMESTAMP' &&\n this.kind !== 'TIMESTAMPTZ'\n ) {\n throw new TypeError(`Cannot convert ${this.kind} to date`);\n }\n return this._dateValue!;\n }\n\n get asNode(): GQLNode {\n if (this.kind !== 'NODE') {\n throw new TypeError(`Cannot convert ${this.kind} to node`);\n }\n return this._nodeValue!;\n }\n\n get asEdge(): GQLEdge {\n if (this.kind !== 'EDGE') {\n throw new TypeError(`Cannot convert ${this.kind} to edge`);\n }\n return this._edgeValue!;\n }\n\n get asPath(): GQLPath {\n if (this.kind !== 'PATH') {\n throw new TypeError(`Cannot convert ${this.kind} to path`);\n }\n return this._pathValue!;\n }\n\n get asRange(): GQLRange {\n if (this.kind !== 'RANGE') {\n throw new TypeError(`Cannot convert ${this.kind} to range`);\n }\n return this._rangeValue!;\n }\n\n get asJSON(): unknown {\n if (this.kind !== 'JSON' && this.kind !== 'JSONB') {\n throw new TypeError(`Cannot convert ${this.kind} to JSON`);\n }\n return this._rawValue;\n }\n\n get raw(): unknown {\n return this._rawValue;\n }\n\n toString(): string {\n switch (this.kind) {\n case 'NULL':\n return 'null';\n case 'BOOL':\n return this._boolValue.toString();\n case 'INT':\n return this._intValue.toString();\n case 'FLOAT':\n return this._floatValue.toString();\n case 'STRING':\n case 'UUID':\n return this._stringValue;\n case 'DECIMAL':\n return this._decimalValue?.toString() ?? '0';\n case 'ARRAY':\n return `[${this._arrayValue.map((v) => v.toString()).join(', ')}]`;\n case 'OBJECT':\n return `{${[...this._objectValue.entries()]\n .map(([k, v]) => `${k}: ${v.toString()}`)\n .join(', ')}}`;\n case 'BYTEA':\n return `<bytes:${this._bytesValue.length}>`;\n case 'DATE':\n case 'TIME':\n case 'TIMETZ':\n case 'TIMESTAMP':\n case 'TIMESTAMPTZ':\n return this._dateValue?.toISOString() ?? '';\n case 'NODE':\n return `(${this._nodeValue?.labels.join(':')} {${JSON.stringify(this._nodeValue?.properties)}})`;\n case 'EDGE':\n return `[${this._edgeValue?.type} {${JSON.stringify(this._edgeValue?.properties)}}]`;\n case 'PATH':\n return `<path:${this._pathValue?.nodes.length} nodes>`;\n case 'JSON':\n case 'JSONB':\n return JSON.stringify(this._rawValue);\n default:\n // Fallback for unknown types - safe to stringify\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n return String(this._rawValue ?? '');\n }\n }\n\n /**\n * Convert to a plain JavaScript value.\n */\n toJS(): unknown {\n switch (this.kind) {\n case 'NULL':\n return null;\n case 'BOOL':\n return this._boolValue;\n case 'INT':\n // Return number if safe, bigint otherwise\n if (\n this._intValue >= Number.MIN_SAFE_INTEGER &&\n this._intValue <= Number.MAX_SAFE_INTEGER\n ) {\n return Number(this._intValue);\n }\n return this._intValue;\n case 'FLOAT':\n return this._floatValue;\n case 'STRING':\n case 'UUID':\n return this._stringValue;\n case 'DECIMAL':\n return this._decimalValue?.toString();\n case 'ARRAY':\n return this._arrayValue.map((v) => v.toJS());\n case 'OBJECT':\n return Object.fromEntries([...this._objectValue.entries()].map(([k, v]) => [k, v.toJS()]));\n case 'BYTEA':\n return this._bytesValue;\n case 'DATE':\n case 'TIME':\n case 'TIMETZ':\n case 'TIMESTAMP':\n case 'TIMESTAMPTZ':\n return this._dateValue;\n case 'NODE':\n return this._nodeValue;\n case 'EDGE':\n return this._edgeValue;\n case 'PATH':\n return this._pathValue;\n case 'RANGE':\n return this._rangeValue;\n case 'JSON':\n case 'JSONB':\n return this._rawValue;\n default:\n return this._rawValue;\n }\n }\n\n /**\n * Convert to JSON-serializable format.\n */\n toJSON(): unknown {\n return this.toJS();\n }\n}\n\n/**\n * Parse a GQL type string to GQLValueKind.\n */\nexport function parseGQLType(typeStr: string): GQLValueKind {\n const upper = typeStr.toUpperCase();\n switch (upper) {\n case 'INT':\n case 'INTEGER':\n case 'BIGINT':\n case 'INT8':\n case 'INT16':\n case 'INT32':\n case 'INT64':\n case 'UINT8':\n case 'UINT16':\n case 'UINT32':\n case 'UINT64':\n case 'SMALLINT':\n case 'TINYINT':\n return 'INT';\n case 'FLOAT':\n case 'DOUBLE':\n case 'REAL':\n case 'FLOAT32':\n case 'FLOAT64':\n return 'FLOAT';\n case 'DECIMAL':\n case 'NUMERIC':\n return 'DECIMAL';\n case 'STRING':\n case 'VARCHAR':\n case 'TEXT':\n return 'STRING';\n case 'BOOL':\n case 'BOOLEAN':\n return 'BOOL';\n case 'NULL':\n return 'NULL';\n case 'LIST':\n case 'ARRAY':\n return 'ARRAY';\n case 'MAP':\n case 'RECORD':\n case 'OBJECT':\n return 'OBJECT';\n case 'NODE':\n return 'NODE';\n case 'EDGE':\n case 'RELATIONSHIP':\n return 'EDGE';\n case 'PATH':\n return 'PATH';\n case 'BYTEA':\n case 'BINARY':\n return 'BYTEA';\n case 'DATE':\n return 'DATE';\n case 'TIME':\n return 'TIME';\n case 'TIMETZ':\n case 'TIME WITH TIME ZONE':\n return 'TIMETZ';\n case 'TIMESTAMP':\n return 'TIMESTAMP';\n case 'TIMESTAMPTZ':\n case 'TIMESTAMP WITH TIME ZONE':\n return 'TIMESTAMPTZ';\n case 'INTERVAL':\n return 'INTERVAL';\n case 'JSON':\n return 'JSON';\n case 'JSONB':\n return 'JSONB';\n case 'XML':\n return 'XML';\n case 'UUID':\n return 'UUID';\n case 'URL':\n return 'URL';\n case 'DOMAIN':\n return 'DOMAIN';\n case 'ENUM':\n return 'ENUM';\n case 'BIT':\n case 'VARBIT':\n return 'BIT_STRING';\n default:\n if (upper.includes('RANGE')) {\n return 'RANGE';\n }\n return 'UNKNOWN';\n }\n}\n\n/**\n * Convert a JSON value from the server to a GQLValue.\n */\nexport function fromJSON(value: unknown, typeHint?: GQLValueKind): GQLValue {\n if (value === null || value === undefined) {\n return GQLValue.null();\n }\n\n // If we have a type hint, use it\n if (typeHint) {\n return convertWithType(value, typeHint);\n }\n\n // Infer type from value\n if (typeof value === 'boolean') {\n return GQLValue.bool(value);\n }\n\n if (typeof value === 'number') {\n if (Number.isInteger(value)) {\n return GQLValue.int(value);\n }\n return GQLValue.float(value);\n }\n\n if (typeof value === 'bigint') {\n return GQLValue.int(value);\n }\n\n if (typeof value === 'string') {\n // Check for UUID pattern\n if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value)) {\n return GQLValue.uuid(value);\n }\n // Check for ISO date\n if (/^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2})?/.test(value)) {\n const date = new Date(value);\n if (!isNaN(date.getTime())) {\n return GQLValue.timestamp(date);\n }\n }\n return GQLValue.string(value);\n }\n\n if (Array.isArray(value)) {\n return GQLValue.array(value.map((v) => fromJSON(v)));\n }\n\n if (typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n\n // Check for node structure\n if ('id' in obj && 'labels' in obj && 'properties' in obj) {\n return GQLValue.node(obj as unknown as GQLNode);\n }\n\n // Check for edge structure (supports both startNode/endNode and from/to formats)\n if ('id' in obj && 'type' in obj) {\n const hasStartEnd = 'startNode' in obj && 'endNode' in obj;\n const hasFromTo = 'from' in obj && 'to' in obj;\n\n if (hasStartEnd || hasFromTo) {\n // Normalize to startNode/endNode format\n const rawEdge = obj as unknown as RawEdge;\n const normalizedEdge: GQLEdge = {\n id: rawEdge.id,\n type: rawEdge.type,\n startNode: rawEdge.startNode ?? rawEdge.from ?? '',\n endNode: rawEdge.endNode ?? rawEdge.to ?? '',\n properties: rawEdge.properties ?? {},\n };\n return GQLValue.edge(normalizedEdge);\n }\n }\n\n // Check for path structure\n if ('nodes' in obj && 'edges' in obj && Array.isArray(obj.nodes)) {\n return GQLValue.path(obj as unknown as GQLPath);\n }\n\n // Generic object\n const map = new Map<string, GQLValue>();\n for (const [k, v] of Object.entries(obj)) {\n map.set(k, fromJSON(v));\n }\n return GQLValue.object(map);\n }\n\n return GQLValue.unknown(value);\n}\n\n/**\n * Convert a value with a known type hint.\n */\nfunction convertWithType(value: unknown, type: GQLValueKind): GQLValue {\n switch (type) {\n case 'NULL':\n return GQLValue.null();\n case 'BOOL':\n // Handle string booleans from server\n if (typeof value === 'string') {\n const lower = value.toLowerCase();\n return GQLValue.bool(lower === 'true' || lower === '1' || lower === 't');\n }\n return GQLValue.bool(Boolean(value));\n case 'INT':\n if (typeof value === 'number') {\n return GQLValue.int(value);\n }\n if (typeof value === 'bigint') {\n return GQLValue.int(value);\n }\n if (typeof value === 'string') {\n // Handle empty string or non-numeric gracefully\n const trimmed = value.trim();\n if (trimmed === '' || isNaN(Number(trimmed))) {\n return GQLValue.int(0);\n }\n return GQLValue.int(BigInt(trimmed));\n }\n return GQLValue.int(0);\n case 'FLOAT':\n return GQLValue.float(Number(value));\n case 'DECIMAL':\n return GQLValue.decimal(String(value));\n case 'STRING':\n // If the value is actually a different type (not a string), infer type from value\n // This handles cases where server reports \"text\" but sends typed values\n if (typeof value !== 'string') {\n return fromJSON(value);\n }\n return GQLValue.string(value);\n case 'UUID':\n return GQLValue.uuid(String(value));\n case 'BYTEA':\n if (value instanceof Uint8Array) {\n return GQLValue.bytes(value);\n }\n if (typeof value === 'string') {\n return GQLValue.bytes(Buffer.from(value, 'base64'));\n }\n return GQLValue.bytes(new Uint8Array());\n case 'DATE':\n return GQLValue.date(value instanceof Date ? value : new Date(String(value)));\n case 'TIME':\n case 'TIMETZ':\n return GQLValue.time(value instanceof Date ? value : new Date(String(value)));\n case 'TIMESTAMP':\n case 'TIMESTAMPTZ':\n return GQLValue.timestamp(value instanceof Date ? value : new Date(String(value)));\n case 'JSON':\n case 'JSONB':\n return GQLValue.json(value);\n case 'ARRAY':\n if (Array.isArray(value)) {\n return GQLValue.array(value.map((v) => fromJSON(v)));\n }\n // Handle JSON string arrays from server\n if (typeof value === 'string') {\n try {\n const parsed: unknown = JSON.parse(value);\n if (Array.isArray(parsed)) {\n return GQLValue.array(parsed.map((v: unknown) => fromJSON(v)));\n }\n } catch {\n // Not valid JSON, return empty array\n }\n }\n return GQLValue.array([]);\n case 'OBJECT':\n // Handle JSON string objects from server\n if (typeof value === 'string') {\n try {\n const parsed: unknown = JSON.parse(value);\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return fromJSON(parsed);\n }\n } catch {\n // Not valid JSON\n }\n }\n return fromJSON(value);\n case 'NODE':\n return GQLValue.node(value as GQLNode);\n case 'EDGE': {\n // Normalize edge format (supports both startNode/endNode and from/to)\n const rawEdge = value as RawEdge;\n const normalizedEdge: GQLEdge = {\n id: rawEdge.id,\n type: rawEdge.type,\n startNode: rawEdge.startNode ?? rawEdge.from ?? '',\n endNode: rawEdge.endNode ?? rawEdge.to ?? '',\n properties: rawEdge.properties ?? {},\n };\n return GQLValue.edge(normalizedEdge);\n }\n case 'PATH':\n return GQLValue.path(value as GQLPath);\n default:\n return fromJSON(value);\n }\n}\n\n/**\n * Column definition from SCHEMA response.\n */\nexport interface ColumnDef {\n name: string;\n type: GQLType;\n}\n\n/**\n * Column metadata with parsed type.\n */\nexport interface ColumnInfo {\n name: string;\n type: GQLType;\n kind: GQLValueKind;\n}\n\n/**\n * Query result row.\n */\nexport type Row = Map<string, GQLValue>;\n\n/**\n * Convert raw row data to typed Row.\n */\nexport function parseRow(raw: Record<string, unknown>, columns: ColumnInfo[]): Row {\n const row = new Map<string, GQLValue>();\n for (const col of columns) {\n const value = raw[col.name];\n row.set(col.name, fromJSON(value, col.kind));\n }\n return row;\n}\n\n/**\n * Dangerous keys that could lead to prototype pollution if allowed.\n * These keys are rejected when converting rows to objects.\n */\nconst DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/**\n * Check if a key is safe for object property assignment.\n * Rejects keys that could lead to prototype pollution.\n */\nexport function isSafeObjectKey(key: string): boolean {\n return !DANGEROUS_KEYS.has(key);\n}\n\n/**\n * Convert Row to plain object.\n *\n * Security: Uses Object.create(null) to create a prototype-free object\n * and rejects dangerous keys (__proto__, constructor, prototype) that\n * could lead to prototype pollution attacks.\n *\n * @throws {Error} If a row contains a dangerous key\n */\nexport function rowToObject(row: Row): Record<string, unknown> {\n // GAP #17: Use Object.create(null) for prototype-free object\n const obj = Object.create(null) as Record<string, unknown>;\n for (const [key, value] of row) {\n // GAP #17: Reject dangerous keys to prevent prototype pollution\n if (!isSafeObjectKey(key)) {\n throw new Error(\n `Row contains dangerous key that could cause prototype pollution: column names like '__proto__', 'constructor', or 'prototype' are not allowed`\n );\n }\n obj[key] = value.toJS();\n }\n return obj;\n}\n","/**\n * Prepared Statements\n *\n * Support for parameterized query preparation and efficient repeated execution.\n */\n\nimport type { Connection, QueryOptions, QueryParams } from './connection.js';\nimport type { QueryResult } from './result.js';\nimport { SecurityError, StateError } from './errors.js';\nimport { validateQuery, validateParamName, validateParamValue } from './validate.js';\n\n/**\n * Parameter metadata extracted from a query.\n */\nexport interface ParameterInfo {\n /** Parameter name */\n name: string;\n /** Position in the query (1-indexed) */\n position: number;\n /** Whether this is a positional parameter (?) */\n positional: boolean;\n}\n\n/**\n * Prepared statement for efficient repeated execution.\n *\n * Prepared statements parse the query once and allow multiple executions\n * with different parameter values.\n *\n * @example\n * ```typescript\n * const stmt = conn.prepare('MATCH (n:Person {name: $name}) RETURN n');\n *\n * // Execute with different parameters\n * const result1 = await stmt.query({ name: 'Alice' });\n * const result2 = await stmt.query({ name: 'Bob' });\n *\n * // Close when done\n * stmt.close();\n * ```\n */\nexport class PreparedStatement {\n private _conn: Connection;\n private _query: string;\n private _parameters: ParameterInfo[];\n private _closed = false;\n\n /**\n * Create a new prepared statement.\n *\n * @internal Use Connection.prepare() instead.\n */\n constructor(conn: Connection, query: string) {\n validateQuery(query);\n\n this._conn = conn;\n this._query = query;\n this._parameters = extractParameters(query);\n }\n\n /**\n * Get the query text.\n */\n get query(): string {\n return this._query;\n }\n\n /**\n * Get parameter information.\n */\n get parameters(): ReadonlyArray<ParameterInfo> {\n return this._parameters;\n }\n\n /**\n * Get the number of parameters.\n */\n get parameterCount(): number {\n return this._parameters.length;\n }\n\n /**\n * Get positional parameter count (number of ? placeholders).\n */\n get positionalCount(): number {\n return this._parameters.filter((p) => p.positional).length;\n }\n\n /**\n * Get named parameter names.\n */\n get namedParameters(): string[] {\n return this._parameters.filter((p) => !p.positional).map((p) => p.name);\n }\n\n /**\n * Check if the statement is closed.\n */\n get isClosed(): boolean {\n return this._closed;\n }\n\n /**\n * Execute the prepared statement and return results.\n *\n * @param params - Parameter values (object for named, array for positional)\n * @param options - Additional query options\n * @returns Query result\n */\n async execute(\n params?: QueryParams | unknown[],\n options?: Omit<QueryOptions, 'params'>\n ): Promise<QueryResult> {\n this.checkClosed();\n\n const resolvedParams = this.resolveParams(params);\n return this._conn.query(this._query, { ...options, params: resolvedParams });\n }\n\n /**\n * Execute the prepared statement and return all rows.\n *\n * @param params - Parameter values\n * @param options - Additional query options\n * @returns Array of row objects\n */\n async executeAll(\n params?: QueryParams | unknown[],\n options?: Omit<QueryOptions, 'params'>\n ): Promise<Record<string, unknown>[]> {\n this.checkClosed();\n\n const resolvedParams = this.resolveParams(params);\n return this._conn.queryAll(this._query, { ...options, params: resolvedParams });\n }\n\n /**\n * Execute the prepared statement without returning results.\n *\n * @param params - Parameter values\n * @param options - Additional query options\n */\n async exec(\n params?: QueryParams | unknown[],\n options?: Omit<QueryOptions, 'params'>\n ): Promise<void> {\n this.checkClosed();\n\n const resolvedParams = this.resolveParams(params);\n return this._conn.exec(this._query, { ...options, params: resolvedParams });\n }\n\n /**\n * Validate parameters without executing.\n *\n * @param params - Parameter values to validate\n * @throws SecurityError if validation fails\n */\n validate(params?: QueryParams | unknown[]): void {\n this.checkClosed();\n this.resolveParams(params); // Will throw on validation errors\n }\n\n /**\n * Close the prepared statement.\n *\n * After closing, the statement cannot be executed.\n */\n close(): void {\n this._closed = true;\n }\n\n /**\n * Resolve and validate parameters.\n */\n private resolveParams(params?: QueryParams | unknown[]): QueryParams {\n // Handle no parameters\n if (!params) {\n if (this._parameters.length > 0) {\n throw new SecurityError({\n type: 'validation',\n message: `Expected ${this._parameters.length} parameters, got 0`,\n });\n }\n return {};\n }\n\n // Handle array of positional parameters\n if (Array.isArray(params)) {\n const positionalCount = this.positionalCount;\n if (params.length !== positionalCount) {\n throw new SecurityError({\n type: 'validation',\n message: `Expected ${positionalCount} positional parameters, got ${params.length}`,\n });\n }\n\n // Convert to named parameters\n const namedParams: QueryParams = {};\n let posIndex = 0;\n for (const p of this._parameters) {\n if (p.positional) {\n namedParams[p.name] = params[posIndex];\n validateParamValue(params[posIndex]);\n posIndex++;\n }\n }\n\n return namedParams;\n }\n\n // Handle named parameters\n const namedParams = params;\n\n // Validate all required parameters are present\n for (const p of this._parameters) {\n if (!p.positional && !(p.name in namedParams)) {\n throw new SecurityError({\n type: 'validation',\n message: `Missing required parameter: ${p.name}`,\n });\n }\n }\n\n // Validate parameter values\n for (const [key, value] of Object.entries(namedParams)) {\n validateParamName(key);\n validateParamValue(value);\n }\n\n return namedParams;\n }\n\n /**\n * Check if statement is closed.\n */\n private checkClosed(): void {\n if (this._closed) {\n throw new StateError({\n currentState: 'closed',\n operation: 'execute',\n message: 'PreparedStatement is closed',\n });\n }\n }\n}\n\n/**\n * Extract parameter information from a query string.\n *\n * Supports both positional (?) and named ($name) parameters.\n */\nexport function extractParameters(query: string): ParameterInfo[] {\n const params: ParameterInfo[] = [];\n let i = 0;\n let position = 0;\n\n while (i < query.length) {\n const ch = query[i];\n\n // Skip string literals\n if (ch === \"'\" || ch === '\"') {\n const quote = ch;\n i++;\n while (i < query.length && query[i] !== quote) {\n if (query[i] === '\\\\') {\n i++;\n }\n i++;\n }\n i++;\n continue;\n }\n\n // Skip comments\n if (ch === '/' && i + 1 < query.length && query[i + 1] === '/') {\n while (i < query.length && query[i] !== '\\n') {\n i++;\n }\n continue;\n }\n\n if (ch === '/' && i + 1 < query.length && query[i + 1] === '*') {\n i += 2;\n while (i + 1 < query.length && !(query[i] === '*' && query[i + 1] === '/')) {\n i++;\n }\n i += 2;\n continue;\n }\n\n // Positional parameter\n if (ch === '?') {\n position++;\n params.push({\n name: `p${position}`,\n position,\n positional: true,\n });\n i++;\n continue;\n }\n\n // Named parameter\n if (ch === '$') {\n i++;\n let name = '';\n while (i < query.length && /[a-zA-Z0-9_]/.test(query[i] ?? '')) {\n name += query[i];\n i++;\n }\n if (name) {\n position++;\n // Check if we already have this parameter\n const existing = params.find((p) => p.name === name);\n if (!existing) {\n params.push({\n name,\n position,\n positional: false,\n });\n }\n }\n continue;\n }\n\n i++;\n }\n\n return params;\n}\n\n/**\n * Create a prepared statement from a query string.\n *\n * @param conn - Connection to use\n * @param query - Query text\n * @returns Prepared statement\n */\nexport function prepare(conn: Connection, query: string): PreparedStatement {\n return new PreparedStatement(conn, query);\n}\n","/**\n * Query Explain and Profile\n *\n * Support for query plan analysis and execution profiling using protobuf protocol.\n */\n\nimport type { Connection, QueryOptions } from './connection.js';\nimport { validateQuery, validateParamValue } from './validate.js';\nimport { DriverError, TransportError, StatusClass } from './errors.js';\nimport {\n buildExecuteRequest,\n type ExecutionResponse,\n type ExplainPayload,\n type ProfilePayload,\n} from './proto.js';\n\n/**\n * A single operation in a query plan.\n */\nexport interface PlanOperation {\n /** Operation type (e.g., 'NodeScan', 'Filter', 'Expand') */\n type: string;\n /** Optional operator name */\n operator?: string;\n /** Estimated cost */\n cost?: number;\n /** Estimated rows */\n rows?: number;\n /** Details about the operation */\n details?: Record<string, unknown>;\n /** Child operations */\n children?: PlanOperation[];\n}\n\n/**\n * Query execution plan.\n */\nexport interface QueryPlan {\n /** Root operation */\n root: PlanOperation;\n /** Total estimated cost */\n totalCost?: number;\n /** Total estimated rows */\n totalRows?: number;\n /** Raw plan data from server */\n raw: unknown;\n}\n\n/**\n * Timing information for profiled operations.\n */\nexport interface OperationTiming {\n /** Operation type */\n type: string;\n /** Wall clock time in milliseconds */\n wallTimeMs: number;\n /** CPU time in milliseconds */\n cpuTimeMs?: number;\n /** Actual rows produced */\n rows?: number;\n /** Number of database page hits */\n pageHits?: number;\n /** Number of database page faults */\n pageFaults?: number;\n /** Child operation timings */\n children?: OperationTiming[];\n}\n\n/**\n * Query execution profile.\n */\nexport interface QueryProfile {\n /** Root operation timing */\n root: OperationTiming;\n /** Total execution time in milliseconds */\n totalTimeMs: number;\n /** Total rows processed */\n totalRows?: number;\n /** Planning time in milliseconds */\n planningTimeMs?: number;\n /** Execution time in milliseconds */\n executionTimeMs?: number;\n /** Memory used in bytes */\n memoryBytes?: number;\n /** Raw profile data from server */\n raw: unknown;\n}\n\n/**\n * Options for explain/profile operations.\n */\nexport interface ExplainOptions extends Omit<QueryOptions, 'pageSize'> {\n /** Include verbose details */\n verbose?: boolean;\n /** Analyze query costs */\n analyze?: boolean;\n}\n\n/**\n * Parse plan data from ExplainPayload.\n */\nfunction parseExplainPayload(payload: ExplainPayload): PlanOperation {\n const ops = payload.ops ?? [];\n if (ops.length === 0) {\n return { type: 'Unknown', details: { schema: payload.schema } };\n }\n\n // Build operation tree\n const root: PlanOperation = {\n type: 'Query',\n details: { schema: payload.schema },\n children: ops.map((op: unknown) => {\n const opObj = op as Record<string, unknown>;\n return {\n type: (opObj['kind'] as string) || 'Unknown',\n cost: opObj['cost'] as number | undefined,\n rows: opObj['est_rows'] as number | undefined,\n details: { idx: opObj['idx'] },\n };\n }),\n };\n\n return root;\n}\n\n/**\n * Parse profile data from ProfilePayload.\n */\nfunction parseProfilePayload(payload: ProfilePayload): OperationTiming {\n const ops = payload.ops ?? [];\n if (ops.length === 0) {\n return { type: 'Unknown', wallTimeMs: 0 };\n }\n\n // Build timing tree\n const children: OperationTiming[] = ops.map((op: unknown) => {\n const opObj = op as Record<string, unknown>;\n return {\n type: (opObj['op'] as string) || 'Unknown',\n wallTimeMs: Number(opObj['time_ns'] ?? 0) / 1_000_000,\n cpuTimeMs: Number(opObj['cpu_time_ns'] ?? 0) / 1_000_000,\n rows: Number(opObj['rows'] ?? 0),\n };\n });\n\n return {\n type: 'Query',\n wallTimeMs: Number(payload.totalTimeNs ?? 0) / 1_000_000,\n children,\n };\n}\n\n/**\n * Get the query execution plan without executing.\n */\nexport async function explain(\n conn: Connection,\n query: string,\n options?: ExplainOptions\n): Promise<QueryPlan> {\n validateQuery(query);\n\n const params = options?.params ?? {};\n\n // Validate parameters\n for (const [_key, value] of Object.entries(params)) {\n validateParamValue(value);\n }\n\n // Build EXPLAIN query\n const explainQuery = options?.verbose ? `EXPLAIN VERBOSE ${query}` : `EXPLAIN ${query}`;\n\n // Access private transport through connection\n const connInternal = conn as unknown as {\n _transport: {\n sendProto: (msg: unknown, signal?: AbortSignal) => Promise<void>;\n receiveProto: (signal?: AbortSignal) => Promise<{ execute?: ExecutionResponse }>;\n };\n _sessionId: string;\n };\n\n const msg = buildExecuteRequest(connInternal._sessionId, explainQuery, params);\n await connInternal._transport.sendProto(msg, options?.signal);\n\n const response = await connInternal._transport.receiveProto(options?.signal);\n\n if (!response.execute) {\n throw new TransportError({\n operation: 'explain',\n cause: new Error('Invalid execute response'),\n });\n }\n\n const execResp = response.execute;\n\n if (execResp.error) {\n throw new DriverError({\n statusClass: (execResp.status?.statusClass ??\n StatusClass.SYSTEM) as typeof StatusClass.SYSTEM,\n subclass: '000',\n code: execResp.error.code ?? 'UnknownError',\n message: execResp.error.message ?? 'Unknown error',\n anchor: execResp.error.anchor,\n });\n }\n\n // Check for EXPLAIN response\n if (execResp.explain) {\n const payload = execResp.explain;\n const root = parseExplainPayload(payload);\n\n return {\n root,\n totalCost: payload.totals?.cost,\n totalRows: payload.totals?.est_rows,\n raw: payload,\n };\n }\n\n // Fallback: return raw data as plan\n return {\n root: { type: 'Unknown', details: { response: execResp } },\n raw: execResp,\n };\n}\n\n/**\n * Execute a query with profiling and return execution statistics.\n */\nexport async function profile(\n conn: Connection,\n query: string,\n options?: ExplainOptions\n): Promise<QueryProfile> {\n validateQuery(query);\n\n const params = options?.params ?? {};\n\n // Validate parameters\n for (const [_key, value] of Object.entries(params)) {\n validateParamValue(value);\n }\n\n // Build PROFILE query\n const profileQuery = options?.verbose ? `PROFILE VERBOSE ${query}` : `PROFILE ${query}`;\n\n // Access private transport through connection\n const connInternal = conn as unknown as {\n _transport: {\n sendProto: (msg: unknown, signal?: AbortSignal) => Promise<void>;\n receiveProto: (signal?: AbortSignal) => Promise<{ execute?: ExecutionResponse }>;\n };\n _sessionId: string;\n };\n\n const msg = buildExecuteRequest(connInternal._sessionId, profileQuery, params);\n await connInternal._transport.sendProto(msg, options?.signal);\n\n const response = await connInternal._transport.receiveProto(options?.signal);\n\n if (!response.execute) {\n throw new TransportError({\n operation: 'profile',\n cause: new Error('Invalid execute response'),\n });\n }\n\n const execResp = response.execute;\n\n if (execResp.error) {\n throw new DriverError({\n statusClass: (execResp.status?.statusClass ??\n StatusClass.SYSTEM) as typeof StatusClass.SYSTEM,\n subclass: '000',\n code: execResp.error.code ?? 'UnknownError',\n message: execResp.error.message ?? 'Unknown error',\n anchor: execResp.error.anchor,\n });\n }\n\n // Check for PROFILE response\n if (execResp.profile) {\n const payload = execResp.profile;\n const root = parseProfilePayload(payload);\n\n return {\n root,\n totalTimeMs: Number(payload.totalTimeNs ?? 0) / 1_000_000,\n totalRows: root.rows,\n memoryBytes: Number(payload.memory?.peakBytes ?? 0),\n raw: payload,\n };\n }\n\n // Fallback: return minimal profile\n return {\n root: { type: 'Unknown', wallTimeMs: 0 },\n totalTimeMs: 0,\n raw: execResp,\n };\n}\n\n/**\n * Format a query plan as a human-readable string.\n */\nexport function formatPlan(plan: QueryPlan, indent = 0): string {\n const lines: string[] = [];\n\n function formatOp(op: PlanOperation, depth: number): void {\n const prefix = ' '.repeat(depth);\n let line = `${prefix}${op.type}`;\n if (op.operator && op.operator !== op.type) {\n line += ` (${op.operator})`;\n }\n if (op.cost !== undefined) {\n line += ` cost=${op.cost.toFixed(2)}`;\n }\n if (op.rows !== undefined) {\n line += ` rows=${op.rows}`;\n }\n lines.push(line);\n\n if (op.details && Object.keys(op.details).length > 0) {\n for (const [key, value] of Object.entries(op.details)) {\n lines.push(`${prefix} ${key}: ${JSON.stringify(value)}`);\n }\n }\n\n if (op.children) {\n for (const child of op.children) {\n formatOp(child, depth + 1);\n }\n }\n }\n\n formatOp(plan.root, indent);\n\n if (plan.totalCost !== undefined) {\n lines.push(`Total Cost: ${plan.totalCost.toFixed(2)}`);\n }\n if (plan.totalRows !== undefined) {\n lines.push(`Estimated Rows: ${plan.totalRows}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format a query profile as a human-readable string.\n */\nexport function formatProfile(prof: QueryProfile, indent = 0): string {\n const lines: string[] = [];\n\n function formatTiming(timing: OperationTiming, depth: number): void {\n const prefix = ' '.repeat(depth);\n let line = `${prefix}${timing.type}`;\n line += ` ${timing.wallTimeMs.toFixed(2)}ms`;\n if (timing.rows !== undefined) {\n line += ` ${timing.rows} rows`;\n }\n if (timing.pageHits !== undefined || timing.pageFaults !== undefined) {\n line += ` (hits=${timing.pageHits ?? 0}, faults=${timing.pageFaults ?? 0})`;\n }\n lines.push(line);\n\n if (timing.children) {\n for (const child of timing.children) {\n formatTiming(child, depth + 1);\n }\n }\n }\n\n formatTiming(prof.root, indent);\n\n lines.push('---');\n lines.push(`Total Time: ${prof.totalTimeMs.toFixed(2)}ms`);\n if (prof.planningTimeMs !== undefined) {\n lines.push(`Planning: ${prof.planningTimeMs.toFixed(2)}ms`);\n }\n if (prof.executionTimeMs !== undefined) {\n lines.push(`Execution: ${prof.executionTimeMs.toFixed(2)}ms`);\n }\n if (prof.totalRows !== undefined) {\n lines.push(`Rows: ${prof.totalRows}`);\n }\n if (prof.memoryBytes !== undefined) {\n lines.push(`Memory: ${formatBytes(prof.memoryBytes)}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format bytes as human-readable string.\n */\nfunction formatBytes(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let value = bytes;\n let unitIndex = 0;\n\n while (value >= 1024 && unitIndex < units.length - 1) {\n value /= 1024;\n unitIndex++;\n }\n\n return `${value.toFixed(2)} ${units[unitIndex]}`;\n}\n","/**\n * Batch Query Operations\n *\n * Support for executing multiple queries efficiently.\n */\n\nimport type { Connection, QueryParams } from './connection.js';\nimport { rowToObject } from './types.js';\n\n/**\n * A single query in a batch.\n */\nexport interface BatchQuery {\n /** Query text */\n query: string;\n /** Optional parameters */\n params?: QueryParams;\n}\n\n/**\n * Result of a batch query.\n */\nexport interface BatchResult {\n /** Index in the batch (0-based) */\n index: number;\n /** Query that was executed */\n query: string;\n /** Whether the query succeeded */\n success: boolean;\n /** Rows returned (if query was successful) */\n rows?: Record<string, unknown>[];\n /** Error (if query failed) */\n error?: Error;\n /** Execution time in milliseconds */\n durationMs?: number;\n}\n\n/**\n * Summary of batch execution.\n */\nexport interface BatchSummary {\n /** Total number of queries */\n total: number;\n /** Number of successful queries */\n successful: number;\n /** Number of failed queries */\n failed: number;\n /** Total execution time in milliseconds */\n totalDurationMs: number;\n /** Individual results */\n results: BatchResult[];\n}\n\n/**\n * Options for batch execution.\n */\nexport interface BatchOptions {\n /** Stop on first error (default: false) */\n stopOnError?: boolean;\n /** Maximum concurrent queries (default: 1 - sequential) */\n concurrency?: number;\n /** Abort signal for cancellation */\n signal?: AbortSignal;\n /** Page size for result fetching */\n pageSize?: number;\n /** Execute within a transaction (default: false) */\n transaction?: boolean;\n}\n\n/**\n * Execute multiple queries in a batch.\n *\n * By default, queries are executed sequentially and all results are collected.\n * Set stopOnError to true to abort on the first failure.\n *\n * @param conn - Connection to use\n * @param queries - Array of queries to execute\n * @param options - Batch execution options\n * @returns Batch execution summary\n *\n * @example\n * ```typescript\n * const summary = await batch(conn, [\n * { query: 'CREATE (a:Person {name: \"Alice\"})' },\n * { query: 'CREATE (b:Person {name: \"Bob\"})' },\n * { query: 'MATCH (n:Person) RETURN count(n) AS cnt' },\n * ]);\n *\n * console.log(`${summary.successful}/${summary.total} queries succeeded`);\n * ```\n */\nexport async function batch(\n conn: Connection,\n queries: BatchQuery[],\n options?: BatchOptions\n): Promise<BatchSummary> {\n const results: BatchResult[] = [];\n const startTime = Date.now();\n let successful = 0;\n let failed = 0;\n\n const stopOnError = options?.stopOnError ?? false;\n const inTransaction = options?.transaction ?? false;\n\n // Start transaction if requested\n let tx: { commit: () => Promise<void>; rollback: () => Promise<void> } | null = null;\n if (inTransaction) {\n tx = await conn.begin(options?.signal);\n }\n\n try {\n for (let i = 0; i < queries.length; i++) {\n // Check for cancellation\n if (options?.signal?.aborted) {\n // Mark remaining as failed\n for (let j = i; j < queries.length; j++) {\n const q = queries[j];\n results.push({\n index: j,\n query: q?.query ?? '',\n success: false,\n error: new Error('Batch execution cancelled'),\n });\n failed++;\n }\n break;\n }\n\n const q = queries[i];\n if (!q) continue;\n const queryStart = Date.now();\n\n try {\n const queryResult = await conn.query(q.query, {\n params: q.params,\n signal: options?.signal,\n pageSize: options?.pageSize,\n });\n\n // Collect all rows\n const rows: Record<string, unknown>[] = [];\n for await (const row of queryResult) {\n rows.push(rowToObject(row));\n }\n\n results.push({\n index: i,\n query: q.query,\n success: true,\n rows,\n durationMs: Date.now() - queryStart,\n });\n successful++;\n } catch (error) {\n results.push({\n index: i,\n query: q.query,\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs: Date.now() - queryStart,\n });\n failed++;\n\n if (stopOnError) {\n // Mark remaining as skipped\n for (let j = i + 1; j < queries.length; j++) {\n const skipped = queries[j];\n results.push({\n index: j,\n query: skipped?.query ?? '',\n success: false,\n error: new Error('Skipped due to previous error'),\n });\n failed++;\n }\n break;\n }\n }\n }\n\n // Commit transaction if successful\n if (tx && failed === 0) {\n await tx.commit();\n } else if (tx) {\n await tx.rollback();\n }\n } catch (error) {\n // Rollback on unexpected error\n if (tx) {\n try {\n await tx.rollback();\n } catch {\n // Ignore rollback errors\n }\n }\n throw error;\n }\n\n return {\n total: queries.length,\n successful,\n failed,\n totalDurationMs: Date.now() - startTime,\n results,\n };\n}\n\n/**\n * Execute multiple queries and return only successful results.\n *\n * Failed queries are silently ignored (but logged if a logger is provided).\n *\n * @param conn - Connection to use\n * @param queries - Array of queries to execute\n * @param options - Batch execution options\n * @returns Array of successful row results\n */\nexport async function batchAll(\n conn: Connection,\n queries: BatchQuery[],\n options?: BatchOptions\n): Promise<Record<string, unknown>[][]> {\n const summary = await batch(conn, queries, options);\n\n return summary.results\n .filter(\n (r): r is BatchResult & { rows: Record<string, unknown>[] } =>\n r.success && r.rows !== undefined\n )\n .map((r) => r.rows);\n}\n\n/**\n * Execute queries and return the first successful result.\n *\n * Useful for trying multiple query variants.\n *\n * @param conn - Connection to use\n * @param queries - Array of queries to try\n * @param options - Batch execution options\n * @returns First successful result or null\n */\nexport async function batchFirst(\n conn: Connection,\n queries: BatchQuery[],\n options?: Omit<BatchOptions, 'stopOnError'>\n): Promise<Record<string, unknown>[] | null> {\n for (const q of queries) {\n try {\n const rows = await conn.queryAll(q.query, {\n params: q.params,\n signal: options?.signal,\n pageSize: options?.pageSize,\n });\n return rows;\n } catch {\n // Try next query\n continue;\n }\n }\n return null;\n}\n\n/**\n * Execute a query for each item in an array.\n *\n * @param conn - Connection to use\n * @param queryTemplate - Query with $item parameter placeholder\n * @param items - Array of items to substitute\n * @param options - Batch execution options\n * @returns Batch summary\n *\n * @example\n * ```typescript\n * const summary = await batchMap(\n * conn,\n * 'CREATE (n:Person {name: $name})',\n * [{ name: 'Alice' }, { name: 'Bob' }]\n * );\n * ```\n */\nexport async function batchMap(\n conn: Connection,\n queryTemplate: string,\n items: QueryParams[],\n options?: BatchOptions\n): Promise<BatchSummary> {\n const queries: BatchQuery[] = items.map((params) => ({\n query: queryTemplate,\n params,\n }));\n\n return batch(conn, queries, options);\n}\n\n/**\n * Execute queries in parallel with limited concurrency.\n *\n * Unlike the sequential batch(), this executes multiple queries concurrently\n * up to the specified limit.\n *\n * Note: Results may be returned out of order.\n *\n * @param conn - Connection to use\n * @param queries - Array of queries to execute\n * @param options - Batch execution options with concurrency\n * @returns Batch summary (results in completion order)\n */\nexport async function batchParallel(\n conn: Connection,\n queries: BatchQuery[],\n options?: BatchOptions & { concurrency: number }\n): Promise<BatchSummary> {\n const concurrency = options?.concurrency ?? 5;\n const results: BatchResult[] = [];\n const startTime = Date.now();\n let successful = 0;\n let failed = 0;\n\n async function executeQuery(index: number): Promise<void> {\n const q = queries[index];\n if (!q) return;\n const queryStart = Date.now();\n\n try {\n const queryResult = await conn.query(q.query, {\n params: q.params,\n signal: options?.signal,\n pageSize: options?.pageSize,\n });\n\n const rows: Record<string, unknown>[] = [];\n for await (const row of queryResult) {\n rows.push(rowToObject(row));\n }\n\n results.push({\n index,\n query: q.query,\n success: true,\n rows,\n durationMs: Date.now() - queryStart,\n });\n successful++;\n } catch (error) {\n results.push({\n index,\n query: q.query,\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs: Date.now() - queryStart,\n });\n failed++;\n }\n }\n\n // Process queries with limited concurrency using a simple semaphore pattern\n const executing: Set<Promise<void>> = new Set();\n\n for (let i = 0; i < queries.length; i++) {\n if (options?.signal?.aborted) {\n break;\n }\n\n // Wait if we're at the concurrency limit\n while (executing.size >= concurrency) {\n await Promise.race(executing);\n }\n\n const promise = executeQuery(i).finally(() => {\n executing.delete(promise);\n });\n executing.add(promise);\n }\n\n // Wait for remaining queries to complete\n await Promise.all(executing);\n\n // Sort results by index for consistent output\n results.sort((a, b) => a.index - b.index);\n\n return {\n total: queries.length,\n successful,\n failed,\n totalDurationMs: Date.now() - startTime,\n results,\n };\n}\n","/**\n * Authentication and Authorization Client\n *\n * Support for user management, role-based access control, and row-level security.\n */\n\nimport type { Connection } from './connection.js';\nimport { SecurityError } from './errors.js';\nimport {\n validateLabel,\n validatePermissionAction,\n validatePermissionResource,\n validateRLSAction,\n validateRoleName,\n validateRLSPredicate,\n escapeGQLIdentifier,\n} from './validate.js';\n\n/**\n * User information.\n */\nexport interface User {\n /** Username */\n username: string;\n /** User roles */\n roles: string[];\n /** Whether the user is active */\n active: boolean;\n /** Creation timestamp */\n createdAt?: Date;\n /** Last login timestamp */\n lastLoginAt?: Date;\n /** User metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Role information.\n */\nexport interface Role {\n /** Role name */\n name: string;\n /** Role description */\n description?: string;\n /** Permissions granted to this role */\n permissions: Permission[];\n /** Whether the role is a system role */\n system?: boolean;\n}\n\n/**\n * Permission definition.\n */\nexport interface Permission {\n /** Resource type (e.g., 'NODE', 'EDGE', 'GRAPH') */\n resource: string;\n /** Action allowed (e.g., 'READ', 'WRITE', 'DELETE') */\n action: string;\n /** Optional label filter */\n label?: string;\n /** Optional property filters */\n properties?: string[];\n}\n\n/**\n * Row-Level Security (RLS) policy.\n */\nexport interface RLSPolicy {\n /** Policy name */\n name: string;\n /** Target label */\n label: string;\n /** Policy action ('READ', 'WRITE', 'ALL') */\n action: 'READ' | 'WRITE' | 'ALL';\n /** GQL predicate expression */\n predicate: string;\n /** Roles this policy applies to */\n roles?: string[];\n /** Whether the policy is enabled */\n enabled: boolean;\n}\n\n/**\n * Options for creating a user.\n */\nexport interface CreateUserOptions {\n /** Initial password */\n password: string;\n /** Roles to assign */\n roles?: string[];\n /** User metadata */\n metadata?: Record<string, unknown>;\n /** Whether to activate immediately */\n active?: boolean;\n}\n\n/**\n * Options for creating a role.\n */\nexport interface CreateRoleOptions {\n /** Role description */\n description?: string;\n /** Initial permissions */\n permissions?: Permission[];\n}\n\n/**\n * Options for creating an RLS policy.\n */\nexport interface CreateRLSPolicyOptions {\n /** Roles to apply policy to (empty = all roles) */\n roles?: string[];\n /** Whether to enable immediately */\n enabled?: boolean;\n}\n\n/**\n * Password policy configuration.\n */\nexport interface PasswordPolicy {\n /** Minimum password length (default: 8) */\n minLength?: number;\n /** Maximum password length (default: 256) */\n maxLength?: number;\n /** Require at least one uppercase letter */\n requireUppercase?: boolean;\n /** Require at least one lowercase letter */\n requireLowercase?: boolean;\n /** Require at least one digit */\n requireDigit?: boolean;\n /** Require at least one special character */\n requireSpecialChar?: boolean;\n /** Special characters to accept (default: !@#$%^&*()_+-=[]{}|;:,.<>?) */\n specialChars?: string;\n}\n\n/**\n * Default password policy.\n */\nexport const DEFAULT_PASSWORD_POLICY: Required<PasswordPolicy> = {\n minLength: 8,\n maxLength: 256,\n requireUppercase: false,\n requireLowercase: false,\n requireDigit: false,\n requireSpecialChar: false,\n specialChars: '!@#$%^&*()_+-=[]{}|;:,.<>?',\n};\n\n/**\n * Authentication and authorization client.\n *\n * Provides methods for managing users, roles, and row-level security policies.\n *\n * @example\n * ```typescript\n * const auth = new AuthClient(conn);\n *\n * // Create a user\n * await auth.createUser('alice', { password: 'secret123' });\n *\n * // Create a role\n * await auth.createRole('analyst', {\n * permissions: [{ resource: 'NODE', action: 'READ' }]\n * });\n *\n * // Assign role to user\n * await auth.assignRole('alice', 'analyst');\n * ```\n */\nexport class AuthClient {\n private _conn: Connection;\n private _passwordPolicy: Required<PasswordPolicy>;\n\n /**\n * Create a new auth client.\n *\n * @param conn - Connection to use\n * @param passwordPolicy - Optional password policy configuration\n */\n constructor(conn: Connection, passwordPolicy?: PasswordPolicy) {\n this._conn = conn;\n this._passwordPolicy = {\n ...DEFAULT_PASSWORD_POLICY,\n ...passwordPolicy,\n };\n }\n\n /**\n * Get the current password policy.\n */\n get passwordPolicy(): Readonly<PasswordPolicy> {\n return this._passwordPolicy;\n }\n\n /**\n * Update the password policy.\n */\n setPasswordPolicy(policy: PasswordPolicy): void {\n this._passwordPolicy = {\n ...this._passwordPolicy,\n ...policy,\n };\n }\n\n // User Management\n\n /**\n * Create a new user.\n *\n * @param username - Username for the new user\n * @param options - User creation options\n */\n async createUser(username: string, options: CreateUserOptions): Promise<void> {\n this.validateUsername(username);\n this.validatePassword(options.password);\n\n // Validate role names if provided\n if (options.roles) {\n for (const role of options.roles) {\n validateRoleName(role);\n }\n }\n\n const roles = options.roles?.join(', ') ?? '';\n const active = options.active !== false ? 'true' : 'false';\n\n const gql = `\n CREATE USER $username\n SET password = $password\n ${roles ? `, roles = [${roles}]` : ''}\n , active = ${active}\n `.trim();\n\n // Note: exec() here is Connection.exec() for GQL, not shell execution\n await this._conn.exec(gql, {\n params: {\n username,\n password: options.password,\n },\n });\n }\n\n /**\n * Delete a user.\n *\n * @param username - Username to delete\n */\n async deleteUser(username: string): Promise<void> {\n this.validateUsername(username);\n\n await this._conn.exec('DROP USER $username', {\n params: { username },\n });\n }\n\n /**\n * Get user information.\n *\n * @param username - Username to look up\n * @returns User information or null if not found\n */\n async getUser(username: string): Promise<User | null> {\n this.validateUsername(username);\n\n const result = await this._conn.queryAll('SHOW USER $username', { params: { username } });\n\n if (result.length === 0) {\n return null;\n }\n\n const row = result[0];\n if (!row) {\n return null;\n }\n return {\n username: row['username'] as string,\n roles: (row['roles'] as string[]) ?? [],\n active: (row['active'] as boolean) ?? true,\n createdAt: row['created_at'] ? new Date(row['created_at'] as string) : undefined,\n lastLoginAt: row['last_login'] ? new Date(row['last_login'] as string) : undefined,\n metadata: row['metadata'] as Record<string, unknown> | undefined,\n };\n }\n\n /**\n * List all users.\n *\n * @returns Array of users\n */\n async listUsers(): Promise<User[]> {\n const result = await this._conn.queryAll('SHOW USERS');\n\n return result.map((row) => ({\n username: row['username'] as string,\n roles: (row['roles'] as string[]) ?? [],\n active: (row['active'] as boolean) ?? true,\n createdAt: row['created_at'] ? new Date(row['created_at'] as string) : undefined,\n lastLoginAt: row['last_login'] ? new Date(row['last_login'] as string) : undefined,\n }));\n }\n\n /**\n * Change a user's password.\n *\n * @param username - Username\n * @param newPassword - New password\n */\n async changePassword(username: string, newPassword: string): Promise<void> {\n this.validateUsername(username);\n this.validatePassword(newPassword);\n\n await this._conn.exec('ALTER USER $username SET password = $password', {\n params: { username, password: newPassword },\n });\n }\n\n /**\n * Activate a user.\n *\n * @param username - Username to activate\n */\n async activateUser(username: string): Promise<void> {\n this.validateUsername(username);\n\n await this._conn.exec('ALTER USER $username SET active = true', {\n params: { username },\n });\n }\n\n /**\n * Deactivate a user.\n *\n * @param username - Username to deactivate\n */\n async deactivateUser(username: string): Promise<void> {\n this.validateUsername(username);\n\n await this._conn.exec('ALTER USER $username SET active = false', {\n params: { username },\n });\n }\n\n // Role Management\n\n /**\n * Create a new role.\n *\n * @param name - Role name\n * @param options - Role creation options\n */\n async createRole(name: string, options?: CreateRoleOptions): Promise<void> {\n this.validateRoleName(name);\n\n let query = 'CREATE ROLE $name';\n if (options?.description) {\n query += ' SET description = $description';\n }\n\n await this._conn.exec(query, {\n params: {\n name,\n description: options?.description,\n },\n });\n\n // Add permissions if provided\n if (options?.permissions) {\n for (const perm of options.permissions) {\n await this.grantPermission(name, perm);\n }\n }\n }\n\n /**\n * Delete a role.\n *\n * @param name - Role name to delete\n */\n async deleteRole(name: string): Promise<void> {\n this.validateRoleName(name);\n\n await this._conn.exec('DROP ROLE $name', {\n params: { name },\n });\n }\n\n /**\n * Get role information.\n *\n * @param name - Role name\n * @returns Role information or null if not found\n */\n async getRole(name: string): Promise<Role | null> {\n this.validateRoleName(name);\n\n const result = await this._conn.queryAll('SHOW ROLE $name', { params: { name } });\n\n const row = result[0];\n if (!row) {\n return null;\n }\n return {\n name: row['name'] as string,\n description: row['description'] as string | undefined,\n permissions: (row['permissions'] as Permission[]) ?? [],\n system: row['system'] as boolean | undefined,\n };\n }\n\n /**\n * List all roles.\n *\n * @returns Array of roles\n */\n async listRoles(): Promise<Role[]> {\n const result = await this._conn.queryAll('SHOW ROLES');\n\n return result.map((row) => ({\n name: row['name'] as string,\n description: row['description'] as string | undefined,\n permissions: (row['permissions'] as Permission[]) ?? [],\n system: row['system'] as boolean | undefined,\n }));\n }\n\n /**\n * Assign a role to a user.\n *\n * @param username - Username\n * @param roleName - Role to assign\n */\n async assignRole(username: string, roleName: string): Promise<void> {\n this.validateUsername(username);\n this.validateRoleName(roleName);\n\n await this._conn.exec('GRANT ROLE $role TO $user', {\n params: { role: roleName, user: username },\n });\n }\n\n /**\n * Revoke a role from a user.\n *\n * @param username - Username\n * @param roleName - Role to revoke\n */\n async revokeRole(username: string, roleName: string): Promise<void> {\n this.validateUsername(username);\n this.validateRoleName(roleName);\n\n await this._conn.exec('REVOKE ROLE $role FROM $user', {\n params: { role: roleName, user: username },\n });\n }\n\n /**\n * Grant a permission to a role.\n *\n * @param roleName - Role name\n * @param permission - Permission to grant\n */\n async grantPermission(roleName: string, permission: Permission): Promise<void> {\n this.validateRoleName(roleName);\n\n // Validate permission action and resource against allowlists\n validatePermissionAction(permission.action);\n validatePermissionResource(permission.resource);\n if (permission.label) {\n validateLabel(permission.label);\n }\n\n let gql = `GRANT ${permission.action.toUpperCase()} ON ${permission.resource.toUpperCase()}`;\n if (permission.label) {\n gql += `:${permission.label}`;\n }\n gql += ' TO $role';\n\n // Note: exec() here is Connection.exec() for GQL, not shell execution\n await this._conn.exec(gql, {\n params: { role: roleName },\n });\n }\n\n /**\n * Revoke a permission from a role.\n *\n * @param roleName - Role name\n * @param permission - Permission to revoke\n */\n async revokePermission(roleName: string, permission: Permission): Promise<void> {\n this.validateRoleName(roleName);\n\n // Validate permission action and resource against allowlists\n validatePermissionAction(permission.action);\n validatePermissionResource(permission.resource);\n if (permission.label) {\n validateLabel(permission.label);\n }\n\n let gql = `REVOKE ${permission.action.toUpperCase()} ON ${permission.resource.toUpperCase()}`;\n if (permission.label) {\n gql += `:${permission.label}`;\n }\n gql += ' FROM $role';\n\n // Note: exec() here is Connection.exec() for GQL, not shell execution\n await this._conn.exec(gql, {\n params: { role: roleName },\n });\n }\n\n // Row-Level Security\n\n /**\n * Create an RLS policy.\n *\n * @param name - Policy name\n * @param label - Target label\n * @param action - Policy action\n * @param predicate - GQL predicate expression\n * @param options - Additional options\n */\n async createRLSPolicy(\n name: string,\n label: string,\n action: 'READ' | 'WRITE' | 'ALL',\n predicate: string,\n options?: CreateRLSPolicyOptions\n ): Promise<void> {\n this.validatePolicyName(name);\n // Use strict predicate validation to prevent GQL injection (GAP #11)\n validateRLSPredicate(predicate);\n\n // Validate label, action, and roles\n validateLabel(label);\n validateRLSAction(action);\n if (options?.roles) {\n for (const role of options.roles) {\n validateRoleName(role);\n }\n }\n\n const enabled = options?.enabled !== false ? 'ENABLE' : 'DISABLE';\n const roles = options?.roles?.length ? `FOR ROLES (${options.roles.join(', ')})` : '';\n\n // GAP #14: Use escape function for defense-in-depth\n const escapedLabel = escapeGQLIdentifier(label, 'label');\n const gql = `\n CREATE POLICY $name ON :${escapedLabel}\n FOR ${action}\n ${roles}\n USING (${predicate})\n ${enabled}\n `.trim();\n\n // Note: exec() here is Connection.exec() for GQL, not shell execution\n await this._conn.exec(gql, {\n params: { name },\n });\n }\n\n /**\n * Delete an RLS policy.\n *\n * @param name - Policy name\n * @param label - Target label\n */\n async deleteRLSPolicy(name: string, label: string): Promise<void> {\n this.validatePolicyName(name);\n // GAP #14: Use escape function for defense-in-depth (includes validation)\n const escapedLabel = escapeGQLIdentifier(label, 'label');\n\n // Note: exec() here is Connection.exec() for GQL, not shell execution\n await this._conn.exec(`DROP POLICY $name ON :${escapedLabel}`, {\n params: { name },\n });\n }\n\n /**\n * Get RLS policy information.\n *\n * @param name - Policy name\n * @returns Policy information or null if not found\n */\n async getRLSPolicy(name: string): Promise<RLSPolicy | null> {\n this.validatePolicyName(name);\n\n const result = await this._conn.queryAll('SHOW POLICY $name', { params: { name } });\n\n const row = result[0];\n if (!row) {\n return null;\n }\n return {\n name: row['name'] as string,\n label: row['label'] as string,\n action: row['action'] as 'READ' | 'WRITE' | 'ALL',\n predicate: row['predicate'] as string,\n roles: row['roles'] as string[] | undefined,\n enabled: (row['enabled'] as boolean) ?? true,\n };\n }\n\n /**\n * List all RLS policies.\n *\n * @param label - Optional label to filter by\n * @returns Array of policies\n */\n async listRLSPolicies(label?: string): Promise<RLSPolicy[]> {\n // GAP #14: Use escape function for defense-in-depth (includes validation)\n const escapedLabel = label ? escapeGQLIdentifier(label, 'label') : null;\n\n const gql = escapedLabel ? `SHOW POLICIES ON :${escapedLabel}` : 'SHOW POLICIES';\n const result = await this._conn.queryAll(gql);\n\n return result.map((row) => ({\n name: row['name'] as string,\n label: row['label'] as string,\n action: row['action'] as 'READ' | 'WRITE' | 'ALL',\n predicate: row['predicate'] as string,\n roles: row['roles'] as string[] | undefined,\n enabled: (row['enabled'] as boolean) ?? true,\n }));\n }\n\n /**\n * Enable an RLS policy.\n *\n * @param name - Policy name\n * @param label - Target label\n */\n async enableRLSPolicy(name: string, label: string): Promise<void> {\n this.validatePolicyName(name);\n // GAP #14: Use escape function for defense-in-depth (includes validation)\n const escapedLabel = escapeGQLIdentifier(label, 'label');\n\n // Note: exec() here is Connection.exec() for GQL, not shell execution\n await this._conn.exec(`ALTER POLICY $name ON :${escapedLabel} ENABLE`, {\n params: { name },\n });\n }\n\n /**\n * Disable an RLS policy.\n *\n * @param name - Policy name\n * @param label - Target label\n */\n async disableRLSPolicy(name: string, label: string): Promise<void> {\n this.validatePolicyName(name);\n // GAP #14: Use escape function for defense-in-depth (includes validation)\n const escapedLabel = escapeGQLIdentifier(label, 'label');\n\n // Note: exec() here is Connection.exec() for GQL, not shell execution\n await this._conn.exec(`ALTER POLICY $name ON :${escapedLabel} DISABLE`, {\n params: { name },\n });\n }\n\n // Session Management\n\n /**\n * Get the current session user.\n *\n * @returns Current username\n */\n async currentUser(): Promise<string> {\n const result = await this._conn.queryAll('RETURN current_user() AS user');\n return (result[0]?.['user'] as string) ?? '';\n }\n\n /**\n * Get the current session roles.\n *\n * @returns Current roles\n */\n async currentRoles(): Promise<string[]> {\n const result = await this._conn.queryAll('RETURN current_roles() AS roles');\n return (result[0]?.['roles'] as string[]) ?? [];\n }\n\n /**\n * Check if the current session has a specific permission.\n *\n * @param resource - Resource type\n * @param action - Action to check\n * @param label - Optional label filter\n * @returns Whether permission is granted\n */\n async hasPermission(resource: string, action: string, label?: string): Promise<boolean> {\n // Validate inputs for proper error messages\n validatePermissionResource(resource);\n validatePermissionAction(action);\n // GAP #14: Validate label if provided (the target is parameterized, but validation ensures good error messages)\n if (label) {\n validateLabel(label);\n }\n\n const target = label ? `${resource}:${label}` : resource;\n const result = await this._conn.queryAll('RETURN has_permission($target, $action) AS allowed', {\n params: { target, action },\n });\n return (result[0]?.['allowed'] as boolean) ?? false;\n }\n\n // Validation helpers\n\n private validateUsername(username: string): void {\n if (!username || username.length === 0) {\n throw new SecurityError({\n type: 'validation',\n message: 'Username cannot be empty',\n });\n }\n if (username.length > 128) {\n throw new SecurityError({\n type: 'validation',\n message: 'Username too long (max 128 characters)',\n });\n }\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(username)) {\n throw new SecurityError({\n type: 'validation',\n message: 'Invalid username format',\n });\n }\n }\n\n private validatePassword(password: string): void {\n const policy = this._passwordPolicy;\n\n if (!password || password.length < policy.minLength) {\n throw new SecurityError({\n type: 'validation',\n message: `Password must be at least ${policy.minLength} characters`,\n });\n }\n\n if (password.length > policy.maxLength) {\n throw new SecurityError({\n type: 'validation',\n message: `Password too long (max ${policy.maxLength} characters)`,\n });\n }\n\n if (policy.requireUppercase && !/[A-Z]/.test(password)) {\n throw new SecurityError({\n type: 'validation',\n message: 'Password must contain at least one uppercase letter',\n });\n }\n\n if (policy.requireLowercase && !/[a-z]/.test(password)) {\n throw new SecurityError({\n type: 'validation',\n message: 'Password must contain at least one lowercase letter',\n });\n }\n\n if (policy.requireDigit && !/[0-9]/.test(password)) {\n throw new SecurityError({\n type: 'validation',\n message: 'Password must contain at least one digit',\n });\n }\n\n if (policy.requireSpecialChar) {\n // GAP #19: Escape hyphen to prevent it being interpreted as character range\n // e.g., \"a-z\" should match literal 'a', '-', 'z', not all letters a-z\n const specialCharsEscaped = policy.specialChars.replace(/[.*+?^${}()|[\\]\\\\-]/g, '\\\\$&');\n const specialRegex = new RegExp(`[${specialCharsEscaped}]`);\n if (!specialRegex.test(password)) {\n throw new SecurityError({\n type: 'validation',\n message: `Password must contain at least one special character (${policy.specialChars})`,\n });\n }\n }\n }\n\n private validateRoleName(name: string): void {\n if (!name || name.length === 0) {\n throw new SecurityError({\n type: 'validation',\n message: 'Role name cannot be empty',\n });\n }\n if (name.length > 128) {\n throw new SecurityError({\n type: 'validation',\n message: 'Role name too long (max 128 characters)',\n });\n }\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {\n throw new SecurityError({\n type: 'validation',\n message: 'Invalid role name format',\n });\n }\n }\n\n private validatePolicyName(name: string): void {\n if (!name || name.length === 0) {\n throw new SecurityError({\n type: 'validation',\n message: 'Policy name cannot be empty',\n });\n }\n if (name.length > 128) {\n throw new SecurityError({\n type: 'validation',\n message: 'Policy name too long (max 128 characters)',\n });\n }\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {\n throw new SecurityError({\n type: 'validation',\n message: 'Invalid policy name format',\n });\n }\n }\n}\n\n/**\n * Create an auth client from a connection.\n *\n * @param conn - Connection to use\n * @param passwordPolicy - Optional password policy configuration\n */\nexport function createAuthClient(conn: Connection, passwordPolicy?: PasswordPolicy): AuthClient {\n return new AuthClient(conn, passwordPolicy);\n}\n","/**\n * Geode Connection\n *\n * Connection management and query execution using protobuf wire protocol.\n */\n\nimport type { GeodeConfig } from './config.js';\nimport { validateConfig } from './config.js';\nimport {\n DriverError,\n TransportError,\n StatusClass,\n ErrClosed,\n ErrQueryInProgress,\n ErrTxInProgress,\n type ConnectionState,\n} from './errors.js';\nimport type { Transport } from './transport.js';\nimport { createTransport } from './transport.js';\nimport {\n buildHelloRequest,\n buildExecuteRequest,\n buildPullRequest,\n buildPingRequest,\n buildBeginRequest,\n buildCommitRequest,\n buildRollbackRequest,\n buildSavepointRequest,\n buildRollbackToRequest,\n rowToRecord,\n type QuicServerMessage,\n type ExecutionResponse,\n type ColumnDefinition,\n type DataPage,\n} from './proto.js';\nimport { validateQuery, validateParamValue, validateSavepointName } from './validate.js';\nimport { Transaction } from './transaction.js';\nimport { QueryResult } from './result.js';\nimport type { PreparedStatement } from './prepared.js';\nimport type { QueryPlan, QueryProfile, ExplainOptions } from './explain.js';\nimport type { BatchQuery, BatchSummary, BatchOptions } from './batch.js';\nimport type { ColumnInfo, GQLType } from './types.js';\nimport { parseGQLType } from './types.js';\n\n/**\n * Query parameters type.\n */\nexport type QueryParams = Record<string, unknown>;\n\n/**\n * Query options.\n */\nexport interface QueryOptions {\n /** Query parameters */\n params?: QueryParams;\n /** Abort signal for cancellation */\n signal?: AbortSignal;\n /** Page size for result pagination */\n pageSize?: number;\n}\n\n/**\n * Convert a protobuf ExecutionResponse error to a DriverError.\n */\nfunction protoErrorToDriverError(response: ExecutionResponse, statusClass?: string): DriverError {\n const err = response.error;\n return new DriverError({\n statusClass: (statusClass ?? err?.code ?? StatusClass.SYSTEM) as typeof StatusClass.SYSTEM,\n subclass: '000',\n code: err?.code ?? 'UnknownError',\n message: err?.message ?? 'Unknown error',\n anchor: err?.anchor,\n additional: [],\n findings: response.status?.flaggerFindings ?? [],\n });\n}\n\n/**\n * Check if an ExecutionResponse is an error.\n */\nfunction isErrorResponse(response: ExecutionResponse): boolean {\n return response.error !== undefined;\n}\n\n/**\n * Check if an ExecutionResponse contains a schema.\n */\nfunction isSchemaResponse(response: ExecutionResponse): boolean {\n return response.schema !== undefined;\n}\n\n/**\n * Check if an ExecutionResponse contains a data page.\n */\nfunction isDataPageResponse(response: ExecutionResponse): boolean {\n return response.page !== undefined;\n}\n\n/**\n * Convert protobuf columns to ColumnInfo array.\n */\nfunction columnsToColumnInfo(columns: ColumnDefinition[]): ColumnInfo[] {\n return columns.map((col) => ({\n name: col.name,\n type: col.type as GQLType,\n kind: parseGQLType(col.type),\n }));\n}\n\n/**\n * Convert a DataPage to row records.\n */\nfunction dataPageToRows(page: DataPage, columns: ColumnDefinition[]): Record<string, unknown>[] {\n return page.rows.map((row) => rowToRecord(row, columns));\n}\n\n/**\n * Connection to a Geode database.\n */\nexport class Connection {\n private _config: GeodeConfig;\n private _transport: Transport;\n private _state: ConnectionState = 'idle';\n private _inTransaction = false;\n private _activeResult: QueryResult | null = null;\n private _requestId = 0;\n private _sessionId = '';\n private _columns: ColumnDefinition[] = [];\n\n private constructor(config: GeodeConfig, transport: Transport) {\n this._config = config;\n this._transport = transport;\n }\n\n /**\n * Create a new connection to the Geode server.\n */\n static async connect(config: GeodeConfig): Promise<Connection> {\n validateConfig(config);\n\n const transport = await createTransport(config);\n const conn = new Connection(config, transport);\n\n try {\n await conn.hello();\n return conn;\n } catch (e) {\n await transport.close();\n throw e;\n }\n }\n\n /**\n * Create a connection with a custom transport (for testing).\n */\n static async connectWithTransport(\n config: GeodeConfig,\n transport: Transport\n ): Promise<Connection> {\n const conn = new Connection(config, transport);\n await conn.hello();\n return conn;\n }\n\n /**\n * Get connection configuration.\n */\n get config(): Readonly<GeodeConfig> {\n return this._config;\n }\n\n /**\n * Get current connection state.\n */\n get state(): ConnectionState {\n return this._state;\n }\n\n /**\n * Check if connection is in a transaction.\n */\n get inTransaction(): boolean {\n return this._inTransaction;\n }\n\n /**\n * Check if connection is closed.\n */\n get isClosed(): boolean {\n return this._state === 'closed' || this._transport.isClosed();\n }\n\n /**\n * Get session ID.\n */\n get sessionId(): string {\n return this._sessionId;\n }\n\n /**\n * Perform the HELLO handshake.\n */\n private async hello(): Promise<void> {\n const msg = buildHelloRequest(\n this._config.username ?? '',\n this._config.password ?? '',\n this._config.helloName,\n this._config.helloVersion,\n this._config.conformance\n );\n\n await this._transport.sendProto(msg);\n const response = await this._transport.receiveProto();\n\n if (response.hello) {\n if (!response.hello.success) {\n // Check if this is an auth error when no credentials were provided\n const hasCredentials = Boolean(this._config.username) || Boolean(this._config.password);\n if (!hasCredentials && response.hello.errorMessage.includes('Authentication')) {\n // Ignore auth errors when no credentials - server may still accept connection\n this._sessionId = response.hello.sessionId || '';\n return;\n }\n throw new DriverError({\n statusClass: StatusClass.AUTH,\n subclass: '000',\n code: 'AuthenticationFailed',\n message: response.hello.errorMessage || 'Authentication failed',\n });\n }\n this._sessionId = response.hello.sessionId;\n } else {\n throw new TransportError({\n operation: 'hello',\n cause: new Error('Invalid HELLO response'),\n });\n }\n }\n\n /**\n * Execute a query that returns rows.\n */\n async query(query: string, options?: QueryOptions): Promise<QueryResult> {\n this.checkState('query');\n\n validateQuery(query);\n\n const params = options?.params ?? {};\n\n // Validate parameters\n for (const [_key, value] of Object.entries(params)) {\n validateParamValue(value);\n }\n\n const signal = options?.signal;\n\n try {\n this._state = 'fetching';\n\n // Send Execute request\n const msg = buildExecuteRequest(this._sessionId, query, params);\n await this._transport.sendProto(msg, signal);\n\n // Read response - should be schema or error\n const response = await this._transport.receiveProto(signal);\n\n if (!response.execute) {\n this._state = this._inTransaction ? 'in_transaction' : 'idle';\n throw new TransportError({\n operation: 'query',\n cause: new Error('Invalid execute response'),\n });\n }\n\n const execResp = response.execute;\n\n if (isErrorResponse(execResp)) {\n this._state = this._inTransaction ? 'in_transaction' : 'idle';\n throw protoErrorToDriverError(execResp, execResp.status?.statusClass);\n }\n\n if (!isSchemaResponse(execResp)) {\n this._state = this._inTransaction ? 'in_transaction' : 'idle';\n throw new TransportError({\n operation: 'query',\n cause: new Error('Expected schema response'),\n });\n }\n\n this._columns = execResp.schema!.columns;\n const columns = columnsToColumnInfo(this._columns);\n\n // Check if there's an inline data page\n let initialRows: Record<string, unknown>[] = [];\n let isFinal = false;\n let isOrdered = false;\n let orderKeys: string[] = [];\n\n // Try to receive inline data page with short timeout\n const inlineResponse = await this._tryReceiveInline(signal);\n if (inlineResponse?.execute) {\n const inlineExec = inlineResponse.execute;\n if (isErrorResponse(inlineExec)) {\n this._state = this._inTransaction ? 'in_transaction' : 'idle';\n throw protoErrorToDriverError(inlineExec, inlineExec.status?.statusClass);\n }\n if (isDataPageResponse(inlineExec)) {\n const page = inlineExec.page!;\n initialRows = dataPageToRows(page, this._columns);\n isFinal = page.final;\n isOrdered = page.ordered;\n orderKeys = page.orderKeys;\n }\n }\n\n if (!isFinal && initialRows.length === 0) {\n // No inline data received - send PULL request to get first page\n this._requestId++;\n const pageSize = options?.pageSize ?? this._config.pageSize;\n const pullMsg = buildPullRequest(this._requestId, pageSize, this._sessionId);\n await this._transport.sendProto(pullMsg, signal);\n\n // Read pull response - server wraps data in pull.response, not execute\n const pullResponse = await this._transport.receiveProto(signal);\n const pullExec = pullResponse.pull?.response ?? pullResponse.execute;\n\n if (pullExec) {\n if (isErrorResponse(pullExec)) {\n this._state = this._inTransaction ? 'in_transaction' : 'idle';\n throw protoErrorToDriverError(pullExec, pullExec.status?.statusClass);\n }\n if (isDataPageResponse(pullExec)) {\n const page = pullExec.page!;\n initialRows = dataPageToRows(page, this._columns);\n isFinal = page.final;\n isOrdered = page.ordered;\n orderKeys = page.orderKeys;\n }\n }\n }\n\n // Create result\n const result = new QueryResult(\n this,\n columns,\n initialRows,\n isFinal,\n isOrdered,\n orderKeys,\n options?.pageSize ?? this._config.pageSize,\n signal\n );\n\n this._activeResult = result;\n return result;\n } catch (e) {\n this._state = this._inTransaction ? 'in_transaction' : 'idle';\n throw e;\n }\n }\n\n /**\n * Execute a query and return all rows as an array.\n */\n async queryAll(query: string, options?: QueryOptions): Promise<Record<string, unknown>[]> {\n const result = await this.query(query, options);\n const rows: Record<string, unknown>[] = [];\n\n for await (const row of result) {\n // Convert row values to plain objects\n // Row is a Map<string, GQLValue>, so use .get() to access values\n const obj: Record<string, unknown> = {};\n for (const col of result.columns) {\n const value = row.get(col.name);\n obj[col.name] = value?.toJS();\n }\n rows.push(obj);\n }\n\n return rows;\n }\n\n /**\n * Execute a query that doesn't return rows.\n */\n async exec(query: string, options?: QueryOptions): Promise<void> {\n this.checkState('exec');\n\n validateQuery(query);\n\n const params = options?.params ?? {};\n\n // Validate parameters\n for (const [_key, value] of Object.entries(params)) {\n validateParamValue(value);\n }\n\n const signal = options?.signal;\n\n try {\n this._state = 'executing';\n\n // Send Execute request\n const msg = buildExecuteRequest(this._sessionId, query, params);\n await this._transport.sendProto(msg, signal);\n\n // Read response\n const response = await this._transport.receiveProto(signal);\n\n if (!response.execute) {\n throw new TransportError({\n operation: 'exec',\n cause: new Error('Invalid execute response'),\n });\n }\n\n const execResp = response.execute;\n\n if (isErrorResponse(execResp)) {\n throw protoErrorToDriverError(execResp, execResp.status?.statusClass);\n }\n\n // If there's a schema, drain any data pages\n if (isSchemaResponse(execResp)) {\n this._columns = execResp.schema!.columns;\n const inlineResponse = await this._tryReceiveInline(signal);\n if (inlineResponse?.execute && isErrorResponse(inlineResponse.execute)) {\n throw protoErrorToDriverError(\n inlineResponse.execute,\n inlineResponse.execute.status?.statusClass\n );\n }\n }\n } finally {\n this._state = this._inTransaction ? 'in_transaction' : 'idle';\n }\n }\n\n /**\n * Fetch the next page of results (internal).\n */\n async _fetchNextPage(\n pageSize: number,\n signal?: AbortSignal\n ): Promise<{\n rows: Record<string, unknown>[];\n final: boolean;\n }> {\n this._requestId++;\n const pullMsg = buildPullRequest(this._requestId, pageSize, this._sessionId);\n await this._transport.sendProto(pullMsg, signal);\n\n const response = await this._transport.receiveProto(signal);\n\n // Server sends pull data in pull.response, not execute\n const execResp = response.pull?.response ?? response.execute;\n\n if (!execResp) {\n return { rows: [], final: true };\n }\n\n if (isErrorResponse(execResp)) {\n throw protoErrorToDriverError(execResp, execResp.status?.statusClass);\n }\n\n if (isDataPageResponse(execResp)) {\n const page = execResp.page!;\n return {\n rows: dataPageToRows(page, this._columns),\n final: page.final,\n };\n }\n\n // Metrics, profile, etc. indicate no more data\n return { rows: [], final: true };\n }\n\n /**\n * Try to receive an inline response with short timeout.\n */\n private async _tryReceiveInline(signal?: AbortSignal): Promise<QuicServerMessage | null> {\n if (signal?.aborted) {\n return null;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000);\n\n try {\n const response = await this._transport.receiveProto(controller.signal);\n return response;\n } catch (err) {\n if (err instanceof TransportError && err.cause?.message === 'Aborted') {\n return null;\n }\n throw err;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Release active result (internal).\n */\n _releaseResult(result: QueryResult): void {\n if (this._activeResult === result) {\n this._activeResult = null;\n this._state = this._inTransaction ? 'in_transaction' : 'idle';\n }\n }\n\n /**\n * Begin a transaction.\n */\n async begin(signal?: AbortSignal): Promise<Transaction> {\n this.checkState('begin');\n\n if (this._inTransaction) {\n throw ErrTxInProgress;\n }\n\n const msg = buildBeginRequest(false, this._sessionId);\n await this._transport.sendProto(msg, signal);\n\n const response = await this._transport.receiveProto(signal);\n\n if (response.begin) {\n if (response.begin.sessionId) {\n this._sessionId = response.begin.sessionId;\n }\n } else {\n throw new TransportError({\n operation: 'begin',\n cause: new Error('Invalid BEGIN response'),\n });\n }\n\n this._inTransaction = true;\n this._state = 'in_transaction';\n\n return new Transaction(this);\n }\n\n /**\n * Commit the current transaction (internal).\n */\n async _commit(signal?: AbortSignal): Promise<void> {\n const msg = buildCommitRequest(this._sessionId);\n await this._transport.sendProto(msg, signal);\n\n const response = await this._transport.receiveProto(signal);\n\n if (!response.commit) {\n throw new TransportError({\n operation: 'commit',\n cause: new Error('Invalid COMMIT response'),\n });\n }\n\n if (!response.commit.success) {\n throw new DriverError({\n statusClass: StatusClass.TRANSACTION_STATE,\n subclass: '000',\n code: 'CommitFailed',\n message: 'Commit failed',\n });\n }\n\n this._inTransaction = false;\n this._state = 'idle';\n }\n\n /**\n * Rollback the current transaction (internal).\n */\n async _rollback(signal?: AbortSignal): Promise<void> {\n const msg = buildRollbackRequest(this._sessionId);\n await this._transport.sendProto(msg, signal);\n\n const response = await this._transport.receiveProto(signal);\n\n if (!response.rollback) {\n throw new TransportError({\n operation: 'rollback',\n cause: new Error('Invalid ROLLBACK response'),\n });\n }\n\n this._inTransaction = false;\n this._state = 'idle';\n }\n\n /**\n * Create a savepoint (internal).\n */\n async _savepoint(name: string, signal?: AbortSignal): Promise<void> {\n validateSavepointName(name);\n\n const msg = buildSavepointRequest(name, this._sessionId);\n await this._transport.sendProto(msg, signal);\n\n const response = await this._transport.receiveProto(signal);\n\n if (!response.savepoint) {\n throw new TransportError({\n operation: 'savepoint',\n cause: new Error('Invalid SAVEPOINT response'),\n });\n }\n\n if (!response.savepoint.success) {\n throw new DriverError({\n statusClass: StatusClass.TRANSACTION_STATE,\n subclass: '000',\n code: 'SavepointFailed',\n message: `Failed to create savepoint: ${name}`,\n });\n }\n }\n\n /**\n * Rollback to a savepoint (internal).\n */\n async _rollbackTo(name: string, signal?: AbortSignal): Promise<void> {\n validateSavepointName(name);\n\n const msg = buildRollbackToRequest(name, this._sessionId);\n await this._transport.sendProto(msg, signal);\n\n const response = await this._transport.receiveProto(signal);\n\n if (!response.rollbackTo) {\n throw new TransportError({\n operation: 'rollback_to',\n cause: new Error('Invalid ROLLBACK TO response'),\n });\n }\n\n if (!response.rollbackTo.success) {\n throw new DriverError({\n statusClass: StatusClass.TRANSACTION_STATE,\n subclass: '000',\n code: 'RollbackToFailed',\n message: `Failed to rollback to savepoint: ${name}`,\n });\n }\n }\n\n /**\n * Ping the server to check connection health.\n */\n async ping(signal?: AbortSignal): Promise<void> {\n if (this._state === 'closed') {\n throw ErrClosed;\n }\n\n const msg = buildPingRequest();\n await this._transport.sendProto(msg, signal);\n\n const response = await this._transport.receiveProto(signal);\n\n if (!response.ping) {\n throw new TransportError({\n operation: 'ping',\n cause: new Error('Invalid PING response'),\n });\n }\n\n if (!response.ping.ok) {\n throw new TransportError({\n operation: 'ping',\n cause: new Error('Server returned not ok'),\n });\n }\n }\n\n /**\n * Reset the connection session.\n */\n async reset(signal?: AbortSignal): Promise<void> {\n if (this._state === 'closed') {\n throw ErrClosed;\n }\n\n // Rollback any active transaction\n if (this._inTransaction) {\n await this._rollback(signal);\n }\n\n this._state = 'idle';\n this._activeResult = null;\n }\n\n /**\n * Close the connection.\n */\n async close(): Promise<void> {\n if (this._state === 'closed') {\n return;\n }\n\n this._state = 'closed';\n\n // Close active result\n if (this._activeResult) {\n this._activeResult._close();\n this._activeResult = null;\n }\n\n await this._transport.close();\n }\n\n /**\n * Create a prepared statement.\n */\n async prepare(query: string): Promise<PreparedStatement> {\n const { PreparedStatement } = await import('./prepared.js');\n return new PreparedStatement(this, query);\n }\n\n /**\n * Get the query execution plan without executing.\n */\n async explain(query: string, options?: ExplainOptions): Promise<QueryPlan> {\n const { explain: doExplain } = await import('./explain.js');\n return doExplain(this, query, options);\n }\n\n /**\n * Execute a query with profiling.\n */\n async profile(query: string, options?: ExplainOptions): Promise<QueryProfile> {\n const { profile: doProfile } = await import('./explain.js');\n return doProfile(this, query, options);\n }\n\n /**\n * Execute multiple queries in a batch.\n */\n async batch(queries: BatchQuery[], options?: BatchOptions): Promise<BatchSummary> {\n const { batch: doBatch } = await import('./batch.js');\n return doBatch(this, queries, options);\n }\n\n /**\n * Check connection state before operation.\n */\n private checkState(operation: string): void {\n if (this._state === 'closed') {\n throw ErrClosed;\n }\n\n if (this._state === 'fetching' || this._activeResult) {\n throw ErrQueryInProgress;\n }\n\n if (operation === 'begin' && this._inTransaction) {\n throw ErrTxInProgress;\n }\n }\n}\n","/**\n * Transport Layer\n *\n * Provides transport abstraction for communication with Geode server.\n * Supports both QUIC (default) and gRPC transports.\n *\n * Wire format for QUIC: 4-byte Big Endian length prefix + protobuf message body.\n */\n\nimport * as tls from 'node:tls';\nimport * as fs from 'node:fs';\nimport * as crypto from 'node:crypto';\nimport type { GeodeConfig } from './config.js';\nimport { getAddress } from './config.js';\nimport { TransportError, ErrClosed } from './errors.js';\nimport { validateTLSCertPath } from './validate.js';\nimport {\n encodeWithLengthPrefix,\n decodeQuicServerMessage,\n decodeLengthPrefix,\n type QuicClientMessage,\n type QuicServerMessage,\n} from './proto.js';\n\n// ALPN protocol for Geode\nconst GEODE_ALPN = ['geode/1'];\n\n/**\n * Transport interface for communication with Geode server.\n */\nexport interface Transport {\n /** Send a protobuf message to the server */\n sendProto(msg: QuicClientMessage, signal?: AbortSignal): Promise<void>;\n\n /** Receive a protobuf message from the server */\n receiveProto(signal?: AbortSignal): Promise<QuicServerMessage>;\n\n /** Close the transport */\n close(): Promise<void>;\n\n /** Check if transport is closed */\n isClosed(): boolean;\n\n /** Get remote address */\n getAddress(): string;\n}\n\n/**\n * Build TLS configuration from GeodeConfig.\n */\nexport async function buildTLSConfig(cfg: GeodeConfig): Promise<tls.SecureContextOptions> {\n const options: tls.SecureContextOptions = {\n minVersion: 'TLSv1.3',\n maxVersion: 'TLSv1.3',\n };\n\n // Load CA certificate\n if (cfg.tlsCACert) {\n options.ca = cfg.tlsCACert;\n } else if (cfg.tlsCA) {\n // GAP #12: Validate path to prevent directory traversal attacks\n validateTLSCertPath(cfg.tlsCA, 'tlsCA');\n try {\n options.ca = await fs.promises.readFile(cfg.tlsCA, 'utf-8');\n } catch (e) {\n throw new TransportError({\n operation: 'load_ca_cert',\n cause: e instanceof Error ? e : new Error(String(e)),\n });\n }\n }\n\n // Load client certificate for mTLS\n if (cfg.tlsCertPEM) {\n options.cert = cfg.tlsCertPEM;\n } else if (cfg.tlsCert) {\n // GAP #12: Validate path to prevent directory traversal attacks\n validateTLSCertPath(cfg.tlsCert, 'tlsCert');\n try {\n options.cert = await fs.promises.readFile(cfg.tlsCert, 'utf-8');\n } catch (e) {\n throw new TransportError({\n operation: 'load_client_cert',\n cause: e instanceof Error ? e : new Error(String(e)),\n });\n }\n }\n\n // Load client key for mTLS\n if (cfg.tlsKeyPEM) {\n options.key = cfg.tlsKeyPEM;\n } else if (cfg.tlsKey) {\n // GAP #12: Validate path to prevent directory traversal attacks\n validateTLSCertPath(cfg.tlsKey, 'tlsKey');\n try {\n options.key = await fs.promises.readFile(cfg.tlsKey, 'utf-8');\n } catch (e) {\n throw new TransportError({\n operation: 'load_client_key',\n cause: e instanceof Error ? e : new Error(String(e)),\n });\n }\n }\n\n return options;\n}\n\n/**\n * Abstract base class for transports.\n */\nexport abstract class BaseTransport implements Transport {\n protected _closed = false;\n protected _address: string;\n\n constructor(address: string) {\n this._address = address;\n }\n\n abstract sendProto(msg: QuicClientMessage, signal?: AbortSignal): Promise<void>;\n abstract receiveProto(signal?: AbortSignal): Promise<QuicServerMessage>;\n abstract close(): Promise<void>;\n\n isClosed(): boolean {\n return this._closed;\n }\n\n getAddress(): string {\n return this._address;\n }\n\n protected checkClosed(): void {\n if (this._closed) {\n throw ErrClosed;\n }\n }\n}\n\n/**\n * QUIC transport using @matrixai/quic.\n *\n * This implementation uses the quiche QUIC library via native bindings.\n * Wire format: 4-byte Big Endian length prefix + protobuf message body.\n */\nexport class QuicTransport extends BaseTransport {\n private _client: unknown = null;\n private _stream: unknown = null;\n private _protoBuffer: Buffer = Buffer.alloc(0);\n private _pendingProtoReads: Array<{\n resolve: (value: QuicServerMessage) => void;\n reject: (error: Error) => void;\n }> = [];\n\n constructor(address: string) {\n super(address);\n }\n\n /**\n * Connect to the Geode server using QUIC.\n */\n static async connect(cfg: GeodeConfig): Promise<QuicTransport> {\n const address = getAddress(cfg);\n const transport = new QuicTransport(address);\n\n try {\n // Dynamically import @matrixai/quic\n const { QUICClient } = await import('@matrixai/quic');\n\n // Parse host and port\n const [host = 'localhost', portStr] = address.includes('[')\n ? [address.slice(1, address.lastIndexOf(']')), address.slice(address.lastIndexOf(':') + 1)]\n : address.split(':');\n const port = parseInt(portStr ?? '3141', 10);\n\n // Create crypto ops using Node.js crypto\n const cryptoOps = {\n ops: {\n randomBytes: (data: ArrayBuffer): Promise<void> => {\n const buf = Buffer.from(data);\n crypto.randomFillSync(buf);\n return Promise.resolve();\n },\n },\n };\n\n // Build TLS config\n const tlsConfig = await buildTLSConfig(cfg);\n\n // Create QUIC client configuration\n const config: Record<string, unknown> = {\n applicationProtos: GEODE_ALPN,\n maxIdleTimeout: cfg.maxIdleTime ?? 30000,\n initialMaxData: 10_000_000,\n initialMaxStreamDataBidiLocal: 1_000_000,\n initialMaxStreamDataBidiRemote: 1_000_000,\n initialMaxStreamsBidi: 100,\n };\n\n // Configure TLS\n if (cfg.insecureSkipVerify) {\n // Security safeguard: warn about insecure configuration\n const isProduction =\n process.env['NODE_ENV'] === 'production' || process.env['GEODE_ENV'] === 'production';\n if (isProduction) {\n // eslint-disable-next-line no-console -- Intentional security warning\n console.warn(\n 'SECURITY WARNING: insecureSkipVerify is enabled in production environment. ' +\n 'This disables TLS certificate verification and exposes the connection to MITM attacks. ' +\n 'Set GEODE_ALLOW_INSECURE_PRODUCTION=true to override this warning.'\n );\n if (process.env['GEODE_ALLOW_INSECURE_PRODUCTION'] !== 'true') {\n throw new TransportError({\n operation: 'connect',\n cause: new Error(\n 'insecureSkipVerify is not allowed in production. ' +\n 'Configure proper TLS certificates or set GEODE_ALLOW_INSECURE_PRODUCTION=true to override.'\n ),\n });\n }\n }\n config.verifyPeer = false;\n }\n if (tlsConfig.ca) {\n config.caCerts = [tlsConfig.ca];\n }\n if (tlsConfig.cert && tlsConfig.key) {\n config.cert = tlsConfig.cert;\n config.key = tlsConfig.key;\n }\n\n // Create QUIC client\n /* eslint-disable @typescript-eslint/await-thenable */\n const client = await QUICClient.createQUICClient(\n {\n host,\n port,\n serverName: cfg.serverName ?? host,\n crypto: cryptoOps,\n config,\n },\n { timer: cfg.connectTimeout ?? 30000 }\n );\n transport._client = client;\n\n // Open a bidirectional stream\n const connection = client.connection;\n const stream = await connection.newStream();\n transport._stream = stream;\n /* eslint-enable @typescript-eslint/await-thenable */\n\n // Start reading from stream\n transport.startReading();\n\n return transport;\n } catch (e) {\n await transport.close();\n throw new TransportError({\n operation: 'connect',\n address,\n cause: e instanceof Error ? e : new Error(String(e)),\n });\n }\n }\n\n /**\n * Start reading from the stream in the background.\n */\n private startReading(): void {\n if (!this._stream) return;\n\n const stream = this._stream as {\n readable: ReadableStream<Uint8Array>;\n };\n\n const reader = stream.readable.getReader();\n\n const read = async () => {\n try {\n while (!this._closed) {\n const { done, value } = await reader.read();\n if (done) {\n // Stream ended - reject any pending reads\n this.rejectPendingReads(\n new TransportError({\n operation: 'read',\n cause: new Error('Stream ended unexpectedly'),\n })\n );\n break;\n }\n if (value) {\n this.processData(Buffer.from(value));\n }\n }\n } catch (err) {\n // Stream error - reject any pending reads with the error\n if (!this._closed) {\n this.rejectPendingReads(\n new TransportError({\n operation: 'read',\n cause: err instanceof Error ? err : new Error(String(err)),\n })\n );\n }\n } finally {\n reader.releaseLock();\n }\n };\n\n void read();\n }\n\n /**\n * Reject all pending reads with an error.\n */\n private rejectPendingReads(error: Error): void {\n const pending = this._pendingProtoReads;\n this._pendingProtoReads = [];\n for (const p of pending) {\n p.reject(error);\n }\n }\n\n /**\n * Process received data (length-prefixed protobuf messages).\n */\n private processData(data: Buffer): void {\n this._protoBuffer = Buffer.concat([this._protoBuffer, data]);\n\n // Try to decode complete messages\n while (this._protoBuffer.length >= 4) {\n const msgLen = decodeLengthPrefix(this._protoBuffer);\n const totalLen = 4 + msgLen;\n\n if (this._protoBuffer.length < totalLen) {\n // Need more data\n break;\n }\n\n // Extract and decode the message\n const msgData = this._protoBuffer.subarray(4, totalLen);\n this._protoBuffer = this._protoBuffer.subarray(totalLen);\n\n try {\n const msg = decodeQuicServerMessage(msgData);\n\n // Resolve pending read or buffer the message\n const pending = this._pendingProtoReads.shift();\n if (pending) {\n pending.resolve(msg);\n }\n // Note: We don't buffer proto messages, they must be consumed immediately\n } catch (err) {\n // Reject pending reads on decode error\n const pending = this._pendingProtoReads.shift();\n if (pending) {\n pending.reject(\n new TransportError({\n operation: 'decode',\n cause: err instanceof Error ? err : new Error(String(err)),\n })\n );\n }\n }\n }\n }\n\n /**\n * Send a protobuf message with length prefix.\n */\n async sendProto(msg: QuicClientMessage, signal?: AbortSignal): Promise<void> {\n this.checkClosed();\n\n if (signal?.aborted) {\n throw new TransportError({ operation: 'sendProto', cause: new Error('Aborted') });\n }\n\n if (!this._stream) {\n throw new TransportError({ operation: 'sendProto', cause: new Error('No stream') });\n }\n\n const data = encodeWithLengthPrefix(msg);\n\n try {\n const stream = this._stream as {\n writable: WritableStream<Uint8Array>;\n };\n\n const writer = stream.writable.getWriter();\n await writer.write(new Uint8Array(data));\n writer.releaseLock();\n } catch (e) {\n throw new TransportError({\n operation: 'sendProto',\n address: this._address,\n cause: e instanceof Error ? e : new Error(String(e)),\n });\n }\n }\n\n /**\n * Receive a protobuf message.\n */\n async receiveProto(signal?: AbortSignal): Promise<QuicServerMessage> {\n this.checkClosed();\n\n if (signal?.aborted) {\n throw new TransportError({ operation: 'receiveProto', cause: new Error('Aborted') });\n }\n\n return new Promise((resolve, reject) => {\n let onAbort: (() => void) | null = null;\n\n const pendingRead = {\n resolve: (value: QuicServerMessage) => {\n if (onAbort && signal) {\n signal.removeEventListener('abort', onAbort);\n }\n resolve(value);\n },\n reject: (error: Error) => {\n if (onAbort && signal) {\n signal.removeEventListener('abort', onAbort);\n }\n reject(error);\n },\n };\n\n this._pendingProtoReads.push(pendingRead);\n\n if (signal) {\n onAbort = () => {\n const idx = this._pendingProtoReads.indexOf(pendingRead);\n if (idx !== -1) {\n this._pendingProtoReads.splice(idx, 1);\n }\n reject(new TransportError({ operation: 'receiveProto', cause: new Error('Aborted') }));\n };\n signal.addEventListener('abort', onAbort, { once: true });\n }\n });\n }\n\n async close(): Promise<void> {\n if (this._closed) return;\n this._closed = true;\n\n // Reject pending reads\n for (const pending of this._pendingProtoReads) {\n pending.reject(ErrClosed);\n }\n this._pendingProtoReads = [];\n\n // Close QUIC client\n if (this._client) {\n try {\n const client = this._client as { destroy: () => Promise<void> };\n await client.destroy();\n } catch {\n // Ignore close errors\n }\n this._client = null;\n }\n\n this._stream = null;\n }\n}\n\n/**\n * Mock transport for testing purposes.\n *\n * This allows unit testing without a real connection.\n */\nexport class MockTransport extends BaseTransport {\n private _protoSendQueue: QuicClientMessage[] = [];\n private _protoReceiveQueue: QuicServerMessage[] = [];\n private _pendingProtoReads: Array<{\n resolve: (value: QuicServerMessage) => void;\n reject: (error: Error) => void;\n }> = [];\n\n constructor(address = 'mock:3141') {\n super(address);\n }\n\n /**\n * Queue a protobuf response.\n */\n queueProtoResponse(response: QuicServerMessage): void {\n // Resolve pending read or queue\n const pending = this._pendingProtoReads.shift();\n if (pending) {\n pending.resolve(response);\n } else {\n this._protoReceiveQueue.push(response);\n }\n }\n\n /**\n * Get all sent protobuf messages.\n */\n getSentProtoMessages(): QuicClientMessage[] {\n return [...this._protoSendQueue];\n }\n\n /**\n * Clear sent messages.\n */\n clearSentMessages(): void {\n this._protoSendQueue = [];\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async sendProto(msg: QuicClientMessage, signal?: AbortSignal): Promise<void> {\n this.checkClosed();\n\n if (signal?.aborted) {\n throw new TransportError({ operation: 'sendProto', cause: new Error('Aborted') });\n }\n\n this._protoSendQueue.push(msg);\n }\n\n async receiveProto(signal?: AbortSignal): Promise<QuicServerMessage> {\n this.checkClosed();\n\n if (signal?.aborted) {\n throw new TransportError({ operation: 'receiveProto', cause: new Error('Aborted') });\n }\n\n const queued = this._protoReceiveQueue.shift();\n if (queued) {\n return queued;\n }\n\n return new Promise((resolve, reject) => {\n let onAbort: (() => void) | null = null;\n\n const pendingRead = {\n resolve: (value: QuicServerMessage) => {\n if (onAbort && signal) {\n signal.removeEventListener('abort', onAbort);\n }\n resolve(value);\n },\n reject: (error: Error) => {\n if (onAbort && signal) {\n signal.removeEventListener('abort', onAbort);\n }\n reject(error);\n },\n };\n\n this._pendingProtoReads.push(pendingRead);\n\n if (signal) {\n onAbort = () => {\n const idx = this._pendingProtoReads.indexOf(pendingRead);\n if (idx !== -1) {\n this._pendingProtoReads.splice(idx, 1);\n }\n reject(new TransportError({ operation: 'receiveProto', cause: new Error('Aborted') }));\n };\n signal.addEventListener('abort', onAbort, { once: true });\n }\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async close(): Promise<void> {\n if (this._closed) return;\n this._closed = true;\n\n for (const pending of this._pendingProtoReads) {\n pending.reject(ErrClosed);\n }\n this._pendingProtoReads = [];\n }\n}\n\n/**\n * Create a transport for the given configuration.\n *\n * Selects between QUIC and gRPC based on config.transport.\n */\nexport async function createTransport(cfg: GeodeConfig): Promise<Transport> {\n if (cfg.transport === 'grpc') {\n const { GrpcTransport } = await import('./grpc-transport.js');\n return GrpcTransport.connect(cfg);\n }\n return QuicTransport.connect(cfg);\n}\n\n// Legacy export aliases\nexport { QuicTransport as MatrixQuicTransport };\nexport { QuicTransport as QuicheTransport };\n","/**\n * Transaction Management\n *\n * Provides transaction and savepoint support.\n */\n\nimport type { Connection, QueryOptions } from './connection.js';\nimport type { QueryResult } from './result.js';\nimport { ErrNoTx, ErrTxDone } from './errors.js';\n\n/**\n * Transaction represents an active database transaction.\n */\nexport class Transaction {\n private _conn: Connection;\n private _done = false;\n private _savepoints: string[] = [];\n\n constructor(conn: Connection) {\n this._conn = conn;\n }\n\n /**\n * Check if transaction is complete (committed or rolled back).\n */\n get isDone(): boolean {\n return this._done;\n }\n\n /**\n * Get the list of active savepoints.\n */\n get savepoints(): readonly string[] {\n return this._savepoints;\n }\n\n /**\n * Execute a query within the transaction.\n */\n async query(query: string, options?: QueryOptions): Promise<QueryResult> {\n this.checkDone();\n return this._conn.query(query, options);\n }\n\n /**\n * Execute a query and return all rows.\n */\n async queryAll(query: string, options?: QueryOptions): Promise<Record<string, unknown>[]> {\n this.checkDone();\n return this._conn.queryAll(query, options);\n }\n\n /**\n * Execute a statement that doesn't return rows.\n */\n async exec(query: string, options?: QueryOptions): Promise<void> {\n this.checkDone();\n return this._conn.exec(query, options);\n }\n\n /**\n * Create a savepoint.\n */\n async savepoint(name: string, signal?: AbortSignal): Promise<void> {\n this.checkDone();\n await this._conn._savepoint(name, signal);\n this._savepoints.push(name);\n }\n\n /**\n * Rollback to a savepoint.\n */\n async rollbackTo(name: string, signal?: AbortSignal): Promise<void> {\n this.checkDone();\n\n const idx = this._savepoints.indexOf(name);\n if (idx === -1) {\n throw new Error(`Savepoint not found: ${name}`);\n }\n\n await this._conn._rollbackTo(name, signal);\n\n // Remove this savepoint and all savepoints created after it\n this._savepoints = this._savepoints.slice(0, idx);\n }\n\n /**\n * Release a savepoint.\n *\n * Note: Geode doesn't have explicit RELEASE SAVEPOINT, but we track it client-side.\n */\n release(name: string): void {\n this.checkDone();\n\n const idx = this._savepoints.indexOf(name);\n if (idx === -1) {\n throw new Error(`Savepoint not found: ${name}`);\n }\n\n // Remove the savepoint\n this._savepoints.splice(idx, 1);\n }\n\n /**\n * Commit the transaction.\n */\n async commit(signal?: AbortSignal): Promise<void> {\n this.checkDone();\n this._done = true;\n await this._conn._commit(signal);\n this._savepoints = [];\n }\n\n /**\n * Rollback the transaction.\n */\n async rollback(signal?: AbortSignal): Promise<void> {\n this.checkDone();\n this._done = true;\n await this._conn._rollback(signal);\n this._savepoints = [];\n }\n\n /**\n * Execute a function within the transaction with automatic commit/rollback.\n */\n async run<T>(fn: (tx: Transaction) => Promise<T>): Promise<T> {\n this.checkDone();\n\n try {\n const result = await fn(this);\n await this.commit();\n return result;\n } catch (e) {\n if (!this._done) {\n await this.rollback();\n }\n throw e;\n }\n }\n\n /**\n * Check if transaction is already done.\n */\n private checkDone(): void {\n if (this._done) {\n throw ErrTxDone;\n }\n if (!this._conn.inTransaction) {\n throw ErrNoTx;\n }\n }\n}\n\n/**\n * Execute a function within a new transaction.\n *\n * Automatically commits on success or rolls back on error.\n */\nexport async function withTransaction<T>(\n conn: Connection,\n fn: (tx: Transaction) => Promise<T>,\n signal?: AbortSignal\n): Promise<T> {\n const tx = await conn.begin(signal);\n return tx.run(fn);\n}\n","/**\n * Query Result Handling\n *\n * Implements async iteration over query results with pagination.\n */\n\nimport type { ColumnInfo, Row } from './types.js';\nimport { parseRow, rowToObject } from './types.js';\nimport type { Connection } from './connection.js';\n\n/**\n * Query result with async iteration support.\n */\nexport class QueryResult implements AsyncIterable<Row> {\n private _conn: Connection;\n private _columns: ColumnInfo[];\n private _buffer: Record<string, unknown>[];\n private _final: boolean;\n private _ordered: boolean;\n private _orderKeys: string[];\n private _pageSize: number;\n private _signal?: AbortSignal;\n private _closed = false;\n private _bufferIndex = 0;\n private _rowCount = 0;\n\n constructor(\n conn: Connection,\n columns: ColumnInfo[],\n initialRows: Record<string, unknown>[],\n final: boolean,\n ordered: boolean,\n orderKeys: string[],\n pageSize: number,\n signal?: AbortSignal\n ) {\n this._conn = conn;\n this._columns = columns;\n this._buffer = initialRows;\n this._final = final;\n this._ordered = ordered;\n this._orderKeys = orderKeys;\n this._pageSize = pageSize;\n this._signal = signal;\n }\n\n /**\n * Get column definitions.\n */\n get columns(): readonly ColumnInfo[] {\n return this._columns;\n }\n\n /**\n * Get column names.\n */\n get columnNames(): string[] {\n return this._columns.map((c) => c.name);\n }\n\n /**\n * Check if results are ordered.\n */\n get ordered(): boolean {\n return this._ordered;\n }\n\n /**\n * Get order keys (if ordered).\n */\n get orderKeys(): readonly string[] {\n return this._orderKeys;\n }\n\n /**\n * Check if all results have been fetched.\n */\n get complete(): boolean {\n return this._final && this._bufferIndex >= this._buffer.length;\n }\n\n /**\n * Check if result is closed.\n */\n get isClosed(): boolean {\n return this._closed;\n }\n\n /**\n * Get the number of rows returned so far.\n */\n get rowCount(): number {\n return this._rowCount;\n }\n\n /**\n * Async iterator implementation.\n */\n async *[Symbol.asyncIterator](): AsyncIterator<Row> {\n try {\n while (!this._closed) {\n // Check signal\n if (this._signal?.aborted) {\n break;\n }\n\n // Return buffered rows\n while (this._bufferIndex < this._buffer.length) {\n const rawRow = this._buffer[this._bufferIndex];\n if (rawRow) {\n this._bufferIndex++;\n this._rowCount++;\n yield parseRow(rawRow, this._columns);\n }\n }\n\n // If final, we're done\n if (this._final) {\n break;\n }\n\n // Fetch next page\n const { rows, final } = await this._conn._fetchNextPage(this._pageSize, this._signal);\n this._buffer = rows;\n this._bufferIndex = 0;\n this._final = final;\n }\n } finally {\n this.close();\n }\n }\n\n /**\n * Get all remaining rows as an array.\n */\n async toArray(): Promise<Row[]> {\n const rows: Row[] = [];\n for await (const row of this) {\n rows.push(row);\n }\n return rows;\n }\n\n /**\n * Get all remaining rows as plain objects.\n */\n async toObjects(): Promise<Record<string, unknown>[]> {\n const rows: Record<string, unknown>[] = [];\n for await (const row of this) {\n rows.push(rowToObject(row));\n }\n return rows;\n }\n\n /**\n * Get the first row (or null if empty).\n */\n async first(): Promise<Row | null> {\n for await (const row of this) {\n this.close();\n return row;\n }\n return null;\n }\n\n /**\n * Get the first row as plain object (or null if empty).\n */\n async firstObject(): Promise<Record<string, unknown> | null> {\n const row = await this.first();\n return row ? rowToObject(row) : null;\n }\n\n /**\n * Apply a function to each row.\n */\n async forEach(fn: (row: Row, index: number) => void | Promise<void>): Promise<void> {\n let index = 0;\n for await (const row of this) {\n await fn(row, index++);\n }\n }\n\n /**\n * Map rows to a new array.\n */\n async map<T>(fn: (row: Row, index: number) => T | Promise<T>): Promise<T[]> {\n const results: T[] = [];\n let index = 0;\n for await (const row of this) {\n results.push(await fn(row, index++));\n }\n return results;\n }\n\n /**\n * Filter rows.\n */\n async filter(predicate: (row: Row, index: number) => boolean | Promise<boolean>): Promise<Row[]> {\n const results: Row[] = [];\n let index = 0;\n for await (const row of this) {\n if (await predicate(row, index++)) {\n results.push(row);\n }\n }\n return results;\n }\n\n /**\n * Reduce rows to a single value.\n */\n async reduce<T>(fn: (acc: T, row: Row, index: number) => T | Promise<T>, initial: T): Promise<T> {\n let acc = initial;\n let index = 0;\n for await (const row of this) {\n acc = await fn(acc, row, index++);\n }\n return acc;\n }\n\n /**\n * Close the result set.\n */\n close(): void {\n if (this._closed) {\n return;\n }\n this._closed = true;\n this._conn._releaseResult(this);\n }\n\n /**\n * Internal close (called by connection).\n */\n _close(): void {\n this._closed = true;\n }\n}\n\n/**\n * Iterator for synchronous access to query results.\n *\n * This wraps the async iterator for cases where results are pre-fetched.\n */\nexport class QueryResultIterator {\n private _result: QueryResult;\n private _iterator: AsyncIterator<Row>;\n\n constructor(result: QueryResult) {\n this._result = result;\n this._iterator = result[Symbol.asyncIterator]();\n }\n\n /**\n * Get the next row.\n */\n async next(): Promise<{ done: boolean; value?: Row }> {\n const result: IteratorResult<Row, void> = await this._iterator.next();\n return {\n done: result.done ?? false,\n value: result.done ? undefined : result.value,\n };\n }\n\n /**\n * Close the iterator.\n */\n close(): void {\n this._result.close();\n }\n}\n","/**\n * Connection Pool\n *\n * Manages a pool of connections for efficient resource utilization.\n */\n\nimport { Connection } from './connection.js';\nimport type { PoolConfig } from './config.js';\nimport { TransportError, ErrClosed } from './errors.js';\nimport type { QueryOptions } from './connection.js';\nimport type { QueryResult } from './result.js';\nimport { Transaction, withTransaction } from './transaction.js';\n\n/**\n * Connection wrapper for pool management.\n */\ninterface PooledConnection {\n connection: Connection;\n createdAt: number;\n lastUsedAt: number;\n inUse: boolean;\n}\n\n/**\n * Rate limiter configuration.\n */\nexport interface RateLimiterConfig {\n /** Maximum number of connection attempts per window (default: 10) */\n maxAttempts: number;\n /** Time window in milliseconds (default: 1000) */\n windowMs: number;\n /** Initial backoff delay in milliseconds (default: 100) */\n initialBackoffMs: number;\n /** Maximum backoff delay in milliseconds (default: 30000) */\n maxBackoffMs: number;\n /** Backoff multiplier (default: 2) */\n backoffMultiplier: number;\n}\n\n/**\n * Default rate limiter configuration.\n */\nconst DEFAULT_RATE_LIMITER_CONFIG: RateLimiterConfig = {\n maxAttempts: 10,\n windowMs: 1000,\n initialBackoffMs: 100,\n maxBackoffMs: 30000,\n backoffMultiplier: 2,\n};\n\n/**\n * Simple sliding window rate limiter.\n */\nclass RateLimiter {\n private _config: RateLimiterConfig;\n private _attempts: number[] = [];\n private _consecutiveFailures = 0;\n\n constructor(config: Partial<RateLimiterConfig> = {}) {\n this._config = { ...DEFAULT_RATE_LIMITER_CONFIG, ...config };\n }\n\n /**\n * Check if a new attempt is allowed.\n */\n isAllowed(): boolean {\n const now = Date.now();\n const windowStart = now - this._config.windowMs;\n\n // Remove old attempts outside the window\n this._attempts = this._attempts.filter((t) => t > windowStart);\n\n return this._attempts.length < this._config.maxAttempts;\n }\n\n /**\n * Record an attempt.\n */\n recordAttempt(): void {\n this._attempts.push(Date.now());\n }\n\n /**\n * Record a successful connection (resets backoff).\n */\n recordSuccess(): void {\n this._consecutiveFailures = 0;\n }\n\n /**\n * Record a failed connection attempt.\n */\n recordFailure(): void {\n this._consecutiveFailures++;\n }\n\n /**\n * Get the current backoff delay based on consecutive failures.\n */\n getBackoffDelay(): number {\n if (this._consecutiveFailures === 0) {\n return 0;\n }\n\n const delay =\n this._config.initialBackoffMs *\n Math.pow(this._config.backoffMultiplier, this._consecutiveFailures - 1);\n\n return Math.min(delay, this._config.maxBackoffMs);\n }\n\n /**\n * Wait for the backoff period.\n */\n async waitForBackoff(): Promise<void> {\n const delay = this.getBackoffDelay();\n if (delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n}\n\n/**\n * Connection pool for managing multiple connections.\n */\nexport class ConnectionPool {\n private _config: PoolConfig;\n private _connections: PooledConnection[] = [];\n private _waitQueue: Array<{\n resolve: (conn: Connection) => void;\n reject: (err: Error) => void;\n signal?: AbortSignal;\n }> = [];\n private _closed = false;\n private _maintenanceInterval?: NodeJS.Timeout;\n private _rateLimiter: RateLimiter;\n\n // Pool configuration with defaults\n private _minConnections: number;\n private _maxConnections: number;\n private _acquireTimeout: number;\n private _idleTimeout: number;\n\n constructor(config: PoolConfig, rateLimiterConfig?: Partial<RateLimiterConfig>) {\n this._config = config;\n this._minConnections = config.minConnections ?? 1;\n this._maxConnections = config.maxConnections ?? 3;\n this._acquireTimeout = config.acquireTimeout ?? 30000;\n this._idleTimeout = config.idleTimeout ?? 60000;\n this._rateLimiter = new RateLimiter(rateLimiterConfig);\n\n // Start maintenance interval\n this._maintenanceInterval = setInterval(() => {\n this.maintenance();\n }, 10000);\n }\n\n /**\n * Create a new connection pool.\n */\n static async create(config: PoolConfig): Promise<ConnectionPool> {\n const pool = new ConnectionPool(config);\n\n // Initialize minimum connections\n const initPromises: Promise<void>[] = [];\n for (let i = 0; i < pool._minConnections; i++) {\n initPromises.push(pool.addConnection());\n }\n\n try {\n await Promise.all(initPromises);\n } catch (e) {\n // Close any successfully created connections\n await pool.close();\n throw e;\n }\n\n return pool;\n }\n\n /**\n * Get pool statistics.\n */\n get stats(): {\n total: number;\n available: number;\n inUse: number;\n waiting: number;\n } {\n const available = this._connections.filter((c) => !c.inUse).length;\n const inUse = this._connections.filter((c) => c.inUse).length;\n\n return {\n total: this._connections.length,\n available,\n inUse,\n waiting: this._waitQueue.length,\n };\n }\n\n /**\n * Check if pool is closed.\n */\n get isClosed(): boolean {\n return this._closed;\n }\n\n /**\n * Acquire a connection from the pool.\n */\n async acquire(signal?: AbortSignal): Promise<Connection> {\n if (this._closed) {\n throw ErrClosed;\n }\n\n if (signal?.aborted) {\n throw new TransportError({ operation: 'acquire', cause: new Error('Aborted') });\n }\n\n // Try to find an available connection\n const available = this._connections.find((c) => !c.inUse && !c.connection.isClosed);\n if (available) {\n available.inUse = true;\n available.lastUsedAt = Date.now();\n return available.connection;\n }\n\n // Try to create a new connection if under max\n if (this._connections.length < this._maxConnections) {\n try {\n await this.addConnection();\n const newConn = this._connections.find((c) => !c.inUse && !c.connection.isClosed);\n if (newConn) {\n newConn.inUse = true;\n newConn.lastUsedAt = Date.now();\n return newConn.connection;\n }\n } catch {\n // Failed to create, fall through to wait\n }\n }\n\n // Wait for a connection to become available\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n const idx = this._waitQueue.findIndex((w) => w.resolve === resolve && w.reject === reject);\n if (idx !== -1) {\n this._waitQueue.splice(idx, 1);\n }\n reject(\n new TransportError({\n operation: 'acquire',\n cause: new Error('Connection pool acquire timeout'),\n })\n );\n }, this._acquireTimeout);\n\n const cleanup = () => {\n clearTimeout(timeout);\n };\n\n if (signal) {\n signal.addEventListener(\n 'abort',\n () => {\n cleanup();\n const idx = this._waitQueue.findIndex(\n (w) => w.resolve === resolve && w.reject === reject\n );\n if (idx !== -1) {\n this._waitQueue.splice(idx, 1);\n }\n reject(new TransportError({ operation: 'acquire', cause: new Error('Aborted') }));\n },\n { once: true }\n );\n }\n\n this._waitQueue.push({\n resolve: (conn) => {\n cleanup();\n resolve(conn);\n },\n reject: (err) => {\n cleanup();\n reject(err);\n },\n signal,\n });\n });\n }\n\n /**\n * Release a connection back to the pool.\n */\n async release(conn: Connection): Promise<void> {\n const pooledConn = this._connections.find((c) => c.connection === conn);\n if (!pooledConn) {\n return;\n }\n\n // Reset connection state if needed\n try {\n if (conn.inTransaction) {\n await conn.reset();\n }\n } catch {\n // Connection is bad, remove it\n await this.removeConnection(pooledConn);\n return;\n }\n\n pooledConn.inUse = false;\n pooledConn.lastUsedAt = Date.now();\n\n // Check if anyone is waiting\n const waiter = this._waitQueue.shift();\n if (waiter) {\n pooledConn.inUse = true;\n waiter.resolve(conn);\n }\n }\n\n /**\n * Execute a function with a connection from the pool.\n */\n async withConnection<T>(fn: (conn: Connection) => Promise<T>, signal?: AbortSignal): Promise<T> {\n const conn = await this.acquire(signal);\n try {\n return await fn(conn);\n } finally {\n await this.release(conn);\n }\n }\n\n /**\n * Execute a query using a pooled connection.\n */\n async query(query: string, options?: QueryOptions): Promise<QueryResult> {\n return this.withConnection((conn) => conn.query(query, options), options?.signal);\n }\n\n /**\n * Execute a query and return all rows.\n */\n async queryAll(query: string, options?: QueryOptions): Promise<Record<string, unknown>[]> {\n return this.withConnection((conn) => conn.queryAll(query, options), options?.signal);\n }\n\n /**\n * Execute a statement that doesn't return rows.\n */\n async exec(query: string, options?: QueryOptions): Promise<void> {\n return this.withConnection((conn) => conn.exec(query, options), options?.signal);\n }\n\n /**\n * Execute a function within a transaction.\n */\n async withTransaction<T>(fn: (tx: Transaction) => Promise<T>, signal?: AbortSignal): Promise<T> {\n return this.withConnection((conn) => withTransaction(conn, fn, signal), signal);\n }\n\n /**\n * Ping to verify pool health.\n */\n async ping(signal?: AbortSignal): Promise<void> {\n return this.withConnection((conn) => conn.ping(signal), signal);\n }\n\n /**\n * Close the pool and all connections.\n */\n async close(): Promise<void> {\n if (this._closed) {\n return;\n }\n\n this._closed = true;\n\n // Clear maintenance interval\n if (this._maintenanceInterval) {\n clearInterval(this._maintenanceInterval);\n this._maintenanceInterval = undefined;\n }\n\n // Reject all waiters\n for (const waiter of this._waitQueue) {\n waiter.reject(ErrClosed);\n }\n this._waitQueue = [];\n\n // Close all connections\n const closePromises = this._connections.map(async (c) => {\n try {\n await c.connection.close();\n } catch {\n // Ignore close errors\n }\n });\n\n await Promise.all(closePromises);\n this._connections = [];\n }\n\n /**\n * Add a new connection to the pool with rate limiting and exponential backoff.\n */\n private async addConnection(): Promise<void> {\n // Check rate limit\n if (!this._rateLimiter.isAllowed()) {\n throw new TransportError({\n operation: 'connect',\n cause: new Error('Connection rate limit exceeded'),\n });\n }\n\n // Wait for backoff if there were previous failures\n await this._rateLimiter.waitForBackoff();\n\n // Record the attempt\n this._rateLimiter.recordAttempt();\n\n try {\n const conn = await Connection.connect(this._config);\n this._rateLimiter.recordSuccess();\n this._connections.push({\n connection: conn,\n createdAt: Date.now(),\n lastUsedAt: Date.now(),\n inUse: false,\n });\n } catch (e) {\n this._rateLimiter.recordFailure();\n throw e;\n }\n }\n\n /**\n * Remove a connection from the pool.\n */\n private async removeConnection(pooledConn: PooledConnection): Promise<void> {\n const idx = this._connections.indexOf(pooledConn);\n if (idx !== -1) {\n this._connections.splice(idx, 1);\n }\n try {\n await pooledConn.connection.close();\n } catch {\n // Ignore close errors\n }\n }\n\n /**\n * Perform pool maintenance.\n */\n private maintenance(): void {\n if (this._closed) {\n return;\n }\n\n const now = Date.now();\n\n // Remove idle connections exceeding minimum\n const idleConnections = this._connections\n .filter((c) => !c.inUse && now - c.lastUsedAt > this._idleTimeout)\n .sort((a, b) => a.lastUsedAt - b.lastUsedAt);\n\n const toRemove = Math.max(0, idleConnections.length - this._minConnections);\n for (let i = 0; i < toRemove; i++) {\n const conn = idleConnections[i];\n if (conn) {\n this.removeConnection(conn).catch(() => {\n // Ignore removal errors\n });\n }\n }\n\n // Remove closed connections\n for (const conn of this._connections.filter((c) => c.connection.isClosed)) {\n this.removeConnection(conn).catch(() => {\n // Ignore removal errors\n });\n }\n\n // Ensure minimum connections\n const available = this._connections.filter((c) => !c.connection.isClosed).length;\n const toCreate = this._minConnections - available;\n for (let i = 0; i < toCreate; i++) {\n this.addConnection().catch(() => {\n // Ignore creation errors during maintenance\n });\n }\n }\n}\n","/**\n * Geode Client\n *\n * High-level client for interacting with Geode graph database.\n */\n\nimport { Connection, type QueryOptions, type QueryParams } from './connection.js';\nimport { ConnectionPool } from './pool.js';\nimport type { GeodeConfig, PoolConfig } from './config.js';\nimport { parseDSN } from './config.js';\nimport type { QueryResult } from './result.js';\nimport { Transaction, withTransaction } from './transaction.js';\nimport type { PreparedStatement } from './prepared.js';\nimport type { QueryPlan, QueryProfile, ExplainOptions } from './explain.js';\nimport type { BatchQuery, BatchSummary, BatchOptions } from './batch.js';\nimport type { AuthClient } from './auth.js';\nimport { validateLabel, validatePropertyName, validateRelationshipType } from './validate.js';\n\n/**\n * Client configuration options.\n */\nexport interface ClientOptions extends Partial<GeodeConfig> {\n /** Use connection pooling */\n pooling?: boolean;\n /** Pool-specific options */\n pool?: {\n min?: number;\n max?: number;\n acquireTimeout?: number;\n idleTimeout?: number;\n };\n}\n\n/**\n * Geode Client - main entry point for database operations.\n */\nexport class GeodeClient {\n private _config: GeodeConfig;\n private _pool?: ConnectionPool;\n private _connection?: Connection;\n\n private constructor(config: GeodeConfig) {\n this._config = config;\n }\n\n /**\n * Create a new client from a DSN string.\n */\n static async connect(dsn: string, options?: ClientOptions): Promise<GeodeClient> {\n const config = parseDSN(dsn);\n\n // Apply additional options\n if (options) {\n Object.assign(config, options);\n }\n\n const usePool = options?.pooling ?? true;\n const client = new GeodeClient(config);\n\n if (usePool) {\n const poolConfig: PoolConfig = {\n ...config,\n minConnections: options?.pool?.min,\n maxConnections: options?.pool?.max,\n acquireTimeout: options?.pool?.acquireTimeout,\n idleTimeout: options?.pool?.idleTimeout,\n };\n client._pool = await ConnectionPool.create(poolConfig);\n } else {\n client._connection = await Connection.connect(config);\n }\n\n return client;\n }\n\n /**\n * Create a new client from configuration.\n */\n static async connectWithConfig(\n config: GeodeConfig,\n options?: ClientOptions\n ): Promise<GeodeClient> {\n const usePool = options?.pooling ?? true;\n const client = new GeodeClient(config);\n\n if (usePool) {\n const poolConfig: PoolConfig = {\n ...config,\n minConnections: options?.pool?.min,\n maxConnections: options?.pool?.max,\n acquireTimeout: options?.pool?.acquireTimeout,\n idleTimeout: options?.pool?.idleTimeout,\n };\n client._pool = await ConnectionPool.create(poolConfig);\n } else {\n client._connection = await Connection.connect(config);\n }\n\n return client;\n }\n\n /**\n * Get the client configuration.\n */\n get config(): Readonly<GeodeConfig> {\n return this._config;\n }\n\n /**\n * Check if client is closed.\n */\n get isClosed(): boolean {\n if (this._pool) {\n return this._pool.isClosed;\n }\n return this._connection?.isClosed ?? true;\n }\n\n /**\n * Get pool statistics (if using pooling).\n */\n get poolStats(): { total: number; available: number; inUse: number; waiting: number } | null {\n return this._pool?.stats ?? null;\n }\n\n /**\n * Execute a query and return results.\n */\n async query(query: string, options?: QueryOptions): Promise<QueryResult> {\n if (this._pool) {\n return this._pool.query(query, options);\n }\n if (!this._connection) {\n throw new Error('Client is not connected');\n }\n return this._connection.query(query, options);\n }\n\n /**\n * Execute a query and return all rows as objects.\n */\n async queryAll(query: string, options?: QueryOptions): Promise<Record<string, unknown>[]> {\n if (this._pool) {\n return this._pool.queryAll(query, options);\n }\n if (!this._connection) {\n throw new Error('Client is not connected');\n }\n return this._connection.queryAll(query, options);\n }\n\n /**\n * Execute a query and return the first row.\n */\n async queryFirst(query: string, options?: QueryOptions): Promise<Record<string, unknown> | null> {\n const result = await this.query(query, options);\n return result.firstObject();\n }\n\n /**\n * Execute a query and return a scalar value.\n */\n async queryScalar<T = unknown>(\n query: string,\n column: string,\n options?: QueryOptions\n ): Promise<T | null> {\n const row = await this.queryFirst(query, options);\n if (!row) {\n return null;\n }\n return row[column] as T;\n }\n\n /**\n * Execute a statement that doesn't return rows.\n */\n async exec(query: string, options?: QueryOptions): Promise<void> {\n if (this._pool) {\n return this._pool.exec(query, options);\n }\n if (!this._connection) {\n throw new Error('Client is not connected');\n }\n return this._connection.exec(query, options);\n }\n\n /**\n * Execute multiple statements.\n */\n async execBatch(queries: Array<{ query: string; params?: QueryParams }>): Promise<void> {\n for (const q of queries) {\n await this.exec(q.query, { params: q.params });\n }\n }\n\n /**\n * Execute a function within a transaction.\n */\n async withTransaction<T>(fn: (tx: Transaction) => Promise<T>, signal?: AbortSignal): Promise<T> {\n if (this._pool) {\n return this._pool.withTransaction(fn, signal);\n }\n if (!this._connection) {\n throw new Error('Client is not connected');\n }\n return withTransaction(this._connection, fn, signal);\n }\n\n /**\n * Get a raw connection from the pool (or the single connection).\n *\n * The connection must be released after use.\n */\n async getConnection(signal?: AbortSignal): Promise<Connection> {\n if (this._pool) {\n return this._pool.acquire(signal);\n }\n if (!this._connection) {\n throw new Error('Client is not connected');\n }\n return this._connection;\n }\n\n /**\n * Release a connection back to the pool.\n *\n * Only needed when using getConnection() with pooling.\n */\n async releaseConnection(conn: Connection): Promise<void> {\n if (this._pool) {\n return this._pool.release(conn);\n }\n // No-op for single connection mode\n }\n\n /**\n * Execute a function with a dedicated connection.\n */\n async withConnection<T>(fn: (conn: Connection) => Promise<T>, signal?: AbortSignal): Promise<T> {\n if (this._pool) {\n return this._pool.withConnection(fn, signal);\n }\n if (!this._connection) {\n throw new Error('Client is not connected');\n }\n return fn(this._connection);\n }\n\n /**\n * Ping the server to check connectivity.\n */\n async ping(signal?: AbortSignal): Promise<void> {\n if (this._pool) {\n return this._pool.ping(signal);\n }\n if (!this._connection) {\n throw new Error('Client is not connected');\n }\n return this._connection.ping(signal);\n }\n\n /**\n * Close the client and release all resources.\n */\n async close(): Promise<void> {\n if (this._pool) {\n await this._pool.close();\n this._pool = undefined;\n }\n if (this._connection) {\n await this._connection.close();\n this._connection = undefined;\n }\n }\n\n // Convenience methods for common graph operations\n\n /**\n * Create a node with labels and properties.\n */\n async createNode(\n labels: string | string[],\n properties?: Record<string, unknown>\n ): Promise<Record<string, unknown>> {\n // Validate labels\n const labelArray = Array.isArray(labels) ? labels : [labels];\n for (const label of labelArray) {\n validateLabel(label);\n }\n const labelStr = labelArray.join(':');\n\n // Validate property keys if provided\n if (properties) {\n for (const key of Object.keys(properties)) {\n validatePropertyName(key);\n }\n }\n\n const propsStr = properties ? ' $props' : '';\n\n const result = await this.queryFirst(\n `CREATE (n:${labelStr}${propsStr}) RETURN n`,\n properties ? { params: { props: properties } } : undefined\n );\n\n return result?.['n'] as Record<string, unknown>;\n }\n\n /**\n * Find nodes by label and optional property filter.\n */\n async findNodes(\n label: string,\n filter?: Record<string, unknown>,\n options?: { limit?: number; skip?: number }\n ): Promise<Record<string, unknown>[]> {\n // Validate label\n validateLabel(label);\n\n // Validate filter property keys\n if (filter) {\n for (const key of Object.keys(filter)) {\n validatePropertyName(key);\n }\n }\n\n let query = `MATCH (n:${label})`;\n\n if (filter && Object.keys(filter).length > 0) {\n const conditions = Object.keys(filter)\n .map((k) => `n.${k} = $${k}`)\n .join(' AND ');\n query += ` WHERE ${conditions}`;\n }\n\n query += ' RETURN n';\n\n if (options?.skip) {\n query += ` SKIP ${options.skip}`;\n }\n if (options?.limit) {\n query += ` LIMIT ${options.limit}`;\n }\n\n const rows = await this.queryAll(query, { params: filter });\n return rows.map((r) => r['n'] as Record<string, unknown>);\n }\n\n /**\n * Find a single node by label and property.\n */\n async findNode(\n label: string,\n property: string,\n value: unknown\n ): Promise<Record<string, unknown> | null> {\n // Validation happens in findNodes, but validate property here for better error messages\n validatePropertyName(property);\n const rows = await this.findNodes(label, { [property]: value }, { limit: 1 });\n return rows[0] ?? null;\n }\n\n /**\n * Create a relationship between two nodes.\n */\n async createRelationship(\n startLabel: string,\n startProp: string,\n startValue: unknown,\n type: string,\n endLabel: string,\n endProp: string,\n endValue: unknown,\n properties?: Record<string, unknown>\n ): Promise<Record<string, unknown>> {\n // Validate all identifiers\n validateLabel(startLabel);\n validateLabel(endLabel);\n validateRelationshipType(type);\n validatePropertyName(startProp);\n validatePropertyName(endProp);\n\n // Validate property keys if provided\n if (properties) {\n for (const key of Object.keys(properties)) {\n validatePropertyName(key);\n }\n }\n\n const propsStr = properties ? ' $props' : '';\n\n const result = await this.queryFirst(\n `MATCH (a:${startLabel}), (b:${endLabel})\n WHERE a.${startProp} = $startValue AND b.${endProp} = $endValue\n CREATE (a)-[r:${type}${propsStr}]->(b)\n RETURN r`,\n {\n params: {\n startValue,\n endValue,\n ...(properties ? { props: properties } : {}),\n },\n }\n );\n\n return result?.['r'] as Record<string, unknown>;\n }\n\n /**\n * Delete a node by label and property.\n */\n async deleteNode(label: string, property: string, value: unknown): Promise<number> {\n // Validate identifiers\n validateLabel(label);\n validatePropertyName(property);\n\n const result = await this.queryFirst(\n `MATCH (n:${label}) WHERE n.${property} = $value DETACH DELETE n RETURN count(n) AS deleted`,\n { params: { value } }\n );\n return (result?.['deleted'] as number) ?? 0;\n }\n\n /**\n * Update node properties.\n */\n async updateNode(\n label: string,\n matchProp: string,\n matchValue: unknown,\n updates: Record<string, unknown>\n ): Promise<Record<string, unknown> | null> {\n // Validate identifiers\n validateLabel(label);\n validatePropertyName(matchProp);\n\n // Validate update property keys\n for (const key of Object.keys(updates)) {\n validatePropertyName(key);\n }\n\n const setStatements = Object.keys(updates)\n .map((k) => `n.${k} = $${k}`)\n .join(', ');\n\n const result = await this.queryFirst(\n `MATCH (n:${label}) WHERE n.${matchProp} = $matchValue SET ${setStatements} RETURN n`,\n { params: { matchValue, ...updates } }\n );\n\n return result?.['n'] as Record<string, unknown> | null;\n }\n\n /**\n * Count nodes by label.\n */\n async countNodes(label: string, filter?: Record<string, unknown>): Promise<number> {\n // Validate label\n validateLabel(label);\n\n // Validate filter property keys\n if (filter) {\n for (const key of Object.keys(filter)) {\n validatePropertyName(key);\n }\n }\n\n let query = `MATCH (n:${label})`;\n\n if (filter && Object.keys(filter).length > 0) {\n const conditions = Object.keys(filter)\n .map((k) => `n.${k} = $${k}`)\n .join(' AND ');\n query += ` WHERE ${conditions}`;\n }\n\n query += ' RETURN count(n) AS count';\n\n const result = await this.queryFirst(query, { params: filter });\n return (result?.['count'] as number) ?? 0;\n }\n\n // Advanced operations\n\n /**\n * Create a prepared statement.\n *\n * @param query - Query text with parameters\n * @returns Prepared statement\n *\n * @example\n * ```typescript\n * const stmt = client.prepare('MATCH (n:Person {name: $name}) RETURN n');\n * const result1 = await stmt.query({ name: 'Alice' });\n * const result2 = await stmt.query({ name: 'Bob' });\n * stmt.close();\n * ```\n */\n async prepare(query: string): Promise<PreparedStatement> {\n const conn = await this.getConnection();\n try {\n return conn.prepare(query);\n } finally {\n await this.releaseConnection(conn);\n }\n }\n\n /**\n * Get the query execution plan without executing.\n *\n * @param query - Query to explain\n * @param options - Options including parameters\n * @returns Query execution plan\n *\n * @example\n * ```typescript\n * const plan = await client.explain('MATCH (n:Person)-[:KNOWS]->(m) RETURN n, m');\n * console.log('Estimated cost:', plan.totalCost);\n * ```\n */\n async explain(query: string, options?: ExplainOptions): Promise<QueryPlan> {\n const conn = await this.getConnection(options?.signal);\n try {\n return await conn.explain(query, options);\n } finally {\n await this.releaseConnection(conn);\n }\n }\n\n /**\n * Execute a query with profiling.\n *\n * @param query - Query to profile\n * @param options - Options including parameters\n * @returns Query execution profile\n *\n * @example\n * ```typescript\n * const profile = await client.profile('MATCH (n:Person) RETURN count(n)');\n * console.log('Execution time:', profile.totalTimeMs, 'ms');\n * ```\n */\n async profile(query: string, options?: ExplainOptions): Promise<QueryProfile> {\n const conn = await this.getConnection(options?.signal);\n try {\n return await conn.profile(query, options);\n } finally {\n await this.releaseConnection(conn);\n }\n }\n\n /**\n * Execute multiple queries in a batch.\n *\n * @param queries - Array of queries to execute\n * @param options - Batch execution options\n * @returns Batch execution summary\n *\n * @example\n * ```typescript\n * const summary = await client.batch([\n * { query: 'CREATE (a:Person {name: \"Alice\"})' },\n * { query: 'CREATE (b:Person {name: \"Bob\"})' },\n * ]);\n * console.log(`${summary.successful}/${summary.total} succeeded`);\n * ```\n */\n async batch(queries: BatchQuery[], options?: BatchOptions): Promise<BatchSummary> {\n const conn = await this.getConnection(options?.signal);\n try {\n return await conn.batch(queries, options);\n } finally {\n await this.releaseConnection(conn);\n }\n }\n\n /**\n * Get an auth client for user and role management.\n *\n * @returns Auth client\n *\n * @example\n * ```typescript\n * const auth = await client.auth();\n * await auth.createUser('alice', { password: 'secret123' });\n * await auth.assignRole('alice', 'analyst');\n * ```\n */\n async auth(): Promise<AuthClient> {\n const { AuthClient } = await import('./auth.js');\n const conn = await this.getConnection();\n return new AuthClient(conn);\n }\n}\n\n/**\n * Create a Geode client from a DSN string.\n *\n * @example\n * ```typescript\n * const client = await createClient('quic://localhost:3141');\n * const rows = await client.queryAll('MATCH (n) RETURN n LIMIT 10');\n * await client.close();\n * ```\n */\nexport async function createClient(dsn: string, options?: ClientOptions): Promise<GeodeClient> {\n return GeodeClient.connect(dsn, options);\n}\n\n/**\n * Create a Geode client from configuration.\n */\nexport async function createClientWithConfig(\n config: GeodeConfig,\n options?: ClientOptions\n): Promise<GeodeClient> {\n return GeodeClient.connectWithConfig(config, options);\n}\n","/**\n * Geode Client for Node.js\n *\n * A high-performance client library for the Geode graph database,\n * implementing ISO/IEC 39075:2024 GQL standard over QUIC + TLS 1.3 or gRPC.\n *\n * @packageDocumentation\n */\n\n// Main client exports\nexport { GeodeClient, createClient, createClientWithConfig, type ClientOptions } from './client.js';\n\n// Connection management\nexport { Connection, type QueryOptions, type QueryParams } from './connection.js';\nexport { ConnectionPool } from './pool.js';\n\n// Configuration\nexport {\n type GeodeConfig,\n type PoolConfig,\n type TransportType,\n type DSNScheme,\n parseDSN,\n defaultConfig,\n validateConfig,\n getAddress,\n cloneConfig,\n redactDSN,\n redactConfig,\n DEFAULT_PORT,\n DEFAULT_GRPC_PORT,\n DEFAULT_PAGE_SIZE,\n DEFAULT_HELLO_NAME,\n DEFAULT_HELLO_VERSION,\n DEFAULT_CONFORMANCE,\n MAX_QUERY_LENGTH,\n MAX_PAGE_SIZE,\n SUPPORTED_SCHEMES,\n} from './config.js';\n\n// Query results\nexport { QueryResult, QueryResultIterator } from './result.js';\n\n// Transactions\nexport { Transaction, withTransaction } from './transaction.js';\n\n// Types\nexport {\n type GQLValueKind,\n type GQLType,\n type GQLRange,\n type GQLId,\n type GQLNode,\n type GQLEdge,\n type RawEdge,\n type GQLPath,\n GQLValue,\n parseGQLType,\n fromJSON,\n type ColumnDef,\n type ColumnInfo,\n type Row,\n parseRow,\n rowToObject,\n} from './types.js';\n\n// Errors\nexport {\n type GeodeError,\n DriverError,\n TransportError,\n ConfigError,\n SecurityError,\n StateError,\n type ConnectionState,\n StatusClass,\n type StatusClassType,\n ErrClosed,\n ErrQueryInProgress,\n ErrTxInProgress,\n ErrNoTx,\n ErrTxDone,\n ErrRowsClosed,\n ErrBadConn,\n isDriverError,\n isGeodeError,\n isRetryableError,\n} from './errors.js';\n\n// Transport (for advanced usage and testing)\nexport {\n type Transport,\n BaseTransport,\n QuicTransport,\n QuicheTransport,\n MockTransport,\n createTransport,\n buildTLSConfig,\n} from './transport.js';\n\n// gRPC Transport\nexport { GrpcTransport } from './grpc-transport.js';\n\n// Validation\nexport {\n validateQuery,\n validateParamName,\n validateParamValue,\n validateHostname,\n validatePort,\n validatePageSize,\n validateSavepointName,\n sanitizeForLog,\n} from './validate.js';\n\n// Query Builder\nexport {\n QueryBuilder,\n PatternBuilder,\n PredicateBuilder,\n NodePatternBuilder,\n EdgePatternBuilder,\n query,\n pattern,\n predicate,\n node,\n edge,\n type EdgeDirection,\n type SortDirection,\n type PredicateOp,\n type NodePattern,\n type EdgePattern,\n type PatternElement,\n} from './query-builder.js';\n\n// Prepared Statements\nexport { PreparedStatement, prepare, extractParameters, type ParameterInfo } from './prepared.js';\n\n// Query Explain/Profile\nexport {\n explain,\n profile,\n formatPlan,\n formatProfile,\n type QueryPlan,\n type QueryProfile,\n type PlanOperation,\n type OperationTiming,\n type ExplainOptions,\n} from './explain.js';\n\n// Batch Operations\nexport {\n batch,\n batchAll,\n batchFirst,\n batchMap,\n batchParallel,\n type BatchQuery,\n type BatchResult,\n type BatchSummary,\n type BatchOptions,\n} from './batch.js';\n\n// Authentication & Authorization\nexport {\n AuthClient,\n createAuthClient,\n type User,\n type Role,\n type Permission,\n type RLSPolicy,\n type CreateUserOptions,\n type CreateRoleOptions,\n type CreateRLSPolicyOptions,\n} from './auth.js';\n\n// Protobuf wire protocol (for advanced usage)\nexport {\n encodeWithLengthPrefix,\n encodeQuicClientMessage,\n decodeQuicServerMessage,\n decodeLengthPrefix,\n protoValueToJS,\n jsToProtoValue,\n buildHelloRequest,\n buildExecuteRequest,\n buildPullRequest,\n buildPingRequest,\n buildBeginRequest,\n buildCommitRequest,\n buildRollbackRequest,\n buildSavepointRequest,\n buildRollbackToRequest,\n rowToRecord,\n getProtoPath,\n ensureProtoInitialized,\n type HelloRequest,\n type HelloResponse,\n type ExecuteRequest,\n type ExecutionResponse,\n type SchemaDefinition,\n type ColumnDefinition,\n type DataPage,\n type Row as ProtoRow,\n type ProtoValue,\n type ProtoError,\n type PingRequest,\n type PingResponse,\n type BeginRequest,\n type BeginResponse,\n type CommitRequest,\n type CommitResponse,\n type RollbackRequest,\n type RollbackResponse,\n type QuicClientMessage,\n type QuicServerMessage,\n type Param,\n type PullRequest,\n type PullResponse,\n type Status,\n} from './proto.js';\n\n// Re-export decimal.js-light for type convenience\nexport type { default as Decimal } from 'decimal.js-light';\n","/**\n * Query Builder\n *\n * Fluent API for building GQL queries programmatically.\n */\n\nimport type { QueryParams } from './connection.js';\nimport {\n validateLabel,\n validateRelationshipType,\n validatePropertyName,\n validateVariableName,\n} from './validate.js';\n\n/**\n * Edge direction for pattern matching.\n */\nexport type EdgeDirection = 'outgoing' | 'incoming' | 'both';\n\n/**\n * Sort direction.\n */\nexport type SortDirection = 'ASC' | 'DESC';\n\n/**\n * Predicate operator.\n */\nexport type PredicateOp =\n | '='\n | '<>'\n | '!='\n | '<'\n | '<='\n | '>'\n | '>='\n | 'IN'\n | 'NOT IN'\n | 'CONTAINS'\n | 'STARTS WITH'\n | 'ENDS WITH'\n | 'IS NULL'\n | 'IS NOT NULL';\n\n/**\n * Node pattern for MATCH clauses.\n */\nexport interface NodePattern {\n variable?: string;\n labels?: string[];\n properties?: Record<string, unknown>;\n}\n\n/**\n * Edge pattern for MATCH clauses.\n */\nexport interface EdgePattern {\n variable?: string;\n type?: string;\n direction: EdgeDirection;\n properties?: Record<string, unknown>;\n minHops?: number;\n maxHops?: number;\n}\n\n/**\n * Pattern element (node or edge).\n */\nexport type PatternElement =\n | { kind: 'node'; pattern: NodePattern }\n | { kind: 'edge'; pattern: EdgePattern };\n\n/**\n * Build a node pattern.\n */\nexport class NodePatternBuilder {\n private _variable?: string;\n private _labels: string[] = [];\n private _properties: Record<string, unknown> = {};\n\n /**\n * Set the variable name.\n */\n as(variable: string): this {\n validateVariableName(variable);\n this._variable = variable;\n return this;\n }\n\n /**\n * Add a label.\n */\n label(label: string): this {\n validateLabel(label);\n this._labels.push(label);\n return this;\n }\n\n /**\n * Add multiple labels.\n */\n labels(...labels: string[]): this {\n for (const l of labels) {\n validateLabel(l);\n }\n this._labels.push(...labels);\n return this;\n }\n\n /**\n * Set a property.\n */\n prop(key: string, value: unknown): this {\n validatePropertyName(key);\n this._properties[key] = value;\n return this;\n }\n\n /**\n * Set multiple properties.\n */\n props(properties: Record<string, unknown>): this {\n for (const key of Object.keys(properties)) {\n validatePropertyName(key);\n }\n Object.assign(this._properties, properties);\n return this;\n }\n\n /**\n * Build the pattern.\n */\n build(): NodePattern {\n return {\n variable: this._variable,\n labels: this._labels.length > 0 ? this._labels : undefined,\n properties: Object.keys(this._properties).length > 0 ? this._properties : undefined,\n };\n }\n\n /**\n * Convert to GQL string.\n */\n toGQL(): string {\n let result = '(';\n\n if (this._variable) {\n result += this._variable;\n }\n\n if (this._labels.length > 0) {\n result += ':' + this._labels.join(':');\n }\n\n if (Object.keys(this._properties).length > 0) {\n result += ' ' + propsToGQL(this._properties);\n }\n\n return result + ')';\n }\n}\n\n/**\n * Build an edge pattern.\n */\nexport class EdgePatternBuilder {\n private _variable?: string;\n private _type?: string;\n private _direction: EdgeDirection = 'outgoing';\n private _properties: Record<string, unknown> = {};\n private _minHops?: number;\n private _maxHops?: number;\n\n /**\n * Set the variable name.\n */\n as(variable: string): this {\n validateVariableName(variable);\n this._variable = variable;\n return this;\n }\n\n /**\n * Set the relationship type.\n */\n type(type: string): this {\n validateRelationshipType(type);\n this._type = type;\n return this;\n }\n\n /**\n * Set outgoing direction.\n */\n outgoing(): this {\n this._direction = 'outgoing';\n return this;\n }\n\n /**\n * Set incoming direction.\n */\n incoming(): this {\n this._direction = 'incoming';\n return this;\n }\n\n /**\n * Set bidirectional.\n */\n both(): this {\n this._direction = 'both';\n return this;\n }\n\n /**\n * Set direction.\n */\n direction(dir: EdgeDirection): this {\n this._direction = dir;\n return this;\n }\n\n /**\n * Set a property.\n */\n prop(key: string, value: unknown): this {\n validatePropertyName(key);\n this._properties[key] = value;\n return this;\n }\n\n /**\n * Set multiple properties.\n */\n props(properties: Record<string, unknown>): this {\n for (const key of Object.keys(properties)) {\n validatePropertyName(key);\n }\n Object.assign(this._properties, properties);\n return this;\n }\n\n /**\n * Set variable length path.\n */\n hops(min?: number, max?: number): this {\n this._minHops = min;\n this._maxHops = max;\n return this;\n }\n\n /**\n * Build the pattern.\n */\n build(): EdgePattern {\n return {\n variable: this._variable,\n type: this._type,\n direction: this._direction,\n properties: Object.keys(this._properties).length > 0 ? this._properties : undefined,\n minHops: this._minHops,\n maxHops: this._maxHops,\n };\n }\n\n /**\n * Convert to GQL string.\n */\n toGQL(): string {\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n const hasContent = this._variable || this._type || Object.keys(this._properties).length > 0;\n\n let inner = '';\n if (hasContent) {\n inner = '[';\n if (this._variable) {\n inner += this._variable;\n }\n if (this._type) {\n inner += ':' + this._type;\n }\n if (this._minHops !== undefined || this._maxHops !== undefined) {\n inner += '*';\n if (this._minHops !== undefined) {\n inner += this._minHops;\n }\n inner += '..';\n if (this._maxHops !== undefined) {\n inner += this._maxHops;\n }\n }\n if (Object.keys(this._properties).length > 0) {\n inner += ' ' + propsToGQL(this._properties);\n }\n inner += ']';\n }\n\n switch (this._direction) {\n case 'outgoing':\n return `-${inner}->`;\n case 'incoming':\n return `<-${inner}-`;\n case 'both':\n return `-${inner}-`;\n }\n }\n}\n\n/**\n * Build a path pattern.\n */\nexport class PatternBuilder {\n private _elements: PatternElement[] = [];\n\n /**\n * Add a node to the pattern.\n */\n node(builder?: (n: NodePatternBuilder) => void): this {\n const nodeBuilder = new NodePatternBuilder();\n if (builder) {\n builder(nodeBuilder);\n }\n this._elements.push({ kind: 'node', pattern: nodeBuilder.build() });\n return this;\n }\n\n /**\n * Add an outgoing edge to the pattern.\n */\n outgoing(builder?: (e: EdgePatternBuilder) => void): this {\n const edgeBuilder = new EdgePatternBuilder().outgoing();\n if (builder) {\n builder(edgeBuilder);\n }\n this._elements.push({ kind: 'edge', pattern: edgeBuilder.build() });\n return this;\n }\n\n /**\n * Add an incoming edge to the pattern.\n */\n incoming(builder?: (e: EdgePatternBuilder) => void): this {\n const edgeBuilder = new EdgePatternBuilder().incoming();\n if (builder) {\n builder(edgeBuilder);\n }\n this._elements.push({ kind: 'edge', pattern: edgeBuilder.build() });\n return this;\n }\n\n /**\n * Add a bidirectional edge to the pattern.\n */\n related(builder?: (e: EdgePatternBuilder) => void): this {\n const edgeBuilder = new EdgePatternBuilder().both();\n if (builder) {\n builder(edgeBuilder);\n }\n this._elements.push({ kind: 'edge', pattern: edgeBuilder.build() });\n return this;\n }\n\n /**\n * Convert to GQL string.\n */\n toGQL(): string {\n let result = '';\n for (const element of this._elements) {\n if (element.kind === 'node') {\n result += nodePatternToGQL(element.pattern);\n } else {\n result += edgePatternToGQL(element.pattern);\n }\n }\n return result;\n }\n}\n\n/**\n * Build a predicate for WHERE clauses.\n */\nexport class PredicateBuilder {\n private _predicates: string[] = [];\n private _params: QueryParams = {};\n private _paramCounter = 0;\n\n /**\n * Add a comparison predicate.\n */\n compare(left: string, op: PredicateOp, right: unknown): this {\n if (op === 'IS NULL') {\n this._predicates.push(`${left} IS NULL`);\n } else if (op === 'IS NOT NULL') {\n this._predicates.push(`${left} IS NOT NULL`);\n } else {\n const paramName = this.nextParam();\n this._predicates.push(`${left} ${op} $${paramName}`);\n this._params[paramName] = right;\n }\n return this;\n }\n\n /**\n * Add an equality predicate.\n */\n eq(left: string, right: unknown): this {\n return this.compare(left, '=', right);\n }\n\n /**\n * Add a not-equal predicate.\n */\n neq(left: string, right: unknown): this {\n return this.compare(left, '<>', right);\n }\n\n /**\n * Add a less-than predicate.\n */\n lt(left: string, right: unknown): this {\n return this.compare(left, '<', right);\n }\n\n /**\n * Add a less-than-or-equal predicate.\n */\n lte(left: string, right: unknown): this {\n return this.compare(left, '<=', right);\n }\n\n /**\n * Add a greater-than predicate.\n */\n gt(left: string, right: unknown): this {\n return this.compare(left, '>', right);\n }\n\n /**\n * Add a greater-than-or-equal predicate.\n */\n gte(left: string, right: unknown): this {\n return this.compare(left, '>=', right);\n }\n\n /**\n * Add an IN predicate.\n */\n in(left: string, values: unknown[]): this {\n const paramName = this.nextParam();\n this._predicates.push(`${left} IN $${paramName}`);\n this._params[paramName] = values;\n return this;\n }\n\n /**\n * Add a NOT IN predicate.\n */\n notIn(left: string, values: unknown[]): this {\n const paramName = this.nextParam();\n this._predicates.push(`${left} NOT IN $${paramName}`);\n this._params[paramName] = values;\n return this;\n }\n\n /**\n * Add a CONTAINS predicate.\n */\n contains(left: string, value: string): this {\n return this.compare(left, 'CONTAINS', value);\n }\n\n /**\n * Add a STARTS WITH predicate.\n */\n startsWith(left: string, value: string): this {\n return this.compare(left, 'STARTS WITH', value);\n }\n\n /**\n * Add an ENDS WITH predicate.\n */\n endsWith(left: string, value: string): this {\n return this.compare(left, 'ENDS WITH', value);\n }\n\n /**\n * Add an IS NULL predicate.\n */\n isNull(expr: string): this {\n return this.compare(expr, 'IS NULL', null);\n }\n\n /**\n * Add an IS NOT NULL predicate.\n */\n isNotNull(expr: string): this {\n return this.compare(expr, 'IS NOT NULL', null);\n }\n\n /**\n * Add a raw predicate expression.\n *\n * **⚠️ SECURITY WARNING: This method bypasses all input validation.**\n *\n * Using raw() with user-supplied input can lead to GQL injection attacks.\n * Only use this method when:\n * 1. The expression is entirely constructed from trusted, hardcoded strings\n * 2. All dynamic values are passed via the `params` argument (using $paramName syntax)\n *\n * @example\n * ```typescript\n * // SAFE: Using parameters for dynamic values\n * predicate().raw('n.custom_field CONTAINS $pattern', { pattern: userInput })\n *\n * // UNSAFE: Never interpolate user input directly\n * predicate().raw(`n.name = '${userInput}'`) // VULNERABLE TO INJECTION!\n * ```\n *\n * Consider using the typed predicate methods (eq, gt, contains, etc.) instead.\n *\n * @param expr - Raw predicate expression (MUST be trusted input)\n * @param params - Parameters to bind (safe for user input)\n * @deprecated Consider using typed predicate methods instead for better security.\n */\n raw(expr: string, params?: QueryParams): this {\n this._predicates.push(expr);\n if (params) {\n Object.assign(this._params, params);\n }\n return this;\n }\n\n /**\n * Combine predicates with AND.\n */\n and(builder: PredicateBuilder): this {\n const sub = builder.build();\n if (sub.predicate) {\n this._predicates.push(`(${sub.predicate})`);\n Object.assign(this._params, sub.params);\n }\n return this;\n }\n\n /**\n * Combine predicates with OR.\n */\n or(builder: PredicateBuilder): this {\n const sub = builder.build();\n if (sub.predicate) {\n if (this._predicates.length > 0) {\n const current = this._predicates.join(' AND ');\n this._predicates = [`(${current}) OR (${sub.predicate})`];\n } else {\n this._predicates.push(sub.predicate);\n }\n Object.assign(this._params, sub.params);\n }\n return this;\n }\n\n /**\n * Build the predicate.\n */\n build(): { predicate: string; params: QueryParams } {\n return {\n predicate: this._predicates.join(' AND '),\n params: this._params,\n };\n }\n\n private nextParam(): string {\n return `pred_${++this._paramCounter}`;\n }\n}\n\n/**\n * GQL Query Builder.\n */\nexport class QueryBuilder {\n private _clauses: string[] = [];\n private _params: QueryParams = {};\n\n /**\n * Add a MATCH clause.\n */\n match(pattern: string | PatternBuilder): this {\n const p = typeof pattern === 'string' ? pattern : pattern.toGQL();\n this._clauses.push(`MATCH ${p}`);\n return this;\n }\n\n /**\n * Add an OPTIONAL MATCH clause.\n */\n optionalMatch(pattern: string | PatternBuilder): this {\n const p = typeof pattern === 'string' ? pattern : pattern.toGQL();\n this._clauses.push(`OPTIONAL MATCH ${p}`);\n return this;\n }\n\n /**\n * Add a WHERE clause.\n *\n * **⚠️ SECURITY WARNING when using string predicates:**\n *\n * When passing a string predicate, this method does NOT validate or sanitize input.\n * Using string predicates with user-supplied data can lead to GQL injection attacks.\n *\n * @example\n * ```typescript\n * // RECOMMENDED: Use PredicateBuilder for type-safe, injection-resistant queries\n * query().where(predicate().eq('n.name', userInput))\n *\n * // SAFE: Using parameters with string predicates\n * query().where('n.name = $name', { name: userInput })\n *\n * // UNSAFE: Never interpolate user input directly in string predicates\n * query().where(`n.name = '${userInput}'`) // VULNERABLE TO INJECTION!\n * ```\n *\n * @param predicate - A PredicateBuilder (recommended) or raw predicate string\n * @param params - Parameters to bind when using string predicates\n */\n where(predicate: string | PredicateBuilder, params?: QueryParams): this {\n if (typeof predicate === 'string') {\n this._clauses.push(`WHERE ${predicate}`);\n if (params) {\n Object.assign(this._params, params);\n }\n } else {\n const built = predicate.build();\n this._clauses.push(`WHERE ${built.predicate}`);\n Object.assign(this._params, built.params);\n }\n return this;\n }\n\n /**\n * Add a WITH clause.\n */\n with(...expressions: string[]): this {\n this._clauses.push(`WITH ${expressions.join(', ')}`);\n return this;\n }\n\n /**\n * Add a RETURN clause.\n */\n return(...expressions: string[]): this {\n this._clauses.push(`RETURN ${expressions.join(', ')}`);\n return this;\n }\n\n /**\n * Add RETURN DISTINCT.\n */\n returnDistinct(...expressions: string[]): this {\n this._clauses.push(`RETURN DISTINCT ${expressions.join(', ')}`);\n return this;\n }\n\n /**\n * Add an ORDER BY clause.\n */\n orderBy(...expressions: Array<string | [string, SortDirection]>): this {\n const parts = expressions.map((e) => {\n if (typeof e === 'string') {\n return e;\n }\n return `${e[0]} ${e[1]}`;\n });\n this._clauses.push(`ORDER BY ${parts.join(', ')}`);\n return this;\n }\n\n /**\n * Add a SKIP clause.\n */\n skip(count: number): this {\n this._clauses.push(`SKIP ${count}`);\n return this;\n }\n\n /**\n * Add a LIMIT clause.\n */\n limit(count: number): this {\n this._clauses.push(`LIMIT ${count}`);\n return this;\n }\n\n /**\n * Add a CREATE clause.\n */\n create(pattern: string | PatternBuilder): this {\n const p = typeof pattern === 'string' ? pattern : pattern.toGQL();\n this._clauses.push(`CREATE ${p}`);\n return this;\n }\n\n /**\n * Add a MERGE clause.\n */\n merge(pattern: string | PatternBuilder): this {\n const p = typeof pattern === 'string' ? pattern : pattern.toGQL();\n this._clauses.push(`MERGE ${p}`);\n return this;\n }\n\n /**\n * Add a DELETE clause.\n */\n delete(...variables: string[]): this {\n this._clauses.push(`DELETE ${variables.join(', ')}`);\n return this;\n }\n\n /**\n * Add a DETACH DELETE clause.\n */\n detachDelete(...variables: string[]): this {\n this._clauses.push(`DETACH DELETE ${variables.join(', ')}`);\n return this;\n }\n\n /**\n * Add a SET clause.\n */\n set(...assignments: string[]): this {\n this._clauses.push(`SET ${assignments.join(', ')}`);\n return this;\n }\n\n /**\n * Add a REMOVE clause.\n */\n remove(...items: string[]): this {\n this._clauses.push(`REMOVE ${items.join(', ')}`);\n return this;\n }\n\n /**\n * Add a raw GQL clause.\n *\n * **⚠️ SECURITY WARNING: This method bypasses all input validation.**\n *\n * Using raw() with user-supplied input can lead to GQL injection attacks.\n * Only use this method when:\n * 1. The clause is entirely constructed from trusted, hardcoded strings\n * 2. All dynamic values are passed via the `params` argument (using $paramName syntax)\n *\n * @example\n * ```typescript\n * // SAFE: Using parameters for dynamic values\n * query().raw('CALL db.index.fulltext.queryNodes(\"idx\", $term)', { term: userInput })\n *\n * // UNSAFE: Never interpolate user input directly\n * query().raw(`MATCH (n:${userLabel})`) // VULNERABLE TO INJECTION!\n * ```\n *\n * Consider using the typed query builder methods instead.\n *\n * @param clause - Raw GQL clause (MUST be trusted input)\n * @param params - Parameters to bind (safe for user input)\n * @deprecated Consider using typed query builder methods instead for better security.\n */\n raw(clause: string, params?: QueryParams): this {\n this._clauses.push(clause);\n if (params) {\n Object.assign(this._params, params);\n }\n return this;\n }\n\n /**\n * Add a parameter.\n */\n param(name: string, value: unknown): this {\n this._params[name] = value;\n return this;\n }\n\n /**\n * Add multiple parameters.\n */\n params(params: QueryParams): this {\n Object.assign(this._params, params);\n return this;\n }\n\n /**\n * Build the query string.\n */\n build(): { query: string; params: QueryParams } {\n return {\n query: this._clauses.join('\\n'),\n params: this._params,\n };\n }\n\n /**\n * Get the query string.\n */\n toGQL(): string {\n return this._clauses.join('\\n');\n }\n\n /**\n * Get the parameters.\n */\n getParams(): QueryParams {\n return { ...this._params };\n }\n}\n\n// Helper functions\n\nfunction propsToGQL(props: Record<string, unknown>): string {\n const entries = Object.entries(props).map(([k, v]) => `${k}: ${valueToGQL(v)}`);\n return `{${entries.join(', ')}}`;\n}\n\nfunction valueToGQL(value: unknown): string {\n if (value === null || value === undefined) {\n return 'null';\n }\n if (typeof value === 'string') {\n // Escape backslashes first, then single quotes\n // This prevents escape sequence injection where \\' becomes \\\\' (escaped backslash + quote)\n return `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map(valueToGQL).join(', ')}]`;\n }\n if (typeof value === 'object') {\n return propsToGQL(value as Record<string, unknown>);\n }\n // At this point, value is a primitive (bigint, symbol, etc.) - safe to stringify\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n return String(value);\n}\n\nfunction nodePatternToGQL(pattern: NodePattern): string {\n let result = '(';\n\n if (pattern.variable) {\n result += pattern.variable;\n }\n\n if (pattern.labels && pattern.labels.length > 0) {\n result += ':' + pattern.labels.join(':');\n }\n\n if (pattern.properties && Object.keys(pattern.properties).length > 0) {\n result += ' ' + propsToGQL(pattern.properties);\n }\n\n return result + ')';\n}\n\nfunction edgePatternToGQL(pattern: EdgePattern): string {\n /* eslint-disable @typescript-eslint/prefer-nullish-coalescing */\n const hasContent =\n pattern.variable ||\n pattern.type ||\n (pattern.properties && Object.keys(pattern.properties).length > 0);\n /* eslint-enable @typescript-eslint/prefer-nullish-coalescing */\n\n let inner = '';\n if (hasContent) {\n inner = '[';\n if (pattern.variable) {\n inner += pattern.variable;\n }\n if (pattern.type) {\n inner += ':' + pattern.type;\n }\n if (pattern.minHops !== undefined || pattern.maxHops !== undefined) {\n inner += '*';\n if (pattern.minHops !== undefined) {\n inner += pattern.minHops;\n }\n inner += '..';\n if (pattern.maxHops !== undefined) {\n inner += pattern.maxHops;\n }\n }\n if (pattern.properties && Object.keys(pattern.properties).length > 0) {\n inner += ' ' + propsToGQL(pattern.properties);\n }\n inner += ']';\n }\n\n switch (pattern.direction) {\n case 'outgoing':\n return `-${inner}->`;\n case 'incoming':\n return `<-${inner}-`;\n case 'both':\n return `-${inner}-`;\n }\n}\n\n// Factory functions\n\n/**\n * Create a new QueryBuilder.\n */\nexport function query(): QueryBuilder {\n return new QueryBuilder();\n}\n\n/**\n * Create a new PatternBuilder.\n */\nexport function pattern(): PatternBuilder {\n return new PatternBuilder();\n}\n\n/**\n * Create a new PredicateBuilder.\n */\nexport function predicate(): PredicateBuilder {\n return new PredicateBuilder();\n}\n\n/**\n * Create a new NodePatternBuilder.\n */\nexport function node(): NodePatternBuilder {\n return new NodePatternBuilder();\n}\n\n/**\n * Create a new EdgePatternBuilder.\n */\nexport function edge(): EdgePatternBuilder {\n return new EdgePatternBuilder();\n}\n"]}
|