@sourceregistry/node-ovsdb 1.0.2 → 1.0.3

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.es","sources":["../src/index.ts"],"sourcesContent":["import {existsSync} from \"node:fs\";\nimport {createConnection as createNetConnection, Socket} from \"node:net\";\nimport {EventEmitter} from \"node:events\";\nimport {Duplex} from \"node:stream\";\nimport {connect as connectTls, TLSSocket} from \"node:tls\";\nimport type {ConnectionOptions as TlsConnectionOptions} from \"node:tls\";\n\nimport type {\n AbortOperation,\n AssertOperation,\n CommentOperation,\n CommitOperation,\n DatabaseOperation,\n DatabaseSchema,\n DatabaseTableMap,\n DeleteOperation,\n InsertOperation,\n JsonObject,\n JsonValue,\n ListDbsResult,\n LockedNotification,\n MutateOperation,\n MonitorCondRequest,\n MonitorCondSinceResult,\n MonitorRequest,\n OperationResult,\n OperationResults,\n OvsdbError,\n OvsdbNotification,\n OvsdbResponse,\n OvsdbValue,\n SelectOperation,\n StolenNotification,\n TableUpdates,\n TableUpdates2,\n Update2Notification,\n Update3Notification,\n UpdateNotification,\n UpdateOperation,\n WaitOperation\n} from \"./types\";\n\n/**\n * A socket-compatible stream used by the client transport.\n */\nexport type OvsdbStream = Duplex | Socket | TLSSocket;\n\n/**\n * Supported connection modes for the OVSDB transport.\n */\nexport type OvsdbTransportKind = \"unix\" | \"tcp\" | \"tls\";\n\n/**\n * Resolved Unix socket transport settings.\n */\nexport interface OvsdbUnixConnectionOptions {\n transport: \"unix\";\n socketPath: string;\n}\n\n/**\n * Resolved TCP transport settings.\n */\nexport interface OvsdbTcpConnectionOptions {\n transport: \"tcp\";\n host: string;\n port: number;\n}\n\n/**\n * Resolved TLS transport settings.\n */\nexport interface OvsdbTlsTransportOptions {\n transport: \"tls\";\n host: string;\n port: number;\n tlsOptions: TlsConnectionOptions;\n}\n\n/**\n * Fully resolved transport settings used by the client.\n */\nexport type OvsdbResolvedConnectionOptions =\n | OvsdbUnixConnectionOptions\n | OvsdbTcpConnectionOptions\n | OvsdbTlsTransportOptions;\n\n/**\n * Typed events emitted by {@link OVSDBClient}.\n */\nexport interface OvsdbClientEvents<TDatabase extends DatabaseTableMap = DatabaseTableMap> {\n connect: [];\n close: [];\n notification: [OvsdbNotification<TDatabase>];\n update: [UpdateNotification<TDatabase>];\n update2: [Update2Notification<TDatabase>];\n update3: [Update3Notification<TDatabase>];\n locked: [LockedNotification];\n stolen: [StolenNotification];\n protocolError: [Error, unknown];\n transportError: [Error];\n}\n\n/**\n * Options for configuring an {@link OVSDBClient}.\n */\nexport interface OvsdbClientOptions {\n /**\n * Path to the OVSDB Unix domain socket.\n *\n * @defaultValue `\"/var/run/openvswitch/db.sock\"`\n */\n socketPath?: string;\n\n /**\n * Hostname for TCP or TLS connections.\n *\n * When set, the client uses a network socket instead of a Unix socket.\n */\n host?: string;\n\n /**\n * Port for TCP or TLS connections.\n *\n * @defaultValue `6640`\n */\n port?: number;\n\n /**\n * Enables TLS for network connections.\n *\n * @defaultValue `false`\n */\n tls?: boolean;\n\n /**\n * Extra TLS connection options forwarded to `node:tls`.\n *\n * These options are only used when `tls` is enabled.\n */\n tlsOptions?: TlsConnectionOptions;\n\n /**\n * Request and connection timeout in milliseconds.\n *\n * @defaultValue `5000`\n */\n timeout?: number;\n\n /**\n * Optional stream factory used for testing or custom transports.\n * When set, the client skips the socket path existence check.\n */\n connectionFactory?: (options: OvsdbResolvedConnectionOptions) => OvsdbStream;\n}\n\n/**\n * JSON-RPC transport error returned by the OVSDB server.\n */\nexport class OvsdbRpcError extends Error {\n /**\n * The error payload returned by the server.\n */\n public readonly response: OvsdbError;\n\n /**\n * Creates a new RPC error wrapper.\n */\n constructor(response: OvsdbError) {\n super(response.details ? `${response.error}: ${response.details}` : response.error);\n this.name = \"OvsdbRpcError\";\n this.response = response;\n }\n}\n\n/**\n * Raised when a message does not match the expected JSON-RPC envelope.\n */\nexport class OvsdbProtocolError extends Error {\n /**\n * The raw payload that failed validation.\n */\n public readonly payload: unknown;\n\n /**\n * Creates a new protocol error wrapper.\n */\n constructor(message: string, payload: unknown) {\n super(message);\n this.name = \"OvsdbProtocolError\";\n this.payload = payload;\n }\n}\n\n/**\n * Raised when an OVSDB transaction response contains an operation-level error.\n */\nexport class OvsdbTransactionError<\n TDatabase extends DatabaseTableMap = DatabaseTableMap\n> extends Error {\n /**\n * Zero-based index of the failed operation in the submitted transaction.\n */\n public readonly operationIndex: number;\n\n /**\n * Operation that produced the error.\n */\n public readonly operation: DatabaseOperation<TDatabase>;\n\n /**\n * OVSDB error payload returned for the failed operation.\n */\n public readonly result: OvsdbError;\n\n /**\n * Raw transaction results returned by the server.\n */\n public readonly results: Array<OperationResult<TDatabase, DatabaseOperation<TDatabase>> | OvsdbError>;\n\n /**\n * Creates a new transaction error wrapper.\n */\n constructor(options: {\n operationIndex: number;\n operation: DatabaseOperation<TDatabase>;\n result: OvsdbError;\n results: Array<OperationResult<TDatabase, DatabaseOperation<TDatabase>> | OvsdbError>;\n }) {\n super(`Transaction operation ${options.operationIndex} failed: ${options.result.error}`);\n this.name = \"OvsdbTransactionError\";\n this.operationIndex = options.operationIndex;\n this.operation = options.operation;\n this.result = options.result;\n this.results = options.results;\n }\n}\n\ninterface PendingRequest {\n resolve: (value: unknown) => void;\n reject: (reason?: unknown) => void;\n timeoutId: NodeJS.Timeout;\n}\n\n/**\n * Result payload returned by a staged transaction helper.\n */\nexport interface OvsdbTransactionOutcome<\n TDatabase extends DatabaseTableMap = DatabaseTableMap,\n TValue = void\n> {\n /**\n * Value returned by the transaction callback.\n */\n value: TValue;\n\n /**\n * Operations that were submitted to OVSDB.\n */\n operations: readonly DatabaseOperation<TDatabase>[];\n\n /**\n * Per-operation OVSDB results in submission order.\n */\n results: Array<OperationResult<TDatabase, DatabaseOperation<TDatabase>>>;\n}\n\n/**\n * Options for the staged transaction helper.\n */\nexport interface OvsdbTransactionOptions {\n /**\n * Appends a trailing `commit` operation when the callback succeeds and the\n * staged operations do not already include `commit` or `abort`.\n *\n * @defaultValue `true`\n */\n autoCommit?: boolean;\n\n /**\n * Durable flag used by the auto-generated `commit` operation.\n *\n * @defaultValue `false`\n */\n durable?: boolean;\n}\n\n/**\n * Stages OVSDB operations before sending them as a single `transact` request.\n */\nexport class OvsdbTransaction<TDatabase extends DatabaseTableMap = DatabaseTableMap> {\n private readonly stagedOperations: DatabaseOperation<TDatabase>[] = [];\n\n /**\n * Returns the currently staged operations.\n */\n public get operations(): readonly DatabaseOperation<TDatabase>[] {\n return this.stagedOperations;\n }\n\n /**\n * Adds an operation to the transaction.\n */\n public add<TOperation extends DatabaseOperation<TDatabase>>(operation: TOperation): TOperation {\n this.stagedOperations.push(operation);\n return operation;\n }\n\n /**\n * Stages an insert operation.\n */\n public insert<TOperation extends InsertOperation<TDatabase>>(operation: TOperation): TOperation {\n return this.add(operation);\n }\n\n /**\n * Stages a select operation.\n */\n public select<TOperation extends SelectOperation<TDatabase>>(operation: TOperation): TOperation {\n return this.add(operation);\n }\n\n /**\n * Stages an update operation.\n */\n public update<TOperation extends UpdateOperation<TDatabase>>(operation: TOperation): TOperation {\n return this.add(operation);\n }\n\n /**\n * Stages a mutate operation.\n */\n public mutate<TOperation extends MutateOperation<TDatabase>>(operation: TOperation): TOperation {\n return this.add(operation);\n }\n\n /**\n * Stages a delete operation.\n */\n public delete<TOperation extends DeleteOperation<TDatabase>>(operation: TOperation): TOperation {\n return this.add(operation);\n }\n\n /**\n * Stages a wait operation.\n */\n public wait<TOperation extends WaitOperation<TDatabase>>(operation: TOperation): TOperation {\n return this.add(operation);\n }\n\n /**\n * Stages a comment operation.\n */\n public comment(comment: string): CommentOperation {\n return this.add({\n op: \"comment\",\n comment\n });\n }\n\n /**\n * Stages an assert operation.\n */\n public assert(lock: string): AssertOperation {\n return this.add({\n op: \"assert\",\n lock\n });\n }\n\n /**\n * Stages a commit operation.\n */\n public commit(durable = false): CommitOperation {\n return this.add({\n op: \"commit\",\n durable\n });\n }\n\n /**\n * Stages an abort operation.\n */\n public abort(): AbortOperation {\n return this.add({\n op: \"abort\"\n });\n }\n}\n\n/**\n * A low-level, event-driven OVSDB client for Unix sockets, TCP, or TLS.\n *\n * The client exposes the RFC 7047 primitives together with common\n * Open vSwitch protocol extensions while keeping the API small and predictable.\n */\nexport class OVSDBClient<\n TDatabase extends DatabaseTableMap = DatabaseTableMap\n> extends EventEmitter<OvsdbClientEvents<TDatabase>> implements AsyncDisposable {\n private readonly timeout: number;\n private readonly connectionOptions: OvsdbResolvedConnectionOptions;\n private readonly connectionFactory?: (options: OvsdbResolvedConnectionOptions) => OvsdbStream;\n\n private socket: OvsdbStream | null = null;\n private requestId = 1;\n private receiveBuffer = \"\";\n private pendingRequests = new Map<JsonValue, PendingRequest>();\n private connected = false;\n private closeEmitted = false;\n\n /**\n * Creates a new OVSDB client instance.\n */\n constructor(options: OvsdbClientOptions = {}) {\n super();\n this.timeout = options.timeout ?? 5000;\n this.connectionOptions = resolveConnectionOptions(options);\n this.connectionFactory = options.connectionFactory;\n }\n\n /**\n * Returns `true` when the underlying socket is currently connected.\n */\n public get isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Opens the transport connection.\n *\n * @returns The connected client instance for chaining.\n */\n public async connect(): Promise<this> {\n if (this.connected) {\n return this;\n }\n\n if (\n !this.connectionFactory &&\n this.connectionOptions.transport === \"unix\" &&\n !existsSync(this.connectionOptions.socketPath)\n ) {\n throw new Error(`OVSDB socket not found: ${this.connectionOptions.socketPath}`);\n }\n\n const socket = this.connectionFactory\n ? this.connectionFactory(this.connectionOptions)\n : createTransport(this.connectionOptions);\n this.attachSocket(socket);\n const connectEvent = this.connectionOptions.transport === \"tls\" ? \"secureConnect\" : \"connect\";\n\n await new Promise<void>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n cleanup();\n this.disposeTransport(new Error(`Connection timeout after ${this.timeout}ms`));\n reject(new Error(`Connection timeout after ${this.timeout}ms`));\n }, this.timeout);\n\n const onConnect = () => {\n cleanup();\n this.connected = true;\n this.closeEmitted = false;\n this.emit(\"connect\");\n resolve();\n };\n\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n socket.off(connectEvent, onConnect);\n socket.off(\"error\", onError);\n };\n\n socket.once(connectEvent, onConnect);\n socket.once(\"error\", onError);\n });\n\n return this;\n }\n\n /**\n * Sends a raw JSON-RPC request and resolves with its `result` payload.\n *\n * @param method RPC method name.\n * @param params RPC parameters.\n */\n public async request<TResult>(method: string, params: JsonValue[] = []): Promise<TResult> {\n this.assertConnected();\n\n const id = this.requestId++;\n const payload = {\n method,\n params,\n id\n };\n\n return await new Promise<TResult>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n this.pendingRequests.delete(id);\n reject(new Error(`Request timeout for method: ${method}`));\n }, this.timeout);\n\n this.pendingRequests.set(id, {\n resolve: (value) => resolve(value as TResult),\n reject,\n timeoutId\n });\n\n this.writeMessage(payload).catch((error) => {\n clearTimeout(timeoutId);\n this.pendingRequests.delete(id);\n reject(error);\n });\n });\n }\n\n /**\n * Sends a JSON-RPC notification without waiting for a response.\n *\n * @param method RPC method name.\n * @param params RPC parameters.\n */\n public async notify(method: string, params: JsonValue[] = []): Promise<void> {\n this.assertConnected();\n await this.writeMessage({method, params});\n }\n\n /**\n * Returns the database names exposed by the connected OVSDB server.\n */\n public async listDbs(): Promise<ListDbsResult> {\n return await this.request<ListDbsResult>(\"list_dbs\", []);\n }\n\n /**\n * Returns the schema definition for a database.\n *\n * @param dbName Database name.\n */\n public async getSchema(dbName = \"Open_vSwitch\"): Promise<DatabaseSchema> {\n return await this.request<DatabaseSchema>(\"get_schema\", [dbName]);\n }\n\n /**\n * Executes a single transaction.\n *\n * The response preserves operation ordering, so tuple inputs infer tuple outputs.\n *\n * @param dbName Database name.\n * @param operations Transaction operations.\n */\n public async transact<TOperations extends readonly DatabaseOperation<TDatabase>[]>(\n dbName: string,\n operations: [...TOperations]\n ): Promise<OperationResults<TDatabase, TOperations>> {\n return await this.request<OperationResults<TDatabase, TOperations>>(\n \"transact\",\n [dbName, ...operations] as JsonValue[]\n );\n }\n\n /**\n * Stages a transaction in a callback and submits it only if the callback\n * completes successfully.\n *\n * This helper is convenient when you want a scoped, imperative API while\n * still sending exactly one OVSDB `transact` request.\n *\n * @param dbName Database name.\n * @param callback Callback that stages operations on the transaction object.\n * @param options Auto-commit behavior for the staged transaction.\n */\n public async transaction<TValue>(\n dbName: string,\n callback: (transaction: OvsdbTransaction<TDatabase>) => Promise<TValue> | TValue,\n options: OvsdbTransactionOptions = {}\n ): Promise<OvsdbTransactionOutcome<TDatabase, TValue>> {\n const transaction = new OvsdbTransaction<TDatabase>();\n const value = await callback(transaction);\n\n const operations = [...transaction.operations];\n const autoCommit = options.autoCommit ?? true;\n const hasFinalizer = operations.some((operation) => operation.op === \"commit\" || operation.op === \"abort\");\n if (autoCommit && !hasFinalizer) {\n operations.push({\n op: \"commit\",\n durable: options.durable ?? false\n });\n }\n\n if (operations.length === 0) {\n return {\n value,\n operations,\n results: []\n };\n }\n\n const results = await this.request<Array<OperationResult<TDatabase, DatabaseOperation<TDatabase>> | OvsdbError>>(\n \"transact\",\n [dbName, ...operations] as JsonValue[]\n );\n\n for (const [index, result] of results.entries()) {\n if (isOvsdbError(result)) {\n throw new OvsdbTransactionError<TDatabase>({\n operationIndex: index,\n operation: operations[index] as DatabaseOperation<TDatabase>,\n result,\n results\n });\n }\n }\n\n return {\n value,\n operations,\n results: results as Array<OperationResult<TDatabase, DatabaseOperation<TDatabase>>>\n };\n }\n\n /**\n * Cancels a previously issued request by id.\n *\n * @param requestId JSON-RPC request id to cancel.\n */\n public async cancel(requestId: JsonValue): Promise<null | JsonObject> {\n return await this.request<null | JsonObject>(\"cancel\", [requestId]);\n }\n\n /**\n * Starts a standard RFC 7047 monitor.\n *\n * @param dbName Database name.\n * @param monitorId Application-defined monitor id.\n * @param monitorRequests Per-table monitor definitions.\n */\n public async monitor(\n dbName: string,\n monitorId: JsonValue,\n monitorRequests: Record<string, MonitorRequest<TDatabase>>\n ): Promise<TableUpdates<TDatabase>> {\n return await this.request<TableUpdates<TDatabase>>(\"monitor\", [\n dbName,\n monitorId,\n monitorRequests as JsonValue\n ]);\n }\n\n /**\n * Starts an Open vSwitch conditional monitor.\n *\n * @param dbName Database name.\n * @param monitorId Application-defined monitor id.\n * @param monitorRequests Per-table conditional monitor definitions.\n */\n public async monitorCond(\n dbName: string,\n monitorId: JsonValue,\n monitorRequests: Record<string, MonitorCondRequest<TDatabase>>\n ): Promise<TableUpdates2<TDatabase>> {\n return await this.request<TableUpdates2<TDatabase>>(\"monitor_cond\", [\n dbName,\n monitorId,\n monitorRequests as JsonValue\n ]);\n }\n\n /**\n * Starts an Open vSwitch conditional monitor from a known transaction id.\n *\n * @param dbName Database name.\n * @param monitorId Application-defined monitor id.\n * @param monitorRequests Per-table conditional monitor definitions.\n * @param lastTransactionId Last seen transaction id, or `null` for a fresh snapshot.\n */\n public async monitorCondSince(\n dbName: string,\n monitorId: JsonValue,\n monitorRequests: Record<string, MonitorCondRequest<TDatabase>>,\n lastTransactionId: string | null = null\n ): Promise<MonitorCondSinceResult<TDatabase>> {\n return await this.request<MonitorCondSinceResult<TDatabase>>(\"monitor_cond_since\", [\n dbName,\n monitorId,\n monitorRequests as JsonValue,\n lastTransactionId\n ]);\n }\n\n /**\n * Cancels a monitor by its monitor id.\n *\n * @param monitorId Monitor id used when the monitor was created.\n */\n public async monitorCancel(monitorId: JsonValue): Promise<null | JsonObject> {\n return await this.request<null | JsonObject>(\"monitor_cancel\", [monitorId]);\n }\n\n /**\n * Acquires a named database lock.\n *\n * @param lockId Lock identifier.\n */\n public async lock(lockId: string): Promise<null | JsonObject> {\n return await this.request<null | JsonObject>(\"lock\", [lockId]);\n }\n\n /**\n * Forces ownership of a named database lock.\n *\n * @param lockId Lock identifier.\n */\n public async steal(lockId: string): Promise<null | JsonObject> {\n return await this.request<null | JsonObject>(\"steal\", [lockId]);\n }\n\n /**\n * Releases a previously acquired named database lock.\n *\n * @param lockId Lock identifier.\n */\n public async unlock(lockId: string): Promise<null | JsonObject> {\n return await this.request<null | JsonObject>(\"unlock\", [lockId]);\n }\n\n /**\n * Sends an echo request to validate transport liveness.\n *\n * @param payload Values to be echoed back by the server.\n */\n public async echo<TPayload extends OvsdbValue[]>(...payload: TPayload): Promise<TPayload> {\n return await this.request<TPayload>(\"echo\", payload as JsonValue[]);\n }\n\n /**\n * Enables or disables Open vSwitch database change awareness.\n *\n * @param enabled Whether the server should report change awareness metadata.\n */\n public async setDbChangeAware(enabled = true): Promise<boolean | null> {\n return await this.request<boolean | null>(\"set_db_change_aware\", [enabled]);\n }\n\n /**\n * Closes the connection and rejects all pending requests.\n */\n public async close(): Promise<void> {\n this.disposeTransport();\n }\n\n /**\n * Implements `AsyncDisposable`.\n */\n public async [Symbol.asyncDispose](): Promise<void> {\n await this.close();\n }\n\n private attachSocket(socket: OvsdbStream): void {\n this.socket = socket;\n this.receiveBuffer = \"\";\n\n socket.on(\"data\", this.handleData);\n socket.on(\"error\", this.handleSocketError);\n socket.on(\"close\", this.handleSocketClose);\n }\n\n private readonly handleData = (chunk: Buffer | string): void => {\n this.receiveBuffer += typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\");\n\n let frame = extractJsonFrame(this.receiveBuffer);\n while (frame) {\n this.receiveBuffer = frame.rest;\n this.parseFrame(frame.frame);\n frame = extractJsonFrame(this.receiveBuffer);\n }\n\n const trimmed = this.receiveBuffer.trimStart();\n if (trimmed && trimmed[0] !== \"{\" && trimmed[0] !== \"[\") {\n this.emitProtocolError(\"Received non-JSON data on the transport\", this.receiveBuffer);\n this.receiveBuffer = \"\";\n }\n };\n\n private readonly handleSocketError = (error: Error): void => {\n this.emit(\"transportError\", error);\n this.disposeTransport(error);\n };\n\n private readonly handleSocketClose = (): void => {\n this.disposeTransport();\n };\n\n private parseFrame(frame: string): void {\n try {\n const payload = JSON.parse(frame) as unknown;\n this.handleMessage(payload);\n } catch (error) {\n const protocolError = new OvsdbProtocolError(\"Failed to parse JSON message\", frame);\n this.emit(\"protocolError\", protocolError, frame);\n if (error instanceof Error) {\n void error;\n }\n }\n }\n\n private handleMessage(payload: unknown): void {\n if (!payload || typeof payload !== \"object\") {\n this.emitProtocolError(\"Expected a JSON object message\", payload);\n return;\n }\n\n if (\"method\" in payload && typeof payload.method === \"string\") {\n const message = payload as {method: string; params?: JsonValue[]; id?: JsonValue | null};\n\n if (message.id !== undefined && message.id !== null) {\n void this.handleIncomingRequest(message.method, message.params ?? [], message.id);\n return;\n }\n\n this.handleNotification(payload as OvsdbNotification<TDatabase>);\n return;\n }\n\n if (\"id\" in payload) {\n this.handleResponse(payload as OvsdbResponse<unknown>);\n return;\n }\n\n this.emitProtocolError(\"Received message without method or id\", payload);\n }\n\n private handleResponse(response: OvsdbResponse<unknown>): void {\n const pendingRequest = this.pendingRequests.get(response.id);\n if (!pendingRequest) {\n this.emitProtocolError(\"Received response for an unknown request id\", response);\n return;\n }\n\n this.pendingRequests.delete(response.id);\n clearTimeout(pendingRequest.timeoutId);\n\n if (response.error) {\n pendingRequest.reject(new OvsdbRpcError(response.error));\n return;\n }\n\n pendingRequest.resolve(response.result);\n }\n\n private async handleIncomingRequest(method: string, params: JsonValue[], id: JsonValue): Promise<void> {\n if (method === \"echo\") {\n await this.writeMessage({\n id,\n result: params,\n error: null\n });\n return;\n }\n\n await this.writeMessage({\n id,\n result: null,\n error: {\n error: \"not supported\",\n details: `Unsupported server request: ${method}`\n }\n });\n }\n\n private handleNotification(notification: OvsdbNotification<TDatabase>): void {\n this.emit(\"notification\", notification);\n\n switch (notification.method) {\n case \"update\":\n this.emit(\"update\", notification);\n break;\n case \"update2\":\n this.emit(\"update2\", notification);\n break;\n case \"update3\":\n this.emit(\"update3\", notification);\n break;\n case \"locked\":\n this.emit(\"locked\", notification);\n break;\n case \"stolen\":\n this.emit(\"stolen\", notification);\n break;\n default:\n this.emitProtocolError(\"Received an unknown notification method\", notification);\n break;\n }\n }\n\n private emitProtocolError(message: string, payload: unknown): void {\n const error = new OvsdbProtocolError(message, payload);\n this.emit(\"protocolError\", error, payload);\n }\n\n private async writeMessage(payload: JsonObject): Promise<void> {\n this.assertConnected();\n\n await new Promise<void>((resolve, reject) => {\n this.socket?.write(`${JSON.stringify(payload)}\\n`, (error) => {\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n });\n }\n\n private assertConnected(): void {\n if (!this.connected || !this.socket) {\n throw new Error(\"Not connected to OVSDB\");\n }\n }\n\n private disposeTransport(reason?: Error): void {\n const socket = this.socket;\n this.socket = null;\n this.connected = false;\n this.receiveBuffer = \"\";\n\n if (socket) {\n socket.off(\"data\", this.handleData);\n socket.off(\"error\", this.handleSocketError);\n socket.off(\"close\", this.handleSocketClose);\n if (!socket.destroyed) {\n socket.destroy();\n }\n }\n\n const closeError = reason ?? new Error(\"Connection closed\");\n for (const pendingRequest of this.pendingRequests.values()) {\n clearTimeout(pendingRequest.timeoutId);\n pendingRequest.reject(closeError);\n }\n this.pendingRequests.clear();\n\n if (!this.closeEmitted) {\n this.closeEmitted = true;\n this.emit(\"close\");\n }\n }\n}\n\nexport * from \"./types\";\n\n/**\n * Resolves the user-supplied transport options into an explicit connection mode.\n */\nexport function resolveConnectionOptions(options: OvsdbClientOptions = {}): OvsdbResolvedConnectionOptions {\n if (options.host) {\n const port = options.port ?? 6640;\n if (options.tls) {\n return {\n transport: \"tls\",\n host: options.host,\n port,\n tlsOptions: {\n host: options.host,\n port,\n ...options.tlsOptions\n }\n };\n }\n\n return {\n transport: \"tcp\",\n host: options.host,\n port\n };\n }\n\n return {\n transport: \"unix\",\n socketPath: options.socketPath ?? \"/var/run/openvswitch/db.sock\"\n };\n}\n\nfunction createTransport(options: OvsdbResolvedConnectionOptions): OvsdbStream {\n switch (options.transport) {\n case \"unix\":\n return createNetConnection(options.socketPath);\n case \"tcp\":\n return createNetConnection(options.port, options.host);\n case \"tls\":\n return connectTls(options.tlsOptions);\n }\n}\n\nfunction isOvsdbError(value: unknown): value is OvsdbError {\n return typeof value === \"object\" && value !== null && \"error\" in value && typeof value.error === \"string\";\n}\n\nfunction extractJsonFrame(buffer: string): {frame: string; rest: string} | null {\n let startIndex = 0;\n while (startIndex < buffer.length && /\\s/u.test(buffer[startIndex])) {\n startIndex += 1;\n }\n\n if (startIndex >= buffer.length) {\n return null;\n }\n\n const opening = buffer[startIndex];\n const closing = opening === \"{\" ? \"}\" : opening === \"[\" ? \"]\" : null;\n if (!closing) {\n return null;\n }\n\n let depth = 0;\n let inString = false;\n let escaping = false;\n\n for (let index = startIndex; index < buffer.length; index += 1) {\n const char = buffer[index];\n\n if (inString) {\n if (escaping) {\n escaping = false;\n continue;\n }\n\n if (char === \"\\\\\") {\n escaping = true;\n continue;\n }\n\n if (char === \"\\\"\") {\n inString = false;\n }\n continue;\n }\n\n if (char === \"\\\"\") {\n inString = true;\n continue;\n }\n\n if (char === \"{\" || char === \"[\") {\n depth += 1;\n continue;\n }\n\n if (char === \"}\" || char === \"]\") {\n depth -= 1;\n if (depth === 0) {\n return {\n frame: buffer.slice(startIndex, index + 1),\n rest: buffer.slice(index + 1)\n };\n }\n }\n }\n\n return null;\n}\n"],"names":["OvsdbRpcError","response","OvsdbProtocolError","message","payload","OvsdbTransactionError","options","OvsdbTransaction","operation","comment","lock","durable","OVSDBClient","EventEmitter","resolveConnectionOptions","existsSync","socket","createTransport","connectEvent","resolve","reject","timeoutId","cleanup","onConnect","onError","error","method","params","id","value","dbName","operations","callback","transaction","autoCommit","hasFinalizer","results","index","result","isOvsdbError","requestId","monitorId","monitorRequests","lastTransactionId","lockId","enabled","chunk","frame","extractJsonFrame","trimmed","protocolError","pendingRequest","notification","reason","closeError","port","createNetConnection","connectTls","buffer","startIndex","opening","depth","inString","escaping","char"],"mappings":"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"}