Skip to content

Commit 223c888

Browse files
jjleechenglou
authored andcommitted
Clean up --stdio switch
1 parent 3bd33cd commit 223c888

File tree

1 file changed

+39
-30
lines changed

1 file changed

+39
-30
lines changed

server/src/server.ts

Lines changed: 39 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,40 @@ let projectsFiles: Map<
4040
> = new Map();
4141
// ^ caching AND states AND distributed system. Why does LSP has to be stupid like this
4242

43-
let messageSender: any = {send: (msg: m.Message) => process.send!(msg)};
43+
type messageHandler = (send: (msg: m.Message) => void, message: m.Message) => void;
44+
45+
let makeStdioChannel = () => {
46+
let writer = new rpc.StreamMessageWriter(process.stdout);
47+
let reader = new rpc.StreamMessageReader(process.stdin);
48+
let send = (msg: m.Message) => writer.write(msg);
49+
return {
50+
onMessage: ((func: messageHandler) => {
51+
let callback = (message: m.Message) => {
52+
func(send, message);
53+
}
54+
reader.listen(callback);
55+
}),
56+
send,
57+
};
58+
}
59+
60+
let makeNodeIpcChannel = () => {
61+
let send = (msg: m.Message) => process.send!(msg);
62+
return {
63+
onMessage: (func: messageHandler) => {
64+
process.on("message", (msg: m.Message) => {
65+
func(send, msg);
66+
})
67+
},
68+
send,
69+
};
70+
}
71+
72+
let channel = (
73+
process.argv.includes("--stdio")
74+
? makeStdioChannel()
75+
: makeNodeIpcChannel()
76+
);
4477

4578
let sendUpdatedDiagnostics = () => {
4679
projectsFiles.forEach(({ filesWithDiagnostics }, projectRootPath) => {
@@ -63,7 +96,7 @@ let sendUpdatedDiagnostics = () => {
6396
method: "textDocument/publishDiagnostics",
6497
params: params,
6598
};
66-
messageSender.send(notification);
99+
channel.send(notification);
67100

68101
filesWithDiagnostics.add(file);
69102
});
@@ -81,7 +114,7 @@ let sendUpdatedDiagnostics = () => {
81114
method: "textDocument/publishDiagnostics",
82115
params: params,
83116
};
84-
messageSender.send(notification);
117+
channel.send(notification);
85118
filesWithDiagnostics.delete(file);
86119
}
87120
});
@@ -101,7 +134,7 @@ let deleteProjectDiagnostics = (projectRootPath: string) => {
101134
method: "textDocument/publishDiagnostics",
102135
params: params,
103136
};
104-
messageSender.send(notification);
137+
channel.send(notification);
105138
});
106139

107140
projectsFiles.delete(projectRootPath);
@@ -170,7 +203,7 @@ let openedFile = (fileUri: string, fileContent: string) => {
170203
method: "window/showMessageRequest",
171204
params: params,
172205
};
173-
messageSender.send(request);
206+
channel.send(request);
174207
// the client might send us back the "start build" action, which we'll
175208
// handle in the isResponseMessage check in the message handling way
176209
// below
@@ -219,31 +252,7 @@ let getOpenedFileContent = (fileUri: string) => {
219252
return content;
220253
};
221254

222-
let onMessage = (func: any) => {
223-
process.on("message", (msg: m.Message) => {
224-
func(messageSender.send, msg);
225-
})
226-
};
227-
228-
let argv = process.argv.slice(2);
229-
for (let i = 0; i < argv.length; i++) {
230-
let arg = argv[i];
231-
if (arg === "--stdio") {
232-
let writer = new rpc.StreamMessageWriter(process.stdout);
233-
let reader = new rpc.StreamMessageReader(process.stdin);
234-
messageSender.send = (msg: m.Message) => writer.write(msg);
235-
onMessage = ((func: any) => {
236-
let callback = (message: m.Message) => {
237-
func(messageSender.send, message);
238-
}
239-
reader.listen(callback);
240-
});
241-
242-
break;
243-
};
244-
}
245-
246-
onMessage((send: any, msg: m.Message) => {
255+
channel.onMessage((send, msg: m.Message) => {
247256
if (m.isNotificationMessage(msg)) {
248257
// notification message, aka the client ends it and doesn't want a reply
249258
if (!initialized && msg.method !== "exit") {

0 commit comments

Comments
 (0)