Skip to content

Commit 9caa9ff

Browse files
authored
Create Tasks.md
1 parent cf1915e commit 9caa9ff

File tree

1 file changed

+36
-0
lines changed

1 file changed

+36
-0
lines changed

JavaScript/Tasks.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
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

Comments
 (0)