Merge branch 'v4_proto'
This commit is contained in:
		@@ -1,3 +1,5 @@
 | 
			
		||||
var Long = require('long');
 | 
			
		||||
 | 
			
		||||
module.exports.notNullOrEmpty = function(value, name) {
 | 
			
		||||
  if (value === null)
 | 
			
		||||
    throw new TypeError(name + " should not be null.");
 | 
			
		||||
@@ -10,9 +12,18 @@ module.exports.notNull = function(value, name) {
 | 
			
		||||
    throw new TypeError(name + " should not be null.");
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
module.exports.isInteger = function(value, name) {
 | 
			
		||||
function isInteger(value, name) {
 | 
			
		||||
  if (typeof value !== 'number' || value % 1 !== 0)
 | 
			
		||||
    throw new TypeError(name + " should be an integer.");
 | 
			
		||||
}
 | 
			
		||||
module.exports.isInteger = isInteger;
 | 
			
		||||
 | 
			
		||||
module.exports.isLongOrInteger = function(value, name) {
 | 
			
		||||
  if (typeof value === 'number') {
 | 
			
		||||
    return isInteger(value, name);
 | 
			
		||||
  } else if (!Long.isLong(value)) {
 | 
			
		||||
    throw new TypeError(name + " should be a Long|number.");
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
module.exports.isArrayOf = function(expectedType, value, name) {
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,8 @@ var SubscriptionsManager = require('./subscriptionsManager');
 | 
			
		||||
var VolatileSubscriptionOperation = require('../clientOperations/volatileSubscriptionOperation');
 | 
			
		||||
var ConnectToPersistentSubscriptionOperation = require('../clientOperations/connectToPersistentSubscriptionOperation');
 | 
			
		||||
var messages = require('./messages');
 | 
			
		||||
var ClientMessage = require('../messages/clientMessage');
 | 
			
		||||
var createBufferSegment = require('../common/bufferSegment');
 | 
			
		||||
 | 
			
		||||
var TcpPackage = require('../systemData/tcpPackage');
 | 
			
		||||
var TcpCommand = require('../systemData/tcpCommand');
 | 
			
		||||
@@ -28,12 +30,14 @@ const ConnectingPhase = {
 | 
			
		||||
  EndPointDiscovery: 'endpointDiscovery',
 | 
			
		||||
  ConnectionEstablishing: 'connectionEstablishing',
 | 
			
		||||
  Authentication: 'authentication',
 | 
			
		||||
  Identification: 'identification',
 | 
			
		||||
  Connected: 'connected'
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const TimerPeriod = 200;
 | 
			
		||||
const TimerTickMessage = new messages.TimerTickMessage();
 | 
			
		||||
const EmptyGuid = '00000000-0000-0000-0000-000000000000';
 | 
			
		||||
const ClientVersion = 1;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @private
 | 
			
		||||
@@ -391,10 +395,21 @@ EventStoreConnectionLogicHandler.prototype._tcpConnectionEstablished = function(
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    this._goToConnectedState();
 | 
			
		||||
    this._goToIdentifiedState();
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
EventStoreConnectionLogicHandler.prototype._goToIdentifiedState = function() {
 | 
			
		||||
  this._connectingPhase = ConnectingPhase.Identification;
 | 
			
		||||
  this._identityInfo = {
 | 
			
		||||
    correlationId: uuid.v4(),
 | 
			
		||||
    timeStamp: Date.now()
 | 
			
		||||
  };
 | 
			
		||||
  var dto = new ClientMessage.IdentifyClient({version: ClientVersion, connectionName: this._esConnection.connectionName});
 | 
			
		||||
  var buf = dto.constructor.encode(dto).finish();
 | 
			
		||||
  this._connection.enqueueSend(new TcpPackage(TcpCommand.IdentifyClient, TcpFlags.None, this._identityInfo.correlationId, null, null, createBufferSegment(buf)))
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
EventStoreConnectionLogicHandler.prototype._goToConnectedState = function() {
 | 
			
		||||
  this._state = ConnectionState.Connected;
 | 
			
		||||
  this._connectingPhase = ConnectingPhase.Connected;
 | 
			
		||||
@@ -498,6 +513,16 @@ EventStoreConnectionLogicHandler.prototype._handleTcpPackage = function(connecti
 | 
			
		||||
      if (pkg.command === TcpCommand.NotAuthenticated)
 | 
			
		||||
        this.emit('authenticationFailed', "Not authenticated");
 | 
			
		||||
 | 
			
		||||
      this._goToIdentifiedState();
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (pkg.command === TcpCommand.ClientIdentified)
 | 
			
		||||
  {
 | 
			
		||||
    if (this._state === ConnectionState.Connecting
 | 
			
		||||
      && this._identityInfo.correlationId === pkg.correlationId)
 | 
			
		||||
    {
 | 
			
		||||
      this._goToConnectedState();
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
@@ -617,7 +642,11 @@ EventStoreConnectionLogicHandler.prototype._timerTick = function() {
 | 
			
		||||
      else if (this._connectingPhase === ConnectingPhase.Authentication && (Date.now() - this._authInfo.timeStamp) >= this._settings.operationTimeout)
 | 
			
		||||
      {
 | 
			
		||||
        this.emit('authenticationFailed', "Authentication timed out.");
 | 
			
		||||
        this._goToConnectedState();
 | 
			
		||||
        if (this._clientVersion === 1) {
 | 
			
		||||
          this._goToIdentifiedState();
 | 
			
		||||
        } else {
 | 
			
		||||
          this._goToConnectedState();
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      else if (this._connectingPhase === ConnectingPhase.Authentication || this._connectingPhase === ConnectingPhase.Connected)
 | 
			
		||||
        this._manageHeartbeats();
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
var util = require('util');
 | 
			
		||||
var uuid = require('uuid');
 | 
			
		||||
var Long = require('long');
 | 
			
		||||
var EventEmitter = require('events').EventEmitter;
 | 
			
		||||
var ensure = require('./common/utils/ensure');
 | 
			
		||||
 | 
			
		||||
@@ -100,15 +101,16 @@ EventStoreNodeConnection.prototype.close = function() {
 | 
			
		||||
 * Delete a stream (async)
 | 
			
		||||
 * @public
 | 
			
		||||
 * @param {string} stream
 | 
			
		||||
 * @param {number} expectedVersion
 | 
			
		||||
 * @param {Long|number} expectedVersion
 | 
			
		||||
 * @param {boolean} [hardDelete]
 | 
			
		||||
 * @param {UserCredentials} [userCredentials]
 | 
			
		||||
 * @returns {Promise.<DeleteResult>}
 | 
			
		||||
 */
 | 
			
		||||
EventStoreNodeConnection.prototype.deleteStream = function(stream, expectedVersion, hardDelete, userCredentials) {
 | 
			
		||||
  ensure.notNullOrEmpty(stream, "stream");
 | 
			
		||||
  ensure.isInteger(expectedVersion, "expectedVersion");
 | 
			
		||||
  hardDelete = !!hardDelete;
 | 
			
		||||
  ensure.isLongOrInteger(expectedVersion, "expectedVersion");
 | 
			
		||||
  expectedVersion = Long.fromValue(expectedVersion);
 | 
			
		||||
  hardDelete = Boolean(hardDelete);
 | 
			
		||||
  userCredentials = userCredentials || null;
 | 
			
		||||
 | 
			
		||||
  var self = this;
 | 
			
		||||
@@ -128,14 +130,15 @@ EventStoreNodeConnection.prototype.deleteStream = function(stream, expectedVersi
 | 
			
		||||
 * Append events to a stream (async)
 | 
			
		||||
 * @public
 | 
			
		||||
 * @param {string} stream The name of the stream to which to append.
 | 
			
		||||
 * @param {number} expectedVersion The version at which we currently expect the stream to be in order that an optimistic concurrency check can be performed.
 | 
			
		||||
 * @param {Long|number} expectedVersion The version at which we currently expect the stream to be in order that an optimistic concurrency check can be performed.
 | 
			
		||||
 * @param {EventData[]|EventData} events The event(s) to append.
 | 
			
		||||
 * @param {UserCredentials} [userCredentials] User credentials
 | 
			
		||||
 * @returns {Promise.<WriteResult>}
 | 
			
		||||
 */
 | 
			
		||||
EventStoreNodeConnection.prototype.appendToStream = function(stream, expectedVersion, events, userCredentials) {
 | 
			
		||||
  ensure.notNullOrEmpty(stream, "stream");
 | 
			
		||||
  ensure.isInteger(expectedVersion, "expectedVersion");
 | 
			
		||||
  ensure.isLongOrInteger(expectedVersion, "expectedVersion");
 | 
			
		||||
  expectedVersion = Long.fromValue(expectedVersion);
 | 
			
		||||
  if (!Array.isArray(events))
 | 
			
		||||
    events = [events];
 | 
			
		||||
  ensure.isArrayOf(EventData, events, "events");
 | 
			
		||||
@@ -157,13 +160,14 @@ EventStoreNodeConnection.prototype.appendToStream = function(stream, expectedVer
 | 
			
		||||
 * Start a transaction (async)
 | 
			
		||||
 * @public
 | 
			
		||||
 * @param {string} stream
 | 
			
		||||
 * @param {number} expectedVersion
 | 
			
		||||
 * @param {Long|number} expectedVersion
 | 
			
		||||
 * @param {UserCredentials} [userCredentials]
 | 
			
		||||
 * @returns {Promise.<EventStoreTransaction>}
 | 
			
		||||
 */
 | 
			
		||||
EventStoreNodeConnection.prototype.startTransaction = function(stream, expectedVersion, userCredentials) {
 | 
			
		||||
  ensure.notNullOrEmpty(stream, "stream");
 | 
			
		||||
  ensure.isInteger(expectedVersion, "expectedVersion");
 | 
			
		||||
  ensure.isLongOrInteger(expectedVersion, "expectedVersion");
 | 
			
		||||
  expectedVersion = Long.fromValue(expectedVersion);
 | 
			
		||||
  userCredentials = userCredentials || null;
 | 
			
		||||
 | 
			
		||||
  var self = this;
 | 
			
		||||
@@ -234,21 +238,20 @@ EventStoreNodeConnection.prototype.commitTransaction = function(transaction, use
 | 
			
		||||
 * Read a single event (async)
 | 
			
		||||
 * @public
 | 
			
		||||
 * @param {string} stream
 | 
			
		||||
 * @param {number} eventNumber
 | 
			
		||||
 * @param {Long|number} eventNumber
 | 
			
		||||
 * @param {boolean} [resolveLinkTos]
 | 
			
		||||
 * @param {UserCredentials} [userCredentials]
 | 
			
		||||
 * @returns {Promise.<EventReadResult>}
 | 
			
		||||
 */
 | 
			
		||||
EventStoreNodeConnection.prototype.readEvent = function(stream, eventNumber, resolveLinkTos, userCredentials) {
 | 
			
		||||
  ensure.notNullOrEmpty(stream, "stream");
 | 
			
		||||
  ensure.isInteger(eventNumber, "eventNumber");
 | 
			
		||||
  if (eventNumber < -1) throw new Error("eventNumber out of range.");
 | 
			
		||||
  resolveLinkTos = !!resolveLinkTos;
 | 
			
		||||
  ensure.isLongOrInteger(eventNumber, "eventNumber");
 | 
			
		||||
  eventNumber = Long.fromValue(eventNumber);
 | 
			
		||||
  resolveLinkTos = Boolean(resolveLinkTos);
 | 
			
		||||
  userCredentials = userCredentials || null;
 | 
			
		||||
 | 
			
		||||
  if (typeof stream !== 'string' || stream === '') throw new TypeError("stream must be an non-empty string.");
 | 
			
		||||
  if (typeof eventNumber !== 'number' || eventNumber % 1 !== 0) throw new TypeError("eventNumber must be an integer.");
 | 
			
		||||
  if (eventNumber < -1) throw new Error("eventNumber out of range.");
 | 
			
		||||
  if (eventNumber.compare(-1) < 0) throw new Error("eventNumber out of range.");
 | 
			
		||||
  if (resolveLinkTos && typeof resolveLinkTos !== 'boolean') throw new TypeError("resolveLinkTos must be a boolean.");
 | 
			
		||||
 | 
			
		||||
  var self = this;
 | 
			
		||||
@@ -267,7 +270,7 @@ EventStoreNodeConnection.prototype.readEvent = function(stream, eventNumber, res
 | 
			
		||||
 * Reading a specific stream forwards (async)
 | 
			
		||||
 * @public
 | 
			
		||||
 * @param {string} stream
 | 
			
		||||
 * @param {number} start
 | 
			
		||||
 * @param {Long|number} start
 | 
			
		||||
 * @param {number} count
 | 
			
		||||
 * @param {boolean} [resolveLinkTos]
 | 
			
		||||
 * @param {UserCredentials} [userCredentials]
 | 
			
		||||
@@ -277,12 +280,13 @@ EventStoreNodeConnection.prototype.readStreamEventsForward = function(
 | 
			
		||||
    stream, start, count, resolveLinkTos, userCredentials
 | 
			
		||||
) {
 | 
			
		||||
  ensure.notNullOrEmpty(stream, "stream");
 | 
			
		||||
  ensure.isInteger(start, "start");
 | 
			
		||||
  ensure.isLongOrInteger(start, "start");
 | 
			
		||||
  start = Long.fromValue(start);
 | 
			
		||||
  ensure.nonNegative(start, "start");
 | 
			
		||||
  ensure.isInteger(count, "count");
 | 
			
		||||
  ensure.positive(count, "count");
 | 
			
		||||
  if (count > MaxReadSize) throw new Error(util.format("Count should be less than %d. For larger reads you should page.", MaxReadSize));
 | 
			
		||||
  resolveLinkTos = !!resolveLinkTos;
 | 
			
		||||
  resolveLinkTos = Boolean(resolveLinkTos);
 | 
			
		||||
  userCredentials = userCredentials || null;
 | 
			
		||||
 | 
			
		||||
  var self = this;
 | 
			
		||||
@@ -301,7 +305,7 @@ EventStoreNodeConnection.prototype.readStreamEventsForward = function(
 | 
			
		||||
 * Reading a specific stream backwards (async)
 | 
			
		||||
 * @public
 | 
			
		||||
 * @param {string} stream
 | 
			
		||||
 * @param {number} start
 | 
			
		||||
 * @param {Long|number} start
 | 
			
		||||
 * @param {number} count
 | 
			
		||||
 * @param {boolean} [resolveLinkTos]
 | 
			
		||||
 * @param {UserCredentials} [userCredentials]
 | 
			
		||||
@@ -311,11 +315,12 @@ EventStoreNodeConnection.prototype.readStreamEventsBackward = function(
 | 
			
		||||
    stream, start, count, resolveLinkTos, userCredentials
 | 
			
		||||
) {
 | 
			
		||||
  ensure.notNullOrEmpty(stream, "stream");
 | 
			
		||||
  ensure.isInteger(start, "start");
 | 
			
		||||
  ensure.isLongOrInteger(start, "start");
 | 
			
		||||
  start = Long.fromValue(start);
 | 
			
		||||
  ensure.isInteger(count, "count");
 | 
			
		||||
  ensure.positive(count, "count");
 | 
			
		||||
  if (count > MaxReadSize) throw new Error(util.format("Count should be less than %d. For larger reads you should page.", MaxReadSize));
 | 
			
		||||
  resolveLinkTos = !!resolveLinkTos;
 | 
			
		||||
  resolveLinkTos = Boolean(resolveLinkTos);
 | 
			
		||||
  userCredentials = userCredentials || null;
 | 
			
		||||
 | 
			
		||||
  var self = this;
 | 
			
		||||
@@ -346,7 +351,7 @@ EventStoreNodeConnection.prototype.readAllEventsForward = function(
 | 
			
		||||
  ensure.isInteger(maxCount, "maxCount");
 | 
			
		||||
  ensure.positive(maxCount, "maxCount");
 | 
			
		||||
  if (maxCount > MaxReadSize) throw new Error(util.format("Count should be less than %d. For larger reads you should page.", MaxReadSize));
 | 
			
		||||
  resolveLinkTos = !!resolveLinkTos;
 | 
			
		||||
  resolveLinkTos = Boolean(resolveLinkTos);
 | 
			
		||||
  userCredentials = userCredentials || null;
 | 
			
		||||
 | 
			
		||||
  var self = this;
 | 
			
		||||
@@ -377,7 +382,7 @@ EventStoreNodeConnection.prototype.readAllEventsBackward = function(
 | 
			
		||||
  ensure.isInteger(maxCount, "maxCount");
 | 
			
		||||
  ensure.positive(maxCount, "maxCount");
 | 
			
		||||
  if (maxCount > MaxReadSize) throw new Error(util.format("Count should be less than %d. For larger reads you should page.", MaxReadSize));
 | 
			
		||||
  resolveLinkTos = !!resolveLinkTos;
 | 
			
		||||
  resolveLinkTos = Boolean(resolveLinkTos);
 | 
			
		||||
  userCredentials = userCredentials || null;
 | 
			
		||||
 | 
			
		||||
  var self = this;
 | 
			
		||||
@@ -427,7 +432,7 @@ EventStoreNodeConnection.prototype.subscribeToStream = function(
 | 
			
		||||
 * Subscribe to a stream from position
 | 
			
		||||
 * @public
 | 
			
		||||
 * @param {!string} stream
 | 
			
		||||
 * @param {?number} lastCheckpoint
 | 
			
		||||
 * @param {?number|Position} lastCheckpoint
 | 
			
		||||
 * @param {!boolean} resolveLinkTos
 | 
			
		||||
 * @param {!function} eventAppeared
 | 
			
		||||
 * @param {function} [liveProcessingStarted]
 | 
			
		||||
@@ -441,7 +446,10 @@ EventStoreNodeConnection.prototype.subscribeToStreamFrom = function(
 | 
			
		||||
    userCredentials, readBatchSize
 | 
			
		||||
) {
 | 
			
		||||
  if (typeof stream !== 'string' || stream === '') throw new TypeError("stream must be a non-empty string.");
 | 
			
		||||
  if (lastCheckpoint !== null && typeof lastCheckpoint !== 'number') throw new TypeError("lastCheckpoint must be a number or null.");
 | 
			
		||||
  if (lastCheckpoint !== null) {
 | 
			
		||||
    ensure.isLongOrInteger(lastCheckpoint);
 | 
			
		||||
    lastCheckpoint = Long.fromValue(lastCheckpoint);
 | 
			
		||||
  }
 | 
			
		||||
  if (typeof eventAppeared !== 'function') throw new TypeError("eventAppeared must be a function.");
 | 
			
		||||
 | 
			
		||||
  var catchUpSubscription =
 | 
			
		||||
@@ -531,7 +539,7 @@ EventStoreNodeConnection.prototype.connectToPersistentSubscription = function(
 | 
			
		||||
  subscriptionDropped = subscriptionDropped || null;
 | 
			
		||||
  userCredentials = userCredentials || null;
 | 
			
		||||
  bufferSize = bufferSize === undefined ? 10 : bufferSize;
 | 
			
		||||
  autoAck = autoAck === undefined ? true : !!autoAck;
 | 
			
		||||
  autoAck = autoAck === undefined ? true : Boolean(autoAck);
 | 
			
		||||
 | 
			
		||||
  var subscription = new EventStorePersistentSubscription(
 | 
			
		||||
      groupName, stream, eventAppeared, subscriptionDropped, userCredentials, this._settings.log,
 | 
			
		||||
@@ -623,7 +631,7 @@ EventStoreNodeConnection.prototype.setStreamMetadata = function() {
 | 
			
		||||
 * Set stream metadata with raw object (async)
 | 
			
		||||
 * @public
 | 
			
		||||
 * @param {string} stream
 | 
			
		||||
 * @param {number} expectedMetastreamVersion
 | 
			
		||||
 * @param {Long|number} expectedMetastreamVersion
 | 
			
		||||
 * @param {object} metadata
 | 
			
		||||
 * @param {UserCredentials} [userCredentials]
 | 
			
		||||
 * @returns {Promise.<WriteResult>}
 | 
			
		||||
@@ -634,6 +642,8 @@ EventStoreNodeConnection.prototype.setStreamMetadataRaw = function(
 | 
			
		||||
  ensure.notNullOrEmpty(stream, "stream");
 | 
			
		||||
  if (systemStreams.isMetastream(stream))
 | 
			
		||||
    throw new Error(util.format("Setting metadata for metastream '%s' is not supported.", stream));
 | 
			
		||||
  ensure.isLongOrInteger(expectedMetastreamVersion, "expectedMetastreamVersion");
 | 
			
		||||
  expectedMetastreamVersion = Long.fromValue(expectedMetastreamVersion);
 | 
			
		||||
  var self = this;
 | 
			
		||||
  return new Promise(function(resolve, reject) {
 | 
			
		||||
    function cb(err, result) {
 | 
			
		||||
@@ -676,12 +686,12 @@ EventStoreNodeConnection.prototype.getStreamMetadataRaw = function(stream, userC
 | 
			
		||||
            var evnt = res.event.originalEvent;
 | 
			
		||||
            var version = evnt ? evnt.eventNumber : -1;
 | 
			
		||||
            var data = evnt ? JSON.parse(evnt.data.toString()) : null;
 | 
			
		||||
            return new results.RawStreamMetadataResult(stream, false, version, data);
 | 
			
		||||
            return new results.RawStreamMetadataResult(stream, false, Long.fromValue(version), data);
 | 
			
		||||
          case results.EventReadStatus.NotFound:
 | 
			
		||||
          case results.EventReadStatus.NoStream:
 | 
			
		||||
            return new results.RawStreamMetadataResult(stream, false, -1, null);
 | 
			
		||||
            return new results.RawStreamMetadataResult(stream, false, Long.fromValue(-1), null);
 | 
			
		||||
          case results.EventReadStatus.StreamDeleted:
 | 
			
		||||
            return new results.RawStreamMetadataResult(stream, true, 0x7fffffff, null);
 | 
			
		||||
            return new results.RawStreamMetadataResult(stream, true, Long.fromValue(0x7fffffff), null);
 | 
			
		||||
          default:
 | 
			
		||||
            throw new Error(util.format("Unexpected ReadEventResult: %s.", res.status));
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,5 @@
 | 
			
		||||
var util = require('util');
 | 
			
		||||
var Long = require('long');
 | 
			
		||||
 | 
			
		||||
var EventStoreCatchUpSubscription = require('./eventStoreCatchUpSubscription');
 | 
			
		||||
var SliceReadStatus = require('./sliceReadStatus');
 | 
			
		||||
@@ -14,8 +15,8 @@ function EventStoreStreamCatchUpSubscription(
 | 
			
		||||
 | 
			
		||||
  //Ensure.NotNullOrEmpty(streamId, "streamId");
 | 
			
		||||
 | 
			
		||||
  this._lastProcessedEventNumber = fromEventNumberExclusive === null ? -1 : fromEventNumberExclusive;
 | 
			
		||||
  this._nextReadEventNumber = fromEventNumberExclusive === null ? 0 : fromEventNumberExclusive + 1;
 | 
			
		||||
  this._lastProcessedEventNumber = fromEventNumberExclusive === null ? Long.fromNumber(-1) : fromEventNumberExclusive;
 | 
			
		||||
  this._nextReadEventNumber = fromEventNumberExclusive === null ? Long.fromNumber(0) : fromEventNumberExclusive.add(1);
 | 
			
		||||
}
 | 
			
		||||
util.inherits(EventStoreStreamCatchUpSubscription, EventStoreCatchUpSubscription);
 | 
			
		||||
 | 
			
		||||
@@ -47,14 +48,14 @@ EventStoreStreamCatchUpSubscription.prototype._readEventsTill = function(
 | 
			
		||||
              return processEvents(slice.events, 0)
 | 
			
		||||
                  .then(function() {
 | 
			
		||||
                    self._nextReadEventNumber = slice.nextEventNumber;
 | 
			
		||||
                    var done = Promise.resolve(lastEventNumber === null ? slice.isEndOfStream : slice.nextEventNumber > lastEventNumber);
 | 
			
		||||
                    var done = Promise.resolve(lastEventNumber === null ? slice.isEndOfStream : slice.nextEventNumber.compare(lastEventNumber) > 0);
 | 
			
		||||
                    if (!done && slice.isEndOfStream)
 | 
			
		||||
                        return delay(100, false);
 | 
			
		||||
                    return done;
 | 
			
		||||
                  });
 | 
			
		||||
              break;
 | 
			
		||||
            case SliceReadStatus.StreamNotFound:
 | 
			
		||||
              if (lastEventNumber && lastEventNumber !== -1)
 | 
			
		||||
              if (lastEventNumber && lastEventNumber.compare(-1) !== 0)
 | 
			
		||||
                throw new Error(util.format("Impossible: stream %s disappeared in the middle of catching up subscription.", self.streamId));
 | 
			
		||||
              return true;
 | 
			
		||||
            case SliceReadStatus.StreamDeleted:
 | 
			
		||||
@@ -80,7 +81,7 @@ EventStoreStreamCatchUpSubscription.prototype._readEventsTill = function(
 | 
			
		||||
EventStoreStreamCatchUpSubscription.prototype._tryProcess = function(e) {
 | 
			
		||||
  var processed = false;
 | 
			
		||||
  var promise;
 | 
			
		||||
  if (e.originalEventNumber > this._lastProcessedEventNumber) {
 | 
			
		||||
  if (e.originalEventNumber.compare(this._lastProcessedEventNumber) > 0) {
 | 
			
		||||
    promise = this._eventAppeared(this, e);
 | 
			
		||||
    this._lastProcessedEventNumber = e.originalEventNumber;
 | 
			
		||||
    processed = true;
 | 
			
		||||
@@ -88,7 +89,7 @@ EventStoreStreamCatchUpSubscription.prototype._tryProcess = function(e) {
 | 
			
		||||
  if (this._verbose)
 | 
			
		||||
    this._log.debug("Catch-up Subscription to %s: %s event (%s, %d, %s @ %d).",
 | 
			
		||||
        this.isSubscribedToAll ? '<all>' : this.streamId, processed ? "processed" : "skipping",
 | 
			
		||||
        e.originalEvent.eventStreamId, e.originalEvent.eventNumber, e.originalEvent.eventType, e.originalEventNumber)
 | 
			
		||||
        e.originalEvent.eventStreamId, e.originalEvent.eventNumber, e.originalEvent.eventType, e.originalEventNumber);
 | 
			
		||||
  return (promise && promise.then) ? promise : Promise.resolve();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										21985
									
								
								src/messages/messages.js
									
									
									
									
									
								
							
							
						
						
									
										21985
									
								
								src/messages/messages.js
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -23,7 +23,7 @@ message NewEvent {
 | 
			
		||||
 | 
			
		||||
message EventRecord {
 | 
			
		||||
	required string event_stream_id = 1;
 | 
			
		||||
	required int32 event_number = 2;
 | 
			
		||||
	required int64 event_number = 2;
 | 
			
		||||
	required bytes event_id = 3;
 | 
			
		||||
	required string event_type = 4;
 | 
			
		||||
	required int32 data_content_type = 5;
 | 
			
		||||
@@ -48,7 +48,7 @@ message ResolvedEvent {
 | 
			
		||||
 | 
			
		||||
message WriteEvents {
 | 
			
		||||
	required string event_stream_id = 1;
 | 
			
		||||
	required int32 expected_version = 2;
 | 
			
		||||
	required int64 expected_version = 2;
 | 
			
		||||
	repeated NewEvent events = 3;
 | 
			
		||||
	required bool require_master = 4;
 | 
			
		||||
}
 | 
			
		||||
@@ -56,15 +56,16 @@ message WriteEvents {
 | 
			
		||||
message WriteEventsCompleted {
 | 
			
		||||
	required OperationResult result = 1;
 | 
			
		||||
	optional string message = 2;
 | 
			
		||||
	required int32 first_event_number = 3;
 | 
			
		||||
	required int32 last_event_number = 4;
 | 
			
		||||
	required int64 first_event_number = 3;
 | 
			
		||||
	required int64 last_event_number = 4;
 | 
			
		||||
	optional int64 prepare_position = 5;
 | 
			
		||||
	optional int64 commit_position = 6;
 | 
			
		||||
	optional int64 current_version  = 7;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message DeleteStream {
 | 
			
		||||
	required string event_stream_id = 1;
 | 
			
		||||
	required int32 expected_version = 2;
 | 
			
		||||
	required int64 expected_version = 2;
 | 
			
		||||
	required bool require_master = 3;
 | 
			
		||||
	optional bool hard_delete = 4;
 | 
			
		||||
}
 | 
			
		||||
@@ -78,7 +79,7 @@ message DeleteStreamCompleted {
 | 
			
		||||
 | 
			
		||||
message TransactionStart {
 | 
			
		||||
	required string event_stream_id = 1;
 | 
			
		||||
	required int32 expected_version = 2;
 | 
			
		||||
	required int64 expected_version = 2;
 | 
			
		||||
	required bool require_master = 3;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -109,15 +110,15 @@ message TransactionCommitCompleted {
 | 
			
		||||
	required int64 transaction_id = 1;
 | 
			
		||||
	required OperationResult result = 2;
 | 
			
		||||
	optional string message = 3;
 | 
			
		||||
	required int32 first_event_number = 4;
 | 
			
		||||
	required int32 last_event_number = 5;
 | 
			
		||||
	required int64 first_event_number = 4;
 | 
			
		||||
	required int64 last_event_number = 5;
 | 
			
		||||
	optional int64 prepare_position = 6;
 | 
			
		||||
	optional int64 commit_position = 7;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message ReadEvent {
 | 
			
		||||
	required string event_stream_id = 1;
 | 
			
		||||
	required int32 event_number = 2;
 | 
			
		||||
	required int64 event_number = 2;
 | 
			
		||||
	required bool resolve_link_tos = 3;
 | 
			
		||||
	required bool require_master = 4;
 | 
			
		||||
}
 | 
			
		||||
@@ -141,7 +142,7 @@ message ReadEventCompleted {
 | 
			
		||||
 | 
			
		||||
message ReadStreamEvents {
 | 
			
		||||
	required string event_stream_id = 1;
 | 
			
		||||
	required int32 from_event_number = 2;
 | 
			
		||||
	required int64 from_event_number = 2;
 | 
			
		||||
	required int32 max_count = 3;
 | 
			
		||||
	required bool resolve_link_tos = 4;
 | 
			
		||||
	required bool require_master = 5;
 | 
			
		||||
@@ -160,8 +161,8 @@ message ReadStreamEventsCompleted {
 | 
			
		||||
 | 
			
		||||
	repeated ResolvedIndexedEvent events = 1;
 | 
			
		||||
	required ReadStreamResult result = 2;
 | 
			
		||||
	required int32 next_event_number = 3;
 | 
			
		||||
	required int32 last_event_number = 4;
 | 
			
		||||
	required int64 next_event_number = 3;
 | 
			
		||||
	required int64 last_event_number = 4;
 | 
			
		||||
	required bool is_end_of_stream = 5;
 | 
			
		||||
	required int64 last_commit_position = 6;
 | 
			
		||||
 | 
			
		||||
@@ -199,7 +200,7 @@ message CreatePersistentSubscription {
 | 
			
		||||
	required string subscription_group_name = 1;
 | 
			
		||||
	required string event_stream_id = 2;
 | 
			
		||||
	required bool resolve_link_tos = 3;
 | 
			
		||||
	required int32 start_from = 4;
 | 
			
		||||
	required int64 start_from = 4;
 | 
			
		||||
	required int32 message_timeout_milliseconds = 5;
 | 
			
		||||
	required bool record_statistics = 6;
 | 
			
		||||
	required int32 live_buffer_size = 7;
 | 
			
		||||
@@ -223,7 +224,7 @@ message UpdatePersistentSubscription {
 | 
			
		||||
	required string subscription_group_name = 1;
 | 
			
		||||
	required string event_stream_id = 2;
 | 
			
		||||
	required bool resolve_link_tos = 3;
 | 
			
		||||
	required int32 start_from = 4;
 | 
			
		||||
	required int64 start_from = 4;
 | 
			
		||||
	required int32 message_timeout_milliseconds = 5;
 | 
			
		||||
	required bool record_statistics = 6;
 | 
			
		||||
	required int32 live_buffer_size = 7;
 | 
			
		||||
@@ -301,7 +302,7 @@ message PersistentSubscriptionNakEvents {
 | 
			
		||||
message PersistentSubscriptionConfirmation {
 | 
			
		||||
	required int64 last_commit_position = 1;
 | 
			
		||||
	required string subscription_id = 2;
 | 
			
		||||
	optional int32 last_event_number = 3;
 | 
			
		||||
	optional int64 last_event_number = 3;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message PersistentSubscriptionStreamEventAppeared {
 | 
			
		||||
@@ -315,7 +316,7 @@ message SubscribeToStream {
 | 
			
		||||
 | 
			
		||||
message SubscriptionConfirmation {
 | 
			
		||||
	required int64 last_commit_position = 1;
 | 
			
		||||
	optional int32 last_event_number = 2;
 | 
			
		||||
	optional int64 last_event_number = 2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message StreamEventAppeared {
 | 
			
		||||
@@ -375,3 +376,11 @@ message ScavengeDatabaseCompleted {
 | 
			
		||||
	required int32 total_time_ms = 3;
 | 
			
		||||
	required int64 total_space_saved = 4;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message IdentifyClient {
 | 
			
		||||
	required int32 version = 1;
 | 
			
		||||
	optional string connection_name = 2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message ClientIdentified {
 | 
			
		||||
}
 | 
			
		||||
@@ -1,4 +1,6 @@
 | 
			
		||||
var SystemConsumerStrategies = require('./systemConsumerStrategies');
 | 
			
		||||
var ensure = require('./common/utils/ensure');
 | 
			
		||||
var Long = require('long');
 | 
			
		||||
 | 
			
		||||
function PersistentSubscriptionSettings(
 | 
			
		||||
  resolveLinkTos, startFrom, extraStatistics, messageTimeout,
 | 
			
		||||
@@ -6,6 +8,9 @@ function PersistentSubscriptionSettings(
 | 
			
		||||
  checkPointAfter, minCheckPointCount, maxCheckPointCount,
 | 
			
		||||
  maxSubscriberCount, namedConsumerStrategy
 | 
			
		||||
) {
 | 
			
		||||
  ensure.isLongOrInteger(startFrom);
 | 
			
		||||
  startFrom = Long.fromValue(startFrom);
 | 
			
		||||
 | 
			
		||||
  this.resolveLinkTos = resolveLinkTos;
 | 
			
		||||
  this.startFrom = startFrom;
 | 
			
		||||
  this.extraStatistics = extraStatistics;
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,7 @@ Object.freeze(EventReadStatus);
 | 
			
		||||
 * @constructor
 | 
			
		||||
 * @property {string} eventStreamId
 | 
			
		||||
 * @property {string} eventId
 | 
			
		||||
 * @property {number} eventNumber
 | 
			
		||||
 * @property {Long} eventNumber
 | 
			
		||||
 * @property {string} eventType
 | 
			
		||||
 * @property {number} createdEpoch
 | 
			
		||||
 * @property {?Buffer} data
 | 
			
		||||
@@ -73,7 +73,7 @@ function RecordedEvent(ev) {
 | 
			
		||||
 * @property {boolean} isResolved
 | 
			
		||||
 * @property {?Position} originalPosition
 | 
			
		||||
 * @property {string} originalStreamId
 | 
			
		||||
 * @property {number} originalEventNumber
 | 
			
		||||
 * @property {Long} originalEventNumber
 | 
			
		||||
 */
 | 
			
		||||
function ResolvedEvent(ev) {
 | 
			
		||||
  this.event = ev.event === null ? null : new RecordedEvent(ev.event);
 | 
			
		||||
@@ -90,12 +90,12 @@ function ResolvedEvent(ev) {
 | 
			
		||||
 *
 | 
			
		||||
 * @param {string} status
 | 
			
		||||
 * @param {string} stream
 | 
			
		||||
 * @param {number} eventNumber
 | 
			
		||||
 * @param {Long} eventNumber
 | 
			
		||||
 * @param {object} event
 | 
			
		||||
 * @constructor
 | 
			
		||||
 * @property {string} status
 | 
			
		||||
 * @property {string} stream
 | 
			
		||||
 * @property {number} eventNumber
 | 
			
		||||
 * @property {Long} eventNumber
 | 
			
		||||
 * @property {ResolvedEvent} event
 | 
			
		||||
 */
 | 
			
		||||
function EventReadResult(status, stream, eventNumber, event) {
 | 
			
		||||
@@ -110,7 +110,7 @@ function EventReadResult(status, stream, eventNumber, event) {
 | 
			
		||||
 * @param {number} nextExpectedVersion
 | 
			
		||||
 * @param {Position} logPosition
 | 
			
		||||
 * @constructor
 | 
			
		||||
 * @property {number} nextExpectedVersion
 | 
			
		||||
 * @property {Long} nextExpectedVersion
 | 
			
		||||
 * @property {Position} logPosition
 | 
			
		||||
 */
 | 
			
		||||
function WriteResult(nextExpectedVersion, logPosition) {
 | 
			
		||||
@@ -122,20 +122,20 @@ function WriteResult(nextExpectedVersion, logPosition) {
 | 
			
		||||
/**
 | 
			
		||||
 * @param {string} status
 | 
			
		||||
 * @param {string} stream
 | 
			
		||||
 * @param {number} fromEventNumber
 | 
			
		||||
 * @param {Long} fromEventNumber
 | 
			
		||||
 * @param {string} readDirection
 | 
			
		||||
 * @param {object[]} events
 | 
			
		||||
 * @param {number} nextEventNumber
 | 
			
		||||
 * @param {number} lastEventNumber
 | 
			
		||||
 * @param {Long} nextEventNumber
 | 
			
		||||
 * @param {Long} lastEventNumber
 | 
			
		||||
 * @param {boolean} isEndOfStream
 | 
			
		||||
 * @constructor
 | 
			
		||||
 * @property {string} status
 | 
			
		||||
 * @property {string} stream
 | 
			
		||||
 * @property {number} fromEventNumber
 | 
			
		||||
 * @property {Long} fromEventNumber
 | 
			
		||||
 * @property {string} readDirection
 | 
			
		||||
 * @property {ResolvedEvent[]} events
 | 
			
		||||
 * @property {number} nextEventNumber
 | 
			
		||||
 * @property {number} lastEventNumber
 | 
			
		||||
 * @property {Long} nextEventNumber
 | 
			
		||||
 * @property {Long} lastEventNumber
 | 
			
		||||
 * @property {boolean} isEndOfStream
 | 
			
		||||
 */
 | 
			
		||||
function StreamEventsSlice(
 | 
			
		||||
@@ -185,12 +185,12 @@ function DeleteResult(logPosition) {
 | 
			
		||||
/**
 | 
			
		||||
 * @param {string} stream
 | 
			
		||||
 * @param {boolean} isStreamDeleted
 | 
			
		||||
 * @param {number} metastreamVersion
 | 
			
		||||
 * @param {Long} metastreamVersion
 | 
			
		||||
 * @param {object} streamMetadata
 | 
			
		||||
 * @constructor
 | 
			
		||||
 * @property {string} stream
 | 
			
		||||
 * @property {boolean} isStreamDeleted
 | 
			
		||||
 * @property {number} metastreamVersion
 | 
			
		||||
 * @property {Long} metastreamVersion
 | 
			
		||||
 * @property {object} streamMetadata
 | 
			
		||||
 */
 | 
			
		||||
function RawStreamMetadataResult(stream, isStreamDeleted, metastreamVersion, streamMetadata) {
 | 
			
		||||
 
 | 
			
		||||
@@ -71,7 +71,9 @@ const TcpCommand = {
 | 
			
		||||
  NotHandled: 0xF1,
 | 
			
		||||
  Authenticate: 0xF2,
 | 
			
		||||
  Authenticated: 0xF3,
 | 
			
		||||
  NotAuthenticated: 0xF4
 | 
			
		||||
  NotAuthenticated: 0xF4,
 | 
			
		||||
  IdentifyClient: 0xF5,
 | 
			
		||||
  ClientIdentified: 0xF6
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var _reverseLookup = {};
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user