Start · Sprachen · JavaScript · Referenz · WorkerNavigator.hid

WorkerNavigator.hid

Eigenschaft

Schreibgeschützte Eigenschaft, die im Worker-Kontext ein <code>HID</code>-Objekt für den Zugriff auf bereits freigegebene HID-Geräte und deren Verbindungsereignisse liefert.

seit JavaScript Experimentell: nur Chromium-basierte Browser (Chro Kategorie: webapi

Signatur

get WorkerNavigator.hid

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

Typ
HID
Beschreibung
Ein 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');
}
WebHID im Worker verfügbar

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}`);
  }
});
Geöffnet: Joy-Con (L) Report 63: 11 Bytes

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;
Verbunden: USB Barcode Scanner Getrennt: USB Barcode Scanner

// Wichtig · Fallstricke

  • Kein requestDevice() im Worker: Die Geräteauswahl muss im Fenster per Nutzeraktion erfolgen. Ohne vorherige Freigabe liefert getDevices() 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 navigator prüfen.
  • Nur in sicheren Kontexten (HTTPS oder localhost). Die Nutzung kann über die Permissions Policy hid gesperrt werden, z. B. in iframes.
  • Ein Gerät kann gleichzeitig nur von einem Kontext sinnvoll genutzt werden. Deshalb sollte man vor dem Öffnen device.opened prüfen und Geräte mit device.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.