UNPKG

@happykit/flags

Version:

Feature Flags for Next.js

2 lines (1 loc) 2.92 kB
import{a as c}from"./chunk-V34VOWZ5.mjs";import{a as s,b as p,c as I,f as K}from"./chunk-TMZGICGH.mjs";import{a as B,b as G,c as D,d as b,e as L}from"./chunk-HCCDXSZ4.mjs";import{nanoid as A}from"nanoid";function j(l){let x="x-forwarded-for",u=l.req.headers[x];if(typeof u=="string")return u;let f=l.req.socket.remoteAddress;return f||null}function M(l){return typeof l=="string"}function z(l,{serverLoadingTimeout:x=3e3,staticLoadingTimeout:u=6e4,getDefinitions:f,serverTiming:R}={}){let t=K(l);return async function(e){let w=s(e,"staticLoadingTimeout")?e.staticLoadingTimeout:u,E=s(e,"serverLoadingTimeout")?e.serverLoadingTimeout:x,q=s(e,"getDefinitions,")?e.getDefinitions:f,k=e.visitorKey?null:e.context&&s(e.context,"req")?I(e.context.req.headers.cookie,"hkvk"):null,o=e.visitorKey?e.visitorKey:e.context&&s(e.context,"req")?k||A():null,n={endpoint:t.endpoint,envKey:t.envKey,requestBody:{visitorKey:o,user:e.user||null,traits:e.traits||null}},T=e.context&&s(e.context,"req")?j(e.context):null,P=T?{"x-forwarded-for":T}:{},d=typeof AbortController=="function"?new AbortController:null,m=!e.context||s(e.context,"req")?E:w,F=!d||typeof m!="number"||isNaN(m)||m<=0?null:setTimeout(()=>d.abort(),m);if(q){let i=Date.now(),r;try{r=await q(t.projectId,t.envKey,t.environment)}catch{return c({error:"network-error",flags:t.defaultFlags,input:n})}let S=Date.now();if(e.context){let g=e.context.res;if(g&&R){let v=g.getHeader("server-timing");g.setHeader("server-timing",[...Array.isArray(v)?v:[v],`definitions;dur=${S-i}`].filter(M))}}if(!r||r.format!=="v1"||r.projectId!==t.projectId||!Array.isArray(r.flags))return c({error:"response-not-ok",flags:t.defaultFlags,input:n});if(e.context&&s(e.context,"req")&&o){let g=t.serializeVisitorKeyCookie(o);g&&e.context.res.setHeader("Set-Cookie",g)}let C=L({flags:r.flags,environment:t.environment,traits:e.traits?D(e.traits):null,user:e.user?B(e.user):null,visitor:o?G(o):null}),a={flags:b(C),visitor:o?G(o):null},y=a.flags?a.flags:null;return{flags:p(y,t.defaultFlags),data:a,error:null,initialFlagState:{input:n,outcome:{data:a}}}}return fetch([n.endpoint,n.envKey].join("/"),{method:"POST",headers:Object.assign({"content-type":"application/json"},P),signal:d?d.signal:void 0,body:JSON.stringify(n.requestBody),cache:"no-store"}).then(i=>(F&&clearTimeout(F),i.ok?i.json().then(r=>{var a;if(e.context&&s(e.context,"req")&&((a=r.visitor)==null?void 0:a.key)){let y=t.serializeVisitorKeyCookie(r.visitor.key),h=e.context;y&&h.res.setHeader("Set-Cookie",y)}let S=r.flags?r.flags:null;return{flags:p(S,t.defaultFlags),data:r,error:null,initialFlagState:{input:n,outcome:{data:r}}}},r=>c({error:"invalid-response-body",flags:t.defaultFlags,input:n})):c({error:"response-not-ok",flags:t.defaultFlags,input:n})),i=>(F&&clearTimeout(F),c({error:(i==null?void 0:i.name)==="AbortError"?"request-timed-out":"network-error",input:n,flags:t.defaultFlags})))}}export{z as createGetFlags};