@webex/webex-core 2.59.2 → 2.59.3-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 +13 -13
- package/dist/interceptors/redirect.js.map +1 -1
- package/dist/interceptors/request-event.js +23 -23
- package/dist/interceptors/request-event.js.map +1 -1
- package/dist/interceptors/request-logger.js +13 -13
- 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 +19 -19
- package/dist/interceptors/response-logger.js.map +1 -1
- package/dist/interceptors/user-agent.js +29 -29
- 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 +13 -13
- package/dist/interceptors/webex-user-agent.js.map +1 -1
- package/dist/lib/batcher.js +83 -83
- package/dist/lib/batcher.js.map +1 -1
- package/dist/lib/credentials/credentials.js +103 -103
- 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 +145 -145
- 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 +27 -27
- 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 +44 -44
- 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 +13 -13
- 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 +13 -13
- package/dist/lib/webex-internal-core-plugin-mixin.js.map +1 -1
- package/dist/lib/webex-plugin.js +36 -36
- 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 +104 -104
- 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 +20 -19
- 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/src/lib/storage/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export {persist, waitForValue} from './decorators';
|
|
6
|
-
export {default as makeWebexStore} from './make-webex-store';
|
|
7
|
-
export {default as makeWebexPluginStore} from './make-webex-plugin-store';
|
|
8
|
-
|
|
9
|
-
export {default as MemoryStoreAdapter} from './memory-store-adapter';
|
|
10
|
-
export {StorageError, NotFoundError} from './errors';
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export {persist, waitForValue} from './decorators';
|
|
6
|
+
export {default as makeWebexStore} from './make-webex-store';
|
|
7
|
+
export {default as makeWebexPluginStore} from './make-webex-plugin-store';
|
|
8
|
+
|
|
9
|
+
export {default as MemoryStoreAdapter} from './memory-store-adapter';
|
|
10
|
+
export {StorageError, NotFoundError} from './errors';
|
|
@@ -1,211 +1,211 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import {Defer, oneFlight} from '@webex/common';
|
|
6
|
-
import {isArray, isObject, result} from 'lodash';
|
|
7
|
-
|
|
8
|
-
import {NotFoundError} from './errors';
|
|
9
|
-
|
|
10
|
-
const defers = new WeakMap();
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Walks an object before writing it to the store and omits empty arrays
|
|
14
|
-
* @private
|
|
15
|
-
* @param {Object} value
|
|
16
|
-
* @returns {Object}
|
|
17
|
-
*/
|
|
18
|
-
function serialize(value) {
|
|
19
|
-
if (!isObject(value)) {
|
|
20
|
-
return value;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const serialized = value.serialize ? value.serialize() : value;
|
|
24
|
-
|
|
25
|
-
Object.keys(serialized).forEach((key) => {
|
|
26
|
-
const val = serialized[key];
|
|
27
|
-
|
|
28
|
-
if (isArray(val)) {
|
|
29
|
-
if (val.length === 0) {
|
|
30
|
-
serialized[key] = undefined;
|
|
31
|
-
} else {
|
|
32
|
-
serialized[key] = val.map(serialize);
|
|
33
|
-
}
|
|
34
|
-
} else if (isObject(val)) {
|
|
35
|
-
Object.keys(val).forEach((k) => {
|
|
36
|
-
val[k] = serialize(val[k]);
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
const empty = Object.keys(serialized).reduce((acc, key) => acc && !serialized[key], true);
|
|
42
|
-
|
|
43
|
-
if (empty) {
|
|
44
|
-
return undefined;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return serialized;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* [makeWebexPluginStorage description]
|
|
52
|
-
* @param {[type]} type
|
|
53
|
-
* @param {[type]} context
|
|
54
|
-
* @private
|
|
55
|
-
* @returns {[type]}
|
|
56
|
-
*/
|
|
57
|
-
export default function makeWebexPluginStorage(type, context) {
|
|
58
|
-
/**
|
|
59
|
-
* Interface between WebexPlugin and Webex#boundeStorage or
|
|
60
|
-
* Webex#unboundedStorage
|
|
61
|
-
*/
|
|
62
|
-
class WebexPluginStorage {
|
|
63
|
-
/**
|
|
64
|
-
* @param {Object} attrs
|
|
65
|
-
* @param {Object} options
|
|
66
|
-
* @returns {WebexPluginStorage}
|
|
67
|
-
*/
|
|
68
|
-
constructor() {
|
|
69
|
-
defers.set(this, new Map());
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Clears an entire namespace
|
|
74
|
-
* @returns {Promise}
|
|
75
|
-
*/
|
|
76
|
-
clear() {
|
|
77
|
-
return context.webex[`${type}Storage`].del(context.getNamespace());
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Deletes the specified key from the store
|
|
82
|
-
* @param {string} key
|
|
83
|
-
* @returns {[type]}
|
|
84
|
-
*/
|
|
85
|
-
del(...args) {
|
|
86
|
-
return context.webex[`${type}Storage`].del(context.getNamespace(), ...args);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Retrieves the value specified by key from the store. Rejects with
|
|
91
|
-
* NotFoundError if no value can be found
|
|
92
|
-
* @param {string} key
|
|
93
|
-
* @returns {Promise}
|
|
94
|
-
*/
|
|
95
|
-
get(key) {
|
|
96
|
-
let defer = defers.get(this).get(key);
|
|
97
|
-
|
|
98
|
-
if (!defer) {
|
|
99
|
-
defer = new Defer();
|
|
100
|
-
defers.get(this).set(key, defer);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
return context.webex[`${type}Storage`].get(context.getNamespace(), key).then((res) => {
|
|
104
|
-
defer.resolve();
|
|
105
|
-
|
|
106
|
-
return res;
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Writes a value to the store
|
|
112
|
-
* @param {string} key
|
|
113
|
-
* @param {any} value
|
|
114
|
-
* @returns {Promise}
|
|
115
|
-
*/
|
|
116
|
-
put(key, value) {
|
|
117
|
-
return context.webex[`${type}Storage`].put(context.getNamespace(), key, serialize(value));
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Returns a Promise that won't resolve until the value specified by key has
|
|
122
|
-
* been attempted to be loaded from the store. This allows us to lazily
|
|
123
|
-
* prevent certain method from executing until the specified keys have been
|
|
124
|
-
* retrieved from the store.
|
|
125
|
-
* @param {string} key
|
|
126
|
-
* @returns {Promise}
|
|
127
|
-
*/
|
|
128
|
-
waitFor(key) {
|
|
129
|
-
context.logger.debug(
|
|
130
|
-
`plugin-storage(${context.getNamespace()}): waiting to init key \`${key}\``
|
|
131
|
-
);
|
|
132
|
-
const defer = defers.get(this).get(key);
|
|
133
|
-
|
|
134
|
-
if (defer) {
|
|
135
|
-
context.logger.debug(
|
|
136
|
-
`plugin-storage(${context.getNamespace()}): already inited \`${key}\``
|
|
137
|
-
);
|
|
138
|
-
|
|
139
|
-
return defer.promise;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
context.logger.debug(`plugin-storage(${context.getNamespace()}): initing \`${key}\``);
|
|
143
|
-
|
|
144
|
-
return this.initValue(key);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
@oneFlight({keyFactory: (key) => `initValue-${key}`})
|
|
148
|
-
/**
|
|
149
|
-
* Attempts to load the specified key from the store and set it on the parent
|
|
150
|
-
* object.
|
|
151
|
-
* @param {string} key
|
|
152
|
-
* @returns {Promise} Resolves (but not with the retrieved value) when
|
|
153
|
-
* the value retrieval complete
|
|
154
|
-
*/
|
|
155
|
-
// suppress doc warning because decorators confuse eslint
|
|
156
|
-
// eslint-disable-next-line require-jsdoc
|
|
157
|
-
initValue(key) {
|
|
158
|
-
const defer = new Defer();
|
|
159
|
-
|
|
160
|
-
defers.get(this).set(key, defer);
|
|
161
|
-
|
|
162
|
-
// Intentionally bypasses this.get so we don't resolve the promise until
|
|
163
|
-
// after the parent value is set.
|
|
164
|
-
context.webex[`${type}Storage`]
|
|
165
|
-
.get(context.getNamespace(), key)
|
|
166
|
-
.then((value) => {
|
|
167
|
-
context.logger.debug(
|
|
168
|
-
`plugin-storage(${context.getNamespace()}): got \`${key}\` for first time`
|
|
169
|
-
);
|
|
170
|
-
if (key === '@') {
|
|
171
|
-
context.parent.set(value);
|
|
172
|
-
} else if (result(context[key], 'isState')) {
|
|
173
|
-
context[key].set(value);
|
|
174
|
-
} else {
|
|
175
|
-
context.set(key, value);
|
|
176
|
-
}
|
|
177
|
-
context.logger.debug(
|
|
178
|
-
`plugin-storage(${context.getNamespace()}): set \`${key}\` for first time`
|
|
179
|
-
);
|
|
180
|
-
defer.resolve();
|
|
181
|
-
context.logger.debug(`plugin-storage(${context.getNamespace()}): inited \`${key}\``);
|
|
182
|
-
})
|
|
183
|
-
.catch((reason) => {
|
|
184
|
-
// The next conditional is a bit of an unfortunate solution to deal
|
|
185
|
-
// with circular dependencies in unit tests. It should not effect
|
|
186
|
-
// integration tests or production code.
|
|
187
|
-
if (
|
|
188
|
-
reason instanceof NotFoundError ||
|
|
189
|
-
(process.env.NODE_ENV !== 'production' &&
|
|
190
|
-
reason.toString().includes('MockNotFoundError'))
|
|
191
|
-
) {
|
|
192
|
-
context.logger.debug(
|
|
193
|
-
`plugin-storage(${context.getNamespace()}): no data for \`${key}\`, continuing`
|
|
194
|
-
);
|
|
195
|
-
|
|
196
|
-
return defer.resolve();
|
|
197
|
-
}
|
|
198
|
-
context.logger.warn(
|
|
199
|
-
`plugin-storage(${context.getNamespace()}): failed to init \`${key}\``,
|
|
200
|
-
reason
|
|
201
|
-
);
|
|
202
|
-
|
|
203
|
-
return defer.reject(reason);
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
return defer.promise;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
return new WebexPluginStorage();
|
|
211
|
-
}
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import {Defer, oneFlight} from '@webex/common';
|
|
6
|
+
import {isArray, isObject, result} from 'lodash';
|
|
7
|
+
|
|
8
|
+
import {NotFoundError} from './errors';
|
|
9
|
+
|
|
10
|
+
const defers = new WeakMap();
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Walks an object before writing it to the store and omits empty arrays
|
|
14
|
+
* @private
|
|
15
|
+
* @param {Object} value
|
|
16
|
+
* @returns {Object}
|
|
17
|
+
*/
|
|
18
|
+
function serialize(value) {
|
|
19
|
+
if (!isObject(value)) {
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const serialized = value.serialize ? value.serialize() : value;
|
|
24
|
+
|
|
25
|
+
Object.keys(serialized).forEach((key) => {
|
|
26
|
+
const val = serialized[key];
|
|
27
|
+
|
|
28
|
+
if (isArray(val)) {
|
|
29
|
+
if (val.length === 0) {
|
|
30
|
+
serialized[key] = undefined;
|
|
31
|
+
} else {
|
|
32
|
+
serialized[key] = val.map(serialize);
|
|
33
|
+
}
|
|
34
|
+
} else if (isObject(val)) {
|
|
35
|
+
Object.keys(val).forEach((k) => {
|
|
36
|
+
val[k] = serialize(val[k]);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
const empty = Object.keys(serialized).reduce((acc, key) => acc && !serialized[key], true);
|
|
42
|
+
|
|
43
|
+
if (empty) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return serialized;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* [makeWebexPluginStorage description]
|
|
52
|
+
* @param {[type]} type
|
|
53
|
+
* @param {[type]} context
|
|
54
|
+
* @private
|
|
55
|
+
* @returns {[type]}
|
|
56
|
+
*/
|
|
57
|
+
export default function makeWebexPluginStorage(type, context) {
|
|
58
|
+
/**
|
|
59
|
+
* Interface between WebexPlugin and Webex#boundeStorage or
|
|
60
|
+
* Webex#unboundedStorage
|
|
61
|
+
*/
|
|
62
|
+
class WebexPluginStorage {
|
|
63
|
+
/**
|
|
64
|
+
* @param {Object} attrs
|
|
65
|
+
* @param {Object} options
|
|
66
|
+
* @returns {WebexPluginStorage}
|
|
67
|
+
*/
|
|
68
|
+
constructor() {
|
|
69
|
+
defers.set(this, new Map());
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Clears an entire namespace
|
|
74
|
+
* @returns {Promise}
|
|
75
|
+
*/
|
|
76
|
+
clear() {
|
|
77
|
+
return context.webex[`${type}Storage`].del(context.getNamespace());
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Deletes the specified key from the store
|
|
82
|
+
* @param {string} key
|
|
83
|
+
* @returns {[type]}
|
|
84
|
+
*/
|
|
85
|
+
del(...args) {
|
|
86
|
+
return context.webex[`${type}Storage`].del(context.getNamespace(), ...args);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Retrieves the value specified by key from the store. Rejects with
|
|
91
|
+
* NotFoundError if no value can be found
|
|
92
|
+
* @param {string} key
|
|
93
|
+
* @returns {Promise}
|
|
94
|
+
*/
|
|
95
|
+
get(key) {
|
|
96
|
+
let defer = defers.get(this).get(key);
|
|
97
|
+
|
|
98
|
+
if (!defer) {
|
|
99
|
+
defer = new Defer();
|
|
100
|
+
defers.get(this).set(key, defer);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return context.webex[`${type}Storage`].get(context.getNamespace(), key).then((res) => {
|
|
104
|
+
defer.resolve();
|
|
105
|
+
|
|
106
|
+
return res;
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Writes a value to the store
|
|
112
|
+
* @param {string} key
|
|
113
|
+
* @param {any} value
|
|
114
|
+
* @returns {Promise}
|
|
115
|
+
*/
|
|
116
|
+
put(key, value) {
|
|
117
|
+
return context.webex[`${type}Storage`].put(context.getNamespace(), key, serialize(value));
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Returns a Promise that won't resolve until the value specified by key has
|
|
122
|
+
* been attempted to be loaded from the store. This allows us to lazily
|
|
123
|
+
* prevent certain method from executing until the specified keys have been
|
|
124
|
+
* retrieved from the store.
|
|
125
|
+
* @param {string} key
|
|
126
|
+
* @returns {Promise}
|
|
127
|
+
*/
|
|
128
|
+
waitFor(key) {
|
|
129
|
+
context.logger.debug(
|
|
130
|
+
`plugin-storage(${context.getNamespace()}): waiting to init key \`${key}\``
|
|
131
|
+
);
|
|
132
|
+
const defer = defers.get(this).get(key);
|
|
133
|
+
|
|
134
|
+
if (defer) {
|
|
135
|
+
context.logger.debug(
|
|
136
|
+
`plugin-storage(${context.getNamespace()}): already inited \`${key}\``
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
return defer.promise;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
context.logger.debug(`plugin-storage(${context.getNamespace()}): initing \`${key}\``);
|
|
143
|
+
|
|
144
|
+
return this.initValue(key);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
@oneFlight({keyFactory: (key) => `initValue-${key}`})
|
|
148
|
+
/**
|
|
149
|
+
* Attempts to load the specified key from the store and set it on the parent
|
|
150
|
+
* object.
|
|
151
|
+
* @param {string} key
|
|
152
|
+
* @returns {Promise} Resolves (but not with the retrieved value) when
|
|
153
|
+
* the value retrieval complete
|
|
154
|
+
*/
|
|
155
|
+
// suppress doc warning because decorators confuse eslint
|
|
156
|
+
// eslint-disable-next-line require-jsdoc
|
|
157
|
+
initValue(key) {
|
|
158
|
+
const defer = new Defer();
|
|
159
|
+
|
|
160
|
+
defers.get(this).set(key, defer);
|
|
161
|
+
|
|
162
|
+
// Intentionally bypasses this.get so we don't resolve the promise until
|
|
163
|
+
// after the parent value is set.
|
|
164
|
+
context.webex[`${type}Storage`]
|
|
165
|
+
.get(context.getNamespace(), key)
|
|
166
|
+
.then((value) => {
|
|
167
|
+
context.logger.debug(
|
|
168
|
+
`plugin-storage(${context.getNamespace()}): got \`${key}\` for first time`
|
|
169
|
+
);
|
|
170
|
+
if (key === '@') {
|
|
171
|
+
context.parent.set(value);
|
|
172
|
+
} else if (result(context[key], 'isState')) {
|
|
173
|
+
context[key].set(value);
|
|
174
|
+
} else {
|
|
175
|
+
context.set(key, value);
|
|
176
|
+
}
|
|
177
|
+
context.logger.debug(
|
|
178
|
+
`plugin-storage(${context.getNamespace()}): set \`${key}\` for first time`
|
|
179
|
+
);
|
|
180
|
+
defer.resolve();
|
|
181
|
+
context.logger.debug(`plugin-storage(${context.getNamespace()}): inited \`${key}\``);
|
|
182
|
+
})
|
|
183
|
+
.catch((reason) => {
|
|
184
|
+
// The next conditional is a bit of an unfortunate solution to deal
|
|
185
|
+
// with circular dependencies in unit tests. It should not effect
|
|
186
|
+
// integration tests or production code.
|
|
187
|
+
if (
|
|
188
|
+
reason instanceof NotFoundError ||
|
|
189
|
+
(process.env.NODE_ENV !== 'production' &&
|
|
190
|
+
reason.toString().includes('MockNotFoundError'))
|
|
191
|
+
) {
|
|
192
|
+
context.logger.debug(
|
|
193
|
+
`plugin-storage(${context.getNamespace()}): no data for \`${key}\`, continuing`
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
return defer.resolve();
|
|
197
|
+
}
|
|
198
|
+
context.logger.warn(
|
|
199
|
+
`plugin-storage(${context.getNamespace()}): failed to init \`${key}\``,
|
|
200
|
+
reason
|
|
201
|
+
);
|
|
202
|
+
|
|
203
|
+
return defer.reject(reason);
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
return defer.promise;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return new WebexPluginStorage();
|
|
211
|
+
}
|