Added support for Streamdeck Pedal and updated UI to better fit the Packed UI style

This commit is contained in:
2026-02-27 22:47:08 +01:00
committed by erik
parent 5a70f775f1
commit 93faae5cc8
1463 changed files with 306917 additions and 0 deletions

375
node_modules/@elgato-stream-deck/node/CHANGELOG.md generated vendored Normal file
View File

@@ -0,0 +1,375 @@
# Change Log
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [7.3.2](https://github.com/julusian/node-elgato-stream-deck/compare/v7.3.1...v7.3.2) (2025-07-14)
**Note:** Version bump only for package @elgato-stream-deck/node
## [7.3.1](https://github.com/julusian/node-elgato-stream-deck/compare/v7.3.0...v7.3.1) (2025-05-30)
**Note:** Version bump only for package @elgato-stream-deck/node
# [7.3.0](https://github.com/julusian/node-elgato-stream-deck/compare/v7.2.0...v7.3.0) (2025-05-30)
### Features
* prepared buffers ([#102](https://github.com/julusian/node-elgato-stream-deck/issues/102)) ([026cbf3](https://github.com/julusian/node-elgato-stream-deck/commit/026cbf37f643096002a5a8385f26e59d5a390d24))
# [7.2.0](https://github.com/julusian/node-elgato-stream-deck/compare/v7.1.2...v7.2.0) (2025-05-24)
### Features
* add 6 module, 15 module and 32 module ([ca874d8](https://github.com/julusian/node-elgato-stream-deck/commit/ca874d8f857a944871f4aecb97699b8b1cf945f0))
## [7.1.2](https://github.com/julusian/node-elgato-stream-deck/compare/v7.1.1...v7.1.2) (2024-12-09)
**Note:** Version bump only for package @elgato-stream-deck/node
## [7.1.1](https://github.com/julusian/node-elgato-stream-deck/compare/v7.1.0...v7.1.1) (2024-11-14)
**Note:** Version bump only for package @elgato-stream-deck/node
# [7.1.0](https://github.com/julusian/node-elgato-stream-deck/compare/v7.0.2...v7.1.0) (2024-11-14)
### Bug Fixes
* udev rules [#106](https://github.com/julusian/node-elgato-stream-deck/issues/106) ([ba41a75](https://github.com/julusian/node-elgato-stream-deck/commit/ba41a759cd9b86e6de1574230a0209229392ebef))
### Features
* additional studio firmware versions (usb) ([4e2e5df](https://github.com/julusian/node-elgato-stream-deck/commit/4e2e5df1811427d78f4515b3e313a39e4625bbb7))
## [7.0.2](https://github.com/julusian/node-elgato-stream-deck/compare/v7.0.1...v7.0.2) (2024-09-16)
**Note:** Version bump only for package @elgato-stream-deck/node
## [7.0.1](https://github.com/julusian/node-elgato-stream-deck/compare/v7.0.0...v7.0.1) (2024-09-10)
**Note:** Version bump only for package @elgato-stream-deck/node
# [7.0.0](https://github.com/julusian/node-elgato-stream-deck/compare/v7.0.0-0...v7.0.0) (2024-09-08)
### Features
* streamdeck studio support ([#100](https://github.com/julusian/node-elgato-stream-deck/issues/100)) ([baf506d](https://github.com/julusian/node-elgato-stream-deck/commit/baf506da9f4a1e38bc8f7f393743491c21c59835))
# [7.0.0-0](https://github.com/julusian/node-elgato-stream-deck/compare/v6.2.2...v7.0.0-0) (2024-08-26)
### Features
* target nodejs 18 ([5fe6c09](https://github.com/julusian/node-elgato-stream-deck/commit/5fe6c092ba46e09a1814ff627ec2991359dadd6c))
* rework how device functionality is exposed
* rework events structure
## [6.2.2](https://github.com/julusian/node-elgato-stream-deck/compare/v6.2.1...v6.2.2) (2024-07-11)
### Bug Fixes
* build error ([e23aa8b](https://github.com/julusian/node-elgato-stream-deck/commit/e23aa8b61a570b08dcaf53461bbf9ad857371d8c))
## [6.2.1](https://github.com/julusian/node-elgato-stream-deck/compare/v6.2.0...v6.2.1) (2024-07-11)
**Note:** Version bump only for package @elgato-stream-deck/node
# [6.2.0](https://github.com/julusian/node-elgato-stream-deck/compare/v6.0.0...v6.2.0) (2024-04-30)
### Bug Fixes
* rework udev rules [#88](https://github.com/julusian/node-elgato-stream-deck/issues/88) ([d6054a7](https://github.com/julusian/node-elgato-stream-deck/commit/d6054a79781239dc8c845d2f866335621297d9c2))
* update examples to run and better support plus and neo ([219e37c](https://github.com/julusian/node-elgato-stream-deck/commit/219e37cdf77963cc59c4de810fdb555e30194408))
### Features
* neo lcd drawing ([7d13bc0](https://github.com/julusian/node-elgato-stream-deck/commit/7d13bc03306fccad119b4f203c9106bc93d5515b))
* **node:** expose path of opened device [#65](https://github.com/julusian/node-elgato-stream-deck/issues/65) ([45ebbe5](https://github.com/julusian/node-elgato-stream-deck/commit/45ebbe5a9e721f3a89d027d977193f7aa322f6ce))
* support for streamdeck neo ([65197a7](https://github.com/julusian/node-elgato-stream-deck/commit/65197a7735d86ebd1883f96a5f7719b2bd1c95fb))
# [6.1.0](https://github.com/julusian/node-elgato-stream-deck/compare/v6.0.0...v6.1.0) (2024-04-21)
### Bug Fixes
* rework udev rules [#88](https://github.com/julusian/node-elgato-stream-deck/issues/88) ([d6054a7](https://github.com/julusian/node-elgato-stream-deck/commit/d6054a79781239dc8c845d2f866335621297d9c2))
### Features
* **node:** expose path of opened device [#65](https://github.com/julusian/node-elgato-stream-deck/issues/65) ([45ebbe5](https://github.com/julusian/node-elgato-stream-deck/commit/45ebbe5a9e721f3a89d027d977193f7aa322f6ce))
# [6.0.0](https://github.com/julusian/node-elgato-stream-deck/compare/v5.7.3...v6.0.0) (2023-11-29)
### Features
* use async node-hid ([#75](https://github.com/julusian/node-elgato-stream-deck/issues/75)) ([9938244](https://github.com/julusian/node-elgato-stream-deck/commit/9938244f1c61618ce821fe574127c5ae81211c72))
## [5.7.3](https://github.com/julusian/node-elgato-stream-deck/compare/v5.7.2...v5.7.3) (2023-06-20)
**Note:** Version bump only for package @elgato-stream-deck/node
## [5.7.2](https://github.com/julusian/node-elgato-stream-deck/compare/v5.7.1...v5.7.2) (2023-01-17)
### Bug Fixes
* **node:** avoid duplicates in `listStreamDecks` [#32](https://github.com/julusian/node-elgato-stream-deck/issues/32) ([660eb39](https://github.com/julusian/node-elgato-stream-deck/commit/660eb39b3ed19febd2c95074a43034ca1b9e9dd3))
# [5.7.0](https://github.com/julusian/node-elgato-stream-deck/compare/v5.6.0-alpha.0...v5.7.0) (2022-11-15)
### Features
* streamdeck plus ([#59](https://github.com/julusian/node-elgato-stream-deck/issues/59)) ([37479d8](https://github.com/julusian/node-elgato-stream-deck/commit/37479d8a14bffe6eb421164bbaad1161dc302502))
### Reverts
* Revert "chore: switch to yarn3" ([45f6137](https://github.com/julusian/node-elgato-stream-deck/commit/45f613755a274c350b7819d30856cf7aa27f27e3))
# [5.6.0](https://github.com/julusian/node-elgato-stream-deck/compare/v5.6.0-alpha.0...v5.6.0) (2022-09-30)
**Note:** Version bump only for package @elgato-stream-deck/node
# [5.6.0-alpha.0](https://github.com/julusian/node-elgato-stream-deck/compare/v5.5.0...v5.6.0-alpha.0) (2022-09-25)
**Note:** Version bump only for package @elgato-stream-deck/node
# [5.5.0](https://github.com/julusian/node-elgato-stream-deck/compare/v5.5.0-alpha.1...v5.5.0) (2022-07-25)
**Note:** Version bump only for package @elgato-stream-deck/node
# [5.5.0-alpha.1](https://github.com/julusian/node-elgato-stream-deck/compare/v5.5.0-alpha.0...v5.5.0-alpha.1) (2022-07-25)
**Note:** Version bump only for package @elgato-stream-deck/node
# [5.5.0-alpha.0](https://github.com/julusian/node-elgato-stream-deck/compare/v5.4.0...v5.5.0-alpha.0) (2022-07-08)
### Bug Fixes
* support @julusian/jpeg-turbo 2.x ([9a0a718](https://github.com/julusian/node-elgato-stream-deck/commit/9a0a718bab6cd77b8803b5e3e42396183b83d892))
# [5.4.0](https://github.com/julusian/node-elgato-stream-deck/compare/v5.4.0-alpha.0...v5.4.0) (2022-05-10)
### Bug Fixes
* add missing tslib dependency ([6b53699](https://github.com/julusian/node-elgato-stream-deck/commit/6b536994bea3686b4b03fccadafeb2a532e63f4d))
* UDEV rules example markdown. Missing * after hidraw ([#43](https://github.com/julusian/node-elgato-stream-deck/issues/43)) ([6f94093](https://github.com/julusian/node-elgato-stream-deck/commit/6f94093444951104b37064d1bf7a815ffef0aa60))
# [5.4.0-alpha.0](https://github.com/julusian/node-elgato-stream-deck/compare/v5.3.1...v5.4.0-alpha.0) (2022-04-12)
### Features
* support for the pedal (untested) ([ccc4389](https://github.com/julusian/node-elgato-stream-deck/commit/ccc4389844c67194060f32e741c41407713c4cf7))
## [5.3.1](https://github.com/julusian/node-elgato-stream-deck/compare/v5.3.0...v5.3.1) (2022-02-21)
### Bug Fixes
* ensure build before publish ([786ad79](https://github.com/julusian/node-elgato-stream-deck/commit/786ad798b5d6472cd35f3c895c901073edeea378))
# [5.3.0](https://github.com/julusian/node-elgato-stream-deck/compare/v5.2.0...v5.3.0) (2022-02-21)
### Features
* allow the original 15 key to be used in webhid ([7ff5624](https://github.com/julusian/node-elgato-stream-deck/commit/7ff562446b77d17b119f27570937513f02338f28))
* use hidraw backend on linux, as modern (2 year old) kernels support it for all models now ([596e426](https://github.com/julusian/node-elgato-stream-deck/commit/596e426da1d67c268056bd5b37730d13bbc569f1))
# [5.2.0](https://github.com/julusian/node-elgato-stream-deck/compare/v5.2.0-alpha.1...v5.2.0) (2022-01-25)
**Note:** Version bump only for package @elgato-stream-deck/node
# [5.2.0-alpha.1](https://github.com/julusian/node-elgato-stream-deck/compare/v5.2.0-alpha.0...v5.2.0-alpha.1) (2022-01-19)
**Note:** Version bump only for package @elgato-stream-deck/node
# [5.2.0-alpha.0](https://github.com/julusian/node-elgato-stream-deck/compare/v5.1.2...v5.2.0-alpha.0) (2022-01-18)
### Features
* add method to get info about a hid device, if it is a streamdeck ([1791e37](https://github.com/julusian/node-elgato-stream-deck/commit/1791e370e830c0fff7e3169e30cb0871675fdf86))
## [5.1.2](https://github.com/julusian/node-elgato-stream-deck/compare/v5.1.1...v5.1.2) (2021-12-02)
**Note:** Version bump only for package @elgato-stream-deck/node
## [5.1.1](https://github.com/julusian/node-elgato-stream-deck/compare/v5.1.0...v5.1.1) (2021-07-19)
### Bug Fixes
* mk2 is different to v2 ([71feace](https://github.com/julusian/node-elgato-stream-deck/commit/71feace86e0c097ea2b375b4981c252628f7eb4b))
# [5.1.0](https://github.com/julusian/node-elgato-stream-deck/compare/v5.0.0...v5.1.0) (2021-07-19)
### Features
* support streamdeck mk2 (15 key, new style) ([a239503](https://github.com/julusian/node-elgato-stream-deck/commit/a239503b2edf7d4a6dae780ffa5e7dfe481d8cd8))
# [5.0.0](https://github.com/julusian/node-elgato-stream-deck/compare/v4.0.0...v5.0.0) (2021-03-07)
This is a major overhaul of [elgato-stream-deck](https://npmjs.com/package/elgato-stream-deck) to allow for support for webhid to be added cleanly.
The major changes are listed below, and should be reviewed when updating.
The most notable changes are the api now returns promises for every operation, and various methods have been renamed to be more consistent
### Features
* convert most methods to return promises, as webhid uses them even though node-hid doesnt. ([7b1883b](https://github.com/julusian/node-elgato-stream-deck/commit/7b1883be9ff91293aeef95cd1c0f087d795a4fb1))
* lerna ([c942fb9](https://github.com/julusian/node-elgato-stream-deck/commit/c942fb970727944eb3b614b98fd996f2531b0c53))
* publish demo to github pages ([44428a2](https://github.com/julusian/node-elgato-stream-deck/commit/44428a23619538de9de5a50975e30a6957efc44b))
* refactor into a separate node package ([0e68e20](https://github.com/julusian/node-elgato-stream-deck/commit/0e68e206acf99024fa3673a3c8c26a52b08f83b1))
* remove exit-hook due to it potentially 'claiming' error handling ([a4aca6b](https://github.com/julusian/node-elgato-stream-deck/commit/a4aca6bb14d0cdbf3e0ac4d01b016b5e85e32890))
* use eventemitter3 instead of node eventemitter ([31e6bc3](https://github.com/julusian/node-elgato-stream-deck/commit/31e6bc300c963d45c103fa0de9788c458637c684))
* rename api methods to be clearer ([e8777bb](https://github.com/julusian/node-elgato-stream-deck/commit/e8777bbb3ac5b549d91f9062dd8b3e1a4b28021b))

21
node_modules/@elgato-stream-deck/node/LICENSE generated vendored Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2021 Julian Waller
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

136
node_modules/@elgato-stream-deck/node/README.md generated vendored Normal file
View File

@@ -0,0 +1,136 @@
# @elgato-stream-deck/node
![Node CI](https://github.com/Julusian/node-elgato-stream-deck/workflows/Node%20CI/badge.svg)
[![codecov](https://codecov.io/gh/Julusian/node-elgato-stream-deck/branch/master/graph/badge.svg?token=Hl4QXGZJMF)](https://codecov.io/gh/Julusian/node-elgato-stream-deck)
[![npm version](https://img.shields.io/npm/v/@elgato-stream-deck/node.svg)](https://npm.im/@elgato-stream-deck/node)
[![license](https://img.shields.io/npm/l/@elgato-stream-deck/node.svg)](https://npm.im/@elgato-stream-deck/node)
[`@elgato-stream-deck/node`](https://github.com/julusian/node-elgato-stream-deck) is a shared library for interfacing
with the various models of the [Elgato Stream Deck](https://www.elgato.com/en/gaming/stream-deck).
## Intended use
This library has nothing to do with the streamdeck software produced by Elgato. There is nothing here to install and run. This is a library to help developers make alternatives to that software
## Install
`$ npm install --save @elgato-stream-deck/node`
`$ npm install --save @julusian/jpeg-turbo@^2.0.0` (Optional)
It is recommended to install `@julusian/jpeg-turbo` to greatly improve performance for writing images to the StreamDeck XL or the Original-v2. Without doing so `jpeg-js` will be used instead, but image transfers will be noticably more cpu intensive and slower. `jpeg-turbo` has prebuilt binaries, but is not installed by default to ensure installation is easy for users who do not need the performance for the XL or the Original-v2.
### Native dependencies
All of this library's native dependencies ship with prebuilt binaries, so having a full compiler toolchain should not be necessary to install `@elgato-stream-deck/node`.
However, in the event that installation _does_ fail (**or if you are on a platform that our dependencies don't provide prebuilt binaries for, such as a Raspberry Pi**), you will need to install a compiler toolchain to enable npm to build some of `@elgato-stream-deck/node`'s dependencies from source. Expand the details block below for full instructions on how to do so.
<details>
<summary>Compiling dependencies from source</summary>
* Windows
* Install [`windows-build-tools`](https://github.com/felixrieseberg/windows-build-tools):
```bash
npm install --global windows-build-tools
```
* MacOS
* Install the Xcode Command Line Tools:
```bash
xcode-select --install
```
* Linux (**including Raspberry Pi**)
* Follow the instructions for Linux in the ["Compiling from source"](https://github.com/node-hid/node-hid#compiling-from-source) steps for
* Try installing `@elgato-stream-deck/node`
* If you still have issues, ensure everything is updated and try again:
```bash
sudo apt-get update && sudo apt-get upgrade
```
</details>
## Linux
On linux, the udev subsystem blocks access to the StreamDeck without some special configuration.
Copy one of the following files into `/etc/udev/rules.d/` and reload the rules with `sudo udevadm control --reload-rules`
- Use the [headless server](./udev/50-elgato-stream-deck-headless.rules) version when your software will be running as a system service, and is not related to a logged in user
- Use the [desktop user](./udev/50-elgato-stream-deck-user.rules) version when your software is run by a user session on a distribution using systemd
Unplug and replug the device and it should be usable
## Features
- Multiplatform support: Windows 7-10, MacOS, Linux, and even Raspberry Pi!
- Support for every StreamDeck model (Original, Mini & XL)
- Key `down` and key `up` events
- Fill keys with images or solid RGB colors
- Fill the entire panel with a single image, spread across all keys
- Set the Stream Deck brightness
- TypeScript support
## API
The root methods exposed by the library are as follows. For more information it is recommended to rely on the typescript typings for hints or to browse through the source to see what methods are available
```typescript
/**
* Scan for and list detected devices
*/
export function listStreamDecks(): Promise<StreamDeckDeviceInfo[]>
/**
* Get the info of a device if the given path is a streamdeck
*/
export function getStreamDeckInfo(path: string): Promise<StreamDeckDeviceInfo | undefined>
/**
* Open a streamdeck
* @param devicePath The path of the device to open.
* @param userOptions Options to customise the device behvaiour
*/
export function openStreamDeck(devicePath: string, userOptions?: OpenStreamDeckOptionsNode): Promise<StreamDeck>
```
The `StreamDeck` type can be found [here](/packages/core/src/types.ts#L48).
## Example
```typescript
import { openStreamDeck, listStreamDecks } from '@elgato-stream-deck/node'
// List the connected streamdecks
const devices = await listStreamDecks()
if (devices.length === 0) throw new Error('No streamdecks connected!')
// You must provide the devicePath yourself as the first argument to the constructor.
// For example: const myStreamDeck = new StreamDeck('\\\\?\\hid#vid_05f3&pid_0405&mi_00#7&56cf813&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}')
// On linux the equivalent would be: const myStreamDeck = new StreamDeck('0001:0021:00')
const myStreamDeck = await openStreamDeck(devices[0].path)
myStreamDeck.on('down', (keyIndex) => {
console.log('key %d down', keyIndex)
})
myStreamDeck.on('up', (keyIndex) => {
console.log('key %d up', keyIndex)
})
// Fired whenever an error is detected by the `node-hid` library.
// Always add a listener for this event! If you don't, errors will be silently dropped.
myStreamDeck.on('error', (error) => {
console.error(error)
})
// Fill the first button form the left in the first row with a solid red color. This is asynchronous.
await myStreamDeck.fillKeyColor(4, 255, 0, 0)
console.log('Successfully wrote a red square to key 4.')
```
Some more complex demos can be found in the [examples](/packages/node/examples/) folder.
## Contributing
The elgato-stream-deck team enthusiastically welcomes contributions and project participation! There's a bunch of things you can do if you want to contribute! Please don't hesitate to jump in if you'd like to, or even ask us questions if something isn't clear.
Please refer to the [Changelog](CHANGELOG.md) for project history details, too.

View File

@@ -0,0 +1,30 @@
import type { DeviceModelId, HIDDevice, HIDDeviceEvents, HIDDeviceInfo } from '@elgato-stream-deck/core';
import type { ChildHIDDeviceInfo } from '@elgato-stream-deck/core/dist/hid-device';
import { EventEmitter } from 'eventemitter3';
import type { HIDAsync } from 'node-hid';
/**
* Information about a found streamdeck
*/
export interface StreamDeckDeviceInfo {
/** The model of the device */
model: DeviceModelId;
/** The connected path of the device in the usb tree */
path: string;
/** The serialNumber of the device. If set it can be used as a unique hardware identifier */
serialNumber?: string;
}
/**
* The wrapped node-hid HIDDevice.
* This translates it into the common format expected by @elgato-stream-deck/core
*/
export declare class NodeHIDDevice extends EventEmitter<HIDDeviceEvents> implements HIDDevice {
private device;
constructor(device: HIDAsync);
close(): Promise<void>;
sendFeatureReport(data: Uint8Array): Promise<void>;
getFeatureReport(reportId: number, reportLength: number): Promise<Uint8Array>;
sendReports(buffers: Uint8Array[]): Promise<void>;
getDeviceInfo(): Promise<HIDDeviceInfo>;
getChildDeviceInfo(): Promise<ChildHIDDeviceInfo | null>;
}
//# sourceMappingURL=hid-device.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"hid-device.d.ts","sourceRoot":"","sources":["../src/hid-device.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAA;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAA+B,MAAM,UAAU,CAAA;AAErE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,8BAA8B;IAC9B,KAAK,EAAE,aAAa,CAAA;IACpB,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAA;IACZ,4FAA4F;IAC5F,YAAY,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;GAGG;AACH,qBAAa,aAAc,SAAQ,YAAY,CAAC,eAAe,CAAE,YAAW,SAAS;IACpF,OAAO,CAAC,MAAM,CAAU;gBAEZ,MAAM,EAAE,QAAQ;IAef,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAGlD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAG7E,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjD,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC;IAUvC,kBAAkB,IAAI,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;CAIrE"}

View File

@@ -0,0 +1,53 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.NodeHIDDevice = void 0;
const eventemitter3_1 = require("eventemitter3");
/**
* The wrapped node-hid HIDDevice.
* This translates it into the common format expected by @elgato-stream-deck/core
*/
class NodeHIDDevice extends eventemitter3_1.EventEmitter {
device;
constructor(device) {
super();
this.device = device;
this.device.on('error', (error) => this.emit('error', error));
this.device.on('data', (data) => {
// Button press
if (data[0] === 0x01) {
const keyData = data.subarray(1);
this.emit('input', keyData);
}
});
}
async close() {
await this.device.close();
}
async sendFeatureReport(data) {
await this.device.sendFeatureReport(Buffer.from(data)); // Future: avoid re-wrap
}
async getFeatureReport(reportId, reportLength) {
return this.device.getFeatureReport(reportId, reportLength);
}
async sendReports(buffers) {
const ps = [];
for (const data of buffers) {
ps.push(this.device.write(Buffer.from(data))); // Future: avoid re-wrap
}
await Promise.all(ps);
}
async getDeviceInfo() {
const info = await this.device.getDeviceInfo();
return {
path: info.path,
productId: info.productId,
vendorId: info.vendorId,
};
}
async getChildDeviceInfo() {
// Not supported
return null;
}
}
exports.NodeHIDDevice = NodeHIDDevice;
//# sourceMappingURL=hid-device.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"hid-device.js","sourceRoot":"","sources":["../src/hid-device.ts"],"names":[],"mappings":";;;AAEA,iDAA4C;AAe5C;;;GAGG;AACH,MAAa,aAAc,SAAQ,4BAA6B;IACvD,MAAM,CAAU;IAExB,YAAY,MAAgB;QAC3B,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;QAE7D,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACvC,eAAe;YACf,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBACtB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;gBAChC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAC5B,CAAC;QACF,CAAC,CAAC,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,KAAK;QACjB,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;IAC1B,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAAC,IAAgB;QAC9C,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA,CAAC,wBAAwB;IAChF,CAAC;IACM,KAAK,CAAC,gBAAgB,CAAC,QAAgB,EAAE,YAAoB;QACnE,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;IAC5D,CAAC;IACM,KAAK,CAAC,WAAW,CAAC,OAAqB;QAC7C,MAAM,EAAE,GAAmB,EAAE,CAAA;QAC7B,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC5B,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA,CAAC,wBAAwB;QACvE,CAAC;QACD,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACtB,CAAC;IAEM,KAAK,CAAC,aAAa;QACzB,MAAM,IAAI,GAAsB,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAA;QAEjE,OAAO;YACN,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACvB,CAAA;IACF,CAAC;IAEM,KAAK,CAAC,kBAAkB;QAC9B,gBAAgB;QAChB,OAAO,IAAI,CAAA;IACZ,CAAC;CACD;AAlDD,sCAkDC"}

29
node_modules/@elgato-stream-deck/node/dist/index.d.ts generated vendored Normal file
View File

@@ -0,0 +1,29 @@
import type { OpenStreamDeckOptions, StreamDeck } from '@elgato-stream-deck/core';
import * as HID from 'node-hid';
import { StreamDeckDeviceInfo } from './hid-device.js';
import { JPEGEncodeOptions } from '@elgato-stream-deck/node-lib';
export { VENDOR_ID, CORSAIR_VENDOR_ID, DeviceModelId, KeyIndex, StreamDeck, StreamDeckProxy, LcdPosition, Dimension, StreamDeckControlDefinitionBase, StreamDeckButtonControlDefinition, StreamDeckButtonControlDefinitionNoFeedback, StreamDeckButtonControlDefinitionRgbFeedback, StreamDeckButtonControlDefinitionLcdFeedback, StreamDeckEncoderControlDefinition, StreamDeckLcdSegmentControlDefinition, StreamDeckControlDefinition, StreamDeckTcpChildDeviceInfo, OpenStreamDeckOptions, PreparedBuffer, getStreamDeckModelName, } from '@elgato-stream-deck/core';
export { StreamDeckDeviceInfo, JPEGEncodeOptions };
export interface OpenStreamDeckOptionsNode extends OpenStreamDeckOptions {
jpegOptions?: JPEGEncodeOptions;
resetToLogoOnClose?: boolean;
}
/**
* Scan for and list detected devices
*/
export declare function listStreamDecks(): Promise<StreamDeckDeviceInfo[]>;
/**
* If the provided device is a streamdeck, get the info about it
*/
export declare function getStreamDeckDeviceInfo(dev: HID.Device): StreamDeckDeviceInfo | null;
/**
* Get the info of a device if the given path is a streamdeck
*/
export declare function getStreamDeckInfo(path: string): Promise<StreamDeckDeviceInfo | undefined>;
/**
* Open a streamdeck
* @param devicePath The path of the device to open.
* @param userOptions Options to customise the device behvaiour
*/
export declare function openStreamDeck(devicePath: string, userOptions?: OpenStreamDeckOptionsNode): Promise<StreamDeck>;
//# sourceMappingURL=index.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAEjF,OAAO,KAAK,GAAG,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAiB,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAErE,OAAO,EAAc,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAE5E,OAAO,EACN,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,QAAQ,EACR,UAAU,EACV,eAAe,EACf,WAAW,EACX,SAAS,EACT,+BAA+B,EAC/B,iCAAiC,EACjC,2CAA2C,EAC3C,4CAA4C,EAC5C,4CAA4C,EAC5C,kCAAkC,EAClC,qCAAqC,EACrC,2BAA2B,EAC3B,4BAA4B,EAC5B,qBAAqB,EACrB,cAAc,EACd,sBAAsB,GACtB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,CAAA;AAElD,MAAM,WAAW,yBAA0B,SAAQ,qBAAqB;IACvE,WAAW,CAAC,EAAE,iBAAiB,CAAA;IAC/B,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC5B;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC,CASvE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAYpF;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAG/F;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,yBAAyB,GAAG,OAAO,CAAC,UAAU,CAAC,CAgCrH"}

89
node_modules/@elgato-stream-deck/node/dist/index.js generated vendored Normal file
View File

@@ -0,0 +1,89 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getStreamDeckModelName = exports.StreamDeckProxy = exports.DeviceModelId = exports.CORSAIR_VENDOR_ID = exports.VENDOR_ID = void 0;
exports.listStreamDecks = listStreamDecks;
exports.getStreamDeckDeviceInfo = getStreamDeckDeviceInfo;
exports.getStreamDeckInfo = getStreamDeckInfo;
exports.openStreamDeck = openStreamDeck;
const core_1 = require("@elgato-stream-deck/core");
const HID = require("node-hid");
const hid_device_js_1 = require("./hid-device.js");
const wrapper_js_1 = require("./wrapper.js");
const node_lib_1 = require("@elgato-stream-deck/node-lib");
var core_2 = require("@elgato-stream-deck/core");
Object.defineProperty(exports, "VENDOR_ID", { enumerable: true, get: function () { return core_2.VENDOR_ID; } });
Object.defineProperty(exports, "CORSAIR_VENDOR_ID", { enumerable: true, get: function () { return core_2.CORSAIR_VENDOR_ID; } });
Object.defineProperty(exports, "DeviceModelId", { enumerable: true, get: function () { return core_2.DeviceModelId; } });
Object.defineProperty(exports, "StreamDeckProxy", { enumerable: true, get: function () { return core_2.StreamDeckProxy; } });
Object.defineProperty(exports, "getStreamDeckModelName", { enumerable: true, get: function () { return core_2.getStreamDeckModelName; } });
/**
* Scan for and list detected devices
*/
async function listStreamDecks() {
const devices = {};
for (const dev of await HID.devicesAsync()) {
if (dev.path && !devices[dev.path]) {
const info = getStreamDeckDeviceInfo(dev);
if (info)
devices[dev.path] = info;
}
}
return Object.values(devices);
}
/**
* If the provided device is a streamdeck, get the info about it
*/
function getStreamDeckDeviceInfo(dev) {
const model = core_1.DEVICE_MODELS.find((m) => m.productIds.includes(dev.productId) && m.vendorId === dev.vendorId);
if (!model || !dev.path)
return null;
if (model.hidUsage !== undefined && dev.usage !== model.hidUsage)
return null;
if (model.hidInterface !== undefined && dev.interface !== model.hidInterface)
return null;
return {
model: model.id,
path: dev.path,
serialNumber: dev.serialNumber,
};
}
/**
* Get the info of a device if the given path is a streamdeck
*/
async function getStreamDeckInfo(path) {
const allDevices = await listStreamDecks();
return allDevices.find((dev) => dev.path === path);
}
/**
* Open a streamdeck
* @param devicePath The path of the device to open.
* @param userOptions Options to customise the device behvaiour
*/
async function openStreamDeck(devicePath, userOptions) {
// Clone the options, to ensure they dont get changed
const jpegOptions = userOptions?.jpegOptions
? { ...userOptions.jpegOptions }
: undefined;
const options = {
encodeJPEG: async (buffer, width, height) => (0, node_lib_1.encodeJPEG)(buffer, width, height, jpegOptions),
...userOptions,
};
let device;
try {
const hidDevice = await HID.HIDAsync.open(devicePath);
device = new hid_device_js_1.NodeHIDDevice(hidDevice);
const deviceInfo = await device.getDeviceInfo();
const model = core_1.DEVICE_MODELS.find((m) => deviceInfo.vendorId === m.vendorId && m.productIds.includes(deviceInfo.productId));
if (!model) {
throw new Error('Stream Deck is of unexpected type.');
}
const rawSteamdeck = await Promise.resolve(model.factory(device, options));
return new wrapper_js_1.StreamDeckNode(rawSteamdeck, userOptions?.resetToLogoOnClose ?? false);
}
catch (e) {
if (device)
await device.close().catch(() => null); // Suppress error
throw e;
}
}
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1 @@
{"root":["../src/hid-device.ts","../src/index.ts","../src/wrapper.ts"],"version":"5.9.3"}

View File

@@ -0,0 +1,8 @@
import type { StreamDeck } from '@elgato-stream-deck/core';
import { StreamDeckProxy } from '@elgato-stream-deck/core';
export declare class StreamDeckNode extends StreamDeckProxy {
private readonly resetToLogoOnClose;
constructor(device: StreamDeck, resetToLogoOnClose: boolean);
close(): Promise<void>;
}
//# sourceMappingURL=wrapper.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"wrapper.d.ts","sourceRoot":"","sources":["../src/wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE1D,qBAAa,cAAe,SAAQ,eAAe;IAGjD,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBADnC,MAAM,EAAE,UAAU,EACD,kBAAkB,EAAE,OAAO;IAKhC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAMnC"}

19
node_modules/@elgato-stream-deck/node/dist/wrapper.js generated vendored Normal file
View File

@@ -0,0 +1,19 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.StreamDeckNode = void 0;
const core_1 = require("@elgato-stream-deck/core");
class StreamDeckNode extends core_1.StreamDeckProxy {
resetToLogoOnClose;
constructor(device, resetToLogoOnClose) {
super(device);
this.resetToLogoOnClose = resetToLogoOnClose;
}
async close() {
if (this.resetToLogoOnClose) {
await this.resetToLogo();
}
await super.close();
}
}
exports.StreamDeckNode = StreamDeckNode;
//# sourceMappingURL=wrapper.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"wrapper.js","sourceRoot":"","sources":["../src/wrapper.ts"],"names":[],"mappings":";;;AACA,mDAA0D;AAE1D,MAAa,cAAe,SAAQ,sBAAe;IAGhC;IAFlB,YACC,MAAkB,EACD,kBAA2B;QAE5C,KAAK,CAAC,MAAM,CAAC,CAAA;QAFI,uBAAkB,GAAlB,kBAAkB,CAAS;IAG7C,CAAC;IAEM,KAAK,CAAC,KAAK;QACjB,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA;QACzB,CAAC;QACD,MAAM,KAAK,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;CACD;AAdD,wCAcC"}

63
node_modules/@elgato-stream-deck/node/package.json generated vendored Normal file
View File

@@ -0,0 +1,63 @@
{
"name": "@elgato-stream-deck/node",
"version": "7.5.2",
"description": "An npm module for interfacing with the Elgato Stream Deck in node",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"license": "MIT",
"homepage": "https://github.com/julusian/node-elgato-stream-deck#readme",
"repository": {
"type": "git",
"url": "https://github.com/Julusian/node-elgato-stream-deck",
"directory": "packages/node"
},
"bugs": {
"url": "https://github.com/julusian/node-elgato-stream-deck/issues"
},
"author": {
"name": "Julian Waller",
"email": "git@julusian.co.uk"
},
"contributors": [
{
"name": "Håkon Nessjøen",
"email": "haakon@bitfocus.io"
},
{
"name": "Richard Fox",
"twitter": "ProbablePrime"
},
{
"name": "Chris Hanel",
"twitter": "chrishanel",
"email": "chrishanel@gmail.com",
"url": "http://www.chrishanel.com/"
}
],
"keywords": [
"elgato",
"stream",
"deck",
"streamdeck",
"hid",
"usb",
"hardware",
"interface",
"controller"
],
"files": [
"dist",
"udev",
"udev-generator-rules.json"
],
"engines": {
"node": ">=18.18"
},
"dependencies": {
"@elgato-stream-deck/core": "7.5.2",
"@elgato-stream-deck/node-lib": "7.5.2",
"eventemitter3": "^5.0.4",
"node-hid": "^3.2.0",
"tslib": "^2.8.1"
}
}

View File

@@ -0,0 +1,29 @@
[
{
"vendorId": 4057,
"productIds": [
96,
99,
144,
179,
108,
143,
109,
128,
165,
132,
134,
154,
170,
184,
185,
186
]
},
{
"vendorId": 6940,
"productIds": [
11032
]
}
]

View File

@@ -0,0 +1,19 @@
SUBSYSTEM=="input", GROUP="input", MODE="0660"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="0060", MODE:="660", GROUP="plugdev"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="0063", MODE:="660", GROUP="plugdev"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="006c", MODE:="660", GROUP="plugdev"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="006d", MODE:="660", GROUP="plugdev"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="0080", MODE:="660", GROUP="plugdev"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="0084", MODE:="660", GROUP="plugdev"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="0086", MODE:="660", GROUP="plugdev"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="008f", MODE:="660", GROUP="plugdev"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="0090", MODE:="660", GROUP="plugdev"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="009a", MODE:="660", GROUP="plugdev"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="00a5", MODE:="660", GROUP="plugdev"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="00aa", MODE:="660", GROUP="plugdev"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="00b3", MODE:="660", GROUP="plugdev"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="00b8", MODE:="660", GROUP="plugdev"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="00b9", MODE:="660", GROUP="plugdev"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="00ba", MODE:="660", GROUP="plugdev"
KERNEL=="hidraw*", ATTRS{idVendor}=="1b1c", ATTRS{idProduct}=="2b18", MODE:="660", GROUP="plugdev"

View File

@@ -0,0 +1,19 @@
SUBSYSTEM=="input", GROUP="input", MODE="0660"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="0060", MODE:="660", TAG+="uaccess"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="0063", MODE:="660", TAG+="uaccess"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="006c", MODE:="660", TAG+="uaccess"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="006d", MODE:="660", TAG+="uaccess"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="0080", MODE:="660", TAG+="uaccess"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="0084", MODE:="660", TAG+="uaccess"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="0086", MODE:="660", TAG+="uaccess"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="008f", MODE:="660", TAG+="uaccess"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="0090", MODE:="660", TAG+="uaccess"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="009a", MODE:="660", TAG+="uaccess"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="00a5", MODE:="660", TAG+="uaccess"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="00aa", MODE:="660", TAG+="uaccess"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="00b3", MODE:="660", TAG+="uaccess"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="00b8", MODE:="660", TAG+="uaccess"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="00b9", MODE:="660", TAG+="uaccess"
KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="00ba", MODE:="660", TAG+="uaccess"
KERNEL=="hidraw*", ATTRS{idVendor}=="1b1c", ATTRS{idProduct}=="2b18", MODE:="660", TAG+="uaccess"