From 6ae38b763e3f6a96d3abe1255f60f33312647902 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 3 Jun 2024 02:00:23 +0000 Subject: [PATCH] Polyfill web serial on Android --- index.html | 2 +- package-lock.json | 26 +++++++++++++++++++++++++- package.json | 4 +++- src/install-button.ts | 18 +++++++++++++++++- 4 files changed, 46 insertions(+), 4 deletions(-) diff --git a/index.html b/index.html index 36f2cb8..08cf113 100644 --- a/index.html +++ b/index.html @@ -297,7 +297,7 @@ Web Serial is available in Google Chrome and Microsoft Edge browsers. Android support should be possible but has not been implemented yet. + >. This includes Android.

Configuring Wi-Fi

diff --git a/package-lock.json b/package-lock.json index a7a3889..9087ec3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,8 @@ "improv-wifi-serial-sdk": "^2.5.0", "lit": "^3.1.2", "pako": "^2.1.0", - "tslib": "^2.6.2" + "tslib": "^2.6.2", + "web-serial-polyfill": "^1.0.15" }, "devDependencies": { "@babel/preset-env": "^7.23.9", @@ -25,6 +26,7 @@ "@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-typescript": "^11.1.6", "@types/w3c-web-serial": "^1.0.6", + "@types/w3c-web-usb": "^1.0.10", "prettier": "^3.2.5", "rollup": "^4.10.0", "serve": "^14.2.1", @@ -3370,6 +3372,12 @@ "integrity": "sha512-5IlDdQ2C56sCVwc7CUlqT9Axxw+0V/FbWRbErklYIzZ5mKL9s4l7epXHygn+4X7L2nmAPnVvRl55XUVo0760Rg==", "dev": true }, + "node_modules/@types/w3c-web-usb": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@types/w3c-web-usb/-/w3c-web-usb-1.0.10.tgz", + "integrity": "sha512-CHgUI5kTc/QLMP8hODUHhge0D4vx+9UiAwIGiT0sTy/B2XpdX1U5rJt6JSISgr6ikRT7vxV9EVAFeYZqUnl1gQ==", + "dev": true + }, "node_modules/@zeit/schemas": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.29.0.tgz", @@ -5300,6 +5308,11 @@ "node": ">= 0.8" } }, + "node_modules/web-serial-polyfill": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/web-serial-polyfill/-/web-serial-polyfill-1.0.15.tgz", + "integrity": "sha512-usZN7kGRkEWr8DzRWxW+og55L1fHo4hNIwxCSCfWKpM+i0L+2AwzupMvkDFxnJNqUFOhLaD3PlgAOJxUOUrAoA==" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -8011,6 +8024,12 @@ "integrity": "sha512-5IlDdQ2C56sCVwc7CUlqT9Axxw+0V/FbWRbErklYIzZ5mKL9s4l7epXHygn+4X7L2nmAPnVvRl55XUVo0760Rg==", "dev": true }, + "@types/w3c-web-usb": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@types/w3c-web-usb/-/w3c-web-usb-1.0.10.tgz", + "integrity": "sha512-CHgUI5kTc/QLMP8hODUHhge0D4vx+9UiAwIGiT0sTy/B2XpdX1U5rJt6JSISgr6ikRT7vxV9EVAFeYZqUnl1gQ==", + "dev": true + }, "@zeit/schemas": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.29.0.tgz", @@ -9418,6 +9437,11 @@ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true }, + "web-serial-polyfill": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/web-serial-polyfill/-/web-serial-polyfill-1.0.15.tgz", + "integrity": "sha512-usZN7kGRkEWr8DzRWxW+og55L1fHo4hNIwxCSCfWKpM+i0L+2AwzupMvkDFxnJNqUFOhLaD3PlgAOJxUOUrAoA==" + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 3b4b9cf..7deb7ad 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-typescript": "^11.1.6", "@types/w3c-web-serial": "^1.0.6", + "@types/w3c-web-usb": "^1.0.10", "prettier": "^3.2.5", "rollup": "^4.10.0", "serve": "^14.2.1", @@ -29,6 +30,7 @@ "improv-wifi-serial-sdk": "^2.5.0", "lit": "^3.1.2", "pako": "^2.1.0", - "tslib": "^2.6.2" + "tslib": "^2.6.2", + "web-serial-polyfill": "^1.0.15" } } diff --git a/src/install-button.ts b/src/install-button.ts index fbe632a..cb99483 100644 --- a/src/install-button.ts +++ b/src/install-button.ts @@ -112,4 +112,20 @@ export class InstallButton extends HTMLElement { } } -customElements.define("esp-web-install-button", InstallButton); +function defineInstallButton() { + customElements.define("esp-tools-install-button", InstallButton); +} + +async function polyfillWebSerial() { + const { serial } = await import("web-serial-polyfill"); + // @ts-ignore-next-line + navigator.serial = serial; + InstallButton.isSupported = true; + defineInstallButton(); +} + +if (!navigator.serial && navigator.usb) { + polyfillWebSerial(); +} else { + defineInstallButton(); +}