@sap/cds
Version:
SAP Cloud Application Programming Model - CDS for Node.js
80 lines (69 loc) • 2.05 kB
JavaScript
const { expBkfRnd: waitingTime } = require('../../common/utils/waitingTime')
const _connectUntilConnected = (client, LOG, x) => {
const _waitingTime = waitingTime(x)
setTimeout(() => {
connect(client, LOG, true)
.then(() => {
LOG._warn && LOG.warn('Reconnected to Enterprise Messaging Client')
})
.catch(() => {
LOG._warn &&
LOG.warn(
`Connection to Enterprise Messaging Client lost: Reconnecting in ${Math.round(_waitingTime / 1000)} s`
)
_connectUntilConnected(client, LOG, x + 1)
})
}, _waitingTime)
}
const connect = (client, LOG, keepAlive) => {
return new Promise((resolve, reject) => {
client
.once('connected', function () {
client.removeAllListeners('error')
client.once('error', err => {
if (LOG._error) {
err.message = 'Client error: ' + err.message
LOG.error(err)
}
if (keepAlive) {
client.removeAllListeners('error')
client.removeAllListeners('connected')
_connectUntilConnected(client, LOG, 0)
}
})
if (keepAlive) {
client.once('disconnected', () => {
client.removeAllListeners('error')
client.removeAllListeners('connected')
_connectUntilConnected(client, LOG, 0)
})
}
resolve(this)
})
.once('error', err => {
client.removeAllListeners('connected')
reject(err)
})
client.connect()
})
}
const disconnect = client => {
return new Promise((resolve, reject) => {
client.removeAllListeners('disconnected')
client.removeAllListeners('connected')
client.removeAllListeners('error')
client.once('disconnected', () => {
client.removeAllListeners('error')
resolve()
})
client.once('error', err => {
client.removeAllListeners('disconnected')
reject(err)
})
client.disconnect()
})
}
module.exports = {
connect,
disconnect
}