expo-key-event
Version:
Provides an interface for reading key events such as from external bluetooth keyboards on Android, iOS and Web.
67 lines (58 loc) • 2.24 kB
JavaScript
const express = require('express');
const { exec } = require('child_process');
const app = express();
const port = 3000;
app.get('/send-key-event', (req, res) => {
const { keyCode, platform } = req.query;
if (!keyCode) {
return res.status(400).send('keyCode query parameter is required');
}
if (!platform) {
return res.status(400).send('platform query parameter is required (ios or android)');
}
if (platform.toLowerCase() === 'android') {
const command = `adb shell input keyevent ${keyCode}`;
exec(command, (error, stdout, stderr) => {
if (error) {
console.error(`exec error: ${error}`);
return res.status(500).send(`Error executing ${platform} command: ${error.message}`);
}
if (stderr) {
console.error(`stderr: ${stderr}`);
}
res.send(`Sent key event ${keyCode} to ${platform}. stdout: ${stdout}`);
});
} else if (platform.toLowerCase() === 'ios') {
// First get the UDID of the booted simulator
exec('idb list-targets | grep "Booted"', (error, stdout, stderr) => {
if (error) {
console.error(`exec error: ${error}`);
return res.status(500).send(`Error finding booted simulator: ${error.message}`);
}
// Parse UDID from output (format: "Name | UDID | Booted | ...")
const match = stdout.match(/\|\s*([A-F0-9-]+)\s*\|/);
if (!match) {
return res.status(500).send('Could not find UDID of booted simulator');
}
const udid = match[1];
console.log(`Found booted simulator UDID: ${udid}`);
// Now send the key event
const command = `idb ui key ${keyCode} --udid ${udid}`;
exec(command, (error, stdout, stderr) => {
if (error) {
console.error(`exec error: ${error}`);
return res.status(500).send(`Error executing idb command: ${error.message}`);
}
if (stderr) {
console.error(`stderr: ${stderr}`);
}
res.send(`Sent key event ${keyCode} to ${platform}. stdout: ${stdout}`);
});
});
} else {
return res.status(400).send('platform must be either "ios" or "android"');
}
});
app.listen(port, () => {
console.log(`Server listening at http://localhost:${port}`);
});