@pushwoosh/http-client 1.4.0 → 1.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -36
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
# Pushwoosh / Micro Frontends / Http Client
|
|
2
|
-
Этот пакет является частью микрофронтендовой
|
|
3
|
-
|
|
2
|
+
Этот пакет является частью микрофронтендовой архитектуры
|
|
3
|
+
<br/>
|
|
4
|
+
За основу взят проект [Single SPA](https://single-spa.js.org)
|
|
5
|
+
<br/>
|
|
6
|
+
Предназначен для выполнения запросов к API
|
|
4
7
|
|
|
5
8
|
## Термины
|
|
6
9
|
[Аутентификация](https://auth0.com/docs/authentication) - процесс подтверждения личности пользователя
|
|
@@ -12,19 +15,23 @@
|
|
|
12
15
|
[Сервер авторизации](https://www.rfc-editor.org/rfc/rfc6749.html#section-1.1) - сервер, выдающий токены доступа клиенту после успешной аутентификации владельца ресурса и получение авторизации
|
|
13
16
|
|
|
14
17
|
## Установка
|
|
15
|
-
|
|
16
|
-
|
|
18
|
+
1. Сгенерировать ключи для запуска сервера в режиме HTTPS. ([Confluence](https://confluence.corp.pushwoosh.com/display/FD/HTTPS+on+localhost))
|
|
19
|
+
2. Выполнить `npm ci`
|
|
17
20
|
|
|
18
21
|
## Запуск разработки
|
|
19
|
-
|
|
20
|
-
|
|
22
|
+
1. Скопировать файл `.env.example` в `.env`. Удалить из него комментарии к переменным
|
|
23
|
+
2. Выполнить `npm start`
|
|
21
24
|
|
|
22
25
|
## Работа с библиотекой
|
|
26
|
+
Библиотека собирается в формате UMD.
|
|
27
|
+
<br/>
|
|
28
|
+
В первую очередь предназначена для загрузки с помощью SystemJS.
|
|
29
|
+
|
|
23
30
|
### Создание экземпляра HttpClient
|
|
24
31
|
При создании экземпляра класса HttpClient необходимо указать следующие параметры:
|
|
25
32
|
|
|
26
33
|
```typescript
|
|
27
|
-
import { HttpClient } from '
|
|
34
|
+
import { HttpClient } from '@pushwoosh/http-client';
|
|
28
35
|
|
|
29
36
|
const httpClient = new HttpClient({
|
|
30
37
|
errorMiddleware: (error: unknown): Promise<never> | never => {
|
|
@@ -53,7 +60,7 @@ const introspect = await httpClient.initialize(authorizationCode, authorizationS
|
|
|
53
60
|
|
|
54
61
|
`authorizationState` - это случайная строка, сгенерированная и сохраненная клиентом перед началом сеанса, возвращается вместе с `authorizationCode`
|
|
55
62
|
|
|
56
|
-
`introspect` - это данные о текущем сеансе (идентификатор пользователя, идентификатор аккаунта и т.п.), которые зашиты в `
|
|
63
|
+
`introspect` - это данные о текущем сеансе (идентификатор пользователя, идентификатор аккаунта и т.п.), которые зашиты в `access token`
|
|
57
64
|
|
|
58
65
|
### Начать сеанс
|
|
59
66
|
Выполнить аутентификацию пользователя на клиенте
|
|
@@ -133,11 +140,26 @@ curl 'https://app.pushwoosh.com/entrypoint' \
|
|
|
133
140
|
try {
|
|
134
141
|
const result = httpClient.get<never, never, { some: string }>('/entrypoint', {
|
|
135
142
|
withAuthorization: true,
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
143
|
+
responseMiddleware: (response: Response<{some: string}>): { some: string } => {
|
|
144
|
+
// если стандартный middleware для разбора ответа от сервера не подходит
|
|
145
|
+
// например когда ответ от сервера всегда 200, а коды ошибок зашиты в самом ответе.
|
|
146
|
+
// {
|
|
147
|
+
// status: 200,
|
|
148
|
+
// message: 'Ok',
|
|
149
|
+
// result: {
|
|
150
|
+
// status: 200,
|
|
151
|
+
// message: 'Ok',
|
|
152
|
+
// response: {
|
|
153
|
+
// some: 'some-string',
|
|
154
|
+
// },
|
|
155
|
+
// },
|
|
156
|
+
// }
|
|
157
|
+
const jsonResponse = httpClient.baseResponseMiddleware(response);
|
|
158
|
+
if (jsonResponse.status !== 200) {
|
|
159
|
+
// map jsonResponse error to HttpClient error and throw it.
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
return jsonResponse.result;
|
|
141
163
|
},
|
|
142
164
|
});
|
|
143
165
|
} catch (error: unknown) {
|
|
@@ -154,56 +176,59 @@ import { ForbiddenError, HttpClient, NotFoundError, UnauthorizedError } from './
|
|
|
154
176
|
try {
|
|
155
177
|
const result = httpClient.get<never, never, never>('/entrypoint', {
|
|
156
178
|
withAuthorization: true,
|
|
157
|
-
withCredentials: false,
|
|
158
179
|
});
|
|
159
180
|
} catch (error: unknown) {
|
|
160
181
|
if (error instanceof UnauthorizedError) {
|
|
161
|
-
// TODO: Если
|
|
182
|
+
// TODO: Если не авторизован...
|
|
162
183
|
}
|
|
163
184
|
|
|
164
185
|
if (error instanceof ForbiddenError) {
|
|
165
|
-
// TODO: Если
|
|
186
|
+
// TODO: Если запрещено выполнять запрос...
|
|
166
187
|
}
|
|
167
188
|
|
|
168
189
|
if (error instanceof NotFoundError) {
|
|
169
190
|
// TODO: Если сервер ничего не нашел...
|
|
170
191
|
}
|
|
171
192
|
|
|
172
|
-
//
|
|
173
|
-
captureException(error);
|
|
193
|
+
// TODO: error capture
|
|
174
194
|
}
|
|
175
195
|
```
|
|
176
196
|
|
|
197
|
+
### Родительский класс для ошибок
|
|
198
|
+
`HttpClientError` - Класс описывает ошибку связанную с HttpClient.
|
|
199
|
+
<br/>
|
|
200
|
+
HttpClientError класс является наследником Error.
|
|
201
|
+
<br/>
|
|
202
|
+
<b>Никогда не выбрасывается как исключение. От нее наследуются все остальные ошибки!</b>
|
|
203
|
+
|
|
177
204
|
Каждая ошибка имеет свой класс:
|
|
178
205
|
|
|
179
206
|
#### Ошибки связанные с самим модулем:
|
|
180
|
-
`
|
|
207
|
+
`InternalError` - Класс описывающий внутреннюю ошибку HttpClient
|
|
181
208
|
|
|
182
|
-
|
|
209
|
+
#### Ошибки связанные с ответами от сервера:
|
|
210
|
+
`BadRequestError` - Класс описывающий ошибку "Плохой запрос"
|
|
183
211
|
|
|
184
|
-
|
|
185
|
-
`UnknownError (extends HttpClientError)` - Неизвестная ошибка HttpClient
|
|
212
|
+
`UnauthorizedError` - Класс описывающий ошибку "Не авторизовано"
|
|
186
213
|
|
|
187
|
-
|
|
188
|
-
`BadRequestError (extends HttpClientError)` - Класс описывающий ошибку "Плохой запрос"
|
|
214
|
+
`ForbiddenError` - Класс описывающий ошибку "Запрещено"
|
|
189
215
|
|
|
190
|
-
`
|
|
216
|
+
`NotFoundError` - Класс описывающий ошибку "Не найден"
|
|
191
217
|
|
|
192
|
-
`
|
|
218
|
+
`MethodNotAllowedError` - Класс описывающий ошибку "Метод не доступен"
|
|
193
219
|
|
|
194
|
-
`
|
|
220
|
+
`UnsupportedMediaTypeError` - Класс описывающий ошибку "Медиа формат не поддерживается сервером"
|
|
195
221
|
|
|
196
|
-
`
|
|
197
|
-
|
|
198
|
-
`UnsupportedMediaTypeError (extends HttpClientError)` - Класс описывающий ошибку "Медиа формат не поддерживается сервером"
|
|
199
|
-
|
|
200
|
-
`UnprocessableEntityError (extends HttpClientError)` - Класс описывающий ошибку "Сервер не может обработать запрос"
|
|
222
|
+
`UnprocessableEntityError` - Класс описывающий ошибку "Сервер не может обработать запрос"
|
|
201
223
|
|
|
202
224
|
#### Ошибки связанные с работой сервера:
|
|
203
|
-
`InternalServerError
|
|
225
|
+
`InternalServerError` - Класс описывающий ошибку "Внутренняя ошибка сервера"
|
|
226
|
+
|
|
227
|
+
`BadGatewayError` - Класс описывающий ошибку "Плохой шлюз"
|
|
204
228
|
|
|
205
|
-
`
|
|
229
|
+
`ServiceUnavailableError` - Класс описывающий ошибку "Сервис недоступен"
|
|
206
230
|
|
|
207
|
-
`
|
|
231
|
+
`GatewayTimeoutError` - Класс описывающий ошибку "Вышло время ожидания ответа"
|
|
208
232
|
|
|
209
|
-
|
|
233
|
+
#### Остальные:
|
|
234
|
+
`UnknownServerError` - Класс описывает ошибку связанную с запросами к серверу, но для которой не подходит ни один из вариантов выше.
|