Skip to content

Commit e276084

Browse files
committed
feat: add api for deviceFound and deviceLost for preview devices
1 parent a4943ca commit e276084

File tree

5 files changed

+59
-17
lines changed

5 files changed

+59
-17
lines changed

lib/bootstrap.ts

+1
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ $injector.require("usbLiveSyncService", "./services/livesync/livesync-service");
134134
$injector.require("previewAppLiveSyncService", "./services/livesync/playground/preview-app-livesync-service");
135135
$injector.require("previewAppPluginsService", "./services/livesync/playground/preview-app-plugins-service");
136136
$injector.require("previewSdkService", "./services/livesync/playground/preview-sdk-service");
137+
$injector.requirePublicClass("previewDevicesService", "./services/livesync/playground/devices/preview-devices-service");
137138
$injector.require("playgroundQrCodeGenerator", "./services/livesync/playground/qr-code-generator");
138139
$injector.requirePublic("sysInfo", "./sys-info");
139140

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

+9-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ declare global {
1212

1313
interface IPreviewSdkService extends EventEmitter {
1414
getQrCodeUrl(options: IHasUseHotModuleReloadOption): string;
15-
connectedDevices: Device[];
1615
initialize(getInitialFiles: (device: Device) => Promise<FilesPayload>): void;
1716
applyChanges(filesPayload: FilesPayload): Promise<void>;
1817
stop(): void;
@@ -34,4 +33,13 @@ declare global {
3433
*/
3534
link: boolean;
3635
}
36+
37+
interface IPreviewDevicesService extends EventEmitter {
38+
connectedDevices: Device[];
39+
onDeviceConnected(device: Device): void;
40+
onDevicesPresence(devices: Device[]): void;
41+
onDeviceLog(message: string, deviceName: string, deviceId: string): void;
42+
getDeviceById(id: string): Device;
43+
getDevicesForPlatform(platform: string): Device[];
44+
}
3745
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { Device } from "nativescript-preview-sdk";
2+
import { EventEmitter } from "events";
3+
import { DeviceDiscoveryEventNames } from "../../../../common/constants";
4+
5+
export class PreviewDevicesService extends EventEmitter implements IPreviewDevicesService {
6+
public connectedDevices: Device[] = [];
7+
8+
public onDevicesPresence(devices: Device[]): void {
9+
_(devices)
10+
.reject(d => _.find(this.connectedDevices, device => d.id === device.id))
11+
.each(device => this.raiseDeviceFound(device));
12+
13+
_(this.connectedDevices)
14+
.reject(d => _.find(devices, device => d.id === device.id))
15+
.each(device => this.raiseDeviceLost(device));
16+
}
17+
18+
public getDeviceById(id: string): Device {
19+
return _.find(this.connectedDevices, { id });
20+
}
21+
22+
public getDevicesForPlatform(platform: string): Device[] {
23+
return _.filter(this.connectedDevices, { platform: platform.toLowerCase() });
24+
}
25+
26+
private raiseDeviceFound(device: Device) {
27+
this.emit(DeviceDiscoveryEventNames.DEVICE_FOUND, device);
28+
this.connectedDevices.push(device);
29+
}
30+
31+
private raiseDeviceLost(device: Device) {
32+
this.emit(DeviceDiscoveryEventNames.DEVICE_LOST, device);
33+
_.remove(this.connectedDevices, d => d.id === device.id);
34+
}
35+
}
36+
$injector.register("previewDevicesService", PreviewDevicesService);

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

+4-3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export class PreviewAppLiveSyncService implements IPreviewAppLiveSyncService {
2828
private $projectDataService: IProjectDataService,
2929
private $previewSdkService: IPreviewSdkService,
3030
private $previewAppPluginsService: IPreviewAppPluginsService,
31+
private $previewDevicesService: IPreviewDevicesService,
3132
private $projectFilesManager: IProjectFilesManager,
3233
private $hmrStatusService: IHmrStatusService,
3334
private $projectFilesProvider: IProjectFilesProvider) { }
@@ -55,11 +56,11 @@ export class PreviewAppLiveSyncService implements IPreviewAppLiveSyncService {
5556
public async syncFiles(data: IPreviewAppLiveSyncData, filesToSync: string[], filesToRemove: string[]): Promise<void> {
5657
this.showWarningsForNativeFiles(filesToSync);
5758

58-
for (const device of this.$previewSdkService.connectedDevices) {
59+
for (const device of this.$previewDevicesService.connectedDevices) {
5960
await this.$previewAppPluginsService.comparePluginsOnDevice(data, device);
6061
}
6162

62-
const platforms = _(this.$previewSdkService.connectedDevices)
63+
const platforms = _(this.$previewDevicesService.connectedDevices)
6364
.map(device => device.platform)
6465
.uniq()
6566
.value();
@@ -112,7 +113,7 @@ export class PreviewAppLiveSyncService implements IPreviewAppLiveSyncService {
112113
await promise;
113114

114115
if (data.appFilesUpdaterOptions.useHotModuleReload && platformHmrData.hash) {
115-
const devices = _.filter(this.$previewSdkService.connectedDevices, { platform: platform.toLowerCase() });
116+
const devices = this.$previewDevicesService.getDevicesForPlatform(platform);
116117

117118
await Promise.all(_.map(devices, async (previewDevice: Device) => {
118119
const status = await this.$hmrStatusService.getHmrStatus(previewDevice.id, platformHmrData.hash);

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

+9-13
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
import { MessagingService, Config, Device, DeviceConnectedMessage, SdkCallbacks, ConnectedDevices, FilesPayload } from "nativescript-preview-sdk";
22
import { PubnubKeys } from "./preview-app-constants";
3-
import { DEVICE_LOG_EVENT_NAME } from "../../../common/constants";
43
import { EventEmitter } from "events";
4+
import { DEVICE_LOG_EVENT_NAME } from "../../../common/constants";
55
const pako = require("pako");
66

77
export class PreviewSdkService extends EventEmitter implements IPreviewSdkService {
88
private static MAX_FILES_UPLOAD_BYTE_LENGTH = 15 * 1024 * 1024; // In MBs
99
private messagingService: MessagingService = null;
1010
private instanceId: string = null;
11-
public connectedDevices: Device[] = [];
1211

13-
constructor(private $logger: ILogger,
12+
constructor(private $config: IConfiguration,
1413
private $httpClient: Server.IHttpClient,
15-
private $config: IConfiguration) {
14+
private $logger: ILogger,
15+
private $previewDevicesService: IPreviewDevicesService) {
1616
super();
1717
}
1818

@@ -60,9 +60,8 @@ export class PreviewSdkService extends EventEmitter implements IPreviewSdkServic
6060
onLogSdkMessage: (log: string) => {
6161
this.$logger.trace("Received onLogSdkMessage message: ", log);
6262
},
63-
onConnectedDevicesChange: (connectedDevices: ConnectedDevices) => ({ }),
6463
onLogMessage: (log: string, deviceName: string, deviceId: string) => {
65-
const device = _.find(this.connectedDevices, { id: deviceId});
64+
const device = this.$previewDevicesService.getDeviceById(deviceId);
6665
this.emit(DEVICE_LOG_EVENT_NAME, log, deviceId, device ? device.platform : "");
6766
this.$logger.info(`LOG from device ${deviceName}: ${log}`);
6867
},
@@ -72,13 +71,10 @@ export class PreviewSdkService extends EventEmitter implements IPreviewSdkServic
7271
onUncaughtErrorMessage: () => {
7372
this.$logger.warn("The Preview app has terminated unexpectedly. Please run it again to get a detailed crash report.");
7473
},
75-
onDeviceConnectedMessage: (deviceConnectedMessage: DeviceConnectedMessage) => ({ }),
76-
onDeviceConnected: (device: Device) => {
77-
if (!_.find(this.connectedDevices, {id: device.id})) {
78-
this.connectedDevices.push(device);
79-
}
80-
},
81-
onDevicesPresence: (devices: Device[]) => ({ }),
74+
onConnectedDevicesChange: (connectedDevices: ConnectedDevices) => ({}),
75+
onDeviceConnectedMessage: (deviceConnectedMessage: DeviceConnectedMessage) => ({}),
76+
onDeviceConnected: (device: Device) => ({}),
77+
onDevicesPresence: (devices: Device[]) => this.$previewDevicesService.onDevicesPresence(devices),
8278
onSendingChange: (sending: boolean) => ({ }),
8379
onBiggerFilesUpload: async (filesContent, callback) => {
8480
const gzippedContent = Buffer.from(pako.gzip(filesContent));

0 commit comments

Comments
 (0)