Оказалось, что очень просто поменять наш древний движок Duktape на другой движок такого же класса (маленький и встраиваемый) - QuickJS.
Это сразу открывает все новые модные фичи JS, которые там появились за последние 15 лет, в т.ч. async/await. Потом мы туда ещё и typescript прикрутили, чтобы два раза не вставать.
Главное
✅ вместо (или вместе) с defineRule можно пользоваться стандартными async/await идиомами:
defineRule('follow', {
whenChanged: 'ui/follow',
then: async () => {
const val = await changed('relay/channel1');
log(`канал переключился в ${val}`);
},
});✅ можно писать линейный код вместо адских колбеков:
for (;;)
dev["buzzer/enabled"] = true;
await sleep(10);
dev["buzzer/enabled"] = false;
await sleep(1000);
}
причём это работает даже на верхнем уровне, так что если вы не любите колбеки и асинхронность, то можете писать супер-циклы, как в старых добрых ПЛК.
✅ новые модные возможности языка: стрелочные функции, классы, форматирование строк и так далее. Поддерживается почти весь ES2026 и TypeScript 7.
Заодно есть
✅ красивые ошибки и раскраска в редакторе;
✅ полноценная проверка типов в том числе для
dev["dev/ctrl"] - т.е. для каждого канала оно знает и проверяет тип;✅ проверка типов работает в "старом" JS - как ворнинги;
✅ читаемые ошибки в логах и консоли;
✅ всякие вкусности, типа детектирования бесконечных циклов, зависания правил и прочее.
Попробовать:
echo "deb https://deb.wirenboard.com/all experimental.quickjs2 main" > /etc/apt/sources.list.d/quickjs2-testing.list
apt update
apt install wb-rules/experimental.quickjs2 wb-mqtt-homeui/experimental.quickjs2
документация - в PR
Откатить:
rm /etc/apt/sources.list.d/quickjs2-testing.list
apt update
apt install wb-tsgo- wb-rules/testing wb-mqtt-homeui/testing # или stable
Дисклеймер: это бета-тест, что-то может работать плохо, не рекомендуем использовать в продакшне.
Обсуждение в специальной группе.



