Web MIDI API: разрешения и приватность устройств
Проектируйте Web MIDI с активацией пользователя, разрешением, изменениями портов, ограниченными сообщениями и надёжным запасным режимом.
BotBrowser Team
Нужна структурированная документация по теме Платформа?
Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.
BotBrowser может проверить разрешённый поток Web MIDI, когда управляемый браузер предоставляет navigator.requestMIDIAccess() и объявленное действие запускает запрос. Он не создаёт физический инструмент, не выбирает порт за пользователя, не выдаёт разрешение вне браузера и не превращает имя порта во владение. Нужен видимый контракт: запрос, результат, проверка сообщений, согласование изменений и рабочий путь без MIDI.
TL;DR
Web MIDI даёт доступ к входным и выходным портам после разрешения браузера. Это не неограниченный инвентарь оборудования и не постоянный идентификатор инструмента. Проверьте navigator.requestMIDIAccess, вызывайте его из явного действия, запрашивайте минимальную возможность и считайте MIDIAccess живым изменяемым представлением. Слушайте statechange, проверяйте MIDIMessageEvent.data и удаляйте обработчики при исчезновении порта.
Спецификация W3C Web MIDI определяет MIDIAccess, порты, изменения состояния, события сообщений и необязательный System Exclusive. MDN отмечает ограниченную поддержку. BotBrowser может записать видимые состояния разрешения и портов, но не доказывает наличие инструмента, владение им или создание звука.
Содержание
- Разрешение является границей возможности
- Запрашивайте доступ действием пользователя
- Считайте порты изменяемой сессией
- Ограничивайте MIDI-сообщения
- Минимизируйте метаданные и храните запасной путь
- Таблица результатов
- Проверка с BotBrowser
- Итог
Разрешение является границей возможности
navigator.requestMIDIAccess() запрашивает возможность, которой управляет браузер, а не открывает все USB-устройства. Нужны защищённый контекст, активация, разрешение и поддержка платформы. Выполненный MIDIAccess означает, что браузер показал поверхность доступа; подключённый или принадлежащий человеку порт из этого не следует.
Запрашивайте минимальный охват. Для обычных нот и контроллеров используйте { sysex: false }. System Exclusive может содержать команды производителя и непрозрачные последовательности; для него нужна отдельная осознанная политика. Не включайте sysex: true только потому, что это допускает библиотека. В Web USB: доступ к устройству и границы приватности описан тот же принцип: разрешение не является инвентарём.
Имена, производитель и версия полезны в видимом выборе, но не доказывают владение и не создают стабильный идентификатор. Сохраняйте только granted, denied, unsupported или no-port, если это нужно задаче. Не объединяйте результат с сетью, экраном и профилем для долгой метки браузера.
Запрашивайте доступ действием пользователя
Проверяйте возможность в момент использования. Кнопка «Подключить MIDI» может быть отключена при отсутствии API. Вызывайте запрос кликом или клавишей, а не при загрузке, таймером или после фоновой сети.
async function connectMidi() {
if (!window.isSecureContext || !navigator.requestMIDIAccess) {
return showMidiState('unsupported');
}
setMidiState('requesting');
try {
const access = await navigator.requestMIDIAccess({ sysex: false });
attachMidiAccess(access);
renderPorts(access);
} catch (error) {
setMidiState(classifyMidiError(error));
showMidiFallback();
}
}
connectButton.addEventListener('click', connectMidi);
Состояние requesting предотвращает двойной выбор и даёт доступный статус. При отказе классифицируйте только известное странице: NotAllowedError, отсутствие поддержки или локальный timeout. Не говорите, что названное устройство отказало. Восстановите кнопку и предложите новый видимый запуск.
Web Bluetooth: разрешения и приватность устройств показывает сопоставимый выбор. Протоколы различны, но нужно разделять наличие API, выданный доступ и пригодное устройство.
Считайте порты изменяемой сессией
MIDIAccess.inputs и MIDIAccess.outputs являются картами портов, показанных в текущий момент. Слушайте statechange при подключении, отключении или перенастройке и заново отображайте всю карту.
function attachMidiAccess(access) {
access.onstatechange = event => {
const port = event.port;
renderPorts(access);
if (port.state === 'disconnected') detachInput(port.id);
if (port.state === 'connected' && port.type === 'input') attachInput(port);
};
for (const input of access.inputs.values()) attachInput(input);
for (const output of access.outputs.values()) renderOutput(output);
}
Проверяйте port.state и port.connection перед использованием и обрабатывайте сбой отправки. При отключении удаляйте listener и связанное состояние. Используйте port.id только как короткий ключ сессии, не как профиль или отпечаток. send() не доказывает, что звук был создан или услышан.
Ограничивайте MIDI-сообщения
MIDIMessageEvent.data содержит недоверенную последовательность байтов. Проверяйте длину, байт состояния, канал и диапазон до изменения состояния приложения. Разрешённый список может быть меньше полного протокола.
const MAX_MIDI_BYTES = 3;
const allowedStatus = new Set([0x80, 0x90, 0xb0, 0xe0]);
function acceptMidiMessage(event) {
const bytes = [...event.data];
if (bytes.length < 2 || bytes.length > MAX_MIDI_BYTES) return;
const status = bytes[0] & 0xf0;
if (!allowedStatus.has(status) || bytes.slice(1).some(byte => byte > 0x7f)) return;
updateMusicState({ status, channel: bytes[0] & 0x0f, data: bytes.slice(1) });
}
Пример не принимает System Exclusive, realtime и системные сообщения. Их включение должно быть отдельным изменением с лимитом размера и документацией. Не журналируйте байты по умолчанию, ограничивайте частые события и сохраняйте короткий отладочный фрагмент только по явному запросу.
Минимизируйте метаданные и храните запасной путь
Виртуальная клавиатура, импорт файла, клавиши или партитура сохраняют задачу без MIDI. Страница должна сказать, что браузер не показал порт, не притворяясь управлением инструментом. Разделяйте музыкальную модель и адаптер: после отключения редактирование продолжается, а новый порт требует явного выбора.
Короткая запись может включать поддержку, разрешение, тип и состояние порта, локальную метку, счётчик принятых сообщений и дату. Полный производитель, карта портов, сырые байты и посторонние свойства браузера не нужны. Имя порта способно раскрыть модель оборудования или студию, поэтому задайте цель и срок хранения.
Таблица результатов
| Результат | Безопасное действие | Не утверждать |
|---|---|---|
| Нет API или защищённого контекста | Оставить клавиатуру или файл | Универсальную поддержку |
| Разрешение отклонено | Объяснить и сохранить задачу | Отказ названного устройства |
| Доступ без портов | Показать настройку и запасной режим | Отсутствие физических инструментов |
| Вход подключён | Установить проверенный listener | Владение человеком |
| Выход подключён | Требовать выбор перед отправкой | Создание или слышимость звука |
statechange отключён | Удалить listener и отметить offline | Автоматическое возвращение |
| Неверные байты | Отбросить и классифицировать | Идентичность отправителя |
| Запрошен SysEx | Попросить отдельное решение | Безопасность данных по умолчанию |
Проверка с BotBrowser
Управляемый контекст BotBrowser может выполнить детерминированную кнопку, синтетический запасной режим, ограниченный валидатор и видимую запись портов. Записывайте наличие API, результат разрешения, счётчики, statechange и видимость запасного режима. unsupported, permission-denied и no-port допустимы, если не заявляется воспроизведение звука. Документация расширенных возможностей BotBrowser не обещает MIDI-устройство на runner.
{
"api": "requestMIDIAccess",
"permission": "unknown",
"ports": { "inputs": 0, "outputs": 0 },
"states": ["fallback"],
"messagesAccepted": 0,
"rawBytesRetained": false,
"physicalInstrument": "not-asserted"
}
Повторяйте fixture, меняя одну переменную: версию браузера, защищённый контекст, результат разрешения, подключение или тип сообщения. Сравнивайте первое видимое различие и не распространяйте его на каждый драйвер и систему.
Итог
Web MIDI является меняющейся возможностью браузера, ограниченной разрешением. Запрашивайте её видимым действием, используйте минимальный охват, показывайте живую карту портов, проверяйте сообщения и освобождайте listeners при отключении. BotBrowser может повторить видимые ветви в разрешённых контекстах; он не создаёт инструмент, не обходит разрешение, не гарантирует порт и не выводит владение из метаданных MIDI.
Открытые источники
Дальше
Сравните Web Bluetooth: разрешения и приватность устройств и Web USB: доступ к устройству и границы приватности.
Эта статья входит в руководство: Поверхности веб-платформы: карта проверки
Похожие статьи
Разрешения Web Serial и жизненный цикл порта
ПлатформаРазрешение WebHID и границы приватности устройства
ПлатформаPresentation API: границы экрана и сессии
ПлатформаWeb Share API: границы разрешений и безопасные запасные варианты
ПлатформаWindow Management API: границы нескольких экранов
ПлатформаDocument Picture-in-Picture: границы разрешений и окон
Переведите BotBrowser из исследований в продакшн
Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.