@webex/webex-core 3.0.0-beta.2 → 3.0.0-beta.21
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/dist/config.js +1 -11
- package/dist/config.js.map +1 -1
- package/dist/credentials-config.js +44 -64
- package/dist/credentials-config.js.map +1 -1
- package/dist/index.js +0 -76
- package/dist/index.js.map +1 -1
- package/dist/interceptors/auth.js +22 -55
- package/dist/interceptors/auth.js.map +1 -1
- package/dist/interceptors/default-options.js +0 -20
- package/dist/interceptors/default-options.js.map +1 -1
- package/dist/interceptors/embargo.js +0 -21
- package/dist/interceptors/embargo.js.map +1 -1
- package/dist/interceptors/network-timing.js +2 -21
- package/dist/interceptors/network-timing.js.map +1 -1
- package/dist/interceptors/payload-transformer.js +2 -22
- package/dist/interceptors/payload-transformer.js.map +1 -1
- package/dist/interceptors/rate-limit.js +25 -57
- package/dist/interceptors/rate-limit.js.map +1 -1
- package/dist/interceptors/redirect.js +4 -33
- package/dist/interceptors/redirect.js.map +1 -1
- package/dist/interceptors/request-event.js +3 -30
- package/dist/interceptors/request-event.js.map +1 -1
- package/dist/interceptors/request-logger.js +1 -30
- package/dist/interceptors/request-logger.js.map +1 -1
- package/dist/interceptors/request-timing.js +3 -22
- package/dist/interceptors/request-timing.js.map +1 -1
- package/dist/interceptors/response-logger.js +2 -31
- package/dist/interceptors/response-logger.js.map +1 -1
- package/dist/interceptors/user-agent.js +2 -29
- package/dist/interceptors/user-agent.js.map +1 -1
- package/dist/interceptors/webex-tracking-id.js +5 -28
- package/dist/interceptors/webex-tracking-id.js.map +1 -1
- package/dist/interceptors/webex-user-agent.js +5 -38
- package/dist/interceptors/webex-user-agent.js.map +1 -1
- package/dist/lib/batcher.js +3 -51
- package/dist/lib/batcher.js.map +1 -1
- package/dist/lib/credentials/credentials.js +39 -119
- package/dist/lib/credentials/credentials.js.map +1 -1
- package/dist/lib/credentials/grant-errors.js +0 -49
- package/dist/lib/credentials/grant-errors.js.map +1 -1
- package/dist/lib/credentials/index.js +1 -13
- package/dist/lib/credentials/index.js.map +1 -1
- package/dist/lib/credentials/scope.js +1 -7
- package/dist/lib/credentials/scope.js.map +1 -1
- package/dist/lib/credentials/token-collection.js +1 -7
- package/dist/lib/credentials/token-collection.js.map +1 -1
- package/dist/lib/credentials/token.js +39 -118
- package/dist/lib/credentials/token.js.map +1 -1
- package/dist/lib/page.js +13 -26
- package/dist/lib/page.js.map +1 -1
- package/dist/lib/services/constants.js +0 -2
- package/dist/lib/services/constants.js.map +1 -1
- package/dist/lib/services/index.js +1 -28
- package/dist/lib/services/index.js.map +1 -1
- package/dist/lib/services/interceptors/server-error.js +2 -23
- package/dist/lib/services/interceptors/server-error.js.map +1 -1
- package/dist/lib/services/interceptors/service.js +12 -34
- package/dist/lib/services/interceptors/service.js.map +1 -1
- package/dist/lib/services/metrics.js +0 -2
- package/dist/lib/services/metrics.js.map +1 -1
- package/dist/lib/services/service-catalog.js +10 -90
- package/dist/lib/services/service-catalog.js.map +1 -1
- package/dist/lib/services/service-fed-ramp.js +0 -2
- package/dist/lib/services/service-fed-ramp.js.map +1 -1
- package/dist/lib/services/service-host.js +47 -62
- package/dist/lib/services/service-host.js.map +1 -1
- package/dist/lib/services/service-registry.js +78 -90
- package/dist/lib/services/service-registry.js.map +1 -1
- package/dist/lib/services/service-state.js +3 -15
- package/dist/lib/services/service-state.js.map +1 -1
- package/dist/lib/services/service-url.js +4 -25
- package/dist/lib/services/service-url.js.map +1 -1
- package/dist/lib/services/services.js +122 -238
- package/dist/lib/services/services.js.map +1 -1
- package/dist/lib/stateless-webex-plugin.js +5 -28
- package/dist/lib/stateless-webex-plugin.js.map +1 -1
- package/dist/lib/storage/decorators.js +19 -62
- package/dist/lib/storage/decorators.js.map +1 -1
- package/dist/lib/storage/errors.js +0 -23
- package/dist/lib/storage/errors.js.map +1 -1
- package/dist/lib/storage/index.js +2 -16
- package/dist/lib/storage/index.js.map +1 -1
- package/dist/lib/storage/make-webex-plugin-store.js +11 -41
- package/dist/lib/storage/make-webex-plugin-store.js.map +1 -1
- package/dist/lib/storage/make-webex-store.js +8 -30
- package/dist/lib/storage/make-webex-store.js.map +1 -1
- package/dist/lib/storage/memory-store-adapter.js +1 -19
- package/dist/lib/storage/memory-store-adapter.js.map +1 -1
- package/dist/lib/webex-core-plugin-mixin.js +9 -29
- package/dist/lib/webex-core-plugin-mixin.js.map +1 -1
- package/dist/lib/webex-http-error.js +1 -31
- package/dist/lib/webex-http-error.js.map +1 -1
- package/dist/lib/webex-internal-core-plugin-mixin.js +9 -29
- package/dist/lib/webex-internal-core-plugin-mixin.js.map +1 -1
- package/dist/lib/webex-plugin.js +6 -40
- package/dist/lib/webex-plugin.js.map +1 -1
- package/dist/plugins/logger.js +3 -17
- package/dist/plugins/logger.js.map +1 -1
- package/dist/webex-core.js +79 -203
- package/dist/webex-core.js.map +1 -1
- package/dist/webex-internal-core.js +0 -10
- package/dist/webex-internal-core.js.map +1 -1
- package/package.json +14 -14
- package/src/config.js +9 -11
- package/src/credentials-config.js +110 -72
- package/src/index.js +4 -14
- package/src/interceptors/auth.js +36 -37
- package/src/interceptors/default-options.js +0 -1
- package/src/interceptors/embargo.js +1 -1
- package/src/interceptors/payload-transformer.js +1 -2
- package/src/interceptors/rate-limit.js +8 -5
- package/src/interceptors/redirect.js +14 -8
- package/src/interceptors/request-event.js +4 -8
- package/src/interceptors/request-logger.js +8 -5
- package/src/interceptors/response-logger.js +11 -8
- package/src/interceptors/user-agent.js +1 -2
- package/src/interceptors/webex-user-agent.js +3 -9
- package/src/lib/batcher.js +70 -69
- package/src/lib/credentials/credentials.js +112 -122
- package/src/lib/credentials/grant-errors.js +6 -7
- package/src/lib/credentials/index.js +1 -4
- package/src/lib/credentials/scope.js +1 -4
- package/src/lib/credentials/token-collection.js +1 -1
- package/src/lib/credentials/token.js +86 -80
- package/src/lib/page.js +10 -11
- package/src/lib/services/constants.js +3 -13
- package/src/lib/services/index.js +2 -2
- package/src/lib/services/interceptors/server-error.js +12 -7
- package/src/lib/services/interceptors/service.js +6 -5
- package/src/lib/services/metrics.js +1 -1
- package/src/lib/services/service-catalog.js +110 -100
- package/src/lib/services/service-fed-ramp.js +1 -2
- package/src/lib/services/service-host.js +10 -17
- package/src/lib/services/service-registry.js +69 -96
- package/src/lib/services/service-state.js +4 -6
- package/src/lib/services/service-url.js +24 -23
- package/src/lib/services/services.js +260 -251
- package/src/lib/stateless-webex-plugin.js +4 -2
- package/src/lib/storage/decorators.js +68 -66
- package/src/lib/storage/index.js +4 -6
- package/src/lib/storage/make-webex-plugin-store.js +34 -21
- package/src/lib/storage/make-webex-store.js +6 -7
- package/src/lib/storage/memory-store-adapter.js +3 -3
- package/src/lib/webex-core-plugin-mixin.js +10 -7
- package/src/lib/webex-http-error.js +7 -8
- package/src/lib/webex-internal-core-plugin-mixin.js +9 -6
- package/src/lib/webex-plugin.js +41 -34
- package/src/plugins/logger.js +8 -3
- package/src/webex-core.js +185 -116
- package/src/webex-internal-core.js +15 -9
- package/test/integration/spec/credentials/credentials.js +26 -30
- package/test/integration/spec/credentials/token.js +36 -33
- package/test/integration/spec/services/service-catalog.js +177 -156
- package/test/integration/spec/services/services.js +313 -304
- package/test/integration/spec/webex-core.js +98 -86
- package/test/unit/spec/_setup.js +26 -18
- package/test/unit/spec/credentials/credentials.js +189 -154
- package/test/unit/spec/credentials/token.js +94 -76
- package/test/unit/spec/interceptors/auth.js +291 -243
- package/test/unit/spec/interceptors/default-options.js +36 -24
- package/test/unit/spec/interceptors/embargo.js +32 -27
- package/test/unit/spec/interceptors/network-timing.js +2 -2
- package/test/unit/spec/interceptors/payload-transformer.js +61 -52
- package/test/unit/spec/interceptors/rate-limit.js +104 -75
- package/test/unit/spec/interceptors/redirect.js +22 -20
- package/test/unit/spec/interceptors/request-timing.js +18 -22
- package/test/unit/spec/interceptors/user-agent.js +28 -16
- package/test/unit/spec/interceptors/webex-tracking-id.js +14 -8
- package/test/unit/spec/interceptors/webex-user-agent.js +83 -37
- package/test/unit/spec/lib/batcher.js +36 -32
- package/test/unit/spec/lib/page.js +36 -32
- package/test/unit/spec/lib/webex-plugin.js +1 -1
- package/test/unit/spec/services/interceptors/server-error.js +67 -90
- package/test/unit/spec/services/interceptors/service.js +17 -28
- package/test/unit/spec/services/service-catalog.js +19 -27
- package/test/unit/spec/services/service-host.js +29 -26
- package/test/unit/spec/services/service-registry.js +128 -170
- package/test/unit/spec/services/service-state.js +13 -22
- package/test/unit/spec/services/service-url.js +24 -43
- package/test/unit/spec/services/services.js +85 -41
- package/test/unit/spec/storage/persist.js +6 -9
- package/test/unit/spec/storage/wait-for-value.js +22 -21
- package/test/unit/spec/webex-core.js +78 -57
- package/test/unit/spec/webex-internal-core.js +56 -31
|
@@ -6,13 +6,7 @@
|
|
|
6
6
|
import {assert} from '@webex/test-helper-chai';
|
|
7
7
|
import MockWebex from '@webex/test-helper-mock-webex';
|
|
8
8
|
import FakeTimers from '@sinonjs/fake-timers';
|
|
9
|
-
import {
|
|
10
|
-
RateLimitInterceptor,
|
|
11
|
-
config,
|
|
12
|
-
Credentials,
|
|
13
|
-
WebexHttpError,
|
|
14
|
-
Token
|
|
15
|
-
} from '@webex/webex-core';
|
|
9
|
+
import {RateLimitInterceptor, config, Credentials, WebexHttpError, Token} from '@webex/webex-core';
|
|
16
10
|
import {cloneDeep} from 'lodash';
|
|
17
11
|
|
|
18
12
|
describe('webex-core', () => {
|
|
@@ -20,22 +14,23 @@ describe('webex-core', () => {
|
|
|
20
14
|
describe('RateLimitInterceptor', () => {
|
|
21
15
|
const idBrokerURL = process.env.IDBROKER_BASE_URL || 'https://idbroker.webex.com';
|
|
22
16
|
const identityURL = process.env.IDENTITY_BASE_URL || 'https://identity.webex.com';
|
|
23
|
-
let clock,
|
|
24
|
-
interceptor,
|
|
25
|
-
webex;
|
|
17
|
+
let clock, interceptor, webex;
|
|
26
18
|
|
|
27
19
|
beforeEach(() => {
|
|
28
20
|
webex = new MockWebex({
|
|
29
21
|
children: {
|
|
30
|
-
credentials: Credentials
|
|
22
|
+
credentials: Credentials,
|
|
31
23
|
},
|
|
32
|
-
config: cloneDeep(config)
|
|
24
|
+
config: cloneDeep(config),
|
|
33
25
|
});
|
|
34
26
|
|
|
35
|
-
webex.credentials.supertoken = new Token(
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
27
|
+
webex.credentials.supertoken = new Token(
|
|
28
|
+
{
|
|
29
|
+
access_token: 'ST1',
|
|
30
|
+
token_type: 'Bearer',
|
|
31
|
+
},
|
|
32
|
+
{parent: webex}
|
|
33
|
+
);
|
|
39
34
|
|
|
40
35
|
interceptor = Reflect.apply(RateLimitInterceptor.create, webex, []);
|
|
41
36
|
clock = FakeTimers.install({now: Date.now()});
|
|
@@ -58,8 +53,10 @@ describe('webex-core', () => {
|
|
|
58
53
|
|
|
59
54
|
return assert.equal(interceptor.isRateLimited(`${identityURL}/horse/v1/myID`), false);
|
|
60
55
|
});
|
|
61
|
-
it('returns false when URI is not IDbroker URI', () =>
|
|
62
|
-
|
|
56
|
+
it('returns false when URI is not IDbroker URI', () =>
|
|
57
|
+
assert.equal(interceptor.isRateLimited('https://example.com/testFake'), false));
|
|
58
|
+
it('returns false if the URI is null', () =>
|
|
59
|
+
assert.equal(interceptor.isRateLimited(null), false));
|
|
63
60
|
it.skip('returns true when idbroker API is rate limited', () => {
|
|
64
61
|
interceptor.setRateLimitExpiry(`${idBrokerURL}/horse/v1/myID`, new Date().getTime() * 2);
|
|
65
62
|
|
|
@@ -73,35 +70,46 @@ describe('webex-core', () => {
|
|
|
73
70
|
});
|
|
74
71
|
|
|
75
72
|
describe('#getApiName', () => {
|
|
76
|
-
it('returns null when there is no regex match', () =>
|
|
77
|
-
|
|
78
|
-
it
|
|
79
|
-
|
|
73
|
+
it('returns null when there is no regex match', () =>
|
|
74
|
+
assert.equal(interceptor.getApiName('https://example.com/testFake'), null));
|
|
75
|
+
it('returns null when the argument is null', () =>
|
|
76
|
+
assert.equal(interceptor.getApiName(null), null));
|
|
77
|
+
it.skip('returns idbroker API name if there is a match', () =>
|
|
78
|
+
assert.equal(interceptor.getApiName(`${idBrokerURL}/horse/v1/myID`), 'horse'));
|
|
79
|
+
it.skip('returns identity API name if there is a match', () =>
|
|
80
|
+
assert.equal(interceptor.getApiName(`${identityURL}/horse/v1/myID`), 'horse'));
|
|
80
81
|
});
|
|
81
82
|
|
|
82
83
|
describe('#getRateLimitStatus', () => {
|
|
83
|
-
it('returns false if API name is not in rate limit expiry map', () =>
|
|
84
|
+
it('returns false if API name is not in rate limit expiry map', () =>
|
|
85
|
+
assert.equal(interceptor.getRateLimitStatus('https://example.com/testFake'), false));
|
|
84
86
|
it('returns false if idbroker API name is not rate limited', () => {
|
|
85
87
|
interceptor.setRateLimitExpiry(`${idBrokerURL}/horse/v1/myID`, 1);
|
|
86
88
|
clock.tick(2000);
|
|
87
89
|
|
|
88
|
-
return assert.equal(
|
|
90
|
+
return assert.equal(
|
|
91
|
+
interceptor.getRateLimitStatus(`${idBrokerURL}/horse/v1/myID`),
|
|
92
|
+
false
|
|
93
|
+
);
|
|
89
94
|
});
|
|
90
95
|
it('returns false if identity API name is not rate limited', () => {
|
|
91
96
|
interceptor.setRateLimitExpiry(`${identityURL}/horse/v1/myID`, 1);
|
|
92
97
|
clock.tick(2000);
|
|
93
98
|
|
|
94
|
-
return assert.equal(
|
|
99
|
+
return assert.equal(
|
|
100
|
+
interceptor.getRateLimitStatus(`${identityURL}/horse/v1/myID`),
|
|
101
|
+
false
|
|
102
|
+
);
|
|
95
103
|
});
|
|
96
104
|
it.skip('returns true if idbroker the API name is rate limited', () => {
|
|
97
|
-
const future =
|
|
105
|
+
const future = new Date().getTime() * 2;
|
|
98
106
|
|
|
99
107
|
interceptor.setRateLimitExpiry(`${idBrokerURL}/horse/v1/myID`, future);
|
|
100
108
|
|
|
101
109
|
return assert.equal(interceptor.getRateLimitStatus(`${idBrokerURL}/horse/v1/myID`), true);
|
|
102
110
|
});
|
|
103
111
|
it.skip('returns true if the identity API name is rate limited', () => {
|
|
104
|
-
const future =
|
|
112
|
+
const future = new Date().getTime() * 2;
|
|
105
113
|
|
|
106
114
|
interceptor.setRateLimitExpiry(`${identityURL}/horse/v1/myID`, future);
|
|
107
115
|
|
|
@@ -110,7 +118,8 @@ describe('webex-core', () => {
|
|
|
110
118
|
});
|
|
111
119
|
|
|
112
120
|
describe('#setRateLimitExpiry', () => {
|
|
113
|
-
it('returns false if URI results in API name that is null', () =>
|
|
121
|
+
it('returns false if URI results in API name that is null', () =>
|
|
122
|
+
assert.equal(interceptor.setRateLimitExpiry('https://example.com/testFake', 1), false));
|
|
114
123
|
it.skip('sets expiry if idroker URI results in API name that can be mapped', () => {
|
|
115
124
|
interceptor.setRateLimitExpiry(`${idBrokerURL}/horse/v1/myID`, new Date().getTime() * 2);
|
|
116
125
|
|
|
@@ -126,10 +135,26 @@ describe('webex-core', () => {
|
|
|
126
135
|
describe('#extractRetryAfterTime', () => {
|
|
127
136
|
const milliMultiplier = 1000;
|
|
128
137
|
|
|
129
|
-
it('returns 60K milliseconds when retry-after <= 0S', () =>
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
138
|
+
it('returns 60K milliseconds when retry-after <= 0S', () =>
|
|
139
|
+
assert.equal(
|
|
140
|
+
interceptor.extractRetryAfterTime({headers: {'retry-after': -1}}),
|
|
141
|
+
60 * milliMultiplier
|
|
142
|
+
));
|
|
143
|
+
it('returns 60K milliseconds when retry-after is null', () =>
|
|
144
|
+
assert.equal(
|
|
145
|
+
interceptor.extractRetryAfterTime({headers: {'retry-after-missing': 10}}),
|
|
146
|
+
60 * milliMultiplier
|
|
147
|
+
));
|
|
148
|
+
it('returns 3600K milliseconds when retry-after is > 3600S', () =>
|
|
149
|
+
assert.equal(
|
|
150
|
+
interceptor.extractRetryAfterTime({headers: {'retry-after': 7200}}),
|
|
151
|
+
3600 * milliMultiplier
|
|
152
|
+
));
|
|
153
|
+
it('returns retry-after * 1000 (converts to milliseconds) if 0S < retry-after < 3600S', () =>
|
|
154
|
+
assert.equal(
|
|
155
|
+
interceptor.extractRetryAfterTime({headers: {'retry-after': 55}}),
|
|
156
|
+
55 * milliMultiplier
|
|
157
|
+
));
|
|
133
158
|
});
|
|
134
159
|
|
|
135
160
|
describe('#onRequest', () => {
|
|
@@ -175,98 +200,102 @@ describe('webex-core', () => {
|
|
|
175
200
|
options: {
|
|
176
201
|
headers: {
|
|
177
202
|
trackingid: 'test',
|
|
178
|
-
'retry-after': 60
|
|
203
|
+
'retry-after': 60,
|
|
179
204
|
},
|
|
180
|
-
uri: `${idBrokerURL}/horse/v1/myID
|
|
205
|
+
uri: `${idBrokerURL}/horse/v1/myID`,
|
|
181
206
|
},
|
|
182
207
|
body: {
|
|
183
|
-
error: 'Too Many Requests'
|
|
184
|
-
}
|
|
208
|
+
error: 'Too Many Requests',
|
|
209
|
+
},
|
|
185
210
|
});
|
|
186
211
|
const err429identity = new WebexHttpError.TooManyRequests({
|
|
187
212
|
statusCode: 429,
|
|
188
213
|
options: {
|
|
189
214
|
headers: {
|
|
190
215
|
trackingid: 'test',
|
|
191
|
-
'retry-after': 60
|
|
216
|
+
'retry-after': 60,
|
|
192
217
|
},
|
|
193
|
-
uri: `${identityURL}/horse/v1/myID
|
|
218
|
+
uri: `${identityURL}/horse/v1/myID`,
|
|
194
219
|
},
|
|
195
220
|
body: {
|
|
196
|
-
error: 'Too Many Requests'
|
|
197
|
-
}
|
|
221
|
+
error: 'Too Many Requests',
|
|
222
|
+
},
|
|
198
223
|
});
|
|
199
224
|
const err429notIdBroker = new WebexHttpError.TooManyRequests({
|
|
200
225
|
statusCode: 429,
|
|
201
226
|
options: {
|
|
202
227
|
headers: {
|
|
203
228
|
trackingid: 'test',
|
|
204
|
-
'retry-after': 60
|
|
229
|
+
'retry-after': 60,
|
|
205
230
|
},
|
|
206
|
-
uri: 'https://example.com/horse/v1/myID'
|
|
231
|
+
uri: 'https://example.com/horse/v1/myID',
|
|
207
232
|
},
|
|
208
233
|
body: {
|
|
209
|
-
error: 'Too Many Requests'
|
|
210
|
-
}
|
|
234
|
+
error: 'Too Many Requests',
|
|
235
|
+
},
|
|
211
236
|
});
|
|
212
237
|
const err404 = new WebexHttpError.BadRequest({
|
|
213
238
|
statusCode: 404,
|
|
214
239
|
options: {
|
|
215
240
|
headers: {
|
|
216
241
|
trackingid: 'test',
|
|
217
|
-
'retry-after': 60
|
|
242
|
+
'retry-after': 60,
|
|
218
243
|
},
|
|
219
|
-
uri: `${idBrokerURL}/horse/v1/myID
|
|
244
|
+
uri: `${idBrokerURL}/horse/v1/myID`,
|
|
220
245
|
},
|
|
221
246
|
body: {
|
|
222
|
-
error: 'Resource Not Found'
|
|
223
|
-
}
|
|
247
|
+
error: 'Resource Not Found',
|
|
248
|
+
},
|
|
224
249
|
});
|
|
225
250
|
const optionsIdBroker = {
|
|
226
251
|
headers: {
|
|
227
252
|
trackingid: 'test',
|
|
228
|
-
'retry-after': 60
|
|
253
|
+
'retry-after': 60,
|
|
229
254
|
},
|
|
230
|
-
uri: `${idBrokerURL}/horse/v1/myID
|
|
255
|
+
uri: `${idBrokerURL}/horse/v1/myID`,
|
|
231
256
|
};
|
|
232
257
|
|
|
233
|
-
|
|
234
258
|
const optionsIdentity = {
|
|
235
259
|
headers: {
|
|
236
260
|
trackingid: 'test',
|
|
237
|
-
'retry-after': 60
|
|
261
|
+
'retry-after': 60,
|
|
238
262
|
},
|
|
239
|
-
uri: `${identityURL}/horse/v1/myID
|
|
263
|
+
uri: `${identityURL}/horse/v1/myID`,
|
|
240
264
|
};
|
|
241
265
|
|
|
242
266
|
const optionsNotIdBroker = {
|
|
243
267
|
headers: {
|
|
244
268
|
trackingid: 'test',
|
|
245
|
-
'retry-after': 60
|
|
269
|
+
'retry-after': 60,
|
|
246
270
|
},
|
|
247
|
-
uri: 'https://example.com/horse/v1/myID'
|
|
271
|
+
uri: 'https://example.com/horse/v1/myID',
|
|
248
272
|
};
|
|
249
273
|
|
|
250
|
-
it.skip('Stores API name and retry-after when status code is 429 and URI is idbroker', () =>
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
274
|
+
it.skip('Stores API name and retry-after when status code is 429 and URI is idbroker', () =>
|
|
275
|
+
interceptor.onResponseError(optionsIdBroker, err429).catch((resp) => {
|
|
276
|
+
assert.equal(interceptor.isRateLimited(`${idBrokerURL}/horse/v1/myID`), true);
|
|
277
|
+
assert.equal(resp, err429);
|
|
278
|
+
}));
|
|
279
|
+
it.skip('Stores API name and retry-after when status code is 429 and URI is identity', () =>
|
|
280
|
+
interceptor.onResponseError(optionsIdentity, err429identity).catch((resp) => {
|
|
281
|
+
assert.equal(interceptor.isRateLimited(`${identityURL}/horse/v1/myID`), true);
|
|
282
|
+
assert.equal(resp, err429identity);
|
|
283
|
+
}));
|
|
284
|
+
it('Does not store API name and retry-after when URI is idbroker and status code is not 429', () =>
|
|
285
|
+
interceptor.onResponseError(optionsIdBroker, err404).catch((resp) => {
|
|
286
|
+
assert.equal(interceptor.isRateLimited(`${idBrokerURL}/horse/v1/myID`), false);
|
|
287
|
+
assert.equal(resp, err404);
|
|
288
|
+
}));
|
|
289
|
+
it('Does not store API name and retry-after when URI is identity and status code is not 429', () =>
|
|
290
|
+
interceptor.onResponseError(optionsIdentity, err404).catch((resp) => {
|
|
291
|
+
assert.equal(interceptor.isRateLimited(`${identityURL}/horse/v1/myID`), false);
|
|
292
|
+
assert.equal(resp, err404);
|
|
293
|
+
}));
|
|
294
|
+
it('Does not store API name and retry-after when status is 429 and URI is not idbroker', () =>
|
|
295
|
+
interceptor.onResponseError(optionsNotIdBroker, err429notIdBroker).catch((resp) => {
|
|
296
|
+
assert.equal(interceptor.isRateLimited('https://example.com/horse/v1/myID'), false);
|
|
297
|
+
assert.equal(resp, err429notIdBroker);
|
|
298
|
+
}));
|
|
270
299
|
});
|
|
271
300
|
});
|
|
272
301
|
});
|
|
@@ -7,11 +7,7 @@
|
|
|
7
7
|
import sinon from 'sinon';
|
|
8
8
|
import {assert} from '@webex/test-helper-chai';
|
|
9
9
|
import MockWebex from '@webex/test-helper-mock-webex';
|
|
10
|
-
import {
|
|
11
|
-
RedirectInterceptor,
|
|
12
|
-
config,
|
|
13
|
-
Credentials
|
|
14
|
-
} from '@webex/webex-core';
|
|
10
|
+
import {RedirectInterceptor, config, Credentials} from '@webex/webex-core';
|
|
15
11
|
import {cloneDeep} from 'lodash';
|
|
16
12
|
|
|
17
13
|
describe('webex-core', () => {
|
|
@@ -22,10 +18,10 @@ describe('webex-core', () => {
|
|
|
22
18
|
beforeEach(() => {
|
|
23
19
|
webex = new MockWebex({
|
|
24
20
|
children: {
|
|
25
|
-
credentials: Credentials
|
|
21
|
+
credentials: Credentials,
|
|
26
22
|
},
|
|
27
23
|
config: cloneDeep(config),
|
|
28
|
-
request: sinon.spy()
|
|
24
|
+
request: sinon.spy(),
|
|
29
25
|
});
|
|
30
26
|
|
|
31
27
|
interceptor = Reflect.apply(RedirectInterceptor.create, webex, []);
|
|
@@ -38,12 +34,15 @@ describe('webex-core', () => {
|
|
|
38
34
|
headers: {},
|
|
39
35
|
body: {
|
|
40
36
|
errorCode: 2000002,
|
|
41
|
-
location: 'http://newlocus.example.com'
|
|
42
|
-
}
|
|
37
|
+
location: 'http://newlocus.example.com',
|
|
38
|
+
},
|
|
43
39
|
};
|
|
44
40
|
|
|
45
41
|
interceptor.onResponse({$redirectCount: 0}, response);
|
|
46
|
-
sinon.assert.calledWith(webex.request, {
|
|
42
|
+
sinon.assert.calledWith(webex.request, {
|
|
43
|
+
$redirectCount: 1,
|
|
44
|
+
uri: 'http://newlocus.example.com',
|
|
45
|
+
});
|
|
47
46
|
});
|
|
48
47
|
|
|
49
48
|
it('redirects POST requests to new url on locus redirect error', () => {
|
|
@@ -52,15 +51,18 @@ describe('webex-core', () => {
|
|
|
52
51
|
headers: {},
|
|
53
52
|
body: {
|
|
54
53
|
errorCode: 2000002,
|
|
55
|
-
location: 'http://newlocus.example.com?alternate=true'
|
|
54
|
+
location: 'http://newlocus.example.com?alternate=true',
|
|
56
55
|
},
|
|
57
56
|
options: {
|
|
58
|
-
qs: true
|
|
59
|
-
}
|
|
57
|
+
qs: true,
|
|
58
|
+
},
|
|
60
59
|
};
|
|
61
60
|
|
|
62
61
|
interceptor.onResponse({$redirectCount: 4}, response);
|
|
63
|
-
sinon.assert.calledWith(webex.request, {
|
|
62
|
+
sinon.assert.calledWith(webex.request, {
|
|
63
|
+
$redirectCount: 5,
|
|
64
|
+
uri: 'http://newlocus.example.com',
|
|
65
|
+
});
|
|
64
66
|
});
|
|
65
67
|
|
|
66
68
|
it('does not redirect on reaching max redirects', () => {
|
|
@@ -69,11 +71,11 @@ describe('webex-core', () => {
|
|
|
69
71
|
headers: {},
|
|
70
72
|
body: {
|
|
71
73
|
errorCode: 2000002,
|
|
72
|
-
location: 'http://newlocus.example.com?alternate=true'
|
|
74
|
+
location: 'http://newlocus.example.com?alternate=true',
|
|
73
75
|
},
|
|
74
76
|
options: {
|
|
75
|
-
qs: true
|
|
76
|
-
}
|
|
77
|
+
qs: true,
|
|
78
|
+
},
|
|
77
79
|
};
|
|
78
80
|
|
|
79
81
|
assert.isRejected(interceptor.onResponse({$redirectCount: 5}, response));
|
|
@@ -85,11 +87,11 @@ describe('webex-core', () => {
|
|
|
85
87
|
headers: {},
|
|
86
88
|
body: {
|
|
87
89
|
errorCode: 20000,
|
|
88
|
-
location: 'http://newlocus.example.com?alternate=true'
|
|
90
|
+
location: 'http://newlocus.example.com?alternate=true',
|
|
89
91
|
},
|
|
90
92
|
options: {
|
|
91
|
-
qs: true
|
|
92
|
-
}
|
|
93
|
+
qs: true,
|
|
94
|
+
},
|
|
93
95
|
};
|
|
94
96
|
|
|
95
97
|
assert.equal(interceptor.onResponse({$redirectCount: 5}, response), response);
|
|
@@ -24,7 +24,7 @@ describe('webex-core', () => {
|
|
|
24
24
|
|
|
25
25
|
it('adds a requestStart time to options.$timings', () => {
|
|
26
26
|
const options = {
|
|
27
|
-
$timings: {}
|
|
27
|
+
$timings: {},
|
|
28
28
|
};
|
|
29
29
|
|
|
30
30
|
interceptor.onRequest(options);
|
|
@@ -36,31 +36,29 @@ describe('webex-core', () => {
|
|
|
36
36
|
describe('.onRequestError()', () => {
|
|
37
37
|
it('adds a requestEnd time to options.$timings', () => {
|
|
38
38
|
const options = {
|
|
39
|
-
$timings: {}
|
|
39
|
+
$timings: {},
|
|
40
40
|
};
|
|
41
41
|
|
|
42
|
-
return assert.isRejected(interceptor.onRequestError(options))
|
|
43
|
-
.
|
|
44
|
-
|
|
45
|
-
});
|
|
42
|
+
return assert.isRejected(interceptor.onRequestError(options)).then(() => {
|
|
43
|
+
assert.property(options.$timings, 'requestEnd');
|
|
44
|
+
});
|
|
46
45
|
});
|
|
47
46
|
|
|
48
47
|
it('adds a requestFail time to options.$timings', () => {
|
|
49
48
|
const options = {
|
|
50
|
-
$timings: {}
|
|
49
|
+
$timings: {},
|
|
51
50
|
};
|
|
52
51
|
|
|
53
|
-
return assert.isRejected(interceptor.onRequestError(options))
|
|
54
|
-
.
|
|
55
|
-
|
|
56
|
-
});
|
|
52
|
+
return assert.isRejected(interceptor.onRequestError(options)).then(() => {
|
|
53
|
+
assert.property(options.$timings, 'requestFail');
|
|
54
|
+
});
|
|
57
55
|
});
|
|
58
56
|
});
|
|
59
57
|
|
|
60
58
|
describe('.onResponse()', () => {
|
|
61
59
|
it('adds a requestEnd time to options.$timings', () => {
|
|
62
60
|
const options = {
|
|
63
|
-
$timings: {}
|
|
61
|
+
$timings: {},
|
|
64
62
|
};
|
|
65
63
|
|
|
66
64
|
interceptor.onResponse(options);
|
|
@@ -71,24 +69,22 @@ describe('webex-core', () => {
|
|
|
71
69
|
describe('.onResponseError()', () => {
|
|
72
70
|
it('adds a requestEnd time to options.$timings', () => {
|
|
73
71
|
const options = {
|
|
74
|
-
$timings: {}
|
|
72
|
+
$timings: {},
|
|
75
73
|
};
|
|
76
74
|
|
|
77
|
-
return assert.isRejected(interceptor.onResponseError(options))
|
|
78
|
-
.
|
|
79
|
-
|
|
80
|
-
});
|
|
75
|
+
return assert.isRejected(interceptor.onResponseError(options)).then(() => {
|
|
76
|
+
assert.property(options.$timings, 'requestEnd');
|
|
77
|
+
});
|
|
81
78
|
});
|
|
82
79
|
|
|
83
80
|
it('adds a requestFail time to options.$timings', () => {
|
|
84
81
|
const options = {
|
|
85
|
-
$timings: {}
|
|
82
|
+
$timings: {},
|
|
86
83
|
};
|
|
87
84
|
|
|
88
|
-
return assert.isRejected(interceptor.onResponseError(options))
|
|
89
|
-
.
|
|
90
|
-
|
|
91
|
-
});
|
|
85
|
+
return assert.isRejected(interceptor.onResponseError(options)).then(() => {
|
|
86
|
+
assert.property(options.$timings, 'requestFail');
|
|
87
|
+
});
|
|
92
88
|
});
|
|
93
89
|
});
|
|
94
90
|
});
|
|
@@ -14,9 +14,13 @@ describe('webex-core', () => {
|
|
|
14
14
|
// Do not set custom headers for browsers
|
|
15
15
|
skipInBrowser(describe)('#onRequest', () => {
|
|
16
16
|
it('default user-agent header', () => {
|
|
17
|
-
const interceptor = Reflect.apply(
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
const interceptor = Reflect.apply(
|
|
18
|
+
UserAgentInterceptor.create,
|
|
19
|
+
{
|
|
20
|
+
version: pkg.version,
|
|
21
|
+
},
|
|
22
|
+
[]
|
|
23
|
+
);
|
|
20
24
|
const options = {headers: {}};
|
|
21
25
|
|
|
22
26
|
interceptor.onRequest(options);
|
|
@@ -27,13 +31,17 @@ describe('webex-core', () => {
|
|
|
27
31
|
});
|
|
28
32
|
|
|
29
33
|
it('custom user-agent header', () => {
|
|
30
|
-
const interceptor = Reflect.apply(
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
const interceptor = Reflect.apply(
|
|
35
|
+
UserAgentInterceptor.create,
|
|
36
|
+
{
|
|
37
|
+
version: pkg.version,
|
|
38
|
+
config: {
|
|
39
|
+
appName: 'sample',
|
|
40
|
+
appVersion: '1.0.0',
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
[]
|
|
44
|
+
);
|
|
37
45
|
const options = {headers: {}};
|
|
38
46
|
|
|
39
47
|
interceptor.onRequest(options);
|
|
@@ -44,12 +52,16 @@ describe('webex-core', () => {
|
|
|
44
52
|
});
|
|
45
53
|
|
|
46
54
|
it('custom user-agent header when there is no appVersion', () => {
|
|
47
|
-
const interceptor = Reflect.apply(
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
55
|
+
const interceptor = Reflect.apply(
|
|
56
|
+
UserAgentInterceptor.create,
|
|
57
|
+
{
|
|
58
|
+
version: pkg.version,
|
|
59
|
+
config: {
|
|
60
|
+
appName: 'sample',
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
[]
|
|
64
|
+
);
|
|
53
65
|
const options = {headers: {}};
|
|
54
66
|
|
|
55
67
|
interceptor.onRequest(options);
|
|
@@ -11,9 +11,13 @@ describe('webex-core', () => {
|
|
|
11
11
|
let interceptor;
|
|
12
12
|
|
|
13
13
|
beforeEach(() => {
|
|
14
|
-
interceptor = Reflect.apply(
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
interceptor = Reflect.apply(
|
|
15
|
+
WebexTrackingIdInterceptor.create,
|
|
16
|
+
{
|
|
17
|
+
sessionId: 'mock-webex_uuid',
|
|
18
|
+
},
|
|
19
|
+
[]
|
|
20
|
+
);
|
|
17
21
|
});
|
|
18
22
|
|
|
19
23
|
describe('#sequence', () => {
|
|
@@ -36,11 +40,13 @@ describe('webex-core', () => {
|
|
|
36
40
|
});
|
|
37
41
|
|
|
38
42
|
it('does not add a trackingid if one has already been added', () => {
|
|
39
|
-
assert.isFalse(
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
43
|
+
assert.isFalse(
|
|
44
|
+
interceptor.requiresTrackingId({
|
|
45
|
+
headers: {
|
|
46
|
+
trackingid: 'some id',
|
|
47
|
+
},
|
|
48
|
+
})
|
|
49
|
+
);
|
|
44
50
|
});
|
|
45
51
|
});
|
|
46
52
|
|