Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Avatar for KuCalc : devops.
Download
50654 views
1
var events = require('events'),
2
fs = require('fs'),
3
path = require('path'),
4
nssocket = require('nssocket'),
5
utile = require('utile'),
6
forever = require(path.resolve(__dirname, '..', 'forever'));
7
8
var Worker = exports.Worker = function (options) {
9
events.EventEmitter.call(this);
10
options || (options = {});
11
12
this.monitor = options.monitor;
13
this.sockPath = options.sockPath || forever.config.get('sockPath');
14
this.exitOnStop = options.exitOnStop === true;
15
16
this._socket = null;
17
};
18
19
utile.inherits(Worker, events.EventEmitter);
20
21
Worker.prototype.start = function (callback) {
22
var self = this,
23
err;
24
25
if (this._socket) {
26
err = new Error("Can't start already started worker");
27
if (callback) {
28
return callback(err);
29
}
30
31
throw err;
32
}
33
34
//
35
// Defines a simple `nssocket` protocol for communication
36
// with a parent process.
37
//
38
function workerProtocol(socket) {
39
socket.on('error', function() {
40
socket.destroy();
41
})
42
43
socket.data(['ping'], function () {
44
socket.send(['pong']);
45
});
46
47
socket.data(['data'], function () {
48
socket.send(['data'], self.monitor.data);
49
});
50
51
socket.data(['spawn'], function (data) {
52
if (!data.script) {
53
return socket.send(['spawn', 'error'], { error: new Error('No script given') });
54
}
55
56
if (self.monitor) {
57
return socket.send(['spawn', 'error'], { error: new Error("Already running") });
58
}
59
60
var monitor = new (forever.Monitor)(data.script, data.options);
61
monitor.start();
62
63
monitor.on('start', function () {
64
socket.send(['spawn', 'start'], monitor.data);
65
});
66
});
67
68
socket.data(['stop'], function () {
69
self.monitor.once('stop', function () {
70
socket.send(['stop', 'ok']);
71
self.exitOnStop && process.exit();
72
});
73
74
self.monitor.stop();
75
});
76
77
socket.data(['restart'], function () {
78
self.monitor.once('restart', function () {
79
socket.send(['restart', 'ok']);
80
});
81
82
self.monitor.restart();
83
});
84
}
85
86
function findAndStart() {
87
self._socket = nssocket.createServer(workerProtocol);
88
self._socket.on('listening', function () {
89
//
90
// `listening` listener doesn't take error as the first parameter
91
//
92
self.emit('start');
93
callback && callback(null, self._sockFile);
94
});
95
96
self._socket.on('error', function (err) {
97
if (err.code === 'EADDRINUSE') {
98
return findAndStart();
99
}
100
101
callback && callback(err);
102
});
103
104
//
105
// Create a unique socket file based on the current microtime.
106
//
107
var sock = self._sockFile = path.join(self.sockPath, [
108
'worker',
109
new Date().getTime() + utile.randomString(3),
110
'sock'
111
].join('.'));
112
113
self._socket.listen(sock);
114
}
115
116
//
117
// Attempt to start the server the first time
118
//
119
findAndStart();
120
return this;
121
};
122
123
124