@tramvai/module-http-client 6.63.1 → 6.65.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.
- package/lib/httpClient/headers.browser.js +1 -1
- package/lib/httpClient/headers.d.ts +1 -1
- package/lib/httpClient/headers.es.js +1 -1
- package/lib/httpClient/headers.js +1 -1
- package/lib/httpClient/httpClientFactory.browser.js +0 -1
- package/lib/httpClient/httpClientFactory.es.js +0 -1
- package/lib/httpClient/httpClientFactory.js +0 -1
- package/lib/httpClientModule.browser.d.ts +4 -0
- package/lib/httpClientModule.browser.js +46 -105
- package/lib/httpClientModule.d.ts +3 -3
- package/lib/httpClientModule.es.js +46 -105
- package/lib/httpClientModule.js +44 -103
- package/lib/shared.browser.js +108 -0
- package/lib/shared.d.ts +218 -0
- package/lib/shared.es.js +108 -0
- package/lib/shared.js +112 -0
- package/lib/test/unit/testApi.d.ts +5 -3
- package/package.json +17 -15
- package/tests.d.ts +5 -6
- package/tests.js +207 -169
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { createToken } from '@tinkoff/dippy';
|
|
2
|
+
import { provide, APP_INFO_TOKEN, Scope } from '@tramvai/core';
|
|
3
|
+
import { HTTP_CLIENT_FACTORY, API_CLIENT_PASS_HEADERS, HTTP_CLIENT_AGENT, DISABLE_CIRCUIT_BREAKER, DEFAULT_HTTP_CLIENT_FACTORY_OPTIONS, DEFAULT_HTTP_CLIENT_INTERCEPTORS, HTTP_CLIENT } from '@tramvai/tokens-http-client';
|
|
4
|
+
import { LOGGER_TOKEN, ENV_MANAGER_TOKEN, REQUEST_MANAGER_TOKEN, COMMAND_LINE_EXECUTION_CONTEXT_TOKEN, ENV_USED_TOKEN, CREATE_CACHE_TOKEN } from '@tramvai/tokens-common';
|
|
5
|
+
import { httpClientFactory } from './httpClient/httpClientFactory.browser.js';
|
|
6
|
+
|
|
7
|
+
const createCacheToken = createToken('httpClient createCache');
|
|
8
|
+
const providers = [
|
|
9
|
+
provide({
|
|
10
|
+
provide: HTTP_CLIENT_FACTORY,
|
|
11
|
+
useFactory: httpClientFactory,
|
|
12
|
+
deps: {
|
|
13
|
+
logger: LOGGER_TOKEN,
|
|
14
|
+
envManager: ENV_MANAGER_TOKEN,
|
|
15
|
+
appInfo: APP_INFO_TOKEN,
|
|
16
|
+
createCache: createCacheToken,
|
|
17
|
+
makeRequestRegistry: 'makeRequestRegistry',
|
|
18
|
+
requestManager: {
|
|
19
|
+
token: REQUEST_MANAGER_TOKEN,
|
|
20
|
+
optional: true,
|
|
21
|
+
},
|
|
22
|
+
headersList: {
|
|
23
|
+
token: API_CLIENT_PASS_HEADERS,
|
|
24
|
+
optional: true,
|
|
25
|
+
},
|
|
26
|
+
agent: {
|
|
27
|
+
token: HTTP_CLIENT_AGENT,
|
|
28
|
+
optional: true,
|
|
29
|
+
},
|
|
30
|
+
disableCircuitBreaker: {
|
|
31
|
+
token: DISABLE_CIRCUIT_BREAKER,
|
|
32
|
+
optional: true,
|
|
33
|
+
},
|
|
34
|
+
defaultOptions: {
|
|
35
|
+
token: DEFAULT_HTTP_CLIENT_FACTORY_OPTIONS,
|
|
36
|
+
optional: true,
|
|
37
|
+
},
|
|
38
|
+
defaultInterceptors: {
|
|
39
|
+
token: DEFAULT_HTTP_CLIENT_INTERCEPTORS,
|
|
40
|
+
optional: true,
|
|
41
|
+
},
|
|
42
|
+
commandLineExecutionContext: {
|
|
43
|
+
token: COMMAND_LINE_EXECUTION_CONTEXT_TOKEN,
|
|
44
|
+
optional: true,
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
}),
|
|
48
|
+
provide({
|
|
49
|
+
provide: HTTP_CLIENT,
|
|
50
|
+
useFactory: ({ factory }) => {
|
|
51
|
+
return factory({
|
|
52
|
+
name: 'http-client',
|
|
53
|
+
enableCircuitBreaker: false,
|
|
54
|
+
});
|
|
55
|
+
},
|
|
56
|
+
deps: {
|
|
57
|
+
factory: HTTP_CLIENT_FACTORY,
|
|
58
|
+
},
|
|
59
|
+
}),
|
|
60
|
+
provide({
|
|
61
|
+
provide: ENV_USED_TOKEN,
|
|
62
|
+
useValue: [
|
|
63
|
+
{ key: 'HTTP_CLIENT_CACHE_DISABLED', optional: true, dehydrate: false },
|
|
64
|
+
{ key: 'HTTP_CLIENT_CIRCUIT_BREAKER_DISABLED', optional: true, dehydrate: false },
|
|
65
|
+
],
|
|
66
|
+
}),
|
|
67
|
+
/**
|
|
68
|
+
* хранилище для экземпляров @tinkoff/request
|
|
69
|
+
*
|
|
70
|
+
* требуется хранить экземпляры в единственном виде,
|
|
71
|
+
* т.к. многие плагины @tinkoff/request после инициализации имеют состояние
|
|
72
|
+
* (cache, circuit breaker), и не будут корректно работать на сервере,
|
|
73
|
+
* если создавать новые экземпляры на Scope.REQUEST
|
|
74
|
+
*/
|
|
75
|
+
provide({
|
|
76
|
+
provide: 'makeRequestRegistry',
|
|
77
|
+
scope: Scope.SINGLETON,
|
|
78
|
+
useFactory: () => new Map(),
|
|
79
|
+
}),
|
|
80
|
+
/**
|
|
81
|
+
* `CREATE_CACHE_TOKEN` имеет проверку, если токен используется провайдером,
|
|
82
|
+
* который имеет Scope.SINGLETON, то инстанс кэша сохраняется в общее хранилище,
|
|
83
|
+
* и доступен для очистки через `/papi/clear-cache`.
|
|
84
|
+
* Scope.REQUEST игнорируется, т.к. это верная утечка памяти,
|
|
85
|
+
* инстансов кэши было бы неограниченное количество.
|
|
86
|
+
*
|
|
87
|
+
* HTTP клиенты создаются со Scope.REQUEST, но инстансы @tinkoff/request
|
|
88
|
+
* (и соответственно кэшей) создаются только один раз, благодаря `makeRequestRegistry`.
|
|
89
|
+
* это гарантирует отсутствие утечек памяти, поэтому мы обходим проверку
|
|
90
|
+
* на Scope.SINGLETON c помощью обертки `createCacheToken`
|
|
91
|
+
*/
|
|
92
|
+
provide({
|
|
93
|
+
provide: createCacheToken,
|
|
94
|
+
scope: Scope.SINGLETON,
|
|
95
|
+
useFactory: ({ createCache }) => {
|
|
96
|
+
return createCache;
|
|
97
|
+
},
|
|
98
|
+
deps: {
|
|
99
|
+
createCache: CREATE_CACHE_TOKEN,
|
|
100
|
+
},
|
|
101
|
+
}),
|
|
102
|
+
provide({
|
|
103
|
+
provide: API_CLIENT_PASS_HEADERS,
|
|
104
|
+
useValue: ['x-request-id'],
|
|
105
|
+
}),
|
|
106
|
+
];
|
|
107
|
+
|
|
108
|
+
export { providers };
|
package/lib/shared.d.ts
ADDED
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
export declare const providers: (import("@tinkoff/dippy/lib/Provider").ValueProvider<((options: import("@tramvai/tokens-http-client").HttpClientFactoryOptions) => import("@tramvai/http-client").HttpClient) & {
|
|
2
|
+
__type?: "base token" | undefined;
|
|
3
|
+
}> | import("@tinkoff/dippy/lib/Provider").ClassProviderWithDeps<{
|
|
4
|
+
logger: import("@tramvai/tokens-common").Logger & ((configOrName: string | {
|
|
5
|
+
[key: string]: any;
|
|
6
|
+
name: string;
|
|
7
|
+
}) => import("@tramvai/tokens-common").Logger) & {
|
|
8
|
+
__type?: "base token" | undefined;
|
|
9
|
+
};
|
|
10
|
+
envManager: import("@tramvai/tokens-common").EnvironmentManager & {
|
|
11
|
+
__type?: "base token" | undefined;
|
|
12
|
+
};
|
|
13
|
+
appInfo: {
|
|
14
|
+
[key: string]: string;
|
|
15
|
+
appName: string;
|
|
16
|
+
} & {
|
|
17
|
+
__type?: "base token" | undefined;
|
|
18
|
+
};
|
|
19
|
+
createCache: import("@tramvai/tokens-common").CacheFactory & {
|
|
20
|
+
__type?: "base token" | undefined;
|
|
21
|
+
} & {
|
|
22
|
+
__type?: "base token" | undefined;
|
|
23
|
+
};
|
|
24
|
+
makeRequestRegistry: string;
|
|
25
|
+
requestManager: {
|
|
26
|
+
token: import("@tramvai/tokens-common").RequestManager & {
|
|
27
|
+
__type?: "base token" | undefined;
|
|
28
|
+
};
|
|
29
|
+
optional: boolean;
|
|
30
|
+
};
|
|
31
|
+
headersList: {
|
|
32
|
+
token: (string & {
|
|
33
|
+
__type?: "multi token" | undefined;
|
|
34
|
+
}) | (string[] & {
|
|
35
|
+
__type?: "multi token" | undefined;
|
|
36
|
+
});
|
|
37
|
+
optional: boolean;
|
|
38
|
+
};
|
|
39
|
+
agent: {
|
|
40
|
+
token: {
|
|
41
|
+
http: import("undici/types/agent").default;
|
|
42
|
+
https: import("undici/types/agent").default;
|
|
43
|
+
} & {
|
|
44
|
+
__type?: "base token" | undefined;
|
|
45
|
+
};
|
|
46
|
+
optional: boolean;
|
|
47
|
+
};
|
|
48
|
+
disableCircuitBreaker: {
|
|
49
|
+
token: (false & {
|
|
50
|
+
__type?: "base token" | undefined;
|
|
51
|
+
}) | (true & {
|
|
52
|
+
__type?: "base token" | undefined;
|
|
53
|
+
});
|
|
54
|
+
optional: boolean;
|
|
55
|
+
};
|
|
56
|
+
defaultOptions: {
|
|
57
|
+
token: Partial<import("@tramvai/tokens-http-client").HttpClientFactoryOptions> & {
|
|
58
|
+
__type?: "base token" | undefined;
|
|
59
|
+
};
|
|
60
|
+
optional: boolean;
|
|
61
|
+
};
|
|
62
|
+
defaultInterceptors: {
|
|
63
|
+
token: import("@tramvai/http-client").HttpClientInterceptor & {
|
|
64
|
+
__type?: "multi token" | undefined;
|
|
65
|
+
};
|
|
66
|
+
optional: boolean;
|
|
67
|
+
};
|
|
68
|
+
commandLineExecutionContext: {
|
|
69
|
+
token: (() => import("@tramvai/tokens-common").ExecutionContext | null) & {
|
|
70
|
+
__type?: "base token" | undefined;
|
|
71
|
+
};
|
|
72
|
+
optional: boolean;
|
|
73
|
+
};
|
|
74
|
+
}, ((options: import("@tramvai/tokens-http-client").HttpClientFactoryOptions) => import("@tramvai/http-client").HttpClient) & {
|
|
75
|
+
__type?: "base token" | undefined;
|
|
76
|
+
}> | import("@tinkoff/dippy/lib/Provider").ClassProviderWithoutDeps<((options: import("@tramvai/tokens-http-client").HttpClientFactoryOptions) => import("@tramvai/http-client").HttpClient) & {
|
|
77
|
+
__type?: "base token" | undefined;
|
|
78
|
+
}> | import("@tinkoff/dippy/lib/Provider").FactoryProviderWithDeps<{
|
|
79
|
+
logger: import("@tramvai/tokens-common").Logger & ((configOrName: string | {
|
|
80
|
+
[key: string]: any;
|
|
81
|
+
name: string;
|
|
82
|
+
}) => import("@tramvai/tokens-common").Logger) & {
|
|
83
|
+
__type?: "base token" | undefined;
|
|
84
|
+
};
|
|
85
|
+
envManager: import("@tramvai/tokens-common").EnvironmentManager & {
|
|
86
|
+
__type?: "base token" | undefined;
|
|
87
|
+
};
|
|
88
|
+
appInfo: {
|
|
89
|
+
[key: string]: string;
|
|
90
|
+
appName: string;
|
|
91
|
+
} & {
|
|
92
|
+
__type?: "base token" | undefined;
|
|
93
|
+
};
|
|
94
|
+
createCache: import("@tramvai/tokens-common").CacheFactory & {
|
|
95
|
+
__type?: "base token" | undefined;
|
|
96
|
+
} & {
|
|
97
|
+
__type?: "base token" | undefined;
|
|
98
|
+
};
|
|
99
|
+
makeRequestRegistry: string;
|
|
100
|
+
requestManager: {
|
|
101
|
+
token: import("@tramvai/tokens-common").RequestManager & {
|
|
102
|
+
__type?: "base token" | undefined;
|
|
103
|
+
};
|
|
104
|
+
optional: boolean;
|
|
105
|
+
};
|
|
106
|
+
headersList: {
|
|
107
|
+
token: (string & {
|
|
108
|
+
__type?: "multi token" | undefined;
|
|
109
|
+
}) | (string[] & {
|
|
110
|
+
__type?: "multi token" | undefined;
|
|
111
|
+
});
|
|
112
|
+
optional: boolean;
|
|
113
|
+
};
|
|
114
|
+
agent: {
|
|
115
|
+
token: {
|
|
116
|
+
http: import("undici/types/agent").default;
|
|
117
|
+
https: import("undici/types/agent").default;
|
|
118
|
+
} & {
|
|
119
|
+
__type?: "base token" | undefined;
|
|
120
|
+
};
|
|
121
|
+
optional: boolean;
|
|
122
|
+
};
|
|
123
|
+
disableCircuitBreaker: {
|
|
124
|
+
token: (false & {
|
|
125
|
+
__type?: "base token" | undefined;
|
|
126
|
+
}) | (true & {
|
|
127
|
+
__type?: "base token" | undefined;
|
|
128
|
+
});
|
|
129
|
+
optional: boolean;
|
|
130
|
+
};
|
|
131
|
+
defaultOptions: {
|
|
132
|
+
token: Partial<import("@tramvai/tokens-http-client").HttpClientFactoryOptions> & {
|
|
133
|
+
__type?: "base token" | undefined;
|
|
134
|
+
};
|
|
135
|
+
optional: boolean;
|
|
136
|
+
};
|
|
137
|
+
defaultInterceptors: {
|
|
138
|
+
token: import("@tramvai/http-client").HttpClientInterceptor & {
|
|
139
|
+
__type?: "multi token" | undefined;
|
|
140
|
+
};
|
|
141
|
+
optional: boolean;
|
|
142
|
+
};
|
|
143
|
+
commandLineExecutionContext: {
|
|
144
|
+
token: (() => import("@tramvai/tokens-common").ExecutionContext | null) & {
|
|
145
|
+
__type?: "base token" | undefined;
|
|
146
|
+
};
|
|
147
|
+
optional: boolean;
|
|
148
|
+
};
|
|
149
|
+
}, ((options: import("@tramvai/tokens-http-client").HttpClientFactoryOptions) => import("@tramvai/http-client").HttpClient) & {
|
|
150
|
+
__type?: "base token" | undefined;
|
|
151
|
+
}> | import("@tinkoff/dippy/lib/Provider").FactoryProviderWithoutDeps<((options: import("@tramvai/tokens-http-client").HttpClientFactoryOptions) => import("@tramvai/http-client").HttpClient) & {
|
|
152
|
+
__type?: "base token" | undefined;
|
|
153
|
+
}> | import("@tinkoff/dippy/lib/Provider").ValueProvider<import("@tramvai/http-client").HttpClient & {
|
|
154
|
+
__type?: "base token" | undefined;
|
|
155
|
+
}> | import("@tinkoff/dippy/lib/Provider").ClassProviderWithDeps<{
|
|
156
|
+
factory: ((options: import("@tramvai/tokens-http-client").HttpClientFactoryOptions) => import("@tramvai/http-client").HttpClient) & {
|
|
157
|
+
__type?: "base token" | undefined;
|
|
158
|
+
};
|
|
159
|
+
}, import("@tramvai/http-client").HttpClient & {
|
|
160
|
+
__type?: "base token" | undefined;
|
|
161
|
+
}> | import("@tinkoff/dippy/lib/Provider").ClassProviderWithoutDeps<import("@tramvai/http-client").HttpClient & {
|
|
162
|
+
__type?: "base token" | undefined;
|
|
163
|
+
}> | import("@tinkoff/dippy/lib/Provider").FactoryProviderWithDeps<{
|
|
164
|
+
factory: ((options: import("@tramvai/tokens-http-client").HttpClientFactoryOptions) => import("@tramvai/http-client").HttpClient) & {
|
|
165
|
+
__type?: "base token" | undefined;
|
|
166
|
+
};
|
|
167
|
+
}, import("@tramvai/http-client").HttpClient & {
|
|
168
|
+
__type?: "base token" | undefined;
|
|
169
|
+
}> | import("@tinkoff/dippy/lib/Provider").FactoryProviderWithoutDeps<import("@tramvai/http-client").HttpClient & {
|
|
170
|
+
__type?: "base token" | undefined;
|
|
171
|
+
}> | import("@tinkoff/dippy/lib/Provider").ValueProvider<import("@tramvai/tokens-common").EnvParameter[] & {
|
|
172
|
+
__type?: "multi token" | undefined;
|
|
173
|
+
}> | import("@tinkoff/dippy/lib/Provider").ClassProviderWithoutDeps<import("@tramvai/tokens-common").EnvParameter[] & {
|
|
174
|
+
__type?: "multi token" | undefined;
|
|
175
|
+
}> | import("@tinkoff/dippy/lib/Provider").FactoryProviderWithoutDeps<import("@tramvai/tokens-common").EnvParameter[] & {
|
|
176
|
+
__type?: "multi token" | undefined;
|
|
177
|
+
}> | import("@tinkoff/dippy/lib/Provider").ValueProvider<string> | import("@tinkoff/dippy/lib/Provider").ClassProviderWithDeps<unknown, string> | import("@tinkoff/dippy/lib/Provider").ClassProviderWithoutDeps<string> | import("@tinkoff/dippy/lib/Provider").FactoryProviderWithDeps<unknown, string> | import("@tinkoff/dippy/lib/Provider").FactoryProviderWithoutDeps<string> | import("@tinkoff/dippy/lib/Provider").ValueProvider<import("@tramvai/tokens-common").CacheFactory & {
|
|
178
|
+
__type?: "base token" | undefined;
|
|
179
|
+
} & {
|
|
180
|
+
__type?: "base token" | undefined;
|
|
181
|
+
}> | import("@tinkoff/dippy/lib/Provider").ClassProviderWithDeps<{
|
|
182
|
+
createCache: import("@tramvai/tokens-common").CacheFactory & {
|
|
183
|
+
__type?: "base token" | undefined;
|
|
184
|
+
};
|
|
185
|
+
}, import("@tramvai/tokens-common").CacheFactory & {
|
|
186
|
+
__type?: "base token" | undefined;
|
|
187
|
+
} & {
|
|
188
|
+
__type?: "base token" | undefined;
|
|
189
|
+
}> | import("@tinkoff/dippy/lib/Provider").ClassProviderWithoutDeps<import("@tramvai/tokens-common").CacheFactory & {
|
|
190
|
+
__type?: "base token" | undefined;
|
|
191
|
+
} & {
|
|
192
|
+
__type?: "base token" | undefined;
|
|
193
|
+
}> | import("@tinkoff/dippy/lib/Provider").FactoryProviderWithDeps<{
|
|
194
|
+
createCache: import("@tramvai/tokens-common").CacheFactory & {
|
|
195
|
+
__type?: "base token" | undefined;
|
|
196
|
+
};
|
|
197
|
+
}, import("@tramvai/tokens-common").CacheFactory & {
|
|
198
|
+
__type?: "base token" | undefined;
|
|
199
|
+
} & {
|
|
200
|
+
__type?: "base token" | undefined;
|
|
201
|
+
}> | import("@tinkoff/dippy/lib/Provider").FactoryProviderWithoutDeps<import("@tramvai/tokens-common").CacheFactory & {
|
|
202
|
+
__type?: "base token" | undefined;
|
|
203
|
+
} & {
|
|
204
|
+
__type?: "base token" | undefined;
|
|
205
|
+
}> | import("@tinkoff/dippy/lib/Provider").ValueProvider<(string & {
|
|
206
|
+
__type?: "multi token" | undefined;
|
|
207
|
+
}) | (string[] & {
|
|
208
|
+
__type?: "multi token" | undefined;
|
|
209
|
+
})> | import("@tinkoff/dippy/lib/Provider").ClassProviderWithoutDeps<(string & {
|
|
210
|
+
__type?: "multi token" | undefined;
|
|
211
|
+
}) | (string[] & {
|
|
212
|
+
__type?: "multi token" | undefined;
|
|
213
|
+
})> | import("@tinkoff/dippy/lib/Provider").FactoryProviderWithoutDeps<(string & {
|
|
214
|
+
__type?: "multi token" | undefined;
|
|
215
|
+
}) | (string[] & {
|
|
216
|
+
__type?: "multi token" | undefined;
|
|
217
|
+
})>)[];
|
|
218
|
+
//# sourceMappingURL=shared.d.ts.map
|
package/lib/shared.es.js
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { createToken } from '@tinkoff/dippy';
|
|
2
|
+
import { provide, APP_INFO_TOKEN, Scope } from '@tramvai/core';
|
|
3
|
+
import { HTTP_CLIENT_FACTORY, API_CLIENT_PASS_HEADERS, HTTP_CLIENT_AGENT, DISABLE_CIRCUIT_BREAKER, DEFAULT_HTTP_CLIENT_FACTORY_OPTIONS, DEFAULT_HTTP_CLIENT_INTERCEPTORS, HTTP_CLIENT } from '@tramvai/tokens-http-client';
|
|
4
|
+
import { LOGGER_TOKEN, ENV_MANAGER_TOKEN, REQUEST_MANAGER_TOKEN, COMMAND_LINE_EXECUTION_CONTEXT_TOKEN, ENV_USED_TOKEN, CREATE_CACHE_TOKEN } from '@tramvai/tokens-common';
|
|
5
|
+
import { httpClientFactory } from './httpClient/httpClientFactory.es.js';
|
|
6
|
+
|
|
7
|
+
const createCacheToken = createToken('httpClient createCache');
|
|
8
|
+
const providers = [
|
|
9
|
+
provide({
|
|
10
|
+
provide: HTTP_CLIENT_FACTORY,
|
|
11
|
+
useFactory: httpClientFactory,
|
|
12
|
+
deps: {
|
|
13
|
+
logger: LOGGER_TOKEN,
|
|
14
|
+
envManager: ENV_MANAGER_TOKEN,
|
|
15
|
+
appInfo: APP_INFO_TOKEN,
|
|
16
|
+
createCache: createCacheToken,
|
|
17
|
+
makeRequestRegistry: 'makeRequestRegistry',
|
|
18
|
+
requestManager: {
|
|
19
|
+
token: REQUEST_MANAGER_TOKEN,
|
|
20
|
+
optional: true,
|
|
21
|
+
},
|
|
22
|
+
headersList: {
|
|
23
|
+
token: API_CLIENT_PASS_HEADERS,
|
|
24
|
+
optional: true,
|
|
25
|
+
},
|
|
26
|
+
agent: {
|
|
27
|
+
token: HTTP_CLIENT_AGENT,
|
|
28
|
+
optional: true,
|
|
29
|
+
},
|
|
30
|
+
disableCircuitBreaker: {
|
|
31
|
+
token: DISABLE_CIRCUIT_BREAKER,
|
|
32
|
+
optional: true,
|
|
33
|
+
},
|
|
34
|
+
defaultOptions: {
|
|
35
|
+
token: DEFAULT_HTTP_CLIENT_FACTORY_OPTIONS,
|
|
36
|
+
optional: true,
|
|
37
|
+
},
|
|
38
|
+
defaultInterceptors: {
|
|
39
|
+
token: DEFAULT_HTTP_CLIENT_INTERCEPTORS,
|
|
40
|
+
optional: true,
|
|
41
|
+
},
|
|
42
|
+
commandLineExecutionContext: {
|
|
43
|
+
token: COMMAND_LINE_EXECUTION_CONTEXT_TOKEN,
|
|
44
|
+
optional: true,
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
}),
|
|
48
|
+
provide({
|
|
49
|
+
provide: HTTP_CLIENT,
|
|
50
|
+
useFactory: ({ factory }) => {
|
|
51
|
+
return factory({
|
|
52
|
+
name: 'http-client',
|
|
53
|
+
enableCircuitBreaker: false,
|
|
54
|
+
});
|
|
55
|
+
},
|
|
56
|
+
deps: {
|
|
57
|
+
factory: HTTP_CLIENT_FACTORY,
|
|
58
|
+
},
|
|
59
|
+
}),
|
|
60
|
+
provide({
|
|
61
|
+
provide: ENV_USED_TOKEN,
|
|
62
|
+
useValue: [
|
|
63
|
+
{ key: 'HTTP_CLIENT_CACHE_DISABLED', optional: true, dehydrate: false },
|
|
64
|
+
{ key: 'HTTP_CLIENT_CIRCUIT_BREAKER_DISABLED', optional: true, dehydrate: false },
|
|
65
|
+
],
|
|
66
|
+
}),
|
|
67
|
+
/**
|
|
68
|
+
* хранилище для экземпляров @tinkoff/request
|
|
69
|
+
*
|
|
70
|
+
* требуется хранить экземпляры в единственном виде,
|
|
71
|
+
* т.к. многие плагины @tinkoff/request после инициализации имеют состояние
|
|
72
|
+
* (cache, circuit breaker), и не будут корректно работать на сервере,
|
|
73
|
+
* если создавать новые экземпляры на Scope.REQUEST
|
|
74
|
+
*/
|
|
75
|
+
provide({
|
|
76
|
+
provide: 'makeRequestRegistry',
|
|
77
|
+
scope: Scope.SINGLETON,
|
|
78
|
+
useFactory: () => new Map(),
|
|
79
|
+
}),
|
|
80
|
+
/**
|
|
81
|
+
* `CREATE_CACHE_TOKEN` имеет проверку, если токен используется провайдером,
|
|
82
|
+
* который имеет Scope.SINGLETON, то инстанс кэша сохраняется в общее хранилище,
|
|
83
|
+
* и доступен для очистки через `/papi/clear-cache`.
|
|
84
|
+
* Scope.REQUEST игнорируется, т.к. это верная утечка памяти,
|
|
85
|
+
* инстансов кэши было бы неограниченное количество.
|
|
86
|
+
*
|
|
87
|
+
* HTTP клиенты создаются со Scope.REQUEST, но инстансы @tinkoff/request
|
|
88
|
+
* (и соответственно кэшей) создаются только один раз, благодаря `makeRequestRegistry`.
|
|
89
|
+
* это гарантирует отсутствие утечек памяти, поэтому мы обходим проверку
|
|
90
|
+
* на Scope.SINGLETON c помощью обертки `createCacheToken`
|
|
91
|
+
*/
|
|
92
|
+
provide({
|
|
93
|
+
provide: createCacheToken,
|
|
94
|
+
scope: Scope.SINGLETON,
|
|
95
|
+
useFactory: ({ createCache }) => {
|
|
96
|
+
return createCache;
|
|
97
|
+
},
|
|
98
|
+
deps: {
|
|
99
|
+
createCache: CREATE_CACHE_TOKEN,
|
|
100
|
+
},
|
|
101
|
+
}),
|
|
102
|
+
provide({
|
|
103
|
+
provide: API_CLIENT_PASS_HEADERS,
|
|
104
|
+
useValue: ['x-request-id'],
|
|
105
|
+
}),
|
|
106
|
+
];
|
|
107
|
+
|
|
108
|
+
export { providers };
|
package/lib/shared.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var dippy = require('@tinkoff/dippy');
|
|
6
|
+
var core = require('@tramvai/core');
|
|
7
|
+
var tokensHttpClient = require('@tramvai/tokens-http-client');
|
|
8
|
+
var tokensCommon = require('@tramvai/tokens-common');
|
|
9
|
+
var httpClientFactory = require('./httpClient/httpClientFactory.js');
|
|
10
|
+
|
|
11
|
+
const createCacheToken = dippy.createToken('httpClient createCache');
|
|
12
|
+
const providers = [
|
|
13
|
+
core.provide({
|
|
14
|
+
provide: tokensHttpClient.HTTP_CLIENT_FACTORY,
|
|
15
|
+
useFactory: httpClientFactory.httpClientFactory,
|
|
16
|
+
deps: {
|
|
17
|
+
logger: tokensCommon.LOGGER_TOKEN,
|
|
18
|
+
envManager: tokensCommon.ENV_MANAGER_TOKEN,
|
|
19
|
+
appInfo: core.APP_INFO_TOKEN,
|
|
20
|
+
createCache: createCacheToken,
|
|
21
|
+
makeRequestRegistry: 'makeRequestRegistry',
|
|
22
|
+
requestManager: {
|
|
23
|
+
token: tokensCommon.REQUEST_MANAGER_TOKEN,
|
|
24
|
+
optional: true,
|
|
25
|
+
},
|
|
26
|
+
headersList: {
|
|
27
|
+
token: tokensHttpClient.API_CLIENT_PASS_HEADERS,
|
|
28
|
+
optional: true,
|
|
29
|
+
},
|
|
30
|
+
agent: {
|
|
31
|
+
token: tokensHttpClient.HTTP_CLIENT_AGENT,
|
|
32
|
+
optional: true,
|
|
33
|
+
},
|
|
34
|
+
disableCircuitBreaker: {
|
|
35
|
+
token: tokensHttpClient.DISABLE_CIRCUIT_BREAKER,
|
|
36
|
+
optional: true,
|
|
37
|
+
},
|
|
38
|
+
defaultOptions: {
|
|
39
|
+
token: tokensHttpClient.DEFAULT_HTTP_CLIENT_FACTORY_OPTIONS,
|
|
40
|
+
optional: true,
|
|
41
|
+
},
|
|
42
|
+
defaultInterceptors: {
|
|
43
|
+
token: tokensHttpClient.DEFAULT_HTTP_CLIENT_INTERCEPTORS,
|
|
44
|
+
optional: true,
|
|
45
|
+
},
|
|
46
|
+
commandLineExecutionContext: {
|
|
47
|
+
token: tokensCommon.COMMAND_LINE_EXECUTION_CONTEXT_TOKEN,
|
|
48
|
+
optional: true,
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
}),
|
|
52
|
+
core.provide({
|
|
53
|
+
provide: tokensHttpClient.HTTP_CLIENT,
|
|
54
|
+
useFactory: ({ factory }) => {
|
|
55
|
+
return factory({
|
|
56
|
+
name: 'http-client',
|
|
57
|
+
enableCircuitBreaker: false,
|
|
58
|
+
});
|
|
59
|
+
},
|
|
60
|
+
deps: {
|
|
61
|
+
factory: tokensHttpClient.HTTP_CLIENT_FACTORY,
|
|
62
|
+
},
|
|
63
|
+
}),
|
|
64
|
+
core.provide({
|
|
65
|
+
provide: tokensCommon.ENV_USED_TOKEN,
|
|
66
|
+
useValue: [
|
|
67
|
+
{ key: 'HTTP_CLIENT_CACHE_DISABLED', optional: true, dehydrate: false },
|
|
68
|
+
{ key: 'HTTP_CLIENT_CIRCUIT_BREAKER_DISABLED', optional: true, dehydrate: false },
|
|
69
|
+
],
|
|
70
|
+
}),
|
|
71
|
+
/**
|
|
72
|
+
* хранилище для экземпляров @tinkoff/request
|
|
73
|
+
*
|
|
74
|
+
* требуется хранить экземпляры в единственном виде,
|
|
75
|
+
* т.к. многие плагины @tinkoff/request после инициализации имеют состояние
|
|
76
|
+
* (cache, circuit breaker), и не будут корректно работать на сервере,
|
|
77
|
+
* если создавать новые экземпляры на Scope.REQUEST
|
|
78
|
+
*/
|
|
79
|
+
core.provide({
|
|
80
|
+
provide: 'makeRequestRegistry',
|
|
81
|
+
scope: core.Scope.SINGLETON,
|
|
82
|
+
useFactory: () => new Map(),
|
|
83
|
+
}),
|
|
84
|
+
/**
|
|
85
|
+
* `CREATE_CACHE_TOKEN` имеет проверку, если токен используется провайдером,
|
|
86
|
+
* который имеет Scope.SINGLETON, то инстанс кэша сохраняется в общее хранилище,
|
|
87
|
+
* и доступен для очистки через `/papi/clear-cache`.
|
|
88
|
+
* Scope.REQUEST игнорируется, т.к. это верная утечка памяти,
|
|
89
|
+
* инстансов кэши было бы неограниченное количество.
|
|
90
|
+
*
|
|
91
|
+
* HTTP клиенты создаются со Scope.REQUEST, но инстансы @tinkoff/request
|
|
92
|
+
* (и соответственно кэшей) создаются только один раз, благодаря `makeRequestRegistry`.
|
|
93
|
+
* это гарантирует отсутствие утечек памяти, поэтому мы обходим проверку
|
|
94
|
+
* на Scope.SINGLETON c помощью обертки `createCacheToken`
|
|
95
|
+
*/
|
|
96
|
+
core.provide({
|
|
97
|
+
provide: createCacheToken,
|
|
98
|
+
scope: core.Scope.SINGLETON,
|
|
99
|
+
useFactory: ({ createCache }) => {
|
|
100
|
+
return createCache;
|
|
101
|
+
},
|
|
102
|
+
deps: {
|
|
103
|
+
createCache: tokensCommon.CREATE_CACHE_TOKEN,
|
|
104
|
+
},
|
|
105
|
+
}),
|
|
106
|
+
core.provide({
|
|
107
|
+
provide: tokensHttpClient.API_CLIENT_PASS_HEADERS,
|
|
108
|
+
useValue: ['x-request-id'],
|
|
109
|
+
}),
|
|
110
|
+
];
|
|
111
|
+
|
|
112
|
+
exports.providers = providers;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
/// <reference types="jest" />
|
|
2
|
-
import fetch from 'node-fetch';
|
|
3
2
|
import { getDiWrapper } from '@tramvai/test-helpers';
|
|
4
3
|
import type { createMockEnvManager } from '@tramvai/test-mocks';
|
|
5
4
|
type Options = Parameters<typeof getDiWrapper>[0] & {
|
|
@@ -7,8 +6,11 @@ type Options = Parameters<typeof getDiWrapper>[0] & {
|
|
|
7
6
|
};
|
|
8
7
|
export declare const testApi: (options: Options) => {
|
|
9
8
|
di: import("@tinkoff/dippy").Container;
|
|
10
|
-
fetchMock: jest.Mock<
|
|
11
|
-
mockJsonResponse: (body: Record<string, any>,
|
|
9
|
+
fetchMock: jest.Mock<any, any, any>;
|
|
10
|
+
mockJsonResponse: (body: Record<string, any>, { status, headers }?: {
|
|
11
|
+
status?: number | undefined;
|
|
12
|
+
headers?: Record<string, string> | undefined;
|
|
13
|
+
}) => Promise<void>;
|
|
12
14
|
clearCaches: () => void;
|
|
13
15
|
};
|
|
14
16
|
export {};
|
package/package.json
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tramvai/module-http-client",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.65.0",
|
|
4
4
|
"initialVersion": "0.58.99",
|
|
5
5
|
"description": "",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=20.18.1"
|
|
8
|
+
},
|
|
6
9
|
"main": "lib/index.js",
|
|
7
10
|
"typings": "lib/index.d.ts",
|
|
8
11
|
"browser": {
|
|
@@ -26,27 +29,26 @@
|
|
|
26
29
|
},
|
|
27
30
|
"dependencies": {
|
|
28
31
|
"@tramvai/http-client": "0.6.0",
|
|
29
|
-
"@tramvai/tinkoff-request-http-client-adapter": "0.13.
|
|
30
|
-
"@tramvai/tokens-common": "6.
|
|
31
|
-
"@tramvai/tokens-http-client": "6.
|
|
32
|
-
"@tramvai/tokens-server": "6.
|
|
33
|
-
"@tramvai/tokens-server-private": "6.
|
|
32
|
+
"@tramvai/tinkoff-request-http-client-adapter": "0.13.110",
|
|
33
|
+
"@tramvai/tokens-common": "6.65.0",
|
|
34
|
+
"@tramvai/tokens-http-client": "6.65.0",
|
|
35
|
+
"@tramvai/tokens-server": "6.65.0",
|
|
36
|
+
"@tramvai/tokens-server-private": "6.65.0",
|
|
37
|
+
"undici": "^7.16.0"
|
|
34
38
|
},
|
|
35
39
|
"devDependencies": {
|
|
36
40
|
"@tinkoff/request-core": "^0.10.0",
|
|
37
|
-
"@tinkoff/request-plugin-protocol-http": "
|
|
38
|
-
"@types/node-fetch": "^2.6.2"
|
|
41
|
+
"@tinkoff/request-plugin-protocol-http": "0.15.0"
|
|
39
42
|
},
|
|
40
43
|
"peerDependencies": {
|
|
41
44
|
"@tinkoff/dippy": "0.12.3",
|
|
42
45
|
"@tinkoff/utils": "^2.1.2",
|
|
43
|
-
"@tramvai/core": "6.
|
|
44
|
-
"@tramvai/module-common": "6.
|
|
45
|
-
"@tramvai/papi": "6.
|
|
46
|
-
"@tramvai/test-helpers": "6.
|
|
47
|
-
"@tramvai/test-mocks": "6.
|
|
48
|
-
"@tramvai/test-unit": "6.
|
|
49
|
-
"node-fetch": "^2.6.1",
|
|
46
|
+
"@tramvai/core": "6.65.0",
|
|
47
|
+
"@tramvai/module-common": "6.65.0",
|
|
48
|
+
"@tramvai/papi": "6.65.0",
|
|
49
|
+
"@tramvai/test-helpers": "6.65.0",
|
|
50
|
+
"@tramvai/test-mocks": "6.65.0",
|
|
51
|
+
"@tramvai/test-unit": "6.65.0",
|
|
50
52
|
"tslib": "^2.4.0"
|
|
51
53
|
},
|
|
52
54
|
"license": "Apache-2.0",
|
package/tests.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
/// <reference types="jest" />
|
|
2
|
-
import fetch from "node-fetch";
|
|
3
2
|
import { getDiWrapper } from "@tramvai/test-helpers";
|
|
4
3
|
import { createMockEnvManager } from "@tramvai/test-mocks";
|
|
5
4
|
type Options = Parameters<typeof getDiWrapper>[0] & {
|
|
@@ -7,11 +6,11 @@ type Options = Parameters<typeof getDiWrapper>[0] & {
|
|
|
7
6
|
};
|
|
8
7
|
declare const testApi: (options: Options) => {
|
|
9
8
|
di: import("@tinkoff/dippy").Container;
|
|
10
|
-
fetchMock: jest.Mock<
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
fetchMock: jest.Mock<any, any, any>;
|
|
10
|
+
mockJsonResponse: (body: Record<string, any>, { status, headers }?: {
|
|
11
|
+
status?: number | undefined;
|
|
12
|
+
headers?: Record<string, string> | undefined;
|
|
13
|
+
}) => Promise<void>;
|
|
15
14
|
clearCaches: () => void;
|
|
16
15
|
};
|
|
17
16
|
export { testApi };
|