unleash-server
Version:
Unleash is an enterprise ready feature flag service. It provides different strategies for handling feature flags.
1 lines • 10.3 kB
JavaScript
import{n as e,s as t,t as n}from"./jsx-runtime-ButemYzH.js";import{Ac as r,Ad as i,Al as a,Bl as o,Cc as s,Cd as c,Eu as ee,Gl as l,Hl as u,Jl as d,Kl as te,Nl as f,Nt as p,Ol as m,Ul as h,Xs as g,Xu as _,Yl as v,Yu as y,_d as b,n as x,oo as S,xd as C,zl as w}from"./index-B0RbDPtk.js";import{a as ne,c as re,d as T,i as ie,l as E,n as ae,o as D,r as O,s as k,t as A,u as j}from"./useInstanceTrafficMetrics--5pof2Er.js";import{t as M}from"./formatTickValue-DHdXPo89.js";var N=n(),P=b((0,N.jsx)(`path`,{d:`m7 14 5-5 5 5z`}),`ArrowDropUp`),F=t(e(),1),I=(e,t,n=!0)=>{let r=e.getFullYear(),i=e.getMonth();return{key:E(e),year:r,month:i,dayCount:w(e),shortLabel:e.toLocaleString(`en-US`,{month:`short`}),label:t||e.toLocaleString(`en-US`,{month:`long`,year:`numeric`}),selectable:n}},L=(e=>{let t=[I(e,`Current month`)],n=u(e);for(let e=1;e<12;e++){let r=f(n,e);t.push(I(r,void 0,r>=ae))}return t})(D),R=Object.fromEntries(L.map(e=>[e.key,e])),z=`15rem`,B=e=>e.spacing(3),V=C(`button`,{shouldForwardProp:e=>e!==`selected`})(({theme:e,selected:t})=>({cursor:`pointer`,border:`none`,backgroundColor:t?e.palette.secondary.light:`inherit`,fontSize:e.typography.body1.fontSize,padding:e.spacing(.5),borderRadius:e.shape.borderRadius,color:e.palette.text.primary,transition:`background-color 0.2s ease`,":focus-visible":{outline:`2px solid ${e.palette.primary.main}`},":hover:not(:disabled)":{backgroundColor:e.palette.action.hover}})),H=C(V)(({theme:e})=>({":disabled":{cursor:`default`,color:e.palette.text.disabled}})),U=C(V)(({theme:e})=>({width:`100%`,paddingBlock:e.spacing(1),textAlign:`left`,borderRadius:0,paddingInline:B(e)})),W=C(y)(({theme:e})=>({whiteSpace:`nowrap`,width:z,justifyContent:`space-between`,fontWeight:`normal`,color:e.palette.text.primary,borderColor:e.palette.divider,":focus-within":{borderColor:e.palette.primary.main},":hover":{borderColor:e.palette.text.disabled,backgroundColor:`inherit`},transition:`border-color 0.1s ease`})),G=C(`article`)(({theme:e})=>({width:z,paddingBlock:e.spacing(2),display:`flex`,flexFlow:`column`,gap:e.spacing(2)})),K=C(`article`)(({theme:e})=>({paddingInline:B(e)})),q=C(`hgroup`)(({theme:e})=>({h3:{margin:0,fontSize:e.typography.h3.fontSize},p:{color:e.palette.text.secondary,fontSize:e.typography.body2.fontSize}})),J=C(`ul`)(({theme:e})=>({listStyle:`none`,padding:0,display:`grid`,gridTemplateColumns:`repeat(4, 1fr)`,rowGap:e.spacing(1)})),oe=C(`article`)(({theme:e})=>({display:`flex`,width:`100%`,flexFlow:`column`,gap:e.spacing(.5)})),se=C(`p`)(({theme:e})=>({paddingInline:B(e),fontSize:e.typography.body2.fontSize,margin:0,color:e.palette.text.secondary,fontWeight:`bold`})),ce=C(`ul`)(({theme:e})=>({listStyle:`none`,margin:0,padding:0,width:`100%`,li:{width:`100%`}})),le=C(ee)(({theme:e})=>({"& .MuiPaper-root":{borderRadius:e.shape.borderRadiusLarge,border:`1px solid ${e.palette.divider}`}})),ue=({selectedPeriod:e,setPeriod:t})=>{let n=[3,6,12].map(e=>({value:e,label:`Last ${e} months`})),[r,i]=(0,F.useState)(!1),a=(0,F.useRef)(null),s=e=>{t(e),i(!1)},c=e.grouping===`daily`?e.month===o(new Date,`yyyy-MM`)?`Current month`:T(e.month).toLocaleDateString(`en-US`,{month:`long`,year:`numeric`}):`Last ${e.monthsBack} months`;return(0,N.jsxs)(_,{ref:a,children:[(0,N.jsx)(W,{endIcon:r?(0,N.jsx)(P,{}):(0,N.jsx)(S,{}),variant:`outlined`,disableRipple:!0,onClick:()=>i(!0),children:c}),(0,N.jsxs)(le,{open:r,anchorEl:a.current,onClose:()=>i(!1),anchorOrigin:{vertical:`bottom`,horizontal:`center`},transformOrigin:{vertical:`top`,horizontal:`center`},children:[(0,N.jsxs)(G,{children:[(0,N.jsxs)(K,{children:[(0,N.jsxs)(q,{children:[(0,N.jsx)(`h3`,{children:`Select month`}),(0,N.jsx)(`p`,{children:`Last 12 months`})]}),(0,N.jsx)(J,{children:L.map(t=>(0,N.jsx)(`li`,{children:(0,N.jsx)(H,{selected:e.grouping===`daily`&&t.key===e.month,disabled:!t.selectable,onClick:()=>{s({grouping:`daily`,month:t.key})},children:t.shortLabel})},t.label))})]}),(0,N.jsxs)(oe,{children:[(0,N.jsx)(se,{children:`Range`}),(0,N.jsx)(ce,{children:n.map(t=>(0,N.jsx)(`li`,{children:(0,N.jsxs)(U,{selected:e.grouping===`monthly`&&t.value===e.monthsBack,type:`button`,onClick:()=>{s({grouping:`monthly`,monthsBack:t.value})},children:[`Last `,t.value,` months`]})},t.label))})]})]}),` `]})]})},Y={"/api/admin":{label:`Admin`,color:`#6D66D9`,order:1},"/api/frontend":{label:`Frontend`,color:`#A39EFF`,order:2},"/api/client":{label:`Server`,color:`#D8D6FF`,order:3}},de=(e,t)=>{let{newRecord:n,labels:r}=X(e);return{datasets:e.apiData.filter(e=>t?e.apiPath===t:!0).sort((e,t)=>Y[e.apiPath].order-Y[t.apiPath].order).map(e=>{let t=n();for(let n of Object.values(e.dataPoints))t[n.period]=n.trafficTypes[0].count;let r=Y[e.apiPath];return{label:r.label,data:Object.values(t),backgroundColor:r.color,hoverBackgroundColor:r.color}}),labels:r}},fe=e=>{let{newRecord:t,labels:n}=X(e);return{datasets:e.apiData.map(e=>{let n=t();for(let t of Object.values(e.dataPoints)){let e=t.connections;n[t.period]=e}let r={label:`Connections`,color:`#6D66D9`,order:1};return{label:r.label,data:Object.values(n),backgroundColor:r.color,hoverBackgroundColor:r.color}}),labels:n}},pe=e=>{let{newRecord:t,labels:n}=X(e);return{datasets:e.apiData.map(e=>{let n=t();for(let t of Object.values(e.dataPoints)){let e=t.requests;n[t.period]=e}let r={label:`Frontend requests`,color:`#A39EFF`,order:1};return{label:r.label,data:Object.values(n),backgroundColor:r.color,hoverBackgroundColor:r.color}}),labels:n}},X=e=>{if(e.grouping===`monthly`){let t=j(e.dateRange.from),n=j(e.dateRange.to),r=Math.abs(l(n,t))+1,i={};for(let e=0;e<r;e++)i[E(d(t,e))]=0;return{newRecord:()=>({...i}),labels:Array.from({length:r}).map((e,n)=>n===r-1?`Current month`:E(d(t,n)))}}else{let t=j(e.dateRange.from),n=j(e.dateRange.to),r=Math.abs(te(n,t))+1,i={};for(let e=0;e<r;e++)i[re(v(t,e))]=0;return{newRecord:()=>({...i}),labels:Array.from({length:r}).map((e,t)=>(t+1).toString())}}},[me,...he]=Object.values(Y).map(e=>e.label.toLowerCase()).toReversed(),Z=`${he.toReversed().join(`, `)}, and ${me}`,ge=e=>e.grouping===`daily`?`A bar chart showing daily traffic usage for ${new Date(e.month).toLocaleDateString(`en-US`,{month:`long`,year:`numeric`})}. Each date shows ${Z} requests.`:`A bar chart showing monthly total traffic usage for the current month and the preceding ${e.monthsBack} months. Each month shows ${Z} requests.`,Q=(e,t=new Date)=>{let n=e=>o(e,`yyyy-MM-dd`);if(e.grouping===`daily`){let t=T(e.month);return{from:n(t),to:n(h(t))}}else return{from:n(u(f(t,e.monthsBack))),to:n(h(t))}},_e=e=>{if(e.grouping===`daily`)return 0;let t=Math.abs(l(new Date(e.dateRange.to),new Date(e.dateRange.from))),n=e.apiData.map(e=>e.dataPoints.filter(({period:e})=>e!==k).reduce((e,t)=>e+t.trafficTypes[0].count,0)).reduce((e,t)=>e+t,0);return Math.round(n/t)},ve=(e,{from:t,to:n})=>{let{data:r,error:i,mutate:o}=a(m(`api/admin/metrics/connection?grouping=${e}&from=${t}&to=${n}`),ye);return(0,F.useMemo)(()=>({refetch:()=>o(),result:r?{state:`success`,data:r}:i?{state:`error`,error:i}:{state:`loading`}}),[r,i,o])},ye=e=>fetch(e).then(r(`Metered Connections Metrics`)).then(e=>e.json()),be=(e,{from:t,to:n})=>{let{data:r,error:i,mutate:o}=a(m(`api/admin/metrics/request?grouping=${e}&from=${t}&to=${n}`),$);return(0,F.useMemo)(()=>({refetch:()=>o(),result:r?{state:`success`,data:r}:i?{state:`error`,error:i}:{state:`loading`}}),[r,i,o])},$=e=>fetch(e).then(r(`Consumption Requests Metrics`)).then(e=>e.json()),xe=(e,t,n)=>{let{result:r}=A(t.grouping,Q(t,D)),{instanceStatus:i}=s(),{instancePrices:a}=x(),o=i?.billing===`pay-as-you-go`?a.payg.traffic:a.pro.traffic;return(0,F.useMemo)(()=>{if(r.state!==`success`)return{chartData:{datasets:[],labels:[]},usageTotal:0,overageCost:0,estimatedMonthlyCost:0,requestSummaryUsage:0};let i=r.data,a=de(i,n),s=ne(i);return{chartData:a,usageTotal:s,overageCost:ie(s,e,o),estimatedMonthlyCost:O(i.apiData,e,D,o),requestSummaryUsage:t.grouping===`daily`?s:_e(i)}},[JSON.stringify(r),e,JSON.stringify(t),o])},Se=e=>{let{result:t}=ve(e.grouping,Q(e,D));return(0,F.useMemo)(()=>{if(t.state!==`success`)return{chartData:{datasets:[],labels:[]}};let e=t.data;return{chartData:fe(e)}},[JSON.stringify(t),JSON.stringify(e)])},Ce=e=>{let{result:t}=be(e.grouping,Q(e,D));return(0,F.useMemo)(()=>{if(t.state!==`success`)return{chartData:{datasets:[],labels:[]}};let e=t.data;return{chartData:pe(e)}},[JSON.stringify(t),JSON.stringify(e)])},we=C(i)(({theme:e})=>({display:`grid`,gap:e.spacing(5)})),Te=C(`div`)(({theme:e})=>({display:`flex`,flexFlow:`row wrap`,justifyContent:`space-between`,gap:e.spacing(2,4),alignItems:`start`})),Ee=C(`span`)(({theme:e})=>({fontWeight:`bold`})),De=(e,t,n,r)=>({plugins:{annotation:{clip:!1,annotations:{line:{type:`line`,borderDash:[5,5],yMin:n?n/30:0,yMax:n?n/30:0,borderColor:`gray`,borderWidth:1,display:!!n&&!!r,label:{backgroundColor:`rgba(192, 192, 192, 0.8)`,color:`black`,padding:{top:10,bottom:10,left:10,right:10},content:`Average daily requests included in your plan`,display:!!n}}}},legend:{position:`bottom`,labels:{color:e.palette.text.primary,pointStyle:`circle`,usePointStyle:!0,boxHeight:6,padding:15,boxPadding:5}},tooltip:{backgroundColor:e.palette.background.paper,titleColor:e.palette.text.primary,bodyColor:e.palette.text.primary,bodySpacing:6,padding:{top:20,bottom:20,left:30,right:30},borderColor:`rgba(0, 0, 0, 0.05)`,borderWidth:3,usePointStyle:!0,caretSize:0,boxPadding:10,callbacks:{title:t}}},responsive:!0,scales:{x:{stacked:!0,ticks:{color:e.palette.text.secondary},grid:{display:!1}},y:{stacked:!0,ticks:{color:e.palette.text.secondary,maxTicksLimit:5,callback:M},grid:{drawBorder:!1}}},elements:{bar:{borderRadius:5}},interaction:{mode:`index`,intersect:!1}}),Oe=e=>{let t=c(),{locationSettings:n}=g(),[r,i]=(0,F.useState)({grouping:`daily`,month:L[0].key});return{chartDataSelection:r,setChartDataSelection:i,options:(0,F.useMemo)(()=>De(t,e=>{if(r.grouping===`daily`){let t=R[r.month];return new Date(t.year,t.month,Number.parseInt(e[0].label,10)).toLocaleDateString(n?.locale??`en-US`,{month:`long`,day:`numeric`,year:`numeric`})}else{let t=T(e[0].label);return Number.isNaN(t.getTime())?`Current month to date`:t.toLocaleDateString(n?.locale??`en-US`,{month:`long`,year:`numeric`})}},e,r.grouping===`daily`),[t,r,e])}},ke=p({bottomOverflow:34});export{Te as a,xe as c,we as i,ge as l,Oe as n,Se as o,Ee as r,Ce as s,ke as t,ue as u};