UNPKG

@sourceregistry/node-ovsdb

Version:
417 lines 14.2 kB
import { Socket } from 'node:net'; import { EventEmitter } from 'node:events'; import { Duplex } from 'node:stream'; import { TLSSocket, ConnectionOptions as TlsConnectionOptions } from 'node:tls'; import { AbortOperation, AssertOperation, CommentOperation, CommitOperation, DatabaseOperation, DatabaseSchema, DatabaseTableMap, DeleteOperation, InsertOperation, JsonObject, JsonValue, ListDbsResult, LockedNotification, MutateOperation, MonitorCondRequest, MonitorCondSinceResult, MonitorRequest, OperationResult, OperationResults, OvsdbError, OvsdbNotification, OvsdbValue, SelectOperation, StolenNotification, TableUpdates, TableUpdates2, Update2Notification, Update3Notification, UpdateNotification, UpdateOperation, WaitOperation } from './types'; /** * A socket-compatible stream used by the client transport. */ export type OvsdbStream = Duplex | Socket | TLSSocket; /** * Supported connection modes for the OVSDB transport. */ export type OvsdbTransportKind = "unix" | "tcp" | "tls"; /** * Resolved Unix socket transport settings. */ export interface OvsdbUnixConnectionOptions { transport: "unix"; socketPath: string; } /** * Resolved TCP transport settings. */ export interface OvsdbTcpConnectionOptions { transport: "tcp"; host: string; port: number; } /** * Resolved TLS transport settings. */ export interface OvsdbTlsTransportOptions { transport: "tls"; host: string; port: number; tlsOptions: TlsConnectionOptions; } /** * Fully resolved transport settings used by the client. */ export type OvsdbResolvedConnectionOptions = OvsdbUnixConnectionOptions | OvsdbTcpConnectionOptions | OvsdbTlsTransportOptions; /** * Typed events emitted by {@link OVSDBClient}. */ export interface OvsdbClientEvents<TDatabase extends DatabaseTableMap = DatabaseTableMap> { connect: []; close: []; notification: [OvsdbNotification<TDatabase>]; update: [UpdateNotification<TDatabase>]; update2: [Update2Notification<TDatabase>]; update3: [Update3Notification<TDatabase>]; locked: [LockedNotification]; stolen: [StolenNotification]; protocolError: [Error, unknown]; transportError: [Error]; } /** * Options for configuring an {@link OVSDBClient}. */ export interface OvsdbClientOptions { /** * Path to the OVSDB Unix domain socket. * * @defaultValue `"/var/run/openvswitch/db.sock"` */ socketPath?: string; /** * Hostname for TCP or TLS connections. * * When set, the client uses a network socket instead of a Unix socket. */ host?: string; /** * Port for TCP or TLS connections. * * @defaultValue `6640` */ port?: number; /** * Enables TLS for network connections. * * @defaultValue `false` */ tls?: boolean; /** * Extra TLS connection options forwarded to `node:tls`. * * These options are only used when `tls` is enabled. */ tlsOptions?: TlsConnectionOptions; /** * Request and connection timeout in milliseconds. * * @defaultValue `5000` */ timeout?: number; /** * Optional stream factory used for testing or custom transports. * When set, the client skips the socket path existence check. */ connectionFactory?: (options: OvsdbResolvedConnectionOptions) => OvsdbStream; } /** * JSON-RPC transport error returned by the OVSDB server. */ export declare class OvsdbRpcError extends Error { /** * The error payload returned by the server. */ readonly response: OvsdbError; /** * Creates a new RPC error wrapper. */ constructor(response: OvsdbError); } /** * Raised when a message does not match the expected JSON-RPC envelope. */ export declare class OvsdbProtocolError extends Error { /** * The raw payload that failed validation. */ readonly payload: unknown; /** * Creates a new protocol error wrapper. */ constructor(message: string, payload: unknown); } /** * Raised when an OVSDB transaction response contains an operation-level error. */ export declare class OvsdbTransactionError<TDatabase extends DatabaseTableMap = DatabaseTableMap> extends Error { /** * Zero-based index of the failed operation in the submitted transaction. */ readonly operationIndex: number; /** * Operation that produced the error. */ readonly operation: DatabaseOperation<TDatabase>; /** * OVSDB error payload returned for the failed operation. */ readonly result: OvsdbError; /** * Raw transaction results returned by the server. */ readonly results: Array<OperationResult<TDatabase, DatabaseOperation<TDatabase>> | OvsdbError>; /** * Creates a new transaction error wrapper. */ constructor(options: { operationIndex: number; operation: DatabaseOperation<TDatabase>; result: OvsdbError; results: Array<OperationResult<TDatabase, DatabaseOperation<TDatabase>> | OvsdbError>; }); } /** * Result payload returned by a staged transaction helper. */ export interface OvsdbTransactionOutcome<TDatabase extends DatabaseTableMap = DatabaseTableMap, TValue = void> { /** * Value returned by the transaction callback. */ value: TValue; /** * Operations that were submitted to OVSDB. */ operations: readonly DatabaseOperation<TDatabase>[]; /** * Per-operation OVSDB results in submission order. */ results: Array<OperationResult<TDatabase, DatabaseOperation<TDatabase>>>; } /** * Options for the staged transaction helper. */ export interface OvsdbTransactionOptions { /** * Appends a trailing `commit` operation when the callback succeeds and the * staged operations do not already include `commit` or `abort`. * * @defaultValue `true` */ autoCommit?: boolean; /** * Durable flag used by the auto-generated `commit` operation. * * @defaultValue `false` */ durable?: boolean; } /** * Stages OVSDB operations before sending them as a single `transact` request. */ export declare class OvsdbTransaction<TDatabase extends DatabaseTableMap = DatabaseTableMap> { private readonly stagedOperations; /** * Returns the currently staged operations. */ get operations(): readonly DatabaseOperation<TDatabase>[]; /** * Adds an operation to the transaction. */ add<TOperation extends DatabaseOperation<TDatabase>>(operation: TOperation): TOperation; /** * Stages an insert operation. */ insert<TOperation extends InsertOperation<TDatabase>>(operation: TOperation): TOperation; /** * Stages a select operation. */ select<TOperation extends SelectOperation<TDatabase>>(operation: TOperation): TOperation; /** * Stages an update operation. */ update<TOperation extends UpdateOperation<TDatabase>>(operation: TOperation): TOperation; /** * Stages a mutate operation. */ mutate<TOperation extends MutateOperation<TDatabase>>(operation: TOperation): TOperation; /** * Stages a delete operation. */ delete<TOperation extends DeleteOperation<TDatabase>>(operation: TOperation): TOperation; /** * Stages a wait operation. */ wait<TOperation extends WaitOperation<TDatabase>>(operation: TOperation): TOperation; /** * Stages a comment operation. */ comment(comment: string): CommentOperation; /** * Stages an assert operation. */ assert(lock: string): AssertOperation; /** * Stages a commit operation. */ commit(durable?: boolean): CommitOperation; /** * Stages an abort operation. */ abort(): AbortOperation; } /** * A low-level, event-driven OVSDB client for Unix sockets, TCP, or TLS. * * The client exposes the RFC 7047 primitives together with common * Open vSwitch protocol extensions while keeping the API small and predictable. */ export declare class OVSDBClient<TDatabase extends DatabaseTableMap = DatabaseTableMap> extends EventEmitter<OvsdbClientEvents<TDatabase>> implements AsyncDisposable { private readonly timeout; private readonly connectionOptions; private readonly connectionFactory?; private socket; private requestId; private receiveBuffer; private pendingRequests; private connected; private closeEmitted; /** * Creates a new OVSDB client instance. */ constructor(options?: OvsdbClientOptions); /** * Returns `true` when the underlying socket is currently connected. */ get isConnected(): boolean; /** * Opens the transport connection. * * @returns The connected client instance for chaining. */ connect(): Promise<this>; /** * Sends a raw JSON-RPC request and resolves with its `result` payload. * * @param method RPC method name. * @param params RPC parameters. */ request<TResult>(method: string, params?: JsonValue[]): Promise<TResult>; /** * Sends a JSON-RPC notification without waiting for a response. * * @param method RPC method name. * @param params RPC parameters. */ notify(method: string, params?: JsonValue[]): Promise<void>; /** * Returns the database names exposed by the connected OVSDB server. */ listDbs(): Promise<ListDbsResult>; /** * Returns the schema definition for a database. * * @param dbName Database name. */ getSchema(dbName?: string): Promise<DatabaseSchema>; /** * Executes a single transaction. * * The response preserves operation ordering, so tuple inputs infer tuple outputs. * * @param dbName Database name. * @param operations Transaction operations. */ transact<TOperations extends readonly DatabaseOperation<TDatabase>[]>(dbName: string, operations: [...TOperations]): Promise<OperationResults<TDatabase, TOperations>>; /** * Stages a transaction in a callback and submits it only if the callback * completes successfully. * * This helper is convenient when you want a scoped, imperative API while * still sending exactly one OVSDB `transact` request. * * @param dbName Database name. * @param callback Callback that stages operations on the transaction object. * @param options Auto-commit behavior for the staged transaction. */ transaction<TValue>(dbName: string, callback: (transaction: OvsdbTransaction<TDatabase>) => Promise<TValue> | TValue, options?: OvsdbTransactionOptions): Promise<OvsdbTransactionOutcome<TDatabase, TValue>>; /** * Cancels a previously issued request by id. * * @param requestId JSON-RPC request id to cancel. */ cancel(requestId: JsonValue): Promise<null | JsonObject>; /** * Starts a standard RFC 7047 monitor. * * @param dbName Database name. * @param monitorId Application-defined monitor id. * @param monitorRequests Per-table monitor definitions. */ monitor(dbName: string, monitorId: JsonValue, monitorRequests: Record<string, MonitorRequest<TDatabase>>): Promise<TableUpdates<TDatabase>>; /** * Starts an Open vSwitch conditional monitor. * * @param dbName Database name. * @param monitorId Application-defined monitor id. * @param monitorRequests Per-table conditional monitor definitions. */ monitorCond(dbName: string, monitorId: JsonValue, monitorRequests: Record<string, MonitorCondRequest<TDatabase>>): Promise<TableUpdates2<TDatabase>>; /** * Starts an Open vSwitch conditional monitor from a known transaction id. * * @param dbName Database name. * @param monitorId Application-defined monitor id. * @param monitorRequests Per-table conditional monitor definitions. * @param lastTransactionId Last seen transaction id, or `null` for a fresh snapshot. */ monitorCondSince(dbName: string, monitorId: JsonValue, monitorRequests: Record<string, MonitorCondRequest<TDatabase>>, lastTransactionId?: string | null): Promise<MonitorCondSinceResult<TDatabase>>; /** * Cancels a monitor by its monitor id. * * @param monitorId Monitor id used when the monitor was created. */ monitorCancel(monitorId: JsonValue): Promise<null | JsonObject>; /** * Acquires a named database lock. * * @param lockId Lock identifier. */ lock(lockId: string): Promise<null | JsonObject>; /** * Forces ownership of a named database lock. * * @param lockId Lock identifier. */ steal(lockId: string): Promise<null | JsonObject>; /** * Releases a previously acquired named database lock. * * @param lockId Lock identifier. */ unlock(lockId: string): Promise<null | JsonObject>; /** * Sends an echo request to validate transport liveness. * * @param payload Values to be echoed back by the server. */ echo<TPayload extends OvsdbValue[]>(...payload: TPayload): Promise<TPayload>; /** * Enables or disables Open vSwitch database change awareness. * * @param enabled Whether the server should report change awareness metadata. */ setDbChangeAware(enabled?: boolean): Promise<boolean | null>; /** * Closes the connection and rejects all pending requests. */ close(): Promise<void>; /** * Implements `AsyncDisposable`. */ [Symbol.asyncDispose](): Promise<void>; private attachSocket; private readonly handleData; private readonly handleSocketError; private readonly handleSocketClose; private parseFrame; private handleMessage; private handleResponse; private handleIncomingRequest; private handleNotification; private emitProtocolError; private writeMessage; private assertConnected; private disposeTransport; } export * from './types'; /** * Resolves the user-supplied transport options into an explicit connection mode. */ export declare function resolveConnectionOptions(options?: OvsdbClientOptions): OvsdbResolvedConnectionOptions; //# sourceMappingURL=index.d.ts.map