@splitsoftware/splitio 10.17.3-rc.2 → 10.17.3
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 +4 -0
- package/es/client/attributesDecoration.js +116 -0
- package/es/client/browser.js +39 -0
- package/es/client/client.js +155 -0
- package/es/client/inputValidation.js +117 -0
- package/es/client/node.js +6 -0
- package/es/{factory → client}/package.json +0 -0
- package/es/engine/combiners/and.js +54 -0
- package/es/engine/combiners/ifelseif.js +73 -0
- package/es/engine/condition/index.js +62 -0
- package/es/engine/convertions/index.js +29 -0
- package/es/engine/engine/index.js +60 -0
- package/es/engine/engine/legacy.js +77 -0
- package/es/engine/engine/murmur3/common.js +40 -0
- package/es/engine/engine/murmur3/murmur3.js +83 -0
- package/es/engine/engine/murmur3/murmur3_128.js +250 -0
- package/es/engine/engine/murmur3/murmur3_128_x86.js +183 -0
- package/es/engine/engine/murmur3/murmur3_64.js +52 -0
- package/es/engine/engine/murmur3/utfx.js +112 -0
- package/es/engine/evaluator/index.js +111 -0
- package/es/engine/index.js +112 -0
- package/es/engine/matchers/all.js +32 -0
- package/es/engine/matchers/between.js +35 -0
- package/es/engine/matchers/boolean.js +35 -0
- package/es/engine/matchers/cont_all.js +51 -0
- package/es/engine/matchers/cont_any.js +47 -0
- package/es/engine/matchers/cont_str.js +38 -0
- package/es/engine/matchers/dependency.js +50 -0
- package/es/engine/matchers/eq.js +35 -0
- package/es/engine/matchers/eq_set.js +49 -0
- package/es/engine/matchers/ew.js +38 -0
- package/es/engine/matchers/gte.js +35 -0
- package/es/engine/matchers/index.js +65 -0
- package/es/engine/matchers/lte.js +35 -0
- package/es/engine/matchers/part_of.js +49 -0
- package/es/engine/matchers/segment.js +39 -0
- package/es/engine/matchers/string.js +44 -0
- package/es/engine/matchers/sw.js +38 -0
- package/es/engine/matchers/types.js +48 -0
- package/es/engine/matchers/whitelist.js +36 -0
- package/es/engine/parser/index.js +69 -0
- package/es/engine/parser/segments.js +22 -0
- package/es/engine/transforms/matcherGroup.js +43 -0
- package/es/engine/transforms/matchers.js +109 -0
- package/es/engine/transforms/segment.js +28 -0
- package/es/engine/transforms/set.js +20 -0
- package/es/engine/transforms/unaryNumeric.js +20 -0
- package/es/engine/transforms/whitelist.js +22 -0
- package/es/engine/treatments/index.js +67 -0
- package/es/engine/value/index.js +54 -0
- package/es/engine/value/sanitize.js +125 -0
- package/es/events/index.js +65 -0
- package/es/factory/offline.js +50 -0
- package/es/factory/online.js +113 -0
- package/es/impressions/counter.js +52 -0
- package/es/impressions/hasher/buildKey.js +3 -0
- package/es/impressions/hasher/hashImpression128.js +5 -0
- package/es/impressions/hasher/hashImpression32.js +5 -0
- package/es/impressions/observer/browser.js +9 -0
- package/es/impressions/observer/node.js +9 -0
- package/es/impressions/observer/observer.js +21 -0
- package/es/{platform/getEventSource → impressions/observer}/package.json +0 -0
- package/es/index.js +132 -1
- package/es/integrations/browser.js +62 -0
- package/es/integrations/ga/GaToSplit.js +246 -0
- package/es/integrations/ga/SplitToGa.js +127 -0
- package/es/integrations/node.js +3 -0
- package/es/{platform/getFetch → integrations}/package.json +0 -0
- package/es/listeners/browser.js +157 -0
- package/es/listeners/node.js +65 -0
- package/es/{platform → listeners}/package.json +0 -0
- package/es/manager/index.js +104 -0
- package/es/metrics/Collectors.js +100 -0
- package/es/metrics/index.js +157 -0
- package/es/producer/browser/Partial.js +103 -0
- package/es/producer/browser.js +70 -0
- package/es/producer/fetcher/MySegments.js +47 -0
- package/es/producer/fetcher/SegmentChanges.js +52 -0
- package/es/producer/fetcher/SplitChanges.js +46 -0
- package/es/producer/node.js +130 -0
- package/es/producer/offline/browser.js +26 -0
- package/es/producer/offline/node.js +26 -0
- package/es/{settings → producer/offline}/package.json +0 -0
- package/{lib/factory → es/producer}/package.json +0 -0
- package/es/producer/task.js +50 -0
- package/es/producer/updater/MySegments.js +108 -0
- package/es/producer/updater/SegmentChanges.js +135 -0
- package/es/producer/updater/SplitChanges.js +131 -0
- package/es/producer/updater/SplitChangesFromFeatures.js +21 -0
- package/es/producer/updater/SplitChangesFromFileSystem.js +21 -0
- package/es/producer/updater/SplitChangesFromObject.js +73 -0
- package/es/readiness/index.js +123 -0
- package/es/readiness/statusManager.js +114 -0
- package/es/services/auth/auth.js +25 -0
- package/es/services/auth/index.js +2 -0
- package/es/services/events/bulk.js +22 -0
- package/es/services/events/index.js +17 -0
- package/{src/platform → es/services}/getEventSource/browser.js +2 -2
- package/es/{platform → services}/getEventSource/node.js +1 -1
- package/{lib/platform → es/services}/getEventSource/package.json +0 -0
- package/es/{platform → services}/getFetch/browser.js +1 -1
- package/es/{platform → services}/getFetch/node.js +1 -1
- package/{lib/platform → es/services}/getFetch/package.json +0 -0
- package/es/services/impressions/bulk.js +26 -0
- package/es/services/impressions/count.js +7 -0
- package/es/services/impressions/dto.js +73 -0
- package/es/services/impressions/index.js +17 -0
- package/es/services/impressions/post.js +22 -0
- package/es/services/metrics/counters.js +24 -0
- package/es/services/metrics/dto.js +38 -0
- package/es/services/metrics/index.js +17 -0
- package/es/services/metrics/times.js +24 -0
- package/es/services/mySegments/get.js +26 -0
- package/es/services/mySegments/index.js +17 -0
- package/es/services/request/index.js +43 -0
- package/es/services/request/options/browser.js +18 -0
- package/es/{platform → services}/request/options/node.js +2 -2
- package/{lib/platform → es/services/request/options}/package.json +0 -0
- package/es/services/segmentChanges/get.js +21 -0
- package/es/services/segmentChanges/index.js +17 -0
- package/es/services/splitChanges/get.js +19 -0
- package/es/services/splitChanges/index.js +17 -0
- package/es/services/splitChanges/offline/browser.js +63 -0
- package/es/services/splitChanges/offline/node.js +176 -0
- package/{lib/settings → es/services/splitChanges/offline}/package.json +0 -0
- package/es/services/splitChanges/offline/parseCondition.js +43 -0
- package/es/services/transport/index.js +51 -0
- package/es/storage/AttributesCache/InMemory.js +85 -0
- package/es/storage/BaseMetricsAsyncCache.js +23 -0
- package/es/storage/CountCache/InMemory.js +48 -0
- package/es/storage/CountCache/InRedis.js +42 -0
- package/es/storage/EventsCache/InMemory.js +109 -0
- package/es/storage/EventsCache/InRedis.js +65 -0
- package/es/storage/ImpressionsCache/InMemory.js +71 -0
- package/es/storage/ImpressionsCache/InRedis.js +73 -0
- package/es/storage/Keys.js +125 -0
- package/es/storage/KeysLocalStorage.js +58 -0
- package/es/storage/LatencyCache/InMemory.js +56 -0
- package/es/storage/LatencyCache/InRedis.js +44 -0
- package/es/storage/LatencyCache/findIndex.js +2 -0
- package/es/storage/Meta.js +7 -0
- package/es/storage/RedisAdapter.js +198 -0
- package/es/storage/SegmentCache/InLocalStorage/index.js +162 -0
- package/es/storage/SegmentCache/InMemory/browser.js +107 -0
- package/es/storage/SegmentCache/InMemory/node.js +82 -0
- package/{src/factory → es/storage/SegmentCache/InMemory}/package.json +0 -0
- package/es/storage/SegmentCache/InRedis/index.js +81 -0
- package/es/storage/SplitCache/InLocalStorage.js +332 -0
- package/es/storage/SplitCache/InMemory.js +162 -0
- package/es/storage/SplitCache/InRedis.js +214 -0
- package/es/storage/SplitCache/killLocally.js +35 -0
- package/es/storage/browser.js +101 -0
- package/es/storage/node.js +81 -0
- package/{src/platform/getEventSource → es/storage}/package.json +0 -0
- package/es/sync/AuthClient/index.js +34 -0
- package/es/sync/PushManager/index.js +315 -0
- package/es/sync/PushManager/mySegmentsV2utils.js +76 -0
- package/es/sync/PushManager/pushRequirements/browser.js +23 -0
- package/es/sync/PushManager/pushRequirements/node.js +18 -0
- package/{src/platform/getFetch → es/sync/PushManager/pushRequirements}/package.json +0 -0
- package/es/sync/SSEClient/index.js +93 -0
- package/es/sync/SSEHandler/NotificationKeeper.js +97 -0
- package/es/sync/SSEHandler/NotificationParser.js +31 -0
- package/es/sync/SSEHandler/index.js +110 -0
- package/es/sync/SegmentUpdateWorker/browser.js +74 -0
- package/es/sync/SegmentUpdateWorker/node.js +79 -0
- package/{src/platform → es/sync/SegmentUpdateWorker}/package.json +0 -0
- package/es/sync/SplitUpdateWorker/index.js +86 -0
- package/es/sync/browser.js +125 -0
- package/es/sync/constants.js +42 -0
- package/es/sync/node.js +60 -0
- package/{src/settings → es/sync}/package.json +0 -0
- package/es/trackers/event.js +53 -0
- package/es/trackers/impressions.js +132 -0
- package/es/umd.js +1 -2
- package/es/utils/backoff/index.js +51 -0
- package/es/utils/base64/browser.js +19 -0
- package/es/utils/base64/node.js +19 -0
- package/es/utils/base64/package.json +4 -0
- package/es/utils/binarySearch/index.js +50 -0
- package/es/utils/constants/index.js +38 -0
- package/es/utils/context/constants.js +30 -0
- package/es/utils/context/index.js +101 -0
- package/es/utils/decompress/index.js +476 -0
- package/es/utils/fn/repeat.js +58 -0
- package/es/utils/inputValidation/apiKey.js +39 -0
- package/es/utils/inputValidation/attribute.js +22 -0
- package/es/utils/inputValidation/attributes.js +19 -0
- package/es/utils/inputValidation/event.js +23 -0
- package/es/utils/inputValidation/eventProperties.js +69 -0
- package/es/utils/inputValidation/eventValue.js +9 -0
- package/es/utils/inputValidation/index.js +11 -0
- package/es/utils/inputValidation/isOperational.js +14 -0
- package/es/utils/inputValidation/key.js +50 -0
- package/es/utils/inputValidation/split.js +47 -0
- package/es/utils/inputValidation/splitFilters.js +121 -0
- package/es/utils/inputValidation/splits.js +27 -0
- package/es/utils/inputValidation/trafficType.js +55 -0
- package/es/utils/jwt/hashUserKey.js +11 -0
- package/es/utils/jwt/index.js +14 -0
- package/es/utils/key/factory.js +38 -0
- package/es/utils/key/parser.js +34 -0
- package/es/utils/labels/index.js +7 -0
- package/es/utils/lang/Errors.js +41 -0
- package/es/utils/lang/Sets.js +114 -0
- package/es/utils/lang/index.js +305 -0
- package/es/utils/localstorage/isAvailable.js +26 -0
- package/es/utils/logger/LoggerFactory.js +86 -0
- package/es/utils/logger/index.js +97 -0
- package/es/utils/lrucache/linkedlist.js +122 -0
- package/es/utils/lrucache/lru.spec.js +24 -0
- package/es/utils/lrucache/lrucache.js +80 -0
- package/es/utils/now/browser.js +27 -0
- package/es/utils/now/node.js +19 -0
- package/es/utils/now/package.json +4 -0
- package/es/utils/promise/thenable.js +3 -0
- package/es/utils/promise/timeout.js +34 -0
- package/es/utils/promise/wrapper.js +58 -0
- package/es/{settings → utils/settings}/defaults/browser.js +2 -5
- package/es/{settings → utils/settings}/defaults/node.js +2 -5
- package/es/utils/settings/defaults/package.json +4 -0
- package/es/utils/settings/impressionsMode.js +16 -0
- package/es/utils/settings/index.js +194 -0
- package/es/utils/settings/integrations/browser.js +8 -0
- package/es/utils/settings/integrations/common.js +30 -0
- package/es/utils/settings/integrations/node.js +7 -0
- package/es/utils/settings/integrations/package.json +4 -0
- package/es/utils/settings/language/browser.js +16 -0
- package/es/utils/settings/language/node.js +16 -0
- package/es/utils/settings/language/package.json +4 -0
- package/es/utils/settings/mode.js +10 -0
- package/es/utils/settings/runtime/browser.js +21 -0
- package/es/{settings → utils/settings}/runtime/node.js +4 -6
- package/es/utils/settings/runtime/package.json +4 -0
- package/es/{settings → utils/settings}/storage/browser.js +17 -16
- package/es/{settings → utils/settings}/storage/node.js +16 -25
- package/es/utils/settings/storage/package.json +4 -0
- package/es/utils/splits/usesSegments.js +21 -0
- package/es/utils/time/index.js +8 -0
- package/es/utils/timeTracker/index.js +216 -0
- package/es/utils/timeTracker/timer.js +25 -0
- package/lib/client/attributesDecoration.js +128 -0
- package/lib/client/browser.js +50 -0
- package/lib/client/client.js +174 -0
- package/lib/client/inputValidation.js +129 -0
- package/lib/client/node.js +14 -0
- package/lib/client/package.json +4 -0
- package/lib/engine/combiners/and.js +65 -0
- package/lib/engine/combiners/ifelseif.js +88 -0
- package/lib/engine/condition/index.js +76 -0
- package/lib/engine/convertions/index.js +36 -0
- package/lib/engine/engine/index.js +71 -0
- package/lib/engine/engine/legacy.js +83 -0
- package/lib/engine/engine/murmur3/common.js +52 -0
- package/lib/engine/engine/murmur3/murmur3.js +90 -0
- package/lib/engine/engine/murmur3/murmur3_128.js +256 -0
- package/lib/engine/engine/murmur3/murmur3_128_x86.js +189 -0
- package/lib/engine/engine/murmur3/murmur3_64.js +57 -0
- package/lib/engine/engine/murmur3/utfx.js +121 -0
- package/lib/engine/evaluator/index.js +129 -0
- package/lib/engine/index.js +128 -0
- package/lib/engine/matchers/all.js +41 -0
- package/lib/engine/matchers/between.js +44 -0
- package/lib/engine/matchers/boolean.js +44 -0
- package/lib/engine/matchers/cont_all.js +61 -0
- package/lib/engine/matchers/cont_any.js +57 -0
- package/lib/engine/matchers/cont_str.js +48 -0
- package/lib/engine/matchers/dependency.js +60 -0
- package/lib/engine/matchers/eq.js +44 -0
- package/lib/engine/matchers/eq_set.js +59 -0
- package/lib/engine/matchers/ew.js +48 -0
- package/lib/engine/matchers/gte.js +44 -0
- package/lib/engine/matchers/index.js +90 -0
- package/lib/engine/matchers/lte.js +44 -0
- package/lib/engine/matchers/part_of.js +59 -0
- package/lib/engine/matchers/segment.js +49 -0
- package/lib/engine/matchers/string.js +53 -0
- package/lib/engine/matchers/sw.js +48 -0
- package/lib/engine/matchers/types.js +57 -0
- package/lib/engine/matchers/whitelist.js +46 -0
- package/lib/engine/parser/index.js +84 -0
- package/lib/engine/parser/segments.js +28 -0
- package/lib/engine/transforms/matcherGroup.js +54 -0
- package/lib/engine/transforms/matchers.js +124 -0
- package/lib/engine/transforms/segment.js +34 -0
- package/lib/engine/transforms/set.js +26 -0
- package/lib/engine/transforms/unaryNumeric.js +26 -0
- package/lib/engine/transforms/whitelist.js +28 -0
- package/lib/engine/treatments/index.js +73 -0
- package/lib/engine/value/index.js +64 -0
- package/lib/engine/value/sanitize.js +137 -0
- package/lib/events/index.js +80 -0
- package/lib/factory/offline.js +62 -0
- package/lib/factory/online.js +129 -0
- package/lib/impressions/counter.js +61 -0
- package/lib/impressions/hasher/buildKey.js +8 -0
- package/lib/impressions/hasher/hashImpression128.js +12 -0
- package/lib/impressions/hasher/hashImpression32.js +14 -0
- package/lib/impressions/observer/browser.js +19 -0
- package/lib/impressions/observer/node.js +19 -0
- package/lib/impressions/observer/observer.js +29 -0
- package/lib/impressions/observer/package.json +4 -0
- package/lib/index.js +151 -3
- package/lib/integrations/browser.js +72 -0
- package/lib/integrations/ga/GaToSplit.js +267 -0
- package/lib/integrations/ga/SplitToGa.js +138 -0
- package/lib/integrations/node.js +9 -0
- package/lib/integrations/package.json +4 -0
- package/lib/listeners/browser.js +173 -0
- package/lib/listeners/node.js +74 -0
- package/lib/listeners/package.json +4 -0
- package/lib/manager/index.js +115 -0
- package/lib/metrics/Collectors.js +118 -0
- package/lib/metrics/index.js +182 -0
- package/lib/producer/browser/Partial.js +114 -0
- package/lib/producer/browser.js +82 -0
- package/lib/producer/fetcher/MySegments.js +59 -0
- package/lib/producer/fetcher/SegmentChanges.js +62 -0
- package/lib/producer/fetcher/SplitChanges.js +58 -0
- package/lib/producer/node.js +142 -0
- package/lib/producer/offline/browser.js +35 -0
- package/lib/producer/offline/node.js +35 -0
- package/lib/producer/offline/package.json +4 -0
- package/lib/producer/package.json +4 -0
- package/lib/producer/task.js +61 -0
- package/lib/producer/updater/MySegments.js +119 -0
- package/lib/producer/updater/SegmentChanges.js +148 -0
- package/lib/producer/updater/SplitChanges.js +145 -0
- package/lib/producer/updater/SplitChangesFromFeatures.js +30 -0
- package/lib/producer/updater/SplitChangesFromFileSystem.js +30 -0
- package/lib/producer/updater/SplitChangesFromObject.js +84 -0
- package/lib/readiness/index.js +132 -0
- package/lib/readiness/statusManager.js +124 -0
- package/lib/services/auth/auth.js +32 -0
- package/lib/services/auth/index.js +11 -0
- package/lib/services/events/bulk.js +31 -0
- package/lib/services/events/index.js +26 -0
- package/lib/{platform → services}/getEventSource/browser.js +1 -1
- package/lib/{platform → services}/getEventSource/node.js +1 -1
- package/lib/services/getEventSource/package.json +4 -0
- package/lib/{platform → services}/getFetch/browser.js +1 -1
- package/lib/{platform → services}/getFetch/node.js +1 -1
- package/lib/services/getFetch/package.json +4 -0
- package/lib/services/impressions/bulk.js +36 -0
- package/lib/services/impressions/count.js +16 -0
- package/lib/services/impressions/dto.js +81 -0
- package/lib/services/impressions/index.js +26 -0
- package/lib/services/impressions/post.js +31 -0
- package/lib/services/metrics/counters.js +33 -0
- package/lib/services/metrics/dto.js +46 -0
- package/lib/services/metrics/index.js +26 -0
- package/lib/services/metrics/times.js +33 -0
- package/lib/services/mySegments/get.js +35 -0
- package/lib/services/mySegments/index.js +26 -0
- package/lib/services/request/index.js +53 -0
- package/lib/services/request/options/browser.js +23 -0
- package/lib/{platform → services}/request/options/node.js +2 -2
- package/lib/services/request/options/package.json +4 -0
- package/lib/services/segmentChanges/get.js +29 -0
- package/lib/services/segmentChanges/index.js +26 -0
- package/lib/services/splitChanges/get.js +27 -0
- package/lib/services/splitChanges/index.js +26 -0
- package/lib/services/splitChanges/offline/browser.js +71 -0
- package/lib/services/splitChanges/offline/node.js +189 -0
- package/lib/services/splitChanges/offline/package.json +4 -0
- package/lib/services/splitChanges/offline/parseCondition.js +49 -0
- package/lib/services/transport/index.js +62 -0
- package/lib/storage/AttributesCache/InMemory.js +93 -0
- package/lib/storage/BaseMetricsAsyncCache.js +28 -0
- package/lib/storage/CountCache/InMemory.js +54 -0
- package/lib/storage/CountCache/InRedis.js +50 -0
- package/lib/storage/EventsCache/InMemory.js +118 -0
- package/lib/storage/EventsCache/InRedis.js +74 -0
- package/lib/storage/ImpressionsCache/InMemory.js +77 -0
- package/lib/storage/ImpressionsCache/InRedis.js +79 -0
- package/lib/storage/Keys.js +132 -0
- package/lib/storage/KeysLocalStorage.js +69 -0
- package/lib/storage/LatencyCache/InMemory.js +64 -0
- package/lib/storage/LatencyCache/InRedis.js +53 -0
- package/lib/storage/LatencyCache/findIndex.js +12 -0
- package/lib/storage/Meta.js +12 -0
- package/lib/storage/RedisAdapter.js +212 -0
- package/lib/storage/SegmentCache/InLocalStorage/index.js +171 -0
- package/lib/storage/SegmentCache/InMemory/browser.js +113 -0
- package/lib/storage/SegmentCache/InMemory/node.js +89 -0
- package/lib/storage/SegmentCache/InMemory/package.json +4 -0
- package/lib/storage/SegmentCache/InRedis/index.js +87 -0
- package/lib/storage/SplitCache/InLocalStorage.js +344 -0
- package/lib/storage/SplitCache/InMemory.js +172 -0
- package/lib/storage/SplitCache/InRedis.js +224 -0
- package/lib/storage/SplitCache/killLocally.js +42 -0
- package/lib/storage/browser.js +122 -0
- package/lib/storage/node.js +104 -0
- package/lib/storage/package.json +4 -0
- package/lib/sync/AuthClient/index.js +44 -0
- package/lib/sync/PushManager/index.js +340 -0
- package/lib/sync/PushManager/mySegmentsV2utils.js +87 -0
- package/lib/sync/PushManager/pushRequirements/browser.js +30 -0
- package/lib/sync/PushManager/pushRequirements/node.js +25 -0
- package/lib/sync/PushManager/pushRequirements/package.json +4 -0
- package/lib/sync/SSEClient/index.js +101 -0
- package/lib/sync/SSEHandler/NotificationKeeper.js +104 -0
- package/lib/sync/SSEHandler/NotificationParser.js +39 -0
- package/lib/sync/SSEHandler/index.js +121 -0
- package/lib/sync/SegmentUpdateWorker/browser.js +81 -0
- package/lib/sync/SegmentUpdateWorker/node.js +86 -0
- package/lib/sync/SegmentUpdateWorker/package.json +4 -0
- package/lib/sync/SplitUpdateWorker/index.js +93 -0
- package/lib/sync/browser.js +139 -0
- package/lib/sync/constants.js +59 -0
- package/lib/sync/node.js +71 -0
- package/lib/sync/package.json +4 -0
- package/lib/trackers/event.js +64 -0
- package/lib/trackers/impressions.js +146 -0
- package/lib/umd.js +0 -1
- package/lib/utils/backoff/index.js +57 -0
- package/lib/utils/base64/browser.js +26 -0
- package/lib/utils/base64/node.js +26 -0
- package/lib/utils/base64/package.json +4 -0
- package/lib/utils/binarySearch/index.js +56 -0
- package/lib/utils/constants/index.js +60 -0
- package/lib/utils/context/constants.js +49 -0
- package/lib/utils/context/index.js +111 -0
- package/lib/utils/decompress/index.js +483 -0
- package/lib/utils/fn/repeat.js +64 -0
- package/lib/utils/inputValidation/apiKey.js +51 -0
- package/lib/utils/inputValidation/attribute.js +32 -0
- package/lib/utils/inputValidation/attributes.js +32 -0
- package/lib/utils/inputValidation/event.js +33 -0
- package/lib/utils/inputValidation/eventProperties.js +78 -0
- package/lib/utils/inputValidation/eventValue.js +19 -0
- package/lib/utils/inputValidation/index.js +48 -0
- package/lib/utils/inputValidation/isOperational.js +25 -0
- package/lib/utils/inputValidation/key.js +59 -0
- package/lib/utils/inputValidation/split.js +60 -0
- package/lib/utils/inputValidation/splitFilters.js +134 -0
- package/lib/utils/inputValidation/splits.js +38 -0
- package/lib/utils/inputValidation/trafficType.js +68 -0
- package/lib/utils/jwt/hashUserKey.js +19 -0
- package/lib/utils/jwt/index.js +19 -0
- package/lib/utils/key/factory.js +46 -0
- package/lib/utils/key/parser.js +42 -0
- package/lib/utils/labels/index.js +18 -0
- package/lib/utils/lang/Errors.js +58 -0
- package/lib/utils/lang/Sets.js +127 -0
- package/lib/utils/lang/index.js +350 -0
- package/lib/utils/localstorage/isAvailable.js +31 -0
- package/lib/utils/logger/LoggerFactory.js +98 -0
- package/lib/utils/logger/index.js +109 -0
- package/lib/utils/lrucache/linkedlist.js +132 -0
- package/lib/utils/lrucache/lru.spec.js +30 -0
- package/lib/utils/lrucache/lrucache.js +88 -0
- package/lib/utils/now/browser.js +33 -0
- package/lib/utils/now/node.js +24 -0
- package/lib/utils/now/package.json +4 -0
- package/lib/utils/promise/thenable.js +10 -0
- package/lib/utils/promise/timeout.js +40 -0
- package/lib/utils/promise/wrapper.js +63 -0
- package/{src → lib/utils}/settings/defaults/browser.js +6 -6
- package/{src → lib/utils}/settings/defaults/node.js +6 -6
- package/lib/utils/settings/defaults/package.json +4 -0
- package/lib/utils/settings/impressionsMode.js +26 -0
- package/lib/utils/settings/index.js +214 -0
- package/lib/utils/settings/integrations/browser.js +17 -0
- package/lib/utils/settings/integrations/common.js +40 -0
- package/lib/utils/settings/integrations/node.js +13 -0
- package/lib/utils/settings/integrations/package.json +4 -0
- package/lib/utils/settings/language/browser.js +22 -0
- package/lib/utils/settings/language/node.js +22 -0
- package/lib/utils/settings/language/package.json +4 -0
- package/lib/utils/settings/mode.js +16 -0
- package/lib/utils/settings/runtime/browser.js +26 -0
- package/lib/{settings → utils/settings}/runtime/node.js +5 -7
- package/lib/utils/settings/runtime/package.json +4 -0
- package/lib/{settings → utils/settings}/storage/browser.js +24 -20
- package/lib/{settings → utils/settings}/storage/node.js +17 -26
- package/lib/utils/settings/storage/package.json +4 -0
- package/lib/utils/splits/usesSegments.js +27 -0
- package/lib/utils/time/index.js +12 -0
- package/lib/utils/timeTracker/index.js +213 -0
- package/lib/utils/timeTracker/timer.js +33 -0
- package/package.json +16 -20
- package/src/client/attributesDecoration.js +112 -0
- package/src/client/browser.js +41 -0
- package/src/client/client.js +131 -0
- package/src/client/inputValidation.js +130 -0
- package/src/client/node.js +8 -0
- package/src/client/package.json +4 -0
- package/src/engine/combiners/and.js +55 -0
- package/src/engine/combiners/ifelseif.js +74 -0
- package/src/engine/condition/index.js +65 -0
- package/src/engine/convertions/index.js +22 -0
- package/src/engine/engine/index.js +63 -0
- package/src/engine/engine/legacy.js +66 -0
- package/src/engine/engine/murmur3/common.js +54 -0
- package/src/engine/engine/murmur3/murmur3.js +79 -0
- package/src/engine/engine/murmur3/murmur3_128.js +273 -0
- package/src/engine/engine/murmur3/murmur3_128_x86.js +188 -0
- package/src/engine/engine/murmur3/murmur3_64.js +34 -0
- package/src/engine/engine/murmur3/utfx.js +111 -0
- package/src/engine/evaluator/index.js +148 -0
- package/src/engine/index.js +123 -0
- package/src/engine/matchers/all.js +29 -0
- package/src/engine/matchers/between.js +30 -0
- package/src/engine/matchers/boolean.js +29 -0
- package/src/engine/matchers/cont_all.js +40 -0
- package/src/engine/matchers/cont_any.js +35 -0
- package/src/engine/matchers/cont_str.js +31 -0
- package/src/engine/matchers/dependency.js +52 -0
- package/src/engine/matchers/eq.js +30 -0
- package/src/engine/matchers/eq_set.js +37 -0
- package/src/engine/matchers/ew.js +31 -0
- package/src/engine/matchers/gte.js +30 -0
- package/src/engine/matchers/index.js +71 -0
- package/src/engine/matchers/lte.js +30 -0
- package/src/engine/matchers/part_of.js +37 -0
- package/src/engine/matchers/segment.js +41 -0
- package/src/engine/matchers/string.js +39 -0
- package/src/engine/matchers/sw.js +31 -0
- package/src/engine/matchers/types.js +52 -0
- package/src/engine/matchers/whitelist.js +30 -0
- package/src/engine/parser/index.js +79 -0
- package/src/engine/parser/segments.js +31 -0
- package/src/engine/transforms/matcherGroup.js +45 -0
- package/src/engine/transforms/matchers.js +118 -0
- package/src/engine/transforms/segment.js +23 -0
- package/src/engine/transforms/set.js +20 -0
- package/src/engine/transforms/unaryNumeric.js +20 -0
- package/src/engine/transforms/whitelist.js +22 -0
- package/src/engine/treatments/index.js +67 -0
- package/src/engine/value/index.js +53 -0
- package/src/engine/value/sanitize.js +117 -0
- package/src/events/index.js +62 -0
- package/src/factory/offline.js +60 -0
- package/src/factory/online.js +127 -0
- package/src/impressions/counter.js +43 -0
- package/src/impressions/hasher/buildKey.js +3 -0
- package/src/impressions/hasher/hashImpression128.js +6 -0
- package/src/impressions/hasher/hashImpression32.js +6 -0
- package/src/impressions/observer/browser.js +8 -0
- package/src/impressions/observer/node.js +8 -0
- package/src/impressions/observer/observer.js +17 -0
- package/src/impressions/observer/package.json +4 -0
- package/src/index.js +140 -1
- package/src/integrations/browser.js +57 -0
- package/src/integrations/ga/GaToSplit.js +278 -0
- package/src/integrations/ga/SplitToGa.js +125 -0
- package/src/integrations/node.js +4 -0
- package/src/integrations/package.json +4 -0
- package/src/listeners/browser.js +137 -0
- package/src/listeners/node.js +59 -0
- package/src/listeners/package.json +4 -0
- package/src/manager/index.js +103 -0
- package/src/metrics/Collectors.js +77 -0
- package/src/metrics/index.js +174 -0
- package/src/producer/browser/Partial.js +104 -0
- package/src/producer/browser.js +82 -0
- package/src/producer/fetcher/MySegments.js +40 -0
- package/src/producer/fetcher/SegmentChanges.js +52 -0
- package/src/producer/fetcher/SplitChanges.js +39 -0
- package/src/producer/node.js +142 -0
- package/src/producer/offline/browser.js +28 -0
- package/src/producer/offline/node.js +28 -0
- package/src/producer/offline/package.json +4 -0
- package/src/producer/package.json +4 -0
- package/src/producer/task.js +57 -0
- package/src/producer/updater/MySegments.js +104 -0
- package/src/producer/updater/SegmentChanges.js +126 -0
- package/src/producer/updater/SplitChanges.js +138 -0
- package/src/producer/updater/SplitChangesFromFeatures.js +23 -0
- package/src/producer/updater/SplitChangesFromFileSystem.js +23 -0
- package/src/producer/updater/SplitChangesFromObject.js +81 -0
- package/src/readiness/index.js +125 -0
- package/src/readiness/statusManager.js +121 -0
- package/src/services/auth/auth.js +21 -0
- package/src/services/auth/index.js +3 -0
- package/src/services/events/bulk.js +23 -0
- package/src/services/events/index.js +18 -0
- package/{es/platform → src/services}/getEventSource/browser.js +1 -1
- package/src/{platform → services}/getEventSource/node.js +2 -2
- package/src/services/getEventSource/package.json +4 -0
- package/src/{platform → services}/getFetch/browser.js +2 -2
- package/src/{platform → services}/getFetch/node.js +1 -1
- package/src/services/getFetch/package.json +4 -0
- package/src/services/impressions/bulk.js +26 -0
- package/src/services/impressions/count.js +8 -0
- package/src/services/impressions/dto.js +71 -0
- package/src/services/impressions/index.js +18 -0
- package/src/services/impressions/post.js +23 -0
- package/src/services/metrics/counters.js +25 -0
- package/src/services/metrics/dto.js +44 -0
- package/src/services/metrics/index.js +18 -0
- package/src/services/metrics/times.js +25 -0
- package/src/services/mySegments/get.js +27 -0
- package/src/services/mySegments/index.js +18 -0
- package/src/services/request/index.js +43 -0
- package/src/services/request/options/browser.js +18 -0
- package/src/{platform → services}/request/options/node.js +2 -2
- package/src/services/request/options/package.json +4 -0
- package/src/services/segmentChanges/get.js +20 -0
- package/src/services/segmentChanges/index.js +18 -0
- package/src/services/splitChanges/get.js +20 -0
- package/src/services/splitChanges/index.js +18 -0
- package/src/services/splitChanges/offline/browser.js +66 -0
- package/src/services/splitChanges/offline/node.js +190 -0
- package/src/services/splitChanges/offline/package.json +4 -0
- package/src/services/splitChanges/offline/parseCondition.js +52 -0
- package/src/services/transport/index.js +44 -0
- package/src/storage/AttributesCache/InMemory.js +76 -0
- package/src/storage/BaseMetricsAsyncCache.js +14 -0
- package/src/storage/CountCache/InMemory.js +48 -0
- package/src/storage/CountCache/InRedis.js +32 -0
- package/src/storage/EventsCache/InMemory.js +99 -0
- package/src/storage/EventsCache/InRedis.js +62 -0
- package/src/storage/ImpressionsCache/InMemory.js +62 -0
- package/src/storage/ImpressionsCache/InRedis.js +65 -0
- package/src/storage/Keys.js +122 -0
- package/src/storage/KeysLocalStorage.js +52 -0
- package/src/storage/LatencyCache/InMemory.js +56 -0
- package/src/storage/LatencyCache/InRedis.js +35 -0
- package/src/storage/LatencyCache/findIndex.js +7 -0
- package/src/storage/Meta.js +7 -0
- package/src/storage/RedisAdapter.js +170 -0
- package/src/storage/SegmentCache/InLocalStorage/index.js +140 -0
- package/src/storage/SegmentCache/InMemory/browser.js +99 -0
- package/src/storage/SegmentCache/InMemory/node.js +84 -0
- package/src/storage/SegmentCache/InMemory/package.json +4 -0
- package/src/storage/SegmentCache/InRedis/index.js +71 -0
- package/src/storage/SplitCache/InLocalStorage.js +324 -0
- package/src/storage/SplitCache/InMemory.js +145 -0
- package/src/storage/SplitCache/InRedis.js +187 -0
- package/src/storage/SplitCache/killLocally.js +33 -0
- package/src/storage/browser.js +110 -0
- package/src/storage/node.js +83 -0
- package/src/storage/package.json +4 -0
- package/src/sync/AuthClient/index.js +31 -0
- package/src/sync/PushManager/index.js +328 -0
- package/src/sync/PushManager/mySegmentsV2utils.js +76 -0
- package/src/sync/PushManager/pushRequirements/browser.js +20 -0
- package/src/sync/PushManager/pushRequirements/node.js +16 -0
- package/src/sync/PushManager/pushRequirements/package.json +4 -0
- package/src/sync/SSEClient/index.js +92 -0
- package/src/sync/SSEHandler/NotificationKeeper.js +90 -0
- package/src/sync/SSEHandler/NotificationParser.js +35 -0
- package/src/sync/SSEHandler/index.js +110 -0
- package/src/sync/SegmentUpdateWorker/browser.js +67 -0
- package/src/sync/SegmentUpdateWorker/node.js +73 -0
- package/src/sync/SegmentUpdateWorker/package.json +4 -0
- package/src/sync/SplitUpdateWorker/index.js +79 -0
- package/src/sync/browser.js +130 -0
- package/src/sync/constants.js +43 -0
- package/src/sync/node.js +66 -0
- package/src/sync/package.json +4 -0
- package/src/trackers/event.js +47 -0
- package/src/trackers/impressions.js +123 -0
- package/src/umd.js +0 -1
- package/src/utils/backoff/index.js +46 -0
- package/src/utils/base64/browser.js +19 -0
- package/src/utils/base64/node.js +19 -0
- package/src/utils/base64/package.json +4 -0
- package/src/utils/binarySearch/index.js +50 -0
- package/src/utils/constants/index.js +41 -0
- package/src/utils/context/constants.js +18 -0
- package/src/utils/context/index.js +84 -0
- package/src/utils/decompress/index.js +428 -0
- package/src/utils/fn/repeat.js +48 -0
- package/src/utils/inputValidation/apiKey.js +42 -0
- package/src/utils/inputValidation/attribute.js +22 -0
- package/src/utils/inputValidation/attributes.js +26 -0
- package/src/utils/inputValidation/event.js +23 -0
- package/src/utils/inputValidation/eventProperties.js +65 -0
- package/src/utils/inputValidation/eventValue.js +11 -0
- package/src/utils/inputValidation/index.js +11 -0
- package/src/utils/inputValidation/isOperational.js +16 -0
- package/src/utils/inputValidation/key.js +53 -0
- package/src/utils/inputValidation/split.js +42 -0
- package/src/utils/inputValidation/splitFilters.js +108 -0
- package/src/utils/inputValidation/splits.js +21 -0
- package/src/utils/inputValidation/trafficType.js +58 -0
- package/src/utils/jwt/hashUserKey.js +11 -0
- package/src/utils/jwt/index.js +15 -0
- package/src/utils/key/factory.js +34 -0
- package/src/utils/key/parser.js +34 -0
- package/src/utils/labels/index.js +7 -0
- package/src/utils/lang/Errors.js +19 -0
- package/src/utils/lang/Sets.js +94 -0
- package/src/utils/lang/index.js +291 -0
- package/src/utils/localstorage/isAvailable.js +26 -0
- package/src/utils/logger/LoggerFactory.js +90 -0
- package/src/utils/logger/index.js +93 -0
- package/src/utils/lrucache/linkedlist.js +116 -0
- package/src/utils/lrucache/lru.spec.js +26 -0
- package/src/utils/lrucache/lrucache.js +49 -0
- package/src/utils/now/browser.js +29 -0
- package/src/utils/now/node.js +21 -0
- package/src/utils/now/package.json +4 -0
- package/src/utils/promise/thenable.js +1 -0
- package/src/utils/promise/timeout.js +38 -0
- package/src/utils/promise/wrapper.js +60 -0
- package/{lib → src/utils}/settings/defaults/browser.js +3 -13
- package/{lib → src/utils}/settings/defaults/node.js +2 -12
- package/src/utils/settings/defaults/package.json +4 -0
- package/src/utils/settings/impressionsMode.js +15 -0
- package/src/utils/settings/index.js +217 -0
- package/src/utils/settings/integrations/browser.js +8 -0
- package/src/utils/settings/integrations/common.js +32 -0
- package/src/{settings → utils/settings}/integrations/node.js +3 -1
- package/src/utils/settings/integrations/package.json +4 -0
- package/src/utils/settings/language/browser.js +17 -0
- package/src/utils/settings/language/node.js +17 -0
- package/src/utils/settings/language/package.json +4 -0
- package/src/utils/settings/mode.js +12 -0
- package/src/utils/settings/runtime/browser.js +22 -0
- package/src/{settings → utils/settings}/runtime/node.js +6 -9
- package/src/utils/settings/runtime/package.json +4 -0
- package/src/{settings → utils/settings}/storage/browser.js +18 -13
- package/src/{settings → utils/settings}/storage/node.js +14 -19
- package/src/utils/settings/storage/package.json +4 -0
- package/src/utils/splits/usesSegments.js +17 -0
- package/src/utils/time/index.js +8 -0
- package/src/utils/timeTracker/index.js +223 -0
- package/src/utils/timeTracker/timer.js +27 -0
- package/types/splitio.d.ts +5 -22
- package/client/package.json +0 -5
- package/es/factory/browser.js +0 -58
- package/es/factory/node.js +0 -59
- package/es/platform/EventEmitter.js +0 -412
- package/es/platform/browser.js +0 -10
- package/es/platform/node.js +0 -12
- package/es/settings/browser.js +0 -18
- package/es/settings/defaults/version.js +0 -1
- package/es/settings/integrations/browser.js +0 -5
- package/es/settings/integrations/node.js +0 -5
- package/es/settings/node.js +0 -20
- package/lib/factory/browser.js +0 -79
- package/lib/factory/node.js +0 -78
- package/lib/platform/EventEmitter.js +0 -417
- package/lib/platform/browser.js +0 -21
- package/lib/platform/node.js +0 -26
- package/lib/settings/browser.js +0 -30
- package/lib/settings/defaults/version.js +0 -6
- package/lib/settings/integrations/browser.js +0 -14
- package/lib/settings/integrations/node.js +0 -12
- package/lib/settings/node.js +0 -33
- package/server/package.json +0 -5
- package/src/.DS_Store +0 -0
- package/src/factory/browser.js +0 -74
- package/src/factory/node.js +0 -71
- package/src/platform/.DS_Store +0 -0
- package/src/platform/EventEmitter.js +0 -443
- package/src/platform/browser.js +0 -12
- package/src/platform/node.js +0 -14
- package/src/settings/.DS_Store +0 -0
- package/src/settings/browser.js +0 -18
- package/src/settings/defaults/version.js +0 -1
- package/src/settings/integrations/browser.js +0 -6
- package/src/settings/node.js +0 -20
- package/types/client/index.d.ts +0 -14
- package/types/server/index.d.ts +0 -20
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
Copyright 2016 Split Software
|
|
3
|
+
|
|
4
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
you may not use this file except in compliance with the License.
|
|
6
|
+
You may obtain a copy of the License at
|
|
7
|
+
|
|
8
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
|
|
10
|
+
Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
See the License for the specific language governing permissions and
|
|
14
|
+
limitations under the License.
|
|
15
|
+
**/
|
|
16
|
+
|
|
17
|
+
class ImpressionsCacheInRedis {
|
|
18
|
+
constructor(keys, redis, meta) {
|
|
19
|
+
this.keys = keys;
|
|
20
|
+
this.redis = redis;
|
|
21
|
+
this.meta = meta;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
track(impressions) {
|
|
25
|
+
return this.redis.rpush(
|
|
26
|
+
this.keys.buildImpressionsKey(),
|
|
27
|
+
this.toJSON(impressions)
|
|
28
|
+
).then(queuedCount => {
|
|
29
|
+
// If this is the creation of the key on Redis, set the expiration for it in 1hr.
|
|
30
|
+
if (queuedCount === impressions.length) {
|
|
31
|
+
return this.redis.expire(this.keys.buildImpressionsKey(), 3600);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
toJSON(impressions) {
|
|
37
|
+
return impressions.map(impression => {
|
|
38
|
+
const {
|
|
39
|
+
keyName, bucketingKey, feature, treatment, label, time, changeNumber
|
|
40
|
+
} = impression;
|
|
41
|
+
|
|
42
|
+
return JSON.stringify({
|
|
43
|
+
m: this.meta,
|
|
44
|
+
i: {
|
|
45
|
+
k: keyName,
|
|
46
|
+
b: bucketingKey,
|
|
47
|
+
f: feature,
|
|
48
|
+
t: treatment,
|
|
49
|
+
r: label,
|
|
50
|
+
c: changeNumber,
|
|
51
|
+
m: time
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* We are returning true because the go syncronizer push the impressions from redis.
|
|
59
|
+
*/
|
|
60
|
+
isEmpty() {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export default ImpressionsCacheInRedis;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { startsWith } from '../utils/lang';
|
|
2
|
+
|
|
3
|
+
const everythingAtTheEnd = /[^.]+$/;
|
|
4
|
+
const everythingAfterCount = /count\.([^/]+)$/;
|
|
5
|
+
const latencyMetricNameAndBucket = /latency\.([^/]+)\.bucket\.([0-9]+)$/;
|
|
6
|
+
|
|
7
|
+
class KeyBuilder {
|
|
8
|
+
constructor(settings) {
|
|
9
|
+
this.settings = settings;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
buildSplitKey(splitName) {
|
|
13
|
+
return `${this.settings.storage.prefix}.split.${splitName}`;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
buildTrafficTypeKey(trafficType) {
|
|
17
|
+
return `${this.settings.storage.prefix}.trafficType.${trafficType}`;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
buildSplitsTillKey() {
|
|
21
|
+
return `${this.settings.storage.prefix}.splits.till`;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
buildSplitsReady() {
|
|
25
|
+
return `${this.settings.storage.prefix}.splits.ready`;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
isSplitKey(key) {
|
|
29
|
+
return startsWith(key, `${this.settings.storage.prefix}.split.`);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
buildSegmentNameKey(segmentName) {
|
|
33
|
+
return `${this.settings.storage.prefix}.segment.${segmentName}`;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
buildSegmentTillKey(segmentName) {
|
|
37
|
+
return `${this.settings.storage.prefix}.segment.${segmentName}.till`;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
buildRegisteredSegmentsKey() {
|
|
41
|
+
return `${this.settings.storage.prefix}.segments.registered`;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
buildSegmentsReady() {
|
|
45
|
+
return `${this.settings.storage.prefix}.segments.ready`;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
buildVersionablePrefix() {
|
|
49
|
+
return `${this.settings.storage.prefix}/${this.settings.version}/${this.settings.runtime.ip}`;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
buildImpressionsKey() {
|
|
53
|
+
return `${this.settings.storage.prefix}.impressions`;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
buildEventsKey() {
|
|
57
|
+
return `${this.settings.storage.prefix}.events`;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
buildLatencyKeyPrefix() {
|
|
61
|
+
return `${this.buildVersionablePrefix()}/latency`;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
buildLatencyKey(metricName, bucketNumber) {
|
|
65
|
+
return `${this.buildLatencyKeyPrefix()}.${metricName}.bucket.${bucketNumber}`;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
buildCountKey(metricName) {
|
|
69
|
+
return `${this.buildVersionablePrefix()}/count.${metricName}`;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
buildGaugeKey(metricName) {
|
|
73
|
+
return `${this.buildVersionablePrefix()}/gauge.${metricName}`;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
searchPatternForCountKeys() {
|
|
77
|
+
return `${this.buildVersionablePrefix()}/count.*`;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
searchPatternForSplitKeys() {
|
|
81
|
+
return `${this.settings.storage.prefix}.split.*`;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
searchPatternForLatency() {
|
|
85
|
+
return `${this.buildLatencyKeyPrefix()}.*`;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
extractKey(builtKey) {
|
|
89
|
+
const s = builtKey.match(everythingAtTheEnd);
|
|
90
|
+
|
|
91
|
+
if (s && s.length) {
|
|
92
|
+
return s[0];
|
|
93
|
+
} else {
|
|
94
|
+
throw new Error('Invalid latency key provided');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
extractCounterName(counterKey) {
|
|
99
|
+
const m = counterKey.match(everythingAfterCount);
|
|
100
|
+
|
|
101
|
+
if (m && m.length) {
|
|
102
|
+
return m[1]; // everything after count
|
|
103
|
+
} else {
|
|
104
|
+
throw new Error('Invalid counter key provided');
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
extractLatencyMetricNameAndBucket(latencyKey) {
|
|
109
|
+
const parts = latencyKey.match(latencyMetricNameAndBucket);
|
|
110
|
+
|
|
111
|
+
if (parts && parts.length > 2) {
|
|
112
|
+
return {
|
|
113
|
+
metricName: parts[1],
|
|
114
|
+
bucketNumber: parts[2]
|
|
115
|
+
};
|
|
116
|
+
} else {
|
|
117
|
+
throw new Error('Invalid counter key provided');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export default KeyBuilder;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { startsWith } from '../utils/lang';
|
|
2
|
+
import KeyBuilder from './Keys';
|
|
3
|
+
import { matching } from '../utils/key/factory';
|
|
4
|
+
|
|
5
|
+
class KeyBuilderForLocalStorage extends KeyBuilder {
|
|
6
|
+
|
|
7
|
+
constructor(settings) {
|
|
8
|
+
super(settings);
|
|
9
|
+
this.regexSplitCacheKey = new RegExp(`^${this.settings.storage.prefix}\\.(splits?|trafficType)\\.`);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
buildSegmentNameKey(segmentName) {
|
|
13
|
+
return `${this.settings.storage.prefix}.${matching(this.settings.core.key)}.segment.${segmentName}`;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
extractSegmentName(builtSegmentKeyName) {
|
|
17
|
+
const prefix = `${this.settings.storage.prefix}.${matching(this.settings.core.key)}.segment.`;
|
|
18
|
+
|
|
19
|
+
if (startsWith(builtSegmentKeyName, prefix))
|
|
20
|
+
return builtSegmentKeyName.substr(prefix.length);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
buildSplitsWithSegmentCountKey() {
|
|
24
|
+
return `${this.settings.storage.prefix}.splits.usingSegments`;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
buildLastUpdatedKey() {
|
|
28
|
+
return `${this.settings.storage.prefix}.splits.lastUpdated`;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
isSplitCacheKey(key) {
|
|
32
|
+
return this.regexSplitCacheKey.test(key);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
buildSplitsFilterQueryKey() {
|
|
36
|
+
return `${this.settings.storage.prefix}.splits.filterQuery`;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// @BREAKING: The key used to start with the matching key instead of the prefix, this was changed on version 10.17.3
|
|
40
|
+
buildOldSegmentNameKey(segmentName) {
|
|
41
|
+
return `${matching(this.settings.core.key)}.${this.settings.storage.prefix}.segment.${segmentName}`;
|
|
42
|
+
}
|
|
43
|
+
// @BREAKING: The key used to start with the matching key instead of the prefix, this was changed on version 10.17.3
|
|
44
|
+
extractOldSegmentKey(maybeOldKey) {
|
|
45
|
+
const prefix = `${matching(this.settings.core.key)}.${this.settings.storage.prefix}.segment.`;
|
|
46
|
+
|
|
47
|
+
if (startsWith(maybeOldKey, prefix))
|
|
48
|
+
return maybeOldKey.substr(prefix.length);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export default KeyBuilderForLocalStorage;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
Copyright 2016 Split Software
|
|
3
|
+
|
|
4
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
you may not use this file except in compliance with the License.
|
|
6
|
+
You may obtain a copy of the License at
|
|
7
|
+
|
|
8
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
|
|
10
|
+
Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
See the License for the specific language governing permissions and
|
|
14
|
+
limitations under the License.
|
|
15
|
+
**/
|
|
16
|
+
import findIndex from './findIndex';
|
|
17
|
+
|
|
18
|
+
class LatencyCacheInMemory {
|
|
19
|
+
constructor() {
|
|
20
|
+
this.clear();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
clear() {
|
|
24
|
+
this.counters = {};
|
|
25
|
+
|
|
26
|
+
return this;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
state() {
|
|
30
|
+
return this.counters;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
track(metricName, latency) {
|
|
34
|
+
// Initialize if needed
|
|
35
|
+
if (this.counters[metricName] === undefined) {
|
|
36
|
+
this.counters[metricName] = [
|
|
37
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
|
38
|
+
];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// +1 based on the latency number
|
|
42
|
+
this.counters[metricName][findIndex(latency)]++;
|
|
43
|
+
|
|
44
|
+
return this;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
isEmpty() {
|
|
48
|
+
return Object.keys(this.counters).length === 0;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
toJSON() {
|
|
52
|
+
return this.counters;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export default LatencyCacheInMemory;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
Copyright 2016 Split Software
|
|
3
|
+
|
|
4
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
you may not use this file except in compliance with the License.
|
|
6
|
+
You may obtain a copy of the License at
|
|
7
|
+
|
|
8
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
|
|
10
|
+
Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
See the License for the specific language governing permissions and
|
|
14
|
+
limitations under the License.
|
|
15
|
+
**/
|
|
16
|
+
import findIndex from './findIndex';
|
|
17
|
+
import BaseMetricsAsyncCache from '../BaseMetricsAsyncCache';
|
|
18
|
+
|
|
19
|
+
class LatencyCacheInRedis extends BaseMetricsAsyncCache {
|
|
20
|
+
constructor(keys, redis) {
|
|
21
|
+
super();
|
|
22
|
+
this.keys = keys;
|
|
23
|
+
this.redis = redis;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
track(metricName, latency) {
|
|
27
|
+
const bucketNumber = findIndex(latency);
|
|
28
|
+
|
|
29
|
+
return this.redis.incr(this.keys.buildLatencyKey(metricName, bucketNumber)).catch(() => {
|
|
30
|
+
// noop, for telemetry metrics there's no need to throw.
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export default LatencyCacheInRedis;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import binarySearch from '../../utils/binarySearch';
|
|
2
|
+
|
|
3
|
+
export default binarySearch.bind(null, [
|
|
4
|
+
1, 1.5, 2.25, 3.38, 5.06, 7.59, 11.39, 17.09, 25.63, 38.44, 57.67, 86.5,
|
|
5
|
+
129.75, 194.62, 291.93, 437.89, 656.84, 985.26, 1477.89, 2216.84, 3325.26,
|
|
6
|
+
4987.89, 7481.83
|
|
7
|
+
]);
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import ioredis from 'ioredis';
|
|
2
|
+
import { merge, isString } from '../utils/lang';
|
|
3
|
+
import { _Set, setToArray } from '../utils/lang/Sets';
|
|
4
|
+
import thenable from '../utils/promise/thenable';
|
|
5
|
+
import timeout from '../utils/promise/timeout';
|
|
6
|
+
|
|
7
|
+
import LogFactory from '../utils/logger';
|
|
8
|
+
const log = LogFactory('splitio-storage:redis-adapter');
|
|
9
|
+
|
|
10
|
+
// If we ever decide to fully wrap every method, there's a Commander.getBuiltinCommands from ioredis.
|
|
11
|
+
const METHODS_TO_PROMISE_WRAP = ['set', 'exec', 'del', 'get', 'keys', 'sadd', 'srem', 'sismember', 'smembers', 'incr', 'rpush', 'pipeline', 'expire', 'mget'];
|
|
12
|
+
|
|
13
|
+
// Not part of the settings since it'll vary on each storage. We should be removing storage specific logic from elsewhere.
|
|
14
|
+
const DEFAULT_OPTIONS = {
|
|
15
|
+
connectionTimeout: 10000,
|
|
16
|
+
operationTimeout: 5000
|
|
17
|
+
};
|
|
18
|
+
// Library specifics.
|
|
19
|
+
const DEFAULT_LIBRARY_OPTIONS = {
|
|
20
|
+
enableOfflineQueue: false,
|
|
21
|
+
connectTimeout: DEFAULT_OPTIONS.connectionTimeout,
|
|
22
|
+
lazyConnect: false
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Redis adapter on top of the library of choice (written with ioredis) for some extra control.
|
|
27
|
+
*/
|
|
28
|
+
export default class RedisAdapter extends ioredis {
|
|
29
|
+
constructor(storageSettings) {
|
|
30
|
+
const options = RedisAdapter._defineOptions(storageSettings);
|
|
31
|
+
// Call the ioredis constructor
|
|
32
|
+
super(...RedisAdapter._defineLibrarySettings(options));
|
|
33
|
+
|
|
34
|
+
this._options = options;
|
|
35
|
+
this._notReadyCommandsQueue = [];
|
|
36
|
+
this._runningCommands = new _Set();
|
|
37
|
+
this._listenToEvents();
|
|
38
|
+
this._setTimeoutWrappers();
|
|
39
|
+
this._setDisconnectWrapper();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
_listenToEvents() {
|
|
43
|
+
this.once('ready', () => {
|
|
44
|
+
const commandsCount = this._notReadyCommandsQueue ? this._notReadyCommandsQueue.length : 0;
|
|
45
|
+
log.info(`Redis connection established. Queued commands: ${commandsCount}.`);
|
|
46
|
+
commandsCount && this._notReadyCommandsQueue.forEach(queued => {
|
|
47
|
+
log.info(`Executing queued ${queued.name} command.`);
|
|
48
|
+
queued.command().then(queued.resolve).catch(queued.reject);
|
|
49
|
+
});
|
|
50
|
+
// After the SDK is ready for the first time we'll stop queueing commands. This is just so we can keep handling BUR for them.
|
|
51
|
+
this._notReadyCommandsQueue = false;
|
|
52
|
+
});
|
|
53
|
+
this.once('close', () => {
|
|
54
|
+
log.info('Redis connection closed.');
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
_setTimeoutWrappers() {
|
|
59
|
+
const instance = this;
|
|
60
|
+
|
|
61
|
+
METHODS_TO_PROMISE_WRAP.forEach(method => {
|
|
62
|
+
const originalMethod = instance[method];
|
|
63
|
+
|
|
64
|
+
instance[method] = function() {
|
|
65
|
+
const params = arguments;
|
|
66
|
+
|
|
67
|
+
function commandWrapper() {
|
|
68
|
+
log.debug(`Executing ${method}.`);
|
|
69
|
+
// Return original method
|
|
70
|
+
const result = originalMethod.apply(instance, params);
|
|
71
|
+
|
|
72
|
+
if (thenable(result)) {
|
|
73
|
+
// For handling pending commands on disconnect, add to the set and remove once finished.
|
|
74
|
+
// On sync commands there's no need, only thenables.
|
|
75
|
+
instance._runningCommands.add(result);
|
|
76
|
+
const cleanUpRunningCommandsCb = function(res) {
|
|
77
|
+
instance._runningCommands.delete(result);
|
|
78
|
+
return res;
|
|
79
|
+
};
|
|
80
|
+
// Both success and error remove from queue.
|
|
81
|
+
result.then(cleanUpRunningCommandsCb, cleanUpRunningCommandsCb);
|
|
82
|
+
|
|
83
|
+
return timeout(instance._options.operationTimeout, result).catch(err => {
|
|
84
|
+
log.error(`${method} operation threw an error or exceeded configured timeout of ${instance._options.operationTimeout}ms. Message: ${err}`);
|
|
85
|
+
// Handling is not the adapter responsibility.
|
|
86
|
+
throw err;
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (instance._notReadyCommandsQueue) {
|
|
94
|
+
return new Promise((res, rej) => {
|
|
95
|
+
instance._notReadyCommandsQueue.unshift({
|
|
96
|
+
resolve: res,
|
|
97
|
+
reject: rej,
|
|
98
|
+
command: commandWrapper,
|
|
99
|
+
name: method.toUpperCase()
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
} else {
|
|
103
|
+
return commandWrapper();
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
_setDisconnectWrapper() {
|
|
110
|
+
const instance = this;
|
|
111
|
+
const originalMethod = instance.disconnect;
|
|
112
|
+
|
|
113
|
+
instance.disconnect = function disconnect() {
|
|
114
|
+
const params = arguments;
|
|
115
|
+
|
|
116
|
+
setTimeout(function deferedDisconnect() {
|
|
117
|
+
if (instance._runningCommands.size > 0) {
|
|
118
|
+
log.info(`Attempting to disconnect but there are ${instance._runningCommands.size} commands still waiting for resolution. Defering disconnection until those finish.`);
|
|
119
|
+
|
|
120
|
+
Promise.all(setToArray(instance._runningCommands))
|
|
121
|
+
.then(() => {
|
|
122
|
+
log.debug('Pending commands finished successfully, disconnecting.');
|
|
123
|
+
originalMethod.apply(instance, params);
|
|
124
|
+
})
|
|
125
|
+
.catch(e => {
|
|
126
|
+
log.warn(`Pending commands finished with error: ${e}. Proceeding with disconnection.`);
|
|
127
|
+
originalMethod.apply(instance, params);
|
|
128
|
+
});
|
|
129
|
+
} else {
|
|
130
|
+
log.debug('No commands pending execution, disconnect.');
|
|
131
|
+
// Nothing pending, just proceed.
|
|
132
|
+
originalMethod.apply(instance, params);
|
|
133
|
+
}
|
|
134
|
+
}, 10);
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Receives the options and returns an array of parameters for the ioredis constructor.
|
|
140
|
+
* Keeping both redis setup options for backwards compatibility.
|
|
141
|
+
*/
|
|
142
|
+
static _defineLibrarySettings(options) {
|
|
143
|
+
const opts = merge({}, DEFAULT_LIBRARY_OPTIONS);
|
|
144
|
+
const result = [opts];
|
|
145
|
+
|
|
146
|
+
if (!isString(options.url)) {
|
|
147
|
+
merge(opts, { // If it's not the string URL, merge the params separately.
|
|
148
|
+
host: options.host,
|
|
149
|
+
port: options.port,
|
|
150
|
+
db: options.db,
|
|
151
|
+
password: options.pass
|
|
152
|
+
});
|
|
153
|
+
} else { // If it IS the string URL, that'll be the first param for ioredis.
|
|
154
|
+
result.unshift(options.url);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Parses the options into what we care about.
|
|
162
|
+
*/
|
|
163
|
+
static _defineOptions({ connectionTimeout, operationTimeout, url, host, port, db, pass }) {
|
|
164
|
+
const parsedOptions = {
|
|
165
|
+
connectionTimeout, operationTimeout, url, host, port, db, pass
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
return merge({}, DEFAULT_OPTIONS, parsedOptions);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import logFactory from '../../../utils/logger';
|
|
2
|
+
const log = logFactory('splitio-storage:localstorage');
|
|
3
|
+
|
|
4
|
+
const DEFINED = '1';
|
|
5
|
+
|
|
6
|
+
class SegmentCacheInLocalStorage {
|
|
7
|
+
|
|
8
|
+
constructor(keys) {
|
|
9
|
+
this.keys = keys;
|
|
10
|
+
// There is not need to flush segments cache like splits cache, since resetSegments receives the up-to-date list of active segments
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
addToSegment(segmentName/*, segmentKeys: Array<string>*/) {
|
|
14
|
+
const segmentKey = this.keys.buildSegmentNameKey(segmentName);
|
|
15
|
+
|
|
16
|
+
try {
|
|
17
|
+
localStorage.setItem(segmentKey, DEFINED);
|
|
18
|
+
return true;
|
|
19
|
+
} catch (e) {
|
|
20
|
+
log.error(e);
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
removeFromSegment(segmentName/*, segmentKeys: Array<string>*/) {
|
|
26
|
+
const segmentKey = this.keys.buildSegmentNameKey(segmentName);
|
|
27
|
+
|
|
28
|
+
try {
|
|
29
|
+
localStorage.removeItem(segmentKey);
|
|
30
|
+
return true;
|
|
31
|
+
} catch (e) {
|
|
32
|
+
log.error(e);
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Reset (update) the cached list of segments with the given list, removing and adding segments if necessary.
|
|
39
|
+
*
|
|
40
|
+
* @param {string[]} segmentNames list of segment names
|
|
41
|
+
* @returns boolean indicating if the cache was updated (i.e., given list was different from the cached one)
|
|
42
|
+
*/
|
|
43
|
+
resetSegments(segmentNames) {
|
|
44
|
+
let isDiff = false;
|
|
45
|
+
let index;
|
|
46
|
+
|
|
47
|
+
// Scan current values from localStorage
|
|
48
|
+
const storedSegmentNames = Object.keys(localStorage).reduce((accum, key) => {
|
|
49
|
+
let segmentName = this.keys.extractSegmentName(key);
|
|
50
|
+
|
|
51
|
+
if (segmentName) {
|
|
52
|
+
accum.push(segmentName);
|
|
53
|
+
} else {
|
|
54
|
+
// @BREAKING: This is only to clean up "old" keys. Remove this whole else code block.
|
|
55
|
+
segmentName = this.keys.extractOldSegmentKey(key);
|
|
56
|
+
|
|
57
|
+
if (segmentName) { // this was an old segment key, let's clean up.
|
|
58
|
+
const newSegmentKey = this.keys.buildSegmentNameKey(segmentName);
|
|
59
|
+
try {
|
|
60
|
+
// If the new format key is not there, create it.
|
|
61
|
+
if (!localStorage.getItem(newSegmentKey) && segmentNames.indexOf(segmentName) > -1) {
|
|
62
|
+
localStorage.setItem(newSegmentKey, DEFINED);
|
|
63
|
+
// we are migrating a segment, let's track it.
|
|
64
|
+
accum.push(segmentName);
|
|
65
|
+
}
|
|
66
|
+
localStorage.removeItem(key); // we migrated the current key, let's delete it.
|
|
67
|
+
} catch (e) {
|
|
68
|
+
log.error(e);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return accum;
|
|
74
|
+
}, []);
|
|
75
|
+
|
|
76
|
+
// Extreme fast => everything is empty
|
|
77
|
+
if (segmentNames.length === 0 && storedSegmentNames.length === segmentNames.length)
|
|
78
|
+
return isDiff;
|
|
79
|
+
|
|
80
|
+
// Quick path
|
|
81
|
+
if (storedSegmentNames.length !== segmentNames.length) {
|
|
82
|
+
isDiff = true;
|
|
83
|
+
|
|
84
|
+
storedSegmentNames.forEach(segmentName => this.removeFromSegment(segmentName));
|
|
85
|
+
segmentNames.forEach(segmentName => this.addToSegment(segmentName));
|
|
86
|
+
} else {
|
|
87
|
+
// Slowest path => we need to find at least 1 difference because
|
|
88
|
+
for (index = 0; index < segmentNames.length && storedSegmentNames.indexOf(segmentNames[index]) !== -1; index++) {
|
|
89
|
+
// TODO: why empty statement?
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (index < segmentNames.length) {
|
|
93
|
+
isDiff = true;
|
|
94
|
+
|
|
95
|
+
storedSegmentNames.forEach(segmentName => this.removeFromSegment(segmentName));
|
|
96
|
+
segmentNames.forEach(segmentName => this.addToSegment(segmentName));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return isDiff;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
isInSegment(segmentName/*, key: string*/) {
|
|
104
|
+
return localStorage.getItem(this.keys.buildSegmentNameKey(segmentName)) === DEFINED;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
setChangeNumber(/*segmentName: string, changeNumber: number*/) {
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
getChangeNumber(/*segmentName: string*/) {
|
|
112
|
+
return -1;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
registerSegment(/*segment: string*/) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
registerSegments(/*segments: Iterable<string>*/) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
getRegisteredSegments() {
|
|
124
|
+
return [];
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Removes list of segments from localStorage
|
|
129
|
+
* @NOTE this method is not being used at the moment
|
|
130
|
+
*/
|
|
131
|
+
flush() {
|
|
132
|
+
log.info('Flushing MySegments data from localStorage');
|
|
133
|
+
|
|
134
|
+
// We cannot simply call `localStorage.clear()` since that implies removing user items from the storage
|
|
135
|
+
// We could optimize next sentence, since it implies iterating over all localStorage items
|
|
136
|
+
this.resetSegments([]);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export default SegmentCacheInLocalStorage;
|