Skip to content

Commit 84aabc5

Browse files
author
Dimitar Tachev
authored
Merge pull request #3902 from NativeScript/tachev/preview-initial-files
refactor: start using getInitialFiles instead of applyChanges during the first Preview sync
2 parents 9f52b57 + 6278577 commit 84aabc5

File tree

8 files changed

+109
-86
lines changed

8 files changed

+109
-86
lines changed

lib/definitions/preview-app-livesync.d.ts

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
1-
import { FilePayload, Device } from "nativescript-preview-sdk";
1+
import { FilePayload, Device, FilesPayload } from "nativescript-preview-sdk";
22

33
declare global {
44
interface IPreviewAppLiveSyncService {
5-
initialize(): void;
6-
initialSync(data: IPreviewAppLiveSyncData): Promise<void>;
5+
initialize(data: IPreviewAppLiveSyncData): void;
76
syncFiles(data: IPreviewAppLiveSyncData, filesToSync: string[]): Promise<void>;
87
stopLiveSync(): Promise<void>;
98
}
109

1110
interface IPreviewAppLiveSyncData extends IProjectDir, IAppFilesUpdaterOptionsComposition, IEnvOptions { }
1211

13-
interface IPreviewSdkService extends NodeJS.EventEmitter {
12+
interface IPreviewSdkService {
1413
qrCodeUrl: string;
1514
connectedDevices: Device[];
16-
initialize(): void;
17-
applyChanges(files: FilePayload[], platform: string): Promise<void>;
15+
initialize(getInitialFiles: (device: Device) => Promise<FilesPayload>): void;
16+
applyChanges(filesPayload: FilesPayload): Promise<void>;
1817
stop(): void;
1918
}
2019

lib/services/livesync/livesync-service.ts

+9-17
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,14 @@ export class LiveSyncService extends EventEmitter implements IDebugLiveSyncServi
325325
let deviceDescriptorsForInitialSync: ILiveSyncDeviceInfo[] = [];
326326

327327
if (liveSyncData.syncToPreviewApp) {
328-
this.$previewAppLiveSyncService.initialize();
328+
this.$previewAppLiveSyncService.initialize({
329+
appFilesUpdaterOptions: {
330+
bundle: liveSyncData.bundle,
331+
release: liveSyncData.release
332+
},
333+
env: liveSyncData.env,
334+
projectDir: projectData.projectDir
335+
});
329336
} else {
330337
await this.$pluginsService.ensureAllDependenciesAreInstalled(projectData);
331338
// In case liveSync is called for a second time for the same projectDir.
@@ -462,26 +469,11 @@ export class LiveSyncService extends EventEmitter implements IDebugLiveSyncServi
462469
}
463470

464471
private async initialSync(projectData: IProjectData, liveSyncData: ILiveSyncInfo, deviceDescriptors: ILiveSyncDeviceInfo[]): Promise<void> {
465-
if (liveSyncData.syncToPreviewApp) {
466-
await this.initialSyncToPreviewApp(projectData, liveSyncData);
467-
} else {
472+
if (!liveSyncData.syncToPreviewApp) {
468473
await this.initialCableSync(projectData, liveSyncData, deviceDescriptors);
469474
}
470475
}
471476

472-
private async initialSyncToPreviewApp(projectData: IProjectData, liveSyncData: ILiveSyncInfo) {
473-
await this.addActionToChain(projectData.projectDir, async () => {
474-
await this.$previewAppLiveSyncService.initialSync({
475-
appFilesUpdaterOptions: {
476-
bundle: liveSyncData.bundle,
477-
release: liveSyncData.release
478-
},
479-
env: liveSyncData.env,
480-
projectDir: projectData.projectDir
481-
});
482-
});
483-
}
484-
485477
private async initialCableSync(projectData: IProjectData, liveSyncData: ILiveSyncInfo, deviceDescriptors: ILiveSyncDeviceInfo[]): Promise<void> {
486478
const preparedPlatforms: string[] = [];
487479
const rebuiltInformation: ILiveSyncBuildInfo[] = [];

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

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
export class PreviewSdkEventNames {
2-
public static DEVICE_CONNECTED = "onDeviceConnected";
32
public static CHANGE_EVENT_NAME = "change";
43
}
54

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

+31-21
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as path from "path";
2-
import { FilePayload, Device } from "nativescript-preview-sdk";
2+
import { FilePayload, Device, FilesPayload } from "nativescript-preview-sdk";
33
import { PreviewSdkEventNames } from "./preview-app-constants";
44
import { APP_FOLDER_NAME, APP_RESOURCES_FOLDER_NAME, TNS_MODULES_FOLDER_NAME } from "../../../constants";
55
const isTextOrBinary = require('istextorbinary');
@@ -9,6 +9,7 @@ export class PreviewAppLiveSyncService implements IPreviewAppLiveSyncService {
99
private excludedFiles = [".DS_Store"];
1010

1111
constructor(private $fs: IFileSystem,
12+
private $errors: IErrors,
1213
private $hooksService: IHooksService,
1314
private $logger: ILogger,
1415
private $platformService: IPlatformService,
@@ -19,15 +20,14 @@ export class PreviewAppLiveSyncService implements IPreviewAppLiveSyncService {
1920
private $projectFilesManager: IProjectFilesManager,
2021
private $projectFilesProvider: IProjectFilesProvider) { }
2122

22-
public initialize() {
23-
this.$previewSdkService.initialize();
24-
}
23+
public initialize(data: IPreviewAppLiveSyncData) {
24+
this.$previewSdkService.initialize(async (device: Device) => {
25+
if (!device) {
26+
this.$errors.failWithoutHelp("Sending initial preview files without a specified device is not supported.");
27+
}
2528

26-
public async initialSync(data: IPreviewAppLiveSyncData): Promise<void> {
27-
this.$previewSdkService.on(PreviewSdkEventNames.DEVICE_CONNECTED, async (device: Device) => {
28-
this.$logger.trace("Found connected device", device);
2929
const filesToSyncMap: IDictionary<string[]> = {};
30-
let promise = Promise.resolve();
30+
let promise = Promise.resolve<FilesPayload>(null);
3131
const startSyncFilesTimeout = async (platform: string) => {
3232
await promise
3333
.then(async () => {
@@ -46,11 +46,13 @@ export class PreviewAppLiveSyncService implements IPreviewAppLiveSyncService {
4646
},
4747
externals: this.$previewAppPluginsService.getExternalPlugins(device),
4848
filesToSyncMap,
49-
  startSyncFilesTimeout: startSyncFilesTimeout.bind(this)
49+
startSyncFilesTimeout: startSyncFilesTimeout.bind(this)
5050
}
51-
            });
51+
});
5252
await this.$previewAppPluginsService.comparePluginsOnDevice(device);
53-
await this.syncFilesForPlatformSafe(data, device.platform);
53+
const payloads = await this.syncFilesForPlatformSafe(data, device.platform);
54+
55+
return payloads;
5456
});
5557
}
5658

@@ -72,33 +74,41 @@ export class PreviewAppLiveSyncService implements IPreviewAppLiveSyncService {
7274
}
7375

7476
public async stopLiveSync(): Promise<void> {
75-
this.$previewSdkService.removeAllListeners();
7677
this.$previewSdkService.stop();
7778
}
7879

79-
private async syncFilesForPlatformSafe(data: IPreviewAppLiveSyncData, platform: string, files?: string[]): Promise<void> {
80+
private async syncFilesForPlatformSafe(data: IPreviewAppLiveSyncData, platform: string, files?: string[]): Promise<FilesPayload> {
8081
this.$logger.info(`Start syncing changes for platform ${platform}.`);
8182

8283
try {
8384
const { appFilesUpdaterOptions, env, projectDir } = data;
8485
const projectData = this.$projectDataService.getProjectData(projectDir);
86+
const platformData = this.$platformsData.getPlatformData(platform, projectData);
8587
await this.preparePlatform(platform, appFilesUpdaterOptions, env, projectData);
8688

87-
await this.applyChanges(projectData, platform, files);
89+
let result: FilesPayload = null;
90+
if (files && files.length) {
91+
result = await this.applyChanges(platformData, projectData, files);
92+
} else {
93+
result = await this.getFilesPayload(platformData, projectData);
94+
}
8895

8996
this.$logger.info(`Successfully synced changes for platform ${platform}.`);
97+
98+
return result;
9099
} catch (err) {
91100
this.$logger.warn(`Unable to apply changes for platform ${platform}. Error is: ${err}, ${JSON.stringify(err, null, 2)}.`);
92101
}
93102
}
94103

95-
private async applyChanges(projectData: IProjectData, platform: string, files: string[]) {
96-
const platformData = this.$platformsData.getPlatformData(platform, projectData);
97-
const payloads = this.getFilePayloads(platformData, projectData, _(files).uniq().value());
98-
await this.$previewSdkService.applyChanges(payloads, platform);
104+
private async applyChanges(platformData: IPlatformData, projectData: IProjectData, files: string[]): Promise<FilesPayload> {
105+
const payloads = this.getFilesPayload(platformData, projectData, _(files).uniq().value());
106+
await this.$previewSdkService.applyChanges(payloads);
107+
108+
return payloads;
99109
}
100110

101-
private getFilePayloads(platformData: IPlatformData, projectData: IProjectData, files?: string[]): FilePayload[] {
111+
private getFilesPayload(platformData: IPlatformData, projectData: IProjectData, files?: string[]): FilesPayload {
102112
const appFolderPath = path.join(projectData.projectDir, APP_FOLDER_NAME);
103113
const platformsAppFolderPath = path.join(platformData.appDestinationDirectoryPath, APP_FOLDER_NAME);
104114

@@ -128,7 +138,7 @@ export class PreviewAppLiveSyncService implements IPreviewAppLiveSyncService {
128138
};
129139

130140
if (filePayload.binary) {
131-
const bitmap = <string>this.$fs.readFile(file);
141+
const bitmap = <string>this.$fs.readFile(file);
132142
const base64 = Buffer.from(bitmap).toString('base64');
133143
filePayload.fileContents = base64;
134144
} else {
@@ -138,7 +148,7 @@ export class PreviewAppLiveSyncService implements IPreviewAppLiveSyncService {
138148
return filePayload;
139149
});
140150

141-
return payloads;
151+
return { files: payloads, platform: platformData.normalizedPlatformName.toLowerCase() };
142152
}
143153

144154
private async preparePlatform(platform: string, appFilesUpdaterOptions: IAppFilesUpdaterOptions, env: Object, projectData: IProjectData): Promise<void> {

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

+9-16
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
import { FilePayload, MessagingService, Config, Device, DeviceConnectedMessage, SdkCallbacks, ConnectedDevices } from "nativescript-preview-sdk";
2-
import { EventEmitter } from "events";
3-
import { PreviewSdkEventNames, PubnubKeys } from "./preview-app-constants";
1+
import { MessagingService, Config, Device, DeviceConnectedMessage, SdkCallbacks, ConnectedDevices, FilesPayload } from "nativescript-preview-sdk";
2+
import { PubnubKeys } from "./preview-app-constants";
43
const pako = require("pako");
54

6-
export class PreviewSdkService extends EventEmitter implements IPreviewSdkService {
5+
export class PreviewSdkService implements IPreviewSdkService {
76
private messagingService: MessagingService = null;
87
private instanceId: string = null;
98
public connectedDevices: Device[] = [];
@@ -12,22 +11,21 @@ export class PreviewSdkService extends EventEmitter implements IPreviewSdkServic
1211
private $logger: ILogger,
1312
private $httpClient: Server.IHttpClient,
1413
private $config: IConfiguration) {
15-
super();
1614
}
1715

1816
public get qrCodeUrl(): string {
1917
return `nsplay://boot?instanceId=${this.instanceId}&pKey=${PubnubKeys.PUBLISH_KEY}&sKey=${PubnubKeys.SUBSCRIBE_KEY}&template=play-ng`;
2018
}
2119

22-
public initialize(): void {
23-
const initConfig = this.getInitConfig();
20+
public initialize(getInitialFiles: (device: Device) => Promise<FilesPayload>): void {
21+
const initConfig = this.getInitConfig(getInitialFiles);
2422
this.messagingService = new MessagingService();
2523
this.instanceId = this.messagingService.initialize(initConfig);
2624
}
2725

28-
public applyChanges(files: FilePayload[], platform: string): Promise<void> {
26+
public applyChanges(filesPayload: FilesPayload): Promise<void> {
2927
return new Promise((resolve, reject) => {
30-
this.messagingService.applyChanges(this.instanceId, { files, platform }, err => {
28+
this.messagingService.applyChanges(this.instanceId, filesPayload, err => {
3129
if (err) {
3230
reject(err);
3331
} else {
@@ -41,16 +39,12 @@ export class PreviewSdkService extends EventEmitter implements IPreviewSdkServic
4139
this.messagingService.stop();
4240
}
4341

44-
private getInitConfig(): Config {
42+
private getInitConfig(getInitialFiles: (device: Device) => Promise<FilesPayload>): Config {
4543
return {
4644
pubnubPublishKey: PubnubKeys.PUBLISH_KEY,
4745
pubnubSubscribeKey: PubnubKeys.SUBSCRIBE_KEY,
4846
callbacks: this.getCallbacks(),
49-
getInitialFiles: async () => {
50-
return {
51-
files: []
52-
};
53-
}
47+
getInitialFiles
5448
};
5549
}
5650

@@ -71,7 +65,6 @@ export class PreviewSdkService extends EventEmitter implements IPreviewSdkServic
7165
},
7266
onDeviceConnectedMessage: (deviceConnectedMessage: DeviceConnectedMessage) => ({ }),
7367
onDeviceConnected: (device: Device) => {
74-
this.emit(PreviewSdkEventNames.DEVICE_CONNECTED, device);
7568
if (!_.includes(this.connectedDevices, device)) {
7669
this.connectedDevices.push(device);
7770
}

npm-shrinkwrap.json

+16-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
"mkdirp": "0.5.1",
5757
"mute-stream": "0.0.5",
5858
"nativescript-doctor": "1.2.0",
59-
"nativescript-preview-sdk": "0.2.2",
59+
"nativescript-preview-sdk": "0.2.4",
6060
"open": "0.0.5",
6161
"ora": "2.0.0",
6262
"osenv": "0.1.3",

0 commit comments

Comments
 (0)