Signatur
Beschreibung
WorkerNavigator.hid ist das Worker-Gegenstück zu navigator.hid im Fenster. Die Eigenschaft gibt ein HID-Objekt der WebHID-API zurück. Darüber kann ein Worker mit HID-Geräten (Human Interface Devices) wie Gamepads, Barcode-Scannern, Makro-Tastaturen oder speziellen Eingabegeräten kommunizieren, ohne den Haupt-Thread zu belasten.
Im Worker gibt es eine wichtige Einschränkung: HID.requestDevice() steht nicht zur Verfügung, weil dafür ein Auswahldialog und eine Nutzeraktion (transient user activation) nötig sind. Die Berechtigung muss vorher im Fenster über navigator.hid.requestDevice() erteilt werden. Danach findet der Worker die freigegebenen Geräte mit navigator.hid.getDevices(), öffnet sie und verarbeitet Eingabeberichte (inputreport).
Außerdem feuert das HID-Objekt die Ereignisse connect und disconnect, sobald ein freigegebenes Gerät angesteckt oder abgezogen wird. Typische Anwendungsfälle sind rechenintensive Auswertungen von Sensordaten oder Hintergrundverarbeitung in Service Workern von Browser-Erweiterungen.
Rückgabewert
HID-Objekt (erbt von EventTarget) mit der Methode getDevices() und den Ereignissen connect/disconnect. In Browsern ohne WebHID ist die Eigenschaft undefined.Beispiele
Unterstützung im Worker prüfen
// worker.js
if ('hid' in self.navigator) {
console.log('WebHID im Worker verfügbar');
} else {
console.log('WebHID wird in diesem Kontext nicht unterstützt');
}
Freigabe im Fenster, Verarbeitung im Worker
// main.js – Berechtigung per Nutzeraktion einholen
const worker = new Worker('hid-worker.js');
document.querySelector('#verbinden').addEventListener('click', async () => {
const [device] = await navigator.hid.requestDevice({
filters: [{ vendorId: 0x057e }] // Beispiel: Nintendo
});
if (device) worker.postMessage({ type: 'start' });
});
// hid-worker.js – bereits freigegebene Geräte öffnen
self.addEventListener('message', async ({ data }) => {
if (data.type !== 'start') return;
const devices = await navigator.hid.getDevices();
for (const device of devices) {
if (!device.opened) await device.open();
device.addEventListener('inputreport', ({ reportId, data: view }) => {
console.log(`Report ${reportId}: ${view.byteLength} Bytes`);
});
console.log(`Geöffnet: ${device.productName}`);
}
});
Auf Anstecken und Abziehen reagieren
// hid-worker.js
const onConnect = async ({ device }) => {
console.log(`Verbunden: ${device.productName}`);
await device.open();
};
const onDisconnect = ({ device }) => {
console.log(`Getrennt: ${device.productName}`);
};
navigator.hid.addEventListener('connect', onConnect);
navigator.hid.addEventListener('disconnect', onDisconnect);
// Alternativ über die on-Properties:
// navigator.hid.onconnect = onConnect;
// navigator.hid.ondisconnect = onDisconnect;
// Wichtig · Fallstricke
- Kein
requestDevice()im Worker: Die Geräteauswahl muss im Fenster per Nutzeraktion erfolgen. Ohne vorherige Freigabe liefertgetDevices()ein leeres Array. - Experimentell und eingeschränkt verfügbar: WebHID wird nur von Chromium-basierten Desktop-Browsern unterstützt, nicht von Firefox oder Safari. Die Verfügbarkeit in Workern hängt von der Chrome-Version ab (z. B. Service Worker von Erweiterungen ab Chrome 117). Vor der Nutzung immer mit
'hid' in navigatorprüfen. - Nur in sicheren Kontexten (HTTPS oder
localhost). Die Nutzung kann über die Permissions Policyhidgesperrt werden, z. B. in iframes. - Ein Gerät kann gleichzeitig nur von einem Kontext sinnvoll genutzt werden. Deshalb sollte man vor dem Öffnen
device.openedprüfen und Geräte mitdevice.close()schließen, wenn sie nicht mehr gebraucht werden. - Bestimmte Geräteklassen, etwa Tastaturen und Mäuse, sind aus Sicherheitsgründen gesperrt (Blocklist) und lassen sich nicht öffnen.