tasmota-esp-web-tools
Version:
Web tools for ESP devices
95 lines (94 loc) • 3.08 kB
JavaScript
import { connect as esptoolConnect } from "tasmota-webserial-esptool";
/**
* Detect if running on Android
*/
const isAndroid = () => {
const userAgent = navigator.userAgent || "";
return /Android/i.test(userAgent);
};
/**
* Load WebUSB serial wrapper for Android
*/
const loadWebUSBSerial = async () => {
// Check if already loaded
if (globalThis.requestSerialPort) {
return;
}
// Dynamically load the WebUSB serial script from the npm package
return new Promise((resolve, reject) => {
const script = document.createElement("script");
script.type = "module";
script.src =
"https://unpkg.com/tasmota-webserial-esptool/js/webusb-serial.js";
script.onload = () => {
if (globalThis.requestSerialPort) {
resolve();
}
else {
reject(new Error("WebUSB serial script loaded but requestSerialPort not found"));
}
};
script.onerror = () => reject(new Error("Failed to load WebUSB serial script"));
document.head.appendChild(script);
});
};
export const connect = async (button) => {
import("./install-dialog.js");
// Android: Load WebUSB support first
if (isAndroid() && "usb" in navigator) {
try {
await loadWebUSBSerial();
}
catch (err) {
alert(`Failed to load WebUSB support: ${err.message}`);
return;
}
}
// Use tasmota-webserial-esptool's connect() - handles ALL port logic
let esploader;
try {
esploader = await esptoolConnect({
log: () => { }, // Silent logger for connection
debug: () => { },
// eslint-disable-next-line no-console
error: (msg) => console.error(msg),
});
}
catch (err) {
if (err.name === "NotFoundError") {
import("./no-port-picked/index").then((mod) => mod.openNoPortPickedDialog(() => connect(button)));
return;
}
alert(`Connection failed: ${err.message}`);
return;
}
if (!esploader) {
alert("Failed to connect to device");
return;
}
const el = document.createElement("ewt-install-dialog");
el.esploader = esploader; // Pass ESPLoader instead of port
el.manifestPath = button.manifest || button.getAttribute("manifest");
el.overrides = button.overrides;
el.firmwareFile = button.firmwareFile;
// Get baud rate from attribute or use default
const baudRateAttr = button.getAttribute("baud-rate");
if (baudRateAttr) {
const baudRate = parseInt(baudRateAttr, 10);
if (!isNaN(baudRate)) {
el.baudRate = baudRate;
}
}
else if (button.baudRate !== undefined) {
el.baudRate = button.baudRate;
}
el.addEventListener("closed", async () => {
try {
await esploader.disconnect();
}
catch (_err) {
// Ignore disconnect errors
}
}, { once: true });
document.body.appendChild(el);
};