node-graceful
Advanced tools
Comparing version 0.2.4 to 0.3.0
141
es5/index.js
// +----------------------------------------------------------------------+ | ||
// | node-graceful v0.2.2 (https://github.com/mrbar42/node-graceful) | | ||
// | node-graceful v0.3.0 (https://github.com/mrbar42/node-graceful) | | ||
// | Graceful process exit manager. | | ||
// |----------------------------------------------------------------------| | ||
"use strict"; | ||
'use strict'; | ||
function Graceful() { | ||
@@ -11,6 +10,4 @@ // options | ||
this.timeout = 30000; | ||
// constants | ||
this.DEADLY_SIGNALS = ["SIGTERM", "SIGINT", "SIGBREAK", "SIGHUP"]; | ||
this.DEADLY_SIGNALS = ['SIGTERM', 'SIGINT', 'SIGBREAK', 'SIGHUP']; | ||
// state | ||
@@ -20,9 +17,6 @@ this._listeners = Object.create(null); | ||
} | ||
Graceful.prototype.on = function (signal, listener, deadly) { | ||
Graceful.prototype.on = function on(signal, listener, deadly) { | ||
var _this = this; | ||
this._registerSignal(signal); | ||
this._listeners[signal].push(listener); | ||
// add signal to deadly list | ||
@@ -32,15 +26,11 @@ if (deadly && this.DEADLY_SIGNALS.indexOf(signal) === -1) { | ||
} | ||
return function () { | ||
return _this.off(signal, listener); | ||
}; | ||
return function () { return _this.off(signal, listener); }; | ||
}; | ||
Graceful.prototype.off = function (signal, listener) { | ||
if (!this._listeners[signal]) return; | ||
Graceful.prototype.off = function off(signal, listener) { | ||
if (!this._listeners[signal]) | ||
return; | ||
// remove listener if exists | ||
var index = this._listeners[signal].indexOf(listener); | ||
if (index !== -1) this._listeners[signal].splice(index, 1); | ||
if (index !== -1) | ||
this._listeners[signal].splice(index, 1); | ||
// clear master listener if no listeners left | ||
@@ -51,4 +41,3 @@ if (!this._listeners[signal].length) { | ||
}; | ||
Graceful.prototype.clear = function (signal) { | ||
Graceful.prototype.clear = function clear(signal) { | ||
var _this = this; | ||
@@ -58,66 +47,51 @@ if (signal) { | ||
this._unregisterSignal(signal); | ||
} else { | ||
Object.keys(this._listeners).forEach(function (sig) { | ||
return _this.clear(signal); | ||
}); | ||
} | ||
else { | ||
Object | ||
.keys(this._listeners) | ||
.forEach(function (sig) { return _this.clear(sig); }); | ||
} | ||
}; | ||
Graceful.prototype.exit = function (code, signal) { | ||
if (typeof code == "number") { | ||
Graceful.prototype.exit = function exit(code, signal) { | ||
if (typeof code === 'number') { | ||
process.exitCode = code; | ||
} | ||
var simulatedSignal = signal || this.DEADLY_SIGNALS[0]; | ||
this._processSignal(simulatedSignal); | ||
}; | ||
Graceful.prototype._registerSignal = function (signal) { | ||
Graceful.prototype._registerSignal = function _registerSignal(signal) { | ||
var _this = this; | ||
if (this._listeners[signal]) return; | ||
if (this._listeners[signal]) | ||
return; | ||
this._listeners[signal] = []; | ||
var handler = function (event) { | ||
return _this._processSignal(signal, event); | ||
}; | ||
var handler = function (event) { return _this._processSignal(signal, event); }; | ||
// handle special 'exit' event case | ||
if (signal == "exit") { | ||
this.DEADLY_SIGNALS.forEach(function (deadlySignal) { | ||
return process.on(deadlySignal, handler); | ||
}); | ||
} else { | ||
if (signal === 'exit') { | ||
this.DEADLY_SIGNALS.forEach(function (deadlySignal) { return process.on(deadlySignal, handler); }); | ||
} | ||
else { | ||
process.on(signal, handler); | ||
} | ||
// store handler on listeners array for future ref | ||
this._listeners[signal].__handler__ = handler; | ||
}; | ||
Graceful.prototype._unregisterSignal = function (signal) { | ||
if (!this._listeners[signal]) return; | ||
Graceful.prototype._unregisterSignal = function _unregisterSignal(signal) { | ||
if (!this._listeners[signal]) | ||
return; | ||
var handler = this._listeners[signal].__handler__; | ||
// handle special 'exit' event case | ||
if (signal == "exit") { | ||
this.DEADLY_SIGNALS.forEach(function (deadlySignal) { | ||
return process.removeListener(deadlySignal, handler); | ||
}); | ||
} else { | ||
if (signal === 'exit') { | ||
this.DEADLY_SIGNALS.forEach(function (deadlySignal) { return process.removeListener(deadlySignal, handler); }); | ||
} | ||
else { | ||
process.removeListener(signal, handler); | ||
} | ||
delete this._listeners[signal]; | ||
}; | ||
Graceful.prototype._processSignal = function (signal, event) { | ||
Graceful.prototype._processSignal = function _processSignal(signal, event) { | ||
var _this = this; | ||
var deadly = this.DEADLY_SIGNALS.indexOf(signal) != -1; | ||
var deadly = this.DEADLY_SIGNALS.indexOf(signal) !== -1; | ||
var listeners = this._listeners[signal] && this._listeners[signal].slice(); | ||
var exitListeners = this._listeners.exit && this._listeners.exit.slice(); | ||
var exitListeners = this._listeners['exit'] && this._listeners['exit'].slice(); | ||
var targetCount = listeners && listeners.length || 0; | ||
// also include exit listeners if deadly | ||
@@ -127,10 +101,6 @@ if (deadly && exitListeners) { | ||
} | ||
// this should never happen | ||
if (!targetCount) { | ||
return process.nextTick(function () { | ||
return _this._killProcess(); | ||
}); | ||
return process.nextTick(function () { return _this._killProcess(); }); | ||
} | ||
var quit = (function () { | ||
@@ -141,38 +111,30 @@ var count = 0; | ||
if (count >= targetCount) { | ||
if (deadly) _this._killProcess(); | ||
if (deadly) | ||
_this._killProcess(); | ||
} | ||
}; | ||
})(); | ||
// exec signal specific listeners | ||
if (listeners) { | ||
listeners.forEach(function (listener) { | ||
return _this._invokeListener(listener, quit, event, signal); | ||
}); | ||
listeners.forEach(function (listener) { return _this._invokeListener(listener, quit, event, signal); }); | ||
} | ||
// also invoke exit listeners | ||
if (deadly && exitListeners) { | ||
if (this.isExiting) { | ||
if (this.exitOnDouble) this._killProcess(true); | ||
} else { | ||
if (this.exitOnDouble) | ||
this._killProcess(true); | ||
} | ||
else { | ||
this.isExiting = true; | ||
if (parseInt(this.timeout)) { | ||
setTimeout(function () { | ||
return _this._killProcess(true); | ||
}, this.timeout); | ||
if (Number(this.timeout)) { | ||
setTimeout(function () { return _this._killProcess(true); }, this.timeout); | ||
} | ||
exitListeners.forEach(function (listener) { | ||
return _this._invokeListener(listener, quit, event, signal); | ||
}); | ||
exitListeners.forEach(function (listener) { return _this._invokeListener(listener, quit, event, signal); }); | ||
} | ||
} | ||
}; | ||
Graceful.prototype._killProcess = function (force) { | ||
Graceful.prototype._killProcess = function _killProcess(force) { | ||
process.exit(process.exitCode || (force ? 1 : 0)); | ||
}; | ||
Graceful.prototype._invokeListener = function (listener, quit, event, signal) { | ||
Graceful.prototype._invokeListener = function _invokeListener(listener, quit, event, signal) { | ||
var invoked = false; | ||
@@ -186,12 +148,9 @@ // listener specific callback | ||
}; | ||
var retVal = listener(done, event, signal); | ||
// allow returning a promise | ||
if (retVal && typeof retVal.then === "function" && typeof retVal["catch"] === "function") { | ||
if (retVal && typeof retVal.then === 'function' && typeof retVal["catch"] === 'function') { | ||
retVal.then(done)["catch"](done); | ||
} | ||
}; | ||
var graceful = new Graceful(); | ||
module.exports = graceful; | ||
{ | ||
"name": "node-graceful", | ||
"version": "0.2.4", | ||
"version": "0.3.0", | ||
"description": "Graceful process exit manager. allows waiting on multiple async services.", | ||
"main": "graceful.js", | ||
"main": "index", | ||
"repository": { | ||
@@ -23,3 +23,3 @@ "type": "git", | ||
"test": "npm run test:unit && npm run test:lint", | ||
"transpile": "cat graceful.js | 6to5 > es5/index.js", | ||
"transpile": "tsc --allowJs --outFile es5/index.js --pretty index.js ", | ||
"prepublish": "npm run test && npm run transpile" | ||
@@ -30,3 +30,2 @@ }, | ||
"devDependencies": { | ||
"6to5": "3.6.5", | ||
"tslint": "5.9.1", | ||
@@ -33,0 +32,0 @@ "typescript": "2.6.2" |
# node-graceful | ||
[![Build Status](https://travis-ci.org/mrbar42/node-graceful.svg?branch=master)](https://travis-ci.org/mrbar42/node-graceful) | ||
node-graceful is a small helper module without dependencies that aims to ease graceful exit | ||
@@ -4,0 +6,0 @@ of a complex node program including async waiting of multiple independent modules. |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
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
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
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
77702
2
23
186
302
1