Разработка IoC библиотеки для nodejs

Цена договорная
06 января 2023, 05:48 • 6 откликов • 52 просмотра
Необходимо написать IoC библиотеку для nodejs. Основа должна быть написана на typescript-е. Линтер и настройки, а также примеры пакетов и их оформления можно посмотреть тут (https://gitlab.com/hyper-graph/framework). По завершению работы, библиотека будет перенесена в этот репозиторий и все инструменты будут настроены соответственно.

Требования:
1) Необходимо написать контейнер в стиле nestjs. Требуется сохранять текущий функционал, расширить его и иметь возможность использовать вне nodejs (в связке с react на фронте, в webworker-ах (обычных, service worker, shared worker)).
Требуется сохранить концепцию модулей, провайдеров, импорта экспорта в том же стиле в каком она есть.
2) injection scope -- должно быть 4 варианта. SINGLETON, PERSISTENT, REQUEST, TRANSIENT.
SIGNLETON -- провайдер создается только если его кто-то inject-тит.
Остальные -- по аналогии с nestjs.
3) В описании модуля должна быть возможность указывать не только controllers и providers, но и любые кастомные поля.
К примеру:
{
controller: [],
provider: [],
connectors: [],
};
В данном примере provider -- все 3 поля работают одинаково просто доступ к ним будет отдельный, но это никак не влияет на резолв зависимостей. При запросе через сам контейнер можно запросить отдельно contoller-ы и отдельно connector-ы.
4) request provider-ы не должны влиять на остальных. в реализации nestjs все провайдеры которые зависят от request provider-ов, автоматически меняют scope на request. Необходимо использовать что-либо на подобии proxy чтобы зависимый класс хранил не ссылку на конкретную зависимость, а proxy который в контексте разных request-ов возвращал разные зависимости. (можно использовать async-context для nodejs). Поддержка request provider-ов в браузера не нужна.
5) Циклические зависимости -- должна сохраняться возможность inject-ить циклические зависимости. Опять же, можно использовать proxy.
6) Методы inject-а:
Нужно также сохранить механизмы inject-а через конструктор и свойство. inject через свойства должен учитывать зависимости всех классов в дереве наследования
7) Жизненный цикл
Должна быть возможность emit-ить события жизненного цикла (в том числе кастомные -- для сторонних библиотек). У событий должна быть возможность передать аргументы (например, signal для события остановки) а также стратегия: Восходящая и нисходящая, которые влияют на порядок вызовов. Восходящая -- сначала вызывается метод классов у которых нет зависимостей, потом тех, чьи зависимости уже обработали событие и так далее. Для нисходящей наоборот.
Для циклических зависимостей исключение. вызывается только тогда когда все не циклические зависимости обработали событие
8) Описание провайдеров: Сохранить также все механизмы useClass, useFactory, useValue, useExisting
9) Не использовать крупные библиотеки -- например rxjs. (lodash и date-fns -- можно).
10) должно быть максимальное покрытие тестами
11) Должна быть возможность использовать расширенное API для тестирование (смотри @nestjs/testing). В рамках того-же пакета
12) Поддержка всех lts версий ноды
13) Можно использовать пакеты из репозитория (например exception). Скрипты сборки -- cli из того же репозитория. config-и для eslint/typescirpt/mocha и описание тестов -- тоже из репозитория (смотри другие пакеты)
14) Должна быть возможность в разных модулях указывать в качестве provider-а разные классы с одинаковым именем. При этом зависимости должны резолвиться по конструктору, а не по названию. Токен для зависимости/провайдера может быть либо класс (в том числе абстрактный), либо symbol

Можно разрабатывать прямо в репозитория (ссылка выше). Доступы предоставлю, при необходимости.