forked from exi/rsyncCopyManager
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
88 lines (78 loc) · 2.38 KB
/
server.js
File metadata and controls
88 lines (78 loc) · 2.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
var rsync = require('./rsync');
var database = require('./database.js');
var config = require('./config.js');
var Promise = require('node-promise').Promise;
var All = require('node-promise').all;
var child_process = require('child_process');
var Server = module.exports = function(dependencies, serverId) {
var api = {};
var startupPromise = new Promise();
var promises = {};
var msgid = 0;
var worker = child_process.fork(__dirname + '/server-worker.js');
worker.on('message', function(data) {
if (data.id !== undefined && promises[data.id]) {
if (data.type === 'error') {
promises[data.id].reject(data.data);
} else {
promises[data.id].resolve(data.data);
}
delete promises[data.id];
} else if (data.command === 'event' && data.topic !== undefined) {
dependencies.eventBus.emit(data.topic, data.data);
}
});
function sendMessage(data, callback) {
var id = msgid++;
var p = new Promise();
if (callback) {
p.then(callback);
}
promises[id] = p;
worker.send({
id: id,
data: data
});
}
api.closeAndDelete = function() {
var p = new Promise();
startupPromise.then(function() {
sendMessage({ command: 'closeAndDelete' }, function() {
worker.kill();
p.resolve();
});
});
return p;
};
api.close = function() {
var p = new Promise();
startupPromise.then(function() {
worker.kill();
p.resolve();
});
return p;
};
api.rescan = function() {
var p = new Promise();
startupPromise.then(function() {
console.log('sending rescan command');
sendMessage({ command: 'rescan' });
});
return p;
};
api.getStatus = function() {
var p = new Promise();
startupPromise.then(function() {
sendMessage({ command: 'getStatus' }, function(data) {
p.resolve(data.status);
});
});
return p;
};
console.log('starting worker...');
sendMessage({ command: 'start', serverId: serverId }, function(data) {
console.log('worker started');
startupPromise.resolve();
});
return api;
};