@tramvai/module-http-client 2.70.1 → 2.72.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,16 @@
1
+ const createUserAgent = ({ appInfo, envManager, }) => {
2
+ const { appName } = appInfo;
3
+ const appVersion = envManager.get('APP_VERSION');
4
+ const appRelease = envManager.get('APP_RELEASE');
5
+ const userAgent = [
6
+ 'tramvai',
7
+ appName,
8
+ appVersion && `version ${appVersion}`,
9
+ appRelease && `release ${appRelease}`,
10
+ ]
11
+ .filter(Boolean)
12
+ .join(' ');
13
+ return userAgent;
14
+ };
15
+
16
+ export { createUserAgent };
@@ -0,0 +1,16 @@
1
+ const createUserAgent = ({ appInfo, envManager, }) => {
2
+ const { appName } = appInfo;
3
+ const appVersion = envManager.get('APP_VERSION');
4
+ const appRelease = envManager.get('APP_RELEASE');
5
+ const userAgent = [
6
+ 'tramvai',
7
+ appName,
8
+ appVersion && `version ${appVersion}`,
9
+ appRelease && `release ${appRelease}`,
10
+ ]
11
+ .filter(Boolean)
12
+ .join(' ');
13
+ return userAgent;
14
+ };
15
+
16
+ export { createUserAgent };
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ const createUserAgent = ({ appInfo, envManager, }) => {
6
+ const { appName } = appInfo;
7
+ const appVersion = envManager.get('APP_VERSION');
8
+ const appRelease = envManager.get('APP_RELEASE');
9
+ const userAgent = [
10
+ 'tramvai',
11
+ appName,
12
+ appVersion && `version ${appVersion}`,
13
+ appRelease && `release ${appRelease}`,
14
+ ]
15
+ .filter(Boolean)
16
+ .join(' ');
17
+ return userAgent;
18
+ };
19
+
20
+ exports.createUserAgent = createUserAgent;
@@ -0,0 +1,72 @@
1
+ import isNil from '@tinkoff/utils/is/nil';
2
+ import compose from '@tinkoff/utils/function/compose';
3
+ import { mergeOptions, createTinkoffRequest, HttpClientAdapter } from '@tramvai/tinkoff-request-http-client-adapter';
4
+ import { fillHeaderIp, fillHeaders } from '../utils/fillHeaders.browser.browser.js';
5
+ import { createUserAgent } from './createUserAgent.browser.js';
6
+
7
+ const environmentDependentOptions = typeof window === 'undefined'
8
+ ? {
9
+ defaultTimeout: 2000,
10
+ }
11
+ : {
12
+ defaultTimeout: 30000,
13
+ };
14
+ const httpClientFactory = ({ logger, envManager, appInfo, requestManager, headersList, createCache, makeRequestRegistry, agent, querySerializer, disableCircuitBreaker = false, defaultOptions, commandLineExecutionContext, }) => {
15
+ return (options) => {
16
+ var _a;
17
+ if (!options.name) {
18
+ throw Error(`You need to pass a unique field "name" for the HTTP client instance`);
19
+ }
20
+ const forceDisableCache = envManager.get('HTTP_CLIENT_CACHE_DISABLED');
21
+ const forceDisabledCircuitBreaker = envManager.get('HTTP_CLIENT_CIRCUIT_BREAKER_DISABLED');
22
+ const adapterOptions = mergeOptions(mergeOptions({
23
+ logger,
24
+ agent,
25
+ querySerializer,
26
+ method: 'GET',
27
+ createCache: createCache
28
+ ? (cacheOptions) => createCache('memory', cacheOptions)
29
+ : undefined,
30
+ modifyRequest: compose(fillHeaderIp(), fillHeaders()),
31
+ circuitBreakerOptions: {
32
+ failureThreshold: 75,
33
+ minimumFailureCount: 10,
34
+ },
35
+ // TODO: remove any after [resolving](https://github.com/southpolesteve/node-abort-controller/issues/31)
36
+ signal: (_a = commandLineExecutionContext === null || commandLineExecutionContext === void 0 ? void 0 : commandLineExecutionContext()) === null || _a === void 0 ? void 0 : _a.abortSignal,
37
+ ...environmentDependentOptions,
38
+ }, defaultOptions !== null && defaultOptions !== void 0 ? defaultOptions : {}), options);
39
+ // по умолчанию, на сервере, библиотека https://github.com/node-fetch/node-fetch
40
+ // отправляет заголовок "User-Agent" вида "node-fetch".
41
+ // для улучшения логов сервисов, в которые делают запросы tramvai приложения,
42
+ // заменяем "User-Agent" на кастомный, содержащий название и версию приложения
43
+ if (typeof window === 'undefined') {
44
+ adapterOptions.headers = {
45
+ 'User-Agent': createUserAgent({ appInfo, envManager }),
46
+ ...adapterOptions.headers,
47
+ };
48
+ }
49
+ if (!isNil(forceDisableCache)) {
50
+ adapterOptions.disableCache = !!forceDisableCache;
51
+ }
52
+ if (disableCircuitBreaker) {
53
+ adapterOptions.enableCircuitBreaker = false;
54
+ }
55
+ // environment variable in priority over disableCircuitBreaker
56
+ if (!isNil(forceDisabledCircuitBreaker)) {
57
+ adapterOptions.enableCircuitBreaker = !forceDisabledCircuitBreaker;
58
+ }
59
+ // кэшируем инстанс @tinkoff/request
60
+ if (!makeRequestRegistry.has(adapterOptions.name)) {
61
+ makeRequestRegistry.set(adapterOptions.name, createTinkoffRequest(adapterOptions));
62
+ }
63
+ const makeRequest = makeRequestRegistry.get(adapterOptions.name);
64
+ const httpClientAdapter = new HttpClientAdapter({
65
+ options: adapterOptions,
66
+ makeRequest,
67
+ });
68
+ return httpClientAdapter;
69
+ };
70
+ };
71
+
72
+ export { httpClientFactory };
@@ -0,0 +1,72 @@
1
+ import isNil from '@tinkoff/utils/is/nil';
2
+ import compose from '@tinkoff/utils/function/compose';
3
+ import { mergeOptions, createTinkoffRequest, HttpClientAdapter } from '@tramvai/tinkoff-request-http-client-adapter';
4
+ import { fillHeaderIp, fillHeaders } from '../utils/fillHeaders.es.js';
5
+ import { createUserAgent } from './createUserAgent.es.js';
6
+
7
+ const environmentDependentOptions = typeof window === 'undefined'
8
+ ? {
9
+ defaultTimeout: 2000,
10
+ }
11
+ : {
12
+ defaultTimeout: 30000,
13
+ };
14
+ const httpClientFactory = ({ logger, envManager, appInfo, requestManager, headersList, createCache, makeRequestRegistry, agent, querySerializer, disableCircuitBreaker = false, defaultOptions, commandLineExecutionContext, }) => {
15
+ return (options) => {
16
+ var _a;
17
+ if (!options.name) {
18
+ throw Error(`You need to pass a unique field "name" for the HTTP client instance`);
19
+ }
20
+ const forceDisableCache = envManager.get('HTTP_CLIENT_CACHE_DISABLED');
21
+ const forceDisabledCircuitBreaker = envManager.get('HTTP_CLIENT_CIRCUIT_BREAKER_DISABLED');
22
+ const adapterOptions = mergeOptions(mergeOptions({
23
+ logger,
24
+ agent,
25
+ querySerializer,
26
+ method: 'GET',
27
+ createCache: createCache
28
+ ? (cacheOptions) => createCache('memory', cacheOptions)
29
+ : undefined,
30
+ modifyRequest: compose(fillHeaderIp({ requestManager }), fillHeaders({ requestManager, headersList })),
31
+ circuitBreakerOptions: {
32
+ failureThreshold: 75,
33
+ minimumFailureCount: 10,
34
+ },
35
+ // TODO: remove any after [resolving](https://github.com/southpolesteve/node-abort-controller/issues/31)
36
+ signal: (_a = commandLineExecutionContext === null || commandLineExecutionContext === void 0 ? void 0 : commandLineExecutionContext()) === null || _a === void 0 ? void 0 : _a.abortSignal,
37
+ ...environmentDependentOptions,
38
+ }, defaultOptions !== null && defaultOptions !== void 0 ? defaultOptions : {}), options);
39
+ // по умолчанию, на сервере, библиотека https://github.com/node-fetch/node-fetch
40
+ // отправляет заголовок "User-Agent" вида "node-fetch".
41
+ // для улучшения логов сервисов, в которые делают запросы tramvai приложения,
42
+ // заменяем "User-Agent" на кастомный, содержащий название и версию приложения
43
+ if (typeof window === 'undefined') {
44
+ adapterOptions.headers = {
45
+ 'User-Agent': createUserAgent({ appInfo, envManager }),
46
+ ...adapterOptions.headers,
47
+ };
48
+ }
49
+ if (!isNil(forceDisableCache)) {
50
+ adapterOptions.disableCache = !!forceDisableCache;
51
+ }
52
+ if (disableCircuitBreaker) {
53
+ adapterOptions.enableCircuitBreaker = false;
54
+ }
55
+ // environment variable in priority over disableCircuitBreaker
56
+ if (!isNil(forceDisabledCircuitBreaker)) {
57
+ adapterOptions.enableCircuitBreaker = !forceDisabledCircuitBreaker;
58
+ }
59
+ // кэшируем инстанс @tinkoff/request
60
+ if (!makeRequestRegistry.has(adapterOptions.name)) {
61
+ makeRequestRegistry.set(adapterOptions.name, createTinkoffRequest(adapterOptions));
62
+ }
63
+ const makeRequest = makeRequestRegistry.get(adapterOptions.name);
64
+ const httpClientAdapter = new HttpClientAdapter({
65
+ options: adapterOptions,
66
+ makeRequest,
67
+ });
68
+ return httpClientAdapter;
69
+ };
70
+ };
71
+
72
+ export { httpClientFactory };
@@ -0,0 +1,81 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var isNil = require('@tinkoff/utils/is/nil');
6
+ var compose = require('@tinkoff/utils/function/compose');
7
+ var tinkoffRequestHttpClientAdapter = require('@tramvai/tinkoff-request-http-client-adapter');
8
+ var fillHeaders = require('../utils/fillHeaders.js');
9
+ var createUserAgent = require('./createUserAgent.js');
10
+
11
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
12
+
13
+ var isNil__default = /*#__PURE__*/_interopDefaultLegacy(isNil);
14
+ var compose__default = /*#__PURE__*/_interopDefaultLegacy(compose);
15
+
16
+ const environmentDependentOptions = typeof window === 'undefined'
17
+ ? {
18
+ defaultTimeout: 2000,
19
+ }
20
+ : {
21
+ defaultTimeout: 30000,
22
+ };
23
+ const httpClientFactory = ({ logger, envManager, appInfo, requestManager, headersList, createCache, makeRequestRegistry, agent, querySerializer, disableCircuitBreaker = false, defaultOptions, commandLineExecutionContext, }) => {
24
+ return (options) => {
25
+ var _a;
26
+ if (!options.name) {
27
+ throw Error(`You need to pass a unique field "name" for the HTTP client instance`);
28
+ }
29
+ const forceDisableCache = envManager.get('HTTP_CLIENT_CACHE_DISABLED');
30
+ const forceDisabledCircuitBreaker = envManager.get('HTTP_CLIENT_CIRCUIT_BREAKER_DISABLED');
31
+ const adapterOptions = tinkoffRequestHttpClientAdapter.mergeOptions(tinkoffRequestHttpClientAdapter.mergeOptions({
32
+ logger,
33
+ agent,
34
+ querySerializer,
35
+ method: 'GET',
36
+ createCache: createCache
37
+ ? (cacheOptions) => createCache('memory', cacheOptions)
38
+ : undefined,
39
+ modifyRequest: compose__default["default"](fillHeaders.fillHeaderIp({ requestManager }), fillHeaders.fillHeaders({ requestManager, headersList })),
40
+ circuitBreakerOptions: {
41
+ failureThreshold: 75,
42
+ minimumFailureCount: 10,
43
+ },
44
+ // TODO: remove any after [resolving](https://github.com/southpolesteve/node-abort-controller/issues/31)
45
+ signal: (_a = commandLineExecutionContext === null || commandLineExecutionContext === void 0 ? void 0 : commandLineExecutionContext()) === null || _a === void 0 ? void 0 : _a.abortSignal,
46
+ ...environmentDependentOptions,
47
+ }, defaultOptions !== null && defaultOptions !== void 0 ? defaultOptions : {}), options);
48
+ // по умолчанию, на сервере, библиотека https://github.com/node-fetch/node-fetch
49
+ // отправляет заголовок "User-Agent" вида "node-fetch".
50
+ // для улучшения логов сервисов, в которые делают запросы tramvai приложения,
51
+ // заменяем "User-Agent" на кастомный, содержащий название и версию приложения
52
+ if (typeof window === 'undefined') {
53
+ adapterOptions.headers = {
54
+ 'User-Agent': createUserAgent.createUserAgent({ appInfo, envManager }),
55
+ ...adapterOptions.headers,
56
+ };
57
+ }
58
+ if (!isNil__default["default"](forceDisableCache)) {
59
+ adapterOptions.disableCache = !!forceDisableCache;
60
+ }
61
+ if (disableCircuitBreaker) {
62
+ adapterOptions.enableCircuitBreaker = false;
63
+ }
64
+ // environment variable in priority over disableCircuitBreaker
65
+ if (!isNil__default["default"](forceDisabledCircuitBreaker)) {
66
+ adapterOptions.enableCircuitBreaker = !forceDisabledCircuitBreaker;
67
+ }
68
+ // кэшируем инстанс @tinkoff/request
69
+ if (!makeRequestRegistry.has(adapterOptions.name)) {
70
+ makeRequestRegistry.set(adapterOptions.name, tinkoffRequestHttpClientAdapter.createTinkoffRequest(adapterOptions));
71
+ }
72
+ const makeRequest = makeRequestRegistry.get(adapterOptions.name);
73
+ const httpClientAdapter = new tinkoffRequestHttpClientAdapter.HttpClientAdapter({
74
+ options: adapterOptions,
75
+ makeRequest,
76
+ });
77
+ return httpClientAdapter;
78
+ };
79
+ };
80
+
81
+ exports.httpClientFactory = httpClientFactory;
@@ -0,0 +1,109 @@
1
+ import { createToken } from '@tinkoff/dippy';
2
+ import { Module, 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, 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
+ import { PapiClientModule } from './papiClientModule.browser.browser.js';
7
+
8
+ const createCacheToken = createToken('httpClient createCache');
9
+ const HttpClientModule = /* @__PURE__ */ Module({
10
+ imports: [PapiClientModule],
11
+ providers: [
12
+ provide({
13
+ provide: HTTP_CLIENT_FACTORY,
14
+ useFactory: httpClientFactory,
15
+ deps: {
16
+ logger: LOGGER_TOKEN,
17
+ envManager: ENV_MANAGER_TOKEN,
18
+ appInfo: APP_INFO_TOKEN,
19
+ createCache: createCacheToken,
20
+ makeRequestRegistry: 'makeRequestRegistry',
21
+ requestManager: {
22
+ token: REQUEST_MANAGER_TOKEN,
23
+ optional: true,
24
+ },
25
+ headersList: {
26
+ token: API_CLIENT_PASS_HEADERS,
27
+ optional: true,
28
+ },
29
+ agent: {
30
+ token: HTTP_CLIENT_AGENT,
31
+ optional: true,
32
+ },
33
+ disableCircuitBreaker: {
34
+ token: DISABLE_CIRCUIT_BREAKER,
35
+ optional: true,
36
+ },
37
+ defaultOptions: {
38
+ token: DEFAULT_HTTP_CLIENT_FACTORY_OPTIONS,
39
+ optional: true,
40
+ },
41
+ commandLineExecutionContext: {
42
+ token: COMMAND_LINE_EXECUTION_CONTEXT_TOKEN,
43
+ optional: true,
44
+ },
45
+ },
46
+ }),
47
+ provide({
48
+ provide: HTTP_CLIENT,
49
+ useFactory: ({ factory }) => {
50
+ return factory({
51
+ name: 'http-client',
52
+ disableCache: true,
53
+ });
54
+ },
55
+ deps: {
56
+ factory: HTTP_CLIENT_FACTORY,
57
+ },
58
+ }),
59
+ provide({
60
+ provide: ENV_USED_TOKEN,
61
+ useValue: [
62
+ { key: 'HTTP_CLIENT_CACHE_DISABLED', optional: true, dehydrate: false },
63
+ { key: 'HTTP_CLIENT_CIRCUIT_BREAKER_DISABLED', optional: true, dehydrate: false },
64
+ ],
65
+ }),
66
+ /**
67
+ * хранилище для экземпляров @tinkoff/request
68
+ *
69
+ * требуется хранить экземпляры в единственном виде,
70
+ * т.к. многие плагины @tinkoff/request после инициализации имеют состояние
71
+ * (cache, circuit breaker), и не будут корректно работать на сервере,
72
+ * если создавать новые экземпляры на Scope.REQUEST
73
+ */
74
+ provide({
75
+ provide: 'makeRequestRegistry',
76
+ scope: Scope.SINGLETON,
77
+ useFactory: () => new Map(),
78
+ }),
79
+ /**
80
+ * `CREATE_CACHE_TOKEN` имеет проверку, если токен используется провайдером,
81
+ * который имеет Scope.SINGLETON, то инстанс кэша сохраняется в общее хранилище,
82
+ * и доступен для очистки через `/papi/clear-cache`.
83
+ * Scope.REQUEST игнорируется, т.к. это верная утечка памяти,
84
+ * инстансов кэши было бы неограниченное количество.
85
+ *
86
+ * HTTP клиенты создаются со Scope.REQUEST, но инстансы @tinkoff/request
87
+ * (и соответственно кэшей) создаются только один раз, благодаря `makeRequestRegistry`.
88
+ * это гарантирует отсутствие утечек памяти, поэтому мы обходим проверку
89
+ * на Scope.SINGLETON c помощью обертки `createCacheToken`
90
+ */
91
+ provide({
92
+ provide: createCacheToken,
93
+ scope: Scope.SINGLETON,
94
+ useFactory: ({ createCache }) => {
95
+ return createCache;
96
+ },
97
+ deps: {
98
+ createCache: CREATE_CACHE_TOKEN,
99
+ },
100
+ }),
101
+ provide({
102
+ provide: API_CLIENT_PASS_HEADERS,
103
+ useValue: ['x-request-id'],
104
+ }),
105
+ ],
106
+ })(class HttpClientModule {
107
+ });
108
+
109
+ export { HttpClientModule };
@@ -0,0 +1,109 @@
1
+ import { createToken } from '@tinkoff/dippy';
2
+ import { Module, 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, 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
+ import { PapiClientModule } from './papiClientModule.es.js';
7
+
8
+ const createCacheToken = createToken('httpClient createCache');
9
+ const HttpClientModule = /* @__PURE__ */ Module({
10
+ imports: [PapiClientModule],
11
+ providers: [
12
+ provide({
13
+ provide: HTTP_CLIENT_FACTORY,
14
+ useFactory: httpClientFactory,
15
+ deps: {
16
+ logger: LOGGER_TOKEN,
17
+ envManager: ENV_MANAGER_TOKEN,
18
+ appInfo: APP_INFO_TOKEN,
19
+ createCache: createCacheToken,
20
+ makeRequestRegistry: 'makeRequestRegistry',
21
+ requestManager: {
22
+ token: REQUEST_MANAGER_TOKEN,
23
+ optional: true,
24
+ },
25
+ headersList: {
26
+ token: API_CLIENT_PASS_HEADERS,
27
+ optional: true,
28
+ },
29
+ agent: {
30
+ token: HTTP_CLIENT_AGENT,
31
+ optional: true,
32
+ },
33
+ disableCircuitBreaker: {
34
+ token: DISABLE_CIRCUIT_BREAKER,
35
+ optional: true,
36
+ },
37
+ defaultOptions: {
38
+ token: DEFAULT_HTTP_CLIENT_FACTORY_OPTIONS,
39
+ optional: true,
40
+ },
41
+ commandLineExecutionContext: {
42
+ token: COMMAND_LINE_EXECUTION_CONTEXT_TOKEN,
43
+ optional: true,
44
+ },
45
+ },
46
+ }),
47
+ provide({
48
+ provide: HTTP_CLIENT,
49
+ useFactory: ({ factory }) => {
50
+ return factory({
51
+ name: 'http-client',
52
+ disableCache: true,
53
+ });
54
+ },
55
+ deps: {
56
+ factory: HTTP_CLIENT_FACTORY,
57
+ },
58
+ }),
59
+ provide({
60
+ provide: ENV_USED_TOKEN,
61
+ useValue: [
62
+ { key: 'HTTP_CLIENT_CACHE_DISABLED', optional: true, dehydrate: false },
63
+ { key: 'HTTP_CLIENT_CIRCUIT_BREAKER_DISABLED', optional: true, dehydrate: false },
64
+ ],
65
+ }),
66
+ /**
67
+ * хранилище для экземпляров @tinkoff/request
68
+ *
69
+ * требуется хранить экземпляры в единственном виде,
70
+ * т.к. многие плагины @tinkoff/request после инициализации имеют состояние
71
+ * (cache, circuit breaker), и не будут корректно работать на сервере,
72
+ * если создавать новые экземпляры на Scope.REQUEST
73
+ */
74
+ provide({
75
+ provide: 'makeRequestRegistry',
76
+ scope: Scope.SINGLETON,
77
+ useFactory: () => new Map(),
78
+ }),
79
+ /**
80
+ * `CREATE_CACHE_TOKEN` имеет проверку, если токен используется провайдером,
81
+ * который имеет Scope.SINGLETON, то инстанс кэша сохраняется в общее хранилище,
82
+ * и доступен для очистки через `/papi/clear-cache`.
83
+ * Scope.REQUEST игнорируется, т.к. это верная утечка памяти,
84
+ * инстансов кэши было бы неограниченное количество.
85
+ *
86
+ * HTTP клиенты создаются со Scope.REQUEST, но инстансы @tinkoff/request
87
+ * (и соответственно кэшей) создаются только один раз, благодаря `makeRequestRegistry`.
88
+ * это гарантирует отсутствие утечек памяти, поэтому мы обходим проверку
89
+ * на Scope.SINGLETON c помощью обертки `createCacheToken`
90
+ */
91
+ provide({
92
+ provide: createCacheToken,
93
+ scope: Scope.SINGLETON,
94
+ useFactory: ({ createCache }) => {
95
+ return createCache;
96
+ },
97
+ deps: {
98
+ createCache: CREATE_CACHE_TOKEN,
99
+ },
100
+ }),
101
+ provide({
102
+ provide: API_CLIENT_PASS_HEADERS,
103
+ useValue: ['x-request-id'],
104
+ }),
105
+ ],
106
+ })(class HttpClientModule {
107
+ });
108
+
109
+ export { HttpClientModule };
@@ -0,0 +1,113 @@
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
+ var papiClientModule = require('./papiClientModule.js');
11
+
12
+ const createCacheToken = dippy.createToken('httpClient createCache');
13
+ const HttpClientModule = /* @__PURE__ */ core.Module({
14
+ imports: [papiClientModule.PapiClientModule],
15
+ providers: [
16
+ core.provide({
17
+ provide: tokensHttpClient.HTTP_CLIENT_FACTORY,
18
+ useFactory: httpClientFactory.httpClientFactory,
19
+ deps: {
20
+ logger: tokensCommon.LOGGER_TOKEN,
21
+ envManager: tokensCommon.ENV_MANAGER_TOKEN,
22
+ appInfo: core.APP_INFO_TOKEN,
23
+ createCache: createCacheToken,
24
+ makeRequestRegistry: 'makeRequestRegistry',
25
+ requestManager: {
26
+ token: tokensCommon.REQUEST_MANAGER_TOKEN,
27
+ optional: true,
28
+ },
29
+ headersList: {
30
+ token: tokensHttpClient.API_CLIENT_PASS_HEADERS,
31
+ optional: true,
32
+ },
33
+ agent: {
34
+ token: tokensHttpClient.HTTP_CLIENT_AGENT,
35
+ optional: true,
36
+ },
37
+ disableCircuitBreaker: {
38
+ token: tokensHttpClient.DISABLE_CIRCUIT_BREAKER,
39
+ optional: true,
40
+ },
41
+ defaultOptions: {
42
+ token: tokensHttpClient.DEFAULT_HTTP_CLIENT_FACTORY_OPTIONS,
43
+ optional: true,
44
+ },
45
+ commandLineExecutionContext: {
46
+ token: tokensCommon.COMMAND_LINE_EXECUTION_CONTEXT_TOKEN,
47
+ optional: true,
48
+ },
49
+ },
50
+ }),
51
+ core.provide({
52
+ provide: tokensHttpClient.HTTP_CLIENT,
53
+ useFactory: ({ factory }) => {
54
+ return factory({
55
+ name: 'http-client',
56
+ disableCache: true,
57
+ });
58
+ },
59
+ deps: {
60
+ factory: tokensHttpClient.HTTP_CLIENT_FACTORY,
61
+ },
62
+ }),
63
+ core.provide({
64
+ provide: tokensCommon.ENV_USED_TOKEN,
65
+ useValue: [
66
+ { key: 'HTTP_CLIENT_CACHE_DISABLED', optional: true, dehydrate: false },
67
+ { key: 'HTTP_CLIENT_CIRCUIT_BREAKER_DISABLED', optional: true, dehydrate: false },
68
+ ],
69
+ }),
70
+ /**
71
+ * хранилище для экземпляров @tinkoff/request
72
+ *
73
+ * требуется хранить экземпляры в единственном виде,
74
+ * т.к. многие плагины @tinkoff/request после инициализации имеют состояние
75
+ * (cache, circuit breaker), и не будут корректно работать на сервере,
76
+ * если создавать новые экземпляры на Scope.REQUEST
77
+ */
78
+ core.provide({
79
+ provide: 'makeRequestRegistry',
80
+ scope: core.Scope.SINGLETON,
81
+ useFactory: () => new Map(),
82
+ }),
83
+ /**
84
+ * `CREATE_CACHE_TOKEN` имеет проверку, если токен используется провайдером,
85
+ * который имеет Scope.SINGLETON, то инстанс кэша сохраняется в общее хранилище,
86
+ * и доступен для очистки через `/papi/clear-cache`.
87
+ * Scope.REQUEST игнорируется, т.к. это верная утечка памяти,
88
+ * инстансов кэши было бы неограниченное количество.
89
+ *
90
+ * HTTP клиенты создаются со Scope.REQUEST, но инстансы @tinkoff/request
91
+ * (и соответственно кэшей) создаются только один раз, благодаря `makeRequestRegistry`.
92
+ * это гарантирует отсутствие утечек памяти, поэтому мы обходим проверку
93
+ * на Scope.SINGLETON c помощью обертки `createCacheToken`
94
+ */
95
+ core.provide({
96
+ provide: createCacheToken,
97
+ scope: core.Scope.SINGLETON,
98
+ useFactory: ({ createCache }) => {
99
+ return createCache;
100
+ },
101
+ deps: {
102
+ createCache: tokensCommon.CREATE_CACHE_TOKEN,
103
+ },
104
+ }),
105
+ core.provide({
106
+ provide: tokensHttpClient.API_CLIENT_PASS_HEADERS,
107
+ useValue: ['x-request-id'],
108
+ }),
109
+ ],
110
+ })(class HttpClientModule {
111
+ });
112
+
113
+ exports.HttpClientModule = HttpClientModule;