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}
}