@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
package/src/index.js
CHANGED
|
@@ -13,13 +13,7 @@ import './plugins/logger';
|
|
|
13
13
|
import './lib/credentials';
|
|
14
14
|
import './lib/services';
|
|
15
15
|
|
|
16
|
-
export {
|
|
17
|
-
Credentials,
|
|
18
|
-
filterScope,
|
|
19
|
-
grantErrors,
|
|
20
|
-
sortScope,
|
|
21
|
-
Token
|
|
22
|
-
} from './lib/credentials';
|
|
16
|
+
export {Credentials, filterScope, grantErrors, sortScope, Token} from './lib/credentials';
|
|
23
17
|
|
|
24
18
|
export {
|
|
25
19
|
constants as serviceConstants,
|
|
@@ -30,7 +24,7 @@ export {
|
|
|
30
24
|
ServerErrorInterceptor,
|
|
31
25
|
Services,
|
|
32
26
|
ServiceHost,
|
|
33
|
-
ServiceUrl
|
|
27
|
+
ServiceUrl,
|
|
34
28
|
} from './lib/services';
|
|
35
29
|
|
|
36
30
|
export {
|
|
@@ -40,14 +34,10 @@ export {
|
|
|
40
34
|
NotFoundError,
|
|
41
35
|
persist,
|
|
42
36
|
StorageError,
|
|
43
|
-
waitForValue
|
|
37
|
+
waitForValue,
|
|
44
38
|
} from './lib/storage';
|
|
45
39
|
|
|
46
|
-
export {
|
|
47
|
-
default,
|
|
48
|
-
registerPlugin,
|
|
49
|
-
registerInternalPlugin
|
|
50
|
-
} from './webex-core';
|
|
40
|
+
export {default, registerPlugin, registerInternalPlugin} from './webex-core';
|
|
51
41
|
|
|
52
42
|
export {default as WebexHttpError} from './lib/webex-http-error';
|
|
53
43
|
export {default as StatelessWebexPlugin} from './lib/stateless-webex-plugin';
|
package/src/interceptors/auth.js
CHANGED
|
@@ -34,19 +34,17 @@ export default class AuthInterceptor extends Interceptor {
|
|
|
34
34
|
return Promise.resolve(options);
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
return this.requiresCredentials(options)
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
37
|
+
return this.requiresCredentials(options).then((requires) => {
|
|
38
|
+
if (!requires) {
|
|
39
|
+
return options;
|
|
40
|
+
}
|
|
42
41
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
options.headers.authorization = token.toString();
|
|
42
|
+
return this.webex.credentials.getUserToken().then((token) => {
|
|
43
|
+
options.headers.authorization = token.toString();
|
|
46
44
|
|
|
47
|
-
|
|
48
|
-
});
|
|
45
|
+
return options;
|
|
49
46
|
});
|
|
47
|
+
});
|
|
50
48
|
}
|
|
51
49
|
|
|
52
50
|
/**
|
|
@@ -77,26 +75,26 @@ export default class AuthInterceptor extends Interceptor {
|
|
|
77
75
|
|
|
78
76
|
// Unique validation for the u2c service.
|
|
79
77
|
if ((service && service === 'u2c') || (name && name === 'u2c')) {
|
|
80
|
-
if (
|
|
81
|
-
(resource && resource.includes('limited')) ||
|
|
82
|
-
(uri && uri.includes('limited'))
|
|
83
|
-
) {
|
|
78
|
+
if ((resource && resource.includes('limited')) || (uri && uri.includes('limited'))) {
|
|
84
79
|
return Promise.resolve(false);
|
|
85
80
|
}
|
|
86
81
|
|
|
87
82
|
return Promise.resolve(true);
|
|
88
83
|
}
|
|
89
84
|
|
|
90
|
-
|
|
91
85
|
// Validate that the allowed domains can be utilized.
|
|
92
|
-
if (
|
|
86
|
+
if (
|
|
87
|
+
services.validateDomains &&
|
|
93
88
|
services.hasAllowedDomains() &&
|
|
94
|
-
|
|
89
|
+
uri &&
|
|
90
|
+
services.isAllowedDomainUrl(uri)
|
|
91
|
+
) {
|
|
95
92
|
return Promise.resolve(true);
|
|
96
93
|
}
|
|
97
94
|
|
|
98
95
|
// Perform an additional validation in case the service does not exist yet.
|
|
99
|
-
return services
|
|
96
|
+
return services
|
|
97
|
+
.waitForService({name: service, url: uri})
|
|
100
98
|
.then((detectedUrl) => {
|
|
101
99
|
// Validate that the url exists in the catalog.
|
|
102
100
|
if (services.getServiceFromUrl(detectedUrl)) {
|
|
@@ -123,23 +121,21 @@ export default class AuthInterceptor extends Interceptor {
|
|
|
123
121
|
* @returns {Object}
|
|
124
122
|
*/
|
|
125
123
|
onResponseError(options, reason) {
|
|
126
|
-
return this.shouldAttemptReauth(reason, options)
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
Reflect.deleteProperty(reason.options.headers, 'authorization');
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
if (this.webex.credentials.canRefresh) {
|
|
136
|
-
return this.webex.credentials.refresh()
|
|
137
|
-
.then(() => this.replay(options));
|
|
138
|
-
}
|
|
124
|
+
return this.shouldAttemptReauth(reason, options).then((shouldAttemptReauth) => {
|
|
125
|
+
if (shouldAttemptReauth) {
|
|
126
|
+
this.webex.logger.info('auth: received 401, attempting to reauthenticate');
|
|
127
|
+
|
|
128
|
+
if (reason.options.headers) {
|
|
129
|
+
Reflect.deleteProperty(reason.options.headers, 'authorization');
|
|
139
130
|
}
|
|
140
131
|
|
|
141
|
-
|
|
142
|
-
|
|
132
|
+
if (this.webex.credentials.canRefresh) {
|
|
133
|
+
return this.webex.credentials.refresh().then(() => this.replay(options));
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return Promise.reject(reason);
|
|
138
|
+
});
|
|
143
139
|
}
|
|
144
140
|
|
|
145
141
|
/**
|
|
@@ -150,15 +146,18 @@ export default class AuthInterceptor extends Interceptor {
|
|
|
150
146
|
replay(options) {
|
|
151
147
|
if (options.replayCount) {
|
|
152
148
|
options.replayCount += 1;
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
149
|
+
} else {
|
|
155
150
|
options.replayCount = 1;
|
|
156
151
|
}
|
|
157
152
|
|
|
158
153
|
if (options.replayCount > this.webex.config.maxAuthenticationReplays) {
|
|
159
|
-
this.webex.logger.error(
|
|
154
|
+
this.webex.logger.error(
|
|
155
|
+
`auth: failed after ${this.webex.config.maxAuthenticationReplays} replay attempts`
|
|
156
|
+
);
|
|
160
157
|
|
|
161
|
-
return Promise.reject(
|
|
158
|
+
return Promise.reject(
|
|
159
|
+
new Error(`Failed after ${this.webex.config.maxAuthenticationReplays} replay attempts`)
|
|
160
|
+
);
|
|
162
161
|
}
|
|
163
162
|
|
|
164
163
|
this.webex.logger.info(`auth: replaying request ${options.replayCount} time`);
|
|
@@ -27,7 +27,7 @@ export default class EmbargoInterceptor extends Interceptor {
|
|
|
27
27
|
const {device} = this.webex.internal;
|
|
28
28
|
const loggerMessage = [
|
|
29
29
|
'Received `HTTP 451 Unavailable For Legal Reasons`, ',
|
|
30
|
-
'discarding credentials and device registration'
|
|
30
|
+
'discarding credentials and device registration',
|
|
31
31
|
].join('');
|
|
32
32
|
|
|
33
33
|
if (device) {
|
|
@@ -50,7 +50,6 @@ export default class PayloadTransformerInterceptor extends Interceptor {
|
|
|
50
50
|
* @returns {Object}
|
|
51
51
|
*/
|
|
52
52
|
onResponseError(options, reason) {
|
|
53
|
-
return this.webex.transform('inbound', reason)
|
|
54
|
-
.then((r) => Promise.reject(r || reason));
|
|
53
|
+
return this.webex.transform('inbound', reason).then((r) => Promise.reject(r || reason));
|
|
55
54
|
}
|
|
56
55
|
}
|
|
@@ -23,10 +23,10 @@ export default class RateLimitInterceptor extends Interceptor {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
* constructor
|
|
27
|
+
* @param {mixed} args
|
|
28
|
+
* @returns {Exception}
|
|
29
|
+
*/
|
|
30
30
|
constructor(...args) {
|
|
31
31
|
super(...args);
|
|
32
32
|
rateLimitExpiryTime.set(this, new Map());
|
|
@@ -52,7 +52,10 @@ export default class RateLimitInterceptor extends Interceptor {
|
|
|
52
52
|
* @returns {Object}
|
|
53
53
|
*/
|
|
54
54
|
onResponseError(options, reason) {
|
|
55
|
-
if (
|
|
55
|
+
if (
|
|
56
|
+
reason.statusCode === 429 &&
|
|
57
|
+
(options.uri.includes('idbroker') || options.uri.includes('identity'))
|
|
58
|
+
) {
|
|
56
59
|
// set the retry after in the map, setting to milliseconds
|
|
57
60
|
this.setRateLimitExpiry(options.uri, this.extractRetryAfterTime(options));
|
|
58
61
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/* eslint-disable prefer-destructuring */
|
|
2
|
+
|
|
1
3
|
/*!
|
|
2
4
|
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
3
5
|
*/
|
|
@@ -27,10 +29,12 @@ export default class RedirectInterceptor extends Interceptor {
|
|
|
27
29
|
*/
|
|
28
30
|
onRequest(options) {
|
|
29
31
|
if (options && options.uri && typeof options.uri === 'string') {
|
|
30
|
-
if (
|
|
32
|
+
if (
|
|
33
|
+
options.uri.includes('https://idbroker') ||
|
|
31
34
|
options.uri.includes(this.webex.config.credentials.samlUrl) ||
|
|
32
35
|
options.uri.includes(this.webex.config.credentials.tokenUrl) ||
|
|
33
|
-
options.uri.includes(this.webex.config.credentials.authorizeUrl)
|
|
36
|
+
options.uri.includes(this.webex.config.credentials.authorizeUrl)
|
|
37
|
+
) {
|
|
34
38
|
return options;
|
|
35
39
|
}
|
|
36
40
|
}
|
|
@@ -68,20 +72,22 @@ export default class RedirectInterceptor extends Interceptor {
|
|
|
68
72
|
}
|
|
69
73
|
|
|
70
74
|
return this.webex.request(options);
|
|
71
|
-
}
|
|
72
|
-
|
|
75
|
+
} else if (
|
|
76
|
+
response.headers &&
|
|
73
77
|
response.body &&
|
|
74
78
|
response.body.errorCode === LOCUS_REDIRECT_ERROR &&
|
|
75
|
-
response.body.location
|
|
79
|
+
response.body.location
|
|
80
|
+
) {
|
|
76
81
|
options = clone(options);
|
|
77
82
|
|
|
78
83
|
this.webex.logger.warn('redirect: url redirects needed from', options.uri);
|
|
79
|
-
if (response.options && response.options.qs) {
|
|
84
|
+
if (response.options && response.options.qs) {
|
|
85
|
+
// for POST requests
|
|
80
86
|
const newUrl = response.body.location.split('?');
|
|
81
87
|
|
|
82
88
|
options.uri = newUrl[0]; // params are already present in the qs
|
|
83
|
-
}
|
|
84
|
-
|
|
89
|
+
} else {
|
|
90
|
+
// for GET requests
|
|
85
91
|
options.uri = response.body.location;
|
|
86
92
|
}
|
|
87
93
|
|
|
@@ -26,8 +26,7 @@ export default class RequestEventInterceptor extends Interceptor {
|
|
|
26
26
|
|
|
27
27
|
try {
|
|
28
28
|
this.webex.trigger('request:start', options);
|
|
29
|
-
}
|
|
30
|
-
catch (error) {
|
|
29
|
+
} catch (error) {
|
|
31
30
|
logger.warn('event handler for request:start failed ', error);
|
|
32
31
|
}
|
|
33
32
|
|
|
@@ -48,8 +47,7 @@ export default class RequestEventInterceptor extends Interceptor {
|
|
|
48
47
|
try {
|
|
49
48
|
this.webex.trigger('request:end', options, reason);
|
|
50
49
|
this.webex.trigger('request:failure', options, reason);
|
|
51
|
-
}
|
|
52
|
-
catch (error) {
|
|
50
|
+
} catch (error) {
|
|
53
51
|
logger.warn('event handler for request:end failed ', error);
|
|
54
52
|
}
|
|
55
53
|
|
|
@@ -67,8 +65,7 @@ export default class RequestEventInterceptor extends Interceptor {
|
|
|
67
65
|
|
|
68
66
|
try {
|
|
69
67
|
this.webex.trigger('request:success', response.options, response);
|
|
70
|
-
}
|
|
71
|
-
catch (error) {
|
|
68
|
+
} catch (error) {
|
|
72
69
|
logger.warn('event handler for request:success failed ', error);
|
|
73
70
|
}
|
|
74
71
|
|
|
@@ -87,8 +84,7 @@ export default class RequestEventInterceptor extends Interceptor {
|
|
|
87
84
|
try {
|
|
88
85
|
this.webex.trigger('request:end', options, reason);
|
|
89
86
|
this.webex.trigger('request:failure', options, reason);
|
|
90
|
-
}
|
|
91
|
-
catch (error) {
|
|
87
|
+
} catch (error) {
|
|
92
88
|
logger.warn('event handler for request:failure failed ', error);
|
|
93
89
|
}
|
|
94
90
|
|
|
@@ -40,14 +40,17 @@ export default class RequestLoggerInterceptor extends Interceptor {
|
|
|
40
40
|
try {
|
|
41
41
|
// Determine if body is a buffer without relying on Buffer to avoid
|
|
42
42
|
// node/browser conflicts.
|
|
43
|
-
if (
|
|
43
|
+
if (
|
|
44
|
+
options.body &&
|
|
45
|
+
options.body.length &&
|
|
46
|
+
!isArray(options.body) &&
|
|
47
|
+
!isString(options.body)
|
|
48
|
+
) {
|
|
44
49
|
logger.info('Request Options:', util.inspect(omit(options, 'body'), {depth: null}));
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
50
|
+
} else {
|
|
47
51
|
logger.info('Request Options:', util.inspect(options, {depth: null}));
|
|
48
52
|
}
|
|
49
|
-
}
|
|
50
|
-
catch (e) {
|
|
53
|
+
} catch (e) {
|
|
51
54
|
logger.warn('Could not stringify request options:', e);
|
|
52
55
|
}
|
|
53
56
|
}
|
|
@@ -36,12 +36,10 @@ export default class ResponseLoggerInterceptor extends Interceptor {
|
|
|
36
36
|
logger.info('timestamp (end): ', now.getTime(), now.toISOString());
|
|
37
37
|
if (typeof response.body === 'string' || isBuffer(response.body)) {
|
|
38
38
|
logger.info('Response: ', 'Not printed, it`s probably a file');
|
|
39
|
-
}
|
|
40
|
-
else if (typeof response.body === 'object') {
|
|
39
|
+
} else if (typeof response.body === 'object') {
|
|
41
40
|
try {
|
|
42
41
|
logger.info('Response: ', util.inspect(omit(response.body, 'features'), {depth: null}));
|
|
43
|
-
}
|
|
44
|
-
catch (err) {
|
|
42
|
+
} catch (err) {
|
|
45
43
|
logger.info('Response: ', '[Not Serializable]', err);
|
|
46
44
|
}
|
|
47
45
|
}
|
|
@@ -68,8 +66,7 @@ export default class ResponseLoggerInterceptor extends Interceptor {
|
|
|
68
66
|
logger.info('timestamp (end): ', now.getTime(), now.toISOString());
|
|
69
67
|
try {
|
|
70
68
|
logger.error('Response: ', util.inspect(reason.body, {depth: null}));
|
|
71
|
-
}
|
|
72
|
-
catch (err) {
|
|
69
|
+
} catch (err) {
|
|
73
70
|
logger.error('Response: ', reason.body);
|
|
74
71
|
}
|
|
75
72
|
}
|
|
@@ -88,8 +85,14 @@ export default class ResponseLoggerInterceptor extends Interceptor {
|
|
|
88
85
|
const logger = get(this, 'webex.logger', console);
|
|
89
86
|
|
|
90
87
|
logger.info('Status Code:', response.statusCode);
|
|
91
|
-
logger.info(
|
|
88
|
+
logger.info(
|
|
89
|
+
'WEBEX_TRACKINGID:',
|
|
90
|
+
get(options, 'headers.trackingid') || get(response, 'headers.trackingid')
|
|
91
|
+
);
|
|
92
92
|
logger.info('Network duration:', options.$timings.networkEnd - options.$timings.networkStart);
|
|
93
|
-
logger.info(
|
|
93
|
+
logger.info(
|
|
94
|
+
'Processing duration:',
|
|
95
|
+
options.$timings.requestEnd - options.$timings.requestStart
|
|
96
|
+
);
|
|
94
97
|
}
|
|
95
98
|
}
|
|
@@ -41,8 +41,7 @@ export default class UserAgentInterceptor extends Interceptor {
|
|
|
41
41
|
super(options);
|
|
42
42
|
if (appName) {
|
|
43
43
|
strings.set(this, `${appName}/${appVersion}`);
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
44
|
+
} else {
|
|
46
45
|
strings.set(this, '@webex/http-core'); // Using the traditional default from http-core
|
|
47
46
|
}
|
|
48
47
|
}
|
|
@@ -40,11 +40,7 @@ export default class WebexUserAgentInterceptor extends Interceptor {
|
|
|
40
40
|
*/
|
|
41
41
|
onRequest(options) {
|
|
42
42
|
options.headers = options.headers || {};
|
|
43
|
-
const {
|
|
44
|
-
appName,
|
|
45
|
-
appVersion,
|
|
46
|
-
appPlatform
|
|
47
|
-
} = this.webex?.config ?? {};
|
|
43
|
+
const {appName, appVersion, appPlatform} = this.webex?.config ?? {};
|
|
48
44
|
let sparkUserAgent = `${strings.get(this)}`;
|
|
49
45
|
|
|
50
46
|
if (appName) {
|
|
@@ -61,11 +57,9 @@ export default class WebexUserAgentInterceptor extends Interceptor {
|
|
|
61
57
|
|
|
62
58
|
if (
|
|
63
59
|
options.uri &&
|
|
64
|
-
(
|
|
65
|
-
options.uri.includes(this.webex.config.credentials.samlUrl) ||
|
|
60
|
+
(options.uri.includes(this.webex.config.credentials.samlUrl) ||
|
|
66
61
|
options.uri.includes(this.webex.config.credentials.tokenUrl) ||
|
|
67
|
-
options.uri.includes(this.webex.config.credentials.authorizeUrl)
|
|
68
|
-
)
|
|
62
|
+
options.uri.includes(this.webex.config.credentials.authorizeUrl))
|
|
69
63
|
) {
|
|
70
64
|
return options;
|
|
71
65
|
}
|
package/src/lib/batcher.js
CHANGED
|
@@ -3,11 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import {has} from 'lodash';
|
|
6
|
-
import {
|
|
7
|
-
cappedDebounce,
|
|
8
|
-
Defer,
|
|
9
|
-
tap
|
|
10
|
-
} from '@webex/common';
|
|
6
|
+
import {cappedDebounce, Defer, tap} from '@webex/common';
|
|
11
7
|
|
|
12
8
|
import WebexPlugin from './webex-plugin';
|
|
13
9
|
import WebexHttpError from './webex-http-error';
|
|
@@ -22,14 +18,14 @@ const Batcher = WebexPlugin.extend({
|
|
|
22
18
|
type: 'object',
|
|
23
19
|
default() {
|
|
24
20
|
return new Map();
|
|
25
|
-
}
|
|
21
|
+
},
|
|
26
22
|
},
|
|
27
23
|
queue: {
|
|
28
24
|
type: 'array',
|
|
29
25
|
default() {
|
|
30
26
|
return [];
|
|
31
|
-
}
|
|
32
|
-
}
|
|
27
|
+
},
|
|
28
|
+
},
|
|
33
29
|
},
|
|
34
30
|
|
|
35
31
|
derived: {
|
|
@@ -37,10 +33,10 @@ const Batcher = WebexPlugin.extend({
|
|
|
37
33
|
fn() {
|
|
38
34
|
return cappedDebounce((...args) => this.executeQueue(...args), this.config.batcherWait, {
|
|
39
35
|
maxCalls: this.config.batcherMaxCalls,
|
|
40
|
-
maxWait: this.config.batcherMaxWait
|
|
36
|
+
maxWait: this.config.batcherMaxWait,
|
|
41
37
|
});
|
|
42
|
-
}
|
|
43
|
-
}
|
|
38
|
+
},
|
|
39
|
+
},
|
|
44
40
|
},
|
|
45
41
|
|
|
46
42
|
/**
|
|
@@ -113,25 +109,30 @@ const Batcher = WebexPlugin.extend({
|
|
|
113
109
|
const queue = this.queue.splice(0, this.config.batcherMaxCalls);
|
|
114
110
|
|
|
115
111
|
return new Promise((resolve) => {
|
|
116
|
-
resolve(
|
|
117
|
-
|
|
118
|
-
.then((
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
112
|
+
resolve(
|
|
113
|
+
this.prepareRequest(queue)
|
|
114
|
+
.then((payload) =>
|
|
115
|
+
this.submitHttpRequest(payload).then((res) => this.handleHttpSuccess(res))
|
|
116
|
+
)
|
|
117
|
+
.catch((reason) => {
|
|
118
|
+
if (reason instanceof WebexHttpError) {
|
|
119
|
+
return this.handleHttpError(reason);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return Promise.all(
|
|
123
|
+
queue.map((item) =>
|
|
124
|
+
this.getDeferredForRequest(item).then((defer) => {
|
|
125
|
+
defer.reject(reason);
|
|
126
|
+
})
|
|
127
|
+
)
|
|
128
|
+
);
|
|
129
|
+
})
|
|
130
|
+
);
|
|
131
|
+
}).catch((reason) => {
|
|
132
|
+
this.logger.error(process.env.NODE_ENV === 'production' ? reason : reason.stack);
|
|
133
|
+
|
|
134
|
+
return Promise.reject(reason);
|
|
135
|
+
});
|
|
135
136
|
},
|
|
136
137
|
|
|
137
138
|
/**
|
|
@@ -162,7 +163,9 @@ const Batcher = WebexPlugin.extend({
|
|
|
162
163
|
* @returns {Promise<undefined>}
|
|
163
164
|
*/
|
|
164
165
|
handleHttpSuccess(res) {
|
|
165
|
-
return Promise.all(
|
|
166
|
+
return Promise.all(
|
|
167
|
+
((res.body && res.body.items) || res.body).map((item) => this.acceptItem(item))
|
|
168
|
+
);
|
|
166
169
|
},
|
|
167
170
|
|
|
168
171
|
/**
|
|
@@ -176,10 +179,13 @@ const Batcher = WebexPlugin.extend({
|
|
|
176
179
|
handleHttpError(reason) {
|
|
177
180
|
if (reason instanceof WebexHttpError) {
|
|
178
181
|
if (has(reason, 'options.body.map')) {
|
|
179
|
-
return Promise.all(
|
|
180
|
-
.
|
|
181
|
-
|
|
182
|
-
|
|
182
|
+
return Promise.all(
|
|
183
|
+
reason.options.body.map((item) =>
|
|
184
|
+
this.getDeferredForRequest(item).then((defer) => {
|
|
185
|
+
defer.reject(reason);
|
|
186
|
+
})
|
|
187
|
+
)
|
|
188
|
+
);
|
|
183
189
|
}
|
|
184
190
|
}
|
|
185
191
|
this.logger.error('http error handler called without a WebexHttpError object', reason);
|
|
@@ -193,14 +199,13 @@ const Batcher = WebexPlugin.extend({
|
|
|
193
199
|
* @returns {Promise<undefined>}
|
|
194
200
|
*/
|
|
195
201
|
acceptItem(item) {
|
|
196
|
-
return this.didItemFail(item)
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
}
|
|
202
|
+
return this.didItemFail(item).then((didFail) => {
|
|
203
|
+
if (didFail) {
|
|
204
|
+
return this.handleItemFailure(item);
|
|
205
|
+
}
|
|
201
206
|
|
|
202
|
-
|
|
203
|
-
|
|
207
|
+
return this.handleItemSuccess(item);
|
|
208
|
+
});
|
|
204
209
|
},
|
|
205
210
|
|
|
206
211
|
/**
|
|
@@ -221,10 +226,9 @@ const Batcher = WebexPlugin.extend({
|
|
|
221
226
|
* @returns {Promise<undefined>}
|
|
222
227
|
*/
|
|
223
228
|
handleItemFailure(item) {
|
|
224
|
-
return this.getDeferredForResponse(item)
|
|
225
|
-
.
|
|
226
|
-
|
|
227
|
-
});
|
|
229
|
+
return this.getDeferredForResponse(item).then((defer) => {
|
|
230
|
+
defer.reject(item);
|
|
231
|
+
});
|
|
228
232
|
},
|
|
229
233
|
|
|
230
234
|
/**
|
|
@@ -234,10 +238,9 @@ const Batcher = WebexPlugin.extend({
|
|
|
234
238
|
* @returns {Promise<undefined>}
|
|
235
239
|
*/
|
|
236
240
|
handleItemSuccess(item) {
|
|
237
|
-
return this.getDeferredForResponse(item)
|
|
238
|
-
.
|
|
239
|
-
|
|
240
|
-
});
|
|
241
|
+
return this.getDeferredForResponse(item).then((defer) => {
|
|
242
|
+
defer.resolve(item);
|
|
243
|
+
});
|
|
241
244
|
},
|
|
242
245
|
|
|
243
246
|
/**
|
|
@@ -246,17 +249,16 @@ const Batcher = WebexPlugin.extend({
|
|
|
246
249
|
* @returns {Promise<Defer>}
|
|
247
250
|
*/
|
|
248
251
|
getDeferredForRequest(item) {
|
|
249
|
-
return this.fingerprintRequest(item)
|
|
250
|
-
.
|
|
251
|
-
const defer = this.deferreds.get(idx);
|
|
252
|
+
return this.fingerprintRequest(item).then((idx) => {
|
|
253
|
+
const defer = this.deferreds.get(idx);
|
|
252
254
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
255
|
+
/* istanbul ignore if */
|
|
256
|
+
if (!defer) {
|
|
257
|
+
throw new Error('Could not find pending request for received response');
|
|
258
|
+
}
|
|
257
259
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
+
return defer;
|
|
261
|
+
});
|
|
260
262
|
},
|
|
261
263
|
|
|
262
264
|
/**
|
|
@@ -265,17 +267,16 @@ const Batcher = WebexPlugin.extend({
|
|
|
265
267
|
* @returns {Promise<Defer>}
|
|
266
268
|
*/
|
|
267
269
|
getDeferredForResponse(item) {
|
|
268
|
-
return this.fingerprintResponse(item)
|
|
269
|
-
.
|
|
270
|
-
const defer = this.deferreds.get(idx);
|
|
270
|
+
return this.fingerprintResponse(item).then((idx) => {
|
|
271
|
+
const defer = this.deferreds.get(idx);
|
|
271
272
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
273
|
+
/* istanbul ignore if */
|
|
274
|
+
if (!defer) {
|
|
275
|
+
throw new Error('Could not find pending request for received response');
|
|
276
|
+
}
|
|
276
277
|
|
|
277
|
-
|
|
278
|
-
|
|
278
|
+
return defer;
|
|
279
|
+
});
|
|
279
280
|
},
|
|
280
281
|
|
|
281
282
|
/**
|
|
@@ -300,7 +301,7 @@ const Batcher = WebexPlugin.extend({
|
|
|
300
301
|
// eslint-disable-next-line no-unused-vars
|
|
301
302
|
fingerprintResponse(item) {
|
|
302
303
|
throw new Error('fingerprintResponse() must be implemented');
|
|
303
|
-
}
|
|
304
|
+
},
|
|
304
305
|
});
|
|
305
306
|
|
|
306
307
|
export default Batcher;
|