Skip to content

Commit

Permalink
feat(Realtime): Add limit to retry socket connection
Browse files Browse the repository at this point in the history
  • Loading branch information
kosssi committed May 7, 2019
1 parent 8eb413f commit 11653a6
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 18 deletions.
18 changes: 16 additions & 2 deletions packages/cozy-realtime/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,11 @@ class CozyRealtime {
*/
_retryDelay = 1000

/**
* Limit of socket connection
*/
_retryLimit = 60

/**
* Constructor of CozyRealtime:
* - Save cozyClient
Expand Down Expand Up @@ -132,15 +137,24 @@ class CozyRealtime {
*/
_receiveError(error) {
logger.info(`Receive error: ${error}`)
setTimeout(this._resubscribe, this._retryDelay)

this._resetSocket()

if (this._retryLimit === 0) {
this.emit('error', error)
} else {
if (this.retry) {
clearTimeout(this.retry)
}
this.retry = setTimeout(this._resubscribe, this._retryDelay)
}
}

/**
* Re subscribe on server
*/
_resubscribe() {
this._retryDelay = this._retryDelay * 2
this._retryLimit--

const subscribeList = Object.keys(this._events)
.map(key => {
Expand Down
28 changes: 12 additions & 16 deletions packages/cozy-realtime/src/index.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,32 +93,28 @@ describe('Realtime', () => {
await realtime.subscribe(options, handler)
realtime._retryDelay = 100

// restart after 100ms
server.simulate('error')
expect(realtime._socket.isOpen()).toBe(false)
await pause(200)
expect(realtime._socket.isOpen()).toBe(true)

// restart after 200ms
server.simulate('error')
expect(realtime._socket.isOpen()).toBe(false)
await pause(200)
expect(realtime._socket.isOpen()).toBe(false)
await pause(100)
expect(realtime._socket.isOpen()).toBe(true)

// restart after 400ms
server.simulate('error')
expect(realtime._socket.isOpen()).toBe(false)
await pause(400)
expect(realtime._socket.isOpen()).toBe(false)
await pause(800)
expect(realtime._socket.isOpen()).toBe(true)

server.emit('message', JSON.stringify(fakeMessage1))
expect(handler.mock.calls.length).toBe(1)
})

it('should emit error when retry limit is exceeded', async done => {
const realtime = new Realtime(COZY_CLIENT)
realtime._retryLimit = 0

realtime.on('error', () => done())
const handler = jest.fn()

await realtime.subscribe(options, handler)
expect(realtime._socket.isOpen()).toBe(true)
server.simulate('error')
})

it('should update socket authentication when client login', async () => {
const realtime = new Realtime(COZY_CLIENT)

Expand Down

0 comments on commit 11653a6

Please sign in to comment.