Skip to content

Commit f5f0836

Browse files
committed
feat: stop webpack and native watchers on stopRunOnDevices()
1 parent 046d6e9 commit f5f0836

File tree

3 files changed

+43
-9
lines changed

3 files changed

+43
-9
lines changed

lib/controllers/main-controller.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { RunOnDevicesDataService } from "../services/run-on-devices-data-service
1010
import { cache } from "../common/decorators";
1111
import { DeviceDiscoveryEventNames } from "../common/constants";
1212
import { RunOnDevicesEmitter } from "../run-on-devices-emitter";
13+
import { PlatformWatcherService } from "../services/platform/platform-watcher-service";
1314

1415
export class MainController extends EventEmitter {
1516
constructor(
@@ -20,7 +21,7 @@ export class MainController extends EventEmitter {
2021
private $errors: IErrors,
2122
private $hooksService: IHooksService,
2223
private $logger: ILogger,
23-
private $platformWatcherService: IPlatformWatcherService,
24+
private $platformWatcherService: PlatformWatcherService,
2425
private $pluginsService: IPluginsService,
2526
private $preparePlatformService: PreparePlatformService,
2627
private $projectDataService: IProjectDataService,
@@ -90,7 +91,7 @@ export class MainController extends EventEmitter {
9091

9192
for (const platform of platforms) {
9293
const { nativePlatformData, preparePlatformData } = this.$workflowDataService.createWorkflowData(platform, projectDir, liveSyncInfo);
93-
await this.$platformWatcherService.startWatcher(nativePlatformData, projectData, preparePlatformData);
94+
await this.$platformWatcherService.startWatchers(nativePlatformData, projectData, preparePlatformData);
9495
}
9596
}
9697

@@ -117,11 +118,11 @@ export class MainController extends EventEmitter {
117118
clearTimeout(liveSyncProcessInfo.timer);
118119
}
119120

120-
if (liveSyncProcessInfo.watcherInfo && liveSyncProcessInfo.watcherInfo.watcher) {
121-
liveSyncProcessInfo.watcherInfo.watcher.close();
122-
}
121+
_.each(liveSyncProcessInfo.deviceDescriptors, deviceDescriptor => {
122+
const device = this.$devicesService.getDeviceByIdentifier(deviceDescriptor.identifier);
123+
this.$platformWatcherService.stopWatchers(projectDir, device.deviceInfo.platform);
124+
});
123125

124-
liveSyncProcessInfo.watcherInfo = null;
125126
liveSyncProcessInfo.isStopped = true;
126127

127128
if (liveSyncProcessInfo.actionsChain && shouldAwaitPendingOperation) {

lib/services/platform/platform-watcher-service.ts

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,25 @@ import * as path from "path";
55
import { INITIAL_SYNC_EVENT_NAME, FILES_CHANGE_EVENT_NAME } from "../../constants";
66
import { PreparePlatformData } from "../workflow/workflow-data-service";
77
import { PreparePlatformService } from "./prepare-platform-service";
8+
import { WebpackCompilerService } from "../webpack/webpack-compiler-service";
89

910
interface IPlatformWatcherData {
1011
webpackCompilerProcess: child_process.ChildProcess;
1112
nativeFilesWatcher: choki.FSWatcher;
1213
}
1314

14-
export class PlatformWatcherService extends EventEmitter implements IPlatformWatcherService {
15+
export class PlatformWatcherService extends EventEmitter {
1516
private watchersData: IDictionary<IDictionary<IPlatformWatcherData>> = {};
1617
private isInitialSyncEventEmitted = false;
1718
private persistedFilesChangeEventData: IFilesChangeEventData[] = [];
1819

1920
constructor(
2021
private $logger: ILogger,
2122
private $preparePlatformService: PreparePlatformService,
22-
private $webpackCompilerService: IWebpackCompilerService
23+
private $webpackCompilerService: WebpackCompilerService
2324
) { super(); }
2425

25-
public async startWatcher(platformData: IPlatformData, projectData: IProjectData, preparePlatformData: PreparePlatformData): Promise<void> {
26+
public async startWatchers(platformData: IPlatformData, projectData: IProjectData, preparePlatformData: PreparePlatformData): Promise<void> {
2627
this.$logger.out("Starting watchers...");
2728

2829
if (!this.watchersData[projectData.projectDir]) {
@@ -42,6 +43,20 @@ export class PlatformWatcherService extends EventEmitter implements IPlatformWat
4243
this.emitInitialSyncEvent({ platform: platformData.platformNameLowerCase, hasNativeChanges });
4344
}
4445

46+
public async stopWatchers(projectDir: string, platform: string) {
47+
const platformLowerCase = platform.toLowerCase();
48+
49+
if (this.watchersData && this.watchersData[projectDir] && this.watchersData[projectDir][platformLowerCase] && this.watchersData[projectDir][platformLowerCase].nativeFilesWatcher) {
50+
this.watchersData[projectDir][platformLowerCase].nativeFilesWatcher.close();
51+
this.watchersData[projectDir][platformLowerCase].nativeFilesWatcher = null;
52+
}
53+
54+
if (this.watchersData && this.watchersData[projectDir] && this.watchersData[projectDir][platformLowerCase] && this.watchersData[projectDir][platformLowerCase].webpackCompilerProcess) {
55+
this.$webpackCompilerService.stopWebpackCompile(platform);
56+
this.watchersData[projectDir][platformLowerCase].webpackCompilerProcess = null;
57+
}
58+
}
59+
4560
private async startJSWatcherWithPrepare(platformData: IPlatformData, projectData: IProjectData, config: IWebpackCompilerConfig): Promise<void> {
4661
if (!this.watchersData[projectData.projectDir][platformData.platformNameLowerCase].webpackCompilerProcess) {
4762
this.$webpackCompilerService.on("webpackEmittedFiles", data => {

lib/services/webpack/webpack-compiler-service.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export class WebpackCompilerService extends EventEmitter implements IWebpackComp
77

88
constructor(
99
private $childProcess: IChildProcess,
10+
private $logger: ILogger,
1011
private $projectData: IProjectData
1112
) { super(); }
1213

@@ -86,6 +87,14 @@ export class WebpackCompilerService extends EventEmitter implements IWebpackComp
8687
});
8788
}
8889

90+
public stopWebpackCompile(platform: string) {
91+
if (platform) {
92+
this.stopWebpackForPlatform(platform);
93+
} else {
94+
Object.keys(this.webpackProcesses).forEach(pl => this.stopWebpackForPlatform(pl));
95+
}
96+
}
97+
8998
private startWebpackProcess(platformData: IPlatformData, projectData: IProjectData, config: IWebpackCompilerConfig): child_process.ChildProcess {
9099
const envData = this.buildEnvData(platformData.platformNameLowerCase, config.env);
91100
const envParams = this.buildEnvCommandLineParams(envData);
@@ -183,5 +192,14 @@ export class WebpackCompilerService extends EventEmitter implements IWebpackComp
183192
hash: matches[2] || "",
184193
};
185194
}
195+
196+
private stopWebpackForPlatform(platform: string) {
197+
this.$logger.trace(`Stopping webpack watch for platform ${platform}.`);
198+
const webpackProcess = this.webpackProcesses[platform];
199+
if (webpackProcess) {
200+
webpackProcess.kill("SIGINT");
201+
delete this.webpackProcesses[platform];
202+
}
203+
}
186204
}
187205
$injector.register("webpackCompilerService", WebpackCompilerService);

0 commit comments

Comments
 (0)