@webex/webex-core 2.59.3-next.1 → 2.59.4-next.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/.eslintrc.js +6 -6
- package/README.md +79 -79
- package/babel.config.js +3 -3
- package/dist/config.js +24 -24
- package/dist/config.js.map +1 -1
- package/dist/credentials-config.js +56 -56
- package/dist/credentials-config.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/interceptors/auth.js +28 -28
- package/dist/interceptors/auth.js.map +1 -1
- package/dist/interceptors/default-options.js +24 -24
- package/dist/interceptors/default-options.js.map +1 -1
- package/dist/interceptors/embargo.js +9 -9
- package/dist/interceptors/embargo.js.map +1 -1
- package/dist/interceptors/network-timing.js +19 -19
- package/dist/interceptors/network-timing.js.map +1 -1
- package/dist/interceptors/payload-transformer.js +19 -19
- package/dist/interceptors/payload-transformer.js.map +1 -1
- package/dist/interceptors/rate-limit.js +40 -40
- package/dist/interceptors/rate-limit.js.map +1 -1
- package/dist/interceptors/redirect.js +16 -16
- package/dist/interceptors/redirect.js.map +1 -1
- package/dist/interceptors/request-event.js +28 -28
- package/dist/interceptors/request-event.js.map +1 -1
- package/dist/interceptors/request-logger.js +21 -25
- package/dist/interceptors/request-logger.js.map +1 -1
- package/dist/interceptors/request-timing.js +23 -23
- package/dist/interceptors/request-timing.js.map +1 -1
- package/dist/interceptors/response-logger.js +25 -26
- package/dist/interceptors/response-logger.js.map +1 -1
- package/dist/interceptors/user-agent.js +33 -33
- package/dist/interceptors/user-agent.js.map +1 -1
- package/dist/interceptors/webex-tracking-id.js +15 -15
- package/dist/interceptors/webex-tracking-id.js.map +1 -1
- package/dist/interceptors/webex-user-agent.js +18 -18
- package/dist/interceptors/webex-user-agent.js.map +1 -1
- package/dist/lib/batcher.js +89 -85
- package/dist/lib/batcher.js.map +1 -1
- package/dist/lib/credentials/credentials.js +109 -112
- package/dist/lib/credentials/credentials.js.map +1 -1
- package/dist/lib/credentials/grant-errors.js +17 -17
- package/dist/lib/credentials/grant-errors.js.map +1 -1
- package/dist/lib/credentials/index.js +2 -2
- package/dist/lib/credentials/index.js.map +1 -1
- package/dist/lib/credentials/scope.js +11 -11
- package/dist/lib/credentials/scope.js.map +1 -1
- package/dist/lib/credentials/token-collection.js +2 -2
- package/dist/lib/credentials/token-collection.js.map +1 -1
- package/dist/lib/credentials/token.js +147 -147
- package/dist/lib/credentials/token.js.map +1 -1
- package/dist/lib/page.js +49 -49
- package/dist/lib/page.js.map +1 -1
- package/dist/lib/services/constants.js.map +1 -1
- package/dist/lib/services/index.js +2 -2
- package/dist/lib/services/index.js.map +1 -1
- package/dist/lib/services/interceptors/server-error.js +9 -9
- package/dist/lib/services/interceptors/server-error.js.map +1 -1
- package/dist/lib/services/interceptors/service.js +24 -24
- package/dist/lib/services/interceptors/service.js.map +1 -1
- package/dist/lib/services/metrics.js.map +1 -1
- package/dist/lib/services/service-catalog.js +104 -104
- package/dist/lib/services/service-catalog.js.map +1 -1
- package/dist/lib/services/service-fed-ramp.js.map +1 -1
- package/dist/lib/services/service-host.js +134 -134
- package/dist/lib/services/service-host.js.map +1 -1
- package/dist/lib/services/service-registry.js +175 -175
- package/dist/lib/services/service-registry.js.map +1 -1
- package/dist/lib/services/service-state.js +38 -38
- package/dist/lib/services/service-state.js.map +1 -1
- package/dist/lib/services/service-url.js +31 -31
- package/dist/lib/services/service-url.js.map +1 -1
- package/dist/lib/services/services.js +245 -245
- package/dist/lib/services/services.js.map +1 -1
- package/dist/lib/stateless-webex-plugin.js +28 -28
- package/dist/lib/stateless-webex-plugin.js.map +1 -1
- package/dist/lib/storage/decorators.js +45 -43
- package/dist/lib/storage/decorators.js.map +1 -1
- package/dist/lib/storage/errors.js +4 -4
- package/dist/lib/storage/errors.js.map +1 -1
- package/dist/lib/storage/index.js.map +1 -1
- package/dist/lib/storage/make-webex-plugin-store.js +52 -54
- package/dist/lib/storage/make-webex-plugin-store.js.map +1 -1
- package/dist/lib/storage/make-webex-store.js +40 -40
- package/dist/lib/storage/make-webex-store.js.map +1 -1
- package/dist/lib/storage/memory-store-adapter.js +9 -9
- package/dist/lib/storage/memory-store-adapter.js.map +1 -1
- package/dist/lib/webex-core-plugin-mixin.js +26 -27
- package/dist/lib/webex-core-plugin-mixin.js.map +1 -1
- package/dist/lib/webex-http-error.js +9 -9
- package/dist/lib/webex-http-error.js.map +1 -1
- package/dist/lib/webex-internal-core-plugin-mixin.js +26 -27
- package/dist/lib/webex-internal-core-plugin-mixin.js.map +1 -1
- package/dist/lib/webex-plugin.js +40 -42
- package/dist/lib/webex-plugin.js.map +1 -1
- package/dist/plugins/logger.js +9 -9
- package/dist/plugins/logger.js.map +1 -1
- package/dist/webex-core.js +128 -136
- package/dist/webex-core.js.map +1 -1
- package/dist/webex-internal-core.js +12 -12
- package/dist/webex-internal-core.js.map +1 -1
- package/jest.config.js +3 -3
- package/package.json +13 -13
- package/process +1 -1
- package/src/config.js +90 -90
- package/src/credentials-config.js +212 -212
- package/src/index.js +62 -62
- package/src/interceptors/auth.js +186 -186
- package/src/interceptors/default-options.js +55 -55
- package/src/interceptors/embargo.js +43 -43
- package/src/interceptors/network-timing.js +54 -54
- package/src/interceptors/payload-transformer.js +55 -55
- package/src/interceptors/rate-limit.js +169 -169
- package/src/interceptors/redirect.js +106 -106
- package/src/interceptors/request-event.js +93 -93
- package/src/interceptors/request-logger.js +78 -78
- package/src/interceptors/request-timing.js +65 -65
- package/src/interceptors/response-logger.js +98 -98
- package/src/interceptors/user-agent.js +77 -77
- package/src/interceptors/webex-tracking-id.js +73 -73
- package/src/interceptors/webex-user-agent.js +79 -79
- package/src/lib/batcher.js +307 -307
- package/src/lib/credentials/credentials.js +552 -552
- package/src/lib/credentials/grant-errors.js +92 -92
- package/src/lib/credentials/index.js +16 -16
- package/src/lib/credentials/scope.js +34 -34
- package/src/lib/credentials/token-collection.js +17 -17
- package/src/lib/credentials/token.js +559 -559
- package/src/lib/page.js +159 -159
- package/src/lib/services/constants.js +9 -9
- package/src/lib/services/index.js +26 -26
- package/src/lib/services/interceptors/server-error.js +48 -48
- package/src/lib/services/interceptors/service.js +101 -101
- package/src/lib/services/metrics.js +4 -4
- package/src/lib/services/service-catalog.js +435 -435
- package/src/lib/services/service-fed-ramp.js +4 -4
- package/src/lib/services/service-host.js +267 -267
- package/src/lib/services/service-registry.js +465 -465
- package/src/lib/services/service-state.js +78 -78
- package/src/lib/services/service-url.js +124 -124
- package/src/lib/services/services.js +1018 -1018
- package/src/lib/stateless-webex-plugin.js +98 -98
- package/src/lib/storage/decorators.js +220 -220
- package/src/lib/storage/errors.js +15 -15
- package/src/lib/storage/index.js +10 -10
- package/src/lib/storage/make-webex-plugin-store.js +211 -211
- package/src/lib/storage/make-webex-store.js +140 -140
- package/src/lib/storage/memory-store-adapter.js +79 -79
- package/src/lib/webex-core-plugin-mixin.js +114 -114
- package/src/lib/webex-http-error.js +61 -61
- package/src/lib/webex-internal-core-plugin-mixin.js +107 -107
- package/src/lib/webex-plugin.js +222 -222
- package/src/plugins/logger.js +60 -60
- package/src/webex-core.js +745 -745
- package/src/webex-internal-core.js +46 -46
- package/test/integration/spec/credentials/credentials.js +139 -139
- package/test/integration/spec/credentials/token.js +102 -102
- package/test/integration/spec/services/service-catalog.js +838 -838
- package/test/integration/spec/services/services.js +1221 -1221
- package/test/integration/spec/webex-core.js +178 -178
- package/test/unit/spec/_setup.js +44 -44
- package/test/unit/spec/credentials/credentials.js +1017 -1017
- package/test/unit/spec/credentials/token.js +441 -441
- package/test/unit/spec/interceptors/auth.js +521 -521
- package/test/unit/spec/interceptors/default-options.js +84 -84
- package/test/unit/spec/interceptors/embargo.js +144 -144
- package/test/unit/spec/interceptors/network-timing.js +49 -49
- package/test/unit/spec/interceptors/payload-transformer.js +155 -155
- package/test/unit/spec/interceptors/rate-limit.js +302 -302
- package/test/unit/spec/interceptors/redirect.js +102 -102
- package/test/unit/spec/interceptors/request-timing.js +92 -92
- package/test/unit/spec/interceptors/user-agent.js +76 -76
- package/test/unit/spec/interceptors/webex-tracking-id.js +76 -76
- package/test/unit/spec/interceptors/webex-user-agent.js +159 -159
- package/test/unit/spec/lib/batcher.js +330 -330
- package/test/unit/spec/lib/page.js +148 -148
- package/test/unit/spec/lib/webex-plugin.js +48 -48
- package/test/unit/spec/services/interceptors/server-error.js +204 -204
- package/test/unit/spec/services/interceptors/service.js +188 -188
- package/test/unit/spec/services/service-catalog.js +194 -194
- package/test/unit/spec/services/service-host.js +260 -260
- package/test/unit/spec/services/service-registry.js +747 -747
- package/test/unit/spec/services/service-state.js +60 -60
- package/test/unit/spec/services/service-url.js +258 -258
- package/test/unit/spec/services/services.js +348 -348
- package/test/unit/spec/storage/persist.js +50 -50
- package/test/unit/spec/storage/storage-adapter.js +12 -12
- package/test/unit/spec/storage/wait-for-value.js +81 -81
- package/test/unit/spec/webex-core.js +253 -253
- package/test/unit/spec/webex-internal-core.js +91 -91
package/dist/lib/batcher.js
CHANGED
|
@@ -8,13 +8,17 @@ _Object$defineProperty(exports, "__esModule", {
|
|
|
8
8
|
exports.default = void 0;
|
|
9
9
|
var _map = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/map"));
|
|
10
10
|
var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
|
|
11
|
-
var
|
|
11
|
+
var _lodash = require("lodash");
|
|
12
12
|
var _common = require("@webex/common");
|
|
13
13
|
var _webexPlugin = _interopRequireDefault(require("./webex-plugin"));
|
|
14
14
|
var _webexHttpError = _interopRequireDefault(require("./webex-http-error"));
|
|
15
|
-
|
|
16
|
-
*
|
|
17
|
-
|
|
15
|
+
/*!
|
|
16
|
+
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Base class for coalescing requests to batched APIs
|
|
21
|
+
* @class Batcher
|
|
18
22
|
*/
|
|
19
23
|
var Batcher = _webexPlugin.default.extend({
|
|
20
24
|
session: {
|
|
@@ -44,10 +48,10 @@ var Batcher = _webexPlugin.default.extend({
|
|
|
44
48
|
}
|
|
45
49
|
}
|
|
46
50
|
},
|
|
47
|
-
/**
|
|
48
|
-
* Requests an item from a batched API
|
|
49
|
-
* @param {Object} item
|
|
50
|
-
* @returns {Promise<mixed>}
|
|
51
|
+
/**
|
|
52
|
+
* Requests an item from a batched API
|
|
53
|
+
* @param {Object} item
|
|
54
|
+
* @returns {Promise<mixed>}
|
|
51
55
|
*/
|
|
52
56
|
request: function request(item) {
|
|
53
57
|
var _this2 = this;
|
|
@@ -80,29 +84,29 @@ var Batcher = _webexPlugin.default.extend({
|
|
|
80
84
|
});
|
|
81
85
|
return defer.promise;
|
|
82
86
|
},
|
|
83
|
-
/**
|
|
84
|
-
* Adds an item to the queue.
|
|
85
|
-
* Intended to be overridden
|
|
86
|
-
* @param {mixed} req
|
|
87
|
-
* @returns {Promise<undefined>}
|
|
87
|
+
/**
|
|
88
|
+
* Adds an item to the queue.
|
|
89
|
+
* Intended to be overridden
|
|
90
|
+
* @param {mixed} req
|
|
91
|
+
* @returns {Promise<undefined>}
|
|
88
92
|
*/
|
|
89
93
|
enqueue: function enqueue(req) {
|
|
90
94
|
this.queue.push(req);
|
|
91
95
|
return _promise.default.resolve();
|
|
92
96
|
},
|
|
93
|
-
/**
|
|
94
|
-
* Transform the item before adding it to the queue
|
|
95
|
-
* Intended to be overridden
|
|
96
|
-
* @param {mixed} item
|
|
97
|
-
* @returns {Promise<mixed>}
|
|
97
|
+
/**
|
|
98
|
+
* Transform the item before adding it to the queue
|
|
99
|
+
* Intended to be overridden
|
|
100
|
+
* @param {mixed} item
|
|
101
|
+
* @returns {Promise<mixed>}
|
|
98
102
|
*/
|
|
99
103
|
prepareItem: function prepareItem(item) {
|
|
100
104
|
return _promise.default.resolve(item);
|
|
101
105
|
},
|
|
102
|
-
/**
|
|
103
|
-
* Detaches the current queue, does any appropriate transforms, and submits it
|
|
104
|
-
* to the API.
|
|
105
|
-
* @returns {Promise<undefined>}
|
|
106
|
+
/**
|
|
107
|
+
* Detaches the current queue, does any appropriate transforms, and submits it
|
|
108
|
+
* to the API.
|
|
109
|
+
* @returns {Promise<undefined>}
|
|
106
110
|
*/
|
|
107
111
|
executeQueue: function executeQueue() {
|
|
108
112
|
var _this3 = this;
|
|
@@ -127,30 +131,30 @@ var Batcher = _webexPlugin.default.extend({
|
|
|
127
131
|
return _promise.default.reject(reason);
|
|
128
132
|
});
|
|
129
133
|
},
|
|
130
|
-
/**
|
|
131
|
-
* Performs any final transforms on the queue before submitting it to the API
|
|
132
|
-
* Intended to be overridden
|
|
133
|
-
* @param {Object|Array} queue
|
|
134
|
-
* @returns {Promise<Object>}
|
|
134
|
+
/**
|
|
135
|
+
* Performs any final transforms on the queue before submitting it to the API
|
|
136
|
+
* Intended to be overridden
|
|
137
|
+
* @param {Object|Array} queue
|
|
138
|
+
* @returns {Promise<Object>}
|
|
135
139
|
*/
|
|
136
140
|
prepareRequest: function prepareRequest(queue) {
|
|
137
141
|
return _promise.default.resolve(queue);
|
|
138
142
|
},
|
|
139
|
-
/**
|
|
140
|
-
* Submits the prepared request body to the API.
|
|
141
|
-
* This method *must* be overridden
|
|
142
|
-
* @param {Object} payload
|
|
143
|
-
* @returns {Promise<HttpResponseObject>}
|
|
143
|
+
/**
|
|
144
|
+
* Submits the prepared request body to the API.
|
|
145
|
+
* This method *must* be overridden
|
|
146
|
+
* @param {Object} payload
|
|
147
|
+
* @returns {Promise<HttpResponseObject>}
|
|
144
148
|
*/
|
|
145
149
|
// eslint-disable-next-line no-unused-vars
|
|
146
150
|
submitHttpRequest: function submitHttpRequest(payload) {
|
|
147
151
|
throw new Error('request() must be implemented');
|
|
148
152
|
},
|
|
149
|
-
/**
|
|
150
|
-
* Actions taken when the http request returns a success
|
|
151
|
-
* Intended to be overridden
|
|
152
|
-
* @param {Promise<HttpResponseObject>} res
|
|
153
|
-
* @returns {Promise<undefined>}
|
|
153
|
+
/**
|
|
154
|
+
* Actions taken when the http request returns a success
|
|
155
|
+
* Intended to be overridden
|
|
156
|
+
* @param {Promise<HttpResponseObject>} res
|
|
157
|
+
* @returns {Promise<undefined>}
|
|
154
158
|
*/
|
|
155
159
|
handleHttpSuccess: function handleHttpSuccess(res) {
|
|
156
160
|
var _this4 = this;
|
|
@@ -158,18 +162,18 @@ var Batcher = _webexPlugin.default.extend({
|
|
|
158
162
|
return _this4.acceptItem(item);
|
|
159
163
|
}));
|
|
160
164
|
},
|
|
161
|
-
/**
|
|
162
|
-
* Actions taken when the http request returns a failure. Typically, this
|
|
163
|
-
* means failing the entire queue, but could be overridden in some
|
|
164
|
-
* implementations to e.g. reenqueue.
|
|
165
|
-
* Intended to be overridden
|
|
166
|
-
* @param {WebexHttpError} reason
|
|
167
|
-
* @returns {Promise<undefined>}
|
|
165
|
+
/**
|
|
166
|
+
* Actions taken when the http request returns a failure. Typically, this
|
|
167
|
+
* means failing the entire queue, but could be overridden in some
|
|
168
|
+
* implementations to e.g. reenqueue.
|
|
169
|
+
* Intended to be overridden
|
|
170
|
+
* @param {WebexHttpError} reason
|
|
171
|
+
* @returns {Promise<undefined>}
|
|
168
172
|
*/
|
|
169
173
|
handleHttpError: function handleHttpError(reason) {
|
|
170
174
|
var _this5 = this;
|
|
171
175
|
if (reason instanceof _webexHttpError.default) {
|
|
172
|
-
if ((0,
|
|
176
|
+
if ((0, _lodash.has)(reason, 'options.body.map')) {
|
|
173
177
|
return _promise.default.all(reason.options.body.map(function (item) {
|
|
174
178
|
return _this5.getDeferredForRequest(item).then(function (defer) {
|
|
175
179
|
defer.reject(reason);
|
|
@@ -180,10 +184,10 @@ var Batcher = _webexPlugin.default.extend({
|
|
|
180
184
|
this.logger.error('http error handler called without a WebexHttpError object', reason);
|
|
181
185
|
return _promise.default.reject(reason);
|
|
182
186
|
},
|
|
183
|
-
/**
|
|
184
|
-
* Determines if the item succeeded or failed and delegates accordingly
|
|
185
|
-
* @param {Object} item
|
|
186
|
-
* @returns {Promise<undefined>}
|
|
187
|
+
/**
|
|
188
|
+
* Determines if the item succeeded or failed and delegates accordingly
|
|
189
|
+
* @param {Object} item
|
|
190
|
+
* @returns {Promise<undefined>}
|
|
187
191
|
*/
|
|
188
192
|
acceptItem: function acceptItem(item) {
|
|
189
193
|
var _this6 = this;
|
|
@@ -194,42 +198,42 @@ var Batcher = _webexPlugin.default.extend({
|
|
|
194
198
|
return _this6.handleItemSuccess(item);
|
|
195
199
|
});
|
|
196
200
|
},
|
|
197
|
-
/**
|
|
198
|
-
* Indicates if the specified response item implies a success or a failure
|
|
199
|
-
* Intended to be overridden
|
|
200
|
-
* @param {Object} item
|
|
201
|
-
* @returns {Promise<Boolean>}
|
|
201
|
+
/**
|
|
202
|
+
* Indicates if the specified response item implies a success or a failure
|
|
203
|
+
* Intended to be overridden
|
|
204
|
+
* @param {Object} item
|
|
205
|
+
* @returns {Promise<Boolean>}
|
|
202
206
|
*/
|
|
203
207
|
// eslint-disable-next-line no-unused-vars
|
|
204
208
|
didItemFail: function didItemFail(item) {
|
|
205
209
|
return _promise.default.resolve(false);
|
|
206
210
|
},
|
|
207
|
-
/**
|
|
208
|
-
* Finds the Defer for the specified item and rejects its promise
|
|
209
|
-
* Intended to be overridden
|
|
210
|
-
* @param {Object} item
|
|
211
|
-
* @returns {Promise<undefined>}
|
|
211
|
+
/**
|
|
212
|
+
* Finds the Defer for the specified item and rejects its promise
|
|
213
|
+
* Intended to be overridden
|
|
214
|
+
* @param {Object} item
|
|
215
|
+
* @returns {Promise<undefined>}
|
|
212
216
|
*/
|
|
213
217
|
handleItemFailure: function handleItemFailure(item) {
|
|
214
218
|
return this.getDeferredForResponse(item).then(function (defer) {
|
|
215
219
|
defer.reject(item);
|
|
216
220
|
});
|
|
217
221
|
},
|
|
218
|
-
/**
|
|
219
|
-
* Finds the Defer for the specified item and resolves its promise
|
|
220
|
-
* Intended to be overridden
|
|
221
|
-
* @param {Object} item
|
|
222
|
-
* @returns {Promise<undefined>}
|
|
222
|
+
/**
|
|
223
|
+
* Finds the Defer for the specified item and resolves its promise
|
|
224
|
+
* Intended to be overridden
|
|
225
|
+
* @param {Object} item
|
|
226
|
+
* @returns {Promise<undefined>}
|
|
223
227
|
*/
|
|
224
228
|
handleItemSuccess: function handleItemSuccess(item) {
|
|
225
229
|
return this.getDeferredForResponse(item).then(function (defer) {
|
|
226
230
|
defer.resolve(item);
|
|
227
231
|
});
|
|
228
232
|
},
|
|
229
|
-
/**
|
|
230
|
-
* Returns the Deferred for the specified request item
|
|
231
|
-
* @param {Object} item
|
|
232
|
-
* @returns {Promise<Defer>}
|
|
233
|
+
/**
|
|
234
|
+
* Returns the Deferred for the specified request item
|
|
235
|
+
* @param {Object} item
|
|
236
|
+
* @returns {Promise<Defer>}
|
|
233
237
|
*/
|
|
234
238
|
getDeferredForRequest: function getDeferredForRequest(item) {
|
|
235
239
|
var _this7 = this;
|
|
@@ -243,10 +247,10 @@ var Batcher = _webexPlugin.default.extend({
|
|
|
243
247
|
return defer;
|
|
244
248
|
});
|
|
245
249
|
},
|
|
246
|
-
/**
|
|
247
|
-
* Returns the Deferred for the specified response item
|
|
248
|
-
* @param {Object} item
|
|
249
|
-
* @returns {Promise<Defer>}
|
|
250
|
+
/**
|
|
251
|
+
* Returns the Deferred for the specified response item
|
|
252
|
+
* @param {Object} item
|
|
253
|
+
* @returns {Promise<Defer>}
|
|
250
254
|
*/
|
|
251
255
|
getDeferredForResponse: function getDeferredForResponse(item) {
|
|
252
256
|
var _this8 = this;
|
|
@@ -260,29 +264,29 @@ var Batcher = _webexPlugin.default.extend({
|
|
|
260
264
|
return defer;
|
|
261
265
|
});
|
|
262
266
|
},
|
|
263
|
-
/**
|
|
264
|
-
* Generates a unique identifier for the item in a request payload
|
|
265
|
-
* Intended to be overridden
|
|
266
|
-
* Note that overrides must return a primitive.
|
|
267
|
-
* @param {Object} item
|
|
268
|
-
* @returns {Promise<primitive>}
|
|
267
|
+
/**
|
|
268
|
+
* Generates a unique identifier for the item in a request payload
|
|
269
|
+
* Intended to be overridden
|
|
270
|
+
* Note that overrides must return a primitive.
|
|
271
|
+
* @param {Object} item
|
|
272
|
+
* @returns {Promise<primitive>}
|
|
269
273
|
*/
|
|
270
274
|
// eslint-disable-next-line no-unused-vars
|
|
271
275
|
fingerprintRequest: function fingerprintRequest(item) {
|
|
272
276
|
throw new Error('fingerprintRequest() must be implemented');
|
|
273
277
|
},
|
|
274
|
-
/**
|
|
275
|
-
* Generates a unique identifier for the item in a response payload
|
|
276
|
-
* Intended to be overridden
|
|
277
|
-
* Note that overrides must return a primitive.
|
|
278
|
-
* @param {Object} item
|
|
279
|
-
* @returns {Promise<primitive>}
|
|
278
|
+
/**
|
|
279
|
+
* Generates a unique identifier for the item in a response payload
|
|
280
|
+
* Intended to be overridden
|
|
281
|
+
* Note that overrides must return a primitive.
|
|
282
|
+
* @param {Object} item
|
|
283
|
+
* @returns {Promise<primitive>}
|
|
280
284
|
*/
|
|
281
285
|
// eslint-disable-next-line no-unused-vars
|
|
282
286
|
fingerprintResponse: function fingerprintResponse(item) {
|
|
283
287
|
throw new Error('fingerprintResponse() must be implemented');
|
|
284
288
|
},
|
|
285
|
-
version: "2.59.
|
|
289
|
+
version: "2.59.4-next.1"
|
|
286
290
|
});
|
|
287
291
|
var _default2 = Batcher;
|
|
288
292
|
exports.default = _default2;
|
package/dist/lib/batcher.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_common","require","_webexPlugin","_interopRequireDefault","_webexHttpError","Batcher","WebexPlugin","extend","session","deferreds","type","default","_default","_map","queue","derived","bounce","fn","_this","cappedDebounce","executeQueue","apply","arguments","config","batcherWait","maxCalls","batcherMaxCalls","maxWait","batcherMaxWait","request","item","_this2","defer","Defer","fingerprintRequest","then","idx","has","resolve","get","promise","set","prepareItem","req","tap","delete","catch","reason","_promise","reject","enqueue","push","_this3","splice","prepareRequest","payload","submitHttpRequest","res","handleHttpSuccess","WebexHttpError","handleHttpError","all","map","getDeferredForRequest","logger","error","process","env","NODE_ENV","stack","Error","_this4","body","items","acceptItem","_this5","_has2","options","_this6","didItemFail","didFail","handleItemFailure","handleItemSuccess","getDeferredForResponse","_this7","_this8","fingerprintResponse","version","_default2","exports"],"sources":["batcher.js"],"sourcesContent":["/*!\r\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\r\n */\r\n\r\nimport {has} from 'lodash';\r\nimport {cappedDebounce, Defer, tap} from '@webex/common';\r\n\r\nimport WebexPlugin from './webex-plugin';\r\nimport WebexHttpError from './webex-http-error';\r\n\r\n/**\r\n * Base class for coalescing requests to batched APIs\r\n * @class Batcher\r\n */\r\nconst Batcher = WebexPlugin.extend({\r\n session: {\r\n deferreds: {\r\n type: 'object',\r\n default() {\r\n return new Map();\r\n },\r\n },\r\n queue: {\r\n type: 'array',\r\n default() {\r\n return [];\r\n },\r\n },\r\n },\r\n\r\n derived: {\r\n bounce: {\r\n fn() {\r\n return cappedDebounce((...args) => this.executeQueue(...args), this.config.batcherWait, {\r\n maxCalls: this.config.batcherMaxCalls,\r\n maxWait: this.config.batcherMaxWait,\r\n });\r\n },\r\n },\r\n },\r\n\r\n /**\r\n * Requests an item from a batched API\r\n * @param {Object} item\r\n * @returns {Promise<mixed>}\r\n */\r\n request(item) {\r\n // So far, I can't find a way to avoid three layers of nesting here.\r\n /* eslint max-nested-callbacks: [0] */\r\n const defer = new Defer();\r\n\r\n this.fingerprintRequest(item)\r\n .then((idx) => {\r\n if (this.deferreds.has(idx)) {\r\n defer.resolve(this.deferreds.get(idx).promise);\r\n\r\n return;\r\n }\r\n this.deferreds.set(idx, defer);\r\n this.prepareItem(item)\r\n .then((req) => {\r\n defer.promise = defer.promise\r\n .then(tap(() => this.deferreds.delete(idx)))\r\n .catch((reason) => {\r\n this.deferreds.delete(idx);\r\n\r\n return Promise.reject(reason);\r\n });\r\n\r\n this.enqueue(req)\r\n .then(() => this.bounce())\r\n .catch((reason) => defer.reject(reason));\r\n })\r\n .catch((reason) => defer.reject(reason));\r\n })\r\n .catch((reason) => defer.reject(reason));\r\n\r\n return defer.promise;\r\n },\r\n\r\n /**\r\n * Adds an item to the queue.\r\n * Intended to be overridden\r\n * @param {mixed} req\r\n * @returns {Promise<undefined>}\r\n */\r\n enqueue(req) {\r\n this.queue.push(req);\r\n\r\n return Promise.resolve();\r\n },\r\n\r\n /**\r\n * Transform the item before adding it to the queue\r\n * Intended to be overridden\r\n * @param {mixed} item\r\n * @returns {Promise<mixed>}\r\n */\r\n prepareItem(item) {\r\n return Promise.resolve(item);\r\n },\r\n\r\n /**\r\n * Detaches the current queue, does any appropriate transforms, and submits it\r\n * to the API.\r\n * @returns {Promise<undefined>}\r\n */\r\n executeQueue() {\r\n const queue = this.queue.splice(0, this.config.batcherMaxCalls);\r\n\r\n return new Promise((resolve) => {\r\n resolve(\r\n this.prepareRequest(queue)\r\n .then((payload) =>\r\n this.submitHttpRequest(payload).then((res) => this.handleHttpSuccess(res))\r\n )\r\n .catch((reason) => {\r\n if (reason instanceof WebexHttpError) {\r\n return this.handleHttpError(reason);\r\n }\r\n\r\n return Promise.all(\r\n queue.map((item) =>\r\n this.getDeferredForRequest(item).then((defer) => {\r\n defer.reject(reason);\r\n })\r\n )\r\n );\r\n })\r\n );\r\n }).catch((reason) => {\r\n this.logger.error(process.env.NODE_ENV === 'production' ? reason : reason.stack);\r\n\r\n return Promise.reject(reason);\r\n });\r\n },\r\n\r\n /**\r\n * Performs any final transforms on the queue before submitting it to the API\r\n * Intended to be overridden\r\n * @param {Object|Array} queue\r\n * @returns {Promise<Object>}\r\n */\r\n prepareRequest(queue) {\r\n return Promise.resolve(queue);\r\n },\r\n\r\n /**\r\n * Submits the prepared request body to the API.\r\n * This method *must* be overridden\r\n * @param {Object} payload\r\n * @returns {Promise<HttpResponseObject>}\r\n */\r\n // eslint-disable-next-line no-unused-vars\r\n submitHttpRequest(payload) {\r\n throw new Error('request() must be implemented');\r\n },\r\n\r\n /**\r\n * Actions taken when the http request returns a success\r\n * Intended to be overridden\r\n * @param {Promise<HttpResponseObject>} res\r\n * @returns {Promise<undefined>}\r\n */\r\n handleHttpSuccess(res) {\r\n return Promise.all(\r\n ((res.body && res.body.items) || res.body).map((item) => this.acceptItem(item))\r\n );\r\n },\r\n\r\n /**\r\n * Actions taken when the http request returns a failure. Typically, this\r\n * means failing the entire queue, but could be overridden in some\r\n * implementations to e.g. reenqueue.\r\n * Intended to be overridden\r\n * @param {WebexHttpError} reason\r\n * @returns {Promise<undefined>}\r\n */\r\n handleHttpError(reason) {\r\n if (reason instanceof WebexHttpError) {\r\n if (has(reason, 'options.body.map')) {\r\n return Promise.all(\r\n reason.options.body.map((item) =>\r\n this.getDeferredForRequest(item).then((defer) => {\r\n defer.reject(reason);\r\n })\r\n )\r\n );\r\n }\r\n }\r\n this.logger.error('http error handler called without a WebexHttpError object', reason);\r\n\r\n return Promise.reject(reason);\r\n },\r\n\r\n /**\r\n * Determines if the item succeeded or failed and delegates accordingly\r\n * @param {Object} item\r\n * @returns {Promise<undefined>}\r\n */\r\n acceptItem(item) {\r\n return this.didItemFail(item).then((didFail) => {\r\n if (didFail) {\r\n return this.handleItemFailure(item);\r\n }\r\n\r\n return this.handleItemSuccess(item);\r\n });\r\n },\r\n\r\n /**\r\n * Indicates if the specified response item implies a success or a failure\r\n * Intended to be overridden\r\n * @param {Object} item\r\n * @returns {Promise<Boolean>}\r\n */\r\n // eslint-disable-next-line no-unused-vars\r\n didItemFail(item) {\r\n return Promise.resolve(false);\r\n },\r\n\r\n /**\r\n * Finds the Defer for the specified item and rejects its promise\r\n * Intended to be overridden\r\n * @param {Object} item\r\n * @returns {Promise<undefined>}\r\n */\r\n handleItemFailure(item) {\r\n return this.getDeferredForResponse(item).then((defer) => {\r\n defer.reject(item);\r\n });\r\n },\r\n\r\n /**\r\n * Finds the Defer for the specified item and resolves its promise\r\n * Intended to be overridden\r\n * @param {Object} item\r\n * @returns {Promise<undefined>}\r\n */\r\n handleItemSuccess(item) {\r\n return this.getDeferredForResponse(item).then((defer) => {\r\n defer.resolve(item);\r\n });\r\n },\r\n\r\n /**\r\n * Returns the Deferred for the specified request item\r\n * @param {Object} item\r\n * @returns {Promise<Defer>}\r\n */\r\n getDeferredForRequest(item) {\r\n return this.fingerprintRequest(item).then((idx) => {\r\n const defer = this.deferreds.get(idx);\r\n\r\n /* istanbul ignore if */\r\n if (!defer) {\r\n throw new Error('Could not find pending request for received response');\r\n }\r\n\r\n return defer;\r\n });\r\n },\r\n\r\n /**\r\n * Returns the Deferred for the specified response item\r\n * @param {Object} item\r\n * @returns {Promise<Defer>}\r\n */\r\n getDeferredForResponse(item) {\r\n return this.fingerprintResponse(item).then((idx) => {\r\n const defer = this.deferreds.get(idx);\r\n\r\n /* istanbul ignore if */\r\n if (!defer) {\r\n throw new Error('Could not find pending request for received response');\r\n }\r\n\r\n return defer;\r\n });\r\n },\r\n\r\n /**\r\n * Generates a unique identifier for the item in a request payload\r\n * Intended to be overridden\r\n * Note that overrides must return a primitive.\r\n * @param {Object} item\r\n * @returns {Promise<primitive>}\r\n */\r\n // eslint-disable-next-line no-unused-vars\r\n fingerprintRequest(item) {\r\n throw new Error('fingerprintRequest() must be implemented');\r\n },\r\n\r\n /**\r\n * Generates a unique identifier for the item in a response payload\r\n * Intended to be overridden\r\n * Note that overrides must return a primitive.\r\n * @param {Object} item\r\n * @returns {Promise<primitive>}\r\n */\r\n // eslint-disable-next-line no-unused-vars\r\n fingerprintResponse(item) {\r\n throw new Error('fingerprintResponse() must be implemented');\r\n },\r\n});\r\n\r\nexport default Batcher;\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["_lodash","require","_common","_webexPlugin","_interopRequireDefault","_webexHttpError","Batcher","WebexPlugin","extend","session","deferreds","type","default","_default","_map","queue","derived","bounce","fn","_this","cappedDebounce","executeQueue","apply","arguments","config","batcherWait","maxCalls","batcherMaxCalls","maxWait","batcherMaxWait","request","item","_this2","defer","Defer","fingerprintRequest","then","idx","has","resolve","get","promise","set","prepareItem","req","tap","delete","catch","reason","_promise","reject","enqueue","push","_this3","splice","prepareRequest","payload","submitHttpRequest","res","handleHttpSuccess","WebexHttpError","handleHttpError","all","map","getDeferredForRequest","logger","error","process","env","NODE_ENV","stack","Error","_this4","body","items","acceptItem","_this5","options","_this6","didItemFail","didFail","handleItemFailure","handleItemSuccess","getDeferredForResponse","_this7","_this8","fingerprintResponse","version","_default2","exports"],"sources":["batcher.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {has} from 'lodash';\nimport {cappedDebounce, Defer, tap} from '@webex/common';\n\nimport WebexPlugin from './webex-plugin';\nimport WebexHttpError from './webex-http-error';\n\n/**\n * Base class for coalescing requests to batched APIs\n * @class Batcher\n */\nconst Batcher = WebexPlugin.extend({\n session: {\n deferreds: {\n type: 'object',\n default() {\n return new Map();\n },\n },\n queue: {\n type: 'array',\n default() {\n return [];\n },\n },\n },\n\n derived: {\n bounce: {\n fn() {\n return cappedDebounce((...args) => this.executeQueue(...args), this.config.batcherWait, {\n maxCalls: this.config.batcherMaxCalls,\n maxWait: this.config.batcherMaxWait,\n });\n },\n },\n },\n\n /**\n * Requests an item from a batched API\n * @param {Object} item\n * @returns {Promise<mixed>}\n */\n request(item) {\n // So far, I can't find a way to avoid three layers of nesting here.\n /* eslint max-nested-callbacks: [0] */\n const defer = new Defer();\n\n this.fingerprintRequest(item)\n .then((idx) => {\n if (this.deferreds.has(idx)) {\n defer.resolve(this.deferreds.get(idx).promise);\n\n return;\n }\n this.deferreds.set(idx, defer);\n this.prepareItem(item)\n .then((req) => {\n defer.promise = defer.promise\n .then(tap(() => this.deferreds.delete(idx)))\n .catch((reason) => {\n this.deferreds.delete(idx);\n\n return Promise.reject(reason);\n });\n\n this.enqueue(req)\n .then(() => this.bounce())\n .catch((reason) => defer.reject(reason));\n })\n .catch((reason) => defer.reject(reason));\n })\n .catch((reason) => defer.reject(reason));\n\n return defer.promise;\n },\n\n /**\n * Adds an item to the queue.\n * Intended to be overridden\n * @param {mixed} req\n * @returns {Promise<undefined>}\n */\n enqueue(req) {\n this.queue.push(req);\n\n return Promise.resolve();\n },\n\n /**\n * Transform the item before adding it to the queue\n * Intended to be overridden\n * @param {mixed} item\n * @returns {Promise<mixed>}\n */\n prepareItem(item) {\n return Promise.resolve(item);\n },\n\n /**\n * Detaches the current queue, does any appropriate transforms, and submits it\n * to the API.\n * @returns {Promise<undefined>}\n */\n executeQueue() {\n const queue = this.queue.splice(0, this.config.batcherMaxCalls);\n\n return new Promise((resolve) => {\n resolve(\n this.prepareRequest(queue)\n .then((payload) =>\n this.submitHttpRequest(payload).then((res) => this.handleHttpSuccess(res))\n )\n .catch((reason) => {\n if (reason instanceof WebexHttpError) {\n return this.handleHttpError(reason);\n }\n\n return Promise.all(\n queue.map((item) =>\n this.getDeferredForRequest(item).then((defer) => {\n defer.reject(reason);\n })\n )\n );\n })\n );\n }).catch((reason) => {\n this.logger.error(process.env.NODE_ENV === 'production' ? reason : reason.stack);\n\n return Promise.reject(reason);\n });\n },\n\n /**\n * Performs any final transforms on the queue before submitting it to the API\n * Intended to be overridden\n * @param {Object|Array} queue\n * @returns {Promise<Object>}\n */\n prepareRequest(queue) {\n return Promise.resolve(queue);\n },\n\n /**\n * Submits the prepared request body to the API.\n * This method *must* be overridden\n * @param {Object} payload\n * @returns {Promise<HttpResponseObject>}\n */\n // eslint-disable-next-line no-unused-vars\n submitHttpRequest(payload) {\n throw new Error('request() must be implemented');\n },\n\n /**\n * Actions taken when the http request returns a success\n * Intended to be overridden\n * @param {Promise<HttpResponseObject>} res\n * @returns {Promise<undefined>}\n */\n handleHttpSuccess(res) {\n return Promise.all(\n ((res.body && res.body.items) || res.body).map((item) => this.acceptItem(item))\n );\n },\n\n /**\n * Actions taken when the http request returns a failure. Typically, this\n * means failing the entire queue, but could be overridden in some\n * implementations to e.g. reenqueue.\n * Intended to be overridden\n * @param {WebexHttpError} reason\n * @returns {Promise<undefined>}\n */\n handleHttpError(reason) {\n if (reason instanceof WebexHttpError) {\n if (has(reason, 'options.body.map')) {\n return Promise.all(\n reason.options.body.map((item) =>\n this.getDeferredForRequest(item).then((defer) => {\n defer.reject(reason);\n })\n )\n );\n }\n }\n this.logger.error('http error handler called without a WebexHttpError object', reason);\n\n return Promise.reject(reason);\n },\n\n /**\n * Determines if the item succeeded or failed and delegates accordingly\n * @param {Object} item\n * @returns {Promise<undefined>}\n */\n acceptItem(item) {\n return this.didItemFail(item).then((didFail) => {\n if (didFail) {\n return this.handleItemFailure(item);\n }\n\n return this.handleItemSuccess(item);\n });\n },\n\n /**\n * Indicates if the specified response item implies a success or a failure\n * Intended to be overridden\n * @param {Object} item\n * @returns {Promise<Boolean>}\n */\n // eslint-disable-next-line no-unused-vars\n didItemFail(item) {\n return Promise.resolve(false);\n },\n\n /**\n * Finds the Defer for the specified item and rejects its promise\n * Intended to be overridden\n * @param {Object} item\n * @returns {Promise<undefined>}\n */\n handleItemFailure(item) {\n return this.getDeferredForResponse(item).then((defer) => {\n defer.reject(item);\n });\n },\n\n /**\n * Finds the Defer for the specified item and resolves its promise\n * Intended to be overridden\n * @param {Object} item\n * @returns {Promise<undefined>}\n */\n handleItemSuccess(item) {\n return this.getDeferredForResponse(item).then((defer) => {\n defer.resolve(item);\n });\n },\n\n /**\n * Returns the Deferred for the specified request item\n * @param {Object} item\n * @returns {Promise<Defer>}\n */\n getDeferredForRequest(item) {\n return this.fingerprintRequest(item).then((idx) => {\n const defer = this.deferreds.get(idx);\n\n /* istanbul ignore if */\n if (!defer) {\n throw new Error('Could not find pending request for received response');\n }\n\n return defer;\n });\n },\n\n /**\n * Returns the Deferred for the specified response item\n * @param {Object} item\n * @returns {Promise<Defer>}\n */\n getDeferredForResponse(item) {\n return this.fingerprintResponse(item).then((idx) => {\n const defer = this.deferreds.get(idx);\n\n /* istanbul ignore if */\n if (!defer) {\n throw new Error('Could not find pending request for received response');\n }\n\n return defer;\n });\n },\n\n /**\n * Generates a unique identifier for the item in a request payload\n * Intended to be overridden\n * Note that overrides must return a primitive.\n * @param {Object} item\n * @returns {Promise<primitive>}\n */\n // eslint-disable-next-line no-unused-vars\n fingerprintRequest(item) {\n throw new Error('fingerprintRequest() must be implemented');\n },\n\n /**\n * Generates a unique identifier for the item in a response payload\n * Intended to be overridden\n * Note that overrides must return a primitive.\n * @param {Object} item\n * @returns {Promise<primitive>}\n */\n // eslint-disable-next-line no-unused-vars\n fingerprintResponse(item) {\n throw new Error('fingerprintResponse() must be implemented');\n },\n});\n\nexport default Batcher;\n"],"mappings":"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"}
|