xkeys-webhid
Version:
An npm module for interfacing with the X-keys panels in a browser
78 lines • 3.03 kB
JavaScript
;
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