@tramvai/module-http-client 6.64.1 → 6.66.1
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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createUserAgent } from './createUserAgent.browser.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* nodejs sends "User-Agent: node" header
|
|
5
5
|
* on the server by default. For logging purpose, we are
|
|
6
6
|
* replacing "User-Agent" value with custom one, containing
|
|
7
7
|
* both application name and version.
|
|
@@ -2,7 +2,7 @@ import type { ExtractDependencyType } from '@tinkoff/dippy';
|
|
|
2
2
|
import type { ENV_MANAGER_TOKEN } from '@tramvai/tokens-common';
|
|
3
3
|
import type { APP_INFO_TOKEN } from '@tramvai/tokens-core';
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* nodejs sends "User-Agent: node" header
|
|
6
6
|
* on the server by default. For logging purpose, we are
|
|
7
7
|
* replacing "User-Agent" value with custom one, containing
|
|
8
8
|
* both application name and version.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createUserAgent } from './createUserAgent.es.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* nodejs sends "User-Agent: node" header
|
|
5
5
|
* on the server by default. For logging purpose, we are
|
|
6
6
|
* replacing "User-Agent" value with custom one, containing
|
|
7
7
|
* both application name and version.
|
|
@@ -5,7 +5,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
5
5
|
var createUserAgent = require('./createUserAgent.js');
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
8
|
+
* nodejs sends "User-Agent: node" header
|
|
9
9
|
* on the server by default. For logging purpose, we are
|
|
10
10
|
* replacing "User-Agent" value with custom one, containing
|
|
11
11
|
* both application name and version.
|
|
@@ -33,7 +33,6 @@ const httpClientFactory = ({ logger, envManager, appInfo, requestManager, header
|
|
|
33
33
|
failureThreshold: 75,
|
|
34
34
|
minimumFailureCount: 10,
|
|
35
35
|
},
|
|
36
|
-
// TODO: remove any after [resolving](https://github.com/southpolesteve/node-abort-controller/issues/31)
|
|
37
36
|
signal: commandLineExecutionContext?.()?.abortSignal,
|
|
38
37
|
...environmentDependentOptions,
|
|
39
38
|
}, defaultOptions ? mergeOptions(defaultOptions, interceptors) : interceptors), options);
|
|
@@ -33,7 +33,6 @@ const httpClientFactory = ({ logger, envManager, appInfo, requestManager, header
|
|
|
33
33
|
failureThreshold: 75,
|
|
34
34
|
minimumFailureCount: 10,
|
|
35
35
|
},
|
|
36
|
-
// TODO: remove any after [resolving](https://github.com/southpolesteve/node-abort-controller/issues/31)
|
|
37
36
|
signal: commandLineExecutionContext?.()?.abortSignal,
|
|
38
37
|
...environmentDependentOptions,
|
|
39
38
|
}, defaultOptions ? mergeOptions(defaultOptions, interceptors) : interceptors), options);
|
|
@@ -42,7 +42,6 @@ const httpClientFactory = ({ logger, envManager, appInfo, requestManager, header
|
|
|
42
42
|
failureThreshold: 75,
|
|
43
43
|
minimumFailureCount: 10,
|
|
44
44
|
},
|
|
45
|
-
// TODO: remove any after [resolving](https://github.com/southpolesteve/node-abort-controller/issues/31)
|
|
46
45
|
signal: commandLineExecutionContext?.()?.abortSignal,
|
|
47
46
|
...environmentDependentOptions,
|
|
48
47
|
}, defaultOptions ? tinkoffRequestHttpClientAdapter.mergeOptions(defaultOptions, interceptors) : interceptors), options);
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const HttpClientModule: import("@tinkoff/dippy/lib/modules/module.h").ModuleClass & Partial<import("@tinkoff/dippy/lib/modules/module.h").ModuleSecretParameters> & {
|
|
2
|
+
[x: string]: (...args: any[]) => import("@tinkoff/dippy").ModuleType;
|
|
3
|
+
};
|
|
4
|
+
//# sourceMappingURL=httpClientModule.browser.d.ts.map
|
|
@@ -1,113 +1,54 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
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';
|
|
1
|
+
import { declareModule, provide, commandLineListTokens, optional } from '@tramvai/core';
|
|
2
|
+
import { HTTP_CLIENT_AGENT, HTTP_CLIENT_AGENT_OPTIONS, HTTP_CLIENT_AGENT_INTERCEPTORS } from '@tramvai/tokens-http-client';
|
|
6
3
|
import { PapiClientModule } from './papiClientModule.browser.browser.js';
|
|
4
|
+
import { providers } from './shared.browser.js';
|
|
7
5
|
|
|
8
|
-
const
|
|
9
|
-
|
|
6
|
+
const HttpClientModule = /* @__PURE__ */ declareModule({
|
|
7
|
+
name: 'HttpClientModule',
|
|
10
8
|
imports: [PapiClientModule],
|
|
11
9
|
providers: [
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
useFactory: ({ factory }) => {
|
|
54
|
-
return factory({
|
|
55
|
-
name: 'http-client',
|
|
56
|
-
enableCircuitBreaker: false,
|
|
57
|
-
});
|
|
58
|
-
},
|
|
59
|
-
deps: {
|
|
60
|
-
factory: HTTP_CLIENT_FACTORY,
|
|
61
|
-
},
|
|
62
|
-
}),
|
|
63
|
-
provide({
|
|
64
|
-
provide: 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
|
-
provide({
|
|
79
|
-
provide: 'makeRequestRegistry',
|
|
80
|
-
scope: 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
|
-
provide({
|
|
96
|
-
provide: createCacheToken,
|
|
97
|
-
scope: Scope.SINGLETON,
|
|
98
|
-
useFactory: ({ createCache }) => {
|
|
99
|
-
return createCache;
|
|
100
|
-
},
|
|
101
|
-
deps: {
|
|
102
|
-
createCache: CREATE_CACHE_TOKEN,
|
|
103
|
-
},
|
|
104
|
-
}),
|
|
105
|
-
provide({
|
|
106
|
-
provide: API_CLIENT_PASS_HEADERS,
|
|
107
|
-
useValue: ['x-request-id'],
|
|
108
|
-
}),
|
|
10
|
+
...providers,
|
|
11
|
+
// we can't separate this module to browser and server files through "browser"
|
|
12
|
+
// package.json field, because jest not supports this field resolving out of the box
|
|
13
|
+
// and many unit tests rely on jsdom environment and fails because of resolving to server version
|
|
14
|
+
// TODO: separate jest preset for jsdom unit tests with custom resolver to support "browser" field
|
|
15
|
+
// @see https://github.com/marko-js/jest/blob/main/src/preset/browser/jest-preset.ts
|
|
16
|
+
...(typeof window === 'undefined'
|
|
17
|
+
? [
|
|
18
|
+
provide({
|
|
19
|
+
provide: commandLineListTokens.init,
|
|
20
|
+
useFactory: ({ agent }) => {
|
|
21
|
+
return () => {
|
|
22
|
+
const { setGlobalDispatcher } = require('undici');
|
|
23
|
+
setGlobalDispatcher(agent.http);
|
|
24
|
+
};
|
|
25
|
+
},
|
|
26
|
+
deps: {
|
|
27
|
+
agent: HTTP_CLIENT_AGENT,
|
|
28
|
+
},
|
|
29
|
+
}),
|
|
30
|
+
provide({
|
|
31
|
+
provide: HTTP_CLIENT_AGENT,
|
|
32
|
+
useFactory: ({ options, interceptors }) => {
|
|
33
|
+
const { Agent } = require('undici');
|
|
34
|
+
const agent = new Agent(options).compose(...(interceptors ?? []));
|
|
35
|
+
return {
|
|
36
|
+
http: agent,
|
|
37
|
+
https: agent,
|
|
38
|
+
};
|
|
39
|
+
},
|
|
40
|
+
deps: {
|
|
41
|
+
options: HTTP_CLIENT_AGENT_OPTIONS,
|
|
42
|
+
interceptors: optional(HTTP_CLIENT_AGENT_INTERCEPTORS),
|
|
43
|
+
},
|
|
44
|
+
}),
|
|
45
|
+
provide({
|
|
46
|
+
provide: HTTP_CLIENT_AGENT_OPTIONS,
|
|
47
|
+
useValue: {},
|
|
48
|
+
}),
|
|
49
|
+
]
|
|
50
|
+
: []),
|
|
109
51
|
],
|
|
110
|
-
})(class HttpClientModule {
|
|
111
52
|
});
|
|
112
53
|
|
|
113
54
|
export { HttpClientModule };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const HttpClientModule: import("@tinkoff/dippy").
|
|
2
|
-
|
|
3
|
-
}
|
|
1
|
+
export declare const HttpClientModule: import("@tinkoff/dippy/lib/modules/module.h").ModuleClass & Partial<import("@tinkoff/dippy/lib/modules/module.h").ModuleSecretParameters> & {
|
|
2
|
+
[x: string]: (...args: any[]) => import("@tramvai/core").ModuleType;
|
|
3
|
+
};
|
|
4
4
|
//# sourceMappingURL=httpClientModule.d.ts.map
|
|
@@ -1,113 +1,54 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
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';
|
|
1
|
+
import { declareModule, provide, commandLineListTokens, optional } from '@tramvai/core';
|
|
2
|
+
import { HTTP_CLIENT_AGENT, HTTP_CLIENT_AGENT_OPTIONS, HTTP_CLIENT_AGENT_INTERCEPTORS } from '@tramvai/tokens-http-client';
|
|
6
3
|
import { PapiClientModule } from './papiClientModule.es.js';
|
|
4
|
+
import { providers } from './shared.es.js';
|
|
7
5
|
|
|
8
|
-
const
|
|
9
|
-
|
|
6
|
+
const HttpClientModule = /* @__PURE__ */ declareModule({
|
|
7
|
+
name: 'HttpClientModule',
|
|
10
8
|
imports: [PapiClientModule],
|
|
11
9
|
providers: [
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
useFactory: ({ factory }) => {
|
|
54
|
-
return factory({
|
|
55
|
-
name: 'http-client',
|
|
56
|
-
enableCircuitBreaker: false,
|
|
57
|
-
});
|
|
58
|
-
},
|
|
59
|
-
deps: {
|
|
60
|
-
factory: HTTP_CLIENT_FACTORY,
|
|
61
|
-
},
|
|
62
|
-
}),
|
|
63
|
-
provide({
|
|
64
|
-
provide: 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
|
-
provide({
|
|
79
|
-
provide: 'makeRequestRegistry',
|
|
80
|
-
scope: 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
|
-
provide({
|
|
96
|
-
provide: createCacheToken,
|
|
97
|
-
scope: Scope.SINGLETON,
|
|
98
|
-
useFactory: ({ createCache }) => {
|
|
99
|
-
return createCache;
|
|
100
|
-
},
|
|
101
|
-
deps: {
|
|
102
|
-
createCache: CREATE_CACHE_TOKEN,
|
|
103
|
-
},
|
|
104
|
-
}),
|
|
105
|
-
provide({
|
|
106
|
-
provide: API_CLIENT_PASS_HEADERS,
|
|
107
|
-
useValue: ['x-request-id'],
|
|
108
|
-
}),
|
|
10
|
+
...providers,
|
|
11
|
+
// we can't separate this module to browser and server files through "browser"
|
|
12
|
+
// package.json field, because jest not supports this field resolving out of the box
|
|
13
|
+
// and many unit tests rely on jsdom environment and fails because of resolving to server version
|
|
14
|
+
// TODO: separate jest preset for jsdom unit tests with custom resolver to support "browser" field
|
|
15
|
+
// @see https://github.com/marko-js/jest/blob/main/src/preset/browser/jest-preset.ts
|
|
16
|
+
...(typeof window === 'undefined'
|
|
17
|
+
? [
|
|
18
|
+
provide({
|
|
19
|
+
provide: commandLineListTokens.init,
|
|
20
|
+
useFactory: ({ agent }) => {
|
|
21
|
+
return () => {
|
|
22
|
+
const { setGlobalDispatcher } = require('undici');
|
|
23
|
+
setGlobalDispatcher(agent.http);
|
|
24
|
+
};
|
|
25
|
+
},
|
|
26
|
+
deps: {
|
|
27
|
+
agent: HTTP_CLIENT_AGENT,
|
|
28
|
+
},
|
|
29
|
+
}),
|
|
30
|
+
provide({
|
|
31
|
+
provide: HTTP_CLIENT_AGENT,
|
|
32
|
+
useFactory: ({ options, interceptors }) => {
|
|
33
|
+
const { Agent } = require('undici');
|
|
34
|
+
const agent = new Agent(options).compose(...(interceptors ?? []));
|
|
35
|
+
return {
|
|
36
|
+
http: agent,
|
|
37
|
+
https: agent,
|
|
38
|
+
};
|
|
39
|
+
},
|
|
40
|
+
deps: {
|
|
41
|
+
options: HTTP_CLIENT_AGENT_OPTIONS,
|
|
42
|
+
interceptors: optional(HTTP_CLIENT_AGENT_INTERCEPTORS),
|
|
43
|
+
},
|
|
44
|
+
}),
|
|
45
|
+
provide({
|
|
46
|
+
provide: HTTP_CLIENT_AGENT_OPTIONS,
|
|
47
|
+
useValue: {},
|
|
48
|
+
}),
|
|
49
|
+
]
|
|
50
|
+
: []),
|
|
109
51
|
],
|
|
110
|
-
})(class HttpClientModule {
|
|
111
52
|
});
|
|
112
53
|
|
|
113
54
|
export { HttpClientModule };
|
package/lib/httpClientModule.js
CHANGED
|
@@ -2,116 +2,57 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
var dippy = require('@tinkoff/dippy');
|
|
6
5
|
var core = require('@tramvai/core');
|
|
7
6
|
var tokensHttpClient = require('@tramvai/tokens-http-client');
|
|
8
|
-
var tokensCommon = require('@tramvai/tokens-common');
|
|
9
|
-
var httpClientFactory = require('./httpClient/httpClientFactory.js');
|
|
10
7
|
var papiClientModule = require('./papiClientModule.js');
|
|
8
|
+
var shared = require('./shared.js');
|
|
11
9
|
|
|
12
|
-
const
|
|
13
|
-
|
|
10
|
+
const HttpClientModule = /* @__PURE__ */ core.declareModule({
|
|
11
|
+
name: 'HttpClientModule',
|
|
14
12
|
imports: [papiClientModule.PapiClientModule],
|
|
15
13
|
providers: [
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
useFactory: ({ factory }) => {
|
|
58
|
-
return factory({
|
|
59
|
-
name: 'http-client',
|
|
60
|
-
enableCircuitBreaker: false,
|
|
61
|
-
});
|
|
62
|
-
},
|
|
63
|
-
deps: {
|
|
64
|
-
factory: tokensHttpClient.HTTP_CLIENT_FACTORY,
|
|
65
|
-
},
|
|
66
|
-
}),
|
|
67
|
-
core.provide({
|
|
68
|
-
provide: tokensCommon.ENV_USED_TOKEN,
|
|
69
|
-
useValue: [
|
|
70
|
-
{ key: 'HTTP_CLIENT_CACHE_DISABLED', optional: true, dehydrate: false },
|
|
71
|
-
{ key: 'HTTP_CLIENT_CIRCUIT_BREAKER_DISABLED', optional: true, dehydrate: false },
|
|
72
|
-
],
|
|
73
|
-
}),
|
|
74
|
-
/**
|
|
75
|
-
* хранилище для экземпляров @tinkoff/request
|
|
76
|
-
*
|
|
77
|
-
* требуется хранить экземпляры в единственном виде,
|
|
78
|
-
* т.к. многие плагины @tinkoff/request после инициализации имеют состояние
|
|
79
|
-
* (cache, circuit breaker), и не будут корректно работать на сервере,
|
|
80
|
-
* если создавать новые экземпляры на Scope.REQUEST
|
|
81
|
-
*/
|
|
82
|
-
core.provide({
|
|
83
|
-
provide: 'makeRequestRegistry',
|
|
84
|
-
scope: core.Scope.SINGLETON,
|
|
85
|
-
useFactory: () => new Map(),
|
|
86
|
-
}),
|
|
87
|
-
/**
|
|
88
|
-
* `CREATE_CACHE_TOKEN` имеет проверку, если токен используется провайдером,
|
|
89
|
-
* который имеет Scope.SINGLETON, то инстанс кэша сохраняется в общее хранилище,
|
|
90
|
-
* и доступен для очистки через `/papi/clear-cache`.
|
|
91
|
-
* Scope.REQUEST игнорируется, т.к. это верная утечка памяти,
|
|
92
|
-
* инстансов кэши было бы неограниченное количество.
|
|
93
|
-
*
|
|
94
|
-
* HTTP клиенты создаются со Scope.REQUEST, но инстансы @tinkoff/request
|
|
95
|
-
* (и соответственно кэшей) создаются только один раз, благодаря `makeRequestRegistry`.
|
|
96
|
-
* это гарантирует отсутствие утечек памяти, поэтому мы обходим проверку
|
|
97
|
-
* на Scope.SINGLETON c помощью обертки `createCacheToken`
|
|
98
|
-
*/
|
|
99
|
-
core.provide({
|
|
100
|
-
provide: createCacheToken,
|
|
101
|
-
scope: core.Scope.SINGLETON,
|
|
102
|
-
useFactory: ({ createCache }) => {
|
|
103
|
-
return createCache;
|
|
104
|
-
},
|
|
105
|
-
deps: {
|
|
106
|
-
createCache: tokensCommon.CREATE_CACHE_TOKEN,
|
|
107
|
-
},
|
|
108
|
-
}),
|
|
109
|
-
core.provide({
|
|
110
|
-
provide: tokensHttpClient.API_CLIENT_PASS_HEADERS,
|
|
111
|
-
useValue: ['x-request-id'],
|
|
112
|
-
}),
|
|
14
|
+
...shared.providers,
|
|
15
|
+
// we can't separate this module to browser and server files through "browser"
|
|
16
|
+
// package.json field, because jest not supports this field resolving out of the box
|
|
17
|
+
// and many unit tests rely on jsdom environment and fails because of resolving to server version
|
|
18
|
+
// TODO: separate jest preset for jsdom unit tests with custom resolver to support "browser" field
|
|
19
|
+
// @see https://github.com/marko-js/jest/blob/main/src/preset/browser/jest-preset.ts
|
|
20
|
+
...(typeof window === 'undefined'
|
|
21
|
+
? [
|
|
22
|
+
core.provide({
|
|
23
|
+
provide: core.commandLineListTokens.init,
|
|
24
|
+
useFactory: ({ agent }) => {
|
|
25
|
+
return () => {
|
|
26
|
+
const { setGlobalDispatcher } = require('undici');
|
|
27
|
+
setGlobalDispatcher(agent.http);
|
|
28
|
+
};
|
|
29
|
+
},
|
|
30
|
+
deps: {
|
|
31
|
+
agent: tokensHttpClient.HTTP_CLIENT_AGENT,
|
|
32
|
+
},
|
|
33
|
+
}),
|
|
34
|
+
core.provide({
|
|
35
|
+
provide: tokensHttpClient.HTTP_CLIENT_AGENT,
|
|
36
|
+
useFactory: ({ options, interceptors }) => {
|
|
37
|
+
const { Agent } = require('undici');
|
|
38
|
+
const agent = new Agent(options).compose(...(interceptors ?? []));
|
|
39
|
+
return {
|
|
40
|
+
http: agent,
|
|
41
|
+
https: agent,
|
|
42
|
+
};
|
|
43
|
+
},
|
|
44
|
+
deps: {
|
|
45
|
+
options: tokensHttpClient.HTTP_CLIENT_AGENT_OPTIONS,
|
|
46
|
+
interceptors: core.optional(tokensHttpClient.HTTP_CLIENT_AGENT_INTERCEPTORS),
|
|
47
|
+
},
|
|
48
|
+
}),
|
|
49
|
+
core.provide({
|
|
50
|
+
provide: tokensHttpClient.HTTP_CLIENT_AGENT_OPTIONS,
|
|
51
|
+
useValue: {},
|
|
52
|
+
}),
|
|
53
|
+
]
|
|
54
|
+
: []),
|
|
113
55
|
],
|
|
114
|
-
})(class HttpClientModule {
|
|
115
56
|
});
|
|
116
57
|
|
|
117
58
|
exports.HttpClientModule = HttpClientModule;
|