@cloudflare/flagship 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server.cjs +1 -1
- package/dist/server.mjs +1 -1
- package/dist/web.cjs +1 -1
- package/dist/web.mjs +1 -1
- package/package.json +1 -1
package/dist/server.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./src-QEIBSid3.cjs`);let t=require(`@openfeature/server-sdk`);const n=()=>{},r=[`appId`,`endpoint`,`accountId`,`authToken`,`baseUrl`,`fetchOptions`,`timeout`,`retries`,`retryDelay`];var i=class{constructor(n){if(this.runsOn=`server`,this.events=new t.OpenFeatureEventEmitter,this.currentStatus=t.ProviderStatus.NOT_READY,this.metadata={name:`Flagship Server Provider`},this.logging=n.logging??!1,e.o(n)){let e=r.filter(e=>e in n);if(e.length>0)throw Error(`Flagship: when using a binding, the following HTTP-specific options must not be provided: ${e.join(`, `)}. Provide either a binding or HTTP configuration, not both.`);this.binding=n.binding,this.client=void 0,this.resolve=this.resolveViaBinding.bind(this)}else this.client=new e.t(n),this.binding=void 0,this.resolve=this.resolveViaHttp.bind(this)}logger(e){return this.logging?e:{debug:n,info:n,warn:n,error:n}}async initialize(n){if(this.binding){this.currentStatus=t.ProviderStatus.READY,this.events.emit(t.ProviderEvents.Ready);return}try{await this.client.evaluate(`_flagship_health_check`,{}),this.currentStatus=t.ProviderStatus.READY,this.events.emit(t.ProviderEvents.Ready)}catch(n){if(n instanceof e.i&&n.cause instanceof Response&&n.cause.status===404){this.currentStatus=t.ProviderStatus.READY,this.events.emit(t.ProviderEvents.Ready);return}this.currentStatus=t.ProviderStatus.ERROR,this.events.emit(t.ProviderEvents.Error,{message:n instanceof Error?n.message:String(n)})}}async onClose(){this.currentStatus=t.ProviderStatus.NOT_READY}get status(){return this.currentStatus}async resolveBooleanEvaluation(e,t,n,r){return this.resolve(e,t,n,`boolean`,r)}async resolveStringEvaluation(e,t,n,r){return this.resolve(e,t,n,`string`,r)}async resolveNumberEvaluation(e,t,n,r){return this.resolve(e,t,n,`number`,r)}async resolveObjectEvaluation(e,t,n,r){return this.resolve(e,t,n,`object`,r)}async resolveViaHttp(e,n,r,i,o){let s=this.logger(o);try{s.debug(`[Flagship] Evaluating flag "${e}" (expected: ${i})`);let o=await this.client.evaluate(e,r),c=a(o.value);if(c!==i){let r=`Flag "${e}" type mismatch: expected ${i}, got ${c}`;return s.warn(`[Flagship] ${r}`),{value:n,errorCode:t.ErrorCode.TYPE_MISMATCH,errorMessage:r,reason:`ERROR`}}return s.debug(`[Flagship] Flag "${e}" resolved: value=${String(o.value)} reason=${o.reason} variant=${o.variant}`),{value:o.value,variant:o.variant,reason:o.reason,flagMetadata:{}}}catch(t){return this.handleHttpError(e,n,t,s)}}handleHttpError(n,r,i,a){if(i instanceof e.i){let o;switch(i.code){case e.a.NETWORK_ERROR:o=i.cause instanceof Response&&i.cause.status===404?t.ErrorCode.FLAG_NOT_FOUND:t.ErrorCode.GENERAL;break;case e.a.TIMEOUT_ERROR:o=t.ErrorCode.GENERAL;break;case e.a.PARSE_ERROR:o=t.ErrorCode.PARSE_ERROR;break;case e.a.INVALID_CONTEXT:o=t.ErrorCode.INVALID_CONTEXT;break;default:o=t.ErrorCode.GENERAL}return a.error(`[Flagship] Flag "${n}" evaluation failed (${o}): ${i.message}`),{value:r,errorCode:o,errorMessage:i.message,reason:`ERROR`}}let o=String(i);return a.error(`[Flagship] Flag "${n}" evaluation failed (GENERAL): ${o}`),{value:r,errorCode:t.ErrorCode.GENERAL,errorMessage:o,reason:`ERROR`}}async resolveViaBinding(e,n,r,i,c){let l=this.logger(c);try{l.debug(`[Flagship] Evaluating flag "${e}" via binding (expected: ${i})`);let c=o(r,l),u=await this.evaluateBinding(e,n,i,c);if(u.errorCode){let t=s(u.errorCode),r=u.errorMessage??`Binding error: ${u.errorCode}`;return l.error(`[Flagship] Flag "${e}" evaluation failed (${t}): ${r}`),{value:n,errorCode:t,errorMessage:r,reason:u.reason??`ERROR`}}let d=a(u.value);if(d!==i){let r=`Flag "${e}" type mismatch: expected ${i}, got ${d}`;return l.warn(`[Flagship] ${r}`),{value:n,errorCode:t.ErrorCode.TYPE_MISMATCH,errorMessage:r,reason:`ERROR`}}return l.debug(`[Flagship] Flag "${e}" resolved via binding: value=${String(u.value)} reason=${u.reason} variant=${u.variant}`),{value:u.value,variant:u.variant,reason:u.reason,flagMetadata:{}}}catch(r){let i=r instanceof Error?r.message:String(r);return l.error(`[Flagship] Flag "${e}" binding evaluation failed (GENERAL): ${i}`),{value:n,errorCode:t.ErrorCode.GENERAL,errorMessage:i,reason:`ERROR`}}}async evaluateBinding(e,t,n,r){let i=this.binding;switch(n){case`boolean`:return i.getBooleanDetails(e,t,r);case`string`:return i.getStringDetails(e,t,r);case`number`:return i.getNumberDetails(e,t,r);case`object`:return i.getObjectDetails(e,t,r)}}};function a(e){return typeof e==`boolean`?`boolean`:typeof e==`string`?`string`:typeof e==`number`?`number`:`object`}function o(e,t){let n={};for(let[r,i]of Object.entries(e))if(i!=null){if(i instanceof Date){n[r]=i.toISOString();continue}if(typeof i==`string`||typeof i==`number`||typeof i==`boolean`){n[r]=i;continue}if(typeof i==`object`){t.warn(`[Flagship] Context key "${r}" is a complex object/array and cannot be passed to the binding. This value will be ignored.`);continue}}return n}function s(e){switch(e){case`FLAG_NOT_FOUND`:return t.ErrorCode.FLAG_NOT_FOUND;case`PARSE_ERROR`:return t.ErrorCode.PARSE_ERROR;case`TYPE_MISMATCH`:return t.ErrorCode.TYPE_MISMATCH;case`INVALID_CONTEXT`:return t.ErrorCode.INVALID_CONTEXT;default:return t.ErrorCode.GENERAL}}var c=class{constructor(e=console.log){this.logger=e}before(e,t){this.logger(`[Flagship] Evaluating flag: ${e.flagKey}`,{defaultValue:e.defaultValue,context:e.context})}after(e,t,n){this.logger(`[Flagship] Flag ${e.flagKey} evaluated`,{value:t.value,reason:t.reason,variant:t.variant,errorCode:t.errorCode})}error(e,t,n){let r=t instanceof Error?t.message:String(t);this.logger(`[Flagship] Error evaluating flag ${e.flagKey}:`,r)}finally(e,t,n){}},l=class{constructor(e){this.startTimes=new Map,this.contextKeys=new WeakMap,this.hints=new WeakMap,this.onEvent=e}before(e,t){let n=Date.now(),r=`${e.flagKey}-${n}-${Math.random()}`;this.startTimes.set(r,n),this.contextKeys.set(e,r),t!==void 0&&this.hints.set(e,t)}after(e,t,n){let r=this.contextKeys.get(e),i=r?this.startTimes.get(r):void 0,a=i===void 0?void 0:Date.now()-i;r!==void 0&&(this.startTimes.delete(r),this.contextKeys.delete(e)),this.onEvent({type:`evaluation`,flagKey:e.flagKey,timestamp:Date.now(),duration:a,value:t.value,reason:t.reason,variant:t.variant,errorCode:t.errorCode,context:e.context,hints:this.hints.get(e)})}error(e,t,n){let r=this.contextKeys.get(e),i=r?this.startTimes.get(r):void 0,a=i===void 0?void 0:Date.now()-i;r!==void 0&&(this.startTimes.delete(r),this.contextKeys.delete(e));let o=t instanceof Error?t.message:String(t);this.onEvent({type:`error`,flagKey:e.flagKey,timestamp:Date.now(),duration:a,errorMessage:o,context:e.context,hints:this.hints.get(e)})}finally(e,t,n){let r=this.contextKeys.get(e);r!==void 0&&(this.startTimes.delete(r),this.contextKeys.delete(e)),this.hints.delete(e)}};exports.ContextTransformer=e.n,exports.FLAGSHIP_DEFAULT_BASE_URL=e.r,exports.FlagshipClient=e.t,exports.FlagshipError=e.i,exports.FlagshipErrorCode=e.a,exports.FlagshipServerProvider=i,exports.LoggingHook=c,exports.TelemetryHook=l,exports.isBindingOptions=e.o;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./src-QEIBSid3.cjs`);let t=require(`@openfeature/server-sdk`);const n=()=>{},r=[`appId`,`endpoint`,`accountId`,`authToken`,`baseUrl`,`fetchOptions`,`timeout`,`retries`,`retryDelay`];var i=class{constructor(n){if(this.runsOn=`server`,this.events=new t.OpenFeatureEventEmitter,this.currentStatus=t.ProviderStatus.NOT_READY,this.metadata={name:`Flagship Server Provider`},this.logging=n.logging??!1,e.o(n)){let e=r.filter(e=>e in n);if(e.length>0)throw Error(`Flagship: when using a binding, the following HTTP-specific options must not be provided: ${e.join(`, `)}. Provide either a binding or HTTP configuration, not both.`);this.binding=n.binding,this.client=void 0,this.resolve=this.resolveViaBinding.bind(this)}else this.client=new e.t(n),this.binding=void 0,this.resolve=this.resolveViaHttp.bind(this)}logger(e){return this.logging?e:{debug:n,info:n,warn:n,error:n}}async initialize(n){if(this.binding){this.currentStatus=t.ProviderStatus.READY,this.events.emit(t.ProviderEvents.Ready);return}try{await this.client.evaluate(`_flagship_health_check`,{}),this.currentStatus=t.ProviderStatus.READY,this.events.emit(t.ProviderEvents.Ready)}catch(n){if(n instanceof e.i&&n.cause instanceof Response&&n.cause.status===404){this.currentStatus=t.ProviderStatus.READY,this.events.emit(t.ProviderEvents.Ready);return}this.currentStatus=t.ProviderStatus.ERROR,this.events.emit(t.ProviderEvents.Error,{message:n instanceof Error?n.message:String(n)})}}async onClose(){this.currentStatus=t.ProviderStatus.NOT_READY}get status(){return this.currentStatus}async resolveBooleanEvaluation(e,t,n,r){return this.resolve(e,t,n,`boolean`,r)}async resolveStringEvaluation(e,t,n,r){return this.resolve(e,t,n,`string`,r)}async resolveNumberEvaluation(e,t,n,r){return this.resolve(e,t,n,`number`,r)}async resolveObjectEvaluation(e,t,n,r){return this.resolve(e,t,n,`object`,r)}async resolveViaHttp(e,n,r,i,o){let s=this.logger(o);try{s.debug(`[Flagship] Evaluating flag "${e}" (expected: ${i})`);let o=await this.client.evaluate(e,r);if(o.reason===`DISABLED`)return{value:n,reason:`DISABLED`,flagMetadata:{}};let c=a(o.value);if(c!==i){let r=`Flag "${e}" type mismatch: expected ${i}, got ${c}`;return s.warn(`[Flagship] ${r}`),{value:n,errorCode:t.ErrorCode.TYPE_MISMATCH,errorMessage:r,reason:`ERROR`}}return s.debug(`[Flagship] Flag "${e}" resolved: value=${String(o.value)} reason=${o.reason} variant=${o.variant}`),{value:o.value,variant:o.variant,reason:o.reason,flagMetadata:{}}}catch(t){return this.handleHttpError(e,n,t,s)}}handleHttpError(n,r,i,a){if(i instanceof e.i){let o;switch(i.code){case e.a.NETWORK_ERROR:o=i.cause instanceof Response&&i.cause.status===404?t.ErrorCode.FLAG_NOT_FOUND:t.ErrorCode.GENERAL;break;case e.a.TIMEOUT_ERROR:o=t.ErrorCode.GENERAL;break;case e.a.PARSE_ERROR:o=t.ErrorCode.PARSE_ERROR;break;case e.a.INVALID_CONTEXT:o=t.ErrorCode.INVALID_CONTEXT;break;default:o=t.ErrorCode.GENERAL}return a.error(`[Flagship] Flag "${n}" evaluation failed (${o}): ${i.message}`),{value:r,errorCode:o,errorMessage:i.message,reason:`ERROR`}}let o=String(i);return a.error(`[Flagship] Flag "${n}" evaluation failed (GENERAL): ${o}`),{value:r,errorCode:t.ErrorCode.GENERAL,errorMessage:o,reason:`ERROR`}}async resolveViaBinding(e,n,r,i,c){let l=this.logger(c);try{l.debug(`[Flagship] Evaluating flag "${e}" via binding (expected: ${i})`);let c=o(r,l),u=await this.evaluateBinding(e,n,i,c);if(u.errorCode){let t=s(u.errorCode),r=u.errorMessage??`Binding error: ${u.errorCode}`;return l.error(`[Flagship] Flag "${e}" evaluation failed (${t}): ${r}`),{value:n,errorCode:t,errorMessage:r,reason:u.reason??`ERROR`}}if(u.reason===`DISABLED`)return{value:n,reason:`DISABLED`,flagMetadata:{}};let d=a(u.value);if(d!==i){let r=`Flag "${e}" type mismatch: expected ${i}, got ${d}`;return l.warn(`[Flagship] ${r}`),{value:n,errorCode:t.ErrorCode.TYPE_MISMATCH,errorMessage:r,reason:`ERROR`}}return l.debug(`[Flagship] Flag "${e}" resolved via binding: value=${String(u.value)} reason=${u.reason} variant=${u.variant}`),{value:u.value,variant:u.variant,reason:u.reason,flagMetadata:{}}}catch(r){let i=r instanceof Error?r.message:String(r);return l.error(`[Flagship] Flag "${e}" binding evaluation failed (GENERAL): ${i}`),{value:n,errorCode:t.ErrorCode.GENERAL,errorMessage:i,reason:`ERROR`}}}async evaluateBinding(e,t,n,r){let i=this.binding;switch(n){case`boolean`:return i.getBooleanDetails(e,t,r);case`string`:return i.getStringDetails(e,t,r);case`number`:return i.getNumberDetails(e,t,r);case`object`:return i.getObjectDetails(e,t,r)}}};function a(e){return typeof e==`boolean`?`boolean`:typeof e==`string`?`string`:typeof e==`number`?`number`:`object`}function o(e,t){let n={};for(let[r,i]of Object.entries(e))if(i!=null){if(i instanceof Date){n[r]=i.toISOString();continue}if(typeof i==`string`||typeof i==`number`||typeof i==`boolean`){n[r]=i;continue}if(typeof i==`object`){t.warn(`[Flagship] Context key "${r}" is a complex object/array and cannot be passed to the binding. This value will be ignored.`);continue}}return n}function s(e){switch(e){case`FLAG_NOT_FOUND`:return t.ErrorCode.FLAG_NOT_FOUND;case`PARSE_ERROR`:return t.ErrorCode.PARSE_ERROR;case`TYPE_MISMATCH`:return t.ErrorCode.TYPE_MISMATCH;case`INVALID_CONTEXT`:return t.ErrorCode.INVALID_CONTEXT;default:return t.ErrorCode.GENERAL}}var c=class{constructor(e=console.log){this.logger=e}before(e,t){this.logger(`[Flagship] Evaluating flag: ${e.flagKey}`,{defaultValue:e.defaultValue,context:e.context})}after(e,t,n){this.logger(`[Flagship] Flag ${e.flagKey} evaluated`,{value:t.value,reason:t.reason,variant:t.variant,errorCode:t.errorCode})}error(e,t,n){let r=t instanceof Error?t.message:String(t);this.logger(`[Flagship] Error evaluating flag ${e.flagKey}:`,r)}finally(e,t,n){}},l=class{constructor(e){this.startTimes=new Map,this.contextKeys=new WeakMap,this.hints=new WeakMap,this.onEvent=e}before(e,t){let n=Date.now(),r=`${e.flagKey}-${n}-${Math.random()}`;this.startTimes.set(r,n),this.contextKeys.set(e,r),t!==void 0&&this.hints.set(e,t)}after(e,t,n){let r=this.contextKeys.get(e),i=r?this.startTimes.get(r):void 0,a=i===void 0?void 0:Date.now()-i;r!==void 0&&(this.startTimes.delete(r),this.contextKeys.delete(e)),this.onEvent({type:`evaluation`,flagKey:e.flagKey,timestamp:Date.now(),duration:a,value:t.value,reason:t.reason,variant:t.variant,errorCode:t.errorCode,context:e.context,hints:this.hints.get(e)})}error(e,t,n){let r=this.contextKeys.get(e),i=r?this.startTimes.get(r):void 0,a=i===void 0?void 0:Date.now()-i;r!==void 0&&(this.startTimes.delete(r),this.contextKeys.delete(e));let o=t instanceof Error?t.message:String(t);this.onEvent({type:`error`,flagKey:e.flagKey,timestamp:Date.now(),duration:a,errorMessage:o,context:e.context,hints:this.hints.get(e)})}finally(e,t,n){let r=this.contextKeys.get(e);r!==void 0&&(this.startTimes.delete(r),this.contextKeys.delete(e)),this.hints.delete(e)}};exports.ContextTransformer=e.n,exports.FLAGSHIP_DEFAULT_BASE_URL=e.r,exports.FlagshipClient=e.t,exports.FlagshipError=e.i,exports.FlagshipErrorCode=e.a,exports.FlagshipServerProvider=i,exports.LoggingHook=c,exports.TelemetryHook=l,exports.isBindingOptions=e.o;
|
package/dist/server.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as e,i as t,n,o as r,r as i,t as a}from"./src-DW2QohY9.mjs";import{ErrorCode as o,OpenFeatureEventEmitter as s,ProviderEvents as c,ProviderStatus as l}from"@openfeature/server-sdk";const u=()=>{},d=[`appId`,`endpoint`,`accountId`,`authToken`,`baseUrl`,`fetchOptions`,`timeout`,`retries`,`retryDelay`];var f=class{constructor(e){if(this.runsOn=`server`,this.events=new s,this.currentStatus=l.NOT_READY,this.metadata={name:`Flagship Server Provider`},this.logging=e.logging??!1,r(e)){let t=d.filter(t=>t in e);if(t.length>0)throw Error(`Flagship: when using a binding, the following HTTP-specific options must not be provided: ${t.join(`, `)}. Provide either a binding or HTTP configuration, not both.`);this.binding=e.binding,this.client=void 0,this.resolve=this.resolveViaBinding.bind(this)}else this.client=new a(e),this.binding=void 0,this.resolve=this.resolveViaHttp.bind(this)}logger(e){return this.logging?e:{debug:u,info:u,warn:u,error:u}}async initialize(e){if(this.binding){this.currentStatus=l.READY,this.events.emit(c.Ready);return}try{await this.client.evaluate(`_flagship_health_check`,{}),this.currentStatus=l.READY,this.events.emit(c.Ready)}catch(e){if(e instanceof t&&e.cause instanceof Response&&e.cause.status===404){this.currentStatus=l.READY,this.events.emit(c.Ready);return}this.currentStatus=l.ERROR,this.events.emit(c.Error,{message:e instanceof Error?e.message:String(e)})}}async onClose(){this.currentStatus=l.NOT_READY}get status(){return this.currentStatus}async resolveBooleanEvaluation(e,t,n,r){return this.resolve(e,t,n,`boolean`,r)}async resolveStringEvaluation(e,t,n,r){return this.resolve(e,t,n,`string`,r)}async resolveNumberEvaluation(e,t,n,r){return this.resolve(e,t,n,`number`,r)}async resolveObjectEvaluation(e,t,n,r){return this.resolve(e,t,n,`object`,r)}async resolveViaHttp(e,t,n,r,i){let a=this.logger(i);try{a.debug(`[Flagship] Evaluating flag "${e}" (expected: ${r})`);let i=await this.client.evaluate(e,n),s=p(i.value);if(s!==r){let n=`Flag "${e}" type mismatch: expected ${r}, got ${s}`;return a.warn(`[Flagship] ${n}`),{value:t,errorCode:o.TYPE_MISMATCH,errorMessage:n,reason:`ERROR`}}return a.debug(`[Flagship] Flag "${e}" resolved: value=${String(i.value)} reason=${i.reason} variant=${i.variant}`),{value:i.value,variant:i.variant,reason:i.reason,flagMetadata:{}}}catch(n){return this.handleHttpError(e,t,n,a)}}handleHttpError(n,r,i,a){if(i instanceof t){let t;switch(i.code){case e.NETWORK_ERROR:t=i.cause instanceof Response&&i.cause.status===404?o.FLAG_NOT_FOUND:o.GENERAL;break;case e.TIMEOUT_ERROR:t=o.GENERAL;break;case e.PARSE_ERROR:t=o.PARSE_ERROR;break;case e.INVALID_CONTEXT:t=o.INVALID_CONTEXT;break;default:t=o.GENERAL}return a.error(`[Flagship] Flag "${n}" evaluation failed (${t}): ${i.message}`),{value:r,errorCode:t,errorMessage:i.message,reason:`ERROR`}}let s=String(i);return a.error(`[Flagship] Flag "${n}" evaluation failed (GENERAL): ${s}`),{value:r,errorCode:o.GENERAL,errorMessage:s,reason:`ERROR`}}async resolveViaBinding(e,t,n,r,i){let a=this.logger(i);try{a.debug(`[Flagship] Evaluating flag "${e}" via binding (expected: ${r})`);let i=m(n,a),s=await this.evaluateBinding(e,t,r,i);if(s.errorCode){let n=h(s.errorCode),r=s.errorMessage??`Binding error: ${s.errorCode}`;return a.error(`[Flagship] Flag "${e}" evaluation failed (${n}): ${r}`),{value:t,errorCode:n,errorMessage:r,reason:s.reason??`ERROR`}}let c=p(s.value);if(c!==r){let n=`Flag "${e}" type mismatch: expected ${r}, got ${c}`;return a.warn(`[Flagship] ${n}`),{value:t,errorCode:o.TYPE_MISMATCH,errorMessage:n,reason:`ERROR`}}return a.debug(`[Flagship] Flag "${e}" resolved via binding: value=${String(s.value)} reason=${s.reason} variant=${s.variant}`),{value:s.value,variant:s.variant,reason:s.reason,flagMetadata:{}}}catch(n){let r=n instanceof Error?n.message:String(n);return a.error(`[Flagship] Flag "${e}" binding evaluation failed (GENERAL): ${r}`),{value:t,errorCode:o.GENERAL,errorMessage:r,reason:`ERROR`}}}async evaluateBinding(e,t,n,r){let i=this.binding;switch(n){case`boolean`:return i.getBooleanDetails(e,t,r);case`string`:return i.getStringDetails(e,t,r);case`number`:return i.getNumberDetails(e,t,r);case`object`:return i.getObjectDetails(e,t,r)}}};function p(e){return typeof e==`boolean`?`boolean`:typeof e==`string`?`string`:typeof e==`number`?`number`:`object`}function m(e,t){let n={};for(let[r,i]of Object.entries(e))if(i!=null){if(i instanceof Date){n[r]=i.toISOString();continue}if(typeof i==`string`||typeof i==`number`||typeof i==`boolean`){n[r]=i;continue}if(typeof i==`object`){t.warn(`[Flagship] Context key "${r}" is a complex object/array and cannot be passed to the binding. This value will be ignored.`);continue}}return n}function h(e){switch(e){case`FLAG_NOT_FOUND`:return o.FLAG_NOT_FOUND;case`PARSE_ERROR`:return o.PARSE_ERROR;case`TYPE_MISMATCH`:return o.TYPE_MISMATCH;case`INVALID_CONTEXT`:return o.INVALID_CONTEXT;default:return o.GENERAL}}var g=class{constructor(e=console.log){this.logger=e}before(e,t){this.logger(`[Flagship] Evaluating flag: ${e.flagKey}`,{defaultValue:e.defaultValue,context:e.context})}after(e,t,n){this.logger(`[Flagship] Flag ${e.flagKey} evaluated`,{value:t.value,reason:t.reason,variant:t.variant,errorCode:t.errorCode})}error(e,t,n){let r=t instanceof Error?t.message:String(t);this.logger(`[Flagship] Error evaluating flag ${e.flagKey}:`,r)}finally(e,t,n){}},_=class{constructor(e){this.startTimes=new Map,this.contextKeys=new WeakMap,this.hints=new WeakMap,this.onEvent=e}before(e,t){let n=Date.now(),r=`${e.flagKey}-${n}-${Math.random()}`;this.startTimes.set(r,n),this.contextKeys.set(e,r),t!==void 0&&this.hints.set(e,t)}after(e,t,n){let r=this.contextKeys.get(e),i=r?this.startTimes.get(r):void 0,a=i===void 0?void 0:Date.now()-i;r!==void 0&&(this.startTimes.delete(r),this.contextKeys.delete(e)),this.onEvent({type:`evaluation`,flagKey:e.flagKey,timestamp:Date.now(),duration:a,value:t.value,reason:t.reason,variant:t.variant,errorCode:t.errorCode,context:e.context,hints:this.hints.get(e)})}error(e,t,n){let r=this.contextKeys.get(e),i=r?this.startTimes.get(r):void 0,a=i===void 0?void 0:Date.now()-i;r!==void 0&&(this.startTimes.delete(r),this.contextKeys.delete(e));let o=t instanceof Error?t.message:String(t);this.onEvent({type:`error`,flagKey:e.flagKey,timestamp:Date.now(),duration:a,errorMessage:o,context:e.context,hints:this.hints.get(e)})}finally(e,t,n){let r=this.contextKeys.get(e);r!==void 0&&(this.startTimes.delete(r),this.contextKeys.delete(e)),this.hints.delete(e)}};export{n as ContextTransformer,i as FLAGSHIP_DEFAULT_BASE_URL,a as FlagshipClient,t as FlagshipError,e as FlagshipErrorCode,f as FlagshipServerProvider,g as LoggingHook,_ as TelemetryHook,r as isBindingOptions};
|
|
1
|
+
import{a as e,i as t,n,o as r,r as i,t as a}from"./src-DW2QohY9.mjs";import{ErrorCode as o,OpenFeatureEventEmitter as s,ProviderEvents as c,ProviderStatus as l}from"@openfeature/server-sdk";const u=()=>{},d=[`appId`,`endpoint`,`accountId`,`authToken`,`baseUrl`,`fetchOptions`,`timeout`,`retries`,`retryDelay`];var f=class{constructor(e){if(this.runsOn=`server`,this.events=new s,this.currentStatus=l.NOT_READY,this.metadata={name:`Flagship Server Provider`},this.logging=e.logging??!1,r(e)){let t=d.filter(t=>t in e);if(t.length>0)throw Error(`Flagship: when using a binding, the following HTTP-specific options must not be provided: ${t.join(`, `)}. Provide either a binding or HTTP configuration, not both.`);this.binding=e.binding,this.client=void 0,this.resolve=this.resolveViaBinding.bind(this)}else this.client=new a(e),this.binding=void 0,this.resolve=this.resolveViaHttp.bind(this)}logger(e){return this.logging?e:{debug:u,info:u,warn:u,error:u}}async initialize(e){if(this.binding){this.currentStatus=l.READY,this.events.emit(c.Ready);return}try{await this.client.evaluate(`_flagship_health_check`,{}),this.currentStatus=l.READY,this.events.emit(c.Ready)}catch(e){if(e instanceof t&&e.cause instanceof Response&&e.cause.status===404){this.currentStatus=l.READY,this.events.emit(c.Ready);return}this.currentStatus=l.ERROR,this.events.emit(c.Error,{message:e instanceof Error?e.message:String(e)})}}async onClose(){this.currentStatus=l.NOT_READY}get status(){return this.currentStatus}async resolveBooleanEvaluation(e,t,n,r){return this.resolve(e,t,n,`boolean`,r)}async resolveStringEvaluation(e,t,n,r){return this.resolve(e,t,n,`string`,r)}async resolveNumberEvaluation(e,t,n,r){return this.resolve(e,t,n,`number`,r)}async resolveObjectEvaluation(e,t,n,r){return this.resolve(e,t,n,`object`,r)}async resolveViaHttp(e,t,n,r,i){let a=this.logger(i);try{a.debug(`[Flagship] Evaluating flag "${e}" (expected: ${r})`);let i=await this.client.evaluate(e,n);if(i.reason===`DISABLED`)return{value:t,reason:`DISABLED`,flagMetadata:{}};let s=p(i.value);if(s!==r){let n=`Flag "${e}" type mismatch: expected ${r}, got ${s}`;return a.warn(`[Flagship] ${n}`),{value:t,errorCode:o.TYPE_MISMATCH,errorMessage:n,reason:`ERROR`}}return a.debug(`[Flagship] Flag "${e}" resolved: value=${String(i.value)} reason=${i.reason} variant=${i.variant}`),{value:i.value,variant:i.variant,reason:i.reason,flagMetadata:{}}}catch(n){return this.handleHttpError(e,t,n,a)}}handleHttpError(n,r,i,a){if(i instanceof t){let t;switch(i.code){case e.NETWORK_ERROR:t=i.cause instanceof Response&&i.cause.status===404?o.FLAG_NOT_FOUND:o.GENERAL;break;case e.TIMEOUT_ERROR:t=o.GENERAL;break;case e.PARSE_ERROR:t=o.PARSE_ERROR;break;case e.INVALID_CONTEXT:t=o.INVALID_CONTEXT;break;default:t=o.GENERAL}return a.error(`[Flagship] Flag "${n}" evaluation failed (${t}): ${i.message}`),{value:r,errorCode:t,errorMessage:i.message,reason:`ERROR`}}let s=String(i);return a.error(`[Flagship] Flag "${n}" evaluation failed (GENERAL): ${s}`),{value:r,errorCode:o.GENERAL,errorMessage:s,reason:`ERROR`}}async resolveViaBinding(e,t,n,r,i){let a=this.logger(i);try{a.debug(`[Flagship] Evaluating flag "${e}" via binding (expected: ${r})`);let i=m(n,a),s=await this.evaluateBinding(e,t,r,i);if(s.errorCode){let n=h(s.errorCode),r=s.errorMessage??`Binding error: ${s.errorCode}`;return a.error(`[Flagship] Flag "${e}" evaluation failed (${n}): ${r}`),{value:t,errorCode:n,errorMessage:r,reason:s.reason??`ERROR`}}if(s.reason===`DISABLED`)return{value:t,reason:`DISABLED`,flagMetadata:{}};let c=p(s.value);if(c!==r){let n=`Flag "${e}" type mismatch: expected ${r}, got ${c}`;return a.warn(`[Flagship] ${n}`),{value:t,errorCode:o.TYPE_MISMATCH,errorMessage:n,reason:`ERROR`}}return a.debug(`[Flagship] Flag "${e}" resolved via binding: value=${String(s.value)} reason=${s.reason} variant=${s.variant}`),{value:s.value,variant:s.variant,reason:s.reason,flagMetadata:{}}}catch(n){let r=n instanceof Error?n.message:String(n);return a.error(`[Flagship] Flag "${e}" binding evaluation failed (GENERAL): ${r}`),{value:t,errorCode:o.GENERAL,errorMessage:r,reason:`ERROR`}}}async evaluateBinding(e,t,n,r){let i=this.binding;switch(n){case`boolean`:return i.getBooleanDetails(e,t,r);case`string`:return i.getStringDetails(e,t,r);case`number`:return i.getNumberDetails(e,t,r);case`object`:return i.getObjectDetails(e,t,r)}}};function p(e){return typeof e==`boolean`?`boolean`:typeof e==`string`?`string`:typeof e==`number`?`number`:`object`}function m(e,t){let n={};for(let[r,i]of Object.entries(e))if(i!=null){if(i instanceof Date){n[r]=i.toISOString();continue}if(typeof i==`string`||typeof i==`number`||typeof i==`boolean`){n[r]=i;continue}if(typeof i==`object`){t.warn(`[Flagship] Context key "${r}" is a complex object/array and cannot be passed to the binding. This value will be ignored.`);continue}}return n}function h(e){switch(e){case`FLAG_NOT_FOUND`:return o.FLAG_NOT_FOUND;case`PARSE_ERROR`:return o.PARSE_ERROR;case`TYPE_MISMATCH`:return o.TYPE_MISMATCH;case`INVALID_CONTEXT`:return o.INVALID_CONTEXT;default:return o.GENERAL}}var g=class{constructor(e=console.log){this.logger=e}before(e,t){this.logger(`[Flagship] Evaluating flag: ${e.flagKey}`,{defaultValue:e.defaultValue,context:e.context})}after(e,t,n){this.logger(`[Flagship] Flag ${e.flagKey} evaluated`,{value:t.value,reason:t.reason,variant:t.variant,errorCode:t.errorCode})}error(e,t,n){let r=t instanceof Error?t.message:String(t);this.logger(`[Flagship] Error evaluating flag ${e.flagKey}:`,r)}finally(e,t,n){}},_=class{constructor(e){this.startTimes=new Map,this.contextKeys=new WeakMap,this.hints=new WeakMap,this.onEvent=e}before(e,t){let n=Date.now(),r=`${e.flagKey}-${n}-${Math.random()}`;this.startTimes.set(r,n),this.contextKeys.set(e,r),t!==void 0&&this.hints.set(e,t)}after(e,t,n){let r=this.contextKeys.get(e),i=r?this.startTimes.get(r):void 0,a=i===void 0?void 0:Date.now()-i;r!==void 0&&(this.startTimes.delete(r),this.contextKeys.delete(e)),this.onEvent({type:`evaluation`,flagKey:e.flagKey,timestamp:Date.now(),duration:a,value:t.value,reason:t.reason,variant:t.variant,errorCode:t.errorCode,context:e.context,hints:this.hints.get(e)})}error(e,t,n){let r=this.contextKeys.get(e),i=r?this.startTimes.get(r):void 0,a=i===void 0?void 0:Date.now()-i;r!==void 0&&(this.startTimes.delete(r),this.contextKeys.delete(e));let o=t instanceof Error?t.message:String(t);this.onEvent({type:`error`,flagKey:e.flagKey,timestamp:Date.now(),duration:a,errorMessage:o,context:e.context,hints:this.hints.get(e)})}finally(e,t,n){let r=this.contextKeys.get(e);r!==void 0&&(this.startTimes.delete(r),this.contextKeys.delete(e)),this.hints.delete(e)}};export{n as ContextTransformer,i as FLAGSHIP_DEFAULT_BASE_URL,a as FlagshipClient,t as FlagshipError,e as FlagshipErrorCode,f as FlagshipServerProvider,g as LoggingHook,_ as TelemetryHook,r as isBindingOptions};
|
package/dist/web.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./src-QEIBSid3.cjs`);let t=require(`@openfeature/web-sdk`);var n=class{constructor(n){this.runsOn=`client`,this.events=new t.OpenFeatureEventEmitter,this.cache=new Map,this.currentStatus=t.ProviderStatus.NOT_READY,this.metadata={name:`Flagship Client Provider`},this.client=new e.t(r(n)),this.prefetchFlags=n.prefetchFlags||[],this.logging=n.logging??!1}get status(){return this.currentStatus}async initialize(e={}){await this.fetchAll(e,`initialization`),this.currentStatus=t.ProviderStatus.READY,this.events.emit(t.ProviderEvents.Ready)}async onClose(){this.cache.clear(),this.currentStatus=t.ProviderStatus.NOT_READY}async onContextChange(e,t={}){this.cache.clear(),await this.fetchAll(t,`context change`)}resolveBooleanEvaluation(e,t,n,r){return this.resolveFromCache(e,t,`boolean`,r)}resolveStringEvaluation(e,t,n,r){return this.resolveFromCache(e,t,`string`,r)}resolveNumberEvaluation(e,t,n,r){return this.resolveFromCache(e,t,`number`,r)}resolveObjectEvaluation(e,t,n,r){return this.resolveFromCache(e,t,`object`,r)}async fetchAll(e,t){if(this.prefetchFlags.length===0)return;let n=await Promise.allSettled(this.prefetchFlags.map(async t=>{let n=await this.client.evaluate(t,e);this.cache.set(t,{value:n.value,reason:n.reason,variant:n.variant})}));this.logging&&n.forEach((e,n)=>{if(e.status===`rejected`){let r=e.reason instanceof Error?e.reason.message:String(e.reason);console.warn(`[Flagship] Failed to fetch flag "${this.prefetchFlags[n]}" during ${t}: ${r}`)}})}resolveFromCache(e,n,r,i){let a=this.cache.get(e);if(!a){let r=`Flag "${e}" not found in cache. Add it to prefetchFlags to ensure it is fetched on initialization.`;return this.logging&&i.warn(`[Flagship] ${r}`),{value:n,reason:`ERROR`,errorCode:t.ErrorCode.FLAG_NOT_FOUND,errorMessage:r}}let o=this.getValueType(a.value);if(o!==r){let a=`Flag "${e}" type mismatch: expected ${r}, got ${o}`;return this.logging&&i.warn(`[Flagship] ${a}`),{value:n,errorCode:t.ErrorCode.TYPE_MISMATCH,errorMessage:a,reason:`ERROR`}}return{value:a.value,reason:`CACHED`,variant:a.variant,flagMetadata:{}}}getValueType(e){return typeof e==`boolean`?`boolean`:typeof e==`string`?`string`:typeof e==`number`?`number`:`object`}};function r(e){let{endpoint:t}=e;if(!t||!t.startsWith(`/`))return e;if(typeof window>`u`||!window.location?.origin)throw Error(`Flagship: relative endpoint "${t}" requires a browser context with window.location.origin`);return{...e,endpoint:`${window.location.origin}${t}`}}exports.ContextTransformer=e.n,exports.FLAGSHIP_DEFAULT_BASE_URL=e.r,exports.FlagshipClient=e.t,exports.FlagshipClientProvider=n,exports.FlagshipError=e.i,exports.FlagshipErrorCode=e.a;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./src-QEIBSid3.cjs`);let t=require(`@openfeature/web-sdk`);var n=class{constructor(n){this.runsOn=`client`,this.events=new t.OpenFeatureEventEmitter,this.cache=new Map,this.currentStatus=t.ProviderStatus.NOT_READY,this.metadata={name:`Flagship Client Provider`},this.client=new e.t(r(n)),this.prefetchFlags=n.prefetchFlags||[],this.logging=n.logging??!1}get status(){return this.currentStatus}async initialize(e={}){await this.fetchAll(e,`initialization`),this.currentStatus=t.ProviderStatus.READY,this.events.emit(t.ProviderEvents.Ready)}async onClose(){this.cache.clear(),this.currentStatus=t.ProviderStatus.NOT_READY}async onContextChange(e,t={}){this.cache.clear(),await this.fetchAll(t,`context change`)}resolveBooleanEvaluation(e,t,n,r){return this.resolveFromCache(e,t,`boolean`,r)}resolveStringEvaluation(e,t,n,r){return this.resolveFromCache(e,t,`string`,r)}resolveNumberEvaluation(e,t,n,r){return this.resolveFromCache(e,t,`number`,r)}resolveObjectEvaluation(e,t,n,r){return this.resolveFromCache(e,t,`object`,r)}async fetchAll(e,t){if(this.prefetchFlags.length===0)return;let n=await Promise.allSettled(this.prefetchFlags.map(async t=>{let n=await this.client.evaluate(t,e);this.cache.set(t,{value:n.value,reason:n.reason,variant:n.variant})}));this.logging&&n.forEach((e,n)=>{if(e.status===`rejected`){let r=e.reason instanceof Error?e.reason.message:String(e.reason);console.warn(`[Flagship] Failed to fetch flag "${this.prefetchFlags[n]}" during ${t}: ${r}`)}})}resolveFromCache(e,n,r,i){let a=this.cache.get(e);if(!a){let r=`Flag "${e}" not found in cache. Add it to prefetchFlags to ensure it is fetched on initialization.`;return this.logging&&i.warn(`[Flagship] ${r}`),{value:n,reason:`ERROR`,errorCode:t.ErrorCode.FLAG_NOT_FOUND,errorMessage:r}}if(a.reason===`DISABLED`)return{value:n,reason:`DISABLED`,flagMetadata:{}};let o=this.getValueType(a.value);if(o!==r){let a=`Flag "${e}" type mismatch: expected ${r}, got ${o}`;return this.logging&&i.warn(`[Flagship] ${a}`),{value:n,errorCode:t.ErrorCode.TYPE_MISMATCH,errorMessage:a,reason:`ERROR`}}return{value:a.value,reason:`CACHED`,variant:a.variant,flagMetadata:{}}}getValueType(e){return typeof e==`boolean`?`boolean`:typeof e==`string`?`string`:typeof e==`number`?`number`:`object`}};function r(e){let{endpoint:t}=e;if(!t||!t.startsWith(`/`))return e;if(typeof window>`u`||!window.location?.origin)throw Error(`Flagship: relative endpoint "${t}" requires a browser context with window.location.origin`);return{...e,endpoint:`${window.location.origin}${t}`}}exports.ContextTransformer=e.n,exports.FLAGSHIP_DEFAULT_BASE_URL=e.r,exports.FlagshipClient=e.t,exports.FlagshipClientProvider=n,exports.FlagshipError=e.i,exports.FlagshipErrorCode=e.a;
|
package/dist/web.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as e,i as t,n,r,t as i}from"./src-DW2QohY9.mjs";import{ErrorCode as a,OpenFeatureEventEmitter as o,ProviderEvents as s,ProviderStatus as c}from"@openfeature/web-sdk";var l=class{constructor(e){this.runsOn=`client`,this.events=new o,this.cache=new Map,this.currentStatus=c.NOT_READY,this.metadata={name:`Flagship Client Provider`},this.client=new i(u(e)),this.prefetchFlags=e.prefetchFlags||[],this.logging=e.logging??!1}get status(){return this.currentStatus}async initialize(e={}){await this.fetchAll(e,`initialization`),this.currentStatus=c.READY,this.events.emit(s.Ready)}async onClose(){this.cache.clear(),this.currentStatus=c.NOT_READY}async onContextChange(e,t={}){this.cache.clear(),await this.fetchAll(t,`context change`)}resolveBooleanEvaluation(e,t,n,r){return this.resolveFromCache(e,t,`boolean`,r)}resolveStringEvaluation(e,t,n,r){return this.resolveFromCache(e,t,`string`,r)}resolveNumberEvaluation(e,t,n,r){return this.resolveFromCache(e,t,`number`,r)}resolveObjectEvaluation(e,t,n,r){return this.resolveFromCache(e,t,`object`,r)}async fetchAll(e,t){if(this.prefetchFlags.length===0)return;let n=await Promise.allSettled(this.prefetchFlags.map(async t=>{let n=await this.client.evaluate(t,e);this.cache.set(t,{value:n.value,reason:n.reason,variant:n.variant})}));this.logging&&n.forEach((e,n)=>{if(e.status===`rejected`){let r=e.reason instanceof Error?e.reason.message:String(e.reason);console.warn(`[Flagship] Failed to fetch flag "${this.prefetchFlags[n]}" during ${t}: ${r}`)}})}resolveFromCache(e,t,n,r){let i=this.cache.get(e);if(!i){let n=`Flag "${e}" not found in cache. Add it to prefetchFlags to ensure it is fetched on initialization.`;return this.logging&&r.warn(`[Flagship] ${n}`),{value:t,reason:`ERROR`,errorCode:a.FLAG_NOT_FOUND,errorMessage:n}}let o=this.getValueType(i.value);if(o!==n){let i=`Flag "${e}" type mismatch: expected ${n}, got ${o}`;return this.logging&&r.warn(`[Flagship] ${i}`),{value:t,errorCode:a.TYPE_MISMATCH,errorMessage:i,reason:`ERROR`}}return{value:i.value,reason:`CACHED`,variant:i.variant,flagMetadata:{}}}getValueType(e){return typeof e==`boolean`?`boolean`:typeof e==`string`?`string`:typeof e==`number`?`number`:`object`}};function u(e){let{endpoint:t}=e;if(!t||!t.startsWith(`/`))return e;if(typeof window>`u`||!window.location?.origin)throw Error(`Flagship: relative endpoint "${t}" requires a browser context with window.location.origin`);return{...e,endpoint:`${window.location.origin}${t}`}}export{n as ContextTransformer,r as FLAGSHIP_DEFAULT_BASE_URL,i as FlagshipClient,l as FlagshipClientProvider,t as FlagshipError,e as FlagshipErrorCode};
|
|
1
|
+
import{a as e,i as t,n,r,t as i}from"./src-DW2QohY9.mjs";import{ErrorCode as a,OpenFeatureEventEmitter as o,ProviderEvents as s,ProviderStatus as c}from"@openfeature/web-sdk";var l=class{constructor(e){this.runsOn=`client`,this.events=new o,this.cache=new Map,this.currentStatus=c.NOT_READY,this.metadata={name:`Flagship Client Provider`},this.client=new i(u(e)),this.prefetchFlags=e.prefetchFlags||[],this.logging=e.logging??!1}get status(){return this.currentStatus}async initialize(e={}){await this.fetchAll(e,`initialization`),this.currentStatus=c.READY,this.events.emit(s.Ready)}async onClose(){this.cache.clear(),this.currentStatus=c.NOT_READY}async onContextChange(e,t={}){this.cache.clear(),await this.fetchAll(t,`context change`)}resolveBooleanEvaluation(e,t,n,r){return this.resolveFromCache(e,t,`boolean`,r)}resolveStringEvaluation(e,t,n,r){return this.resolveFromCache(e,t,`string`,r)}resolveNumberEvaluation(e,t,n,r){return this.resolveFromCache(e,t,`number`,r)}resolveObjectEvaluation(e,t,n,r){return this.resolveFromCache(e,t,`object`,r)}async fetchAll(e,t){if(this.prefetchFlags.length===0)return;let n=await Promise.allSettled(this.prefetchFlags.map(async t=>{let n=await this.client.evaluate(t,e);this.cache.set(t,{value:n.value,reason:n.reason,variant:n.variant})}));this.logging&&n.forEach((e,n)=>{if(e.status===`rejected`){let r=e.reason instanceof Error?e.reason.message:String(e.reason);console.warn(`[Flagship] Failed to fetch flag "${this.prefetchFlags[n]}" during ${t}: ${r}`)}})}resolveFromCache(e,t,n,r){let i=this.cache.get(e);if(!i){let n=`Flag "${e}" not found in cache. Add it to prefetchFlags to ensure it is fetched on initialization.`;return this.logging&&r.warn(`[Flagship] ${n}`),{value:t,reason:`ERROR`,errorCode:a.FLAG_NOT_FOUND,errorMessage:n}}if(i.reason===`DISABLED`)return{value:t,reason:`DISABLED`,flagMetadata:{}};let o=this.getValueType(i.value);if(o!==n){let i=`Flag "${e}" type mismatch: expected ${n}, got ${o}`;return this.logging&&r.warn(`[Flagship] ${i}`),{value:t,errorCode:a.TYPE_MISMATCH,errorMessage:i,reason:`ERROR`}}return{value:i.value,reason:`CACHED`,variant:i.variant,flagMetadata:{}}}getValueType(e){return typeof e==`boolean`?`boolean`:typeof e==`string`?`string`:typeof e==`number`?`number`:`object`}};function u(e){let{endpoint:t}=e;if(!t||!t.startsWith(`/`))return e;if(typeof window>`u`||!window.location?.origin)throw Error(`Flagship: relative endpoint "${t}" requires a browser context with window.location.origin`);return{...e,endpoint:`${window.location.origin}${t}`}}export{n as ContextTransformer,r as FLAGSHIP_DEFAULT_BASE_URL,i as FlagshipClient,l as FlagshipClientProvider,t as FlagshipError,e as FlagshipErrorCode};
|