-
-
Notifications
You must be signed in to change notification settings - Fork 197
/
Copy pathpreview-devices-service.ts
73 lines (59 loc) · 2.35 KB
/
preview-devices-service.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import { Device } from "nativescript-preview-sdk";
import { EventEmitter } from "events";
import { DeviceDiscoveryEventNames, DEVICE_LOG_EVENT_NAME } from "../../../../common/constants";
export class PreviewDevicesService extends EventEmitter implements IPreviewDevicesService {
private connectedDevices: Device[] = [];
private deviceLostTimers: IDictionary<NodeJS.Timer> = {};
constructor(private $previewAppLogProvider: IPreviewAppLogProvider,
private $previewAppPluginsService: IPreviewAppPluginsService) {
super();
this.initialize();
}
public getConnectedDevices(): Device[] {
return this.connectedDevices;
}
public updateConnectedDevices(devices: Device[]): void {
_(devices)
.reject(d => _.some(this.connectedDevices, device => d.id === device.id))
.each(device => this.raiseDeviceFound(device));
_(this.connectedDevices)
.reject(d => _.some(devices, device => d.id === device.id))
.each(device => this.raiseDeviceLostAfterTimeout(device));
}
public getDeviceById(id: string): Device {
return _.find(this.connectedDevices, { id });
}
public getDevicesForPlatform(platform: string): Device[] {
return _.filter(this.connectedDevices, { platform: platform.toLowerCase() });
}
public getPluginsUsageWarnings(data: IPreviewAppLiveSyncData, device: Device): Promise<string[]> {
return this.$previewAppPluginsService.getPluginsUsageWarnings(data, device);
}
private initialize(): void {
this.$previewAppLogProvider.on(DEVICE_LOG_EVENT_NAME, (deviceId: string, message: string) => {
this.emit(DEVICE_LOG_EVENT_NAME, deviceId, message);
});
}
private raiseDeviceFound(device: Device) {
if (this.deviceLostTimers[device.id]) {
clearTimeout(this.deviceLostTimers[device.id]);
this.deviceLostTimers[device.id] = null;
}
this.emit(DeviceDiscoveryEventNames.DEVICE_FOUND, device);
this.connectedDevices.push(device);
}
private raiseDeviceLost(device: Device) {
this.emit(DeviceDiscoveryEventNames.DEVICE_LOST, device);
_.remove(this.connectedDevices, d => d.id === device.id);
}
private raiseDeviceLostAfterTimeout(device: Device) {
if (!this.deviceLostTimers[device.id]) {
const timeoutId = setTimeout(() => {
this.raiseDeviceLost(device);
clearTimeout(timeoutId);
}, 5 * 1000);
this.deviceLostTimers[device.id] = timeoutId;
}
}
}
$injector.register("previewDevicesService", PreviewDevicesService);