@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.
Files changed (189) hide show
  1. package/.eslintrc.js +6 -6
  2. package/README.md +79 -79
  3. package/babel.config.js +3 -3
  4. package/dist/config.js +24 -24
  5. package/dist/config.js.map +1 -1
  6. package/dist/credentials-config.js +56 -56
  7. package/dist/credentials-config.js.map +1 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/interceptors/auth.js +28 -28
  10. package/dist/interceptors/auth.js.map +1 -1
  11. package/dist/interceptors/default-options.js +24 -24
  12. package/dist/interceptors/default-options.js.map +1 -1
  13. package/dist/interceptors/embargo.js +9 -9
  14. package/dist/interceptors/embargo.js.map +1 -1
  15. package/dist/interceptors/network-timing.js +19 -19
  16. package/dist/interceptors/network-timing.js.map +1 -1
  17. package/dist/interceptors/payload-transformer.js +19 -19
  18. package/dist/interceptors/payload-transformer.js.map +1 -1
  19. package/dist/interceptors/rate-limit.js +40 -40
  20. package/dist/interceptors/rate-limit.js.map +1 -1
  21. package/dist/interceptors/redirect.js +13 -13
  22. package/dist/interceptors/redirect.js.map +1 -1
  23. package/dist/interceptors/request-event.js +23 -23
  24. package/dist/interceptors/request-event.js.map +1 -1
  25. package/dist/interceptors/request-logger.js +13 -13
  26. package/dist/interceptors/request-logger.js.map +1 -1
  27. package/dist/interceptors/request-timing.js +23 -23
  28. package/dist/interceptors/request-timing.js.map +1 -1
  29. package/dist/interceptors/response-logger.js +19 -19
  30. package/dist/interceptors/response-logger.js.map +1 -1
  31. package/dist/interceptors/user-agent.js +29 -29
  32. package/dist/interceptors/user-agent.js.map +1 -1
  33. package/dist/interceptors/webex-tracking-id.js +15 -15
  34. package/dist/interceptors/webex-tracking-id.js.map +1 -1
  35. package/dist/interceptors/webex-user-agent.js +13 -13
  36. package/dist/interceptors/webex-user-agent.js.map +1 -1
  37. package/dist/lib/batcher.js +83 -83
  38. package/dist/lib/batcher.js.map +1 -1
  39. package/dist/lib/credentials/credentials.js +103 -103
  40. package/dist/lib/credentials/credentials.js.map +1 -1
  41. package/dist/lib/credentials/grant-errors.js +17 -17
  42. package/dist/lib/credentials/grant-errors.js.map +1 -1
  43. package/dist/lib/credentials/index.js +2 -2
  44. package/dist/lib/credentials/index.js.map +1 -1
  45. package/dist/lib/credentials/scope.js +11 -11
  46. package/dist/lib/credentials/scope.js.map +1 -1
  47. package/dist/lib/credentials/token-collection.js +2 -2
  48. package/dist/lib/credentials/token-collection.js.map +1 -1
  49. package/dist/lib/credentials/token.js +145 -145
  50. package/dist/lib/credentials/token.js.map +1 -1
  51. package/dist/lib/page.js +49 -49
  52. package/dist/lib/page.js.map +1 -1
  53. package/dist/lib/services/constants.js.map +1 -1
  54. package/dist/lib/services/index.js +2 -2
  55. package/dist/lib/services/index.js.map +1 -1
  56. package/dist/lib/services/interceptors/server-error.js +9 -9
  57. package/dist/lib/services/interceptors/server-error.js.map +1 -1
  58. package/dist/lib/services/interceptors/service.js +24 -24
  59. package/dist/lib/services/interceptors/service.js.map +1 -1
  60. package/dist/lib/services/metrics.js.map +1 -1
  61. package/dist/lib/services/service-catalog.js +104 -104
  62. package/dist/lib/services/service-catalog.js.map +1 -1
  63. package/dist/lib/services/service-fed-ramp.js.map +1 -1
  64. package/dist/lib/services/service-host.js +134 -134
  65. package/dist/lib/services/service-host.js.map +1 -1
  66. package/dist/lib/services/service-registry.js +175 -175
  67. package/dist/lib/services/service-registry.js.map +1 -1
  68. package/dist/lib/services/service-state.js +38 -38
  69. package/dist/lib/services/service-state.js.map +1 -1
  70. package/dist/lib/services/service-url.js +31 -31
  71. package/dist/lib/services/service-url.js.map +1 -1
  72. package/dist/lib/services/services.js +245 -245
  73. package/dist/lib/services/services.js.map +1 -1
  74. package/dist/lib/stateless-webex-plugin.js +28 -28
  75. package/dist/lib/stateless-webex-plugin.js.map +1 -1
  76. package/dist/lib/storage/decorators.js +27 -27
  77. package/dist/lib/storage/decorators.js.map +1 -1
  78. package/dist/lib/storage/errors.js +4 -4
  79. package/dist/lib/storage/errors.js.map +1 -1
  80. package/dist/lib/storage/index.js.map +1 -1
  81. package/dist/lib/storage/make-webex-plugin-store.js +44 -44
  82. package/dist/lib/storage/make-webex-plugin-store.js.map +1 -1
  83. package/dist/lib/storage/make-webex-store.js +40 -40
  84. package/dist/lib/storage/make-webex-store.js.map +1 -1
  85. package/dist/lib/storage/memory-store-adapter.js +9 -9
  86. package/dist/lib/storage/memory-store-adapter.js.map +1 -1
  87. package/dist/lib/webex-core-plugin-mixin.js +13 -13
  88. package/dist/lib/webex-core-plugin-mixin.js.map +1 -1
  89. package/dist/lib/webex-http-error.js +9 -9
  90. package/dist/lib/webex-http-error.js.map +1 -1
  91. package/dist/lib/webex-internal-core-plugin-mixin.js +13 -13
  92. package/dist/lib/webex-internal-core-plugin-mixin.js.map +1 -1
  93. package/dist/lib/webex-plugin.js +36 -36
  94. package/dist/lib/webex-plugin.js.map +1 -1
  95. package/dist/plugins/logger.js +9 -9
  96. package/dist/plugins/logger.js.map +1 -1
  97. package/dist/webex-core.js +104 -104
  98. package/dist/webex-core.js.map +1 -1
  99. package/dist/webex-internal-core.js +12 -12
  100. package/dist/webex-internal-core.js.map +1 -1
  101. package/jest.config.js +3 -3
  102. package/package.json +20 -19
  103. package/process +1 -1
  104. package/src/config.js +90 -90
  105. package/src/credentials-config.js +212 -212
  106. package/src/index.js +62 -62
  107. package/src/interceptors/auth.js +186 -186
  108. package/src/interceptors/default-options.js +55 -55
  109. package/src/interceptors/embargo.js +43 -43
  110. package/src/interceptors/network-timing.js +54 -54
  111. package/src/interceptors/payload-transformer.js +55 -55
  112. package/src/interceptors/rate-limit.js +169 -169
  113. package/src/interceptors/redirect.js +106 -106
  114. package/src/interceptors/request-event.js +93 -93
  115. package/src/interceptors/request-logger.js +78 -78
  116. package/src/interceptors/request-timing.js +65 -65
  117. package/src/interceptors/response-logger.js +98 -98
  118. package/src/interceptors/user-agent.js +77 -77
  119. package/src/interceptors/webex-tracking-id.js +73 -73
  120. package/src/interceptors/webex-user-agent.js +79 -79
  121. package/src/lib/batcher.js +307 -307
  122. package/src/lib/credentials/credentials.js +552 -552
  123. package/src/lib/credentials/grant-errors.js +92 -92
  124. package/src/lib/credentials/index.js +16 -16
  125. package/src/lib/credentials/scope.js +34 -34
  126. package/src/lib/credentials/token-collection.js +17 -17
  127. package/src/lib/credentials/token.js +559 -559
  128. package/src/lib/page.js +159 -159
  129. package/src/lib/services/constants.js +9 -9
  130. package/src/lib/services/index.js +26 -26
  131. package/src/lib/services/interceptors/server-error.js +48 -48
  132. package/src/lib/services/interceptors/service.js +101 -101
  133. package/src/lib/services/metrics.js +4 -4
  134. package/src/lib/services/service-catalog.js +435 -435
  135. package/src/lib/services/service-fed-ramp.js +4 -4
  136. package/src/lib/services/service-host.js +267 -267
  137. package/src/lib/services/service-registry.js +465 -465
  138. package/src/lib/services/service-state.js +78 -78
  139. package/src/lib/services/service-url.js +124 -124
  140. package/src/lib/services/services.js +1018 -1018
  141. package/src/lib/stateless-webex-plugin.js +98 -98
  142. package/src/lib/storage/decorators.js +220 -220
  143. package/src/lib/storage/errors.js +15 -15
  144. package/src/lib/storage/index.js +10 -10
  145. package/src/lib/storage/make-webex-plugin-store.js +211 -211
  146. package/src/lib/storage/make-webex-store.js +140 -140
  147. package/src/lib/storage/memory-store-adapter.js +79 -79
  148. package/src/lib/webex-core-plugin-mixin.js +114 -114
  149. package/src/lib/webex-http-error.js +61 -61
  150. package/src/lib/webex-internal-core-plugin-mixin.js +107 -107
  151. package/src/lib/webex-plugin.js +222 -222
  152. package/src/plugins/logger.js +60 -60
  153. package/src/webex-core.js +745 -745
  154. package/src/webex-internal-core.js +46 -46
  155. package/test/integration/spec/credentials/credentials.js +139 -139
  156. package/test/integration/spec/credentials/token.js +102 -102
  157. package/test/integration/spec/services/service-catalog.js +838 -838
  158. package/test/integration/spec/services/services.js +1221 -1221
  159. package/test/integration/spec/webex-core.js +178 -178
  160. package/test/unit/spec/_setup.js +44 -44
  161. package/test/unit/spec/credentials/credentials.js +1017 -1017
  162. package/test/unit/spec/credentials/token.js +441 -441
  163. package/test/unit/spec/interceptors/auth.js +521 -521
  164. package/test/unit/spec/interceptors/default-options.js +84 -84
  165. package/test/unit/spec/interceptors/embargo.js +144 -144
  166. package/test/unit/spec/interceptors/network-timing.js +49 -49
  167. package/test/unit/spec/interceptors/payload-transformer.js +155 -155
  168. package/test/unit/spec/interceptors/rate-limit.js +302 -302
  169. package/test/unit/spec/interceptors/redirect.js +102 -102
  170. package/test/unit/spec/interceptors/request-timing.js +92 -92
  171. package/test/unit/spec/interceptors/user-agent.js +76 -76
  172. package/test/unit/spec/interceptors/webex-tracking-id.js +76 -76
  173. package/test/unit/spec/interceptors/webex-user-agent.js +159 -159
  174. package/test/unit/spec/lib/batcher.js +330 -330
  175. package/test/unit/spec/lib/page.js +148 -148
  176. package/test/unit/spec/lib/webex-plugin.js +48 -48
  177. package/test/unit/spec/services/interceptors/server-error.js +204 -204
  178. package/test/unit/spec/services/interceptors/service.js +188 -188
  179. package/test/unit/spec/services/service-catalog.js +194 -194
  180. package/test/unit/spec/services/service-host.js +260 -260
  181. package/test/unit/spec/services/service-registry.js +747 -747
  182. package/test/unit/spec/services/service-state.js +60 -60
  183. package/test/unit/spec/services/service-url.js +258 -258
  184. package/test/unit/spec/services/services.js +348 -348
  185. package/test/unit/spec/storage/persist.js +50 -50
  186. package/test/unit/spec/storage/storage-adapter.js +12 -12
  187. package/test/unit/spec/storage/wait-for-value.js +81 -81
  188. package/test/unit/spec/webex-core.js +253 -253
  189. package/test/unit/spec/webex-internal-core.js +91 -91
@@ -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
+ }