@@ -7,9 +7,9 @@ namespace ts.server {
77 cancellationToken : ServerCancellationToken ;
88 canUseEvents : boolean ;
99 /**
10- * If defined, specifies the socket used to send events to the client.
11- * Otherwise, events are sent through the host.
12- */
10+ * If defined, specifies the socket used to send events to the client.
11+ * Otherwise, events are sent through the host.
12+ */
1313 eventPort ?: number ;
1414 useSingleInferredProject : boolean ;
1515 useInferredProjectPerProjectRoot : boolean ;
@@ -248,7 +248,6 @@ namespace ts.server {
248248 private installer : NodeChildProcess ;
249249 private installerPidReported = false ;
250250 private projectService : ProjectService ;
251- private eventSender : EventSender | undefined ;
252251 private activeRequestCount = 0 ;
253252 private requestQueue : QueuedOperation [ ] = [ ] ;
254253 private requestMap = createMap < QueuedOperation > ( ) ; // Maps operation ID to newest requestQueue entry with that ID
@@ -272,7 +271,11 @@ namespace ts.server {
272271 readonly globalTypingsCacheLocation : string ,
273272 readonly typingSafeListLocation : string ,
274273 readonly typesMapLocation : string ,
275- private readonly npmLocation : string | undefined ) {
274+ private readonly npmLocation : string | undefined ,
275+ /**
276+ * If undefined, event-related work will be suppressed.
277+ */
278+ private eventSender : EventSender | undefined ) {
276279 }
277280
278281 isKnownTypesPackageName ( name : string ) : boolean {
@@ -311,16 +314,12 @@ namespace ts.server {
311314 }
312315
313316
314- attach ( projectService : ProjectService , eventSender ?: EventSender ) {
317+ attach ( projectService : ProjectService ) {
315318 this . projectService = projectService ;
316319 if ( this . logger . hasLevel ( LogLevel . requestTime ) ) {
317320 this . logger . info ( "Binding..." ) ;
318321 }
319322
320- if ( eventSender ) {
321- this . eventSender = eventSender ;
322- }
323-
324323 const args : string [ ] = [ Arguments . GlobalCacheLocation , this . globalTypingsCacheLocation ] ;
325324 if ( this . telemetryEnabled ) {
326325 args . push ( Arguments . EnableTelemetry ) ;
@@ -519,17 +518,15 @@ namespace ts.server {
519518 }
520519 }
521520
522- class SocketEventSender implements EventSender {
523- private host : ServerHost ;
524- private logger : Logger ;
525- private eventPort : number ;
521+ class SocketEventSender extends DefaultMessageSender {
526522 private eventSocket : NodeSocket | undefined ;
527523 private socketEventQueue : { body : any , eventName : string } [ ] | undefined ;
528524
529- constructor ( host : ServerHost , logger : Logger , eventPort : number ) {
530- this . host = host ;
531- this . logger = logger ;
532- this . eventPort = eventPort ;
525+ constructor ( host : ServerHost ,
526+ byteLength : ( buf : string , encoding ?: string ) => number ,
527+ logger : Logger ,
528+ private eventPort : number ) {
529+ super ( host , byteLength , logger , /*canUseEvents*/ true ) ;
533530
534531 const s = net . connect ( { port : this . eventPort } , ( ) => {
535532 this . eventSocket = s ;
@@ -541,20 +538,20 @@ namespace ts.server {
541538 this . socketEventQueue = undefined ;
542539 }
543540 } ) ;
544- }
545541
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` ) ;
542+ this . event = < T > ( body : T , eventName : string ) => {
543+ if ( ! this . eventSocket ) {
544+ if ( this . logger . hasLevel ( LogLevel . verbose ) ) {
545+ this . logger . info ( `eventPort: event "${ eventName } " queued, but socket not yet initialized` ) ;
546+ }
547+ ( this . socketEventQueue || ( this . socketEventQueue = [ ] ) ) . push ( { body, eventName } ) ;
548+ return ;
550549 }
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- }
550+ else {
551+ Debug . assert ( this . socketEventQueue === undefined ) ;
552+ this . writeToEventSocket ( body , eventName ) ;
553+ }
554+ } ;
558555 }
559556
560557 private writeToEventSocket ( body : any , eventName : string ) : void {
@@ -566,15 +563,11 @@ namespace ts.server {
566563 constructor ( options : IoSessionOptions ) {
567564 const { host, eventPort, globalTypingsCacheLocation, typingSafeListLocation, typesMapLocation, npmLocation, canUseEvents } = options ;
568565
569- let event : Event ;
570- if ( canUseEvents && eventPort ) {
571- const eventSender = new SocketEventSender ( host , logger , eventPort ) ;
572- event = eventSender . event ;
573- }
566+ const messageSender = eventPort && canUseEvents ? new SocketEventSender ( host , Buffer . byteLength , logger , eventPort ) : new DefaultMessageSender ( host , Buffer . byteLength , logger , canUseEvents ) ;
574567
575568 const typingsInstaller = disableAutomaticTypingAcquisition
576569 ? undefined
577- : new NodeTypingsInstaller ( telemetryEnabled , logger , host , globalTypingsCacheLocation , typingSafeListLocation , typesMapLocation , npmLocation ) ;
570+ : new NodeTypingsInstaller ( telemetryEnabled , logger , host , globalTypingsCacheLocation , typingSafeListLocation , typesMapLocation , npmLocation , canUseEvents ? messageSender : undefined ) ;
578571
579572 super ( {
580573 host,
@@ -586,7 +579,7 @@ namespace ts.server {
586579 hrtime : process . hrtime ,
587580 logger,
588581 canUseEvents,
589- event ,
582+ messageSender ,
590583 globalPlugins : options . globalPlugins ,
591584 pluginProbeLocations : options . pluginProbeLocations ,
592585 allowLocalPluginLoads : options . allowLocalPluginLoads } ) ;
0 commit comments