@@ -5,128 +5,21 @@ import childprocess = require('child_process');
5
5
var exec = childprocess . exec ;
6
6
var spawn = childprocess . spawn ;
7
7
8
- ///ts:import=messages
9
- import messages = require( './messages' ) ; ///ts:import:generated
8
+ import workerLib = require( './workerLib' ) ;
10
9
import tsconfig = require( '../main/tsconfig/tsconfig' ) ;
11
10
12
11
13
- var gotENOENTonSpawnNode = false ;
14
- var child : childprocess . ChildProcess ;
15
- var currentListeners : { [ messages : string ] : { [ id : string ] : PromiseDeferred < any > } } = { } ;
12
+ var parent = new workerLib . Parent ( ) ;
16
13
export function startWorker ( ) {
17
- try {
18
- var node = process . execPath ; // We will run atom as node
19
-
20
- child = spawn ( node , [
21
- // '--debug', // Uncomment if you want to debug the child process
22
- __dirname + '/child.js'
23
- ] , { cwd : __dirname , env : { ATOM_SHELL_INTERNAL_RUN_AS_NODE : '1' } , stdio : [ 'ipc' ] } ) ;
24
-
25
- child . on ( 'error' , ( err ) => {
26
- if ( err . code === "ENOENT" && err . path === node ) {
27
- gotENOENTonSpawnNode = true ;
28
- }
29
- console . log ( 'CHILD ERR ONERROR:' , err . message , err . stack , err ) ;
30
- child = null ;
31
- } ) ;
32
-
33
- console . log ( 'ts worker started' ) ;
34
- function processResponse ( m : any ) {
35
- var parsed : messages . Message < any > = m ;
36
-
37
- if ( ! parsed . message || ! parsed . id ) {
38
- console . log ( 'PARENT ERR: Invalid JSON data from child:' , m ) ;
39
- }
40
- if ( ! currentListeners [ parsed . message ] || ! currentListeners [ parsed . message ] [ parsed . id ] ) {
41
- console . log ( 'PARENT ERR: No one was listening:' , parsed . message , parsed . data ) ;
42
- return ;
43
- }
44
- else { // Alright nothing *weird* happened
45
- if ( parsed . error ) {
46
- currentListeners [ parsed . message ] [ parsed . id ] . reject ( parsed . error ) ;
47
- }
48
- else {
49
- currentListeners [ parsed . message ] [ parsed . id ] . resolve ( parsed . data ) ;
50
- }
51
- delete currentListeners [ parsed . message ] [ parsed . id ] ;
52
- }
53
- }
54
-
55
- child . on ( 'message' , ( resp ) => processResponse ( resp ) ) ;
56
-
57
-
58
- child . stderr . on ( 'data' , ( err ) => {
59
- console . log ( "CHILD ERR STDERR:" , err . toString ( ) ) ;
60
- } ) ;
61
- child . on ( 'close' , ( code ) => {
62
- // Handle process dropping
63
- console . log ( 'ts worker exited with code:' , code ) ;
64
-
65
- // If orphaned then Definitely restart
66
- if ( code === messages . orphanExitCode ) {
67
- console . log ( 'ts worker restarting' ) ;
68
- startWorker ( ) ;
69
- }
70
- // If we got ENOENT. Restarting will not help.
71
- else if ( gotENOENTonSpawnNode ) {
72
- showError ( ) ;
73
- }
74
- // We haven't found a reson to not start worker yet
75
- else {
76
- console . log ( 'ts worker restarting' ) ;
77
- startWorker ( ) ;
78
- }
79
- } ) ;
80
- }
81
- catch ( ex ) {
82
- showError ( ex ) ;
83
- }
14
+ parent . startWorker ( __dirname + '/child.js' , showError ) ;
15
+ console . log ( 'AtomTS worker started' )
84
16
}
85
17
86
18
export function stopWorker ( ) {
87
- if ( ! child ) return ;
88
- try {
89
- child . kill ( 'SIGTERM' ) ;
90
- }
91
- catch ( ex ) {
92
- console . error ( 'failed to kill worker child' ) ;
93
- }
94
- child = null ;
95
- }
96
-
97
- // Creates a Guid (UUID v4)
98
- function createId ( ) : string {
99
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx' . replace ( / [ x y ] / g, function ( c ) {
100
- var r = Math . random ( ) * 16 | 0 , v = c == 'x' ? r : ( r & 0x3 | 0x8 ) ;
101
- return v . toString ( 16 ) ;
102
- } ) ;
103
- }
104
-
105
- function childQuery < Query , Response > ( func : ( query : Query ) => Response ) : ( data : Query ) => Promise < Response > {
106
- return ( data ) => {
107
- var message = func . name ;
108
-
109
- // If we don't have a child exit
110
- if ( ! child ) {
111
- console . log ( 'PARENT ERR: no child when you tried to send :' , message ) ;
112
- return < any > Promise . reject ( new Error ( "No worker active to recieve message: " + message ) ) ;
113
- }
114
-
115
- // Initialize if this is the first call of this type
116
- if ( ! currentListeners [ message ] ) currentListeners [ message ] = { } ;
117
-
118
- // Create an id unique to this call and store the defered against it
119
- var id = createId ( ) ;
120
- var defer = Promise . defer < Response > ( ) ;
121
- currentListeners [ message ] [ id ] = defer ;
122
-
123
- // Send data to worker
124
- child . send ( { message : message , id : id , data : data } ) ;
125
- return defer . promise ;
126
- } ;
19
+ parent . stopWorker ( ) ;
127
20
}
128
21
129
- function showError ( error ? : Error ) {
22
+ function showError ( error : Error ) {
130
23
var message = "Failed to start a child TypeScript worker. Atom-TypeScript is disabled." ;
131
24
// Sad panda : https://github.com/TypeStrong/atom-typescript/issues/50
132
25
if ( process . platform === "win32" ) {
@@ -144,17 +37,17 @@ function showError(error?: Error) {
144
37
///ts:import=projectService
145
38
import projectService = require( '../main/lang/projectService' ) ; ///ts:import:generated
146
39
147
- export var echo = childQuery ( projectService . echo ) ;
148
- export var quickInfo = childQuery ( projectService . quickInfo ) ;
149
- export var build = childQuery ( projectService . build ) ;
150
- export var errorsForFileFiltered = childQuery ( projectService . errorsForFileFiltered ) ;
151
- export var getCompletionsAtPosition = childQuery ( projectService . getCompletionsAtPosition ) ;
152
- export var emitFile = childQuery ( projectService . emitFile ) ;
153
- export var regenerateProjectGlob = childQuery ( projectService . regenerateProjectGlob ) ;
154
- export var formatDocument = childQuery ( projectService . formatDocument ) ;
155
- export var formatDocumentRange = childQuery ( projectService . formatDocumentRange ) ;
156
- export var getDefinitionsAtPosition = childQuery ( projectService . getDefinitionsAtPosition ) ;
157
- export var updateText = childQuery ( projectService . updateText ) ;
158
- export var errorsForFile = childQuery ( projectService . errorsForFile ) ;
159
- export var getSignatureHelps = childQuery ( projectService . getSignatureHelps ) ;
160
- export var getRenameInfo = childQuery ( projectService . getRenameInfo ) ;
40
+ export var echo = parent . childQuery ( projectService . echo ) ;
41
+ export var quickInfo = parent . childQuery ( projectService . quickInfo ) ;
42
+ export var build = parent . childQuery ( projectService . build ) ;
43
+ export var errorsForFileFiltered = parent . childQuery ( projectService . errorsForFileFiltered ) ;
44
+ export var getCompletionsAtPosition = parent . childQuery ( projectService . getCompletionsAtPosition ) ;
45
+ export var emitFile = parent . childQuery ( projectService . emitFile ) ;
46
+ export var regenerateProjectGlob = parent . childQuery ( projectService . regenerateProjectGlob ) ;
47
+ export var formatDocument = parent . childQuery ( projectService . formatDocument ) ;
48
+ export var formatDocumentRange = parent . childQuery ( projectService . formatDocumentRange ) ;
49
+ export var getDefinitionsAtPosition = parent . childQuery ( projectService . getDefinitionsAtPosition ) ;
50
+ export var updateText = parent . childQuery ( projectService . updateText ) ;
51
+ export var errorsForFile = parent . childQuery ( projectService . errorsForFile ) ;
52
+ export var getSignatureHelps = parent . childQuery ( projectService . getSignatureHelps ) ;
53
+ export var getRenameInfo = parent . childQuery ( projectService . getRenameInfo ) ;
0 commit comments