@geodedb/client 1.0.0-alpha.11
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/LICENSE +201 -0
- package/README.md +594 -0
- package/dist/index.d.mts +2430 -0
- package/dist/index.d.ts +2430 -0
- package/dist/index.js +5202 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +5101 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/config.ts","../src/types.ts","../src/protocol.ts","../src/validate.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":["DriverError","TransportError","ConfigError","SecurityError","StateError","StatusClass","ErrClosed","ErrQueryInProgress","ErrTxInProgress","ErrNoTx","ErrTxDone","ErrRowsClosed","ErrBadConn","DEFAULT_PORT","DEFAULT_PAGE_SIZE","DEFAULT_HELLO_NAME","DEFAULT_HELLO_VERSION","DEFAULT_CONFORMANCE","host","port","MAX_PAGE_SIZE","MAX_QUERY_LENGTH","GQLValue","Decimal","RespType","MsgType","query","PreparedStatement","namedParams","q","AuthClient","predicate","fs","crypto","result","pattern"],"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 */\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 const valStr = options.value !== undefined ? `=${JSON.stringify(options.value)}` : '';\n super(`geode: config ${options.field}${valStr}: ${options.message}`);\n this.name = 'ConfigError';\n this.field = options.field;\n this.value = 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 */\n\nimport { ConfigError } from './errors.js';\n\n// Default configuration values\nexport const DEFAULT_PORT = 3141;\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;\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) */\n port: number;\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\n/**\n * Connection pool configuration.\n */\nexport interface PoolConfig extends GeodeConfig {\n /** Minimum number of connections in pool (default: 2) */\n minConnections?: number;\n\n /** Maximum number of connections in pool (default: 10) */\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 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 };\n}\n\n/**\n * Parse a DSN (Data Source Name) string into configuration.\n *\n * Supported formats:\n * - geode://host:port?options\n * - geode://username:password@host:port?options\n * - host:port?options\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 * - 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 */\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 (!isNaN(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\n dsn = dsn.trim();\n if (!dsn) {\n return cfg;\n }\n\n // Check for geode:// URL scheme\n if (dsn.startsWith('geode://')) {\n return parseURLDSN(dsn, cfg);\n }\n\n // Parse as host:port?options\n return parseSimpleDSN(dsn, cfg);\n}\n\n/**\n * Parse a geode:// URL format DSN.\n */\nfunction parseURLDSN(dsn: string, cfg: GeodeConfig): GeodeConfig {\n let url: URL;\n try {\n url = new URL(dsn);\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 cfg.host = url.hostname;\n\n if (url.port) {\n cfg.port = parseInt(url.port, 10);\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 (isNaN(port)) {\n throw new ConfigError({\n field: 'port',\n value: rest.slice(1),\n message: 'must be a valid port number',\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 (isNaN(port)) {\n throw new ConfigError({\n field: 'port',\n value: portStr,\n message: 'must be a valid port number',\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 cfg.tlsCA = value;\n break;\n\n case 'cert':\n cfg.tlsCert = value;\n break;\n\n case 'key':\n cfg.tlsKey = value;\n break;\n\n case 'insecure':\n cfg.insecureSkipVerify = value === 'true' || value === '1';\n break;\n\n case 'server_name':\n cfg.serverName = value;\n break;\n\n case 'connect_timeout': {\n const n = parseInt(value, 10);\n if (!isNaN(n) && n > 0) {\n cfg.connectTimeout = 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 // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\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 * GQL Type System\n *\n * Implements the GQL value type system for ISO/IEC 39075:2024 compliance.\n */\n\nimport Decimal from 'decimal.js-light';\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 * Node structure from graph queries.\n */\nexport interface GQLNode {\n id: string | number;\n labels: string[];\n properties: Record<string, unknown>;\n}\n\n/**\n * Edge structure from graph queries.\n */\nexport interface GQLEdge {\n id: string | number;\n type: string;\n startNode: string | number;\n endNode: string | number;\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 = value instanceof Decimal ? value : new Decimal(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 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 return 'INT';\n case 'FLOAT':\n case 'DOUBLE':\n case 'REAL':\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\n if ('id' in obj && 'type' in obj && 'startNode' in obj && 'endNode' in obj) {\n return GQLValue.edge(obj as unknown as GQLEdge);\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 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 return GQLValue.int(BigInt(value));\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 return GQLValue.string(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 return GQLValue.array([]);\n case 'OBJECT':\n return fromJSON(value);\n case 'NODE':\n return GQLValue.node(value as GQLNode);\n case 'EDGE':\n return GQLValue.edge(value as GQLEdge);\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 * Convert Row to plain object.\n */\nexport function rowToObject(row: Row): Record<string, unknown> {\n const obj: Record<string, unknown> = {};\n for (const [key, value] of row) {\n obj[key] = value.toJS();\n }\n return obj;\n}\n","/**\n * Geode Wire Protocol\n *\n * JSON line protocol implementation for communication with Geode server.\n */\n\nimport type { GeodeConfig } from './config.js';\nimport { DriverError, TransportError, StatusClass } from './errors.js';\nimport type { ColumnDef, ColumnInfo } from './types.js';\nimport { parseGQLType } from './types.js';\n\n// Client message types\nexport const MsgType = {\n HELLO: 'HELLO',\n RUN_GQL: 'RUN_GQL',\n PULL: 'PULL',\n BEGIN: 'BEGIN',\n COMMIT: 'COMMIT',\n ROLLBACK: 'ROLLBACK',\n SAVEPOINT: 'SAVEPOINT',\n ROLLBACK_TO: 'ROLLBACK_TO',\n PING: 'PING',\n} as const;\n\nexport type MsgType = (typeof MsgType)[keyof typeof MsgType];\n\n// Server response types\nexport const RespType = {\n HELLO: 'HELLO',\n SCHEMA: 'SCHEMA',\n BINDINGS: 'BINDINGS',\n ERROR: 'ERROR',\n EXPLAIN: 'EXPLAIN',\n PROFILE: 'PROFILE',\n RESULT: 'RESULT',\n STATUS: 'STATUS',\n} as const;\n\nexport type RespType = (typeof RespType)[keyof typeof RespType];\n\n/**\n * Additional diagnostic information from error frames.\n */\nexport interface AdditionalInfo {\n code?: string;\n message?: string;\n}\n\n/**\n * Frame result structure.\n */\nexport interface FrameResult {\n type: RespType;\n // SCHEMA\n columns?: ColumnDef[];\n // BINDINGS\n rows?: Record<string, unknown>[];\n ordered?: boolean;\n order_keys?: string[];\n final?: boolean;\n // ERROR\n code?: string;\n message?: string;\n anchor?: string;\n additional?: AdditionalInfo[];\n flagger_findings?: string[];\n // EXPLAIN/PROFILE\n json?: unknown;\n}\n\n/**\n * Wire protocol frame structure.\n */\nexport interface Frame {\n status_class: string;\n status_subclass: string;\n result: FrameResult;\n}\n\n/**\n * Parse a JSON frame from raw bytes.\n */\nexport function parseFrame(data: Buffer | string): Frame {\n let str: string;\n if (Buffer.isBuffer(data)) {\n str = data.toString('utf-8');\n } else {\n str = data;\n }\n\n try {\n const frame = JSON.parse(str) as Frame;\n\n // Validate frame structure\n // Note: Some responses (like HELLO) may have a simpler structure\n if (!frame.result || typeof frame.result.type !== 'string') {\n // Check if this is a top-level response (non-nested)\n const topLevel = frame as unknown as {\n type?: string;\n status_class?: string;\n columns?: unknown[];\n rows?: unknown[];\n };\n\n if (typeof topLevel.type === 'string') {\n // Convert to expected frame structure (ERROR, HELLO, etc.)\n return {\n status_class: topLevel.status_class ?? '00000',\n status_subclass: '000',\n result: frame as unknown as FrameResult,\n };\n }\n\n // Handle responses without type field (like BEGIN/COMMIT/ROLLBACK responses)\n // These have status_class and possibly columns/rows but no explicit type\n if (typeof topLevel.status_class === 'string') {\n // Determine type based on content\n const resultType = Array.isArray(topLevel.columns) ? RespType.BINDINGS : RespType.STATUS;\n\n return {\n status_class: topLevel.status_class,\n status_subclass: '000',\n result: {\n type: resultType,\n ...frame,\n } as FrameResult,\n };\n }\n\n throw new TransportError({\n operation: 'parse_frame',\n cause: new Error(\n `invalid frame structure: missing result.type. Received: ${str.slice(0, 200)}`\n ),\n });\n }\n\n return frame;\n } catch (e) {\n if (e instanceof TransportError) {\n throw e;\n }\n throw new TransportError({\n operation: 'parse_frame',\n cause: e instanceof Error ? e : new Error(String(e)),\n });\n }\n}\n\n/**\n * Check if a frame represents an error.\n */\nexport function isErrorFrame(frame: Frame): boolean {\n return frame.result.type === RespType.ERROR;\n}\n\n/**\n * Check if a frame represents a schema.\n */\nexport function isSchemaFrame(frame: Frame): boolean {\n return frame.result.type === RespType.SCHEMA;\n}\n\n/**\n * Check if a frame represents bindings (rows).\n */\nexport function isBindingsFrame(frame: Frame): boolean {\n return frame.result.type === RespType.BINDINGS;\n}\n\n/**\n * Check if a frame is the final frame in a result set.\n */\nexport function isFinalFrame(frame: Frame): boolean {\n return frame.result.final === true;\n}\n\n/**\n * Convert an error frame to a DriverError.\n */\nexport function frameToError(frame: Frame): DriverError {\n const result = frame.result;\n\n const additional: string[] = [];\n if (result.additional) {\n for (const info of result.additional) {\n if (info.message) {\n additional.push(info.message);\n } else if (info.code) {\n additional.push(info.code);\n }\n }\n }\n\n return new DriverError({\n statusClass: (frame.status_class || StatusClass.SYSTEM) as typeof StatusClass.SYSTEM,\n subclass: frame.status_subclass || '000',\n code: result.code ?? 'UnknownError',\n message: result.message ?? 'Unknown error',\n anchor: result.anchor,\n additional,\n findings: result.flagger_findings,\n });\n}\n\n/**\n * Get column info from a schema frame.\n */\nexport function getColumnsFromSchema(frame: Frame): ColumnInfo[] {\n if (!isSchemaFrame(frame)) {\n throw new Error('Expected SCHEMA frame');\n }\n\n const columns = frame.result.columns ?? [];\n return columns.map((col) => ({\n name: col.name,\n type: col.type,\n kind: parseGQLType(col.type),\n }));\n}\n\n// Message builders\n\n/**\n * Build a HELLO message.\n */\nexport function buildHelloMessage(cfg: GeodeConfig): Record<string, unknown> {\n const msg: Record<string, unknown> = {\n type: MsgType.HELLO,\n client_name: cfg.helloName,\n client_ver: cfg.helloVersion,\n wanted_conformance: cfg.conformance,\n };\n\n // Include credentials if provided\n if (cfg.username) {\n msg['username'] = cfg.username;\n }\n if (cfg.password) {\n msg['password'] = cfg.password;\n }\n\n return msg;\n}\n\n/**\n * Build a RUN_GQL message.\n */\nexport function buildRunGQLMessage(\n query: string,\n params?: Record<string, unknown>\n): Record<string, unknown> {\n const msg: Record<string, unknown> = {\n type: MsgType.RUN_GQL,\n text: query,\n };\n\n if (params && Object.keys(params).length > 0) {\n msg['params'] = params;\n }\n\n return msg;\n}\n\n/**\n * Build a PULL message.\n */\nexport function buildPullMessage(requestId: number, pageSize: number): Record<string, unknown> {\n return {\n type: MsgType.PULL,\n request_id: requestId,\n page_size: pageSize,\n };\n}\n\n/**\n * Build a BEGIN message.\n */\nexport function buildBeginMessage(): Record<string, unknown> {\n return {\n type: MsgType.BEGIN,\n };\n}\n\n/**\n * Build a COMMIT message.\n */\nexport function buildCommitMessage(): Record<string, unknown> {\n return {\n type: MsgType.COMMIT,\n };\n}\n\n/**\n * Build a ROLLBACK message.\n */\nexport function buildRollbackMessage(): Record<string, unknown> {\n return {\n type: MsgType.ROLLBACK,\n };\n}\n\n/**\n * Build a SAVEPOINT message.\n */\nexport function buildSavepointMessage(name: string): Record<string, unknown> {\n return {\n type: MsgType.SAVEPOINT,\n name,\n };\n}\n\n/**\n * Build a ROLLBACK_TO message.\n */\nexport function buildRollbackToMessage(name: string): Record<string, unknown> {\n return {\n type: MsgType.ROLLBACK_TO,\n name,\n };\n}\n\n/**\n * Build a PING message.\n */\nexport function buildPingMessage(): Record<string, unknown> {\n return {\n type: MsgType.PING,\n };\n}\n\n/**\n * Serialize a message to JSON line format.\n */\nexport function serializeMessage(msg: Record<string, unknown>): Buffer {\n const json = JSON.stringify(msg);\n return Buffer.from(json + '\\n', 'utf-8');\n}\n\n/**\n * Rewrite positional placeholders (?) to named parameters ($p1, $p2, ...).\n */\nexport function rewritePlaceholders(\n query: string,\n args: unknown[]\n): { query: string; params: Record<string, unknown> } {\n const params: Record<string, unknown> = {};\n let argIndex = 0;\n let result = '';\n let i = 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 result += ch;\n i++;\n while (i < query.length && query[i] !== quote) {\n if (query[i] === '\\\\' && i + 1 < query.length) {\n result += query[i];\n i++;\n }\n result += query[i];\n i++;\n }\n if (i < query.length) {\n result += query[i];\n i++;\n }\n continue;\n }\n\n // Replace ? with $pN\n if (ch === '?') {\n argIndex++;\n const paramName = `p${argIndex}`;\n result += '$' + paramName;\n if (argIndex <= args.length) {\n params[paramName] = args[argIndex - 1];\n }\n i++;\n continue;\n }\n\n result += ch;\n i++;\n }\n\n return { query: result, params };\n}\n\n/**\n * Count the number of ? placeholders in a query.\n */\nexport function countPlaceholders(query: string): number {\n let count = 0;\n let i = 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 if (ch === '?') {\n count++;\n }\n i++;\n }\n\n return count;\n}\n\n/**\n * Merge named parameters with positional parameters.\n */\nexport function mergeParams(\n positionalParams: Record<string, unknown>,\n namedParams?: Record<string, unknown>\n): Record<string, unknown> {\n if (!namedParams || Object.keys(namedParams).length === 0) {\n return positionalParams;\n }\n return { ...positionalParams, ...namedParams };\n}\n","/**\n * Input Validation Module\n *\n * Security-focused validation for user inputs to prevent injection attacks.\n */\n\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// 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 throw new SecurityError({\n type: 'input',\n message: `invalid parameter name: ${name}`,\n });\n }\n\n if (RESERVED_KEYWORDS.has(name.toLowerCase())) {\n throw new SecurityError({\n type: 'input',\n message: `parameter name is a reserved keyword: ${name}`,\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 * 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.\n */\n\nimport type { Connection, QueryOptions } from './connection.js';\nimport { validateQuery, validateParamValue } from './validate.js';\nimport {\n buildRunGQLMessage,\n parseFrame,\n isErrorFrame,\n frameToError,\n rewritePlaceholders,\n RespType,\n} from './protocol.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 server response.\n */\nfunction parsePlanOperation(data: unknown): PlanOperation {\n if (!data || typeof data !== 'object') {\n return { type: 'Unknown', details: { raw: data } };\n }\n\n const obj = data as Record<string, unknown>;\n\n const op: PlanOperation = {\n type: (obj['type'] as string) || (obj['operator'] as string) || 'Unknown',\n };\n\n if ('operator' in obj) op.operator = obj['operator'] as string;\n if ('cost' in obj) op.cost = obj['cost'] as number;\n if ('rows' in obj) op.rows = obj['rows'] as number;\n if ('estimated_rows' in obj) op.rows = obj['estimated_rows'] as number;\n if ('estimated_cost' in obj) op.cost = obj['estimated_cost'] as number;\n\n // Collect remaining fields as details\n const details: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (\n ![\n 'type',\n 'operator',\n 'cost',\n 'rows',\n 'children',\n 'estimated_rows',\n 'estimated_cost',\n ].includes(key)\n ) {\n details[key] = value;\n }\n }\n if (Object.keys(details).length > 0) {\n op.details = details;\n }\n\n // Parse children\n if (Array.isArray(obj['children'])) {\n op.children = (obj['children'] as unknown[]).map(parsePlanOperation);\n }\n\n return op;\n}\n\n/**\n * Parse timing data from server response.\n */\nfunction parseOperationTiming(data: unknown): OperationTiming {\n if (!data || typeof data !== 'object') {\n return { type: 'Unknown', wallTimeMs: 0 };\n }\n\n const obj = data as Record<string, unknown>;\n\n const timing: OperationTiming = {\n type: (obj['type'] as string) || (obj['operator'] as string) || 'Unknown',\n wallTimeMs: (obj['wall_time_ms'] as number) || (obj['time_ms'] as number) || 0,\n };\n\n if ('cpu_time_ms' in obj) timing.cpuTimeMs = obj['cpu_time_ms'] as number;\n if ('rows' in obj) timing.rows = obj['rows'] as number;\n if ('actual_rows' in obj) timing.rows = obj['actual_rows'] as number;\n if ('page_hits' in obj) timing.pageHits = obj['page_hits'] as number;\n if ('page_faults' in obj) timing.pageFaults = obj['page_faults'] as number;\n\n // Parse children\n if (Array.isArray(obj['children'])) {\n timing.children = (obj['children'] as unknown[]).map(parseOperationTiming);\n }\n\n return timing;\n}\n\n/**\n * Get the query execution plan without executing.\n *\n * @param conn - Connection to use\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 explain(conn, 'MATCH (n:Person)-[:KNOWS]->(m) RETURN n, m');\n * console.log('Plan:', plan.root.type);\n * console.log('Estimated cost:', plan.totalCost);\n * ```\n */\nexport async function explain(\n conn: Connection,\n query: string,\n options?: ExplainOptions\n): Promise<QueryPlan> {\n validateQuery(query);\n\n let finalQuery = query;\n let params = options?.params ?? {};\n\n // Handle positional parameters\n if (query.includes('?') && Array.isArray(options?.params)) {\n const result = rewritePlaceholders(query, options.params as unknown[]);\n finalQuery = result.query;\n params = result.params;\n }\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 ${finalQuery}` : `EXPLAIN ${finalQuery}`;\n\n const transport = (\n conn as unknown as {\n _transport: {\n send: (msg: unknown, signal?: AbortSignal) => Promise<void>;\n receive: (signal?: AbortSignal) => Promise<Buffer>;\n };\n }\n )._transport;\n\n await transport.send(buildRunGQLMessage(explainQuery, params), options?.signal);\n\n const data = await transport.receive(options?.signal);\n const frame = parseFrame(data);\n\n if (isErrorFrame(frame)) {\n throw frameToError(frame);\n }\n\n // Check for EXPLAIN response\n if (frame.result.type === RespType.EXPLAIN) {\n const raw = frame.result.json;\n const root = parsePlanOperation(raw);\n\n return {\n root,\n totalCost: calculateTotalCost(root),\n totalRows: root.rows,\n raw,\n };\n }\n\n // Fallback: return raw data as plan\n return {\n root: { type: 'Unknown', details: { response: frame.result } },\n raw: frame.result,\n };\n}\n\n/**\n * Execute a query with profiling and return execution statistics.\n *\n * Unlike explain(), profile() actually executes the query and measures\n * real performance metrics.\n *\n * @param conn - Connection to use\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 profile(conn, 'MATCH (n:Person) RETURN count(n)');\n * console.log('Execution time:', profile.totalTimeMs, 'ms');\n * console.log('Rows processed:', profile.totalRows);\n * ```\n */\nexport async function profile(\n conn: Connection,\n query: string,\n options?: ExplainOptions\n): Promise<QueryProfile> {\n validateQuery(query);\n\n let finalQuery = query;\n let params = options?.params ?? {};\n\n // Handle positional parameters\n if (query.includes('?') && Array.isArray(options?.params)) {\n const result = rewritePlaceholders(query, options.params as unknown[]);\n finalQuery = result.query;\n params = result.params;\n }\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 ${finalQuery}` : `PROFILE ${finalQuery}`;\n\n const transport = (\n conn as unknown as {\n _transport: {\n send: (msg: unknown, signal?: AbortSignal) => Promise<void>;\n receive: (signal?: AbortSignal) => Promise<Buffer>;\n };\n }\n )._transport;\n\n await transport.send(buildRunGQLMessage(profileQuery, params), options?.signal);\n\n const data = await transport.receive(options?.signal);\n const frame = parseFrame(data);\n\n if (isErrorFrame(frame)) {\n throw frameToError(frame);\n }\n\n // Check for PROFILE response\n if (frame.result.type === RespType.PROFILE) {\n const raw = frame.result.json as Record<string, unknown> | undefined;\n const root = parseOperationTiming(raw);\n\n return {\n root,\n totalTimeMs: calculateTotalTime(root),\n totalRows: root.rows,\n planningTimeMs: raw?.['planning_time_ms'] as number | undefined,\n executionTimeMs: raw?.['execution_time_ms'] as number | undefined,\n memoryBytes: raw?.['memory_bytes'] as number | undefined,\n raw,\n };\n }\n\n // Fallback: return minimal profile\n return {\n root: { type: 'Unknown', wallTimeMs: 0 },\n totalTimeMs: 0,\n raw: frame.result,\n };\n}\n\n/**\n * Calculate total cost from a plan tree.\n */\nfunction calculateTotalCost(op: PlanOperation): number {\n let total = op.cost ?? 0;\n if (op.children) {\n for (const child of op.children) {\n total += calculateTotalCost(child);\n }\n }\n return total;\n}\n\n/**\n * Calculate total time from a timing tree.\n */\nfunction calculateTotalTime(timing: OperationTiming): number {\n let total = timing.wallTimeMs;\n if (timing.children) {\n for (const child of timing.children) {\n total = Math.max(total, calculateTotalTime(child));\n }\n }\n return total;\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 { validateQuery } 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 * 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\n /**\n * Create a new auth client.\n *\n * @param conn - Connection to use\n */\n constructor(conn: Connection) {\n this._conn = conn;\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 const roles = options.roles?.join(', ') ?? '';\n const active = options.active !== false ? 'true' : 'false';\n\n const query = `\n CREATE USER $username\n SET password = $password\n ${roles ? `, roles = [${roles}]` : ''}\n , active = ${active}\n `.trim();\n\n await this._conn.exec(query, {\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 let query = `GRANT ${permission.action} ON ${permission.resource}`;\n if (permission.label) {\n query += `:${permission.label}`;\n }\n query += ' TO $role';\n\n await this._conn.exec(query, {\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 let query = `REVOKE ${permission.action} ON ${permission.resource}`;\n if (permission.label) {\n query += `:${permission.label}`;\n }\n query += ' FROM $role';\n\n await this._conn.exec(query, {\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 validateQuery(predicate);\n\n const enabled = options?.enabled !== false ? 'ENABLE' : 'DISABLE';\n const roles = options?.roles?.length ? `FOR ROLES (${options.roles.join(', ')})` : '';\n\n const query = `\n CREATE POLICY $name ON :${label}\n FOR ${action}\n ${roles}\n USING (${predicate})\n ${enabled}\n `.trim();\n\n await this._conn.exec(query, {\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\n await this._conn.exec(`DROP POLICY $name ON :${label}`, {\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 const query = label ? `SHOW POLICIES ON :${label}` : 'SHOW POLICIES';\n const result = await this._conn.queryAll(query);\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\n await this._conn.exec(`ALTER POLICY $name ON :${label} 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\n await this._conn.exec(`ALTER POLICY $name ON :${label} 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 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 if (!password || password.length < 8) {\n throw new SecurityError({\n type: 'validation',\n message: 'Password must be at least 8 characters',\n });\n }\n if (password.length > 256) {\n throw new SecurityError({\n type: 'validation',\n message: 'Password too long (max 256 characters)',\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 */\nexport function createAuthClient(conn: Connection): AuthClient {\n return new AuthClient(conn);\n}\n","/**\n * Geode Connection\n *\n * Connection management and query execution.\n */\n\nimport type { GeodeConfig } from './config.js';\nimport { validateConfig } from './config.js';\nimport {\n TransportError,\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 buildHelloMessage,\n buildRunGQLMessage,\n buildPullMessage,\n buildBeginMessage,\n buildCommitMessage,\n buildRollbackMessage,\n buildSavepointMessage,\n buildRollbackToMessage,\n buildPingMessage,\n parseFrame,\n isErrorFrame,\n isSchemaFrame,\n frameToError,\n getColumnsFromSchema,\n rewritePlaceholders,\n RespType,\n} from './protocol.js';\nimport { validateQuery, validateParamValue, validateSavepointName } from './validate.js';\nimport { rowToObject } from './types.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';\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 * 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\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 * Perform the HELLO handshake.\n *\n * Note: The server may return an ERROR frame with \"Authentication required\"\n * even when no authentication is configured. This is a known server behavior\n * that should be treated as a successful connection (matching other clients).\n */\n private async hello(): Promise<void> {\n const msg = buildHelloMessage(this._config);\n await this._transport.send(msg);\n\n const data = await this._transport.receive();\n const frame = parseFrame(data);\n\n // Don't throw on authentication errors during HELLO when no auth is configured\n // The server may return this error but still accept the connection\n if (isErrorFrame(frame)) {\n const statusClass = frame.status_class || frame.result.code;\n // 28000 is \"invalid authorization specification\" - ignore if no credentials provided\n if (statusClass !== '28000' || this._config.username || this._config.password) {\n throw frameToError(frame);\n }\n // Otherwise, continue - the connection is still valid\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 let finalQuery = query;\n let params = options?.params ?? {};\n\n // Handle positional parameters (?)\n if (query.includes('?') && Array.isArray(options?.params)) {\n const result = rewritePlaceholders(query, options.params as unknown[]);\n finalQuery = result.query;\n params = result.params;\n }\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 RUN_GQL\n await this._transport.send(buildRunGQLMessage(finalQuery, params), signal);\n\n // Read SCHEMA response\n const schemaData = await this._transport.receive(signal);\n const schemaFrame = parseFrame(schemaData);\n\n if (isErrorFrame(schemaFrame)) {\n this._state = this._inTransaction ? 'in_transaction' : 'idle';\n throw frameToError(schemaFrame);\n }\n\n if (!isSchemaFrame(schemaFrame)) {\n this._state = this._inTransaction ? 'in_transaction' : 'idle';\n throw new TransportError({\n operation: 'query',\n cause: new Error(`Expected SCHEMA frame, got ${schemaFrame.result.type}`),\n });\n }\n\n const columns = getColumnsFromSchema(schemaFrame);\n\n // Inline RUN+PULL: check if a bindings frame already arrived.\n const inlineFrame = await this._tryReceiveInlineFrame(signal);\n if (inlineFrame) {\n if (isErrorFrame(inlineFrame)) {\n this._state = this._inTransaction ? 'in_transaction' : 'idle';\n throw frameToError(inlineFrame);\n }\n\n const result = new QueryResult(\n this,\n columns,\n inlineFrame.result.rows ?? [],\n inlineFrame.result.final ?? true,\n inlineFrame.result.ordered ?? false,\n inlineFrame.result.order_keys ?? [],\n options?.pageSize ?? this._config.pageSize,\n signal\n );\n\n this._activeResult = result;\n return result;\n }\n\n // Send first PULL\n this._requestId++;\n const pageSize = options?.pageSize ?? this._config.pageSize;\n await this._transport.send(buildPullMessage(this._requestId, pageSize), signal);\n\n // Read first BINDINGS response\n const bindingsData = await this._transport.receive(signal);\n const bindingsFrame = parseFrame(bindingsData);\n\n if (isErrorFrame(bindingsFrame)) {\n this._state = this._inTransaction ? 'in_transaction' : 'idle';\n throw frameToError(bindingsFrame);\n }\n\n // Create result\n const result = new QueryResult(\n this,\n columns,\n bindingsFrame.result.rows ?? [],\n bindingsFrame.result.final ?? true,\n bindingsFrame.result.ordered ?? false,\n bindingsFrame.result.order_keys ?? [],\n 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 rows.push(rowToObject(row));\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 let finalQuery = query;\n let params = options?.params ?? {};\n\n // Handle positional parameters\n if (query.includes('?') && Array.isArray(options?.params)) {\n const result = rewritePlaceholders(query, options.params as unknown[]);\n finalQuery = result.query;\n params = result.params;\n }\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 RUN_GQL\n await this._transport.send(buildRunGQLMessage(finalQuery, params), signal);\n\n // Read response\n const data = await this._transport.receive(signal);\n const frame = parseFrame(data);\n\n if (isErrorFrame(frame)) {\n throw frameToError(frame);\n }\n\n // Drain any inline BINDINGS frame to keep the stream aligned.\n if (frame.result.type === RespType.SCHEMA) {\n const inlineFrame = await this._tryReceiveInlineFrame(signal);\n if (inlineFrame && isErrorFrame(inlineFrame)) {\n throw frameToError(inlineFrame);\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 await this._transport.send(buildPullMessage(this._requestId, pageSize), signal);\n\n const data = await this._transport.receive(signal);\n const frame = parseFrame(data);\n\n if (isErrorFrame(frame)) {\n throw frameToError(frame);\n }\n\n const resultType = frame.result.type;\n if (resultType === RespType.BINDINGS) {\n return {\n rows: frame.result.rows ?? [],\n final: frame.result.final ?? true,\n };\n }\n\n // PROFILE, RESULT, STATUS frames indicate no more data\n return {\n rows: [],\n final: true,\n };\n }\n\n private async _tryReceiveInlineFrame(signal?: AbortSignal): Promise<ReturnType<typeof parseFrame> | null> {\n if (signal?.aborted) {\n return null;\n }\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 1);\n try {\n const data = await this._transport.receive(controller.signal);\n return parseFrame(data);\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 await this._transport.send(buildBeginMessage(), signal);\n\n const data = await this._transport.receive(signal);\n const frame = parseFrame(data);\n\n if (isErrorFrame(frame)) {\n throw frameToError(frame);\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 await this._transport.send(buildCommitMessage(), signal);\n\n const data = await this._transport.receive(signal);\n const frame = parseFrame(data);\n\n if (isErrorFrame(frame)) {\n throw frameToError(frame);\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 await this._transport.send(buildRollbackMessage(), signal);\n\n const data = await this._transport.receive(signal);\n const frame = parseFrame(data);\n\n if (isErrorFrame(frame)) {\n throw frameToError(frame);\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 await this._transport.send(buildSavepointMessage(name), signal);\n\n const data = await this._transport.receive(signal);\n const frame = parseFrame(data);\n\n if (isErrorFrame(frame)) {\n throw frameToError(frame);\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 await this._transport.send(buildRollbackToMessage(name), signal);\n\n const data = await this._transport.receive(signal);\n const frame = parseFrame(data);\n\n if (isErrorFrame(frame)) {\n throw frameToError(frame);\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 await this._transport.send(buildPingMessage(), signal);\n\n const data = await this._transport.receive(signal);\n const frame = parseFrame(data);\n\n if (isErrorFrame(frame)) {\n throw frameToError(frame);\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 * @param query - Query text with parameters\n * @returns Prepared statement\n */\n async prepare(query: string): Promise<PreparedStatement> {\n // Dynamic import to avoid circular dependencies\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 * @param query - Query to explain\n * @param options - Options including parameters\n * @returns Query execution plan\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 * @param query - Query to profile\n * @param options - Options including parameters\n * @returns Query execution profile\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 * @param queries - Array of queries to execute\n * @param options - Batch execution options\n * @returns Batch execution summary\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 * QUIC Transport Layer\n *\n * Provides QUIC + TLS 1.3 transport for communication with Geode server.\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';\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 message to the server */\n send(msg: Record<string, unknown>, signal?: AbortSignal): Promise<void>;\n\n /** Receive a message from the server */\n receive(signal?: AbortSignal): Promise<Buffer>;\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 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 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 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 QUIC transports.\n * Allows for different QUIC implementations.\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 send(msg: Record<string, unknown>, signal?: AbortSignal): Promise<void>;\n abstract receive(signal?: AbortSignal): Promise<Buffer>;\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 */\nexport class MatrixQuicTransport extends BaseTransport {\n private _client: unknown = null;\n private _stream: unknown = null;\n private _readBuffer: Buffer[] = [];\n private _lineBuffer = '';\n private _pendingReads: Array<{\n resolve: (value: Buffer) => 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<MatrixQuicTransport> {\n const address = getAddress(cfg);\n const transport = new MatrixQuicTransport(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 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/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @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/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @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) break;\n if (value) {\n this.processData(Buffer.from(value));\n }\n }\n } catch {\n // Stream closed or error\n } finally {\n reader.releaseLock();\n }\n };\n\n void read();\n }\n\n /**\n * Process received data, splitting by newlines.\n */\n private processData(data: Buffer): void {\n this._lineBuffer += data.toString('utf-8');\n\n let newlineIdx: number;\n while ((newlineIdx = this._lineBuffer.indexOf('\\n')) !== -1) {\n const line = this._lineBuffer.slice(0, newlineIdx);\n this._lineBuffer = this._lineBuffer.slice(newlineIdx + 1);\n\n if (line.length > 0) {\n const pending = this._pendingReads.shift();\n if (pending) {\n pending.resolve(Buffer.from(line, 'utf-8'));\n } else {\n this._readBuffer.push(Buffer.from(line, 'utf-8'));\n }\n }\n }\n }\n\n async send(msg: Record<string, unknown>, signal?: AbortSignal): Promise<void> {\n this.checkClosed();\n\n if (signal?.aborted) {\n throw new TransportError({ operation: 'send', cause: new Error('Aborted') });\n }\n\n if (!this._stream) {\n throw new TransportError({ operation: 'send', cause: new Error('No stream') });\n }\n\n const data = Buffer.from(JSON.stringify(msg) + '\\n', 'utf-8');\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: 'send',\n address: this._address,\n cause: e instanceof Error ? e : new Error(String(e)),\n });\n }\n }\n\n async receive(signal?: AbortSignal): Promise<Buffer> {\n this.checkClosed();\n\n if (signal?.aborted) {\n throw new TransportError({ operation: 'receive', cause: new Error('Aborted') });\n }\n\n // Check buffer first\n const buffered = this._readBuffer.shift();\n if (buffered) {\n return buffered;\n }\n\n // Wait for data\n return new Promise((resolve, reject) => {\n if (signal) {\n const onAbort = () => {\n reject(new TransportError({ operation: 'receive', cause: new Error('Aborted') }));\n };\n signal.addEventListener('abort', onAbort, { once: true });\n }\n\n this._pendingReads.push({ resolve, reject });\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._pendingReads) {\n pending.reject(ErrClosed);\n }\n this._pendingReads = [];\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 QUIC connection.\n */\nexport class MockTransport extends BaseTransport {\n private _sendQueue: Record<string, unknown>[] = [];\n private _receiveQueue: Buffer[] = [];\n private _pendingReads: Array<{\n resolve: (value: Buffer) => void;\n reject: (error: Error) => void;\n }> = [];\n\n constructor(address = 'mock:3141') {\n super(address);\n }\n\n /**\n * Queue a response to be returned by receive().\n */\n queueResponse(response: Record<string, unknown>): void {\n const data = Buffer.from(JSON.stringify(response), 'utf-8');\n this._receiveQueue.push(data);\n\n // Resolve any pending reads\n const pending = this._pendingReads.shift();\n if (pending) {\n const queued = this._receiveQueue.shift();\n if (queued) {\n pending.resolve(queued);\n }\n }\n }\n\n /**\n * Get all sent messages.\n */\n getSentMessages(): Record<string, unknown>[] {\n return [...this._sendQueue];\n }\n\n /**\n * Clear sent messages.\n */\n clearSentMessages(): void {\n this._sendQueue = [];\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async send(msg: Record<string, unknown>, signal?: AbortSignal): Promise<void> {\n this.checkClosed();\n\n if (signal?.aborted) {\n throw new TransportError({ operation: 'send', cause: new Error('Aborted') });\n }\n\n this._sendQueue.push(msg);\n }\n\n async receive(signal?: AbortSignal): Promise<Buffer> {\n this.checkClosed();\n\n if (signal?.aborted) {\n throw new TransportError({ operation: 'receive', cause: new Error('Aborted') });\n }\n\n const queued = this._receiveQueue.shift();\n if (queued) {\n return queued;\n }\n\n return new Promise((resolve, reject) => {\n if (signal) {\n const onAbort = () => {\n reject(new TransportError({ operation: 'receive', cause: new Error('Aborted') }));\n };\n signal.addEventListener('abort', onAbort, { once: true });\n }\n\n this._pendingReads.push({ resolve, reject });\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._pendingReads) {\n pending.reject(ErrClosed);\n }\n this._pendingReads = [];\n }\n}\n\n/**\n * Create a transport for the given configuration.\n *\n * Uses MatrixQuicTransport by default.\n */\nexport async function createTransport(cfg: GeodeConfig): Promise<Transport> {\n return MatrixQuicTransport.connect(cfg);\n}\n\n// Export for backwards compatibility\nexport { MatrixQuicTransport 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 * 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\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) {\n this._config = config;\n this._minConnections = config.minConnections ?? 2;\n this._maxConnections = config.maxConnections ?? 10;\n this._acquireTimeout = config.acquireTimeout ?? 30000;\n this._idleTimeout = config.idleTimeout ?? 60000;\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.\n */\n private async addConnection(): Promise<void> {\n const conn = await Connection.connect(this._config);\n this._connections.push({\n connection: conn,\n createdAt: Date.now(),\n lastUsedAt: Date.now(),\n inUse: false,\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';\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 const labelStr = Array.isArray(labels) ? labels.join(':') : labels;\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 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 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 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 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 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 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('geode://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.\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 parseDSN,\n defaultConfig,\n validateConfig,\n getAddress,\n cloneConfig,\n DEFAULT_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} 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 GQLNode,\n type GQLEdge,\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// Protocol (for advanced usage)\nexport {\n MsgType,\n RespType,\n type Frame,\n type FrameResult,\n type AdditionalInfo,\n parseFrame,\n isErrorFrame,\n isSchemaFrame,\n isBindingsFrame,\n isFinalFrame,\n frameToError,\n getColumnsFromSchema,\n buildHelloMessage,\n buildRunGQLMessage,\n buildPullMessage,\n buildBeginMessage,\n buildCommitMessage,\n buildRollbackMessage,\n buildSavepointMessage,\n buildRollbackToMessage,\n buildPingMessage,\n serializeMessage,\n rewritePlaceholders,\n countPlaceholders,\n mergeParams,\n} from './protocol.js';\n\n// Transport (for advanced usage and testing)\nexport {\n type Transport,\n BaseTransport,\n QuicheTransport,\n MockTransport,\n createTransport,\n buildTLSConfig,\n} from './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// 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';\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 this._variable = variable;\n return this;\n }\n\n /**\n * Add a label.\n */\n label(label: string): this {\n this._labels.push(label);\n return this;\n }\n\n /**\n * Add multiple labels.\n */\n labels(...labels: string[]): this {\n this._labels.push(...labels);\n return this;\n }\n\n /**\n * Set a property.\n */\n prop(key: string, value: unknown): this {\n this._properties[key] = value;\n return this;\n }\n\n /**\n * Set multiple properties.\n */\n props(properties: Record<string, unknown>): this {\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 this._variable = variable;\n return this;\n }\n\n /**\n * Set the relationship type.\n */\n type(type: string): this {\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 this._properties[key] = value;\n return this;\n }\n\n /**\n * Set multiple properties.\n */\n props(properties: Record<string, unknown>): this {\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 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 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 raw clause.\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 return `'${value.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 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"]}
|