Skip to content

Commit 005c863

Browse files
committed
move socketSender to IOSession
1 parent 93ff7ba commit 005c863

2 files changed

Lines changed: 55 additions & 66 deletions

File tree

src/server/server.ts

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ namespace ts.server {
66
host: ServerHost;
77
cancellationToken: ServerCancellationToken;
88
canUseEvents: boolean;
9+
/**
10+
* If defined, specifies the socket used to send events to the client.
11+
* Otherwise, events are sent through the host.
12+
*/
913
eventPort?: number;
1014
useSingleInferredProject: boolean;
1115
useInferredProjectPerProjectRoot: boolean;
@@ -31,6 +35,14 @@ namespace ts.server {
3135
tmpdir(): string;
3236
} = require("os");
3337

38+
interface NodeSocket {
39+
write(data: string, encoding: string): boolean;
40+
}
41+
42+
const net: {
43+
connect(options: { port: number }, onConnect?: () => void): NodeSocket
44+
} = require("net");
45+
3446
function getGlobalTypingsCacheLocation() {
3547
switch (process.platform) {
3648
case "win32": {
@@ -507,6 +519,49 @@ namespace ts.server {
507519
}
508520
}
509521

522+
class SocketEventSender implements EventSender {
523+
private host: ServerHost;
524+
private logger: Logger;
525+
private eventPort: number;
526+
private eventSocket: NodeSocket | undefined;
527+
private socketEventQueue: { body: any, eventName: string }[] | undefined;
528+
529+
constructor(host: ServerHost, logger: Logger, eventPort: number) {
530+
this.host = host;
531+
this.logger = logger;
532+
this.eventPort = eventPort;
533+
534+
const s = net.connect({ port: this.eventPort }, () => {
535+
this.eventSocket = s;
536+
if (this.socketEventQueue) {
537+
// flush queue.
538+
for (const event of this.socketEventQueue) {
539+
this.writeToEventSocket(event.body, event.eventName);
540+
}
541+
this.socketEventQueue = undefined;
542+
}
543+
});
544+
}
545+
546+
public event = <T>(body: T, eventName: string) => {
547+
if (!this.eventSocket) {
548+
if (this.logger.hasLevel(LogLevel.verbose)) {
549+
this.logger.info(`eventPort: event "${eventName}" queued, but socket not yet initialized`);
550+
}
551+
(this.socketEventQueue || (this.socketEventQueue = [])).push({ body, eventName });
552+
return;
553+
}
554+
else {
555+
Debug.assert(this.socketEventQueue === undefined);
556+
this.writeToEventSocket(body, eventName);
557+
}
558+
}
559+
560+
private writeToEventSocket(body: any, eventName: string): void {
561+
this.eventSocket.write(formatMessage({ seq: 0, type: "event", event: eventName, body }, this.logger, Buffer.byteLength, this.host.newLine), "utf8");
562+
}
563+
}
564+
510565
class IOSession extends Session {
511566
constructor(options: IoSessionOptions) {
512567
const { host, eventPort, globalTypingsCacheLocation, typingSafeListLocation, typesMapLocation, npmLocation, canUseEvents } = options;
@@ -531,7 +586,6 @@ namespace ts.server {
531586
hrtime: process.hrtime,
532587
logger,
533588
canUseEvents,
534-
eventPort,
535589
event,
536590
globalPlugins: options.globalPlugins,
537591
pluginProbeLocations: options.pluginProbeLocations,

src/server/session.ts

Lines changed: 0 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,9 @@
1-
/// <reference types="node" />
21
/// <reference path="..\compiler\commandLineParser.ts" />
32
/// <reference path="..\services\services.ts" />
43
/// <reference path="protocol.ts" />
54
/// <reference path="editorServices.ts" />
65

76
namespace ts.server {
8-
9-
interface NodeSocket {
10-
write(data: string, encoding: string): boolean;
11-
}
12-
13-
const net: {
14-
connect(options: { port: number }, onConnect?: () => void): NodeSocket
15-
} = require("net");
16-
177
interface StackTraceError extends Error {
188
stack?: string;
199
}
@@ -255,50 +245,6 @@ namespace ts.server {
255245
event: Event;
256246
}
257247

258-
/** @internal */
259-
export class SocketEventSender implements EventSender {
260-
private host: ServerHost;
261-
private logger: Logger;
262-
private eventPort: number;
263-
private eventSocket: NodeSocket | undefined;
264-
private socketEventQueue: { body: any, eventName: string }[] | undefined;
265-
266-
constructor(host: ServerHost, logger: Logger, eventPort: number) {
267-
this.host = host;
268-
this.logger = logger;
269-
this.eventPort = eventPort;
270-
271-
const s = net.connect({ port: this.eventPort }, () => {
272-
this.eventSocket = s;
273-
if (this.socketEventQueue) {
274-
// flush queue.
275-
for (const event of this.socketEventQueue) {
276-
this.writeToEventSocket(event.body, event.eventName);
277-
}
278-
this.socketEventQueue = undefined;
279-
}
280-
});
281-
}
282-
283-
public event = <T>(body: T, eventName: string) => {
284-
if (!this.eventSocket) {
285-
if (this.logger.hasLevel(LogLevel.verbose)) {
286-
this.logger.info(`eventPort: event "${eventName}" queued, but socket not yet initialized`);
287-
}
288-
(this.socketEventQueue || (this.socketEventQueue = [])).push({ body, eventName });
289-
return;
290-
}
291-
else {
292-
Debug.assert(this.socketEventQueue === undefined);
293-
this.writeToEventSocket(body, eventName);
294-
}
295-
}
296-
297-
private writeToEventSocket(body: any, eventName: string): void {
298-
this.eventSocket.write(formatMessage({ seq: 0, type: "event", event: eventName, body }, this.logger, Buffer.byteLength, this.host.newLine), "utf8");
299-
}
300-
}
301-
302248
export interface SessionOptions {
303249
host: ServerHost;
304250
cancellationToken: ServerCancellationToken;
@@ -312,11 +258,6 @@ namespace ts.server {
312258
* If falsy, all events are suppressed.
313259
*/
314260
canUseEvents: boolean;
315-
/**
316-
* If defined, specifies the socket to send events to the client.
317-
* Otherwise, events are sent through the host.
318-
*/
319-
eventPort?: number;
320261
/**
321262
* An optional callback overriding the default behavior for sending events.
322263
* if set, `canUseEvents` and `eventPort` are ignored.
@@ -348,7 +289,6 @@ namespace ts.server {
348289
protected logger: Logger;
349290

350291
private canUseEvents: boolean;
351-
private eventPort: number | undefined;
352292
private eventHandler: ProjectServiceEventHandler;
353293

354294
constructor(opts: SessionOptions) {
@@ -358,18 +298,13 @@ namespace ts.server {
358298
this.byteLength = opts.byteLength;
359299
this.hrtime = opts.hrtime;
360300
this.logger = opts.logger;
361-
this.eventPort = opts.eventPort;
362301
this.canUseEvents = opts.canUseEvents || !!opts.event;
363302

364303
const { throttleWaitMilliseconds } = opts;
365304

366305
if (opts.event) {
367306
this.event = opts.event;
368307
}
369-
else if (this.eventPort && this.canUseEvents) {
370-
const eventSender = new SocketEventSender(this.host, this.logger, this.eventPort);
371-
this.event = eventSender.event;
372-
}
373308
else {
374309
this.event = function <T>(body: T, eventName: string): void {
375310
const ev: protocol.Event = {

0 commit comments

Comments
 (0)