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 {Store} from '../reducers/index.js';
import type Logger from '../fb-stubs/Logger.js'; import type Logger from '../fb-stubs/Logger.js';
import {promisify} from 'util';
import child_process from 'child_process'; import child_process from 'child_process';
const exec = promisify(child_process.exec);
const execFile = promisify(child_process.execFile);
import IOSDevice from '../devices/IOSDevice'; import IOSDevice from '../devices/IOSDevice';
type iOSSimulatorDevice = {| type iOSSimulatorDevice = {|
@@ -22,33 +25,57 @@ type iOSSimulatorDevice = {|
type IOSDeviceMap = {[id: string]: Array<iOSSimulatorDevice>}; type IOSDeviceMap = {[id: string]: Array<iOSSimulatorDevice>};
// start port forwarding server for real device connections // 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', 'PortForwardingMacApp.app/Contents/MacOS/PortForwardingMacApp -portForward=8088 -multiplexChannelPort=8078',
); );
window.addEventListener('beforeunload', () => { window.addEventListener('beforeunload', () => {
portForwarder.kill(); portForwarder.kill();
}); });
function querySimulatorDevices(): Promise<IOSDeviceMap> { function querySimulatorDevices(store: Store): Promise<IOSDeviceMap> {
return new Promise((resolve, reject) => { const {connections} = store.getState();
child_process.execFile(
'xcrun',
['simctl', 'list', 'devices', '--json'],
{encoding: 'utf8'},
(err, stdout) => {
if (err) {
reject(err);
}
try { return execFile('xcrun', ['simctl', 'list', 'devices', '--json'], {
const {devices} = JSON.parse(stdout.toString()); encoding: 'utf8',
resolve(devices); })
} catch (err) { .then(({stdout}) => JSON.parse(stdout).devices)
reject(err); .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) => { export default (store: Store, logger: Logger) => {
@@ -56,53 +83,14 @@ export default (store: Store, logger: Logger) => {
if (process.platform !== 'darwin') { if (process.platform !== 'darwin') {
return; return;
} }
const simulatorUpdateInterval = setInterval(() => { querySimulatorDevices(store)
const {connections} = store.getState(); .then(() => {
querySimulatorDevices() const simulatorUpdateInterval = setInterval(() => {
.then((simulatorDevices: IOSDeviceMap) => { querySimulatorDevices(store).catch(err => {
const simulators: Array<iOSSimulatorDevice> = Object.values( console.error(err);
simulatorDevices, clearInterval(simulatorUpdateInterval);
// $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
}
}); });
}, 3000);
if (deviceIDsToRemove.size > 0) { })
store.dispatch({ .catch(console.error);
type: 'UNREGISTER_DEVICES',
payload: deviceIDsToRemove,
});
}
})
.catch(err => {
console.error(err);
clearInterval(simulatorUpdateInterval);
});
}, 3000);
}; };