UNPKG

@elgato-stream-deck/webhid

Version:

An npm module for interfacing with the Elgato Stream Deck in the browser

75 lines 2.92 kB
"use strict"; 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