|
| 1 | +## Задания |
| 2 | + |
| 3 | +Берем пример сервера [`9-logger`](https://github.com/HowProgrammingWorks/DDD/tree/master/JavaScript/9-logger) и доработаем его: |
| 4 | + |
| 5 | +1. Давайте вынесем в конфиг из примера [`9-logger`](https://github.com/HowProgrammingWorks/DDD/tree/master/JavaScript/9-logger) |
| 6 | +все или часть параметров, которые могут меняться: номер порта, параметры подключения к базе данных, |
| 7 | +настройки криптографии для хеширования паролей, таймайты и то, что вам покажется полезным перенести в конфиги. |
| 8 | +Для конфигов мы можем использовать обычный модуль, например, файл `config.js`, рядом `main.js`, |
| 9 | +из которого он подгружается через `require`. |
| 10 | + |
| 11 | +2. В конфиге сделаем ключ `transport` с вариантами значений `http` и `ws`, т.е. мы можем в конфиге переключать, по какому транспорту мы отдаем API. |
| 12 | +Нужно соответственно поменять код в `main.js` чтобы подгружался или `http.js` или `ws.js` в соответствии с конфигом. |
| 13 | + |
| 14 | +3. Клиентская часть API у нас поддерживает `websocket`, но не умеет работать через обычный HTTP. |
| 15 | +Вот код клиента: [`client.js`](https://github.com/HowProgrammingWorks/DDD/blob/master/JavaScript/9-logger/static/client.js) |
| 16 | +Нужно разработать вариант функции `scaffold` (динамическое создание интерфейса для работы с серверным API в рантайме), |
| 17 | +которая бы поддерживала HTTP, лучше всего при на базе `fetch`. Добавим в функцию параметр `url`, в результате, |
| 18 | +ее сигнатура будет: `scaffold(url, structure)`. Если не знаете с чего начать, то может помочь пример функции |
| 19 | +[`buildAPI`](https://github.com/HowProgrammingWorks/API/blob/master/JavaScript/1-HTTP/static/client.js), |
| 20 | +а при необходимости посмотрите дополнительное видео про [пересаживание API с HTTP на Websocket](https://www.youtube.com/watch?v=-az912XBCu8), |
| 21 | +это задача обратная нашей. |
| 22 | + |
| 23 | +4. Теперь, на клиенте нужно организовать условное подключение к серверу по `http` или `websocket` в зависимости от `url`, |
| 24 | +передаваемого в функцию `scaffold`, т.е. мы должны иметь или две реализации `scaffold` с одинаковой сигнатурой и с разными |
| 25 | +транспортами или коллекцию транспортов, например `const transport = { http:..., ws:... };`. По желанию вы можете реализовать |
| 26 | +то же для протоколов `https` и `http2` как на клиенте, так и на сервере. Но это не обязательно, принцип переключения уже понятен. |
| 27 | + |
| 28 | +5. Можно реализовать подключение фреймворков по такому же принципу, как мы это сделали с транспортами, это тоже по желанию, не обязательно, |
| 29 | +например `fastify` или любой другой фреймворк и добавить в конфиге параметр: `framework` со значениями `native`, `fastify` и т.д. |
| 30 | + |
| 31 | +6. Давайте заменим нашу самодельную систему модульности для написания API на `commonjs` или на `esm`, на ваш выбор. И соответственно |
| 32 | +отрефакторить все файлы в папке `./api`. При этом нужно будет реализовать внедрение зависимостей другим способом, на ваш выбор, |
| 33 | +но без зависимостей. |
| 34 | + |
| 35 | +7. Так же поступим и с логгером, делаем его пристегиваемым: выносим в конфиги его название, при старте подгружаем нужный и перенаправляем |
| 36 | +`console` в него. Можете взять логгер [pino](https://github.com/pinojs/pino). |
0 commit comments