UNPKG

tasmota-esp-web-tools

Version:
95 lines (94 loc) 3.08 kB
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); };