APIs

Show:
"use strict";
/**
 * @module opcua.miscellaneous
 */

const assert = require("node-opcua-assert").assert;

/**
 * SequenceNumberGenerator manages a monotonically increasing sequence number.
 * @class SequenceNumberGenerator
 * @constructor
 *
 * @see OPC Unified Architecture, Part 6 -  $6.4.2 page 36 -
 *
 * The SequenceNumber shall also monotonically increase for all messages and shall not wrap
 * around until it is greater than 4294966271 (UInt32.MaxValue – 1024). The first number after
 * the wrap around shall be less than 1024. Note that this requirement means that
 * SequenceNumbers do not reset when a new TokenId is issued.
 * The SequenceNumber shall be incremented by exactly one for each MessageChunk sent unless
 * the communication channel was interrupted and re-established. Gaps are permitted between the
 * SequenceNumber for the last MessageChunk received before the interruption and the
 */
const SequenceNumberGenerator = function SequenceNumberGenerator() {
    assert(this instanceof SequenceNumberGenerator);
    this._set(1);
};

/**
 * @method next
 * @return {number}
 */
SequenceNumberGenerator.prototype.next = function () {
    const current = this._counter;
    this._counter += 1;
    if (this._counter > this.MAXVALUE) {
        this._set(1);
    }
    return current;
};
/**
 * @method future
 * @return {Number}
 */
SequenceNumberGenerator.prototype.future = function () {
    return this._counter;
};

/**
 * @method _set
 * @private
 */
SequenceNumberGenerator.prototype._set = function (value) {
    this._counter = value;
};


// spec Part 3 says:
// The same sequence number shall not be reused on a Subscription until over
// four billion NotificationMessages have been sent.
// At a continuous rate of one thousand NotificationMessages per second on a given Subscription, it would
// take roughly fifty days for the same sequence number to be reused. This allows Clients to safely treat
// sequence numbers as unique.
SequenceNumberGenerator.prototype.MAXVALUE = 4294966271;
exports.SequenceNumberGenerator = SequenceNumberGenerator;