launchdarkly-js-sdk-common 4.0.0 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.circleci/config.yml +22 -0
- package/.eslintignore +4 -0
- package/.eslintrc.yaml +104 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- package/.github/pull_request_template.md +21 -0
- package/.ldrelease/config.yml +24 -0
- package/.prettierignore +1 -0
- package/.prettierrc +5 -0
- package/CHANGELOG.md +4 -0
- package/CONTRIBUTING.md +45 -0
- package/babel.config.js +18 -0
- package/docs/typedoc.js +11 -0
- package/jest.config.js +15 -0
- package/package.json +3 -29
- package/scripts/better-audit.sh +76 -0
- package/src/EventEmitter.js +60 -0
- package/src/EventProcessor.js +175 -0
- package/src/EventSender.js +87 -0
- package/src/EventSummarizer.js +84 -0
- package/src/Identity.js +26 -0
- package/src/InitializationState.js +83 -0
- package/src/PersistentFlagStore.js +50 -0
- package/src/PersistentStorage.js +81 -0
- package/src/Requestor.js +111 -0
- package/src/Stream.js +154 -0
- package/src/UserFilter.js +75 -0
- package/src/UserValidator.js +56 -0
- package/src/__tests__/.eslintrc.yaml +7 -0
- package/src/__tests__/EventProcessor-test.js +559 -0
- package/src/__tests__/EventSender-test.js +252 -0
- package/src/__tests__/EventSource-mock.js +61 -0
- package/src/__tests__/EventSummarizer-test.js +103 -0
- package/src/__tests__/LDClient-events-test.js +757 -0
- package/src/__tests__/LDClient-localstorage-test.js +179 -0
- package/src/__tests__/LDClient-streaming-test.js +683 -0
- package/src/__tests__/LDClient-test.js +761 -0
- package/src/__tests__/PersistentFlagStore-test.js +111 -0
- package/src/__tests__/Requestor-test.js +362 -0
- package/src/__tests__/Stream-test.js +299 -0
- package/src/__tests__/UserFilter-test.js +93 -0
- package/src/__tests__/UserValidator-test.js +57 -0
- package/src/__tests__/configuration-test.js +217 -0
- package/src/__tests__/diagnosticEvents-test.js +449 -0
- package/src/__tests__/loggers-test.js +149 -0
- package/src/__tests__/mockHttp.js +122 -0
- package/src/__tests__/promiseCoalescer-test.js +128 -0
- package/src/__tests__/stubPlatform.js +148 -0
- package/src/__tests__/testUtils.js +77 -0
- package/src/__tests__/utils-test.js +148 -0
- package/src/configuration.js +151 -0
- package/src/diagnosticEvents.js +269 -0
- package/src/errors.js +37 -0
- package/src/index.js +772 -0
- package/src/jest.setup.js +1 -0
- package/src/loggers.js +93 -0
- package/src/messages.js +217 -0
- package/src/promiseCoalescer.js +52 -0
- package/src/utils.js +214 -0
- package/test-types.ts +96 -0
- package/tsconfig.json +13 -0
- package/dist/ldclient-common.cjs.js +0 -2
- package/dist/ldclient-common.cjs.js.map +0 -1
- package/dist/ldclient-common.es.js +0 -2
- package/dist/ldclient-common.es.js.map +0 -1
- package/dist/ldclient-common.min.js +0 -2
- package/dist/ldclient-common.min.js.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
function e(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function n(n){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?e(Object(i),!0).forEach((function(e){r(n,e,i[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(i)):e(Object(i)).forEach((function(e){Object.defineProperty(n,e,Object.getOwnPropertyDescriptor(i,e))}))}return n}function t(e){return(t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e){return function(e){if(Array.isArray(e))return o(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,n){if(!e)return;if("string"==typeof e)return o(e,n);var t=Object.prototype.toString.call(e).slice(8,-1);"Object"===t&&e.constructor&&(t=e.constructor.name);if("Map"===t||"Set"===t)return Array.from(e);if("Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return o(e,n)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function o(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=new Array(n);t<n;t++)r[t]=e[t];return r}function a(e){function n(e,n){Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor),this.message=e,this.code=n}return n.prototype=new Error,n.prototype.name=e,n.prototype.constructor=n,n}var u=a("LaunchDarklyUnexpectedResponseError"),s=a("LaunchDarklyInvalidEnvironmentIdError"),c=a("LaunchDarklyInvalidUserError"),l=a("LaunchDarklyInvalidEventKeyError"),f=a("LaunchDarklyInvalidArgumentError"),v=a("LaunchDarklyFlagFetchError");function d(e){return!(e>=400&&e<500)||(400===e||408===e||429===e)}for(var g=Object.freeze({__proto__:null,LDUnexpectedResponseError:u,LDInvalidEnvironmentIdError:s,LDInvalidUserError:c,LDInvalidEventKeyError:l,LDInvalidArgumentError:f,LDFlagFetchError:v,isHttpErrorRecoverable:d}),p=function(e){for(var n,t=e.length,r=t%3,i=[],o=0,a=t-r;o<a;o+=16383)i.push(E(e,o,o+16383>a?a:o+16383));1===r?(n=e[t-1],i.push(m[n>>2]+m[n<<4&63]+"==")):2===r&&(n=(e[t-2]<<8)+e[t-1],i.push(m[n>>10]+m[n>>4&63]+m[n<<2&63]+"="));return i.join("")},m=[],h=[],y="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",b=0,k=y.length;b<k;++b)m[b]=y[b],h[y.charCodeAt(b)]=b;function E(e,n,t){for(var r,i,o=[],a=n;a<t;a+=3)r=(e[a]<<16&16711680)+(e[a+1]<<8&65280)+(255&e[a+2]),o.push(m[(i=r)>>18&63]+m[i>>12&63]+m[i>>6&63]+m[63&i]);return o.join("")}h["-".charCodeAt(0)]=62,h["_".charCodeAt(0)]=63;var w=Array.isArray,D=Object.keys,O=Object.prototype.hasOwnProperty,S=["key","secondary","ip","country","email","firstName","lastName","avatar","name"];function U(e){var n=unescape(encodeURIComponent(e));return p(function(e){for(var n=[],t=0;t<e.length;t++)n.push(e.charCodeAt(t));return n}(n))}function P(e){return U(e).replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}function I(e){return JSON.parse(JSON.stringify(e))}function j(e,n){return function e(n,t){if(n===t)return!0;if(n&&t&&"object"==typeof n&&"object"==typeof t){var r,i,o,a=w(n),u=w(t);if(a&&u){if((i=n.length)!=t.length)return!1;for(r=i;0!=r--;)if(!e(n[r],t[r]))return!1;return!0}if(a!=u)return!1;var s=n instanceof Date,c=t instanceof Date;if(s!=c)return!1;if(s&&c)return n.getTime()==t.getTime();var l=n instanceof RegExp,f=t instanceof RegExp;if(l!=f)return!1;if(l&&f)return n.toString()==t.toString();var v=D(n);if((i=v.length)!==D(t).length)return!1;for(r=i;0!=r--;)if(!O.call(t,v[r]))return!1;for(r=i;0!=r--;)if(!e(n[o=v[r]],t[o]))return!1;return!0}return n!=n&&t!=t}(e,n)}function R(e){setTimeout(e,0)}function T(e,n){var t=e.then((function(e){return n&&setTimeout((function(){n(null,e)}),0),e}),(function(e){if(!n)return Promise.reject(e);setTimeout((function(){n(e,null)}),0)}));return n?void 0:t}function A(e){var n={};for(var t in e)V(e,t)&&(n[t]={value:e[t],version:0});return n}function C(e){var n={};for(var t in e)V(e,t)&&(n[t]=e[t].value);return n}function N(e,n){for(var t,r=n.slice(0),i=[],o=e;r.length>0;){for(t=[];o>0;){var a=r.shift();if(!a)break;(o-=P(JSON.stringify(a)).length)<0&&t.length>0?r.unshift(a):t.push(a)}o=e,i.push(t)}return i}function L(e){var n=e.version||"4.0.0";return e.userAgent+"/"+n}function F(e,n){if(n&&!n.sendLDHeaders)return{};var t={"X-LaunchDarkly-User-Agent":L(e)};return n&&n.wrapperName&&(t["X-LaunchDarkly-Wrapper"]=n.wrapperVersion?n.wrapperName+"/"+n.wrapperVersion:n.wrapperName),t}function x(e,t){return t&&t.requestHeaderTransform?t.requestHeaderTransform(n({},e)):e}function q(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];return t.reduce((function(e,t){return n(n({},e),t)}),{})}function V(e,n){return Object.prototype.hasOwnProperty.call(e,n)}function _(e){if(!e)return e;var t;for(var r in S){var i=S[r],o=e[i];void 0!==o&&"string"!=typeof o&&((t=t||n({},e))[i]=String(o))}return t||e}var z=Object.freeze({__proto__:null,btoa:U,base64URLEncode:P,clone:I,deepEquals:j,onNextTick:R,wrapPromiseCallback:T,transformValuesToVersionedValues:A,transformVersionedValuesToValues:C,chunkUserEventsForUrl:N,getLDUserAgentString:L,getLDHeaders:F,transformHeaders:x,extend:q,objectHasOwnProperty:V,sanitizeUser:_}),J=require("uuid").v1;function M(e,n,t){var r="/a/"+n+".gif",i=q({"Content-Type":"application/json"},F(e,t)),o=e.httpFallbackPing,a={};return a.sendChunk=function(n,a,u,s){var c=JSON.stringify(n),l=u?null:J();return s?function n(r){var o=u?i:q({},i,{"X-LaunchDarkly-Event-Schema":"3","X-LaunchDarkly-Payload-ID":l});return e.httpRequest("POST",a,x(o,t),c).promise.then((function(e){if(e)return e.status>=400&&d(e.status)&&r?n(!1):function(e){var n={status:e.status},t=e.header("date");if(t){var r=Date.parse(t);r&&(n.serverTime=r)}return n}(e)})).catch((function(){return r?n(!1):Promise.reject()}))}(!0).catch((function(){})):(o&&o(a+r+"?d="+P(c)),Promise.resolve())},a.sendEvents=function(n,t,r){if(!e.httpRequest)return Promise.resolve();var i,o=e.httpAllowsPost();i=o?[n]:N(2e3-t.length,n);for(var u=[],s=0;s<i.length;s++)u.push(a.sendChunk(i[s],t,r,o));return Promise.all(u)},a}function K(){var e={},n=0,t=0,r={};return e.summarizeEvent=function(e){if("feature"===e.kind){var i=e.key+":"+(null!==e.variation&&void 0!==e.variation?e.variation:"")+":"+(null!==e.version&&void 0!==e.version?e.version:""),o=r[i];o?o.count=o.count+1:r[i]={count:1,key:e.key,variation:e.variation,version:e.version,value:e.value,default:e.default},(0===n||e.creationDate<n)&&(n=e.creationDate),e.creationDate>t&&(t=e.creationDate)}},e.getSummary=function(){var e={},i=!0;for(var o in r){var a=r[o],u=e[a.key];u||(u={default:a.default,counters:[]},e[a.key]=u);var s={value:a.value,count:a.count};void 0!==a.variation&&null!==a.variation&&(s.variation=a.variation),a.version?s.version=a.version:s.unknown=!0,u.counters.push(s),i=!1}return i?null:{startDate:n,endDate:t,features:e}},e.clearSummary=function(){n=0,t=0,r={}},e}function $(e){var n={},t=e.allAttributesPrivate,r=e.privateAttributeNames||[],i={key:!0,custom:!0,anonymous:!0},o={key:!0,secondary:!0,ip:!0,country:!0,email:!0,firstName:!0,lastName:!0,avatar:!0,name:!0,anonymous:!0,custom:!0};return n.filterUser=function(e){if(!e)return null;var n=e.privateAttributeNames||[],a=function(e,o){return Object.keys(e).reduce((function(a,u){var s=a;return o(u)&&(!function(e){return!i[e]&&(t||-1!==n.indexOf(e)||-1!==r.indexOf(e))}(u)?s[0][u]=e[u]:s[1][u]=!0),s}),[{},{}])},u=a(e,(function(e){return o[e]})),s=u[0],c=u[1];if(e.custom){var l=a(e.custom,(function(){return!0}));s.custom=l[0],c=q({},c,l[1])}var f=Object.keys(c);return f.length&&(f.sort(),s.privateAttrs=f),s},n}function H(e){return e&&e.message?e.message:"string"==typeof e||e instanceof String?e:JSON.stringify(e)}var B=function(){return"LaunchDarkly client initialized"},G=" Please see https://docs.launchdarkly.com/sdk/client-side/javascript#initializing-the-client for instructions on SDK initialization.",X=function(){return"Exceeded event queue capacity. Increase capacity to avoid dropping events."},W=function(){return"Be sure to call `identify` in the LaunchDarkly client: https://docs.launchdarkly.com/sdk/features/identify#javascript"},Q=function(e){return'Expected application/json content type but got "'+e+'"'},Y=function(e){return"local storage is unavailable: "+H(e)},Z=function(e){return"network error"+(e?" ("+e+")":"")},ee=function(e){return'Custom event "'+e+'" does not exist'},ne=function(){return"Environment not found. Double check that you specified a valid environment/client-side ID."+G},te=function(){return"No environment/client-side ID was specified."+G},re=function(e){return"Error fetching flag settings: "+H(e)},ie=function(){return"No user specified."+G},oe=function(){return"Invalid user specified."+G},ae=function(){return"LaunchDarkly client was initialized with bootstrap data that did not include flag metadata. Events may not be sent correctly."+G},ue=function(){return"LaunchDarkly bootstrap data is not available because the back end could not read the flags."},se=function(e,n){return n?'"'+e+'" is deprecated, please use "'+n+'"':'"'+e+'" is deprecated'},ce=function(e,n,t){return"Received error "+e+(401===e?" (invalid SDK key)":"")+" for "+n+" - "+(d(e)?t:"giving up permanently")},le=function(){return"Cannot make HTTP requests in this environment."+G},fe=function(){return"identify() has no effect here; it must be called on the main client instance"},ve=function(){return"Closing stream connection"},de=function(e){return"Opening stream connection to "+e},ge=function(e,n){return"Error on stream connection: "+H(e)+", will continue retrying every "+n+" milliseconds."},pe=function(e){return'Ignoring unknown config option "'+e+'"'},me=function(e,n,t){return'Config option "'+e+'" should be of type '+n+", got "+t+", using default value"},he=function(e,n){return'Config option "'+e+'" should be a boolean, got '+n+", converting to boolean"},ye=function(e,n,t){return'Config option "'+e+'" was set to '+n+", changing to minimum value of "+t},be=function(e){return"polling for feature flags at "+e},ke=function(){return"received ping message from stream"},Ee=function(){return"received streaming update for all flags"},we=function(e){return'received streaming update for flag "'+e+'"'},De=function(e){return'received streaming update for flag "'+e+'" but ignored due to version check'},Oe=function(e){return'received streaming deletion for flag "'+e+'"'},Se=function(e){return'received streaming deletion for flag "'+e+'" but ignored due to version check'},Ue=function(e){return'enqueueing "'+e+'" event'},Pe=function(e){return"sending "+e+" events"},Ie=Object.freeze({__proto__:null,clientInitialized:B,clientNotReady:function(){return"LaunchDarkly client is not ready"},eventCapacityExceeded:X,eventWithoutUser:W,invalidContentType:Q,invalidKey:function(){return"Event key must be a string"},localStorageUnavailable:Y,networkError:Z,unknownCustomEventKey:ee,environmentNotFound:ne,environmentNotSpecified:te,errorFetchingFlags:re,userNotSpecified:ie,invalidUser:oe,bootstrapOldFormat:ae,bootstrapInvalid:ue,deprecated:se,httpErrorMessage:ce,httpUnavailable:le,identifyDisabled:fe,streamClosing:ve,streamConnecting:de,streamError:ge,unknownOption:pe,wrongOptionType:me,wrongOptionTypeBoolean:he,optionBelowMinimum:ye,debugPolling:be,debugStreamPing:ke,debugStreamPut:Ee,debugStreamPatch:we,debugStreamPatchIgnored:De,debugStreamDelete:Oe,debugStreamDeleteIgnored:Se,debugEnqueueingEvent:Ue,debugPostingEvents:Pe,debugPostingDiagnosticEvent:function(e){return"sending diagnostic event ("+e.kind+")"}});function je(e){var n={},t={};return n.on=function(e,n,r){t[e]=t[e]||[],t[e]=t[e].concat({handler:n,context:r})},n.off=function(e,n,r){if(t[e])for(var i=0;i<t[e].length;i++)t[e][i].handler===n&&t[e][i].context===r&&(t[e]=t[e].slice(0,i).concat(t[e].slice(i+1)))},n.emit=function(e){if(t[e])for(var n=t[e].slice(0),r=0;r<n.length;r++)n[r].handler.apply(n[r].context,Array.prototype.slice.call(arguments,1))},n.getEvents=function(){return Object.keys(t)},n.getEventListenerCount=function(e){return t[e]?t[e].length:0},n.maybeReportError=function(n){n&&(t["error"]?this.emit("error",n):(e||console).error(n.message))},n}var Re=function(e){var n=!1,t=!1,r=null,i=null,o=new Promise((function(n){e.on("ready",(function t(){e.off("ready",t),n()}))})).catch((function(){}));return{getInitializationPromise:function(){return i||(n?Promise.resolve():t?Promise.reject(r):i=new Promise((function(n,t){e.on("initialized",(function t(){e.off("initialized",t),n()})),e.on("failed",(function n(r){e.off("failed",n),t(r)}))})))},getReadyPromise:function(){return o},signalSuccess:function(){n||t||(n=!0,e.emit("initialized"),e.emit("ready"))},signalFailure:function(i){n||t||(t=!0,r=i,e.emit("failed",i),e.emit("ready")),e.maybeReportError(i)}}};function Te(e,n,t,r){var i={};function o(){var e="",i=r.getUser();return i&&(e=t||U(JSON.stringify(i))),"ld:"+n+":"+e}return i.loadFlags=function(){return e.get(o()).then((function(e){if(null==e)return null;try{var n=JSON.parse(e);if(n){var t=n.$schema;void 0===t||t<1?n=A(n):delete n.$schema}return n}catch(e){return i.clearFlags().then((function(){return null}))}}))},i.saveFlags=function(n){var t=q({},n,{$schema:1});return e.set(o(),JSON.stringify(t))},i.clearFlags=function(){return e.clear(o())},i}function Ae(e,n,t,r){var i,o=n.streamUrl,a=n.logger,u={},s=o+"/eval/"+t,c=n.useReport,l=n.evaluationReasons,f=n.streamReconnectDelay,v=F(e,n),d=!1,g=null,p=null,m=null,h=null,y=null;function b(e){d||(a.warn(ge(e,f)),d=!0),D(!1),w(),k(f)}function k(e){p||(e?p=setTimeout(E,e):E())}function E(){var r;p=null;var u="",f={headers:v,readTimeoutMillis:3e5};if(e.eventSourceFactory){for(var d in null!=h&&(u="h="+h),c?e.eventSourceAllowsReport?(r=s,f.method="REPORT",f.headers["Content-Type"]="application/json",f.body=JSON.stringify(m)):(r=o+"/ping/"+t,u=""):r=s+"/"+P(JSON.stringify(m)),f.headers=x(f.headers,n),l&&(u=u+(u?"&":"")+"withReasons=true"),r=r+(u?"?":"")+u,w(),a.info(de(r)),i=(new Date).getTime(),g=e.eventSourceFactory(r,f),y)V(y,d)&&g.addEventListener(d,y[d]);g.onerror=b}}function w(){g&&(a.info("Closing stream connection"),g.close(),g=null)}function D(e){i&&r&&r.recordStreamInit(i,!e,(new Date).getTime()-i),i=null}return u.connect=function(e,n,t){m=e,h=n,y={};var r=function(e){y[e]=function(n){d=!1,D(!0),t[e]&&t[e](n)}};for(var i in t||{})r(i);k()},u.disconnect=function(){clearTimeout(p),p=null,w()},u.isConnected=function(){return!!(g&&e.eventSourceIsActive&&e.eventSourceIsActive(g))},u}function Ce(e,n,t){var r=n.baseUrl,i=n.useReport,o=n.evaluationReasons,a=n.logger,u={},c={};function l(t,r){if(!e.httpRequest)return new Promise((function(e,n){n(new v(le()))}));var i=r?"REPORT":"GET",o=F(e,n);r&&(o["Content-Type"]="application/json");var a=c[t];a||(a=function(e){var n,t,r,i,o={addPromise:function(o,a){n=o,t&&t(),t=a,o.then((function(t){n===o&&(r(t),e&&e())}),(function(t){n===o&&(i(t),e&&e())}))}};return o.resultPromise=new Promise((function(e,n){r=e,i=n})),o}((function(){delete c[t]})),c[t]=a);var u=e.httpRequest(i,t,x(o,n),r),l=u.promise.then((function(e){if(200===e.status){if(e.header("content-type")&&"application/json"===e.header("content-type").substring(0,"application/json".length))return JSON.parse(e.body);var n=Q(e.header("content-type")||"");return Promise.reject(new v(n))}return Promise.reject(function(e){return 404===e.status?new s(ne()):new v(re(e.statusText||String(e.status)))}(e))}),(function(e){return Promise.reject(new v(Z(e)))}));return a.addPromise(l,(function(){u.cancel&&u.cancel()})),a.resultPromise}return u.fetchJSON=function(e){return l(r+e,null)},u.fetchFlagSettings=function(e,n){var u,s,c,f="";return i?(s=[r,"/sdk/evalx/",t,"/user"].join(""),c=JSON.stringify(e)):(u=P(JSON.stringify(e)),s=[r,"/sdk/evalx/",t,"/users/",u].join("")),n&&(f="h="+n),o&&(f=f+(f?"&":"")+"withReasons=true"),s=s+(f?"?":"")+f,a.debug(be(s)),l(s,c)},u}var Ne=require("uuid").v1;function Le(e){var n={};return n.validateUser=function(n){if(!n)return Promise.reject(new c(ie()));var t=I(n);return null!==t.key&&void 0!==t.key?(t.key=t.key.toString(),Promise.resolve(t)):t.anonymous?e.get("ld:$anonUserId").then((function(n){if(n)return t.key=n,t;var r=Ne();return t.key=r,function(n){return e.set("ld:$anonUserId",n)}(r).then((function(){return t}))})):Promise.reject(new c(oe()))},n}var Fe=["debug","info","warn","error","none"];function xe(e,n){if(e&&e.destination&&"function"!=typeof e.destination)throw new Error("destination for basicLogger was set to a non-function");function t(e){return function(n){console&&console[e]&&console[e].call(console,n)}}var r=e&&e.destination?[e.destination,e.destination,e.destination,e.destination]:[t("log"),t("info"),t("warn"),t("error")],o=!(!e||!e.destination),a=e&&void 0!==e.prefix&&null!==e.prefix?e.prefix:"[LaunchDarkly] ",u=1;if(e&&e.level)for(var s=0;s<Fe.length;s++)Fe[s]===e.level&&(u=s);function c(e,t,u){if(!(u.length<1)){var s,c=o?t+": "+a:a;if(1!==u.length&&n){var l=i(u);l[0]=c+l[0],s=n.apply(void 0,i(l))}else s=c+u[0];try{r[e](s)}catch(e){console&&console.log&&console.log("[LaunchDarkly] Configured logger's "+t+" method threw an exception: "+e)}}}for(var l={},f=function(e){var n=Fe[e];if("none"!==n)if(e<u)l[n]=function(){};else{var t=e;l[n]=function(){c(t,n,arguments)}}},v=0;v<Fe.length;v++)f(v);return l}var qe={baseUrl:{default:"https://app.launchdarkly.com"},streamUrl:{default:"https://clientstream.launchdarkly.com"},eventsUrl:{default:"https://events.launchdarkly.com"},sendEvents:{default:!0},streaming:{type:"boolean"},sendLDHeaders:{default:!0},requestHeaderTransform:{type:"function"},inlineUsersInEvents:{default:!1},allowFrequentDuplicateEvents:{default:!1},sendEventsOnlyForVariation:{default:!1},useReport:{default:!1},evaluationReasons:{default:!1},eventCapacity:{default:100,minimum:1},flushInterval:{default:2e3,minimum:2e3},samplingInterval:{default:0,minimum:0},streamReconnectDelay:{default:1e3,minimum:0},allAttributesPrivate:{default:!1},privateAttributeNames:{default:[]},bootstrap:{type:"string|object"},diagnosticRecordingInterval:{default:9e5,minimum:2e3},diagnosticOptOut:{default:!1},wrapperName:{type:"string"},wrapperVersion:{type:"string"},stateProvider:{type:"object"},autoAliasingOptOut:{default:!1}};function Ve(e,n,r,i){var o=q({logger:{default:i}},qe,r),a={};function u(e){R((function(){n&&n.maybeReportError(new f(e))}))}var s=q({},e||{});return function(e){var n=e;Object.keys(a).forEach((function(e){if(void 0!==n[e]){var t=a[e];i&&i.warn(se(e,t)),t&&(void 0===n[t]&&(n[t]=n[e]),delete n[e])}}))}(s),function(e){Fe.forEach((function(n){if("none"!==n&&(!e[n]||"function"!=typeof e[n]))throw new Error("Provided logger instance must support logger."+n+"(...) method")}))}((s=function(e){var n=q({},e),r=function(e){if(null===e)return"any";if(void 0!==e){if(Array.isArray(e))return"array";var n=t(e);return"boolean"===n||"string"===n||"number"===n||"function"===n?n:"object"}};return Object.keys(e).forEach((function(t){var i=e[t];if(null!=i){var a=o[t];if(void 0===a)u(pe(t));else{var s=a.type||r(a.default);if("any"!==s){var c=s.split("|"),l=r(i);c.indexOf(l)<0?"boolean"===s?(n[t]=!!i,u(he(t,l))):(u(me(t,s,l)),n[t]=a.default):"number"===l&&void 0!==a.minimum&&i<a.minimum&&(u(ye(t,i,a.minimum)),n[t]=a.minimum)}}}})),n}(s=function(e){var n=q({},e);return Object.keys(o).forEach((function(e){void 0!==n[e]&&null!==n[e]||(n[e]=o[e]&&o[e].default)})),n}(s))).logger),s}var _e,ze=Object.freeze({__proto__:null,baseOptionDefs:qe,validate:Ve}),Je=new Uint8Array(16);function Me(){if(!_e&&!(_e="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return _e(Je)}var Ke=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function $e(e){return"string"==typeof e&&Ke.test(e)}for(var He,Be,Ge=[],Xe=0;Xe<256;++Xe)Ge.push((Xe+256).toString(16).substr(1));function We(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,t=(Ge[e[n+0]]+Ge[e[n+1]]+Ge[e[n+2]]+Ge[e[n+3]]+"-"+Ge[e[n+4]]+Ge[e[n+5]]+"-"+Ge[e[n+6]]+Ge[e[n+7]]+"-"+Ge[e[n+8]]+Ge[e[n+9]]+"-"+Ge[e[n+10]]+Ge[e[n+11]]+Ge[e[n+12]]+Ge[e[n+13]]+Ge[e[n+14]]+Ge[e[n+15]]).toLowerCase();if(!$e(t))throw TypeError("Stringified UUID is invalid");return t}var Qe=0,Ye=0;function Ze(e){if(!$e(e))throw TypeError("Invalid UUID");var n,t=new Uint8Array(16);return t[0]=(n=parseInt(e.slice(0,8),16))>>>24,t[1]=n>>>16&255,t[2]=n>>>8&255,t[3]=255&n,t[4]=(n=parseInt(e.slice(9,13),16))>>>8,t[5]=255&n,t[6]=(n=parseInt(e.slice(14,18),16))>>>8,t[7]=255&n,t[8]=(n=parseInt(e.slice(19,23),16))>>>8,t[9]=255&n,t[10]=(n=parseInt(e.slice(24,36),16))/1099511627776&255,t[11]=n/4294967296&255,t[12]=n>>>24&255,t[13]=n>>>16&255,t[14]=n>>>8&255,t[15]=255&n,t}function en(e,n,t){function r(e,r,i,o){if("string"==typeof e&&(e=function(e){e=unescape(encodeURIComponent(e));for(var n=[],t=0;t<e.length;++t)n.push(e.charCodeAt(t));return n}(e)),"string"==typeof r&&(r=Ze(r)),16!==r.length)throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");var a=new Uint8Array(16+e.length);if(a.set(r),a.set(e,r.length),(a=t(a))[6]=15&a[6]|n,a[8]=63&a[8]|128,i){o=o||0;for(var u=0;u<16;++u)i[o+u]=a[u];return i}return We(a)}try{r.name=e}catch(e){}return r.DNS="6ba7b810-9dad-11d1-80b4-00c04fd430c8",r.URL="6ba7b811-9dad-11d1-80b4-00c04fd430c8",r}function nn(e){return 14+(e+64>>>9<<4)+1}function tn(e,n){var t=(65535&e)+(65535&n);return(e>>16)+(n>>16)+(t>>16)<<16|65535&t}function rn(e,n,t,r,i,o){return tn((a=tn(tn(n,e),tn(r,o)))<<(u=i)|a>>>32-u,t);var a,u}function on(e,n,t,r,i,o,a){return rn(n&t|~n&r,e,n,i,o,a)}function an(e,n,t,r,i,o,a){return rn(n&r|t&~r,e,n,i,o,a)}function un(e,n,t,r,i,o,a){return rn(n^t^r,e,n,i,o,a)}function sn(e,n,t,r,i,o,a){return rn(t^(n|~r),e,n,i,o,a)}var cn=en("v3",48,(function(e){if("string"==typeof e){var n=unescape(encodeURIComponent(e));e=new Uint8Array(n.length);for(var t=0;t<n.length;++t)e[t]=n.charCodeAt(t)}return function(e){for(var n=[],t=32*e.length,r=0;r<t;r+=8){var i=e[r>>5]>>>r%32&255,o=parseInt("0123456789abcdef".charAt(i>>>4&15)+"0123456789abcdef".charAt(15&i),16);n.push(o)}return n}(function(e,n){e[n>>5]|=128<<n%32,e[nn(n)-1]=n;for(var t=1732584193,r=-271733879,i=-1732584194,o=271733878,a=0;a<e.length;a+=16){var u=t,s=r,c=i,l=o;t=on(t,r,i,o,e[a],7,-680876936),o=on(o,t,r,i,e[a+1],12,-389564586),i=on(i,o,t,r,e[a+2],17,606105819),r=on(r,i,o,t,e[a+3],22,-1044525330),t=on(t,r,i,o,e[a+4],7,-176418897),o=on(o,t,r,i,e[a+5],12,1200080426),i=on(i,o,t,r,e[a+6],17,-1473231341),r=on(r,i,o,t,e[a+7],22,-45705983),t=on(t,r,i,o,e[a+8],7,1770035416),o=on(o,t,r,i,e[a+9],12,-1958414417),i=on(i,o,t,r,e[a+10],17,-42063),r=on(r,i,o,t,e[a+11],22,-1990404162),t=on(t,r,i,o,e[a+12],7,1804603682),o=on(o,t,r,i,e[a+13],12,-40341101),i=on(i,o,t,r,e[a+14],17,-1502002290),r=on(r,i,o,t,e[a+15],22,1236535329),t=an(t,r,i,o,e[a+1],5,-165796510),o=an(o,t,r,i,e[a+6],9,-1069501632),i=an(i,o,t,r,e[a+11],14,643717713),r=an(r,i,o,t,e[a],20,-373897302),t=an(t,r,i,o,e[a+5],5,-701558691),o=an(o,t,r,i,e[a+10],9,38016083),i=an(i,o,t,r,e[a+15],14,-660478335),r=an(r,i,o,t,e[a+4],20,-405537848),t=an(t,r,i,o,e[a+9],5,568446438),o=an(o,t,r,i,e[a+14],9,-1019803690),i=an(i,o,t,r,e[a+3],14,-187363961),r=an(r,i,o,t,e[a+8],20,1163531501),t=an(t,r,i,o,e[a+13],5,-1444681467),o=an(o,t,r,i,e[a+2],9,-51403784),i=an(i,o,t,r,e[a+7],14,1735328473),r=an(r,i,o,t,e[a+12],20,-1926607734),t=un(t,r,i,o,e[a+5],4,-378558),o=un(o,t,r,i,e[a+8],11,-2022574463),i=un(i,o,t,r,e[a+11],16,1839030562),r=un(r,i,o,t,e[a+14],23,-35309556),t=un(t,r,i,o,e[a+1],4,-1530992060),o=un(o,t,r,i,e[a+4],11,1272893353),i=un(i,o,t,r,e[a+7],16,-155497632),r=un(r,i,o,t,e[a+10],23,-1094730640),t=un(t,r,i,o,e[a+13],4,681279174),o=un(o,t,r,i,e[a],11,-358537222),i=un(i,o,t,r,e[a+3],16,-722521979),r=un(r,i,o,t,e[a+6],23,76029189),t=un(t,r,i,o,e[a+9],4,-640364487),o=un(o,t,r,i,e[a+12],11,-421815835),i=un(i,o,t,r,e[a+15],16,530742520),r=un(r,i,o,t,e[a+2],23,-995338651),t=sn(t,r,i,o,e[a],6,-198630844),o=sn(o,t,r,i,e[a+7],10,1126891415),i=sn(i,o,t,r,e[a+14],15,-1416354905),r=sn(r,i,o,t,e[a+5],21,-57434055),t=sn(t,r,i,o,e[a+12],6,1700485571),o=sn(o,t,r,i,e[a+3],10,-1894986606),i=sn(i,o,t,r,e[a+10],15,-1051523),r=sn(r,i,o,t,e[a+1],21,-2054922799),t=sn(t,r,i,o,e[a+8],6,1873313359),o=sn(o,t,r,i,e[a+15],10,-30611744),i=sn(i,o,t,r,e[a+6],15,-1560198380),r=sn(r,i,o,t,e[a+13],21,1309151649),t=sn(t,r,i,o,e[a+4],6,-145523070),o=sn(o,t,r,i,e[a+11],10,-1120210379),i=sn(i,o,t,r,e[a+2],15,718787259),r=sn(r,i,o,t,e[a+9],21,-343485551),t=tn(t,u),r=tn(r,s),i=tn(i,c),o=tn(o,l)}return[t,r,i,o]}(function(e){if(0===e.length)return[];for(var n=8*e.length,t=new Uint32Array(nn(n)),r=0;r<n;r+=8)t[r>>5]|=(255&e[r/8])<<r%32;return t}(e),8*e.length))}));function ln(e,n,t,r){switch(e){case 0:return n&t^~n&r;case 1:return n^t^r;case 2:return n&t^n&r^t&r;case 3:return n^t^r}}function fn(e,n){return e<<n|e>>>32-n}var vn=en("v5",80,(function(e){var n=[1518500249,1859775393,2400959708,3395469782],t=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof e){var r=unescape(encodeURIComponent(e));e=[];for(var i=0;i<r.length;++i)e.push(r.charCodeAt(i))}else Array.isArray(e)||(e=Array.prototype.slice.call(e));e.push(128);for(var o=e.length/4+2,a=Math.ceil(o/16),u=new Array(a),s=0;s<a;++s){for(var c=new Uint32Array(16),l=0;l<16;++l)c[l]=e[64*s+4*l]<<24|e[64*s+4*l+1]<<16|e[64*s+4*l+2]<<8|e[64*s+4*l+3];u[s]=c}u[a-1][14]=8*(e.length-1)/Math.pow(2,32),u[a-1][14]=Math.floor(u[a-1][14]),u[a-1][15]=8*(e.length-1)&4294967295;for(var f=0;f<a;++f){for(var v=new Uint32Array(80),d=0;d<16;++d)v[d]=u[f][d];for(var g=16;g<80;++g)v[g]=fn(v[g-3]^v[g-8]^v[g-14]^v[g-16],1);for(var p=t[0],m=t[1],h=t[2],y=t[3],b=t[4],k=0;k<80;++k){var E=Math.floor(k/20),w=fn(p,5)+ln(E,m,h,y)+b+n[E]+v[k]>>>0;b=y,y=h,h=fn(m,30)>>>0,m=p,p=w}t[0]=t[0]+p>>>0,t[1]=t[1]+m>>>0,t[2]=t[2]+h>>>0,t[3]=t[3]+y>>>0,t[4]=t[4]+b>>>0}return[t[0]>>24&255,t[0]>>16&255,t[0]>>8&255,255&t[0],t[1]>>24&255,t[1]>>16&255,t[1]>>8&255,255&t[1],t[2]>>24&255,t[2]>>16&255,t[2]>>8&255,255&t[2],t[3]>>24&255,t[3]>>16&255,t[3]>>8&255,255&t[3],t[4]>>24&255,t[4]>>16&255,t[4]>>8&255,255&t[4]]}));var dn=Object.freeze({__proto__:null,v1:function(e,n,t){var r=n&&t||0,i=n||new Array(16),o=(e=e||{}).node||He,a=void 0!==e.clockseq?e.clockseq:Be;if(null==o||null==a){var u=e.random||(e.rng||Me)();null==o&&(o=He=[1|u[0],u[1],u[2],u[3],u[4],u[5]]),null==a&&(a=Be=16383&(u[6]<<8|u[7]))}var s=void 0!==e.msecs?e.msecs:Date.now(),c=void 0!==e.nsecs?e.nsecs:Ye+1,l=s-Qe+(c-Ye)/1e4;if(l<0&&void 0===e.clockseq&&(a=a+1&16383),(l<0||s>Qe)&&void 0===e.nsecs&&(c=0),c>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");Qe=s,Ye=c,Be=a;var f=(1e4*(268435455&(s+=122192928e5))+c)%4294967296;i[r++]=f>>>24&255,i[r++]=f>>>16&255,i[r++]=f>>>8&255,i[r++]=255&f;var v=s/4294967296*1e4&268435455;i[r++]=v>>>8&255,i[r++]=255&v,i[r++]=v>>>24&15|16,i[r++]=v>>>16&255,i[r++]=a>>>8|128,i[r++]=255&a;for(var d=0;d<6;++d)i[r+d]=o[d];return n||We(i)},v3:cn,v4:function(e,n,t){var r=(e=e||{}).random||(e.rng||Me)();if(r[6]=15&r[6]|64,r[8]=63&r[8]|128,n){t=t||0;for(var i=0;i<16;++i)n[t+i]=r[i];return n}return We(r)},v5:vn,NIL:"00000000-0000-0000-0000-000000000000",version:function(e){if(!$e(e))throw TypeError("Invalid UUID");return parseInt(e.substr(14,1),16)},validate:$e,stringify:We,parse:Ze}).v1,gn=ze.baseOptionDefs;var pn=function(e){var n={diagnosticId:dn()};return e&&(n.sdkKeySuffix=e.length>6?e.substring(e.length-6):e),n},mn=function(e){var n,t,r,i;function o(e){n=e,t=0,r=0,i=[]}return o(e),{getProps:function(){return{dataSinceDate:n,droppedEvents:t,eventsInLastBatch:r,streamInits:i}},setProps:function(e){n=e.dataSinceDate,t=e.droppedEvents||0,r=e.eventsInLastBatch||0,i=e.streamInits||[]},incrementDroppedEvents:function(){t++},setEventsInLastBatch:function(e){r=e},recordStreamInit:function(e,n,t){var r={timestamp:e,failed:n,durationMillis:t};i.push(r)},reset:o}},hn=function(e,t,r,i,o,a,u){var s,c,l=!!e.diagnosticUseCombinedEvent,f="ld:"+o+":$diagnostics",v=a.eventsUrl+"/events/diagnostic/"+o,d=a.diagnosticRecordingInterval,g=r,p=!!a.streaming,m={};function h(){return{sdk:k(),configuration:(n={customBaseURI:a.baseUrl!==gn.baseUrl.default,customStreamURI:a.streamUrl!==gn.streamUrl.default,customEventsURI:a.eventsUrl!==gn.eventsUrl.default,eventsCapacity:a.eventCapacity,eventsFlushIntervalMillis:a.flushInterval,reconnectTimeMillis:a.streamReconnectDelay,streamingDisabled:!p,allAttributesPrivate:!!a.allAttributesPrivate,inlineUsersInEvents:!!a.inlineUsersInEvents,diagnosticRecordingIntervalMillis:a.diagnosticRecordingInterval,usingSecureMode:!!a.hash,bootstrapMode:!!a.bootstrap,fetchGoalsDisabled:!a.fetchGoals,allowFrequentDuplicateEvents:!!a.allowFrequentDuplicateEvents,sendEventsOnlyForVariation:!!a.sendEventsOnlyForVariation,autoAliasingOptOut:!!a.autoAliasingOptOut},n),platform:e.diagnosticPlatformData};var n}function y(e){a.logger&&a.logger.debug(Ie.debugPostingDiagnosticEvent(e)),i.sendEvents(e,v,!0).then((function(){})).catch((function(){}))}function b(){var e,r;y((e=(new Date).getTime(),r=n({kind:l?"diagnostic-combined":"diagnostic",id:u,creationDate:e},g.getProps()),l&&(r=n(n({},r),h())),g.reset(e),r)),c=setTimeout(b,d),s=(new Date).getTime(),l&&function(){if(t.isEnabled()){var e=n({},g.getProps());t.set(f,JSON.stringify(e))}}()}function k(){var t=n({},e.diagnosticSdkData);return a.wrapperName&&(t.wrapperName=a.wrapperName),a.wrapperVersion&&(t.wrapperVersion=a.wrapperVersion),t}return m.start=function(){l?function(e){if(!t.isEnabled())return e(!1);t.get(f).then((function(n){if(n)try{var t=JSON.parse(n);g.setProps(t),s=t.dataSinceDate}catch(e){}e(!0)})).catch((function(){e(!1)}))}((function(e){if(e){var n=(s||0)+d,t=(new Date).getTime();t>=n?b():c=setTimeout(b,n-t)}else 0===Math.floor(4*Math.random())?b():c=setTimeout(b,d)})):(y(n({kind:"diagnostic-init",id:u,creationDate:g.getProps().dataSinceDate},h())),c=setTimeout(b,d))},m.stop=function(){c&&clearTimeout(c)},m.setStreaming=function(e){p=e},m};function yn(e,r,i,o,a){var c,f,g,p=function(){if(i&&i.logger)return i.logger;return a&&a.logger&&a.logger.default||xe("warn")}(),m=je(p),h=Re(m),y=Ve(i,m,a,p),b=y.sendEvents,k=e,E=y.hash,w=function(e,n){var t={},r=!1,i=function(e){r||(r=!0,n.warn(Y(e)))};return t.isEnabled=function(){return!!e},t.get=function(n){return new Promise((function(t){e?e.get(n).then(t).catch((function(e){i(e),t(void 0)})):t(void 0)}))},t.set=function(n,t){return new Promise((function(r){e?e.set(n,t).then((function(){return r(!0)})).catch((function(e){i(e),r(!1)})):r(!1)}))},t.clear=function(n){return new Promise((function(t){e?e.clear(n).then((function(){return t(!0)})).catch((function(e){i(e),t(!1)})):t(!1)}))},t}(o.localStorage,p),D=M(o,k,y),O=y.sendEvents&&!y.diagnosticOptOut,S=O?pn(k):null,U=O?mn((new Date).getTime()):null,P=O?hn(o,w,U,D,k,y,S):null,A=Ae(o,y,k,U),N=y.eventProcessor||function(e,n,t){var r,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:null,s={},c=a||M(e,t,n),l=n.eventsUrl+"/events/bulk/"+t,f=K(),v=$(n),g=n.inlineUsersInEvents,p=n.samplingInterval,m=n.eventCapacity,h=n.flushInterval,y=n.logger,b=[],k=0,E=!1,w=!1;function D(){return 0===p||0===Math.floor(Math.random()*p)}function O(e){return!!e.debugEventsUntilDate&&(e.debugEventsUntilDate>k&&e.debugEventsUntilDate>(new Date).getTime())}function S(e){var n=q({},e);return"alias"===e.kind||(g||"identify"===e.kind?n.user=v.filterUser(e.user):(n.userKey=e.user.key,delete n.user),"feature"===e.kind&&(delete n.trackEvents,delete n.debugEventsUntilDate)),n}function U(e){b.length<m?(b.push(e),w=!1):(w||(w=!0,y.warn("Exceeded event queue capacity. Increase capacity to avoid dropping events.")),i&&i.incrementDroppedEvents())}return s.enqueue=function(e){if(!E){var n=!1,t=!1;if(f.summarizeEvent(e),"feature"===e.kind?D()&&(n=!!e.trackEvents,t=O(e)):n=D(),n&&U(S(e)),t){var r=q({},e,{kind:"debug"});r.user=v.filterUser(r.user),delete r.trackEvents,delete r.debugEventsUntilDate,U(r)}}},s.flush=function(){if(E)return Promise.resolve();var e=b,n=f.getSummary();return f.clearSummary(),n&&(n.kind="summary",e.push(n)),i&&i.setEventsInLastBatch(e.length),0===e.length?Promise.resolve():(b=[],y.debug(Pe(e.length)),c.sendEvents(e,l).then((function(e){e&&(e.serverTime&&(k=e.serverTime),d(e.status)||(E=!0),e.status>=400&&R((function(){o.maybeReportError(new u(ce(e.status,"event posting","some events were dropped")))})))})))},s.start=function(){r=setTimeout((function e(){s.flush(),r=setTimeout(e,h)}),h)},s.stop=function(){clearTimeout(r)},s}(o,y,k,U,m,D),L=Ce(o,y,k),F={},x={},z=y.streaming,J=!1,H=!1,B=!0,G=y.stateProvider,X=function(e,n){var t,r={};return r.setUser=function(e){var r=t&&I(t);(t=_(e))&&n&&n(I(t),r)},r.getUser=function(){return t?I(t):null},e&&r.setUser(e),r}(null,(function(e,n){(function(e){if(G)return;e&&Z({kind:"identify",key:e.key,user:e,creationDate:(new Date).getTime()})})(e),!y.autoAliasingOptOut&&n&&n.anonymous&&e&&!e.anonymous&&se(e,n)})),W=Le(w),Q=w.isEnabled()?new Te(w,k,E,X,p):null;function Z(e){if(k&&!(G&&G.enqueueEvent&&G.enqueueEvent(e))){if("alias"!==e.kind){if(!e.user)return void(B&&(p.warn("Be sure to call `identify` in the LaunchDarkly client: https://docs.launchdarkly.com/sdk/features/identify#javascript"),B=!1));B=!1}!b||H||o.isDoNotTrack()||(p.debug(Ue(e.kind)),N.enqueue(e))}}function ne(e,n,t,r){var i=X.getUser(),o=new Date,a=n?n.value:null;if(!y.allowFrequentDuplicateEvents){var u=JSON.stringify(a)+(i&&i.key?i.key:"")+e,s=F[u];if(s&&o-s<3e5)return;F[u]=o}var c={kind:"feature",key:e,user:i,value:a,variation:n?n.variationIndex:null,default:t,creationDate:o.getTime()};i&&i.anonymous&&(c.contextKind=ue(i));var l=x[e];l&&(c.version=l.flagVersion?l.flagVersion:l.version,c.trackEvents=l.trackEvents,c.debugEventsUntilDate=l.debugEventsUntilDate),(r||l&&l.trackReason)&&n&&(c.reason=n.reason),Z(c)}function ie(e,n,t,r){var i;if(x&&V(x,e)&&x[e]&&!x[e].deleted){var o=x[e];i=oe(o),null!==o.value&&void 0!==o.value||(i.value=n)}else i={value:n,variationIndex:null,reason:{kind:"ERROR",errorKind:"FLAG_NOT_FOUND"}};return t&&ne(e,i,n,r),i}function oe(e){return{value:e.value,variationIndex:void 0===e.variation?null:e.variation,reason:e.reason||null}}function ue(e){return e.anonymous?"anonymousUser":"user"}function se(e,n){G||e&&n&&Z({kind:"alias",key:e.key,contextKind:ue(e),previousKey:n.key,previousContextKind:ue(n),creationDate:(new Date).getTime()})}function le(){f=!0,X.getUser()&&A.connect(X.getUser(),E,{ping:function(){p.debug("received ping message from stream");var e=X.getUser();L.fetchFlagSettings(e,E).then((function(n){j(e,X.getUser())&&ve(n||{})})).catch((function(e){m.maybeReportError(new v(re(e)))}))},put:function(e){var n=JSON.parse(e.data);p.debug("received streaming update for all flags"),ve(n)},patch:function(e){var n=JSON.parse(e.data),t=x[n.key];if(!t||!t.version||!n.version||t.version<n.version){p.debug(we(n.key));var r={},i=q({},n);delete i.key,x[n.key]=i;var o=oe(i);r[n.key]=t?{previous:t.value,current:o}:{current:o},de(r)}else p.debug(De(n.key))},delete:function(e){var n=JSON.parse(e.data);if(!x[n.key]||x[n.key].version<n.version){p.debug(Oe(n.key));var t={};x[n.key]&&!x[n.key].deleted&&(t[n.key]={previous:x[n.key].value}),x[n.key]={version:n.version,deleted:!0},de(t)}else p.debug(Se(n.key))}})}function fe(){f&&(A.disconnect(),f=!1)}function ve(e){var t={};if(!e)return Promise.resolve();for(var r in x)V(x,r)&&x[r]&&(e[r]&&!j(e[r].value,x[r].value)?t[r]={previous:x[r].value,current:oe(e[r])}:e[r]&&!e[r].deleted||(t[r]={previous:x[r].value}));for(var i in e)V(e,i)&&e[i]&&(!x[i]||x[i].deleted)&&(t[i]={current:oe(e[i])});return x=n({},e),de(t).catch((function(){}))}function de(e){var n=Object.keys(e);if(n.length>0){var t={};n.forEach((function(n){var r=e[n].current,i=r?r.value:void 0,o=e[n].previous;m.emit("change:"+n,i,o),t[n]=r?{current:i,previous:o}:{previous:o}})),m.emit("change",t),m.emit("internal-change",x),y.sendEventsOnlyForVariation||G||n.forEach((function(n){ne(n,e[n].current)}))}return c&&Q?Q.saveFlags(x):Promise.resolve()}function ge(){var e=z||g&&void 0===z;e&&!f?le():!e&&f&&fe(),P&&P.setStreaming(e)}function pe(e){return"change"===e||"change:"===e.substr(0,"change".length+1)}if("string"==typeof y.bootstrap&&"LOCALSTORAGE"===y.bootstrap.toUpperCase()&&(Q?c=!0:p.warn(Y())),"object"===t(y.bootstrap)&&(x=function(e){var n=Object.keys(e),t=e.$flagsState;!t&&n.length&&p.warn(ae()),!1===e.$valid&&p.warn("LaunchDarkly bootstrap data is not available because the back end could not read the flags.");var r={};return n.forEach((function(n){if("$flagsState"!==n&&"$valid"!==n){var i={value:e[n]};t&&t[n]?i=q(i,t[n]):i.version=0,r[n]=i}})),r}(y.bootstrap)),G){var me=G.getInitialState();me?he(me):G.on("init",he),G.on("update",(function(e){e.user&&X.setUser(e.user);e.flags&&ve(e.flags)}))}else(function(){if(!e)return Promise.reject(new s(te()));return W.validateUser(r).then((function(e){return X.setUser(e),"object"===t(y.bootstrap)?ye():c?Q.loadFlags().then((function(e){return null==e?(x={},L.fetchFlagSettings(X.getUser(),E).then((function(e){return ve(e||{})})).then(ye).catch((function(e){be(new v(re(e)))}))):(x=e,R(ye),L.fetchFlagSettings(X.getUser(),E).then((function(e){return ve(e)})).catch((function(e){return m.maybeReportError(e)})))})):L.fetchFlagSettings(X.getUser(),E).then((function(e){x=e||{},ye()})).catch((function(e){x={},be(e)}))}))})().catch(be);function he(e){k=e.environment,X.setUser(e.user),x=n({},e.flags),R(ye)}function ye(){p.info("LaunchDarkly client initialized"),J=!0,ge(),h.signalSuccess()}function be(e){h.signalFailure(e)}return{client:{waitForInitialization:function(){return h.getInitializationPromise()},waitUntilReady:function(){return h.getReadyPromise()},identify:function(e,n,t){return H?T(Promise.resolve({}),t):G?(p.warn("identify() has no effect here; it must be called on the main client instance"),T(Promise.resolve(C(x)),t)):T((c&&Q?Q.clearFlags():Promise.resolve()).then((function(){return W.validateUser(e)})).then((function(e){return L.fetchFlagSettings(e,n).then((function(t){var r=C(t);return X.setUser(e),E=n,t?ve(t).then((function(){return r})):r}))})).then((function(e){return f&&le(),e})).catch((function(e){return m.maybeReportError(e),Promise.reject(e)})),t)},getUser:function(){return X.getUser()},variation:function(e,n){return ie(e,n,!0,!1).value},variationDetail:function(e,n){return ie(e,n,!0,!0)},track:function(e,n,t){if("string"==typeof e){o.customEventFilter&&!o.customEventFilter(e)&&p.warn(ee(e));var r=X.getUser(),i={kind:"custom",key:e,user:r,url:o.getCurrentUrl(),creationDate:(new Date).getTime()};r&&r.anonymous&&(i.contextKind=ue(r)),null!=n&&(i.data=n),null!=t&&(i.metricValue=t),Z(i)}else m.maybeReportError(new l(ee(e)))},alias:se,on:function(e,n,t){pe(e)?(g=!0,J&&ge(),m.on(e,n,t)):m.on.apply(m,arguments)},off:function(e){if(m.off.apply(m,arguments),pe(e)){var n=!1;m.getEvents().forEach((function(e){pe(e)&&m.getEventListenerCount(e)>0&&(n=!0)})),n||(g=!1,f&&void 0===z&&fe())}},setStreaming:function(e){var n=null===e?void 0:e;n!==z&&(z=n,ge())},flush:function(e){return T(b?N.flush():Promise.resolve(),e)},allFlags:function(){var e={};if(!x)return e;for(var n in x)V(x,n)&&(e[n]=ie(n,null,!y.sendEventsOnlyForVariation).value);return e},close:function(e){if(H)return T(Promise.resolve(),e);var n=function(){H=!0,x={}};return T(Promise.resolve().then((function(){if(fe(),P&&P.stop(),b)return N.stop(),N.flush()})).then(n).catch(n),e)}},options:y,emitter:m,ident:X,logger:p,requestor:L,start:function(){b&&(P&&P.start(),N.start())},enqueueEvent:Z,getFlagsInternal:function(){return x},getEnvironmentId:function(){return k},internalChangeEventName:"internal-change"}}var bn="4.0.0";export{xe as commonBasicLogger,g as errors,yn as initialize,Ie as messages,z as utils,bn as version};
|
|
2
|
-
//# sourceMappingURL=ldclient-common.es.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ldclient-common.es.js","sources":["../src/errors.js","../node_modules/base64-js/index.js","../node_modules/fast-deep-equal/index.js","../src/utils.js","../src/EventSender.js","../src/EventSummarizer.js","../src/UserFilter.js","../src/messages.js","../src/EventEmitter.js","../src/InitializationState.js","../src/PersistentFlagStore.js","../src/Stream.js","../src/Requestor.js","../src/promiseCoalescer.js","../src/UserValidator.js","../src/loggers.js","../src/configuration.js","../node_modules/uuid/dist/esm-browser/rng.js","../node_modules/uuid/dist/esm-browser/regex.js","../node_modules/uuid/dist/esm-browser/validate.js","../node_modules/uuid/dist/esm-browser/stringify.js","../node_modules/uuid/dist/esm-browser/v1.js","../node_modules/uuid/dist/esm-browser/parse.js","../node_modules/uuid/dist/esm-browser/v35.js","../node_modules/uuid/dist/esm-browser/md5.js","../node_modules/uuid/dist/esm-browser/v3.js","../node_modules/uuid/dist/esm-browser/sha1.js","../node_modules/uuid/dist/esm-browser/v5.js","../src/diagnosticEvents.js","../node_modules/uuid/dist/esm-browser/v4.js","../node_modules/uuid/dist/esm-browser/nil.js","../node_modules/uuid/dist/esm-browser/version.js","../src/index.js","../src/PersistentStorage.js","../src/EventProcessor.js","../src/Identity.js"],"sourcesContent":["function createCustomError(name) {\n function CustomError(message, code) {\n Error.captureStackTrace && Error.captureStackTrace(this, this.constructor);\n this.message = message;\n this.code = code;\n }\n\n CustomError.prototype = new Error();\n CustomError.prototype.name = name;\n CustomError.prototype.constructor = CustomError;\n\n return CustomError;\n}\n\nexport const LDUnexpectedResponseError = createCustomError('LaunchDarklyUnexpectedResponseError');\nexport const LDInvalidEnvironmentIdError = createCustomError('LaunchDarklyInvalidEnvironmentIdError');\nexport const LDInvalidUserError = createCustomError('LaunchDarklyInvalidUserError');\nexport const LDInvalidEventKeyError = createCustomError('LaunchDarklyInvalidEventKeyError');\nexport const LDInvalidArgumentError = createCustomError('LaunchDarklyInvalidArgumentError');\nexport const LDFlagFetchError = createCustomError('LaunchDarklyFlagFetchError');\n\nexport function isHttpErrorRecoverable(status) {\n if (status >= 400 && status < 500) {\n return status === 400 || status === 408 || status === 429;\n }\n return true;\n}\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","'use strict';\n\nvar isArray = Array.isArray;\nvar keyList = Object.keys;\nvar hasProp = Object.prototype.hasOwnProperty;\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n var arrA = isArray(a)\n , arrB = isArray(b)\n , i\n , length\n , key;\n\n if (arrA && arrB) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n if (arrA != arrB) return false;\n\n var dateA = a instanceof Date\n , dateB = b instanceof Date;\n if (dateA != dateB) return false;\n if (dateA && dateB) return a.getTime() == b.getTime();\n\n var regexpA = a instanceof RegExp\n , regexpB = b instanceof RegExp;\n if (regexpA != regexpB) return false;\n if (regexpA && regexpB) return a.toString() == b.toString();\n\n var keys = keyList(a);\n length = keys.length;\n\n if (length !== keyList(b).length)\n return false;\n\n for (i = length; i-- !== 0;)\n if (!hasProp.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n key = keys[i];\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n return a!==a && b!==b;\n};\n","import * as base64 from 'base64-js';\nimport fastDeepEqual from 'fast-deep-equal';\n\nconst userAttrsToStringify = ['key', 'secondary', 'ip', 'country', 'email', 'firstName', 'lastName', 'avatar', 'name'];\n\n// See http://ecmanaut.blogspot.com/2006/07/encoding-decoding-utf8-in-javascript.html\nexport function btoa(s) {\n const escaped = unescape(encodeURIComponent(s));\n return base64.fromByteArray(stringToBytes(escaped));\n}\n\nfunction stringToBytes(s) {\n const b = [];\n for (let i = 0; i < s.length; i++) {\n b.push(s.charCodeAt(i));\n }\n return b;\n}\n\nexport function base64URLEncode(s) {\n return (\n btoa(s)\n // eslint-disable-next-line\n .replace(/=/g, '')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n );\n}\n\nexport function clone(obj) {\n return JSON.parse(JSON.stringify(obj));\n}\n\nexport function deepEquals(a, b) {\n return fastDeepEqual(a, b);\n}\n\n// Events emitted in LDClient's initialize method will happen before the consumer\n// can register a listener, so defer them to next tick.\nexport function onNextTick(cb) {\n setTimeout(cb, 0);\n}\n\n/**\n * Wrap a promise to invoke an optional callback upon resolution or rejection.\n *\n * This function assumes the callback follows the Node.js callback type: (err, value) => void\n *\n * If a callback is provided:\n * - if the promise is resolved, invoke the callback with (null, value)\n * - if the promise is rejected, invoke the callback with (error, null)\n *\n * @param {Promise<any>} promise\n * @param {Function} callback\n * @returns Promise<any> | undefined\n */\nexport function wrapPromiseCallback(promise, callback) {\n const ret = promise.then(\n value => {\n if (callback) {\n setTimeout(() => {\n callback(null, value);\n }, 0);\n }\n return value;\n },\n error => {\n if (callback) {\n setTimeout(() => {\n callback(error, null);\n }, 0);\n } else {\n return Promise.reject(error);\n }\n }\n );\n\n return !callback ? ret : undefined;\n}\n\n/**\n * Takes a map of flag keys to values, and returns the more verbose structure used by the\n * client stream.\n */\nexport function transformValuesToVersionedValues(flags) {\n const ret = {};\n for (const key in flags) {\n if (objectHasOwnProperty(flags, key)) {\n ret[key] = { value: flags[key], version: 0 };\n }\n }\n return ret;\n}\n\n/**\n * Converts the internal flag state map to a simple map of flag keys to values.\n */\nexport function transformVersionedValuesToValues(flagsState) {\n const ret = {};\n for (const key in flagsState) {\n if (objectHasOwnProperty(flagsState, key)) {\n ret[key] = flagsState[key].value;\n }\n }\n return ret;\n}\n\n/**\n * Returns an array of event groups each of which can be safely URL-encoded\n * without hitting the safe maximum URL length of certain browsers.\n *\n * @param {number} maxLength maximum URL length targeted\n * @param {Array[Object}]} events queue of events to divide\n * @returns Array[Array[Object]]\n */\nexport function chunkUserEventsForUrl(maxLength, events) {\n const allEvents = events.slice(0);\n const allChunks = [];\n let remainingSpace = maxLength;\n let chunk;\n\n while (allEvents.length > 0) {\n chunk = [];\n\n while (remainingSpace > 0) {\n const event = allEvents.shift();\n if (!event) {\n break;\n }\n remainingSpace = remainingSpace - base64URLEncode(JSON.stringify(event)).length;\n // If we are over the max size, put this one back on the queue\n // to try in the next round, unless this event alone is larger\n // than the limit, in which case, screw it, and try it anyway.\n if (remainingSpace < 0 && chunk.length > 0) {\n allEvents.unshift(event);\n } else {\n chunk.push(event);\n }\n }\n\n remainingSpace = maxLength;\n allChunks.push(chunk);\n }\n\n return allChunks;\n}\n\nexport function getLDUserAgentString(platform) {\n const version = platform.version || VERSION;\n return platform.userAgent + '/' + version;\n}\n\nexport function getLDHeaders(platform, options) {\n if (options && !options.sendLDHeaders) {\n return {};\n }\n const h = {\n 'X-LaunchDarkly-User-Agent': getLDUserAgentString(platform),\n };\n if (options && options.wrapperName) {\n h['X-LaunchDarkly-Wrapper'] = options.wrapperVersion\n ? options.wrapperName + '/' + options.wrapperVersion\n : options.wrapperName;\n }\n return h;\n}\n\nexport function transformHeaders(headers, options) {\n if (!options || !options.requestHeaderTransform) {\n return headers;\n }\n return options.requestHeaderTransform({ ...headers });\n}\n\nexport function extend(...objects) {\n return objects.reduce((acc, obj) => ({ ...acc, ...obj }), {});\n}\n\nexport function objectHasOwnProperty(object, name) {\n return Object.prototype.hasOwnProperty.call(object, name);\n}\n\nexport function sanitizeUser(user) {\n if (!user) {\n return user;\n }\n let newUser;\n for (const i in userAttrsToStringify) {\n const attr = userAttrsToStringify[i];\n const value = user[attr];\n if (value !== undefined && typeof value !== 'string') {\n newUser = newUser || { ...user };\n newUser[attr] = String(value);\n }\n }\n return newUser || user;\n}\n","import * as errors from './errors';\nimport * as utils from './utils';\nconst { v1: uuidv1 } = require('uuid');\n\nconst MAX_URL_LENGTH = 2000;\n\nexport default function EventSender(platform, environmentId, options) {\n const imageUrlPath = '/a/' + environmentId + '.gif';\n const baseHeaders = utils.extend({ 'Content-Type': 'application/json' }, utils.getLDHeaders(platform, options));\n const httpFallbackPing = platform.httpFallbackPing; // this will be set for us if we're in the browser SDK\n const sender = {};\n\n function getResponseInfo(result) {\n const ret = { status: result.status };\n const dateStr = result.header('date');\n if (dateStr) {\n const time = Date.parse(dateStr);\n if (time) {\n ret.serverTime = time;\n }\n }\n return ret;\n }\n\n sender.sendChunk = (events, url, isDiagnostic, usePost) => {\n const jsonBody = JSON.stringify(events);\n const payloadId = isDiagnostic ? null : uuidv1();\n\n function doPostRequest(canRetry) {\n const headers = isDiagnostic\n ? baseHeaders\n : utils.extend({}, baseHeaders, {\n 'X-LaunchDarkly-Event-Schema': '3',\n 'X-LaunchDarkly-Payload-ID': payloadId,\n });\n return platform\n .httpRequest('POST', url, utils.transformHeaders(headers, options), jsonBody)\n .promise.then(result => {\n if (!result) {\n // This was a response from a fire-and-forget request, so we won't have a status.\n return;\n }\n if (result.status >= 400 && errors.isHttpErrorRecoverable(result.status) && canRetry) {\n return doPostRequest(false);\n } else {\n return getResponseInfo(result);\n }\n })\n .catch(() => {\n if (canRetry) {\n return doPostRequest(false);\n }\n return Promise.reject();\n });\n }\n\n if (usePost) {\n return doPostRequest(true).catch(() => {});\n } else {\n httpFallbackPing && httpFallbackPing(url + imageUrlPath + '?d=' + utils.base64URLEncode(jsonBody));\n return Promise.resolve(); // we don't wait for this request to complete, it's just a one-way ping\n }\n };\n\n sender.sendEvents = function(events, url, isDiagnostic) {\n if (!platform.httpRequest) {\n return Promise.resolve();\n }\n const canPost = platform.httpAllowsPost();\n let chunks;\n if (canPost) {\n // no need to break up events into chunks if we can send a POST\n chunks = [events];\n } else {\n chunks = utils.chunkUserEventsForUrl(MAX_URL_LENGTH - url.length, events);\n }\n const results = [];\n for (let i = 0; i < chunks.length; i++) {\n results.push(sender.sendChunk(chunks[i], url, isDiagnostic, canPost));\n }\n return Promise.all(results);\n };\n\n return sender;\n}\n","export default function EventSummarizer() {\n const es = {};\n\n let startDate = 0,\n endDate = 0,\n counters = {};\n\n es.summarizeEvent = function(event) {\n if (event.kind === 'feature') {\n const counterKey =\n event.key +\n ':' +\n (event.variation !== null && event.variation !== undefined ? event.variation : '') +\n ':' +\n (event.version !== null && event.version !== undefined ? event.version : '');\n const counterVal = counters[counterKey];\n if (counterVal) {\n counterVal.count = counterVal.count + 1;\n } else {\n counters[counterKey] = {\n count: 1,\n key: event.key,\n variation: event.variation,\n version: event.version,\n value: event.value,\n default: event.default,\n };\n }\n if (startDate === 0 || event.creationDate < startDate) {\n startDate = event.creationDate;\n }\n if (event.creationDate > endDate) {\n endDate = event.creationDate;\n }\n }\n };\n\n es.getSummary = function() {\n const flagsOut = {};\n let empty = true;\n for (const i in counters) {\n const c = counters[i];\n let flag = flagsOut[c.key];\n if (!flag) {\n flag = {\n default: c.default,\n counters: [],\n };\n flagsOut[c.key] = flag;\n }\n const counterOut = {\n value: c.value,\n count: c.count,\n };\n if (c.variation !== undefined && c.variation !== null) {\n counterOut.variation = c.variation;\n }\n if (c.version) {\n counterOut.version = c.version;\n } else {\n counterOut.unknown = true;\n }\n flag.counters.push(counterOut);\n empty = false;\n }\n return empty\n ? null\n : {\n startDate,\n endDate,\n features: flagsOut,\n };\n };\n\n es.clearSummary = function() {\n startDate = 0;\n endDate = 0;\n counters = {};\n };\n\n return es;\n}\n","import * as utils from './utils';\n\n/**\n * The UserFilter object transforms user objects into objects suitable to be sent as JSON to\n * the server, hiding any private user attributes.\n *\n * @param {Object} the LaunchDarkly client configuration object\n **/\nexport default function UserFilter(config) {\n const filter = {};\n const allAttributesPrivate = config.allAttributesPrivate;\n const privateAttributeNames = config.privateAttributeNames || [];\n const ignoreAttrs = { key: true, custom: true, anonymous: true };\n const allowedTopLevelAttrs = {\n key: true,\n secondary: true,\n ip: true,\n country: true,\n email: true,\n firstName: true,\n lastName: true,\n avatar: true,\n name: true,\n anonymous: true,\n custom: true,\n };\n\n filter.filterUser = function(user) {\n if (!user) {\n return null;\n }\n const userPrivateAttrs = user.privateAttributeNames || [];\n\n const isPrivateAttr = function(name) {\n return (\n !ignoreAttrs[name] &&\n (allAttributesPrivate || userPrivateAttrs.indexOf(name) !== -1 || privateAttributeNames.indexOf(name) !== -1)\n );\n };\n const filterAttrs = function(props, isAttributeAllowed) {\n return Object.keys(props).reduce(\n (acc, name) => {\n const ret = acc;\n if (isAttributeAllowed(name)) {\n if (isPrivateAttr(name)) {\n // add to hidden list\n ret[1][name] = true;\n } else {\n ret[0][name] = props[name];\n }\n }\n return ret;\n },\n [{}, {}]\n );\n };\n const result = filterAttrs(user, key => allowedTopLevelAttrs[key]);\n const filteredProps = result[0];\n let removedAttrs = result[1];\n if (user.custom) {\n const customResult = filterAttrs(user.custom, () => true);\n filteredProps.custom = customResult[0];\n removedAttrs = utils.extend({}, removedAttrs, customResult[1]);\n }\n const removedAttrNames = Object.keys(removedAttrs);\n if (removedAttrNames.length) {\n removedAttrNames.sort();\n filteredProps.privateAttrs = removedAttrNames;\n }\n return filteredProps;\n };\n return filter;\n}\n","import * as errors from './errors';\n\nfunction errorString(err) {\n if (err && err.message) {\n return err.message;\n }\n if (typeof err === 'string' || err instanceof String) {\n return err;\n }\n return JSON.stringify(err);\n}\n\nexport const clientInitialized = function() {\n return 'LaunchDarkly client initialized';\n};\n\nconst docLink =\n ' Please see https://docs.launchdarkly.com/sdk/client-side/javascript#initializing-the-client for instructions on SDK initialization.';\n\nexport const clientNotReady = function() {\n return 'LaunchDarkly client is not ready';\n};\n\nexport const eventCapacityExceeded = function() {\n return 'Exceeded event queue capacity. Increase capacity to avoid dropping events.';\n};\n\nexport const eventWithoutUser = function() {\n return 'Be sure to call `identify` in the LaunchDarkly client: https://docs.launchdarkly.com/sdk/features/identify#javascript';\n};\n\nexport const invalidContentType = function(contentType) {\n return 'Expected application/json content type but got \"' + contentType + '\"';\n};\n\nexport const invalidKey = function() {\n return 'Event key must be a string';\n};\n\nexport const localStorageUnavailable = function(err) {\n return 'local storage is unavailable: ' + errorString(err);\n};\n\nexport const networkError = e => 'network error' + (e ? ' (' + e + ')' : '');\n\n// We should remove unknownCustomEventKey in the future - see comments in track() in index.js\nexport const unknownCustomEventKey = function(key) {\n return 'Custom event \"' + key + '\" does not exist';\n};\n\nexport const environmentNotFound = function() {\n return 'Environment not found. Double check that you specified a valid environment/client-side ID.' + docLink;\n};\n\nexport const environmentNotSpecified = function() {\n return 'No environment/client-side ID was specified.' + docLink;\n};\n\nexport const errorFetchingFlags = function(err) {\n return 'Error fetching flag settings: ' + errorString(err);\n};\n\nexport const userNotSpecified = function() {\n return 'No user specified.' + docLink;\n};\n\nexport const invalidUser = function() {\n return 'Invalid user specified.' + docLink;\n};\n\nexport const bootstrapOldFormat = function() {\n return (\n 'LaunchDarkly client was initialized with bootstrap data that did not include flag metadata. ' +\n 'Events may not be sent correctly.' +\n docLink\n );\n};\n\nexport const bootstrapInvalid = function() {\n return 'LaunchDarkly bootstrap data is not available because the back end could not read the flags.';\n};\n\nexport const deprecated = function(oldName, newName) {\n if (newName) {\n return '\"' + oldName + '\" is deprecated, please use \"' + newName + '\"';\n }\n return '\"' + oldName + '\" is deprecated';\n};\n\nexport const httpErrorMessage = function(status, context, retryMessage) {\n return (\n 'Received error ' +\n status +\n (status === 401 ? ' (invalid SDK key)' : '') +\n ' for ' +\n context +\n ' - ' +\n (errors.isHttpErrorRecoverable(status) ? retryMessage : 'giving up permanently')\n );\n};\n\nexport const httpUnavailable = function() {\n return 'Cannot make HTTP requests in this environment.' + docLink;\n};\n\nexport const identifyDisabled = function() {\n return 'identify() has no effect here; it must be called on the main client instance';\n};\n\nexport const streamClosing = function() {\n return 'Closing stream connection';\n};\n\nexport const streamConnecting = function(url) {\n return 'Opening stream connection to ' + url;\n};\n\nexport const streamError = function(err, streamReconnectDelay) {\n return (\n 'Error on stream connection: ' +\n errorString(err) +\n ', will continue retrying every ' +\n streamReconnectDelay +\n ' milliseconds.'\n );\n};\n\nexport const unknownOption = name => 'Ignoring unknown config option \"' + name + '\"';\n\nexport const wrongOptionType = (name, expectedType, actualType) =>\n 'Config option \"' + name + '\" should be of type ' + expectedType + ', got ' + actualType + ', using default value';\n\nexport const wrongOptionTypeBoolean = (name, actualType) =>\n 'Config option \"' + name + '\" should be a boolean, got ' + actualType + ', converting to boolean';\n\nexport const optionBelowMinimum = (name, value, minimum) =>\n 'Config option \"' + name + '\" was set to ' + value + ', changing to minimum value of ' + minimum;\n\nexport const debugPolling = function(url) {\n return 'polling for feature flags at ' + url;\n};\n\nexport const debugStreamPing = function() {\n return 'received ping message from stream';\n};\n\nexport const debugStreamPut = function() {\n return 'received streaming update for all flags';\n};\n\nexport const debugStreamPatch = function(key) {\n return 'received streaming update for flag \"' + key + '\"';\n};\n\nexport const debugStreamPatchIgnored = function(key) {\n return 'received streaming update for flag \"' + key + '\" but ignored due to version check';\n};\n\nexport const debugStreamDelete = function(key) {\n return 'received streaming deletion for flag \"' + key + '\"';\n};\n\nexport const debugStreamDeleteIgnored = function(key) {\n return 'received streaming deletion for flag \"' + key + '\" but ignored due to version check';\n};\n\nexport const debugEnqueueingEvent = function(kind) {\n return 'enqueueing \"' + kind + '\" event';\n};\n\nexport const debugPostingEvents = function(count) {\n return 'sending ' + count + ' events';\n};\n\nexport const debugPostingDiagnosticEvent = function(event) {\n return 'sending diagnostic event (' + event.kind + ')';\n};\n","export default function EventEmitter(logger) {\n const emitter = {};\n const events = {};\n\n const listeningTo = event => !!events[event];\n\n emitter.on = function(event, handler, context) {\n events[event] = events[event] || [];\n events[event] = events[event].concat({\n handler: handler,\n context: context,\n });\n };\n\n emitter.off = function(event, handler, context) {\n if (!events[event]) {\n return;\n }\n for (let i = 0; i < events[event].length; i++) {\n if (events[event][i].handler === handler && events[event][i].context === context) {\n events[event] = events[event].slice(0, i).concat(events[event].slice(i + 1));\n }\n }\n };\n\n emitter.emit = function(event) {\n if (!events[event]) {\n return;\n }\n // Copy the list of handlers before iterating, in case any handler adds or removes another handler.\n // Any such changes should not affect what we do here-- we want to notify every handler that existed\n // at the moment that the event was fired.\n const copiedHandlers = events[event].slice(0);\n for (let i = 0; i < copiedHandlers.length; i++) {\n copiedHandlers[i].handler.apply(copiedHandlers[i].context, Array.prototype.slice.call(arguments, 1));\n }\n };\n\n emitter.getEvents = function() {\n return Object.keys(events);\n };\n\n emitter.getEventListenerCount = function(event) {\n return events[event] ? events[event].length : 0;\n };\n\n emitter.maybeReportError = function(error) {\n if (!error) {\n return;\n }\n if (listeningTo('error')) {\n this.emit('error', error);\n } else {\n (logger || console).error(error.message);\n }\n };\n return emitter;\n}\n","// This file provides an abstraction of the client's startup state.\n//\n// Startup can either succeed or fail exactly once; calling signalSuccess() or signalFailure()\n// after that point has no effect.\n//\n// On success, we fire both an \"initialized\" event and a \"ready\" event. Both the waitForInitialization()\n// promise and the waitUntilReady() promise are resolved in this case.\n//\n// On failure, we fire both a \"failed\" event (with the error as a parameter) and a \"ready\" event.\n// The waitForInitialization() promise is rejected, but the waitUntilReady() promise is resolved.\n//\n// To complicate things, we must *not* create the waitForInitialization() promise unless it is\n// requested, because otherwise failures would cause an *unhandled* rejection which can be a\n// serious problem in some environments. So we use a somewhat roundabout system for tracking the\n// initialization state and lazily creating this promise.\n\nconst readyEvent = 'ready',\n successEvent = 'initialized',\n failureEvent = 'failed';\n\nfunction InitializationStateTracker(eventEmitter) {\n let succeeded = false,\n failed = false,\n failureValue = null,\n initializationPromise = null;\n\n const readyPromise = new Promise(resolve => {\n const onReady = () => {\n eventEmitter.off(readyEvent, onReady); // we can't use \"once\" because it's not available on some JS platforms\n resolve();\n };\n eventEmitter.on(readyEvent, onReady);\n }).catch(() => {}); // this Promise should never be rejected, but the catch handler is a safety measure\n\n return {\n getInitializationPromise: () => {\n if (initializationPromise) {\n return initializationPromise;\n }\n if (succeeded) {\n return Promise.resolve();\n }\n if (failed) {\n return Promise.reject(failureValue);\n }\n initializationPromise = new Promise((resolve, reject) => {\n const onSuccess = () => {\n eventEmitter.off(successEvent, onSuccess);\n resolve();\n };\n const onFailure = err => {\n eventEmitter.off(failureEvent, onFailure);\n reject(err);\n };\n eventEmitter.on(successEvent, onSuccess);\n eventEmitter.on(failureEvent, onFailure);\n });\n return initializationPromise;\n },\n\n getReadyPromise: () => readyPromise,\n\n signalSuccess: () => {\n if (!succeeded && !failed) {\n succeeded = true;\n eventEmitter.emit(successEvent);\n eventEmitter.emit(readyEvent);\n }\n },\n\n signalFailure: err => {\n if (!succeeded && !failed) {\n failed = true;\n failureValue = err;\n eventEmitter.emit(failureEvent, err);\n eventEmitter.emit(readyEvent);\n }\n eventEmitter.maybeReportError(err); // the \"error\" event can be emitted more than once, unlike the others\n },\n };\n}\n\nmodule.exports = InitializationStateTracker;\n","import * as utils from './utils';\n\nexport default function PersistentFlagStore(storage, environment, hash, ident) {\n const store = {};\n\n function getFlagsKey() {\n let key = '';\n const user = ident.getUser();\n if (user) {\n key = hash || utils.btoa(JSON.stringify(user));\n }\n return 'ld:' + environment + ':' + key;\n }\n\n // Returns a Promise which will be resolved with a parsed JSON value if a stored value was available,\n // or resolved with null if there was no value or if storage was not available.\n store.loadFlags = () =>\n storage.get(getFlagsKey()).then(dataStr => {\n if (dataStr === null || dataStr === undefined) {\n return null;\n }\n try {\n let data = JSON.parse(dataStr);\n if (data) {\n const schema = data.$schema;\n if (schema === undefined || schema < 1) {\n data = utils.transformValuesToVersionedValues(data);\n } else {\n delete data['$schema'];\n }\n }\n return data;\n } catch (ex) {\n return store.clearFlags().then(() => null);\n }\n });\n\n // Resolves with true if successful, or false if storage is unavailable. Never rejects.\n store.saveFlags = flags => {\n const data = utils.extend({}, flags, { $schema: 1 });\n return storage.set(getFlagsKey(), JSON.stringify(data));\n };\n\n // Resolves with true if successful, or false if storage is unavailable. Never rejects.\n store.clearFlags = () => storage.clear(getFlagsKey());\n\n return store;\n}\n","import * as messages from './messages';\nimport { base64URLEncode, getLDHeaders, transformHeaders, objectHasOwnProperty } from './utils';\n\n// The underlying event source implementation is abstracted via the platform object, which should\n// have these three properties:\n// eventSourceFactory(): a function that takes a URL and optional config object and returns an object\n// with the same methods as the regular HTML5 EventSource object. The properties in the config\n// object are those supported by the launchdarkly-eventsource package; browser EventSource\n// implementations don't have any config options.\n// eventSourceIsActive(): a function that takes an EventSource-compatible object and returns true if\n// it is in an active state (connected or connecting).\n// eventSourceAllowsReport: true if REPORT is supported.\n\n// The read timeout for the stream is a fixed value that is set to be slightly longer than the expected\n// interval between heartbeats from the LaunchDarkly streaming server. If this amount of time elapses\n// with no new data, the connection will be cycled.\nconst streamReadTimeoutMillis = 5 * 60 * 1000; // 5 minutes\n\nexport default function Stream(platform, config, environment, diagnosticsAccumulator) {\n const baseUrl = config.streamUrl;\n const logger = config.logger;\n const stream = {};\n const evalUrlPrefix = baseUrl + '/eval/' + environment;\n const useReport = config.useReport;\n const withReasons = config.evaluationReasons;\n const streamReconnectDelay = config.streamReconnectDelay;\n const headers = getLDHeaders(platform, config);\n let firstConnectionErrorLogged = false;\n let es = null;\n let reconnectTimeoutReference = null;\n let connectionAttemptStartTime;\n let user = null;\n let hash = null;\n let handlers = null;\n\n stream.connect = function(newUser, newHash, newHandlers) {\n user = newUser;\n hash = newHash;\n handlers = {};\n for (const key in newHandlers || {}) {\n handlers[key] = function(e) {\n // Reset the state for logging the first connection error so that the first\n // connection error following a successful connection will once again be logged.\n // We will decorate *all* handlers to do this to keep this abstraction agnostic\n // for different stream implementations.\n firstConnectionErrorLogged = false;\n logConnectionResult(true);\n newHandlers[key] && newHandlers[key](e);\n };\n }\n tryConnect();\n };\n\n stream.disconnect = function() {\n clearTimeout(reconnectTimeoutReference);\n reconnectTimeoutReference = null;\n closeConnection();\n };\n\n stream.isConnected = function() {\n return !!(es && platform.eventSourceIsActive && platform.eventSourceIsActive(es));\n };\n\n function handleError(err) {\n if (!firstConnectionErrorLogged) {\n logger.warn(messages.streamError(err, streamReconnectDelay));\n firstConnectionErrorLogged = true;\n }\n logConnectionResult(false);\n closeConnection();\n tryConnect(streamReconnectDelay);\n }\n\n function tryConnect(delay) {\n if (!reconnectTimeoutReference) {\n if (delay) {\n reconnectTimeoutReference = setTimeout(openConnection, delay);\n } else {\n openConnection();\n }\n }\n }\n\n function openConnection() {\n reconnectTimeoutReference = null;\n let url;\n let query = '';\n const options = { headers, readTimeoutMillis: streamReadTimeoutMillis };\n if (platform.eventSourceFactory) {\n if (hash !== null && hash !== undefined) {\n query = 'h=' + hash;\n }\n if (useReport) {\n if (platform.eventSourceAllowsReport) {\n url = evalUrlPrefix;\n options.method = 'REPORT';\n options.headers['Content-Type'] = 'application/json';\n options.body = JSON.stringify(user);\n } else {\n // if we can't do REPORT, fall back to the old ping-based stream\n url = baseUrl + '/ping/' + environment;\n query = '';\n }\n } else {\n url = evalUrlPrefix + '/' + base64URLEncode(JSON.stringify(user));\n }\n options.headers = transformHeaders(options.headers, config);\n if (withReasons) {\n query = query + (query ? '&' : '') + 'withReasons=true';\n }\n url = url + (query ? '?' : '') + query;\n\n closeConnection();\n logger.info(messages.streamConnecting(url));\n logConnectionStarted();\n\n es = platform.eventSourceFactory(url, options);\n for (const key in handlers) {\n if (objectHasOwnProperty(handlers, key)) {\n es.addEventListener(key, handlers[key]);\n }\n }\n\n es.onerror = handleError;\n }\n }\n\n function closeConnection() {\n if (es) {\n logger.info(messages.streamClosing());\n es.close();\n es = null;\n }\n }\n\n function logConnectionStarted() {\n connectionAttemptStartTime = new Date().getTime();\n }\n\n function logConnectionResult(success) {\n if (connectionAttemptStartTime && diagnosticsAccumulator) {\n diagnosticsAccumulator.recordStreamInit(\n connectionAttemptStartTime,\n !success,\n new Date().getTime() - connectionAttemptStartTime\n );\n }\n connectionAttemptStartTime = null;\n }\n\n return stream;\n}\n","import * as utils from './utils';\nimport * as errors from './errors';\nimport * as messages from './messages';\nimport promiseCoalescer from './promiseCoalescer';\n\nconst jsonContentType = 'application/json';\n\nfunction getResponseError(result) {\n if (result.status === 404) {\n return new errors.LDInvalidEnvironmentIdError(messages.environmentNotFound());\n } else {\n return new errors.LDFlagFetchError(messages.errorFetchingFlags(result.statusText || String(result.status)));\n }\n}\n\nexport default function Requestor(platform, options, environment) {\n const baseUrl = options.baseUrl;\n const useReport = options.useReport;\n const withReasons = options.evaluationReasons;\n const logger = options.logger;\n\n const requestor = {};\n\n const activeRequests = {}; // map of URLs to promiseCoalescers\n\n function fetchJSON(endpoint, body) {\n if (!platform.httpRequest) {\n return new Promise((resolve, reject) => {\n reject(new errors.LDFlagFetchError(messages.httpUnavailable()));\n });\n }\n\n const method = body ? 'REPORT' : 'GET';\n const headers = utils.getLDHeaders(platform, options);\n if (body) {\n headers['Content-Type'] = jsonContentType;\n }\n\n let coalescer = activeRequests[endpoint];\n if (!coalescer) {\n coalescer = promiseCoalescer(() => {\n // this will be called once there are no more active requests for the same endpoint\n delete activeRequests[endpoint];\n });\n activeRequests[endpoint] = coalescer;\n }\n\n const req = platform.httpRequest(method, endpoint, utils.transformHeaders(headers, options), body);\n const p = req.promise.then(\n result => {\n if (result.status === 200) {\n // We're using substring here because using startsWith would require a polyfill in IE.\n if (\n result.header('content-type') &&\n result.header('content-type').substring(0, jsonContentType.length) === jsonContentType\n ) {\n return JSON.parse(result.body);\n } else {\n const message = messages.invalidContentType(result.header('content-type') || '');\n return Promise.reject(new errors.LDFlagFetchError(message));\n }\n } else {\n return Promise.reject(getResponseError(result));\n }\n },\n e => Promise.reject(new errors.LDFlagFetchError(messages.networkError(e)))\n );\n coalescer.addPromise(p, () => {\n // this will be called if another request for the same endpoint supersedes this one\n req.cancel && req.cancel();\n });\n return coalescer.resultPromise;\n }\n\n // Performs a GET request to an arbitrary path under baseUrl. Returns a Promise which will resolve\n // with the parsed JSON response, or will be rejected if the request failed.\n requestor.fetchJSON = function(path) {\n return fetchJSON(baseUrl + path, null);\n };\n\n // Requests the current state of all flags for the given user from LaunchDarkly. Returns a Promise\n // which will resolve with the parsed JSON response, or will be rejected if the request failed.\n requestor.fetchFlagSettings = function(user, hash) {\n let data;\n let endpoint;\n let query = '';\n let body;\n\n if (useReport) {\n endpoint = [baseUrl, '/sdk/evalx/', environment, '/user'].join('');\n body = JSON.stringify(user);\n } else {\n data = utils.base64URLEncode(JSON.stringify(user));\n endpoint = [baseUrl, '/sdk/evalx/', environment, '/users/', data].join('');\n }\n if (hash) {\n query = 'h=' + hash;\n }\n if (withReasons) {\n query = query + (query ? '&' : '') + 'withReasons=true';\n }\n endpoint = endpoint + (query ? '?' : '') + query;\n logger.debug(messages.debugPolling(endpoint));\n\n return fetchJSON(endpoint, body);\n };\n\n return requestor;\n}\n","// This function allows a series of Promises to be coalesced such that only the most recently\n// added one actually matters. For instance, if several HTTP requests are made to the same\n// endpoint and we want to ensure that whoever made each one always gets the latest data, each\n// can be passed to addPromise (on the same coalescer) and each caller can wait on the\n// coalescer.resultPromise; all three will then receive the result (or error) from the *last*\n// request, and the results of the first two will be discarded.\n//\n// The cancelFn callback, if present, will be called whenever an existing promise is being\n// discarded. This can be used for instance to abort an HTTP request that's now obsolete.\n//\n// The finallyFn callback, if present, is called on completion of the whole thing. This is\n// different from calling coalescer.resultPromise.finally() because it is executed before any\n// other handlers. Its purpose is to tell the caller that this coalescer should no longer be used.\n\nexport default function promiseCoalescer(finallyFn) {\n let currentPromise;\n let currentCancelFn;\n let finalResolve;\n let finalReject;\n\n const coalescer = {};\n\n coalescer.addPromise = (p, cancelFn) => {\n currentPromise = p;\n currentCancelFn && currentCancelFn();\n currentCancelFn = cancelFn;\n\n p.then(\n result => {\n if (currentPromise === p) {\n finalResolve(result);\n finallyFn && finallyFn();\n }\n },\n error => {\n if (currentPromise === p) {\n finalReject(error);\n finallyFn && finallyFn();\n }\n }\n );\n };\n\n coalescer.resultPromise = new Promise((resolve, reject) => {\n finalResolve = resolve;\n finalReject = reject;\n });\n\n return coalescer;\n}\n","const { v1: uuidv1 } = require('uuid');\n\nimport * as errors from './errors';\nimport * as messages from './messages';\nimport * as utils from './utils';\n\n// Transforms the user object if necessary to make sure it has a valid key.\n// 1. If a key is present, but is not a string, change it to a string.\n// 2. If no key is present, and \"anonymous\" is true, use a UUID as a key. This is cached in local\n// storage if possible.\n// 3. If there is no key (or no user object), return an error.\n\nconst ldUserIdKey = 'ld:$anonUserId';\n\nexport default function UserValidator(persistentStorage) {\n function getCachedUserId() {\n return persistentStorage.get(ldUserIdKey);\n }\n\n function setCachedUserId(id) {\n return persistentStorage.set(ldUserIdKey, id);\n }\n\n const ret = {};\n\n // Validates the user, returning a Promise that resolves to the validated user, or rejects if there is an error.\n ret.validateUser = user => {\n if (!user) {\n return Promise.reject(new errors.LDInvalidUserError(messages.userNotSpecified()));\n }\n\n const userOut = utils.clone(user);\n if (userOut.key !== null && userOut.key !== undefined) {\n userOut.key = userOut.key.toString();\n return Promise.resolve(userOut);\n }\n if (userOut.anonymous) {\n return getCachedUserId().then(cachedId => {\n if (cachedId) {\n userOut.key = cachedId;\n return userOut;\n } else {\n const id = uuidv1();\n userOut.key = id;\n return setCachedUserId(id).then(() => userOut);\n }\n });\n } else {\n return Promise.reject(new errors.LDInvalidUserError(messages.invalidUser()));\n }\n };\n\n return ret;\n}\n","const logLevels = ['debug', 'info', 'warn', 'error', 'none'];\n\n/**\n * A simple logger that writes to stderr.\n */\nexport function commonBasicLogger(options, formatFn) {\n if (options && options.destination && typeof options.destination !== 'function') {\n throw new Error('destination for basicLogger was set to a non-function');\n }\n\n function toConsole(methodName) {\n // The global console variable is not guaranteed to be defined at all times in all browsers:\n // https://www.beyondjava.net/console-log-surprises-with-internet-explorer-11-and-edge\n return function(line) {\n if (console && console[methodName]) {\n console[methodName].call(console, line);\n }\n };\n }\n const destinations =\n options && options.destination\n ? [options.destination, options.destination, options.destination, options.destination]\n : [toConsole('log'), toConsole('info'), toConsole('warn'), toConsole('error')];\n const prependLevelToMessage = !!(options && options.destination); // if we're writing to console.warn, etc. we don't need the prefix\n const prefix =\n !options || options.prefix === undefined || options.prefix === null ? '[LaunchDarkly] ' : options.prefix;\n\n let minLevel = 1; // default is 'info'\n if (options && options.level) {\n for (let i = 0; i < logLevels.length; i++) {\n if (logLevels[i] === options.level) {\n minLevel = i;\n }\n }\n }\n\n function write(levelIndex, levelName, args) {\n if (args.length < 1) {\n return;\n }\n let line;\n const fullPrefix = prependLevelToMessage ? levelName + ': ' + prefix : prefix;\n if (args.length === 1 || !formatFn) {\n line = fullPrefix + args[0];\n } else {\n const tempArgs = [...args];\n tempArgs[0] = fullPrefix + tempArgs[0];\n line = formatFn(...tempArgs);\n }\n try {\n destinations[levelIndex](line);\n } catch (err) {\n console &&\n console.log &&\n console.log(\"[LaunchDarkly] Configured logger's \" + levelName + ' method threw an exception: ' + err);\n }\n }\n\n const logger = {};\n for (let i = 0; i < logLevels.length; i++) {\n const levelName = logLevels[i];\n if (levelName !== 'none') {\n if (i < minLevel) {\n logger[levelName] = () => {};\n } else {\n const levelIndex = i;\n logger[levelName] = function() {\n // can't use arrow function with \"arguments\"\n write(levelIndex, levelName, arguments);\n };\n }\n }\n }\n\n return logger;\n}\n\nexport function validateLogger(logger) {\n logLevels.forEach(level => {\n if (level !== 'none' && (!logger[level] || typeof logger[level] !== 'function')) {\n throw new Error('Provided logger instance must support logger.' + level + '(...) method');\n // Note that the SDK normally does not throw exceptions to the application, but that rule\n // does not apply to LDClient.init() which will throw an exception if the parameters are so\n // invalid that we cannot proceed with creating the client. An invalid logger meets those\n // criteria since the SDK calls the logger during nearly all of its operations.\n }\n });\n}\n","import * as errors from './errors';\nimport { validateLogger } from './loggers';\nimport * as messages from './messages';\nimport * as utils from './utils';\n\n// baseOptionDefs should contain an entry for each supported configuration option in the common package.\n// Each entry can have three properties:\n// - \"default\": the default value if any\n// - \"type\": a type constraint used if the type can't be inferred from the default value). The allowable\n// values are \"boolean\", \"string\", \"number\", \"array\", \"object\", \"function\", or several of these OR'd\n// together with \"|\" (\"function|object\").\n// - \"minimum\": minimum value if any for numeric properties\n//\n// The extraOptionDefs parameter to validate() uses the same format.\nexport const baseOptionDefs = {\n baseUrl: { default: 'https://app.launchdarkly.com' },\n streamUrl: { default: 'https://clientstream.launchdarkly.com' },\n eventsUrl: { default: 'https://events.launchdarkly.com' },\n sendEvents: { default: true },\n streaming: { type: 'boolean' }, // default for this is undefined, which is different from false\n sendLDHeaders: { default: true },\n requestHeaderTransform: { type: 'function' },\n inlineUsersInEvents: { default: false },\n allowFrequentDuplicateEvents: { default: false },\n sendEventsOnlyForVariation: { default: false },\n useReport: { default: false },\n evaluationReasons: { default: false },\n eventCapacity: { default: 100, minimum: 1 },\n flushInterval: { default: 2000, minimum: 2000 },\n samplingInterval: { default: 0, minimum: 0 },\n streamReconnectDelay: { default: 1000, minimum: 0 },\n allAttributesPrivate: { default: false },\n privateAttributeNames: { default: [] },\n bootstrap: { type: 'string|object' },\n diagnosticRecordingInterval: { default: 900000, minimum: 2000 },\n diagnosticOptOut: { default: false },\n wrapperName: { type: 'string' },\n wrapperVersion: { type: 'string' },\n stateProvider: { type: 'object' }, // not a public option, used internally\n autoAliasingOptOut: { default: false },\n};\n\nexport function validate(options, emitter, extraOptionDefs, logger) {\n const optionDefs = utils.extend({ logger: { default: logger } }, baseOptionDefs, extraOptionDefs);\n\n const deprecatedOptions = {\n // As of the latest major version, there are no deprecated options. Next time we deprecate\n // something, add an item here where the property name is the deprecated name, and the\n // property value is the preferred name if any, or null/undefined if there is no replacement.\n };\n\n function checkDeprecatedOptions(config) {\n const opts = config;\n Object.keys(deprecatedOptions).forEach(oldName => {\n if (opts[oldName] !== undefined) {\n const newName = deprecatedOptions[oldName];\n logger && logger.warn(messages.deprecated(oldName, newName));\n if (newName) {\n if (opts[newName] === undefined) {\n opts[newName] = opts[oldName];\n }\n delete opts[oldName];\n }\n }\n });\n }\n\n function applyDefaults(config) {\n // This works differently from utils.extend() in that it *will not* override a default value\n // if the provided value is explicitly set to null. This provides backward compatibility\n // since in the past we only used the provided values if they were truthy.\n const ret = utils.extend({}, config);\n Object.keys(optionDefs).forEach(name => {\n if (ret[name] === undefined || ret[name] === null) {\n ret[name] = optionDefs[name] && optionDefs[name].default;\n }\n });\n return ret;\n }\n\n function validateTypesAndNames(config) {\n const ret = utils.extend({}, config);\n const typeDescForValue = value => {\n if (value === null) {\n return 'any';\n }\n if (value === undefined) {\n return undefined;\n }\n if (Array.isArray(value)) {\n return 'array';\n }\n const t = typeof value;\n if (t === 'boolean' || t === 'string' || t === 'number' || t === 'function') {\n return t;\n }\n return 'object';\n };\n Object.keys(config).forEach(name => {\n const value = config[name];\n if (value !== null && value !== undefined) {\n const optionDef = optionDefs[name];\n if (optionDef === undefined) {\n reportArgumentError(messages.unknownOption(name));\n } else {\n const expectedType = optionDef.type || typeDescForValue(optionDef.default);\n if (expectedType !== 'any') {\n const allowedTypes = expectedType.split('|');\n const actualType = typeDescForValue(value);\n if (allowedTypes.indexOf(actualType) < 0) {\n if (expectedType === 'boolean') {\n ret[name] = !!value;\n reportArgumentError(messages.wrongOptionTypeBoolean(name, actualType));\n } else {\n reportArgumentError(messages.wrongOptionType(name, expectedType, actualType));\n ret[name] = optionDef.default;\n }\n } else {\n if (actualType === 'number' && optionDef.minimum !== undefined && value < optionDef.minimum) {\n reportArgumentError(messages.optionBelowMinimum(name, value, optionDef.minimum));\n ret[name] = optionDef.minimum;\n }\n }\n }\n }\n }\n });\n return ret;\n }\n\n function reportArgumentError(message) {\n utils.onNextTick(() => {\n emitter && emitter.maybeReportError(new errors.LDInvalidArgumentError(message));\n });\n }\n\n let config = utils.extend({}, options || {});\n\n checkDeprecatedOptions(config);\n\n config = applyDefaults(config);\n config = validateTypesAndNames(config);\n validateLogger(config.logger);\n\n return config;\n}\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import rng from './rng.js';\nimport stringify from './stringify.js'; // **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\n\nvar _clockseq; // Previous uuid creation time\n\n\nvar _lastMSecs = 0;\nvar _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details\n\nfunction v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || new Array(16);\n options = options || {};\n var node = options.node || _nodeId;\n var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n\n if (node == null || clockseq == null) {\n var seedBytes = options.random || (options.rng || rng)();\n\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];\n }\n\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n } // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n\n\n var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n\n var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)\n\n var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression\n\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n\n\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n } // Per 4.2.1.2 Throw error if too many uuids are requested\n\n\n if (nsecs >= 10000) {\n throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n\n msecs += 12219292800000; // `time_low`\n\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff; // `time_mid`\n\n var tmh = msecs / 0x100000000 * 10000 & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff; // `time_high_and_version`\n\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n\n b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n\n b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`\n\n b[i++] = clockseq & 0xff; // `node`\n\n for (var n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf || stringify(b);\n}\n\nexport default v1;","import validate from './validate.js';\n\nfunction parse(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n var v;\n var arr = new Uint8Array(16); // Parse ########-....-....-....-............\n\n arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;\n arr[1] = v >>> 16 & 0xff;\n arr[2] = v >>> 8 & 0xff;\n arr[3] = v & 0xff; // Parse ........-####-....-....-............\n\n arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;\n arr[5] = v & 0xff; // Parse ........-....-####-....-............\n\n arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;\n arr[7] = v & 0xff; // Parse ........-....-....-####-............\n\n arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;\n arr[9] = v & 0xff; // Parse ........-....-....-....-############\n // (Use \"/\" to avoid 32-bit truncation when bit-shifting high-order bytes)\n\n arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;\n arr[11] = v / 0x100000000 & 0xff;\n arr[12] = v >>> 24 & 0xff;\n arr[13] = v >>> 16 & 0xff;\n arr[14] = v >>> 8 & 0xff;\n arr[15] = v & 0xff;\n return arr;\n}\n\nexport default parse;","import stringify from './stringify.js';\nimport parse from './parse.js';\n\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n var bytes = [];\n\n for (var i = 0; i < str.length; ++i) {\n bytes.push(str.charCodeAt(i));\n }\n\n return bytes;\n}\n\nexport var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexport var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexport default function (name, version, hashfunc) {\n function generateUUID(value, namespace, buf, offset) {\n if (typeof value === 'string') {\n value = stringToBytes(value);\n }\n\n if (typeof namespace === 'string') {\n namespace = parse(namespace);\n }\n\n if (namespace.length !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n } // Compute hash of namespace and value, Per 4.3\n // Future: Use spread syntax when supported on all platforms, e.g. `bytes =\n // hashfunc([...namespace, ... value])`\n\n\n var bytes = new Uint8Array(16 + value.length);\n bytes.set(namespace);\n bytes.set(value, namespace.length);\n bytes = hashfunc(bytes);\n bytes[6] = bytes[6] & 0x0f | version;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n\n return buf;\n }\n\n return stringify(bytes);\n } // Function#name is not settable on some platforms (#270)\n\n\n try {\n generateUUID.name = name; // eslint-disable-next-line no-empty\n } catch (err) {} // For CommonJS default export support\n\n\n generateUUID.DNS = DNS;\n generateUUID.URL = URL;\n return generateUUID;\n}","/*\n * Browser-compatible JavaScript MD5\n *\n * Modification of JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\nfunction md5(bytes) {\n if (typeof bytes === 'string') {\n var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = new Uint8Array(msg.length);\n\n for (var i = 0; i < msg.length; ++i) {\n bytes[i] = msg.charCodeAt(i);\n }\n }\n\n return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));\n}\n/*\n * Convert an array of little-endian words to an array of bytes\n */\n\n\nfunction md5ToHexEncodedArray(input) {\n var output = [];\n var length32 = input.length * 32;\n var hexTab = '0123456789abcdef';\n\n for (var i = 0; i < length32; i += 8) {\n var x = input[i >> 5] >>> i % 32 & 0xff;\n var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);\n output.push(hex);\n }\n\n return output;\n}\n/**\n * Calculate output length with padding and bit length\n */\n\n\nfunction getOutputLength(inputLength8) {\n return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;\n}\n/*\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n */\n\n\nfunction wordsToMd5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << len % 32;\n x[getOutputLength(len) - 1] = len;\n var a = 1732584193;\n var b = -271733879;\n var c = -1732584194;\n var d = 271733878;\n\n for (var i = 0; i < x.length; i += 16) {\n var olda = a;\n var oldb = b;\n var oldc = c;\n var oldd = d;\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n\n return [a, b, c, d];\n}\n/*\n * Convert an array bytes to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n */\n\n\nfunction bytesToWords(input) {\n if (input.length === 0) {\n return [];\n }\n\n var length8 = input.length * 8;\n var output = new Uint32Array(getOutputLength(length8));\n\n for (var i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;\n }\n\n return output;\n}\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\n\n\nfunction safeAdd(x, y) {\n var lsw = (x & 0xffff) + (y & 0xffff);\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return msw << 16 | lsw & 0xffff;\n}\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\n\n\nfunction bitRotateLeft(num, cnt) {\n return num << cnt | num >>> 32 - cnt;\n}\n/*\n * These functions implement the four basic operations the algorithm uses.\n */\n\n\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\n\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn(b & c | ~b & d, a, b, x, s, t);\n}\n\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn(b & d | c & ~d, a, b, x, s, t);\n}\n\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\n\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\nexport default md5;","import v35 from './v35.js';\nimport md5 from './md5.js';\nvar v3 = v35('v3', 0x30, md5);\nexport default v3;","// Adapted from Chris Veness' SHA1 code at\n// http://www.movable-type.co.uk/scripts/sha1.html\nfunction f(s, x, y, z) {\n switch (s) {\n case 0:\n return x & y ^ ~x & z;\n\n case 1:\n return x ^ y ^ z;\n\n case 2:\n return x & y ^ x & z ^ y & z;\n\n case 3:\n return x ^ y ^ z;\n }\n}\n\nfunction ROTL(x, n) {\n return x << n | x >>> 32 - n;\n}\n\nfunction sha1(bytes) {\n var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];\n var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\n\n if (typeof bytes === 'string') {\n var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = [];\n\n for (var i = 0; i < msg.length; ++i) {\n bytes.push(msg.charCodeAt(i));\n }\n } else if (!Array.isArray(bytes)) {\n // Convert Array-like to Array\n bytes = Array.prototype.slice.call(bytes);\n }\n\n bytes.push(0x80);\n var l = bytes.length / 4 + 2;\n var N = Math.ceil(l / 16);\n var M = new Array(N);\n\n for (var _i = 0; _i < N; ++_i) {\n var arr = new Uint32Array(16);\n\n for (var j = 0; j < 16; ++j) {\n arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3];\n }\n\n M[_i] = arr;\n }\n\n M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);\n M[N - 1][14] = Math.floor(M[N - 1][14]);\n M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;\n\n for (var _i2 = 0; _i2 < N; ++_i2) {\n var W = new Uint32Array(80);\n\n for (var t = 0; t < 16; ++t) {\n W[t] = M[_i2][t];\n }\n\n for (var _t = 16; _t < 80; ++_t) {\n W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1);\n }\n\n var a = H[0];\n var b = H[1];\n var c = H[2];\n var d = H[3];\n var e = H[4];\n\n for (var _t2 = 0; _t2 < 80; ++_t2) {\n var s = Math.floor(_t2 / 20);\n var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0;\n e = d;\n d = c;\n c = ROTL(b, 30) >>> 0;\n b = a;\n a = T;\n }\n\n H[0] = H[0] + a >>> 0;\n H[1] = H[1] + b >>> 0;\n H[2] = H[2] + c >>> 0;\n H[3] = H[3] + d >>> 0;\n H[4] = H[4] + e >>> 0;\n }\n\n return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];\n}\n\nexport default sha1;","import v35 from './v35.js';\nimport sha1 from './sha1.js';\nvar v5 = v35('v5', 0x50, sha1);\nexport default v5;","const { v1: uuidv1 } = require('uuid');\n// Note that in the diagnostic events spec, these IDs are to be generated with UUID v4. However,\n// in JS we were already using v1 for unique user keys, so to avoid bringing in two packages we\n// will use v1 here as well.\n\nconst { baseOptionDefs } = require('./configuration');\nconst messages = require('./messages');\n\nfunction DiagnosticId(sdkKey) {\n const ret = {\n diagnosticId: uuidv1(),\n };\n if (sdkKey) {\n ret.sdkKeySuffix = sdkKey.length > 6 ? sdkKey.substring(sdkKey.length - 6) : sdkKey;\n }\n return ret;\n}\n\n// A stateful object holding statistics that will go into diagnostic events.\n\nfunction DiagnosticsAccumulator(startTime) {\n let dataSinceDate, droppedEvents, eventsInLastBatch, streamInits;\n\n function reset(time) {\n dataSinceDate = time;\n droppedEvents = 0;\n eventsInLastBatch = 0;\n streamInits = [];\n }\n\n reset(startTime);\n\n return {\n getProps: () => ({\n dataSinceDate,\n droppedEvents,\n eventsInLastBatch,\n streamInits,\n // omit deduplicatedUsers for the JS SDKs because they don't deduplicate users\n }),\n setProps: props => {\n dataSinceDate = props.dataSinceDate;\n droppedEvents = props.droppedEvents || 0;\n eventsInLastBatch = props.eventsInLastBatch || 0;\n streamInits = props.streamInits || [];\n },\n incrementDroppedEvents: () => {\n droppedEvents++;\n },\n setEventsInLastBatch: n => {\n eventsInLastBatch = n;\n },\n recordStreamInit: (timestamp, failed, durationMillis) => {\n const info = { timestamp, failed, durationMillis };\n streamInits.push(info);\n },\n reset,\n };\n}\n\n// An object that maintains information that will go into diagnostic events, and knows how to format\n// those events. It is instantiated by the SDK client, and shared with the event processor.\n//\n// The JS-based SDKs have two modes for diagnostic events. By default, the behavior is basically the\n// same as the server-side SDKs: a \"diagnostic-init\" event is sent on startup, and then \"diagnostic\"\n// events with operating statistics are sent periodically. However, in a browser environment this is\n// undesirable because the page may be reloaded frequently. In that case, setting the property\n// \"platform.diagnosticUseCombinedEvent\" to true enables an alternate mode in which a combination of\n// both kinds of event is sent at intervals, relative to the last time this was done (if any) which\n// is cached in local storage.\n\nfunction DiagnosticsManager(\n platform,\n persistentStorage,\n accumulator,\n eventSender,\n environmentId,\n config,\n diagnosticId\n) {\n const combinedMode = !!platform.diagnosticUseCombinedEvent;\n const localStorageKey = 'ld:' + environmentId + ':$diagnostics';\n const diagnosticEventsUrl = config.eventsUrl + '/events/diagnostic/' + environmentId;\n const periodicInterval = config.diagnosticRecordingInterval;\n const acc = accumulator;\n const initialEventSamplingInterval = 4; // used only in combined mode - see start()\n let streamingEnabled = !!config.streaming;\n let eventSentTime;\n let periodicTimer;\n const manager = {};\n\n function makeInitProperties() {\n return {\n sdk: makeSdkData(),\n configuration: makeConfigData(),\n platform: platform.diagnosticPlatformData,\n };\n }\n\n // Send a diagnostic event and do not wait for completion.\n function sendDiagnosticEvent(event) {\n config.logger && config.logger.debug(messages.debugPostingDiagnosticEvent(event));\n eventSender\n .sendEvents(event, diagnosticEventsUrl, true)\n .then(() => undefined)\n .catch(() => undefined);\n }\n\n function loadProperties(callback) {\n if (!persistentStorage.isEnabled()) {\n return callback(false); // false indicates that local storage is not available\n }\n persistentStorage\n .get(localStorageKey)\n .then(data => {\n if (data) {\n try {\n const props = JSON.parse(data);\n acc.setProps(props);\n eventSentTime = props.dataSinceDate;\n } catch (e) {\n // disregard malformed cached data\n }\n }\n callback(true);\n })\n .catch(() => {\n callback(false);\n });\n }\n\n function saveProperties() {\n if (persistentStorage.isEnabled()) {\n const props = { ...acc.getProps() };\n persistentStorage.set(localStorageKey, JSON.stringify(props));\n }\n }\n\n // Creates the initial event that is sent by the event processor when the SDK starts up. This will not\n // be repeated during the lifetime of the SDK client. In combined mode, we don't send this.\n function createInitEvent() {\n return {\n kind: 'diagnostic-init',\n id: diagnosticId,\n creationDate: acc.getProps().dataSinceDate,\n ...makeInitProperties(),\n };\n }\n\n // Creates a periodic event containing time-dependent stats, and resets the state of the manager with\n // regard to those stats. In combined mode (browser SDK) this also contains the configuration data.\n function createPeriodicEventAndReset() {\n const currentTime = new Date().getTime();\n let ret = {\n kind: combinedMode ? 'diagnostic-combined' : 'diagnostic',\n id: diagnosticId,\n creationDate: currentTime,\n ...acc.getProps(),\n };\n if (combinedMode) {\n ret = { ...ret, ...makeInitProperties() };\n }\n acc.reset(currentTime);\n return ret;\n }\n\n function sendPeriodicEvent() {\n sendDiagnosticEvent(createPeriodicEventAndReset());\n periodicTimer = setTimeout(sendPeriodicEvent, periodicInterval);\n eventSentTime = new Date().getTime();\n if (combinedMode) {\n saveProperties();\n }\n }\n\n function makeSdkData() {\n const sdkData = { ...platform.diagnosticSdkData };\n if (config.wrapperName) {\n sdkData.wrapperName = config.wrapperName;\n }\n if (config.wrapperVersion) {\n sdkData.wrapperVersion = config.wrapperVersion;\n }\n return sdkData;\n }\n\n function makeConfigData() {\n const configData = {\n customBaseURI: config.baseUrl !== baseOptionDefs.baseUrl.default,\n customStreamURI: config.streamUrl !== baseOptionDefs.streamUrl.default,\n customEventsURI: config.eventsUrl !== baseOptionDefs.eventsUrl.default,\n eventsCapacity: config.eventCapacity,\n eventsFlushIntervalMillis: config.flushInterval,\n reconnectTimeMillis: config.streamReconnectDelay,\n streamingDisabled: !streamingEnabled,\n allAttributesPrivate: !!config.allAttributesPrivate,\n inlineUsersInEvents: !!config.inlineUsersInEvents,\n diagnosticRecordingIntervalMillis: config.diagnosticRecordingInterval,\n // The following extra properties are only provided by client-side JS SDKs:\n usingSecureMode: !!config.hash,\n bootstrapMode: !!config.bootstrap,\n fetchGoalsDisabled: !config.fetchGoals,\n allowFrequentDuplicateEvents: !!config.allowFrequentDuplicateEvents,\n sendEventsOnlyForVariation: !!config.sendEventsOnlyForVariation,\n autoAliasingOptOut: !!config.autoAliasingOptOut,\n };\n // Client-side JS SDKs do not have the following properties which other SDKs have:\n // connectTimeoutMillis\n // pollingIntervalMillis\n // samplingInterval\n // socketTimeoutMillis\n // startWaitMillis\n // userKeysCapacity\n // userKeysFlushIntervalMillis\n // usingProxy\n // usingProxyAuthenticator\n // usingRelayDaemon\n\n return configData;\n }\n\n // Called when the SDK is starting up. Either send an init event immediately, or, in the alternate\n // mode, check for cached local storage properties and send an event only if we haven't done so\n // recently.\n manager.start = () => {\n if (combinedMode) {\n loadProperties(localStorageAvailable => {\n if (localStorageAvailable) {\n const nextEventTime = (eventSentTime || 0) + periodicInterval;\n const timeNow = new Date().getTime();\n if (timeNow >= nextEventTime) {\n sendPeriodicEvent();\n } else {\n periodicTimer = setTimeout(sendPeriodicEvent, nextEventTime - timeNow);\n }\n } else {\n // We don't have the ability to cache anything in local storage, so we don't know if we\n // recently sent an event before this page load, but we would still prefer not to send one\n // on *every* page load. So, as a rough heuristic, we'll decide semi-randomly.\n if (Math.floor(Math.random() * initialEventSamplingInterval) === 0) {\n sendPeriodicEvent();\n } else {\n periodicTimer = setTimeout(sendPeriodicEvent, periodicInterval);\n }\n }\n });\n } else {\n sendDiagnosticEvent(createInitEvent());\n periodicTimer = setTimeout(sendPeriodicEvent, periodicInterval);\n }\n };\n\n manager.stop = () => {\n periodicTimer && clearTimeout(periodicTimer);\n };\n\n // Called when streaming mode is turned on or off dynamically.\n manager.setStreaming = enabled => {\n streamingEnabled = enabled;\n };\n\n return manager;\n}\n\nmodule.exports = {\n DiagnosticId,\n DiagnosticsAccumulator,\n DiagnosticsManager,\n};\n","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","export default '00000000-0000-0000-0000-000000000000';","import validate from './validate.js';\n\nfunction version(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n return parseInt(uuid.substr(14, 1), 16);\n}\n\nexport default version;","import EventProcessor from './EventProcessor';\nimport EventEmitter from './EventEmitter';\nimport EventSender from './EventSender';\nimport InitializationStateTracker from './InitializationState';\nimport PersistentFlagStore from './PersistentFlagStore';\nimport PersistentStorage from './PersistentStorage';\nimport Stream from './Stream';\nimport Requestor from './Requestor';\nimport Identity from './Identity';\nimport UserValidator from './UserValidator';\nimport * as configuration from './configuration';\nimport * as diagnostics from './diagnosticEvents';\nimport { commonBasicLogger } from './loggers';\nimport * as utils from './utils';\nimport * as errors from './errors';\nimport * as messages from './messages';\n\nconst changeEvent = 'change';\nconst internalChangeEvent = 'internal-change';\n\n// This is called by the per-platform initialize functions to create the base client object that we\n// may also extend with additional behavior. It returns an object with these properties:\n// client: the actual client object\n// options: the configuration (after any appropriate defaults have been applied)\n// If we need to give the platform-specific clients access to any internals here, we should add those\n// as properties of the return object, not public properties of the client.\n//\n// For definitions of the API in the platform object, see stubPlatform.js in the test code.\n\nexport function initialize(env, user, specifiedOptions, platform, extraOptionDefs) {\n const logger = createLogger();\n const emitter = EventEmitter(logger);\n const initializationStateTracker = InitializationStateTracker(emitter);\n const options = configuration.validate(specifiedOptions, emitter, extraOptionDefs, logger);\n const sendEvents = options.sendEvents;\n let environment = env;\n let hash = options.hash;\n\n const persistentStorage = PersistentStorage(platform.localStorage, logger);\n\n const eventSender = EventSender(platform, environment, options);\n\n const diagnosticsEnabled = options.sendEvents && !options.diagnosticOptOut;\n const diagnosticId = diagnosticsEnabled ? diagnostics.DiagnosticId(environment) : null;\n const diagnosticsAccumulator = diagnosticsEnabled ? diagnostics.DiagnosticsAccumulator(new Date().getTime()) : null;\n const diagnosticsManager = diagnosticsEnabled\n ? diagnostics.DiagnosticsManager(\n platform,\n persistentStorage,\n diagnosticsAccumulator,\n eventSender,\n environment,\n options,\n diagnosticId\n )\n : null;\n\n const stream = Stream(platform, options, environment, diagnosticsAccumulator);\n\n const events =\n options.eventProcessor ||\n EventProcessor(platform, options, environment, diagnosticsAccumulator, emitter, eventSender);\n\n const requestor = Requestor(platform, options, environment);\n\n const seenRequests = {};\n let flags = {};\n let useLocalStorage;\n let streamActive;\n let streamForcedState = options.streaming;\n let subscribedToChangeEvents;\n let inited = false;\n let closed = false;\n let firstEvent = true;\n\n // The \"stateProvider\" object is used in the Electron SDK, to allow one client instance to take partial\n // control of another. If present, it has the following contract:\n // - getInitialState() returns the initial client state if it is already available. The state is an\n // object whose properties are \"environment\", \"user\", and \"flags\".\n // - on(\"init\", listener) triggers an event when the initial client state becomes available, passing\n // the state object to the listener.\n // - on(\"update\", listener) triggers an event when flag values change and/or the current user changes.\n // The parameter is an object that *may* contain \"user\" and/or \"flags\".\n // - enqueueEvent(event) accepts an analytics event object and returns true if the stateProvider will\n // be responsible for delivering it, or false if we still should deliver it ourselves.\n const stateProvider = options.stateProvider;\n\n const ident = Identity(null, onIdentifyChange);\n const userValidator = UserValidator(persistentStorage);\n const persistentFlagStore = persistentStorage.isEnabled()\n ? new PersistentFlagStore(persistentStorage, environment, hash, ident, logger)\n : null;\n\n function createLogger() {\n if (specifiedOptions && specifiedOptions.logger) {\n return specifiedOptions.logger;\n }\n return (extraOptionDefs && extraOptionDefs.logger && extraOptionDefs.logger.default) || commonBasicLogger('warn');\n }\n\n function readFlagsFromBootstrap(data) {\n // If the bootstrap data came from an older server-side SDK, we'll have just a map of keys to values.\n // Newer SDKs that have an allFlagsState method will provide an extra \"$flagsState\" key that contains\n // the rest of the metadata we want. We do it this way for backward compatibility with older JS SDKs.\n const keys = Object.keys(data);\n const metadataKey = '$flagsState';\n const validKey = '$valid';\n const metadata = data[metadataKey];\n if (!metadata && keys.length) {\n logger.warn(messages.bootstrapOldFormat());\n }\n if (data[validKey] === false) {\n logger.warn(messages.bootstrapInvalid());\n }\n const ret = {};\n keys.forEach(key => {\n if (key !== metadataKey && key !== validKey) {\n let flag = { value: data[key] };\n if (metadata && metadata[key]) {\n flag = utils.extend(flag, metadata[key]);\n } else {\n flag.version = 0;\n }\n ret[key] = flag;\n }\n });\n return ret;\n }\n\n function shouldEnqueueEvent() {\n return sendEvents && !closed && !platform.isDoNotTrack();\n }\n\n function enqueueEvent(event) {\n if (!environment) {\n // We're in paired mode and haven't been initialized with an environment or user yet\n return;\n }\n if (stateProvider && stateProvider.enqueueEvent && stateProvider.enqueueEvent(event)) {\n return; // it'll be handled elsewhere\n }\n if (event.kind !== 'alias') {\n if (!event.user) {\n if (firstEvent) {\n logger.warn(messages.eventWithoutUser());\n firstEvent = false;\n }\n return;\n }\n firstEvent = false;\n }\n if (shouldEnqueueEvent()) {\n logger.debug(messages.debugEnqueueingEvent(event.kind));\n events.enqueue(event);\n }\n }\n\n function onIdentifyChange(user, previousUser) {\n sendIdentifyEvent(user);\n if (!options.autoAliasingOptOut && previousUser && previousUser.anonymous && user && !user.anonymous) {\n alias(user, previousUser);\n }\n }\n\n function sendIdentifyEvent(user) {\n if (stateProvider) {\n // In paired mode, the other client is responsible for sending identify events\n return;\n }\n if (user) {\n enqueueEvent({\n kind: 'identify',\n key: user.key,\n user: user,\n creationDate: new Date().getTime(),\n });\n }\n }\n\n function sendFlagEvent(key, detail, defaultValue, includeReason) {\n const user = ident.getUser();\n const now = new Date();\n const value = detail ? detail.value : null;\n if (!options.allowFrequentDuplicateEvents) {\n const cacheKey = JSON.stringify(value) + (user && user.key ? user.key : '') + key; // see below\n const cached = seenRequests[cacheKey];\n // cache TTL is five minutes\n if (cached && now - cached < 300000) {\n return;\n }\n seenRequests[cacheKey] = now;\n }\n\n const event = {\n kind: 'feature',\n key: key,\n user: user,\n value: value,\n variation: detail ? detail.variationIndex : null,\n default: defaultValue,\n creationDate: now.getTime(),\n };\n if (user && user.anonymous) {\n event.contextKind = userContextKind(user);\n }\n const flag = flags[key];\n if (flag) {\n event.version = flag.flagVersion ? flag.flagVersion : flag.version;\n event.trackEvents = flag.trackEvents;\n event.debugEventsUntilDate = flag.debugEventsUntilDate;\n }\n if ((includeReason || (flag && flag.trackReason)) && detail) {\n event.reason = detail.reason;\n }\n\n enqueueEvent(event);\n }\n\n function identify(user, newHash, onDone) {\n if (closed) {\n return utils.wrapPromiseCallback(Promise.resolve({}), onDone);\n }\n if (stateProvider) {\n // We're being controlled by another client instance, so only that instance is allowed to change the user\n logger.warn(messages.identifyDisabled());\n return utils.wrapPromiseCallback(Promise.resolve(utils.transformVersionedValuesToValues(flags)), onDone);\n }\n const clearFirst = useLocalStorage && persistentFlagStore ? persistentFlagStore.clearFlags() : Promise.resolve();\n return utils.wrapPromiseCallback(\n clearFirst\n .then(() => userValidator.validateUser(user))\n .then(realUser =>\n requestor\n .fetchFlagSettings(realUser, newHash)\n // the following then() is nested within this one so we can use realUser from the previous closure\n .then(requestedFlags => {\n const flagValueMap = utils.transformVersionedValuesToValues(requestedFlags);\n ident.setUser(realUser);\n hash = newHash;\n if (requestedFlags) {\n return replaceAllFlags(requestedFlags).then(() => flagValueMap);\n } else {\n return flagValueMap;\n }\n })\n )\n .then(flagValueMap => {\n if (streamActive) {\n connectStream();\n }\n return flagValueMap;\n })\n .catch(err => {\n emitter.maybeReportError(err);\n return Promise.reject(err);\n }),\n onDone\n );\n }\n\n function getUser() {\n return ident.getUser();\n }\n\n function flush(onDone) {\n return utils.wrapPromiseCallback(sendEvents ? events.flush() : Promise.resolve(), onDone);\n }\n\n function variation(key, defaultValue) {\n return variationDetailInternal(key, defaultValue, true, false).value;\n }\n\n function variationDetail(key, defaultValue) {\n return variationDetailInternal(key, defaultValue, true, true);\n }\n\n function variationDetailInternal(key, defaultValue, sendEvent, includeReasonInEvent) {\n let detail;\n\n if (flags && utils.objectHasOwnProperty(flags, key) && flags[key] && !flags[key].deleted) {\n const flag = flags[key];\n detail = getFlagDetail(flag);\n if (flag.value === null || flag.value === undefined) {\n detail.value = defaultValue;\n }\n } else {\n detail = { value: defaultValue, variationIndex: null, reason: { kind: 'ERROR', errorKind: 'FLAG_NOT_FOUND' } };\n }\n\n if (sendEvent) {\n sendFlagEvent(key, detail, defaultValue, includeReasonInEvent);\n }\n\n return detail;\n }\n\n function getFlagDetail(flag) {\n return {\n value: flag.value,\n variationIndex: flag.variation === undefined ? null : flag.variation,\n reason: flag.reason || null,\n };\n // Note, the logic above ensures that variationIndex and reason will always be null rather than\n // undefined if we don't have values for them. That's just to avoid subtle errors that depend on\n // whether an object was JSON-encoded with null properties omitted or not.\n }\n\n function allFlags() {\n const results = {};\n\n if (!flags) {\n return results;\n }\n\n for (const key in flags) {\n if (utils.objectHasOwnProperty(flags, key)) {\n results[key] = variationDetailInternal(key, null, !options.sendEventsOnlyForVariation).value;\n }\n }\n\n return results;\n }\n\n function userContextKind(user) {\n return user.anonymous ? 'anonymousUser' : 'user';\n }\n\n function alias(user, previousUser) {\n if (stateProvider) {\n // In paired mode, the other client is responsible for sending alias events\n return;\n }\n\n if (!user || !previousUser) {\n return;\n }\n\n enqueueEvent({\n kind: 'alias',\n key: user.key,\n contextKind: userContextKind(user),\n previousKey: previousUser.key,\n previousContextKind: userContextKind(previousUser),\n creationDate: new Date().getTime(),\n });\n }\n\n function track(key, data, metricValue) {\n if (typeof key !== 'string') {\n emitter.maybeReportError(new errors.LDInvalidEventKeyError(messages.unknownCustomEventKey(key)));\n return;\n }\n\n // The following logic was used only for the JS browser SDK (js-client-sdk) and\n // is no longer needed as of version 2.9.13 of that SDK. The other client-side\n // JS-based SDKs did not define customEventFilter, and now none of them do. We\n // can remove this in the next major version of the common code, when it's OK to\n // make breaking changes to our internal API contracts.\n if (platform.customEventFilter && !platform.customEventFilter(key)) {\n logger.warn(messages.unknownCustomEventKey(key));\n }\n\n const user = ident.getUser();\n const e = {\n kind: 'custom',\n key: key,\n user: user,\n url: platform.getCurrentUrl(),\n creationDate: new Date().getTime(),\n };\n if (user && user.anonymous) {\n e.contextKind = userContextKind(user);\n }\n // Note, check specifically for null/undefined because it is legal to set these fields to a falsey value.\n if (data !== null && data !== undefined) {\n e.data = data;\n }\n if (metricValue !== null && metricValue !== undefined) {\n e.metricValue = metricValue;\n }\n enqueueEvent(e);\n }\n\n function connectStream() {\n streamActive = true;\n if (!ident.getUser()) {\n return;\n }\n stream.connect(ident.getUser(), hash, {\n ping: function() {\n logger.debug(messages.debugStreamPing());\n const userAtTimeOfPingEvent = ident.getUser();\n requestor\n .fetchFlagSettings(userAtTimeOfPingEvent, hash)\n .then(requestedFlags => {\n // Check whether the current user is still the same - we don't want to overwrite the flags if\n // the application has called identify() while this request was in progress\n if (utils.deepEquals(userAtTimeOfPingEvent, ident.getUser())) {\n replaceAllFlags(requestedFlags || {});\n }\n })\n .catch(err => {\n emitter.maybeReportError(new errors.LDFlagFetchError(messages.errorFetchingFlags(err)));\n });\n },\n put: function(e) {\n const data = JSON.parse(e.data);\n logger.debug(messages.debugStreamPut());\n replaceAllFlags(data); // don't wait for this Promise to be resolved\n },\n patch: function(e) {\n const data = JSON.parse(e.data);\n // If both the flag and the patch have a version property, then the patch version must be\n // greater than the flag version for us to accept the patch. If either one has no version\n // then the patch always succeeds.\n const oldFlag = flags[data.key];\n if (!oldFlag || !oldFlag.version || !data.version || oldFlag.version < data.version) {\n logger.debug(messages.debugStreamPatch(data.key));\n const mods = {};\n const newFlag = utils.extend({}, data);\n delete newFlag['key'];\n flags[data.key] = newFlag;\n const newDetail = getFlagDetail(newFlag);\n if (oldFlag) {\n mods[data.key] = { previous: oldFlag.value, current: newDetail };\n } else {\n mods[data.key] = { current: newDetail };\n }\n handleFlagChanges(mods); // don't wait for this Promise to be resolved\n } else {\n logger.debug(messages.debugStreamPatchIgnored(data.key));\n }\n },\n delete: function(e) {\n const data = JSON.parse(e.data);\n if (!flags[data.key] || flags[data.key].version < data.version) {\n logger.debug(messages.debugStreamDelete(data.key));\n const mods = {};\n if (flags[data.key] && !flags[data.key].deleted) {\n mods[data.key] = { previous: flags[data.key].value };\n }\n flags[data.key] = { version: data.version, deleted: true };\n handleFlagChanges(mods); // don't wait for this Promise to be resolved\n } else {\n logger.debug(messages.debugStreamDeleteIgnored(data.key));\n }\n },\n });\n }\n\n function disconnectStream() {\n if (streamActive) {\n stream.disconnect();\n streamActive = false;\n }\n }\n\n // Returns a Promise which will be resolved when we have completely updated the internal flags state,\n // dispatched all change events, and updated local storage if appropriate. This Promise is guaranteed\n // never to have an unhandled rejection.\n function replaceAllFlags(newFlags) {\n const changes = {};\n\n if (!newFlags) {\n return Promise.resolve();\n }\n\n for (const key in flags) {\n if (utils.objectHasOwnProperty(flags, key) && flags[key]) {\n if (newFlags[key] && !utils.deepEquals(newFlags[key].value, flags[key].value)) {\n changes[key] = { previous: flags[key].value, current: getFlagDetail(newFlags[key]) };\n } else if (!newFlags[key] || newFlags[key].deleted) {\n changes[key] = { previous: flags[key].value };\n }\n }\n }\n for (const key in newFlags) {\n if (utils.objectHasOwnProperty(newFlags, key) && newFlags[key] && (!flags[key] || flags[key].deleted)) {\n changes[key] = { current: getFlagDetail(newFlags[key]) };\n }\n }\n\n flags = { ...newFlags };\n return handleFlagChanges(changes).catch(() => {}); // swallow any exceptions from this Promise\n }\n\n // Returns a Promise which will be resolved when we have dispatched all change events and updated\n // local storage if appropriate.\n function handleFlagChanges(changes) {\n const keys = Object.keys(changes);\n\n if (keys.length > 0) {\n const changeEventParams = {};\n keys.forEach(key => {\n const current = changes[key].current;\n const value = current ? current.value : undefined;\n const previous = changes[key].previous;\n emitter.emit(changeEvent + ':' + key, value, previous);\n changeEventParams[key] = current ? { current: value, previous: previous } : { previous: previous };\n });\n\n emitter.emit(changeEvent, changeEventParams);\n emitter.emit(internalChangeEvent, flags);\n\n // By default, we send feature evaluation events whenever we have received new flag values -\n // the client has in effect evaluated these flags just by receiving them. This can be suppressed\n // by setting \"sendEventsOnlyForVariation\". Also, if we have a stateProvider, we don't send these\n // events because we assume they have already been sent by the other client that gave us the flags\n // (when it received them in the first place).\n if (!options.sendEventsOnlyForVariation && !stateProvider) {\n keys.forEach(key => {\n sendFlagEvent(key, changes[key].current);\n });\n }\n }\n\n if (useLocalStorage && persistentFlagStore) {\n return persistentFlagStore.saveFlags(flags);\n } else {\n return Promise.resolve();\n }\n }\n\n function on(event, handler, context) {\n if (isChangeEventKey(event)) {\n subscribedToChangeEvents = true;\n if (inited) {\n updateStreamingState();\n }\n emitter.on(event, handler, context);\n } else {\n emitter.on(...arguments);\n }\n }\n\n function off(event) {\n emitter.off(...arguments);\n if (isChangeEventKey(event)) {\n let haveListeners = false;\n emitter.getEvents().forEach(key => {\n if (isChangeEventKey(key) && emitter.getEventListenerCount(key) > 0) {\n haveListeners = true;\n }\n });\n if (!haveListeners) {\n subscribedToChangeEvents = false;\n if (streamActive && streamForcedState === undefined) {\n disconnectStream();\n }\n }\n }\n }\n\n function setStreaming(state) {\n const newState = state === null ? undefined : state;\n if (newState !== streamForcedState) {\n streamForcedState = newState;\n updateStreamingState();\n }\n }\n\n function updateStreamingState() {\n const shouldBeStreaming = streamForcedState || (subscribedToChangeEvents && streamForcedState === undefined);\n if (shouldBeStreaming && !streamActive) {\n connectStream();\n } else if (!shouldBeStreaming && streamActive) {\n disconnectStream();\n }\n if (diagnosticsManager) {\n diagnosticsManager.setStreaming(shouldBeStreaming);\n }\n }\n\n function isChangeEventKey(event) {\n return event === changeEvent || event.substr(0, changeEvent.length + 1) === changeEvent + ':';\n }\n\n if (typeof options.bootstrap === 'string' && options.bootstrap.toUpperCase() === 'LOCALSTORAGE') {\n if (persistentFlagStore) {\n useLocalStorage = true;\n } else {\n logger.warn(messages.localStorageUnavailable());\n }\n }\n\n if (typeof options.bootstrap === 'object') {\n // Set the flags as soon as possible before we get into any async code, so application code can read\n // them even if the ready event has not yet fired.\n flags = readFlagsFromBootstrap(options.bootstrap);\n }\n\n if (stateProvider) {\n // The stateProvider option is used in the Electron SDK, to allow a client instance in the main process\n // to control another client instance (i.e. this one) in the renderer process. We can't predict which\n // one will start up first, so the initial state may already be available for us or we may have to wait\n // to receive it.\n const state = stateProvider.getInitialState();\n if (state) {\n initFromStateProvider(state);\n } else {\n stateProvider.on('init', initFromStateProvider);\n }\n stateProvider.on('update', updateFromStateProvider);\n } else {\n finishInit().catch(signalFailedInit);\n }\n\n function finishInit() {\n if (!env) {\n return Promise.reject(new errors.LDInvalidEnvironmentIdError(messages.environmentNotSpecified()));\n }\n return userValidator.validateUser(user).then(realUser => {\n ident.setUser(realUser);\n if (typeof options.bootstrap === 'object') {\n // flags have already been set earlier\n return signalSuccessfulInit();\n } else if (useLocalStorage) {\n return finishInitWithLocalStorage();\n } else {\n return finishInitWithPolling();\n }\n });\n }\n\n function finishInitWithLocalStorage() {\n return persistentFlagStore.loadFlags().then(storedFlags => {\n if (storedFlags === null || storedFlags === undefined) {\n flags = {};\n return requestor\n .fetchFlagSettings(ident.getUser(), hash)\n .then(requestedFlags => replaceAllFlags(requestedFlags || {}))\n .then(signalSuccessfulInit)\n .catch(err => {\n const initErr = new errors.LDFlagFetchError(messages.errorFetchingFlags(err));\n signalFailedInit(initErr);\n });\n } else {\n // We're reading the flags from local storage. Signal that we're ready,\n // then update localStorage for the next page load. We won't signal changes or update\n // the in-memory flags unless you subscribe for changes\n flags = storedFlags;\n utils.onNextTick(signalSuccessfulInit);\n\n return requestor\n .fetchFlagSettings(ident.getUser(), hash)\n .then(requestedFlags => replaceAllFlags(requestedFlags))\n .catch(err => emitter.maybeReportError(err));\n }\n });\n }\n\n function finishInitWithPolling() {\n return requestor\n .fetchFlagSettings(ident.getUser(), hash)\n .then(requestedFlags => {\n flags = requestedFlags || {};\n // Note, we don't need to call updateSettings here because local storage and change events are not relevant\n signalSuccessfulInit();\n })\n .catch(err => {\n flags = {};\n signalFailedInit(err);\n });\n }\n\n function initFromStateProvider(state) {\n environment = state.environment;\n ident.setUser(state.user);\n flags = { ...state.flags };\n utils.onNextTick(signalSuccessfulInit);\n }\n\n function updateFromStateProvider(state) {\n if (state.user) {\n ident.setUser(state.user);\n }\n if (state.flags) {\n replaceAllFlags(state.flags); // don't wait for this Promise to be resolved\n }\n }\n\n function signalSuccessfulInit() {\n logger.info(messages.clientInitialized());\n inited = true;\n updateStreamingState();\n initializationStateTracker.signalSuccess();\n }\n\n function signalFailedInit(err) {\n initializationStateTracker.signalFailure(err);\n }\n\n function start() {\n if (sendEvents) {\n if (diagnosticsManager) {\n diagnosticsManager.start();\n }\n events.start();\n }\n }\n\n function close(onDone) {\n if (closed) {\n return utils.wrapPromiseCallback(Promise.resolve(), onDone);\n }\n const finishClose = () => {\n closed = true;\n flags = {};\n };\n const p = Promise.resolve()\n .then(() => {\n disconnectStream();\n if (diagnosticsManager) {\n diagnosticsManager.stop();\n }\n if (sendEvents) {\n events.stop();\n return events.flush();\n }\n })\n .then(finishClose)\n .catch(finishClose);\n return utils.wrapPromiseCallback(p, onDone);\n }\n\n function getFlagsInternal() {\n // used by Electron integration\n return flags;\n }\n\n const client = {\n waitForInitialization: () => initializationStateTracker.getInitializationPromise(),\n waitUntilReady: () => initializationStateTracker.getReadyPromise(),\n identify: identify,\n getUser: getUser,\n variation: variation,\n variationDetail: variationDetail,\n track: track,\n alias: alias,\n on: on,\n off: off,\n setStreaming: setStreaming,\n flush: flush,\n allFlags: allFlags,\n close: close,\n };\n\n return {\n client: client, // The client object containing all public methods.\n options: options, // The validated configuration object, including all defaults.\n emitter: emitter, // The event emitter which can be used to log errors or trigger events.\n ident: ident, // The Identity object that manages the current user.\n logger: logger, // The logging abstraction.\n requestor: requestor, // The Requestor object.\n start: start, // Starts the client once the environment is ready.\n enqueueEvent: enqueueEvent, // Puts an analytics event in the queue, if event sending is enabled.\n getFlagsInternal: getFlagsInternal, // Returns flag data structure with all details.\n getEnvironmentId: () => environment, // Gets the environment ID (this may have changed since initialization, if we have a state provider)\n internalChangeEventName: internalChangeEvent, // This event is triggered whenever we have new flag state.\n };\n}\n\nexport const version = VERSION;\nexport { commonBasicLogger };\nexport { errors };\nexport { messages };\nexport { utils };\n","import * as messages from './messages';\n\n// The localStorageProvider is provided by the platform object. It should have the following\n// methods, each of which should return a Promise:\n// - get(key): Gets the string value, if any, for the given key\n// - set(key, value): Stores a string value for the given key\n// - remove(key): Removes the given key\n//\n// Storage is just a light wrapper of the localStorageProvider, adding error handling and\n// ensuring that we don't call it if it's unavailable. The get method will simply resolve\n// with an undefined value if there is an error or if there is no localStorageProvider.\n// None of the promises returned by Storage will ever be rejected.\n//\n// It is always possible that the underlying platform storage mechanism might fail or be\n// disabled. If so, it's likely that it will keep failing, so we will only log one warning\n// instead of repetitive warnings.\nexport default function PersistentStorage(localStorageProvider, logger) {\n const storage = {};\n let loggedError = false;\n\n const logError = err => {\n if (!loggedError) {\n loggedError = true;\n logger.warn(messages.localStorageUnavailable(err));\n }\n };\n\n storage.isEnabled = () => !!localStorageProvider;\n\n // Resolves with a value, or undefined if storage is unavailable. Never rejects.\n storage.get = key =>\n new Promise(resolve => {\n if (!localStorageProvider) {\n resolve(undefined);\n return;\n }\n localStorageProvider\n .get(key)\n .then(resolve)\n .catch(err => {\n logError(err);\n resolve(undefined);\n });\n });\n\n // Resolves with true if successful, or false if storage is unavailable. Never rejects.\n storage.set = (key, value) =>\n new Promise(resolve => {\n if (!localStorageProvider) {\n resolve(false);\n return;\n }\n localStorageProvider\n .set(key, value)\n .then(() => resolve(true))\n .catch(err => {\n logError(err);\n resolve(false);\n });\n });\n\n // Resolves with true if successful, or false if storage is unavailable. Never rejects.\n storage.clear = key =>\n new Promise(resolve => {\n if (!localStorageProvider) {\n resolve(false);\n return;\n }\n localStorageProvider\n .clear(key)\n .then(() => resolve(true))\n .catch(err => {\n logError(err);\n resolve(false);\n });\n });\n\n return storage;\n}\n","import EventSender from './EventSender';\nimport EventSummarizer from './EventSummarizer';\nimport UserFilter from './UserFilter';\nimport * as errors from './errors';\nimport * as messages from './messages';\nimport * as utils from './utils';\n\nexport default function EventProcessor(\n platform,\n options,\n environmentId,\n diagnosticsAccumulator = null,\n emitter = null,\n sender = null\n) {\n const processor = {};\n const eventSender = sender || EventSender(platform, environmentId, options);\n const mainEventsUrl = options.eventsUrl + '/events/bulk/' + environmentId;\n const summarizer = EventSummarizer();\n const userFilter = UserFilter(options);\n const inlineUsers = options.inlineUsersInEvents;\n const samplingInterval = options.samplingInterval;\n const eventCapacity = options.eventCapacity;\n const flushInterval = options.flushInterval;\n const logger = options.logger;\n let queue = [];\n let lastKnownPastTime = 0;\n let disabled = false;\n let exceededCapacity = false;\n let flushTimer;\n\n function shouldSampleEvent() {\n return samplingInterval === 0 || Math.floor(Math.random() * samplingInterval) === 0;\n }\n\n function shouldDebugEvent(e) {\n if (e.debugEventsUntilDate) {\n // The \"last known past time\" comes from the last HTTP response we got from the server.\n // In case the client's time is set wrong, at least we know that any expiration date\n // earlier than that point is definitely in the past. If there's any discrepancy, we\n // want to err on the side of cutting off event debugging sooner.\n return e.debugEventsUntilDate > lastKnownPastTime && e.debugEventsUntilDate > new Date().getTime();\n }\n return false;\n }\n\n // Transform an event from its internal format to the format we use when sending a payload.\n function makeOutputEvent(e) {\n const ret = utils.extend({}, e);\n if (e.kind === 'alias') {\n // alias events do not require any transformation\n return ret;\n }\n if (inlineUsers || e.kind === 'identify') {\n // identify events always have an inline user\n ret.user = userFilter.filterUser(e.user);\n } else {\n ret.userKey = e.user.key;\n delete ret['user'];\n }\n if (e.kind === 'feature') {\n delete ret['trackEvents'];\n delete ret['debugEventsUntilDate'];\n }\n return ret;\n }\n\n function addToOutbox(event) {\n if (queue.length < eventCapacity) {\n queue.push(event);\n exceededCapacity = false;\n } else {\n if (!exceededCapacity) {\n exceededCapacity = true;\n logger.warn(messages.eventCapacityExceeded());\n }\n if (diagnosticsAccumulator) {\n // For diagnostic events, we track how many times we had to drop an event due to exceeding the capacity.\n diagnosticsAccumulator.incrementDroppedEvents();\n }\n }\n }\n\n processor.enqueue = function(event) {\n if (disabled) {\n return;\n }\n let addFullEvent = false;\n let addDebugEvent = false;\n\n // Add event to the summary counters if appropriate\n summarizer.summarizeEvent(event);\n\n // Decide whether to add the event to the payload. Feature events may be added twice, once for\n // the event (if tracked) and once for debugging.\n if (event.kind === 'feature') {\n if (shouldSampleEvent()) {\n addFullEvent = !!event.trackEvents;\n addDebugEvent = shouldDebugEvent(event);\n }\n } else {\n addFullEvent = shouldSampleEvent();\n }\n\n if (addFullEvent) {\n addToOutbox(makeOutputEvent(event));\n }\n if (addDebugEvent) {\n const debugEvent = utils.extend({}, event, { kind: 'debug' });\n debugEvent.user = userFilter.filterUser(debugEvent.user);\n delete debugEvent['trackEvents'];\n delete debugEvent['debugEventsUntilDate'];\n addToOutbox(debugEvent);\n }\n };\n\n processor.flush = function() {\n if (disabled) {\n return Promise.resolve();\n }\n const eventsToSend = queue;\n const summary = summarizer.getSummary();\n summarizer.clearSummary();\n if (summary) {\n summary.kind = 'summary';\n eventsToSend.push(summary);\n }\n if (diagnosticsAccumulator) {\n // For diagnostic events, we record how many events were in the queue at the last flush (since \"how\n // many events happened to be in the queue at the moment we decided to send a diagnostic event\" would\n // not be a very useful statistic).\n diagnosticsAccumulator.setEventsInLastBatch(eventsToSend.length);\n }\n if (eventsToSend.length === 0) {\n return Promise.resolve();\n }\n queue = [];\n logger.debug(messages.debugPostingEvents(eventsToSend.length));\n return eventSender.sendEvents(eventsToSend, mainEventsUrl).then(responseInfo => {\n if (responseInfo) {\n if (responseInfo.serverTime) {\n lastKnownPastTime = responseInfo.serverTime;\n }\n if (!errors.isHttpErrorRecoverable(responseInfo.status)) {\n disabled = true;\n }\n if (responseInfo.status >= 400) {\n utils.onNextTick(() => {\n emitter.maybeReportError(\n new errors.LDUnexpectedResponseError(\n messages.httpErrorMessage(responseInfo.status, 'event posting', 'some events were dropped')\n )\n );\n });\n }\n }\n });\n };\n\n processor.start = function() {\n const flushTick = () => {\n processor.flush();\n flushTimer = setTimeout(flushTick, flushInterval);\n };\n flushTimer = setTimeout(flushTick, flushInterval);\n };\n\n processor.stop = function() {\n clearTimeout(flushTimer);\n };\n\n return processor;\n}\n","import * as utils from './utils';\n\nexport default function Identity(initialUser, onChange) {\n const ident = {};\n let user;\n\n ident.setUser = function(u) {\n const previousUser = user && utils.clone(user);\n user = utils.sanitizeUser(u);\n if (user && onChange) {\n onChange(utils.clone(user), previousUser);\n }\n };\n\n ident.getUser = function() {\n return user ? utils.clone(user) : null;\n };\n\n if (initialUser) {\n ident.setUser(initialUser);\n }\n\n return ident;\n}\n"],"names":["createCustomError","name","CustomError","message","code","Error","captureStackTrace","this","constructor","prototype","LDUnexpectedResponseError","LDInvalidEnvironmentIdError","LDInvalidUserError","LDInvalidEventKeyError","LDInvalidArgumentError","LDFlagFetchError","isHttpErrorRecoverable","status","uint8","tmp","len","length","extraBytes","parts","i","len2","push","encodeChunk","lookup","join","revLookup","charCodeAt","start","end","num","output","isArray","Array","keyList","Object","keys","hasProp","hasOwnProperty","userAttrsToStringify","btoa","s","escaped","unescape","encodeURIComponent","base64","b","stringToBytes","base64URLEncode","replace","clone","obj","JSON","parse","stringify","deepEquals","a","equal","key","arrA","arrB","dateA","Date","dateB","getTime","regexpA","RegExp","regexpB","toString","call","fastDeepEqual","onNextTick","cb","setTimeout","wrapPromiseCallback","promise","callback","ret","then","value","error","Promise","reject","undefined","transformValuesToVersionedValues","flags","objectHasOwnProperty","version","transformVersionedValuesToValues","flagsState","chunkUserEventsForUrl","maxLength","events","chunk","allEvents","slice","allChunks","remainingSpace","event","shift","unshift","getLDUserAgentString","platform","userAgent","getLDHeaders","options","sendLDHeaders","h","wrapperName","wrapperVersion","transformHeaders","headers","requestHeaderTransform","extend","objects","reduce","acc","object","sanitizeUser","user","newUser","attr","String","uuidv1","require","v1","EventSender","environmentId","imageUrlPath","baseHeaders","utils","httpFallbackPing","sender","sendChunk","url","isDiagnostic","usePost","jsonBody","payloadId","doPostRequest","canRetry","httpRequest","result","errors","dateStr","header","time","serverTime","getResponseInfo","catch","resolve","sendEvents","chunks","canPost","httpAllowsPost","results","all","EventSummarizer","es","startDate","endDate","counters","summarizeEvent","kind","counterKey","variation","counterVal","count","default","creationDate","getSummary","flagsOut","empty","c","flag","counterOut","unknown","features","clearSummary","UserFilter","config","filter","allAttributesPrivate","privateAttributeNames","ignoreAttrs","custom","anonymous","allowedTopLevelAttrs","secondary","ip","country","email","firstName","lastName","avatar","filterUser","userPrivateAttrs","filterAttrs","props","isAttributeAllowed","indexOf","isPrivateAttr","filteredProps","removedAttrs","customResult","removedAttrNames","sort","privateAttrs","errorString","err","clientInitialized","docLink","eventCapacityExceeded","eventWithoutUser","invalidContentType","contentType","localStorageUnavailable","networkError","e","unknownCustomEventKey","environmentNotFound","environmentNotSpecified","errorFetchingFlags","userNotSpecified","invalidUser","bootstrapOldFormat","bootstrapInvalid","deprecated","oldName","newName","httpErrorMessage","context","retryMessage","httpUnavailable","identifyDisabled","streamClosing","streamConnecting","streamError","streamReconnectDelay","unknownOption","wrongOptionType","expectedType","actualType","wrongOptionTypeBoolean","optionBelowMinimum","minimum","debugPolling","debugStreamPing","debugStreamPut","debugStreamPatch","debugStreamPatchIgnored","debugStreamDelete","debugStreamDeleteIgnored","debugEnqueueingEvent","debugPostingEvents","EventEmitter","logger","emitter","on","handler","concat","off","emit","copiedHandlers","apply","arguments","getEvents","getEventListenerCount","maybeReportError","console","eventEmitter","succeeded","failed","failureValue","initializationPromise","readyPromise","onReady","getInitializationPromise","onSuccess","onFailure","getReadyPromise","signalSuccess","signalFailure","PersistentFlagStore","storage","environment","hash","ident","store","getFlagsKey","getUser","loadFlags","get","dataStr","data","schema","$schema","ex","clearFlags","saveFlags","set","clear","Stream","diagnosticsAccumulator","connectionAttemptStartTime","baseUrl","streamUrl","stream","evalUrlPrefix","useReport","withReasons","evaluationReasons","firstConnectionErrorLogged","reconnectTimeoutReference","handlers","handleError","warn","messages","logConnectionResult","closeConnection","tryConnect","delay","openConnection","query","readTimeoutMillis","eventSourceFactory","eventSourceAllowsReport","method","body","info","addEventListener","onerror","close","success","recordStreamInit","connect","newHash","newHandlers","disconnect","clearTimeout","isConnected","eventSourceIsActive","Requestor","requestor","activeRequests","fetchJSON","endpoint","coalescer","finallyFn","currentPromise","currentCancelFn","finalResolve","finalReject","p","cancelFn","resultPromise","promiseCoalescer","req","substring","statusText","getResponseError","addPromise","cancel","path","fetchFlagSettings","debug","UserValidator","persistentStorage","validateUser","userOut","cachedId","id","setCachedUserId","logLevels","commonBasicLogger","formatFn","destination","toConsole","methodName","line","destinations","prependLevelToMessage","prefix","minLevel","level","write","levelIndex","levelName","args","fullPrefix","tempArgs","log","baseOptionDefs","eventsUrl","streaming","type","inlineUsersInEvents","allowFrequentDuplicateEvents","sendEventsOnlyForVariation","eventCapacity","flushInterval","samplingInterval","bootstrap","diagnosticRecordingInterval","diagnosticOptOut","stateProvider","autoAliasingOptOut","validate","extraOptionDefs","optionDefs","deprecatedOptions","reportArgumentError","opts","forEach","checkDeprecatedOptions","validateLogger","typeDescForValue","t","optionDef","allowedTypes","split","validateTypesAndNames","applyDefaults","getRandomValues","rnds8","Uint8Array","rng","crypto","bind","msCrypto","uuid","REGEX","test","_nodeId","_clockseq","byteToHex","substr","arr","offset","toLowerCase","TypeError","_lastMSecs","_lastNSecs","v","parseInt","hashfunc","generateUUID","namespace","buf","str","bytes","DNS","URL","getOutputLength","inputLength8","safeAdd","x","y","lsw","md5cmn","q","cnt","md5ff","d","md5gg","md5hh","md5ii","v3","v35","msg","input","length32","hex","charAt","md5ToHexEncodedArray","olda","oldb","oldc","oldd","wordsToMd5","length8","Uint32Array","bytesToWords","f","z","ROTL","n","v5","K","H","l","N","Math","ceil","M","_i","j","pow","floor","_i2","W","_t","_t2","T","node","clockseq","seedBytes","random","msecs","now","nsecs","dt","tl","tmh","rnds","require$$1","sdkKey","diagnosticId","sdkKeySuffix","startTime","dataSinceDate","droppedEvents","eventsInLastBatch","streamInits","reset","getProps","setProps","incrementDroppedEvents","setEventsInLastBatch","timestamp","durationMillis","accumulator","eventSender","eventSentTime","periodicTimer","combinedMode","diagnosticUseCombinedEvent","localStorageKey","diagnosticEventsUrl","periodicInterval","streamingEnabled","manager","makeInitProperties","sdk","makeSdkData","configuration","configData","customBaseURI","customStreamURI","customEventsURI","eventsCapacity","eventsFlushIntervalMillis","reconnectTimeMillis","streamingDisabled","diagnosticRecordingIntervalMillis","usingSecureMode","bootstrapMode","fetchGoalsDisabled","fetchGoals","diagnosticPlatformData","sendDiagnosticEvent","debugPostingDiagnosticEvent","sendPeriodicEvent","currentTime","isEnabled","saveProperties","sdkData","diagnosticSdkData","loadProperties","localStorageAvailable","nextEventTime","timeNow","stop","setStreaming","enabled","initialize","env","specifiedOptions","useLocalStorage","streamActive","subscribedToChangeEvents","createLogger","initializationStateTracker","InitializationStateTracker","localStorageProvider","loggedError","logError","PersistentStorage","localStorage","diagnosticsEnabled","diagnostics","diagnosticsManager","eventProcessor","flushTimer","processor","mainEventsUrl","summarizer","userFilter","inlineUsers","queue","lastKnownPastTime","disabled","exceededCapacity","shouldSampleEvent","shouldDebugEvent","debugEventsUntilDate","makeOutputEvent","userKey","addToOutbox","enqueue","addFullEvent","addDebugEvent","trackEvents","debugEvent","flush","eventsToSend","summary","responseInfo","flushTick","EventProcessor","seenRequests","streamForcedState","inited","closed","firstEvent","initialUser","onChange","setUser","u","previousUser","Identity","enqueueEvent","sendIdentifyEvent","alias","userValidator","persistentFlagStore","isDoNotTrack","sendFlagEvent","detail","defaultValue","includeReason","cacheKey","cached","variationIndex","contextKind","userContextKind","flagVersion","trackReason","reason","variationDetailInternal","sendEvent","includeReasonInEvent","deleted","getFlagDetail","errorKind","previousKey","previousContextKind","connectStream","ping","userAtTimeOfPingEvent","requestedFlags","replaceAllFlags","put","patch","oldFlag","mods","newFlag","newDetail","previous","current","handleFlagChanges","delete","disconnectStream","newFlags","changes","changeEventParams","changeEvent","updateStreamingState","shouldBeStreaming","isChangeEventKey","toUpperCase","_typeof","metadata","readFlagsFromBootstrap","state","getInitialState","initFromStateProvider","realUser","signalSuccessfulInit","storedFlags","signalFailedInit","finishInit","client","waitForInitialization","waitUntilReady","identify","onDone","flagValueMap","variationDetail","track","metricValue","customEventFilter","getCurrentUrl","haveListeners","newState","allFlags","finishClose","getFlagsInternal","getEnvironmentId","internalChangeEventName"],"mappings":"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"}
|