Comparing version 0.10.0 to 1.0.0
{ | ||
"name": "sneeze", | ||
"version": "0.10.0", | ||
"version": "1.0.0", | ||
"description": "Easily join SWIM networks", | ||
"main": "sneeze.js", | ||
"scripts": { | ||
"test": "lab -P test -v -t 80 -r console -I URL,URLSearchParams,BigUint64Array,BigInt64Array,BigInt", | ||
"coveralls": "lab -s -P test -r lcov -I URL,URLSearchParamsBigUint64Array,BigInt64Array,BigInt | coveralls", | ||
"prettier": "prettier --write --no-semi --single-quote mesh.js" | ||
"test": "lab -v -P test -t 80 -I SharedArrayBuffer,Atomics,URL,URLSearchParams,BigUint64Array,BigInt64Array,BigInt", | ||
"coveralls": "lab -s test/use.test.js -r lcov | coveralls", | ||
"coverage": "lab -v test/use.test.js -t 85 -r html > coverage.html", | ||
"prettier": "prettier --write --no-semi --single-quote *.js lib/*.js test/*.js", | ||
"clean": "rm -rf node_modules yarn.lock package-lock.json", | ||
"repo-tag": "REPO_VERSION=`node -e \"console.log(require('./package').version)\"` && echo TAG: v$REPO_VERSION && git commit -a -m v$REPO_VERSION && git push && git tag v$REPO_VERSION && git push --tags;", | ||
"repo-publish": "npm run prettier && npm test && npm run repo-tag && npm publish" | ||
}, | ||
@@ -28,17 +32,18 @@ "repository": { | ||
"dependencies": { | ||
"ansi-escapes": "3.1", | ||
"chalk": "2.4", | ||
"jsonpath": "1.0", | ||
"keypress": "0.2", | ||
"ansi-escapes": "^3.1.0", | ||
"chalk": "^2.4.2", | ||
"jsonpath": "^1.0.0", | ||
"keypress": "^0.2.1", | ||
"lodash": "4.17", | ||
"nid": "0.3", | ||
"optioner": "1.1", | ||
"pad": "2.1", | ||
"swim": "0.6" | ||
"nid": "^0.3.2", | ||
"optioner": "^1.1.0", | ||
"pad": "^2.1.0", | ||
"static-eval": "^2.0.1", | ||
"swim": "^0.6.0" | ||
}, | ||
"devDependencies": { | ||
"code": "4", | ||
"lab": "14", | ||
"coveralls": "3", | ||
"prettier": "1" | ||
"code": "^4.1.0", | ||
"coveralls": "^3.0.2", | ||
"lab": "^18.0.2", | ||
"prettier": "^1.16.4" | ||
}, | ||
@@ -45,0 +50,0 @@ "files": [ |
276
sneeze.js
@@ -25,10 +25,9 @@ /* | ||
var DEFAULT_HOST = module.exports.DEFAULT_HOST = '127.0.0.1' | ||
var DEFAULT_PORT = module.exports.DEFAULT_PORT = 39999 | ||
var DEFAULT_HOST = (module.exports.DEFAULT_HOST = '127.0.0.1') | ||
var DEFAULT_PORT = (module.exports.DEFAULT_PORT = 39999) | ||
var optioner = Optioner({ | ||
isbase: false, | ||
host: DEFAULT_HOST, | ||
bases: Joi.array().default([DEFAULT_HOST+':'+DEFAULT_PORT]), | ||
bases: Joi.array().default([DEFAULT_HOST + ':' + DEFAULT_PORT]), | ||
retry_attempts: 22, | ||
@@ -44,7 +43,7 @@ retry_min: 111, | ||
// [include,exclude] | ||
port_range: [40000,50000], | ||
port_range: [40000, 50000], | ||
monitor: { | ||
active: false, | ||
meta: ['route','config.pin'] | ||
meta: ['route', 'config.pin'] | ||
}, | ||
@@ -55,8 +54,7 @@ | ||
module.exports = function (options) { | ||
return new Sneeze( options ) | ||
module.exports = function(options) { | ||
return new Sneeze(options) | ||
} | ||
function Sneeze (options) { | ||
function Sneeze(options) { | ||
Events.EventEmitter.call(this) | ||
@@ -70,24 +68,31 @@ var self = this | ||
self.monitor = !!options.monitor.active ? make_monitor(self,options) : _.noop | ||
self.monitor = !!options.monitor.active | ||
? make_monitor(self, options) | ||
: _.noop | ||
self.log = | ||
!!options.silent ? _.noop : | ||
_.isFunction(options.log) ? options.log : | ||
function () { | ||
console.log.apply(null,_.flatten( | ||
['SNEEZE', (''+Date.now()).substring(8), arguments])) | ||
} | ||
self.log = !!options.silent | ||
? _.noop | ||
: _.isFunction(options.log) | ||
? options.log | ||
: function() { | ||
console.log.apply( | ||
null, | ||
_.flatten(['SNEEZE', ('' + Date.now()).substring(8), arguments]) | ||
) | ||
} | ||
self.makeport = _.isFunction(options.port) ? options.port : | ||
function() { | ||
var port = parseInt(options.port) | ||
var pr = options.port_range | ||
self.makeport = _.isFunction(options.port) | ||
? options.port | ||
: function() { | ||
var port = parseInt(options.port) | ||
var pr = options.port_range | ||
port = !isNaN(port) ? port : | ||
isbase ? DEFAULT_PORT : | ||
pr[0] + | ||
Math.floor(((pr[1]-pr[0])*Math.random())) | ||
port = !isNaN(port) | ||
? port | ||
: isbase | ||
? DEFAULT_PORT | ||
: pr[0] + Math.floor((pr[1] - pr[0]) * Math.random()) | ||
return port | ||
} | ||
return port | ||
} | ||
@@ -97,7 +102,8 @@ var swim | ||
self.join = function( meta ) { | ||
self.join = function(meta) { | ||
meta = meta || {} | ||
var attempts = 0, max_attempts = options.retry_attempts, joined = false | ||
var attempts = 0, | ||
max_attempts = options.retry_attempts, | ||
joined = false | ||
@@ -114,8 +120,11 @@ function join() { | ||
self.id = meta.identifier$ = null == options.identifier ? | ||
host+'~'+ | ||
(incarnation+'~').substring(7)+ | ||
Nid()+'~'+ | ||
Package.version | ||
: options.identifier | ||
self.id = meta.identifier$ = | ||
null == options.identifier | ||
? host + | ||
'~' + | ||
(incarnation + '~').substring(7) + | ||
Nid() + | ||
'~' + | ||
Package.version | ||
: options.identifier | ||
@@ -125,3 +134,3 @@ meta.tag$ = options.tag | ||
var swim_opts = _.defaultsDeep(options.swim,{ | ||
var swim_opts = _.defaultsDeep(options.swim, { | ||
codec: 'msgpack', | ||
@@ -135,3 +144,3 @@ disseminationFactor: 22, | ||
suspectTimeout: 999, | ||
udp: {maxDgramSize: 2048}, | ||
udp: { maxDgramSize: 2048 } | ||
}) | ||
@@ -142,13 +151,22 @@ | ||
meta: meta, | ||
incarnation: incarnation, | ||
incarnation: incarnation | ||
} | ||
var bases = _.compact(_.clone(options.bases)) | ||
if( isbase ) { | ||
_.remove(bases,function(r) { return r === host }) | ||
if (isbase) { | ||
_.remove(bases, function(r) { | ||
return r === host | ||
}) | ||
} | ||
self.log( | ||
'joining', | ||
attempts, | ||
host, | ||
meta.identifier$, | ||
meta.tag$, | ||
bases, | ||
swim_opts | ||
) | ||
self.log('joining',attempts,host,meta.identifier$,meta.tag$,bases,swim_opts) | ||
swim = new Swim(swim_opts) | ||
@@ -160,4 +178,7 @@ | ||
var wait = options.retry_min + | ||
Math.floor(Math.random() * (options.retry_max-options.retry_min)) | ||
var wait = | ||
options.retry_min + | ||
Math.floor( | ||
Math.random() * (options.retry_max - options.retry_min) | ||
) | ||
@@ -167,5 +188,4 @@ swim.net.removeAllListeners('error') | ||
return | ||
} | ||
else if( err ) { | ||
self.emit('error',err) | ||
} else if (err) { | ||
self.emit('error', err) | ||
swim.net.removeAllListeners('error') | ||
@@ -180,4 +200,7 @@ return | ||
var wait = options.retry_min + | ||
Math.floor(Math.random() * (options.retry_max-options.retry_min)) | ||
var wait = | ||
options.retry_min + | ||
Math.floor( | ||
Math.random() * (options.retry_max - options.retry_min) | ||
) | ||
@@ -187,8 +210,7 @@ swim.net.removeAllListeners('error') | ||
return | ||
} | ||
else if( err ) { | ||
} else if (err) { | ||
// first base node will see a JoinFailedError as there is | ||
// nobody else out there | ||
if( !isbase || 'JoinFailedError' !== err.name ) { | ||
self.emit('error',err) | ||
if (!isbase || 'JoinFailedError' !== err.name) { | ||
self.emit('error', err) | ||
swim.net.removeAllListeners('error') | ||
@@ -203,3 +225,3 @@ return | ||
_.each( swim.members(), updateinfo ) | ||
_.each(swim.members(), updateinfo) | ||
@@ -214,8 +236,6 @@ swim.on(Swim.EventType.Update, function onUpdate(info) { | ||
self.emit('ready') | ||
}) | ||
function updateinfo( m ) { | ||
function updateinfo(m) { | ||
//console.log(m) | ||
@@ -227,17 +247,17 @@ | ||
if( null != meta.tag$ && m.meta.tag$ !== meta.tag$ ) { | ||
if (null != meta.tag$ && m.meta.tag$ !== meta.tag$) { | ||
return | ||
} | ||
if( m.meta.identifier$ === meta.identifier$ ) { | ||
if (m.meta.identifier$ === meta.identifier$) { | ||
return | ||
} | ||
if( 0 === m.state ) { | ||
add_node( m ) | ||
if (0 === m.state) { | ||
add_node(m) | ||
} | ||
// Note: trigger happy | ||
else if( 2 === m.state ) { | ||
remove_node( m ) | ||
else if (2 === m.state) { | ||
remove_node(m) | ||
} | ||
@@ -251,8 +271,6 @@ } | ||
self.members = function() { | ||
return _.clone( members ) | ||
return _.clone(members) | ||
} | ||
self.leave = function() { | ||
@@ -264,4 +282,3 @@ swim && swim.leave() | ||
function add_node( member ) { | ||
function add_node(member) { | ||
var meta = member.meta | ||
@@ -271,8 +288,8 @@ var host = member.host | ||
var prev = members[meta.identifier$] | ||
if (prev && | ||
prev.incarnation === member.incarnation && | ||
prev.host === member.host && | ||
prev.meta.v$ === meta.v$ | ||
) | ||
{ | ||
if ( | ||
prev && | ||
prev.incarnation === member.incarnation && | ||
prev.host === member.host && | ||
prev.meta.v$ === meta.v$ | ||
) { | ||
return | ||
@@ -286,4 +303,3 @@ } | ||
function remove_node( member ) { | ||
function remove_node(member) { | ||
var meta = member.meta | ||
@@ -302,7 +318,5 @@ var host = member.host | ||
self.on('error',function(err){ | ||
self.log('ERROR',err) | ||
self.on('error', function(err) { | ||
self.log('ERROR', err) | ||
}) | ||
}) | ||
@@ -312,6 +326,3 @@ } | ||
function make_monitor (sneeze, options) { | ||
function make_monitor(sneeze, options) { | ||
var start = Date.now() | ||
@@ -321,3 +332,3 @@ var allmembers = {} | ||
function update (kind, member) { | ||
function update(kind, member) { | ||
var meta = member.meta | ||
@@ -333,6 +344,5 @@ var host = member.host | ||
m.state = member.state | ||
m.meta = parse_meta(meta,options) | ||
m.meta = parse_meta(meta, options) | ||
m.tag = meta.tag$ || '' | ||
} | ||
else { | ||
} else { | ||
m = { | ||
@@ -346,3 +356,3 @@ id: meta.identifier$, | ||
rem: 0, | ||
meta: parse_meta(meta,options) | ||
meta: parse_meta(meta, options) | ||
} | ||
@@ -355,4 +365,4 @@ m[kind] += 1 | ||
allmembers[meta.identifier$] = m | ||
sortedmembers = sortedmembers.filter(function (m) { | ||
sortedmembers = sortedmembers.filter(function(m) { | ||
return m.id != meta.identifier$ | ||
@@ -366,4 +376,3 @@ }) | ||
sneeze.on('add', function (meta, member) { | ||
sneeze.on('add', function(meta, member) { | ||
update('add', member) | ||
@@ -374,3 +383,3 @@ //console.log('add',member) | ||
sneeze.on('remove', function (meta, member) { | ||
sneeze.on('remove', function(meta, member) { | ||
update('rem', member) | ||
@@ -381,10 +390,11 @@ //console.log('rem',member.meta) | ||
var w = process.stdout.write.bind(process.stdout) | ||
var states = { | ||
0: 'A', 1: 'S', 2: 'F' | ||
0: 'A', | ||
1: 'S', | ||
2: 'F' | ||
} | ||
var head = Chalk.bold | ||
function render () { | ||
function render() { | ||
var size_host = 4 | ||
@@ -394,6 +404,6 @@ var size_meta = 4 | ||
sortedmembers.forEach(function (m) { | ||
size_host = Math.max(size_host,m.host.length) | ||
size_meta = Math.max(size_meta,m.meta.length) | ||
size_tag = Math.max(size_tag,m.tag.length) | ||
sortedmembers.forEach(function(m) { | ||
size_host = Math.max(size_host, m.host.length) | ||
size_meta = Math.max(size_meta, m.meta.length) | ||
size_tag = Math.max(size_tag, m.tag.length) | ||
}) | ||
@@ -405,28 +415,32 @@ | ||
w(AE.cursorHide) | ||
w(AE.cursorUp(nm+2)) | ||
w(AE.cursorUp(nm + 2)) | ||
w(AE.eraseDown) | ||
console.log(head([ | ||
Pad('host',size_host), | ||
Pad(2,'a'), | ||
Pad(2,'r'), | ||
Pad(2,'s'), | ||
Pad(8,'time'), | ||
Pad('tag',size_tag), | ||
Pad('meta',size_meta), | ||
'id' | ||
].join(' '))) | ||
console.log( | ||
head( | ||
[ | ||
Pad('host', size_host), | ||
Pad(2, 'a'), | ||
Pad(2, 'r'), | ||
Pad(2, 's'), | ||
Pad(8, 'time'), | ||
Pad('tag', size_tag), | ||
Pad('meta', size_meta), | ||
'id' | ||
].join(' ') | ||
) | ||
) | ||
sortedmembers.forEach(function (m,i) { | ||
sortedmembers.forEach(function(m, i) { | ||
var memline = [ | ||
Pad(m.host||'',size_host), | ||
Pad(2,''+(m.add||0)), | ||
Pad(2,''+(m.rem||0)), | ||
Pad(2,''+(states[m.state]||'U')), | ||
Pad(8,''+(m.when-start)), | ||
Pad(m.tag||'',size_tag), | ||
Pad(m.meta||'',size_meta), | ||
Pad(m.host || '', size_host), | ||
Pad(2, '' + (m.add || 0)), | ||
Pad(2, '' + (m.rem || 0)), | ||
Pad(2, '' + (states[m.state] || 'U')), | ||
Pad(8, '' + (m.when - start)), | ||
Pad(m.tag || '', size_tag), | ||
Pad(m.meta || '', size_meta), | ||
m.id | ||
] | ||
var lt = memline.join(' ') | ||
@@ -440,6 +454,5 @@ | ||
Keypress(process.stdin) | ||
process.stdin.on('keypress', function (ch, key) { | ||
process.stdin.on('keypress', function(ch, key) { | ||
if (key && key.ctrl && key.name == 'c') { | ||
@@ -451,3 +464,3 @@ process.exit() | ||
if ('p' === ch) { | ||
sortedmembers = sortedmembers.filter(function (m) { | ||
sortedmembers = sortedmembers.filter(function(m) { | ||
if (2 === m.state) { | ||
@@ -463,3 +476,3 @@ delete allmembers[m.id] | ||
if (process.stdin.setRawMode){ | ||
if (process.stdin.setRawMode) { | ||
process.stdin.setRawMode(true) | ||
@@ -470,9 +483,8 @@ } | ||
function parse_meta (meta, options) { | ||
function parse_meta(meta, options) { | ||
var out = [] | ||
options.monitor.meta.forEach(function (mf) { | ||
var v = JP.value(meta,mf) | ||
options.monitor.meta.forEach(function(mf) { | ||
var v = JP.value(meta, mf) | ||
if (null != v) { | ||
out.push( Util.inspect(v).replace(/\s+/g,'') ) | ||
out.push(Util.inspect(v).replace(/\s+/g, '')) | ||
} | ||
@@ -479,0 +491,0 @@ }) |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
20924
373
0
10
+ Addedstatic-eval@^2.0.1
+ Addedansi-escapes@3.2.0(transitive)
+ Addedescodegen@2.1.0(transitive)
+ Addedestraverse@5.3.0(transitive)
+ Addedjsonpath@1.1.1(transitive)
+ Addedpad@2.3.0(transitive)
+ Addedstatic-eval@2.1.1(transitive)
+ Addedunderscore@1.12.1(transitive)
- Removedansi-escapes@3.1.0(transitive)
- Removedjsonpath@1.0.2(transitive)
- Removedpad@2.1.0(transitive)
- Removedunderscore@1.7.0(transitive)
Updatedansi-escapes@^3.1.0
Updatedchalk@^2.4.2
Updatedjsonpath@^1.0.0
Updatedkeypress@^0.2.1
Updatednid@^0.3.2
Updatedoptioner@^1.1.0
Updatedpad@^2.1.0
Updatedswim@^0.6.0