New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@harnessio/ff-javascript-client-sdk

Package Overview
Dependencies
Maintainers
8
Versions
113
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@harnessio/ff-javascript-client-sdk - npm Package Compare versions

Comparing version 1.25.0 to 1.26.0-rc.0

9

dist/poller.d.ts
import type { Options } from './types';
import { FetchFlagsResult } from './types';
import type { Emitter } from 'mitt';
export default class Poller {

@@ -7,6 +8,9 @@ private fetchFlagsFn;

private eventBus;
private logDebug;
private logError;
private timeoutId;
private isRunning;
private maxAttempts;
constructor(fetchFlagsFn: () => Promise<FetchFlagsResult>, configurations: Options, eventBus: any);
constructor(fetchFlagsFn: () => Promise<FetchFlagsResult>, configurations: Options, eventBus: Emitter, // Used to emit the updates retrieved in polling intervals
logDebug: (...data: any[]) => void, logError: (...data: any[]) => void);
start(): void;

@@ -17,3 +21,4 @@ private poll;

isPolling(): boolean;
private logDebug;
private logDebugMessage;
private logErrorMessage;
}

@@ -1,1 +0,1 @@

var Se=Object.create;var F=Object.defineProperty,Ce=Object.defineProperties,Te=Object.getOwnPropertyDescriptor,Oe=Object.getOwnPropertyDescriptors,we=Object.getOwnPropertyNames,ne=Object.getOwnPropertySymbols,Ae=Object.getPrototypeOf,re=Object.prototype.hasOwnProperty,De=Object.prototype.propertyIsEnumerable;var ae=(t,e,a)=>e in t?F(t,e,{enumerable:!0,configurable:!0,writable:!0,value:a}):t[e]=a,O=(t,e)=>{for(var a in e||(e={}))re.call(e,a)&&ae(t,a,e[a]);if(ne)for(var a of ne(e))De.call(e,a)&&ae(t,a,e[a]);return t},K=(t,e)=>Ce(t,Oe(e));var Pe=(t,e)=>{for(var a in e)F(t,a,{get:e[a],enumerable:!0})},oe=(t,e,a,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of we(e))!re.call(t,r)&&r!==a&&F(t,r,{get:()=>e[r],enumerable:!(o=Te(e,r))||o.enumerable});return t};var se=(t,e,a)=>(a=t!=null?Se(Ae(t)):{},oe(e||!t||!t.__esModule?F(a,"default",{value:t,enumerable:!0}):a,t)),Fe=t=>oe(F({},"__esModule",{value:!0}),t);var h=(t,e,a)=>new Promise((o,r)=>{var l=y=>{try{R(a.next(y))}catch(u){r(u)}},g=y=>{try{R(a.throw(y))}catch(u){r(u)}},R=y=>y.done?o(y.value):Promise.resolve(y.value).then(l,g);R((a=a.apply(t,e)).next())});var $e={};Pe($e,{Event:()=>x,initialize:()=>Be});module.exports=Fe($e);var ge=se(require("jwt-decode")),he=se(require("mitt"));var x=(m=>(m.READY="ready",m.CONNECTED="connected",m.DISCONNECTED="disconnected",m.STOPPED="stopped",m.POLLING="polling",m.POLLING_STOPPED="polling stopped",m.FLAGS_LOADED="flags loaded",m.CACHE_LOADED="cache loaded",m.CHANGED="changed",m.ERROR="error",m.ERROR_CACHE="cache error",m.ERROR_METRICS="metrics error",m.ERROR_AUTH="auth error",m.ERROR_FETCH_FLAGS="fetch flags error",m.ERROR_FETCH_FLAG="fetch flag error",m.ERROR_STREAM="stream error",m))(x||{});var xe={debug:!1,baseUrl:"https://config.ff.harness.io/api/1.0",eventUrl:"https://events.ff.harness.io/api/1.0",eventsSyncInterval:6e4,pollingInterval:6e4,streamEnabled:!0,cache:!1},le=t=>{let e=O(O({},xe),t);return e.pollingEnabled===void 0&&(e.pollingEnabled=e.streamEnabled),e.eventsSyncInterval<6e4&&(e.eventsSyncInterval=6e4),e.pollingInterval<6e4&&(e.pollingInterval=6e4),e},I=(t,...e)=>console.error(`[FF-SDK] ${t}`,...e),j=(t,e=!0)=>{e?setTimeout(t,0):t()},_=(t,e)=>Math.round(Math.random()*(e-t)+t);function U(t){return function(...a){let[o,r]=t(a);return fetch(o,r)}}var ce=3e4,L=class{constructor(e,a,o,r,l,g,R){this.closed=!1;this.connectionOpened=!1;this.disconnectEventEmitted=!1;this.eventBus=e,this.configurations=a,this.url=o,this.apiKey=r,this.standardHeaders=l,this.eventCallback=R,this.fallbackPoller=g}start(){let e=u=>{u.toString().split(/\r?\n/).forEach(a)},a=u=>{if(u.startsWith("data:")){let C=JSON.parse(u.substring(5));this.logDebug("Received event from stream: ",C),this.eventCallback(C)}},o=()=>{this.logDebug("Stream connected"),this.eventBus.emit("connected")},r=()=>{clearInterval(this.readTimeoutCheckerId);let u=_(1e3,1e4);this.logDebug("Stream disconnected, will reconnect in "+u+"ms"),this.disconnectEventEmitted||(this.eventBus.emit("disconnected"),this.disconnectEventEmitted=!0),setTimeout(()=>this.start(),u)},l=u=>{u&&I("Stream has issue",u),this.fallBackToPolling(),this.eventBus.emit("stream error",u),this.eventBus.emit("error",u),r()},g=O({"Cache-Control":"no-cache",Accept:"text/event-stream","API-Key":this.apiKey},this.standardHeaders);this.logDebug("SSE HTTP start request",this.url),this.xhr=new XMLHttpRequest,this.xhr.open("GET",this.url);for(let[u,C]of Object.entries(g))this.xhr.setRequestHeader(u,C);this.xhr.timeout=24*60*60*1e3,this.xhr.onerror=()=>{this.connectionOpened=!1,l("XMLHttpRequest error on SSE stream")},this.xhr.onabort=()=>{this.connectionOpened=!1,this.logDebug("SSE aborted"),this.closed||l(null)},this.xhr.ontimeout=()=>{this.connectionOpened=!1,l("SSE timeout")},this.xhr.onload=()=>{if(this.xhr.status>=400&&this.xhr.status<=599){l(`HTTP code ${this.xhr.status}`);return}this.connectionOpened||(o(),this.connectionOpened=!0,this.disconnectEventEmitted=!1)};let R=0,y=Date.now();this.xhr.onprogress=()=>{this.connectionOpened||(o(),this.connectionOpened=!0,this.disconnectEventEmitted=!1),this.stopFallBackPolling(),y=Date.now();let u=this.xhr.responseText.slice(R);R+=u.length,this.logDebug("SSE GOT: "+u),e(u)},this.readTimeoutCheckerId=setInterval(()=>{y<Date.now()-ce&&(I("SSE read timeout"),this.xhr.abort())},ce),this.xhr.send()}close(){this.connectionOpened=!1,this.closed=!0,this.xhr&&this.xhr.abort(),clearInterval(this.readTimeoutCheckerId),this.eventBus.emit("stopped"),this.stopFallBackPolling()}fallBackToPolling(){!this.fallbackPoller.isPolling()&&this.configurations.pollingEnabled&&(this.logDebug("Falling back to polling mode while stream recovers"),this.fallbackPoller.start())}stopFallBackPolling(){this.fallbackPoller.isPolling()&&(this.logDebug("Stopping fallback polling mode"),this.fallbackPoller.stop())}logDebug(e,...a){this.configurations.debug&&console.debug(`[FF-SDK] Streaming: ${e}`,...a)}};function ue(t,e,a,o,r){let l=t in a,g=l?a[t]:e;return l&&o(t,g),r?{value:g,isDefaultValue:!l}:g}var N=class{constructor(e,a,o){this.fetchFlagsFn=e;this.configurations=a;this.eventBus=o;this.maxAttempts=5}start(){if(this.isPolling()){this.logDebug("Already polling.");return}this.isRunning=!0,this.eventBus.emit("polling"),this.logDebug(`Starting poller, first poll will be in ${this.configurations.pollingInterval}ms`),this.timeoutId=setTimeout(()=>this.poll(),this.configurations.pollingInterval)}poll(){this.attemptFetch().finally(()=>{this.timeoutId=setTimeout(()=>this.poll(),this.configurations.pollingInterval)})}attemptFetch(){return h(this,null,function*(){for(let e=1;e<=this.maxAttempts;e++){let a=yield this.fetchFlagsFn();if(a.type==="success"){this.logDebug(`Successfully polled for flag updates, next poll in ${this.configurations.pollingInterval}ms. `);return}if(I("Error when polling for flag updates",a.error),e>=this.maxAttempts){this.logDebug(`Maximum attempts reached for polling for flags. Next poll in ${this.configurations.pollingInterval}ms.`);return}this.logDebug(`Polling for flags attempt #${e} failed. Remaining attempts: ${this.maxAttempts-e}`,a.error);let o=_(1e3,1e4);yield new Promise(r=>setTimeout(r,o))}})}stop(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=void 0,this.isRunning=!1,this.eventBus.emit("polling stopped"),this.logDebug("Polling stopped"))}isPolling(){return this.isRunning}logDebug(e,...a){this.configurations.debug&&console.debug(`[FF-SDK] Poller: ${e}`,...a)}};function de(a){return h(this,arguments,function*(t,e={}){let o=yield _e(t),r=Le(e);return{loadFromCache:()=>q(o,r,e),saveToCache:l=>W(o,r,l),updateCachedEvaluation:l=>ke(o,r,l),removeCachedEvaluation:l=>Ve(o,r,l)}})}function q(o,r){return h(this,arguments,function*(t,e,a={}){let l=parseInt(yield e.getItem(t+".ts"));if(a!=null&&a.ttl&&!isNaN(l)&&l+a.ttl<Date.now())return yield Ne(t,e),[];let g=yield e.getItem(t);if(g)try{return JSON.parse(g)}catch(R){}return[]})}function Ne(t,e){return h(this,null,function*(){yield e.removeItem(t),yield e.removeItem(t+".ts")})}function W(t,e,a){return h(this,null,function*(){yield e.setItem(t,JSON.stringify(a)),yield e.setItem(t+".ts",Date.now().toString())})}function ke(t,e,a){return h(this,null,function*(){let o=yield q(t,e),r=o.find(({flag:l})=>l===a.flag);r?Object.assign(r,a):o.push(a),yield W(t,e,o)})}function Ve(t,e,a){return h(this,null,function*(){let o=yield q(t,e),r=o.findIndex(({flag:l})=>l===a);r>-1&&(o.splice(r,1),yield W(t,e,o))})}function _e(t){return h(this,null,function*(){var a,o;let e=t;if(globalThis!=null&&globalThis.TextEncoder&&((o=(a=globalThis==null?void 0:globalThis.crypto)==null?void 0:a.subtle)!=null&&o.digest)){let l=new TextEncoder().encode(t),g=yield crypto.subtle.digest("SHA-256",l);e=Array.from(new Uint8Array(g)).map(y=>y.toString(16).padStart(2,"0")).join("")}else globalThis.btoa&&(e=btoa(t));return"HARNESS_FF_CACHE_"+e})}function Le(t){let e;return!t.storage||typeof t.storage!="object"||!("getItem"in t.storage)||!("setItem"in t.storage)||!("removeItem"in t.storage)?globalThis.localStorage?e=globalThis.localStorage:globalThis.sessionStorage?e=globalThis.sessionStorage:e=Me:e=t.storage,{getItem(o){return h(this,null,function*(){let r=e.getItem(o);return r instanceof Promise?yield r:r})},setItem(o,r){return h(this,null,function*(){let l=e.setItem(o,r);l instanceof Promise&&(yield l)})},removeItem(o){return h(this,null,function*(){let r=e.removeItem(o);r instanceof Promise&&(yield r)})}}}var Me={getItem:()=>null,setItem:()=>{},removeItem:()=>{}};var me="1.25.0",fe=`Javascript ${me} Client`,He=500,Ge=globalThis.fetch,J=!!globalThis.Proxy,Y=t=>{let{value:e}=t;try{switch(t.kind.toLowerCase()){case"int":case"number":e=Number(e);break;case"boolean":e=e.toString().toLowerCase()==="true";break;case"json":e=JSON.parse(e);break}}catch(a){I(a)}return e},Be=(t,e,a)=>{let o=!1,r,l,g,R,y,u,C=!0,A={},k=U(i=>i),z=0,X=!1,M=()=>{C=!1},m=()=>{C=!0},T=[],d=(0,he.default)(),v=le(a),b=(i,...n)=>{v.debug&&console.debug(`[FF-SDK] ${i}`,...n)},H=i=>{if(C){let n=Date.now();n-i.lastAccessed>He&&(i.count++,i.lastAccessed=n)}},ve=()=>h(void 0,null,function*(){if(v.cache){b("initializing cache");try{let i=!0,n=yield de(e.identifier+t,typeof v.cache=="boolean"?{}:v.cache),c=yield n.loadFromCache();c!=null&&c.length&&j(()=>{b("loading from cache",c),te(c,!1),d.emit("cache loaded",c)}),$("flags loaded",f=>h(void 0,null,function*(){yield n.saveToCache(f),i=!1})),$("changed",f=>h(void 0,null,function*(){i||(f.deleted?yield n.removeCachedEvaluation(f.flag):yield n.updateCachedEvaluation(f))}))}catch(i){I("Cache error: ",i),d.emit("cache error",i),d.emit("error",i)}}}),pe=(i,n)=>h(void 0,null,function*(){return(yield(yield Ge(`${n.baseUrl}/client/auth`,{method:"POST",headers:{"Content-Type":"application/json","Harness-SDK-Info":fe},body:JSON.stringify({apiKey:i,target:K(O({},e),{identifier:String(e.identifier)})})})).json()).authToken}),G=0,B=()=>{if(T.length){b("Sending metrics...",{metrics:T,evaluations:S});let i={metricsData:T.map(n=>({timestamp:Date.now(),count:n.count,metricsType:"FFMETRICS",attributes:[{key:"featureIdentifier",value:n.featureIdentifier},{key:"featureName",value:n.featureIdentifier},{key:"variationIdentifier",value:n.variationIdentifier},{key:"target",value:e.identifier},{key:"SDK_NAME",value:"JavaScript"},{key:"SDK_LANGUAGE",value:"JavaScript"},{key:"SDK_TYPE",value:"client"},{key:"SDK_VERSION",value:me}]}))};k(`${v.eventUrl}/metrics/${r}?cluster=${l}`,{method:"POST",headers:O({"Content-Type":"application/json"},A),body:JSON.stringify(i)}).then(()=>{T=[],G=0}).catch(n=>{G++&&(T=[],G=0),b(n),d.emit("metrics error",n)}).finally(()=>{u=window.setTimeout(B,v.eventsSyncInterval)})}else u=window.setTimeout(B,v.eventsSyncInterval)},S={},Ee=i=>{b("Sending event for",i.flag),J?d.emit("changed",new Proxy(i,{get(n,c){var f;if(C&&n.hasOwnProperty(c)&&c==="value"){let p=n.flag,s=i.value,E=T.find(P=>P.featureIdentifier===p&&P.featureValue===s);E?(H(E),E.variationIdentifier=((f=S[p])==null?void 0:f.identifier)||""):T.push({featureIdentifier:p,featureValue:String(s),variationIdentifier:S[p].identifier||"",count:1,lastAccessed:Date.now()}),b("Metrics event: Flag",c,"has been read with value via stream update",s)}return c==="value"?Y(i):i[c]}})):d.emit("changed",{deleted:i.deleted,flag:i.flag,value:Y(i)})},Q=function(){return J?new Proxy({},{get(i,n){var f,p,s;let c=i[n];if(C&&i.hasOwnProperty(n)){let E=i[n],P=T.find(ie=>ie.featureIdentifier===n&&E===ie.featureValue);P?(P.variationIdentifier=((f=S[n])==null?void 0:f.identifier)||"",H(P)):T.push({featureIdentifier:n,featureValue:E,variationIdentifier:((p=S[n])==null?void 0:p.identifier)||"",count:1,lastAccessed:Date.now()}),b("Metrics event: Flag:",n,"has been read with value:",E,"variationIdentifier:",(s=S[n])==null?void 0:s.identifier)}return c}}):{}},w=Q();ve().then(()=>pe(t,v).then(i=>h(void 0,null,function*(){if(o)return;y=i;let n=(0,ge.default)(i);if(A={Authorization:`Bearer ${y}`,"Harness-AccountID":n.accountID,"Harness-EnvironmentID":n.environmentIdentifier,"Harness-SDK-Info":fe},globalThis.btoa){let p=globalThis.btoa(JSON.stringify(e));p.length<262144&&(A["Harness-Target"]=p)}b("Authenticated",n),u=window.setTimeout(B,v.eventsSyncInterval),r=n.environment,l=n.clusterIdentifier;let c=!!Object.keys(S).length;if((yield V()).type==="success"&&b("Fetch all flags ok",w),!o){if(v.streamEnabled?(b("Streaming mode enabled"),Re()):v.pollingEnabled?(b("Polling mode enabled"),be()):b("Streaming and polling mode disabled"),!c){M();let p=O({},w);m(),d.emit("ready",p)}X=!0}})).catch(i=>{I("Authentication error: ",i),d.emit("auth error",i),d.emit("error",i)}));let V=()=>h(void 0,null,function*(){try{let i=yield k(`${v.baseUrl}/client/env/${r}/target/${e.identifier}/evaluations?cluster=${l}`,{headers:A});if(i.ok){let n=yield i.json();return n.forEach(D),d.emit("flags loaded",n),{type:"success",data:n}}else return I("Features fetch operation error: ",i),d.emit("fetch flags error",i),d.emit("error",i),{type:"error",error:i}}catch(i){return I("Features fetch operation error: ",i),d.emit("fetch flags error",i),d.emit("error",i),{type:"error",error:i}}}),Z=i=>h(void 0,null,function*(){try{let n=yield k(`${v.baseUrl}/client/env/${r}/target/${e.identifier}/evaluations/${i}?cluster=${l}`,{headers:A});if(n.ok){let c=yield n.json();D(c)}else I("Feature fetch operation error: ",n),d.emit("fetch flag error",n),d.emit("error",n)}catch(n){I("Feature fetch operation error: ",n),d.emit("fetch flag error",n),d.emit("error",n)}}),D=i=>{M();let n=Y(i);n!==w[i.flag]&&(b("Flag variation has changed for ",i.identifier),w[i.flag]=n,S[i.flag]=K(O({},i),{value:n}),Ee(i)),m()};R=new N(V,v,d);let Re=()=>{let i=s=>{switch(s.event){case"create":c(s.evaluations)?s.evaluations.forEach(E=>{D(E)}):setTimeout(()=>Z(s.identifier),1e3);break;case"patch":c(s.evaluations)?s.evaluations.forEach(E=>{D(E)}):Z(s.identifier);break;case"delete":delete w[s.identifier],d.emit("changed",{flag:s.identifier,value:void 0,deleted:!0}),b("Evaluation deleted",{message:s,storage:w});break}},n=s=>!(!s||!s.flag||!s.identifier||!s.kind||!s.value),c=s=>!(!s||s.length==0||!s.every(E=>n(E))),f=s=>{s.event==="patch"&&(c(s.evaluations)?s.evaluations.forEach(E=>{D(E)}):V())},p=`${v.baseUrl}/stream?cluster=${l}`;g=new L(d,v,p,t,A,R,s=>{s.domain==="flag"?i(s):s.domain==="target-segment"&&f(s)}),g.start()},be=()=>{R.start()},$=(i,n)=>d.on(i,n),ye=(i,n)=>{i?d.off(i,n):ee()},Ie=(i,n)=>{var s;if(!C||J||n===void 0)return;let c=n,f=i,p=T.find(E=>E.featureIdentifier===f&&E.featureValue===c);p?(H(p),p.variationIdentifier=((s=S[f])==null?void 0:s.identifier)||""):T.push({featureIdentifier:f,featureValue:c,count:1,variationIdentifier:S[f].identifier||"",lastAccessed:Date.now()})},ee=()=>{o=!0,v.streamEnabled&&(b("Closing event stream"),typeof(g==null?void 0:g.close)=="function"&&g.close(),d.all.clear()),v.pollingEnabled&&R.isPolling()&&(b("Closing Poller"),R.stop()),w=Q(),S={},clearTimeout(u)},te=(i,n=!0)=>{i.length&&j(()=>{let c=!!Object.keys(S).length;if(i.forEach(D),!c){M();let f=O({},w);m(),d.emit("ready",f)}},n)};return{on:$,off:ye,close:ee,setEvaluations:te,registerAPIRequestMiddleware:i=>{k=U(i)},refreshEvaluations:()=>{X&&!o&&Date.now()-z>=6e4&&(V(),z=Date.now())},variation:(i,n,c=!1)=>ue(i,n,w,Ie,c)}};0&&(module.exports={Event,initialize});
var Se=Object.create;var F=Object.defineProperty,Ce=Object.defineProperties,Oe=Object.getOwnPropertyDescriptor,Te=Object.getOwnPropertyDescriptors,we=Object.getOwnPropertyNames,ne=Object.getOwnPropertySymbols,De=Object.getPrototypeOf,re=Object.prototype.hasOwnProperty,Ae=Object.prototype.propertyIsEnumerable;var ae=(n,e,a)=>e in n?F(n,e,{enumerable:!0,configurable:!0,writable:!0,value:a}):n[e]=a,O=(n,e)=>{for(var a in e||(e={}))re.call(e,a)&&ae(n,a,e[a]);if(ne)for(var a of ne(e))Ae.call(e,a)&&ae(n,a,e[a]);return n},j=(n,e)=>Ce(n,Te(e));var Pe=(n,e)=>{for(var a in e)F(n,a,{get:e[a],enumerable:!0})},oe=(n,e,a,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of we(e))!re.call(n,r)&&r!==a&&F(n,r,{get:()=>e[r],enumerable:!(o=Oe(e,r))||o.enumerable});return n};var se=(n,e,a)=>(a=n!=null?Se(De(n)):{},oe(e||!n||!n.__esModule?F(a,"default",{value:n,enumerable:!0}):a,n)),Fe=n=>oe(F({},"__esModule",{value:!0}),n);var f=(n,e,a)=>new Promise((o,r)=>{var l=b=>{try{y(a.next(b))}catch(g){r(g)}},h=b=>{try{y(a.throw(b))}catch(g){r(g)}},y=b=>b.done?o(b.value):Promise.resolve(b.value).then(l,h);y((a=a.apply(n,e)).next())});var Be={};Pe(Be,{Event:()=>M,initialize:()=>$e});module.exports=Fe(Be);var fe=se(require("jwt-decode")),he=se(require("mitt"));var M=(v=>(v.READY="ready",v.CONNECTED="connected",v.DISCONNECTED="disconnected",v.STOPPED="stopped",v.POLLING="polling",v.POLLING_STOPPED="polling stopped",v.FLAGS_LOADED="flags loaded",v.CACHE_LOADED="cache loaded",v.CHANGED="changed",v.ERROR="error",v.ERROR_CACHE="cache error",v.ERROR_METRICS="metrics error",v.ERROR_AUTH="auth error",v.ERROR_FETCH_FLAGS="fetch flags error",v.ERROR_FETCH_FLAG="fetch flag error",v.ERROR_STREAM="stream error",v))(M||{});var Me={debug:!1,baseUrl:"https://config.ff.harness.io/api/1.0",eventUrl:"https://events.ff.harness.io/api/1.0",eventsSyncInterval:6e4,pollingInterval:6e4,streamEnabled:!0,cache:!1},le=n=>{let e=O(O({},Me),n);return e.pollingEnabled===void 0&&(e.pollingEnabled=e.streamEnabled),e.eventsSyncInterval<6e4&&(e.eventsSyncInterval=6e4),e.pollingInterval<6e4&&(e.pollingInterval=6e4),(!e.logger||!e.logger.debug||!e.logger.error||!e.logger.info||!e.logger.warn)&&(e.logger=console),e},U=(n,e=!0)=>{e?setTimeout(n,0):n()},V=(n,e)=>Math.round(Math.random()*(e-n)+n);function q(n){return function(...a){let[o,r]=n(a);return fetch(o,r)}}var ce=3e4,_=class{constructor(e,a,o,r,l,h,y,b,g){this.eventBus=e;this.configurations=a;this.url=o;this.apiKey=r;this.standardHeaders=l;this.fallbackPoller=h;this.logDebug=y;this.logError=b;this.eventCallback=g;this.closed=!1;this.connectionOpened=!1;this.disconnectEventEmitted=!1}start(){let e=g=>{g.toString().split(/\r?\n/).forEach(a)},a=g=>{if(g.startsWith("data:")){let S=JSON.parse(g.substring(5));this.logDebugMessage("Received event from stream: ",S),this.eventCallback(S)}},o=()=>{this.logDebugMessage("Stream connected"),this.eventBus.emit("connected")},r=()=>{clearInterval(this.readTimeoutCheckerId);let g=V(1e3,1e4);this.logDebugMessage("Stream disconnected, will reconnect in "+g+"ms"),this.disconnectEventEmitted||(this.eventBus.emit("disconnected"),this.disconnectEventEmitted=!0),setTimeout(()=>this.start(),g)},l=g=>{g&&this.logErrorMessage("Stream has issue",g),this.fallBackToPolling(),this.eventBus.emit("stream error",g),this.eventBus.emit("error",g),r()},h=O({"Cache-Control":"no-cache",Accept:"text/event-stream","API-Key":this.apiKey},this.standardHeaders);this.logDebugMessage("SSE HTTP start request",this.url),this.xhr=new XMLHttpRequest,this.xhr.open("GET",this.url);for(let[g,S]of Object.entries(h))this.xhr.setRequestHeader(g,S);this.xhr.timeout=24*60*60*1e3,this.xhr.onerror=()=>{this.connectionOpened=!1,l("XMLHttpRequest error on SSE stream")},this.xhr.onabort=()=>{this.connectionOpened=!1,this.logDebugMessage("SSE aborted"),this.closed||l(null)},this.xhr.ontimeout=()=>{this.connectionOpened=!1,l("SSE timeout")},this.xhr.onload=()=>{if(this.xhr.status>=400&&this.xhr.status<=599){l(`HTTP code ${this.xhr.status}`);return}this.connectionOpened||(o(),this.connectionOpened=!0,this.disconnectEventEmitted=!1)};let y=0,b=Date.now();this.xhr.onprogress=()=>{this.connectionOpened||(o(),this.connectionOpened=!0,this.disconnectEventEmitted=!1),this.stopFallBackPolling(),b=Date.now();let g=this.xhr.responseText.slice(y);y+=g.length,this.logDebugMessage("SSE GOT: "+g),e(g)},this.readTimeoutCheckerId=setInterval(()=>{b<Date.now()-ce&&(this.logErrorMessage("SSE read timeout"),this.xhr.abort())},ce),this.xhr.send()}close(){this.connectionOpened=!1,this.closed=!0,this.xhr&&this.xhr.abort(),clearInterval(this.readTimeoutCheckerId),this.eventBus.emit("stopped"),this.stopFallBackPolling()}fallBackToPolling(){!this.fallbackPoller.isPolling()&&this.configurations.pollingEnabled&&(this.logDebugMessage("Falling back to polling mode while stream recovers"),this.fallbackPoller.start())}stopFallBackPolling(){this.fallbackPoller.isPolling()&&(this.logDebugMessage("Stopping fallback polling mode"),this.fallbackPoller.stop())}logDebugMessage(e,...a){this.configurations.debug&&this.logDebug(`Streaming: ${e}`,...a)}logErrorMessage(e,...a){this.logError(`Streaming: ${e}`,...a)}};function ge(n,e,a,o,r){let l=n in a,h=l?a[n]:e;return l&&o(n,h),r?{value:h,isDefaultValue:!l}:h}var x=class{constructor(e,a,o,r,l){this.fetchFlagsFn=e;this.configurations=a;this.eventBus=o;this.logDebug=r;this.logError=l;this.maxAttempts=5}start(){if(this.isPolling()){this.logDebugMessage("Already polling.");return}this.isRunning=!0,this.eventBus.emit("polling"),this.logDebugMessage(`Starting poller, first poll will be in ${this.configurations.pollingInterval}ms`),this.timeoutId=setTimeout(()=>this.poll(),this.configurations.pollingInterval)}poll(){this.attemptFetch().finally(()=>{this.timeoutId=setTimeout(()=>this.poll(),this.configurations.pollingInterval)})}attemptFetch(){return f(this,null,function*(){for(let e=1;e<=this.maxAttempts;e++){let a=yield this.fetchFlagsFn();if(a.type==="success"){this.logDebugMessage(`Successfully polled for flag updates, next poll in ${this.configurations.pollingInterval}ms. `);return}if(this.logErrorMessage("Error when polling for flag updates",a.error),e>=this.maxAttempts){this.logDebugMessage(`Maximum attempts reached for polling for flags. Next poll in ${this.configurations.pollingInterval}ms.`);return}this.logDebugMessage(`Polling for flags attempt #${e} failed. Remaining attempts: ${this.maxAttempts-e}`,a.error);let o=V(1e3,1e4);yield new Promise(r=>setTimeout(r,o))}})}stop(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=void 0,this.isRunning=!1,this.eventBus.emit("polling stopped"),this.logDebugMessage("Polling stopped"))}isPolling(){return this.isRunning}logDebugMessage(e,...a){this.configurations.debug&&this.logDebug(`Poller: ${e}`,...a)}logErrorMessage(e,...a){this.logError(`Poller: ${e}`,...a)}};function de(a){return f(this,arguments,function*(n,e={}){let o=yield Ve(n),r=_e(e);return{loadFromCache:()=>W(o,r,e),saveToCache:l=>J(o,r,l),updateCachedEvaluation:l=>Ne(o,r,l),removeCachedEvaluation:l=>ke(o,r,l)}})}function W(o,r){return f(this,arguments,function*(n,e,a={}){let l=parseInt(yield e.getItem(n+".ts"));if(a!=null&&a.ttl&&!isNaN(l)&&l+a.ttl<Date.now())return yield xe(n,e),[];let h=yield e.getItem(n);if(h)try{return JSON.parse(h)}catch(y){}return[]})}function xe(n,e){return f(this,null,function*(){yield e.removeItem(n),yield e.removeItem(n+".ts")})}function J(n,e,a){return f(this,null,function*(){yield e.setItem(n,JSON.stringify(a)),yield e.setItem(n+".ts",Date.now().toString())})}function Ne(n,e,a){return f(this,null,function*(){let o=yield W(n,e),r=o.find(({flag:l})=>l===a.flag);r?Object.assign(r,a):o.push(a),yield J(n,e,o)})}function ke(n,e,a){return f(this,null,function*(){let o=yield W(n,e),r=o.findIndex(({flag:l})=>l===a);r>-1&&(o.splice(r,1),yield J(n,e,o))})}function Ve(n){return f(this,null,function*(){var a,o;let e=n;if(globalThis!=null&&globalThis.TextEncoder&&((o=(a=globalThis==null?void 0:globalThis.crypto)==null?void 0:a.subtle)!=null&&o.digest)){let l=new TextEncoder().encode(n),h=yield crypto.subtle.digest("SHA-256",l);e=Array.from(new Uint8Array(h)).map(b=>b.toString(16).padStart(2,"0")).join("")}else globalThis.btoa&&(e=btoa(n));return"HARNESS_FF_CACHE_"+e})}function _e(n){let e;return!n.storage||typeof n.storage!="object"||!("getItem"in n.storage)||!("setItem"in n.storage)||!("removeItem"in n.storage)?globalThis.localStorage?e=globalThis.localStorage:globalThis.sessionStorage?e=globalThis.sessionStorage:e=Le:e=n.storage,{getItem(o){return f(this,null,function*(){let r=e.getItem(o);return r instanceof Promise?yield r:r})},setItem(o,r){return f(this,null,function*(){let l=e.setItem(o,r);l instanceof Promise&&(yield l)})},removeItem(o){return f(this,null,function*(){let r=e.removeItem(o);r instanceof Promise&&(yield r)})}}}var Le={getItem:()=>null,setItem:()=>{},removeItem:()=>{}};var ve="1.25.0",ue=`Javascript ${ve} Client`,He=500,Ge=globalThis.fetch,Y=!!globalThis.Proxy,$e=(n,e,a)=>{let o=!1,r,l,h,y,b,g,S=!0,D={},N=q(t=>t),z=0,X=!1,L=()=>{S=!1},v=()=>{S=!0},C=[],d=(0,he.default)(),m=le(a),p=(t,...i)=>{m.debug&&m.logger.debug(`[FF-SDK] ${t}`,...i)},T=(t,...i)=>{m.logger.error(`[FF-SDK] ${t}`,...i)},H=t=>{let{value:i}=t;try{switch(t.kind.toLowerCase()){case"int":case"number":i=Number(i);break;case"boolean":i=i.toString().toLowerCase()==="true";break;case"json":i=JSON.parse(i);break}}catch(c){T(c)}return i},G=t=>{if(S){let i=Date.now();i-t.lastAccessed>He&&(t.count++,t.lastAccessed=i)}},me=()=>f(void 0,null,function*(){if(m.cache){p("initializing cache");try{let t=!0,i=yield de(e.identifier+n,typeof m.cache=="boolean"?{}:m.cache),c=yield i.loadFromCache();c!=null&&c.length&&U(()=>{p("loading from cache",c),te(c,!1),d.emit("cache loaded",c)}),K("flags loaded",u=>f(void 0,null,function*(){yield i.saveToCache(u),t=!1})),K("changed",u=>f(void 0,null,function*(){t||(u.deleted?yield i.removeCachedEvaluation(u.flag):yield i.updateCachedEvaluation(u))}))}catch(t){T("Cache error: ",t),d.emit("cache error",t),d.emit("error",t)}}}),pe=(t,i)=>f(void 0,null,function*(){return(yield(yield Ge(`${i.baseUrl}/client/auth`,{method:"POST",headers:{"Content-Type":"application/json","Harness-SDK-Info":ue},body:JSON.stringify({apiKey:t,target:j(O({},e),{identifier:String(e.identifier)})})})).json()).authToken}),$=0,B=()=>{if(C.length){p("Sending metrics...",{metrics:C,evaluations:I});let t={metricsData:C.map(i=>({timestamp:Date.now(),count:i.count,metricsType:"FFMETRICS",attributes:[{key:"featureIdentifier",value:i.featureIdentifier},{key:"featureName",value:i.featureIdentifier},{key:"variationIdentifier",value:i.variationIdentifier},{key:"target",value:e.identifier},{key:"SDK_NAME",value:"JavaScript"},{key:"SDK_LANGUAGE",value:"JavaScript"},{key:"SDK_TYPE",value:"client"},{key:"SDK_VERSION",value:ve}]}))};N(`${m.eventUrl}/metrics/${r}?cluster=${l}`,{method:"POST",headers:O({"Content-Type":"application/json"},D),body:JSON.stringify(t)}).then(()=>{C=[],$=0}).catch(i=>{$++&&(C=[],$=0),p(i),d.emit("metrics error",i)}).finally(()=>{g=window.setTimeout(B,m.eventsSyncInterval)})}else g=window.setTimeout(B,m.eventsSyncInterval)},I={},Ee=t=>{p("Sending event for",t.flag),Y?d.emit("changed",new Proxy(t,{get(i,c){var u;if(S&&i.hasOwnProperty(c)&&c==="value"){let E=i.flag,s=t.value,R=C.find(P=>P.featureIdentifier===E&&P.featureValue===s);R?(G(R),R.variationIdentifier=((u=I[E])==null?void 0:u.identifier)||""):C.push({featureIdentifier:E,featureValue:String(s),variationIdentifier:I[E].identifier||"",count:1,lastAccessed:Date.now()}),p("Metrics event: Flag",c,"has been read with value via stream update",s)}return c==="value"?H(t):t[c]}})):d.emit("changed",{deleted:t.deleted,flag:t.flag,value:H(t)})},Q=function(){return Y?new Proxy({},{get(t,i){var u,E,s;let c=t[i];if(S&&t.hasOwnProperty(i)){let R=t[i],P=C.find(ie=>ie.featureIdentifier===i&&R===ie.featureValue);P?(P.variationIdentifier=((u=I[i])==null?void 0:u.identifier)||"",G(P)):C.push({featureIdentifier:i,featureValue:R,variationIdentifier:((E=I[i])==null?void 0:E.identifier)||"",count:1,lastAccessed:Date.now()}),p("Metrics event: Flag:",i,"has been read with value:",R,"variationIdentifier:",(s=I[i])==null?void 0:s.identifier)}return c}}):{}},w=Q();me().then(()=>pe(n,m).then(t=>f(void 0,null,function*(){if(o)return;b=t;let i=(0,fe.default)(t);if(D={Authorization:`Bearer ${b}`,"Harness-AccountID":i.accountID,"Harness-EnvironmentID":i.environmentIdentifier,"Harness-SDK-Info":ue},globalThis.btoa){let E=globalThis.btoa(JSON.stringify(e));E.length<262144&&(D["Harness-Target"]=E)}p("Authenticated",i),g=window.setTimeout(B,m.eventsSyncInterval),r=i.environment,l=i.clusterIdentifier;let c=!!Object.keys(I).length;if((yield k()).type==="success"&&p("Fetch all flags ok",w),!o){if(m.streamEnabled?(p("Streaming mode enabled"),Re()):m.pollingEnabled?(p("Polling mode enabled"),be()):p("Streaming and polling mode disabled"),!c){L();let E=O({},w);v(),d.emit("ready",E)}X=!0}})).catch(t=>{T("Authentication error: ",t),d.emit("auth error",t),d.emit("error",t)}));let k=()=>f(void 0,null,function*(){try{let t=yield N(`${m.baseUrl}/client/env/${r}/target/${e.identifier}/evaluations?cluster=${l}`,{headers:D});if(t.ok){let i=yield t.json();return i.forEach(A),d.emit("flags loaded",i),{type:"success",data:i}}else return T("Features fetch operation error: ",t),d.emit("fetch flags error",t),d.emit("error",t),{type:"error",error:t}}catch(t){return T("Features fetch operation error: ",t),d.emit("fetch flags error",t),d.emit("error",t),{type:"error",error:t}}}),Z=t=>f(void 0,null,function*(){try{let i=yield N(`${m.baseUrl}/client/env/${r}/target/${e.identifier}/evaluations/${t}?cluster=${l}`,{headers:D});if(i.ok){let c=yield i.json();A(c)}else T("Feature fetch operation error: ",i),d.emit("fetch flag error",i),d.emit("error",i)}catch(i){T("Feature fetch operation error: ",i),d.emit("fetch flag error",i),d.emit("error",i)}}),A=t=>{L();let i=H(t);i!==w[t.flag]&&(p("Flag variation has changed for ",t.identifier),w[t.flag]=i,I[t.flag]=j(O({},t),{value:i}),Ee(t)),v()};y=new x(k,m,d,p,T);let Re=()=>{let t=s=>{switch(s.event){case"create":c(s.evaluations)?s.evaluations.forEach(R=>{A(R)}):setTimeout(()=>Z(s.identifier),1e3);break;case"patch":c(s.evaluations)?s.evaluations.forEach(R=>{A(R)}):Z(s.identifier);break;case"delete":delete w[s.identifier],d.emit("changed",{flag:s.identifier,value:void 0,deleted:!0}),p("Evaluation deleted",{message:s,storage:w});break}},i=s=>!(!s||!s.flag||!s.identifier||!s.kind||!s.value),c=s=>!(!s||s.length==0||!s.every(R=>i(R))),u=s=>{s.event==="patch"&&(c(s.evaluations)?s.evaluations.forEach(R=>{A(R)}):k())},E=`${m.baseUrl}/stream?cluster=${l}`;h=new _(d,m,E,n,D,y,p,T,s=>{s.domain==="flag"?t(s):s.domain==="target-segment"&&u(s)}),h.start()},be=()=>{y.start()},K=(t,i)=>d.on(t,i),ye=(t,i)=>{t?d.off(t,i):ee()},Ie=(t,i)=>{var s;if(!S||Y||i===void 0)return;let c=i,u=t,E=C.find(R=>R.featureIdentifier===u&&R.featureValue===c);E?(G(E),E.variationIdentifier=((s=I[u])==null?void 0:s.identifier)||""):C.push({featureIdentifier:u,featureValue:c,count:1,variationIdentifier:I[u].identifier||"",lastAccessed:Date.now()})},ee=()=>{o=!0,m.streamEnabled&&(p("Closing event stream"),typeof(h==null?void 0:h.close)=="function"&&h.close(),d.all.clear()),m.pollingEnabled&&y.isPolling()&&(p("Closing Poller"),y.stop()),w=Q(),I={},clearTimeout(g)},te=(t,i=!0)=>{t.length&&U(()=>{let c=!!Object.keys(I).length;if(t.forEach(A),!c){L();let u=O({},w);v(),d.emit("ready",u)}},i)};return{on:K,off:ye,close:ee,setEvaluations:te,registerAPIRequestMiddleware:t=>{N=q(t)},refreshEvaluations:()=>{X&&!o&&Date.now()-z>=6e4&&(k(),z=Date.now())},variation:(t,i,c=!1)=>ge(t,i,w,Ie,c)}};0&&(module.exports={Event,initialize});

@@ -1,1 +0,1 @@

var HarnessFFSDK=(()=>{var V=Object.defineProperty,we=Object.defineProperties,Ce=Object.getOwnPropertyDescriptor,Te=Object.getOwnPropertyDescriptors,Oe=Object.getOwnPropertyNames,re=Object.getOwnPropertySymbols;var se=Object.prototype.hasOwnProperty,Ae=Object.prototype.propertyIsEnumerable;var oe=(t,e,n)=>e in t?V(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,T=(t,e)=>{for(var n in e||(e={}))se.call(e,n)&&oe(t,n,e[n]);if(re)for(var n of re(e))Ae.call(e,n)&&oe(t,n,e[n]);return t},U=(t,e)=>we(t,Te(e));var De=(t,e)=>{for(var n in e)V(t,n,{get:e[n],enumerable:!0})},Pe=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Oe(e))!se.call(t,o)&&o!==n&&V(t,o,{get:()=>e[o],enumerable:!(r=Ce(e,o))||r.enumerable});return t};var Fe=t=>Pe(V({},"__esModule",{value:!0}),t);var h=(t,e,n)=>new Promise((r,o)=>{var s=R=>{try{b(n.next(R))}catch(u){o(u)}},f=R=>{try{b(n.throw(R))}catch(u){o(u)}},b=R=>R.done?r(R.value):Promise.resolve(R.value).then(s,f);b((n=n.apply(t,e)).next())});var Ue={};De(Ue,{Event:()=>F,initialize:()=>Ke});function j(t){this.message=t}j.prototype=new Error,j.prototype.name="InvalidCharacterError";var le=typeof window!="undefined"&&window.atob&&window.atob.bind(window)||function(t){var e=String(t).replace(/=+$/,"");if(e.length%4==1)throw new j("'atob' failed: The string to be decoded is not correctly encoded.");for(var n,r,o=0,s=0,f="";r=e.charAt(s++);~r&&(n=o%4?64*n+r:r,o++%4)?f+=String.fromCharCode(255&n>>(-2*o&6)):0)r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(r);return f};function xe(t){var e=t.replace(/-/g,"+").replace(/_/g,"/");switch(e.length%4){case 0:break;case 2:e+="==";break;case 3:e+="=";break;default:throw"Illegal base64url string!"}try{return function(n){return decodeURIComponent(le(n).replace(/(.)/g,function(r,o){var s=o.charCodeAt(0).toString(16).toUpperCase();return s.length<2&&(s="0"+s),"%"+s}))}(e)}catch(n){return le(e)}}function _(t){this.message=t}function ke(t,e){if(typeof t!="string")throw new _("Invalid token specified");var n=(e=e||{}).header===!0?0:1;try{return JSON.parse(xe(t.split(".")[n]))}catch(r){throw new _("Invalid token specified: "+r.message)}}_.prototype=new Error,_.prototype.name="InvalidTokenError";var ce=ke;function ue(t){return{all:t=t||new Map,on:function(e,n){var r=t.get(e);r&&r.push(n)||t.set(e,[n])},off:function(e,n){var r=t.get(e);r&&r.splice(r.indexOf(n)>>>0,1)},emit:function(e,n){(t.get(e)||[]).slice().map(function(r){r(n)}),(t.get("*")||[]).slice().map(function(r){r(e,n)})}}}var F=(m=>(m.READY="ready",m.CONNECTED="connected",m.DISCONNECTED="disconnected",m.STOPPED="stopped",m.POLLING="polling",m.POLLING_STOPPED="polling stopped",m.FLAGS_LOADED="flags loaded",m.CACHE_LOADED="cache loaded",m.CHANGED="changed",m.ERROR="error",m.ERROR_CACHE="cache error",m.ERROR_METRICS="metrics error",m.ERROR_AUTH="auth error",m.ERROR_FETCH_FLAGS="fetch flags error",m.ERROR_FETCH_FLAG="fetch flag error",m.ERROR_STREAM="stream error",m))(F||{});var Ne={debug:!1,baseUrl:"https://config.ff.harness.io/api/1.0",eventUrl:"https://events.ff.harness.io/api/1.0",eventsSyncInterval:6e4,pollingInterval:6e4,streamEnabled:!0,cache:!1},de=t=>{let e=T(T({},Ne),t);return e.pollingEnabled===void 0&&(e.pollingEnabled=e.streamEnabled),e.eventsSyncInterval<6e4&&(e.eventsSyncInterval=6e4),e.pollingInterval<6e4&&(e.pollingInterval=6e4),e},I=(t,...e)=>console.error(`[FF-SDK] ${t}`,...e),q=(t,e=!0)=>{e?setTimeout(t,0):t()},L=(t,e)=>Math.round(Math.random()*(e-t)+t);function J(t){return function(...n){let[r,o]=t(n);return fetch(r,o)}}var fe=3e4,M=class{constructor(e,n,r,o,s,f,b){this.closed=!1;this.connectionOpened=!1;this.disconnectEventEmitted=!1;this.eventBus=e,this.configurations=n,this.url=r,this.apiKey=o,this.standardHeaders=s,this.eventCallback=b,this.fallbackPoller=f}start(){let e=u=>{u.toString().split(/\r?\n/).forEach(n)},n=u=>{if(u.startsWith("data:")){let w=JSON.parse(u.substring(5));this.logDebug("Received event from stream: ",w),this.eventCallback(w)}},r=()=>{this.logDebug("Stream connected"),this.eventBus.emit("connected")},o=()=>{clearInterval(this.readTimeoutCheckerId);let u=L(1e3,1e4);this.logDebug("Stream disconnected, will reconnect in "+u+"ms"),this.disconnectEventEmitted||(this.eventBus.emit("disconnected"),this.disconnectEventEmitted=!0),setTimeout(()=>this.start(),u)},s=u=>{u&&I("Stream has issue",u),this.fallBackToPolling(),this.eventBus.emit("stream error",u),this.eventBus.emit("error",u),o()},f=T({"Cache-Control":"no-cache",Accept:"text/event-stream","API-Key":this.apiKey},this.standardHeaders);this.logDebug("SSE HTTP start request",this.url),this.xhr=new XMLHttpRequest,this.xhr.open("GET",this.url);for(let[u,w]of Object.entries(f))this.xhr.setRequestHeader(u,w);this.xhr.timeout=24*60*60*1e3,this.xhr.onerror=()=>{this.connectionOpened=!1,s("XMLHttpRequest error on SSE stream")},this.xhr.onabort=()=>{this.connectionOpened=!1,this.logDebug("SSE aborted"),this.closed||s(null)},this.xhr.ontimeout=()=>{this.connectionOpened=!1,s("SSE timeout")},this.xhr.onload=()=>{if(this.xhr.status>=400&&this.xhr.status<=599){s(`HTTP code ${this.xhr.status}`);return}this.connectionOpened||(r(),this.connectionOpened=!0,this.disconnectEventEmitted=!1)};let b=0,R=Date.now();this.xhr.onprogress=()=>{this.connectionOpened||(r(),this.connectionOpened=!0,this.disconnectEventEmitted=!1),this.stopFallBackPolling(),R=Date.now();let u=this.xhr.responseText.slice(b);b+=u.length,this.logDebug("SSE GOT: "+u),e(u)},this.readTimeoutCheckerId=setInterval(()=>{R<Date.now()-fe&&(I("SSE read timeout"),this.xhr.abort())},fe),this.xhr.send()}close(){this.connectionOpened=!1,this.closed=!0,this.xhr&&this.xhr.abort(),clearInterval(this.readTimeoutCheckerId),this.eventBus.emit("stopped"),this.stopFallBackPolling()}fallBackToPolling(){!this.fallbackPoller.isPolling()&&this.configurations.pollingEnabled&&(this.logDebug("Falling back to polling mode while stream recovers"),this.fallbackPoller.start())}stopFallBackPolling(){this.fallbackPoller.isPolling()&&(this.logDebug("Stopping fallback polling mode"),this.fallbackPoller.stop())}logDebug(e,...n){this.configurations.debug&&console.debug(`[FF-SDK] Streaming: ${e}`,...n)}};function ge(t,e,n,r,o){let s=t in n,f=s?n[t]:e;return s&&r(t,f),o?{value:f,isDefaultValue:!s}:f}var x=class{constructor(e,n,r){this.fetchFlagsFn=e;this.configurations=n;this.eventBus=r;this.maxAttempts=5}start(){if(this.isPolling()){this.logDebug("Already polling.");return}this.isRunning=!0,this.eventBus.emit("polling"),this.logDebug(`Starting poller, first poll will be in ${this.configurations.pollingInterval}ms`),this.timeoutId=setTimeout(()=>this.poll(),this.configurations.pollingInterval)}poll(){this.attemptFetch().finally(()=>{this.timeoutId=setTimeout(()=>this.poll(),this.configurations.pollingInterval)})}attemptFetch(){return h(this,null,function*(){for(let e=1;e<=this.maxAttempts;e++){let n=yield this.fetchFlagsFn();if(n.type==="success"){this.logDebug(`Successfully polled for flag updates, next poll in ${this.configurations.pollingInterval}ms. `);return}if(I("Error when polling for flag updates",n.error),e>=this.maxAttempts){this.logDebug(`Maximum attempts reached for polling for flags. Next poll in ${this.configurations.pollingInterval}ms.`);return}this.logDebug(`Polling for flags attempt #${e} failed. Remaining attempts: ${this.maxAttempts-e}`,n.error);let r=L(1e3,1e4);yield new Promise(o=>setTimeout(o,r))}})}stop(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=void 0,this.isRunning=!1,this.eventBus.emit("polling stopped"),this.logDebug("Polling stopped"))}isPolling(){return this.isRunning}logDebug(e,...n){this.configurations.debug&&console.debug(`[FF-SDK] Poller: ${e}`,...n)}};function he(n){return h(this,arguments,function*(t,e={}){let r=yield Me(t),o=He(e);return{loadFromCache:()=>W(r,o,e),saveToCache:s=>Y(r,o,s),updateCachedEvaluation:s=>_e(r,o,s),removeCachedEvaluation:s=>Le(r,o,s)}})}function W(r,o){return h(this,arguments,function*(t,e,n={}){let s=parseInt(yield e.getItem(t+".ts"));if(n!=null&&n.ttl&&!isNaN(s)&&s+n.ttl<Date.now())return yield Ve(t,e),[];let f=yield e.getItem(t);if(f)try{return JSON.parse(f)}catch(b){}return[]})}function Ve(t,e){return h(this,null,function*(){yield e.removeItem(t),yield e.removeItem(t+".ts")})}function Y(t,e,n){return h(this,null,function*(){yield e.setItem(t,JSON.stringify(n)),yield e.setItem(t+".ts",Date.now().toString())})}function _e(t,e,n){return h(this,null,function*(){let r=yield W(t,e),o=r.find(({flag:s})=>s===n.flag);o?Object.assign(o,n):r.push(n),yield Y(t,e,r)})}function Le(t,e,n){return h(this,null,function*(){let r=yield W(t,e),o=r.findIndex(({flag:s})=>s===n);o>-1&&(r.splice(o,1),yield Y(t,e,r))})}function Me(t){return h(this,null,function*(){var n,r;let e=t;if(globalThis!=null&&globalThis.TextEncoder&&((r=(n=globalThis==null?void 0:globalThis.crypto)==null?void 0:n.subtle)!=null&&r.digest)){let s=new TextEncoder().encode(t),f=yield crypto.subtle.digest("SHA-256",s);e=Array.from(new Uint8Array(f)).map(R=>R.toString(16).padStart(2,"0")).join("")}else globalThis.btoa&&(e=btoa(t));return"HARNESS_FF_CACHE_"+e})}function He(t){let e;return!t.storage||typeof t.storage!="object"||!("getItem"in t.storage)||!("setItem"in t.storage)||!("removeItem"in t.storage)?globalThis.localStorage?e=globalThis.localStorage:globalThis.sessionStorage?e=globalThis.sessionStorage:e=Ge:e=t.storage,{getItem(r){return h(this,null,function*(){let o=e.getItem(r);return o instanceof Promise?yield o:o})},setItem(r,o){return h(this,null,function*(){let s=e.setItem(r,o);s instanceof Promise&&(yield s)})},removeItem(r){return h(this,null,function*(){let o=e.removeItem(r);o instanceof Promise&&(yield o)})}}}var Ge={getItem:()=>null,setItem:()=>{},removeItem:()=>{}};var ve="1.25.0",me=`Javascript ${ve} Client`,Be=500,$e=globalThis.fetch,z=!!globalThis.Proxy,X=t=>{let{value:e}=t;try{switch(t.kind.toLowerCase()){case"int":case"number":e=Number(e);break;case"boolean":e=e.toString().toLowerCase()==="true";break;case"json":e=JSON.parse(e);break}}catch(n){I(n)}return e},Ke=(t,e,n)=>{let r=!1,o,s,f,b,R,u,w=!0,A={},k=J(i=>i),Q=0,Z=!1,H=()=>{w=!1},m=()=>{w=!0},C=[],d=ue(),v=de(n),y=(i,...a)=>{v.debug&&console.debug(`[FF-SDK] ${i}`,...a)},G=i=>{if(w){let a=Date.now();a-i.lastAccessed>Be&&(i.count++,i.lastAccessed=a)}},pe=()=>h(void 0,null,function*(){if(v.cache){y("initializing cache");try{let i=!0,a=yield he(e.identifier+t,typeof v.cache=="boolean"?{}:v.cache),c=yield a.loadFromCache();c!=null&&c.length&&q(()=>{y("loading from cache",c),ne(c,!1),d.emit("cache loaded",c)}),K("flags loaded",g=>h(void 0,null,function*(){yield a.saveToCache(g),i=!1})),K("changed",g=>h(void 0,null,function*(){i||(g.deleted?yield a.removeCachedEvaluation(g.flag):yield a.updateCachedEvaluation(g))}))}catch(i){I("Cache error: ",i),d.emit("cache error",i),d.emit("error",i)}}}),Ee=(i,a)=>h(void 0,null,function*(){return(yield(yield $e(`${a.baseUrl}/client/auth`,{method:"POST",headers:{"Content-Type":"application/json","Harness-SDK-Info":me},body:JSON.stringify({apiKey:i,target:U(T({},e),{identifier:String(e.identifier)})})})).json()).authToken}),B=0,$=()=>{if(C.length){y("Sending metrics...",{metrics:C,evaluations:S});let i={metricsData:C.map(a=>({timestamp:Date.now(),count:a.count,metricsType:"FFMETRICS",attributes:[{key:"featureIdentifier",value:a.featureIdentifier},{key:"featureName",value:a.featureIdentifier},{key:"variationIdentifier",value:a.variationIdentifier},{key:"target",value:e.identifier},{key:"SDK_NAME",value:"JavaScript"},{key:"SDK_LANGUAGE",value:"JavaScript"},{key:"SDK_TYPE",value:"client"},{key:"SDK_VERSION",value:ve}]}))};k(`${v.eventUrl}/metrics/${o}?cluster=${s}`,{method:"POST",headers:T({"Content-Type":"application/json"},A),body:JSON.stringify(i)}).then(()=>{C=[],B=0}).catch(a=>{B++&&(C=[],B=0),y(a),d.emit("metrics error",a)}).finally(()=>{u=window.setTimeout($,v.eventsSyncInterval)})}else u=window.setTimeout($,v.eventsSyncInterval)},S={},be=i=>{y("Sending event for",i.flag),z?d.emit("changed",new Proxy(i,{get(a,c){var g;if(w&&a.hasOwnProperty(c)&&c==="value"){let p=a.flag,l=i.value,E=C.find(P=>P.featureIdentifier===p&&P.featureValue===l);E?(G(E),E.variationIdentifier=((g=S[p])==null?void 0:g.identifier)||""):C.push({featureIdentifier:p,featureValue:String(l),variationIdentifier:S[p].identifier||"",count:1,lastAccessed:Date.now()}),y("Metrics event: Flag",c,"has been read with value via stream update",l)}return c==="value"?X(i):i[c]}})):d.emit("changed",{deleted:i.deleted,flag:i.flag,value:X(i)})},ee=function(){return z?new Proxy({},{get(i,a){var g,p,l;let c=i[a];if(w&&i.hasOwnProperty(a)){let E=i[a],P=C.find(ae=>ae.featureIdentifier===a&&E===ae.featureValue);P?(P.variationIdentifier=((g=S[a])==null?void 0:g.identifier)||"",G(P)):C.push({featureIdentifier:a,featureValue:E,variationIdentifier:((p=S[a])==null?void 0:p.identifier)||"",count:1,lastAccessed:Date.now()}),y("Metrics event: Flag:",a,"has been read with value:",E,"variationIdentifier:",(l=S[a])==null?void 0:l.identifier)}return c}}):{}},O=ee();pe().then(()=>Ee(t,v).then(i=>h(void 0,null,function*(){if(r)return;R=i;let a=ce(i);if(A={Authorization:`Bearer ${R}`,"Harness-AccountID":a.accountID,"Harness-EnvironmentID":a.environmentIdentifier,"Harness-SDK-Info":me},globalThis.btoa){let p=globalThis.btoa(JSON.stringify(e));p.length<262144&&(A["Harness-Target"]=p)}y("Authenticated",a),u=window.setTimeout($,v.eventsSyncInterval),o=a.environment,s=a.clusterIdentifier;let c=!!Object.keys(S).length;if((yield N()).type==="success"&&y("Fetch all flags ok",O),!r){if(v.streamEnabled?(y("Streaming mode enabled"),ye()):v.pollingEnabled?(y("Polling mode enabled"),Re()):y("Streaming and polling mode disabled"),!c){H();let p=T({},O);m(),d.emit("ready",p)}Z=!0}})).catch(i=>{I("Authentication error: ",i),d.emit("auth error",i),d.emit("error",i)}));let N=()=>h(void 0,null,function*(){try{let i=yield k(`${v.baseUrl}/client/env/${o}/target/${e.identifier}/evaluations?cluster=${s}`,{headers:A});if(i.ok){let a=yield i.json();return a.forEach(D),d.emit("flags loaded",a),{type:"success",data:a}}else return I("Features fetch operation error: ",i),d.emit("fetch flags error",i),d.emit("error",i),{type:"error",error:i}}catch(i){return I("Features fetch operation error: ",i),d.emit("fetch flags error",i),d.emit("error",i),{type:"error",error:i}}}),te=i=>h(void 0,null,function*(){try{let a=yield k(`${v.baseUrl}/client/env/${o}/target/${e.identifier}/evaluations/${i}?cluster=${s}`,{headers:A});if(a.ok){let c=yield a.json();D(c)}else I("Feature fetch operation error: ",a),d.emit("fetch flag error",a),d.emit("error",a)}catch(a){I("Feature fetch operation error: ",a),d.emit("fetch flag error",a),d.emit("error",a)}}),D=i=>{H();let a=X(i);a!==O[i.flag]&&(y("Flag variation has changed for ",i.identifier),O[i.flag]=a,S[i.flag]=U(T({},i),{value:a}),be(i)),m()};b=new x(N,v,d);let ye=()=>{let i=l=>{switch(l.event){case"create":c(l.evaluations)?l.evaluations.forEach(E=>{D(E)}):setTimeout(()=>te(l.identifier),1e3);break;case"patch":c(l.evaluations)?l.evaluations.forEach(E=>{D(E)}):te(l.identifier);break;case"delete":delete O[l.identifier],d.emit("changed",{flag:l.identifier,value:void 0,deleted:!0}),y("Evaluation deleted",{message:l,storage:O});break}},a=l=>!(!l||!l.flag||!l.identifier||!l.kind||!l.value),c=l=>!(!l||l.length==0||!l.every(E=>a(E))),g=l=>{l.event==="patch"&&(c(l.evaluations)?l.evaluations.forEach(E=>{D(E)}):N())},p=`${v.baseUrl}/stream?cluster=${s}`;f=new M(d,v,p,t,A,b,l=>{l.domain==="flag"?i(l):l.domain==="target-segment"&&g(l)}),f.start()},Re=()=>{b.start()},K=(i,a)=>d.on(i,a),Ie=(i,a)=>{i?d.off(i,a):ie()},Se=(i,a)=>{var l;if(!w||z||a===void 0)return;let c=a,g=i,p=C.find(E=>E.featureIdentifier===g&&E.featureValue===c);p?(G(p),p.variationIdentifier=((l=S[g])==null?void 0:l.identifier)||""):C.push({featureIdentifier:g,featureValue:c,count:1,variationIdentifier:S[g].identifier||"",lastAccessed:Date.now()})},ie=()=>{r=!0,v.streamEnabled&&(y("Closing event stream"),typeof(f==null?void 0:f.close)=="function"&&f.close(),d.all.clear()),v.pollingEnabled&&b.isPolling()&&(y("Closing Poller"),b.stop()),O=ee(),S={},clearTimeout(u)},ne=(i,a=!0)=>{i.length&&q(()=>{let c=!!Object.keys(S).length;if(i.forEach(D),!c){H();let g=T({},O);m(),d.emit("ready",g)}},a)};return{on:K,off:Ie,close:ie,setEvaluations:ne,registerAPIRequestMiddleware:i=>{k=J(i)},refreshEvaluations:()=>{Z&&!r&&Date.now()-Q>=6e4&&(N(),Q=Date.now())},variation:(i,a,c=!1)=>ge(i,a,O,Se,c)}};return Fe(Ue);})();
var HarnessFFSDK=(()=>{var N=Object.defineProperty,we=Object.defineProperties,Ce=Object.getOwnPropertyDescriptor,Oe=Object.getOwnPropertyDescriptors,Te=Object.getOwnPropertyNames,re=Object.getOwnPropertySymbols;var se=Object.prototype.hasOwnProperty,Ae=Object.prototype.propertyIsEnumerable;var oe=(t,e,a)=>e in t?N(t,e,{enumerable:!0,configurable:!0,writable:!0,value:a}):t[e]=a,C=(t,e)=>{for(var a in e||(e={}))se.call(e,a)&&oe(t,a,e[a]);if(re)for(var a of re(e))Ae.call(e,a)&&oe(t,a,e[a]);return t},j=(t,e)=>we(t,Oe(e));var De=(t,e)=>{for(var a in e)N(t,a,{get:e[a],enumerable:!0})},Pe=(t,e,a,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Te(e))!se.call(t,o)&&o!==a&&N(t,o,{get:()=>e[o],enumerable:!(r=Ce(e,o))||r.enumerable});return t};var Fe=t=>Pe(N({},"__esModule",{value:!0}),t);var h=(t,e,a)=>new Promise((r,o)=>{var s=y=>{try{R(a.next(y))}catch(d){o(d)}},u=y=>{try{R(a.throw(y))}catch(d){o(d)}},R=y=>y.done?r(y.value):Promise.resolve(y.value).then(s,u);R((a=a.apply(t,e)).next())});var Ue={};De(Ue,{Event:()=>F,initialize:()=>Ke});function q(t){this.message=t}q.prototype=new Error,q.prototype.name="InvalidCharacterError";var le=typeof window!="undefined"&&window.atob&&window.atob.bind(window)||function(t){var e=String(t).replace(/=+$/,"");if(e.length%4==1)throw new q("'atob' failed: The string to be decoded is not correctly encoded.");for(var a,r,o=0,s=0,u="";r=e.charAt(s++);~r&&(a=o%4?64*a+r:r,o++%4)?u+=String.fromCharCode(255&a>>(-2*o&6)):0)r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(r);return u};function xe(t){var e=t.replace(/-/g,"+").replace(/_/g,"/");switch(e.length%4){case 0:break;case 2:e+="==";break;case 3:e+="=";break;default:throw"Illegal base64url string!"}try{return function(a){return decodeURIComponent(le(a).replace(/(.)/g,function(r,o){var s=o.charCodeAt(0).toString(16).toUpperCase();return s.length<2&&(s="0"+s),"%"+s}))}(e)}catch(a){return le(e)}}function V(t){this.message=t}function ke(t,e){if(typeof t!="string")throw new V("Invalid token specified");var a=(e=e||{}).header===!0?0:1;try{return JSON.parse(xe(t.split(".")[a]))}catch(r){throw new V("Invalid token specified: "+r.message)}}V.prototype=new Error,V.prototype.name="InvalidTokenError";var ce=ke;function de(t){return{all:t=t||new Map,on:function(e,a){var r=t.get(e);r&&r.push(a)||t.set(e,[a])},off:function(e,a){var r=t.get(e);r&&r.splice(r.indexOf(a)>>>0,1)},emit:function(e,a){(t.get(e)||[]).slice().map(function(r){r(a)}),(t.get("*")||[]).slice().map(function(r){r(e,a)})}}}var F=(v=>(v.READY="ready",v.CONNECTED="connected",v.DISCONNECTED="disconnected",v.STOPPED="stopped",v.POLLING="polling",v.POLLING_STOPPED="polling stopped",v.FLAGS_LOADED="flags loaded",v.CACHE_LOADED="cache loaded",v.CHANGED="changed",v.ERROR="error",v.ERROR_CACHE="cache error",v.ERROR_METRICS="metrics error",v.ERROR_AUTH="auth error",v.ERROR_FETCH_FLAGS="fetch flags error",v.ERROR_FETCH_FLAG="fetch flag error",v.ERROR_STREAM="stream error",v))(F||{});var Me={debug:!1,baseUrl:"https://config.ff.harness.io/api/1.0",eventUrl:"https://events.ff.harness.io/api/1.0",eventsSyncInterval:6e4,pollingInterval:6e4,streamEnabled:!0,cache:!1},ge=t=>{let e=C(C({},Me),t);return e.pollingEnabled===void 0&&(e.pollingEnabled=e.streamEnabled),e.eventsSyncInterval<6e4&&(e.eventsSyncInterval=6e4),e.pollingInterval<6e4&&(e.pollingInterval=6e4),(!e.logger||!e.logger.debug||!e.logger.error||!e.logger.info||!e.logger.warn)&&(e.logger=console),e},J=(t,e=!0)=>{e?setTimeout(t,0):t()},_=(t,e)=>Math.round(Math.random()*(e-t)+t);function W(t){return function(...a){let[r,o]=t(a);return fetch(r,o)}}var ue=3e4,L=class{constructor(e,a,r,o,s,u,R,y,d){this.eventBus=e;this.configurations=a;this.url=r;this.apiKey=o;this.standardHeaders=s;this.fallbackPoller=u;this.logDebug=R;this.logError=y;this.eventCallback=d;this.closed=!1;this.connectionOpened=!1;this.disconnectEventEmitted=!1}start(){let e=d=>{d.toString().split(/\r?\n/).forEach(a)},a=d=>{if(d.startsWith("data:")){let S=JSON.parse(d.substring(5));this.logDebugMessage("Received event from stream: ",S),this.eventCallback(S)}},r=()=>{this.logDebugMessage("Stream connected"),this.eventBus.emit("connected")},o=()=>{clearInterval(this.readTimeoutCheckerId);let d=_(1e3,1e4);this.logDebugMessage("Stream disconnected, will reconnect in "+d+"ms"),this.disconnectEventEmitted||(this.eventBus.emit("disconnected"),this.disconnectEventEmitted=!0),setTimeout(()=>this.start(),d)},s=d=>{d&&this.logErrorMessage("Stream has issue",d),this.fallBackToPolling(),this.eventBus.emit("stream error",d),this.eventBus.emit("error",d),o()},u=C({"Cache-Control":"no-cache",Accept:"text/event-stream","API-Key":this.apiKey},this.standardHeaders);this.logDebugMessage("SSE HTTP start request",this.url),this.xhr=new XMLHttpRequest,this.xhr.open("GET",this.url);for(let[d,S]of Object.entries(u))this.xhr.setRequestHeader(d,S);this.xhr.timeout=24*60*60*1e3,this.xhr.onerror=()=>{this.connectionOpened=!1,s("XMLHttpRequest error on SSE stream")},this.xhr.onabort=()=>{this.connectionOpened=!1,this.logDebugMessage("SSE aborted"),this.closed||s(null)},this.xhr.ontimeout=()=>{this.connectionOpened=!1,s("SSE timeout")},this.xhr.onload=()=>{if(this.xhr.status>=400&&this.xhr.status<=599){s(`HTTP code ${this.xhr.status}`);return}this.connectionOpened||(r(),this.connectionOpened=!0,this.disconnectEventEmitted=!1)};let R=0,y=Date.now();this.xhr.onprogress=()=>{this.connectionOpened||(r(),this.connectionOpened=!0,this.disconnectEventEmitted=!1),this.stopFallBackPolling(),y=Date.now();let d=this.xhr.responseText.slice(R);R+=d.length,this.logDebugMessage("SSE GOT: "+d),e(d)},this.readTimeoutCheckerId=setInterval(()=>{y<Date.now()-ue&&(this.logErrorMessage("SSE read timeout"),this.xhr.abort())},ue),this.xhr.send()}close(){this.connectionOpened=!1,this.closed=!0,this.xhr&&this.xhr.abort(),clearInterval(this.readTimeoutCheckerId),this.eventBus.emit("stopped"),this.stopFallBackPolling()}fallBackToPolling(){!this.fallbackPoller.isPolling()&&this.configurations.pollingEnabled&&(this.logDebugMessage("Falling back to polling mode while stream recovers"),this.fallbackPoller.start())}stopFallBackPolling(){this.fallbackPoller.isPolling()&&(this.logDebugMessage("Stopping fallback polling mode"),this.fallbackPoller.stop())}logDebugMessage(e,...a){this.configurations.debug&&this.logDebug(`Streaming: ${e}`,...a)}logErrorMessage(e,...a){this.logError(`Streaming: ${e}`,...a)}};function fe(t,e,a,r,o){let s=t in a,u=s?a[t]:e;return s&&r(t,u),o?{value:u,isDefaultValue:!s}:u}var x=class{constructor(e,a,r,o,s){this.fetchFlagsFn=e;this.configurations=a;this.eventBus=r;this.logDebug=o;this.logError=s;this.maxAttempts=5}start(){if(this.isPolling()){this.logDebugMessage("Already polling.");return}this.isRunning=!0,this.eventBus.emit("polling"),this.logDebugMessage(`Starting poller, first poll will be in ${this.configurations.pollingInterval}ms`),this.timeoutId=setTimeout(()=>this.poll(),this.configurations.pollingInterval)}poll(){this.attemptFetch().finally(()=>{this.timeoutId=setTimeout(()=>this.poll(),this.configurations.pollingInterval)})}attemptFetch(){return h(this,null,function*(){for(let e=1;e<=this.maxAttempts;e++){let a=yield this.fetchFlagsFn();if(a.type==="success"){this.logDebugMessage(`Successfully polled for flag updates, next poll in ${this.configurations.pollingInterval}ms. `);return}if(this.logErrorMessage("Error when polling for flag updates",a.error),e>=this.maxAttempts){this.logDebugMessage(`Maximum attempts reached for polling for flags. Next poll in ${this.configurations.pollingInterval}ms.`);return}this.logDebugMessage(`Polling for flags attempt #${e} failed. Remaining attempts: ${this.maxAttempts-e}`,a.error);let r=_(1e3,1e4);yield new Promise(o=>setTimeout(o,r))}})}stop(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=void 0,this.isRunning=!1,this.eventBus.emit("polling stopped"),this.logDebugMessage("Polling stopped"))}isPolling(){return this.isRunning}logDebugMessage(e,...a){this.configurations.debug&&this.logDebug(`Poller: ${e}`,...a)}logErrorMessage(e,...a){this.logError(`Poller: ${e}`,...a)}};function he(a){return h(this,arguments,function*(t,e={}){let r=yield Le(t),o=He(e);return{loadFromCache:()=>Y(r,o,e),saveToCache:s=>z(r,o,s),updateCachedEvaluation:s=>Ve(r,o,s),removeCachedEvaluation:s=>_e(r,o,s)}})}function Y(r,o){return h(this,arguments,function*(t,e,a={}){let s=parseInt(yield e.getItem(t+".ts"));if(a!=null&&a.ttl&&!isNaN(s)&&s+a.ttl<Date.now())return yield Ne(t,e),[];let u=yield e.getItem(t);if(u)try{return JSON.parse(u)}catch(R){}return[]})}function Ne(t,e){return h(this,null,function*(){yield e.removeItem(t),yield e.removeItem(t+".ts")})}function z(t,e,a){return h(this,null,function*(){yield e.setItem(t,JSON.stringify(a)),yield e.setItem(t+".ts",Date.now().toString())})}function Ve(t,e,a){return h(this,null,function*(){let r=yield Y(t,e),o=r.find(({flag:s})=>s===a.flag);o?Object.assign(o,a):r.push(a),yield z(t,e,r)})}function _e(t,e,a){return h(this,null,function*(){let r=yield Y(t,e),o=r.findIndex(({flag:s})=>s===a);o>-1&&(r.splice(o,1),yield z(t,e,r))})}function Le(t){return h(this,null,function*(){var a,r;let e=t;if(globalThis!=null&&globalThis.TextEncoder&&((r=(a=globalThis==null?void 0:globalThis.crypto)==null?void 0:a.subtle)!=null&&r.digest)){let s=new TextEncoder().encode(t),u=yield crypto.subtle.digest("SHA-256",s);e=Array.from(new Uint8Array(u)).map(y=>y.toString(16).padStart(2,"0")).join("")}else globalThis.btoa&&(e=btoa(t));return"HARNESS_FF_CACHE_"+e})}function He(t){let e;return!t.storage||typeof t.storage!="object"||!("getItem"in t.storage)||!("setItem"in t.storage)||!("removeItem"in t.storage)?globalThis.localStorage?e=globalThis.localStorage:globalThis.sessionStorage?e=globalThis.sessionStorage:e=Ge:e=t.storage,{getItem(r){return h(this,null,function*(){let o=e.getItem(r);return o instanceof Promise?yield o:o})},setItem(r,o){return h(this,null,function*(){let s=e.setItem(r,o);s instanceof Promise&&(yield s)})},removeItem(r){return h(this,null,function*(){let o=e.removeItem(r);o instanceof Promise&&(yield o)})}}}var Ge={getItem:()=>null,setItem:()=>{},removeItem:()=>{}};var me="1.25.0",ve=`Javascript ${me} Client`,$e=500,Be=globalThis.fetch,X=!!globalThis.Proxy,Ke=(t,e,a)=>{let r=!1,o,s,u,R,y,d,S=!0,A={},k=W(i=>i),Q=0,Z=!1,H=()=>{S=!1},v=()=>{S=!0},w=[],g=de(),m=ge(a),p=(i,...n)=>{m.debug&&m.logger.debug(`[FF-SDK] ${i}`,...n)},O=(i,...n)=>{m.logger.error(`[FF-SDK] ${i}`,...n)},G=i=>{let{value:n}=i;try{switch(i.kind.toLowerCase()){case"int":case"number":n=Number(n);break;case"boolean":n=n.toString().toLowerCase()==="true";break;case"json":n=JSON.parse(n);break}}catch(c){O(c)}return n},$=i=>{if(S){let n=Date.now();n-i.lastAccessed>$e&&(i.count++,i.lastAccessed=n)}},pe=()=>h(void 0,null,function*(){if(m.cache){p("initializing cache");try{let i=!0,n=yield he(e.identifier+t,typeof m.cache=="boolean"?{}:m.cache),c=yield n.loadFromCache();c!=null&&c.length&&J(()=>{p("loading from cache",c),ne(c,!1),g.emit("cache loaded",c)}),U("flags loaded",f=>h(void 0,null,function*(){yield n.saveToCache(f),i=!1})),U("changed",f=>h(void 0,null,function*(){i||(f.deleted?yield n.removeCachedEvaluation(f.flag):yield n.updateCachedEvaluation(f))}))}catch(i){O("Cache error: ",i),g.emit("cache error",i),g.emit("error",i)}}}),Ee=(i,n)=>h(void 0,null,function*(){return(yield(yield Be(`${n.baseUrl}/client/auth`,{method:"POST",headers:{"Content-Type":"application/json","Harness-SDK-Info":ve},body:JSON.stringify({apiKey:i,target:j(C({},e),{identifier:String(e.identifier)})})})).json()).authToken}),B=0,K=()=>{if(w.length){p("Sending metrics...",{metrics:w,evaluations:I});let i={metricsData:w.map(n=>({timestamp:Date.now(),count:n.count,metricsType:"FFMETRICS",attributes:[{key:"featureIdentifier",value:n.featureIdentifier},{key:"featureName",value:n.featureIdentifier},{key:"variationIdentifier",value:n.variationIdentifier},{key:"target",value:e.identifier},{key:"SDK_NAME",value:"JavaScript"},{key:"SDK_LANGUAGE",value:"JavaScript"},{key:"SDK_TYPE",value:"client"},{key:"SDK_VERSION",value:me}]}))};k(`${m.eventUrl}/metrics/${o}?cluster=${s}`,{method:"POST",headers:C({"Content-Type":"application/json"},A),body:JSON.stringify(i)}).then(()=>{w=[],B=0}).catch(n=>{B++&&(w=[],B=0),p(n),g.emit("metrics error",n)}).finally(()=>{d=window.setTimeout(K,m.eventsSyncInterval)})}else d=window.setTimeout(K,m.eventsSyncInterval)},I={},be=i=>{p("Sending event for",i.flag),X?g.emit("changed",new Proxy(i,{get(n,c){var f;if(S&&n.hasOwnProperty(c)&&c==="value"){let E=n.flag,l=i.value,b=w.find(P=>P.featureIdentifier===E&&P.featureValue===l);b?($(b),b.variationIdentifier=((f=I[E])==null?void 0:f.identifier)||""):w.push({featureIdentifier:E,featureValue:String(l),variationIdentifier:I[E].identifier||"",count:1,lastAccessed:Date.now()}),p("Metrics event: Flag",c,"has been read with value via stream update",l)}return c==="value"?G(i):i[c]}})):g.emit("changed",{deleted:i.deleted,flag:i.flag,value:G(i)})},ee=function(){return X?new Proxy({},{get(i,n){var f,E,l;let c=i[n];if(S&&i.hasOwnProperty(n)){let b=i[n],P=w.find(ae=>ae.featureIdentifier===n&&b===ae.featureValue);P?(P.variationIdentifier=((f=I[n])==null?void 0:f.identifier)||"",$(P)):w.push({featureIdentifier:n,featureValue:b,variationIdentifier:((E=I[n])==null?void 0:E.identifier)||"",count:1,lastAccessed:Date.now()}),p("Metrics event: Flag:",n,"has been read with value:",b,"variationIdentifier:",(l=I[n])==null?void 0:l.identifier)}return c}}):{}},T=ee();pe().then(()=>Ee(t,m).then(i=>h(void 0,null,function*(){if(r)return;y=i;let n=ce(i);if(A={Authorization:`Bearer ${y}`,"Harness-AccountID":n.accountID,"Harness-EnvironmentID":n.environmentIdentifier,"Harness-SDK-Info":ve},globalThis.btoa){let E=globalThis.btoa(JSON.stringify(e));E.length<262144&&(A["Harness-Target"]=E)}p("Authenticated",n),d=window.setTimeout(K,m.eventsSyncInterval),o=n.environment,s=n.clusterIdentifier;let c=!!Object.keys(I).length;if((yield M()).type==="success"&&p("Fetch all flags ok",T),!r){if(m.streamEnabled?(p("Streaming mode enabled"),ye()):m.pollingEnabled?(p("Polling mode enabled"),Re()):p("Streaming and polling mode disabled"),!c){H();let E=C({},T);v(),g.emit("ready",E)}Z=!0}})).catch(i=>{O("Authentication error: ",i),g.emit("auth error",i),g.emit("error",i)}));let M=()=>h(void 0,null,function*(){try{let i=yield k(`${m.baseUrl}/client/env/${o}/target/${e.identifier}/evaluations?cluster=${s}`,{headers:A});if(i.ok){let n=yield i.json();return n.forEach(D),g.emit("flags loaded",n),{type:"success",data:n}}else return O("Features fetch operation error: ",i),g.emit("fetch flags error",i),g.emit("error",i),{type:"error",error:i}}catch(i){return O("Features fetch operation error: ",i),g.emit("fetch flags error",i),g.emit("error",i),{type:"error",error:i}}}),te=i=>h(void 0,null,function*(){try{let n=yield k(`${m.baseUrl}/client/env/${o}/target/${e.identifier}/evaluations/${i}?cluster=${s}`,{headers:A});if(n.ok){let c=yield n.json();D(c)}else O("Feature fetch operation error: ",n),g.emit("fetch flag error",n),g.emit("error",n)}catch(n){O("Feature fetch operation error: ",n),g.emit("fetch flag error",n),g.emit("error",n)}}),D=i=>{H();let n=G(i);n!==T[i.flag]&&(p("Flag variation has changed for ",i.identifier),T[i.flag]=n,I[i.flag]=j(C({},i),{value:n}),be(i)),v()};R=new x(M,m,g,p,O);let ye=()=>{let i=l=>{switch(l.event){case"create":c(l.evaluations)?l.evaluations.forEach(b=>{D(b)}):setTimeout(()=>te(l.identifier),1e3);break;case"patch":c(l.evaluations)?l.evaluations.forEach(b=>{D(b)}):te(l.identifier);break;case"delete":delete T[l.identifier],g.emit("changed",{flag:l.identifier,value:void 0,deleted:!0}),p("Evaluation deleted",{message:l,storage:T});break}},n=l=>!(!l||!l.flag||!l.identifier||!l.kind||!l.value),c=l=>!(!l||l.length==0||!l.every(b=>n(b))),f=l=>{l.event==="patch"&&(c(l.evaluations)?l.evaluations.forEach(b=>{D(b)}):M())},E=`${m.baseUrl}/stream?cluster=${s}`;u=new L(g,m,E,t,A,R,p,O,l=>{l.domain==="flag"?i(l):l.domain==="target-segment"&&f(l)}),u.start()},Re=()=>{R.start()},U=(i,n)=>g.on(i,n),Ie=(i,n)=>{i?g.off(i,n):ie()},Se=(i,n)=>{var l;if(!S||X||n===void 0)return;let c=n,f=i,E=w.find(b=>b.featureIdentifier===f&&b.featureValue===c);E?($(E),E.variationIdentifier=((l=I[f])==null?void 0:l.identifier)||""):w.push({featureIdentifier:f,featureValue:c,count:1,variationIdentifier:I[f].identifier||"",lastAccessed:Date.now()})},ie=()=>{r=!0,m.streamEnabled&&(p("Closing event stream"),typeof(u==null?void 0:u.close)=="function"&&u.close(),g.all.clear()),m.pollingEnabled&&R.isPolling()&&(p("Closing Poller"),R.stop()),T=ee(),I={},clearTimeout(d)},ne=(i,n=!0)=>{i.length&&J(()=>{let c=!!Object.keys(I).length;if(i.forEach(D),!c){H();let f=C({},T);v(),g.emit("ready",f)}},n)};return{on:U,off:Ie,close:ie,setEvaluations:ne,registerAPIRequestMiddleware:i=>{k=W(i)},refreshEvaluations:()=>{Z&&!r&&Date.now()-Q>=6e4&&(M(),Q=Date.now())},variation:(i,n,c=!1)=>fe(i,n,T,Se,c)}};return Fe(Ue);})();

@@ -1,1 +0,1 @@

var Ie=Object.defineProperty,Se=Object.defineProperties;var we=Object.getOwnPropertyDescriptors;var ae=Object.getOwnPropertySymbols;var Ce=Object.prototype.hasOwnProperty,Te=Object.prototype.propertyIsEnumerable;var re=(t,e,n)=>e in t?Ie(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,T=(t,e)=>{for(var n in e||(e={}))Ce.call(e,n)&&re(t,n,e[n]);if(ae)for(var n of ae(e))Te.call(e,n)&&re(t,n,e[n]);return t},K=(t,e)=>Se(t,we(e));var h=(t,e,n)=>new Promise((r,o)=>{var s=R=>{try{b(n.next(R))}catch(u){o(u)}},f=R=>{try{b(n.throw(R))}catch(u){o(u)}},b=R=>R.done?r(R.value):Promise.resolve(R.value).then(s,f);b((n=n.apply(t,e)).next())});function U(t){this.message=t}U.prototype=new Error,U.prototype.name="InvalidCharacterError";var oe=typeof window!="undefined"&&window.atob&&window.atob.bind(window)||function(t){var e=String(t).replace(/=+$/,"");if(e.length%4==1)throw new U("'atob' failed: The string to be decoded is not correctly encoded.");for(var n,r,o=0,s=0,f="";r=e.charAt(s++);~r&&(n=o%4?64*n+r:r,o++%4)?f+=String.fromCharCode(255&n>>(-2*o&6)):0)r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(r);return f};function Oe(t){var e=t.replace(/-/g,"+").replace(/_/g,"/");switch(e.length%4){case 0:break;case 2:e+="==";break;case 3:e+="=";break;default:throw"Illegal base64url string!"}try{return function(n){return decodeURIComponent(oe(n).replace(/(.)/g,function(r,o){var s=o.charCodeAt(0).toString(16).toUpperCase();return s.length<2&&(s="0"+s),"%"+s}))}(e)}catch(n){return oe(e)}}function N(t){this.message=t}function Ae(t,e){if(typeof t!="string")throw new N("Invalid token specified");var n=(e=e||{}).header===!0?0:1;try{return JSON.parse(Oe(t.split(".")[n]))}catch(r){throw new N("Invalid token specified: "+r.message)}}N.prototype=new Error,N.prototype.name="InvalidTokenError";var se=Ae;function le(t){return{all:t=t||new Map,on:function(e,n){var r=t.get(e);r&&r.push(n)||t.set(e,[n])},off:function(e,n){var r=t.get(e);r&&r.splice(r.indexOf(n)>>>0,1)},emit:function(e,n){(t.get(e)||[]).slice().map(function(r){r(n)}),(t.get("*")||[]).slice().map(function(r){r(e,n)})}}}var V=(m=>(m.READY="ready",m.CONNECTED="connected",m.DISCONNECTED="disconnected",m.STOPPED="stopped",m.POLLING="polling",m.POLLING_STOPPED="polling stopped",m.FLAGS_LOADED="flags loaded",m.CACHE_LOADED="cache loaded",m.CHANGED="changed",m.ERROR="error",m.ERROR_CACHE="cache error",m.ERROR_METRICS="metrics error",m.ERROR_AUTH="auth error",m.ERROR_FETCH_FLAGS="fetch flags error",m.ERROR_FETCH_FLAG="fetch flag error",m.ERROR_STREAM="stream error",m))(V||{});var De={debug:!1,baseUrl:"https://config.ff.harness.io/api/1.0",eventUrl:"https://events.ff.harness.io/api/1.0",eventsSyncInterval:6e4,pollingInterval:6e4,streamEnabled:!0,cache:!1},ce=t=>{let e=T(T({},De),t);return e.pollingEnabled===void 0&&(e.pollingEnabled=e.streamEnabled),e.eventsSyncInterval<6e4&&(e.eventsSyncInterval=6e4),e.pollingInterval<6e4&&(e.pollingInterval=6e4),e},I=(t,...e)=>console.error(`[FF-SDK] ${t}`,...e),j=(t,e=!0)=>{e?setTimeout(t,0):t()},_=(t,e)=>Math.round(Math.random()*(e-t)+t);function q(t){return function(...n){let[r,o]=t(n);return fetch(r,o)}}var ue=3e4,L=class{constructor(e,n,r,o,s,f,b){this.closed=!1;this.connectionOpened=!1;this.disconnectEventEmitted=!1;this.eventBus=e,this.configurations=n,this.url=r,this.apiKey=o,this.standardHeaders=s,this.eventCallback=b,this.fallbackPoller=f}start(){let e=u=>{u.toString().split(/\r?\n/).forEach(n)},n=u=>{if(u.startsWith("data:")){let w=JSON.parse(u.substring(5));this.logDebug("Received event from stream: ",w),this.eventCallback(w)}},r=()=>{this.logDebug("Stream connected"),this.eventBus.emit("connected")},o=()=>{clearInterval(this.readTimeoutCheckerId);let u=_(1e3,1e4);this.logDebug("Stream disconnected, will reconnect in "+u+"ms"),this.disconnectEventEmitted||(this.eventBus.emit("disconnected"),this.disconnectEventEmitted=!0),setTimeout(()=>this.start(),u)},s=u=>{u&&I("Stream has issue",u),this.fallBackToPolling(),this.eventBus.emit("stream error",u),this.eventBus.emit("error",u),o()},f=T({"Cache-Control":"no-cache",Accept:"text/event-stream","API-Key":this.apiKey},this.standardHeaders);this.logDebug("SSE HTTP start request",this.url),this.xhr=new XMLHttpRequest,this.xhr.open("GET",this.url);for(let[u,w]of Object.entries(f))this.xhr.setRequestHeader(u,w);this.xhr.timeout=24*60*60*1e3,this.xhr.onerror=()=>{this.connectionOpened=!1,s("XMLHttpRequest error on SSE stream")},this.xhr.onabort=()=>{this.connectionOpened=!1,this.logDebug("SSE aborted"),this.closed||s(null)},this.xhr.ontimeout=()=>{this.connectionOpened=!1,s("SSE timeout")},this.xhr.onload=()=>{if(this.xhr.status>=400&&this.xhr.status<=599){s(`HTTP code ${this.xhr.status}`);return}this.connectionOpened||(r(),this.connectionOpened=!0,this.disconnectEventEmitted=!1)};let b=0,R=Date.now();this.xhr.onprogress=()=>{this.connectionOpened||(r(),this.connectionOpened=!0,this.disconnectEventEmitted=!1),this.stopFallBackPolling(),R=Date.now();let u=this.xhr.responseText.slice(b);b+=u.length,this.logDebug("SSE GOT: "+u),e(u)},this.readTimeoutCheckerId=setInterval(()=>{R<Date.now()-ue&&(I("SSE read timeout"),this.xhr.abort())},ue),this.xhr.send()}close(){this.connectionOpened=!1,this.closed=!0,this.xhr&&this.xhr.abort(),clearInterval(this.readTimeoutCheckerId),this.eventBus.emit("stopped"),this.stopFallBackPolling()}fallBackToPolling(){!this.fallbackPoller.isPolling()&&this.configurations.pollingEnabled&&(this.logDebug("Falling back to polling mode while stream recovers"),this.fallbackPoller.start())}stopFallBackPolling(){this.fallbackPoller.isPolling()&&(this.logDebug("Stopping fallback polling mode"),this.fallbackPoller.stop())}logDebug(e,...n){this.configurations.debug&&console.debug(`[FF-SDK] Streaming: ${e}`,...n)}};function de(t,e,n,r,o){let s=t in n,f=s?n[t]:e;return s&&r(t,f),o?{value:f,isDefaultValue:!s}:f}var F=class{constructor(e,n,r){this.fetchFlagsFn=e;this.configurations=n;this.eventBus=r;this.maxAttempts=5}start(){if(this.isPolling()){this.logDebug("Already polling.");return}this.isRunning=!0,this.eventBus.emit("polling"),this.logDebug(`Starting poller, first poll will be in ${this.configurations.pollingInterval}ms`),this.timeoutId=setTimeout(()=>this.poll(),this.configurations.pollingInterval)}poll(){this.attemptFetch().finally(()=>{this.timeoutId=setTimeout(()=>this.poll(),this.configurations.pollingInterval)})}attemptFetch(){return h(this,null,function*(){for(let e=1;e<=this.maxAttempts;e++){let n=yield this.fetchFlagsFn();if(n.type==="success"){this.logDebug(`Successfully polled for flag updates, next poll in ${this.configurations.pollingInterval}ms. `);return}if(I("Error when polling for flag updates",n.error),e>=this.maxAttempts){this.logDebug(`Maximum attempts reached for polling for flags. Next poll in ${this.configurations.pollingInterval}ms.`);return}this.logDebug(`Polling for flags attempt #${e} failed. Remaining attempts: ${this.maxAttempts-e}`,n.error);let r=_(1e3,1e4);yield new Promise(o=>setTimeout(o,r))}})}stop(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=void 0,this.isRunning=!1,this.eventBus.emit("polling stopped"),this.logDebug("Polling stopped"))}isPolling(){return this.isRunning}logDebug(e,...n){this.configurations.debug&&console.debug(`[FF-SDK] Poller: ${e}`,...n)}};function fe(n){return h(this,arguments,function*(t,e={}){let r=yield ke(t),o=Ne(e);return{loadFromCache:()=>J(r,o,e),saveToCache:s=>W(r,o,s),updateCachedEvaluation:s=>Fe(r,o,s),removeCachedEvaluation:s=>xe(r,o,s)}})}function J(r,o){return h(this,arguments,function*(t,e,n={}){let s=parseInt(yield e.getItem(t+".ts"));if(n!=null&&n.ttl&&!isNaN(s)&&s+n.ttl<Date.now())return yield Pe(t,e),[];let f=yield e.getItem(t);if(f)try{return JSON.parse(f)}catch(b){}return[]})}function Pe(t,e){return h(this,null,function*(){yield e.removeItem(t),yield e.removeItem(t+".ts")})}function W(t,e,n){return h(this,null,function*(){yield e.setItem(t,JSON.stringify(n)),yield e.setItem(t+".ts",Date.now().toString())})}function Fe(t,e,n){return h(this,null,function*(){let r=yield J(t,e),o=r.find(({flag:s})=>s===n.flag);o?Object.assign(o,n):r.push(n),yield W(t,e,r)})}function xe(t,e,n){return h(this,null,function*(){let r=yield J(t,e),o=r.findIndex(({flag:s})=>s===n);o>-1&&(r.splice(o,1),yield W(t,e,r))})}function ke(t){return h(this,null,function*(){var n,r;let e=t;if(globalThis!=null&&globalThis.TextEncoder&&((r=(n=globalThis==null?void 0:globalThis.crypto)==null?void 0:n.subtle)!=null&&r.digest)){let s=new TextEncoder().encode(t),f=yield crypto.subtle.digest("SHA-256",s);e=Array.from(new Uint8Array(f)).map(R=>R.toString(16).padStart(2,"0")).join("")}else globalThis.btoa&&(e=btoa(t));return"HARNESS_FF_CACHE_"+e})}function Ne(t){let e;return!t.storage||typeof t.storage!="object"||!("getItem"in t.storage)||!("setItem"in t.storage)||!("removeItem"in t.storage)?globalThis.localStorage?e=globalThis.localStorage:globalThis.sessionStorage?e=globalThis.sessionStorage:e=Ve:e=t.storage,{getItem(r){return h(this,null,function*(){let o=e.getItem(r);return o instanceof Promise?yield o:o})},setItem(r,o){return h(this,null,function*(){let s=e.setItem(r,o);s instanceof Promise&&(yield s)})},removeItem(r){return h(this,null,function*(){let o=e.removeItem(r);o instanceof Promise&&(yield o)})}}}var Ve={getItem:()=>null,setItem:()=>{},removeItem:()=>{}};var he="1.25.0",ge=`Javascript ${he} Client`,_e=500,Le=globalThis.fetch,Y=!!globalThis.Proxy,z=t=>{let{value:e}=t;try{switch(t.kind.toLowerCase()){case"int":case"number":e=Number(e);break;case"boolean":e=e.toString().toLowerCase()==="true";break;case"json":e=JSON.parse(e);break}}catch(n){I(n)}return e},Et=(t,e,n)=>{let r=!1,o,s,f,b,R,u,w=!0,A={},x=q(i=>i),X=0,Q=!1,M=()=>{w=!1},m=()=>{w=!0},C=[],d=le(),v=ce(n),y=(i,...a)=>{v.debug&&console.debug(`[FF-SDK] ${i}`,...a)},H=i=>{if(w){let a=Date.now();a-i.lastAccessed>_e&&(i.count++,i.lastAccessed=a)}},me=()=>h(void 0,null,function*(){if(v.cache){y("initializing cache");try{let i=!0,a=yield fe(e.identifier+t,typeof v.cache=="boolean"?{}:v.cache),c=yield a.loadFromCache();c!=null&&c.length&&j(()=>{y("loading from cache",c),ie(c,!1),d.emit("cache loaded",c)}),$("flags loaded",g=>h(void 0,null,function*(){yield a.saveToCache(g),i=!1})),$("changed",g=>h(void 0,null,function*(){i||(g.deleted?yield a.removeCachedEvaluation(g.flag):yield a.updateCachedEvaluation(g))}))}catch(i){I("Cache error: ",i),d.emit("cache error",i),d.emit("error",i)}}}),ve=(i,a)=>h(void 0,null,function*(){return(yield(yield Le(`${a.baseUrl}/client/auth`,{method:"POST",headers:{"Content-Type":"application/json","Harness-SDK-Info":ge},body:JSON.stringify({apiKey:i,target:K(T({},e),{identifier:String(e.identifier)})})})).json()).authToken}),G=0,B=()=>{if(C.length){y("Sending metrics...",{metrics:C,evaluations:S});let i={metricsData:C.map(a=>({timestamp:Date.now(),count:a.count,metricsType:"FFMETRICS",attributes:[{key:"featureIdentifier",value:a.featureIdentifier},{key:"featureName",value:a.featureIdentifier},{key:"variationIdentifier",value:a.variationIdentifier},{key:"target",value:e.identifier},{key:"SDK_NAME",value:"JavaScript"},{key:"SDK_LANGUAGE",value:"JavaScript"},{key:"SDK_TYPE",value:"client"},{key:"SDK_VERSION",value:he}]}))};x(`${v.eventUrl}/metrics/${o}?cluster=${s}`,{method:"POST",headers:T({"Content-Type":"application/json"},A),body:JSON.stringify(i)}).then(()=>{C=[],G=0}).catch(a=>{G++&&(C=[],G=0),y(a),d.emit("metrics error",a)}).finally(()=>{u=window.setTimeout(B,v.eventsSyncInterval)})}else u=window.setTimeout(B,v.eventsSyncInterval)},S={},pe=i=>{y("Sending event for",i.flag),Y?d.emit("changed",new Proxy(i,{get(a,c){var g;if(w&&a.hasOwnProperty(c)&&c==="value"){let p=a.flag,l=i.value,E=C.find(P=>P.featureIdentifier===p&&P.featureValue===l);E?(H(E),E.variationIdentifier=((g=S[p])==null?void 0:g.identifier)||""):C.push({featureIdentifier:p,featureValue:String(l),variationIdentifier:S[p].identifier||"",count:1,lastAccessed:Date.now()}),y("Metrics event: Flag",c,"has been read with value via stream update",l)}return c==="value"?z(i):i[c]}})):d.emit("changed",{deleted:i.deleted,flag:i.flag,value:z(i)})},Z=function(){return Y?new Proxy({},{get(i,a){var g,p,l;let c=i[a];if(w&&i.hasOwnProperty(a)){let E=i[a],P=C.find(ne=>ne.featureIdentifier===a&&E===ne.featureValue);P?(P.variationIdentifier=((g=S[a])==null?void 0:g.identifier)||"",H(P)):C.push({featureIdentifier:a,featureValue:E,variationIdentifier:((p=S[a])==null?void 0:p.identifier)||"",count:1,lastAccessed:Date.now()}),y("Metrics event: Flag:",a,"has been read with value:",E,"variationIdentifier:",(l=S[a])==null?void 0:l.identifier)}return c}}):{}},O=Z();me().then(()=>ve(t,v).then(i=>h(void 0,null,function*(){if(r)return;R=i;let a=se(i);if(A={Authorization:`Bearer ${R}`,"Harness-AccountID":a.accountID,"Harness-EnvironmentID":a.environmentIdentifier,"Harness-SDK-Info":ge},globalThis.btoa){let p=globalThis.btoa(JSON.stringify(e));p.length<262144&&(A["Harness-Target"]=p)}y("Authenticated",a),u=window.setTimeout(B,v.eventsSyncInterval),o=a.environment,s=a.clusterIdentifier;let c=!!Object.keys(S).length;if((yield k()).type==="success"&&y("Fetch all flags ok",O),!r){if(v.streamEnabled?(y("Streaming mode enabled"),Ee()):v.pollingEnabled?(y("Polling mode enabled"),be()):y("Streaming and polling mode disabled"),!c){M();let p=T({},O);m(),d.emit("ready",p)}Q=!0}})).catch(i=>{I("Authentication error: ",i),d.emit("auth error",i),d.emit("error",i)}));let k=()=>h(void 0,null,function*(){try{let i=yield x(`${v.baseUrl}/client/env/${o}/target/${e.identifier}/evaluations?cluster=${s}`,{headers:A});if(i.ok){let a=yield i.json();return a.forEach(D),d.emit("flags loaded",a),{type:"success",data:a}}else return I("Features fetch operation error: ",i),d.emit("fetch flags error",i),d.emit("error",i),{type:"error",error:i}}catch(i){return I("Features fetch operation error: ",i),d.emit("fetch flags error",i),d.emit("error",i),{type:"error",error:i}}}),ee=i=>h(void 0,null,function*(){try{let a=yield x(`${v.baseUrl}/client/env/${o}/target/${e.identifier}/evaluations/${i}?cluster=${s}`,{headers:A});if(a.ok){let c=yield a.json();D(c)}else I("Feature fetch operation error: ",a),d.emit("fetch flag error",a),d.emit("error",a)}catch(a){I("Feature fetch operation error: ",a),d.emit("fetch flag error",a),d.emit("error",a)}}),D=i=>{M();let a=z(i);a!==O[i.flag]&&(y("Flag variation has changed for ",i.identifier),O[i.flag]=a,S[i.flag]=K(T({},i),{value:a}),pe(i)),m()};b=new F(k,v,d);let Ee=()=>{let i=l=>{switch(l.event){case"create":c(l.evaluations)?l.evaluations.forEach(E=>{D(E)}):setTimeout(()=>ee(l.identifier),1e3);break;case"patch":c(l.evaluations)?l.evaluations.forEach(E=>{D(E)}):ee(l.identifier);break;case"delete":delete O[l.identifier],d.emit("changed",{flag:l.identifier,value:void 0,deleted:!0}),y("Evaluation deleted",{message:l,storage:O});break}},a=l=>!(!l||!l.flag||!l.identifier||!l.kind||!l.value),c=l=>!(!l||l.length==0||!l.every(E=>a(E))),g=l=>{l.event==="patch"&&(c(l.evaluations)?l.evaluations.forEach(E=>{D(E)}):k())},p=`${v.baseUrl}/stream?cluster=${s}`;f=new L(d,v,p,t,A,b,l=>{l.domain==="flag"?i(l):l.domain==="target-segment"&&g(l)}),f.start()},be=()=>{b.start()},$=(i,a)=>d.on(i,a),ye=(i,a)=>{i?d.off(i,a):te()},Re=(i,a)=>{var l;if(!w||Y||a===void 0)return;let c=a,g=i,p=C.find(E=>E.featureIdentifier===g&&E.featureValue===c);p?(H(p),p.variationIdentifier=((l=S[g])==null?void 0:l.identifier)||""):C.push({featureIdentifier:g,featureValue:c,count:1,variationIdentifier:S[g].identifier||"",lastAccessed:Date.now()})},te=()=>{r=!0,v.streamEnabled&&(y("Closing event stream"),typeof(f==null?void 0:f.close)=="function"&&f.close(),d.all.clear()),v.pollingEnabled&&b.isPolling()&&(y("Closing Poller"),b.stop()),O=Z(),S={},clearTimeout(u)},ie=(i,a=!0)=>{i.length&&j(()=>{let c=!!Object.keys(S).length;if(i.forEach(D),!c){M();let g=T({},O);m(),d.emit("ready",g)}},a)};return{on:$,off:ye,close:te,setEvaluations:ie,registerAPIRequestMiddleware:i=>{x=q(i)},refreshEvaluations:()=>{Q&&!r&&Date.now()-X>=6e4&&(k(),X=Date.now())},variation:(i,a,c=!1)=>de(i,a,O,Re,c)}};export{V as Event,Et as initialize};
var Ie=Object.defineProperty,Se=Object.defineProperties;var we=Object.getOwnPropertyDescriptors;var ae=Object.getOwnPropertySymbols;var Ce=Object.prototype.hasOwnProperty,Oe=Object.prototype.propertyIsEnumerable;var re=(i,e,a)=>e in i?Ie(i,e,{enumerable:!0,configurable:!0,writable:!0,value:a}):i[e]=a,C=(i,e)=>{for(var a in e||(e={}))Ce.call(e,a)&&re(i,a,e[a]);if(ae)for(var a of ae(e))Oe.call(e,a)&&re(i,a,e[a]);return i},U=(i,e)=>Se(i,we(e));var h=(i,e,a)=>new Promise((r,o)=>{var s=y=>{try{R(a.next(y))}catch(d){o(d)}},u=y=>{try{R(a.throw(y))}catch(d){o(d)}},R=y=>y.done?r(y.value):Promise.resolve(y.value).then(s,u);R((a=a.apply(i,e)).next())});function j(i){this.message=i}j.prototype=new Error,j.prototype.name="InvalidCharacterError";var oe=typeof window!="undefined"&&window.atob&&window.atob.bind(window)||function(i){var e=String(i).replace(/=+$/,"");if(e.length%4==1)throw new j("'atob' failed: The string to be decoded is not correctly encoded.");for(var a,r,o=0,s=0,u="";r=e.charAt(s++);~r&&(a=o%4?64*a+r:r,o++%4)?u+=String.fromCharCode(255&a>>(-2*o&6)):0)r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(r);return u};function Te(i){var e=i.replace(/-/g,"+").replace(/_/g,"/");switch(e.length%4){case 0:break;case 2:e+="==";break;case 3:e+="=";break;default:throw"Illegal base64url string!"}try{return function(a){return decodeURIComponent(oe(a).replace(/(.)/g,function(r,o){var s=o.charCodeAt(0).toString(16).toUpperCase();return s.length<2&&(s="0"+s),"%"+s}))}(e)}catch(a){return oe(e)}}function M(i){this.message=i}function Ae(i,e){if(typeof i!="string")throw new M("Invalid token specified");var a=(e=e||{}).header===!0?0:1;try{return JSON.parse(Te(i.split(".")[a]))}catch(r){throw new M("Invalid token specified: "+r.message)}}M.prototype=new Error,M.prototype.name="InvalidTokenError";var se=Ae;function le(i){return{all:i=i||new Map,on:function(e,a){var r=i.get(e);r&&r.push(a)||i.set(e,[a])},off:function(e,a){var r=i.get(e);r&&r.splice(r.indexOf(a)>>>0,1)},emit:function(e,a){(i.get(e)||[]).slice().map(function(r){r(a)}),(i.get("*")||[]).slice().map(function(r){r(e,a)})}}}var N=(v=>(v.READY="ready",v.CONNECTED="connected",v.DISCONNECTED="disconnected",v.STOPPED="stopped",v.POLLING="polling",v.POLLING_STOPPED="polling stopped",v.FLAGS_LOADED="flags loaded",v.CACHE_LOADED="cache loaded",v.CHANGED="changed",v.ERROR="error",v.ERROR_CACHE="cache error",v.ERROR_METRICS="metrics error",v.ERROR_AUTH="auth error",v.ERROR_FETCH_FLAGS="fetch flags error",v.ERROR_FETCH_FLAG="fetch flag error",v.ERROR_STREAM="stream error",v))(N||{});var De={debug:!1,baseUrl:"https://config.ff.harness.io/api/1.0",eventUrl:"https://events.ff.harness.io/api/1.0",eventsSyncInterval:6e4,pollingInterval:6e4,streamEnabled:!0,cache:!1},ce=i=>{let e=C(C({},De),i);return e.pollingEnabled===void 0&&(e.pollingEnabled=e.streamEnabled),e.eventsSyncInterval<6e4&&(e.eventsSyncInterval=6e4),e.pollingInterval<6e4&&(e.pollingInterval=6e4),(!e.logger||!e.logger.debug||!e.logger.error||!e.logger.info||!e.logger.warn)&&(e.logger=console),e},q=(i,e=!0)=>{e?setTimeout(i,0):i()},V=(i,e)=>Math.round(Math.random()*(e-i)+i);function J(i){return function(...a){let[r,o]=i(a);return fetch(r,o)}}var de=3e4,_=class{constructor(e,a,r,o,s,u,R,y,d){this.eventBus=e;this.configurations=a;this.url=r;this.apiKey=o;this.standardHeaders=s;this.fallbackPoller=u;this.logDebug=R;this.logError=y;this.eventCallback=d;this.closed=!1;this.connectionOpened=!1;this.disconnectEventEmitted=!1}start(){let e=d=>{d.toString().split(/\r?\n/).forEach(a)},a=d=>{if(d.startsWith("data:")){let S=JSON.parse(d.substring(5));this.logDebugMessage("Received event from stream: ",S),this.eventCallback(S)}},r=()=>{this.logDebugMessage("Stream connected"),this.eventBus.emit("connected")},o=()=>{clearInterval(this.readTimeoutCheckerId);let d=V(1e3,1e4);this.logDebugMessage("Stream disconnected, will reconnect in "+d+"ms"),this.disconnectEventEmitted||(this.eventBus.emit("disconnected"),this.disconnectEventEmitted=!0),setTimeout(()=>this.start(),d)},s=d=>{d&&this.logErrorMessage("Stream has issue",d),this.fallBackToPolling(),this.eventBus.emit("stream error",d),this.eventBus.emit("error",d),o()},u=C({"Cache-Control":"no-cache",Accept:"text/event-stream","API-Key":this.apiKey},this.standardHeaders);this.logDebugMessage("SSE HTTP start request",this.url),this.xhr=new XMLHttpRequest,this.xhr.open("GET",this.url);for(let[d,S]of Object.entries(u))this.xhr.setRequestHeader(d,S);this.xhr.timeout=24*60*60*1e3,this.xhr.onerror=()=>{this.connectionOpened=!1,s("XMLHttpRequest error on SSE stream")},this.xhr.onabort=()=>{this.connectionOpened=!1,this.logDebugMessage("SSE aborted"),this.closed||s(null)},this.xhr.ontimeout=()=>{this.connectionOpened=!1,s("SSE timeout")},this.xhr.onload=()=>{if(this.xhr.status>=400&&this.xhr.status<=599){s(`HTTP code ${this.xhr.status}`);return}this.connectionOpened||(r(),this.connectionOpened=!0,this.disconnectEventEmitted=!1)};let R=0,y=Date.now();this.xhr.onprogress=()=>{this.connectionOpened||(r(),this.connectionOpened=!0,this.disconnectEventEmitted=!1),this.stopFallBackPolling(),y=Date.now();let d=this.xhr.responseText.slice(R);R+=d.length,this.logDebugMessage("SSE GOT: "+d),e(d)},this.readTimeoutCheckerId=setInterval(()=>{y<Date.now()-de&&(this.logErrorMessage("SSE read timeout"),this.xhr.abort())},de),this.xhr.send()}close(){this.connectionOpened=!1,this.closed=!0,this.xhr&&this.xhr.abort(),clearInterval(this.readTimeoutCheckerId),this.eventBus.emit("stopped"),this.stopFallBackPolling()}fallBackToPolling(){!this.fallbackPoller.isPolling()&&this.configurations.pollingEnabled&&(this.logDebugMessage("Falling back to polling mode while stream recovers"),this.fallbackPoller.start())}stopFallBackPolling(){this.fallbackPoller.isPolling()&&(this.logDebugMessage("Stopping fallback polling mode"),this.fallbackPoller.stop())}logDebugMessage(e,...a){this.configurations.debug&&this.logDebug(`Streaming: ${e}`,...a)}logErrorMessage(e,...a){this.logError(`Streaming: ${e}`,...a)}};function ge(i,e,a,r,o){let s=i in a,u=s?a[i]:e;return s&&r(i,u),o?{value:u,isDefaultValue:!s}:u}var F=class{constructor(e,a,r,o,s){this.fetchFlagsFn=e;this.configurations=a;this.eventBus=r;this.logDebug=o;this.logError=s;this.maxAttempts=5}start(){if(this.isPolling()){this.logDebugMessage("Already polling.");return}this.isRunning=!0,this.eventBus.emit("polling"),this.logDebugMessage(`Starting poller, first poll will be in ${this.configurations.pollingInterval}ms`),this.timeoutId=setTimeout(()=>this.poll(),this.configurations.pollingInterval)}poll(){this.attemptFetch().finally(()=>{this.timeoutId=setTimeout(()=>this.poll(),this.configurations.pollingInterval)})}attemptFetch(){return h(this,null,function*(){for(let e=1;e<=this.maxAttempts;e++){let a=yield this.fetchFlagsFn();if(a.type==="success"){this.logDebugMessage(`Successfully polled for flag updates, next poll in ${this.configurations.pollingInterval}ms. `);return}if(this.logErrorMessage("Error when polling for flag updates",a.error),e>=this.maxAttempts){this.logDebugMessage(`Maximum attempts reached for polling for flags. Next poll in ${this.configurations.pollingInterval}ms.`);return}this.logDebugMessage(`Polling for flags attempt #${e} failed. Remaining attempts: ${this.maxAttempts-e}`,a.error);let r=V(1e3,1e4);yield new Promise(o=>setTimeout(o,r))}})}stop(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=void 0,this.isRunning=!1,this.eventBus.emit("polling stopped"),this.logDebugMessage("Polling stopped"))}isPolling(){return this.isRunning}logDebugMessage(e,...a){this.configurations.debug&&this.logDebug(`Poller: ${e}`,...a)}logErrorMessage(e,...a){this.logError(`Poller: ${e}`,...a)}};function ue(a){return h(this,arguments,function*(i,e={}){let r=yield ke(i),o=Me(e);return{loadFromCache:()=>W(r,o,e),saveToCache:s=>Y(r,o,s),updateCachedEvaluation:s=>Fe(r,o,s),removeCachedEvaluation:s=>xe(r,o,s)}})}function W(r,o){return h(this,arguments,function*(i,e,a={}){let s=parseInt(yield e.getItem(i+".ts"));if(a!=null&&a.ttl&&!isNaN(s)&&s+a.ttl<Date.now())return yield Pe(i,e),[];let u=yield e.getItem(i);if(u)try{return JSON.parse(u)}catch(R){}return[]})}function Pe(i,e){return h(this,null,function*(){yield e.removeItem(i),yield e.removeItem(i+".ts")})}function Y(i,e,a){return h(this,null,function*(){yield e.setItem(i,JSON.stringify(a)),yield e.setItem(i+".ts",Date.now().toString())})}function Fe(i,e,a){return h(this,null,function*(){let r=yield W(i,e),o=r.find(({flag:s})=>s===a.flag);o?Object.assign(o,a):r.push(a),yield Y(i,e,r)})}function xe(i,e,a){return h(this,null,function*(){let r=yield W(i,e),o=r.findIndex(({flag:s})=>s===a);o>-1&&(r.splice(o,1),yield Y(i,e,r))})}function ke(i){return h(this,null,function*(){var a,r;let e=i;if(globalThis!=null&&globalThis.TextEncoder&&((r=(a=globalThis==null?void 0:globalThis.crypto)==null?void 0:a.subtle)!=null&&r.digest)){let s=new TextEncoder().encode(i),u=yield crypto.subtle.digest("SHA-256",s);e=Array.from(new Uint8Array(u)).map(y=>y.toString(16).padStart(2,"0")).join("")}else globalThis.btoa&&(e=btoa(i));return"HARNESS_FF_CACHE_"+e})}function Me(i){let e;return!i.storage||typeof i.storage!="object"||!("getItem"in i.storage)||!("setItem"in i.storage)||!("removeItem"in i.storage)?globalThis.localStorage?e=globalThis.localStorage:globalThis.sessionStorage?e=globalThis.sessionStorage:e=Ne:e=i.storage,{getItem(r){return h(this,null,function*(){let o=e.getItem(r);return o instanceof Promise?yield o:o})},setItem(r,o){return h(this,null,function*(){let s=e.setItem(r,o);s instanceof Promise&&(yield s)})},removeItem(r){return h(this,null,function*(){let o=e.removeItem(r);o instanceof Promise&&(yield o)})}}}var Ne={getItem:()=>null,setItem:()=>{},removeItem:()=>{}};var he="1.25.0",fe=`Javascript ${he} Client`,Ve=500,_e=globalThis.fetch,z=!!globalThis.Proxy,Et=(i,e,a)=>{let r=!1,o,s,u,R,y,d,S=!0,A={},x=J(t=>t),X=0,Q=!1,L=()=>{S=!1},v=()=>{S=!0},w=[],g=le(),m=ce(a),p=(t,...n)=>{m.debug&&m.logger.debug(`[FF-SDK] ${t}`,...n)},O=(t,...n)=>{m.logger.error(`[FF-SDK] ${t}`,...n)},H=t=>{let{value:n}=t;try{switch(t.kind.toLowerCase()){case"int":case"number":n=Number(n);break;case"boolean":n=n.toString().toLowerCase()==="true";break;case"json":n=JSON.parse(n);break}}catch(c){O(c)}return n},G=t=>{if(S){let n=Date.now();n-t.lastAccessed>Ve&&(t.count++,t.lastAccessed=n)}},ve=()=>h(void 0,null,function*(){if(m.cache){p("initializing cache");try{let t=!0,n=yield ue(e.identifier+i,typeof m.cache=="boolean"?{}:m.cache),c=yield n.loadFromCache();c!=null&&c.length&&q(()=>{p("loading from cache",c),ie(c,!1),g.emit("cache loaded",c)}),K("flags loaded",f=>h(void 0,null,function*(){yield n.saveToCache(f),t=!1})),K("changed",f=>h(void 0,null,function*(){t||(f.deleted?yield n.removeCachedEvaluation(f.flag):yield n.updateCachedEvaluation(f))}))}catch(t){O("Cache error: ",t),g.emit("cache error",t),g.emit("error",t)}}}),me=(t,n)=>h(void 0,null,function*(){return(yield(yield _e(`${n.baseUrl}/client/auth`,{method:"POST",headers:{"Content-Type":"application/json","Harness-SDK-Info":fe},body:JSON.stringify({apiKey:t,target:U(C({},e),{identifier:String(e.identifier)})})})).json()).authToken}),$=0,B=()=>{if(w.length){p("Sending metrics...",{metrics:w,evaluations:I});let t={metricsData:w.map(n=>({timestamp:Date.now(),count:n.count,metricsType:"FFMETRICS",attributes:[{key:"featureIdentifier",value:n.featureIdentifier},{key:"featureName",value:n.featureIdentifier},{key:"variationIdentifier",value:n.variationIdentifier},{key:"target",value:e.identifier},{key:"SDK_NAME",value:"JavaScript"},{key:"SDK_LANGUAGE",value:"JavaScript"},{key:"SDK_TYPE",value:"client"},{key:"SDK_VERSION",value:he}]}))};x(`${m.eventUrl}/metrics/${o}?cluster=${s}`,{method:"POST",headers:C({"Content-Type":"application/json"},A),body:JSON.stringify(t)}).then(()=>{w=[],$=0}).catch(n=>{$++&&(w=[],$=0),p(n),g.emit("metrics error",n)}).finally(()=>{d=window.setTimeout(B,m.eventsSyncInterval)})}else d=window.setTimeout(B,m.eventsSyncInterval)},I={},pe=t=>{p("Sending event for",t.flag),z?g.emit("changed",new Proxy(t,{get(n,c){var f;if(S&&n.hasOwnProperty(c)&&c==="value"){let E=n.flag,l=t.value,b=w.find(P=>P.featureIdentifier===E&&P.featureValue===l);b?(G(b),b.variationIdentifier=((f=I[E])==null?void 0:f.identifier)||""):w.push({featureIdentifier:E,featureValue:String(l),variationIdentifier:I[E].identifier||"",count:1,lastAccessed:Date.now()}),p("Metrics event: Flag",c,"has been read with value via stream update",l)}return c==="value"?H(t):t[c]}})):g.emit("changed",{deleted:t.deleted,flag:t.flag,value:H(t)})},Z=function(){return z?new Proxy({},{get(t,n){var f,E,l;let c=t[n];if(S&&t.hasOwnProperty(n)){let b=t[n],P=w.find(ne=>ne.featureIdentifier===n&&b===ne.featureValue);P?(P.variationIdentifier=((f=I[n])==null?void 0:f.identifier)||"",G(P)):w.push({featureIdentifier:n,featureValue:b,variationIdentifier:((E=I[n])==null?void 0:E.identifier)||"",count:1,lastAccessed:Date.now()}),p("Metrics event: Flag:",n,"has been read with value:",b,"variationIdentifier:",(l=I[n])==null?void 0:l.identifier)}return c}}):{}},T=Z();ve().then(()=>me(i,m).then(t=>h(void 0,null,function*(){if(r)return;y=t;let n=se(t);if(A={Authorization:`Bearer ${y}`,"Harness-AccountID":n.accountID,"Harness-EnvironmentID":n.environmentIdentifier,"Harness-SDK-Info":fe},globalThis.btoa){let E=globalThis.btoa(JSON.stringify(e));E.length<262144&&(A["Harness-Target"]=E)}p("Authenticated",n),d=window.setTimeout(B,m.eventsSyncInterval),o=n.environment,s=n.clusterIdentifier;let c=!!Object.keys(I).length;if((yield k()).type==="success"&&p("Fetch all flags ok",T),!r){if(m.streamEnabled?(p("Streaming mode enabled"),Ee()):m.pollingEnabled?(p("Polling mode enabled"),be()):p("Streaming and polling mode disabled"),!c){L();let E=C({},T);v(),g.emit("ready",E)}Q=!0}})).catch(t=>{O("Authentication error: ",t),g.emit("auth error",t),g.emit("error",t)}));let k=()=>h(void 0,null,function*(){try{let t=yield x(`${m.baseUrl}/client/env/${o}/target/${e.identifier}/evaluations?cluster=${s}`,{headers:A});if(t.ok){let n=yield t.json();return n.forEach(D),g.emit("flags loaded",n),{type:"success",data:n}}else return O("Features fetch operation error: ",t),g.emit("fetch flags error",t),g.emit("error",t),{type:"error",error:t}}catch(t){return O("Features fetch operation error: ",t),g.emit("fetch flags error",t),g.emit("error",t),{type:"error",error:t}}}),ee=t=>h(void 0,null,function*(){try{let n=yield x(`${m.baseUrl}/client/env/${o}/target/${e.identifier}/evaluations/${t}?cluster=${s}`,{headers:A});if(n.ok){let c=yield n.json();D(c)}else O("Feature fetch operation error: ",n),g.emit("fetch flag error",n),g.emit("error",n)}catch(n){O("Feature fetch operation error: ",n),g.emit("fetch flag error",n),g.emit("error",n)}}),D=t=>{L();let n=H(t);n!==T[t.flag]&&(p("Flag variation has changed for ",t.identifier),T[t.flag]=n,I[t.flag]=U(C({},t),{value:n}),pe(t)),v()};R=new F(k,m,g,p,O);let Ee=()=>{let t=l=>{switch(l.event){case"create":c(l.evaluations)?l.evaluations.forEach(b=>{D(b)}):setTimeout(()=>ee(l.identifier),1e3);break;case"patch":c(l.evaluations)?l.evaluations.forEach(b=>{D(b)}):ee(l.identifier);break;case"delete":delete T[l.identifier],g.emit("changed",{flag:l.identifier,value:void 0,deleted:!0}),p("Evaluation deleted",{message:l,storage:T});break}},n=l=>!(!l||!l.flag||!l.identifier||!l.kind||!l.value),c=l=>!(!l||l.length==0||!l.every(b=>n(b))),f=l=>{l.event==="patch"&&(c(l.evaluations)?l.evaluations.forEach(b=>{D(b)}):k())},E=`${m.baseUrl}/stream?cluster=${s}`;u=new _(g,m,E,i,A,R,p,O,l=>{l.domain==="flag"?t(l):l.domain==="target-segment"&&f(l)}),u.start()},be=()=>{R.start()},K=(t,n)=>g.on(t,n),ye=(t,n)=>{t?g.off(t,n):te()},Re=(t,n)=>{var l;if(!S||z||n===void 0)return;let c=n,f=t,E=w.find(b=>b.featureIdentifier===f&&b.featureValue===c);E?(G(E),E.variationIdentifier=((l=I[f])==null?void 0:l.identifier)||""):w.push({featureIdentifier:f,featureValue:c,count:1,variationIdentifier:I[f].identifier||"",lastAccessed:Date.now()})},te=()=>{r=!0,m.streamEnabled&&(p("Closing event stream"),typeof(u==null?void 0:u.close)=="function"&&u.close(),g.all.clear()),m.pollingEnabled&&R.isPolling()&&(p("Closing Poller"),R.stop()),T=Z(),I={},clearTimeout(d)},ie=(t,n=!0)=>{t.length&&q(()=>{let c=!!Object.keys(I).length;if(t.forEach(D),!c){L();let f=C({},T);v(),g.emit("ready",f)}},n)};return{on:K,off:ye,close:te,setEvaluations:ie,registerAPIRequestMiddleware:t=>{x=J(t)},refreshEvaluations:()=>{Q&&!r&&Date.now()-X>=6e4&&(k(),X=Date.now())},variation:(t,n,c=!1)=>ge(t,n,T,Re,c)}};export{N as Event,Et as initialize};

@@ -1,1 +0,1 @@

var pe=Object.defineProperty,Ee=Object.defineProperties;var Re=Object.getOwnPropertyDescriptors;var ie=Object.getOwnPropertySymbols;var be=Object.prototype.hasOwnProperty,ye=Object.prototype.propertyIsEnumerable;var ne=(n,e,a)=>e in n?pe(n,e,{enumerable:!0,configurable:!0,writable:!0,value:a}):n[e]=a,O=(n,e)=>{for(var a in e||(e={}))be.call(e,a)&&ne(n,a,e[a]);if(ie)for(var a of ie(e))ye.call(e,a)&&ne(n,a,e[a]);return n},$=(n,e)=>Ee(n,Re(e));var h=(n,e,a)=>new Promise((r,s)=>{var l=y=>{try{R(a.next(y))}catch(u){s(u)}},g=y=>{try{R(a.throw(y))}catch(u){s(u)}},R=y=>y.done?r(y.value):Promise.resolve(y.value).then(l,g);R((a=a.apply(n,e)).next())});import De from"jwt-decode";import Pe from"mitt";var k=(m=>(m.READY="ready",m.CONNECTED="connected",m.DISCONNECTED="disconnected",m.STOPPED="stopped",m.POLLING="polling",m.POLLING_STOPPED="polling stopped",m.FLAGS_LOADED="flags loaded",m.CACHE_LOADED="cache loaded",m.CHANGED="changed",m.ERROR="error",m.ERROR_CACHE="cache error",m.ERROR_METRICS="metrics error",m.ERROR_AUTH="auth error",m.ERROR_FETCH_FLAGS="fetch flags error",m.ERROR_FETCH_FLAG="fetch flag error",m.ERROR_STREAM="stream error",m))(k||{});var Ie={debug:!1,baseUrl:"https://config.ff.harness.io/api/1.0",eventUrl:"https://events.ff.harness.io/api/1.0",eventsSyncInterval:6e4,pollingInterval:6e4,streamEnabled:!0,cache:!1},ae=n=>{let e=O(O({},Ie),n);return e.pollingEnabled===void 0&&(e.pollingEnabled=e.streamEnabled),e.eventsSyncInterval<6e4&&(e.eventsSyncInterval=6e4),e.pollingInterval<6e4&&(e.pollingInterval=6e4),e},I=(n,...e)=>console.error(`[FF-SDK] ${n}`,...e),K=(n,e=!0)=>{e?setTimeout(n,0):n()},V=(n,e)=>Math.round(Math.random()*(e-n)+n);function j(n){return function(...a){let[r,s]=n(a);return fetch(r,s)}}var re=3e4,_=class{constructor(e,a,r,s,l,g,R){this.closed=!1;this.connectionOpened=!1;this.disconnectEventEmitted=!1;this.eventBus=e,this.configurations=a,this.url=r,this.apiKey=s,this.standardHeaders=l,this.eventCallback=R,this.fallbackPoller=g}start(){let e=u=>{u.toString().split(/\r?\n/).forEach(a)},a=u=>{if(u.startsWith("data:")){let C=JSON.parse(u.substring(5));this.logDebug("Received event from stream: ",C),this.eventCallback(C)}},r=()=>{this.logDebug("Stream connected"),this.eventBus.emit("connected")},s=()=>{clearInterval(this.readTimeoutCheckerId);let u=V(1e3,1e4);this.logDebug("Stream disconnected, will reconnect in "+u+"ms"),this.disconnectEventEmitted||(this.eventBus.emit("disconnected"),this.disconnectEventEmitted=!0),setTimeout(()=>this.start(),u)},l=u=>{u&&I("Stream has issue",u),this.fallBackToPolling(),this.eventBus.emit("stream error",u),this.eventBus.emit("error",u),s()},g=O({"Cache-Control":"no-cache",Accept:"text/event-stream","API-Key":this.apiKey},this.standardHeaders);this.logDebug("SSE HTTP start request",this.url),this.xhr=new XMLHttpRequest,this.xhr.open("GET",this.url);for(let[u,C]of Object.entries(g))this.xhr.setRequestHeader(u,C);this.xhr.timeout=24*60*60*1e3,this.xhr.onerror=()=>{this.connectionOpened=!1,l("XMLHttpRequest error on SSE stream")},this.xhr.onabort=()=>{this.connectionOpened=!1,this.logDebug("SSE aborted"),this.closed||l(null)},this.xhr.ontimeout=()=>{this.connectionOpened=!1,l("SSE timeout")},this.xhr.onload=()=>{if(this.xhr.status>=400&&this.xhr.status<=599){l(`HTTP code ${this.xhr.status}`);return}this.connectionOpened||(r(),this.connectionOpened=!0,this.disconnectEventEmitted=!1)};let R=0,y=Date.now();this.xhr.onprogress=()=>{this.connectionOpened||(r(),this.connectionOpened=!0,this.disconnectEventEmitted=!1),this.stopFallBackPolling(),y=Date.now();let u=this.xhr.responseText.slice(R);R+=u.length,this.logDebug("SSE GOT: "+u),e(u)},this.readTimeoutCheckerId=setInterval(()=>{y<Date.now()-re&&(I("SSE read timeout"),this.xhr.abort())},re),this.xhr.send()}close(){this.connectionOpened=!1,this.closed=!0,this.xhr&&this.xhr.abort(),clearInterval(this.readTimeoutCheckerId),this.eventBus.emit("stopped"),this.stopFallBackPolling()}fallBackToPolling(){!this.fallbackPoller.isPolling()&&this.configurations.pollingEnabled&&(this.logDebug("Falling back to polling mode while stream recovers"),this.fallbackPoller.start())}stopFallBackPolling(){this.fallbackPoller.isPolling()&&(this.logDebug("Stopping fallback polling mode"),this.fallbackPoller.stop())}logDebug(e,...a){this.configurations.debug&&console.debug(`[FF-SDK] Streaming: ${e}`,...a)}};function oe(n,e,a,r,s){let l=n in a,g=l?a[n]:e;return l&&r(n,g),s?{value:g,isDefaultValue:!l}:g}var F=class{constructor(e,a,r){this.fetchFlagsFn=e;this.configurations=a;this.eventBus=r;this.maxAttempts=5}start(){if(this.isPolling()){this.logDebug("Already polling.");return}this.isRunning=!0,this.eventBus.emit("polling"),this.logDebug(`Starting poller, first poll will be in ${this.configurations.pollingInterval}ms`),this.timeoutId=setTimeout(()=>this.poll(),this.configurations.pollingInterval)}poll(){this.attemptFetch().finally(()=>{this.timeoutId=setTimeout(()=>this.poll(),this.configurations.pollingInterval)})}attemptFetch(){return h(this,null,function*(){for(let e=1;e<=this.maxAttempts;e++){let a=yield this.fetchFlagsFn();if(a.type==="success"){this.logDebug(`Successfully polled for flag updates, next poll in ${this.configurations.pollingInterval}ms. `);return}if(I("Error when polling for flag updates",a.error),e>=this.maxAttempts){this.logDebug(`Maximum attempts reached for polling for flags. Next poll in ${this.configurations.pollingInterval}ms.`);return}this.logDebug(`Polling for flags attempt #${e} failed. Remaining attempts: ${this.maxAttempts-e}`,a.error);let r=V(1e3,1e4);yield new Promise(s=>setTimeout(s,r))}})}stop(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=void 0,this.isRunning=!1,this.eventBus.emit("polling stopped"),this.logDebug("Polling stopped"))}isPolling(){return this.isRunning}logDebug(e,...a){this.configurations.debug&&console.debug(`[FF-SDK] Poller: ${e}`,...a)}};function se(a){return h(this,arguments,function*(n,e={}){let r=yield Oe(n),s=we(e);return{loadFromCache:()=>U(r,s,e),saveToCache:l=>q(r,s,l),updateCachedEvaluation:l=>Ce(r,s,l),removeCachedEvaluation:l=>Te(r,s,l)}})}function U(r,s){return h(this,arguments,function*(n,e,a={}){let l=parseInt(yield e.getItem(n+".ts"));if(a!=null&&a.ttl&&!isNaN(l)&&l+a.ttl<Date.now())return yield Se(n,e),[];let g=yield e.getItem(n);if(g)try{return JSON.parse(g)}catch(R){}return[]})}function Se(n,e){return h(this,null,function*(){yield e.removeItem(n),yield e.removeItem(n+".ts")})}function q(n,e,a){return h(this,null,function*(){yield e.setItem(n,JSON.stringify(a)),yield e.setItem(n+".ts",Date.now().toString())})}function Ce(n,e,a){return h(this,null,function*(){let r=yield U(n,e),s=r.find(({flag:l})=>l===a.flag);s?Object.assign(s,a):r.push(a),yield q(n,e,r)})}function Te(n,e,a){return h(this,null,function*(){let r=yield U(n,e),s=r.findIndex(({flag:l})=>l===a);s>-1&&(r.splice(s,1),yield q(n,e,r))})}function Oe(n){return h(this,null,function*(){var a,r;let e=n;if(globalThis!=null&&globalThis.TextEncoder&&((r=(a=globalThis==null?void 0:globalThis.crypto)==null?void 0:a.subtle)!=null&&r.digest)){let l=new TextEncoder().encode(n),g=yield crypto.subtle.digest("SHA-256",l);e=Array.from(new Uint8Array(g)).map(y=>y.toString(16).padStart(2,"0")).join("")}else globalThis.btoa&&(e=btoa(n));return"HARNESS_FF_CACHE_"+e})}function we(n){let e;return!n.storage||typeof n.storage!="object"||!("getItem"in n.storage)||!("setItem"in n.storage)||!("removeItem"in n.storage)?globalThis.localStorage?e=globalThis.localStorage:globalThis.sessionStorage?e=globalThis.sessionStorage:e=Ae:e=n.storage,{getItem(r){return h(this,null,function*(){let s=e.getItem(r);return s instanceof Promise?yield s:s})},setItem(r,s){return h(this,null,function*(){let l=e.setItem(r,s);l instanceof Promise&&(yield l)})},removeItem(r){return h(this,null,function*(){let s=e.removeItem(r);s instanceof Promise&&(yield s)})}}}var Ae={getItem:()=>null,setItem:()=>{},removeItem:()=>{}};var ce="1.25.0",le=`Javascript ${ce} Client`,Fe=500,xe=globalThis.fetch,W=!!globalThis.Proxy,J=n=>{let{value:e}=n;try{switch(n.kind.toLowerCase()){case"int":case"number":e=Number(e);break;case"boolean":e=e.toString().toLowerCase()==="true";break;case"json":e=JSON.parse(e);break}}catch(a){I(a)}return e},dt=(n,e,a)=>{let r=!1,s,l,g,R,y,u,C=!0,A={},x=j(t=>t),Y=0,z=!1,L=()=>{C=!1},m=()=>{C=!0},T=[],d=Pe(),v=ae(a),b=(t,...i)=>{v.debug&&console.debug(`[FF-SDK] ${t}`,...i)},M=t=>{if(C){let i=Date.now();i-t.lastAccessed>Fe&&(t.count++,t.lastAccessed=i)}},ue=()=>h(void 0,null,function*(){if(v.cache){b("initializing cache");try{let t=!0,i=yield se(e.identifier+n,typeof v.cache=="boolean"?{}:v.cache),c=yield i.loadFromCache();c!=null&&c.length&&K(()=>{b("loading from cache",c),ee(c,!1),d.emit("cache loaded",c)}),B("flags loaded",f=>h(void 0,null,function*(){yield i.saveToCache(f),t=!1})),B("changed",f=>h(void 0,null,function*(){t||(f.deleted?yield i.removeCachedEvaluation(f.flag):yield i.updateCachedEvaluation(f))}))}catch(t){I("Cache error: ",t),d.emit("cache error",t),d.emit("error",t)}}}),de=(t,i)=>h(void 0,null,function*(){return(yield(yield xe(`${i.baseUrl}/client/auth`,{method:"POST",headers:{"Content-Type":"application/json","Harness-SDK-Info":le},body:JSON.stringify({apiKey:t,target:$(O({},e),{identifier:String(e.identifier)})})})).json()).authToken}),H=0,G=()=>{if(T.length){b("Sending metrics...",{metrics:T,evaluations:S});let t={metricsData:T.map(i=>({timestamp:Date.now(),count:i.count,metricsType:"FFMETRICS",attributes:[{key:"featureIdentifier",value:i.featureIdentifier},{key:"featureName",value:i.featureIdentifier},{key:"variationIdentifier",value:i.variationIdentifier},{key:"target",value:e.identifier},{key:"SDK_NAME",value:"JavaScript"},{key:"SDK_LANGUAGE",value:"JavaScript"},{key:"SDK_TYPE",value:"client"},{key:"SDK_VERSION",value:ce}]}))};x(`${v.eventUrl}/metrics/${s}?cluster=${l}`,{method:"POST",headers:O({"Content-Type":"application/json"},A),body:JSON.stringify(t)}).then(()=>{T=[],H=0}).catch(i=>{H++&&(T=[],H=0),b(i),d.emit("metrics error",i)}).finally(()=>{u=window.setTimeout(G,v.eventsSyncInterval)})}else u=window.setTimeout(G,v.eventsSyncInterval)},S={},fe=t=>{b("Sending event for",t.flag),W?d.emit("changed",new Proxy(t,{get(i,c){var f;if(C&&i.hasOwnProperty(c)&&c==="value"){let p=i.flag,o=t.value,E=T.find(P=>P.featureIdentifier===p&&P.featureValue===o);E?(M(E),E.variationIdentifier=((f=S[p])==null?void 0:f.identifier)||""):T.push({featureIdentifier:p,featureValue:String(o),variationIdentifier:S[p].identifier||"",count:1,lastAccessed:Date.now()}),b("Metrics event: Flag",c,"has been read with value via stream update",o)}return c==="value"?J(t):t[c]}})):d.emit("changed",{deleted:t.deleted,flag:t.flag,value:J(t)})},X=function(){return W?new Proxy({},{get(t,i){var f,p,o;let c=t[i];if(C&&t.hasOwnProperty(i)){let E=t[i],P=T.find(te=>te.featureIdentifier===i&&E===te.featureValue);P?(P.variationIdentifier=((f=S[i])==null?void 0:f.identifier)||"",M(P)):T.push({featureIdentifier:i,featureValue:E,variationIdentifier:((p=S[i])==null?void 0:p.identifier)||"",count:1,lastAccessed:Date.now()}),b("Metrics event: Flag:",i,"has been read with value:",E,"variationIdentifier:",(o=S[i])==null?void 0:o.identifier)}return c}}):{}},w=X();ue().then(()=>de(n,v).then(t=>h(void 0,null,function*(){if(r)return;y=t;let i=De(t);if(A={Authorization:`Bearer ${y}`,"Harness-AccountID":i.accountID,"Harness-EnvironmentID":i.environmentIdentifier,"Harness-SDK-Info":le},globalThis.btoa){let p=globalThis.btoa(JSON.stringify(e));p.length<262144&&(A["Harness-Target"]=p)}b("Authenticated",i),u=window.setTimeout(G,v.eventsSyncInterval),s=i.environment,l=i.clusterIdentifier;let c=!!Object.keys(S).length;if((yield N()).type==="success"&&b("Fetch all flags ok",w),!r){if(v.streamEnabled?(b("Streaming mode enabled"),ge()):v.pollingEnabled?(b("Polling mode enabled"),he()):b("Streaming and polling mode disabled"),!c){L();let p=O({},w);m(),d.emit("ready",p)}z=!0}})).catch(t=>{I("Authentication error: ",t),d.emit("auth error",t),d.emit("error",t)}));let N=()=>h(void 0,null,function*(){try{let t=yield x(`${v.baseUrl}/client/env/${s}/target/${e.identifier}/evaluations?cluster=${l}`,{headers:A});if(t.ok){let i=yield t.json();return i.forEach(D),d.emit("flags loaded",i),{type:"success",data:i}}else return I("Features fetch operation error: ",t),d.emit("fetch flags error",t),d.emit("error",t),{type:"error",error:t}}catch(t){return I("Features fetch operation error: ",t),d.emit("fetch flags error",t),d.emit("error",t),{type:"error",error:t}}}),Q=t=>h(void 0,null,function*(){try{let i=yield x(`${v.baseUrl}/client/env/${s}/target/${e.identifier}/evaluations/${t}?cluster=${l}`,{headers:A});if(i.ok){let c=yield i.json();D(c)}else I("Feature fetch operation error: ",i),d.emit("fetch flag error",i),d.emit("error",i)}catch(i){I("Feature fetch operation error: ",i),d.emit("fetch flag error",i),d.emit("error",i)}}),D=t=>{L();let i=J(t);i!==w[t.flag]&&(b("Flag variation has changed for ",t.identifier),w[t.flag]=i,S[t.flag]=$(O({},t),{value:i}),fe(t)),m()};R=new F(N,v,d);let ge=()=>{let t=o=>{switch(o.event){case"create":c(o.evaluations)?o.evaluations.forEach(E=>{D(E)}):setTimeout(()=>Q(o.identifier),1e3);break;case"patch":c(o.evaluations)?o.evaluations.forEach(E=>{D(E)}):Q(o.identifier);break;case"delete":delete w[o.identifier],d.emit("changed",{flag:o.identifier,value:void 0,deleted:!0}),b("Evaluation deleted",{message:o,storage:w});break}},i=o=>!(!o||!o.flag||!o.identifier||!o.kind||!o.value),c=o=>!(!o||o.length==0||!o.every(E=>i(E))),f=o=>{o.event==="patch"&&(c(o.evaluations)?o.evaluations.forEach(E=>{D(E)}):N())},p=`${v.baseUrl}/stream?cluster=${l}`;g=new _(d,v,p,n,A,R,o=>{o.domain==="flag"?t(o):o.domain==="target-segment"&&f(o)}),g.start()},he=()=>{R.start()},B=(t,i)=>d.on(t,i),me=(t,i)=>{t?d.off(t,i):Z()},ve=(t,i)=>{var o;if(!C||W||i===void 0)return;let c=i,f=t,p=T.find(E=>E.featureIdentifier===f&&E.featureValue===c);p?(M(p),p.variationIdentifier=((o=S[f])==null?void 0:o.identifier)||""):T.push({featureIdentifier:f,featureValue:c,count:1,variationIdentifier:S[f].identifier||"",lastAccessed:Date.now()})},Z=()=>{r=!0,v.streamEnabled&&(b("Closing event stream"),typeof(g==null?void 0:g.close)=="function"&&g.close(),d.all.clear()),v.pollingEnabled&&R.isPolling()&&(b("Closing Poller"),R.stop()),w=X(),S={},clearTimeout(u)},ee=(t,i=!0)=>{t.length&&K(()=>{let c=!!Object.keys(S).length;if(t.forEach(D),!c){L();let f=O({},w);m(),d.emit("ready",f)}},i)};return{on:B,off:me,close:Z,setEvaluations:ee,registerAPIRequestMiddleware:t=>{x=j(t)},refreshEvaluations:()=>{z&&!r&&Date.now()-Y>=6e4&&(N(),Y=Date.now())},variation:(t,i,c=!1)=>oe(t,i,w,ve,c)}};export{k as Event,dt as initialize};
var pe=Object.defineProperty,Ee=Object.defineProperties;var Re=Object.getOwnPropertyDescriptors;var ie=Object.getOwnPropertySymbols;var be=Object.prototype.hasOwnProperty,ye=Object.prototype.propertyIsEnumerable;var ne=(n,e,a)=>e in n?pe(n,e,{enumerable:!0,configurable:!0,writable:!0,value:a}):n[e]=a,O=(n,e)=>{for(var a in e||(e={}))be.call(e,a)&&ne(n,a,e[a]);if(ie)for(var a of ie(e))ye.call(e,a)&&ne(n,a,e[a]);return n},K=(n,e)=>Ee(n,Re(e));var f=(n,e,a)=>new Promise((r,s)=>{var l=b=>{try{y(a.next(b))}catch(g){s(g)}},h=b=>{try{y(a.throw(b))}catch(g){s(g)}},y=b=>b.done?r(b.value):Promise.resolve(b.value).then(l,h);y((a=a.apply(n,e)).next())});import Ae from"jwt-decode";import Pe from"mitt";var N=(v=>(v.READY="ready",v.CONNECTED="connected",v.DISCONNECTED="disconnected",v.STOPPED="stopped",v.POLLING="polling",v.POLLING_STOPPED="polling stopped",v.FLAGS_LOADED="flags loaded",v.CACHE_LOADED="cache loaded",v.CHANGED="changed",v.ERROR="error",v.ERROR_CACHE="cache error",v.ERROR_METRICS="metrics error",v.ERROR_AUTH="auth error",v.ERROR_FETCH_FLAGS="fetch flags error",v.ERROR_FETCH_FLAG="fetch flag error",v.ERROR_STREAM="stream error",v))(N||{});var Ie={debug:!1,baseUrl:"https://config.ff.harness.io/api/1.0",eventUrl:"https://events.ff.harness.io/api/1.0",eventsSyncInterval:6e4,pollingInterval:6e4,streamEnabled:!0,cache:!1},ae=n=>{let e=O(O({},Ie),n);return e.pollingEnabled===void 0&&(e.pollingEnabled=e.streamEnabled),e.eventsSyncInterval<6e4&&(e.eventsSyncInterval=6e4),e.pollingInterval<6e4&&(e.pollingInterval=6e4),(!e.logger||!e.logger.debug||!e.logger.error||!e.logger.info||!e.logger.warn)&&(e.logger=console),e},j=(n,e=!0)=>{e?setTimeout(n,0):n()},k=(n,e)=>Math.round(Math.random()*(e-n)+n);function U(n){return function(...a){let[r,s]=n(a);return fetch(r,s)}}var re=3e4,V=class{constructor(e,a,r,s,l,h,y,b,g){this.eventBus=e;this.configurations=a;this.url=r;this.apiKey=s;this.standardHeaders=l;this.fallbackPoller=h;this.logDebug=y;this.logError=b;this.eventCallback=g;this.closed=!1;this.connectionOpened=!1;this.disconnectEventEmitted=!1}start(){let e=g=>{g.toString().split(/\r?\n/).forEach(a)},a=g=>{if(g.startsWith("data:")){let S=JSON.parse(g.substring(5));this.logDebugMessage("Received event from stream: ",S),this.eventCallback(S)}},r=()=>{this.logDebugMessage("Stream connected"),this.eventBus.emit("connected")},s=()=>{clearInterval(this.readTimeoutCheckerId);let g=k(1e3,1e4);this.logDebugMessage("Stream disconnected, will reconnect in "+g+"ms"),this.disconnectEventEmitted||(this.eventBus.emit("disconnected"),this.disconnectEventEmitted=!0),setTimeout(()=>this.start(),g)},l=g=>{g&&this.logErrorMessage("Stream has issue",g),this.fallBackToPolling(),this.eventBus.emit("stream error",g),this.eventBus.emit("error",g),s()},h=O({"Cache-Control":"no-cache",Accept:"text/event-stream","API-Key":this.apiKey},this.standardHeaders);this.logDebugMessage("SSE HTTP start request",this.url),this.xhr=new XMLHttpRequest,this.xhr.open("GET",this.url);for(let[g,S]of Object.entries(h))this.xhr.setRequestHeader(g,S);this.xhr.timeout=24*60*60*1e3,this.xhr.onerror=()=>{this.connectionOpened=!1,l("XMLHttpRequest error on SSE stream")},this.xhr.onabort=()=>{this.connectionOpened=!1,this.logDebugMessage("SSE aborted"),this.closed||l(null)},this.xhr.ontimeout=()=>{this.connectionOpened=!1,l("SSE timeout")},this.xhr.onload=()=>{if(this.xhr.status>=400&&this.xhr.status<=599){l(`HTTP code ${this.xhr.status}`);return}this.connectionOpened||(r(),this.connectionOpened=!0,this.disconnectEventEmitted=!1)};let y=0,b=Date.now();this.xhr.onprogress=()=>{this.connectionOpened||(r(),this.connectionOpened=!0,this.disconnectEventEmitted=!1),this.stopFallBackPolling(),b=Date.now();let g=this.xhr.responseText.slice(y);y+=g.length,this.logDebugMessage("SSE GOT: "+g),e(g)},this.readTimeoutCheckerId=setInterval(()=>{b<Date.now()-re&&(this.logErrorMessage("SSE read timeout"),this.xhr.abort())},re),this.xhr.send()}close(){this.connectionOpened=!1,this.closed=!0,this.xhr&&this.xhr.abort(),clearInterval(this.readTimeoutCheckerId),this.eventBus.emit("stopped"),this.stopFallBackPolling()}fallBackToPolling(){!this.fallbackPoller.isPolling()&&this.configurations.pollingEnabled&&(this.logDebugMessage("Falling back to polling mode while stream recovers"),this.fallbackPoller.start())}stopFallBackPolling(){this.fallbackPoller.isPolling()&&(this.logDebugMessage("Stopping fallback polling mode"),this.fallbackPoller.stop())}logDebugMessage(e,...a){this.configurations.debug&&this.logDebug(`Streaming: ${e}`,...a)}logErrorMessage(e,...a){this.logError(`Streaming: ${e}`,...a)}};function oe(n,e,a,r,s){let l=n in a,h=l?a[n]:e;return l&&r(n,h),s?{value:h,isDefaultValue:!l}:h}var F=class{constructor(e,a,r,s,l){this.fetchFlagsFn=e;this.configurations=a;this.eventBus=r;this.logDebug=s;this.logError=l;this.maxAttempts=5}start(){if(this.isPolling()){this.logDebugMessage("Already polling.");return}this.isRunning=!0,this.eventBus.emit("polling"),this.logDebugMessage(`Starting poller, first poll will be in ${this.configurations.pollingInterval}ms`),this.timeoutId=setTimeout(()=>this.poll(),this.configurations.pollingInterval)}poll(){this.attemptFetch().finally(()=>{this.timeoutId=setTimeout(()=>this.poll(),this.configurations.pollingInterval)})}attemptFetch(){return f(this,null,function*(){for(let e=1;e<=this.maxAttempts;e++){let a=yield this.fetchFlagsFn();if(a.type==="success"){this.logDebugMessage(`Successfully polled for flag updates, next poll in ${this.configurations.pollingInterval}ms. `);return}if(this.logErrorMessage("Error when polling for flag updates",a.error),e>=this.maxAttempts){this.logDebugMessage(`Maximum attempts reached for polling for flags. Next poll in ${this.configurations.pollingInterval}ms.`);return}this.logDebugMessage(`Polling for flags attempt #${e} failed. Remaining attempts: ${this.maxAttempts-e}`,a.error);let r=k(1e3,1e4);yield new Promise(s=>setTimeout(s,r))}})}stop(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=void 0,this.isRunning=!1,this.eventBus.emit("polling stopped"),this.logDebugMessage("Polling stopped"))}isPolling(){return this.isRunning}logDebugMessage(e,...a){this.configurations.debug&&this.logDebug(`Poller: ${e}`,...a)}logErrorMessage(e,...a){this.logError(`Poller: ${e}`,...a)}};function se(a){return f(this,arguments,function*(n,e={}){let r=yield Te(n),s=we(e);return{loadFromCache:()=>q(r,s,e),saveToCache:l=>W(r,s,l),updateCachedEvaluation:l=>Ce(r,s,l),removeCachedEvaluation:l=>Oe(r,s,l)}})}function q(r,s){return f(this,arguments,function*(n,e,a={}){let l=parseInt(yield e.getItem(n+".ts"));if(a!=null&&a.ttl&&!isNaN(l)&&l+a.ttl<Date.now())return yield Se(n,e),[];let h=yield e.getItem(n);if(h)try{return JSON.parse(h)}catch(y){}return[]})}function Se(n,e){return f(this,null,function*(){yield e.removeItem(n),yield e.removeItem(n+".ts")})}function W(n,e,a){return f(this,null,function*(){yield e.setItem(n,JSON.stringify(a)),yield e.setItem(n+".ts",Date.now().toString())})}function Ce(n,e,a){return f(this,null,function*(){let r=yield q(n,e),s=r.find(({flag:l})=>l===a.flag);s?Object.assign(s,a):r.push(a),yield W(n,e,r)})}function Oe(n,e,a){return f(this,null,function*(){let r=yield q(n,e),s=r.findIndex(({flag:l})=>l===a);s>-1&&(r.splice(s,1),yield W(n,e,r))})}function Te(n){return f(this,null,function*(){var a,r;let e=n;if(globalThis!=null&&globalThis.TextEncoder&&((r=(a=globalThis==null?void 0:globalThis.crypto)==null?void 0:a.subtle)!=null&&r.digest)){let l=new TextEncoder().encode(n),h=yield crypto.subtle.digest("SHA-256",l);e=Array.from(new Uint8Array(h)).map(b=>b.toString(16).padStart(2,"0")).join("")}else globalThis.btoa&&(e=btoa(n));return"HARNESS_FF_CACHE_"+e})}function we(n){let e;return!n.storage||typeof n.storage!="object"||!("getItem"in n.storage)||!("setItem"in n.storage)||!("removeItem"in n.storage)?globalThis.localStorage?e=globalThis.localStorage:globalThis.sessionStorage?e=globalThis.sessionStorage:e=De:e=n.storage,{getItem(r){return f(this,null,function*(){let s=e.getItem(r);return s instanceof Promise?yield s:s})},setItem(r,s){return f(this,null,function*(){let l=e.setItem(r,s);l instanceof Promise&&(yield l)})},removeItem(r){return f(this,null,function*(){let s=e.removeItem(r);s instanceof Promise&&(yield s)})}}}var De={getItem:()=>null,setItem:()=>{},removeItem:()=>{}};var ce="1.25.0",le=`Javascript ${ce} Client`,Fe=500,Me=globalThis.fetch,J=!!globalThis.Proxy,dt=(n,e,a)=>{let r=!1,s,l,h,y,b,g,S=!0,D={},M=U(t=>t),Y=0,z=!1,_=()=>{S=!1},v=()=>{S=!0},C=[],d=Pe(),m=ae(a),p=(t,...i)=>{m.debug&&m.logger.debug(`[FF-SDK] ${t}`,...i)},T=(t,...i)=>{m.logger.error(`[FF-SDK] ${t}`,...i)},L=t=>{let{value:i}=t;try{switch(t.kind.toLowerCase()){case"int":case"number":i=Number(i);break;case"boolean":i=i.toString().toLowerCase()==="true";break;case"json":i=JSON.parse(i);break}}catch(c){T(c)}return i},H=t=>{if(S){let i=Date.now();i-t.lastAccessed>Fe&&(t.count++,t.lastAccessed=i)}},ge=()=>f(void 0,null,function*(){if(m.cache){p("initializing cache");try{let t=!0,i=yield se(e.identifier+n,typeof m.cache=="boolean"?{}:m.cache),c=yield i.loadFromCache();c!=null&&c.length&&j(()=>{p("loading from cache",c),ee(c,!1),d.emit("cache loaded",c)}),B("flags loaded",u=>f(void 0,null,function*(){yield i.saveToCache(u),t=!1})),B("changed",u=>f(void 0,null,function*(){t||(u.deleted?yield i.removeCachedEvaluation(u.flag):yield i.updateCachedEvaluation(u))}))}catch(t){T("Cache error: ",t),d.emit("cache error",t),d.emit("error",t)}}}),de=(t,i)=>f(void 0,null,function*(){return(yield(yield Me(`${i.baseUrl}/client/auth`,{method:"POST",headers:{"Content-Type":"application/json","Harness-SDK-Info":le},body:JSON.stringify({apiKey:t,target:K(O({},e),{identifier:String(e.identifier)})})})).json()).authToken}),G=0,$=()=>{if(C.length){p("Sending metrics...",{metrics:C,evaluations:I});let t={metricsData:C.map(i=>({timestamp:Date.now(),count:i.count,metricsType:"FFMETRICS",attributes:[{key:"featureIdentifier",value:i.featureIdentifier},{key:"featureName",value:i.featureIdentifier},{key:"variationIdentifier",value:i.variationIdentifier},{key:"target",value:e.identifier},{key:"SDK_NAME",value:"JavaScript"},{key:"SDK_LANGUAGE",value:"JavaScript"},{key:"SDK_TYPE",value:"client"},{key:"SDK_VERSION",value:ce}]}))};M(`${m.eventUrl}/metrics/${s}?cluster=${l}`,{method:"POST",headers:O({"Content-Type":"application/json"},D),body:JSON.stringify(t)}).then(()=>{C=[],G=0}).catch(i=>{G++&&(C=[],G=0),p(i),d.emit("metrics error",i)}).finally(()=>{g=window.setTimeout($,m.eventsSyncInterval)})}else g=window.setTimeout($,m.eventsSyncInterval)},I={},ue=t=>{p("Sending event for",t.flag),J?d.emit("changed",new Proxy(t,{get(i,c){var u;if(S&&i.hasOwnProperty(c)&&c==="value"){let E=i.flag,o=t.value,R=C.find(P=>P.featureIdentifier===E&&P.featureValue===o);R?(H(R),R.variationIdentifier=((u=I[E])==null?void 0:u.identifier)||""):C.push({featureIdentifier:E,featureValue:String(o),variationIdentifier:I[E].identifier||"",count:1,lastAccessed:Date.now()}),p("Metrics event: Flag",c,"has been read with value via stream update",o)}return c==="value"?L(t):t[c]}})):d.emit("changed",{deleted:t.deleted,flag:t.flag,value:L(t)})},X=function(){return J?new Proxy({},{get(t,i){var u,E,o;let c=t[i];if(S&&t.hasOwnProperty(i)){let R=t[i],P=C.find(te=>te.featureIdentifier===i&&R===te.featureValue);P?(P.variationIdentifier=((u=I[i])==null?void 0:u.identifier)||"",H(P)):C.push({featureIdentifier:i,featureValue:R,variationIdentifier:((E=I[i])==null?void 0:E.identifier)||"",count:1,lastAccessed:Date.now()}),p("Metrics event: Flag:",i,"has been read with value:",R,"variationIdentifier:",(o=I[i])==null?void 0:o.identifier)}return c}}):{}},w=X();ge().then(()=>de(n,m).then(t=>f(void 0,null,function*(){if(r)return;b=t;let i=Ae(t);if(D={Authorization:`Bearer ${b}`,"Harness-AccountID":i.accountID,"Harness-EnvironmentID":i.environmentIdentifier,"Harness-SDK-Info":le},globalThis.btoa){let E=globalThis.btoa(JSON.stringify(e));E.length<262144&&(D["Harness-Target"]=E)}p("Authenticated",i),g=window.setTimeout($,m.eventsSyncInterval),s=i.environment,l=i.clusterIdentifier;let c=!!Object.keys(I).length;if((yield x()).type==="success"&&p("Fetch all flags ok",w),!r){if(m.streamEnabled?(p("Streaming mode enabled"),fe()):m.pollingEnabled?(p("Polling mode enabled"),he()):p("Streaming and polling mode disabled"),!c){_();let E=O({},w);v(),d.emit("ready",E)}z=!0}})).catch(t=>{T("Authentication error: ",t),d.emit("auth error",t),d.emit("error",t)}));let x=()=>f(void 0,null,function*(){try{let t=yield M(`${m.baseUrl}/client/env/${s}/target/${e.identifier}/evaluations?cluster=${l}`,{headers:D});if(t.ok){let i=yield t.json();return i.forEach(A),d.emit("flags loaded",i),{type:"success",data:i}}else return T("Features fetch operation error: ",t),d.emit("fetch flags error",t),d.emit("error",t),{type:"error",error:t}}catch(t){return T("Features fetch operation error: ",t),d.emit("fetch flags error",t),d.emit("error",t),{type:"error",error:t}}}),Q=t=>f(void 0,null,function*(){try{let i=yield M(`${m.baseUrl}/client/env/${s}/target/${e.identifier}/evaluations/${t}?cluster=${l}`,{headers:D});if(i.ok){let c=yield i.json();A(c)}else T("Feature fetch operation error: ",i),d.emit("fetch flag error",i),d.emit("error",i)}catch(i){T("Feature fetch operation error: ",i),d.emit("fetch flag error",i),d.emit("error",i)}}),A=t=>{_();let i=L(t);i!==w[t.flag]&&(p("Flag variation has changed for ",t.identifier),w[t.flag]=i,I[t.flag]=K(O({},t),{value:i}),ue(t)),v()};y=new F(x,m,d,p,T);let fe=()=>{let t=o=>{switch(o.event){case"create":c(o.evaluations)?o.evaluations.forEach(R=>{A(R)}):setTimeout(()=>Q(o.identifier),1e3);break;case"patch":c(o.evaluations)?o.evaluations.forEach(R=>{A(R)}):Q(o.identifier);break;case"delete":delete w[o.identifier],d.emit("changed",{flag:o.identifier,value:void 0,deleted:!0}),p("Evaluation deleted",{message:o,storage:w});break}},i=o=>!(!o||!o.flag||!o.identifier||!o.kind||!o.value),c=o=>!(!o||o.length==0||!o.every(R=>i(R))),u=o=>{o.event==="patch"&&(c(o.evaluations)?o.evaluations.forEach(R=>{A(R)}):x())},E=`${m.baseUrl}/stream?cluster=${l}`;h=new V(d,m,E,n,D,y,p,T,o=>{o.domain==="flag"?t(o):o.domain==="target-segment"&&u(o)}),h.start()},he=()=>{y.start()},B=(t,i)=>d.on(t,i),ve=(t,i)=>{t?d.off(t,i):Z()},me=(t,i)=>{var o;if(!S||J||i===void 0)return;let c=i,u=t,E=C.find(R=>R.featureIdentifier===u&&R.featureValue===c);E?(H(E),E.variationIdentifier=((o=I[u])==null?void 0:o.identifier)||""):C.push({featureIdentifier:u,featureValue:c,count:1,variationIdentifier:I[u].identifier||"",lastAccessed:Date.now()})},Z=()=>{r=!0,m.streamEnabled&&(p("Closing event stream"),typeof(h==null?void 0:h.close)=="function"&&h.close(),d.all.clear()),m.pollingEnabled&&y.isPolling()&&(p("Closing Poller"),y.stop()),w=X(),I={},clearTimeout(g)},ee=(t,i=!0)=>{t.length&&j(()=>{let c=!!Object.keys(I).length;if(t.forEach(A),!c){_();let u=O({},w);v(),d.emit("ready",u)}},i)};return{on:B,off:ve,close:Z,setEvaluations:ee,registerAPIRequestMiddleware:t=>{M=U(t)},refreshEvaluations:()=>{z&&!r&&Date.now()-Y>=6e4&&(x(),Y=Date.now())},variation:(t,i,c=!1)=>oe(t,i,w,me,c)}};export{N as Event,dt as initialize};

@@ -0,15 +1,20 @@

import { type Options, StreamEvent } from './types';
import type Poller from './poller';
import type { Emitter } from 'mitt';
export declare class Streamer {
private readonly eventBus;
private readonly configurations;
private readonly url;
private readonly standardHeaders;
private readonly apiKey;
private readonly eventCallback;
private eventBus;
private configurations;
private url;
private apiKey;
private standardHeaders;
private fallbackPoller;
private logDebug;
private logError;
private eventCallback;
private xhr;
private closed;
private readTimeoutCheckerId;
private fallbackPoller;
private connectionOpened;
private disconnectEventEmitted;
constructor(eventBus: any, configurations: any, url: any, apiKey: any, standardHeaders: any, fallbackPoller: any, eventCallback: any);
constructor(eventBus: Emitter, configurations: Options, url: string, apiKey: string, standardHeaders: Record<string, string>, fallbackPoller: Poller, logDebug: (...data: any[]) => void, logError: (...data: any[]) => void, eventCallback: (e: StreamEvent) => void);
start(): void;

@@ -19,3 +24,4 @@ close(): void;

private stopFallBackPolling;
private logDebug;
private logDebugMessage;
private logErrorMessage;
}

@@ -131,2 +131,7 @@ export interface Target {

cache?: boolean | CacheOptions;
/**
* Logger to use instead of the default console.log, console.error and console.info functions
* @default console
*/
logger?: Logger;
}

@@ -162,2 +167,8 @@ export interface MetricsInfo {

}
export interface Logger {
debug: (...data: any[]) => void;
error: (...data: any[]) => void;
warn: (...data: any[]) => void;
info: (...data: any[]) => void;
}
export {};

@@ -6,4 +6,3 @@ import type { Options } from './types';

export declare const getConfiguration: (options: Options) => Options;
export declare const logError: (message: string, ...args: any[]) => void;
export declare const defer: (fn: Function, doDefer?: boolean) => void;
export declare const getRandom: (min: number, max: number) => number;
{
"name": "@harnessio/ff-javascript-client-sdk",
"version": "1.25.0",
"version": "1.26.0-rc.0",
"author": "Harness",

@@ -5,0 +5,0 @@ "license": "Apache-2.0",

@@ -60,2 +60,3 @@ # Before you Begin

cache?: boolean | CacheOptions
logger?: Logger
}

@@ -307,2 +308,34 @@ ```

## Logging
By default, the Javascript Client SDK will log errors and debug messages using the `console` object. In some cases, it
can be useful to instead log to a service or silently fail without logging errors.
```typescript
const myLogger = {
debug: (...data) => {
// do something with the logged debug message
},
info: (...data) => {
// do something with the logged info message
},
error: (...data) => {
// do something with the logged error message
},
warn: (...data) => {
// do something with the logged warning message
}
}
const client = initialize(
'00000000-1111-2222-3333-444444444444',
{
identifier: YOUR_TARGET_IDENTIFIER,
name: YOUR_TARGET_NAME
},
{
logger: myLogger // override logger
}
)
```
## Import directly from unpkg

@@ -309,0 +342,0 @@

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc