Skip to content

Commit 8248829

Browse files
author
Fatme
authored
Merge pull request #4150 from NativeScript/fatme/device-lost-after-timeout
fix(preview-api): raise deviceLost event after timeout of 5 seconds
2 parents 123206b + edc3486 commit 8248829

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

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

+16-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { DeviceDiscoveryEventNames, DEVICE_LOG_EVENT_NAME } from "../../../../co
44

55
export class PreviewDevicesService extends EventEmitter implements IPreviewDevicesService {
66
private connectedDevices: Device[] = [];
7+
private deviceLostTimers: IDictionary<NodeJS.Timer> = {};
78

89
constructor(private $previewAppLogProvider: IPreviewAppLogProvider,
910
private $previewAppPluginsService: IPreviewAppPluginsService) {
@@ -23,7 +24,7 @@ export class PreviewDevicesService extends EventEmitter implements IPreviewDevic
2324

2425
_(this.connectedDevices)
2526
.reject(d => _.find(devices, device => d.id === device.id))
26-
.each(device => this.raiseDeviceLost(device));
27+
.each(device => this.raiseDeviceLostAfterTimeout(device));
2728
}
2829

2930
public getDeviceById(id: string): Device {
@@ -45,6 +46,10 @@ export class PreviewDevicesService extends EventEmitter implements IPreviewDevic
4546
}
4647

4748
private raiseDeviceFound(device: Device) {
49+
if (this.deviceLostTimers[device.id]) {
50+
clearTimeout(this.deviceLostTimers[device.id]);
51+
}
52+
4853
this.emit(DeviceDiscoveryEventNames.DEVICE_FOUND, device);
4954
this.connectedDevices.push(device);
5055
}
@@ -53,5 +58,15 @@ export class PreviewDevicesService extends EventEmitter implements IPreviewDevic
5358
this.emit(DeviceDiscoveryEventNames.DEVICE_LOST, device);
5459
_.remove(this.connectedDevices, d => d.id === device.id);
5560
}
61+
62+
private raiseDeviceLostAfterTimeout(device: Device) {
63+
if (!this.deviceLostTimers[device.id]) {
64+
const timeoutId = setTimeout(() => {
65+
this.raiseDeviceLost(device);
66+
clearTimeout(timeoutId);
67+
}, 5 * 1000);
68+
this.deviceLostTimers[device.id] = timeoutId;
69+
}
70+
}
5671
}
5772
$injector.register("previewDevicesService", PreviewDevicesService);

test/services/preview-devices-service.ts

+26-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { Device } from "nativescript-preview-sdk";
44
import { assert } from "chai";
55
import { DeviceDiscoveryEventNames } from "../../lib/common/constants";
66
import { LoggerStub, ErrorsStub } from "../stubs";
7+
import * as sinon from "sinon";
78

89
let foundDevices: Device[] = [];
910
let lostDevices: Device[] = [];
@@ -38,8 +39,9 @@ function resetDevices() {
3839
}
3940

4041
describe("PreviewDevicesService", () => {
41-
describe("onDevicesPresence", () => {
42+
describe("getConnectedDevices", () => {
4243
let previewDevicesService: IPreviewDevicesService = null;
44+
let clock: sinon.SinonFakeTimers = null;
4345
beforeEach(() => {
4446
const injector = createTestInjector();
4547
previewDevicesService = injector.resolve("previewDevicesService");
@@ -49,11 +51,13 @@ describe("PreviewDevicesService", () => {
4951
previewDevicesService.on(DeviceDiscoveryEventNames.DEVICE_LOST, device => {
5052
lostDevices.push(device);
5153
});
54+
clock = sinon.useFakeTimers();
5255
});
5356

5457
afterEach(() => {
5558
previewDevicesService.removeAllListeners();
5659
resetDevices();
60+
clock.restore();
5761
});
5862

5963
it("should add new device", () => {
@@ -101,6 +105,7 @@ describe("PreviewDevicesService", () => {
101105
resetDevices();
102106

103107
previewDevicesService.updateConnectedDevices([]);
108+
clock.tick(5000);
104109

105110
assert.deepEqual(foundDevices, []);
106111
assert.deepEqual(lostDevices, [device1]);
@@ -116,10 +121,30 @@ describe("PreviewDevicesService", () => {
116121
resetDevices();
117122

118123
previewDevicesService.updateConnectedDevices([device2]);
124+
clock.tick(5000);
119125

120126
assert.deepEqual(previewDevicesService.getConnectedDevices(), [device2]);
121127
assert.deepEqual(foundDevices, [device2]);
122128
assert.deepEqual(lostDevices, [device1]);
123129
});
130+
it("shouldn't emit deviceFound or deviceLost when preview app is restarted on device", () => {
131+
const device1 = createDevice("device1");
132+
133+
previewDevicesService.updateConnectedDevices([device1]);
134+
135+
assert.deepEqual(previewDevicesService.getConnectedDevices(), [device1]);
136+
assert.deepEqual(foundDevices, [device1]);
137+
assert.deepEqual(lostDevices, []);
138+
resetDevices();
139+
140+
// preview app is restarted
141+
previewDevicesService.updateConnectedDevices([]);
142+
clock.tick(500);
143+
previewDevicesService.updateConnectedDevices([device1]);
144+
145+
assert.deepEqual(foundDevices, []);
146+
assert.deepEqual(lostDevices, []);
147+
assert.deepEqual(previewDevicesService.getConnectedDevices(), [device1]);
148+
});
124149
});
125150
});

0 commit comments

Comments
 (0)