Skip to content
This repository was archived by the owner on Jan 8, 2026. It is now read-only.

Commit a0b606b

Browse files
committed
Move navigator.usb.requestDevice shimming after feature detection.
1 parent 2b64657 commit a0b606b

1 file changed

Lines changed: 34 additions & 34 deletions

File tree

src/worker.ts

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -112,40 +112,6 @@ const boot = async (initialState: InitialState) => {
112112
interruptFuture = future;
113113
};
114114

115-
Object.defineProperty(navigator.usb, 'requestDevice', {
116-
get: () => async (...args: Parameters<USB['requestDevice']>) => {
117-
const cloner = (value: unknown) => {
118-
if (value instanceof pyodide.ffi.PyProxy) {
119-
return value.toJs({
120-
create_pyproxies: false,
121-
dict_converter: Object.fromEntries,
122-
});
123-
}
124-
};
125-
126-
const newArgs: Parameters<USB['requestDevice']> = cloneDeepWith(args, cloner);
127-
await rpc.send('requestUSBDevice', newArgs);
128-
129-
// USBDevice is not transferrable ;_;
130-
131-
let devices = await navigator.usb.getDevices();
132-
const [options] = newArgs;
133-
if (options?.filters?.length) {
134-
const { filters } = options;
135-
devices = devices.filter((device) => filters.some((filter) => {
136-
return Object.keys(filter).every((_key) => {
137-
let key = _key as (keyof USBDeviceFilter & keyof USBDevice);
138-
return filter[key] === undefined || device[key] === filter[key];
139-
});
140-
}));
141-
}
142-
if (!devices[0]) {
143-
throw new Error('Requested USB device not found (most likely programmer error)');
144-
}
145-
return devices[0];
146-
},
147-
});
148-
149115
const terminal = new TerminalHandle({
150116
size: initialState.termSize,
151117
ptyAttrs: initialState.termPtyAttrs,
@@ -187,6 +153,40 @@ const boot = async (initialState: InitialState) => {
187153
return printError('WebUSB is required but not available.');
188154
}
189155

156+
Object.defineProperty(navigator.usb, 'requestDevice', {
157+
get: () => async (...args: Parameters<USB['requestDevice']>) => {
158+
const cloner = (value: unknown) => {
159+
if (value instanceof pyodide.ffi.PyProxy) {
160+
return value.toJs({
161+
create_pyproxies: false,
162+
dict_converter: Object.fromEntries,
163+
});
164+
}
165+
};
166+
167+
const newArgs: Parameters<USB['requestDevice']> = cloneDeepWith(args, cloner);
168+
await rpc.send('requestUSBDevice', newArgs);
169+
170+
// USBDevice is not transferrable ;_;
171+
172+
let devices = await navigator.usb.getDevices();
173+
const [options] = newArgs;
174+
if (options?.filters?.length) {
175+
const { filters } = options;
176+
devices = devices.filter((device) => filters.some((filter) => {
177+
return Object.keys(filter).every((_key) => {
178+
let key = _key as (keyof USBDeviceFilter & keyof USBDevice);
179+
return filter[key] === undefined || device[key] === filter[key];
180+
});
181+
}));
182+
}
183+
if (!devices[0]) {
184+
throw new Error('Requested USB device not found (most likely programmer error)');
185+
}
186+
return devices[0];
187+
},
188+
});
189+
190190
printProgress('Loading toolchain...');
191191
await loadToolchain({
192192
loadProgress({ command, totalLength, doneLength }) {

0 commit comments

Comments
 (0)