@pushwoosh/http-client 1.0.2 → 1.1.0

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.
@@ -0,0 +1,171 @@
1
+ import { History } from 'history';
2
+ import { Body, Config, DeleteOptions, GetOptions, Introspect, Method, PatchOptions, PostOptions, PutOptions, Query, RequestOptions, Response } from './http-client.types';
3
+ export declare class HttpClient {
4
+ /**
5
+ * Имя куки в которой будет сохранена случайная строка для проверки ответа авторизации.
6
+ * Для более подробной информации: RFC 6749 https://www.rfc-editor.org/rfc/rfc6749.html#section-4.1.1.
7
+ */
8
+ static STORIED_AUTHORIZATION_STATE_COOKIE_NAME: string;
9
+ /**
10
+ * Имя куки в которой будет сохранен полный текущий адрес страницы.
11
+ */
12
+ static STORIED_URL_COOKIE_NAME: string;
13
+ /**
14
+ * Библиотека для управления навигацией.
15
+ */
16
+ private readonly history;
17
+ /**
18
+ * Параметры конфигурации.
19
+ */
20
+ private readonly config;
21
+ /**
22
+ * Токен доступа.
23
+ */
24
+ private accessToken;
25
+ /**
26
+ * Токен обновления.
27
+ */
28
+ private refreshToken;
29
+ /**
30
+ * Происходит ли сейчас обновление токенов.
31
+ */
32
+ private isRefreshing;
33
+ /**
34
+ * Был ли установлен токен доступа вручную.
35
+ */
36
+ private isAccessTokenSetManual;
37
+ constructor(history: History, config: Config);
38
+ /**
39
+ * Разобрать ответ от сервера, и вернуть результат выполнения запроса.
40
+ *
41
+ * @param { Response<*> } response - ответ от сервера.
42
+ */
43
+ basicResponseMiddleware: <R extends unknown>(response: Response<R>) => R;
44
+ /**
45
+ * Проверить наличие авторизации.
46
+ */
47
+ private guardAuthorization;
48
+ /**
49
+ * Обновить токены.
50
+ * Для более подробной информации: RFC 6749 https://www.rfc-editor.org/rfc/rfc6749.html.
51
+ *
52
+ * @param { UpdateTokensPairQuery } query - параметры запроса для обновления токенов.
53
+ */
54
+ private updateTokensPair;
55
+ /**
56
+ * Обновить токены с помощью кода авторизации.
57
+ * Для более подробной информации: RFC 6749 https://www.rfc-editor.org/rfc/rfc6749.html#section-4.1.3.
58
+ *
59
+ * @param { string } authorizationCode - код авторизации, полученный от сервера авторизации.
60
+ */
61
+ private updateTokensPairByAuthorizationCode;
62
+ /**
63
+ * Обновить токены с помощью токена обновления.
64
+ * Для более подробной информации: RFC 6749 https://www.rfc-editor.org/rfc/rfc6749.html#section-6.
65
+ *
66
+ * @param { string } refreshToken - токен обновления, полученный от сервера авторизации.
67
+ * @param { Introspect } introspect - содержимое токена доступа.
68
+ */
69
+ private updateTokensPairByRefreshToken;
70
+ /**
71
+ * Инициализировать модуль, если передан authorizationCode и authorizationState будет выполнена попытка обновить токены.
72
+ *
73
+ * @param { string } authorizationCode - код авторизации, полученный от сервера авторизации.
74
+ * @param { string } authorizationState - уникальная строка, переданная клиентом серверу при авторизации, полученная от сервера авторизации.
75
+ */
76
+ initialize: (authorizationCode: string | null, authorizationState: string | null) => Promise<Introspect | null>;
77
+ /**
78
+ * Начать сессию.
79
+ */
80
+ login: () => Promise<void>;
81
+ /**
82
+ * Завершить сессию.
83
+ */
84
+ logout: () => Promise<void>;
85
+ /**
86
+ * Временный костыль, чтобы установить токен доступа из сессии.
87
+ */
88
+ setAccessToken: (accessToken: string) => void;
89
+ /**
90
+ * Получить токен доступа, если время жизни токена закончилось, будет осуществлена попытка обновить токен.
91
+ */
92
+ getAccessToken: () => Promise<string>;
93
+ /**
94
+ * Выполнить запрос на сервер.
95
+ *
96
+ * Дженерик:
97
+ * Method - тип запроса.
98
+ * Placeholders - параметры, которые будут подставлены в шаблон пути.
99
+ * Query - параметры, которые будут преобразованы в строку запроса.
100
+ * Body - тело запроса (never для GET).
101
+ * Result - ожидаемый результат выполнения запроса.
102
+ *
103
+ * @param { string } url - адрес запроса.
104
+ * @param { Options<Method, Params, Query, Body> } options - параметры запроса.
105
+ */
106
+ request: <M extends Method, P extends Record<string, string | number>, Q extends Query, B extends Body, R extends unknown>(url: string, options: RequestOptions<M, P, Q, B>) => Promise<Response<R>>;
107
+ /**
108
+ * Выполнить GET запрос на сервер.
109
+ *
110
+ * Дженерик:
111
+ * Params - параметры, которые будут подставлены в шаблон пути.
112
+ * Query - параметры, которые будут преобразованы в строку запроса.
113
+ * Result - ожидаемый результат выполнения запроса.
114
+ *
115
+ * @param { string } url - адрес запроса.
116
+ * @param { GetOptions<Params, Query> } options - параметры GET запроса.
117
+ */
118
+ get: <P extends Record<string, string | number>, Q extends Query, R extends unknown>(url: string, options: GetOptions<P, Q, R>) => Promise<R>;
119
+ /**
120
+ * Выполнить POST запрос на сервер.
121
+ *
122
+ * Дженерик:
123
+ * Params - параметры, которые будут подставлены в шаблон пути.
124
+ * Query - параметры, которые будут преобразованы в строку запроса.
125
+ * Body - тело запроса.
126
+ * Result - ожидаемый результат выполнения запроса.
127
+ *
128
+ * @param { string } url - адрес запроса.
129
+ * @param { PostOptions<Params, Query, Body> } options - параметры POST запроса.
130
+ */
131
+ post: <P extends Record<string, string | number>, Q extends Query, B extends Body, R extends unknown>(url: string, options: PostOptions<P, Q, B, R>) => Promise<R>;
132
+ /**
133
+ * Выполнить PUT запрос на сервер.
134
+ *
135
+ * Дженерик:
136
+ * Params - параметры, которые будут подставлены в шаблон пути.
137
+ * Query - параметры, которые будут преобразованы в строку запроса.
138
+ * Body - тело запроса.
139
+ * Result - ожидаемый результат выполнения запроса.
140
+ *
141
+ * @param { string } url - адрес запроса.
142
+ * @param { PutOptions<Params, Query, Body> } options - параметры PUT запроса.
143
+ */
144
+ put: <P extends Record<string, string | number>, Q extends Query, B extends Body, R extends unknown>(url: string, options: PutOptions<P, Q, B, R>) => Promise<R>;
145
+ /**
146
+ * Выполнить PATCH запрос на сервер.
147
+ *
148
+ * Дженерик:
149
+ * Params - параметры, которые будут подставлены в шаблон пути.
150
+ * Query - параметры, которые будут преобразованы в строку запроса.
151
+ * Body - тело запроса.
152
+ * Result - ожидаемый результат выполнения запроса.
153
+ *
154
+ * @param { string } url - адрес запроса.
155
+ * @param { PatchOptions<Params, Query, Body> } options - параметры PATCH запроса.
156
+ */
157
+ patch: <P extends Record<string, string | number>, Q extends Query, B extends Body, R extends unknown>(url: string, options: PatchOptions<P, Q, B, R>) => Promise<R>;
158
+ /**
159
+ * Выполнить DELETE запрос на сервер.
160
+ *
161
+ * Дженерик:
162
+ * Params - параметры, которые будут подставлены в шаблон пути.
163
+ * Query - параметры, которые будут преобразованы в строку запроса.
164
+ * Body - тело запроса.
165
+ * Result - ожидаемый результат выполнения запроса.
166
+ *
167
+ * @param { string } url - адрес запроса.
168
+ * @param { DeleteOptions<Params, Query, Body> } options - параметры DELETE запроса.
169
+ */
170
+ delete: <P extends Record<string, string | number>, Q extends Query, B extends Body, R extends unknown>(url: string, options: DeleteOptions<P, Q, B, R>) => Promise<R>;
171
+ }
@@ -1,105 +1,111 @@
1
1
  /**
2
- * Класс описывающий ошибку связанную с модулем HttpClient
2
+ * Класс описывающий ошибку связанную с модулем HttpClient.
3
3
  */
4
4
  export declare class HttpClientError extends Error {
5
5
  readonly name: string;
6
6
  /**
7
- * Статус ошибки
7
+ * Статус ошибки.
8
8
  */
9
9
  readonly status: number;
10
10
  /**
11
- * Детали ошибки
11
+ * Детали ошибки.
12
12
  */
13
13
  readonly details: string | null;
14
14
  constructor(message: string, status: number, details: string | null);
15
15
  }
16
16
  /**
17
- * Класс описывающий внутреннюю ошибку связанную с модулем HttpClient
17
+ * Класс описывающий внутреннюю ошибку связанную с модулем HttpClient.
18
18
  */
19
19
  export declare class InternalError extends HttpClientError {
20
20
  readonly name: string;
21
21
  constructor(message: string, details: string | null);
22
22
  }
23
23
  /**
24
- * Класс описывающий неизвестную ошибку
24
+ * Класс описывающий неизвестную ошибку.
25
25
  */
26
26
  export declare class UnknownError extends HttpClientError {
27
27
  constructor(code: number, details: string);
28
28
  }
29
29
  /**
30
- * Класс описывающий ошибку "Плохой запрос"
31
- * Это означает, что сервер не понимает запрос из-за неверного синтаксиса
30
+ * Класс описывающий ошибку валидации ответа от сервера.
31
+ */
32
+ export declare class ValidationError extends HttpClientError {
33
+ constructor(details: string);
34
+ }
35
+ /**
36
+ * Класс описывающий ошибку "Плохой запрос".
37
+ * Это означает, что сервер не понимает запрос из-за неверного синтаксиса.
32
38
  */
33
39
  export declare class BadRequestError extends HttpClientError {
34
40
  constructor(details: string);
35
41
  }
36
42
  /**
37
- * Класс описывающий ошибку "Не авторизовано"
38
- * Это означает. что для получения запрашиваемого ответа нужна аутентификация
43
+ * Класс описывающий ошибку "Не авторизовано".
44
+ * Это означает. что для получения запрашиваемого ответа нужна аутентификация.
39
45
  */
40
46
  export declare class UnauthorizedError extends HttpClientError {
41
47
  constructor(details: string);
42
48
  }
43
49
  /**
44
- * Класс описывающий ошибку "Запрещено"
45
- * Это означает, что у клиента нет прав доступа к содержимому
50
+ * Класс описывающий ошибку "Запрещено".
51
+ * Это означает, что у клиента нет прав доступа к содержимому.
46
52
  */
47
53
  export declare class ForbiddenError extends HttpClientError {
48
54
  constructor(details: string);
49
55
  }
50
56
  /**
51
- * Класс описывающий ошибку "Не найден"
52
- * Это означает, что сервер не может найти запрашиваемый ресурс
57
+ * Класс описывающий ошибку "Не найден".
58
+ * Это означает, что сервер не может найти запрашиваемый ресурс.
53
59
  */
54
60
  export declare class NotFoundError extends HttpClientError {
55
61
  constructor(details: string);
56
62
  }
57
63
  /**
58
- * Класс описывающий ошибку "Метод не доступен"
59
- * Это означает, что серверу известен запрос, но он был отключен и не может быть использован
64
+ * Класс описывающий ошибку "Метод не доступен".
65
+ * Это означает, что серверу известен запрос, но он был отключен и не может быть использован.
60
66
  */
61
67
  export declare class MethodNotAllowedError extends HttpClientError {
62
68
  constructor(details: string);
63
69
  }
64
70
  /**
65
- * Класс описывающий ошибку "Медиа формат не поддерживается сервером"
66
- * Это означает, что сервер не поддерживает медиа формат запрашиваемых данных
71
+ * Класс описывающий ошибку "Медиа формат не поддерживается сервером".
72
+ * Это означает, что сервер не поддерживает медиа формат запрашиваемых данных.
67
73
  */
68
74
  export declare class UnsupportedMediaTypeError extends HttpClientError {
69
75
  constructor(details: string);
70
76
  }
71
77
  /**
72
- * Класс описывающий ошибку "Сервер не может обработать запрос"
73
- * Это означает, что сервер понимает тип содержимого в теле запроса
74
- * и синтаксис запроса является корректным, но серверу не удалось обработать инструкции содержимого
78
+ * Класс описывающий ошибку "Сервер не может обработать запрос".
79
+ * Это означает, что сервер понимает тип содержимого в теле запроса.
80
+ * и синтаксис запроса является корректным, но серверу не удалось обработать инструкции содержимого.
75
81
  */
76
82
  export declare class UnprocessableEntityError extends HttpClientError {
77
83
  constructor(details: string);
78
84
  }
79
85
  /**
80
- * Класс описывающий ошибку "Внутренняя ошибка сервера"
81
- * Это означает, что сервер столкнулся с ситуацией, которую он не знает как обработать
86
+ * Класс описывающий ошибку "Внутренняя ошибка сервера".
87
+ * Это означает, что сервер столкнулся с ситуацией, которую он не знает как обработать.
82
88
  */
83
89
  export declare class InternalServerError extends HttpClientError {
84
90
  constructor(details: string);
85
91
  }
86
92
  /**
87
- * Класс описывающий ошибку "Плохой шлюз"
88
- * Это означает, что сервер действует как шлюз шлюз и получил недопустимый ответ
93
+ * Класс описывающий ошибку "Плохой шлюз".
94
+ * Это означает, что сервер действует как шлюз и получил недопустимый ответ.
89
95
  */
90
96
  export declare class BadGatewayError extends HttpClientError {
91
97
  constructor(details: string);
92
98
  }
93
99
  /**
94
- * Класс описывающий ошибку "Сервис недоступен"
95
- * Это означает, что сервер не готов обрабатывать запрос
100
+ * Класс описывающий ошибку "Сервис недоступен".
101
+ * Это означает, что сервер не готов обрабатывать запрос.
96
102
  */
97
103
  export declare class ServiceUnavailableError extends HttpClientError {
98
104
  constructor(details: string);
99
105
  }
100
106
  /**
101
- * Класс описывающий ошибку "Вышло время ожидания ответа"
102
- * Это означает, что сервер действует как шлюз и не может получить ответ вовремя
107
+ * Класс описывающий ошибку "Вышло время ожидания ответа".
108
+ * Это означает, что сервер действует как шлюз и не может получить ответ вовремя.
103
109
  */
104
110
  export declare class GatewayTimeoutError extends HttpClientError {
105
111
  constructor(details: string);
@@ -7,8 +7,11 @@ export declare type Config = {
7
7
  readonly token: string;
8
8
  readonly logout: string;
9
9
  };
10
+ cookie: Omit<CookieAttributes, 'domain'> & {
11
+ readonly domain: string;
12
+ };
13
+ readonly errorMiddleware?: (error: unknown) => Promise<never> | never;
10
14
  };
11
- export declare type CookieOptions = CookieAttributes;
12
15
  export declare type GetMethod = 'GET';
13
16
  export declare type PostMethod = 'POST';
14
17
  export declare type PutMethod = 'PUT';
@@ -19,13 +22,21 @@ export declare type Params = Record<string, string | number> | never;
19
22
  export declare type Query = Record<string, Primitives> | URLSearchParams | string | never;
20
23
  export declare type Body = Record<string, unknown> | FormData | never;
21
24
  export declare type Result = unknown | void;
25
+ export declare type Response<R extends Result> = {
26
+ readonly result: R;
27
+ readonly status: number;
28
+ readonly message: string;
29
+ };
22
30
  declare type BaseRequestOptions<M extends Method> = {
23
31
  readonly method: M;
24
32
  readonly headers?: Record<string, string>;
25
33
  readonly withAuthorization: boolean;
26
34
  readonly withCredentials?: boolean;
27
35
  };
28
- export declare type Options<M extends Method, P extends Params, Q extends Query, B extends Body> = M extends GetMethod ? [P] extends [never] ? [Q] extends [never] ? BaseRequestOptions<GetMethod> : BaseRequestOptions<GetMethod> & {
36
+ declare type SimpleRequestOptions<R extends Result> = {
37
+ readonly responseMiddleware?: (response: Response<any>) => R;
38
+ };
39
+ export declare type RequestOptions<M extends Method, P extends Params, Q extends Query, B extends Body> = M extends GetMethod ? [P] extends [never] ? [Q] extends [never] ? BaseRequestOptions<GetMethod> : BaseRequestOptions<GetMethod> & {
29
40
  query: Q;
30
41
  } : [Q] extends [never] ? BaseRequestOptions<GetMethod> & {
31
42
  params: P;
@@ -52,19 +63,15 @@ export declare type Options<M extends Method, P extends Params, Q extends Query,
52
63
  query: Q;
53
64
  body: B;
54
65
  };
55
- export declare type GetOptions<P extends Params, Q extends Query> = Omit<Options<GetMethod, P, Q, never>, 'method'>;
56
- export declare type PostOptions<P extends Params, Q extends Query, B extends Body> = Omit<Options<PostMethod, P, Q, B>, 'method'>;
57
- export declare type PutOptions<P extends Params, Q extends Query, B extends Body> = Omit<Options<PutMethod, P, Q, B>, 'method'>;
58
- export declare type PatchOptions<P extends Params, Q extends Query, B extends Body> = Omit<Options<PatchMethod, P, Q, B>, 'method'>;
59
- export declare type DeleteOptions<P extends Params, Q extends Query, B extends Body> = Omit<Options<DeleteMethod, P, Q, B>, 'method'>;
60
- export declare type Response<R extends Result> = {
61
- readonly result: R;
62
- readonly status: number;
63
- readonly message: string;
64
- };
66
+ export declare type GetOptions<P extends Params, Q extends Query, R extends Result> = Omit<RequestOptions<GetMethod, P, Q, never>, 'method'> & SimpleRequestOptions<R>;
67
+ export declare type PostOptions<P extends Params, Q extends Query, B extends Body, R extends Result> = Omit<RequestOptions<PostMethod, P, Q, B>, 'method'> & SimpleRequestOptions<R>;
68
+ export declare type PutOptions<P extends Params, Q extends Query, B extends Body, R extends Result> = Omit<RequestOptions<PutMethod, P, Q, B>, 'method'> & SimpleRequestOptions<R>;
69
+ export declare type PatchOptions<P extends Params, Q extends Query, B extends Body, R extends Result> = Omit<RequestOptions<PatchMethod, P, Q, B>, 'method'> & SimpleRequestOptions<R>;
70
+ export declare type DeleteOptions<P extends Params, Q extends Query, B extends Body, R extends Result> = Omit<RequestOptions<DeleteMethod, P, Q, B>, 'method'> & SimpleRequestOptions<R>;
65
71
  export declare type Introspect = {
66
72
  readonly user_id: string | number;
67
73
  readonly username: string | number;
74
+ readonly is_su?: boolean;
68
75
  readonly account_id: string | number;
69
76
  readonly expired_at: number;
70
77
  };