Skip to content

Commit 47aff3c

Browse files
committed
Improve WebSerial detection
1 parent fc5d19f commit 47aff3c

4 files changed

Lines changed: 16 additions & 8 deletions

File tree

src/lib/constants/WebApiSupport.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { browser } from "$app/environment";
2+
3+
export const isSerialSupported = browser && Object.hasOwn(navigator, 'serial') && typeof navigator.serial.getPorts === 'function' && typeof navigator.serial.requestPort === 'function' && typeof navigator.serial.addEventListener === 'function';

src/lib/stores/FlashManagersStore.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { isSerialSupported } from '$lib/constants/WebApiSupport';
12
import FlashManager from '$lib/EspTool/FlashManager';
23
import type { IEspLoaderTerminal } from 'esptool-js';
34
import { get, writable } from 'svelte/store';
@@ -56,7 +57,7 @@ export const FlashManagerStore = {
5657
};
5758

5859
export function initializeFlashManagersStore() {
59-
if ('serial' in navigator) {
60-
navigator.serial.addEventListener('disconnect', (e) => removePort(e.target as SerialPort));
61-
}
60+
if (isSerialSupported) return;
61+
62+
navigator.serial.addEventListener('disconnect', (e) => removePort(e.target as SerialPort));
6263
}

src/lib/stores/SerialPortsStore.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { isSerialSupported } from '$lib/constants/WebApiSupport';
12
import { writable } from 'svelte/store';
23

34
const { update, subscribe } = writable<SerialPort[]>([]);
@@ -11,15 +12,19 @@ function removePort(port: SerialPort) {
1112

1213
export const SerialPortsStore = {
1314
requestPort: async (options: SerialPortRequestOptions) => {
15+
if (!isSerialSupported) return null;
16+
1417
const port = await navigator.serial.requestPort(options);
18+
1519
addPort(port);
20+
1621
return port;
1722
},
1823
subscribe,
1924
};
2025

2126
export function initializeSerialPortsStore() {
22-
if (!('serial' in navigator)) return;
27+
if (!isSerialSupported) return;
2328

2429
navigator.serial.addEventListener('connect', (e) => addPort(e.target as SerialPort));
2530
navigator.serial.addEventListener('disconnect', (e) => removePort(e.target as SerialPort));

src/routes/flashtool/+page.svelte

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,14 @@
1515
import { Label } from '$lib/components/ui/label';
1616
import { Progress } from '$lib/components/ui/progress';
1717
import { Sheet, SheetContent, SheetHeader, SheetTitle } from '$lib/components/ui/sheet';
18+
import { isSerialSupported } from '$lib/constants/WebApiSupport';
1819
import { FlashManagerStore } from '$lib/stores/FlashManagersStore';
1920
import Bowser from 'bowser';
2021
import FirmwareBoardSelector from './FirmwareBoardSelector.svelte';
2122
import FirmwareFlasher from './FirmwareFlasher.svelte';
2223
import HelpDialog from './HelpDialog.svelte';
2324
import SerialPortSelector from './SerialPortSelector.svelte';
2425
25-
const isSupported = browser && 'serial' in navigator;
26-
2726
let port = $state<SerialPort | null>(null);
2827
let manager = $state<FlashManager | null>(null);
2928
let connectFailed = $state<boolean>(false);
@@ -191,7 +190,7 @@
191190
<Container>
192191
<Card.Header class="w-full flex flex-row justify-between">
193192
<Card.Title class="text-3xl">Flash Tool</Card.Title>
194-
{#if isSupported}
193+
{#if isSerialSupported}
195194
<div>
196195
<Button variant="outline" onclick={() => (terminalOpen = !terminalOpen)}>
197196
<SquareTerminal />
@@ -205,7 +204,7 @@
205204
{/if}
206205
</Card.Header>
207206
<Card.Content class="w-full flex flex-col gap-4">
208-
{#if isSupported}
207+
{#if isSerialSupported}
209208
{@render mainContent()}
210209
{:else if browser}
211210
{@render unsupportedBrowser()}

0 commit comments

Comments
 (0)