Home Reference Source Test

src/eventstore/EventstoreSettings.ts

import * as bunyan from 'bunyan'
import uuid = require('uuid/v4')
import * as tls from 'tls'

/**
 * @external {bunyan} https://github.com/trentm/node-bunyan
 */

/**
 * @external {Long} https://github.com/dcodeIO/long.js
 */

/**
 * @typedef {object} UserCredentials
 * @property {string} username username to use for authentication
 * @property {string} password password to use for authentication
 */
export interface UserCredentials {
  username: string
  password: string
}

/**
 * @typedef {Object} EventstoreSettings
 * @property {string} uri connection uri (default=tcp://admin@changeit@127.0.0.1:1113)
 * @property {boolean} useSSL indicates if to connect to secure tcp port (default=false)
 * @property {SecureContextOptions | null} secureContext node tls.SecureContextOptions (default=null)
 * @property {boolean} useHttps indicates if to use https for discovery (default=false)
 * @property {string} host connection host name (will be ignored if uri is set)
 * @property {number} port connection port (will be ignored if uri is set)
 * @property {UserCredentials} credentials user credentials
 * @property {boolean} requireMaster forces to connect to master node only if set to true (default=true)
 * @property {bunyan} logger bunyan logger instance
 * @property {number} maxQueueSize maximum pending requests (default=5000)
 * @property {number} connectTimeout connect timeout in ms (default=1000)
 * @property {number} maxReconnections maximum re-connection tries (default=10)
 * @property {number} reconnectionDelay delay between reconnects in ms (default=2000)
 * @property {number} operationTimeout time in ms until a request timed out if no response from eventstore arrives (default=7000)
 * @property {number} operationTimeoutCheckPeriod time period in ms to check for timed out requests (default=1000)
 * @property {string} clusterDns dns ip to use to discover eventstore cluster ip's (default=empty string)
 * @property {number} maxDiscoverAttempts maximum count of discover attempts before giving up
 * @property {number} externalGossipPort gossip ip port (default=2112)
 * @property {number} gossipTimeout timeout in ms (default=1000)
 * @property {string[]} gossipSeeds array list of eventstore cluster ip's
 * @property {boolean} validateServer validate server ssl certificate (default=false)
 * @property {string} clientId client id string to identify connection at eventstore (default=ts-client-uuid())
 *
 */
export interface EventstoreSettings {
  uri: string
  useSSL: boolean
  secureContext: null | tls.SecureContextOptions
  useHttps: boolean
  host: string
  port: number
  credentials: UserCredentials
  requireMaster: boolean
  logger: bunyan

  maxQueueSize: number
  connectTimeout: number
  maxReconnections: number
  reconnectionDelay: number
  operationTimeout: number
  operationTimeoutCheckPeriod: number
  clusterDns: string
  maxDiscoverAttempts: number
  externalGossipPort: number
  gossipTimeout: number
  gossipSeeds: string[]
  validateServer: boolean
  clientId: string
}

/** default eventstore connection settings */
const defaultConnectionSettings: EventstoreSettings = {
  uri: 'tcp://admin@changeit@127.0.0.1:1113',
  requireMaster: true,

  maxDiscoverAttempts: 10,
  clusterDns: '',
  externalGossipPort: 2112,
  gossipTimeout: 1000,
  gossipSeeds: [],

  useSSL: false, //use tcp encrypted?
  secureContext: null,
  useHttps: false, //fetch gossip info over https?
  validateServer: false,

  connectTimeout: 1000,
  maxReconnections: 10,
  reconnectionDelay: 2 * 1000,

  clientId: `ts-client-${uuid()}`,

  maxQueueSize: 5000,

  operationTimeout: 7 * 1000,
  operationTimeoutCheckPeriod: 1000,

  logger: bunyan.createLogger({
    name: 'eventstore-ts-client',
    level: 'debug'
  }),

  host: '', //dummy entry will be overwritten by internal functions
  port: 0, //dummy entry will be overwritten by internal functions
  credentials: {
    password: '', //dummy entry will be overwritten by internal functions
    username: '' //dummy entry will be overwritten by internal functions
  }
}

/**
 * Generates settings for connecting to eventstore
 */
export function setConnectionSettings(
  customSettings: object | EventstoreSettings
): EventstoreSettings {
  return {...defaultConnectionSettings, ...customSettings}
}