UNPKG

xkeys-webhid

Version:

An npm module for interfacing with the X-keys panels in a browser

78 lines 3.03 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.GlobalConnectListener = void 0; /** * This class is used to register listener for connect and disconnect events for HID devices. * It allows for a few clever tricks, such as * * listenForDisconnectOnce() listens for a disconnect event for a specific device, and then removes the listener. * * handles a special case where the 'connect' event isn't fired when adding permissions for a HID device. */ class GlobalConnectListener { /** Add listener for any connect event */ static listenForAnyConnect(callback) { this.setup(); this.anyConnectListeners.add(callback); return { stop: () => this.anyConnectListeners.delete(callback), }; } /** Add listener for any disconnect event */ static listenForAnyDisconnect(callback) { this.setup(); this.anyDisconnectListeners.add(callback); return { stop: () => this.anyDisconnectListeners.delete(callback), }; } /** Add listener for disconnect event, for a HIDDevice. The callback will be fired once. */ static listenForDisconnectOnce(device, callback) { this.setup(); this.disconnectListenersOnce.set(device, callback); } static notifyConnectedDevice() { this.handleConnect(); } static setup() { if (this.isSetup) return; navigator.hid.addEventListener('disconnect', this.handleDisconnect); navigator.hid.addEventListener('connect', this.handleConnect); this.isSetup = true; } static maybeTeardown() { if (this.disconnectListenersOnce.size === 0 && this.anyDisconnectListeners.size === 0 && this.anyConnectListeners.size === 0) { // If there are no listeners, we can teardown the global listener: this.teardown(); } } static teardown() { navigator.hid.removeEventListener('disconnect', this.handleDisconnect); navigator.hid.removeEventListener('connect', this.handleConnect); this.disconnectListenersOnce.clear(); this.isSetup = false; } } exports.GlobalConnectListener = GlobalConnectListener; _a = GlobalConnectListener; GlobalConnectListener.anyConnectListeners = new Set(); GlobalConnectListener.anyDisconnectListeners = new Set(); GlobalConnectListener.disconnectListenersOnce = new Map(); GlobalConnectListener.isSetup = false; GlobalConnectListener.handleDisconnect = (ev) => { _a.anyDisconnectListeners.forEach((callback) => callback()); _a.disconnectListenersOnce.forEach((callback, device) => { if (device === ev.device) { callback(); // Also remove the listener: _a.disconnectListenersOnce.delete(device); } }); _a.maybeTeardown(); }; GlobalConnectListener.handleConnect = () => { _a.anyConnectListeners.forEach((callback) => callback()); }; //# sourceMappingURL=globalConnectListener.js.map