@elgato-stream-deck/webhid
Version:
An npm module for interfacing with the Elgato Stream Deck in the browser
75 lines • 2.92 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.WebHIDDevice = void 0;
const eventemitter3_1 = require("eventemitter3");
const p_queue_1 = require("p-queue");
/**
* The wrapped browser HIDDevice.
* This translates it into the common format expected by @elgato-stream-deck/core
*/
class WebHIDDevice extends eventemitter3_1.EventEmitter {
device;
reportQueue = new p_queue_1.default({ concurrency: 1 });
reportByteLengths = new Map();
constructor(device) {
super();
this.device = device;
// this.device.on('data', data => this.emit('data', data))
// this.device.on('error', error => this.emit('error', error))
this.device.addEventListener('inputreport', (event) => {
// Button press
if (event.reportId === 0x01) {
const data = new Uint8Array(event.data.buffer, event.data.byteOffset, event.data.byteLength);
this.emit('input', data);
}
});
// calculate byte length for all feature reports
const featureReports = this.device.collections.map((c) => c.featureReports ?? []).flat();
for (const report of featureReports) {
if (report.reportId && report.items) {
const bitsLength = report.items.reduce((sum, item) => sum + (item.reportSize ?? 0) * (item.reportCount ?? 0), 0);
this.reportByteLengths.set(report.reportId, Math.ceil(bitsLength / 8.0));
}
}
}
async close() {
return this.device.close();
}
async forget() {
return this.device.forget();
}
async sendFeatureReport(data) {
// Ensure the buffer is as long as required for the feature report
const byteLength = this.reportByteLengths.get(data[0]);
let dataFull = data.subarray(1);
if (byteLength && dataFull.length != byteLength) {
dataFull = new Uint8Array(byteLength);
dataFull.set(data.subarray(1, Math.min(data.length - 1, dataFull.length)));
}
return this.device.sendFeatureReport(data[0], dataFull);
}
async getFeatureReport(reportId, _reportLength) {
const view = await this.device.receiveFeatureReport(reportId);
return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
}
async sendReports(buffers) {
return this.reportQueue.add(async () => {
for (const data of buffers) {
await this.device.sendReport(data[0], data.subarray(1));
}
});
}
async getDeviceInfo() {
return {
path: undefined,
productId: this.device.productId,
vendorId: this.device.vendorId,
};
}
async getChildDeviceInfo() {
// Not supported
return null;
}
}
exports.WebHIDDevice = WebHIDDevice;
//# sourceMappingURL=hid-device.js.map