Как стать автором
Обновить
44
7.6
Alex Gusev @flancer

Я кодирую, потому что я кодирую…

Отправить сообщение

Когда нельзя доверять даже себе

Экосистема JavaScript — обширная, гибкая и насыщенная готовыми решениями. Она позволяет без особых усилий подключать сторонние пакеты — как в браузере, так и на сервере. Но у этой открытости есть и обратная сторона: сторонний код может вмешиваться в ваш собственный. Хорошо, если это происходит явно. Но бывает иначе: кто-то оборачивает ваши функции, переопределяет методы, расширяет прототипы — и тихо выполняет свою «чёрную работу».

В такой среде доверие к собственному коду становится условным. Разработчик ещё способен более-менее контролировать точку входа — HTML-страницу или Node.js-скрипт. Он может доверять тому, что написал сам и вызывает сам. До тех пор, пока не подключит стороннюю библиотеку. А дальше — возможны любые сценарии.

Чтобы можно было доверять своему коду хоть немного больше, я пошёл на эксперимент и по умолчанию встроил "заморозку" всех объектов, создаваемых моим DI-контейнером:

let res = await _composer.create(key, module, stack, this);
if (canBeFrozen(res)) Object.freeze(res);

При запуске node-приложения (или при загрузке кода на веб-страницу) я создаю контейнер и через него получаю нужный объект со всеми зависимостями:

import Container from '@teqfw/di';

const container = new Container();
const resolver = container.getResolver();
resolver.addNamespaceRoot('App_', '/home/user/project/src');
const app = await container.get('App_Main');
app.run();

Поскольку все объекты, получаемые из контейнера, автоматически замораживаются, сторонний код не может изменить поведение уже созданной зависимости — даже если получит к ней доступ.

Разумеется, такой подход не делает JS-среду абсолютно безопасной. Но он позволяет немного повысить уровень доверия к тому, что происходит внутри.

Эта идея родилась после прений с коллегой @nin-jin — так что спасибо ему за подброшенную мысль ;) Я реализовал её в коде, опробовал на своих приложениях и вот теперь делюсь результатом.

Теги:
Всего голосов 3: ↑2 и ↓1+2
Комментарии7

Отладка before-хуков в mocha

Недавно при создании приёмочных тестов для плагина столкнулся с необычной ситуацией. В before-хуке настраивалось окружение: записи в БД, моки зависимостей. В after-хуке происходила зачистка. Отдельно тест работал, но в группе начинал сбоить: оставались следы от предыдущих тестов.

При запуске под отладчиком it-секции пропускались и сразу выполнялись after-хуки. "Игорь Иваныч" (ИИ) объяснил, что mocha пропускает тесты, если в before-хуке есть ошибки. Использование try-catch и несколько часов отладки и рефакторинга убедили меня только в том, что ошибок нет, но it-блоки всё равно пропускаются.

Однако на следующий день при запуске всех тестов мой проблемный тест неожиданно заработал. Хотя при попытке отладки он опять начинал сбоить. Правильно заданный вопрос "Игорь Иванычу" привёл к получению правильной "таблетки":

before(async function () {
    this.timeout(60000); // 1 min
});

Всё. Это сняло проблему. В mocha по-умолчанию timeout для выполнения before-хука составляет 2 секунды. Ошибкой с точки зрения mocha было то, что разработчик (т.е. - я) тупил в отладчике больше 2 секунд и не оповестил её об этом в явном виде.

Это вполне себе логичное поведение фреймворка, о котором нужно просто знать. Теперь я знаю. Но если бы я знал об этом перед началом отладки, то я бы сэкономил несколько часов своей жизни.

Теги:
Рейтинг0
Комментарии0

В продолжение публикации «Загрузка es‑модулей в браузерные приложения» cделал более‑менее практичное веб‑приложение с загрузкой кода из публичных ресурсов (GitHub Pages & jsDelivr).

Пример диалога
Пример диалога

Приложение позволяет использовать OpenAI API напрямую из браузера. В приложении задействованы следующие библиотеки:

Код приложения - здесь, описание - здесь (на англ.).

Отдельное спасибо @SuperCat911 за комменты про importmap - без них бы не получилось юзать OpenAI-библиотеку :)

Кстати, до 4-версии у OpenAI не было браузерной версии API-клиента (только для nodejs). И несмотря на то, что библиотека написана на TS, для браузера они сделали ES-модули, а не UMD-бандл.

Теги:
Всего голосов 3: ↑3 и ↓0+5
Комментарии1

Информация

В рейтинге
963-й
Откуда
Рига, Латвия, Латвия
Дата рождения
Зарегистрирован
Активность

Специализация

Фулстек разработчик
Ведущий
От 3 000 €
JavaScript
HTML
CSS
Node.js
Vue.js
Веб-разработка
Progressive Web Apps
PostgreSQL
MySQL
GitHub