@splitsoftware/splitio-commons 1.17.1-rc.2 → 2.0.0-rc.0
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/CHANGES.txt +7 -3
- package/cjs/evaluator/index.js +2 -2
- package/cjs/evaluator/matchers/semver_inlist.js +1 -2
- package/cjs/evaluator/matchers/whitelist.js +1 -2
- package/cjs/listeners/browser.js +1 -2
- package/cjs/logger/browser/DebugLogger.js +1 -2
- package/cjs/logger/browser/ErrorLogger.js +1 -2
- package/cjs/logger/browser/InfoLogger.js +1 -2
- package/cjs/logger/browser/WarnLogger.js +1 -2
- package/cjs/logger/index.js +1 -2
- package/cjs/sdkClient/clientCS.js +5 -8
- package/cjs/sdkClient/sdkClientMethodCS.js +1 -1
- package/cjs/sdkFactory/index.js +1 -3
- package/cjs/services/decorateHeaders.js +1 -2
- package/cjs/storages/AbstractSplitsCacheAsync.js +7 -0
- package/cjs/storages/AbstractSplitsCacheSync.js +7 -0
- package/cjs/storages/KeyBuilderCS.js +0 -9
- package/cjs/storages/dataLoader.js +32 -65
- package/cjs/storages/inLocalStorage/MySegmentsCacheInLocal.js +1 -21
- package/cjs/storages/inLocalStorage/SplitsCacheInLocal.js +14 -7
- package/cjs/storages/inLocalStorage/index.js +1 -4
- package/cjs/storages/inMemory/InMemoryStorageCS.js +4 -16
- package/cjs/storages/inMemory/SegmentsCacheInMemory.js +3 -4
- package/cjs/storages/inMemory/SplitsCacheInMemory.js +2 -3
- package/cjs/storages/inMemory/UniqueKeysCacheInMemory.js +2 -3
- package/cjs/storages/inMemory/UniqueKeysCacheInMemoryCS.js +2 -3
- package/cjs/storages/inRedis/RedisAdapter.js +2 -3
- package/cjs/storages/inRedis/SplitsCacheInRedis.js +1 -1
- package/cjs/storages/inRedis/TelemetryCacheInRedis.js +3 -4
- package/cjs/storages/inRedis/UniqueKeysCacheInRedis.js +1 -2
- package/cjs/storages/pluggable/SplitsCachePluggable.js +1 -1
- package/cjs/storages/pluggable/TelemetryCachePluggable.js +6 -7
- package/cjs/storages/pluggable/UniqueKeysCachePluggable.js +1 -2
- package/cjs/storages/pluggable/inMemoryWrapper.js +7 -8
- package/cjs/sync/offline/syncTasks/fromObjectSyncTask.js +7 -2
- package/cjs/sync/polling/pollingManagerSS.js +3 -3
- package/cjs/sync/polling/updaters/splitChangesUpdater.js +13 -5
- package/cjs/sync/streaming/parseUtils.js +0 -1
- package/cjs/sync/streaming/pushManager.js +2 -3
- package/cjs/utils/LRUCache/index.js +1 -2
- package/cjs/utils/constants/browser.js +1 -4
- package/cjs/utils/lang/index.js +6 -9
- package/cjs/utils/lang/objectAssign.js +12 -77
- package/cjs/utils/lang/sets.js +3 -110
- package/cjs/utils/settingsValidation/index.js +0 -9
- package/cjs/utils/settingsValidation/logger/builtinLogger.js +1 -2
- package/cjs/utils/settingsValidation/storage/storageCS.js +12 -1
- package/esm/evaluator/index.js +3 -3
- package/esm/evaluator/matchers/semver_inlist.js +1 -2
- package/esm/evaluator/matchers/whitelist.js +1 -2
- package/esm/listeners/browser.js +1 -2
- package/esm/logger/browser/DebugLogger.js +1 -2
- package/esm/logger/browser/ErrorLogger.js +1 -2
- package/esm/logger/browser/InfoLogger.js +1 -2
- package/esm/logger/browser/WarnLogger.js +1 -2
- package/esm/logger/index.js +1 -2
- package/esm/sdkClient/clientCS.js +5 -8
- package/esm/sdkClient/sdkClientMethodCS.js +1 -1
- package/esm/sdkFactory/index.js +2 -4
- package/esm/services/decorateHeaders.js +1 -2
- package/esm/storages/AbstractSplitsCacheAsync.js +7 -0
- package/esm/storages/AbstractSplitsCacheSync.js +7 -0
- package/esm/storages/KeyBuilderCS.js +0 -9
- package/esm/storages/dataLoader.js +30 -62
- package/esm/storages/inLocalStorage/MySegmentsCacheInLocal.js +1 -21
- package/esm/storages/inLocalStorage/SplitsCacheInLocal.js +14 -7
- package/esm/storages/inLocalStorage/index.js +2 -5
- package/esm/storages/inMemory/InMemoryStorageCS.js +4 -16
- package/esm/storages/inMemory/SegmentsCacheInMemory.js +3 -4
- package/esm/storages/inMemory/SplitsCacheInMemory.js +2 -3
- package/esm/storages/inMemory/UniqueKeysCacheInMemory.js +2 -3
- package/esm/storages/inMemory/UniqueKeysCacheInMemoryCS.js +2 -3
- package/esm/storages/inRedis/RedisAdapter.js +2 -3
- package/esm/storages/inRedis/SplitsCacheInRedis.js +2 -2
- package/esm/storages/inRedis/TelemetryCacheInRedis.js +3 -4
- package/esm/storages/inRedis/UniqueKeysCacheInRedis.js +1 -2
- package/esm/storages/pluggable/SplitsCachePluggable.js +2 -2
- package/esm/storages/pluggable/TelemetryCachePluggable.js +6 -7
- package/esm/storages/pluggable/UniqueKeysCachePluggable.js +1 -2
- package/esm/storages/pluggable/inMemoryWrapper.js +7 -8
- package/esm/sync/offline/syncTasks/fromObjectSyncTask.js +8 -3
- package/esm/sync/polling/pollingManagerSS.js +3 -3
- package/esm/sync/polling/updaters/splitChangesUpdater.js +14 -6
- package/esm/sync/streaming/parseUtils.js +0 -1
- package/esm/sync/streaming/pushManager.js +2 -3
- package/esm/utils/LRUCache/index.js +1 -2
- package/esm/utils/constants/browser.js +0 -3
- package/esm/utils/lang/index.js +6 -9
- package/esm/utils/lang/objectAssign.js +12 -77
- package/esm/utils/lang/sets.js +2 -107
- package/esm/utils/settingsValidation/index.js +0 -9
- package/esm/utils/settingsValidation/logger/builtinLogger.js +1 -2
- package/esm/utils/settingsValidation/storage/storageCS.js +10 -0
- package/package.json +2 -2
- package/src/evaluator/index.ts +5 -5
- package/src/evaluator/matchers/semver_inlist.ts +1 -2
- package/src/evaluator/matchers/whitelist.ts +1 -3
- package/src/listeners/browser.ts +1 -2
- package/src/logger/browser/DebugLogger.ts +1 -2
- package/src/logger/browser/ErrorLogger.ts +1 -2
- package/src/logger/browser/InfoLogger.ts +1 -2
- package/src/logger/browser/WarnLogger.ts +1 -2
- package/src/logger/index.ts +3 -4
- package/src/sdkClient/clientCS.ts +5 -8
- package/src/sdkClient/sdkClientMethodCS.ts +1 -1
- package/src/sdkFactory/index.ts +2 -5
- package/src/sdkFactory/types.ts +1 -1
- package/src/services/decorateHeaders.ts +1 -2
- package/src/storages/AbstractSplitsCacheAsync.ts +9 -2
- package/src/storages/AbstractSplitsCacheSync.ts +9 -2
- package/src/storages/KeyBuilderCS.ts +0 -13
- package/src/storages/dataLoader.ts +32 -63
- package/src/storages/inLocalStorage/MySegmentsCacheInLocal.ts +1 -21
- package/src/storages/inLocalStorage/SplitsCacheInLocal.ts +16 -8
- package/src/storages/inLocalStorage/index.ts +2 -6
- package/src/storages/inMemory/InMemoryStorageCS.ts +4 -19
- package/src/storages/inMemory/SegmentsCacheInMemory.ts +4 -5
- package/src/storages/inMemory/SplitsCacheInMemory.ts +4 -5
- package/src/storages/inMemory/UniqueKeysCacheInMemory.ts +4 -5
- package/src/storages/inMemory/UniqueKeysCacheInMemoryCS.ts +4 -5
- package/src/storages/inRedis/RedisAdapter.ts +3 -4
- package/src/storages/inRedis/SplitsCacheInRedis.ts +3 -3
- package/src/storages/inRedis/TelemetryCacheInRedis.ts +3 -4
- package/src/storages/inRedis/UniqueKeysCacheInRedis.ts +1 -2
- package/src/storages/pluggable/SegmentsCachePluggable.ts +0 -1
- package/src/storages/pluggable/SplitsCachePluggable.ts +3 -3
- package/src/storages/pluggable/TelemetryCachePluggable.ts +6 -7
- package/src/storages/pluggable/UniqueKeysCachePluggable.ts +1 -2
- package/src/storages/pluggable/inMemoryWrapper.ts +8 -9
- package/src/storages/types.ts +9 -5
- package/src/sync/offline/syncTasks/fromObjectSyncTask.ts +7 -3
- package/src/sync/polling/pollingManagerSS.ts +2 -3
- package/src/sync/polling/updaters/splitChangesUpdater.ts +15 -8
- package/src/sync/streaming/parseUtils.ts +0 -1
- package/src/sync/streaming/pushManager.ts +3 -4
- package/src/sync/submitters/types.ts +3 -4
- package/src/types.ts +9 -18
- package/src/utils/LRUCache/index.ts +2 -3
- package/src/utils/constants/browser.ts +0 -4
- package/src/utils/lang/index.ts +6 -7
- package/src/utils/lang/objectAssign.ts +13 -92
- package/src/utils/lang/sets.ts +3 -125
- package/src/utils/settingsValidation/index.ts +0 -10
- package/src/utils/settingsValidation/logger/builtinLogger.ts +1 -2
- package/src/utils/settingsValidation/storage/storageCS.ts +13 -0
- package/src/utils/settingsValidation/types.ts +0 -2
- package/types/logger/index.d.ts +1 -2
- package/types/sdkClient/clientCS.d.ts +2 -3
- package/types/sdkFactory/types.d.ts +1 -1
- package/types/storages/AbstractSplitsCacheAsync.d.ts +6 -2
- package/types/storages/AbstractSplitsCacheSync.d.ts +6 -2
- package/types/storages/KeyBuilderCS.d.ts +0 -2
- package/types/storages/dataLoader.d.ts +6 -17
- package/types/storages/inLocalStorage/SplitsCacheInLocal.d.ts +7 -2
- package/types/storages/inMemory/SplitsCacheInMemory.d.ts +1 -2
- package/types/storages/inMemory/UniqueKeysCacheInMemory.d.ts +2 -3
- package/types/storages/inRedis/SplitsCacheInRedis.d.ts +1 -2
- package/types/storages/pluggable/SplitsCachePluggable.d.ts +1 -2
- package/types/storages/pluggable/inMemoryWrapper.d.ts +1 -2
- package/types/storages/types.d.ts +7 -5
- package/types/sync/polling/updaters/splitChangesUpdater.d.ts +1 -2
- package/types/sync/submitters/types.d.ts +3 -4
- package/types/types.d.ts +9 -17
- package/types/utils/LRUCache/index.d.ts +1 -2
- package/types/utils/constants/browser.d.ts +0 -2
- package/types/utils/lang/objectAssign.d.ts +3 -0
- package/types/utils/lang/sets.d.ts +1 -61
- package/types/utils/settingsValidation/index.d.ts +0 -1
- package/types/utils/settingsValidation/storage/storageCS.d.ts +5 -0
- package/types/utils/settingsValidation/types.d.ts +0 -2
- package/cjs/integrations/browser.js +0 -31
- package/cjs/integrations/ga/GaToSplit.js +0 -257
- package/cjs/integrations/ga/GoogleAnalyticsToSplit.js +0 -14
- package/cjs/integrations/ga/SplitToGa.js +0 -123
- package/cjs/integrations/ga/SplitToGoogleAnalytics.js +0 -14
- package/cjs/integrations/ga/types.js +0 -2
- package/cjs/sdkClient/sdkClientMethodCSWithTT.js +0 -76
- package/cjs/utils/lang/maps.js +0 -96
- package/esm/integrations/browser.js +0 -27
- package/esm/integrations/ga/GaToSplit.js +0 -250
- package/esm/integrations/ga/GoogleAnalyticsToSplit.js +0 -10
- package/esm/integrations/ga/SplitToGa.js +0 -120
- package/esm/integrations/ga/SplitToGoogleAnalytics.js +0 -10
- package/esm/integrations/ga/types.js +0 -1
- package/esm/sdkClient/sdkClientMethodCSWithTT.js +0 -72
- package/esm/utils/lang/maps.js +0 -92
- package/src/integrations/browser.ts +0 -35
- package/src/integrations/ga/GaToSplit.ts +0 -299
- package/src/integrations/ga/GoogleAnalyticsToSplit.ts +0 -14
- package/src/integrations/ga/SplitToGa.ts +0 -135
- package/src/integrations/ga/SplitToGoogleAnalytics.ts +0 -14
- package/src/integrations/ga/autoRequire.js +0 -33
- package/src/integrations/ga/types.ts +0 -153
- package/src/sdkClient/sdkClientMethodCSWithTT.ts +0 -98
- package/src/utils/lang/maps.ts +0 -108
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.UniqueKeysCacheInMemory = exports.fromUniqueKeysCollector = void 0;
|
|
4
|
-
var sets_1 = require("../../utils/lang/sets");
|
|
5
4
|
var constants_1 = require("../inRedis/constants");
|
|
6
5
|
/**
|
|
7
6
|
* Converts `uniqueKeys` data from cache into request payload for SS.
|
|
@@ -11,7 +10,7 @@ function fromUniqueKeysCollector(uniqueKeys) {
|
|
|
11
10
|
var featureNames = Object.keys(uniqueKeys);
|
|
12
11
|
for (var i = 0; i < featureNames.length; i++) {
|
|
13
12
|
var featureName = featureNames[i];
|
|
14
|
-
var userKeys =
|
|
13
|
+
var userKeys = Array.from(uniqueKeys[featureName]);
|
|
15
14
|
var uniqueKeysPayload = {
|
|
16
15
|
f: featureName,
|
|
17
16
|
ks: userKeys
|
|
@@ -36,7 +35,7 @@ var UniqueKeysCacheInMemory = /** @class */ (function () {
|
|
|
36
35
|
*/
|
|
37
36
|
UniqueKeysCacheInMemory.prototype.track = function (userKey, featureName) {
|
|
38
37
|
if (!this.uniqueKeysTracker[featureName])
|
|
39
|
-
this.uniqueKeysTracker[featureName] = new
|
|
38
|
+
this.uniqueKeysTracker[featureName] = new Set();
|
|
40
39
|
var tracker = this.uniqueKeysTracker[featureName];
|
|
41
40
|
if (!tracker.has(userKey)) {
|
|
42
41
|
tracker.add(userKey);
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.UniqueKeysCacheInMemoryCS = void 0;
|
|
4
|
-
var sets_1 = require("../../utils/lang/sets");
|
|
5
4
|
var constants_1 = require("../inRedis/constants");
|
|
6
5
|
var UniqueKeysCacheInMemoryCS = /** @class */ (function () {
|
|
7
6
|
/**
|
|
@@ -23,7 +22,7 @@ var UniqueKeysCacheInMemoryCS = /** @class */ (function () {
|
|
|
23
22
|
*/
|
|
24
23
|
UniqueKeysCacheInMemoryCS.prototype.track = function (userKey, featureName) {
|
|
25
24
|
if (!this.uniqueKeysTracker[userKey])
|
|
26
|
-
this.uniqueKeysTracker[userKey] = new
|
|
25
|
+
this.uniqueKeysTracker[userKey] = new Set();
|
|
27
26
|
var tracker = this.uniqueKeysTracker[userKey];
|
|
28
27
|
if (!tracker.has(featureName)) {
|
|
29
28
|
tracker.add(featureName);
|
|
@@ -62,7 +61,7 @@ var UniqueKeysCacheInMemoryCS = /** @class */ (function () {
|
|
|
62
61
|
var userKeys = Object.keys(uniqueKeys);
|
|
63
62
|
for (var k = 0; k < userKeys.length; k++) {
|
|
64
63
|
var userKey = userKeys[k];
|
|
65
|
-
var featureNames =
|
|
64
|
+
var featureNames = Array.from(uniqueKeys[userKey]);
|
|
66
65
|
var uniqueKeysPayload = {
|
|
67
66
|
k: userKey,
|
|
68
67
|
fs: featureNames
|
|
@@ -4,7 +4,6 @@ exports.RedisAdapter = void 0;
|
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var ioredis_1 = (0, tslib_1.__importDefault)(require("ioredis"));
|
|
6
6
|
var lang_1 = require("../../utils/lang");
|
|
7
|
-
var sets_1 = require("../../utils/lang/sets");
|
|
8
7
|
var thenable_1 = require("../../utils/promise/thenable");
|
|
9
8
|
var timeout_1 = require("../../utils/promise/timeout");
|
|
10
9
|
var LOG_PREFIX = 'storage:redis-adapter: ';
|
|
@@ -36,7 +35,7 @@ var RedisAdapter = /** @class */ (function (_super) {
|
|
|
36
35
|
_this.log = log;
|
|
37
36
|
_this._options = options;
|
|
38
37
|
_this._notReadyCommandsQueue = [];
|
|
39
|
-
_this._runningCommands = new
|
|
38
|
+
_this._runningCommands = new Set();
|
|
40
39
|
_this._listenToEvents();
|
|
41
40
|
_this._setTimeoutWrappers();
|
|
42
41
|
_this._setDisconnectWrapper();
|
|
@@ -129,7 +128,7 @@ var RedisAdapter = /** @class */ (function (_super) {
|
|
|
129
128
|
setTimeout(function deferredDisconnect() {
|
|
130
129
|
if (instance._runningCommands.size > 0) {
|
|
131
130
|
instance.log.info(LOG_PREFIX + ("Attempting to disconnect but there are " + instance._runningCommands.size + " commands still waiting for resolution. Defering disconnection until those finish."));
|
|
132
|
-
Promise.all(
|
|
131
|
+
Promise.all(Array.from(instance._runningCommands))
|
|
133
132
|
.then(function () {
|
|
134
133
|
instance.log.debug(LOG_PREFIX + 'Pending commands finished successfully, disconnecting.');
|
|
135
134
|
originalMethod.apply(instance, params);
|
|
@@ -200,7 +200,7 @@ var SplitsCacheInRedis = /** @class */ (function (_super) {
|
|
|
200
200
|
return value;
|
|
201
201
|
_this.log.error(constants_1.LOG_PREFIX + ("Could not read result from get members of flag set " + flagSets[index] + " due to an error: " + e));
|
|
202
202
|
}); })
|
|
203
|
-
.then(function (namesByFlagSets) { return namesByFlagSets.map(function (namesByFlagSet) { return new
|
|
203
|
+
.then(function (namesByFlagSets) { return namesByFlagSets.map(function (namesByFlagSet) { return new Set(namesByFlagSet); }); });
|
|
204
204
|
};
|
|
205
205
|
/**
|
|
206
206
|
* Check traffic type existence.
|
|
@@ -5,7 +5,6 @@ var findLatencyIndex_1 = require("../findLatencyIndex");
|
|
|
5
5
|
var telemetrySubmitter_1 = require("../../sync/submitters/telemetrySubmitter");
|
|
6
6
|
var constants_1 = require("../../utils/constants");
|
|
7
7
|
var lang_1 = require("../../utils/lang");
|
|
8
|
-
var maps_1 = require("../../utils/lang/maps");
|
|
9
8
|
var TelemetryCacheInMemory_1 = require("../inMemory/TelemetryCacheInMemory");
|
|
10
9
|
var utils_1 = require("../utils");
|
|
11
10
|
var TelemetryCacheInRedis = /** @class */ (function () {
|
|
@@ -42,7 +41,7 @@ var TelemetryCacheInRedis = /** @class */ (function () {
|
|
|
42
41
|
TelemetryCacheInRedis.prototype.popLatencies = function () {
|
|
43
42
|
var _this = this;
|
|
44
43
|
return this.redis.hgetall(this.keys.latencyPrefix).then(function (latencies) {
|
|
45
|
-
var result = new
|
|
44
|
+
var result = new Map();
|
|
46
45
|
Object.keys(latencies).forEach(function (field) {
|
|
47
46
|
var parsedField = (0, utils_1.parseLatencyField)(field);
|
|
48
47
|
if ((0, lang_1.isString)(parsedField)) {
|
|
@@ -74,7 +73,7 @@ var TelemetryCacheInRedis = /** @class */ (function () {
|
|
|
74
73
|
TelemetryCacheInRedis.prototype.popExceptions = function () {
|
|
75
74
|
var _this = this;
|
|
76
75
|
return this.redis.hgetall(this.keys.exceptionPrefix).then(function (exceptions) {
|
|
77
|
-
var result = new
|
|
76
|
+
var result = new Map();
|
|
78
77
|
Object.keys(exceptions).forEach(function (field) {
|
|
79
78
|
var parsedField = (0, utils_1.parseExceptionField)(field);
|
|
80
79
|
if ((0, lang_1.isString)(parsedField)) {
|
|
@@ -101,7 +100,7 @@ var TelemetryCacheInRedis = /** @class */ (function () {
|
|
|
101
100
|
TelemetryCacheInRedis.prototype.popConfigs = function () {
|
|
102
101
|
var _this = this;
|
|
103
102
|
return this.redis.hgetall(this.keys.initPrefix).then(function (configs) {
|
|
104
|
-
var result = new
|
|
103
|
+
var result = new Map();
|
|
105
104
|
Object.keys(configs).forEach(function (field) {
|
|
106
105
|
var parsedField = (0, utils_1.parseMetadata)(field);
|
|
107
106
|
if ((0, lang_1.isString)(parsedField)) {
|
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.UniqueKeysCacheInRedis = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var UniqueKeysCacheInMemory_1 = require("../inMemory/UniqueKeysCacheInMemory");
|
|
6
|
-
var sets_1 = require("../../utils/lang/sets");
|
|
7
6
|
var constants_1 = require("./constants");
|
|
8
7
|
var constants_2 = require("./constants");
|
|
9
8
|
var UniqueKeysCacheInRedis = /** @class */ (function (_super) {
|
|
@@ -25,7 +24,7 @@ var UniqueKeysCacheInRedis = /** @class */ (function (_super) {
|
|
|
25
24
|
if (!featureNames.length)
|
|
26
25
|
return Promise.resolve(false);
|
|
27
26
|
var uniqueKeysArray = featureNames.map(function (featureName) {
|
|
28
|
-
var featureKeys =
|
|
27
|
+
var featureKeys = Array.from(_this.uniqueKeysTracker[featureName]);
|
|
29
28
|
var uniqueKeysPayload = {
|
|
30
29
|
f: featureName,
|
|
31
30
|
ks: featureKeys
|
|
@@ -170,7 +170,7 @@ var SplitsCachePluggable = /** @class */ (function (_super) {
|
|
|
170
170
|
return Promise.all(flagSets.map(function (flagSet) {
|
|
171
171
|
var flagSetKey = _this.keys.buildFlagSetKey(flagSet);
|
|
172
172
|
return _this.wrapper.getItems(flagSetKey).catch(function () { return []; });
|
|
173
|
-
})).then(function (namesByFlagSets) { return namesByFlagSets.map(function (namesByFlagSet) { return new
|
|
173
|
+
})).then(function (namesByFlagSets) { return namesByFlagSets.map(function (namesByFlagSet) { return new Set(namesByFlagSet); }); });
|
|
174
174
|
};
|
|
175
175
|
/**
|
|
176
176
|
* Check traffic type existence.
|
|
@@ -5,7 +5,6 @@ var findLatencyIndex_1 = require("../findLatencyIndex");
|
|
|
5
5
|
var telemetrySubmitter_1 = require("../../sync/submitters/telemetrySubmitter");
|
|
6
6
|
var constants_1 = require("../../utils/constants");
|
|
7
7
|
var lang_1 = require("../../utils/lang");
|
|
8
|
-
var maps_1 = require("../../utils/lang/maps");
|
|
9
8
|
var TelemetryCacheInMemory_1 = require("../inMemory/TelemetryCacheInMemory");
|
|
10
9
|
var utils_1 = require("../utils");
|
|
11
10
|
var TelemetryCachePluggable = /** @class */ (function () {
|
|
@@ -41,7 +40,7 @@ var TelemetryCachePluggable = /** @class */ (function () {
|
|
|
41
40
|
return this.wrapper.getKeysByPrefix(this.keys.latencyPrefix).then(function (latencyKeys) {
|
|
42
41
|
return latencyKeys.length ?
|
|
43
42
|
_this.wrapper.getMany(latencyKeys).then(function (latencies) {
|
|
44
|
-
var result = new
|
|
43
|
+
var result = new Map();
|
|
45
44
|
for (var i = 0; i < latencyKeys.length; i++) {
|
|
46
45
|
var field = latencyKeys[i].split('::')[1];
|
|
47
46
|
var parsedField = (0, utils_1.parseLatencyField)(field);
|
|
@@ -68,7 +67,7 @@ var TelemetryCachePluggable = /** @class */ (function () {
|
|
|
68
67
|
return Promise.all(latencyKeys.map(function (latencyKey) { return _this.wrapper.del(latencyKey); })).then(function () { return result; });
|
|
69
68
|
}) :
|
|
70
69
|
// If latencyKeys is empty, return an empty map.
|
|
71
|
-
new
|
|
70
|
+
new Map();
|
|
72
71
|
});
|
|
73
72
|
};
|
|
74
73
|
/**
|
|
@@ -80,7 +79,7 @@ var TelemetryCachePluggable = /** @class */ (function () {
|
|
|
80
79
|
return this.wrapper.getKeysByPrefix(this.keys.exceptionPrefix).then(function (exceptionKeys) {
|
|
81
80
|
return exceptionKeys.length ?
|
|
82
81
|
_this.wrapper.getMany(exceptionKeys).then(function (exceptions) {
|
|
83
|
-
var result = new
|
|
82
|
+
var result = new Map();
|
|
84
83
|
for (var i = 0; i < exceptionKeys.length; i++) {
|
|
85
84
|
var field = exceptionKeys[i].split('::')[1];
|
|
86
85
|
var parsedField = (0, utils_1.parseExceptionField)(field);
|
|
@@ -102,7 +101,7 @@ var TelemetryCachePluggable = /** @class */ (function () {
|
|
|
102
101
|
return Promise.all(exceptionKeys.map(function (exceptionKey) { return _this.wrapper.del(exceptionKey); })).then(function () { return result; });
|
|
103
102
|
}) :
|
|
104
103
|
// If exceptionKeys is empty, return an empty map.
|
|
105
|
-
new
|
|
104
|
+
new Map();
|
|
106
105
|
});
|
|
107
106
|
};
|
|
108
107
|
/**
|
|
@@ -114,7 +113,7 @@ var TelemetryCachePluggable = /** @class */ (function () {
|
|
|
114
113
|
return this.wrapper.getKeysByPrefix(this.keys.initPrefix).then(function (configKeys) {
|
|
115
114
|
return configKeys.length ?
|
|
116
115
|
_this.wrapper.getMany(configKeys).then(function (configs) {
|
|
117
|
-
var result = new
|
|
116
|
+
var result = new Map();
|
|
118
117
|
for (var i = 0; i < configKeys.length; i++) {
|
|
119
118
|
var field = configKeys[i].split('::')[1];
|
|
120
119
|
var parsedField = (0, utils_1.parseMetadata)(field);
|
|
@@ -134,7 +133,7 @@ var TelemetryCachePluggable = /** @class */ (function () {
|
|
|
134
133
|
return Promise.all(configKeys.map(function (configKey) { return _this.wrapper.del(configKey); })).then(function () { return result; });
|
|
135
134
|
}) :
|
|
136
135
|
// If configKeys is empty, return an empty map.
|
|
137
|
-
new
|
|
136
|
+
new Map();
|
|
138
137
|
});
|
|
139
138
|
};
|
|
140
139
|
return TelemetryCachePluggable;
|
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.UniqueKeysCachePluggable = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var UniqueKeysCacheInMemory_1 = require("../inMemory/UniqueKeysCacheInMemory");
|
|
6
|
-
var sets_1 = require("../../utils/lang/sets");
|
|
7
6
|
var constants_1 = require("../inRedis/constants");
|
|
8
7
|
var constants_2 = require("./constants");
|
|
9
8
|
var UniqueKeysCachePluggable = /** @class */ (function (_super) {
|
|
@@ -25,7 +24,7 @@ var UniqueKeysCachePluggable = /** @class */ (function (_super) {
|
|
|
25
24
|
if (!featureNames.length)
|
|
26
25
|
return Promise.resolve(false);
|
|
27
26
|
var uniqueKeysArray = featureNames.map(function (featureName) {
|
|
28
|
-
var featureKeys =
|
|
27
|
+
var featureKeys = Array.from(_this.uniqueKeysTracker[featureName]);
|
|
29
28
|
var uniqueKeysPayload = {
|
|
30
29
|
f: featureName,
|
|
31
30
|
ks: featureKeys
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.inMemoryWrapperFactory = void 0;
|
|
4
4
|
var lang_1 = require("../../utils/lang");
|
|
5
|
-
var sets_1 = require("../../utils/lang/sets");
|
|
6
5
|
/**
|
|
7
6
|
* Creates a IPluggableStorageWrapper implementation that stores items in memory.
|
|
8
7
|
* The `_cache` property is the object were items are stored.
|
|
@@ -90,15 +89,15 @@ function inMemoryWrapperFactory(connDelay) {
|
|
|
90
89
|
var set = _cache[key];
|
|
91
90
|
if (!set)
|
|
92
91
|
return Promise.resolve(false);
|
|
93
|
-
if (set instanceof
|
|
92
|
+
if (set instanceof Set)
|
|
94
93
|
return Promise.resolve(set.has(item));
|
|
95
94
|
return Promise.reject('key is not a set');
|
|
96
95
|
},
|
|
97
96
|
addItems: function (key, items) {
|
|
98
97
|
if (!(key in _cache))
|
|
99
|
-
_cache[key] = new
|
|
98
|
+
_cache[key] = new Set();
|
|
100
99
|
var set = _cache[key];
|
|
101
|
-
if (set instanceof
|
|
100
|
+
if (set instanceof Set) {
|
|
102
101
|
items.forEach(function (item) { return set.add(item); });
|
|
103
102
|
return Promise.resolve();
|
|
104
103
|
}
|
|
@@ -106,9 +105,9 @@ function inMemoryWrapperFactory(connDelay) {
|
|
|
106
105
|
},
|
|
107
106
|
removeItems: function (key, items) {
|
|
108
107
|
if (!(key in _cache))
|
|
109
|
-
_cache[key] = new
|
|
108
|
+
_cache[key] = new Set();
|
|
110
109
|
var set = _cache[key];
|
|
111
|
-
if (set instanceof
|
|
110
|
+
if (set instanceof Set) {
|
|
112
111
|
items.forEach(function (item) { return set.delete(item); });
|
|
113
112
|
return Promise.resolve();
|
|
114
113
|
}
|
|
@@ -118,8 +117,8 @@ function inMemoryWrapperFactory(connDelay) {
|
|
|
118
117
|
var set = _cache[key];
|
|
119
118
|
if (!set)
|
|
120
119
|
return Promise.resolve([]);
|
|
121
|
-
if (set instanceof
|
|
122
|
-
return Promise.resolve(
|
|
120
|
+
if (set instanceof Set)
|
|
121
|
+
return Promise.resolve(Array.from(set));
|
|
123
122
|
return Promise.reject('key is not a set');
|
|
124
123
|
},
|
|
125
124
|
// always connects and disconnects
|
|
@@ -46,8 +46,13 @@ function fromObjectUpdaterFactory(splitsParser, storage, readiness, settings) {
|
|
|
46
46
|
readiness.splits.emit(constants_2.SDK_SPLITS_ARRIVED);
|
|
47
47
|
if (startingUp) {
|
|
48
48
|
startingUp = false;
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
Promise.resolve(splitsCache.checkCache()).then(function (cacheReady) {
|
|
50
|
+
// Emits SDK_READY_FROM_CACHE
|
|
51
|
+
if (cacheReady)
|
|
52
|
+
readiness.splits.emit(constants_2.SDK_SPLITS_CACHE_LOADED);
|
|
53
|
+
// Emits SDK_READY
|
|
54
|
+
readiness.segments.emit(constants_2.SDK_SEGMENTS_ARRIVED);
|
|
55
|
+
});
|
|
51
56
|
}
|
|
52
57
|
return true;
|
|
53
58
|
});
|
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.pollingManagerSSFactory = void 0;
|
|
4
4
|
var splitsSyncTask_1 = require("./syncTasks/splitsSyncTask");
|
|
5
5
|
var segmentsSyncTask_1 = require("./syncTasks/segmentsSyncTask");
|
|
6
|
-
var thenable_1 = require("../../utils/promise/thenable");
|
|
7
6
|
var constants_1 = require("../../logger/constants");
|
|
8
7
|
/**
|
|
9
8
|
* Expose start / stop mechanism for pulling data from services.
|
|
@@ -22,9 +21,10 @@ function pollingManagerSSFactory(params) {
|
|
|
22
21
|
log.debug(constants_1.LOG_PREFIX_SYNC_POLLING + ("Splits will be refreshed each " + settings.scheduler.featuresRefreshRate + " millis"));
|
|
23
22
|
log.debug(constants_1.LOG_PREFIX_SYNC_POLLING + ("Segments will be refreshed each " + settings.scheduler.segmentsRefreshRate + " millis"));
|
|
24
23
|
var startingUp = splitsSyncTask.start();
|
|
25
|
-
if (
|
|
24
|
+
if (startingUp) {
|
|
26
25
|
startingUp.then(function () {
|
|
27
|
-
|
|
26
|
+
if (splitsSyncTask.isRunning())
|
|
27
|
+
segmentsSyncTask.start();
|
|
28
28
|
});
|
|
29
29
|
}
|
|
30
30
|
},
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.splitChangesUpdaterFactory = exports.computeSplitsMutation = exports.parseSegments = void 0;
|
|
4
|
-
var sets_1 = require("../../../utils/lang/sets");
|
|
5
4
|
var timeout_1 = require("../../../utils/promise/timeout");
|
|
6
5
|
var constants_1 = require("../../../readiness/constants");
|
|
7
6
|
var constants_2 = require("../../../logger/constants");
|
|
@@ -23,7 +22,7 @@ function checkAllSegmentsExist(segments) {
|
|
|
23
22
|
*/
|
|
24
23
|
function parseSegments(_a) {
|
|
25
24
|
var conditions = _a.conditions;
|
|
26
|
-
var segments = new
|
|
25
|
+
var segments = new Set();
|
|
27
26
|
for (var i = 0; i < conditions.length; i++) {
|
|
28
27
|
var matchers = conditions[i].matcherGroup.matchers;
|
|
29
28
|
matchers.forEach(function (matcher) {
|
|
@@ -59,7 +58,7 @@ function matchFilters(featureFlag, filters) {
|
|
|
59
58
|
* Exported for testing purposes.
|
|
60
59
|
*/
|
|
61
60
|
function computeSplitsMutation(entries, filters) {
|
|
62
|
-
var segments = new
|
|
61
|
+
var segments = new Set();
|
|
63
62
|
var computed = entries.reduce(function (accum, split) {
|
|
64
63
|
if (split.status === 'ACTIVE' && matchFilters(split, filters)) {
|
|
65
64
|
accum.added.push([split.name, split]);
|
|
@@ -72,7 +71,7 @@ function computeSplitsMutation(entries, filters) {
|
|
|
72
71
|
}
|
|
73
72
|
return accum;
|
|
74
73
|
}, { added: [], removed: [], segments: [] });
|
|
75
|
-
computed.segments =
|
|
74
|
+
computed.segments = Array.from(segments);
|
|
76
75
|
return computed;
|
|
77
76
|
}
|
|
78
77
|
exports.computeSplitsMutation = computeSplitsMutation;
|
|
@@ -126,7 +125,7 @@ function splitChangesUpdaterFactory(log, splitChangesFetcher, splits, segments,
|
|
|
126
125
|
function _splitChangesUpdater(since, retry) {
|
|
127
126
|
if (retry === void 0) { retry = 0; }
|
|
128
127
|
log.debug(constants_2.SYNC_SPLITS_FETCH, [since]);
|
|
129
|
-
|
|
128
|
+
var fetcherPromise = Promise.resolve(splitUpdateNotification ?
|
|
130
129
|
{ splits: [splitUpdateNotification.payload], till: splitUpdateNotification.changeNumber } :
|
|
131
130
|
splitChangesFetcher(since, noCache, till, _promiseDecorator))
|
|
132
131
|
.then(function (splitChanges) {
|
|
@@ -170,6 +169,15 @@ function splitChangesUpdaterFactory(log, splitChangesFetcher, splits, segments,
|
|
|
170
169
|
}
|
|
171
170
|
return false;
|
|
172
171
|
});
|
|
172
|
+
// After triggering the requests, if we have cached splits information let's notify that to emit SDK_READY_FROM_CACHE.
|
|
173
|
+
// Wrapping in a promise since checkCache can be async.
|
|
174
|
+
if (splitsEventEmitter && startingUp) {
|
|
175
|
+
Promise.resolve(splits.checkCache()).then(function (isCacheReady) {
|
|
176
|
+
if (isCacheReady)
|
|
177
|
+
splitsEventEmitter.emit(constants_1.SDK_SPLITS_CACHE_LOADED);
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
return fetcherPromise;
|
|
173
181
|
}
|
|
174
182
|
var sincePromise = Promise.resolve(splits.getChangeNumber()); // `getChangeNumber` never rejects or throws error
|
|
175
183
|
return sincePromise.then(_splitChangesUpdater);
|
|
@@ -11,7 +11,6 @@ function Uint8ArrayToString(myUint8Arr) {
|
|
|
11
11
|
}
|
|
12
12
|
function StringToUint8Array(myString) {
|
|
13
13
|
var charCodes = myString.split('').map(function (e) { return e.charCodeAt(0); });
|
|
14
|
-
// eslint-disable-next-line compat/compat
|
|
15
14
|
return new Uint8Array(charCodes);
|
|
16
15
|
}
|
|
17
16
|
/**
|
|
@@ -15,7 +15,6 @@ var constants_1 = require("./constants");
|
|
|
15
15
|
var constants_2 = require("../../logger/constants");
|
|
16
16
|
var types_1 = require("./SSEHandler/types");
|
|
17
17
|
var parseUtils_1 = require("./parseUtils");
|
|
18
|
-
var sets_1 = require("../../utils/lang/sets");
|
|
19
18
|
var murmur3_64_1 = require("../../utils/murmur3/murmur3_64");
|
|
20
19
|
var constants_3 = require("../../utils/constants");
|
|
21
20
|
/**
|
|
@@ -221,8 +220,8 @@ function pushManagerFactory(params, pollingManager) {
|
|
|
221
220
|
var keyList = void 0, added_1, removed_1;
|
|
222
221
|
try {
|
|
223
222
|
keyList = (0, parseUtils_1.parseKeyList)(parsedData.d, parsedData.c);
|
|
224
|
-
added_1 = new
|
|
225
|
-
removed_1 = new
|
|
223
|
+
added_1 = new Set(keyList.a);
|
|
224
|
+
removed_1 = new Set(keyList.r);
|
|
226
225
|
}
|
|
227
226
|
catch (e) {
|
|
228
227
|
log.warn(constants_2.STREAMING_PARSING_MEMBERSHIPS_UPDATE, ['KeyList', e]);
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.LRUCache = void 0;
|
|
4
|
-
var maps_1 = require("../lang/maps");
|
|
5
4
|
var LinkedList_1 = require("./LinkedList");
|
|
6
5
|
var LRUCache = /** @class */ (function () {
|
|
7
6
|
function LRUCache(maxSize) {
|
|
8
7
|
this.maxLen = maxSize || 1;
|
|
9
|
-
this.items = new
|
|
8
|
+
this.items = new Map();
|
|
10
9
|
this.lru = new LinkedList_1.LinkedList();
|
|
11
10
|
}
|
|
12
11
|
LRUCache.prototype.get = function (key) {
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DEFAULT_CACHE_EXPIRATION_IN_MILLIS =
|
|
4
|
-
// Integration types
|
|
5
|
-
exports.GOOGLE_ANALYTICS_TO_SPLIT = 'GOOGLE_ANALYTICS_TO_SPLIT';
|
|
6
|
-
exports.SPLIT_TO_GOOGLE_ANALYTICS = 'SPLIT_TO_GOOGLE_ANALYTICS';
|
|
3
|
+
exports.DEFAULT_CACHE_EXPIRATION_IN_MILLIS = void 0;
|
|
7
4
|
// This value might be eventually set via a config parameter
|
|
8
5
|
exports.DEFAULT_CACHE_EXPIRATION_IN_MILLIS = 864000000; // 10 days
|
package/cjs/utils/lang/index.js
CHANGED
|
@@ -121,11 +121,9 @@ exports.isBoolean = isBoolean;
|
|
|
121
121
|
function isFiniteNumber(val) {
|
|
122
122
|
if (val instanceof Number)
|
|
123
123
|
val = val.valueOf();
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
return Number.isFinite ? Number.isFinite(val) : isFinite(val);
|
|
128
|
-
return false;
|
|
124
|
+
return typeof val === 'number' ?
|
|
125
|
+
Number.isFinite ? Number.isFinite(val) : isFinite(val) :
|
|
126
|
+
false;
|
|
129
127
|
}
|
|
130
128
|
exports.isFiniteNumber = isFiniteNumber;
|
|
131
129
|
/**
|
|
@@ -135,10 +133,9 @@ exports.isFiniteNumber = isFiniteNumber;
|
|
|
135
133
|
function isIntegerNumber(val) {
|
|
136
134
|
if (val instanceof Number)
|
|
137
135
|
val = val.valueOf();
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
return false;
|
|
136
|
+
return typeof val === 'number' ?
|
|
137
|
+
Number.isInteger ? Number.isInteger(val) : isFinite(val) && Math.floor(val) === val :
|
|
138
|
+
false;
|
|
142
139
|
}
|
|
143
140
|
exports.isIntegerNumber = isIntegerNumber;
|
|
144
141
|
/**
|
|
@@ -1,85 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
the ESM build of the SDK with tools that doesn't support CommonJS by default (e.g. Rollup).
|
|
6
|
-
|
|
7
|
-
object-assign
|
|
8
|
-
(c) Sindre Sorhus
|
|
9
|
-
@license MIT
|
|
10
|
-
*/
|
|
2
|
+
/**
|
|
3
|
+
* A tiny polyfill for Object.assign
|
|
4
|
+
*/
|
|
11
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
6
|
exports.objectAssign = void 0;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
|
|
16
|
-
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
17
|
-
var propIsEnumerable = Object.prototype.propertyIsEnumerable;
|
|
18
|
-
function toObject(val) {
|
|
19
|
-
if (val === null || val === undefined) {
|
|
7
|
+
exports.objectAssign = Object.assign || function (target) {
|
|
8
|
+
if (target === null || target === undefined)
|
|
20
9
|
throw new TypeError('Object.assign cannot be called with null or undefined');
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return false;
|
|
28
|
-
}
|
|
29
|
-
// Detect buggy property enumeration order in older V8 versions.
|
|
30
|
-
// https://bugs.chromium.org/p/v8/issues/detail?id=4118
|
|
31
|
-
var test1 = new String('abc');
|
|
32
|
-
test1[5] = 'de';
|
|
33
|
-
if (Object.getOwnPropertyNames(test1)[0] === '5') {
|
|
34
|
-
return false;
|
|
35
|
-
}
|
|
36
|
-
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
|
|
37
|
-
var test2 = {};
|
|
38
|
-
for (var i = 0; i < 10; i++) {
|
|
39
|
-
test2['_' + String.fromCharCode(i)] = i;
|
|
40
|
-
}
|
|
41
|
-
var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
|
|
42
|
-
return test2[n];
|
|
43
|
-
});
|
|
44
|
-
if (order2.join('') !== '0123456789') {
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
|
|
48
|
-
var test3 = {};
|
|
49
|
-
'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
|
|
50
|
-
test3[letter] = letter;
|
|
51
|
-
});
|
|
52
|
-
if (Object.keys(Object.assign({}, test3)).join('') !==
|
|
53
|
-
'abcdefghijklmnopqrst') {
|
|
54
|
-
return false;
|
|
55
|
-
}
|
|
56
|
-
return true;
|
|
57
|
-
}
|
|
58
|
-
catch (err) {
|
|
59
|
-
// We don't expect any of the above to throw, but better to be safe.
|
|
60
|
-
return false;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
exports.objectAssign = shouldUseNative() ? Object.assign : function (target, source) {
|
|
64
|
-
var from;
|
|
65
|
-
var to = toObject(target);
|
|
66
|
-
var symbols;
|
|
67
|
-
for (var s = 1; s < arguments.length; s++) {
|
|
68
|
-
from = Object(arguments[s]);
|
|
69
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
70
|
-
for (var key in from) {
|
|
71
|
-
if (hasOwnProperty.call(from, key)) {
|
|
72
|
-
to[key] = from[key];
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
if (getOwnPropertySymbols) {
|
|
76
|
-
symbols = getOwnPropertySymbols(from);
|
|
77
|
-
for (var i = 0; i < symbols.length; i++) {
|
|
78
|
-
if (propIsEnumerable.call(from, symbols[i])) {
|
|
79
|
-
to[symbols[i]] = from[symbols[i]];
|
|
80
|
-
}
|
|
10
|
+
target = Object(target);
|
|
11
|
+
for (var i = 1; i < arguments.length; i++) {
|
|
12
|
+
var source = Object(arguments[i]); // eslint-disable-next-line no-restricted-syntax
|
|
13
|
+
for (var key in source) {
|
|
14
|
+
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
15
|
+
target[key] = source[key];
|
|
81
16
|
}
|
|
82
17
|
}
|
|
83
18
|
}
|
|
84
|
-
return
|
|
19
|
+
return target;
|
|
85
20
|
};
|