Skip to content

Commit

Permalink
feat(reset): abort pending requests
Browse files Browse the repository at this point in the history
* * *

This commit was sponsored by Neighbourhoodie

You can hire Neighbourhoodie for all your
Hoodie / CouchDB / Offline First needs
http://go.hood.ie/thehoodiefirm
  • Loading branch information
gr2m committed Jan 16, 2016
1 parent ea12b05 commit f7d928d
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 35 deletions.
63 changes: 28 additions & 35 deletions lib/check.js
@@ -1,44 +1,37 @@
module.exports = check

var Promise = require('lie')

var internals = module.exports.internals = {}
internals.nets = require('nets')
internals.cache = require('./utils/cache')
internals.request = require('./utils/request')

function check (state) {
return new Promise(function (resolve, reject) {
internals.nets({
method: state.method,
url: state.url,
timeout: state.timeout
}, function (error, response, body) {
state.timestamp = new Date().toISOString()

if (error) {
error.name = error.code === 'ETIMEDOUT' ? 'TimeoutError' : 'ConnectionError'
error.code = undefined
handleError(state, error)
return reject(error)
}

if (response.statusCode >= 400) {
error = new Error('Server error')
error.name = 'ServerError'
error.code = response.statusCode
handleError(state, error)
return reject(error)
}

if (state.error) {
state.emitter.emit('reconnect')
delete state.error
}

internals.cache.set(state)

resolve()
})
if (state.request) {
state.request.abort()
}

state.request = internals.request({
method: state.method,
url: state.url,
timeout: state.timeout
})

// once requet finishes, remove it from state
state.request.catch(function (error) {
delete state.request
state.timestamp = new Date().toISOString()
handleError(state, error)
})

return state.request.then(function () {
delete state.request
state.timestamp = new Date().toISOString()

if (state.error) {
state.emitter.emit('reconnect')
delete state.error
}

internals.cache.set(state)
})
}

Expand Down
5 changes: 5 additions & 0 deletions lib/reset.js
Expand Up @@ -7,6 +7,11 @@ function reset (state) {
state.timestamp = undefined
state.error = undefined
cache.set(state)

if (state.request) {
state.request.abort()
}

return Promise.resolve().then(function () {
state.emitter.emit('reset')
})
Expand Down
44 changes: 44 additions & 0 deletions lib/utils/request.js
@@ -0,0 +1,44 @@
module.exports = request

var nets = require('nets')
var Promise = require('lie')

function request (options) {
var requestState
var reject
var promise = new Promise(function (resolve, _reject) {
reject = _reject
requestState = nets({
method: options.method,
url: options.url,
timeout: options.timeout
}, function (error, response, body) {
if (error) {
error.name = error.code === 'ETIMEDOUT' ? 'TimeoutError' : 'ConnectionError'
error.code = undefined
return reject(error)
}

if (response.statusCode >= 400) {
error = new Error('Server error')
error.name = 'ServerError'
error.code = response.statusCode
return reject(error)
}

resolve()
})
})

promise.abort = function () {
try {
requestState.abort()
} catch (error) {}
var error = new Error('Aborted')
error.name = 'AbortError'
error.code = 0
reject(error)
}

return promise
}

0 comments on commit f7d928d

Please sign in to comment.