UNPKG

node-opcua-server

Version:

pure nodejs OPCUA SDK - module server

240 lines (239 loc) 11 kB
/** * @module node-opcua-server */ import { EventEmitter } from "events"; import { AddressSpace, ISessionContext, IServerBase } from "node-opcua-address-space"; import { DataValue } from "node-opcua-data-value"; import { ServerDiagnosticsSummaryDataType, ServerState, ServerStatusDataType } from "node-opcua-common"; import { LocalizedTextLike } from "node-opcua-data-model"; import { NodeId } from "node-opcua-nodeid"; import { BrowseResult } from "node-opcua-service-browse"; import { CreateSubscriptionRequestLike } from "node-opcua-client"; import { ObjectRegistry } from "node-opcua-object-registry"; import { TransferResult } from "node-opcua-service-subscription"; import { ApplicationDescription } from "node-opcua-service-endpoints"; import { HistoryReadRequest, HistoryReadResult, HistoryReadValueId } from "node-opcua-service-history"; import { StatusCode } from "node-opcua-status-code"; import { BrowseDescription, BrowsePath, BrowsePathResult, BuildInfo, BuildInfoOptions, WriteValue, ReadValueId, CallMethodResultOptions, ReadRequestOptions, BrowseDescriptionOptions, CallMethodRequest, ApplicationType } from "node-opcua-types"; import { HistoryServerCapabilities, HistoryServerCapabilitiesOptions } from "./history_server_capabilities"; import { ServerCapabilities, ServerCapabilitiesOptions } from "./server_capabilities"; import { ServerSession } from "./server_session"; import { Subscription } from "./server_subscription"; import { OPCUAServerOptions } from "./opcua_server"; import { IAddressSpaceAccessor } from "./i_address_space_accessor"; export declare function setNextSubscriptionId(n: number): void; export type StringGetter = () => string; export type StringArrayGetter = () => string[]; export type ApplicationTypeGetter = () => ApplicationType; export type BooleanGetter = () => boolean; export interface ServerConfigurationOptions { applicationUri?: string | StringGetter; applicationType?: ApplicationType | ApplicationTypeGetter; hasSecureElement?: boolean | BooleanGetter; multicastDnsEnabled?: boolean | BooleanGetter; productUri?: string | StringGetter; /** * The SupportedPrivateKeyFormats specifies the PrivateKey formats supported by the Server. * Possible values include “PEM” (see RFC 5958) or “PFX” (see PKCS #12). * @default ["PEM"] */ supportedPrivateKeyFormat: string[] | StringArrayGetter; /** * The ServerCapabilities Property specifies the capabilities from Annex D * ( see https://reference.opcfoundation.org/GDS/v104/docs/D) which the Server supports. The value is * the same as the value reported to the LocalDiscoveryServer when the Server calls the RegisterServer2 Service. */ serverCapabilities?: string[] | StringArrayGetter; } export interface ServerEngineOptions { applicationUri: string | StringGetter; buildInfo?: BuildInfoOptions; isAuditing?: boolean; /** * set to true to enable serverDiagnostics */ serverDiagnosticsEnabled?: boolean; serverCapabilities?: ServerCapabilitiesOptions; historyServerCapabilities?: HistoryServerCapabilitiesOptions; serverConfiguration?: ServerConfigurationOptions; } export interface CreateSessionOption { clientDescription?: ApplicationDescription; sessionTimeout?: number; server?: IServerBase; } export type ClosingReason = "Timeout" | "Terminated" | "CloseSession" | "Forcing"; export type ServerEngineShutdownTask = (this: ServerEngine) => void | Promise<void>; /** * */ export declare class ServerEngine extends EventEmitter implements IAddressSpaceAccessor { static readonly registry: ObjectRegistry; isAuditing: boolean; serverDiagnosticsSummary: ServerDiagnosticsSummaryDataType; serverDiagnosticsEnabled: boolean; serverCapabilities: ServerCapabilities; historyServerCapabilities: HistoryServerCapabilities; serverConfiguration: ServerConfigurationOptions; clientDescription?: ApplicationDescription; addressSpace: AddressSpace | null; addressSpaceAccessor: IAddressSpaceAccessor | null; _internalState: "creating" | "initializing" | "initialized" | "shutdown" | "disposed"; private _sessions; private _closedSessions; private _orphanPublishEngine?; private _shutdownTasks; private _applicationUri; private _expectedShutdownTime; private _serverStatus; private _globalCounter; constructor(options?: ServerEngineOptions); isStarted(): boolean; dispose(): void; get startTime(): Date; get currentTime(): Date; get buildInfo(): BuildInfo; /** * register a function that will be called when the server will perform its shut down. */ registerShutdownTask(task: ServerEngineShutdownTask): void; /** */ shutdown(): Promise<void>; /** * the number of active sessions */ get currentSessionCount(): number; /** * the cumulated number of sessions that have been opened since this object exists */ get cumulatedSessionCount(): number; /** * the number of active subscriptions. */ get currentSubscriptionCount(): number; /** * the cumulated number of subscriptions that have been created since this object exists */ get cumulatedSubscriptionCount(): number; get rejectedSessionCount(): number; get rejectedRequestsCount(): number; get sessionAbortCount(): number; get sessionTimeoutCount(): number; get publishingIntervalCount(): number; incrementSessionTimeoutCount(): void; incrementSessionAbortCount(): void; incrementRejectedRequestsCount(): void; /** * increment rejected session count (also increment rejected requests count) */ incrementRejectedSessionCount(): void; incrementSecurityRejectedRequestsCount(): void; /** * increment rejected session count (also increment rejected requests count) */ incrementSecurityRejectedSessionCount(): void; setShutdownTime(date: Date): void; setShutdownReason(reason: LocalizedTextLike): void; /** * @return the approximate number of seconds until the server will be shut down. The * value is only relevant once the state changes into SHUTDOWN. */ secondsTillShutdown(): number; /** * the name of the server */ get serverName(): string; /** * the server urn */ get serverNameUrn(): string; /** * the urn of the server namespace */ get serverNamespaceUrn(): string; get serverStatus(): ServerStatusDataType; setServerState(serverState: ServerState): void; getServerDiagnosticsEnabledFlag(): boolean; /** * */ initialize(options: OPCUAServerOptions, callback: (err?: Error | null) => void): void; browseWithAutomaticExpansion(nodesToBrowse: BrowseDescription[], context: ISessionContext): Promise<BrowseResult[]>; browse(context: ISessionContext, nodesToBrowse: BrowseDescriptionOptions[]): Promise<BrowseResult[]>; read(context: ISessionContext, readRequest: ReadRequestOptions): Promise<DataValue[]>; write(context: ISessionContext, nodesToWrite: WriteValue[]): Promise<StatusCode[]>; call(context: ISessionContext, methodsToCall: CallMethodRequest[]): Promise<CallMethodResultOptions[]>; historyRead(context: ISessionContext, historyReadRequest: HistoryReadRequest): Promise<HistoryReadResult[]>; getOldestInactiveSession(): ServerSession | null; /** * create a new server session object. */ createSession(options?: CreateSessionOption): ServerSession; /** * @param authenticationToken * @param deleteSubscriptions {Boolean} : true if session's subscription shall be deleted * @param {String} [reason = "CloseSession"] the reason for closing the session ( * shall be "Timeout", "Terminated" or "CloseSession") * * * what the specs say: * ------------------- * * If a Client invokes the CloseSession Service then all Subscriptions associated with the Session are also deleted * if the deleteSubscriptions flag is set to TRUE. If a Server terminates a Session for any other reason, * Subscriptions associated with the Session, are not deleted. Each Subscription has its own lifetime to protect * against data loss in the case of a Session termination. In these cases, the Subscription can be reassigned to * another Client before its lifetime expires. */ closeSession(authenticationToken: NodeId, deleteSubscriptions: boolean, reason: ClosingReason): void; findSubscription(subscriptionId: number): Subscription | null; findOrphanSubscription(subscriptionId: number): Subscription | null; deleteOrphanSubscription(subscription: Subscription): StatusCode; /** * @param session {ServerSession} - the new session that will own the subscription * @param subscriptionId {IntegerId} - the subscription Id to transfer * @param sendInitialValues {Boolean} - true if initial values will be resent. * @return {TransferResult} */ transferSubscription(session: ServerSession, subscriptionId: number, sendInitialValues: boolean): Promise<TransferResult>; /** * retrieve a session by its authenticationToken. * * @param authenticationToken * @param activeOnly * @return {ServerSession} */ getSession(authenticationToken: NodeId, activeOnly?: boolean): ServerSession | null; translateBrowsePaths(browsePaths: BrowsePath[]): Promise<BrowsePathResult[]>; translateBrowsePath(browsePath: BrowsePath): Promise<BrowsePathResult>; /** * * performs a call to ```asyncRefresh``` on all variable nodes that provide an async refresh func. * * @param nodesToRefresh {Array<ReadValueId|HistoryReadValueId>} an array containing the node to consider * Each element of the array shall be of the form { nodeId: <xxx>, attributeIds: <value> }. * @param maxAge {number} the maximum age of the value to be read, in milliseconds. * @param callback * */ refreshValues(nodesToRefresh: ReadValueId[] | HistoryReadValueId[], maxAge: number, /** * @param err * @param dataValues an array containing value read * The array length matches the number of nodeIds that are candidate for an * async refresh (i.e: nodes that are of type Variable with asyncRefresh func } */ callback: (err: Error | null, dataValues?: DataValue[]) => void): void; private _exposeSubscriptionDiagnostics; protected _unexposeSubscriptionDiagnostics(subscription: Subscription): void; /** * create a new subscription * @return {Subscription} */ _createSubscriptionOnSession(session: ServerSession, request: CreateSubscriptionRequestLike): Subscription; /** */ private __internal_bindMethod; private _getServerSubscriptionDiagnosticsArrayNode; }