Skip to content

Commit aaa05f9

Browse files
committed
abstracted as much of the functionality as I can between parent and child into RequesterResponder base class
refs #51
1 parent 5fb8851 commit aaa05f9

12 files changed

+234
-145
lines changed

lib/tsconfig.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,9 @@
5858
"./typings/status-bar/status-bar.d.ts",
5959
"./typings/text-buffer/text-buffer.d.ts",
6060
"./typings/tsd.d.ts",
61-
"./worker/child.ts",
62-
"./worker/messages.ts",
61+
"./worker/childMain.ts",
62+
"./worker/lib/workerLib.ts",
6363
"./worker/parent.ts",
64-
"./worker/workerLib.ts"
64+
"./worker/parentResponses.ts"
6565
]
6666
}

lib/worker/child.js

-4
This file was deleted.

lib/worker/childMain.js

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
var workerLib = require('./lib/workerLib');
2+
var projectService = require('../main/lang/projectService');
3+
var child = new workerLib.Child();
4+
child.registerAllFunctionsExportedFromAsResponders(projectService);
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
///ts:ref=globals
22
/// <reference path="../globals.ts"/> ///ts:ref:generated
33

4-
import workerLib = require('./workerLib');
4+
import workerLib = require('./lib/workerLib');
5+
import projectService = require('../main/lang/projectService'); ///ts:import:generated
56

7+
// Initiate the child logic
68
var child = new workerLib.Child();
7-
///ts:import=projectService
8-
import projectService = require('../main/lang/projectService'); ///ts:import:generated
9+
910
// Automatically include all functions from "projectService" as a responder
10-
child.registerAllFunctionsExportedFrom(projectService);
11+
child.registerAllFunctionsExportedFromAsResponders(projectService);
File renamed without changes.
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
var __extends = this.__extends || function (d, b) {
2+
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
3+
function __() { this.constructor = d; }
4+
__.prototype = b.prototype;
5+
d.prototype = new __();
6+
};
17
var childprocess = require('child_process');
28
var exec = childprocess.exec;
39
var spawn = childprocess.spawn;
@@ -9,29 +15,90 @@ function createId() {
915
});
1016
}
1117
var orphanExitCode = 100;
12-
var Parent = (function () {
13-
function Parent() {
18+
var RequesterResponder = (function () {
19+
function RequesterResponder() {
20+
var _this = this;
21+
this.getProcess = function () {
22+
throw new Error('getProcess is abstract');
23+
return null;
24+
};
1425
this.currentListeners = {};
15-
this.node = process.execPath;
16-
this.gotENOENTonSpawnNode = false;
26+
this.responders = {};
27+
this.processRequest = function (m) {
28+
var parsed = m;
29+
if (!parsed.message || !_this.responders[parsed.message]) {
30+
return;
31+
}
32+
var message = parsed.message;
33+
try {
34+
var response = _this.responders[message](parsed.data);
35+
}
36+
catch (err) {
37+
var error = { method: message, message: err.message, stack: err.stack, details: err.details || {} };
38+
}
39+
_this.getProcess().send({
40+
message: message,
41+
id: parsed.id,
42+
data: response,
43+
error: error,
44+
request: false
45+
});
46+
};
1747
}
18-
Parent.prototype.childQuery = function (func) {
48+
RequesterResponder.prototype.processResponse = function (m) {
49+
var parsed = m;
50+
if (!parsed.message || !parsed.id) {
51+
console.log('PARENT ERR: Invalid JSON data from child:', m);
52+
}
53+
else if (!this.currentListeners[parsed.message] || !this.currentListeners[parsed.message][parsed.id]) {
54+
console.log('PARENT ERR: No one was listening:', parsed.message, parsed.data);
55+
}
56+
else {
57+
if (parsed.error) {
58+
this.currentListeners[parsed.message][parsed.id].reject(parsed.error);
59+
}
60+
else {
61+
this.currentListeners[parsed.message][parsed.id].resolve(parsed.data);
62+
}
63+
delete this.currentListeners[parsed.message][parsed.id];
64+
}
65+
};
66+
RequesterResponder.prototype.childQuery = function (func) {
1967
var _this = this;
68+
var that = this;
2069
return function (data) {
2170
var message = func.name;
22-
if (!_this.child) {
71+
if (!that.getProcess()) {
2372
console.log('PARENT ERR: no child when you tried to send :', message);
2473
return Promise.reject(new Error("No worker active to recieve message: " + message));
2574
}
26-
if (!_this.currentListeners[message])
75+
if (!that.currentListeners[message])
2776
_this.currentListeners[message] = {};
2877
var id = createId();
2978
var defer = Promise.defer();
30-
_this.currentListeners[message][id] = defer;
31-
_this.child.send({ message: message, id: id, data: data });
79+
that.currentListeners[message][id] = defer;
80+
that.getProcess().send({ message: message, id: id, data: data, request: true });
3281
return defer.promise;
3382
};
3483
};
84+
RequesterResponder.prototype.addToResponders = function (func) {
85+
this.responders[func.name] = func;
86+
};
87+
RequesterResponder.prototype.registerAllFunctionsExportedFromAsResponders = function (aModule) {
88+
var _this = this;
89+
Object.keys(aModule).filter(function (funcName) { return typeof aModule[funcName] == 'function'; }).forEach(function (funcName) { return _this.addToResponders(aModule[funcName]); });
90+
};
91+
return RequesterResponder;
92+
})();
93+
var Parent = (function (_super) {
94+
__extends(Parent, _super);
95+
function Parent() {
96+
var _this = this;
97+
_super.apply(this, arguments);
98+
this.node = process.execPath;
99+
this.gotENOENTonSpawnNode = false;
100+
this.getProcess = function () { return _this.child; };
101+
}
35102
Parent.prototype.startWorker = function (childJsPath, terminalError) {
36103
var _this = this;
37104
try {
@@ -45,7 +112,14 @@ var Parent = (function () {
45112
console.log('CHILD ERR ONERROR:', err.message, err.stack, err);
46113
_this.child = null;
47114
});
48-
this.child.on('message', function (resp) { return _this.processResponse(resp); });
115+
this.child.on('message', function (message) {
116+
if (message.request) {
117+
_this.processRequest(message);
118+
}
119+
else {
120+
_this.processResponse(message);
121+
}
122+
});
49123
this.child.stderr.on('data', function (err) {
50124
console.log("CHILD ERR STDERR:", err.toString());
51125
});
@@ -79,34 +153,23 @@ var Parent = (function () {
79153
}
80154
this.child = null;
81155
};
82-
Parent.prototype.processResponse = function (m) {
83-
var parsed = m;
84-
if (!parsed.message || !parsed.id) {
85-
console.log('PARENT ERR: Invalid JSON data from child:', m);
86-
}
87-
else if (!this.currentListeners[parsed.message] || !this.currentListeners[parsed.message][parsed.id]) {
88-
console.log('PARENT ERR: No one was listening:', parsed.message, parsed.data);
89-
}
90-
else {
91-
if (parsed.error) {
92-
this.currentListeners[parsed.message][parsed.id].reject(parsed.error);
93-
}
94-
else {
95-
this.currentListeners[parsed.message][parsed.id].resolve(parsed.data);
96-
}
97-
delete this.currentListeners[parsed.message][parsed.id];
98-
}
99-
};
100156
return Parent;
101-
})();
157+
})(RequesterResponder);
102158
exports.Parent = Parent;
103-
var Child = (function () {
159+
var Child = (function (_super) {
160+
__extends(Child, _super);
104161
function Child() {
105162
var _this = this;
106-
this.responders = {};
163+
_super.call(this);
164+
this.getProcess = function () { return process; };
107165
this.keepAlive();
108-
process.on('message', function (data) {
109-
_this.processData(data);
166+
process.on('message', function (message) {
167+
if (message.request) {
168+
_this.processRequest(message);
169+
}
170+
else {
171+
_this.processResponse(message);
172+
}
110173
});
111174
}
112175
Child.prototype.keepAlive = function () {
@@ -116,32 +179,6 @@ var Child = (function () {
116179
}
117180
}, 1000);
118181
};
119-
Child.prototype.processData = function (m) {
120-
var parsed = m;
121-
if (!parsed.message || !this.responders[parsed.message]) {
122-
return;
123-
}
124-
var message = parsed.message;
125-
try {
126-
var response = this.responders[message](parsed.data);
127-
}
128-
catch (err) {
129-
var error = { method: message, message: err.message, stack: err.stack, details: err.details || {} };
130-
}
131-
process.send({
132-
message: message,
133-
id: parsed.id,
134-
data: response,
135-
error: error
136-
});
137-
};
138-
Child.prototype.addToResponders = function (func) {
139-
this.responders[func.name] = func;
140-
};
141-
Child.prototype.registerAllFunctionsExportedFrom = function (aModule) {
142-
var _this = this;
143-
Object.keys(aModule).filter(function (funcName) { return typeof aModule[funcName] == 'function'; }).forEach(function (funcName) { return _this.addToResponders(aModule[funcName]); });
144-
};
145182
return Child;
146-
})();
183+
})(RequesterResponder);
147184
exports.Child = Child;

0 commit comments

Comments
 (0)