88 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict'
 | |
| 
 | |
| const fs = require('fs')
 | |
| const started = Date.now()
 | |
| 
 | |
| 
 | |
| module.exports = function (timeout, callback) {
 | |
|   callback = callback.bind(null, null, process.pid, Math.random(), timeout)
 | |
|   if (timeout)
 | |
|     return setTimeout(callback, timeout)
 | |
|   callback()
 | |
| }
 | |
| 
 | |
| 
 | |
| module.exports.args = function (callback) {
 | |
|   callback(null, {
 | |
|       argv     : process.argv
 | |
|     , cwd      : process.cwd()
 | |
|     , execArgv : process.execArgv
 | |
|   })
 | |
| }
 | |
| 
 | |
| 
 | |
| module.exports.run0 = function (callback) {
 | |
|   module.exports(0, callback)
 | |
| }
 | |
| 
 | |
| 
 | |
| module.exports.killable = function (id, callback) {
 | |
|   if (Math.random() < 0.5)
 | |
|     return process.exit(-1)
 | |
|   callback(null, id, process.pid)
 | |
| }
 | |
| 
 | |
| 
 | |
| module.exports.err = function (type, message, data, callback) {
 | |
|   if (typeof data == 'function') {
 | |
|     callback = data
 | |
|     data = null
 | |
|   } else {
 | |
|     let err = new Error(message)
 | |
|     Object.keys(data).forEach(function(key) {
 | |
|       err[key] = data[key]
 | |
|     })
 | |
|     callback(err)
 | |
|     return
 | |
|   }
 | |
| 
 | |
|   if (type == 'TypeError')
 | |
|     return callback(new TypeError(message))
 | |
|   callback(new Error(message))
 | |
| }
 | |
| 
 | |
| 
 | |
| module.exports.block = function () {
 | |
|   while (true);
 | |
| }
 | |
| 
 | |
| 
 | |
| // use provided file path to save retries count among terminated workers
 | |
| module.exports.stubborn = function (path, callback) {
 | |
|   function isOutdated(path) {
 | |
|     return ((new Date).getTime() - fs.statSync(path).mtime.getTime()) > 2000
 | |
|   }
 | |
| 
 | |
|   // file may not be properly deleted, check if modified no earler than two seconds ago
 | |
|   if (!fs.existsSync(path) || isOutdated(path)) {
 | |
|     fs.writeFileSync(path, '1')
 | |
|     process.exit(-1)
 | |
|   }
 | |
| 
 | |
|   let retry = parseInt(fs.readFileSync(path, 'utf8'))
 | |
|   if (Number.isNaN(retry))
 | |
|     return callback(new Error('file contents is not a number'))
 | |
| 
 | |
|   if (retry > 4) {
 | |
|     callback(null, 12)
 | |
|   } else {
 | |
|     fs.writeFileSync(path, String(retry + 1))
 | |
|     process.exit(-1)
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| module.exports.uptime = function (callback) {
 | |
|   callback(null, Date.now() - started)
 | |
| }
 |