faster iOS device connection

Summary:
First connection attempt to iOS device was only made after 3000ms. This caused all iOS devices only show up after this delay.
Now, the devices are queried immediately.

Reviewed By: passy

Differential Revision: D9613057

fbshipit-source-id: a14e3f02576ec5e159f4002bf68efe53236dcc50
This commit is contained in:
Daniel Büchele
2018-08-31 10:02:47 -07:00
committed by Facebook Github Bot
parent ace800ad55
commit a30e0b53e9

View File

@@ -9,7 +9,10 @@ import type {ChildProcess} from 'child_process';
import type {Store} from '../reducers/index.js';
import type Logger from '../fb-stubs/Logger.js';
import {promisify} from 'util';
import child_process from 'child_process';
const exec = promisify(child_process.exec);
const execFile = promisify(child_process.execFile);
import IOSDevice from '../devices/IOSDevice';
type iOSSimulatorDevice = {|
@@ -22,33 +25,57 @@ type iOSSimulatorDevice = {|
type IOSDeviceMap = {[id: string]: Array<iOSSimulatorDevice>};
// start port forwarding server for real device connections
const portForwarder: ChildProcess = child_process.exec(
const portForwarder: ChildProcess = exec(
'PortForwardingMacApp.app/Contents/MacOS/PortForwardingMacApp -portForward=8088 -multiplexChannelPort=8078',
);
window.addEventListener('beforeunload', () => {
portForwarder.kill();
});
function querySimulatorDevices(): Promise<IOSDeviceMap> {
return new Promise((resolve, reject) => {
child_process.execFile(
'xcrun',
['simctl', 'list', 'devices', '--json'],
{encoding: 'utf8'},
(err, stdout) => {
if (err) {
reject(err);
}
function querySimulatorDevices(store: Store): Promise<IOSDeviceMap> {
const {connections} = store.getState();
try {
const {devices} = JSON.parse(stdout.toString());
resolve(devices);
} catch (err) {
reject(err);
return execFile('xcrun', ['simctl', 'list', 'devices', '--json'], {
encoding: 'utf8',
})
.then(({stdout}) => JSON.parse(stdout).devices)
.then((simulatorDevices: IOSDeviceMap) => {
const simulators: Array<iOSSimulatorDevice> = Object.values(
simulatorDevices,
// $FlowFixMe
).reduce((acc, cv) => acc.concat(cv), []);
const currentDeviceIDs: Set<string> = new Set(
connections.devices
.filter(device => device instanceof IOSDevice)
.map(device => device.serial),
);
const deviceIDsToRemove = new Set();
simulators.forEach((simulator: iOSSimulatorDevice) => {
const isRunning =
simulator.state === 'Booted' &&
simulator.availability === '(available)';
if (isRunning && !currentDeviceIDs.has(simulator.udid)) {
// create device
store.dispatch({
type: 'REGISTER_DEVICE',
payload: new IOSDevice(simulator.udid, 'emulator', simulator.name),
});
} else if (!isRunning && currentDeviceIDs.has(simulator.udid)) {
deviceIDsToRemove.add(simulator.udid);
// delete device
}
},
);
});
});
if (deviceIDsToRemove.size > 0) {
store.dispatch({
type: 'UNREGISTER_DEVICES',
payload: deviceIDsToRemove,
});
}
});
}
export default (store: Store, logger: Logger) => {
@@ -56,53 +83,14 @@ export default (store: Store, logger: Logger) => {
if (process.platform !== 'darwin') {
return;
}
const simulatorUpdateInterval = setInterval(() => {
const {connections} = store.getState();
querySimulatorDevices()
.then((simulatorDevices: IOSDeviceMap) => {
const simulators: Array<iOSSimulatorDevice> = Object.values(
simulatorDevices,
// $FlowFixMe
).reduce((acc, cv) => acc.concat(cv), []);
const currentDeviceIDs: Set<string> = new Set(
connections.devices
.filter(device => device instanceof IOSDevice)
.map(device => device.serial),
);
const deviceIDsToRemove = new Set();
simulators.forEach((simulator: iOSSimulatorDevice) => {
const isRunning =
simulator.state === 'Booted' &&
simulator.availability === '(available)';
if (isRunning && !currentDeviceIDs.has(simulator.udid)) {
// create device
store.dispatch({
type: 'REGISTER_DEVICE',
payload: new IOSDevice(
simulator.udid,
'emulator',
simulator.name,
),
});
} else if (!isRunning && currentDeviceIDs.has(simulator.udid)) {
deviceIDsToRemove.add(simulator.udid);
// delete device
}
querySimulatorDevices(store)
.then(() => {
const simulatorUpdateInterval = setInterval(() => {
querySimulatorDevices(store).catch(err => {
console.error(err);
clearInterval(simulatorUpdateInterval);
});
if (deviceIDsToRemove.size > 0) {
store.dispatch({
type: 'UNREGISTER_DEVICES',
payload: deviceIDsToRemove,
});
}
})
.catch(err => {
console.error(err);
clearInterval(simulatorUpdateInterval);
});
}, 3000);
}, 3000);
})
.catch(console.error);
};