@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,190 @@
|
|
|
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
|
+
import fs from 'fs';
|
|
18
|
+
import path from 'path';
|
|
19
|
+
import yaml from 'js-yaml';
|
|
20
|
+
import logFactory from '../../../utils/logger';
|
|
21
|
+
import { isString, endsWith, find, forOwn, uniq, } from '../../../utils/lang';
|
|
22
|
+
import parseCondition from './parseCondition';
|
|
23
|
+
const log = logFactory('splitio-offline:splits-fetcher');
|
|
24
|
+
|
|
25
|
+
const DEFAULT_FILENAME = '.split';
|
|
26
|
+
|
|
27
|
+
function configFilesPath(config = {}) {
|
|
28
|
+
let configFilePath = config.features;
|
|
29
|
+
|
|
30
|
+
if (configFilePath === DEFAULT_FILENAME || !isString(configFilePath)) {
|
|
31
|
+
let root = process.env.HOME;
|
|
32
|
+
|
|
33
|
+
if (process.env.SPLIT_CONFIG_ROOT) root = process.env.SPLIT_CONFIG_ROOT;
|
|
34
|
+
|
|
35
|
+
if (!root) throw new Error('Missing split mock configuration root.');
|
|
36
|
+
|
|
37
|
+
configFilePath = path.join(root, DEFAULT_FILENAME);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Validate the extensions
|
|
41
|
+
if (!(endsWith(configFilePath, '.yaml', true) || endsWith(configFilePath, '.yml', true) || endsWith(configFilePath, '.split', true)))
|
|
42
|
+
throw new Error(`Invalid extension specified for Splits mock file. Accepted extensions are ".yml" and ".yaml". Your specified file is ${configFilePath}`);
|
|
43
|
+
|
|
44
|
+
if (!fs.existsSync(configFilePath))
|
|
45
|
+
throw new Error(`Split configuration not found in ${configFilePath} - Please review your Split file location.`);
|
|
46
|
+
|
|
47
|
+
return configFilePath;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// This function is not pure nor meant to be. Here we apply modifications to cover
|
|
51
|
+
// for behaviour that's ensured by the BE.
|
|
52
|
+
function arrangeConditions(mocksData) {
|
|
53
|
+
// Iterate through each Split data
|
|
54
|
+
forOwn(mocksData, data => {
|
|
55
|
+
const conditions = data.conditions;
|
|
56
|
+
|
|
57
|
+
// On the manager, as the split jsons come with all treatments on the partitions prop,
|
|
58
|
+
// we'll add all the treatments to the first condition.
|
|
59
|
+
const firstRolloutCondition = find(conditions, cond => cond.conditionType === 'ROLLOUT');
|
|
60
|
+
// Malformed mocks may have
|
|
61
|
+
const treatments = uniq(data.treatments);
|
|
62
|
+
// If they're only specifying a whitelist we add the treatments there.
|
|
63
|
+
const allTreatmentsCondition = firstRolloutCondition ? firstRolloutCondition : conditions[0];
|
|
64
|
+
|
|
65
|
+
const fullyAllocatedTreatment = allTreatmentsCondition.partitions[0].treatment;
|
|
66
|
+
|
|
67
|
+
treatments.forEach(treatment => {
|
|
68
|
+
if (treatment !== fullyAllocatedTreatment) {
|
|
69
|
+
allTreatmentsCondition.partitions.push({
|
|
70
|
+
treatment, size: 0
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// Don't need these anymore
|
|
76
|
+
delete data.treatments;
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export default function createGetSplitConfigForFile() {
|
|
81
|
+
|
|
82
|
+
let previousMock = 'NO_MOCK_LOADED';
|
|
83
|
+
|
|
84
|
+
// Parse `.split` configuration file and return a map of "Split Objects"
|
|
85
|
+
function readSplitConfigFile(filePath) {
|
|
86
|
+
const SPLIT_POSITION = 0;
|
|
87
|
+
const TREATMENT_POSITION = 1;
|
|
88
|
+
let data;
|
|
89
|
+
|
|
90
|
+
try {
|
|
91
|
+
data = fs.readFileSync(filePath, 'utf-8');
|
|
92
|
+
} catch (e) {
|
|
93
|
+
log.error(e.message);
|
|
94
|
+
|
|
95
|
+
return {};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (data === previousMock) return false;
|
|
99
|
+
previousMock = data;
|
|
100
|
+
|
|
101
|
+
const splitObjects = data.split(/\r?\n/).reduce((accum, line, index) => {
|
|
102
|
+
let tuple = line.trim();
|
|
103
|
+
|
|
104
|
+
if (tuple === '' || tuple.charAt(0) === '#') {
|
|
105
|
+
log.debug(`Ignoring empty line or comment at #${index}`);
|
|
106
|
+
} else {
|
|
107
|
+
tuple = tuple.split(/\s+/);
|
|
108
|
+
|
|
109
|
+
if (tuple.length !== 2) {
|
|
110
|
+
log.debug(`Ignoring line since it does not have exactly two columns #${index}`);
|
|
111
|
+
} else {
|
|
112
|
+
const splitName = tuple[SPLIT_POSITION];
|
|
113
|
+
const condition = parseCondition({ treatment: tuple[TREATMENT_POSITION] });
|
|
114
|
+
accum[splitName] = { conditions: [condition], configurations: {}, trafficTypeName: 'localhost' };
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return accum;
|
|
119
|
+
}, {});
|
|
120
|
+
|
|
121
|
+
return splitObjects;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Parse `.yml` or `.yaml` configuration files and return a map of "Split Objects"
|
|
125
|
+
function readYAMLConfigFile(filePath) {
|
|
126
|
+
let data = '';
|
|
127
|
+
let yamldoc = null;
|
|
128
|
+
|
|
129
|
+
try {
|
|
130
|
+
data = fs.readFileSync(filePath, 'utf8');
|
|
131
|
+
|
|
132
|
+
if (data === previousMock) return false;
|
|
133
|
+
previousMock = data;
|
|
134
|
+
|
|
135
|
+
yamldoc = yaml.safeLoad(data);
|
|
136
|
+
} catch (e) {
|
|
137
|
+
log.error(e);
|
|
138
|
+
|
|
139
|
+
return {};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Each entry will be mapped to a condition, but we'll also keep the configurations map.
|
|
143
|
+
const mocksData = yamldoc.reduce((accum, splitEntry) => {
|
|
144
|
+
const splitName = Object.keys(splitEntry)[0];
|
|
145
|
+
|
|
146
|
+
if (!splitName || !isString(splitEntry[splitName].treatment))
|
|
147
|
+
log.error('Ignoring entry on YAML since the format is incorrect.');
|
|
148
|
+
|
|
149
|
+
const mockData = splitEntry[splitName];
|
|
150
|
+
|
|
151
|
+
// "Template" for each split accumulated data
|
|
152
|
+
if (!accum[splitName]) {
|
|
153
|
+
accum[splitName] = {
|
|
154
|
+
configurations: {}, conditions: [], treatments: [], trafficTypeName: 'localhost'
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Assign the config if there is one on the mock
|
|
159
|
+
if (mockData.config) accum[splitName].configurations[mockData.treatment] = mockData.config;
|
|
160
|
+
// Parse the condition from the entry.
|
|
161
|
+
const condition = parseCondition(mockData);
|
|
162
|
+
accum[splitName].conditions[condition.conditionType === 'ROLLOUT' ? 'push' : 'unshift'](condition);
|
|
163
|
+
// Also keep track of the treatments, will be useful for manager functionality.
|
|
164
|
+
accum[splitName].treatments.push(mockData.treatment);
|
|
165
|
+
|
|
166
|
+
return accum;
|
|
167
|
+
}, {});
|
|
168
|
+
|
|
169
|
+
arrangeConditions(mocksData);
|
|
170
|
+
|
|
171
|
+
return mocksData;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Load the content of a configuration file into an Object
|
|
175
|
+
return function getSplitConfigForFile(settings) {
|
|
176
|
+
const filePath = configFilesPath(settings);
|
|
177
|
+
let mockData = null;
|
|
178
|
+
|
|
179
|
+
// If we have a filePath, it means the extension is correct, choose the parser.
|
|
180
|
+
if (endsWith(filePath, '.split')) {
|
|
181
|
+
log.warn('.split mocks will be deprecated soon in favor of YAML files, which provide more targeting power. Take a look in our documentation.');
|
|
182
|
+
mockData = readSplitConfigFile(filePath);
|
|
183
|
+
} else {
|
|
184
|
+
mockData = readYAMLConfigFile(filePath);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return mockData;
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { isString } from '../../../utils/lang';
|
|
2
|
+
|
|
3
|
+
export default function parseCondition(data) {
|
|
4
|
+
const treatment = data.treatment;
|
|
5
|
+
|
|
6
|
+
if (data.keys) {
|
|
7
|
+
return {
|
|
8
|
+
conditionType: 'WHITELIST',
|
|
9
|
+
matcherGroup: {
|
|
10
|
+
combiner: 'AND',
|
|
11
|
+
matchers: [
|
|
12
|
+
{
|
|
13
|
+
keySelector: null,
|
|
14
|
+
matcherType: 'WHITELIST',
|
|
15
|
+
negate: false,
|
|
16
|
+
whitelistMatcherData: {
|
|
17
|
+
whitelist: isString(data.keys) ? [data.keys] : data.keys
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
partitions: [
|
|
23
|
+
{
|
|
24
|
+
treatment: treatment,
|
|
25
|
+
size: 100
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
label: `whitelisted ${treatment}`
|
|
29
|
+
};
|
|
30
|
+
} else {
|
|
31
|
+
return {
|
|
32
|
+
conditionType: 'ROLLOUT',
|
|
33
|
+
matcherGroup: {
|
|
34
|
+
combiner: 'AND',
|
|
35
|
+
matchers: [
|
|
36
|
+
{
|
|
37
|
+
keySelector: null,
|
|
38
|
+
matcherType: 'ALL_KEYS',
|
|
39
|
+
negate: false
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
partitions: [
|
|
44
|
+
{
|
|
45
|
+
treatment: treatment,
|
|
46
|
+
size: 100
|
|
47
|
+
}
|
|
48
|
+
],
|
|
49
|
+
label: 'default rule'
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import getFetch from '../getFetch';
|
|
2
|
+
import { SplitNetworkError } from '../../utils/lang/Errors';
|
|
3
|
+
import logFactory from '../../utils/logger';
|
|
4
|
+
const log = logFactory('splitio-services:service');
|
|
5
|
+
|
|
6
|
+
const messageNoFetch = 'Global fetch API is not available.';
|
|
7
|
+
|
|
8
|
+
export default function Fetcher(request) {
|
|
9
|
+
// using `fetch(url, options)` signature to work with unfetch
|
|
10
|
+
const url = request.url;
|
|
11
|
+
const fetch = getFetch();
|
|
12
|
+
|
|
13
|
+
return fetch ? fetch(url, request)
|
|
14
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#Checking_that_the_fetch_was_successful
|
|
15
|
+
.then(response => {
|
|
16
|
+
if (!response.ok) {
|
|
17
|
+
return response.text().then(message => Promise.reject({ response, message }));
|
|
18
|
+
}
|
|
19
|
+
return response;
|
|
20
|
+
})
|
|
21
|
+
.catch(error => {
|
|
22
|
+
const resp = error && error.response;
|
|
23
|
+
let msg = '';
|
|
24
|
+
|
|
25
|
+
if (resp) { // An HTTP error
|
|
26
|
+
switch (resp.status) {
|
|
27
|
+
case 404: msg = 'Invalid API key or resource not found.';
|
|
28
|
+
break;
|
|
29
|
+
// Don't use resp.statusText since reason phrase is removed in HTTP/2
|
|
30
|
+
default: msg = error.message;
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
} else { // Something else, either an error making the request or a Network error.
|
|
34
|
+
msg = error.message;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (!resp || resp.status !== 403) { // 403's log we'll be handled somewhere else.
|
|
38
|
+
log[request.logErrorsAsInfo ? 'info' : 'error'](`Response status is not OK. Status: ${resp ? resp.status : 'NO_STATUS'}. URL: ${url}. Message: ${msg}`);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// passes `undefined` as statusCode if not an HTTP error (resp === undefined)
|
|
42
|
+
throw new SplitNetworkError(msg, resp && resp.status);
|
|
43
|
+
}) : Promise.reject(new SplitNetworkError(messageNoFetch));
|
|
44
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import objectAssign from 'object-assign';
|
|
2
|
+
|
|
3
|
+
class AttributesCacheInMemory {
|
|
4
|
+
|
|
5
|
+
constructor() {
|
|
6
|
+
this.attributesCache = {};
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Create or update the value for the given attribute
|
|
11
|
+
*
|
|
12
|
+
* @param {string} attributeName attribute name
|
|
13
|
+
* @param {Object} attributeValue attribute value
|
|
14
|
+
* @returns {boolean} the attribute was stored
|
|
15
|
+
*/
|
|
16
|
+
setAttribute(attributeName, attributeValue) {
|
|
17
|
+
this.attributesCache[attributeName] = attributeValue;
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Retrieves the value of a given attribute
|
|
23
|
+
*
|
|
24
|
+
* @param {string} attributeName attribute name
|
|
25
|
+
* @returns {Object?} stored attribute value
|
|
26
|
+
*/
|
|
27
|
+
getAttribute(attributeName) {
|
|
28
|
+
return this.attributesCache[attributeName];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Create or update all the given attributes
|
|
33
|
+
*
|
|
34
|
+
* @param {[string, Object]} attributes attributes to create or update
|
|
35
|
+
* @returns {boolean} attributes were stored
|
|
36
|
+
*/
|
|
37
|
+
setAttributes(attributes) {
|
|
38
|
+
this.attributesCache = objectAssign(this.attributesCache, attributes);
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Retrieve the full attributes map
|
|
44
|
+
*
|
|
45
|
+
* @returns {Map<string, Object>} stored attributes
|
|
46
|
+
*/
|
|
47
|
+
getAll() {
|
|
48
|
+
return this.attributesCache;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Removes a given attribute from the map
|
|
53
|
+
*
|
|
54
|
+
* @param {string} attributeName attribute to remove
|
|
55
|
+
* @returns {boolean} attribute removed
|
|
56
|
+
*/
|
|
57
|
+
removeAttribute(attributeName) {
|
|
58
|
+
if (Object.keys(this.attributesCache).indexOf(attributeName) >= 0) {
|
|
59
|
+
delete this.attributesCache[attributeName];
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Clears all attributes stored in the SDK
|
|
67
|
+
*
|
|
68
|
+
*/
|
|
69
|
+
clear() {
|
|
70
|
+
this.attributesCache = {};
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export default AttributesCacheInMemory;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export default class BaseMetricsAsyncCache {
|
|
2
|
+
/**
|
|
3
|
+
* Async storage caches will always count as empty from an SDK Producer point of view.
|
|
4
|
+
*/
|
|
5
|
+
isEmpty() {
|
|
6
|
+
return true;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* On async storages we will save metrics on Redis but nothing more. No clean ups or consumptions.
|
|
10
|
+
*/
|
|
11
|
+
clear() {
|
|
12
|
+
// noop.
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
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 CountCacheInMemory {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.clear();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
clear() {
|
|
23
|
+
this.counters = {};
|
|
24
|
+
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
state() {
|
|
29
|
+
return this.counters;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
track(metricName) {
|
|
33
|
+
if (this.counters[metricName] === undefined) this.counters[metricName] = 1;
|
|
34
|
+
else this.counters[metricName]++;
|
|
35
|
+
|
|
36
|
+
return this.counters[metricName];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
isEmpty() {
|
|
40
|
+
return Object.keys(this.counters).length === 0;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
toJSON() {
|
|
44
|
+
return this.counters;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export default CountCacheInMemory;
|
|
@@ -0,0 +1,32 @@
|
|
|
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 BaseMetricsAsyncCache from '../BaseMetricsAsyncCache';
|
|
17
|
+
|
|
18
|
+
class CountCacheInRedis extends BaseMetricsAsyncCache {
|
|
19
|
+
constructor(keys, redis) {
|
|
20
|
+
super();
|
|
21
|
+
this.keys = keys;
|
|
22
|
+
this.redis = redis;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
track(metricName) {
|
|
26
|
+
return this.redis.incr(this.keys.buildCountKey(metricName)).catch(() => {
|
|
27
|
+
// noop, for telemetry metrics there's no need to throw.
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export default CountCacheInRedis;
|
|
@@ -0,0 +1,99 @@
|
|
|
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
|
+
import thenable from '../../utils/promise/thenable';
|
|
18
|
+
|
|
19
|
+
const MAX_QUEUE_BYTE_SIZE = 5 * 1024 * 1024; // 5M
|
|
20
|
+
|
|
21
|
+
class EventsCache {
|
|
22
|
+
|
|
23
|
+
constructor(context) {
|
|
24
|
+
const settings = context.get(context.constants.SETTINGS);
|
|
25
|
+
const eventsModule = context.get(context.constants.EVENTS);
|
|
26
|
+
|
|
27
|
+
this.onFullQueue = false;
|
|
28
|
+
this.maxQueue = settings.scheduler.eventsQueueSize;
|
|
29
|
+
this.queue = [];
|
|
30
|
+
this.queueByteSize = 0;
|
|
31
|
+
|
|
32
|
+
if (thenable(eventsModule)) {
|
|
33
|
+
eventsModule.then(events => {
|
|
34
|
+
this.onFullQueue = events.flushAndResetTimer;
|
|
35
|
+
this._checkForFlush(); // Events is ready, check the queue.
|
|
36
|
+
});
|
|
37
|
+
} else if (typeof eventsModule.flushAndResetTimer === 'function') {
|
|
38
|
+
this.onFullQueue = eventsModule.flushAndResetTimer;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Get the current state of the queue.
|
|
44
|
+
*/
|
|
45
|
+
state() {
|
|
46
|
+
return this.queue;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Add a new event object at the end of the queue.
|
|
51
|
+
*/
|
|
52
|
+
track(data, size = 0) {
|
|
53
|
+
this.queueByteSize += size;
|
|
54
|
+
this.queue.push(data);
|
|
55
|
+
|
|
56
|
+
this._checkForFlush();
|
|
57
|
+
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Clear the data stored on the cache.
|
|
63
|
+
*/
|
|
64
|
+
clear() {
|
|
65
|
+
this.queue = [];
|
|
66
|
+
this.queueByteSize = 0;
|
|
67
|
+
|
|
68
|
+
return this;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Returns the payload we will use for posting data.
|
|
73
|
+
*/
|
|
74
|
+
toJSON() {
|
|
75
|
+
return this.queue;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Check if the cache is empty.
|
|
80
|
+
*/
|
|
81
|
+
isEmpty() {
|
|
82
|
+
return this.queue.length === 0;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Check if the cache queue is full and we need to flush it.
|
|
87
|
+
*/
|
|
88
|
+
_checkForFlush() {
|
|
89
|
+
if (
|
|
90
|
+
(this.queueByteSize > MAX_QUEUE_BYTE_SIZE) ||
|
|
91
|
+
// 0 means no maximum value, in case we want to avoid this being triggered. Size limit is not affected by it.
|
|
92
|
+
(this.maxQueue > 0 && this.queue.length >= this.maxQueue)
|
|
93
|
+
) {
|
|
94
|
+
this.onFullQueue && this.onFullQueue();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export default EventsCache;
|
|
@@ -0,0 +1,62 @@
|
|
|
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 logFactory from '../../utils/logger';
|
|
17
|
+
const log = logFactory('splitio-storage:redis');
|
|
18
|
+
|
|
19
|
+
class EventsCache {
|
|
20
|
+
constructor(keys, redis, meta) {
|
|
21
|
+
this.keys = keys;
|
|
22
|
+
this.redis = redis;
|
|
23
|
+
this.meta = meta;
|
|
24
|
+
|
|
25
|
+
this.eventsKey = keys.buildEventsKey();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Add a new event object into the queue.
|
|
30
|
+
*/
|
|
31
|
+
track(eventData) {
|
|
32
|
+
return this.redis.rpush(
|
|
33
|
+
this.eventsKey,
|
|
34
|
+
this._toJSON(eventData)
|
|
35
|
+
)
|
|
36
|
+
// We use boolean values to signal successful queueing
|
|
37
|
+
.then(() => true)
|
|
38
|
+
.catch(err => {
|
|
39
|
+
log.error(`Error adding event to queue: ${err}.`);
|
|
40
|
+
return false;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Generates the JSON as we'll store it on Redis.
|
|
46
|
+
*/
|
|
47
|
+
_toJSON(eventData) {
|
|
48
|
+
return JSON.stringify({
|
|
49
|
+
m: this.meta,
|
|
50
|
+
e: eventData
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* We are returning true because the go syncronizer push the impressions from redis.
|
|
56
|
+
*/
|
|
57
|
+
isEmpty() {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export default EventsCache;
|
|
@@ -0,0 +1,62 @@
|
|
|
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 ImpressionsCacheInMemory {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.queue = [];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Get collected data
|
|
24
|
+
*/
|
|
25
|
+
state() {
|
|
26
|
+
return this.queue;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Store objects in sequential order
|
|
31
|
+
*/
|
|
32
|
+
track(data) {
|
|
33
|
+
this.queue.push(...data);
|
|
34
|
+
|
|
35
|
+
return this;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Recycle the collector queue
|
|
40
|
+
*/
|
|
41
|
+
clear() {
|
|
42
|
+
this.queue.length = 0;
|
|
43
|
+
|
|
44
|
+
return this;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Hook JSON.stringify to expose the state of the counters
|
|
49
|
+
*/
|
|
50
|
+
toJSON() {
|
|
51
|
+
return this.queue;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Check if the is data changed from the defaults
|
|
56
|
+
*/
|
|
57
|
+
isEmpty() {
|
|
58
|
+
return this.queue.length === 0;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export default ImpressionsCacheInMemory;
|