Open Stream Deck

Обзор SDK

Что такое SDK 1.0, из каких частей он состоит и на каких принципах построен.

SDK Open Stream Deck нужен, чтобы писать плагины для приложения. Плагин пишется на Rust, JavaScript, TypeScript или любом языке, который собирается в WebAssembly, и распространяется одним файлом .opensd.

Текущая версия 1.0.2. SDK 1.x несовместим с SDK 0.2, с плагинами Elgato и StreamDock. Что изменить при переносе, описано в разделе миграция.

Принципы

  • Один файл без исполняемых файлов ОС. .opensd это обычный ZIP: манифест в JSON, код на JavaScript в исходном виде или модуль WebAssembly, ресурсы. Его можно распаковать любым архиватором, а opensd inspect покажет, что внутри и что плагин просит.
  • Одна песочница для всех языков. Плагин работает в изолированном воркере движка WebView приложения. У него нет файлов, процессов, окна приложения и сети, кроме того, что пользователь разрешил явно.
  • Ноль в простое. Хост не опрашивает плагины. Событие приходит, только когда что-то произошло, а таймер плагин включает сам и только когда он нужен.
  • Одинаково на Windows, macOS и Linux. Код плагина не зависит от ОС.

Из чего состоит

ПакетГдеЧто это
@opensd/clinpmCLI opensd готовым бинарником и типы API для JavaScript и TypeScript
@opensd/createnpmСоздание проекта: npm create @opensd my-plugin
opensd-clicrates.ioТот же CLI opensd для установки через cargo install
opensdcrates.ioБиблиотека для плагинов на Rust: события, команды, тестовый стенд
opensd-packagecrates.ioФормат .opensd: чтение, проверка, упаковка. Его используют CLI и приложение, авторам плагинов он напрямую не нужен

CLI opensd один и тот же, откуда его ни ставь. Он создаёт проекты, собирает и проверяет плагины, упаковывает их и запускает в приложении. Как поставить, описано в быстром старте.

Исходный код открыт: Open-Stream-Deck/Open-Stream-Deck-SDK. Лицензия на выбор MIT или Apache 2.0.

Что умеет плагин

  • Реагировать на нажатия, отпускания, короткое и долгое нажатие, удержание с повтором. Жесты считает хост по порогам из манифеста.
  • Менять подпись со стилем, картинку и состояние кнопки, ставить отметку ok или alert.
  • Хранить настройки каждой кнопки и общие настройки плагина. Простые формы настроек описываются полями в манифесте, и приложение рисует их само.
  • Показывать свою страницу настроек кнопки и отдельное окно настроек плагина на HTML.
  • Работать с сетью, локальными программами, буфером обмена и запуском приложений через разрешения, которые подтверждает пользователь.

Минимальный плагин

JavaScript:

opensd.action("com.example.hello.key", {
  tap({ key }) {
    key.setTitle("Hello").flash("ok");
  },
});

Rust:

use opensd::{Event, Host, Plugin, Result};

#[derive(Default)]
struct Hello;

impl Plugin for Hello {
    fn event(&mut self, host: &mut Host, event: Event) -> Result {
        if let Event::Tap(key) = event {
            host.key(&key.context).set_title("Hello")?.flash_ok()?;
        }
        Ok(())
    }
}

opensd::export!(Hello);

Куда дальше