@featureflare/sdk-js 0.0.86 → 0.0.88
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/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":["metadata"],"mappings":";;;AA4BA,IAAM,iCAAA,GACJ,8BAAA;AACF,IAAM,oBAAA,GAAuB,KAAK,EAAA,GAAK,GAAA;AACvC,IAAM,oBAAA,GAAuB,KAAK,EAAA,GAAK,GAAA;AAEvC,SAAS,oBAAA,GAAsC;AAC7C,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,EAAK;AACjD,IAAA,OACE,OAAA,CAAQ,IAAI,yBAAA,EAA2B,IAAA,MACvC,OAAA,CAAQ,GAAA,CAAI,mBAAA,EAAqB,IAAA,EAAK,IACtC,IAAA;AAAA,EAEJ;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,cAAc,QAAA,EAA2B;AAChD,EAAA,MAAM,WAAA,GAAc,UAAU,IAAA,EAAK;AACnC,EAAA,IAAI,aAAa,OAAO,WAAA;AAExB,EAAA,MAAM,UAAU,oBAAA,EAAqB;AACrC,EAAA,IAAI,SAAS,OAAO,OAAA;AAEpB,EAAA,OAAO,iCAAA;AACT;AAkIA,SAAS,gBAAA,GAAkC;AACzC,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,EAAK;AACjD,IAAA,OACE,OAAA,CAAQ,IAAI,oBAAA,EAAsB,IAAA,MAClC,OAAA,CAAQ,GAAA,CAAI,cAAA,EAAgB,IAAA,EAAK,IACjC,IAAA;AAAA,EAEJ;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,mBAAmB,KAAA,EAAyB;AACnD,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,MAAM,GAAA,CAAI,CAAC,KAAA,KAAU,kBAAA,CAAmB,KAAK,CAAC,CAAA;AAAA,EACvD;AAEA,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,KAAgC,CAAA,CAC5D,OAAO,CAAC,GAAG,UAAU,CAAA,KAAM,UAAA,KAAe,MAAS,CAAA,CACnD,IAAA,CAAK,CAAC,CAAC,OAAO,CAAA,EAAG,CAAC,QAAQ,CAAA,KAAM,OAAA,CAAQ,aAAA,CAAc,QAAQ,CAAC,CAAA;AAElE,IAAA,OAAO,MAAA,CAAO,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,UAAU,CAAA,KAAM,CAAC,GAAA,EAAK,kBAAA,CAAmB,UAAU,CAAC,CAAC,CAAC,CAAA;AAAA,EACrG;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAAwB;AAC7C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,kBAAA,CAAmB,KAAK,CAAC,CAAA;AAEtD,EAAA,IAAI,OAAA,GAAU,UAAA;AACd,EAAA,IAAI,QAAA,GAAW,UAAA;AACf,EAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,KAAA,CAAM,MAAA,EAAQ,SAAS,CAAA,EAAG;AACpD,IAAA,OAAA,IAAW,KAAA,CAAM,WAAW,KAAK,CAAA;AACjC,IAAA,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,QAAU,CAAA;AAEvC,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA;AACxC,IAAA,QAAA,IAAY,KAAA,CAAM,WAAW,YAAY,CAAA;AACzC,IAAA,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,QAAU,CAAA;AAAA,EAC3C;AAEA,EAAA,OAAO,IAAI,OAAA,KAAY,CAAA,EAAG,SAAS,EAAE,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,EAAA,CAAI,QAAA,KAAa,GAAG,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAC1G;AAEA,SAAS,gBAAgB,KAAA,EAAuB;AAC9C,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,OAAO,OAAO,IAAA,CAAK,KAAA,EAAO,MAAM,CAAA,CAAE,SAAS,WAAW,CAAA;AAAA,EACxD;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAO,WAAA,KAAgB,WAAA,GAAc,IAAI,aAAY,CAAE,MAAA,CAAO,KAAK,CAAA,GAAI,EAAC;AACtF,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAA,IAAU,MAAA,CAAO,aAAa,IAAI,CAAA;AAAA,EACpC;AAEA,EAAA,MAAM,SAAS,OAAO,IAAA,KAAS,UAAA,GAAa,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA;AAC3D,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAC1E;AAsBA,SAAS,+BAA+B,KAAA,EAA2D;AACjG,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,EAAA,EAAI,KAAA,CAAM,EAAA,IAAM,KAAA,CAAM;AAAA,GACxB;AAEA,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,cAAc,OAAO,CAAA;AAAA,IAClC,MAAA,EAAQ;AAAA,MACN,GAAK,KAAA,CAAM,EAAA,IAAM,KAAA,CAAM,MAAO,EAAE,EAAA,EAAI,aAAA,CAAc,KAAA,CAAM,EAAA,IAAM,KAAA,CAAM,GAAG,CAAA,KAAM;AAAC,KAChF;AAAA,IACA,aAAa,EAAC;AAAA,IACd,eAAe;AAAC,GAClB;AACF;AAEA,SAAS,gBAAA,GAAkC;AACzC,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,EAAK;AACjD,IAAA,OACE,QAAQ,GAAA,CAAI,uBAAA,EAAyB,MAAK,IAC1C,OAAA,CAAQ,IAAI,uBAAA,EAAyB,IAAA,MACrC,OAAA,CAAQ,GAAA,CAAI,mBAAmB,IAAA,EAAK,IACpC,QAAQ,GAAA,CAAI,iBAAA,EAAmB,MAAK,IACpC,IAAA;AAAA,EAEJ;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,YAAA,GAAuB;AAC9B,EAAA,IAAI,OAAO,WAAA,KAAgB,WAAA,IAAe,OAAO,WAAA,CAAY,QAAQ,UAAA,EAAY;AAC/E,IAAA,OAAO,YAAY,GAAA,EAAI;AAAA,EACzB;AACA,EAAA,OAAO,KAAK,GAAA,EAAI;AAClB;AAEA,SAAS,0BAAA,GAAsC;AAC7C,EAAA,MAAM,QAAA,GACJ,OAAO,OAAA,KAAY,WAAA,IAAe,QAAQ,GAAA,GACtC,OAAA,CAAQ,GAAA,CAAI,8BAAA,EAAgC,MAAK,IAAK,OAAA,CAAQ,GAAA,CAAI,kBAAA,EAAoB,MAAK,GAC3F,EAAA;AAEN,EAAA,IAAI,QAAA,KAAa,GAAA,IAAO,QAAA,EAAU,WAAA,OAAkB,MAAA,EAAQ;AAC1D,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,oBAAoB,CAAA;AACrE,MAAA,OAAO,YAAA,KAAiB,GAAA,IAAO,YAAA,EAAc,WAAA,EAAY,KAAM,MAAA;AAAA,IACjE,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,QAAA,CAAS,SAAiB,OAAA,EAAyC;AAC1E,EAAA,IAAI,CAAC,4BAA2B,EAAG;AACjC,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,mBAAA,EAAsB,OAAO,CAAA,CAAA,EAAI,OAAO,CAAA;AACtD,IAAA;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,mBAAA,EAAsB,OAAO,CAAA,CAAE,CAAA;AAC/C;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,UAAA,CAAW,SAAS,EAAE,CAAA;AAAA,EACxB,CAAC,CAAA;AACH;AAEA,SAAS,kBAAkB,MAAA,EAAyB;AAClD,EAAA,OAAO,WAAW,GAAA,IAAO,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,OAAO,MAAA,IAAU,GAAA;AACzE;AAEA,SAAS,iBACP,KAAA,EACwC;AACxC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,EAAG;AAC9B,IAAA,OAAO,MAAM,KAAA,CACV,MAAA;AAAA,MAAO,CAAC,KAAA,KACP,OAAA,CAAQ,KAAK,CAAA,IAAK,OAAO,KAAA,CAAM,GAAA,KAAQ,QAAA,IAAY,OAAO,KAAA,CAAM,KAAA,KAAU;AAAA,KAC5E,CACC,GAAA,CAAI,CAAC,KAAA,MAAW,EAAE,GAAA,EAAK,KAAA,CAAM,GAAA,EAAK,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM,CAAE,CAAA;AAAA,EAC5D;AAEA,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,IAAU,EAAC;AAChC,EAAA,OAAO,OAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,MAAO,EAAE,GAAA,EAAK,KAAA,EAAO,OAAA,CAAQ,KAAK,GAAE,CAAE,CAAA;AACtF;AAEO,IAAM,2BAAN,MAA+B;AAAA,EACnB,OAAA,uBAAc,GAAA,EAAsB;AAAA,EAErD,MAAA,GAAS,CAAC,UAAA,EAAoC,KAAA,EAAe,IAAA,KAAkC;AAC7F,IAAA,MAAM,GAAA,GAAM,GAAG,UAAU,CAAA,CAAA,EAAI,KAAK,SAAA,CAAU,IAAA,IAAQ,EAAE,CAAC,CAAA,CAAA;AACvD,IAAA,MAAM,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,KAAK,EAAC;AACvC,IAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AACf,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AAAA,EAC5B,CAAA;AAAA,EAEA,IAAI,UAAA,EAA+F;AACjG,IAAA,MAAM,OAAkE,EAAC;AACzE,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,KAAK,IAAA,CAAK,OAAA,CAAQ,SAAQ,EAAG;AAClD,MAAA,IAAI,CAAC,GAAA,CAAI,UAAA,CAAW,CAAA,EAAG,UAAU,GAAG,CAAA,EAAG;AACvC,MAAA,IAAA,CAAK,IAAA,CAAK;AAAA,QACR,IAAA,EAAM,KAAK,KAAA,CAAM,GAAA,CAAI,MAAM,UAAA,CAAW,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA,QACjD,MAAA,EAAQ,CAAC,GAAG,MAAM;AAAA,OACnB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,IAAM,qBAAN,MAAyB;AAAA,EACb,UAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAEb;AAAA,IACF,MAAA,sBAAY,GAAA,EAAI;AAAA,IAChB,WAAA,sBAAiB,GAAA,EAAI;AAAA,IACrB,YAAA,sBAAkB,GAAA,EAAI;AAAA,IACtB,eAAA,sBAAqB,GAAA;AAAI,GAC3B;AAAA,EAEiB,KAAA,uBAAY,GAAA,EAAuB;AAAA,EACnC,WAAA,uBAAkB,GAAA,EAA4C;AAAA,EAC9D,YAAA,uBAAmB,GAAA,EAAY;AAAA,EAExC,QAAA,GAAW,CAAA;AAAA,EACX,WAAA,GAAc,KAAA;AAAA,EACd,qBAAA,GAA8C,IAAA;AAAA,EACrC,kBAAA,uBAAyB,GAAA,EAAoE;AAAA,EACtG,QAAA,GAAoC,IAAA;AAAA,EACpC,gBAAA,GAAmB,KAAA;AAAA,EAEnB,eAAA,GAAkB,IAAA;AAAA,EAClB,sBAAA,GAAyB,IAAA;AAAA,EACzB,iBAAA,GAAoB,IAAA;AAAA,EACpB,eAAA,GAAkB,oBAAA;AAAA,EAClB,4BAAA,GAA+B,IAAA;AAAA,EAC/B,0BAAA,GAA6B,KAAA;AAAA,EAC7B,eAAA,GAA+C,EAAE,KAAA,EAAO,SAAA,EAAW,WAAW,MAAA,EAAO;AAAA,EACrF,SAAA,GAAkD,IAAA;AAAA,EAClD,cAAA,GAAuD,IAAA;AAAA,EACvD,WAAA,GAAkC,IAAA;AAAA,EAClC,oBAAA,GAAuB,CAAA;AAAA,EAE/B,WAAA,CAAY,OAAA,GAAqC,EAAC,EAAG;AACnD,IAAA,IAAA,CAAK,aAAa,aAAA,CAAc,OAAA,CAAQ,UAAU,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AACrE,IAAA,IAAA,CAAK,MAAA,GAAS,OAAA,CAAQ,MAAA,EAAQ,IAAA,MAAU,gBAAA,EAAiB;AACzD,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,EAAY,IAAA,KAAS,OAAA,CAAQ,UAAA,CAAW,MAAK,GAAI,IAAA;AAC3E,IAAA,MAAM,mBAAmB,OAAA,CAAQ,MAAA,EAAQ,IAAA,EAAK,IAAK,kBAAiB,IAAK,IAAA;AACzE,IAAA,IAAA,CAAK,SAAS,gBAAA,IAAoB,YAAA;AAClC,IAAA,IAAA,CAAK,cAAA,GAAiB,gBAAA;AACtB,IAAA,IAAA,CAAK,kBAAkB,OAAA,CAAQ,eAAA;AAE/B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,KAAK,UAAA,EAAY;AACpC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAA,IAAA,CAAM,OAAA,CAAQ,SAAA,IAAa,CAAA,IAAK,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,GAAI,GAAA;AAClH,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,UAAU,CAAA,IAAA,CAAM,OAAA,CAAQ,UAAA,IAAc,CAAA,KAAM,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,GAAI,CAAA;AACvH,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAA,IAAA,CAAM,OAAA,CAAQ,SAAA,IAAa,CAAA,IAAK,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,GAAI,GAAA;AAClH,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,MAAM,CAAA,IAAA,CAAM,OAAA,CAAQ,MAAA,IAAU,CAAA,KAAM,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,GAAI,IAAA;AAEvG,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,UAAU,CAAA,IAAA,CAAM,OAAA,CAAQ,UAAA,IAAc,CAAA,IAAK,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,GAAI,oBAAA;AACtH,IAAA,MAAM,oBAAA,GACJ,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,UAAU,CAAA,IAAA,CAAM,OAAA,CAAQ,UAAA,IAAc,CAAA,IAAK,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,GAAI,oBAAA;AACtG,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,oBAAA,EAAsB,KAAK,UAAU,CAAA;AAEhE,IAAA,IAAA,CAAK,kBAAkB,OAAA,CAAQ,eAAA;AAC/B,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAExB,IAAA,IAAA,CAAK,eAAA,GAAkB,OAAA,CAAQ,QAAA,EAAU,OAAA,IAAW,IAAA;AACpD,IAAA,MAAM,2BAAA,GAA8B,MAAA,CAAO,OAAA,CAAQ,QAAA,EAAU,qBAAqB,GAAG,CAAA;AACrF,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,2BAA2B,CAAA,IAAK,gCAAgC,CAAA,EAAG;AACrF,MAAA,IAAA,CAAK,sBAAA,GAAyB,KAAA;AAC9B,MAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,sBAAA,GAAyB,IAAA;AAC9B,MAAA,IAAA,CAAK,oBACH,MAAA,CAAO,QAAA,CAAS,2BAA2B,CAAA,IAAK,2BAAA,GAA8B,IAC1E,2BAAA,GACA,IAAA;AAAA,IACR;AACA,IAAA,IAAA,CAAK,eAAA,GAAkB,OAAA,CAAQ,QAAA,EAAU,OAAA,IAAW,oBAAA;AACpD,IAAA,IAAA,CAAK,4BAAA,GAA+B,OAAA,CAAQ,QAAA,EAAU,oBAAA,IAAwB,IAAA;AAE9E,IAAA,IAAA,CAAK,cAAA,CAAe,QAAQ,SAAS,CAAA;AACrC,IAAA,IAAA,CAAK,qBAAA,GAAwB,KAAK,mBAAA,EAAoB;AAEtD,IAAA,IAAI,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,MAAA,EAAQ;AACvC,MAAA,IAAA,CAAK,uBAAA,EAAwB;AAC7B,MAAA,IAAI,KAAK,4BAAA,IAAgC,OAAO,aAAa,WAAA,IAAe,QAAA,CAAS,oBAAoB,QAAA,EAAU;AACjH,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,aAAA,EAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEiB,yBAAyB,MAAY;AACpD,IAAA,IAAI,CAAC,IAAA,CAAK,4BAAA,IAAgC,OAAO,aAAa,WAAA,EAAa;AAE3E,IAAA,QAAA,CAAS,oBAAA,EAAsB;AAAA,MAC7B,iBAAiB,QAAA,CAAS,eAAA;AAAA,MAC1B,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,cAAA,EAAgB,OAAA,CAAQ,IAAA,CAAK,WAAW;AAAA,KACzC,CAAA;AAED,IAAA,IAAI,QAAA,CAAS,oBAAoB,QAAA,EAAU;AACzC,MAAA,IAAA,CAAK,YAAA,CAAa,EAAE,eAAA,EAAiB,IAAA,EAAM,CAAA;AAC3C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,eAAA,IAAmB,IAAA,CAAK,MAAA,IAAU,CAAC,KAAK,WAAA,EAAa;AAC5D,MAAA,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AAAA,EAEQ,uBAAA,GAAgC;AACtC,IAAA,IAAI,CAAC,IAAA,CAAK,4BAAA,IAAgC,KAAK,0BAAA,IAA8B,OAAO,aAAa,WAAA,EAAa;AAC9G,IAAA,QAAA,CAAS,gBAAA,CAAiB,kBAAA,EAAoB,IAAA,CAAK,sBAAsB,CAAA;AACzE,IAAA,IAAA,CAAK,0BAAA,GAA6B,IAAA;AAAA,EACpC;AAAA,EAEQ,uBAAA,GAAgC;AACtC,IAAA,IAAI,CAAC,IAAA,CAAK,0BAAA,IAA8B,OAAO,aAAa,WAAA,EAAa;AACzE,IAAA,QAAA,CAAS,mBAAA,CAAoB,kBAAA,EAAoB,IAAA,CAAK,sBAAsB,CAAA;AAC5E,IAAA,IAAA,CAAK,0BAAA,GAA6B,KAAA;AAAA,EACpC;AAAA,EAEQ,YAAY,OAAA,EAAyB;AAC3C,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAAA,EAClC;AAAA,EAEQ,cAAc,KAAA,EAAkD;AACtE,IAAA,MAAM,OAAO,KAAA,CAAM,EAAA,IAAM,KAAA,CAAM,GAAA,IAAO,IAAI,IAAA,EAAK;AAC/C,IAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,2DAA2D,CAAA;AACrF,IAAA,OAAO;AAAA,MACL,GAAA;AAAA,MACA,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,MAAA,EAAQ,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,MAAA;AAAA,MAC5B,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,SAAS,KAAA,CAAM;AAAA,KACjB;AAAA,EACF;AAAA,EAEQ,0BAAA,GAA6D;AACnE,IAAA,MAAM,SAAA,GAAY,KAAK,eAAA,IAAkB;AACzC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAI;AACF,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA;AACnD,QAAA,IAAA,CAAK,QAAA,GAAW,cAAA;AAChB,QAAA,OAAO,SAAA;AAAA,MACT,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAK,QAAA,CAAS,GAAA;AAAA,MAClB,KAAA,EAAO,KAAK,QAAA,CAAS,KAAA;AAAA,MACrB,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,MACpB,OAAA,EAAS,KAAK,QAAA,CAAS,OAAA;AAAA,MACvB,IAAA,EAAM,KAAK,QAAA,CAAS,MAAA;AAAA,MACpB,OAAA,EAAS,KAAK,QAAA,CAAS,OAAA;AAAA,MACvB,OAAA,EAAS,KAAK,QAAA,CAAS;AAAA,KACzB;AAAA,EACF;AAAA,EAEQ,mBAAA,GAA+C;AACrD,IAAA,MAAM,SAAA,GAAY,KAAK,0BAAA,EAA2B;AAClD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAI;AACF,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA;AACnD,QAAA,IAAA,CAAK,QAAA,GAAW,cAAA;AAChB,QAAA,OAAO,cAAA;AAAA,MACT,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEQ,uBAAA,GAAkF;AACxF,IAAA,MAAM,mBAAA,GAAsB,KAAK,0BAAA,EAA2B;AAC5D,IAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,aAAA,GAAgB,+BAA+B,mBAAmB,CAAA;AACxE,IAAA,OAAO;AAAA,MACL,eAAA,EAAiB,eAAA,CAAgB,IAAA,CAAK,SAAA,CAAU,aAAa,CAAC,CAAA;AAAA,MAC9D,iBAAiB,aAAA,CAAc;AAAA,KACjC;AAAA,EACF;AAAA,EAEA,MAAc,gBAAA,GAA2C;AACvD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,OAAO,UAAU,UAAA,EAAY;AAC/C,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,EAAE,eAAA,EAAiB,eAAA,EAAgB,GAAI,KAAK,uBAAA,EAAwB;AAE1E,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,wBAAA,CAAA,EAA4B;AAAA,QACzE,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,0BAA0B,IAAA,CAAK;AAAA,SACjC;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,cAAA,EAAgB,KAAK,cAAA,IAAkB,KAAA,CAAA;AAAA,UACvC,eAAA;AAAA,UACA;AAAA,SACD;AAAA,OACF,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,OAAA,GAAW,MAAM,QAAA,CAAS,IAAA,EAAK;AACrC,MAAA,OAAO,OAAO,QAAQ,GAAA,KAAQ,QAAA,IAAY,QAAQ,GAAA,CAAI,IAAA,EAAK,GAAI,OAAA,CAAQ,GAAA,GAAM,IAAA;AAAA,IAC/E,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,IAAA,CAA+C,OAAU,OAAA,EAA4C;AAC3G,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,EAAG;AAC5C,MAAA,QAAA,CAAS,OAAO,CAAA;AAAA,IAClB;AAAA,EACF;AAAA,EAEQ,oBAAoB,KAAA,EAA0C;AACpE,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,IAAA,IAAA,CAAK,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAAA,EACpC;AAAA,EAEA,EAAA,CACE,OACA,QAAA,EACY;AACZ,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,CAAE,GAAA,CAAI,QAAQ,CAAA;AAClC,IAAA,IAAI,UAAU,iBAAA,EAAmB;AAC/B,MAAC,QAAA,CAA4D,KAAK,eAAe,CAAA;AAAA,IACnF;AACA,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,CAAE,MAAA,CAAO,QAAQ,CAAA;AAAA,IACvC,CAAA;AAAA,EACF;AAAA,EAEA,iBAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,eAAA,IAAmB,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AAAA,EACpD;AAAA,EAEQ,UAAA,CAAW,UAAA,EAAoC,KAAA,EAAe,IAAA,EAAqC;AACzG,IAAA,IAAA,CAAK,QAAA,GAAW,UAAA,EAAY,KAAA,EAAO,IAAI,CAAA;AAAA,EACzC;AAAA,EAEA,MAAc,sBAAA,GAAwC;AACpD,IAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AACjC,IAAA,MAAM,IAAA,CAAK,qBAAA;AAAA,EACb;AAAA,EAEA,MAAc,mBAAA,GAAqC;AACjD,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,KAAK,MAAM,CAAA;AAC5D,MAAA,IAAI,CAAC,QAAA,EAAU;AACf,MAAA,IAAA,CAAK,WAAW,IAAA,CAAK,GAAA,CAAI,KAAK,QAAA,EAAU,QAAA,CAAS,YAAY,CAAC,CAAA;AAC9D,MAAA,KAAA,MAAW,aAAA,IAAiB,QAAA,CAAS,YAAA,IAAgB,EAAC,EAAG;AACvD,QAAA,IAAA,CAAK,YAAA,CAAa,IAAI,aAAa,CAAA;AAAA,MACrC;AAEA,MAAA,KAAA,MAAW,CAAC,OAAA,EAAS,IAAI,CAAA,IAAK,MAAA,CAAO,QAAQ,QAAA,CAAS,KAAA,IAAS,EAAE,CAAA,EAAG;AAClE,QAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,IAAA,CAAK,WAAA,CAAY,OAAO,CAAC,CAAA;AACzD,QAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,WAAA,EAAa;AACjD,QAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA,EAAG;AAAA,UACxC,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,OAAA;AAAA,UACA,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAAA,UACzB,WAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,IAAK,KAAK,GAAA,EAAI;AAAA,UAC9C,SAAS,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,IAAK,KAAK,GAAA,EAAI;AAAA,UAC1C,WAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,IAAK,KAAK,GAAA,EAAI;AAAA,UAC9C,MAAA,EAAQ,KAAK,MAAA,IAAU,YAAA;AAAA,UACvB,QAAA,EAAU,KAAK,QAAA,IAAY;AAAA,SAC5B,CAAA;AAAA,MACH;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,MAAc,YAAA,GAA8B;AAC1C,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AAC3B,IAAA,MAAM,QAAA,GAA2C;AAAA,MAC/C,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,YAAA,EAAc,CAAC,GAAG,IAAA,CAAK,YAAY,CAAA;AAAA,MACnC,OAAO;AAAC,KACV;AAEA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,KAAK,IAAA,CAAK,KAAA,CAAM,SAAQ,EAAG;AAC9C,MAAA,IAAI,CAAC,GAAA,CAAI,UAAA,CAAW,GAAG,IAAA,CAAK,MAAM,GAAG,CAAA,EAAG;AACxC,MAAA,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA,GAAI;AAAA,QAC7B,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,UAAU,IAAA,CAAK;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAA,CAAK,QAAQ,QAAQ,CAAA;AAAA,IACvD,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEQ,eAAA,CAAgB,EAAA,GAAK,IAAA,CAAK,GAAA,EAAI,EAA2D;AAC/F,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,EAAA;AAAA,MACX,OAAA,EAAS,KAAK,IAAA,CAAK,UAAA;AAAA,MACnB,SAAA,EAAW,KAAK,IAAA,CAAK;AAAA,KACvB;AAAA,EACF;AAAA,EAEQ,YAAA,CACN,OAAA,EACA,KAAA,EACA,MAAA,EACA,QAAA,GAAW,KAAK,QAAA,EAChB,EAAA,GAAK,IAAA,CAAK,GAAA,EAAI,EACR;AACN,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA,EAAG;AAAA,MACxC,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,GAAG,IAAA,CAAK,eAAA,CAAgB,EAAE;AAAA,KAC3B,CAAA;AAAA,EACH;AAAA,EAEQ,eAAe,SAAA,EAAgD;AACrE,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,GAAA,CAAI,KAAK,QAAA,EAAU,SAAA,CAAU,YAAY,CAAC,CAAA;AAC/D,IAAA,KAAA,MAAW,aAAA,IAAiB,SAAA,CAAU,YAAA,IAAgB,EAAC,EAAG;AACxD,MAAA,IAAA,CAAK,YAAA,CAAa,IAAI,aAAa,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,KAAA,GAAQ,CAAC,OAAA,EAAiB,KAAA,EAAgB,UAAmB,SAAA,KAAuB;AACxF,MAAA,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,KAAA,EAAO,WAAA,EAAa,QAAA,IAAY,KAAK,QAAA,EAAU,SAAA,IAAa,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,IACnG,CAAA;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAA,EAAG;AAClC,MAAA,KAAA,MAAW,IAAA,IAAQ,UAAU,KAAA,EAAO;AAClC,QAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,CAAK,QAAQ,QAAA,EAAU;AAC3C,QAAA,KAAA,CAAM,IAAA,CAAK,KAAK,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,SAAS,CAAA;AAAA,MACpE;AACA,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,KAAK,CAAA,IAAK,MAAA,CAAO,QAAQ,SAAA,CAAU,KAAA,IAAS,EAAE,CAAA,EAAG;AACpE,MAAA,KAAA,CAAM,OAAA,EAAS,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA,EAEQ,aAAA,CAAc,IAAA,EAA6B,GAAA,GAAM,IAAA,CAAK,KAAI,EAA8C;AAC9G,IAAA,IAAI,CAAC,MAAM,OAAO,SAAA;AAClB,IAAA,IAAI,GAAA,IAAO,IAAA,CAAK,OAAA,EAAS,OAAO,OAAA;AAChC,IAAA,IAAI,GAAA,IAAO,IAAA,CAAK,SAAA,EAAW,OAAO,OAAA;AAClC,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEQ,eAAA,CAAgB,MAAA,EAAiB,MAAA,GAAS,EAAA,EAAU;AAC1D,IAAA,IAAI,IAAA,CAAK,gBAAgB,MAAA,EAAQ;AACjC,IAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AACnB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK,KAAK,aAAA,EAAe,EAAE,QAAQ,IAAA,CAAK,MAAA,EAAQ,QAAQ,CAAA;AACxD,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,KAAK,cAAA,EAAgB,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,EACnD;AAAA,EAEA,MAAc,cAAA,CAAe,GAAA,EAAa,IAAA,EAAmB,SAAA,EAAkC;AAC7F,IAAA,IAAI,SAAA,GAAqB,IAAA;AAEzB,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,IAAA,CAAK,YAAY,OAAA,EAAA,EAAW;AAC3D,MAAA,MAAM,KAAK,OAAO,eAAA,KAAoB,WAAA,GAAc,IAAI,iBAAgB,GAAI,IAAA;AAC5E,MAAA,MAAM,OAAA,GACJ,EAAA,KAAO,IAAA,GACH,UAAA,CAAW,MAAM;AACf,QAAA,EAAA,CAAG,KAAA,EAAM;AAAA,MACX,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,GACjB,IAAA;AAEN,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,UAChC,GAAG,IAAA;AAAA,UACH,QAAQ,EAAA,EAAI;AAAA,SACb,CAAA;AAED,QAAA,IAAI,OAAA,eAAsB,OAAO,CAAA;AAEjC,QAAA,IAAI,CAAC,SAAS,EAAA,IAAM,iBAAA,CAAkB,SAAS,MAAM,CAAA,IAAK,OAAA,GAAU,IAAA,CAAK,UAAA,EAAY;AACnF,UAAA,SAAA,GAAY,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAC/C,UAAA,MAAM,eAAe,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,MAAA,GAAS,KAAK,MAAA,EAAO;AAChE,UAAA,MAAM,KAAA,CAAM,IAAA,CAAK,SAAA,IAAa,OAAA,GAAU,KAAK,YAAY,CAAA;AACzD,UAAA;AAAA,QACF;AAEA,QAAA,OAAO,QAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,OAAA,eAAsB,OAAO,CAAA;AACjC,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA,IAAI,OAAA,IAAW,KAAK,UAAA,EAAY;AAChC,QAAA,MAAM,eAAe,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,MAAA,GAAS,KAAK,MAAA,EAAO;AAChE,QAAA,MAAM,KAAA,CAAM,IAAA,CAAK,SAAA,IAAa,OAAA,GAAU,KAAK,YAAY,CAAA;AAAA,MAC3D;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,eAAA,CAAgB,MAAM,SAAS,CAAA;AACpC,IAAA,MAAM,SAAA;AAAA,EACR;AAAA,EAEQ,kBAAA,GAA6D;AACnE,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,QAAgD,EAAC;AAEvD,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,IAAI,KAAK,IAAA,CAAK,KAAA,CAAM,SAAQ,EAAG;AACnD,MAAA,IAAI,CAAC,QAAA,CAAS,UAAA,CAAW,GAAG,IAAA,CAAK,MAAM,GAAG,CAAA,EAAG;AAC7C,MAAA,IAAI,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA,EAAG;AACvC,QAAA,KAAA,CAAM,KAAK,EAAE,GAAA,EAAK,KAAK,OAAA,EAAS,KAAA,EAAO,OAAO,CAAA;AAC9C,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,IAAA,EAAM,GAAG,CAAA;AAC1C,MAAA,IAAI,KAAA,KAAU,SAAA,IAAa,KAAA,KAAU,SAAA,EAAW;AAChD,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,GAAA,EAAK,IAAA,CAAK,SAAS,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AAAA,IACrD;AAEA,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,GAAA,CAAI,aAAA,CAAc,CAAA,CAAE,GAAG,CAAC,CAAA;AAAA,EACxD;AAAA,EAEA,cAAA,GAGE;AACA,IAAA,MAAM,KAAA,GAAQ,KAAK,kBAAA,EAAmB;AACtC,IAAA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,CAAM,SAAS,CAAA,EAAE;AAAA,EAC5C;AAAA,EAEA,mBAAmB,OAAA,EAAwD;AACzE,IAAA,OAAO,KAAK,WAAA,CAAY,GAAA,CAAI,KAAK,WAAA,CAAY,OAAO,CAAC,CAAA,IAAK,IAAA;AAAA,EAC5D;AAAA,EAEA,aAAA,CAAc,SAAiB,OAAA,EAAwB;AACrD,IAAA,MAAM,UAAU,YAAA,EAAa;AAC7B,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,YAAA,CAAa,IAAI,OAAO,CAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,YAAA,CAAa,OAAO,OAAO,CAAA;AAAA,IAClC;AACA,IAAA,MAAM,OAAA,GAAU,cAAa,GAAI,OAAA;AACjC,IAAA,IAAA,CAAK,UAAA,CAAW,kCAAkC,OAAA,EAAS;AAAA,MACzD,KAAK,IAAA,CAAK,MAAA;AAAA,MACV,MAAA,EAAQ,UAAU,SAAA,GAAY;AAAA,KAC/B,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,CAAK,UAAU,EAAE,WAAA,EAAa,CAAC,OAAO,CAAA,EAAG,MAAA,EAAQ,UAAA,EAAY,CAAA;AAClE,IAAA,KAAK,KAAK,YAAA,EAAa;AAAA,EACzB;AAAA,EAEA,MAAc,oBAAA,CACZ,OAAA,EACA,cAAA,EACA,YAAA,EACyB;AACzB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,GAClB,MAAM,IAAA,CAAK,cAAA;AAAA,MACT,CAAA,EAAG,KAAK,UAAU,CAAA,gBAAA,CAAA;AAAA,MAClB;AAAA,QACE,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,0BAA0B,IAAA,CAAK;AAAA,SACjC;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,OAAA;AAAA,UACA,IAAA,EAAM,cAAA;AAAA,UACN,YAAA;AAAA,UACA,cAAA,EAAgB,KAAK,cAAA,IAAkB;AAAA,SACxC;AAAA,OACH;AAAA,MACA;AAAA,KACF,GACA,MAAM,IAAA,CAAK,cAAA;AAAA,MACT,CAAA,EAAG,KAAK,UAAU,CAAA,YAAA,CAAA;AAAA,MAClB;AAAA,QACE,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,OAAA;AAAA,UACA,IAAA,EAAM,cAAA;AAAA,UACN;AAAA,SACD;AAAA,OACH;AAAA,MACA;AAAA,KACF;AAEJ,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,IAAI,CAAC,iBAAA,CAAkB,QAAA,CAAS,MAAM,CAAA,EAAG;AACvC,QAAA,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,MACtD;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,MAAM,QAAQ,OAAO,IAAA,CAAK,KAAA,KAAU,SAAA,GAAY,KAAK,KAAA,GAAQ,YAAA;AAE7D,IAAA,IAAI,IAAA,CAAK,eAAe,IAAA,EAAM;AAC5B,MAAA,IAAA,CAAK,YAAA,CAAa,IAAI,OAAO,CAAA;AAAA,IAC/B;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA;AACvC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,UAAU,QAAQ,CAAA;AAChD,IAAA,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,QAAQ,CAAA;AACrD,IAAA,IAAA,CAAK,gBAAgB,KAAK,CAAA;AAC1B,IAAA,KAAK,KAAK,YAAA,EAAa;AACvB,IAAA,IAAA,CAAK,IAAA,CAAK,UAAU,EAAE,WAAA,EAAa,CAAC,OAAO,CAAA,EAAG,MAAA,EAAQ,SAAA,EAAW,CAAA;AACjE,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAc,qBAAA,CACZ,cAAA,EACA,YAAA,EACA,WACA,IAAA,EACwD;AACxD,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAU,YAAA,EAAa;AAE7B,IAAA,QAAA,CAAS,gBAAA,EAAkB;AAAA,MACzB,SAAA;AAAA,MACA,sBAAA,EAAwB,OAAA,CAAQ,IAAA,EAAM,sBAAsB,CAAA;AAAA,MAC5D,SAAS,cAAA,CAAe,GAAA;AAAA,MACxB;AAAA,KACD,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,cAAA;AAAA,QAC1B,CAAA,EAAG,KAAK,UAAU,CAAA,iBAAA,CAAA;AAAA,QAClB;AAAA,UACE,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,cAAA,EAAgB,kBAAA;AAAA,YAChB,0BAA0B,IAAA,CAAK;AAAA,WACjC;AAAA,UACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,IAAA,EAAM,cAAA;AAAA,YACN,YAAA;AAAA,YACA,cAAA,EAAgB,KAAK,cAAA,IAAkB,KAAA;AAAA,WACxC;AAAA,SACH;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,IAAI,CAAC,iBAAA,CAAkB,QAAA,CAAS,MAAM,CAAA,EAAG;AACvC,UAAA,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,QACtD;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAOlC,MAAA,MAAM,IAAA,GAAO,iBAAiB,IAAI,CAAA;AAClC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA;AACvC,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,UAAU,QAAQ,CAAA;AAEhD,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,YAAY,CAAA,EAAG;AACpC,QAAA,KAAA,MAAW,GAAA,IAAO,KAAK,YAAA,EAAc;AACnC,UAAA,IAAA,CAAK,YAAA,CAAa,IAAI,GAAG,CAAA;AAAA,QAC3B;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,MAAA,KAAA,MAAW,SAAS,IAAA,EAAM;AACxB,QAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CAAM,GAAA,CAAI,KAAK,WAAA,CAAY,KAAA,CAAM,GAAG,CAAC,CAAA;AAC3D,QAAA,IAAI,CAAC,YAAY,QAAA,CAAS,KAAA,KAAU,MAAM,KAAA,IAAS,QAAA,CAAS,aAAa,QAAA,EAAU;AACjF,UAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,GAAG,CAAA;AAAA,QACvB;AACA,QAAA,IAAA,CAAK,aAAa,KAAA,CAAM,GAAA,EAAK,KAAA,CAAM,KAAA,EAAO,WAAW,QAAQ,CAAA;AAAA,MAC/D;AAEA,MAAA,IAAI,IAAA,EAAM,sBAAA,IAA0B,IAAA,KAAS,IAAA,EAAM;AACjD,QAAA,IAAA,CAAK,KAAK,QAAA,EAAU;AAAA,UAClB,aAAa,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,GAAG,CAAA;AAAA,UAClC,MAAA,EAAQ,UAAA;AAAA,UACR,kBAAA,EAAoB;AAAA,SACrB,CAAA;AAAA,MACH,CAAA,MAAA,IAAW,OAAA,CAAQ,IAAA,GAAO,CAAA,EAAG;AAC3B,QAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,EAAE,WAAA,EAAa,CAAC,GAAG,OAAO,CAAA,EAAG,MAAA,EAAQ,SAAA,EAAW,CAAA;AAAA,MACtE;AAEA,MAAA,IAAA,CAAK,gBAAgB,KAAK,CAAA;AAC1B,MAAA,KAAK,KAAK,YAAA,EAAa;AACvB,MAAA,IAAA,CAAK,UAAA,CAAW,0BAAA,EAA4B,YAAA,EAAa,GAAI,OAAA,EAAS;AAAA,QACpE,KAAK,IAAA,CAAK,MAAA;AAAA,QACV;AAAA,OACD,CAAA;AACD,MAAA,QAAA,CAAS,eAAA,EAAiB;AAAA,QACxB,SAAA;AAAA,QACA,sBAAA,EAAwB,OAAA,CAAQ,IAAA,EAAM,sBAAsB,CAAA;AAAA,QAC5D,YAAY,IAAA,CAAK,MAAA;AAAA,QACjB;AAAA,OACD,CAAA;AACD,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,UAAA,CAAW,0BAAA,EAA4B,YAAA,EAAa,GAAI,OAAA,EAAS;AAAA,QACpE,KAAK,IAAA,CAAK,MAAA;AAAA,QACV,SAAA;AAAA,QACA,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,QAAA,CAAS,oBAAA,EAAsB;AAAA,QAC7B,SAAA;AAAA,QACA,sBAAA,EAAwB,OAAA,CAAQ,IAAA,EAAM,sBAAsB;AAAA,OAC7D,CAAA;AACD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,UAAA,CACN,cAAA,EACA,YAAA,EACA,IAAA,EACwD;AACxD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,KAAK,MAAM,CAAA;AACxD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI,MAAM,sBAAA,EAAwB;AAChC,QAAA,KAAK,QAAA,CAAS,IAAA,CAAK,CAAC,IAAA,KAAS;AAC3B,UAAA,IAAI,SAAS,IAAA,EAAM;AACjB,YAAA,IAAA,CAAK,KAAK,QAAA,EAAU;AAAA,cAClB,aAAa,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,GAAG,CAAA;AAAA,cAClC,MAAA,EAAQ,UAAA;AAAA,cACR,kBAAA,EAAoB;AAAA,aACrB,CAAA;AAAA,UACH;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AACA,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAA,GAAU,KAAK,qBAAA,CAAsB,cAAA,EAAgB,cAAc,SAAA,EAAW,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAM;AACtG,MAAA,IAAA,CAAK,kBAAA,CAAmB,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,IAC5C,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA;AAChD,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,QAAA,CACJ,OAAA,EACA,IAAA,EACA,eAAe,KAAA,EACwB;AACvC,IAAA,MAAM,UAAU,YAAA,EAAa;AAC7B,IAAA,MAAM,KAAK,sBAAA,EAAuB;AAElC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AAC9C,IAAA,IAAA,CAAK,QAAA,GAAW,cAAA;AAChB,IAAA,IAAA,CAAK,gBAAA,GAAmB,YAAA;AAExB,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA,EAAG;AAClC,MAAA,MAAMA,SAAAA,GAA2C;AAAA,QAC/C,MAAA,EAAQ,aAAA;AAAA,QACR,OAAA,EAAS,KAAA;AAAA,QACT,SAAA,EAAW,cAAa,GAAI,OAAA;AAAA,QAC5B,MAAA,EAAQ;AAAA,OACV;AACA,MAAA,IAAA,CAAK,UAAA,CAAW,oBAAA,EAAsBA,SAAAA,CAAS,SAAA,EAAW;AAAA,QACxD,KAAK,IAAA,CAAK,MAAA;AAAA,QACV,QAAQA,SAAAA,CAAS,MAAA;AAAA,QACjB,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,IAAA,CAAK,YAAY,GAAA,CAAI,IAAA,CAAK,WAAA,CAAY,OAAO,GAAGA,SAAQ,CAAA;AACxD,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,QAAA,EAAAA,SAAAA,EAAS;AAAA,IAClC;AAEA,IAAA,MAAM,YAAY,IAAA,CAAK,KAAA,CAAM,IAAI,IAAA,CAAK,WAAA,CAAY,OAAO,CAAC,CAAA;AAC1D,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA;AAE/C,IAAA,IAAI,SAAA,IAAa,eAAe,OAAA,EAAS;AACvC,MAAA,MAAMA,SAAAA,GAA2C;AAAA,QAC/C,QAAQ,SAAA,CAAU,MAAA,KAAW,eAAe,SAAA,CAAU,MAAA,KAAW,eAAe,WAAA,GAAc,aAAA;AAAA,QAC9F,OAAA,EAAS,KAAA;AAAA,QACT,SAAA,EAAW,cAAa,GAAI,OAAA;AAAA,QAC5B,QAAQ,SAAA,CAAU,MAAA;AAAA,QAClB,WAAW,SAAA,CAAU,SAAA;AAAA,QACrB,SAAS,SAAA,CAAU,OAAA;AAAA,QACnB,WAAW,SAAA,CAAU;AAAA,OACvB;AACA,MAAA,IAAA,CAAK,UAAA,CAAW,oBAAA,EAAsB,CAAA,EAAG,EAAE,GAAA,EAAK,KAAK,MAAA,EAAQ,MAAA,EAAQA,SAAAA,CAAS,MAAA,EAAQ,CAAA;AACtF,MAAA,IAAA,CAAK,UAAA,CAAW,oBAAA,EAAsBA,SAAAA,CAAS,SAAA,EAAW;AAAA,QACxD,KAAK,IAAA,CAAK,MAAA;AAAA,QACV,QAAQA,SAAAA,CAAS,MAAA;AAAA,QACjB,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,IAAA,CAAK,YAAY,GAAA,CAAI,IAAA,CAAK,WAAA,CAAY,OAAO,GAAGA,SAAQ,CAAA;AACxD,MAAA,OAAO,EAAE,KAAA,EAAO,SAAA,CAAU,KAAA,EAAO,UAAAA,SAAAA,EAAS;AAAA,IAC5C;AAEA,IAAA,IAAI,SAAA,IAAa,eAAe,OAAA,EAAS;AACvC,MAAA,KAAK,IAAA,CAAK,UAAA,CAAW,cAAA,EAAgB,YAAY,CAAA;AACjD,MAAA,MAAMA,SAAAA,GAA2C;AAAA,QAC/C,MAAA,EAAQ,aAAA;AAAA,QACR,OAAA,EAAS,IAAA;AAAA,QACT,SAAA,EAAW,cAAa,GAAI,OAAA;AAAA,QAC5B,QAAQ,SAAA,CAAU,MAAA;AAAA,QAClB,WAAW,SAAA,CAAU,SAAA;AAAA,QACrB,SAAS,SAAA,CAAU,OAAA;AAAA,QACnB,WAAW,SAAA,CAAU;AAAA,OACvB;AACA,MAAA,IAAA,CAAK,UAAA,CAAW,oBAAA,EAAsB,CAAA,EAAG,EAAE,GAAA,EAAK,KAAK,MAAA,EAAQ,MAAA,EAAQA,SAAAA,CAAS,MAAA,EAAQ,CAAA;AACtF,MAAA,IAAA,CAAK,UAAA,CAAW,oBAAA,EAAsBA,SAAAA,CAAS,SAAA,EAAW;AAAA,QACxD,KAAK,IAAA,CAAK,MAAA;AAAA,QACV,QAAQA,SAAAA,CAAS,MAAA;AAAA,QACjB,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,IAAA,CAAK,YAAY,GAAA,CAAI,IAAA,CAAK,WAAA,CAAY,OAAO,GAAGA,SAAQ,CAAA;AACxD,MAAA,OAAO,EAAE,KAAA,EAAO,SAAA,CAAU,KAAA,EAAO,UAAAA,SAAAA,EAAS;AAAA,IAC5C;AAEA,IAAA,IAAI,cAAc,SAAA,CAAU,MAAA,KAAW,WAAA,IAAe,SAAA,CAAU,WAAW,YAAA,CAAA,EAAe;AACxF,MAAA,KAAK,IAAA,CAAK,UAAA,CAAW,cAAA,EAAgB,YAAY,CAAA;AACjD,MAAA,MAAMA,SAAAA,GAA2C;AAAA,QAC/C,MAAA,EAAQ,WAAA;AAAA,QACR,OAAA,EAAS,IAAA;AAAA,QACT,SAAA,EAAW,cAAa,GAAI,OAAA;AAAA,QAC5B,QAAQ,SAAA,CAAU,MAAA;AAAA,QAClB,WAAW,SAAA,CAAU,SAAA;AAAA,QACrB,SAAS,SAAA,CAAU,OAAA;AAAA,QACnB,WAAW,SAAA,CAAU;AAAA,OACvB;AACA,MAAA,IAAA,CAAK,UAAA,CAAW,oBAAA,EAAsB,CAAA,EAAG,EAAE,GAAA,EAAK,KAAK,MAAA,EAAQ,MAAA,EAAQA,SAAAA,CAAS,MAAA,EAAQ,CAAA;AACtF,MAAA,IAAA,CAAK,UAAA,CAAW,oBAAA,EAAsBA,SAAAA,CAAS,SAAA,EAAW;AAAA,QACxD,KAAK,IAAA,CAAK,MAAA;AAAA,QACV,QAAQA,SAAAA,CAAS,MAAA;AAAA,QACjB,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,IAAA,CAAK,YAAY,GAAA,CAAI,IAAA,CAAK,WAAA,CAAY,OAAO,GAAGA,SAAQ,CAAA;AACxD,MAAA,OAAO,EAAE,KAAA,EAAO,SAAA,CAAU,KAAA,EAAO,UAAAA,SAAAA,EAAS;AAAA,IAC5C;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,eAAe,MAAM,IAAA,CAAK,oBAAA,CAAqB,OAAA,EAAS,gBAAgB,YAAY,CAAA;AAC1F,MAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,QAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,IAAA,CAAK,WAAA,CAAY,OAAO,CAAC,CAAA;AACrD,QAAA,MAAMA,SAAAA,GAA2C;AAAA,UAC/C,MAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAS,KAAA;AAAA,UACT,SAAA,EAAW,cAAa,GAAI,OAAA;AAAA,UAC5B,MAAA,EAAQ,SAAA;AAAA,UACR,WAAW,IAAA,EAAM,SAAA;AAAA,UACjB,SAAS,IAAA,EAAM,OAAA;AAAA,UACf,WAAW,IAAA,EAAM;AAAA,SACnB;AACA,QAAA,IAAA,CAAK,UAAA,CAAW,oBAAA,EAAsB,CAAA,EAAG,EAAE,GAAA,EAAK,KAAK,MAAA,EAAQ,MAAA,EAAQA,SAAAA,CAAS,MAAA,EAAQ,CAAA;AACtF,QAAA,IAAA,CAAK,UAAA,CAAW,oBAAA,EAAsBA,SAAAA,CAAS,SAAA,EAAW;AAAA,UACxD,KAAK,IAAA,CAAK,MAAA;AAAA,UACV,QAAQA,SAAAA,CAAS,MAAA;AAAA,UACjB,MAAA,EAAQ;AAAA,SACT,CAAA;AACD,QAAA,IAAA,CAAK,YAAY,GAAA,CAAI,IAAA,CAAK,WAAA,CAAY,OAAO,GAAGA,SAAQ,CAAA;AACxD,QAAA,OAAO,EAAE,KAAA,EAAO,YAAA,EAAc,QAAA,EAAAA,SAAAA,EAAS;AAAA,MACzC;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,MAAM,QAAA,GAA2C;AAAA,MAC/C,MAAA,EAAQ,SAAA;AAAA,MACR,OAAA,EAAS,KAAA;AAAA,MACT,SAAA,EAAW,cAAa,GAAI,OAAA;AAAA,MAC5B,MAAA,EAAQ;AAAA,KACV;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,oBAAA,EAAsB,CAAA,EAAG,EAAE,GAAA,EAAK,KAAK,MAAA,EAAQ,MAAA,EAAQ,QAAA,CAAS,MAAA,EAAQ,CAAA;AACtF,IAAA,IAAA,CAAK,UAAA,CAAW,oBAAA,EAAsB,QAAA,CAAS,SAAA,EAAW;AAAA,MACxD,KAAK,IAAA,CAAK,MAAA;AAAA,MACV,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,IAAA,CAAK,YAAY,GAAA,CAAI,IAAA,CAAK,WAAA,CAAY,OAAO,GAAG,QAAQ,CAAA;AACxD,IAAA,OAAO,EAAE,KAAA,EAAO,YAAA,EAAc,QAAA,EAAS;AAAA,EACzC;AAAA,EAEA,MAAM,IAAA,CAAK,OAAA,EAAiB,IAAA,EAA+B,eAAe,KAAA,EAAyB;AACjG,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,MAAM,YAAY,CAAA;AAC9D,IAAA,OAAO,MAAA,CAAO,KAAA;AAAA,EAChB;AAAA,EAEA,MAAM,KAAA,CAAM,IAAA,EAA+B,YAAA,GAAe,KAAA,EAAwD;AAChH,IAAA,MAAM,KAAK,sBAAA,EAAuB;AAClC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AAC9C,IAAA,IAAA,CAAK,QAAA,GAAW,cAAA;AAChB,IAAA,IAAA,CAAK,gBAAA,GAAmB,YAAA;AAExB,IAAA,MAAM,MAAA,GAAS,KAAK,kBAAA,EAAmB;AACvC,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,KAAK,IAAA,CAAK,UAAA,CAAW,cAAA,EAAgB,YAAY,CAAA;AACjD,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,UAAA,CAAW,gBAAgB,YAAY,CAAA;AAC/D,IAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAC3B,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QAC1B,KAAK,KAAA,CAAM,GAAA;AAAA,QACX,KAAA,EAAO,KAAK,YAAA,CAAa,GAAA,CAAI,MAAM,GAAG,CAAA,GAAI,QAAQ,KAAA,CAAM;AAAA,OAC1D,CAAE,CAAA;AAAA,IACJ;AAEA,IAAA,OAAO,EAAC;AAAA,EACV;AAAA,EAEQ,qBAAqB,OAAA,EAAqC;AAChE,IAAA,IAAI,OAAO,OAAA,CAAQ,QAAA,KAAa,YAAY,OAAA,CAAQ,QAAA,GAAW,KAAK,QAAA,EAAU;AAC5E,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,OAAA,CAAQ,QAAA,KAAa,QAAA,EAAU;AACxC,MAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAAA,IAC1B;AAEA,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,IAAI,OAAA,CAAQ,SAAS,cAAA,EAAgB;AACnC,MAAA,MAAM,OAAA,GAAU,OAAO,OAAA,CAAQ,IAAA,EAAM,YAAY,QAAA,GAAW,OAAA,CAAQ,KAAK,OAAA,GAAU,IAAA;AACnF,MAAA,MAAM,KAAA,GAAQ,OAAO,OAAA,CAAQ,IAAA,EAAM,UAAU,SAAA,GAAY,OAAA,CAAQ,KAAK,KAAA,GAAQ,IAAA;AAC9E,MAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,KAAA,KAAU,IAAA,EAAM;AACtC,QAAA,IAAA,CAAK,YAAA,CAAa,SAAS,KAAA,EAAO,UAAA,EAAY,QAAQ,QAAA,IAAY,IAAA,CAAK,UAAU,GAAG,CAAA;AACpF,QAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AAAA,MACrB;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,cAAA,EAAgB;AACnC,MAAA,MAAM,OAAA,GAAU,OAAO,OAAA,CAAQ,IAAA,EAAM,YAAY,QAAA,GAAW,OAAA,CAAQ,KAAK,OAAA,GAAU,IAAA;AACnF,MAAA,IAAI,YAAY,IAAA,EAAM;AACpB,QAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,OAAO,CAAC,CAAA;AAC3C,QAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AAAA,MACrB;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,yBAAA,EAA2B;AAC9C,MAAA,MAAM,UAAU,YAAA,EAAa;AAC7B,MAAA,MAAM,OAAA,GAAU,OAAO,OAAA,CAAQ,IAAA,EAAM,YAAY,QAAA,GAAW,OAAA,CAAQ,KAAK,OAAA,GAAU,IAAA;AACnF,MAAA,MAAM,OAAA,GAAU,OAAO,OAAA,CAAQ,IAAA,EAAM,YAAY,SAAA,GAAY,OAAA,CAAQ,KAAK,OAAA,GAAU,IAAA;AACpF,MAAA,IAAI,YAAY,IAAA,EAAM;AACpB,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,IAAA,CAAK,YAAA,CAAa,IAAI,OAAO,CAAA;AAAA,QAC/B,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,YAAA,CAAa,OAAO,OAAO,CAAA;AAAA,QAClC;AACA,QAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AACnB,QAAA,IAAA,CAAK,UAAA,CAAW,gCAAA,EAAkC,YAAA,EAAa,GAAI,OAAA,EAAS;AAAA,UAC1E,KAAK,IAAA,CAAK,MAAA;AAAA,UACV,SAAA,EAAW,IAAA,CAAK,WAAA,GAAc,KAAA,GAAQ,SAAA;AAAA,UACtC,MAAA,EAAQ,UAAU,SAAA,GAAY;AAAA,SAC/B,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,EAAI,IAAK,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,GAAA,EAAI,CAAE,CAAA;AAC7E,IAAA,IAAA,CAAK,UAAA,CAAW,sBAAsB,UAAA,EAAY;AAAA,MAChD,KAAK,IAAA,CAAK,MAAA;AAAA,MACV,SAAA,EAAW,IAAA,CAAK,WAAA,GAAc,KAAA,GAAQ;AAAA,KACvC,CAAA;AAED,IAAA,IAAI,OAAA,CAAQ,OAAO,CAAA,EAAG;AACpB,MAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,EAAE,WAAA,EAAa,CAAC,GAAG,OAAO,CAAA,EAAG,MAAA,EAAQ,UAAA,EAAY,CAAA;AACrE,MAAA,KAAK,KAAK,YAAA,EAAa;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,YAAA,CAAa,YAAY,KAAA,EAAa;AAC5C,IAAA,IAAI,CAAC,KAAK,sBAAA,EAAwB;AAChC,MAAA,QAAA,CAAS,kBAAA,EAAoB;AAAA,QAC3B,SAAA;AAAA,QACA,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,YAAA,CAAa,KAAK,SAAS,CAAA;AAC3B,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB;AAEA,IAAA,MAAM,OAAO,YAAY;AAEvB,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,QAAA,CAAS,sBAAA,EAAwB;AAAA,UAC/B,MAAA,EAAQ;AAAA,SACT,CAAA;AACD,QAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,YAAA,GAAe,KAAK,mBAAA,EAAoB;AAC9C,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,QAAA,CAAS,uBAAA,EAAyB;AAAA,UAChC,MAAA,EAAQ,uBAAA;AAAA,UACR,UAAU,IAAA,CAAK;AAAA,SAChB,CAAA;AACD,QAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,UAAA,IAAA,CAAK,SAAA,GAAY,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,iBAAiB,CAAA;AAAA,QAC1D;AACA,QAAA;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,sBAAA,EAAwB;AAAA,QAC/B,YAAY,IAAA,CAAK,iBAAA;AAAA,QACjB,SAAS,YAAA,CAAa;AAAA,OACvB,CAAA;AAED,MAAA,MAAM,IAAA,CAAK,qBAAA,CAAsB,YAAA,EAAc,IAAA,CAAK,kBAAkB,SAAS,CAAA;AAG/E,MAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,QAAA,IAAA,CAAK,SAAA,GAAY,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,iBAAiB,CAAA;AAAA,MAC1D,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,MACnB;AAAA,IACF,CAAA;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,QAAA,CAAS,6BAAA,EAA+B;AAAA,QACtC,YAAY,IAAA,CAAK;AAAA,OAClB,CAAA;AACD,MAAA,KAAK,IAAA,EAAK;AACV,MAAA;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,mBAAA,EAAqB;AAAA,MAC5B,YAAY,IAAA,CAAK;AAAA,KAClB,CAAA;AACD,IAAA,IAAA,CAAK,SAAA,GAAY,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,iBAAiB,CAAA;AAAA,EAC1D;AAAA,EAEQ,UAAA,CAAW,UAAU,CAAA,EAAS;AACpC,IAAA,KAAK,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACtC;AAAA,EAEA,MAAc,kBAAA,CAAmB,OAAA,GAAU,CAAA,EAAkB;AAC3D,IAAA,MAAM,eAAA,GAAkB,OAAO,WAAA,KAAgB,WAAA,GAAc,WAAA,GAAc,IAAA;AAC3E,IAAA,IAAI,CAAC,eAAA,IAAmB,CAAC,IAAA,CAAK,MAAA,EAAQ;AACpC,MAAA,QAAA,CAAS,+BAAA,EAAiC;AAAA,QACxC,kBAAA,EAAoB,QAAQ,eAAe,CAAA;AAAA,QAC3C,SAAA,EAAW,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AAAA,QAC9B,gBAAgB,IAAA,CAAK;AAAA,OACtB,CAAA;AACD,MAAA,IAAA,CAAK,mBAAA,CAAoB,EAAE,KAAA,EAAO,IAAA,CAAK,sBAAA,GAAyB,UAAA,GAAa,SAAA,EAAW,SAAA,EAAW,IAAA,CAAK,sBAAA,GAAyB,SAAA,GAAY,MAAA,EAAQ,CAAA;AACrJ,MAAA,IAAI,KAAK,sBAAA,EAAwB;AAC/B,QAAA,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,MACxB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,iBAAA,GAAoB,EAAE,IAAA,CAAK,oBAAA;AACjC,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,gBAAA,EAAiB;AAChD,IAAA,IAAI,iBAAA,KAAsB,KAAK,oBAAA,EAAsB;AACnD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAM,IAAI,GAAA,CAAI,IAAA,CAAK,eAAA,EAAiB,KAAK,UAAU,CAAA;AACzD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,KAAA,EAAO,WAAW,CAAA;AAAA,IACzC,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAC1C,MAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,QAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,QAAA,EAAU,IAAA,CAAK,cAAc,CAAA;AAAA,MACpD;AACA,MAAA,MAAM,EAAE,eAAA,EAAiB,eAAA,EAAgB,GAAI,KAAK,uBAAA,EAAwB;AAC1E,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,iBAAA,EAAmB,eAAe,CAAA;AAAA,MACzD;AACA,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,iBAAA,EAAmB,eAAe,CAAA;AAAA,MACzD;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,gBAAA,EAAkB;AAAA,MACzB,OAAA;AAAA,MACA,GAAA,EAAK,IAAI,QAAA,EAAS;AAAA,MAClB,gBAAgB,IAAA,CAAK,sBAAA;AAAA,MACrB,QAAA,EAAU,cAAc,cAAA,GAAiB;AAAA,KAC1C,CAAA;AAED,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,eAAA,CAAgB,GAAA,CAAI,UAAU,CAAA;AAErD,IAAA,IAAA,CAAK,WAAA,CAAY,SAAS,MAAM;AAC9B,MAAA,QAAA,CAAS,eAAA,EAAiB;AAAA,QACxB,OAAA;AAAA,QACA,GAAA,EAAK,IAAI,QAAA;AAAS,OACnB,CAAA;AACD,MAAA,IAAA,CAAK,oBAAoB,EAAE,KAAA,EAAO,WAAA,EAAa,SAAA,EAAW,OAAO,CAAA;AACjE,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,YAAA,CAAa,KAAK,SAAS,CAAA;AAC3B,QAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,MACnB;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,SAAA,GAAY,CAAC,KAAA,KAAwB;AACpD,MAAA,IAAI,KAAK,eAAA,CAAgB,KAAA,KAAU,eAAe,IAAA,CAAK,eAAA,CAAgB,cAAc,KAAA,EAAO;AAC1F,QAAA,QAAA,CAAS,0DAAA,EAA4D;AAAA,UACnE,aAAA,EAAe,KAAK,eAAA,CAAgB,KAAA;AAAA,UACpC,iBAAA,EAAmB,KAAK,eAAA,CAAgB;AAAA,SACzC,CAAA;AACD,QAAA,IAAA,CAAK,oBAAoB,EAAE,KAAA,EAAO,WAAA,EAAa,SAAA,EAAW,OAAO,CAAA;AAAA,MACnE;AAEA,MAAA,OAAA,CAAQ,IAAI,sBAAA,EAAwB;AAAA,QAClC,GAAA,EAAK,MAAA,CAAO,KAAA,CAAM,IAAI;AAAA,OACvB,CAAA;AACD,MAAA,IAAI;AACF,QAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,IAAI,CAAC,CAAA;AAC7C,QAAA,IAAI,OAAA,CAAQ,SAAS,qBAAA,EAAuB;AAC1C,UAAA,MAAM,YAAA,GAAe,KAAK,mBAAA,EAAoB;AAC9C,UAAA,OAAA,CAAQ,IAAI,sCAAA,EAAwC;AAAA,YAClD;AAAA,aACC,YAAY,CAAA;AACf,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,OAAA,CAAQ,IAAI,2CAAA,EAA6C;AAAA,cACvD,SAAS,YAAA,CAAa,GAAA;AAAA,cACtB,cAAc,IAAA,CAAK;AAAA,aACpB,CAAA;AACD,YAAA,KAAK,IAAA,CAAK,WAAW,YAAA,EAAc,IAAA,CAAK,kBAAkB,EAAE,sBAAA,EAAwB,MAAM,CAAA;AAAA,UAC5F,CAAA,MAAO;AACL,YAAA,QAAA,CAAS,oEAAoE,CAAA;AAAA,UAC/E;AAAA,QACF;AACA,QAAA,IAAA,CAAK,qBAAqB,OAAO,CAAA;AAAA,MACnC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,UAAU,MAAM;AAC/B,MAAA,QAAA,CAAS,aAAA,EAAe;AAAA,QACtB,OAAA;AAAA,QACA,gBAAgB,IAAA,CAAK,sBAAA;AAAA,QACrB,eAAe,IAAA,CAAK,GAAA,CAAI,KAAK,SAAA,IAAa,OAAA,GAAU,IAAI,GAAK;AAAA,OAC9D,CAAA;AACD,MAAA,IAAA,CAAK,mBAAA,CAAoB;AAAA,QACvB,KAAA,EAAO,IAAA,CAAK,sBAAA,GAAyB,UAAA,GAAa,SAAA;AAAA,QAClD,SAAA,EAAW,IAAA,CAAK,sBAAA,GAAyB,SAAA,GAAY;AAAA,OACtD,CAAA;AACD,MAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AACxB,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,MAAA,IAAI,KAAK,sBAAA,EAAwB;AAC/B,QAAA,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,MACxB;AAEA,MAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,QAAA,YAAA,CAAa,KAAK,cAAc,CAAA;AAAA,MAClC;AACA,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,KAAK,SAAA,IAAa,OAAA,GAAU,IAAI,GAAK,CAAA;AAC9D,MAAA,IAAA,CAAK,cAAA,GAAiB,WAAW,MAAM;AACrC,QAAA,IAAA,CAAK,UAAA,CAAW,UAAU,CAAC,CAAA;AAAA,MAC7B,GAAG,OAAO,CAAA;AAAA,IACZ,CAAA;AAAA,EACF;AAAA,EAEA,aAAA,GAAsB;AACpB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAEvB,IAAA,QAAA,CAAS,0BAAA,EAA4B;AAAA,MACnC,sBAAsB,IAAA,CAAK,4BAAA;AAAA,MAC3B,eAAA,EAAiB,OAAO,QAAA,KAAa,WAAA,GAAc,SAAS,eAAA,GAAkB,SAAA;AAAA,MAC9E,gBAAgB,IAAA,CAAK;AAAA,KACtB,CAAA;AAED,IAAA,IAAA,CAAK,uBAAA,EAAwB;AAC7B,IAAA,IAAI,KAAK,4BAAA,IAAgC,OAAO,aAAa,WAAA,IAAe,QAAA,CAAS,oBAAoB,QAAA,EAAU;AACjH,MAAA,QAAA,CAAS,mDAAmD,CAAA;AAC5D,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,EACnB;AAAA,EAEA,aAAa,IAAA,EAA4C;AACvD,IAAA,IAAA,CAAK,oBAAA,IAAwB,CAAA;AAC7B,IAAA,QAAA,CAAS,yBAAA,EAA2B;AAAA,MAClC,eAAA,EAAiB,OAAA,CAAQ,IAAA,EAAM,eAAe,CAAA;AAAA,MAC9C,cAAA,EAAgB,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA;AAAA,MACxC,YAAA,EAAc,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;AAAA,MACpC,iBAAA,EAAmB,OAAA,CAAQ,IAAA,CAAK,cAAc;AAAA,KAC/C,CAAA;AAED,IAAA,IAAI,CAAC,MAAM,eAAA,EAAiB;AAC1B,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,MAAA,IAAA,CAAK,uBAAA,EAAwB;AAAA,IAC/B;AAEA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB;AACA,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,YAAA,CAAa,KAAK,SAAS,CAAA;AAC3B,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB;AACA,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,YAAA,CAAa,KAAK,cAAc,CAAA;AAChC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IACxB;AACA,IAAA,IAAA,CAAK,oBAAoB,EAAE,KAAA,EAAO,SAAA,EAAW,SAAA,EAAW,QAAQ,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAY,MAAA,EAAgD;AAChE,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,kBAAA,CAAA,EAAsB;AAAA,QAClD,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,0BAA0B,IAAA,CAAK;AAAA,SACjC;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,YAAY,MAAA,CAAO,UAAA,IAAA,iBAAc,IAAI,IAAA,IAAO,WAAA,EAAY;AAAA,UACxD,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,SAAS,MAAA,CAAO;AAAA,SACjB;AAAA,OACF,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAA,CAAK,SAAA,CAAU,OAAO,KAAA,EAAM;AAC5B,IAAA,IAAA,CAAK,SAAA,CAAU,YAAY,KAAA,EAAM;AACjC,IAAA,IAAA,CAAK,SAAA,CAAU,aAAa,KAAA,EAAM;AAClC,IAAA,IAAA,CAAK,SAAA,CAAU,gBAAgB,KAAA,EAAM;AAAA,EACvC;AACF","file":"index.cjs","sourcesContent":["export type FeatureFlareUserPayload = {\n /** Unique user identifier (preferred). */\n id?: string;\n /** Legacy alias for id. */\n key?: string;\n email?: string;\n name?: string;\n country?: string;\n /** Queryable attributes. */\n meta?: Record<string, string | number | boolean | null>;\n /** Legacy alias for meta. */\n custom?: Record<string, string | number | boolean | null>;\n /** Session data to persist for later product and analytics features. */\n session?: Record<string, string | number | boolean | null>;\n /** Product metrics or counters associated with the current evaluator. */\n metrics?: Record<string, string | number | boolean | null>;\n};\n\ntype FeatureFlareUser = {\n key: string;\n email?: string;\n name?: string;\n country?: string;\n custom?: Record<string, string | number | boolean | null>;\n session?: Record<string, string | number | boolean | null>;\n metrics?: Record<string, string | number | boolean | null>;\n};\n\nconst DEFAULT_FEATUREFLARE_API_BASE_URL =\n 'https://api.featureflare.com';\nconst DEFAULT_CACHE_TTL_MS = 30 * 60 * 1000;\nconst DEFAULT_STALE_TTL_MS = 10 * 60 * 1000;\n\nfunction getApiBaseUrlFromEnv(): string | null {\n if (typeof process !== 'undefined' && process.env) {\n return (\n process.env.FEATUREFLARE_API_BASE_URL?.trim() ||\n process.env.SHIPIT_API_BASE_URL?.trim() ||\n null\n );\n }\n return null;\n}\n\nfunction getApiBaseUrl(explicit?: string): string {\n const fromOptions = explicit?.trim();\n if (fromOptions) return fromOptions;\n\n const fromEnv = getApiBaseUrlFromEnv();\n if (fromEnv) return fromEnv;\n\n return DEFAULT_FEATUREFLARE_API_BASE_URL;\n}\n\nexport type FeatureFlareCacheSource = 'bootstrap' | 'network' | 'realtime' | 'persistent';\nexport type FeatureFlareEvaluationReason = 'fresh_cache' | 'stale_cache' | 'bootstrap' | 'default' | 'network' | 'kill_switch';\n\nexport type FeatureFlareEvaluationMetadata = {\n reason: FeatureFlareEvaluationReason;\n isStale: boolean;\n latencyMs: number;\n source: FeatureFlareCacheSource | 'default' | 'kill_switch';\n updatedAt?: number;\n staleAt?: number;\n expiresAt?: number;\n};\n\nexport type FeatureFlareEvaluationResult = {\n value: boolean;\n metadata: FeatureFlareEvaluationMetadata;\n};\n\nexport type FeatureFlareMetricName =\n | 'ff_eval_latency_ms'\n | 'ff_cache_hit_ratio'\n | 'ff_revalidate_latency_ms'\n | 'ff_realtime_lag_ms'\n | 'ff_killswitch_apply_latency_ms';\n\nexport type FeatureFlareMetricTags = Record<string, string | number | boolean | undefined>;\n\nexport type FeatureFlareErrorReport = {\n /** The flag key being evaluated when the error was observed. */\n flagKey: string;\n /** Observed error rate as a fraction from 0 to 1 (e.g. 0.05 = 5%). */\n errorRate: number;\n /** Observed p99 latency in milliseconds. */\n latencyMs?: number;\n /** ISO-8601 timestamp of the observation window end. Defaults to now. */\n observedAt?: string;\n /** Optional free-form context about the error (e.g. HTTP status, exception name). */\n context?: Record<string, string | number | boolean>;\n};\n\nexport type FeatureFlarePersistentSnapshot = {\n revision?: number;\n killSwitches?: string[];\n flags: Record<\n string,\n {\n value: boolean;\n updatedAt: number;\n staleAt: number;\n expiresAt: number;\n source?: FeatureFlareCacheSource;\n revision?: number;\n }\n >;\n};\n\nexport type FeatureFlarePersistentCacheAdapter = {\n load: (envKey: string) => Promise<FeatureFlarePersistentSnapshot | null> | FeatureFlarePersistentSnapshot | null;\n save: (envKey: string, snapshot: FeatureFlarePersistentSnapshot) => Promise<void> | void;\n};\n\nexport type FeatureFlareBootstrapPayload = {\n revision?: number;\n killSwitches?: string[];\n flags?:\n | Record<string, boolean>\n | Array<{ key: string; value: boolean; revision?: number; updatedAt?: number }>;\n};\n\nexport type FeatureFlareClientOptions = {\n apiBaseUrl?: string;\n sdkKey?: string;\n projectKey?: string;\n envKey?: string;\n getRealtimeUser?: () => FeatureFlareUserPayload | null | undefined;\n timeoutMs?: number;\n maxRetries?: number;\n backoffMs?: number;\n jitter?: number;\n cacheTtlMs?: number;\n staleTtlMs?: number;\n bootstrap?: FeatureFlareBootstrapPayload;\n persistentCache?: FeatureFlarePersistentCacheAdapter;\n onMetric?: (metricName: FeatureFlareMetricName, value: number, tags?: FeatureFlareMetricTags) => void;\n realtime?: {\n enabled?: boolean;\n pollingIntervalMs?: number;\n ssePath?: string;\n disconnectWhenHidden?: boolean;\n };\n};\n\ntype CacheItem = {\n envKey: string;\n flagKey: string;\n value: boolean;\n updatedAt: number;\n staleAt: number;\n expiresAt: number;\n source: FeatureFlareCacheSource;\n revision: number;\n};\n\ntype RealtimeEventPayload = {\n type: 'flag.updated' | 'flag.deleted' | 'env.kill_switch.updated' | 'snapshot.invalidate';\n timestamp?: number;\n revision?: number;\n data?: Record<string, unknown>;\n};\n\ntype StreamTokenResponse = {\n key?: string;\n};\n\ntype FeatureFlareClientEvents = {\n update: {\n changedKeys: string[];\n source: FeatureFlareCacheSource | 'network';\n /** Set when a server snapshot invalidation caused a full flags refetch; listeners should refresh UI even if values are unchanged. */\n snapshotInvalidate?: boolean;\n };\n circuitOpen: { envKey: string; reason: string };\n circuitClose: { envKey: string };\n connectionState: { state: 'connected' | 'degraded' | 'offline'; transport: 'sse' | 'polling' | 'none' };\n};\n\ntype FeatureFlareConnectionState = FeatureFlareClientEvents['connectionState'];\n\nfunction getEnvKeyFromEnv(): string | null {\n if (typeof process !== 'undefined' && process.env) {\n return (\n process.env.FEATUREFLARE_ENV_KEY?.trim() ||\n process.env.SHIPIT_ENV_KEY?.trim() ||\n null\n );\n }\n return null;\n}\n\nfunction normalizeHashInput(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => normalizeHashInput(entry));\n }\n\n if (value && typeof value === 'object') {\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, entryValue]) => entryValue !== undefined)\n .sort(([leftKey], [rightKey]) => leftKey.localeCompare(rightKey));\n\n return Object.fromEntries(entries.map(([key, entryValue]) => [key, normalizeHashInput(entryValue)]));\n }\n\n return value;\n}\n\nfunction hashForStream(value: unknown): string {\n const input = JSON.stringify(normalizeHashInput(value));\n\n let forward = 0x811c9dc5;\n let backward = 0x811c9dc5;\n for (let index = 0; index < input.length; index += 1) {\n forward ^= input.charCodeAt(index);\n forward = Math.imul(forward, 0x01000193);\n\n const reverseIndex = input.length - 1 - index;\n backward ^= input.charCodeAt(reverseIndex);\n backward = Math.imul(backward, 0x01000193);\n }\n\n return `${(forward >>> 0).toString(16).padStart(8, '0')}${(backward >>> 0).toString(16).padStart(8, '0')}`;\n}\n\nfunction encodeBase64Url(value: string): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(value, 'utf8').toString('base64url');\n }\n\n const bytes = typeof TextEncoder !== 'undefined' ? new TextEncoder().encode(value) : [];\n let binary = '';\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n\n const base64 = typeof btoa === 'function' ? btoa(binary) : '';\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\n}\n\ntype HashedRealtimeUserContext = {\n payloadHash: string;\n fields: Partial<Record<'id' | 'key' | 'email' | 'name' | 'country', string>>;\n metaEntries: Array<{ keyHash: string; valueHash: string }>;\n customEntries: Array<{ keyHash: string; valueHash: string }>;\n};\n\nfunction hashRecordEntries(record?: Record<string, string | number | boolean | null>): Array<{ keyHash: string; valueHash: string }> {\n if (!record) {\n return [];\n }\n\n return Object.entries(record)\n .sort(([leftKey], [rightKey]) => leftKey.localeCompare(rightKey))\n .map(([key, value]) => ({\n keyHash: hashForStream(key),\n valueHash: hashForStream(value)\n }));\n}\n\nfunction buildHashedRealtimeUserContext(input: FeatureFlareUserPayload): HashedRealtimeUserContext {\n const payload = {\n id: input.id ?? input.key\n };\n\n return {\n payloadHash: hashForStream(payload),\n fields: {\n ...((input.id ?? input.key) ? { id: hashForStream(input.id ?? input.key) } : {})\n },\n metaEntries: [],\n customEntries: []\n };\n}\n\nfunction getSdkKeyFromEnv(): string | null {\n if (typeof process !== 'undefined' && process.env) {\n return (\n process.env.FEATUREFLARE_CLIENT_KEY?.trim() ||\n process.env.FEATUREFLARE_SERVER_KEY?.trim() ||\n process.env.SHIPIT_CLIENT_KEY?.trim() ||\n process.env.SHIPIT_SERVER_KEY?.trim() ||\n null\n );\n }\n return null;\n}\n\nfunction monotonicNow(): number {\n if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\n return performance.now();\n }\n return Date.now();\n}\n\nfunction isFeatureFlareDebugEnabled(): boolean {\n const envDebug =\n typeof process !== 'undefined' && process.env\n ? process.env.NEXT_PUBLIC_FEATUREFLARE_DEBUG?.trim() || process.env.FEATUREFLARE_DEBUG?.trim()\n : '';\n\n if (envDebug === '1' || envDebug?.toLowerCase() === 'true') {\n return true;\n }\n\n if (typeof window !== 'undefined') {\n try {\n const storageDebug = window.localStorage.getItem('featureflare:debug');\n return storageDebug === '1' || storageDebug?.toLowerCase() === 'true';\n } catch {\n return false;\n }\n }\n\n return false;\n}\n\nfunction debugLog(message: string, details?: Record<string, unknown>): void {\n if (!isFeatureFlareDebugEnabled()) {\n return;\n }\n\n if (details) {\n console.debug(`[FeatureFlare SDK] ${message}`, details);\n return;\n }\n\n console.debug(`[FeatureFlare SDK] ${message}`);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction isRetriableStatus(status: number): boolean {\n return status === 408 || status === 425 || status === 429 || status >= 500;\n}\n\nfunction normalizeBoolMap(\n input: { flags?: Array<{ key: string; value: boolean }>; values?: Record<string, boolean> }\n): Array<{ key: string; value: boolean }> {\n if (Array.isArray(input.flags)) {\n return input.flags\n .filter((entry): entry is { key: string; value: boolean } =>\n Boolean(entry) && typeof entry.key === 'string' && typeof entry.value === 'boolean'\n )\n .map((entry) => ({ key: entry.key, value: entry.value }));\n }\n\n const values = input.values ?? {};\n return Object.entries(values).map(([key, value]) => ({ key, value: Boolean(value) }));\n}\n\nexport class InMemoryMetricsCollector {\n private readonly buckets = new Map<string, number[]>();\n\n record = (metricName: FeatureFlareMetricName, value: number, tags?: FeatureFlareMetricTags) => {\n const key = `${metricName}:${JSON.stringify(tags ?? {})}`;\n const list = this.buckets.get(key) ?? [];\n list.push(value);\n this.buckets.set(key, list);\n };\n\n get(metricName: FeatureFlareMetricName): Array<{ tags: FeatureFlareMetricTags; values: number[] }> {\n const rows: Array<{ tags: FeatureFlareMetricTags; values: number[] }> = [];\n for (const [key, values] of this.buckets.entries()) {\n if (!key.startsWith(`${metricName}:`)) continue;\n rows.push({\n tags: JSON.parse(key.slice(metricName.length + 1)) as FeatureFlareMetricTags,\n values: [...values]\n });\n }\n return rows;\n }\n}\n\nexport class FeatureFlareClient {\n private readonly apiBaseUrl: string;\n private readonly sdkKey: string | null;\n private readonly projectKey: string | null;\n private readonly envKey: string;\n private readonly expectedEnvKey: string | null;\n private readonly getRealtimeUser?: () => FeatureFlareUserPayload | null | undefined;\n private readonly timeoutMs: number;\n private readonly maxRetries: number;\n private readonly backoffMs: number;\n private readonly jitter: number;\n private readonly cacheTtlMs: number;\n private readonly staleTtlMs: number;\n private readonly persistentCache: FeatureFlarePersistentCacheAdapter | undefined;\n private readonly onMetric?: (metricName: FeatureFlareMetricName, value: number, tags?: FeatureFlareMetricTags) => void;\n private readonly listeners: {\n [K in keyof FeatureFlareClientEvents]: Set<(payload: FeatureFlareClientEvents[K]) => void>;\n } = {\n update: new Set(),\n circuitOpen: new Set(),\n circuitClose: new Set(),\n connectionState: new Set()\n };\n\n private readonly cache = new Map<string, CacheItem>();\n private readonly diagnostics = new Map<string, FeatureFlareEvaluationMetadata>();\n private readonly killSwitches = new Set<string>();\n\n private revision = 0;\n private circuitOpen = false;\n private persistentLoadPromise: Promise<void> | null = null;\n private readonly inFlightRevalidate = new Map<string, Promise<Array<{ key: string; value: boolean }> | null>>();\n private lastUser: FeatureFlareUser | null = null;\n private lastDefaultValue = false;\n\n private realtimeEnabled = true;\n private realtimePollingEnabled = true;\n private realtimePollingMs = 15000;\n private realtimeSsePath = '/api/v1/sdk/stream';\n private realtimeDisconnectWhenHidden = true;\n private visibilityListenerAttached = false;\n private connectionState: FeatureFlareConnectionState = { state: 'offline', transport: 'none' };\n private pollTimer: ReturnType<typeof setTimeout> | null = null;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private eventSource: EventSource | null = null;\n private streamConnectVersion = 0;\n\n constructor(options: FeatureFlareClientOptions = {}) {\n this.apiBaseUrl = getApiBaseUrl(options.apiBaseUrl).replace(/\\/$/, '');\n this.sdkKey = options.sdkKey?.trim() || getSdkKeyFromEnv();\n this.projectKey = options.projectKey?.trim() ? options.projectKey.trim() : null;\n const explicitOrEnvKey = options.envKey?.trim() || getEnvKeyFromEnv() || null;\n this.envKey = explicitOrEnvKey ?? 'production';\n this.expectedEnvKey = explicitOrEnvKey;\n this.getRealtimeUser = options.getRealtimeUser;\n\n if (!this.sdkKey && !this.projectKey) {\n throw new Error(\n 'FeatureFlareClient requires either sdkKey (recommended) or projectKey (legacy). Set FEATUREFLARE_CLIENT_KEY or FEATUREFLARE_SERVER_KEY env var, or pass sdkKey in options.'\n );\n }\n\n this.timeoutMs = Number.isFinite(options.timeoutMs) && (options.timeoutMs ?? 0) > 0 ? Number(options.timeoutMs) : 3000;\n this.maxRetries = Number.isFinite(options.maxRetries) && (options.maxRetries ?? 0) >= 0 ? Number(options.maxRetries) : 2;\n this.backoffMs = Number.isFinite(options.backoffMs) && (options.backoffMs ?? 0) > 0 ? Number(options.backoffMs) : 200;\n this.jitter = Number.isFinite(options.jitter) && (options.jitter ?? 0) >= 0 ? Number(options.jitter) : 0.25;\n\n this.cacheTtlMs = Number.isFinite(options.cacheTtlMs) && (options.cacheTtlMs ?? 0) > 0 ? Number(options.cacheTtlMs) : DEFAULT_CACHE_TTL_MS;\n const configuredStaleTtlMs =\n Number.isFinite(options.staleTtlMs) && (options.staleTtlMs ?? 0) > 0 ? Number(options.staleTtlMs) : DEFAULT_STALE_TTL_MS;\n this.staleTtlMs = Math.min(configuredStaleTtlMs, this.cacheTtlMs);\n\n this.persistentCache = options.persistentCache;\n this.onMetric = options.onMetric;\n\n this.realtimeEnabled = options.realtime?.enabled ?? true;\n const configuredPollingIntervalMs = Number(options.realtime?.pollingIntervalMs ?? NaN);\n if (Number.isFinite(configuredPollingIntervalMs) && configuredPollingIntervalMs === 0) {\n this.realtimePollingEnabled = false;\n this.realtimePollingMs = 0;\n } else {\n this.realtimePollingEnabled = true;\n this.realtimePollingMs =\n Number.isFinite(configuredPollingIntervalMs) && configuredPollingIntervalMs > 0\n ? configuredPollingIntervalMs\n : 15000;\n }\n this.realtimeSsePath = options.realtime?.ssePath ?? '/api/v1/sdk/stream';\n this.realtimeDisconnectWhenHidden = options.realtime?.disconnectWhenHidden ?? true;\n\n this.applyBootstrap(options.bootstrap);\n this.persistentLoadPromise = this.loadPersistentCache();\n\n if (this.realtimeEnabled && this.sdkKey) {\n this.attachVisibilityHandler();\n if (this.realtimeDisconnectWhenHidden && typeof document !== 'undefined' && document.visibilityState === 'hidden') {\n return;\n }\n this.startRealtime();\n }\n }\n\n private readonly handleVisibilityChange = (): void => {\n if (!this.realtimeDisconnectWhenHidden || typeof document === 'undefined') return;\n\n debugLog('Visibility changed', {\n visibilityState: document.visibilityState,\n realtimeEnabled: this.realtimeEnabled,\n hasEventSource: Boolean(this.eventSource)\n });\n\n if (document.visibilityState === 'hidden') {\n this.stopRealtime({ preserveEnabled: true });\n return;\n }\n\n if (this.realtimeEnabled && this.sdkKey && !this.eventSource) {\n this.connectSse(0);\n }\n };\n\n private attachVisibilityHandler(): void {\n if (!this.realtimeDisconnectWhenHidden || this.visibilityListenerAttached || typeof document === 'undefined') return;\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n this.visibilityListenerAttached = true;\n }\n\n private detachVisibilityHandler(): void {\n if (!this.visibilityListenerAttached || typeof document === 'undefined') return;\n document.removeEventListener('visibilitychange', this.handleVisibilityChange);\n this.visibilityListenerAttached = false;\n }\n\n private getCacheKey(flagKey: string): string {\n return `${this.envKey}:${flagKey}`;\n }\n\n private normalizeUser(input: FeatureFlareUserPayload): FeatureFlareUser {\n const key = (input.id ?? input.key ?? '').trim();\n if (!key) throw new Error('FeatureFlareClient requires user.id (or legacy user.key).');\n return {\n key,\n email: input.email,\n name: input.name,\n country: input.country,\n custom: input.meta ?? input.custom,\n session: input.session,\n metrics: input.metrics\n };\n }\n\n private resolveRealtimeUserPayload(): FeatureFlareUserPayload | null {\n const candidate = this.getRealtimeUser?.();\n if (candidate) {\n try {\n const normalizedUser = this.normalizeUser(candidate);\n this.lastUser = normalizedUser;\n return candidate;\n } catch {\n // Ignore invalid callback payloads and fall back to the last known valid user.\n }\n }\n\n if (!this.lastUser) {\n return null;\n }\n\n return {\n id: this.lastUser.key,\n email: this.lastUser.email,\n name: this.lastUser.name,\n country: this.lastUser.country,\n meta: this.lastUser.custom,\n session: this.lastUser.session,\n metrics: this.lastUser.metrics\n };\n }\n\n private resolveRealtimeUser(): FeatureFlareUser | null {\n const candidate = this.resolveRealtimeUserPayload();\n if (candidate) {\n try {\n const normalizedUser = this.normalizeUser(candidate);\n this.lastUser = normalizedUser;\n return normalizedUser;\n } catch {\n // Ignore invalid callback payloads and fall back to the last known valid user.\n }\n }\n\n return this.lastUser;\n }\n\n private getRealtimeStreamHashes(): { userContextHash?: string; userPayloadHash?: string } {\n const realtimeUserPayload = this.resolveRealtimeUserPayload();\n if (!realtimeUserPayload) {\n return {};\n }\n\n const hashedContext = buildHashedRealtimeUserContext(realtimeUserPayload);\n return {\n userContextHash: encodeBase64Url(JSON.stringify(hashedContext)),\n userPayloadHash: hashedContext.payloadHash\n };\n }\n\n private async fetchStreamToken(): Promise<string | null> {\n if (!this.sdkKey || typeof fetch !== 'function') {\n return null;\n }\n\n const { userContextHash, userPayloadHash } = this.getRealtimeStreamHashes();\n\n try {\n const response = await fetch(`${this.apiBaseUrl}/api/v1/sdk/stream-token`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-featureflare-sdk-key': this.sdkKey\n },\n body: JSON.stringify({\n expectedEnvKey: this.expectedEnvKey ?? undefined,\n userContextHash,\n userPayloadHash\n })\n });\n\n if (!response.ok) {\n return null;\n }\n\n const payload = (await response.json()) as StreamTokenResponse;\n return typeof payload.key === 'string' && payload.key.trim() ? payload.key : null;\n } catch {\n return null;\n }\n }\n\n private emit<K extends keyof FeatureFlareClientEvents>(event: K, payload: FeatureFlareClientEvents[K]): void {\n for (const listener of this.listeners[event]) {\n listener(payload);\n }\n }\n\n private emitConnectionState(state: FeatureFlareConnectionState): void {\n this.connectionState = state;\n this.emit('connectionState', state);\n }\n\n on<K extends keyof FeatureFlareClientEvents>(\n event: K,\n listener: (payload: FeatureFlareClientEvents[K]) => void\n ): () => void {\n this.listeners[event].add(listener);\n if (event === 'connectionState') {\n (listener as (payload: FeatureFlareConnectionState) => void)(this.connectionState);\n }\n return () => {\n this.listeners[event].delete(listener);\n };\n }\n\n isRealtimeEnabled(): boolean {\n return this.realtimeEnabled && Boolean(this.sdkKey);\n }\n\n private emitMetric(metricName: FeatureFlareMetricName, value: number, tags?: FeatureFlareMetricTags): void {\n this.onMetric?.(metricName, value, tags);\n }\n\n private async ensurePersistentLoaded(): Promise<void> {\n if (!this.persistentLoadPromise) return;\n await this.persistentLoadPromise;\n }\n\n private async loadPersistentCache(): Promise<void> {\n if (!this.persistentCache) return;\n try {\n const snapshot = await this.persistentCache.load(this.envKey);\n if (!snapshot) return;\n this.revision = Math.max(this.revision, snapshot.revision ?? 0);\n for (const killSwitchKey of snapshot.killSwitches ?? []) {\n this.killSwitches.add(killSwitchKey);\n }\n\n for (const [flagKey, item] of Object.entries(snapshot.flags ?? {})) {\n const existing = this.cache.get(this.getCacheKey(flagKey));\n if (existing && existing.source === 'bootstrap') continue;\n this.cache.set(this.getCacheKey(flagKey), {\n envKey: this.envKey,\n flagKey,\n value: Boolean(item.value),\n updatedAt: Number(item.updatedAt) || Date.now(),\n staleAt: Number(item.staleAt) || Date.now(),\n expiresAt: Number(item.expiresAt) || Date.now(),\n source: item.source ?? 'persistent',\n revision: item.revision ?? 0\n });\n }\n } catch {\n // Ignore persistent cache failures; runtime must stay non-throwing for outage semantics.\n }\n }\n\n private async persistCache(): Promise<void> {\n if (!this.persistentCache) return;\n const snapshot: FeatureFlarePersistentSnapshot = {\n revision: this.revision,\n killSwitches: [...this.killSwitches],\n flags: {}\n };\n\n for (const [key, item] of this.cache.entries()) {\n if (!key.startsWith(`${this.envKey}:`)) continue;\n snapshot.flags[item.flagKey] = {\n value: item.value,\n updatedAt: item.updatedAt,\n staleAt: item.staleAt,\n expiresAt: item.expiresAt,\n source: item.source,\n revision: item.revision\n };\n }\n\n try {\n await this.persistentCache.save(this.envKey, snapshot);\n } catch {\n // Persistent errors must not break evaluation.\n }\n }\n\n private makeCacheWindow(at = Date.now()): Pick<CacheItem, 'updatedAt' | 'staleAt' | 'expiresAt'> {\n return {\n updatedAt: at,\n staleAt: at + this.staleTtlMs,\n expiresAt: at + this.cacheTtlMs\n };\n }\n\n private setCacheItem(\n flagKey: string,\n value: boolean,\n source: FeatureFlareCacheSource,\n revision = this.revision,\n at = Date.now()\n ): void {\n this.cache.set(this.getCacheKey(flagKey), {\n envKey: this.envKey,\n flagKey,\n value,\n source,\n revision,\n ...this.makeCacheWindow(at)\n });\n }\n\n private applyBootstrap(bootstrap?: FeatureFlareBootstrapPayload): void {\n if (!bootstrap) return;\n this.revision = Math.max(this.revision, bootstrap.revision ?? 0);\n for (const killSwitchKey of bootstrap.killSwitches ?? []) {\n this.killSwitches.add(killSwitchKey);\n }\n\n const apply = (flagKey: string, value: boolean, revision?: number, updatedAt?: number) => {\n this.setCacheItem(flagKey, value, 'bootstrap', revision ?? this.revision, updatedAt ?? Date.now());\n };\n\n if (Array.isArray(bootstrap.flags)) {\n for (const item of bootstrap.flags) {\n if (!item || typeof item.key !== 'string') continue;\n apply(item.key, Boolean(item.value), item.revision, item.updatedAt);\n }\n return;\n }\n\n for (const [flagKey, value] of Object.entries(bootstrap.flags ?? {})) {\n apply(flagKey, Boolean(value));\n }\n }\n\n private getCacheState(item: CacheItem | undefined, now = Date.now()): 'fresh' | 'stale' | 'expired' | 'missing' {\n if (!item) return 'missing';\n if (now <= item.staleAt) return 'fresh';\n if (now <= item.expiresAt) return 'stale';\n return 'expired';\n }\n\n private setCircuitState(isOpen: boolean, reason = ''): void {\n if (this.circuitOpen === isOpen) return;\n this.circuitOpen = isOpen;\n if (isOpen) {\n this.emit('circuitOpen', { envKey: this.envKey, reason });\n return;\n }\n this.emit('circuitClose', { envKey: this.envKey });\n }\n\n private async fetchWithRetry(url: string, init: RequestInit, transport: 'network' | 'polling') {\n let lastError: unknown = null;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n const ac = typeof AbortController !== 'undefined' ? new AbortController() : null;\n const timeout =\n ac !== null\n ? setTimeout(() => {\n ac.abort();\n }, this.timeoutMs)\n : null;\n\n try {\n const response = await fetch(url, {\n ...init,\n signal: ac?.signal\n });\n\n if (timeout) clearTimeout(timeout);\n\n if (!response.ok && isRetriableStatus(response.status) && attempt < this.maxRetries) {\n lastError = new Error(`HTTP ${response.status}`);\n const jitterOffset = this.backoffMs * this.jitter * Math.random();\n await sleep(this.backoffMs * (attempt + 1) + jitterOffset);\n continue;\n }\n\n return response;\n } catch (error) {\n if (timeout) clearTimeout(timeout);\n lastError = error;\n if (attempt >= this.maxRetries) break;\n const jitterOffset = this.backoffMs * this.jitter * Math.random();\n await sleep(this.backoffMs * (attempt + 1) + jitterOffset);\n }\n }\n\n this.setCircuitState(true, transport);\n throw lastError;\n }\n\n private collectCachedFlags(): Array<{ key: string; value: boolean }> {\n const now = Date.now();\n const flags: Array<{ key: string; value: boolean }> = [];\n\n for (const [cacheKey, item] of this.cache.entries()) {\n if (!cacheKey.startsWith(`${this.envKey}:`)) continue;\n if (this.killSwitches.has(item.flagKey)) {\n flags.push({ key: item.flagKey, value: false });\n continue;\n }\n\n const state = this.getCacheState(item, now);\n if (state === 'missing' || state === 'expired') continue;\n flags.push({ key: item.flagKey, value: item.value });\n }\n\n return flags.sort((a, b) => a.key.localeCompare(b.key));\n }\n\n getCachedFlags(): {\n flags: Array<{ key: string; value: boolean }>;\n hasData: boolean;\n } {\n const flags = this.collectCachedFlags();\n return { flags, hasData: flags.length > 0 };\n }\n\n getFlagDiagnostics(flagKey: string): FeatureFlareEvaluationMetadata | null {\n return this.diagnostics.get(this.getCacheKey(flagKey)) ?? null;\n }\n\n setKillSwitch(flagKey: string, enabled: boolean): void {\n const started = monotonicNow();\n if (enabled) {\n this.killSwitches.add(flagKey);\n } else {\n this.killSwitches.delete(flagKey);\n }\n const elapsed = monotonicNow() - started;\n this.emitMetric('ff_killswitch_apply_latency_ms', elapsed, {\n env: this.envKey,\n result: enabled ? 'enabled' : 'disabled'\n });\n this.emit('update', { changedKeys: [flagKey], source: 'realtime' });\n void this.persistCache();\n }\n\n private async fetchEvalFromNetwork(\n flagKey: string,\n normalizedUser: FeatureFlareUser,\n defaultValue: boolean\n ): Promise<boolean | null> {\n const response = this.sdkKey\n ? await this.fetchWithRetry(\n `${this.apiBaseUrl}/api/v1/sdk/eval`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-featureflare-sdk-key': this.sdkKey\n },\n body: JSON.stringify({\n flagKey,\n user: normalizedUser,\n defaultValue,\n expectedEnvKey: this.expectedEnvKey ?? undefined\n })\n },\n 'network'\n )\n : await this.fetchWithRetry(\n `${this.apiBaseUrl}/api/v1/eval`,\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n projectKey: this.projectKey,\n envKey: this.envKey,\n flagKey,\n user: normalizedUser,\n defaultValue\n })\n },\n 'network'\n );\n\n if (!response.ok) {\n if (!isRetriableStatus(response.status)) {\n this.setCircuitState(true, `http_${response.status}`);\n }\n return null;\n }\n\n const json = (await response.json()) as { value?: boolean; revision?: number; killSwitch?: boolean };\n const value = typeof json.value === 'boolean' ? json.value : defaultValue;\n\n if (json.killSwitch === true) {\n this.killSwitches.add(flagKey);\n }\n\n const revision = json.revision ?? this.revision;\n this.revision = Math.max(this.revision, revision);\n this.setCacheItem(flagKey, value, 'network', revision);\n this.setCircuitState(false);\n void this.persistCache();\n this.emit('update', { changedKeys: [flagKey], source: 'network' });\n return value;\n }\n\n private async fetchFlagsFromNetwork(\n normalizedUser: FeatureFlareUser,\n defaultValue: boolean,\n transport: 'network' | 'polling',\n opts?: { fromSnapshotInvalidate?: boolean }\n ): Promise<Array<{ key: string; value: boolean }> | null> {\n if (!this.sdkKey) {\n return null;\n }\n\n const started = monotonicNow();\n\n debugLog('Fetching flags', {\n transport,\n fromSnapshotInvalidate: Boolean(opts?.fromSnapshotInvalidate),\n userKey: normalizedUser.key,\n defaultValue\n });\n\n try {\n const response = await this.fetchWithRetry(\n `${this.apiBaseUrl}/api/v1/sdk/flags`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-featureflare-sdk-key': this.sdkKey\n },\n body: JSON.stringify({\n user: normalizedUser,\n defaultValue,\n expectedEnvKey: this.expectedEnvKey ?? undefined\n })\n },\n transport\n );\n\n if (!response.ok) {\n if (!isRetriableStatus(response.status)) {\n this.setCircuitState(true, `http_${response.status}`);\n }\n return null;\n }\n\n const json = (await response.json()) as {\n flags?: Array<{ key: string; value: boolean }>;\n values?: Record<string, boolean>;\n revision?: number;\n killSwitches?: string[];\n };\n\n const list = normalizeBoolMap(json);\n const revision = json.revision ?? this.revision;\n this.revision = Math.max(this.revision, revision);\n\n if (Array.isArray(json.killSwitches)) {\n for (const key of json.killSwitches) {\n this.killSwitches.add(key);\n }\n }\n\n const changed = new Set<string>();\n for (const entry of list) {\n const existing = this.cache.get(this.getCacheKey(entry.key));\n if (!existing || existing.value !== entry.value || existing.revision !== revision) {\n changed.add(entry.key);\n }\n this.setCacheItem(entry.key, entry.value, 'network', revision);\n }\n\n if (opts?.fromSnapshotInvalidate && list !== null) {\n this.emit('update', {\n changedKeys: list.map((e) => e.key),\n source: 'realtime',\n snapshotInvalidate: true\n });\n } else if (changed.size > 0) {\n this.emit('update', { changedKeys: [...changed], source: 'network' });\n }\n\n this.setCircuitState(false);\n void this.persistCache();\n this.emitMetric('ff_revalidate_latency_ms', monotonicNow() - started, {\n env: this.envKey,\n transport\n });\n debugLog('Fetched flags', {\n transport,\n fromSnapshotInvalidate: Boolean(opts?.fromSnapshotInvalidate),\n flagsCount: list.length,\n revision\n });\n return list;\n } catch {\n this.emitMetric('ff_revalidate_latency_ms', monotonicNow() - started, {\n env: this.envKey,\n transport,\n result: 'error'\n });\n debugLog('Fetch flags failed', {\n transport,\n fromSnapshotInvalidate: Boolean(opts?.fromSnapshotInvalidate)\n });\n return null;\n }\n }\n\n private revalidate(\n normalizedUser: FeatureFlareUser,\n defaultValue: boolean,\n opts?: { fromSnapshotInvalidate?: boolean }\n ): Promise<Array<{ key: string; value: boolean }> | null> {\n const existing = this.inFlightRevalidate.get(this.envKey);\n if (existing) {\n if (opts?.fromSnapshotInvalidate) {\n void existing.then((list) => {\n if (list !== null) {\n this.emit('update', {\n changedKeys: list.map((e) => e.key),\n source: 'realtime',\n snapshotInvalidate: true\n });\n }\n });\n }\n return existing;\n }\n\n const promise = this.fetchFlagsFromNetwork(normalizedUser, defaultValue, 'network', opts).finally(() => {\n this.inFlightRevalidate.delete(this.envKey);\n });\n\n this.inFlightRevalidate.set(this.envKey, promise);\n return promise;\n }\n\n async evaluate(\n flagKey: string,\n user: FeatureFlareUserPayload,\n defaultValue = false\n ): Promise<FeatureFlareEvaluationResult> {\n const started = monotonicNow();\n await this.ensurePersistentLoaded();\n\n const normalizedUser = this.normalizeUser(user);\n this.lastUser = normalizedUser;\n this.lastDefaultValue = defaultValue;\n\n if (this.killSwitches.has(flagKey)) {\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'kill_switch',\n isStale: false,\n latencyMs: monotonicNow() - started,\n source: 'kill_switch'\n };\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'disabled'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: false, metadata };\n }\n\n const cacheItem = this.cache.get(this.getCacheKey(flagKey));\n const cacheState = this.getCacheState(cacheItem);\n\n if (cacheItem && cacheState === 'fresh') {\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: cacheItem.source === 'bootstrap' || cacheItem.source === 'persistent' ? 'bootstrap' : 'fresh_cache',\n isStale: false,\n latencyMs: monotonicNow() - started,\n source: cacheItem.source,\n updatedAt: cacheItem.updatedAt,\n staleAt: cacheItem.staleAt,\n expiresAt: cacheItem.expiresAt\n };\n this.emitMetric('ff_cache_hit_ratio', 1, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'cache_hit'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: cacheItem.value, metadata };\n }\n\n if (cacheItem && cacheState === 'stale') {\n void this.revalidate(normalizedUser, defaultValue);\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'stale_cache',\n isStale: true,\n latencyMs: monotonicNow() - started,\n source: cacheItem.source,\n updatedAt: cacheItem.updatedAt,\n staleAt: cacheItem.staleAt,\n expiresAt: cacheItem.expiresAt\n };\n this.emitMetric('ff_cache_hit_ratio', 1, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'stale'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: cacheItem.value, metadata };\n }\n\n if (cacheItem && (cacheItem.source === 'bootstrap' || cacheItem.source === 'persistent')) {\n void this.revalidate(normalizedUser, defaultValue);\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'bootstrap',\n isStale: true,\n latencyMs: monotonicNow() - started,\n source: cacheItem.source,\n updatedAt: cacheItem.updatedAt,\n staleAt: cacheItem.staleAt,\n expiresAt: cacheItem.expiresAt\n };\n this.emitMetric('ff_cache_hit_ratio', 1, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'bootstrap'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: cacheItem.value, metadata };\n }\n\n try {\n const networkValue = await this.fetchEvalFromNetwork(flagKey, normalizedUser, defaultValue);\n if (networkValue !== null) {\n const item = this.cache.get(this.getCacheKey(flagKey));\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'network',\n isStale: false,\n latencyMs: monotonicNow() - started,\n source: 'network',\n updatedAt: item?.updatedAt,\n staleAt: item?.staleAt,\n expiresAt: item?.expiresAt\n };\n this.emitMetric('ff_cache_hit_ratio', 0, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'network'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: networkValue, metadata };\n }\n } catch {\n // Fall through to deterministic default for outage semantics.\n }\n\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'default',\n isStale: false,\n latencyMs: monotonicNow() - started,\n source: 'default'\n };\n this.emitMetric('ff_cache_hit_ratio', 0, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'default'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: defaultValue, metadata };\n }\n\n async bool(flagKey: string, user: FeatureFlareUserPayload, defaultValue = false): Promise<boolean> {\n const result = await this.evaluate(flagKey, user, defaultValue);\n return result.value;\n }\n\n async flags(user: FeatureFlareUserPayload, defaultValue = false): Promise<Array<{ key: string; value: boolean }>> {\n await this.ensurePersistentLoaded();\n const normalizedUser = this.normalizeUser(user);\n this.lastUser = normalizedUser;\n this.lastDefaultValue = defaultValue;\n\n const cached = this.collectCachedFlags();\n if (cached.length > 0) {\n void this.revalidate(normalizedUser, defaultValue);\n return cached;\n }\n\n const list = await this.revalidate(normalizedUser, defaultValue);\n if (list && list.length > 0) {\n return list.map((entry) => ({\n key: entry.key,\n value: this.killSwitches.has(entry.key) ? false : entry.value\n }));\n }\n\n return [];\n }\n\n private applyRealtimeMessage(message: RealtimeEventPayload): void {\n if (typeof message.revision === 'number' && message.revision < this.revision) {\n return;\n }\n\n if (typeof message.revision === 'number') {\n this.revision = message.revision;\n }\n\n const changed = new Set<string>();\n const now = Date.now();\n\n if (message.type === 'flag.updated') {\n const flagKey = typeof message.data?.flagKey === 'string' ? message.data.flagKey : null;\n const value = typeof message.data?.value === 'boolean' ? message.data.value : null;\n if (flagKey !== null && value !== null) {\n this.setCacheItem(flagKey, value, 'realtime', message.revision ?? this.revision, now);\n changed.add(flagKey);\n }\n }\n\n if (message.type === 'flag.deleted') {\n const flagKey = typeof message.data?.flagKey === 'string' ? message.data.flagKey : null;\n if (flagKey !== null) {\n this.cache.delete(this.getCacheKey(flagKey));\n changed.add(flagKey);\n }\n }\n\n if (message.type === 'env.kill_switch.updated') {\n const started = monotonicNow();\n const flagKey = typeof message.data?.flagKey === 'string' ? message.data.flagKey : null;\n const enabled = typeof message.data?.enabled === 'boolean' ? message.data.enabled : true;\n if (flagKey !== null) {\n if (enabled) {\n this.killSwitches.add(flagKey);\n } else {\n this.killSwitches.delete(flagKey);\n }\n changed.add(flagKey);\n this.emitMetric('ff_killswitch_apply_latency_ms', monotonicNow() - started, {\n env: this.envKey,\n transport: this.eventSource ? 'sse' : 'polling',\n result: enabled ? 'enabled' : 'disabled'\n });\n }\n }\n\n const eventLagMs = Math.max(0, Date.now() - (message.timestamp ?? Date.now()));\n this.emitMetric('ff_realtime_lag_ms', eventLagMs, {\n env: this.envKey,\n transport: this.eventSource ? 'sse' : 'polling'\n });\n\n if (changed.size > 0) {\n this.emit('update', { changedKeys: [...changed], source: 'realtime' });\n void this.persistCache();\n }\n }\n\n private startPolling(immediate = false): void {\n if (!this.realtimePollingEnabled) {\n debugLog('Polling disabled', {\n immediate,\n reason: 'realtimePollingEnabled=false'\n });\n return;\n }\n\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n\n const tick = async () => {\n // If SSE is active, polling must remain disabled.\n if (this.eventSource) {\n debugLog('Polling tick skipped', {\n reason: 'eventSource-active'\n });\n this.pollTimer = null;\n return;\n }\n\n const realtimeUser = this.resolveRealtimeUser();\n if (!realtimeUser) {\n debugLog('Polling tick deferred', {\n reason: 'missing-realtime-user',\n nextInMs: this.realtimePollingMs\n });\n if (!this.eventSource) {\n this.pollTimer = setTimeout(tick, this.realtimePollingMs);\n }\n return;\n }\n\n debugLog('Polling tick started', {\n intervalMs: this.realtimePollingMs,\n userKey: realtimeUser.key\n });\n\n await this.fetchFlagsFromNetwork(realtimeUser, this.lastDefaultValue, 'polling');\n\n // Avoid resurrecting the polling timer if SSE connected while polling request was in-flight.\n if (!this.eventSource) {\n this.pollTimer = setTimeout(tick, this.realtimePollingMs);\n } else {\n this.pollTimer = null;\n }\n };\n\n if (immediate) {\n debugLog('Polling started immediately', {\n intervalMs: this.realtimePollingMs\n });\n void tick();\n return;\n }\n\n debugLog('Polling scheduled', {\n intervalMs: this.realtimePollingMs\n });\n this.pollTimer = setTimeout(tick, this.realtimePollingMs);\n }\n\n private connectSse(attempt = 0): void {\n void this.connectSseInternal(attempt);\n }\n\n private async connectSseInternal(attempt = 0): Promise<void> {\n const EventSourceImpl = typeof EventSource !== 'undefined' ? EventSource : null;\n if (!EventSourceImpl || !this.sdkKey) {\n debugLog('SSE unavailable, falling back', {\n hasEventSourceImpl: Boolean(EventSourceImpl),\n hasSdkKey: Boolean(this.sdkKey),\n pollingEnabled: this.realtimePollingEnabled\n });\n this.emitConnectionState({ state: this.realtimePollingEnabled ? 'degraded' : 'offline', transport: this.realtimePollingEnabled ? 'polling' : 'none' });\n if (this.realtimePollingEnabled) {\n this.startPolling(true);\n }\n return;\n }\n\n const connectionVersion = ++this.streamConnectVersion;\n const streamToken = await this.fetchStreamToken();\n if (connectionVersion !== this.streamConnectVersion) {\n return;\n }\n\n const url = new URL(this.realtimeSsePath, this.apiBaseUrl);\n if (streamToken) {\n url.searchParams.set('key', streamToken);\n } else {\n url.searchParams.set('sdkKey', this.sdkKey);\n if (this.expectedEnvKey) {\n url.searchParams.set('envKey', this.expectedEnvKey);\n }\n const { userContextHash, userPayloadHash } = this.getRealtimeStreamHashes();\n if (userContextHash) {\n url.searchParams.set('userContextHash', userContextHash);\n }\n if (userPayloadHash) {\n url.searchParams.set('userPayloadHash', userPayloadHash);\n }\n }\n\n debugLog('Connecting SSE', {\n attempt,\n url: url.toString(),\n pollingEnabled: this.realtimePollingEnabled,\n authMode: streamToken ? 'stream-token' : 'sdk-key'\n });\n\n this.eventSource = new EventSourceImpl(url.toString());\n\n this.eventSource.onopen = () => {\n debugLog('SSE connected', {\n attempt,\n url: url.toString()\n });\n this.emitConnectionState({ state: 'connected', transport: 'sse' });\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n };\n\n this.eventSource.onmessage = (event: MessageEvent) => {\n if (this.connectionState.state !== 'connected' || this.connectionState.transport !== 'sse') {\n debugLog('Promoting connection state to connected from SSE message', {\n previousState: this.connectionState.state,\n previousTransport: this.connectionState.transport\n });\n this.emitConnectionState({ state: 'connected', transport: 'sse' });\n }\n\n console.log('SSE message received', {\n raw: String(event.data)\n });\n try {\n const payload = JSON.parse(String(event.data)) as RealtimeEventPayload;\n if (payload.type === 'snapshot.invalidate') {\n const realtimeUser = this.resolveRealtimeUser();\n console.log('Snapshot invalidate message received', {\n payload\n }, realtimeUser);\n if (realtimeUser) {\n console.log('Refetching flags from snapshot invalidate', {\n userKey: realtimeUser.key,\n defaultValue: this.lastDefaultValue\n });\n void this.revalidate(realtimeUser, this.lastDefaultValue, { fromSnapshotInvalidate: true });\n } else {\n debugLog('Snapshot invalidate ignored because no user has been evaluated yet');\n }\n }\n this.applyRealtimeMessage(payload);\n } catch {\n // Ignore malformed realtime messages.\n }\n };\n\n this.eventSource.onerror = () => {\n debugLog('SSE errored', {\n attempt,\n pollingEnabled: this.realtimePollingEnabled,\n reconnectInMs: Math.min(this.backoffMs * (attempt + 1), 30000)\n });\n this.emitConnectionState({\n state: this.realtimePollingEnabled ? 'degraded' : 'offline',\n transport: this.realtimePollingEnabled ? 'polling' : 'none'\n });\n this.eventSource?.close();\n this.eventSource = null;\n if (this.realtimePollingEnabled) {\n this.startPolling(true);\n }\n\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n }\n const backoff = Math.min(this.backoffMs * (attempt + 1), 30000);\n this.reconnectTimer = setTimeout(() => {\n this.connectSse(attempt + 1);\n }, backoff);\n };\n }\n\n startRealtime(): void {\n this.realtimeEnabled = true;\n\n debugLog('Realtime start requested', {\n disconnectWhenHidden: this.realtimeDisconnectWhenHidden,\n visibilityState: typeof document !== 'undefined' ? document.visibilityState : 'unknown',\n pollingEnabled: this.realtimePollingEnabled\n });\n\n this.attachVisibilityHandler();\n if (this.realtimeDisconnectWhenHidden && typeof document !== 'undefined' && document.visibilityState === 'hidden') {\n debugLog('Realtime start skipped because document is hidden');\n return;\n }\n\n this.connectSse(0);\n }\n\n stopRealtime(opts?: { preserveEnabled?: boolean }): void {\n this.streamConnectVersion += 1;\n debugLog('Realtime stop requested', {\n preserveEnabled: Boolean(opts?.preserveEnabled),\n hadEventSource: Boolean(this.eventSource),\n hadPollTimer: Boolean(this.pollTimer),\n hadReconnectTimer: Boolean(this.reconnectTimer)\n });\n\n if (!opts?.preserveEnabled) {\n this.realtimeEnabled = false;\n this.detachVisibilityHandler();\n }\n\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = null;\n }\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.emitConnectionState({ state: 'offline', transport: 'none' });\n }\n\n /**\n * Report observed error metrics (error rate, latency) for a flag back to the FeatureFlare API.\n * The API evaluates the report against active rollback policies and may trigger an automated\n * rollback if configured thresholds are breached.\n *\n * Errors from this call are silently swallowed so that reporting never disrupts the host application.\n */\n async reportError(report: FeatureFlareErrorReport): Promise<void> {\n if (!this.sdkKey) return;\n try {\n await fetch(`${this.apiBaseUrl}/api/v1/sdk/report`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-featureflare-sdk-key': this.sdkKey\n },\n body: JSON.stringify({\n flagKey: report.flagKey,\n errorRate: report.errorRate,\n latencyMs: report.latencyMs,\n observedAt: report.observedAt ?? new Date().toISOString(),\n envKey: this.envKey,\n context: report.context\n })\n });\n } catch {\n // Reporting failures must never surface to the caller.\n }\n }\n\n dispose(): void {\n this.stopRealtime();\n this.listeners.update.clear();\n this.listeners.circuitOpen.clear();\n this.listeners.circuitClose.clear();\n this.listeners.connectionState.clear();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["metadata"],"mappings":"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","file":"index.cjs","sourcesContent":["export type FeatureFlareUserPayload = {\n /** Unique user identifier (preferred). */\n id?: string;\n /** Legacy alias for id. */\n key?: string;\n email?: string;\n name?: string;\n country?: string;\n /** Queryable attributes. */\n meta?: Record<string, string | number | boolean | null>;\n /** Legacy alias for meta. */\n custom?: Record<string, string | number | boolean | null>;\n /** Session data to persist for later product and analytics features. */\n session?: Record<string, string | number | boolean | null>;\n /** Product metrics or counters associated with the current evaluator. */\n metrics?: Record<string, string | number | boolean | null>;\n};\n\ntype FeatureFlareUser = {\n key: string;\n email?: string;\n name?: string;\n country?: string;\n custom?: Record<string, string | number | boolean | null>;\n session?: Record<string, string | number | boolean | null>;\n metrics?: Record<string, string | number | boolean | null>;\n};\n\nconst DEFAULT_FEATUREFLARE_API_BASE_URL =\n 'https://api.featureflare.com';\nconst DEFAULT_CACHE_TTL_MS = 30 * 60 * 1000;\nconst DEFAULT_STALE_TTL_MS = 10 * 60 * 1000;\n\nfunction getApiBaseUrlFromEnv(): string | null {\n if (typeof process !== 'undefined' && process.env) {\n return (\n process.env.FEATUREFLARE_API_BASE_URL?.trim() ||\n process.env.SHIPIT_API_BASE_URL?.trim() ||\n null\n );\n }\n return null;\n}\n\nfunction getApiBaseUrl(explicit?: string): string {\n const fromOptions = explicit?.trim();\n if (fromOptions) return fromOptions;\n\n const fromEnv = getApiBaseUrlFromEnv();\n if (fromEnv) return fromEnv;\n\n return DEFAULT_FEATUREFLARE_API_BASE_URL;\n}\n\nexport type FeatureFlareCacheSource = 'bootstrap' | 'network' | 'realtime' | 'persistent';\nexport type FeatureFlareEvaluationReason = 'fresh_cache' | 'stale_cache' | 'bootstrap' | 'default' | 'network' | 'kill_switch';\n\nexport type FeatureFlareEvaluationMetadata = {\n reason: FeatureFlareEvaluationReason;\n isStale: boolean;\n latencyMs: number;\n source: FeatureFlareCacheSource | 'default' | 'kill_switch';\n updatedAt?: number;\n staleAt?: number;\n expiresAt?: number;\n};\n\nexport type FeatureFlareEvaluationResult = {\n value: boolean;\n metadata: FeatureFlareEvaluationMetadata;\n};\n\nexport type FeatureFlareMetricName =\n | 'ff_eval_latency_ms'\n | 'ff_cache_hit_ratio'\n | 'ff_revalidate_latency_ms'\n | 'ff_realtime_lag_ms'\n | 'ff_killswitch_apply_latency_ms';\n\nexport type FeatureFlareMetricTags = Record<string, string | number | boolean | undefined>;\n\nexport type FeatureFlareErrorReport = {\n /** The flag key being evaluated when the error was observed. */\n flagKey: string;\n /** Observed error rate as a fraction from 0 to 1 (e.g. 0.05 = 5%). */\n errorRate: number;\n /** Observed p99 latency in milliseconds. */\n latencyMs?: number;\n /** ISO-8601 timestamp of the observation window end. Defaults to now. */\n observedAt?: string;\n /** Optional free-form context about the error (e.g. HTTP status, exception name). */\n context?: Record<string, string | number | boolean>;\n};\n\nexport type FeatureFlarePersistentSnapshot = {\n revision?: number;\n killSwitches?: string[];\n flags: Record<\n string,\n {\n value: boolean;\n updatedAt: number;\n staleAt: number;\n expiresAt: number;\n source?: FeatureFlareCacheSource;\n revision?: number;\n }\n >;\n};\n\nexport type FeatureFlarePersistentCacheAdapter = {\n load: (envKey: string) => Promise<FeatureFlarePersistentSnapshot | null> | FeatureFlarePersistentSnapshot | null;\n save: (envKey: string, snapshot: FeatureFlarePersistentSnapshot) => Promise<void> | void;\n};\n\nexport type FeatureFlareBootstrapPayload = {\n revision?: number;\n killSwitches?: string[];\n flags?:\n | Record<string, boolean>\n | Array<{ key: string; value: boolean; revision?: number; updatedAt?: number }>;\n};\n\nexport type FeatureFlareClientOptions = {\n apiBaseUrl?: string;\n sdkKey?: string;\n projectKey?: string;\n envKey?: string;\n getRealtimeUser?: () => FeatureFlareUserPayload | null | undefined;\n timeoutMs?: number;\n maxRetries?: number;\n backoffMs?: number;\n jitter?: number;\n cacheTtlMs?: number;\n staleTtlMs?: number;\n bootstrap?: FeatureFlareBootstrapPayload;\n persistentCache?: FeatureFlarePersistentCacheAdapter;\n onMetric?: (metricName: FeatureFlareMetricName, value: number, tags?: FeatureFlareMetricTags) => void;\n realtime?: {\n enabled?: boolean;\n pollingIntervalMs?: number;\n ssePath?: string;\n disconnectWhenHidden?: boolean;\n };\n};\n\ntype CacheItem = {\n envKey: string;\n flagKey: string;\n value: boolean;\n updatedAt: number;\n staleAt: number;\n expiresAt: number;\n source: FeatureFlareCacheSource;\n revision: number;\n};\n\ntype RealtimeEventPayload = {\n type: 'flag.updated' | 'flag.deleted' | 'env.kill_switch.updated' | 'snapshot.invalidate';\n timestamp?: number;\n revision?: number;\n data?: Record<string, unknown>;\n};\n\ntype StreamTokenResponse = {\n key?: string;\n};\n\ntype FeatureFlareClientEvents = {\n update: {\n changedKeys: string[];\n source: FeatureFlareCacheSource | 'network';\n /** Set when a server snapshot invalidation caused a full flags refetch; listeners should refresh UI even if values are unchanged. */\n snapshotInvalidate?: boolean;\n };\n circuitOpen: { envKey: string; reason: string };\n circuitClose: { envKey: string };\n connectionState: { state: 'connected' | 'degraded' | 'offline'; transport: 'sse' | 'polling' | 'none' };\n};\n\ntype FeatureFlareConnectionState = FeatureFlareClientEvents['connectionState'];\n\nfunction getEnvKeyFromEnv(): string | null {\n if (typeof process !== 'undefined' && process.env) {\n return (\n process.env.FEATUREFLARE_ENV_KEY?.trim() ||\n process.env.SHIPIT_ENV_KEY?.trim() ||\n null\n );\n }\n return null;\n}\n\nfunction normalizeHashInput(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => normalizeHashInput(entry));\n }\n\n if (value && typeof value === 'object') {\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, entryValue]) => entryValue !== undefined)\n .sort(([leftKey], [rightKey]) => leftKey.localeCompare(rightKey));\n\n return Object.fromEntries(entries.map(([key, entryValue]) => [key, normalizeHashInput(entryValue)]));\n }\n\n return value;\n}\n\nfunction hashForStream(value: unknown): string {\n const input = JSON.stringify(normalizeHashInput(value));\n\n let forward = 0x811c9dc5;\n let backward = 0x811c9dc5;\n for (let index = 0; index < input.length; index += 1) {\n forward ^= input.charCodeAt(index);\n forward = Math.imul(forward, 0x01000193);\n\n const reverseIndex = input.length - 1 - index;\n backward ^= input.charCodeAt(reverseIndex);\n backward = Math.imul(backward, 0x01000193);\n }\n\n return `${(forward >>> 0).toString(16).padStart(8, '0')}${(backward >>> 0).toString(16).padStart(8, '0')}`;\n}\n\nfunction encodeBase64Url(value: string): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(value, 'utf8').toString('base64url');\n }\n\n const bytes = typeof TextEncoder !== 'undefined' ? new TextEncoder().encode(value) : [];\n let binary = '';\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n\n const base64 = typeof btoa === 'function' ? btoa(binary) : '';\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\n}\n\ntype HashedRealtimeUserContext = {\n payloadHash: string;\n fields: Partial<Record<'id' | 'key' | 'email' | 'name' | 'country', string>>;\n metaEntries: Array<{ keyHash: string; valueHash: string }>;\n customEntries: Array<{ keyHash: string; valueHash: string }>;\n};\n\nfunction buildHashedRealtimeUserContext(input: FeatureFlareUserPayload): HashedRealtimeUserContext {\n const payload = {\n id: input.id ?? input.key\n };\n\n return {\n payloadHash: hashForStream(payload),\n fields: {\n ...((input.id ?? input.key) ? { id: hashForStream(input.id ?? input.key) } : {})\n },\n metaEntries: [],\n customEntries: []\n };\n}\n\nfunction getSdkKeyFromEnv(): string | null {\n if (typeof process !== 'undefined' && process.env) {\n return (\n process.env.FEATUREFLARE_CLIENT_KEY?.trim() ||\n process.env.FEATUREFLARE_SERVER_KEY?.trim() ||\n process.env.SHIPIT_CLIENT_KEY?.trim() ||\n process.env.SHIPIT_SERVER_KEY?.trim() ||\n null\n );\n }\n return null;\n}\n\nfunction monotonicNow(): number {\n if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\n return performance.now();\n }\n return Date.now();\n}\n\nfunction isFeatureFlareDebugEnabled(): boolean {\n const envDebug =\n typeof process !== 'undefined' && process.env\n ? process.env.NEXT_PUBLIC_FEATUREFLARE_DEBUG?.trim() || process.env.FEATUREFLARE_DEBUG?.trim()\n : '';\n\n if (envDebug === '1' || envDebug?.toLowerCase() === 'true') {\n return true;\n }\n\n if (typeof window !== 'undefined') {\n try {\n const storageDebug = window.localStorage.getItem('featureflare:debug');\n return storageDebug === '1' || storageDebug?.toLowerCase() === 'true';\n } catch {\n return false;\n }\n }\n\n return false;\n}\n\nfunction debugLog(message: string, details?: Record<string, unknown>): void {\n if (!isFeatureFlareDebugEnabled()) {\n return;\n }\n\n if (details) {\n console.debug(`[FeatureFlare SDK] ${message}`, details);\n return;\n }\n\n console.debug(`[FeatureFlare SDK] ${message}`);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction isRetriableStatus(status: number): boolean {\n return status === 408 || status === 425 || status === 429 || status >= 500;\n}\n\nfunction normalizeBoolMap(\n input: { flags?: Array<{ key: string; value: boolean }>; values?: Record<string, boolean> }\n): Array<{ key: string; value: boolean }> {\n if (Array.isArray(input.flags)) {\n return input.flags\n .filter((entry): entry is { key: string; value: boolean } =>\n Boolean(entry) && typeof entry.key === 'string' && typeof entry.value === 'boolean'\n )\n .map((entry) => ({ key: entry.key, value: entry.value }));\n }\n\n const values = input.values ?? {};\n return Object.entries(values).map(([key, value]) => ({ key, value: Boolean(value) }));\n}\n\nexport class InMemoryMetricsCollector {\n private readonly buckets = new Map<string, number[]>();\n\n record = (metricName: FeatureFlareMetricName, value: number, tags?: FeatureFlareMetricTags) => {\n const key = `${metricName}:${JSON.stringify(tags ?? {})}`;\n const list = this.buckets.get(key) ?? [];\n list.push(value);\n this.buckets.set(key, list);\n };\n\n get(metricName: FeatureFlareMetricName): Array<{ tags: FeatureFlareMetricTags; values: number[] }> {\n const rows: Array<{ tags: FeatureFlareMetricTags; values: number[] }> = [];\n for (const [key, values] of this.buckets.entries()) {\n if (!key.startsWith(`${metricName}:`)) continue;\n rows.push({\n tags: JSON.parse(key.slice(metricName.length + 1)) as FeatureFlareMetricTags,\n values: [...values]\n });\n }\n return rows;\n }\n}\n\nexport class FeatureFlareClient {\n private readonly apiBaseUrl: string;\n private readonly sdkKey: string | null;\n private readonly projectKey: string | null;\n private readonly envKey: string;\n private readonly expectedEnvKey: string | null;\n private readonly getRealtimeUser?: () => FeatureFlareUserPayload | null | undefined;\n private readonly timeoutMs: number;\n private readonly maxRetries: number;\n private readonly backoffMs: number;\n private readonly jitter: number;\n private readonly cacheTtlMs: number;\n private readonly staleTtlMs: number;\n private readonly persistentCache: FeatureFlarePersistentCacheAdapter | undefined;\n private readonly onMetric?: (metricName: FeatureFlareMetricName, value: number, tags?: FeatureFlareMetricTags) => void;\n private readonly listeners: {\n [K in keyof FeatureFlareClientEvents]: Set<(payload: FeatureFlareClientEvents[K]) => void>;\n } = {\n update: new Set(),\n circuitOpen: new Set(),\n circuitClose: new Set(),\n connectionState: new Set()\n };\n\n private readonly cache = new Map<string, CacheItem>();\n private readonly diagnostics = new Map<string, FeatureFlareEvaluationMetadata>();\n private readonly killSwitches = new Set<string>();\n\n private revision = 0;\n private circuitOpen = false;\n private persistentLoadPromise: Promise<void> | null = null;\n private readonly inFlightRevalidate = new Map<string, Promise<Array<{ key: string; value: boolean }> | null>>();\n private lastUser: FeatureFlareUser | null = null;\n private lastDefaultValue = false;\n\n private realtimeEnabled = true;\n private realtimePollingEnabled = true;\n private realtimePollingMs = 15000;\n private realtimeSsePath = '/api/v1/sdk/stream';\n private realtimeDisconnectWhenHidden = true;\n private visibilityListenerAttached = false;\n private connectionState: FeatureFlareConnectionState = { state: 'offline', transport: 'none' };\n private pollTimer: ReturnType<typeof setTimeout> | null = null;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private eventSource: EventSource | null = null;\n private streamConnectVersion = 0;\n\n constructor(options: FeatureFlareClientOptions = {}) {\n this.apiBaseUrl = getApiBaseUrl(options.apiBaseUrl).replace(/\\/$/, '');\n this.sdkKey = options.sdkKey?.trim() || getSdkKeyFromEnv();\n this.projectKey = options.projectKey?.trim() ? options.projectKey.trim() : null;\n const explicitOrEnvKey = options.envKey?.trim() || getEnvKeyFromEnv() || null;\n this.envKey = explicitOrEnvKey ?? 'production';\n this.expectedEnvKey = explicitOrEnvKey;\n this.getRealtimeUser = options.getRealtimeUser;\n\n if (!this.sdkKey && !this.projectKey) {\n throw new Error(\n 'FeatureFlareClient requires either sdkKey (recommended) or projectKey (legacy). Set FEATUREFLARE_CLIENT_KEY or FEATUREFLARE_SERVER_KEY env var, or pass sdkKey in options.'\n );\n }\n\n this.timeoutMs = Number.isFinite(options.timeoutMs) && (options.timeoutMs ?? 0) > 0 ? Number(options.timeoutMs) : 3000;\n this.maxRetries = Number.isFinite(options.maxRetries) && (options.maxRetries ?? 0) >= 0 ? Number(options.maxRetries) : 2;\n this.backoffMs = Number.isFinite(options.backoffMs) && (options.backoffMs ?? 0) > 0 ? Number(options.backoffMs) : 200;\n this.jitter = Number.isFinite(options.jitter) && (options.jitter ?? 0) >= 0 ? Number(options.jitter) : 0.25;\n\n this.cacheTtlMs = Number.isFinite(options.cacheTtlMs) && (options.cacheTtlMs ?? 0) > 0 ? Number(options.cacheTtlMs) : DEFAULT_CACHE_TTL_MS;\n const configuredStaleTtlMs =\n Number.isFinite(options.staleTtlMs) && (options.staleTtlMs ?? 0) > 0 ? Number(options.staleTtlMs) : DEFAULT_STALE_TTL_MS;\n this.staleTtlMs = Math.min(configuredStaleTtlMs, this.cacheTtlMs);\n\n this.persistentCache = options.persistentCache;\n this.onMetric = options.onMetric;\n\n this.realtimeEnabled = options.realtime?.enabled ?? true;\n const configuredPollingIntervalMs = Number(options.realtime?.pollingIntervalMs ?? NaN);\n if (Number.isFinite(configuredPollingIntervalMs) && configuredPollingIntervalMs === 0) {\n this.realtimePollingEnabled = false;\n this.realtimePollingMs = 0;\n } else {\n this.realtimePollingEnabled = true;\n this.realtimePollingMs =\n Number.isFinite(configuredPollingIntervalMs) && configuredPollingIntervalMs > 0\n ? configuredPollingIntervalMs\n : 15000;\n }\n this.realtimeSsePath = options.realtime?.ssePath ?? '/api/v1/sdk/stream';\n this.realtimeDisconnectWhenHidden = options.realtime?.disconnectWhenHidden ?? true;\n\n this.applyBootstrap(options.bootstrap);\n this.persistentLoadPromise = this.loadPersistentCache();\n\n if (this.realtimeEnabled && this.sdkKey) {\n this.attachVisibilityHandler();\n if (this.realtimeDisconnectWhenHidden && typeof document !== 'undefined' && document.visibilityState === 'hidden') {\n return;\n }\n this.startRealtime();\n }\n }\n\n private readonly handleVisibilityChange = (): void => {\n if (!this.realtimeDisconnectWhenHidden || typeof document === 'undefined') return;\n\n debugLog('Visibility changed', {\n visibilityState: document.visibilityState,\n realtimeEnabled: this.realtimeEnabled,\n hasEventSource: Boolean(this.eventSource)\n });\n\n if (document.visibilityState === 'hidden') {\n this.stopRealtime({ preserveEnabled: true });\n return;\n }\n\n if (this.realtimeEnabled && this.sdkKey && !this.eventSource) {\n this.connectSse(0);\n }\n };\n\n private attachVisibilityHandler(): void {\n if (!this.realtimeDisconnectWhenHidden || this.visibilityListenerAttached || typeof document === 'undefined') return;\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n this.visibilityListenerAttached = true;\n }\n\n private detachVisibilityHandler(): void {\n if (!this.visibilityListenerAttached || typeof document === 'undefined') return;\n document.removeEventListener('visibilitychange', this.handleVisibilityChange);\n this.visibilityListenerAttached = false;\n }\n\n private getCacheKey(flagKey: string): string {\n return `${this.envKey}:${flagKey}`;\n }\n\n private normalizeUser(input: FeatureFlareUserPayload): FeatureFlareUser {\n const key = (input.id ?? input.key ?? '').trim();\n if (!key) throw new Error('FeatureFlareClient requires user.id (or legacy user.key).');\n return {\n key,\n email: input.email,\n name: input.name,\n country: input.country,\n custom: input.meta ?? input.custom,\n session: input.session,\n metrics: input.metrics\n };\n }\n\n private resolveRealtimeUserPayload(): FeatureFlareUserPayload | null {\n const candidate = this.getRealtimeUser?.();\n if (candidate) {\n try {\n const normalizedUser = this.normalizeUser(candidate);\n this.lastUser = normalizedUser;\n return candidate;\n } catch {\n // Ignore invalid callback payloads and fall back to the last known valid user.\n }\n }\n\n if (!this.lastUser) {\n return null;\n }\n\n return {\n id: this.lastUser.key,\n email: this.lastUser.email,\n name: this.lastUser.name,\n country: this.lastUser.country,\n meta: this.lastUser.custom,\n session: this.lastUser.session,\n metrics: this.lastUser.metrics\n };\n }\n\n private resolveRealtimeUser(): FeatureFlareUser | null {\n const candidate = this.resolveRealtimeUserPayload();\n if (candidate) {\n try {\n const normalizedUser = this.normalizeUser(candidate);\n this.lastUser = normalizedUser;\n return normalizedUser;\n } catch {\n // Ignore invalid callback payloads and fall back to the last known valid user.\n }\n }\n\n return this.lastUser;\n }\n\n private getRealtimeStreamHashes(): { userContextHash?: string; userPayloadHash?: string } {\n const realtimeUserPayload = this.resolveRealtimeUserPayload();\n if (!realtimeUserPayload) {\n return {};\n }\n\n const hashedContext = buildHashedRealtimeUserContext(realtimeUserPayload);\n return {\n userContextHash: encodeBase64Url(JSON.stringify(hashedContext)),\n userPayloadHash: hashedContext.payloadHash\n };\n }\n\n private async fetchStreamToken(): Promise<string | null> {\n if (!this.sdkKey || typeof fetch !== 'function') {\n return null;\n }\n\n const { userContextHash, userPayloadHash } = this.getRealtimeStreamHashes();\n\n try {\n const response = await fetch(`${this.apiBaseUrl}/api/v1/sdk/stream-token`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-featureflare-sdk-key': this.sdkKey\n },\n body: JSON.stringify({\n expectedEnvKey: this.expectedEnvKey ?? undefined,\n userContextHash,\n userPayloadHash\n })\n });\n\n if (!response.ok) {\n return null;\n }\n\n const payload = (await response.json()) as StreamTokenResponse;\n return typeof payload.key === 'string' && payload.key.trim() ? payload.key : null;\n } catch {\n return null;\n }\n }\n\n private emit<K extends keyof FeatureFlareClientEvents>(event: K, payload: FeatureFlareClientEvents[K]): void {\n for (const listener of this.listeners[event]) {\n listener(payload);\n }\n }\n\n private emitConnectionState(state: FeatureFlareConnectionState): void {\n this.connectionState = state;\n this.emit('connectionState', state);\n }\n\n on<K extends keyof FeatureFlareClientEvents>(\n event: K,\n listener: (payload: FeatureFlareClientEvents[K]) => void\n ): () => void {\n this.listeners[event].add(listener);\n if (event === 'connectionState') {\n (listener as (payload: FeatureFlareConnectionState) => void)(this.connectionState);\n }\n return () => {\n this.listeners[event].delete(listener);\n };\n }\n\n isRealtimeEnabled(): boolean {\n return this.realtimeEnabled && Boolean(this.sdkKey);\n }\n\n private emitMetric(metricName: FeatureFlareMetricName, value: number, tags?: FeatureFlareMetricTags): void {\n this.onMetric?.(metricName, value, tags);\n }\n\n private async ensurePersistentLoaded(): Promise<void> {\n if (!this.persistentLoadPromise) return;\n await this.persistentLoadPromise;\n }\n\n private async loadPersistentCache(): Promise<void> {\n if (!this.persistentCache) return;\n try {\n const snapshot = await this.persistentCache.load(this.envKey);\n if (!snapshot) return;\n this.revision = Math.max(this.revision, snapshot.revision ?? 0);\n for (const killSwitchKey of snapshot.killSwitches ?? []) {\n this.killSwitches.add(killSwitchKey);\n }\n\n for (const [flagKey, item] of Object.entries(snapshot.flags ?? {})) {\n const existing = this.cache.get(this.getCacheKey(flagKey));\n if (existing && existing.source === 'bootstrap') continue;\n this.cache.set(this.getCacheKey(flagKey), {\n envKey: this.envKey,\n flagKey,\n value: Boolean(item.value),\n updatedAt: Number(item.updatedAt) || Date.now(),\n staleAt: Number(item.staleAt) || Date.now(),\n expiresAt: Number(item.expiresAt) || Date.now(),\n source: item.source ?? 'persistent',\n revision: item.revision ?? 0\n });\n }\n } catch {\n // Ignore persistent cache failures; runtime must stay non-throwing for outage semantics.\n }\n }\n\n private async persistCache(): Promise<void> {\n if (!this.persistentCache) return;\n const snapshot: FeatureFlarePersistentSnapshot = {\n revision: this.revision,\n killSwitches: [...this.killSwitches],\n flags: {}\n };\n\n for (const [key, item] of this.cache.entries()) {\n if (!key.startsWith(`${this.envKey}:`)) continue;\n snapshot.flags[item.flagKey] = {\n value: item.value,\n updatedAt: item.updatedAt,\n staleAt: item.staleAt,\n expiresAt: item.expiresAt,\n source: item.source,\n revision: item.revision\n };\n }\n\n try {\n await this.persistentCache.save(this.envKey, snapshot);\n } catch {\n // Persistent errors must not break evaluation.\n }\n }\n\n private makeCacheWindow(at = Date.now()): Pick<CacheItem, 'updatedAt' | 'staleAt' | 'expiresAt'> {\n return {\n updatedAt: at,\n staleAt: at + this.staleTtlMs,\n expiresAt: at + this.cacheTtlMs\n };\n }\n\n private setCacheItem(\n flagKey: string,\n value: boolean,\n source: FeatureFlareCacheSource,\n revision = this.revision,\n at = Date.now()\n ): void {\n this.cache.set(this.getCacheKey(flagKey), {\n envKey: this.envKey,\n flagKey,\n value,\n source,\n revision,\n ...this.makeCacheWindow(at)\n });\n }\n\n private applyBootstrap(bootstrap?: FeatureFlareBootstrapPayload): void {\n if (!bootstrap) return;\n this.revision = Math.max(this.revision, bootstrap.revision ?? 0);\n for (const killSwitchKey of bootstrap.killSwitches ?? []) {\n this.killSwitches.add(killSwitchKey);\n }\n\n const apply = (flagKey: string, value: boolean, revision?: number, updatedAt?: number) => {\n this.setCacheItem(flagKey, value, 'bootstrap', revision ?? this.revision, updatedAt ?? Date.now());\n };\n\n if (Array.isArray(bootstrap.flags)) {\n for (const item of bootstrap.flags) {\n if (!item || typeof item.key !== 'string') continue;\n apply(item.key, Boolean(item.value), item.revision, item.updatedAt);\n }\n return;\n }\n\n for (const [flagKey, value] of Object.entries(bootstrap.flags ?? {})) {\n apply(flagKey, Boolean(value));\n }\n }\n\n private getCacheState(item: CacheItem | undefined, now = Date.now()): 'fresh' | 'stale' | 'expired' | 'missing' {\n if (!item) return 'missing';\n if (now <= item.staleAt) return 'fresh';\n if (now <= item.expiresAt) return 'stale';\n return 'expired';\n }\n\n private setCircuitState(isOpen: boolean, reason = ''): void {\n if (this.circuitOpen === isOpen) return;\n this.circuitOpen = isOpen;\n if (isOpen) {\n this.emit('circuitOpen', { envKey: this.envKey, reason });\n return;\n }\n this.emit('circuitClose', { envKey: this.envKey });\n }\n\n private async fetchWithRetry(url: string, init: RequestInit, transport: 'network' | 'polling') {\n let lastError: unknown = null;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n const ac = typeof AbortController !== 'undefined' ? new AbortController() : null;\n const timeout =\n ac !== null\n ? setTimeout(() => {\n ac.abort();\n }, this.timeoutMs)\n : null;\n\n try {\n const response = await fetch(url, {\n ...init,\n signal: ac?.signal\n });\n\n if (timeout) clearTimeout(timeout);\n\n if (!response.ok && isRetriableStatus(response.status) && attempt < this.maxRetries) {\n lastError = new Error(`HTTP ${response.status}`);\n const jitterOffset = this.backoffMs * this.jitter * Math.random();\n await sleep(this.backoffMs * (attempt + 1) + jitterOffset);\n continue;\n }\n\n return response;\n } catch (error) {\n if (timeout) clearTimeout(timeout);\n lastError = error;\n if (attempt >= this.maxRetries) break;\n const jitterOffset = this.backoffMs * this.jitter * Math.random();\n await sleep(this.backoffMs * (attempt + 1) + jitterOffset);\n }\n }\n\n this.setCircuitState(true, transport);\n throw lastError;\n }\n\n private collectCachedFlags(): Array<{ key: string; value: boolean }> {\n const now = Date.now();\n const flags: Array<{ key: string; value: boolean }> = [];\n\n for (const [cacheKey, item] of this.cache.entries()) {\n if (!cacheKey.startsWith(`${this.envKey}:`)) continue;\n if (this.killSwitches.has(item.flagKey)) {\n flags.push({ key: item.flagKey, value: false });\n continue;\n }\n\n const state = this.getCacheState(item, now);\n if (state === 'missing' || state === 'expired') continue;\n flags.push({ key: item.flagKey, value: item.value });\n }\n\n return flags.sort((a, b) => a.key.localeCompare(b.key));\n }\n\n getCachedFlags(): {\n flags: Array<{ key: string; value: boolean }>;\n hasData: boolean;\n } {\n const flags = this.collectCachedFlags();\n return { flags, hasData: flags.length > 0 };\n }\n\n getFlagDiagnostics(flagKey: string): FeatureFlareEvaluationMetadata | null {\n return this.diagnostics.get(this.getCacheKey(flagKey)) ?? null;\n }\n\n setKillSwitch(flagKey: string, enabled: boolean): void {\n const started = monotonicNow();\n if (enabled) {\n this.killSwitches.add(flagKey);\n } else {\n this.killSwitches.delete(flagKey);\n }\n const elapsed = monotonicNow() - started;\n this.emitMetric('ff_killswitch_apply_latency_ms', elapsed, {\n env: this.envKey,\n result: enabled ? 'enabled' : 'disabled'\n });\n this.emit('update', { changedKeys: [flagKey], source: 'realtime' });\n void this.persistCache();\n }\n\n private async fetchEvalFromNetwork(\n flagKey: string,\n normalizedUser: FeatureFlareUser,\n defaultValue: boolean\n ): Promise<boolean | null> {\n const response = this.sdkKey\n ? await this.fetchWithRetry(\n `${this.apiBaseUrl}/api/v1/sdk/eval`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-featureflare-sdk-key': this.sdkKey\n },\n body: JSON.stringify({\n flagKey,\n user: normalizedUser,\n defaultValue,\n expectedEnvKey: this.expectedEnvKey ?? undefined\n })\n },\n 'network'\n )\n : await this.fetchWithRetry(\n `${this.apiBaseUrl}/api/v1/eval`,\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n projectKey: this.projectKey,\n envKey: this.envKey,\n flagKey,\n user: normalizedUser,\n defaultValue\n })\n },\n 'network'\n );\n\n if (!response.ok) {\n if (!isRetriableStatus(response.status)) {\n this.setCircuitState(true, `http_${response.status}`);\n }\n return null;\n }\n\n const json = (await response.json()) as { value?: boolean; revision?: number; killSwitch?: boolean };\n const value = typeof json.value === 'boolean' ? json.value : defaultValue;\n\n if (json.killSwitch === true) {\n this.killSwitches.add(flagKey);\n }\n\n const revision = json.revision ?? this.revision;\n this.revision = Math.max(this.revision, revision);\n this.setCacheItem(flagKey, value, 'network', revision);\n this.setCircuitState(false);\n void this.persistCache();\n this.emit('update', { changedKeys: [flagKey], source: 'network' });\n return value;\n }\n\n private async fetchFlagsFromNetwork(\n normalizedUser: FeatureFlareUser,\n defaultValue: boolean,\n transport: 'network' | 'polling',\n opts?: { fromSnapshotInvalidate?: boolean }\n ): Promise<Array<{ key: string; value: boolean }> | null> {\n if (!this.sdkKey) {\n return null;\n }\n\n const started = monotonicNow();\n\n debugLog('Fetching flags', {\n transport,\n fromSnapshotInvalidate: Boolean(opts?.fromSnapshotInvalidate),\n userKey: normalizedUser.key,\n defaultValue\n });\n\n try {\n const response = await this.fetchWithRetry(\n `${this.apiBaseUrl}/api/v1/sdk/flags`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-featureflare-sdk-key': this.sdkKey\n },\n body: JSON.stringify({\n user: normalizedUser,\n defaultValue,\n expectedEnvKey: this.expectedEnvKey ?? undefined\n })\n },\n transport\n );\n\n if (!response.ok) {\n if (!isRetriableStatus(response.status)) {\n this.setCircuitState(true, `http_${response.status}`);\n }\n return null;\n }\n\n const json = (await response.json()) as {\n flags?: Array<{ key: string; value: boolean }>;\n values?: Record<string, boolean>;\n revision?: number;\n killSwitches?: string[];\n };\n\n const list = normalizeBoolMap(json);\n const revision = json.revision ?? this.revision;\n this.revision = Math.max(this.revision, revision);\n\n if (Array.isArray(json.killSwitches)) {\n for (const key of json.killSwitches) {\n this.killSwitches.add(key);\n }\n }\n\n const changed = new Set<string>();\n for (const entry of list) {\n const existing = this.cache.get(this.getCacheKey(entry.key));\n if (!existing || existing.value !== entry.value || existing.revision !== revision) {\n changed.add(entry.key);\n }\n this.setCacheItem(entry.key, entry.value, 'network', revision);\n }\n\n if (opts?.fromSnapshotInvalidate && list !== null) {\n this.emit('update', {\n changedKeys: list.map((e) => e.key),\n source: 'realtime',\n snapshotInvalidate: true\n });\n } else if (changed.size > 0) {\n this.emit('update', { changedKeys: [...changed], source: 'network' });\n }\n\n this.setCircuitState(false);\n void this.persistCache();\n this.emitMetric('ff_revalidate_latency_ms', monotonicNow() - started, {\n env: this.envKey,\n transport\n });\n debugLog('Fetched flags', {\n transport,\n fromSnapshotInvalidate: Boolean(opts?.fromSnapshotInvalidate),\n flagsCount: list.length,\n revision\n });\n return list;\n } catch {\n this.emitMetric('ff_revalidate_latency_ms', monotonicNow() - started, {\n env: this.envKey,\n transport,\n result: 'error'\n });\n debugLog('Fetch flags failed', {\n transport,\n fromSnapshotInvalidate: Boolean(opts?.fromSnapshotInvalidate)\n });\n return null;\n }\n }\n\n private revalidate(\n normalizedUser: FeatureFlareUser,\n defaultValue: boolean,\n opts?: { fromSnapshotInvalidate?: boolean }\n ): Promise<Array<{ key: string; value: boolean }> | null> {\n const existing = this.inFlightRevalidate.get(this.envKey);\n if (existing) {\n if (opts?.fromSnapshotInvalidate) {\n void existing.then((list) => {\n if (list !== null) {\n this.emit('update', {\n changedKeys: list.map((e) => e.key),\n source: 'realtime',\n snapshotInvalidate: true\n });\n }\n });\n }\n return existing;\n }\n\n const promise = this.fetchFlagsFromNetwork(normalizedUser, defaultValue, 'network', opts).finally(() => {\n this.inFlightRevalidate.delete(this.envKey);\n });\n\n this.inFlightRevalidate.set(this.envKey, promise);\n return promise;\n }\n\n async evaluate(\n flagKey: string,\n user: FeatureFlareUserPayload,\n defaultValue = false\n ): Promise<FeatureFlareEvaluationResult> {\n const started = monotonicNow();\n await this.ensurePersistentLoaded();\n\n const normalizedUser = this.normalizeUser(user);\n this.lastUser = normalizedUser;\n this.lastDefaultValue = defaultValue;\n\n if (this.killSwitches.has(flagKey)) {\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'kill_switch',\n isStale: false,\n latencyMs: monotonicNow() - started,\n source: 'kill_switch'\n };\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'disabled'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: false, metadata };\n }\n\n const cacheItem = this.cache.get(this.getCacheKey(flagKey));\n const cacheState = this.getCacheState(cacheItem);\n\n if (cacheItem && cacheState === 'fresh') {\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: cacheItem.source === 'bootstrap' || cacheItem.source === 'persistent' ? 'bootstrap' : 'fresh_cache',\n isStale: false,\n latencyMs: monotonicNow() - started,\n source: cacheItem.source,\n updatedAt: cacheItem.updatedAt,\n staleAt: cacheItem.staleAt,\n expiresAt: cacheItem.expiresAt\n };\n this.emitMetric('ff_cache_hit_ratio', 1, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'cache_hit'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: cacheItem.value, metadata };\n }\n\n if (cacheItem && cacheState === 'stale') {\n void this.revalidate(normalizedUser, defaultValue);\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'stale_cache',\n isStale: true,\n latencyMs: monotonicNow() - started,\n source: cacheItem.source,\n updatedAt: cacheItem.updatedAt,\n staleAt: cacheItem.staleAt,\n expiresAt: cacheItem.expiresAt\n };\n this.emitMetric('ff_cache_hit_ratio', 1, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'stale'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: cacheItem.value, metadata };\n }\n\n if (cacheItem && (cacheItem.source === 'bootstrap' || cacheItem.source === 'persistent')) {\n void this.revalidate(normalizedUser, defaultValue);\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'bootstrap',\n isStale: true,\n latencyMs: monotonicNow() - started,\n source: cacheItem.source,\n updatedAt: cacheItem.updatedAt,\n staleAt: cacheItem.staleAt,\n expiresAt: cacheItem.expiresAt\n };\n this.emitMetric('ff_cache_hit_ratio', 1, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'bootstrap'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: cacheItem.value, metadata };\n }\n\n try {\n const networkValue = await this.fetchEvalFromNetwork(flagKey, normalizedUser, defaultValue);\n if (networkValue !== null) {\n const item = this.cache.get(this.getCacheKey(flagKey));\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'network',\n isStale: false,\n latencyMs: monotonicNow() - started,\n source: 'network',\n updatedAt: item?.updatedAt,\n staleAt: item?.staleAt,\n expiresAt: item?.expiresAt\n };\n this.emitMetric('ff_cache_hit_ratio', 0, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'network'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: networkValue, metadata };\n }\n } catch {\n // Fall through to deterministic default for outage semantics.\n }\n\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'default',\n isStale: false,\n latencyMs: monotonicNow() - started,\n source: 'default'\n };\n this.emitMetric('ff_cache_hit_ratio', 0, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'default'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: defaultValue, metadata };\n }\n\n async bool(flagKey: string, user: FeatureFlareUserPayload, defaultValue = false): Promise<boolean> {\n const result = await this.evaluate(flagKey, user, defaultValue);\n return result.value;\n }\n\n async flags(user: FeatureFlareUserPayload, defaultValue = false): Promise<Array<{ key: string; value: boolean }>> {\n await this.ensurePersistentLoaded();\n const normalizedUser = this.normalizeUser(user);\n this.lastUser = normalizedUser;\n this.lastDefaultValue = defaultValue;\n\n const cached = this.collectCachedFlags();\n if (cached.length > 0) {\n void this.revalidate(normalizedUser, defaultValue);\n return cached;\n }\n\n const list = await this.revalidate(normalizedUser, defaultValue);\n if (list && list.length > 0) {\n return list.map((entry) => ({\n key: entry.key,\n value: this.killSwitches.has(entry.key) ? false : entry.value\n }));\n }\n\n return [];\n }\n\n private applyRealtimeMessage(message: RealtimeEventPayload): void {\n if (typeof message.revision === 'number' && message.revision < this.revision) {\n return;\n }\n\n if (typeof message.revision === 'number') {\n this.revision = message.revision;\n }\n\n const changed = new Set<string>();\n const now = Date.now();\n\n if (message.type === 'flag.updated') {\n const flagKey = typeof message.data?.flagKey === 'string' ? message.data.flagKey : null;\n const value = typeof message.data?.value === 'boolean' ? message.data.value : null;\n if (flagKey !== null && value !== null) {\n this.setCacheItem(flagKey, value, 'realtime', message.revision ?? this.revision, now);\n changed.add(flagKey);\n }\n }\n\n if (message.type === 'flag.deleted') {\n const flagKey = typeof message.data?.flagKey === 'string' ? message.data.flagKey : null;\n if (flagKey !== null) {\n this.cache.delete(this.getCacheKey(flagKey));\n changed.add(flagKey);\n }\n }\n\n if (message.type === 'env.kill_switch.updated') {\n const started = monotonicNow();\n const flagKey = typeof message.data?.flagKey === 'string' ? message.data.flagKey : null;\n const enabled = typeof message.data?.enabled === 'boolean' ? message.data.enabled : true;\n if (flagKey !== null) {\n if (enabled) {\n this.killSwitches.add(flagKey);\n } else {\n this.killSwitches.delete(flagKey);\n }\n changed.add(flagKey);\n this.emitMetric('ff_killswitch_apply_latency_ms', monotonicNow() - started, {\n env: this.envKey,\n transport: this.eventSource ? 'sse' : 'polling',\n result: enabled ? 'enabled' : 'disabled'\n });\n }\n }\n\n const eventLagMs = Math.max(0, Date.now() - (message.timestamp ?? Date.now()));\n this.emitMetric('ff_realtime_lag_ms', eventLagMs, {\n env: this.envKey,\n transport: this.eventSource ? 'sse' : 'polling'\n });\n\n if (changed.size > 0) {\n this.emit('update', { changedKeys: [...changed], source: 'realtime' });\n void this.persistCache();\n }\n }\n\n private startPolling(immediate = false): void {\n if (!this.realtimePollingEnabled) {\n debugLog('Polling disabled', {\n immediate,\n reason: 'realtimePollingEnabled=false'\n });\n return;\n }\n\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n\n const tick = async () => {\n // If SSE is active, polling must remain disabled.\n if (this.eventSource) {\n debugLog('Polling tick skipped', {\n reason: 'eventSource-active'\n });\n this.pollTimer = null;\n return;\n }\n\n const realtimeUser = this.resolveRealtimeUser();\n if (!realtimeUser) {\n debugLog('Polling tick deferred', {\n reason: 'missing-realtime-user',\n nextInMs: this.realtimePollingMs\n });\n if (!this.eventSource) {\n this.pollTimer = setTimeout(tick, this.realtimePollingMs);\n }\n return;\n }\n\n debugLog('Polling tick started', {\n intervalMs: this.realtimePollingMs,\n userKey: realtimeUser.key\n });\n\n await this.fetchFlagsFromNetwork(realtimeUser, this.lastDefaultValue, 'polling');\n\n // Avoid resurrecting the polling timer if SSE connected while polling request was in-flight.\n if (!this.eventSource) {\n this.pollTimer = setTimeout(tick, this.realtimePollingMs);\n } else {\n this.pollTimer = null;\n }\n };\n\n if (immediate) {\n debugLog('Polling started immediately', {\n intervalMs: this.realtimePollingMs\n });\n void tick();\n return;\n }\n\n debugLog('Polling scheduled', {\n intervalMs: this.realtimePollingMs\n });\n this.pollTimer = setTimeout(tick, this.realtimePollingMs);\n }\n\n private connectSse(attempt = 0): void {\n void this.connectSseInternal(attempt);\n }\n\n private async connectSseInternal(attempt = 0): Promise<void> {\n const EventSourceImpl = typeof EventSource !== 'undefined' ? EventSource : null;\n if (!EventSourceImpl || !this.sdkKey) {\n debugLog('SSE unavailable, falling back', {\n hasEventSourceImpl: Boolean(EventSourceImpl),\n hasSdkKey: Boolean(this.sdkKey),\n pollingEnabled: this.realtimePollingEnabled\n });\n this.emitConnectionState({ state: this.realtimePollingEnabled ? 'degraded' : 'offline', transport: this.realtimePollingEnabled ? 'polling' : 'none' });\n if (this.realtimePollingEnabled) {\n this.startPolling(true);\n }\n return;\n }\n\n const connectionVersion = ++this.streamConnectVersion;\n const streamToken = await this.fetchStreamToken();\n if (connectionVersion !== this.streamConnectVersion) {\n return;\n }\n\n const url = new URL(this.realtimeSsePath, this.apiBaseUrl);\n if (streamToken) {\n url.searchParams.set('key', streamToken);\n } else {\n url.searchParams.set('sdkKey', this.sdkKey);\n if (this.expectedEnvKey) {\n url.searchParams.set('envKey', this.expectedEnvKey);\n }\n const { userContextHash, userPayloadHash } = this.getRealtimeStreamHashes();\n if (userContextHash) {\n url.searchParams.set('userContextHash', userContextHash);\n }\n if (userPayloadHash) {\n url.searchParams.set('userPayloadHash', userPayloadHash);\n }\n }\n\n debugLog('Connecting SSE', {\n attempt,\n url: url.toString(),\n pollingEnabled: this.realtimePollingEnabled,\n authMode: streamToken ? 'stream-token' : 'sdk-key'\n });\n\n this.eventSource = new EventSourceImpl(url.toString());\n\n this.eventSource.onopen = () => {\n debugLog('SSE connected', {\n attempt,\n url: url.toString()\n });\n this.emitConnectionState({ state: 'connected', transport: 'sse' });\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n };\n\n this.eventSource.onmessage = (event: MessageEvent) => {\n if (this.connectionState.state !== 'connected' || this.connectionState.transport !== 'sse') {\n debugLog('Promoting connection state to connected from SSE message', {\n previousState: this.connectionState.state,\n previousTransport: this.connectionState.transport\n });\n this.emitConnectionState({ state: 'connected', transport: 'sse' });\n }\n\n console.log('SSE message received', {\n raw: String(event.data)\n });\n try {\n const payload = JSON.parse(String(event.data)) as RealtimeEventPayload;\n if (payload.type === 'snapshot.invalidate') {\n const realtimeUser = this.resolveRealtimeUser();\n console.log('Snapshot invalidate message received', {\n payload\n }, realtimeUser);\n if (realtimeUser) {\n console.log('Refetching flags from snapshot invalidate', {\n userKey: realtimeUser.key,\n defaultValue: this.lastDefaultValue\n });\n void this.revalidate(realtimeUser, this.lastDefaultValue, { fromSnapshotInvalidate: true });\n } else {\n debugLog('Snapshot invalidate ignored because no user has been evaluated yet');\n }\n }\n this.applyRealtimeMessage(payload);\n } catch {\n // Ignore malformed realtime messages.\n }\n };\n\n this.eventSource.onerror = () => {\n debugLog('SSE errored', {\n attempt,\n pollingEnabled: this.realtimePollingEnabled,\n reconnectInMs: Math.min(this.backoffMs * (attempt + 1), 30000)\n });\n this.emitConnectionState({\n state: this.realtimePollingEnabled ? 'degraded' : 'offline',\n transport: this.realtimePollingEnabled ? 'polling' : 'none'\n });\n this.eventSource?.close();\n this.eventSource = null;\n if (this.realtimePollingEnabled) {\n this.startPolling(true);\n }\n\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n }\n const backoff = Math.min(this.backoffMs * (attempt + 1), 30000);\n this.reconnectTimer = setTimeout(() => {\n this.connectSse(attempt + 1);\n }, backoff);\n };\n }\n\n startRealtime(): void {\n this.realtimeEnabled = true;\n\n debugLog('Realtime start requested', {\n disconnectWhenHidden: this.realtimeDisconnectWhenHidden,\n visibilityState: typeof document !== 'undefined' ? document.visibilityState : 'unknown',\n pollingEnabled: this.realtimePollingEnabled\n });\n\n this.attachVisibilityHandler();\n if (this.realtimeDisconnectWhenHidden && typeof document !== 'undefined' && document.visibilityState === 'hidden') {\n debugLog('Realtime start skipped because document is hidden');\n return;\n }\n\n this.connectSse(0);\n }\n\n stopRealtime(opts?: { preserveEnabled?: boolean }): void {\n this.streamConnectVersion += 1;\n debugLog('Realtime stop requested', {\n preserveEnabled: Boolean(opts?.preserveEnabled),\n hadEventSource: Boolean(this.eventSource),\n hadPollTimer: Boolean(this.pollTimer),\n hadReconnectTimer: Boolean(this.reconnectTimer)\n });\n\n if (!opts?.preserveEnabled) {\n this.realtimeEnabled = false;\n this.detachVisibilityHandler();\n }\n\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = null;\n }\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.emitConnectionState({ state: 'offline', transport: 'none' });\n }\n\n /**\n * Report observed error metrics (error rate, latency) for a flag back to the FeatureFlare API.\n * The API evaluates the report against active rollback policies and may trigger an automated\n * rollback if configured thresholds are breached.\n *\n * Errors from this call are silently swallowed so that reporting never disrupts the host application.\n */\n async reportError(report: FeatureFlareErrorReport): Promise<void> {\n if (!this.sdkKey) return;\n try {\n await fetch(`${this.apiBaseUrl}/api/v1/sdk/report`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-featureflare-sdk-key': this.sdkKey\n },\n body: JSON.stringify({\n flagKey: report.flagKey,\n errorRate: report.errorRate,\n latencyMs: report.latencyMs,\n observedAt: report.observedAt ?? new Date().toISOString(),\n envKey: this.envKey,\n context: report.context\n })\n });\n } catch {\n // Reporting failures must never surface to the caller.\n }\n }\n\n dispose(): void {\n this.stopRealtime();\n this.listeners.update.clear();\n this.listeners.circuitOpen.clear();\n this.listeners.circuitClose.clear();\n this.listeners.connectionState.clear();\n }\n}\n"]}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":["metadata"],"mappings":"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","file":"index.js","sourcesContent":["export type FeatureFlareUserPayload = {\n /** Unique user identifier (preferred). */\n id?: string;\n /** Legacy alias for id. */\n key?: string;\n email?: string;\n name?: string;\n country?: string;\n /** Queryable attributes. */\n meta?: Record<string, string | number | boolean | null>;\n /** Legacy alias for meta. */\n custom?: Record<string, string | number | boolean | null>;\n /** Session data to persist for later product and analytics features. */\n session?: Record<string, string | number | boolean | null>;\n /** Product metrics or counters associated with the current evaluator. */\n metrics?: Record<string, string | number | boolean | null>;\n};\n\ntype FeatureFlareUser = {\n key: string;\n email?: string;\n name?: string;\n country?: string;\n custom?: Record<string, string | number | boolean | null>;\n session?: Record<string, string | number | boolean | null>;\n metrics?: Record<string, string | number | boolean | null>;\n};\n\nconst DEFAULT_FEATUREFLARE_API_BASE_URL =\n 'https://api.featureflare.com';\nconst DEFAULT_CACHE_TTL_MS = 30 * 60 * 1000;\nconst DEFAULT_STALE_TTL_MS = 10 * 60 * 1000;\n\nfunction getApiBaseUrlFromEnv(): string | null {\n if (typeof process !== 'undefined' && process.env) {\n return (\n process.env.FEATUREFLARE_API_BASE_URL?.trim() ||\n process.env.SHIPIT_API_BASE_URL?.trim() ||\n null\n );\n }\n return null;\n}\n\nfunction getApiBaseUrl(explicit?: string): string {\n const fromOptions = explicit?.trim();\n if (fromOptions) return fromOptions;\n\n const fromEnv = getApiBaseUrlFromEnv();\n if (fromEnv) return fromEnv;\n\n return DEFAULT_FEATUREFLARE_API_BASE_URL;\n}\n\nexport type FeatureFlareCacheSource = 'bootstrap' | 'network' | 'realtime' | 'persistent';\nexport type FeatureFlareEvaluationReason = 'fresh_cache' | 'stale_cache' | 'bootstrap' | 'default' | 'network' | 'kill_switch';\n\nexport type FeatureFlareEvaluationMetadata = {\n reason: FeatureFlareEvaluationReason;\n isStale: boolean;\n latencyMs: number;\n source: FeatureFlareCacheSource | 'default' | 'kill_switch';\n updatedAt?: number;\n staleAt?: number;\n expiresAt?: number;\n};\n\nexport type FeatureFlareEvaluationResult = {\n value: boolean;\n metadata: FeatureFlareEvaluationMetadata;\n};\n\nexport type FeatureFlareMetricName =\n | 'ff_eval_latency_ms'\n | 'ff_cache_hit_ratio'\n | 'ff_revalidate_latency_ms'\n | 'ff_realtime_lag_ms'\n | 'ff_killswitch_apply_latency_ms';\n\nexport type FeatureFlareMetricTags = Record<string, string | number | boolean | undefined>;\n\nexport type FeatureFlareErrorReport = {\n /** The flag key being evaluated when the error was observed. */\n flagKey: string;\n /** Observed error rate as a fraction from 0 to 1 (e.g. 0.05 = 5%). */\n errorRate: number;\n /** Observed p99 latency in milliseconds. */\n latencyMs?: number;\n /** ISO-8601 timestamp of the observation window end. Defaults to now. */\n observedAt?: string;\n /** Optional free-form context about the error (e.g. HTTP status, exception name). */\n context?: Record<string, string | number | boolean>;\n};\n\nexport type FeatureFlarePersistentSnapshot = {\n revision?: number;\n killSwitches?: string[];\n flags: Record<\n string,\n {\n value: boolean;\n updatedAt: number;\n staleAt: number;\n expiresAt: number;\n source?: FeatureFlareCacheSource;\n revision?: number;\n }\n >;\n};\n\nexport type FeatureFlarePersistentCacheAdapter = {\n load: (envKey: string) => Promise<FeatureFlarePersistentSnapshot | null> | FeatureFlarePersistentSnapshot | null;\n save: (envKey: string, snapshot: FeatureFlarePersistentSnapshot) => Promise<void> | void;\n};\n\nexport type FeatureFlareBootstrapPayload = {\n revision?: number;\n killSwitches?: string[];\n flags?:\n | Record<string, boolean>\n | Array<{ key: string; value: boolean; revision?: number; updatedAt?: number }>;\n};\n\nexport type FeatureFlareClientOptions = {\n apiBaseUrl?: string;\n sdkKey?: string;\n projectKey?: string;\n envKey?: string;\n getRealtimeUser?: () => FeatureFlareUserPayload | null | undefined;\n timeoutMs?: number;\n maxRetries?: number;\n backoffMs?: number;\n jitter?: number;\n cacheTtlMs?: number;\n staleTtlMs?: number;\n bootstrap?: FeatureFlareBootstrapPayload;\n persistentCache?: FeatureFlarePersistentCacheAdapter;\n onMetric?: (metricName: FeatureFlareMetricName, value: number, tags?: FeatureFlareMetricTags) => void;\n realtime?: {\n enabled?: boolean;\n pollingIntervalMs?: number;\n ssePath?: string;\n disconnectWhenHidden?: boolean;\n };\n};\n\ntype CacheItem = {\n envKey: string;\n flagKey: string;\n value: boolean;\n updatedAt: number;\n staleAt: number;\n expiresAt: number;\n source: FeatureFlareCacheSource;\n revision: number;\n};\n\ntype RealtimeEventPayload = {\n type: 'flag.updated' | 'flag.deleted' | 'env.kill_switch.updated' | 'snapshot.invalidate';\n timestamp?: number;\n revision?: number;\n data?: Record<string, unknown>;\n};\n\ntype StreamTokenResponse = {\n key?: string;\n};\n\ntype FeatureFlareClientEvents = {\n update: {\n changedKeys: string[];\n source: FeatureFlareCacheSource | 'network';\n /** Set when a server snapshot invalidation caused a full flags refetch; listeners should refresh UI even if values are unchanged. */\n snapshotInvalidate?: boolean;\n };\n circuitOpen: { envKey: string; reason: string };\n circuitClose: { envKey: string };\n connectionState: { state: 'connected' | 'degraded' | 'offline'; transport: 'sse' | 'polling' | 'none' };\n};\n\ntype FeatureFlareConnectionState = FeatureFlareClientEvents['connectionState'];\n\nfunction getEnvKeyFromEnv(): string | null {\n if (typeof process !== 'undefined' && process.env) {\n return (\n process.env.FEATUREFLARE_ENV_KEY?.trim() ||\n process.env.SHIPIT_ENV_KEY?.trim() ||\n null\n );\n }\n return null;\n}\n\nfunction normalizeHashInput(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => normalizeHashInput(entry));\n }\n\n if (value && typeof value === 'object') {\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, entryValue]) => entryValue !== undefined)\n .sort(([leftKey], [rightKey]) => leftKey.localeCompare(rightKey));\n\n return Object.fromEntries(entries.map(([key, entryValue]) => [key, normalizeHashInput(entryValue)]));\n }\n\n return value;\n}\n\nfunction hashForStream(value: unknown): string {\n const input = JSON.stringify(normalizeHashInput(value));\n\n let forward = 0x811c9dc5;\n let backward = 0x811c9dc5;\n for (let index = 0; index < input.length; index += 1) {\n forward ^= input.charCodeAt(index);\n forward = Math.imul(forward, 0x01000193);\n\n const reverseIndex = input.length - 1 - index;\n backward ^= input.charCodeAt(reverseIndex);\n backward = Math.imul(backward, 0x01000193);\n }\n\n return `${(forward >>> 0).toString(16).padStart(8, '0')}${(backward >>> 0).toString(16).padStart(8, '0')}`;\n}\n\nfunction encodeBase64Url(value: string): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(value, 'utf8').toString('base64url');\n }\n\n const bytes = typeof TextEncoder !== 'undefined' ? new TextEncoder().encode(value) : [];\n let binary = '';\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n\n const base64 = typeof btoa === 'function' ? btoa(binary) : '';\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\n}\n\ntype HashedRealtimeUserContext = {\n payloadHash: string;\n fields: Partial<Record<'id' | 'key' | 'email' | 'name' | 'country', string>>;\n metaEntries: Array<{ keyHash: string; valueHash: string }>;\n customEntries: Array<{ keyHash: string; valueHash: string }>;\n};\n\nfunction hashRecordEntries(record?: Record<string, string | number | boolean | null>): Array<{ keyHash: string; valueHash: string }> {\n if (!record) {\n return [];\n }\n\n return Object.entries(record)\n .sort(([leftKey], [rightKey]) => leftKey.localeCompare(rightKey))\n .map(([key, value]) => ({\n keyHash: hashForStream(key),\n valueHash: hashForStream(value)\n }));\n}\n\nfunction buildHashedRealtimeUserContext(input: FeatureFlareUserPayload): HashedRealtimeUserContext {\n const payload = {\n id: input.id ?? input.key\n };\n\n return {\n payloadHash: hashForStream(payload),\n fields: {\n ...((input.id ?? input.key) ? { id: hashForStream(input.id ?? input.key) } : {})\n },\n metaEntries: [],\n customEntries: []\n };\n}\n\nfunction getSdkKeyFromEnv(): string | null {\n if (typeof process !== 'undefined' && process.env) {\n return (\n process.env.FEATUREFLARE_CLIENT_KEY?.trim() ||\n process.env.FEATUREFLARE_SERVER_KEY?.trim() ||\n process.env.SHIPIT_CLIENT_KEY?.trim() ||\n process.env.SHIPIT_SERVER_KEY?.trim() ||\n null\n );\n }\n return null;\n}\n\nfunction monotonicNow(): number {\n if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\n return performance.now();\n }\n return Date.now();\n}\n\nfunction isFeatureFlareDebugEnabled(): boolean {\n const envDebug =\n typeof process !== 'undefined' && process.env\n ? process.env.NEXT_PUBLIC_FEATUREFLARE_DEBUG?.trim() || process.env.FEATUREFLARE_DEBUG?.trim()\n : '';\n\n if (envDebug === '1' || envDebug?.toLowerCase() === 'true') {\n return true;\n }\n\n if (typeof window !== 'undefined') {\n try {\n const storageDebug = window.localStorage.getItem('featureflare:debug');\n return storageDebug === '1' || storageDebug?.toLowerCase() === 'true';\n } catch {\n return false;\n }\n }\n\n return false;\n}\n\nfunction debugLog(message: string, details?: Record<string, unknown>): void {\n if (!isFeatureFlareDebugEnabled()) {\n return;\n }\n\n if (details) {\n console.debug(`[FeatureFlare SDK] ${message}`, details);\n return;\n }\n\n console.debug(`[FeatureFlare SDK] ${message}`);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction isRetriableStatus(status: number): boolean {\n return status === 408 || status === 425 || status === 429 || status >= 500;\n}\n\nfunction normalizeBoolMap(\n input: { flags?: Array<{ key: string; value: boolean }>; values?: Record<string, boolean> }\n): Array<{ key: string; value: boolean }> {\n if (Array.isArray(input.flags)) {\n return input.flags\n .filter((entry): entry is { key: string; value: boolean } =>\n Boolean(entry) && typeof entry.key === 'string' && typeof entry.value === 'boolean'\n )\n .map((entry) => ({ key: entry.key, value: entry.value }));\n }\n\n const values = input.values ?? {};\n return Object.entries(values).map(([key, value]) => ({ key, value: Boolean(value) }));\n}\n\nexport class InMemoryMetricsCollector {\n private readonly buckets = new Map<string, number[]>();\n\n record = (metricName: FeatureFlareMetricName, value: number, tags?: FeatureFlareMetricTags) => {\n const key = `${metricName}:${JSON.stringify(tags ?? {})}`;\n const list = this.buckets.get(key) ?? [];\n list.push(value);\n this.buckets.set(key, list);\n };\n\n get(metricName: FeatureFlareMetricName): Array<{ tags: FeatureFlareMetricTags; values: number[] }> {\n const rows: Array<{ tags: FeatureFlareMetricTags; values: number[] }> = [];\n for (const [key, values] of this.buckets.entries()) {\n if (!key.startsWith(`${metricName}:`)) continue;\n rows.push({\n tags: JSON.parse(key.slice(metricName.length + 1)) as FeatureFlareMetricTags,\n values: [...values]\n });\n }\n return rows;\n }\n}\n\nexport class FeatureFlareClient {\n private readonly apiBaseUrl: string;\n private readonly sdkKey: string | null;\n private readonly projectKey: string | null;\n private readonly envKey: string;\n private readonly expectedEnvKey: string | null;\n private readonly getRealtimeUser?: () => FeatureFlareUserPayload | null | undefined;\n private readonly timeoutMs: number;\n private readonly maxRetries: number;\n private readonly backoffMs: number;\n private readonly jitter: number;\n private readonly cacheTtlMs: number;\n private readonly staleTtlMs: number;\n private readonly persistentCache: FeatureFlarePersistentCacheAdapter | undefined;\n private readonly onMetric?: (metricName: FeatureFlareMetricName, value: number, tags?: FeatureFlareMetricTags) => void;\n private readonly listeners: {\n [K in keyof FeatureFlareClientEvents]: Set<(payload: FeatureFlareClientEvents[K]) => void>;\n } = {\n update: new Set(),\n circuitOpen: new Set(),\n circuitClose: new Set(),\n connectionState: new Set()\n };\n\n private readonly cache = new Map<string, CacheItem>();\n private readonly diagnostics = new Map<string, FeatureFlareEvaluationMetadata>();\n private readonly killSwitches = new Set<string>();\n\n private revision = 0;\n private circuitOpen = false;\n private persistentLoadPromise: Promise<void> | null = null;\n private readonly inFlightRevalidate = new Map<string, Promise<Array<{ key: string; value: boolean }> | null>>();\n private lastUser: FeatureFlareUser | null = null;\n private lastDefaultValue = false;\n\n private realtimeEnabled = true;\n private realtimePollingEnabled = true;\n private realtimePollingMs = 15000;\n private realtimeSsePath = '/api/v1/sdk/stream';\n private realtimeDisconnectWhenHidden = true;\n private visibilityListenerAttached = false;\n private connectionState: FeatureFlareConnectionState = { state: 'offline', transport: 'none' };\n private pollTimer: ReturnType<typeof setTimeout> | null = null;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private eventSource: EventSource | null = null;\n private streamConnectVersion = 0;\n\n constructor(options: FeatureFlareClientOptions = {}) {\n this.apiBaseUrl = getApiBaseUrl(options.apiBaseUrl).replace(/\\/$/, '');\n this.sdkKey = options.sdkKey?.trim() || getSdkKeyFromEnv();\n this.projectKey = options.projectKey?.trim() ? options.projectKey.trim() : null;\n const explicitOrEnvKey = options.envKey?.trim() || getEnvKeyFromEnv() || null;\n this.envKey = explicitOrEnvKey ?? 'production';\n this.expectedEnvKey = explicitOrEnvKey;\n this.getRealtimeUser = options.getRealtimeUser;\n\n if (!this.sdkKey && !this.projectKey) {\n throw new Error(\n 'FeatureFlareClient requires either sdkKey (recommended) or projectKey (legacy). Set FEATUREFLARE_CLIENT_KEY or FEATUREFLARE_SERVER_KEY env var, or pass sdkKey in options.'\n );\n }\n\n this.timeoutMs = Number.isFinite(options.timeoutMs) && (options.timeoutMs ?? 0) > 0 ? Number(options.timeoutMs) : 3000;\n this.maxRetries = Number.isFinite(options.maxRetries) && (options.maxRetries ?? 0) >= 0 ? Number(options.maxRetries) : 2;\n this.backoffMs = Number.isFinite(options.backoffMs) && (options.backoffMs ?? 0) > 0 ? Number(options.backoffMs) : 200;\n this.jitter = Number.isFinite(options.jitter) && (options.jitter ?? 0) >= 0 ? Number(options.jitter) : 0.25;\n\n this.cacheTtlMs = Number.isFinite(options.cacheTtlMs) && (options.cacheTtlMs ?? 0) > 0 ? Number(options.cacheTtlMs) : DEFAULT_CACHE_TTL_MS;\n const configuredStaleTtlMs =\n Number.isFinite(options.staleTtlMs) && (options.staleTtlMs ?? 0) > 0 ? Number(options.staleTtlMs) : DEFAULT_STALE_TTL_MS;\n this.staleTtlMs = Math.min(configuredStaleTtlMs, this.cacheTtlMs);\n\n this.persistentCache = options.persistentCache;\n this.onMetric = options.onMetric;\n\n this.realtimeEnabled = options.realtime?.enabled ?? true;\n const configuredPollingIntervalMs = Number(options.realtime?.pollingIntervalMs ?? NaN);\n if (Number.isFinite(configuredPollingIntervalMs) && configuredPollingIntervalMs === 0) {\n this.realtimePollingEnabled = false;\n this.realtimePollingMs = 0;\n } else {\n this.realtimePollingEnabled = true;\n this.realtimePollingMs =\n Number.isFinite(configuredPollingIntervalMs) && configuredPollingIntervalMs > 0\n ? configuredPollingIntervalMs\n : 15000;\n }\n this.realtimeSsePath = options.realtime?.ssePath ?? '/api/v1/sdk/stream';\n this.realtimeDisconnectWhenHidden = options.realtime?.disconnectWhenHidden ?? true;\n\n this.applyBootstrap(options.bootstrap);\n this.persistentLoadPromise = this.loadPersistentCache();\n\n if (this.realtimeEnabled && this.sdkKey) {\n this.attachVisibilityHandler();\n if (this.realtimeDisconnectWhenHidden && typeof document !== 'undefined' && document.visibilityState === 'hidden') {\n return;\n }\n this.startRealtime();\n }\n }\n\n private readonly handleVisibilityChange = (): void => {\n if (!this.realtimeDisconnectWhenHidden || typeof document === 'undefined') return;\n\n debugLog('Visibility changed', {\n visibilityState: document.visibilityState,\n realtimeEnabled: this.realtimeEnabled,\n hasEventSource: Boolean(this.eventSource)\n });\n\n if (document.visibilityState === 'hidden') {\n this.stopRealtime({ preserveEnabled: true });\n return;\n }\n\n if (this.realtimeEnabled && this.sdkKey && !this.eventSource) {\n this.connectSse(0);\n }\n };\n\n private attachVisibilityHandler(): void {\n if (!this.realtimeDisconnectWhenHidden || this.visibilityListenerAttached || typeof document === 'undefined') return;\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n this.visibilityListenerAttached = true;\n }\n\n private detachVisibilityHandler(): void {\n if (!this.visibilityListenerAttached || typeof document === 'undefined') return;\n document.removeEventListener('visibilitychange', this.handleVisibilityChange);\n this.visibilityListenerAttached = false;\n }\n\n private getCacheKey(flagKey: string): string {\n return `${this.envKey}:${flagKey}`;\n }\n\n private normalizeUser(input: FeatureFlareUserPayload): FeatureFlareUser {\n const key = (input.id ?? input.key ?? '').trim();\n if (!key) throw new Error('FeatureFlareClient requires user.id (or legacy user.key).');\n return {\n key,\n email: input.email,\n name: input.name,\n country: input.country,\n custom: input.meta ?? input.custom,\n session: input.session,\n metrics: input.metrics\n };\n }\n\n private resolveRealtimeUserPayload(): FeatureFlareUserPayload | null {\n const candidate = this.getRealtimeUser?.();\n if (candidate) {\n try {\n const normalizedUser = this.normalizeUser(candidate);\n this.lastUser = normalizedUser;\n return candidate;\n } catch {\n // Ignore invalid callback payloads and fall back to the last known valid user.\n }\n }\n\n if (!this.lastUser) {\n return null;\n }\n\n return {\n id: this.lastUser.key,\n email: this.lastUser.email,\n name: this.lastUser.name,\n country: this.lastUser.country,\n meta: this.lastUser.custom,\n session: this.lastUser.session,\n metrics: this.lastUser.metrics\n };\n }\n\n private resolveRealtimeUser(): FeatureFlareUser | null {\n const candidate = this.resolveRealtimeUserPayload();\n if (candidate) {\n try {\n const normalizedUser = this.normalizeUser(candidate);\n this.lastUser = normalizedUser;\n return normalizedUser;\n } catch {\n // Ignore invalid callback payloads and fall back to the last known valid user.\n }\n }\n\n return this.lastUser;\n }\n\n private getRealtimeStreamHashes(): { userContextHash?: string; userPayloadHash?: string } {\n const realtimeUserPayload = this.resolveRealtimeUserPayload();\n if (!realtimeUserPayload) {\n return {};\n }\n\n const hashedContext = buildHashedRealtimeUserContext(realtimeUserPayload);\n return {\n userContextHash: encodeBase64Url(JSON.stringify(hashedContext)),\n userPayloadHash: hashedContext.payloadHash\n };\n }\n\n private async fetchStreamToken(): Promise<string | null> {\n if (!this.sdkKey || typeof fetch !== 'function') {\n return null;\n }\n\n const { userContextHash, userPayloadHash } = this.getRealtimeStreamHashes();\n\n try {\n const response = await fetch(`${this.apiBaseUrl}/api/v1/sdk/stream-token`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-featureflare-sdk-key': this.sdkKey\n },\n body: JSON.stringify({\n expectedEnvKey: this.expectedEnvKey ?? undefined,\n userContextHash,\n userPayloadHash\n })\n });\n\n if (!response.ok) {\n return null;\n }\n\n const payload = (await response.json()) as StreamTokenResponse;\n return typeof payload.key === 'string' && payload.key.trim() ? payload.key : null;\n } catch {\n return null;\n }\n }\n\n private emit<K extends keyof FeatureFlareClientEvents>(event: K, payload: FeatureFlareClientEvents[K]): void {\n for (const listener of this.listeners[event]) {\n listener(payload);\n }\n }\n\n private emitConnectionState(state: FeatureFlareConnectionState): void {\n this.connectionState = state;\n this.emit('connectionState', state);\n }\n\n on<K extends keyof FeatureFlareClientEvents>(\n event: K,\n listener: (payload: FeatureFlareClientEvents[K]) => void\n ): () => void {\n this.listeners[event].add(listener);\n if (event === 'connectionState') {\n (listener as (payload: FeatureFlareConnectionState) => void)(this.connectionState);\n }\n return () => {\n this.listeners[event].delete(listener);\n };\n }\n\n isRealtimeEnabled(): boolean {\n return this.realtimeEnabled && Boolean(this.sdkKey);\n }\n\n private emitMetric(metricName: FeatureFlareMetricName, value: number, tags?: FeatureFlareMetricTags): void {\n this.onMetric?.(metricName, value, tags);\n }\n\n private async ensurePersistentLoaded(): Promise<void> {\n if (!this.persistentLoadPromise) return;\n await this.persistentLoadPromise;\n }\n\n private async loadPersistentCache(): Promise<void> {\n if (!this.persistentCache) return;\n try {\n const snapshot = await this.persistentCache.load(this.envKey);\n if (!snapshot) return;\n this.revision = Math.max(this.revision, snapshot.revision ?? 0);\n for (const killSwitchKey of snapshot.killSwitches ?? []) {\n this.killSwitches.add(killSwitchKey);\n }\n\n for (const [flagKey, item] of Object.entries(snapshot.flags ?? {})) {\n const existing = this.cache.get(this.getCacheKey(flagKey));\n if (existing && existing.source === 'bootstrap') continue;\n this.cache.set(this.getCacheKey(flagKey), {\n envKey: this.envKey,\n flagKey,\n value: Boolean(item.value),\n updatedAt: Number(item.updatedAt) || Date.now(),\n staleAt: Number(item.staleAt) || Date.now(),\n expiresAt: Number(item.expiresAt) || Date.now(),\n source: item.source ?? 'persistent',\n revision: item.revision ?? 0\n });\n }\n } catch {\n // Ignore persistent cache failures; runtime must stay non-throwing for outage semantics.\n }\n }\n\n private async persistCache(): Promise<void> {\n if (!this.persistentCache) return;\n const snapshot: FeatureFlarePersistentSnapshot = {\n revision: this.revision,\n killSwitches: [...this.killSwitches],\n flags: {}\n };\n\n for (const [key, item] of this.cache.entries()) {\n if (!key.startsWith(`${this.envKey}:`)) continue;\n snapshot.flags[item.flagKey] = {\n value: item.value,\n updatedAt: item.updatedAt,\n staleAt: item.staleAt,\n expiresAt: item.expiresAt,\n source: item.source,\n revision: item.revision\n };\n }\n\n try {\n await this.persistentCache.save(this.envKey, snapshot);\n } catch {\n // Persistent errors must not break evaluation.\n }\n }\n\n private makeCacheWindow(at = Date.now()): Pick<CacheItem, 'updatedAt' | 'staleAt' | 'expiresAt'> {\n return {\n updatedAt: at,\n staleAt: at + this.staleTtlMs,\n expiresAt: at + this.cacheTtlMs\n };\n }\n\n private setCacheItem(\n flagKey: string,\n value: boolean,\n source: FeatureFlareCacheSource,\n revision = this.revision,\n at = Date.now()\n ): void {\n this.cache.set(this.getCacheKey(flagKey), {\n envKey: this.envKey,\n flagKey,\n value,\n source,\n revision,\n ...this.makeCacheWindow(at)\n });\n }\n\n private applyBootstrap(bootstrap?: FeatureFlareBootstrapPayload): void {\n if (!bootstrap) return;\n this.revision = Math.max(this.revision, bootstrap.revision ?? 0);\n for (const killSwitchKey of bootstrap.killSwitches ?? []) {\n this.killSwitches.add(killSwitchKey);\n }\n\n const apply = (flagKey: string, value: boolean, revision?: number, updatedAt?: number) => {\n this.setCacheItem(flagKey, value, 'bootstrap', revision ?? this.revision, updatedAt ?? Date.now());\n };\n\n if (Array.isArray(bootstrap.flags)) {\n for (const item of bootstrap.flags) {\n if (!item || typeof item.key !== 'string') continue;\n apply(item.key, Boolean(item.value), item.revision, item.updatedAt);\n }\n return;\n }\n\n for (const [flagKey, value] of Object.entries(bootstrap.flags ?? {})) {\n apply(flagKey, Boolean(value));\n }\n }\n\n private getCacheState(item: CacheItem | undefined, now = Date.now()): 'fresh' | 'stale' | 'expired' | 'missing' {\n if (!item) return 'missing';\n if (now <= item.staleAt) return 'fresh';\n if (now <= item.expiresAt) return 'stale';\n return 'expired';\n }\n\n private setCircuitState(isOpen: boolean, reason = ''): void {\n if (this.circuitOpen === isOpen) return;\n this.circuitOpen = isOpen;\n if (isOpen) {\n this.emit('circuitOpen', { envKey: this.envKey, reason });\n return;\n }\n this.emit('circuitClose', { envKey: this.envKey });\n }\n\n private async fetchWithRetry(url: string, init: RequestInit, transport: 'network' | 'polling') {\n let lastError: unknown = null;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n const ac = typeof AbortController !== 'undefined' ? new AbortController() : null;\n const timeout =\n ac !== null\n ? setTimeout(() => {\n ac.abort();\n }, this.timeoutMs)\n : null;\n\n try {\n const response = await fetch(url, {\n ...init,\n signal: ac?.signal\n });\n\n if (timeout) clearTimeout(timeout);\n\n if (!response.ok && isRetriableStatus(response.status) && attempt < this.maxRetries) {\n lastError = new Error(`HTTP ${response.status}`);\n const jitterOffset = this.backoffMs * this.jitter * Math.random();\n await sleep(this.backoffMs * (attempt + 1) + jitterOffset);\n continue;\n }\n\n return response;\n } catch (error) {\n if (timeout) clearTimeout(timeout);\n lastError = error;\n if (attempt >= this.maxRetries) break;\n const jitterOffset = this.backoffMs * this.jitter * Math.random();\n await sleep(this.backoffMs * (attempt + 1) + jitterOffset);\n }\n }\n\n this.setCircuitState(true, transport);\n throw lastError;\n }\n\n private collectCachedFlags(): Array<{ key: string; value: boolean }> {\n const now = Date.now();\n const flags: Array<{ key: string; value: boolean }> = [];\n\n for (const [cacheKey, item] of this.cache.entries()) {\n if (!cacheKey.startsWith(`${this.envKey}:`)) continue;\n if (this.killSwitches.has(item.flagKey)) {\n flags.push({ key: item.flagKey, value: false });\n continue;\n }\n\n const state = this.getCacheState(item, now);\n if (state === 'missing' || state === 'expired') continue;\n flags.push({ key: item.flagKey, value: item.value });\n }\n\n return flags.sort((a, b) => a.key.localeCompare(b.key));\n }\n\n getCachedFlags(): {\n flags: Array<{ key: string; value: boolean }>;\n hasData: boolean;\n } {\n const flags = this.collectCachedFlags();\n return { flags, hasData: flags.length > 0 };\n }\n\n getFlagDiagnostics(flagKey: string): FeatureFlareEvaluationMetadata | null {\n return this.diagnostics.get(this.getCacheKey(flagKey)) ?? null;\n }\n\n setKillSwitch(flagKey: string, enabled: boolean): void {\n const started = monotonicNow();\n if (enabled) {\n this.killSwitches.add(flagKey);\n } else {\n this.killSwitches.delete(flagKey);\n }\n const elapsed = monotonicNow() - started;\n this.emitMetric('ff_killswitch_apply_latency_ms', elapsed, {\n env: this.envKey,\n result: enabled ? 'enabled' : 'disabled'\n });\n this.emit('update', { changedKeys: [flagKey], source: 'realtime' });\n void this.persistCache();\n }\n\n private async fetchEvalFromNetwork(\n flagKey: string,\n normalizedUser: FeatureFlareUser,\n defaultValue: boolean\n ): Promise<boolean | null> {\n const response = this.sdkKey\n ? await this.fetchWithRetry(\n `${this.apiBaseUrl}/api/v1/sdk/eval`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-featureflare-sdk-key': this.sdkKey\n },\n body: JSON.stringify({\n flagKey,\n user: normalizedUser,\n defaultValue,\n expectedEnvKey: this.expectedEnvKey ?? undefined\n })\n },\n 'network'\n )\n : await this.fetchWithRetry(\n `${this.apiBaseUrl}/api/v1/eval`,\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n projectKey: this.projectKey,\n envKey: this.envKey,\n flagKey,\n user: normalizedUser,\n defaultValue\n })\n },\n 'network'\n );\n\n if (!response.ok) {\n if (!isRetriableStatus(response.status)) {\n this.setCircuitState(true, `http_${response.status}`);\n }\n return null;\n }\n\n const json = (await response.json()) as { value?: boolean; revision?: number; killSwitch?: boolean };\n const value = typeof json.value === 'boolean' ? json.value : defaultValue;\n\n if (json.killSwitch === true) {\n this.killSwitches.add(flagKey);\n }\n\n const revision = json.revision ?? this.revision;\n this.revision = Math.max(this.revision, revision);\n this.setCacheItem(flagKey, value, 'network', revision);\n this.setCircuitState(false);\n void this.persistCache();\n this.emit('update', { changedKeys: [flagKey], source: 'network' });\n return value;\n }\n\n private async fetchFlagsFromNetwork(\n normalizedUser: FeatureFlareUser,\n defaultValue: boolean,\n transport: 'network' | 'polling',\n opts?: { fromSnapshotInvalidate?: boolean }\n ): Promise<Array<{ key: string; value: boolean }> | null> {\n if (!this.sdkKey) {\n return null;\n }\n\n const started = monotonicNow();\n\n debugLog('Fetching flags', {\n transport,\n fromSnapshotInvalidate: Boolean(opts?.fromSnapshotInvalidate),\n userKey: normalizedUser.key,\n defaultValue\n });\n\n try {\n const response = await this.fetchWithRetry(\n `${this.apiBaseUrl}/api/v1/sdk/flags`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-featureflare-sdk-key': this.sdkKey\n },\n body: JSON.stringify({\n user: normalizedUser,\n defaultValue,\n expectedEnvKey: this.expectedEnvKey ?? undefined\n })\n },\n transport\n );\n\n if (!response.ok) {\n if (!isRetriableStatus(response.status)) {\n this.setCircuitState(true, `http_${response.status}`);\n }\n return null;\n }\n\n const json = (await response.json()) as {\n flags?: Array<{ key: string; value: boolean }>;\n values?: Record<string, boolean>;\n revision?: number;\n killSwitches?: string[];\n };\n\n const list = normalizeBoolMap(json);\n const revision = json.revision ?? this.revision;\n this.revision = Math.max(this.revision, revision);\n\n if (Array.isArray(json.killSwitches)) {\n for (const key of json.killSwitches) {\n this.killSwitches.add(key);\n }\n }\n\n const changed = new Set<string>();\n for (const entry of list) {\n const existing = this.cache.get(this.getCacheKey(entry.key));\n if (!existing || existing.value !== entry.value || existing.revision !== revision) {\n changed.add(entry.key);\n }\n this.setCacheItem(entry.key, entry.value, 'network', revision);\n }\n\n if (opts?.fromSnapshotInvalidate && list !== null) {\n this.emit('update', {\n changedKeys: list.map((e) => e.key),\n source: 'realtime',\n snapshotInvalidate: true\n });\n } else if (changed.size > 0) {\n this.emit('update', { changedKeys: [...changed], source: 'network' });\n }\n\n this.setCircuitState(false);\n void this.persistCache();\n this.emitMetric('ff_revalidate_latency_ms', monotonicNow() - started, {\n env: this.envKey,\n transport\n });\n debugLog('Fetched flags', {\n transport,\n fromSnapshotInvalidate: Boolean(opts?.fromSnapshotInvalidate),\n flagsCount: list.length,\n revision\n });\n return list;\n } catch {\n this.emitMetric('ff_revalidate_latency_ms', monotonicNow() - started, {\n env: this.envKey,\n transport,\n result: 'error'\n });\n debugLog('Fetch flags failed', {\n transport,\n fromSnapshotInvalidate: Boolean(opts?.fromSnapshotInvalidate)\n });\n return null;\n }\n }\n\n private revalidate(\n normalizedUser: FeatureFlareUser,\n defaultValue: boolean,\n opts?: { fromSnapshotInvalidate?: boolean }\n ): Promise<Array<{ key: string; value: boolean }> | null> {\n const existing = this.inFlightRevalidate.get(this.envKey);\n if (existing) {\n if (opts?.fromSnapshotInvalidate) {\n void existing.then((list) => {\n if (list !== null) {\n this.emit('update', {\n changedKeys: list.map((e) => e.key),\n source: 'realtime',\n snapshotInvalidate: true\n });\n }\n });\n }\n return existing;\n }\n\n const promise = this.fetchFlagsFromNetwork(normalizedUser, defaultValue, 'network', opts).finally(() => {\n this.inFlightRevalidate.delete(this.envKey);\n });\n\n this.inFlightRevalidate.set(this.envKey, promise);\n return promise;\n }\n\n async evaluate(\n flagKey: string,\n user: FeatureFlareUserPayload,\n defaultValue = false\n ): Promise<FeatureFlareEvaluationResult> {\n const started = monotonicNow();\n await this.ensurePersistentLoaded();\n\n const normalizedUser = this.normalizeUser(user);\n this.lastUser = normalizedUser;\n this.lastDefaultValue = defaultValue;\n\n if (this.killSwitches.has(flagKey)) {\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'kill_switch',\n isStale: false,\n latencyMs: monotonicNow() - started,\n source: 'kill_switch'\n };\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'disabled'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: false, metadata };\n }\n\n const cacheItem = this.cache.get(this.getCacheKey(flagKey));\n const cacheState = this.getCacheState(cacheItem);\n\n if (cacheItem && cacheState === 'fresh') {\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: cacheItem.source === 'bootstrap' || cacheItem.source === 'persistent' ? 'bootstrap' : 'fresh_cache',\n isStale: false,\n latencyMs: monotonicNow() - started,\n source: cacheItem.source,\n updatedAt: cacheItem.updatedAt,\n staleAt: cacheItem.staleAt,\n expiresAt: cacheItem.expiresAt\n };\n this.emitMetric('ff_cache_hit_ratio', 1, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'cache_hit'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: cacheItem.value, metadata };\n }\n\n if (cacheItem && cacheState === 'stale') {\n void this.revalidate(normalizedUser, defaultValue);\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'stale_cache',\n isStale: true,\n latencyMs: monotonicNow() - started,\n source: cacheItem.source,\n updatedAt: cacheItem.updatedAt,\n staleAt: cacheItem.staleAt,\n expiresAt: cacheItem.expiresAt\n };\n this.emitMetric('ff_cache_hit_ratio', 1, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'stale'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: cacheItem.value, metadata };\n }\n\n if (cacheItem && (cacheItem.source === 'bootstrap' || cacheItem.source === 'persistent')) {\n void this.revalidate(normalizedUser, defaultValue);\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'bootstrap',\n isStale: true,\n latencyMs: monotonicNow() - started,\n source: cacheItem.source,\n updatedAt: cacheItem.updatedAt,\n staleAt: cacheItem.staleAt,\n expiresAt: cacheItem.expiresAt\n };\n this.emitMetric('ff_cache_hit_ratio', 1, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'bootstrap'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: cacheItem.value, metadata };\n }\n\n try {\n const networkValue = await this.fetchEvalFromNetwork(flagKey, normalizedUser, defaultValue);\n if (networkValue !== null) {\n const item = this.cache.get(this.getCacheKey(flagKey));\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'network',\n isStale: false,\n latencyMs: monotonicNow() - started,\n source: 'network',\n updatedAt: item?.updatedAt,\n staleAt: item?.staleAt,\n expiresAt: item?.expiresAt\n };\n this.emitMetric('ff_cache_hit_ratio', 0, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'network'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: networkValue, metadata };\n }\n } catch {\n // Fall through to deterministic default for outage semantics.\n }\n\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'default',\n isStale: false,\n latencyMs: monotonicNow() - started,\n source: 'default'\n };\n this.emitMetric('ff_cache_hit_ratio', 0, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'default'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: defaultValue, metadata };\n }\n\n async bool(flagKey: string, user: FeatureFlareUserPayload, defaultValue = false): Promise<boolean> {\n const result = await this.evaluate(flagKey, user, defaultValue);\n return result.value;\n }\n\n async flags(user: FeatureFlareUserPayload, defaultValue = false): Promise<Array<{ key: string; value: boolean }>> {\n await this.ensurePersistentLoaded();\n const normalizedUser = this.normalizeUser(user);\n this.lastUser = normalizedUser;\n this.lastDefaultValue = defaultValue;\n\n const cached = this.collectCachedFlags();\n if (cached.length > 0) {\n void this.revalidate(normalizedUser, defaultValue);\n return cached;\n }\n\n const list = await this.revalidate(normalizedUser, defaultValue);\n if (list && list.length > 0) {\n return list.map((entry) => ({\n key: entry.key,\n value: this.killSwitches.has(entry.key) ? false : entry.value\n }));\n }\n\n return [];\n }\n\n private applyRealtimeMessage(message: RealtimeEventPayload): void {\n if (typeof message.revision === 'number' && message.revision < this.revision) {\n return;\n }\n\n if (typeof message.revision === 'number') {\n this.revision = message.revision;\n }\n\n const changed = new Set<string>();\n const now = Date.now();\n\n if (message.type === 'flag.updated') {\n const flagKey = typeof message.data?.flagKey === 'string' ? message.data.flagKey : null;\n const value = typeof message.data?.value === 'boolean' ? message.data.value : null;\n if (flagKey !== null && value !== null) {\n this.setCacheItem(flagKey, value, 'realtime', message.revision ?? this.revision, now);\n changed.add(flagKey);\n }\n }\n\n if (message.type === 'flag.deleted') {\n const flagKey = typeof message.data?.flagKey === 'string' ? message.data.flagKey : null;\n if (flagKey !== null) {\n this.cache.delete(this.getCacheKey(flagKey));\n changed.add(flagKey);\n }\n }\n\n if (message.type === 'env.kill_switch.updated') {\n const started = monotonicNow();\n const flagKey = typeof message.data?.flagKey === 'string' ? message.data.flagKey : null;\n const enabled = typeof message.data?.enabled === 'boolean' ? message.data.enabled : true;\n if (flagKey !== null) {\n if (enabled) {\n this.killSwitches.add(flagKey);\n } else {\n this.killSwitches.delete(flagKey);\n }\n changed.add(flagKey);\n this.emitMetric('ff_killswitch_apply_latency_ms', monotonicNow() - started, {\n env: this.envKey,\n transport: this.eventSource ? 'sse' : 'polling',\n result: enabled ? 'enabled' : 'disabled'\n });\n }\n }\n\n const eventLagMs = Math.max(0, Date.now() - (message.timestamp ?? Date.now()));\n this.emitMetric('ff_realtime_lag_ms', eventLagMs, {\n env: this.envKey,\n transport: this.eventSource ? 'sse' : 'polling'\n });\n\n if (changed.size > 0) {\n this.emit('update', { changedKeys: [...changed], source: 'realtime' });\n void this.persistCache();\n }\n }\n\n private startPolling(immediate = false): void {\n if (!this.realtimePollingEnabled) {\n debugLog('Polling disabled', {\n immediate,\n reason: 'realtimePollingEnabled=false'\n });\n return;\n }\n\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n\n const tick = async () => {\n // If SSE is active, polling must remain disabled.\n if (this.eventSource) {\n debugLog('Polling tick skipped', {\n reason: 'eventSource-active'\n });\n this.pollTimer = null;\n return;\n }\n\n const realtimeUser = this.resolveRealtimeUser();\n if (!realtimeUser) {\n debugLog('Polling tick deferred', {\n reason: 'missing-realtime-user',\n nextInMs: this.realtimePollingMs\n });\n if (!this.eventSource) {\n this.pollTimer = setTimeout(tick, this.realtimePollingMs);\n }\n return;\n }\n\n debugLog('Polling tick started', {\n intervalMs: this.realtimePollingMs,\n userKey: realtimeUser.key\n });\n\n await this.fetchFlagsFromNetwork(realtimeUser, this.lastDefaultValue, 'polling');\n\n // Avoid resurrecting the polling timer if SSE connected while polling request was in-flight.\n if (!this.eventSource) {\n this.pollTimer = setTimeout(tick, this.realtimePollingMs);\n } else {\n this.pollTimer = null;\n }\n };\n\n if (immediate) {\n debugLog('Polling started immediately', {\n intervalMs: this.realtimePollingMs\n });\n void tick();\n return;\n }\n\n debugLog('Polling scheduled', {\n intervalMs: this.realtimePollingMs\n });\n this.pollTimer = setTimeout(tick, this.realtimePollingMs);\n }\n\n private connectSse(attempt = 0): void {\n void this.connectSseInternal(attempt);\n }\n\n private async connectSseInternal(attempt = 0): Promise<void> {\n const EventSourceImpl = typeof EventSource !== 'undefined' ? EventSource : null;\n if (!EventSourceImpl || !this.sdkKey) {\n debugLog('SSE unavailable, falling back', {\n hasEventSourceImpl: Boolean(EventSourceImpl),\n hasSdkKey: Boolean(this.sdkKey),\n pollingEnabled: this.realtimePollingEnabled\n });\n this.emitConnectionState({ state: this.realtimePollingEnabled ? 'degraded' : 'offline', transport: this.realtimePollingEnabled ? 'polling' : 'none' });\n if (this.realtimePollingEnabled) {\n this.startPolling(true);\n }\n return;\n }\n\n const connectionVersion = ++this.streamConnectVersion;\n const streamToken = await this.fetchStreamToken();\n if (connectionVersion !== this.streamConnectVersion) {\n return;\n }\n\n const url = new URL(this.realtimeSsePath, this.apiBaseUrl);\n if (streamToken) {\n url.searchParams.set('key', streamToken);\n } else {\n url.searchParams.set('sdkKey', this.sdkKey);\n if (this.expectedEnvKey) {\n url.searchParams.set('envKey', this.expectedEnvKey);\n }\n const { userContextHash, userPayloadHash } = this.getRealtimeStreamHashes();\n if (userContextHash) {\n url.searchParams.set('userContextHash', userContextHash);\n }\n if (userPayloadHash) {\n url.searchParams.set('userPayloadHash', userPayloadHash);\n }\n }\n\n debugLog('Connecting SSE', {\n attempt,\n url: url.toString(),\n pollingEnabled: this.realtimePollingEnabled,\n authMode: streamToken ? 'stream-token' : 'sdk-key'\n });\n\n this.eventSource = new EventSourceImpl(url.toString());\n\n this.eventSource.onopen = () => {\n debugLog('SSE connected', {\n attempt,\n url: url.toString()\n });\n this.emitConnectionState({ state: 'connected', transport: 'sse' });\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n };\n\n this.eventSource.onmessage = (event: MessageEvent) => {\n if (this.connectionState.state !== 'connected' || this.connectionState.transport !== 'sse') {\n debugLog('Promoting connection state to connected from SSE message', {\n previousState: this.connectionState.state,\n previousTransport: this.connectionState.transport\n });\n this.emitConnectionState({ state: 'connected', transport: 'sse' });\n }\n\n console.log('SSE message received', {\n raw: String(event.data)\n });\n try {\n const payload = JSON.parse(String(event.data)) as RealtimeEventPayload;\n if (payload.type === 'snapshot.invalidate') {\n const realtimeUser = this.resolveRealtimeUser();\n console.log('Snapshot invalidate message received', {\n payload\n }, realtimeUser);\n if (realtimeUser) {\n console.log('Refetching flags from snapshot invalidate', {\n userKey: realtimeUser.key,\n defaultValue: this.lastDefaultValue\n });\n void this.revalidate(realtimeUser, this.lastDefaultValue, { fromSnapshotInvalidate: true });\n } else {\n debugLog('Snapshot invalidate ignored because no user has been evaluated yet');\n }\n }\n this.applyRealtimeMessage(payload);\n } catch {\n // Ignore malformed realtime messages.\n }\n };\n\n this.eventSource.onerror = () => {\n debugLog('SSE errored', {\n attempt,\n pollingEnabled: this.realtimePollingEnabled,\n reconnectInMs: Math.min(this.backoffMs * (attempt + 1), 30000)\n });\n this.emitConnectionState({\n state: this.realtimePollingEnabled ? 'degraded' : 'offline',\n transport: this.realtimePollingEnabled ? 'polling' : 'none'\n });\n this.eventSource?.close();\n this.eventSource = null;\n if (this.realtimePollingEnabled) {\n this.startPolling(true);\n }\n\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n }\n const backoff = Math.min(this.backoffMs * (attempt + 1), 30000);\n this.reconnectTimer = setTimeout(() => {\n this.connectSse(attempt + 1);\n }, backoff);\n };\n }\n\n startRealtime(): void {\n this.realtimeEnabled = true;\n\n debugLog('Realtime start requested', {\n disconnectWhenHidden: this.realtimeDisconnectWhenHidden,\n visibilityState: typeof document !== 'undefined' ? document.visibilityState : 'unknown',\n pollingEnabled: this.realtimePollingEnabled\n });\n\n this.attachVisibilityHandler();\n if (this.realtimeDisconnectWhenHidden && typeof document !== 'undefined' && document.visibilityState === 'hidden') {\n debugLog('Realtime start skipped because document is hidden');\n return;\n }\n\n this.connectSse(0);\n }\n\n stopRealtime(opts?: { preserveEnabled?: boolean }): void {\n this.streamConnectVersion += 1;\n debugLog('Realtime stop requested', {\n preserveEnabled: Boolean(opts?.preserveEnabled),\n hadEventSource: Boolean(this.eventSource),\n hadPollTimer: Boolean(this.pollTimer),\n hadReconnectTimer: Boolean(this.reconnectTimer)\n });\n\n if (!opts?.preserveEnabled) {\n this.realtimeEnabled = false;\n this.detachVisibilityHandler();\n }\n\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = null;\n }\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.emitConnectionState({ state: 'offline', transport: 'none' });\n }\n\n /**\n * Report observed error metrics (error rate, latency) for a flag back to the FeatureFlare API.\n * The API evaluates the report against active rollback policies and may trigger an automated\n * rollback if configured thresholds are breached.\n *\n * Errors from this call are silently swallowed so that reporting never disrupts the host application.\n */\n async reportError(report: FeatureFlareErrorReport): Promise<void> {\n if (!this.sdkKey) return;\n try {\n await fetch(`${this.apiBaseUrl}/api/v1/sdk/report`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-featureflare-sdk-key': this.sdkKey\n },\n body: JSON.stringify({\n flagKey: report.flagKey,\n errorRate: report.errorRate,\n latencyMs: report.latencyMs,\n observedAt: report.observedAt ?? new Date().toISOString(),\n envKey: this.envKey,\n context: report.context\n })\n });\n } catch {\n // Reporting failures must never surface to the caller.\n }\n }\n\n dispose(): void {\n this.stopRealtime();\n this.listeners.update.clear();\n this.listeners.circuitOpen.clear();\n this.listeners.circuitClose.clear();\n this.listeners.connectionState.clear();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["metadata"],"mappings":"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","file":"index.js","sourcesContent":["export type FeatureFlareUserPayload = {\n /** Unique user identifier (preferred). */\n id?: string;\n /** Legacy alias for id. */\n key?: string;\n email?: string;\n name?: string;\n country?: string;\n /** Queryable attributes. */\n meta?: Record<string, string | number | boolean | null>;\n /** Legacy alias for meta. */\n custom?: Record<string, string | number | boolean | null>;\n /** Session data to persist for later product and analytics features. */\n session?: Record<string, string | number | boolean | null>;\n /** Product metrics or counters associated with the current evaluator. */\n metrics?: Record<string, string | number | boolean | null>;\n};\n\ntype FeatureFlareUser = {\n key: string;\n email?: string;\n name?: string;\n country?: string;\n custom?: Record<string, string | number | boolean | null>;\n session?: Record<string, string | number | boolean | null>;\n metrics?: Record<string, string | number | boolean | null>;\n};\n\nconst DEFAULT_FEATUREFLARE_API_BASE_URL =\n 'https://api.featureflare.com';\nconst DEFAULT_CACHE_TTL_MS = 30 * 60 * 1000;\nconst DEFAULT_STALE_TTL_MS = 10 * 60 * 1000;\n\nfunction getApiBaseUrlFromEnv(): string | null {\n if (typeof process !== 'undefined' && process.env) {\n return (\n process.env.FEATUREFLARE_API_BASE_URL?.trim() ||\n process.env.SHIPIT_API_BASE_URL?.trim() ||\n null\n );\n }\n return null;\n}\n\nfunction getApiBaseUrl(explicit?: string): string {\n const fromOptions = explicit?.trim();\n if (fromOptions) return fromOptions;\n\n const fromEnv = getApiBaseUrlFromEnv();\n if (fromEnv) return fromEnv;\n\n return DEFAULT_FEATUREFLARE_API_BASE_URL;\n}\n\nexport type FeatureFlareCacheSource = 'bootstrap' | 'network' | 'realtime' | 'persistent';\nexport type FeatureFlareEvaluationReason = 'fresh_cache' | 'stale_cache' | 'bootstrap' | 'default' | 'network' | 'kill_switch';\n\nexport type FeatureFlareEvaluationMetadata = {\n reason: FeatureFlareEvaluationReason;\n isStale: boolean;\n latencyMs: number;\n source: FeatureFlareCacheSource | 'default' | 'kill_switch';\n updatedAt?: number;\n staleAt?: number;\n expiresAt?: number;\n};\n\nexport type FeatureFlareEvaluationResult = {\n value: boolean;\n metadata: FeatureFlareEvaluationMetadata;\n};\n\nexport type FeatureFlareMetricName =\n | 'ff_eval_latency_ms'\n | 'ff_cache_hit_ratio'\n | 'ff_revalidate_latency_ms'\n | 'ff_realtime_lag_ms'\n | 'ff_killswitch_apply_latency_ms';\n\nexport type FeatureFlareMetricTags = Record<string, string | number | boolean | undefined>;\n\nexport type FeatureFlareErrorReport = {\n /** The flag key being evaluated when the error was observed. */\n flagKey: string;\n /** Observed error rate as a fraction from 0 to 1 (e.g. 0.05 = 5%). */\n errorRate: number;\n /** Observed p99 latency in milliseconds. */\n latencyMs?: number;\n /** ISO-8601 timestamp of the observation window end. Defaults to now. */\n observedAt?: string;\n /** Optional free-form context about the error (e.g. HTTP status, exception name). */\n context?: Record<string, string | number | boolean>;\n};\n\nexport type FeatureFlarePersistentSnapshot = {\n revision?: number;\n killSwitches?: string[];\n flags: Record<\n string,\n {\n value: boolean;\n updatedAt: number;\n staleAt: number;\n expiresAt: number;\n source?: FeatureFlareCacheSource;\n revision?: number;\n }\n >;\n};\n\nexport type FeatureFlarePersistentCacheAdapter = {\n load: (envKey: string) => Promise<FeatureFlarePersistentSnapshot | null> | FeatureFlarePersistentSnapshot | null;\n save: (envKey: string, snapshot: FeatureFlarePersistentSnapshot) => Promise<void> | void;\n};\n\nexport type FeatureFlareBootstrapPayload = {\n revision?: number;\n killSwitches?: string[];\n flags?:\n | Record<string, boolean>\n | Array<{ key: string; value: boolean; revision?: number; updatedAt?: number }>;\n};\n\nexport type FeatureFlareClientOptions = {\n apiBaseUrl?: string;\n sdkKey?: string;\n projectKey?: string;\n envKey?: string;\n getRealtimeUser?: () => FeatureFlareUserPayload | null | undefined;\n timeoutMs?: number;\n maxRetries?: number;\n backoffMs?: number;\n jitter?: number;\n cacheTtlMs?: number;\n staleTtlMs?: number;\n bootstrap?: FeatureFlareBootstrapPayload;\n persistentCache?: FeatureFlarePersistentCacheAdapter;\n onMetric?: (metricName: FeatureFlareMetricName, value: number, tags?: FeatureFlareMetricTags) => void;\n realtime?: {\n enabled?: boolean;\n pollingIntervalMs?: number;\n ssePath?: string;\n disconnectWhenHidden?: boolean;\n };\n};\n\ntype CacheItem = {\n envKey: string;\n flagKey: string;\n value: boolean;\n updatedAt: number;\n staleAt: number;\n expiresAt: number;\n source: FeatureFlareCacheSource;\n revision: number;\n};\n\ntype RealtimeEventPayload = {\n type: 'flag.updated' | 'flag.deleted' | 'env.kill_switch.updated' | 'snapshot.invalidate';\n timestamp?: number;\n revision?: number;\n data?: Record<string, unknown>;\n};\n\ntype StreamTokenResponse = {\n key?: string;\n};\n\ntype FeatureFlareClientEvents = {\n update: {\n changedKeys: string[];\n source: FeatureFlareCacheSource | 'network';\n /** Set when a server snapshot invalidation caused a full flags refetch; listeners should refresh UI even if values are unchanged. */\n snapshotInvalidate?: boolean;\n };\n circuitOpen: { envKey: string; reason: string };\n circuitClose: { envKey: string };\n connectionState: { state: 'connected' | 'degraded' | 'offline'; transport: 'sse' | 'polling' | 'none' };\n};\n\ntype FeatureFlareConnectionState = FeatureFlareClientEvents['connectionState'];\n\nfunction getEnvKeyFromEnv(): string | null {\n if (typeof process !== 'undefined' && process.env) {\n return (\n process.env.FEATUREFLARE_ENV_KEY?.trim() ||\n process.env.SHIPIT_ENV_KEY?.trim() ||\n null\n );\n }\n return null;\n}\n\nfunction normalizeHashInput(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => normalizeHashInput(entry));\n }\n\n if (value && typeof value === 'object') {\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, entryValue]) => entryValue !== undefined)\n .sort(([leftKey], [rightKey]) => leftKey.localeCompare(rightKey));\n\n return Object.fromEntries(entries.map(([key, entryValue]) => [key, normalizeHashInput(entryValue)]));\n }\n\n return value;\n}\n\nfunction hashForStream(value: unknown): string {\n const input = JSON.stringify(normalizeHashInput(value));\n\n let forward = 0x811c9dc5;\n let backward = 0x811c9dc5;\n for (let index = 0; index < input.length; index += 1) {\n forward ^= input.charCodeAt(index);\n forward = Math.imul(forward, 0x01000193);\n\n const reverseIndex = input.length - 1 - index;\n backward ^= input.charCodeAt(reverseIndex);\n backward = Math.imul(backward, 0x01000193);\n }\n\n return `${(forward >>> 0).toString(16).padStart(8, '0')}${(backward >>> 0).toString(16).padStart(8, '0')}`;\n}\n\nfunction encodeBase64Url(value: string): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(value, 'utf8').toString('base64url');\n }\n\n const bytes = typeof TextEncoder !== 'undefined' ? new TextEncoder().encode(value) : [];\n let binary = '';\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n\n const base64 = typeof btoa === 'function' ? btoa(binary) : '';\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\n}\n\ntype HashedRealtimeUserContext = {\n payloadHash: string;\n fields: Partial<Record<'id' | 'key' | 'email' | 'name' | 'country', string>>;\n metaEntries: Array<{ keyHash: string; valueHash: string }>;\n customEntries: Array<{ keyHash: string; valueHash: string }>;\n};\n\nfunction buildHashedRealtimeUserContext(input: FeatureFlareUserPayload): HashedRealtimeUserContext {\n const payload = {\n id: input.id ?? input.key\n };\n\n return {\n payloadHash: hashForStream(payload),\n fields: {\n ...((input.id ?? input.key) ? { id: hashForStream(input.id ?? input.key) } : {})\n },\n metaEntries: [],\n customEntries: []\n };\n}\n\nfunction getSdkKeyFromEnv(): string | null {\n if (typeof process !== 'undefined' && process.env) {\n return (\n process.env.FEATUREFLARE_CLIENT_KEY?.trim() ||\n process.env.FEATUREFLARE_SERVER_KEY?.trim() ||\n process.env.SHIPIT_CLIENT_KEY?.trim() ||\n process.env.SHIPIT_SERVER_KEY?.trim() ||\n null\n );\n }\n return null;\n}\n\nfunction monotonicNow(): number {\n if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\n return performance.now();\n }\n return Date.now();\n}\n\nfunction isFeatureFlareDebugEnabled(): boolean {\n const envDebug =\n typeof process !== 'undefined' && process.env\n ? process.env.NEXT_PUBLIC_FEATUREFLARE_DEBUG?.trim() || process.env.FEATUREFLARE_DEBUG?.trim()\n : '';\n\n if (envDebug === '1' || envDebug?.toLowerCase() === 'true') {\n return true;\n }\n\n if (typeof window !== 'undefined') {\n try {\n const storageDebug = window.localStorage.getItem('featureflare:debug');\n return storageDebug === '1' || storageDebug?.toLowerCase() === 'true';\n } catch {\n return false;\n }\n }\n\n return false;\n}\n\nfunction debugLog(message: string, details?: Record<string, unknown>): void {\n if (!isFeatureFlareDebugEnabled()) {\n return;\n }\n\n if (details) {\n console.debug(`[FeatureFlare SDK] ${message}`, details);\n return;\n }\n\n console.debug(`[FeatureFlare SDK] ${message}`);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction isRetriableStatus(status: number): boolean {\n return status === 408 || status === 425 || status === 429 || status >= 500;\n}\n\nfunction normalizeBoolMap(\n input: { flags?: Array<{ key: string; value: boolean }>; values?: Record<string, boolean> }\n): Array<{ key: string; value: boolean }> {\n if (Array.isArray(input.flags)) {\n return input.flags\n .filter((entry): entry is { key: string; value: boolean } =>\n Boolean(entry) && typeof entry.key === 'string' && typeof entry.value === 'boolean'\n )\n .map((entry) => ({ key: entry.key, value: entry.value }));\n }\n\n const values = input.values ?? {};\n return Object.entries(values).map(([key, value]) => ({ key, value: Boolean(value) }));\n}\n\nexport class InMemoryMetricsCollector {\n private readonly buckets = new Map<string, number[]>();\n\n record = (metricName: FeatureFlareMetricName, value: number, tags?: FeatureFlareMetricTags) => {\n const key = `${metricName}:${JSON.stringify(tags ?? {})}`;\n const list = this.buckets.get(key) ?? [];\n list.push(value);\n this.buckets.set(key, list);\n };\n\n get(metricName: FeatureFlareMetricName): Array<{ tags: FeatureFlareMetricTags; values: number[] }> {\n const rows: Array<{ tags: FeatureFlareMetricTags; values: number[] }> = [];\n for (const [key, values] of this.buckets.entries()) {\n if (!key.startsWith(`${metricName}:`)) continue;\n rows.push({\n tags: JSON.parse(key.slice(metricName.length + 1)) as FeatureFlareMetricTags,\n values: [...values]\n });\n }\n return rows;\n }\n}\n\nexport class FeatureFlareClient {\n private readonly apiBaseUrl: string;\n private readonly sdkKey: string | null;\n private readonly projectKey: string | null;\n private readonly envKey: string;\n private readonly expectedEnvKey: string | null;\n private readonly getRealtimeUser?: () => FeatureFlareUserPayload | null | undefined;\n private readonly timeoutMs: number;\n private readonly maxRetries: number;\n private readonly backoffMs: number;\n private readonly jitter: number;\n private readonly cacheTtlMs: number;\n private readonly staleTtlMs: number;\n private readonly persistentCache: FeatureFlarePersistentCacheAdapter | undefined;\n private readonly onMetric?: (metricName: FeatureFlareMetricName, value: number, tags?: FeatureFlareMetricTags) => void;\n private readonly listeners: {\n [K in keyof FeatureFlareClientEvents]: Set<(payload: FeatureFlareClientEvents[K]) => void>;\n } = {\n update: new Set(),\n circuitOpen: new Set(),\n circuitClose: new Set(),\n connectionState: new Set()\n };\n\n private readonly cache = new Map<string, CacheItem>();\n private readonly diagnostics = new Map<string, FeatureFlareEvaluationMetadata>();\n private readonly killSwitches = new Set<string>();\n\n private revision = 0;\n private circuitOpen = false;\n private persistentLoadPromise: Promise<void> | null = null;\n private readonly inFlightRevalidate = new Map<string, Promise<Array<{ key: string; value: boolean }> | null>>();\n private lastUser: FeatureFlareUser | null = null;\n private lastDefaultValue = false;\n\n private realtimeEnabled = true;\n private realtimePollingEnabled = true;\n private realtimePollingMs = 15000;\n private realtimeSsePath = '/api/v1/sdk/stream';\n private realtimeDisconnectWhenHidden = true;\n private visibilityListenerAttached = false;\n private connectionState: FeatureFlareConnectionState = { state: 'offline', transport: 'none' };\n private pollTimer: ReturnType<typeof setTimeout> | null = null;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private eventSource: EventSource | null = null;\n private streamConnectVersion = 0;\n\n constructor(options: FeatureFlareClientOptions = {}) {\n this.apiBaseUrl = getApiBaseUrl(options.apiBaseUrl).replace(/\\/$/, '');\n this.sdkKey = options.sdkKey?.trim() || getSdkKeyFromEnv();\n this.projectKey = options.projectKey?.trim() ? options.projectKey.trim() : null;\n const explicitOrEnvKey = options.envKey?.trim() || getEnvKeyFromEnv() || null;\n this.envKey = explicitOrEnvKey ?? 'production';\n this.expectedEnvKey = explicitOrEnvKey;\n this.getRealtimeUser = options.getRealtimeUser;\n\n if (!this.sdkKey && !this.projectKey) {\n throw new Error(\n 'FeatureFlareClient requires either sdkKey (recommended) or projectKey (legacy). Set FEATUREFLARE_CLIENT_KEY or FEATUREFLARE_SERVER_KEY env var, or pass sdkKey in options.'\n );\n }\n\n this.timeoutMs = Number.isFinite(options.timeoutMs) && (options.timeoutMs ?? 0) > 0 ? Number(options.timeoutMs) : 3000;\n this.maxRetries = Number.isFinite(options.maxRetries) && (options.maxRetries ?? 0) >= 0 ? Number(options.maxRetries) : 2;\n this.backoffMs = Number.isFinite(options.backoffMs) && (options.backoffMs ?? 0) > 0 ? Number(options.backoffMs) : 200;\n this.jitter = Number.isFinite(options.jitter) && (options.jitter ?? 0) >= 0 ? Number(options.jitter) : 0.25;\n\n this.cacheTtlMs = Number.isFinite(options.cacheTtlMs) && (options.cacheTtlMs ?? 0) > 0 ? Number(options.cacheTtlMs) : DEFAULT_CACHE_TTL_MS;\n const configuredStaleTtlMs =\n Number.isFinite(options.staleTtlMs) && (options.staleTtlMs ?? 0) > 0 ? Number(options.staleTtlMs) : DEFAULT_STALE_TTL_MS;\n this.staleTtlMs = Math.min(configuredStaleTtlMs, this.cacheTtlMs);\n\n this.persistentCache = options.persistentCache;\n this.onMetric = options.onMetric;\n\n this.realtimeEnabled = options.realtime?.enabled ?? true;\n const configuredPollingIntervalMs = Number(options.realtime?.pollingIntervalMs ?? NaN);\n if (Number.isFinite(configuredPollingIntervalMs) && configuredPollingIntervalMs === 0) {\n this.realtimePollingEnabled = false;\n this.realtimePollingMs = 0;\n } else {\n this.realtimePollingEnabled = true;\n this.realtimePollingMs =\n Number.isFinite(configuredPollingIntervalMs) && configuredPollingIntervalMs > 0\n ? configuredPollingIntervalMs\n : 15000;\n }\n this.realtimeSsePath = options.realtime?.ssePath ?? '/api/v1/sdk/stream';\n this.realtimeDisconnectWhenHidden = options.realtime?.disconnectWhenHidden ?? true;\n\n this.applyBootstrap(options.bootstrap);\n this.persistentLoadPromise = this.loadPersistentCache();\n\n if (this.realtimeEnabled && this.sdkKey) {\n this.attachVisibilityHandler();\n if (this.realtimeDisconnectWhenHidden && typeof document !== 'undefined' && document.visibilityState === 'hidden') {\n return;\n }\n this.startRealtime();\n }\n }\n\n private readonly handleVisibilityChange = (): void => {\n if (!this.realtimeDisconnectWhenHidden || typeof document === 'undefined') return;\n\n debugLog('Visibility changed', {\n visibilityState: document.visibilityState,\n realtimeEnabled: this.realtimeEnabled,\n hasEventSource: Boolean(this.eventSource)\n });\n\n if (document.visibilityState === 'hidden') {\n this.stopRealtime({ preserveEnabled: true });\n return;\n }\n\n if (this.realtimeEnabled && this.sdkKey && !this.eventSource) {\n this.connectSse(0);\n }\n };\n\n private attachVisibilityHandler(): void {\n if (!this.realtimeDisconnectWhenHidden || this.visibilityListenerAttached || typeof document === 'undefined') return;\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n this.visibilityListenerAttached = true;\n }\n\n private detachVisibilityHandler(): void {\n if (!this.visibilityListenerAttached || typeof document === 'undefined') return;\n document.removeEventListener('visibilitychange', this.handleVisibilityChange);\n this.visibilityListenerAttached = false;\n }\n\n private getCacheKey(flagKey: string): string {\n return `${this.envKey}:${flagKey}`;\n }\n\n private normalizeUser(input: FeatureFlareUserPayload): FeatureFlareUser {\n const key = (input.id ?? input.key ?? '').trim();\n if (!key) throw new Error('FeatureFlareClient requires user.id (or legacy user.key).');\n return {\n key,\n email: input.email,\n name: input.name,\n country: input.country,\n custom: input.meta ?? input.custom,\n session: input.session,\n metrics: input.metrics\n };\n }\n\n private resolveRealtimeUserPayload(): FeatureFlareUserPayload | null {\n const candidate = this.getRealtimeUser?.();\n if (candidate) {\n try {\n const normalizedUser = this.normalizeUser(candidate);\n this.lastUser = normalizedUser;\n return candidate;\n } catch {\n // Ignore invalid callback payloads and fall back to the last known valid user.\n }\n }\n\n if (!this.lastUser) {\n return null;\n }\n\n return {\n id: this.lastUser.key,\n email: this.lastUser.email,\n name: this.lastUser.name,\n country: this.lastUser.country,\n meta: this.lastUser.custom,\n session: this.lastUser.session,\n metrics: this.lastUser.metrics\n };\n }\n\n private resolveRealtimeUser(): FeatureFlareUser | null {\n const candidate = this.resolveRealtimeUserPayload();\n if (candidate) {\n try {\n const normalizedUser = this.normalizeUser(candidate);\n this.lastUser = normalizedUser;\n return normalizedUser;\n } catch {\n // Ignore invalid callback payloads and fall back to the last known valid user.\n }\n }\n\n return this.lastUser;\n }\n\n private getRealtimeStreamHashes(): { userContextHash?: string; userPayloadHash?: string } {\n const realtimeUserPayload = this.resolveRealtimeUserPayload();\n if (!realtimeUserPayload) {\n return {};\n }\n\n const hashedContext = buildHashedRealtimeUserContext(realtimeUserPayload);\n return {\n userContextHash: encodeBase64Url(JSON.stringify(hashedContext)),\n userPayloadHash: hashedContext.payloadHash\n };\n }\n\n private async fetchStreamToken(): Promise<string | null> {\n if (!this.sdkKey || typeof fetch !== 'function') {\n return null;\n }\n\n const { userContextHash, userPayloadHash } = this.getRealtimeStreamHashes();\n\n try {\n const response = await fetch(`${this.apiBaseUrl}/api/v1/sdk/stream-token`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-featureflare-sdk-key': this.sdkKey\n },\n body: JSON.stringify({\n expectedEnvKey: this.expectedEnvKey ?? undefined,\n userContextHash,\n userPayloadHash\n })\n });\n\n if (!response.ok) {\n return null;\n }\n\n const payload = (await response.json()) as StreamTokenResponse;\n return typeof payload.key === 'string' && payload.key.trim() ? payload.key : null;\n } catch {\n return null;\n }\n }\n\n private emit<K extends keyof FeatureFlareClientEvents>(event: K, payload: FeatureFlareClientEvents[K]): void {\n for (const listener of this.listeners[event]) {\n listener(payload);\n }\n }\n\n private emitConnectionState(state: FeatureFlareConnectionState): void {\n this.connectionState = state;\n this.emit('connectionState', state);\n }\n\n on<K extends keyof FeatureFlareClientEvents>(\n event: K,\n listener: (payload: FeatureFlareClientEvents[K]) => void\n ): () => void {\n this.listeners[event].add(listener);\n if (event === 'connectionState') {\n (listener as (payload: FeatureFlareConnectionState) => void)(this.connectionState);\n }\n return () => {\n this.listeners[event].delete(listener);\n };\n }\n\n isRealtimeEnabled(): boolean {\n return this.realtimeEnabled && Boolean(this.sdkKey);\n }\n\n private emitMetric(metricName: FeatureFlareMetricName, value: number, tags?: FeatureFlareMetricTags): void {\n this.onMetric?.(metricName, value, tags);\n }\n\n private async ensurePersistentLoaded(): Promise<void> {\n if (!this.persistentLoadPromise) return;\n await this.persistentLoadPromise;\n }\n\n private async loadPersistentCache(): Promise<void> {\n if (!this.persistentCache) return;\n try {\n const snapshot = await this.persistentCache.load(this.envKey);\n if (!snapshot) return;\n this.revision = Math.max(this.revision, snapshot.revision ?? 0);\n for (const killSwitchKey of snapshot.killSwitches ?? []) {\n this.killSwitches.add(killSwitchKey);\n }\n\n for (const [flagKey, item] of Object.entries(snapshot.flags ?? {})) {\n const existing = this.cache.get(this.getCacheKey(flagKey));\n if (existing && existing.source === 'bootstrap') continue;\n this.cache.set(this.getCacheKey(flagKey), {\n envKey: this.envKey,\n flagKey,\n value: Boolean(item.value),\n updatedAt: Number(item.updatedAt) || Date.now(),\n staleAt: Number(item.staleAt) || Date.now(),\n expiresAt: Number(item.expiresAt) || Date.now(),\n source: item.source ?? 'persistent',\n revision: item.revision ?? 0\n });\n }\n } catch {\n // Ignore persistent cache failures; runtime must stay non-throwing for outage semantics.\n }\n }\n\n private async persistCache(): Promise<void> {\n if (!this.persistentCache) return;\n const snapshot: FeatureFlarePersistentSnapshot = {\n revision: this.revision,\n killSwitches: [...this.killSwitches],\n flags: {}\n };\n\n for (const [key, item] of this.cache.entries()) {\n if (!key.startsWith(`${this.envKey}:`)) continue;\n snapshot.flags[item.flagKey] = {\n value: item.value,\n updatedAt: item.updatedAt,\n staleAt: item.staleAt,\n expiresAt: item.expiresAt,\n source: item.source,\n revision: item.revision\n };\n }\n\n try {\n await this.persistentCache.save(this.envKey, snapshot);\n } catch {\n // Persistent errors must not break evaluation.\n }\n }\n\n private makeCacheWindow(at = Date.now()): Pick<CacheItem, 'updatedAt' | 'staleAt' | 'expiresAt'> {\n return {\n updatedAt: at,\n staleAt: at + this.staleTtlMs,\n expiresAt: at + this.cacheTtlMs\n };\n }\n\n private setCacheItem(\n flagKey: string,\n value: boolean,\n source: FeatureFlareCacheSource,\n revision = this.revision,\n at = Date.now()\n ): void {\n this.cache.set(this.getCacheKey(flagKey), {\n envKey: this.envKey,\n flagKey,\n value,\n source,\n revision,\n ...this.makeCacheWindow(at)\n });\n }\n\n private applyBootstrap(bootstrap?: FeatureFlareBootstrapPayload): void {\n if (!bootstrap) return;\n this.revision = Math.max(this.revision, bootstrap.revision ?? 0);\n for (const killSwitchKey of bootstrap.killSwitches ?? []) {\n this.killSwitches.add(killSwitchKey);\n }\n\n const apply = (flagKey: string, value: boolean, revision?: number, updatedAt?: number) => {\n this.setCacheItem(flagKey, value, 'bootstrap', revision ?? this.revision, updatedAt ?? Date.now());\n };\n\n if (Array.isArray(bootstrap.flags)) {\n for (const item of bootstrap.flags) {\n if (!item || typeof item.key !== 'string') continue;\n apply(item.key, Boolean(item.value), item.revision, item.updatedAt);\n }\n return;\n }\n\n for (const [flagKey, value] of Object.entries(bootstrap.flags ?? {})) {\n apply(flagKey, Boolean(value));\n }\n }\n\n private getCacheState(item: CacheItem | undefined, now = Date.now()): 'fresh' | 'stale' | 'expired' | 'missing' {\n if (!item) return 'missing';\n if (now <= item.staleAt) return 'fresh';\n if (now <= item.expiresAt) return 'stale';\n return 'expired';\n }\n\n private setCircuitState(isOpen: boolean, reason = ''): void {\n if (this.circuitOpen === isOpen) return;\n this.circuitOpen = isOpen;\n if (isOpen) {\n this.emit('circuitOpen', { envKey: this.envKey, reason });\n return;\n }\n this.emit('circuitClose', { envKey: this.envKey });\n }\n\n private async fetchWithRetry(url: string, init: RequestInit, transport: 'network' | 'polling') {\n let lastError: unknown = null;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n const ac = typeof AbortController !== 'undefined' ? new AbortController() : null;\n const timeout =\n ac !== null\n ? setTimeout(() => {\n ac.abort();\n }, this.timeoutMs)\n : null;\n\n try {\n const response = await fetch(url, {\n ...init,\n signal: ac?.signal\n });\n\n if (timeout) clearTimeout(timeout);\n\n if (!response.ok && isRetriableStatus(response.status) && attempt < this.maxRetries) {\n lastError = new Error(`HTTP ${response.status}`);\n const jitterOffset = this.backoffMs * this.jitter * Math.random();\n await sleep(this.backoffMs * (attempt + 1) + jitterOffset);\n continue;\n }\n\n return response;\n } catch (error) {\n if (timeout) clearTimeout(timeout);\n lastError = error;\n if (attempt >= this.maxRetries) break;\n const jitterOffset = this.backoffMs * this.jitter * Math.random();\n await sleep(this.backoffMs * (attempt + 1) + jitterOffset);\n }\n }\n\n this.setCircuitState(true, transport);\n throw lastError;\n }\n\n private collectCachedFlags(): Array<{ key: string; value: boolean }> {\n const now = Date.now();\n const flags: Array<{ key: string; value: boolean }> = [];\n\n for (const [cacheKey, item] of this.cache.entries()) {\n if (!cacheKey.startsWith(`${this.envKey}:`)) continue;\n if (this.killSwitches.has(item.flagKey)) {\n flags.push({ key: item.flagKey, value: false });\n continue;\n }\n\n const state = this.getCacheState(item, now);\n if (state === 'missing' || state === 'expired') continue;\n flags.push({ key: item.flagKey, value: item.value });\n }\n\n return flags.sort((a, b) => a.key.localeCompare(b.key));\n }\n\n getCachedFlags(): {\n flags: Array<{ key: string; value: boolean }>;\n hasData: boolean;\n } {\n const flags = this.collectCachedFlags();\n return { flags, hasData: flags.length > 0 };\n }\n\n getFlagDiagnostics(flagKey: string): FeatureFlareEvaluationMetadata | null {\n return this.diagnostics.get(this.getCacheKey(flagKey)) ?? null;\n }\n\n setKillSwitch(flagKey: string, enabled: boolean): void {\n const started = monotonicNow();\n if (enabled) {\n this.killSwitches.add(flagKey);\n } else {\n this.killSwitches.delete(flagKey);\n }\n const elapsed = monotonicNow() - started;\n this.emitMetric('ff_killswitch_apply_latency_ms', elapsed, {\n env: this.envKey,\n result: enabled ? 'enabled' : 'disabled'\n });\n this.emit('update', { changedKeys: [flagKey], source: 'realtime' });\n void this.persistCache();\n }\n\n private async fetchEvalFromNetwork(\n flagKey: string,\n normalizedUser: FeatureFlareUser,\n defaultValue: boolean\n ): Promise<boolean | null> {\n const response = this.sdkKey\n ? await this.fetchWithRetry(\n `${this.apiBaseUrl}/api/v1/sdk/eval`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-featureflare-sdk-key': this.sdkKey\n },\n body: JSON.stringify({\n flagKey,\n user: normalizedUser,\n defaultValue,\n expectedEnvKey: this.expectedEnvKey ?? undefined\n })\n },\n 'network'\n )\n : await this.fetchWithRetry(\n `${this.apiBaseUrl}/api/v1/eval`,\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n projectKey: this.projectKey,\n envKey: this.envKey,\n flagKey,\n user: normalizedUser,\n defaultValue\n })\n },\n 'network'\n );\n\n if (!response.ok) {\n if (!isRetriableStatus(response.status)) {\n this.setCircuitState(true, `http_${response.status}`);\n }\n return null;\n }\n\n const json = (await response.json()) as { value?: boolean; revision?: number; killSwitch?: boolean };\n const value = typeof json.value === 'boolean' ? json.value : defaultValue;\n\n if (json.killSwitch === true) {\n this.killSwitches.add(flagKey);\n }\n\n const revision = json.revision ?? this.revision;\n this.revision = Math.max(this.revision, revision);\n this.setCacheItem(flagKey, value, 'network', revision);\n this.setCircuitState(false);\n void this.persistCache();\n this.emit('update', { changedKeys: [flagKey], source: 'network' });\n return value;\n }\n\n private async fetchFlagsFromNetwork(\n normalizedUser: FeatureFlareUser,\n defaultValue: boolean,\n transport: 'network' | 'polling',\n opts?: { fromSnapshotInvalidate?: boolean }\n ): Promise<Array<{ key: string; value: boolean }> | null> {\n if (!this.sdkKey) {\n return null;\n }\n\n const started = monotonicNow();\n\n debugLog('Fetching flags', {\n transport,\n fromSnapshotInvalidate: Boolean(opts?.fromSnapshotInvalidate),\n userKey: normalizedUser.key,\n defaultValue\n });\n\n try {\n const response = await this.fetchWithRetry(\n `${this.apiBaseUrl}/api/v1/sdk/flags`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-featureflare-sdk-key': this.sdkKey\n },\n body: JSON.stringify({\n user: normalizedUser,\n defaultValue,\n expectedEnvKey: this.expectedEnvKey ?? undefined\n })\n },\n transport\n );\n\n if (!response.ok) {\n if (!isRetriableStatus(response.status)) {\n this.setCircuitState(true, `http_${response.status}`);\n }\n return null;\n }\n\n const json = (await response.json()) as {\n flags?: Array<{ key: string; value: boolean }>;\n values?: Record<string, boolean>;\n revision?: number;\n killSwitches?: string[];\n };\n\n const list = normalizeBoolMap(json);\n const revision = json.revision ?? this.revision;\n this.revision = Math.max(this.revision, revision);\n\n if (Array.isArray(json.killSwitches)) {\n for (const key of json.killSwitches) {\n this.killSwitches.add(key);\n }\n }\n\n const changed = new Set<string>();\n for (const entry of list) {\n const existing = this.cache.get(this.getCacheKey(entry.key));\n if (!existing || existing.value !== entry.value || existing.revision !== revision) {\n changed.add(entry.key);\n }\n this.setCacheItem(entry.key, entry.value, 'network', revision);\n }\n\n if (opts?.fromSnapshotInvalidate && list !== null) {\n this.emit('update', {\n changedKeys: list.map((e) => e.key),\n source: 'realtime',\n snapshotInvalidate: true\n });\n } else if (changed.size > 0) {\n this.emit('update', { changedKeys: [...changed], source: 'network' });\n }\n\n this.setCircuitState(false);\n void this.persistCache();\n this.emitMetric('ff_revalidate_latency_ms', monotonicNow() - started, {\n env: this.envKey,\n transport\n });\n debugLog('Fetched flags', {\n transport,\n fromSnapshotInvalidate: Boolean(opts?.fromSnapshotInvalidate),\n flagsCount: list.length,\n revision\n });\n return list;\n } catch {\n this.emitMetric('ff_revalidate_latency_ms', monotonicNow() - started, {\n env: this.envKey,\n transport,\n result: 'error'\n });\n debugLog('Fetch flags failed', {\n transport,\n fromSnapshotInvalidate: Boolean(opts?.fromSnapshotInvalidate)\n });\n return null;\n }\n }\n\n private revalidate(\n normalizedUser: FeatureFlareUser,\n defaultValue: boolean,\n opts?: { fromSnapshotInvalidate?: boolean }\n ): Promise<Array<{ key: string; value: boolean }> | null> {\n const existing = this.inFlightRevalidate.get(this.envKey);\n if (existing) {\n if (opts?.fromSnapshotInvalidate) {\n void existing.then((list) => {\n if (list !== null) {\n this.emit('update', {\n changedKeys: list.map((e) => e.key),\n source: 'realtime',\n snapshotInvalidate: true\n });\n }\n });\n }\n return existing;\n }\n\n const promise = this.fetchFlagsFromNetwork(normalizedUser, defaultValue, 'network', opts).finally(() => {\n this.inFlightRevalidate.delete(this.envKey);\n });\n\n this.inFlightRevalidate.set(this.envKey, promise);\n return promise;\n }\n\n async evaluate(\n flagKey: string,\n user: FeatureFlareUserPayload,\n defaultValue = false\n ): Promise<FeatureFlareEvaluationResult> {\n const started = monotonicNow();\n await this.ensurePersistentLoaded();\n\n const normalizedUser = this.normalizeUser(user);\n this.lastUser = normalizedUser;\n this.lastDefaultValue = defaultValue;\n\n if (this.killSwitches.has(flagKey)) {\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'kill_switch',\n isStale: false,\n latencyMs: monotonicNow() - started,\n source: 'kill_switch'\n };\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'disabled'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: false, metadata };\n }\n\n const cacheItem = this.cache.get(this.getCacheKey(flagKey));\n const cacheState = this.getCacheState(cacheItem);\n\n if (cacheItem && cacheState === 'fresh') {\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: cacheItem.source === 'bootstrap' || cacheItem.source === 'persistent' ? 'bootstrap' : 'fresh_cache',\n isStale: false,\n latencyMs: monotonicNow() - started,\n source: cacheItem.source,\n updatedAt: cacheItem.updatedAt,\n staleAt: cacheItem.staleAt,\n expiresAt: cacheItem.expiresAt\n };\n this.emitMetric('ff_cache_hit_ratio', 1, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'cache_hit'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: cacheItem.value, metadata };\n }\n\n if (cacheItem && cacheState === 'stale') {\n void this.revalidate(normalizedUser, defaultValue);\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'stale_cache',\n isStale: true,\n latencyMs: monotonicNow() - started,\n source: cacheItem.source,\n updatedAt: cacheItem.updatedAt,\n staleAt: cacheItem.staleAt,\n expiresAt: cacheItem.expiresAt\n };\n this.emitMetric('ff_cache_hit_ratio', 1, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'stale'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: cacheItem.value, metadata };\n }\n\n if (cacheItem && (cacheItem.source === 'bootstrap' || cacheItem.source === 'persistent')) {\n void this.revalidate(normalizedUser, defaultValue);\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'bootstrap',\n isStale: true,\n latencyMs: monotonicNow() - started,\n source: cacheItem.source,\n updatedAt: cacheItem.updatedAt,\n staleAt: cacheItem.staleAt,\n expiresAt: cacheItem.expiresAt\n };\n this.emitMetric('ff_cache_hit_ratio', 1, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'bootstrap'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: cacheItem.value, metadata };\n }\n\n try {\n const networkValue = await this.fetchEvalFromNetwork(flagKey, normalizedUser, defaultValue);\n if (networkValue !== null) {\n const item = this.cache.get(this.getCacheKey(flagKey));\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'network',\n isStale: false,\n latencyMs: monotonicNow() - started,\n source: 'network',\n updatedAt: item?.updatedAt,\n staleAt: item?.staleAt,\n expiresAt: item?.expiresAt\n };\n this.emitMetric('ff_cache_hit_ratio', 0, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'network'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: networkValue, metadata };\n }\n } catch {\n // Fall through to deterministic default for outage semantics.\n }\n\n const metadata: FeatureFlareEvaluationMetadata = {\n reason: 'default',\n isStale: false,\n latencyMs: monotonicNow() - started,\n source: 'default'\n };\n this.emitMetric('ff_cache_hit_ratio', 0, { env: this.envKey, source: metadata.reason });\n this.emitMetric('ff_eval_latency_ms', metadata.latencyMs, {\n env: this.envKey,\n source: metadata.source,\n result: 'default'\n });\n this.diagnostics.set(this.getCacheKey(flagKey), metadata);\n return { value: defaultValue, metadata };\n }\n\n async bool(flagKey: string, user: FeatureFlareUserPayload, defaultValue = false): Promise<boolean> {\n const result = await this.evaluate(flagKey, user, defaultValue);\n return result.value;\n }\n\n async flags(user: FeatureFlareUserPayload, defaultValue = false): Promise<Array<{ key: string; value: boolean }>> {\n await this.ensurePersistentLoaded();\n const normalizedUser = this.normalizeUser(user);\n this.lastUser = normalizedUser;\n this.lastDefaultValue = defaultValue;\n\n const cached = this.collectCachedFlags();\n if (cached.length > 0) {\n void this.revalidate(normalizedUser, defaultValue);\n return cached;\n }\n\n const list = await this.revalidate(normalizedUser, defaultValue);\n if (list && list.length > 0) {\n return list.map((entry) => ({\n key: entry.key,\n value: this.killSwitches.has(entry.key) ? false : entry.value\n }));\n }\n\n return [];\n }\n\n private applyRealtimeMessage(message: RealtimeEventPayload): void {\n if (typeof message.revision === 'number' && message.revision < this.revision) {\n return;\n }\n\n if (typeof message.revision === 'number') {\n this.revision = message.revision;\n }\n\n const changed = new Set<string>();\n const now = Date.now();\n\n if (message.type === 'flag.updated') {\n const flagKey = typeof message.data?.flagKey === 'string' ? message.data.flagKey : null;\n const value = typeof message.data?.value === 'boolean' ? message.data.value : null;\n if (flagKey !== null && value !== null) {\n this.setCacheItem(flagKey, value, 'realtime', message.revision ?? this.revision, now);\n changed.add(flagKey);\n }\n }\n\n if (message.type === 'flag.deleted') {\n const flagKey = typeof message.data?.flagKey === 'string' ? message.data.flagKey : null;\n if (flagKey !== null) {\n this.cache.delete(this.getCacheKey(flagKey));\n changed.add(flagKey);\n }\n }\n\n if (message.type === 'env.kill_switch.updated') {\n const started = monotonicNow();\n const flagKey = typeof message.data?.flagKey === 'string' ? message.data.flagKey : null;\n const enabled = typeof message.data?.enabled === 'boolean' ? message.data.enabled : true;\n if (flagKey !== null) {\n if (enabled) {\n this.killSwitches.add(flagKey);\n } else {\n this.killSwitches.delete(flagKey);\n }\n changed.add(flagKey);\n this.emitMetric('ff_killswitch_apply_latency_ms', monotonicNow() - started, {\n env: this.envKey,\n transport: this.eventSource ? 'sse' : 'polling',\n result: enabled ? 'enabled' : 'disabled'\n });\n }\n }\n\n const eventLagMs = Math.max(0, Date.now() - (message.timestamp ?? Date.now()));\n this.emitMetric('ff_realtime_lag_ms', eventLagMs, {\n env: this.envKey,\n transport: this.eventSource ? 'sse' : 'polling'\n });\n\n if (changed.size > 0) {\n this.emit('update', { changedKeys: [...changed], source: 'realtime' });\n void this.persistCache();\n }\n }\n\n private startPolling(immediate = false): void {\n if (!this.realtimePollingEnabled) {\n debugLog('Polling disabled', {\n immediate,\n reason: 'realtimePollingEnabled=false'\n });\n return;\n }\n\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n\n const tick = async () => {\n // If SSE is active, polling must remain disabled.\n if (this.eventSource) {\n debugLog('Polling tick skipped', {\n reason: 'eventSource-active'\n });\n this.pollTimer = null;\n return;\n }\n\n const realtimeUser = this.resolveRealtimeUser();\n if (!realtimeUser) {\n debugLog('Polling tick deferred', {\n reason: 'missing-realtime-user',\n nextInMs: this.realtimePollingMs\n });\n if (!this.eventSource) {\n this.pollTimer = setTimeout(tick, this.realtimePollingMs);\n }\n return;\n }\n\n debugLog('Polling tick started', {\n intervalMs: this.realtimePollingMs,\n userKey: realtimeUser.key\n });\n\n await this.fetchFlagsFromNetwork(realtimeUser, this.lastDefaultValue, 'polling');\n\n // Avoid resurrecting the polling timer if SSE connected while polling request was in-flight.\n if (!this.eventSource) {\n this.pollTimer = setTimeout(tick, this.realtimePollingMs);\n } else {\n this.pollTimer = null;\n }\n };\n\n if (immediate) {\n debugLog('Polling started immediately', {\n intervalMs: this.realtimePollingMs\n });\n void tick();\n return;\n }\n\n debugLog('Polling scheduled', {\n intervalMs: this.realtimePollingMs\n });\n this.pollTimer = setTimeout(tick, this.realtimePollingMs);\n }\n\n private connectSse(attempt = 0): void {\n void this.connectSseInternal(attempt);\n }\n\n private async connectSseInternal(attempt = 0): Promise<void> {\n const EventSourceImpl = typeof EventSource !== 'undefined' ? EventSource : null;\n if (!EventSourceImpl || !this.sdkKey) {\n debugLog('SSE unavailable, falling back', {\n hasEventSourceImpl: Boolean(EventSourceImpl),\n hasSdkKey: Boolean(this.sdkKey),\n pollingEnabled: this.realtimePollingEnabled\n });\n this.emitConnectionState({ state: this.realtimePollingEnabled ? 'degraded' : 'offline', transport: this.realtimePollingEnabled ? 'polling' : 'none' });\n if (this.realtimePollingEnabled) {\n this.startPolling(true);\n }\n return;\n }\n\n const connectionVersion = ++this.streamConnectVersion;\n const streamToken = await this.fetchStreamToken();\n if (connectionVersion !== this.streamConnectVersion) {\n return;\n }\n\n const url = new URL(this.realtimeSsePath, this.apiBaseUrl);\n if (streamToken) {\n url.searchParams.set('key', streamToken);\n } else {\n url.searchParams.set('sdkKey', this.sdkKey);\n if (this.expectedEnvKey) {\n url.searchParams.set('envKey', this.expectedEnvKey);\n }\n const { userContextHash, userPayloadHash } = this.getRealtimeStreamHashes();\n if (userContextHash) {\n url.searchParams.set('userContextHash', userContextHash);\n }\n if (userPayloadHash) {\n url.searchParams.set('userPayloadHash', userPayloadHash);\n }\n }\n\n debugLog('Connecting SSE', {\n attempt,\n url: url.toString(),\n pollingEnabled: this.realtimePollingEnabled,\n authMode: streamToken ? 'stream-token' : 'sdk-key'\n });\n\n this.eventSource = new EventSourceImpl(url.toString());\n\n this.eventSource.onopen = () => {\n debugLog('SSE connected', {\n attempt,\n url: url.toString()\n });\n this.emitConnectionState({ state: 'connected', transport: 'sse' });\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n };\n\n this.eventSource.onmessage = (event: MessageEvent) => {\n if (this.connectionState.state !== 'connected' || this.connectionState.transport !== 'sse') {\n debugLog('Promoting connection state to connected from SSE message', {\n previousState: this.connectionState.state,\n previousTransport: this.connectionState.transport\n });\n this.emitConnectionState({ state: 'connected', transport: 'sse' });\n }\n\n console.log('SSE message received', {\n raw: String(event.data)\n });\n try {\n const payload = JSON.parse(String(event.data)) as RealtimeEventPayload;\n if (payload.type === 'snapshot.invalidate') {\n const realtimeUser = this.resolveRealtimeUser();\n console.log('Snapshot invalidate message received', {\n payload\n }, realtimeUser);\n if (realtimeUser) {\n console.log('Refetching flags from snapshot invalidate', {\n userKey: realtimeUser.key,\n defaultValue: this.lastDefaultValue\n });\n void this.revalidate(realtimeUser, this.lastDefaultValue, { fromSnapshotInvalidate: true });\n } else {\n debugLog('Snapshot invalidate ignored because no user has been evaluated yet');\n }\n }\n this.applyRealtimeMessage(payload);\n } catch {\n // Ignore malformed realtime messages.\n }\n };\n\n this.eventSource.onerror = () => {\n debugLog('SSE errored', {\n attempt,\n pollingEnabled: this.realtimePollingEnabled,\n reconnectInMs: Math.min(this.backoffMs * (attempt + 1), 30000)\n });\n this.emitConnectionState({\n state: this.realtimePollingEnabled ? 'degraded' : 'offline',\n transport: this.realtimePollingEnabled ? 'polling' : 'none'\n });\n this.eventSource?.close();\n this.eventSource = null;\n if (this.realtimePollingEnabled) {\n this.startPolling(true);\n }\n\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n }\n const backoff = Math.min(this.backoffMs * (attempt + 1), 30000);\n this.reconnectTimer = setTimeout(() => {\n this.connectSse(attempt + 1);\n }, backoff);\n };\n }\n\n startRealtime(): void {\n this.realtimeEnabled = true;\n\n debugLog('Realtime start requested', {\n disconnectWhenHidden: this.realtimeDisconnectWhenHidden,\n visibilityState: typeof document !== 'undefined' ? document.visibilityState : 'unknown',\n pollingEnabled: this.realtimePollingEnabled\n });\n\n this.attachVisibilityHandler();\n if (this.realtimeDisconnectWhenHidden && typeof document !== 'undefined' && document.visibilityState === 'hidden') {\n debugLog('Realtime start skipped because document is hidden');\n return;\n }\n\n this.connectSse(0);\n }\n\n stopRealtime(opts?: { preserveEnabled?: boolean }): void {\n this.streamConnectVersion += 1;\n debugLog('Realtime stop requested', {\n preserveEnabled: Boolean(opts?.preserveEnabled),\n hadEventSource: Boolean(this.eventSource),\n hadPollTimer: Boolean(this.pollTimer),\n hadReconnectTimer: Boolean(this.reconnectTimer)\n });\n\n if (!opts?.preserveEnabled) {\n this.realtimeEnabled = false;\n this.detachVisibilityHandler();\n }\n\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = null;\n }\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.emitConnectionState({ state: 'offline', transport: 'none' });\n }\n\n /**\n * Report observed error metrics (error rate, latency) for a flag back to the FeatureFlare API.\n * The API evaluates the report against active rollback policies and may trigger an automated\n * rollback if configured thresholds are breached.\n *\n * Errors from this call are silently swallowed so that reporting never disrupts the host application.\n */\n async reportError(report: FeatureFlareErrorReport): Promise<void> {\n if (!this.sdkKey) return;\n try {\n await fetch(`${this.apiBaseUrl}/api/v1/sdk/report`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-featureflare-sdk-key': this.sdkKey\n },\n body: JSON.stringify({\n flagKey: report.flagKey,\n errorRate: report.errorRate,\n latencyMs: report.latencyMs,\n observedAt: report.observedAt ?? new Date().toISOString(),\n envKey: this.envKey,\n context: report.context\n })\n });\n } catch {\n // Reporting failures must never surface to the caller.\n }\n }\n\n dispose(): void {\n this.stopRealtime();\n this.listeners.update.clear();\n this.listeners.circuitOpen.clear();\n this.listeners.circuitClose.clear();\n this.listeners.connectionState.clear();\n }\n}\n"]}
|