node-etcd
Version:
etcd library for node.js (etcd v2 api)
98 lines (74 loc) • 2.43 kB
text/coffeescript
{EventEmitter} = require 'events'
# A eventemitter for watching changes on a given key for etcd.
# Emits:
# 'change' - on value change
# 'reconnect' - on errors/timeouts
# '<etcd action>' - the etcd action that triggered the watcher (set, delete, etc)
#
# Automatically reconnects and backs off on errors.
#
class Watcher extends EventEmitter
constructor: (, , = null, = {}) ->
= false
= 0
stop: () =>
= true
.abort()
'stop', "Watcher for '#{@key}' aborted."
_watch: () =>
if is null
= .watch , ,
else
= .watchIndex , , ,
_error: (err) =>
# Something went wrong, most likely on the network,
# maybe disconnected, or similar.
error = new Error 'Connection error, reconnecting.'
error.error = err
error.reconnectCount =
'reconnect', error
_missingValue: (headers) =>
# Etcd sent us an empty response, it seems to do this when
# it times out a watching client.
error = new Error 'Etcd timed out watcher, reconnecting.'
error.headers = headers
= 0
'reconnect', error
_valueChanged: (val, headers) =>
# Valid data received, value was changed.
= 0
= val.node.modifiedIndex + 1
'change', val, headers
val.action, val, headers if val.action?
_unexpectedData: (val, headers) =>
# Unexpected data received
error = new Error 'Received unexpected response'
error.response = val;
'error', error
_resync: (err) =>
= err.error.index
= 0
'resync', err
_respHandler: (err, val, headers) =>
return if
if err?.errorCode is 401 and err.error?.index?
err
else if err
err
else if headers?['x-etcd-index']? and not val?
headers
else if val?.node?.modifiedIndex?
val, headers
else
val, headers
_retry: () =>
timeout = (Math.pow(2,)*300) + (Math.round(Math.random() * 1000))
setTimeout , timeout
++
exports = module.exports = Watcher