Skip to content

Commit 397878e

Browse files
author
Fatme
authored
Merge pull request #4021 from NativeScript/fatme/fix-hmr-status
fix: get correct hmr hash when more than one webpacks are started
2 parents cefa22f + 530fbf6 commit 397878e

7 files changed

+24
-24
lines changed
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
interface IHmrStatusService {
22
getHmrStatus(deviceId: string, operationHash: string): Promise<number>;
3-
attachToHrmStatusEvent(): void;
3+
attachToHmrStatusEvent(): void;
44
}

lib/definitions/livesync.d.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ interface ILiveSyncWatchInfo extends IProjectDataComposition, IHasUseHotModuleRe
356356
isReinstalled: boolean;
357357
syncAllFiles: boolean;
358358
liveSyncDeviceInfo: ILiveSyncDeviceInfo;
359-
hmrData: { hash: string; fallbackFiles: IDictionary<string[]> };
359+
hmrData: IPlatformHmrData;
360360
force?: boolean;
361361
}
362362

@@ -377,6 +377,11 @@ interface IFullSyncInfo extends IProjectDataComposition, IHasUseHotModuleReloadO
377377
force?: boolean;
378378
}
379379

380+
interface IPlatformHmrData {
381+
hash: string;
382+
fallbackFiles: string[];
383+
}
384+
380385
interface ITransferFilesOptions {
381386
isFullSync: boolean;
382387
force?: boolean;

lib/services/hmr-status-service.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export class HmrStatusService implements IHmrStatusService {
3434
}
3535

3636
@cache()
37-
public attachToHrmStatusEvent(): void {
37+
public attachToHmrStatusEvent(): void {
3838
this.$logParserService.addParseRule({
3939
regex: HmrStatusService.HMR_STATUS_LOG_REGEX,
4040
handler: this.handleHmrStatusFound.bind(this),
@@ -62,7 +62,7 @@ export class HmrStatusService implements IHmrStatusService {
6262
}
6363
}
6464

65-
this.$logger.trace("Found hmr status.", {status, hash});
65+
this.$logger.trace("Found hmr status.", { status, hash });
6666

6767
if (status) {
6868
this.setData(status, hash, deviceId);

lib/services/livesync/android-livesync-service.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export class AndroidLiveSyncService extends PlatformLiveSyncServiceBase implemen
3030
// This is the case when the app has crashed and is in ErrorActivity.
3131
// As the app might not have time to apply the patches, we will send the whole bundle.js(fallbackFiles)
3232
if (liveSyncInfo.useHotModuleReload && !result.didRefresh && liveSyncInfo.hmrData && liveSyncInfo.hmrData.hash) {
33-
liveSyncInfo.filesToSync = liveSyncInfo.hmrData.fallbackFiles[device.deviceInfo.platform];
33+
liveSyncInfo.filesToSync = liveSyncInfo.hmrData.fallbackFiles;
3434
result = await this.liveSyncWatchActionCore(device, liveSyncInfo);
3535
result.didRecover = true;
3636
}

lib/services/livesync/livesync-service.ts

+8-11
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,7 @@ export class LiveSyncService extends EventEmitter implements IDebugLiveSyncServi
565565
const patterns = await this.getWatcherPatterns(liveSyncData, projectData, platforms);
566566

567567
if (liveSyncData.useHotModuleReload) {
568-
this.$hmrStatusService.attachToHrmStatusEvent();
568+
this.$hmrStatusService.attachToHmrStatusEvent();
569569
}
570570

571571
if (liveSyncData.watchAllFiles) {
@@ -586,10 +586,7 @@ export class LiveSyncService extends EventEmitter implements IDebugLiveSyncServi
586586
}
587587

588588
let filesToSync: string[] = [];
589-
const hmrData: { hash: string; fallbackFiles: IDictionary<string[]> } = {
590-
hash: "",
591-
fallbackFiles: {}
592-
};
589+
const hmrData: IDictionary<IPlatformHmrData> = {};
593590
const filesToSyncMap: IDictionary<string[]> = {};
594591
let filesToRemove: string[] = [];
595592
let timeoutTimer: NodeJS.Timer;
@@ -635,6 +632,7 @@ export class LiveSyncService extends EventEmitter implements IDebugLiveSyncServi
635632
await this.$devicesService.execute(async (device: Mobile.IDevice) => {
636633
const liveSyncProcessInfo = this.liveSyncProcessesInfo[projectData.projectDir];
637634
const deviceBuildInfoDescriptor = _.find(liveSyncProcessInfo.deviceDescriptors, dd => dd.identifier === device.deviceInfo.identifier);
635+
const platformHmrData = (currentHmrData && currentHmrData[device.deviceInfo.platform]) || <any>{};
638636

639637
const settings: ILiveSyncWatchInfo = {
640638
liveSyncDeviceInfo: deviceBuildInfoDescriptor,
@@ -643,7 +641,7 @@ export class LiveSyncService extends EventEmitter implements IDebugLiveSyncServi
643641
filesToSync: currentFilesToSync,
644642
isReinstalled: false,
645643
syncAllFiles: liveSyncData.watchAllFiles,
646-
hmrData: currentHmrData,
644+
hmrData: platformHmrData,
647645
useHotModuleReload: liveSyncData.useHotModuleReload,
648646
force: liveSyncData.force,
649647
connectTimeout: 1000
@@ -657,10 +655,10 @@ export class LiveSyncService extends EventEmitter implements IDebugLiveSyncServi
657655
await this.refreshApplication(projectData, liveSyncResultInfo, deviceBuildInfoDescriptor.debugOptions, deviceBuildInfoDescriptor.outputPath);
658656

659657
// If didRecover is true, this means we were in ErrorActivity and fallback files were already transfered and app will be restarted.
660-
if (!liveSyncResultInfo.didRecover && liveSyncData.useHotModuleReload && currentHmrData.hash) {
661-
const status = await this.$hmrStatusService.getHmrStatus(device.deviceInfo.identifier, currentHmrData.hash);
658+
if (!liveSyncResultInfo.didRecover && liveSyncData.useHotModuleReload && platformHmrData.hash) {
659+
const status = await this.$hmrStatusService.getHmrStatus(device.deviceInfo.identifier, platformHmrData.hash);
662660
if (status === HmrConstants.HMR_ERROR_STATUS) {
663-
watchInfo.filesToSync = currentHmrData.fallbackFiles[device.deviceInfo.platform];
661+
watchInfo.filesToSync = platformHmrData.fallbackFiles;
664662
liveSyncResultInfo = await service.liveSyncWatchAction(device, watchInfo);
665663
// We want to force a restart of the application.
666664
liveSyncResultInfo.isFullSync = true;
@@ -703,8 +701,7 @@ export class LiveSyncService extends EventEmitter implements IDebugLiveSyncServi
703701
settings.connectTimeout = null;
704702

705703
if (liveSyncData.useHotModuleReload && appInstalledOnDeviceResult.appInstalled) {
706-
const additionalFilesToSync = currentHmrData && currentHmrData.fallbackFiles && currentHmrData.fallbackFiles[device.deviceInfo.platform];
707-
_.each(additionalFilesToSync, fileToSync => currentFilesToSync.push(fileToSync));
704+
_.each(platformHmrData.fallbackFiles, fileToSync => currentFilesToSync.push(fileToSync));
708705
}
709706

710707
await watchAction(settings);

lib/services/livesync/playground/preview-app-livesync-service.ts

+5-7
Original file line numberDiff line numberDiff line change
@@ -54,27 +54,25 @@ export class PreviewAppLiveSyncService implements IPreviewAppLiveSyncService {
5454

5555
private async initializePreviewForDevice(data: IPreviewAppLiveSyncData, device: Device): Promise<FilesPayload> {
5656
const filesToSyncMap: IDictionary<string[]> = {};
57-
const hmrData: { hash: string; fallbackFiles: IDictionary<string[]> } = {
58-
hash: "",
59-
fallbackFiles: {}
60-
};
57+
const hmrData: IDictionary<IPlatformHmrData> = {};
6158
let promise = Promise.resolve<FilesPayload>(null);
6259
const startSyncFilesTimeout = async (platform: string) => {
6360
await promise
6461
.then(async () => {
6562
const currentHmrData = _.cloneDeep(hmrData);
63+
const platformHmrData = currentHmrData[platform] || <any>{};
6664
const filesToSync = _.cloneDeep(filesToSyncMap[platform]);
6765
// We don't need to prepare when webpack emits changed files. We just need to send a message to pubnub.
6866
promise = this.syncFilesForPlatformSafe(data, platform, { filesToSync, skipPrepare: true, useHotModuleReload: data.appFilesUpdaterOptions.useHotModuleReload });
6967
await promise;
7068

71-
if (data.appFilesUpdaterOptions.useHotModuleReload && currentHmrData.hash) {
69+
if (data.appFilesUpdaterOptions.useHotModuleReload && platformHmrData.hash) {
7270
const devices = _.filter(this.$previewSdkService.connectedDevices, { platform: platform.toLowerCase() });
7371

7472
await Promise.all(_.map(devices, async (previewDevice: Device) => {
75-
const status = await this.$hmrStatusService.getHmrStatus(previewDevice.id, currentHmrData.hash);
73+
const status = await this.$hmrStatusService.getHmrStatus(previewDevice.id, platformHmrData.hash);
7674
if (status === HmrConstants.HMR_ERROR_STATUS) {
77-
await this.syncFilesForPlatformSafe(data, platform, { filesToSync: currentHmrData.fallbackFiles[platform], useHotModuleReload: false, deviceId: previewDevice.id });
75+
await this.syncFilesForPlatformSafe(data, platform, { filesToSync: platformHmrData.fallbackFiles, useHotModuleReload: false, deviceId: previewDevice.id });
7876
}
7977
}));
8078
}

lib/services/log-parser-service.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export class LogParserService extends EventEmitter implements ILogParserService
2929
private processDeviceLogResponse(message: string, deviceIdentifier: string, devicePlatform: string) {
3030
const lines = message.split("\n");
3131
_.forEach(lines, line => {
32-
_.forEach(this.parseRules, (parseRule) => {
32+
_.forEach(this.parseRules, parseRule => {
3333
if (!devicePlatform || !parseRule.platform || parseRule.platform.toLowerCase() === devicePlatform.toLowerCase()) {
3434
const matches = parseRule.regex.exec(line);
3535

0 commit comments

Comments
 (0)