Skip to content

Commit 32de6f0

Browse files
author
DimitarTachev
committed
refactor: start using getInitialFiles instead of applyChanges during the first Preview sync
1 parent 76ff072 commit 32de6f0

File tree

8 files changed

+113
-90
lines changed

8 files changed

+113
-90
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
@@ -321,7 +321,14 @@ export class LiveSyncService extends EventEmitter implements IDebugLiveSyncServi
321321
let deviceDescriptorsForInitialSync: ILiveSyncDeviceInfo[] = [];
322322

323323
if (liveSyncData.syncToPreviewApp) {
324-
this.$previewAppLiveSyncService.initialize();
324+
this.$previewAppLiveSyncService.initialize({
325+
appFilesUpdaterOptions: {
326+
bundle: liveSyncData.bundle,
327+
release: liveSyncData.release
328+
},
329+
env: liveSyncData.env,
330+
projectDir: projectData.projectDir
331+
});
325332
} else {
326333
await this.$pluginsService.ensureAllDependenciesAreInstalled(projectData);
327334
// In case liveSync is called for a second time for the same projectDir.
@@ -457,26 +464,11 @@ export class LiveSyncService extends EventEmitter implements IDebugLiveSyncServi
457464
}
458465

459466
private async initialSync(projectData: IProjectData, liveSyncData: ILiveSyncInfo, deviceDescriptors: ILiveSyncDeviceInfo[]): Promise<void> {
460-
if (liveSyncData.syncToPreviewApp) {
461-
await this.initialSyncToPreviewApp(projectData, liveSyncData);
462-
} else {
467+
if (!liveSyncData.syncToPreviewApp) {
463468
await this.initialCableSync(projectData, liveSyncData, deviceDescriptors);
464469
}
465470
}
466471

467-
private async initialSyncToPreviewApp(projectData: IProjectData, liveSyncData: ILiveSyncInfo) {
468-
await this.addActionToChain(projectData.projectDir, async () => {
469-
await this.$previewAppLiveSyncService.initialSync({
470-
appFilesUpdaterOptions: {
471-
bundle: liveSyncData.bundle,
472-
release: liveSyncData.release
473-
},
474-
env: liveSyncData.env,
475-
projectDir: projectData.projectDir
476-
});
477-
});
478-
}
479-
480472
private async initialCableSync(projectData: IProjectData, liveSyncData: ILiveSyncInfo, deviceDescriptors: ILiveSyncDeviceInfo[]): Promise<void> {
481473
const preparedPlatforms: string[] = [];
482474
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 () => {
@@ -45,11 +45,13 @@ export class PreviewAppLiveSyncService implements IPreviewAppLiveSyncService {
4545
appFilesUpdaterOptions: data.appFilesUpdaterOptions,
4646
},
4747
filesToSyncMap,
48-
  startSyncFilesTimeout: startSyncFilesTimeout.bind(this)
48+
startSyncFilesTimeout: startSyncFilesTimeout.bind(this)
4949
}
50-
            });
50+
            });
5151
await this.$previewAppPluginsService.comparePluginsOnDevice(device);
52-
await this.syncFilesForPlatformSafe(data, device.platform);
52+
const payloads = await this.syncFilesForPlatformSafe(data, device.platform);
53+
54+
return payloads;
5355
});
5456
}
5557

@@ -71,33 +73,41 @@ export class PreviewAppLiveSyncService implements IPreviewAppLiveSyncService {
7173
}
7274

7375
public async stopLiveSync(): Promise<void> {
74-
this.$previewSdkService.removeAllListeners();
7576
this.$previewSdkService.stop();
7677
}
7778

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

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

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

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

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

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

@@ -127,7 +137,7 @@ export class PreviewAppLiveSyncService implements IPreviewAppLiveSyncService {
127137
};
128138

129139
if (filePayload.binary) {
130-
const bitmap = <string>this.$fs.readFile(file);
140+
const bitmap = <string>this.$fs.readFile(file);
131141
const base64 = Buffer.from(bitmap).toString('base64');
132142
filePayload.fileContents = base64;
133143
} else {
@@ -137,7 +147,7 @@ export class PreviewAppLiveSyncService implements IPreviewAppLiveSyncService {
137147
return filePayload;
138148
});
139149

140-
return payloads;
150+
return { files: payloads, platform: platformData.normalizedPlatformName.toLowerCase() };
141151
}
142152

143153
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)