diff --git a/src/server/server.ts b/src/server/server.ts index 8acc42c76cb..22112c4cb7d 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -510,6 +510,13 @@ namespace ts.server { class IOSession extends Session { constructor(options: IoSessionOptions) { const { host, eventPort, globalTypingsCacheLocation, typingSafeListLocation, typesMapLocation, npmLocation, canUseEvents } = options; + + let event: Event; + if (canUseEvents && eventPort) { + const eventSender = new SocketEventSender(host, logger, eventPort); + event = eventSender.event; + } + const typingsInstaller = disableAutomaticTypingAcquisition ? undefined : new NodeTypingsInstaller(telemetryEnabled, logger, host, globalTypingsCacheLocation, typingSafeListLocation, typesMapLocation, npmLocation); @@ -525,6 +532,7 @@ namespace ts.server { logger, canUseEvents, eventPort, + event, globalPlugins: options.globalPlugins, pluginProbeLocations: options.pluginProbeLocations, allowLocalPluginLoads: options.allowLocalPluginLoads }); diff --git a/src/server/session.ts b/src/server/session.ts index 13f65a8cb4e..8ad9f7b245b 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -255,7 +255,8 @@ namespace ts.server { event: Event; } - class SocketEventSender implements EventSender { + /** @internal */ + export class SocketEventSender implements EventSender { private host: ServerHost; private logger: Logger; private eventPort: number; @@ -316,6 +317,11 @@ namespace ts.server { * Otherwise, events are sent through the host. */ eventPort?: number; + /** + * An optional callback overriding the default behavior for sending events. + * if set, `canUseEvents` and `eventPort` are ignored. + */ + event?: Event; eventHandler?: ProjectServiceEventHandler; throttleWaitMilliseconds?: number; @@ -353,11 +359,14 @@ namespace ts.server { this.hrtime = opts.hrtime; this.logger = opts.logger; this.eventPort = opts.eventPort; - this.canUseEvents = opts.canUseEvents; + this.canUseEvents = opts.canUseEvents || !!opts.event; const { throttleWaitMilliseconds } = opts; - - if (this.eventPort && this.canUseEvents) { + + if (opts.event) { + this.event = opts.event; + } + else if (this.eventPort && this.canUseEvents) { const eventSender = new SocketEventSender(this.host, this.logger, this.eventPort); this.event = eventSender.event; }