node-opcua-transport
Version:
pure nodejs OPCUA SDK - module transport
91 lines (90 loc) • 4.65 kB
TypeScript
/**
* @module node-opcua-transport
*/
import type { AcknowledgeMessage } from "./AcknowledgeMessage";
/**
* Options used to construct a client transport. Passed through {@link IClientTransportFactory.create}
* and applied to the UACP HEL message during the handshake.
*/
export interface TransportSettingsOptions {
maxChunkCount?: number;
maxMessageSize?: number;
receiveBufferSize?: number;
sendBufferSize?: number;
}
/**
* The minimal surface that {@link ClientSecureChannelLayer} (and anything else acting as
* a secure-channel client) uses from a transport. {@link ClientTCP_transport} already
* satisfies this interface; browser transports (e.g. a WebSocket-based one) must also
* satisfy it to be pluggable via {@link IClientTransportFactory}.
*
* This interface is intentionally the smallest superset of what the existing
* `ClientTCP_transport` exposes and that the secure-channel layer actually consumes,
* so adding new transports does not require replicating Node-specific machinery.
*/
export interface IClientTransport {
/** diagnostic name, useful in debug logs */
readonly name: string;
/** OPC UA UACP protocol version advertised in HEL */
protocolVersion: number;
/** overall timeout applied to the underlying socket / connection lifecycle */
timeout: number;
/** number of times the owning channel has retried. Advisory; bumped by callers. */
numberOfRetry: number;
/** endpoint URL the transport was connected to (set by `connect`) */
endpointUrl: string;
/** URI reported by the local application to the peer */
serverUri: string;
readonly parameters?: AcknowledgeMessage;
readonly receiveBufferSize: number;
readonly sendBufferSize: number;
readonly maxChunkCount: number;
readonly maxMessageSize: number;
readonly bytesRead: number;
readonly bytesWritten: number;
readonly chunkReadCount: number;
readonly chunkWrittenCount: number;
/** connect to `endpointUrl` and perform the UACP HEL/ACK handshake */
connect(endpointUrl: string, callback: (err?: Error | null) => void): void;
/** gracefully disconnect; invokes `callback` when the underlying connection is closed */
disconnect(callback: (err?: Error | null) => void): void;
/** forcibly release resources (close the connection if still open) */
dispose(): void;
/** write a single UACP chunk to the transport */
write(chunk: Buffer, callback?: (err?: Error | null) => undefined): void;
/** emit an ERR back to the peer and destroy the underlying connection */
prematureTerminate(err: Error, statusCode: import("node-opcua-status-code").StatusCode): void;
/** simulate a connection break (used by reconnection logic in tests) */
forceConnectionBreak(): void;
/** `true` when the underlying connection is open and usable */
isValid(): boolean;
/** `true` when `disconnect()` has started or the connection is gone */
isDisconnecting(): boolean;
/** return the effective transport settings (`maxChunkCount` etc.) */
getTransportSettings(): TransportSettingsOptions;
on(eventName: "chunk", eventHandler: (messageChunk: Buffer) => void): this;
on(eventName: "close", eventHandler: (err: Error | null) => void): this;
on(eventName: "connection_break", eventHandler: (err: Error | null) => void): this;
on(eventName: "connect", eventHandler: () => void): this;
once(eventName: "chunk", eventHandler: (messageChunk: Buffer) => void): this;
once(eventName: "close", eventHandler: (err: Error | null) => void): this;
once(eventName: "connection_break", eventHandler: (err: Error | null) => void): this;
once(eventName: "connect", eventHandler: () => void): this;
removeListener(eventName: "chunk", eventHandler: (messageChunk: Buffer) => void): this;
removeListener(eventName: "close", eventHandler: (err: Error | null) => void): this;
removeListener(eventName: "connection_break", eventHandler: (err: Error | null) => void): this;
removeListener(eventName: "connect", eventHandler: () => void): this;
}
/**
* A factory that produces an {@link IClientTransport}. Injected into
* {@link ClientSecureChannelLayerOptions.transportFactory} to swap the default Node TCP
* transport for an alternative (for example, a browser WebSocket transport or a tracing
* proxy wrapped around the default).
*/
export interface IClientTransportFactory {
/**
* Create a new transport. Called once per secure-channel open; the factory must not
* return the same instance twice.
*/
create(settings?: TransportSettingsOptions): IClientTransport;
}