@vertexvis/viewer 0.20.0-testing.2 → 0.20.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../../src/components/scene-tree/lib/controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,oDAAoD,CAAC;AACjF,OAAO,EAAE,IAAI,EAAE,MAAM,kDAAkD,CAAC;AAExE,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EAEb,0BAA0B,EAE1B,uBAAuB,EAEvB,cAAc,EAEd,iBAAiB,EAEjB,gBAAgB,GAEjB,MAAM,iEAAiE,CAAC;AAOzE,OAAO,EAAc,eAAe,EAAY,MAAM,kBAAkB,CAAC;AAGzE,OAAO,EACL,iCAAiC,EACjC,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAO,MAAM,OAAO,CAAC;AAiGxD;;;;GAIG;AACH,MAAM,OAAO,mBAAmB;EA2C9B,YACU,MAA0B,EAC1B,QAAgB,EAChB,iBAAiC;IACvC,YAAY,EAAE,IAAI;IAClB,oCAAoC,EAAE,IAAI;GAC3C;IALO,WAAM,GAAN,MAAM,CAAoB;IAC1B,aAAQ,GAAR,QAAQ,CAAQ;IAChB,mBAAc,GAAd,cAAc,CAGrB;IA5CK,eAAU,GAAG,CAAC,CAAC;IACf,UAAK,GAAG,IAAI,GAAG,EAAgB,CAAC;IAChC,mBAAc,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxB,iBAAY,GAAkB,EAAE,CAAC;IACjC,cAAS,GAAG,KAAK,CAAC;IAO1B;;OAEG;IACI,kBAAa,GAAG,IAAI,eAAe,EAAkB,CAAC;IAErD,UAAK,GAAmB;MAC9B,SAAS,EAAE,CAAC;MACZ,WAAW,EAAE,KAAK;MAClB,IAAI,EAAE,EAAE;MACR,UAAU,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;KACrC,CAAC;EAwBC,CAAC;EAtBJ;;KAEG;EACH,IAAW,gBAAgB;IACzB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;EACzB,CAAC;EAED;;;KAGG;EACH,IAAW,WAAW;IACpB,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,WAAW,CAAC;EACpD,CAAC;EAWD;;;;;KAKG;EACI,YAAY,CACjB,QAA8C;IAE9C,OAAO,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;EACzC,CAAC;EAEM,YAAY,CAAC,SAAkB;IACpC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;EAC7B,CAAC;EAEO,KAAK,CAAC,kCAAkC,CAC9C,WAAwB,EACxB,WAAmB;;IAEnB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC;IAC9C,IACE,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;MACjC,CAAA,MAAA,UAAU,CAAC,uBAAuB,0CAAE,OAAO,KAAI,IAAI;MACnD,UAAU,CAAC,uBAAuB,CAAC,OAAO;QACxC,mBAAmB,CAAC,4BAA4B,EAClD;MACA,MAAM,UAAU,GAAG,UAAU,CAAC,uBAAuB,CAAC,OAAO,GAAG,CAAC,CAAC;MAClE,OAAO,CAAC,IAAI,CACV,mEAAmE,UAAU,GAAG,CACjF,CAAC;MACF,UAAU,CAAC,uBAAuB,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;MACnD,IAAI,CAAC,mBAAmB,EAAE,CAAC;MAE3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;MAEtC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;MAC9B,IAAI,CAAC,8BAA8B,EAAE,CAAC;MAEtC,IAAI,CAAC,WAAW,iCACX,IAAI,CAAC,KAAK,KACb,UAAU,kCACL,UAAU,KACb,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE;YACZ,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE;WAC/B,EACD,uBAAuB,EAAE;YACvB,OAAO,EAAE,UAAU;YACnB,MAAM;WACP,OAEH,CAAC;MAEH,IAAI,CAAC,0BAA0B,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;QACvD,IAAI,CAAC,kCAAkC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;MACpE,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,oCAAoC,CAAC,CAAC;KAC9D;SAAM;MACL,IAAI,CAAC,WAAW,iCACX,IAAI,CAAC,KAAK,KACb,UAAU,EAAE;UACV,IAAI,EAAE,SAAS;UACf,WAAW;UACX,WAAW;UACX,OAAO,EAAE,IAAI,qBAAqB,CAChC,sBAAsB,EACtB,kBAAkB,CAAC,oBAAoB,CACxC;SACF,IACD,CAAC;KACJ;EACH,CAAC;EAEM,KAAK,CAAC,OAAO,CAAC,WAAwB;IAC3C,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;IAClC,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAE1B,IAAI,GAAG,IAAI,IAAI,EAAE;MACf,MAAM,IAAI,0BAA0B,CAClC,6CAA6C,CAC9C,CAAC;KACH;IAED,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAEtD,IAAI,UAAU,CAAC,WAAW,KAAK,WAAW,EAAE;MAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;KACvB;SAAM;MACL,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;KACxB;IAED,MAAM,UAAU,GAAoB;MAClC,IAAI,EAAE,YAAY;MAClB,WAAW;MACX,WAAW;KACZ,CAAC;IACF,IAAI,CAAC,WAAW,iCAAM,IAAI,CAAC,KAAK,KAAE,UAAU,EAAE,UAAU,IAAG,CAAC;IAE5D,IAAI;MACF,IAAI,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;MAE9C,IAAI,CAAC,mBAAmB,EAAE,CAAC;MAC3B,0EAA0E;MAC1E,4DAA4D;MAC5D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;MACtC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;MAExB,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE;QAC9C,IAAI,CAAC,WAAW,iCACX,IAAI,CAAC,KAAK,KACb,UAAU,EAAE;YACV,WAAW;YACX,WAAW;YACX,IAAI,EAAE,WAAW;YACjB,YAAY,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE;YAChD,uBAAuB,EAAE;cACvB,OAAO,EAAE,CAAC;cACV,MAAM;aACP;WACF,IACD,CAAC;QAEH,IAAI,CAAC,qBAAqB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;OACtD;KACF;IAAC,OAAO,CAAC,EAAE;MACV,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE;QAC1B,IAAI,CAAC,WAAW,iCACX,IAAI,CAAC,KAAK,KACb,UAAU,EAAE;YACV,IAAI,EAAE,SAAS;YACf,WAAW;YACX,WAAW;YACX,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;WACpC,IACD,CAAC;QACH,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,MAAM,CAAC,CAAC;MACV,CAAC,CAAC,CAAC;KACJ;IAED,IAAI,CAAC,uBAAuB,EAAE,CAAC;EACjC,CAAC;EAEO,mBAAmB;IACzB,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,EAAE;MAC/B,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;KAC1C;EACH,CAAC;EAEO,qBAAqB,CAC3B,WAAwB,EACxB,WAAmB;IAEnB,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAE3B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE;MACjC,IAAI,CAAC,0BAA0B,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;QACvD,IAAI,CAAC,kCAAkC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAClE,IAAI,CAAC,0BAA0B,GAAG,SAAS,CAAC;MAC9C,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,oCAAoC,CAAC,CAAC;KAC9D;EACH,CAAC;EAEO,mBAAmB;IACzB,IAAI,IAAI,CAAC,0BAA0B,IAAI,IAAI,EAAE;MAC3C,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;MACrD,IAAI,CAAC,0BAA0B,GAAG,SAAS,CAAC;KAC7C;EACH,CAAC;EAEO,uBAAuB;IAC7B,IAAI,CAAC,mBAAmB,CACtB,IAAI,CAAC,cAAc,CAAC,sBAAsB;MACxC,mBAAmB,CAAC,yBAAyB,CAChD,CAAC;EACJ,CAAC;EAEO,iCAAiC;IACvC,IAAI,CAAC,mBAAmB,CACtB,IAAI,CAAC,cAAc,CAAC,gCAAgC;MAClD,mBAAmB,CAAC,oCAAoC,CAC3D,CAAC;EACJ,CAAC;EAEO,mBAAmB,CAAC,cAAsB;IAChD,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAE3B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;MAC3C,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE;QAC9C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;OACjD;IACH,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC,CAAC;EAC5B,CAAC;EAEM,eAAe,CAAC,MAA+B;IACpD,MAAM,oBAAoB,GAAG,KAAK,IAAmB,EAAE;MACrD,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,EAAE;QACxB,IAAI,CAAC,GAAG,CACN,gEAAgE,CACjE,CAAC;QAEF,IAAI;UACF,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SACxC;QAAC,OAAO,CAAC,EAAE;UACV,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE;YAC1B,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,CAAC,CAAC,CAAC;UAChE,CAAC,CAAC,CAAC;SACJ;OACF;IACH,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,GAAS,EAAE;MAClC,IAAI,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;MACvD,oBAAoB,EAAE,CAAC;IACzB,CAAC,CAAC;IAEF,oBAAoB,EAAE,CAAC;IAEvB,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IACxD,OAAO;MACL,OAAO,EAAE,GAAG,EAAE;QACZ,MAAM,CAAC,mBAAmB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;QAC3D,IAAI,CAAC,UAAU,EAAE,CAAC;MACpB,CAAC;KACF,CAAC;EACJ,CAAC;EAEM,UAAU,CAAC,KAAK,GAAG,KAAK;IAC7B,IAAI,CAAC,GAAG,CAAC,8CAA8C,KAAK,GAAG,CAAC,CAAC;IAEjE,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC3B,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAE3B,IAAI,KAAK,EAAE;MACT,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;MACnB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;KAC1B;IAED,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;IAClC,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE;MACnC,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;KACnC;IAED,IAAI,CAAC,WAAW,CAAC;MACf,UAAU,EAAE;QACV,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,WAAW,EAAE,UAAU,CAAC,WAAW;OACpC;MACD,WAAW,EAAE,KAAK;MAClB,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS;MAC3C,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI;MAClC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU;MACrD,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB;MACnE,sBAAsB,EAAE,KAAK;QAC3B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,sBAAsB;MACrC,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB;MACnE,kBAAkB,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB;KACtE,CAAC,CAAC;EACL,CAAC;EAEM,MAAM;IACX,IAAI,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAE5C,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC3B,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAE3B,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACnB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;IAEzB,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;IAClC,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE;MACnC,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;KACnC;IAED,IAAI,CAAC,WAAW,CAAC;MACf,UAAU,EAAE;QACV,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,WAAW,EAAE,UAAU,CAAC,WAAW;OACpC;MACD,WAAW,EAAE,KAAK;MAClB,SAAS,EAAE,CAAC;MACZ,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;EACL,CAAC;EAED;;;;KAIG;EACI,KAAK,CAAC,YAAY,CAAC,EAAU;IAClC,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;MAC3C,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;MAC1B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;MAElB,MAAM,GAAG,GAAG,IAAI,mBAAmB,EAAE,CAAC;MACtC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;MAEtB,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CACjD,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CACjD,CAAC;IACJ,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;;;KAIG;EACI,KAAK,CAAC,UAAU,CAAC,EAAU;IAChC,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;MAC3C,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;MAC1B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;MAElB,MAAM,GAAG,GAAG,IAAI,iBAAiB,EAAE,CAAC;MACpC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;MAEtB,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CACjD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAC/C,CAAC;IACJ,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;KAEG;EACI,KAAK,CAAC,WAAW;IACtB,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;MAC3C,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CACjD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,kBAAkB,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CACrE,CAAC;IACJ,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;KAEG;EACI,KAAK,CAAC,SAAS;IACpB,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;MAC3C,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CACjD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,gBAAgB,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CACjE,CAAC;IACJ,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;;;;;;KAOG;EACI,KAAK,CAAC,iBAAiB,CAAC,EAAU;IACvC,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;MAC3C,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;MAC1B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;MAElB,MAAM,GAAG,GAAG,IAAI,iBAAiB,EAAE,CAAC;MACpC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;MAEtB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CACjC,GAAG,EACH,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CACtE,CAAC;MACF,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;MAExD,IAAI,cAAc,EAAE;QAClB,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,IAAI,CAAC,8BAA8B,EAAE,CAAC;OAC7C;MAED,IAAI,YAAY,IAAI,IAAI,EAAE;QACxB,MAAM,IAAI,6BAA6B,CACrC,kDAAkD,CACnD,CAAC;OACH;MAED,OAAO,YAAY,CAAC,KAAK,CAAC;IAC5B,CAAC,CAAC,CAAC;EACL,CAAC;EAEM,KAAK,CAAC,kBAAkB,CAAC,MAAc;IAC5C,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;MAC3C,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;MAC5B,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;MACxB,MAAM,GAAG,GAAG,IAAI,uBAAuB,EAAE,CAAC;MAC1C,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;MAExB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CACjC,GAAG,EACH,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CACpB,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CACvD,CAAC;MAEF,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC;IAClC,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;;;;;;;;KASG;EACI,KAAK,CAAC,SAAS,CAAC,KAAa;IAClC,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;;MAC3C,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE;QAC1C,OAAO;OACR;MAED,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QAC1B,MAAM,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;QACrC,IAAI,CAAC,GAAG,CAAC,0BAA0B,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACvD,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;QACjE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;OAC7B;MAED,MAAM,CAAA,MAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,0CAAE,GAAG,CAAA,CAAC;IACnC,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;;;KAIG;EACI,iBAAiB,CAAC,MAAc;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;EAC9B,CAAC;EAED;;;;;KAKG;EACI,KAAK,CAAC,UAAU,CACrB,WAAmB,EACnB,SAAiB;IAEjB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC,kBAAkB,CACxD,SAAS,EACT,OAAO,CACR,CAAC;IACF,MAAM,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,CAAC,CAAC;IAChD,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CACzE,CAAC;EACJ,CAAC;EAED;;KAEG;EACI,KAAK,CAAC,iBAAiB;IAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;MAC3C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CACjC,GAAG,EACH,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;QAChB,MAAM,GAAG,GAAG,IAAI,0BAA0B,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;MACtD,CAAC,CACF,CAAC;MAEF,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;;;;;KAMG;EACI,KAAK,CAAC,MAAM,CACjB,IAAY,EACZ,UAA6B,EAAE;IAE/B,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;;MAC3C,IAAI,CAAC,WAAW,iCACX,IAAI,CAAC,KAAK,KACb,WAAW,EAAE,IAAI,EACjB,UAAU,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,IAC1C,CAAC;MAEH,iEAAiE;MACjE,oEAAoE;MACpE,+DAA+D;MAC/D,MAAA,IAAI,CAAC,oBAAoB,0CAAE,MAAM,EAAE,CAAC;MACpC,IAAI,CAAC,oBAAoB,GAAG,SAAS,CAAC;MAEtC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE,EAAE;QACjD,IAAI;UACF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CACjC,GAAG,EACH,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;;YACpB,MAAM,GAAG,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACpB,GAAG,CAAC,WAAW,CAAC,MAAA,OAAO,CAAC,gBAAgB,mCAAI,IAAI,CAAC,CAAC;YAClD,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACxC,IAAI,OAAO,CAAC,OAAO;cAAE,GAAG,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAE7D,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAC5C,GAAG,EACH,QAAQ,EACR,OAAO,CACR,CAAC;UACJ,CAAC,CACF,CAAC;UAEF,MAAM,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;UAE3C,IAAI,CAAC,WAAW,iCACX,IAAI,CAAC,KAAK,KACb,iBAAiB,EAAE,eAAe,EAClC,WAAW,EAAE,KAAK,IAClB,CAAC;SACJ;QAAC,OAAO,CAAC,EAAE;UACV,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC;UAC7C,IAAI,CAAC,WAAW,iCACX,IAAI,CAAC,KAAK,KACb,WAAW,EAAE,KAAK,IAClB,CAAC;SACJ;OACF;IACH,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;;;;KAKG;EACI,YAAY,CAAC,KAAa;IAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;EAC/B,CAAC;EAED;;;;;;KAMG;EACI,uBAAuB,CAAC,KAAa,EAAE,GAAW;IACvD,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,CAAC,CAAC;IAChD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;OACrC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,GAAG,CAAC,CAAC;OAC/B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;EAChD,CAAC;EAED;;;;;KAKG;EACI,OAAO,CAAC,KAAa;IAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;EAC/B,CAAC;EAED;;;;;;;;;;KAUG;EACI,2BAA2B,CAChC,SAAiB,EACjB,OAAe,EACf,SAAS,GAAG,CAAC;IAEb,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC,kBAAkB,CACxD,SAAS,EACT,OAAO,CACR,CAAC;IACF,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,YAAY,EAAE,SAAS,CAAC,CAAC;IACxE,IAAI,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,EAAE;MAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACxD,MAAM,QAAQ,GACZ,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,UAAU,CAAC;QACnE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;MAC7B,CAAC,CAAC,CAAC;MACH,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;MAEjE,UAAU;SACP,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;SAClC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;MAEtD,IAAI,CAAC,GAAG,CACN,sBAAsB,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,QAAQ,EAClE,IAAI,CAAC,KAAK,CACX,CAAC;KACH;EACH,CAAC;EAEM,eAAe,CAAC,IAAmB;IACxC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAEzB,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE;MAC9C,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC;MACzC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;MAC9B,OAAO,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;KAC9C;SAAM;MACL,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;KAC1B;EACH,CAAC;EAED;;;;;;;;KAQG;EACI,KAAK,CAAC,oBAAoB,CAAC,KAAa,EAAE,GAAW;IAC1D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAE3D,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAE5B,MAAM,IAAI,CAAC,8BAA8B,EAAE,CAAC;EAC9C,CAAC;EAED;;;KAGG;EACK,SAAS;IACf,OAAO,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,EAAE,EAAE;MACrC,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE;QACxD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,gBAAgB,EAAE,EAAE,QAAQ,CAAC,CAAC;QACpE,OAAO,GAAG,CAAC;MACb,CAAC,CAAC,CAAC;MAEH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAsB,EAAE,EAAE;QAC3C,IAAI,GAAG,CAAC,YAAY,EAAE,EAAE;UACtB,IAAI,CAAC,mBAAmB,EAAE,CAAC;UAC3B,IAAI,CAAC,WAAW,iCAAM,IAAI,CAAC,KAAK,KAAE,iBAAiB,EAAE,IAAI,IAAG,CAAC;UAE7D,sEAAsE;UACtE,qEAAqE;UACrE,gCAAgC;UAChC,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE;YACjC,IAAI,CAAC,GAAG,CACN,wFAAwF,CACzF,CAAC;YAEF,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,8BAA8B,EAAE,CAAC;WACvC;SACF;QAED,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAE/B,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;QAElC,IAAI,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,KAAI,IAAI,EAAE;UAC9B,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;UAC1D,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;UACpD,IAAI,CAAC,8BAA8B,EAAE,CAAC;SACvC;QAED,MAAM,EACJ,UAAU,GAAG,EAAE,EACf,SAAS,GAAG,EAAE,EACd,oBAAoB,GAAG,EAAE,EACzB,cAAc,GAAG,EAAE,EACnB,YAAY,GAAG,EAAE,GAClB,GAAG,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,KAAI,EAAE,CAAC;QAEzB,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE;UACnC,IAAI,CAAC,GAAG,CACN,yCAAyC,EACzC,oBAAoB,CACrB,CAAC;UAEF,oBAAoB,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CAC9C,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YACxC,gBAAgB,EAAE,IAAI;WACvB,CAAC,CAAC,CACJ,CAAC;SACH;QAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;UACzB,IAAI,CAAC,GAAG,CAAC,6BAA6B,EAAE,UAAU,CAAC,CAAC;UAEpD,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CACpC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YACxC,OAAO,EAAE,KAAK;YACd,gBAAgB,EAAE,KAAK;WACxB,CAAC,CAAC,CACJ,CAAC;SACH;QAED,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;UACxB,IAAI,CAAC,GAAG,CAAC,4BAA4B,EAAE,SAAS,CAAC,CAAC;UAElD,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CACnC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YACxC,OAAO,EAAE,IAAI;YACb,gBAAgB,EAAE,KAAK;WACxB,CAAC,CAAC,CACJ,CAAC;SACH;QAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;UAC7B,IAAI,CAAC,GAAG,CAAC,iCAAiC,EAAE,cAAc,CAAC,CAAC;UAE5D,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CACxC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAChE,CAAC;SACH;QAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;UAC3B,IAAI,CAAC,GAAG,CAAC,+BAA+B,EAAE,YAAY,CAAC,CAAC;UAExD,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CACtC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAC/D,CAAC;SACH;MACH,CAAC,CAAC,CAAC;MAEH,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;QACxB,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE;UAChB,OAAO,CAAC,KAAK,CACX,+CAA+C,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,OAAO,EAAE,CAC9E,CAAC;UACF,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;SAC/B;MACH,CAAC,CAAC,CAAC;MAEH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;QACpB,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAE9B,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE;UAC9C,IAAI,CAAC,iCAAiC,EAAE,CAAC;SAC1C;MACH,CAAC,CAAC,CAAC;MAEH,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;EACL,CAAC;EAEM,KAAK,CAAC,8BAA8B;;IACzC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,sBAAsB;IACtD,wEAAwE;IACxE,2EAA2E;IAC3E,MAAA,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,mCAAI,CAAC,EAC3B,MAAA,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,mCAAI,CAAC,CAC5B,CAAC;IAEF,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;IACvE,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;EAC/D,CAAC;EAEO,iBAAiB,CACvB,KAAa,EACb,GAAW,EACX,SAA0D;IAE1D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI;OAChC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC;OACrB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACX,WAAW,CAAC,GAAG,CAAC;MACd,CAAC,iCAAM,GAAG,KAAE,IAAI,kCAAO,GAAG,CAAC,IAAI,GAAK,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,KACvD,CAAC,CAAC,GAAG,CACR,CAAC;IAEJ,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,CAAC,GAAG,SAAS,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC,CAAC;IAExD,IAAI,CAAC,WAAW,iCAAM,IAAI,CAAC,KAAK,KAAE,IAAI,IAAG,CAAC;EAC5C,CAAC;EAEO,KAAK,CAAC,gBAAgB,CAAC,IAAU;;IACvC,IAAI;MACF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC;MAE3B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;MAE7C,+DAA+D;MAC/D,IAAI,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,EAAE,MAAK,IAAI,CAAC,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;QAErC,MAAM,SAAS,GAAG,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,QAAQ,EAAE,mCAAI,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC1C,MAAM,WAAW,GAAG,aAAa,CAC/B,MAAM,EACN,SAAS,EACT,WAAW,CAAC,YAAY,CACzB,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAC/B,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,EACjC,SAAS,CACV,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,KAAK,CACpB,IAAI,CAAC,GAAG,CACN,CAAC,EACD,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAC3D,CACF,CAAC;QACF,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,WAAW,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAEzD,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE;UACzD,IAAI,CAAC,mBAAmB,EAAE,CAAC;UAE3B,IAAI,CAAC,WAAW,iCACX,IAAI,CAAC,KAAK,KACb,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,IAAI,EACV,sBAAsB,EACpB,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI;cAC7B,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,iBAAiB,KAAK,CAAC,CAAC,IAC3D,CAAC;SACJ;aAAM;UACL,IAAI,CAAC,WAAW,iCACX,IAAI,CAAC,KAAK,KACb,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,IAAI,EACV,iBAAiB,EACf,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,iBAAiB,EACnD,sBAAsB,EACpB,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI;cAC7B,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,iBAAiB,KAAK,CAAC,CAAC,EAC3D,kBAAkB,EAAE,IAAI,IACxB,CAAC;SACJ;OACF;KACF;IAAC,OAAO,CAAC,EAAE;MACV,MAAM,YAAY,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;MACnE,OAAO,CAAC,KAAK,CACX,wCAAwC,IAAI,CAAC,KAAK,KAAK,YAAY,GAAG,CACvE,CAAC;MAEF,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;MAC7C,IAAI,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,EAAE,MAAK,IAAI,CAAC,EAAE,EAAE;QAC/B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;OACjC;KACF;EACH,CAAC;EAEO,cAAc,CAAC,KAAa;IAClC,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE;MAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KAC1B;EACH,CAAC;EAEM,qBAAqB,CAAC,MAAc;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAErD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE;MACrC,IAAI,KAAK,IAAI,SAAS,EAAE;QACtB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;OAC5B;KACF;EACH,CAAC;EAEO,QAAQ;IACd,OAAO,IAAI,CAAC,KAAK,CAAC;EACpB,CAAC;EAEO,aAAa,CAAC,IAAW;IAC/B,OAAO,CACL,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI;MAC7B,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI;MACpC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CACrC,CAAC;EACJ,CAAC;EAEO,mBAAmB;IACzB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE;MAC7B,IAAI,CAAC,iBAAiB,EAAE,CAAC;KAC1B;IAED,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;MACzC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;MAC9B,IAAI,CAAC,WAAW,iCACX,IAAI,CAAC,QAAQ,EAAE,KAClB,iBAAiB,EAAE,IAAI,IACvB,CAAC;IACL,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;EACvC,CAAC;EAEO,iBAAiB;IACvB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE;MAC7B,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;MAChC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;KAC/B;EACH,CAAC;EAEO,oBAAoB;IAC1B,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEnE,IAAI,oBAAoB,EAAE;MACxB,IAAI,CAAC,WAAW,iCAAM,IAAI,CAAC,KAAK,KAAE,iBAAiB,EAAE,KAAK,IAAG,CAAC;KAC/D;EACH,CAAC;EAEO,oBAAoB,CAAC,KAAqB;IAChD,MAAM,4BAA4B,GAChC,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC;IAC5D,MAAM,kBAAkB,GACtB,4BAA4B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClE,IAAI,kBAAkB,EAAE;MACtB,IAAI,CAAC,iBAAiB,EAAE,CAAC;MACzB,OAAO,IAAI,CAAC;KACb;IACD,OAAO,KAAK,CAAC;EACf,CAAC;EAEO,WAAW,CAAC,QAAwB;IAC1C,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAEjE,IAAI,CAAC,KAAK,mCACL,QAAQ,KACX,iBAAiB,EAAE,oBAAoB;QACrC,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,QAAQ,CAAC,iBAAiB,GAC/B,CAAC;IAEF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;EACtC,CAAC;EAEM,gBAAgB,CAAC,MAAc;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjD,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;EACxC,CAAC;EAEM,sBAAsB,CAAC,KAAa,EAAE,GAAW;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC3C,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;EAC9B,CAAC;EAEO,KAAK,CAAC,SAAS,CACrB,MAAc,EACd,KAAa,EACb,GAAW;IAEX,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;MAClD,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;MAChC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;MACxB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;MAEtB,MAAM,GAAG,GAAG,IAAI,cAAc,EAAE,CAAC;MACjC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;MACpB,GAAG,CAAC,2BAA2B,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;MAEnD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;EACL,CAAC;EAEO,YAAY,CAClB,GAAW,EACX,GAGS;IAET,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;MACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;MAE7C,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACzB,IAAI,GAAG,IAAI,IAAI,EAAE;UACf,MAAM,CAAC,GAAG,CAAC,CAAC;SACb;aAAM,IAAI,GAAG,IAAI,IAAI,EAAE;UACtB,OAAO,CAAC,GAAG,CAAC,CAAC;SACd;aAAM;UACL,MAAM,CACJ,IAAI,cAAc,CAChB,kDAAkD,CACnD,CACF,CAAC;SACH;MACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;EACL,CAAC;EAEO,mBAAmB,CACzB,GAAW,EACX,GAAmD;IAEnD,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC7C,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC;EACvB,CAAC;EAEO,iBAAiB,CAAC,GAAW;IACnC,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC;MACvB,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;KACvC,CAAC,CAAC;EACL,CAAC;EAEO,KAAK,CAAC,kBAAkB,CAAI,IAAwB;IAC1D,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;IAClC,IAAI,UAAU,CAAC,IAAI,KAAK,YAAY,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE;MACvE,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,CAAC;MAC3C,IAAI,GAAG,IAAI,IAAI,EAAE;QACf,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;OAClB;WAAM;QACL,MAAM,IAAI,0BAA0B,CAClC,sEAAsE,CACvE,CAAC;OACH;KACF;SAAM,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE;MAC1C,MAAM,IAAI,iCAAiC,CACzC,iDAAiD,CAClD,CAAC;KACH;SAAM;MACL,MAAM,IAAI,cAAc,CAAC,+CAA+C,CAAC,CAAC;KAC3E;EACH,CAAC;EAEO,cAAc,CAAC,KAAc,EAAE,IAAkB;IACvD,IAAI,CAAC,CAAC,KAAK,YAAY,iCAAiC,CAAC,EAAE;MACzD,IAAI,EAAE,CAAC;KACR;EACH,CAAC;EAEO,kBAAkB,CACxB,CAAiC;IAEjC,IAAI,kBAAkB,CAAC,CAAC,CAAC,EAAE;MACzB,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;QAC3C,OAAO,IAAI,qBAAqB,CAC9B,qBAAqB,EACrB,kBAAkB,CAAC,mBAAmB,CACvC,CAAC;OACH;WAAM,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;QAC/C,OAAO,IAAI,qBAAqB,CAC9B,cAAc,EACd,kBAAkB,CAAC,YAAY,CAChC,CAAC;OACH;WAAM,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;QACvC,OAAO,IAAI,qBAAqB,CAAC,SAAS,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;OACzE;WAAM;QACL,OAAO,IAAI,qBAAqB,CAAC,SAAS,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;OACzE;KACF;SAAM,IAAI,CAAC,YAAY,0BAA0B,EAAE;MAClD,OAAO,IAAI,qBAAqB,CAC9B,cAAc,EACd,kBAAkB,CAAC,YAAY,CAChC,CAAC;KACH;SAAM;MACL,OAAO,IAAI,qBAAqB,CAAC,SAAS,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;KACzE;EACH,CAAC;EAEO,kBAAkB,CAAC,KAAa,EAAE,GAAW;IACnD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;EAChE,CAAC;EAEO,kBAAkB,CAAC,KAAa;IACtC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;EACzD,CAAC;EAEO,mBAAmB,CAAC,KAAa,EAAE,GAAW;IACpD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;EACvE,CAAC;EAED,IAAY,QAAQ;IAClB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;EACtE,CAAC;EAEO,GAAG,CAAC,OAAgB,EAAE,GAAG,cAAyB;IACxD,IAAI,IAAI,CAAC,SAAS,EAAE;MAClB,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;KACxC;EACH,CAAC;EAEO,gBAAgB,CACtB,UAA2B;IAE3B,OAAO,UAAU,CAAC,IAAI,KAAK,WAAW,CAAC;EACzC,CAAC;;AA/nCc,6CAAyB,GAAG,CAAC,GAAG,EAAE,CAAC;AACnC,wDAAoC,GAAG,CAAC,CAAC;AACzC,gDAA4B,GAAG,CAAC,CAAC","sourcesContent":["import { grpc } from '@improbable-eng/grpc-web';\nimport { OffsetPager } from '@vertexvis/scene-tree-protos/core/protos/paging_pb';\nimport { Uuid } from '@vertexvis/scene-tree-protos/core/protos/uuid_pb';\nimport { Node } from '@vertexvis/scene-tree-protos/scenetree/protos/domain_pb';\nimport {\n CollapseAllRequest,\n CollapseNodeRequest,\n ExpandAllRequest,\n ExpandNodeRequest,\n FilterRequest,\n FilterResponse,\n GetAvailableColumnsRequest,\n GetAvailableColumnsResponse,\n GetNodeAncestorsRequest,\n GetNodeAncestorsResponse,\n GetTreeRequest,\n GetTreeResponse,\n LocateItemRequest,\n LocateItemResponse,\n SubscribeRequest,\n SubscribeResponse,\n} from '@vertexvis/scene-tree-protos/scenetree/protos/scene_tree_api_pb';\nimport {\n ResponseStream,\n SceneTreeAPIClient,\n ServiceError,\n UnaryResponse,\n} from '@vertexvis/scene-tree-protos/scenetree/protos/scene_tree_api_pb_service';\nimport { Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\nimport { MetadataKey } from '../types';\nimport {\n SceneTreeConnectionCancelledError,\n SceneTreeError,\n SceneTreeErrorCode,\n SceneTreeErrorDetails,\n SceneTreeOperationFailedError,\n SceneTreeUnauthorizedError,\n} from './errors';\nimport { isGrpcServiceError } from './grpc';\nimport { decodeSceneTreeJwt } from './jwt';\nimport { fromNodeProto, isLoadedRow, Row } from './row';\n\nexport interface ConnectOptions {\n spinnerDelay: number;\n idleReconnectInSeconds?: number;\n lostConnectionReconnectInSeconds?: number;\n subscriptionHandshakeGracePeriodInMs?: number;\n}\n\nexport type JwtProvider = () => string | undefined;\n\nexport interface SceneTreeState {\n totalRows: number;\n totalFilteredRows?: number;\n rows: Row[];\n connection: ConnectionState;\n isSearching: boolean;\n shouldShowLoading?: boolean;\n shouldShowEmptyResults?: boolean;\n filterTerm?: string;\n handshakeReceived?: boolean;\n firstFetchComplete?: boolean;\n}\n\ninterface Page {\n id: number;\n index: number;\n metadataKeys: MetadataKey[];\n res: Promise<GetTreeResponse>;\n}\n\nexport interface DisconnectedState {\n type: 'disconnected';\n jwtProvider?: JwtProvider;\n sceneViewId?: string;\n}\n\nexport interface ConnectingState {\n type: 'connecting';\n jwtProvider: JwtProvider;\n sceneViewId: string;\n}\n\nexport interface SubscriptionStatusState {\n attempt: number;\n stream: ResponseStream<SubscribeResponse>;\n}\n\nexport interface ConnectedState {\n type: 'connected';\n jwtProvider: JwtProvider;\n sceneViewId: string;\n subscription: Disposable;\n subscriptionStatusState?: SubscriptionStatusState;\n}\n\nexport interface ConnectionFailedState {\n type: 'failure';\n details: SceneTreeErrorDetails;\n jwtProvider: JwtProvider;\n sceneViewId: string;\n}\n\nexport interface ConnectionCancelledState {\n type: 'cancelled';\n jwtProvider?: JwtProvider;\n sceneViewId?: string;\n}\n\n/**\n * A set of options to configure tree filtering behavior.\n */\nexport interface FilterTreeOptions {\n /**\n * Indicates if the filter should include nodes that within collapsed parent\n * nodes.\n */\n includeCollapsed?: boolean;\n\n /**\n * Indicates if the filter should be an exact match with the results.\n */\n exactMatch?: boolean;\n\n /**\n * The metadata keys to filter the tree on.\n */\n columns?: MetadataKey[];\n}\n\ntype ConnectionState =\n | DisconnectedState\n | ConnectingState\n | ConnectedState\n | ConnectionFailedState\n | ConnectionCancelledState;\n\n/**\n * The `SceneTreeController` is responsible for coordinating interactions of the\n * view, fetching and mutating tree data on the server, maintaining state and\n * notifying the view about state changes.\n */\nexport class SceneTreeController {\n private static IDLE_RECONNECT_IN_SECONDS = 4 * 60;\n private static LOST_CONNECTION_RECONNECT_IN_SECONDS = 2;\n private static MAX_SUBSCRIPTION_RETRY_COUNT = 2;\n\n private nextPageId = 0;\n private pages = new Map<number, Page>();\n private activeRowRange = [0, 0];\n private metadataKeys: MetadataKey[] = [];\n private debugLogs = false;\n private pendingFilterGrpcRes?: UnaryResponse;\n\n private reconnectTimer?: number;\n private loadingTimer?: number;\n private subscriptionHandshakeTimer?: number;\n\n /**\n * A dispatcher that emits an event whenever the internal state has changed.\n */\n public onStateChange = new EventDispatcher<SceneTreeState>();\n\n private state: SceneTreeState = {\n totalRows: 0,\n isSearching: false,\n rows: [],\n connection: { type: 'disconnected' },\n };\n\n /**\n * The number of pages that have been fetched.\n */\n public get fetchedPageCount(): number {\n return this.pages.size;\n }\n\n /**\n * Indicates if the controller is connected to the tree backend, and can make\n * requests.\n */\n public get isConnected(): boolean {\n return this.state.connection.type === 'connected';\n }\n\n public constructor(\n private client: SceneTreeAPIClient,\n private rowLimit: number,\n private connectOptions: ConnectOptions = {\n spinnerDelay: 2000,\n subscriptionHandshakeGracePeriodInMs: 5000,\n }\n ) {}\n\n /**\n * Registers an event listener that will be invoked when the state changes\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public stateChanged(\n listener: Listener<SceneTreeState | undefined>\n ): Disposable {\n return this.onStateChange.on(listener);\n }\n\n public setDebugLogs(debugLogs: boolean): void {\n this.debugLogs = debugLogs;\n }\n\n private async handleSubscriptionHandshakeTimeout(\n jwtProvider: JwtProvider,\n sceneViewId: string\n ): Promise<void> {\n const connection = this.getState().connection;\n if (\n this.isConnectedState(connection) &&\n connection.subscriptionStatusState?.attempt != null &&\n connection.subscriptionStatusState.attempt <\n SceneTreeController.MAX_SUBSCRIPTION_RETRY_COUNT\n ) {\n const newAttempt = connection.subscriptionStatusState.attempt + 1;\n console.warn(\n `Failed to subscribe within the allotted timeout. Retry attempt={${newAttempt}}`\n );\n connection.subscriptionStatusState.stream.cancel();\n this.clearHandshakeTimer();\n\n const stream = await this.subscribe();\n\n this.invalidateAfterOffset(0);\n this.fetchUnloadedPagesInActiveRows();\n\n this.updateState({\n ...this.state,\n connection: {\n ...connection,\n type: 'connected',\n subscription: {\n dispose: () => stream.cancel(),\n },\n subscriptionStatusState: {\n attempt: newAttempt,\n stream,\n },\n },\n });\n\n this.subscriptionHandshakeTimer = window.setTimeout(() => {\n this.handleSubscriptionHandshakeTimeout(jwtProvider, sceneViewId);\n }, this.connectOptions.subscriptionHandshakeGracePeriodInMs);\n } else {\n this.updateState({\n ...this.state,\n connection: {\n type: 'failure',\n jwtProvider,\n sceneViewId,\n details: new SceneTreeErrorDetails(\n 'SUBSCRIPTION_FAILURE',\n SceneTreeErrorCode.SUBSCRIPTION_FAILURE\n ),\n },\n });\n }\n }\n\n public async connect(jwtProvider: JwtProvider): Promise<void> {\n const { connection } = this.state;\n const jwt = jwtProvider();\n\n if (jwt == null) {\n throw new SceneTreeUnauthorizedError(\n 'Cannot connect scene tree. JWT is undefined'\n );\n }\n\n const { view: sceneViewId } = decodeSceneTreeJwt(jwt);\n\n if (connection.sceneViewId !== sceneViewId) {\n this.disconnect(true);\n } else {\n this.disconnect(false);\n }\n\n const connecting: ConnectingState = {\n type: 'connecting',\n jwtProvider,\n sceneViewId,\n };\n this.updateState({ ...this.state, connection: connecting });\n\n try {\n this.log('Scene tree controller connecting.');\n\n this.restartLoadingTimer();\n // Ensure we have a subscription prior to attempting to get the first page\n // to make sure we receive any ListChange that comes through\n const stream = await this.subscribe();\n await this.fetchPage(0);\n\n if (this.state.connection.type !== 'cancelled') {\n this.updateState({\n ...this.state,\n connection: {\n jwtProvider,\n sceneViewId,\n type: 'connected',\n subscription: { dispose: () => stream.cancel() },\n subscriptionStatusState: {\n attempt: 0,\n stream,\n },\n },\n });\n\n this.restartHandshakeTimer(jwtProvider, sceneViewId);\n }\n } catch (e) {\n this.ifErrorIsFatal(e, () => {\n this.updateState({\n ...this.state,\n connection: {\n type: 'failure',\n jwtProvider,\n sceneViewId,\n details: this.getConnectionError(e),\n },\n });\n this.clearHandshakeTimer();\n throw e;\n });\n }\n\n this.startIdleReconnectTimer();\n }\n\n private clearReconnectTimer(): void {\n if (this.reconnectTimer != null) {\n window.clearTimeout(this.reconnectTimer);\n }\n }\n\n private restartHandshakeTimer(\n jwtProvider: JwtProvider,\n sceneViewId: string\n ): void {\n this.clearHandshakeTimer();\n\n if (!this.state.handshakeReceived) {\n this.subscriptionHandshakeTimer = window.setTimeout(() => {\n this.handleSubscriptionHandshakeTimeout(jwtProvider, sceneViewId);\n this.subscriptionHandshakeTimer = undefined;\n }, this.connectOptions.subscriptionHandshakeGracePeriodInMs);\n }\n }\n\n private clearHandshakeTimer(): void {\n if (this.subscriptionHandshakeTimer != null) {\n window.clearTimeout(this.subscriptionHandshakeTimer);\n this.subscriptionHandshakeTimer = undefined;\n }\n }\n\n private startIdleReconnectTimer(): void {\n this.startReconnectTimer(\n this.connectOptions.idleReconnectInSeconds ||\n SceneTreeController.IDLE_RECONNECT_IN_SECONDS\n );\n }\n\n private startConnectionLostReconnectTimer(): void {\n this.startReconnectTimer(\n this.connectOptions.lostConnectionReconnectInSeconds ||\n SceneTreeController.LOST_CONNECTION_RECONNECT_IN_SECONDS\n );\n }\n\n private startReconnectTimer(delayInSeconds: number): void {\n this.clearReconnectTimer();\n\n this.reconnectTimer = window.setTimeout(() => {\n if (this.state.connection.type === 'connected') {\n this.connect(this.state.connection.jwtProvider);\n }\n }, delayInSeconds * 1000);\n }\n\n public connectToViewer(viewer: HTMLVertexViewerElement): Disposable {\n const connectWithViewerJwt = async (): Promise<void> => {\n if (viewer.token != null) {\n this.log(\n 'Scene tree controller found viewer JWT. Attempting connection.'\n );\n\n try {\n await this.connect(() => viewer.token);\n } catch (e) {\n this.ifErrorIsFatal(e, () => {\n console.error('Scene tree controller errored connecting.', e);\n });\n }\n }\n };\n\n const handleSceneReady = (): void => {\n this.log('Scene tree controller received scene ready');\n connectWithViewerJwt();\n };\n\n connectWithViewerJwt();\n\n viewer.addEventListener('sceneReady', handleSceneReady);\n return {\n dispose: () => {\n viewer.removeEventListener('sceneReady', handleSceneReady);\n this.disconnect();\n },\n };\n }\n\n public disconnect(reset = false): void {\n this.log(`Scene tree controller disconnecting [reset=${reset}]`);\n\n this.clearHandshakeTimer();\n this.clearReconnectTimer();\n\n if (reset) {\n this.pages.clear();\n this.activeRowRange = [];\n }\n\n const { connection } = this.state;\n if (connection.type === 'connected') {\n connection.subscription.dispose();\n }\n\n this.updateState({\n connection: {\n type: 'disconnected',\n jwtProvider: connection.jwtProvider,\n sceneViewId: connection.sceneViewId,\n },\n isSearching: false,\n totalRows: reset ? 0 : this.state.totalRows,\n rows: reset ? [] : this.state.rows,\n filterTerm: reset ? undefined : this.state.filterTerm,\n totalFilteredRows: reset ? undefined : this.state.totalFilteredRows,\n shouldShowEmptyResults: reset\n ? undefined\n : this.state.shouldShowEmptyResults,\n handshakeReceived: reset ? undefined : this.state.handshakeReceived,\n firstFetchComplete: reset ? undefined : this.state.firstFetchComplete,\n });\n }\n\n public cancel(): void {\n this.log(`Scene tree controller cancelled`);\n\n this.clearHandshakeTimer();\n this.clearReconnectTimer();\n\n this.pages.clear();\n this.activeRowRange = [];\n\n const { connection } = this.state;\n if (connection.type === 'connected') {\n connection.subscription.dispose();\n }\n\n this.updateState({\n connection: {\n type: 'cancelled',\n jwtProvider: connection.jwtProvider,\n sceneViewId: connection.sceneViewId,\n },\n isSearching: false,\n totalRows: 0,\n rows: [],\n });\n }\n\n /**\n * Collapses a node with the given node ID.\n *\n * @param id A node ID to collapse.\n */\n public async collapseNode(id: string): Promise<void> {\n return this.ifConnectionHasJwt(async (jwt) => {\n const nodeId = new Uuid();\n nodeId.setHex(id);\n\n const req = new CollapseNodeRequest();\n req.setNodeId(nodeId);\n\n await this.requestUnary(jwt, (metadata, handler) =>\n this.client.collapseNode(req, metadata, handler)\n );\n });\n }\n\n /**\n * Expands a node with the given node ID.\n *\n * @param id A node ID to expand.\n */\n public async expandNode(id: string): Promise<void> {\n return this.ifConnectionHasJwt(async (jwt) => {\n const nodeId = new Uuid();\n nodeId.setHex(id);\n\n const req = new ExpandNodeRequest();\n req.setNodeId(nodeId);\n\n await this.requestUnary(jwt, (metadata, handler) =>\n this.client.expandNode(req, metadata, handler)\n );\n });\n }\n\n /**\n * Collapses all nodes in the tree.\n */\n public async collapseAll(): Promise<void> {\n return this.ifConnectionHasJwt(async (jwt) => {\n await this.requestUnary(jwt, (metadata, handler) =>\n this.client.collapseAll(new CollapseAllRequest(), metadata, handler)\n );\n });\n }\n\n /**\n * Expands all nodes in the tree.\n */\n public async expandAll(): Promise<void> {\n return this.ifConnectionHasJwt(async (jwt) => {\n await this.requestUnary(jwt, (metadata, handler) =>\n this.client.expandAll(new ExpandAllRequest(), metadata, handler)\n );\n });\n }\n\n /**\n * Invokes a network request that will expand all the parent nodes for the\n * node mapped to the given ID.\n *\n * @param id An ID of an item.\n * @returns A promise that resolves with the index of the node after\n * expansion.\n */\n public async expandParentNodes(id: string): Promise<number> {\n return this.ifConnectionHasJwt(async (jwt) => {\n const nodeId = new Uuid();\n nodeId.setHex(id);\n\n const req = new LocateItemRequest();\n req.setNodeId(nodeId);\n\n const res = await this.requestUnary<LocateItemResponse>(\n jwt,\n (metadata, handler) => this.client.locateItem(req, metadata, handler)\n );\n const { requiresReload, locatedIndex } = res.toObject();\n\n if (requiresReload) {\n this.invalidateAfterOffset(0);\n await this.fetchUnloadedPagesInActiveRows();\n }\n\n if (locatedIndex == null) {\n throw new SceneTreeOperationFailedError(\n 'Cannot locate node. Location index is undefined.'\n );\n }\n\n return locatedIndex.value;\n });\n }\n\n public async fetchNodeAncestors(nodeId: string): Promise<Node.AsObject[]> {\n return this.ifConnectionHasJwt(async (jwt) => {\n const nodeUuid = new Uuid();\n nodeUuid.setHex(nodeId);\n const req = new GetNodeAncestorsRequest();\n req.setNodeId(nodeUuid);\n\n const res = await this.requestUnary<GetNodeAncestorsResponse>(\n jwt,\n (metadata, handler) =>\n this.client.getNodeAncestors(req, metadata, handler)\n );\n\n return res.toObject().itemsList;\n });\n }\n\n /**\n * Fetches a page at the given index. Once the data has been fetched, the\n * controller will emit an `onStateChange` event that contains rows with the\n * fetched page. If a page is invalidated before the request completes, the\n * response is ignored.\n *\n * If the index is out of range, returns without fetching any data.\n *\n * @param index A 0 based index to fetch.\n */\n public async fetchPage(index: number): Promise<void> {\n return this.ifConnectionHasJwt(async (jwt) => {\n if (index < 0 || index > this.maxPages - 1) {\n return;\n }\n\n if (!this.pages.has(index)) {\n const offset = index * this.rowLimit;\n this.log('Scene tree fetching page', index, offset);\n const res = this.fetchTree(offset, this.rowLimit, jwt);\n const id = this.nextPageId++;\n const page = { id, res, index, metadataKeys: this.metadataKeys };\n this.pages.set(index, page);\n this.handlePageResult(page);\n }\n\n await this.pages.get(index)?.res;\n });\n }\n\n /**\n * Fetches a page that contains the given row offset.\n *\n * @param offset The row offset of the page to fetch.\n */\n public fetchPageAtOffset(offset: number): Promise<void> {\n const page = Math.floor(offset / this.rowLimit);\n return this.fetchPage(page);\n }\n\n /**\n * Fetches pages that contain the given row ranges.\n *\n * @param startOffset A start offset, inclusive.\n * @param endOffset The end offset, inclusive.\n */\n public async fetchRange(\n startOffset: number,\n endOffset: number\n ): Promise<void> {\n const startPage = Math.floor(startOffset / this.rowLimit);\n const endPage = Math.floor(endOffset / this.rowLimit);\n const [boundedStart, boundedEnd] = this.constrainPageRange(\n startPage,\n endPage\n );\n const pageCount = boundedEnd - boundedStart + 1;\n await Promise.all(\n Array.from({ length: pageCount }).map((_, page) => this.fetchPage(page))\n );\n }\n\n /**\n * Fetches the metadata keys for the current scene view.\n */\n public async fetchMetadataKeys(): Promise<MetadataKey[]> {\n return this.ifConnectionHasJwt(async (jwt) => {\n const res = await this.requestUnary<GetAvailableColumnsResponse>(\n jwt,\n (meta, handler) => {\n const req = new GetAvailableColumnsRequest();\n this.client.getAvailableColumns(req, meta, handler);\n }\n );\n\n return res.getKeysList().map((value) => value.getValue());\n });\n }\n\n /**\n * Performs a network request that will filter the nodes in the tree that\n * match the given term and options.\n *\n * @param term The filter term.\n * @param options The options to apply to the filter.\n */\n public async filter(\n term: string,\n options: FilterTreeOptions = {}\n ): Promise<void> {\n return this.ifConnectionHasJwt(async (jwt) => {\n this.updateState({\n ...this.state,\n isSearching: true,\n filterTerm: term !== '' ? term : undefined,\n });\n\n // Cancel any in-flight filter requests, and wait for the request\n // to complete prior to making another filter request. This prevents\n // a race condition between requests from different keystrokes.\n this.pendingFilterGrpcRes?.cancel();\n this.pendingFilterGrpcRes = undefined;\n\n if (this.state.filterTerm === term || term === '') {\n try {\n const res = await this.requestUnary<FilterResponse>(\n jwt,\n (metadata, handler) => {\n const req = new FilterRequest();\n req.setFilter(term);\n req.setFullTree(options.includeCollapsed ?? true);\n req.setExactMatch(!!options.exactMatch);\n if (options.columns) req.setColumnsKeysList(options.columns);\n\n this.pendingFilterGrpcRes = this.client.filter(\n req,\n metadata,\n handler\n );\n }\n );\n\n const { numberOfResults } = res.toObject();\n\n this.updateState({\n ...this.state,\n totalFilteredRows: numberOfResults,\n isSearching: false,\n });\n } catch (e) {\n console.error('Failed to filter search ', e);\n this.updateState({\n ...this.state,\n isSearching: false,\n });\n }\n }\n });\n }\n\n /**\n * Checks if the page at the given index is loaded.\n *\n * @param index A page index.\n * @returns `true` if the page is loaded. `false` otherwise.\n */\n public isPageLoaded(index: number): boolean {\n return this.pages.has(index);\n }\n\n /**\n * Returns a list of page indices within a range that have not been loaded.\n *\n * @param start The start page index, inclusive.\n * @param end The end page index, inclusive.\n * @returns A list of pages indices that have not been loaded.\n */\n public getNonLoadedPageIndexes(start: number, end: number): number[] {\n const [boundedStart, boundedEnd] = this.constrainPageRange(start, end);\n const pageCount = boundedEnd - boundedStart + 1;\n return Array.from({ length: pageCount })\n .map((_, i) => boundedStart + i)\n .filter((page) => !this.isPageLoaded(page));\n }\n\n /**\n * Returns the page at the given index, or `undefined` if one doesn't exist.\n *\n * @param index The index to return.\n * @returns A `Page` if found, otherwise `undefined`.\n */\n public getPage(index: number): Page | undefined {\n return this.pages.get(index);\n }\n\n /**\n * Clears page data that is outside a given range. Uses a distance algorithm\n * to removes pages that are furthest from either end of the range. This\n * method is useful for clearing out data that is not needed anymore to keep\n * memory pressure in the client low.\n *\n * @param startPage The index of the starting page in the range.\n * @param endPage The index of the ending page in the range.\n * @param threshold A minimum number of pages to keep. No cleanup is performed\n * if the number of fetched pages doesn't meet this threshold.\n */\n public invalidatePagesOutsideRange(\n startPage: number,\n endPage: number,\n threshold = 0\n ): void {\n const [boundedStart, boundedEnd] = this.constrainPageRange(\n startPage,\n endPage\n );\n const boundedThreshold = Math.max(boundedEnd - boundedStart, threshold);\n if (this.fetchedPageCount > boundedThreshold) {\n const pages = Array.from(this.pages.keys()).map((index) => {\n const distance =\n index < boundedStart ? boundedStart - index : index - boundedEnd;\n return { index, distance };\n });\n const sortedDesc = pages.sort((a, b) => b.distance - a.distance);\n\n sortedDesc\n .slice(0, pages.length - threshold)\n .forEach(({ index }) => this.invalidatePage(index));\n\n this.log(\n `Scene tree dropped ${pages.length - this.fetchedPageCount} pages`,\n this.pages\n );\n }\n }\n\n public setMetadataKeys(keys: MetadataKey[]): Promise<void> {\n this.metadataKeys = keys;\n\n if (this.state.connection.type === 'connected') {\n const [start, end] = this.activeRowRange;\n this.invalidateAfterOffset(0);\n return this.updateActiveRowRange(start, end);\n } else {\n return Promise.resolve();\n }\n }\n\n /**\n * Sets the active rows. Active rows dictate which pages will be refetched\n * when the tree changes.\n *\n * @param start The starting row index.\n * @param end The ending row index.\n * @returns A promise that resolves when the first page of data has been\n * loaded.\n */\n public async updateActiveRowRange(start: number, end: number): Promise<void> {\n this.activeRowRange = this.constrainRowOffsets(start, end);\n\n this.tryClearLoadingState();\n\n await this.fetchUnloadedPagesInActiveRows();\n }\n\n /**\n * Performs a network request that will listen to server-side changes of the\n * scene tree's data.\n */\n private subscribe(): Promise<ResponseStream<SubscribeResponse>> {\n return this.ifConnectionHasJwt((jwt) => {\n const stream = this.requestServerStream(jwt, (metadata) => {\n const sub = this.client.subscribe(new SubscribeRequest(), metadata);\n return sub;\n });\n\n stream.on('data', (msg: SubscribeResponse) => {\n if (msg.hasHandshake()) {\n this.clearHandshakeTimer();\n this.updateState({ ...this.state, handshakeReceived: true });\n\n // Verify that we've loaded the first page of the tree when we receive\n // a handshake in the case that the listener was not fully registered\n // when a `ListChange` was sent.\n if (this.state.firstFetchComplete) {\n this.log(\n 'Scene tree first fetch completed before handshake received, invalidating current pages'\n );\n\n this.invalidateAfterOffset(0);\n this.fetchUnloadedPagesInActiveRows();\n }\n }\n\n this.startIdleReconnectTimer();\n\n const { change } = msg.toObject();\n\n if (change?.listChange != null) {\n this.log('Received list change', change.listChange.start);\n this.invalidateAfterOffset(change.listChange.start);\n this.fetchUnloadedPagesInActiveRows();\n }\n\n const {\n hiddenList = [],\n shownList = [],\n partiallyVisibleList = [],\n deselectedList = [],\n selectedList = [],\n } = change?.ranges || {};\n\n if (partiallyVisibleList.length > 0) {\n this.log(\n 'Received partial visibility list change',\n partiallyVisibleList\n );\n\n partiallyVisibleList.forEach(({ start, end }) =>\n this.patchNodesInRange(start, end, () => ({\n partiallyVisible: true,\n }))\n );\n }\n\n if (hiddenList.length > 0) {\n this.log('Received hidden list change', hiddenList);\n\n hiddenList.forEach(({ start, end }) =>\n this.patchNodesInRange(start, end, () => ({\n visible: false,\n partiallyVisible: false,\n }))\n );\n }\n\n if (shownList.length > 0) {\n this.log('Received shown list change', shownList);\n\n shownList.forEach(({ start, end }) =>\n this.patchNodesInRange(start, end, () => ({\n visible: true,\n partiallyVisible: false,\n }))\n );\n }\n\n if (deselectedList.length > 0) {\n this.log('Received deselected list change', deselectedList);\n\n deselectedList.forEach(({ start, end }) =>\n this.patchNodesInRange(start, end, () => ({ selected: false }))\n );\n }\n\n if (selectedList.length > 0) {\n this.log('Received selected list change', selectedList);\n\n selectedList.forEach(({ start, end }) =>\n this.patchNodesInRange(start, end, () => ({ selected: true }))\n );\n }\n });\n\n stream.on('status', (s) => {\n if (s.code !== 0) {\n console.error(\n `Failed to subscribe to scene tree with code=${s.code}, details=${s.details}`\n );\n this.invalidateAfterOffset(0);\n }\n });\n\n stream.on('end', () => {\n this.invalidateAfterOffset(0);\n\n if (this.state.connection.type === 'connected') {\n this.startConnectionLostReconnectTimer();\n }\n });\n\n return stream;\n });\n }\n\n public async fetchUnloadedPagesInActiveRows(): Promise<void> {\n const [startPage, endPage] = this.getPageIndexesForRange(\n // Verify the first page is loaded properly even if the `activeRowRange`\n // has not been specified by the underlying table layout after a reconnect.\n this.activeRowRange[0] ?? 0,\n this.activeRowRange[1] ?? 0\n );\n\n const pages = this.getNonLoadedPageIndexes(startPage - 1, endPage + 1);\n await Promise.all(pages.map((page) => this.fetchPage(page)));\n }\n\n private patchNodesInRange(\n start: number,\n end: number,\n transform: (node: Node.AsObject) => Partial<Node.AsObject>\n ): void {\n const updatedRows = this.state.rows\n .slice(start, end + 1)\n .map((row) =>\n isLoadedRow(row)\n ? { ...row, node: { ...row.node, ...transform(row.node) } }\n : row\n );\n\n const startRows = this.state.rows.slice(0, start);\n const endRows = this.state.rows.slice(end + 1);\n const rows = [...startRows, ...updatedRows, ...endRows];\n\n this.updateState({ ...this.state, rows });\n }\n\n private async handlePageResult(page: Page): Promise<void> {\n try {\n const res = await page.res;\n\n const currentPage = this.getPage(page.index);\n\n // Only handle the result if the page has not been invalidated.\n if (currentPage?.id === page.id) {\n const cursor = res.getCursor();\n const itemsList = res.getItemsList();\n\n const totalRows = cursor?.getTotal() ?? 0;\n const offset = page.index * this.rowLimit;\n const fetchedRows = fromNodeProto(\n offset,\n itemsList,\n currentPage.metadataKeys\n );\n\n const start = this.state.rows.slice(0, offset);\n const end = this.state.rows.slice(\n start.length + fetchedRows.length,\n totalRows\n );\n const fill = new Array(\n Math.max(\n 0,\n totalRows - start.length - fetchedRows.length - end.length\n )\n );\n const rows = [...start, ...fetchedRows, ...end, ...fill];\n\n if (this.isViewLoading(rows) && this.loadingTimer == null) {\n this.restartLoadingTimer();\n\n this.updateState({\n ...this.state,\n totalRows: totalRows,\n rows: rows,\n shouldShowEmptyResults:\n this.state.filterTerm != null &&\n (rows.length === 0 || this.state.totalFilteredRows === 0),\n });\n } else {\n this.updateState({\n ...this.state,\n totalRows: totalRows,\n rows: rows,\n shouldShowLoading:\n rows.length === 0 && this.state.shouldShowLoading,\n shouldShowEmptyResults:\n this.state.filterTerm != null &&\n (rows.length === 0 || this.state.totalFilteredRows === 0),\n firstFetchComplete: true,\n });\n }\n }\n } catch (e) {\n const errorMessage = e instanceof Error ? e.toString() : 'Unknown';\n console.error(\n `Request error fetching page at index ${page.index} (${errorMessage})`\n );\n\n const currentPage = this.getPage(page.index);\n if (currentPage?.id === page.id) {\n this.invalidatePage(page.index);\n }\n }\n }\n\n private invalidatePage(index: number): void {\n if (this.isPageLoaded(index)) {\n this.pages.delete(index);\n }\n }\n\n public invalidateAfterOffset(offset: number): void {\n const pageIndex = Math.floor(offset / this.rowLimit);\n\n for (const index of this.pages.keys()) {\n if (index >= pageIndex) {\n this.invalidatePage(index);\n }\n }\n }\n\n private getState(): SceneTreeState {\n return this.state;\n }\n\n private isViewLoading(rows: Row[]): boolean {\n return (\n this.state.filterTerm == null &&\n rows[this.activeRowRange[0]] == null &&\n rows[this.activeRowRange[1]] == null\n );\n }\n\n private restartLoadingTimer(): void {\n if (this.loadingTimer != null) {\n this.clearLoadingTimer();\n }\n\n this.loadingTimer = window.setTimeout(() => {\n this.loadingTimer = undefined;\n this.updateState({\n ...this.getState(),\n shouldShowLoading: true,\n });\n }, this.connectOptions.spinnerDelay);\n }\n\n private clearLoadingTimer(): void {\n if (this.loadingTimer != null) {\n clearTimeout(this.loadingTimer);\n this.loadingTimer = undefined;\n }\n }\n\n private tryClearLoadingState(): void {\n const didClearLoadingTimer = this.tryClearLoadingTimer(this.state);\n\n if (didClearLoadingTimer) {\n this.updateState({ ...this.state, shouldShowLoading: false });\n }\n }\n\n private tryClearLoadingTimer(state: SceneTreeState): boolean {\n const loadingShowingOrTimerStarted =\n this.state.shouldShowLoading || this.loadingTimer != null;\n const updateLoadingTimer =\n loadingShowingOrTimerStarted && !this.isViewLoading(state.rows);\n if (updateLoadingTimer) {\n this.clearLoadingTimer();\n return true;\n }\n return false;\n }\n\n private updateState(newState: SceneTreeState): void {\n const didClearLoadingTimer = this.tryClearLoadingTimer(newState);\n\n this.state = {\n ...newState,\n shouldShowLoading: didClearLoadingTimer\n ? false\n : newState.shouldShowLoading,\n };\n\n this.onStateChange.emit(this.state);\n }\n\n public getPageForOffset(offset: number): number {\n const index = Math.floor(offset / this.rowLimit);\n return this.constrainPageIndex(index);\n }\n\n public getPageIndexesForRange(start: number, end: number): [number, number] {\n const pageStart = this.getPageForOffset(start);\n const pageEnd = this.getPageForOffset(end);\n return [pageStart, pageEnd];\n }\n\n private async fetchTree(\n offset: number,\n limit: number,\n jwt: string\n ): Promise<GetTreeResponse> {\n return this.requestUnary(jwt, (metadata, handler) => {\n const pager = new OffsetPager();\n pager.setOffset(offset);\n pager.setLimit(limit);\n\n const req = new GetTreeRequest();\n req.setPager(pager);\n req.setAdditionalColumnKeysList(this.metadataKeys);\n\n this.client.getTree(req, metadata, handler);\n });\n }\n\n private requestUnary<R>(\n jwt: string,\n req: (\n metadata: grpc.Metadata,\n handler: (err: ServiceError | null, res: R | null) => void\n ) => void\n ): Promise<R> {\n return new Promise((resolve, reject) => {\n const metadata = this.createJwtMetadata(jwt);\n\n req(metadata, (err, res) => {\n if (err != null) {\n reject(err);\n } else if (res != null) {\n resolve(res);\n } else {\n reject(\n new SceneTreeError(\n 'Invalid response. Both error and result are null'\n )\n );\n }\n });\n });\n }\n\n private requestServerStream<R>(\n jwt: string,\n req: (metadata: grpc.Metadata) => ResponseStream<R>\n ): ResponseStream<R> {\n const metadata = this.createJwtMetadata(jwt);\n return req(metadata);\n }\n\n private createJwtMetadata(jwt: string): grpc.Metadata {\n return new grpc.Metadata({\n 'jwt-context': JSON.stringify({ jwt }),\n });\n }\n\n private async ifConnectionHasJwt<T>(then: (jwt: string) => T): Promise<T> {\n const { connection } = this.state;\n if (connection.type === 'connecting' || connection.type === 'connected') {\n const jwt = await connection.jwtProvider();\n if (jwt != null) {\n return then(jwt);\n } else {\n throw new SceneTreeUnauthorizedError(\n 'SceneTreeController cannot perform request. Viewer JWT is undefined.'\n );\n }\n } else if (connection.type === 'cancelled') {\n throw new SceneTreeConnectionCancelledError(\n `Request attempted, but controller was cancelled`\n );\n } else {\n throw new SceneTreeError('SceneTreeController is not in connected state');\n }\n }\n\n private ifErrorIsFatal(error: unknown, then: VoidFunction): void {\n if (!(error instanceof SceneTreeConnectionCancelledError)) {\n then();\n }\n }\n\n private getConnectionError(\n e: ServiceError | Error | unknown\n ): SceneTreeErrorDetails {\n if (isGrpcServiceError(e)) {\n if (e.code === grpc.Code.FailedPrecondition) {\n return new SceneTreeErrorDetails(\n 'SCENE_TREE_DISABLED',\n SceneTreeErrorCode.SCENE_TREE_DISABLED\n );\n } else if (e.code === grpc.Code.Unauthenticated) {\n return new SceneTreeErrorDetails(\n 'UNAUTHORIZED',\n SceneTreeErrorCode.UNAUTHORIZED\n );\n } else if (e.code === grpc.Code.Aborted) {\n return new SceneTreeErrorDetails('ABORTED', SceneTreeErrorCode.ABORTED);\n } else {\n return new SceneTreeErrorDetails('UNKNOWN', SceneTreeErrorCode.UNKNOWN);\n }\n } else if (e instanceof SceneTreeUnauthorizedError) {\n return new SceneTreeErrorDetails(\n 'UNAUTHORIZED',\n SceneTreeErrorCode.UNAUTHORIZED\n );\n } else {\n return new SceneTreeErrorDetails('UNKNOWN', SceneTreeErrorCode.UNKNOWN);\n }\n }\n\n private constrainPageRange(start: number, end: number): [number, number] {\n return [Math.max(0, start), Math.min(this.maxPages - 1, end)];\n }\n\n private constrainPageIndex(index: number): number {\n return Math.max(0, Math.min(index, this.maxPages - 1));\n }\n\n private constrainRowOffsets(start: number, end: number): [number, number] {\n return [Math.max(0, start), Math.min(this.state.totalRows - 1, end)];\n }\n\n private get maxPages(): number {\n return Math.max(1, Math.ceil(this.state.totalRows / this.rowLimit));\n }\n\n private log(message?: string, ...optionalParams: unknown[]): void {\n if (this.debugLogs) {\n console.debug(message, optionalParams);\n }\n }\n\n private isConnectedState(\n connection: ConnectionState\n ): connection is ConnectedState {\n return connection.type === 'connected';\n }\n}\n"]}
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../../src/components/scene-tree/lib/controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,oDAAoD,CAAC;AACjF,OAAO,EAAE,IAAI,EAAE,MAAM,kDAAkD,CAAC;AAExE,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EAEb,0BAA0B,EAE1B,uBAAuB,EAEvB,cAAc,EAEd,iBAAiB,EAEjB,gBAAgB,GAEjB,MAAM,iEAAiE,CAAC;AAOzE,OAAO,EAAc,eAAe,EAAY,MAAM,kBAAkB,CAAC;AAGzE,OAAO,EACL,iCAAiC,EACjC,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAO,MAAM,OAAO,CAAC;AAiGxD;;;;GAIG;AACH,MAAM,OAAO,mBAAmB;EA2C9B,YACU,MAA0B,EAC1B,QAAgB,EAChB,iBAAiC;IACvC,YAAY,EAAE,IAAI;IAClB,oCAAoC,EAAE,IAAI;GAC3C;IALO,WAAM,GAAN,MAAM,CAAoB;IAC1B,aAAQ,GAAR,QAAQ,CAAQ;IAChB,mBAAc,GAAd,cAAc,CAGrB;IA5CK,eAAU,GAAG,CAAC,CAAC;IACf,UAAK,GAAG,IAAI,GAAG,EAAgB,CAAC;IAChC,mBAAc,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxB,iBAAY,GAAkB,EAAE,CAAC;IACjC,cAAS,GAAG,KAAK,CAAC;IAO1B;;OAEG;IACI,kBAAa,GAAG,IAAI,eAAe,EAAkB,CAAC;IAErD,UAAK,GAAmB;MAC9B,SAAS,EAAE,CAAC;MACZ,WAAW,EAAE,KAAK;MAClB,IAAI,EAAE,EAAE;MACR,UAAU,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;KACrC,CAAC;EAwBC,CAAC;EAtBJ;;KAEG;EACH,IAAW,gBAAgB;IACzB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;EACzB,CAAC;EAED;;;KAGG;EACH,IAAW,WAAW;IACpB,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,WAAW,CAAC;EACpD,CAAC;EAWD;;;;;KAKG;EACI,YAAY,CACjB,QAA8C;IAE9C,OAAO,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;EACzC,CAAC;EAEM,YAAY,CAAC,SAAkB;IACpC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;EAC7B,CAAC;EAEO,KAAK,CAAC,kCAAkC,CAC9C,WAAwB,EACxB,WAAmB;;IAEnB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC;IAC9C,IACE,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;MACjC,CAAA,MAAA,UAAU,CAAC,uBAAuB,0CAAE,OAAO,KAAI,IAAI;MACnD,UAAU,CAAC,uBAAuB,CAAC,OAAO;QACxC,mBAAmB,CAAC,4BAA4B,EAClD;MACA,MAAM,UAAU,GAAG,UAAU,CAAC,uBAAuB,CAAC,OAAO,GAAG,CAAC,CAAC;MAClE,OAAO,CAAC,IAAI,CACV,mEAAmE,UAAU,GAAG,CACjF,CAAC;MACF,UAAU,CAAC,uBAAuB,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;MACnD,IAAI,CAAC,mBAAmB,EAAE,CAAC;MAE3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;MAEtC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;MAC9B,IAAI,CAAC,8BAA8B,EAAE,CAAC;MAEtC,IAAI,CAAC,WAAW,iCACX,IAAI,CAAC,KAAK,KACb,UAAU,kCACL,UAAU,KACb,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE;YACZ,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE;WAC/B,EACD,uBAAuB,EAAE;YACvB,OAAO,EAAE,UAAU;YACnB,MAAM;WACP,OAEH,CAAC;MAEH,IAAI,CAAC,0BAA0B,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;QACvD,IAAI,CAAC,kCAAkC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;MACpE,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,oCAAoC,CAAC,CAAC;KAC9D;SAAM;MACL,IAAI,CAAC,WAAW,iCACX,IAAI,CAAC,KAAK,KACb,UAAU,EAAE;UACV,IAAI,EAAE,SAAS;UACf,WAAW;UACX,WAAW;UACX,OAAO,EAAE,IAAI,qBAAqB,CAChC,sBAAsB,EACtB,kBAAkB,CAAC,oBAAoB,CACxC;SACF,IACD,CAAC;KACJ;EACH,CAAC;EAEM,KAAK,CAAC,OAAO,CAAC,WAAwB;IAC3C,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;IAClC,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAE1B,IAAI,GAAG,IAAI,IAAI,EAAE;MACf,MAAM,IAAI,0BAA0B,CAClC,6CAA6C,CAC9C,CAAC;KACH;IAED,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAEtD,IAAI,UAAU,CAAC,WAAW,KAAK,WAAW,EAAE;MAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;KACvB;SAAM;MACL,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;KACxB;IAED,MAAM,UAAU,GAAoB;MAClC,IAAI,EAAE,YAAY;MAClB,WAAW;MACX,WAAW;KACZ,CAAC;IACF,IAAI,CAAC,WAAW,iCAAM,IAAI,CAAC,KAAK,KAAE,UAAU,EAAE,UAAU,IAAG,CAAC;IAE5D,IAAI;MACF,IAAI,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;MAE9C,IAAI,CAAC,mBAAmB,EAAE,CAAC;MAC3B,0EAA0E;MAC1E,4DAA4D;MAC5D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;MACtC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;MAExB,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE;QAC9C,IAAI,CAAC,WAAW,iCACX,IAAI,CAAC,KAAK,KACb,UAAU,EAAE;YACV,WAAW;YACX,WAAW;YACX,IAAI,EAAE,WAAW;YACjB,YAAY,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE;YAChD,uBAAuB,EAAE;cACvB,OAAO,EAAE,CAAC;cACV,MAAM;aACP;WACF,IACD,CAAC;QAEH,IAAI,CAAC,qBAAqB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;OACtD;KACF;IAAC,OAAO,CAAC,EAAE;MACV,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE;QAC1B,IAAI,CAAC,WAAW,iCACX,IAAI,CAAC,KAAK,KACb,UAAU,EAAE;YACV,IAAI,EAAE,SAAS;YACf,WAAW;YACX,WAAW;YACX,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;WACpC,IACD,CAAC;QACH,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,MAAM,CAAC,CAAC;MACV,CAAC,CAAC,CAAC;KACJ;IAED,IAAI,CAAC,uBAAuB,EAAE,CAAC;EACjC,CAAC;EAEO,mBAAmB;IACzB,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,EAAE;MAC/B,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;KAC1C;EACH,CAAC;EAEO,qBAAqB,CAC3B,WAAwB,EACxB,WAAmB;IAEnB,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAE3B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE;MACjC,IAAI,CAAC,0BAA0B,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;QACvD,IAAI,CAAC,kCAAkC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAClE,IAAI,CAAC,0BAA0B,GAAG,SAAS,CAAC;MAC9C,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,oCAAoC,CAAC,CAAC;KAC9D;EACH,CAAC;EAEO,mBAAmB;IACzB,IAAI,IAAI,CAAC,0BAA0B,IAAI,IAAI,EAAE;MAC3C,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;MACrD,IAAI,CAAC,0BAA0B,GAAG,SAAS,CAAC;KAC7C;EACH,CAAC;EAEO,uBAAuB;IAC7B,IAAI,CAAC,mBAAmB,CACtB,IAAI,CAAC,cAAc,CAAC,sBAAsB;MACxC,mBAAmB,CAAC,yBAAyB,CAChD,CAAC;EACJ,CAAC;EAEO,iCAAiC;IACvC,IAAI,CAAC,mBAAmB,CACtB,IAAI,CAAC,cAAc,CAAC,gCAAgC;MAClD,mBAAmB,CAAC,oCAAoC,CAC3D,CAAC;EACJ,CAAC;EAEO,mBAAmB,CAAC,cAAsB;IAChD,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAE3B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;MAC3C,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE;QAC9C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;OACjD;IACH,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC,CAAC;EAC5B,CAAC;EAEM,eAAe,CAAC,MAA+B;IACpD,MAAM,oBAAoB,GAAG,KAAK,IAAmB,EAAE;MACrD,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,EAAE;QACxB,IAAI,CAAC,GAAG,CACN,gEAAgE,CACjE,CAAC;QAEF,IAAI;UACF,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SACxC;QAAC,OAAO,CAAC,EAAE;UACV,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE;YAC1B,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,CAAC,CAAC,CAAC;UAChE,CAAC,CAAC,CAAC;SACJ;OACF;IACH,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,GAAS,EAAE;MAClC,IAAI,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;MACvD,oBAAoB,EAAE,CAAC;IACzB,CAAC,CAAC;IAEF,oBAAoB,EAAE,CAAC;IAEvB,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IACxD,OAAO;MACL,OAAO,EAAE,GAAG,EAAE;QACZ,MAAM,CAAC,mBAAmB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;QAC3D,IAAI,CAAC,UAAU,EAAE,CAAC;MACpB,CAAC;KACF,CAAC;EACJ,CAAC;EAEM,UAAU,CAAC,KAAK,GAAG,KAAK;IAC7B,IAAI,CAAC,GAAG,CAAC,8CAA8C,KAAK,GAAG,CAAC,CAAC;IAEjE,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC3B,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAE3B,IAAI,KAAK,EAAE;MACT,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;MACnB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;KAC1B;IAED,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;IAClC,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE;MACnC,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;KACnC;IAED,IAAI,CAAC,WAAW,CAAC;MACf,UAAU,EAAE;QACV,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,WAAW,EAAE,UAAU,CAAC,WAAW;OACpC;MACD,WAAW,EAAE,KAAK;MAClB,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS;MAC3C,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI;MAClC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU;MACrD,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB;MACnE,sBAAsB,EAAE,KAAK;QAC3B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,sBAAsB;MACrC,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB;MACnE,kBAAkB,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB;KACtE,CAAC,CAAC;EACL,CAAC;EAEM,MAAM;IACX,IAAI,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAE5C,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC3B,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAE3B,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACnB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;IAEzB,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;IAClC,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE;MACnC,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;KACnC;IAED,IAAI,CAAC,WAAW,CAAC;MACf,UAAU,EAAE;QACV,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,WAAW,EAAE,UAAU,CAAC,WAAW;OACpC;MACD,WAAW,EAAE,KAAK;MAClB,SAAS,EAAE,CAAC;MACZ,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;EACL,CAAC;EAED;;;;KAIG;EACI,KAAK,CAAC,YAAY,CAAC,EAAU;IAClC,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;MAC3C,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;MAC1B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;MAElB,MAAM,GAAG,GAAG,IAAI,mBAAmB,EAAE,CAAC;MACtC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;MAEtB,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CACjD,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CACjD,CAAC;IACJ,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;;;KAIG;EACI,KAAK,CAAC,UAAU,CAAC,EAAU;IAChC,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;MAC3C,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;MAC1B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;MAElB,MAAM,GAAG,GAAG,IAAI,iBAAiB,EAAE,CAAC;MACpC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;MAEtB,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CACjD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAC/C,CAAC;IACJ,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;KAEG;EACI,KAAK,CAAC,WAAW;IACtB,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;MAC3C,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CACjD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,kBAAkB,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CACrE,CAAC;IACJ,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;KAEG;EACI,KAAK,CAAC,SAAS;IACpB,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;MAC3C,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CACjD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,gBAAgB,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CACjE,CAAC;IACJ,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;;;;;;KAOG;EACI,KAAK,CAAC,iBAAiB,CAAC,EAAU;IACvC,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;MAC3C,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;MAC1B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;MAElB,MAAM,GAAG,GAAG,IAAI,iBAAiB,EAAE,CAAC;MACpC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;MAEtB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CACjC,GAAG,EACH,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CACtE,CAAC;MACF,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;MAExD,IAAI,cAAc,EAAE;QAClB,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,IAAI,CAAC,8BAA8B,EAAE,CAAC;OAC7C;MAED,IAAI,YAAY,IAAI,IAAI,EAAE;QACxB,MAAM,IAAI,6BAA6B,CACrC,kDAAkD,CACnD,CAAC;OACH;MAED,OAAO,YAAY,CAAC,KAAK,CAAC;IAC5B,CAAC,CAAC,CAAC;EACL,CAAC;EAEM,KAAK,CAAC,kBAAkB,CAAC,MAAc;IAC5C,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;MAC3C,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;MAC5B,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;MACxB,MAAM,GAAG,GAAG,IAAI,uBAAuB,EAAE,CAAC;MAC1C,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;MAExB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CACjC,GAAG,EACH,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CACpB,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CACvD,CAAC;MAEF,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC;IAClC,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;;;;;;;;KASG;EACI,KAAK,CAAC,SAAS,CAAC,KAAa;IAClC,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;;MAC3C,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE;QAC1C,OAAO;OACR;MAED,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QAC1B,MAAM,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;QACrC,IAAI,CAAC,GAAG,CAAC,0BAA0B,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACvD,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;QACjE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;OAC7B;MAED,MAAM,CAAA,MAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,0CAAE,GAAG,CAAA,CAAC;IACnC,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;;;KAIG;EACI,iBAAiB,CAAC,MAAc;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;EAC9B,CAAC;EAED;;;;;KAKG;EACI,KAAK,CAAC,UAAU,CACrB,WAAmB,EACnB,SAAiB;IAEjB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC,kBAAkB,CACxD,SAAS,EACT,OAAO,CACR,CAAC;IACF,MAAM,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,CAAC,CAAC;IAChD,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CACzE,CAAC;EACJ,CAAC;EAED;;KAEG;EACI,KAAK,CAAC,iBAAiB;IAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;MAC3C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CACjC,GAAG,EACH,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;QAChB,MAAM,GAAG,GAAG,IAAI,0BAA0B,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;MACtD,CAAC,CACF,CAAC;MAEF,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;;;;;KAMG;EACI,KAAK,CAAC,MAAM,CACjB,IAAY,EACZ,UAA6B,EAAE;IAE/B,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;;MAC3C,IAAI,CAAC,WAAW,iCACX,IAAI,CAAC,KAAK,KACb,WAAW,EAAE,IAAI,EACjB,UAAU,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,IAC1C,CAAC;MAEH,iEAAiE;MACjE,oEAAoE;MACpE,+DAA+D;MAC/D,MAAA,IAAI,CAAC,oBAAoB,0CAAE,MAAM,EAAE,CAAC;MACpC,IAAI,CAAC,oBAAoB,GAAG,SAAS,CAAC;MAEtC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE,EAAE;QACjD,IAAI;UACF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CACjC,GAAG,EACH,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;;YACpB,MAAM,GAAG,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACpB,GAAG,CAAC,WAAW,CAAC,MAAA,OAAO,CAAC,gBAAgB,mCAAI,IAAI,CAAC,CAAC;YAClD,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACxC,IAAI,OAAO,CAAC,OAAO;cAAE,GAAG,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAE7D,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAC5C,GAAG,EACH,QAAQ,EACR,OAAO,CACR,CAAC;UACJ,CAAC,CACF,CAAC;UAEF,MAAM,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;UAE3C,IAAI,CAAC,WAAW,iCACX,IAAI,CAAC,KAAK,KACb,iBAAiB,EAAE,eAAe,EAClC,WAAW,EAAE,KAAK,IAClB,CAAC;SACJ;QAAC,OAAO,CAAC,EAAE;UACV,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC;UAC7C,IAAI,CAAC,WAAW,iCACX,IAAI,CAAC,KAAK,KACb,WAAW,EAAE,KAAK,IAClB,CAAC;SACJ;OACF;IACH,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;;;;KAKG;EACI,YAAY,CAAC,KAAa;IAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;EAC/B,CAAC;EAED;;;;;;KAMG;EACI,uBAAuB,CAAC,KAAa,EAAE,GAAW;IACvD,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,CAAC,CAAC;IAChD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;OACrC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,GAAG,CAAC,CAAC;OAC/B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;EAChD,CAAC;EAED;;;;;KAKG;EACI,OAAO,CAAC,KAAa;IAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;EAC/B,CAAC;EAED;;;;;;;;;;KAUG;EACI,2BAA2B,CAChC,SAAiB,EACjB,OAAe,EACf,SAAS,GAAG,CAAC;IAEb,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC,kBAAkB,CACxD,SAAS,EACT,OAAO,CACR,CAAC;IACF,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,YAAY,EAAE,SAAS,CAAC,CAAC;IACxE,IAAI,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,EAAE;MAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACxD,MAAM,QAAQ,GACZ,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,UAAU,CAAC;QACnE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;MAC7B,CAAC,CAAC,CAAC;MACH,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;MAEjE,UAAU;SACP,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;SAClC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;MAEtD,IAAI,CAAC,GAAG,CACN,sBAAsB,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,QAAQ,EAClE,IAAI,CAAC,KAAK,CACX,CAAC;KACH;EACH,CAAC;EAEM,eAAe,CAAC,IAAmB;IACxC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAEzB,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE;MAC9C,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC;MACzC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;MAC9B,OAAO,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;KAC9C;SAAM;MACL,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;KAC1B;EACH,CAAC;EAED;;;;;;;;KAQG;EACI,KAAK,CAAC,oBAAoB,CAAC,KAAa,EAAE,GAAW;IAC1D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAE3D,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAE5B,MAAM,IAAI,CAAC,8BAA8B,EAAE,CAAC;EAC9C,CAAC;EAED;;;KAGG;EACK,SAAS;IACf,OAAO,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,EAAE,EAAE;MACrC,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE;QACxD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,gBAAgB,EAAE,EAAE,QAAQ,CAAC,CAAC;QACpE,OAAO,GAAG,CAAC;MACb,CAAC,CAAC,CAAC;MAEH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAsB,EAAE,EAAE;QAC3C,IAAI,GAAG,CAAC,YAAY,EAAE,EAAE;UACtB,IAAI,CAAC,mBAAmB,EAAE,CAAC;UAC3B,IAAI,CAAC,WAAW,iCAAM,IAAI,CAAC,KAAK,KAAE,iBAAiB,EAAE,IAAI,IAAG,CAAC;UAE7D,sEAAsE;UACtE,qEAAqE;UACrE,gCAAgC;UAChC,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE;YACjC,IAAI,CAAC,GAAG,CACN,wFAAwF,CACzF,CAAC;YAEF,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,8BAA8B,EAAE,CAAC;WACvC;SACF;QAED,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAE/B,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;QAElC,IAAI,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,KAAI,IAAI,EAAE;UAC9B,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;UAC1D,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;UACpD,IAAI,CAAC,8BAA8B,EAAE,CAAC;SACvC;QAED,MAAM,EACJ,UAAU,GAAG,EAAE,EACf,SAAS,GAAG,EAAE,EACd,oBAAoB,GAAG,EAAE,EACzB,cAAc,GAAG,EAAE,EACnB,YAAY,GAAG,EAAE,GAClB,GAAG,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,KAAI,EAAE,CAAC;QAEzB,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE;UACnC,IAAI,CAAC,GAAG,CACN,yCAAyC,EACzC,oBAAoB,CACrB,CAAC;UAEF,oBAAoB,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CAC9C,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YACxC,gBAAgB,EAAE,IAAI;WACvB,CAAC,CAAC,CACJ,CAAC;SACH;QAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;UACzB,IAAI,CAAC,GAAG,CAAC,6BAA6B,EAAE,UAAU,CAAC,CAAC;UAEpD,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CACpC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YACxC,OAAO,EAAE,KAAK;YACd,gBAAgB,EAAE,KAAK;WACxB,CAAC,CAAC,CACJ,CAAC;SACH;QAED,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;UACxB,IAAI,CAAC,GAAG,CAAC,4BAA4B,EAAE,SAAS,CAAC,CAAC;UAElD,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CACnC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YACxC,OAAO,EAAE,IAAI;YACb,gBAAgB,EAAE,KAAK;WACxB,CAAC,CAAC,CACJ,CAAC;SACH;QAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;UAC7B,IAAI,CAAC,GAAG,CAAC,iCAAiC,EAAE,cAAc,CAAC,CAAC;UAE5D,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CACxC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAChE,CAAC;SACH;QAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;UAC3B,IAAI,CAAC,GAAG,CAAC,+BAA+B,EAAE,YAAY,CAAC,CAAC;UAExD,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CACtC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAC/D,CAAC;SACH;MACH,CAAC,CAAC,CAAC;MAEH,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;QACxB,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE;UAChB,OAAO,CAAC,KAAK,CACX,+CAA+C,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,OAAO,EAAE,CAC9E,CAAC;UACF,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;SAC/B;MACH,CAAC,CAAC,CAAC;MAEH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;QACpB,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAE9B,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE;UAC9C,IAAI,CAAC,iCAAiC,EAAE,CAAC;SAC1C;MACH,CAAC,CAAC,CAAC;MAEH,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;EACL,CAAC;EAEO,KAAK,CAAC,8BAA8B;;IAC1C,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,sBAAsB;IACtD,wEAAwE;IACxE,2EAA2E;IAC3E,MAAA,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,mCAAI,CAAC,EAC3B,MAAA,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,mCAAI,CAAC,CAC5B,CAAC;IAEF,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;IACvE,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;EAC/D,CAAC;EAEO,iBAAiB,CACvB,KAAa,EACb,GAAW,EACX,SAA0D;IAE1D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI;OAChC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC;OACrB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACX,WAAW,CAAC,GAAG,CAAC;MACd,CAAC,iCAAM,GAAG,KAAE,IAAI,kCAAO,GAAG,CAAC,IAAI,GAAK,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,KACvD,CAAC,CAAC,GAAG,CACR,CAAC;IAEJ,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,CAAC,GAAG,SAAS,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC,CAAC;IAExD,IAAI,CAAC,WAAW,iCAAM,IAAI,CAAC,KAAK,KAAE,IAAI,IAAG,CAAC;EAC5C,CAAC;EAEO,KAAK,CAAC,gBAAgB,CAAC,IAAU;;IACvC,IAAI;MACF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC;MAE3B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;MAE7C,+DAA+D;MAC/D,IAAI,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,EAAE,MAAK,IAAI,CAAC,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;QAErC,MAAM,SAAS,GAAG,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,QAAQ,EAAE,mCAAI,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC1C,MAAM,WAAW,GAAG,aAAa,CAC/B,MAAM,EACN,SAAS,EACT,WAAW,CAAC,YAAY,CACzB,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAC/B,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,EACjC,SAAS,CACV,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,KAAK,CACpB,IAAI,CAAC,GAAG,CACN,CAAC,EACD,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAC3D,CACF,CAAC;QACF,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,WAAW,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAEzD,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE;UACzD,IAAI,CAAC,mBAAmB,EAAE,CAAC;UAE3B,IAAI,CAAC,WAAW,iCACX,IAAI,CAAC,KAAK,KACb,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,IAAI,EACV,sBAAsB,EACpB,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI;cAC7B,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,iBAAiB,KAAK,CAAC,CAAC,IAC3D,CAAC;SACJ;aAAM;UACL,IAAI,CAAC,WAAW,iCACX,IAAI,CAAC,KAAK,KACb,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,IAAI,EACV,iBAAiB,EACf,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,iBAAiB,EACnD,sBAAsB,EACpB,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI;cAC7B,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,iBAAiB,KAAK,CAAC,CAAC,EAC3D,kBAAkB,EAAE,IAAI,IACxB,CAAC;SACJ;OACF;KACF;IAAC,OAAO,CAAC,EAAE;MACV,MAAM,YAAY,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;MACnE,OAAO,CAAC,KAAK,CACX,wCAAwC,IAAI,CAAC,KAAK,KAAK,YAAY,GAAG,CACvE,CAAC;MAEF,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;MAC7C,IAAI,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,EAAE,MAAK,IAAI,CAAC,EAAE,EAAE;QAC/B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;OACjC;KACF;EACH,CAAC;EAEO,cAAc,CAAC,KAAa;IAClC,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE;MAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KAC1B;EACH,CAAC;EAEO,qBAAqB,CAAC,MAAc;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAErD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE;MACrC,IAAI,KAAK,IAAI,SAAS,EAAE;QACtB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;OAC5B;KACF;EACH,CAAC;EAEO,QAAQ;IACd,OAAO,IAAI,CAAC,KAAK,CAAC;EACpB,CAAC;EAEO,aAAa,CAAC,IAAW;IAC/B,OAAO,CACL,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI;MAC7B,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI;MACpC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CACrC,CAAC;EACJ,CAAC;EAEO,mBAAmB;IACzB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE;MAC7B,IAAI,CAAC,iBAAiB,EAAE,CAAC;KAC1B;IAED,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;MACzC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;MAC9B,IAAI,CAAC,WAAW,iCACX,IAAI,CAAC,QAAQ,EAAE,KAClB,iBAAiB,EAAE,IAAI,IACvB,CAAC;IACL,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;EACvC,CAAC;EAEO,iBAAiB;IACvB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE;MAC7B,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;MAChC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;KAC/B;EACH,CAAC;EAEO,oBAAoB;IAC1B,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEnE,IAAI,oBAAoB,EAAE;MACxB,IAAI,CAAC,WAAW,iCAAM,IAAI,CAAC,KAAK,KAAE,iBAAiB,EAAE,KAAK,IAAG,CAAC;KAC/D;EACH,CAAC;EAEO,oBAAoB,CAAC,KAAqB;IAChD,MAAM,4BAA4B,GAChC,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC;IAC5D,MAAM,kBAAkB,GACtB,4BAA4B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClE,IAAI,kBAAkB,EAAE;MACtB,IAAI,CAAC,iBAAiB,EAAE,CAAC;MACzB,OAAO,IAAI,CAAC;KACb;IACD,OAAO,KAAK,CAAC;EACf,CAAC;EAEO,WAAW,CAAC,QAAwB;IAC1C,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAEjE,IAAI,CAAC,KAAK,mCACL,QAAQ,KACX,iBAAiB,EAAE,oBAAoB;QACrC,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,QAAQ,CAAC,iBAAiB,GAC/B,CAAC;IAEF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;EACtC,CAAC;EAEM,gBAAgB,CAAC,MAAc;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjD,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;EACxC,CAAC;EAEM,sBAAsB,CAAC,KAAa,EAAE,GAAW;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC3C,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;EAC9B,CAAC;EAEO,KAAK,CAAC,SAAS,CACrB,MAAc,EACd,KAAa,EACb,GAAW;IAEX,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;MAClD,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;MAChC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;MACxB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;MAEtB,MAAM,GAAG,GAAG,IAAI,cAAc,EAAE,CAAC;MACjC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;MACpB,GAAG,CAAC,2BAA2B,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;MAEnD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;EACL,CAAC;EAEO,YAAY,CAClB,GAAW,EACX,GAGS;IAET,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;MACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;MAE7C,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACzB,IAAI,GAAG,IAAI,IAAI,EAAE;UACf,MAAM,CAAC,GAAG,CAAC,CAAC;SACb;aAAM,IAAI,GAAG,IAAI,IAAI,EAAE;UACtB,OAAO,CAAC,GAAG,CAAC,CAAC;SACd;aAAM;UACL,MAAM,CACJ,IAAI,cAAc,CAChB,kDAAkD,CACnD,CACF,CAAC;SACH;MACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;EACL,CAAC;EAEO,mBAAmB,CACzB,GAAW,EACX,GAAmD;IAEnD,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC7C,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC;EACvB,CAAC;EAEO,iBAAiB,CAAC,GAAW;IACnC,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC;MACvB,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;KACvC,CAAC,CAAC;EACL,CAAC;EAEO,KAAK,CAAC,kBAAkB,CAAI,IAAwB;IAC1D,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;IAClC,IAAI,UAAU,CAAC,IAAI,KAAK,YAAY,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE;MACvE,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,CAAC;MAC3C,IAAI,GAAG,IAAI,IAAI,EAAE;QACf,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;OAClB;WAAM;QACL,MAAM,IAAI,0BAA0B,CAClC,sEAAsE,CACvE,CAAC;OACH;KACF;SAAM,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE;MAC1C,MAAM,IAAI,iCAAiC,CACzC,iDAAiD,CAClD,CAAC;KACH;SAAM;MACL,MAAM,IAAI,cAAc,CAAC,+CAA+C,CAAC,CAAC;KAC3E;EACH,CAAC;EAEO,cAAc,CAAC,KAAc,EAAE,IAAkB;IACvD,IAAI,CAAC,CAAC,KAAK,YAAY,iCAAiC,CAAC,EAAE;MACzD,IAAI,EAAE,CAAC;KACR;EACH,CAAC;EAEO,kBAAkB,CACxB,CAAiC;IAEjC,IAAI,kBAAkB,CAAC,CAAC,CAAC,EAAE;MACzB,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;QAC3C,OAAO,IAAI,qBAAqB,CAC9B,qBAAqB,EACrB,kBAAkB,CAAC,mBAAmB,CACvC,CAAC;OACH;WAAM,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;QAC/C,OAAO,IAAI,qBAAqB,CAC9B,cAAc,EACd,kBAAkB,CAAC,YAAY,CAChC,CAAC;OACH;WAAM,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;QACvC,OAAO,IAAI,qBAAqB,CAAC,SAAS,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;OACzE;WAAM;QACL,OAAO,IAAI,qBAAqB,CAAC,SAAS,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;OACzE;KACF;SAAM,IAAI,CAAC,YAAY,0BAA0B,EAAE;MAClD,OAAO,IAAI,qBAAqB,CAC9B,cAAc,EACd,kBAAkB,CAAC,YAAY,CAChC,CAAC;KACH;SAAM;MACL,OAAO,IAAI,qBAAqB,CAAC,SAAS,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;KACzE;EACH,CAAC;EAEO,kBAAkB,CAAC,KAAa,EAAE,GAAW;IACnD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;EAChE,CAAC;EAEO,kBAAkB,CAAC,KAAa;IACtC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;EACzD,CAAC;EAEO,mBAAmB,CAAC,KAAa,EAAE,GAAW;IACpD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;EACvE,CAAC;EAED,IAAY,QAAQ;IAClB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;EACtE,CAAC;EAEO,GAAG,CAAC,OAAgB,EAAE,GAAG,cAAyB;IACxD,IAAI,IAAI,CAAC,SAAS,EAAE;MAClB,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;KACxC;EACH,CAAC;EAEO,gBAAgB,CACtB,UAA2B;IAE3B,OAAO,UAAU,CAAC,IAAI,KAAK,WAAW,CAAC;EACzC,CAAC;;AA/nCc,6CAAyB,GAAG,CAAC,GAAG,EAAE,CAAC;AACnC,wDAAoC,GAAG,CAAC,CAAC;AACzC,gDAA4B,GAAG,CAAC,CAAC","sourcesContent":["import { grpc } from '@improbable-eng/grpc-web';\nimport { OffsetPager } from '@vertexvis/scene-tree-protos/core/protos/paging_pb';\nimport { Uuid } from '@vertexvis/scene-tree-protos/core/protos/uuid_pb';\nimport { Node } from '@vertexvis/scene-tree-protos/scenetree/protos/domain_pb';\nimport {\n CollapseAllRequest,\n CollapseNodeRequest,\n ExpandAllRequest,\n ExpandNodeRequest,\n FilterRequest,\n FilterResponse,\n GetAvailableColumnsRequest,\n GetAvailableColumnsResponse,\n GetNodeAncestorsRequest,\n GetNodeAncestorsResponse,\n GetTreeRequest,\n GetTreeResponse,\n LocateItemRequest,\n LocateItemResponse,\n SubscribeRequest,\n SubscribeResponse,\n} from '@vertexvis/scene-tree-protos/scenetree/protos/scene_tree_api_pb';\nimport {\n ResponseStream,\n SceneTreeAPIClient,\n ServiceError,\n UnaryResponse,\n} from '@vertexvis/scene-tree-protos/scenetree/protos/scene_tree_api_pb_service';\nimport { Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\nimport { MetadataKey } from '../types';\nimport {\n SceneTreeConnectionCancelledError,\n SceneTreeError,\n SceneTreeErrorCode,\n SceneTreeErrorDetails,\n SceneTreeOperationFailedError,\n SceneTreeUnauthorizedError,\n} from './errors';\nimport { isGrpcServiceError } from './grpc';\nimport { decodeSceneTreeJwt } from './jwt';\nimport { fromNodeProto, isLoadedRow, Row } from './row';\n\nexport interface ConnectOptions {\n spinnerDelay: number;\n idleReconnectInSeconds?: number;\n lostConnectionReconnectInSeconds?: number;\n subscriptionHandshakeGracePeriodInMs?: number;\n}\n\nexport type JwtProvider = () => string | undefined;\n\nexport interface SceneTreeState {\n totalRows: number;\n totalFilteredRows?: number;\n rows: Row[];\n connection: ConnectionState;\n isSearching: boolean;\n shouldShowLoading?: boolean;\n shouldShowEmptyResults?: boolean;\n filterTerm?: string;\n handshakeReceived?: boolean;\n firstFetchComplete?: boolean;\n}\n\ninterface Page {\n id: number;\n index: number;\n metadataKeys: MetadataKey[];\n res: Promise<GetTreeResponse>;\n}\n\nexport interface DisconnectedState {\n type: 'disconnected';\n jwtProvider?: JwtProvider;\n sceneViewId?: string;\n}\n\nexport interface ConnectingState {\n type: 'connecting';\n jwtProvider: JwtProvider;\n sceneViewId: string;\n}\n\nexport interface SubscriptionStatusState {\n attempt: number;\n stream: ResponseStream<SubscribeResponse>;\n}\n\nexport interface ConnectedState {\n type: 'connected';\n jwtProvider: JwtProvider;\n sceneViewId: string;\n subscription: Disposable;\n subscriptionStatusState?: SubscriptionStatusState;\n}\n\nexport interface ConnectionFailedState {\n type: 'failure';\n details: SceneTreeErrorDetails;\n jwtProvider: JwtProvider;\n sceneViewId: string;\n}\n\nexport interface ConnectionCancelledState {\n type: 'cancelled';\n jwtProvider?: JwtProvider;\n sceneViewId?: string;\n}\n\n/**\n * A set of options to configure tree filtering behavior.\n */\nexport interface FilterTreeOptions {\n /**\n * Indicates if the filter should include nodes that within collapsed parent\n * nodes.\n */\n includeCollapsed?: boolean;\n\n /**\n * Indicates if the filter should be an exact match with the results.\n */\n exactMatch?: boolean;\n\n /**\n * The metadata keys to filter the tree on.\n */\n columns?: MetadataKey[];\n}\n\ntype ConnectionState =\n | DisconnectedState\n | ConnectingState\n | ConnectedState\n | ConnectionFailedState\n | ConnectionCancelledState;\n\n/**\n * The `SceneTreeController` is responsible for coordinating interactions of the\n * view, fetching and mutating tree data on the server, maintaining state and\n * notifying the view about state changes.\n */\nexport class SceneTreeController {\n private static IDLE_RECONNECT_IN_SECONDS = 4 * 60;\n private static LOST_CONNECTION_RECONNECT_IN_SECONDS = 2;\n private static MAX_SUBSCRIPTION_RETRY_COUNT = 2;\n\n private nextPageId = 0;\n private pages = new Map<number, Page>();\n private activeRowRange = [0, 0];\n private metadataKeys: MetadataKey[] = [];\n private debugLogs = false;\n private pendingFilterGrpcRes?: UnaryResponse;\n\n private reconnectTimer?: number;\n private loadingTimer?: number;\n private subscriptionHandshakeTimer?: number;\n\n /**\n * A dispatcher that emits an event whenever the internal state has changed.\n */\n public onStateChange = new EventDispatcher<SceneTreeState>();\n\n private state: SceneTreeState = {\n totalRows: 0,\n isSearching: false,\n rows: [],\n connection: { type: 'disconnected' },\n };\n\n /**\n * The number of pages that have been fetched.\n */\n public get fetchedPageCount(): number {\n return this.pages.size;\n }\n\n /**\n * Indicates if the controller is connected to the tree backend, and can make\n * requests.\n */\n public get isConnected(): boolean {\n return this.state.connection.type === 'connected';\n }\n\n public constructor(\n private client: SceneTreeAPIClient,\n private rowLimit: number,\n private connectOptions: ConnectOptions = {\n spinnerDelay: 2000,\n subscriptionHandshakeGracePeriodInMs: 5000,\n }\n ) {}\n\n /**\n * Registers an event listener that will be invoked when the state changes\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public stateChanged(\n listener: Listener<SceneTreeState | undefined>\n ): Disposable {\n return this.onStateChange.on(listener);\n }\n\n public setDebugLogs(debugLogs: boolean): void {\n this.debugLogs = debugLogs;\n }\n\n private async handleSubscriptionHandshakeTimeout(\n jwtProvider: JwtProvider,\n sceneViewId: string\n ): Promise<void> {\n const connection = this.getState().connection;\n if (\n this.isConnectedState(connection) &&\n connection.subscriptionStatusState?.attempt != null &&\n connection.subscriptionStatusState.attempt <\n SceneTreeController.MAX_SUBSCRIPTION_RETRY_COUNT\n ) {\n const newAttempt = connection.subscriptionStatusState.attempt + 1;\n console.warn(\n `Failed to subscribe within the allotted timeout. Retry attempt={${newAttempt}}`\n );\n connection.subscriptionStatusState.stream.cancel();\n this.clearHandshakeTimer();\n\n const stream = await this.subscribe();\n\n this.invalidateAfterOffset(0);\n this.fetchUnloadedPagesInActiveRows();\n\n this.updateState({\n ...this.state,\n connection: {\n ...connection,\n type: 'connected',\n subscription: {\n dispose: () => stream.cancel(),\n },\n subscriptionStatusState: {\n attempt: newAttempt,\n stream,\n },\n },\n });\n\n this.subscriptionHandshakeTimer = window.setTimeout(() => {\n this.handleSubscriptionHandshakeTimeout(jwtProvider, sceneViewId);\n }, this.connectOptions.subscriptionHandshakeGracePeriodInMs);\n } else {\n this.updateState({\n ...this.state,\n connection: {\n type: 'failure',\n jwtProvider,\n sceneViewId,\n details: new SceneTreeErrorDetails(\n 'SUBSCRIPTION_FAILURE',\n SceneTreeErrorCode.SUBSCRIPTION_FAILURE\n ),\n },\n });\n }\n }\n\n public async connect(jwtProvider: JwtProvider): Promise<void> {\n const { connection } = this.state;\n const jwt = jwtProvider();\n\n if (jwt == null) {\n throw new SceneTreeUnauthorizedError(\n 'Cannot connect scene tree. JWT is undefined'\n );\n }\n\n const { view: sceneViewId } = decodeSceneTreeJwt(jwt);\n\n if (connection.sceneViewId !== sceneViewId) {\n this.disconnect(true);\n } else {\n this.disconnect(false);\n }\n\n const connecting: ConnectingState = {\n type: 'connecting',\n jwtProvider,\n sceneViewId,\n };\n this.updateState({ ...this.state, connection: connecting });\n\n try {\n this.log('Scene tree controller connecting.');\n\n this.restartLoadingTimer();\n // Ensure we have a subscription prior to attempting to get the first page\n // to make sure we receive any ListChange that comes through\n const stream = await this.subscribe();\n await this.fetchPage(0);\n\n if (this.state.connection.type !== 'cancelled') {\n this.updateState({\n ...this.state,\n connection: {\n jwtProvider,\n sceneViewId,\n type: 'connected',\n subscription: { dispose: () => stream.cancel() },\n subscriptionStatusState: {\n attempt: 0,\n stream,\n },\n },\n });\n\n this.restartHandshakeTimer(jwtProvider, sceneViewId);\n }\n } catch (e) {\n this.ifErrorIsFatal(e, () => {\n this.updateState({\n ...this.state,\n connection: {\n type: 'failure',\n jwtProvider,\n sceneViewId,\n details: this.getConnectionError(e),\n },\n });\n this.clearHandshakeTimer();\n throw e;\n });\n }\n\n this.startIdleReconnectTimer();\n }\n\n private clearReconnectTimer(): void {\n if (this.reconnectTimer != null) {\n window.clearTimeout(this.reconnectTimer);\n }\n }\n\n private restartHandshakeTimer(\n jwtProvider: JwtProvider,\n sceneViewId: string\n ): void {\n this.clearHandshakeTimer();\n\n if (!this.state.handshakeReceived) {\n this.subscriptionHandshakeTimer = window.setTimeout(() => {\n this.handleSubscriptionHandshakeTimeout(jwtProvider, sceneViewId);\n this.subscriptionHandshakeTimer = undefined;\n }, this.connectOptions.subscriptionHandshakeGracePeriodInMs);\n }\n }\n\n private clearHandshakeTimer(): void {\n if (this.subscriptionHandshakeTimer != null) {\n window.clearTimeout(this.subscriptionHandshakeTimer);\n this.subscriptionHandshakeTimer = undefined;\n }\n }\n\n private startIdleReconnectTimer(): void {\n this.startReconnectTimer(\n this.connectOptions.idleReconnectInSeconds ||\n SceneTreeController.IDLE_RECONNECT_IN_SECONDS\n );\n }\n\n private startConnectionLostReconnectTimer(): void {\n this.startReconnectTimer(\n this.connectOptions.lostConnectionReconnectInSeconds ||\n SceneTreeController.LOST_CONNECTION_RECONNECT_IN_SECONDS\n );\n }\n\n private startReconnectTimer(delayInSeconds: number): void {\n this.clearReconnectTimer();\n\n this.reconnectTimer = window.setTimeout(() => {\n if (this.state.connection.type === 'connected') {\n this.connect(this.state.connection.jwtProvider);\n }\n }, delayInSeconds * 1000);\n }\n\n public connectToViewer(viewer: HTMLVertexViewerElement): Disposable {\n const connectWithViewerJwt = async (): Promise<void> => {\n if (viewer.token != null) {\n this.log(\n 'Scene tree controller found viewer JWT. Attempting connection.'\n );\n\n try {\n await this.connect(() => viewer.token);\n } catch (e) {\n this.ifErrorIsFatal(e, () => {\n console.error('Scene tree controller errored connecting.', e);\n });\n }\n }\n };\n\n const handleSceneReady = (): void => {\n this.log('Scene tree controller received scene ready');\n connectWithViewerJwt();\n };\n\n connectWithViewerJwt();\n\n viewer.addEventListener('sceneReady', handleSceneReady);\n return {\n dispose: () => {\n viewer.removeEventListener('sceneReady', handleSceneReady);\n this.disconnect();\n },\n };\n }\n\n public disconnect(reset = false): void {\n this.log(`Scene tree controller disconnecting [reset=${reset}]`);\n\n this.clearHandshakeTimer();\n this.clearReconnectTimer();\n\n if (reset) {\n this.pages.clear();\n this.activeRowRange = [];\n }\n\n const { connection } = this.state;\n if (connection.type === 'connected') {\n connection.subscription.dispose();\n }\n\n this.updateState({\n connection: {\n type: 'disconnected',\n jwtProvider: connection.jwtProvider,\n sceneViewId: connection.sceneViewId,\n },\n isSearching: false,\n totalRows: reset ? 0 : this.state.totalRows,\n rows: reset ? [] : this.state.rows,\n filterTerm: reset ? undefined : this.state.filterTerm,\n totalFilteredRows: reset ? undefined : this.state.totalFilteredRows,\n shouldShowEmptyResults: reset\n ? undefined\n : this.state.shouldShowEmptyResults,\n handshakeReceived: reset ? undefined : this.state.handshakeReceived,\n firstFetchComplete: reset ? undefined : this.state.firstFetchComplete,\n });\n }\n\n public cancel(): void {\n this.log(`Scene tree controller cancelled`);\n\n this.clearHandshakeTimer();\n this.clearReconnectTimer();\n\n this.pages.clear();\n this.activeRowRange = [];\n\n const { connection } = this.state;\n if (connection.type === 'connected') {\n connection.subscription.dispose();\n }\n\n this.updateState({\n connection: {\n type: 'cancelled',\n jwtProvider: connection.jwtProvider,\n sceneViewId: connection.sceneViewId,\n },\n isSearching: false,\n totalRows: 0,\n rows: [],\n });\n }\n\n /**\n * Collapses a node with the given node ID.\n *\n * @param id A node ID to collapse.\n */\n public async collapseNode(id: string): Promise<void> {\n return this.ifConnectionHasJwt(async (jwt) => {\n const nodeId = new Uuid();\n nodeId.setHex(id);\n\n const req = new CollapseNodeRequest();\n req.setNodeId(nodeId);\n\n await this.requestUnary(jwt, (metadata, handler) =>\n this.client.collapseNode(req, metadata, handler)\n );\n });\n }\n\n /**\n * Expands a node with the given node ID.\n *\n * @param id A node ID to expand.\n */\n public async expandNode(id: string): Promise<void> {\n return this.ifConnectionHasJwt(async (jwt) => {\n const nodeId = new Uuid();\n nodeId.setHex(id);\n\n const req = new ExpandNodeRequest();\n req.setNodeId(nodeId);\n\n await this.requestUnary(jwt, (metadata, handler) =>\n this.client.expandNode(req, metadata, handler)\n );\n });\n }\n\n /**\n * Collapses all nodes in the tree.\n */\n public async collapseAll(): Promise<void> {\n return this.ifConnectionHasJwt(async (jwt) => {\n await this.requestUnary(jwt, (metadata, handler) =>\n this.client.collapseAll(new CollapseAllRequest(), metadata, handler)\n );\n });\n }\n\n /**\n * Expands all nodes in the tree.\n */\n public async expandAll(): Promise<void> {\n return this.ifConnectionHasJwt(async (jwt) => {\n await this.requestUnary(jwt, (metadata, handler) =>\n this.client.expandAll(new ExpandAllRequest(), metadata, handler)\n );\n });\n }\n\n /**\n * Invokes a network request that will expand all the parent nodes for the\n * node mapped to the given ID.\n *\n * @param id An ID of an item.\n * @returns A promise that resolves with the index of the node after\n * expansion.\n */\n public async expandParentNodes(id: string): Promise<number> {\n return this.ifConnectionHasJwt(async (jwt) => {\n const nodeId = new Uuid();\n nodeId.setHex(id);\n\n const req = new LocateItemRequest();\n req.setNodeId(nodeId);\n\n const res = await this.requestUnary<LocateItemResponse>(\n jwt,\n (metadata, handler) => this.client.locateItem(req, metadata, handler)\n );\n const { requiresReload, locatedIndex } = res.toObject();\n\n if (requiresReload) {\n this.invalidateAfterOffset(0);\n await this.fetchUnloadedPagesInActiveRows();\n }\n\n if (locatedIndex == null) {\n throw new SceneTreeOperationFailedError(\n 'Cannot locate node. Location index is undefined.'\n );\n }\n\n return locatedIndex.value;\n });\n }\n\n public async fetchNodeAncestors(nodeId: string): Promise<Node.AsObject[]> {\n return this.ifConnectionHasJwt(async (jwt) => {\n const nodeUuid = new Uuid();\n nodeUuid.setHex(nodeId);\n const req = new GetNodeAncestorsRequest();\n req.setNodeId(nodeUuid);\n\n const res = await this.requestUnary<GetNodeAncestorsResponse>(\n jwt,\n (metadata, handler) =>\n this.client.getNodeAncestors(req, metadata, handler)\n );\n\n return res.toObject().itemsList;\n });\n }\n\n /**\n * Fetches a page at the given index. Once the data has been fetched, the\n * controller will emit an `onStateChange` event that contains rows with the\n * fetched page. If a page is invalidated before the request completes, the\n * response is ignored.\n *\n * If the index is out of range, returns without fetching any data.\n *\n * @param index A 0 based index to fetch.\n */\n public async fetchPage(index: number): Promise<void> {\n return this.ifConnectionHasJwt(async (jwt) => {\n if (index < 0 || index > this.maxPages - 1) {\n return;\n }\n\n if (!this.pages.has(index)) {\n const offset = index * this.rowLimit;\n this.log('Scene tree fetching page', index, offset);\n const res = this.fetchTree(offset, this.rowLimit, jwt);\n const id = this.nextPageId++;\n const page = { id, res, index, metadataKeys: this.metadataKeys };\n this.pages.set(index, page);\n this.handlePageResult(page);\n }\n\n await this.pages.get(index)?.res;\n });\n }\n\n /**\n * Fetches a page that contains the given row offset.\n *\n * @param offset The row offset of the page to fetch.\n */\n public fetchPageAtOffset(offset: number): Promise<void> {\n const page = Math.floor(offset / this.rowLimit);\n return this.fetchPage(page);\n }\n\n /**\n * Fetches pages that contain the given row ranges.\n *\n * @param startOffset A start offset, inclusive.\n * @param endOffset The end offset, inclusive.\n */\n public async fetchRange(\n startOffset: number,\n endOffset: number\n ): Promise<void> {\n const startPage = Math.floor(startOffset / this.rowLimit);\n const endPage = Math.floor(endOffset / this.rowLimit);\n const [boundedStart, boundedEnd] = this.constrainPageRange(\n startPage,\n endPage\n );\n const pageCount = boundedEnd - boundedStart + 1;\n await Promise.all(\n Array.from({ length: pageCount }).map((_, page) => this.fetchPage(page))\n );\n }\n\n /**\n * Fetches the metadata keys for the current scene view.\n */\n public async fetchMetadataKeys(): Promise<MetadataKey[]> {\n return this.ifConnectionHasJwt(async (jwt) => {\n const res = await this.requestUnary<GetAvailableColumnsResponse>(\n jwt,\n (meta, handler) => {\n const req = new GetAvailableColumnsRequest();\n this.client.getAvailableColumns(req, meta, handler);\n }\n );\n\n return res.getKeysList().map((value) => value.getValue());\n });\n }\n\n /**\n * Performs a network request that will filter the nodes in the tree that\n * match the given term and options.\n *\n * @param term The filter term.\n * @param options The options to apply to the filter.\n */\n public async filter(\n term: string,\n options: FilterTreeOptions = {}\n ): Promise<void> {\n return this.ifConnectionHasJwt(async (jwt) => {\n this.updateState({\n ...this.state,\n isSearching: true,\n filterTerm: term !== '' ? term : undefined,\n });\n\n // Cancel any in-flight filter requests, and wait for the request\n // to complete prior to making another filter request. This prevents\n // a race condition between requests from different keystrokes.\n this.pendingFilterGrpcRes?.cancel();\n this.pendingFilterGrpcRes = undefined;\n\n if (this.state.filterTerm === term || term === '') {\n try {\n const res = await this.requestUnary<FilterResponse>(\n jwt,\n (metadata, handler) => {\n const req = new FilterRequest();\n req.setFilter(term);\n req.setFullTree(options.includeCollapsed ?? true);\n req.setExactMatch(!!options.exactMatch);\n if (options.columns) req.setColumnsKeysList(options.columns);\n\n this.pendingFilterGrpcRes = this.client.filter(\n req,\n metadata,\n handler\n );\n }\n );\n\n const { numberOfResults } = res.toObject();\n\n this.updateState({\n ...this.state,\n totalFilteredRows: numberOfResults,\n isSearching: false,\n });\n } catch (e) {\n console.error('Failed to filter search ', e);\n this.updateState({\n ...this.state,\n isSearching: false,\n });\n }\n }\n });\n }\n\n /**\n * Checks if the page at the given index is loaded.\n *\n * @param index A page index.\n * @returns `true` if the page is loaded. `false` otherwise.\n */\n public isPageLoaded(index: number): boolean {\n return this.pages.has(index);\n }\n\n /**\n * Returns a list of page indices within a range that have not been loaded.\n *\n * @param start The start page index, inclusive.\n * @param end The end page index, inclusive.\n * @returns A list of pages indices that have not been loaded.\n */\n public getNonLoadedPageIndexes(start: number, end: number): number[] {\n const [boundedStart, boundedEnd] = this.constrainPageRange(start, end);\n const pageCount = boundedEnd - boundedStart + 1;\n return Array.from({ length: pageCount })\n .map((_, i) => boundedStart + i)\n .filter((page) => !this.isPageLoaded(page));\n }\n\n /**\n * Returns the page at the given index, or `undefined` if one doesn't exist.\n *\n * @param index The index to return.\n * @returns A `Page` if found, otherwise `undefined`.\n */\n public getPage(index: number): Page | undefined {\n return this.pages.get(index);\n }\n\n /**\n * Clears page data that is outside a given range. Uses a distance algorithm\n * to removes pages that are furthest from either end of the range. This\n * method is useful for clearing out data that is not needed anymore to keep\n * memory pressure in the client low.\n *\n * @param startPage The index of the starting page in the range.\n * @param endPage The index of the ending page in the range.\n * @param threshold A minimum number of pages to keep. No cleanup is performed\n * if the number of fetched pages doesn't meet this threshold.\n */\n public invalidatePagesOutsideRange(\n startPage: number,\n endPage: number,\n threshold = 0\n ): void {\n const [boundedStart, boundedEnd] = this.constrainPageRange(\n startPage,\n endPage\n );\n const boundedThreshold = Math.max(boundedEnd - boundedStart, threshold);\n if (this.fetchedPageCount > boundedThreshold) {\n const pages = Array.from(this.pages.keys()).map((index) => {\n const distance =\n index < boundedStart ? boundedStart - index : index - boundedEnd;\n return { index, distance };\n });\n const sortedDesc = pages.sort((a, b) => b.distance - a.distance);\n\n sortedDesc\n .slice(0, pages.length - threshold)\n .forEach(({ index }) => this.invalidatePage(index));\n\n this.log(\n `Scene tree dropped ${pages.length - this.fetchedPageCount} pages`,\n this.pages\n );\n }\n }\n\n public setMetadataKeys(keys: MetadataKey[]): Promise<void> {\n this.metadataKeys = keys;\n\n if (this.state.connection.type === 'connected') {\n const [start, end] = this.activeRowRange;\n this.invalidateAfterOffset(0);\n return this.updateActiveRowRange(start, end);\n } else {\n return Promise.resolve();\n }\n }\n\n /**\n * Sets the active rows. Active rows dictate which pages will be refetched\n * when the tree changes.\n *\n * @param start The starting row index.\n * @param end The ending row index.\n * @returns A promise that resolves when the first page of data has been\n * loaded.\n */\n public async updateActiveRowRange(start: number, end: number): Promise<void> {\n this.activeRowRange = this.constrainRowOffsets(start, end);\n\n this.tryClearLoadingState();\n\n await this.fetchUnloadedPagesInActiveRows();\n }\n\n /**\n * Performs a network request that will listen to server-side changes of the\n * scene tree's data.\n */\n private subscribe(): Promise<ResponseStream<SubscribeResponse>> {\n return this.ifConnectionHasJwt((jwt) => {\n const stream = this.requestServerStream(jwt, (metadata) => {\n const sub = this.client.subscribe(new SubscribeRequest(), metadata);\n return sub;\n });\n\n stream.on('data', (msg: SubscribeResponse) => {\n if (msg.hasHandshake()) {\n this.clearHandshakeTimer();\n this.updateState({ ...this.state, handshakeReceived: true });\n\n // Verify that we've loaded the first page of the tree when we receive\n // a handshake in the case that the listener was not fully registered\n // when a `ListChange` was sent.\n if (this.state.firstFetchComplete) {\n this.log(\n 'Scene tree first fetch completed before handshake received, invalidating current pages'\n );\n\n this.invalidateAfterOffset(0);\n this.fetchUnloadedPagesInActiveRows();\n }\n }\n\n this.startIdleReconnectTimer();\n\n const { change } = msg.toObject();\n\n if (change?.listChange != null) {\n this.log('Received list change', change.listChange.start);\n this.invalidateAfterOffset(change.listChange.start);\n this.fetchUnloadedPagesInActiveRows();\n }\n\n const {\n hiddenList = [],\n shownList = [],\n partiallyVisibleList = [],\n deselectedList = [],\n selectedList = [],\n } = change?.ranges || {};\n\n if (partiallyVisibleList.length > 0) {\n this.log(\n 'Received partial visibility list change',\n partiallyVisibleList\n );\n\n partiallyVisibleList.forEach(({ start, end }) =>\n this.patchNodesInRange(start, end, () => ({\n partiallyVisible: true,\n }))\n );\n }\n\n if (hiddenList.length > 0) {\n this.log('Received hidden list change', hiddenList);\n\n hiddenList.forEach(({ start, end }) =>\n this.patchNodesInRange(start, end, () => ({\n visible: false,\n partiallyVisible: false,\n }))\n );\n }\n\n if (shownList.length > 0) {\n this.log('Received shown list change', shownList);\n\n shownList.forEach(({ start, end }) =>\n this.patchNodesInRange(start, end, () => ({\n visible: true,\n partiallyVisible: false,\n }))\n );\n }\n\n if (deselectedList.length > 0) {\n this.log('Received deselected list change', deselectedList);\n\n deselectedList.forEach(({ start, end }) =>\n this.patchNodesInRange(start, end, () => ({ selected: false }))\n );\n }\n\n if (selectedList.length > 0) {\n this.log('Received selected list change', selectedList);\n\n selectedList.forEach(({ start, end }) =>\n this.patchNodesInRange(start, end, () => ({ selected: true }))\n );\n }\n });\n\n stream.on('status', (s) => {\n if (s.code !== 0) {\n console.error(\n `Failed to subscribe to scene tree with code=${s.code}, details=${s.details}`\n );\n this.invalidateAfterOffset(0);\n }\n });\n\n stream.on('end', () => {\n this.invalidateAfterOffset(0);\n\n if (this.state.connection.type === 'connected') {\n this.startConnectionLostReconnectTimer();\n }\n });\n\n return stream;\n });\n }\n\n private async fetchUnloadedPagesInActiveRows(): Promise<void> {\n const [startPage, endPage] = this.getPageIndexesForRange(\n // Verify the first page is loaded properly even if the `activeRowRange`\n // has not been specified by the underlying table layout after a reconnect.\n this.activeRowRange[0] ?? 0,\n this.activeRowRange[1] ?? 0\n );\n\n const pages = this.getNonLoadedPageIndexes(startPage - 1, endPage + 1);\n await Promise.all(pages.map((page) => this.fetchPage(page)));\n }\n\n private patchNodesInRange(\n start: number,\n end: number,\n transform: (node: Node.AsObject) => Partial<Node.AsObject>\n ): void {\n const updatedRows = this.state.rows\n .slice(start, end + 1)\n .map((row) =>\n isLoadedRow(row)\n ? { ...row, node: { ...row.node, ...transform(row.node) } }\n : row\n );\n\n const startRows = this.state.rows.slice(0, start);\n const endRows = this.state.rows.slice(end + 1);\n const rows = [...startRows, ...updatedRows, ...endRows];\n\n this.updateState({ ...this.state, rows });\n }\n\n private async handlePageResult(page: Page): Promise<void> {\n try {\n const res = await page.res;\n\n const currentPage = this.getPage(page.index);\n\n // Only handle the result if the page has not been invalidated.\n if (currentPage?.id === page.id) {\n const cursor = res.getCursor();\n const itemsList = res.getItemsList();\n\n const totalRows = cursor?.getTotal() ?? 0;\n const offset = page.index * this.rowLimit;\n const fetchedRows = fromNodeProto(\n offset,\n itemsList,\n currentPage.metadataKeys\n );\n\n const start = this.state.rows.slice(0, offset);\n const end = this.state.rows.slice(\n start.length + fetchedRows.length,\n totalRows\n );\n const fill = new Array(\n Math.max(\n 0,\n totalRows - start.length - fetchedRows.length - end.length\n )\n );\n const rows = [...start, ...fetchedRows, ...end, ...fill];\n\n if (this.isViewLoading(rows) && this.loadingTimer == null) {\n this.restartLoadingTimer();\n\n this.updateState({\n ...this.state,\n totalRows: totalRows,\n rows: rows,\n shouldShowEmptyResults:\n this.state.filterTerm != null &&\n (rows.length === 0 || this.state.totalFilteredRows === 0),\n });\n } else {\n this.updateState({\n ...this.state,\n totalRows: totalRows,\n rows: rows,\n shouldShowLoading:\n rows.length === 0 && this.state.shouldShowLoading,\n shouldShowEmptyResults:\n this.state.filterTerm != null &&\n (rows.length === 0 || this.state.totalFilteredRows === 0),\n firstFetchComplete: true,\n });\n }\n }\n } catch (e) {\n const errorMessage = e instanceof Error ? e.toString() : 'Unknown';\n console.error(\n `Request error fetching page at index ${page.index} (${errorMessage})`\n );\n\n const currentPage = this.getPage(page.index);\n if (currentPage?.id === page.id) {\n this.invalidatePage(page.index);\n }\n }\n }\n\n private invalidatePage(index: number): void {\n if (this.isPageLoaded(index)) {\n this.pages.delete(index);\n }\n }\n\n private invalidateAfterOffset(offset: number): void {\n const pageIndex = Math.floor(offset / this.rowLimit);\n\n for (const index of this.pages.keys()) {\n if (index >= pageIndex) {\n this.invalidatePage(index);\n }\n }\n }\n\n private getState(): SceneTreeState {\n return this.state;\n }\n\n private isViewLoading(rows: Row[]): boolean {\n return (\n this.state.filterTerm == null &&\n rows[this.activeRowRange[0]] == null &&\n rows[this.activeRowRange[1]] == null\n );\n }\n\n private restartLoadingTimer(): void {\n if (this.loadingTimer != null) {\n this.clearLoadingTimer();\n }\n\n this.loadingTimer = window.setTimeout(() => {\n this.loadingTimer = undefined;\n this.updateState({\n ...this.getState(),\n shouldShowLoading: true,\n });\n }, this.connectOptions.spinnerDelay);\n }\n\n private clearLoadingTimer(): void {\n if (this.loadingTimer != null) {\n clearTimeout(this.loadingTimer);\n this.loadingTimer = undefined;\n }\n }\n\n private tryClearLoadingState(): void {\n const didClearLoadingTimer = this.tryClearLoadingTimer(this.state);\n\n if (didClearLoadingTimer) {\n this.updateState({ ...this.state, shouldShowLoading: false });\n }\n }\n\n private tryClearLoadingTimer(state: SceneTreeState): boolean {\n const loadingShowingOrTimerStarted =\n this.state.shouldShowLoading || this.loadingTimer != null;\n const updateLoadingTimer =\n loadingShowingOrTimerStarted && !this.isViewLoading(state.rows);\n if (updateLoadingTimer) {\n this.clearLoadingTimer();\n return true;\n }\n return false;\n }\n\n private updateState(newState: SceneTreeState): void {\n const didClearLoadingTimer = this.tryClearLoadingTimer(newState);\n\n this.state = {\n ...newState,\n shouldShowLoading: didClearLoadingTimer\n ? false\n : newState.shouldShowLoading,\n };\n\n this.onStateChange.emit(this.state);\n }\n\n public getPageForOffset(offset: number): number {\n const index = Math.floor(offset / this.rowLimit);\n return this.constrainPageIndex(index);\n }\n\n public getPageIndexesForRange(start: number, end: number): [number, number] {\n const pageStart = this.getPageForOffset(start);\n const pageEnd = this.getPageForOffset(end);\n return [pageStart, pageEnd];\n }\n\n private async fetchTree(\n offset: number,\n limit: number,\n jwt: string\n ): Promise<GetTreeResponse> {\n return this.requestUnary(jwt, (metadata, handler) => {\n const pager = new OffsetPager();\n pager.setOffset(offset);\n pager.setLimit(limit);\n\n const req = new GetTreeRequest();\n req.setPager(pager);\n req.setAdditionalColumnKeysList(this.metadataKeys);\n\n this.client.getTree(req, metadata, handler);\n });\n }\n\n private requestUnary<R>(\n jwt: string,\n req: (\n metadata: grpc.Metadata,\n handler: (err: ServiceError | null, res: R | null) => void\n ) => void\n ): Promise<R> {\n return new Promise((resolve, reject) => {\n const metadata = this.createJwtMetadata(jwt);\n\n req(metadata, (err, res) => {\n if (err != null) {\n reject(err);\n } else if (res != null) {\n resolve(res);\n } else {\n reject(\n new SceneTreeError(\n 'Invalid response. Both error and result are null'\n )\n );\n }\n });\n });\n }\n\n private requestServerStream<R>(\n jwt: string,\n req: (metadata: grpc.Metadata) => ResponseStream<R>\n ): ResponseStream<R> {\n const metadata = this.createJwtMetadata(jwt);\n return req(metadata);\n }\n\n private createJwtMetadata(jwt: string): grpc.Metadata {\n return new grpc.Metadata({\n 'jwt-context': JSON.stringify({ jwt }),\n });\n }\n\n private async ifConnectionHasJwt<T>(then: (jwt: string) => T): Promise<T> {\n const { connection } = this.state;\n if (connection.type === 'connecting' || connection.type === 'connected') {\n const jwt = await connection.jwtProvider();\n if (jwt != null) {\n return then(jwt);\n } else {\n throw new SceneTreeUnauthorizedError(\n 'SceneTreeController cannot perform request. Viewer JWT is undefined.'\n );\n }\n } else if (connection.type === 'cancelled') {\n throw new SceneTreeConnectionCancelledError(\n `Request attempted, but controller was cancelled`\n );\n } else {\n throw new SceneTreeError('SceneTreeController is not in connected state');\n }\n }\n\n private ifErrorIsFatal(error: unknown, then: VoidFunction): void {\n if (!(error instanceof SceneTreeConnectionCancelledError)) {\n then();\n }\n }\n\n private getConnectionError(\n e: ServiceError | Error | unknown\n ): SceneTreeErrorDetails {\n if (isGrpcServiceError(e)) {\n if (e.code === grpc.Code.FailedPrecondition) {\n return new SceneTreeErrorDetails(\n 'SCENE_TREE_DISABLED',\n SceneTreeErrorCode.SCENE_TREE_DISABLED\n );\n } else if (e.code === grpc.Code.Unauthenticated) {\n return new SceneTreeErrorDetails(\n 'UNAUTHORIZED',\n SceneTreeErrorCode.UNAUTHORIZED\n );\n } else if (e.code === grpc.Code.Aborted) {\n return new SceneTreeErrorDetails('ABORTED', SceneTreeErrorCode.ABORTED);\n } else {\n return new SceneTreeErrorDetails('UNKNOWN', SceneTreeErrorCode.UNKNOWN);\n }\n } else if (e instanceof SceneTreeUnauthorizedError) {\n return new SceneTreeErrorDetails(\n 'UNAUTHORIZED',\n SceneTreeErrorCode.UNAUTHORIZED\n );\n } else {\n return new SceneTreeErrorDetails('UNKNOWN', SceneTreeErrorCode.UNKNOWN);\n }\n }\n\n private constrainPageRange(start: number, end: number): [number, number] {\n return [Math.max(0, start), Math.min(this.maxPages - 1, end)];\n }\n\n private constrainPageIndex(index: number): number {\n return Math.max(0, Math.min(index, this.maxPages - 1));\n }\n\n private constrainRowOffsets(start: number, end: number): [number, number] {\n return [Math.max(0, start), Math.min(this.state.totalRows - 1, end)];\n }\n\n private get maxPages(): number {\n return Math.max(1, Math.ceil(this.state.totalRows / this.rowLimit));\n }\n\n private log(message?: string, ...optionalParams: unknown[]): void {\n if (this.debugLogs) {\n console.debug(message, optionalParams);\n }\n }\n\n private isConnectedState(\n connection: ConnectionState\n ): connection is ConnectedState {\n return connection.type === 'connected';\n }\n}\n"]}
@@ -46,6 +46,10 @@ export class SceneTree {
46
46
  * Indicates whether the metadata search should use an exact match.
47
47
  */
48
48
  this.metadataSearchExactMatch = false;
49
+ /**
50
+ * A list of the metadata keys that a scene tree search should be performed on.
51
+ */
52
+ this.metadataSearchKeys = [];
49
53
  /**
50
54
  * A list of part metadata keys that will be made available to each row. This
51
55
  * metadata can be used for data binding inside the scene tree's template.
@@ -343,7 +347,7 @@ export class SceneTree {
343
347
  */
344
348
  async selectFilteredItems(term, options) {
345
349
  if (this.viewer != null) {
346
- const definedMetadataKeys = this.metadataSearchKeys != null
350
+ const definedMetadataKeys = this.metadataSearchKeys.length > 0
347
351
  ? this.metadataSearchKeys
348
352
  : this.metadataKeys;
349
353
  if (definedMetadataKeys.length === 0) {
@@ -555,7 +559,7 @@ export class SceneTree {
555
559
  await op({ viewer: this.viewer, id: node.id.hex, node });
556
560
  }
557
561
  async handleSearch(event) {
558
- const columnsToSearch = this.metadataSearchKeys != null
562
+ const columnsToSearch = this.metadataSearchKeys.length > 0
559
563
  ? this.metadataSearchKeys
560
564
  : this.metadataKeys;
561
565
  try {
@@ -805,7 +809,7 @@ export class SceneTree {
805
809
  "mutable": true,
806
810
  "complexType": {
807
811
  "original": "MetadataKey[]",
808
- "resolved": "string[] | undefined",
812
+ "resolved": "string[]",
809
813
  "references": {
810
814
  "MetadataKey": {
811
815
  "location": "import",
@@ -814,11 +818,12 @@ export class SceneTree {
814
818
  }
815
819
  },
816
820
  "required": false,
817
- "optional": true,
821
+ "optional": false,
818
822
  "docs": {
819
823
  "tags": [],
820
824
  "text": "A list of the metadata keys that a scene tree search should be performed on."
821
- }
825
+ },
826
+ "defaultValue": "[]"
822
827
  },
823
828
  "metadataKeys": {
824
829
  "type": "unknown",
@@ -1 +1 @@
1
- {"version":3,"file":"scene-tree.js","sourceRoot":"","sources":["../../../src/components/scene-tree/scene-tree.tsx"],"names":[],"mappings":"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","sourcesContent":["import 'requestidlecallback-polyfill';\n\nimport {\n Component,\n Element,\n Event,\n EventEmitter,\n forceUpdate,\n h,\n Host,\n Listen,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { ElementPool } from '@vertexvis/html-templates';\nimport { Node } from '@vertexvis/scene-tree-protos/scenetree/protos/domain_pb';\nimport { SceneTreeAPIClient } from '@vertexvis/scene-tree-protos/scenetree/protos/scene_tree_api_pb_service';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { Config, parseConfig, PartialConfig } from '../../lib/config';\nimport { Environment } from '../../lib/environment';\nimport { isSceneTreeTableCellElement } from '../scene-tree-table-cell/utils';\nimport { SceneTreeError } from './errors';\nimport {\n FilterTreeOptions,\n SceneTreeController,\n SceneTreeState,\n} from './lib/controller';\nimport { getSceneTreeContainsElement } from './lib/dom';\nimport { SceneTreeErrorCode, SceneTreeErrorDetails } from './lib/errors';\nimport { webSocketSubscriptionTransportFactory } from './lib/grpc';\nimport { isLoadedRow, Row } from './lib/row';\nimport {\n deselectItem,\n hideItem,\n selectFilterResults,\n selectItem,\n selectRangeInSceneTree,\n showItem,\n} from './lib/viewer-ops';\nimport {\n MetadataKey,\n RowArg,\n RowDataProvider,\n SceneTreeOperationOptions,\n ScrollToOptions,\n SelectItemOptions,\n} from './types';\n\n/**\n * The minimum amount of time provided by requestIdleCallback to clear purged\n * data. A value too low may cause contention with browser rendering. A value\n * too high will cause too many items to be accumulated.\n */\nconst MIN_CLEAR_UNUSED_DATA_MS = 25;\n\ninterface StateMap {\n idleCallbackId?: number;\n resizeObserver?: ResizeObserver;\n componentLoaded: boolean;\n\n client?: SceneTreeAPIClient;\n jwt?: string;\n\n onStateChangeDisposable?: Disposable;\n subscribeDisposable?: Disposable;\n viewerDisposable?: Disposable;\n\n elementPool?: ElementPool;\n template?: HTMLTemplateElement;\n\n selectionPath?: string[];\n\n layoutEl?: HTMLVertexSceneTreeTableLayoutElement;\n}\n\ntype OperationHandler = (data: {\n viewer: HTMLVertexViewerElement;\n id: string;\n node: Node.AsObject;\n}) => void | Promise<void>;\n\n/**\n * @slot header - A slot that places content above the rows in the tree. By\n * default, a search toolbar will be placed in this slot. Elements can be\n * stacked by assigning multiple elements to this slot.\n * @slot footer - A slot that places content below the rows in the tree.\n * Elements can be stacked by assigning multiple elements to this slot.\n */\n@Component({\n tag: 'vertex-scene-tree',\n styleUrl: 'scene-tree.css',\n shadow: true,\n})\nexport class SceneTree {\n /**\n * The number of offscreen rows above and below the viewport to render. Having\n * a higher number reduces the chance of the browser not displaying a row\n * while scrolling.\n */\n @Prop()\n public overScanCount = 25;\n\n /**\n * A CSS selector that points to a `<vertex-viewer>` element. Either this\n * property or `viewer` must be set.\n */\n @Prop()\n public viewerSelector?: string;\n\n /**\n * An instance of a `<vertex-viewer>` element. Either this property or\n * `viewerSelector` must be set.\n */\n @Prop({ reflect: true, mutable: true })\n public viewer?: HTMLVertexViewerElement | null;\n\n /**\n * A callback that is invoked immediately before a row is about to rendered.\n * This callback can return additional data that can be bound to in a\n * template.\n *\n * @example\n *\n * ```html\n * <script>\n * const table = document.querySelector('vertex-scene-tree-table');\n * table.rowData = (row) => {\n * return { func: () => console.log('row', row.node.name) };\n * }\n * </script>\n *\n * <vertex-scene-tree>\n * <vertex-scene-tree-table>\n * <vertex-scene-tree-table-column>\n * <template>\n * <button event:click=\"{{row.data.func}}\">Hi</button>\n * </template>\n * </vertex-scene-tree-table-column>\n * </vertex-scene-tree-table>\n * </vertex-scene-tree>\n * ```\n */\n @Prop()\n public rowData?: RowDataProvider;\n\n /**\n * An object to configure the scene tree.\n */\n @Prop()\n public config?: PartialConfig | string;\n\n /**\n * Sets the default environment for the viewer. This setting is used for\n * auto-configuring network hosts.\n *\n * Use the `config` property for manually setting hosts.\n */\n @Prop()\n public configEnv: Environment = 'platprod';\n\n @Prop({ mutable: true })\n public controller?: SceneTreeController;\n\n /**\n * Indicates whether the metadata search should use an exact match.\n */\n @Prop({ mutable: true })\n public metadataSearchExactMatch = false;\n\n /**\n * A list of the metadata keys that a scene tree search should be performed on.\n */\n @Prop({ mutable: true })\n public metadataSearchKeys?: MetadataKey[];\n\n /**\n * A list of part metadata keys that will be made available to each row. This\n * metadata can be used for data binding inside the scene tree's template.\n */\n @Prop()\n public metadataKeys: MetadataKey[] = [];\n\n /**\n * An event that is emitted when this <vertex-scene-tree> encounters a connection\n * error.\n */\n @Event()\n public connectionError!: EventEmitter<SceneTreeErrorDetails>;\n\n /**\n * An event that is emitted when the first row of this <vertex-scene-tree> has\n * been rendered.\n */\n @Event()\n public firstRowRendered!: EventEmitter<void>;\n\n @State()\n private rows: Row[] = [];\n\n @State()\n private totalRows = 0;\n\n @State()\n private showLoader = false;\n\n @State()\n private showEmptyResults = false;\n\n /**\n * This stores internal state that you want to preserve across live-reloads,\n * but shouldn't trigger a refresh if the data changes. Marking this with\n * @State to allow to preserve state across live-reloads.\n */\n @State()\n private stateMap: StateMap = {\n componentLoaded: false,\n };\n\n @State()\n private errorDetails: SceneTreeErrorDetails | undefined;\n\n @State()\n private attemptingRetry = false;\n\n @Element()\n private el!: HTMLElement;\n\n private lastSelectedItemId?: string;\n private firstCellRendered = false;\n\n /**\n * Schedules a render of the rows in the scene tree. Useful if any custom\n * data in your scene tree has changed, and you want to update the row's\n * contents.\n *\n * **Note:** This is an asynchronous operation. The update may happen on the\n * next frame.\n */\n @Method()\n public async invalidateRows(): Promise<void> {\n forceUpdate(this.getLayoutElement());\n }\n\n /**\n * Scrolls the tree to the given row index.\n *\n * @param index An index of the row to scroll to.\n * @param options A set of options to configure the scrolling behavior.\n */\n @Method()\n public async scrollToIndex(\n index: number,\n options: ScrollToOptions = {}\n ): Promise<void> {\n const { animate, position = 'middle' } = options;\n const i = Math.max(0, Math.min(index, this.totalRows));\n\n const top = this.getScrollToPosition(i, position);\n\n this.getLayoutElement().scrollToPosition(top, {\n behavior: animate ? 'smooth' : undefined,\n });\n }\n\n /**\n * Scrolls the tree to an item with the given ID. If the node for the item is\n * not expanded, the tree will expand each of its parent nodes.\n *\n * @param itemId An ID of an item to scroll to.\n * @param options A set of options to configure the scrolling behavior.\n * @returns A promise that resolves when the operation is finished.\n */\n @Method()\n public async scrollToItem(\n itemId: string,\n options: ScrollToOptions = {}\n ): Promise<void> {\n const rowsBeforeExpand = this.totalRows;\n const index = await this.controller?.expandParentNodes(itemId);\n\n if (index != null && rowsBeforeExpand !== this.totalRows) {\n return new Promise((resolve) => {\n const layoutEl = this.getLayoutElement();\n const handleLayoutRendered = async (): Promise<void> => {\n layoutEl.removeEventListener('layoutRendered', handleLayoutRendered);\n await this.scrollToIndex(index, options);\n resolve();\n };\n\n layoutEl.addEventListener('layoutRendered', handleLayoutRendered);\n });\n } else if (index != null) {\n await this.scrollToIndex(index, options);\n }\n }\n\n /**\n * Performs an API call to expand all nodes in the tree.\n */\n @Method()\n public async expandAll(): Promise<void> {\n await this.controller?.expandAll();\n }\n\n /**\n * Performs an API call to collapse all nodes in the tree.\n */\n @Method()\n public async collapseAll(): Promise<void> {\n await this.controller?.collapseAll();\n }\n\n /**\n * Performs an API call that will expand the node associated to the specified\n * row or row index.\n *\n * @param row A row, row index, or node to expand.\n */\n @Method()\n public async expandItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ id, node }) => {\n if (!node.expanded) {\n await this.controller?.expandNode(id);\n }\n });\n }\n\n /**\n * Performs an API call that will collapse the node associated to the\n * specified row or row index.\n *\n * @param row A row, row index, or node to collapse.\n */\n @Method()\n public async collapseItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ id, node }) => {\n if (node.expanded) {\n await this.controller?.collapseNode(id);\n }\n });\n }\n\n /**\n * Performs an API call that will either expand or collapse the node\n * associated to the given row or row index.\n *\n * @param row The row, row index, or node to collapse or expand.\n */\n @Method()\n public async toggleExpandItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ node }) => {\n if (node.expanded) {\n await this.collapseItem(node);\n } else {\n await this.expandItem(node);\n }\n });\n }\n\n /**\n * Performs an API call that will either hide or show the item associated to\n * the given row or row index.\n *\n * @param row The row, row index, or node to toggle visibility.\n */\n @Method()\n public async toggleItemVisibility(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id, node }) => {\n if (node.visible || node.partiallyVisible) {\n await hideItem(viewer, id);\n } else {\n await showItem(viewer, id);\n }\n });\n }\n\n /**\n * Performs an API call that will hide the item associated to the given row\n * or row index.\n *\n * @param row The row, row index, or node to hide.\n */\n @Method()\n public async hideItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id, node }) => {\n if (node.visible) {\n await hideItem(viewer, id);\n }\n });\n }\n\n /**\n * Performs an API call that will show the item associated to the given row\n * or row index.\n *\n * @param row The row, row index, or node to show.\n */\n @Method()\n public async showItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id, node }) => {\n if (!node.visible) {\n await showItem(viewer, id);\n }\n });\n }\n\n /**\n * Performs an API call that will select the item associated to the given row\n * or row index.\n *\n * This method supports a `recurseParent` option that allows for recursively\n * selecting the next unselected parent node. This behavior is considered\n * stateful. Each call to `selectItem` will track the ancestry of the passed\n * in `rowArg`. If calling `selectItem` with a row not belonging to the\n * ancestry of a previous selection, then this method will perform a standard\n * selection.\n *\n * @param row The row, row index or node to select.\n * @param options A set of options to configure selection behavior.\n */\n @Method()\n public async selectItem(\n row: RowArg,\n { recurseParent, ...options }: SelectItemOptions = {}\n ): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id }) => {\n const ancestors = (await this.controller?.fetchNodeAncestors(id)) || [];\n const isInPath = this.stateMap.selectionPath?.includes(id);\n\n if (recurseParent && isInPath) {\n const nextNode = ancestors.find(({ selected }) => !selected);\n if (nextNode != null) {\n await this.selectItem(nextNode, options);\n this.lastSelectedItemId = id;\n }\n } else if (options.range && this.lastSelectedItemId != null) {\n const currentRowIndex = await this.controller?.expandParentNodes(id);\n const previouslySelectedIndex =\n await this.controller?.expandParentNodes(this.lastSelectedItemId);\n\n if (previouslySelectedIndex && currentRowIndex) {\n const start = Math.min(previouslySelectedIndex, currentRowIndex);\n const end = Math.max(previouslySelectedIndex, currentRowIndex);\n await selectRangeInSceneTree(viewer, start, end, options);\n }\n } else {\n await selectItem(viewer, id, options);\n this.lastSelectedItemId = id;\n }\n\n this.stateMap.selectionPath = [\n ...ancestors.map(({ id }) => id?.hex || ''),\n id,\n ];\n });\n }\n\n /**\n * Performs an API call that will deselect the item associated to the given\n * row or row index.\n *\n * @param row The row, row index, or node to deselect.\n */\n @Method()\n public async deselectItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id, node }) => {\n if (node.selected) {\n this.lastSelectedItemId = undefined;\n await deselectItem(viewer, id);\n }\n });\n }\n\n /**\n * Returns a row at the given index. If the row data has not been loaded,\n * returns `undefined`.\n *\n * @param index The index of the row.\n * @returns A row, or `undefined` if the row hasn't been loaded.\n */\n @Method()\n public async getRowAtIndex(index: number): Promise<Row> {\n return this.rows[index];\n }\n\n /**\n * Returns the row data from the given mouse or pointer event. The event must\n * originate from a `vertex-scene-tree-table-cell` contained by this element,\n * otherwise `undefined` is returned.\n *\n * @param event A mouse or pointer event that originated from this component.\n * @returns A row, or `undefined` if the row hasn't been loaded.\n */\n @Method()\n public async getRowForEvent(event: MouseEvent | PointerEvent): Promise<Row> {\n const { clientY, target } = event;\n\n if (\n target != null &&\n this.errorDetails == null &&\n getSceneTreeContainsElement(this.el, target as HTMLElement) &&\n isSceneTreeTableCellElement(target)\n ) {\n return this.getRowAtClientY(clientY);\n } else {\n return undefined;\n }\n }\n\n /**\n * Returns the row data from the given vertical client position.\n *\n * @param clientY The vertical client position.\n * @returns A row or `undefined` if the row hasn't been loaded.\n */\n @Method()\n public getRowAtClientY(clientY: number): Promise<Row> {\n const layoutEl = this.getLayoutElement();\n const top = layoutEl.layoutOffset;\n const index = Math.floor(\n (clientY - top + layoutEl.scrollOffset) / layoutEl.rowHeight\n );\n return this.getRowAtIndex(index);\n }\n\n /**\n * Performs an async request that will filter the displayed items in the tree\n * that match the given term and options.\n *\n * @param term The filter term.\n * @param options The options to apply to the filter.\n * @returns A promise that completes when the request has completed. Note,\n * items are displayed asynchronously. So the displayed items may not reflect\n * the result of this filter when the promise completes.\n */\n @Method()\n public async filterItems(\n term: string,\n options: FilterTreeOptions = {}\n ): Promise<void> {\n return this.controller?.filter(term, options);\n }\n\n /**\n * Performs an async request that will select the filtered items in the tree\n * that match the given term.\n *\n * @param term The filter term.\n * @returns A promise that completes when the request has completed.\n */\n @Method()\n public async selectFilteredItems(\n term: string,\n options?: SceneTreeOperationOptions\n ): Promise<void> {\n if (this.viewer != null) {\n const definedMetadataKeys =\n this.metadataSearchKeys != null\n ? this.metadataSearchKeys\n : this.metadataKeys;\n\n if (definedMetadataKeys.length === 0) {\n console.warn(\n \"No metadata keys were found to perform the selection. Defaulting to ['VERTEX_SCENE_ITEM_NAME']\"\n );\n }\n\n const columnsToSearch =\n definedMetadataKeys.length > 0\n ? definedMetadataKeys\n : ['VERTEX_SCENE_ITEM_NAME'];\n\n await selectFilterResults(\n this.viewer,\n term,\n columnsToSearch,\n this.metadataSearchExactMatch,\n {\n append: false,\n ...options,\n }\n );\n }\n }\n\n /**\n * Fetches the metadata keys that are available to the scene tree. Metadata\n * keys can be assigned to the scene tree using the `metadataKeys` property.\n * The scene tree will fetch this metadata and make these values available\n * for data binding.\n *\n * @returns A promise that resolves with the names of available keys.\n */\n @Method()\n public async fetchMetadataKeys(): Promise<MetadataKey[]> {\n return this.controller?.fetchMetadataKeys() ?? [];\n }\n\n /**\n * @ignore\n */\n protected disconnectedCallback(): void {\n this.stateMap.viewerDisposable?.dispose();\n this.controller?.cancel();\n }\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n if (this.controller == null) {\n const { sceneTreeHost } = this.getConfig().network;\n const client = new SceneTreeAPIClient(\n sceneTreeHost,\n this.getConfig().flags.grpcUseStreamingWebSocketTransport\n ? {\n transport: webSocketSubscriptionTransportFactory,\n }\n : undefined\n );\n this.controller = new SceneTreeController(client, 100);\n this.controller?.setMetadataKeys(this.metadataKeys);\n }\n\n this.stateMap.onStateChangeDisposable = this.controller.onStateChange.on(\n (state) => this.handleControllerStateChange(state)\n );\n\n this.connectToViewer();\n }\n\n /**\n * @ignore\n */\n protected async componentDidLoad(): Promise<void> {\n this.ensureLayoutDefined();\n this.updateLayoutElement();\n\n const layoutEl = this.getLayoutElement();\n const resizeObserver = new ResizeObserver(() => {\n this.invalidateRows();\n });\n resizeObserver.observe(layoutEl);\n this.stateMap.resizeObserver = resizeObserver;\n\n this.stateMap.componentLoaded = true;\n\n this.controller?.setMetadataKeys(this.metadataKeys);\n\n if (this.viewer == null) {\n this.errorDetails = new SceneTreeErrorDetails(\n 'MISSING_VIEWER',\n SceneTreeErrorCode.MISSING_VIEWER\n );\n }\n }\n\n public componentWillRender(): void {\n // The controller can load data prior to the first render\n // ensure that this renders any time the state changes.\n this.updateLayoutElement();\n }\n\n /**\n * @ignore\n */\n protected render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n <div class=\"header\">\n <slot name=\"header\">\n <vertex-scene-tree-toolbar class=\"search-toolbar\">\n <vertex-scene-tree-search controller={this.controller} />\n </vertex-scene-tree-toolbar>\n </slot>\n </div>\n\n {this.errorDetails != null && this.renderError(this.errorDetails)}\n\n {this.errorDetails == null && (\n <div class=\"rows-scroll\">\n {this.showLoader && (\n <slot name=\"loading\">\n <vertex-viewer-spinner class=\"loading\" size=\"md\" />\n </slot>\n )}\n <slot />\n {this.showEmptyResults && (\n <slot name=\"empty-results\">\n <div class=\"empty-results\">No Results Found.</div>\n </slot>\n )}\n </div>\n )}\n\n <div class=\"footer\">\n <slot name=\"footer\" />\n </div>\n </Host>\n );\n }\n\n private renderError(details: SceneTreeErrorDetails): h.JSX.IntrinsicElements {\n if (details.code !== SceneTreeErrorCode.SCENE_TREE_DISABLED) {\n return (\n <SceneTreeError details={details}>\n <button\n class=\"button button-secondary\"\n onClick={() => this.retryConnectToViewer()}\n disabled={this.attemptingRetry}\n >\n Retry\n </button>\n </SceneTreeError>\n );\n } else {\n return <SceneTreeError details={details} />;\n }\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(\n newViewer: HTMLVertexViewerElement | undefined,\n oldViewer: HTMLVertexViewerElement | undefined\n ): void {\n // StencilJS will invoke this callback even before the component has been\n // loaded. According to their docs, this shouldn't happen. Return if the\n // component hasn't been loaded.\n // See https://stenciljs.com/docs/reactive-data#watch-decorator\n if (!this.stateMap.componentLoaded) {\n return;\n }\n\n this.connectToViewer();\n }\n\n /**\n * @ignore\n */\n @Watch('controller')\n protected handleControllerChanged(newController: SceneTreeController): void {\n // StencilJS will invoke this callback even before the component has been\n // loaded. According to their docs, this shouldn't happen. Return if the\n // component hasn't been loaded.\n // See https://stenciljs.com/docs/reactive-data#watch-decorator\n if (!this.stateMap.componentLoaded) {\n return;\n }\n\n this.stateMap.onStateChangeDisposable?.dispose();\n\n this.stateMap.onStateChangeDisposable = newController.onStateChange.on(\n (state) => this.handleControllerStateChange(state)\n );\n\n newController.setMetadataKeys(this.metadataKeys);\n }\n\n /**\n * @ignore\n */\n @Watch('metadataKeys')\n protected handleMetadataKeysChanged(): void {\n this.controller?.setMetadataKeys(this.metadataKeys);\n }\n\n private retryConnectToViewer(): void {\n this.attemptingRetry = true;\n this.errorDetails = undefined;\n this.connectToViewer();\n }\n\n private connectToViewer(): void {\n this.stateMap.viewerDisposable?.dispose();\n\n if (this.viewer == null && this.viewerSelector != null) {\n this.viewer = document.querySelector(this.viewerSelector) as\n | HTMLVertexViewerElement\n | undefined;\n }\n\n if (this.viewer != null) {\n this.stateMap.viewerDisposable = this.controller?.connectToViewer(\n this.viewer\n );\n } else {\n this.attemptingRetry = false;\n }\n }\n\n private scheduleClearUnusedData(): void {\n if (this.stateMap.idleCallbackId != null) {\n window.cancelIdleCallback(this.stateMap.idleCallbackId);\n }\n\n this.stateMap.idleCallbackId = window.requestIdleCallback((foo) => {\n const remaining = foo.timeRemaining?.();\n\n if (remaining == null || remaining >= MIN_CLEAR_UNUSED_DATA_MS) {\n const layoutEl = this.getLayoutElement();\n const startIndex = layoutEl.viewportStartIndex;\n const endIndex = layoutEl.viewportEndIndex;\n const [start, end] =\n this.controller?.getPageIndexesForRange(startIndex, endIndex) || [];\n\n if (start != null && end != null) {\n this.controller?.invalidatePagesOutsideRange(start, end, 50);\n }\n } else {\n this.scheduleClearUnusedData();\n }\n });\n }\n\n private handleControllerStateChange(state: SceneTreeState): void {\n this.showLoader = !!state.shouldShowLoading;\n this.showEmptyResults = !!state.shouldShowEmptyResults;\n this.rows = state.rows;\n this.totalRows = state.totalRows;\n\n if (state.connection.type === 'failure') {\n this.errorDetails = state.connection.details;\n this.connectionError.emit(state.connection.details);\n } else if (state.connection.type === 'disconnected') {\n this.errorDetails = new SceneTreeErrorDetails(\n 'DISCONNECTED',\n SceneTreeErrorCode.DISCONNECTED\n );\n } else {\n this.errorDetails = undefined;\n }\n\n if (\n state.connection.type === 'connected' ||\n state.connection.type === 'failure'\n ) {\n this.attemptingRetry = false;\n }\n }\n\n private async performRowOperation(\n rowOrIndex: number | Row | Node.AsObject,\n op: OperationHandler\n ): Promise<void> {\n const row =\n typeof rowOrIndex === 'number' ? this.rows[rowOrIndex] : rowOrIndex;\n\n if (row == null) {\n throw new Error(`Cannot perform scene tree operation. Row not found.`);\n }\n\n const node = isLoadedRow(row) ? row.node : row;\n\n if (node.id == null) {\n throw new Error(`Cannot perform scene tree operation. ID is undefined.`);\n }\n\n if (this.viewer == null) {\n throw new Error(\n `Cannot perform scene tree operation. Cannot get reference to viewer.`\n );\n }\n\n await op({ viewer: this.viewer, id: node.id.hex, node });\n }\n\n @Listen('search')\n protected async handleSearch(event: CustomEvent<string>): Promise<void> {\n const columnsToSearch =\n this.metadataSearchKeys != null\n ? this.metadataSearchKeys\n : this.metadataKeys;\n\n try {\n await this.filterItems(event.detail, {\n columns: columnsToSearch,\n exactMatch: this.metadataSearchExactMatch,\n });\n } catch (e) {\n console.error('Failed to filter tree with exception: ', e);\n }\n }\n\n @Listen('cellLoaded')\n protected async handleCellLoaded(): Promise<void> {\n if (!this.firstCellRendered && this.rows.length > 0) {\n this.firstCellRendered = true;\n this.firstRowRendered.emit();\n }\n }\n\n private getScrollToPosition(\n index: number,\n position: ScrollToOptions['position']\n ): number {\n const layoutEl = this.getLayoutElement();\n const constrainedIndex = Math.max(0, Math.min(index, this.totalRows - 1));\n const viewportHeight = layoutEl.layoutHeight ?? 0;\n const rowHeight = layoutEl.rowHeight;\n\n if (position === 'start') {\n return constrainedIndex * rowHeight;\n } else if (position === 'middle') {\n const rowCenterY = constrainedIndex * rowHeight + rowHeight / 2;\n return rowCenterY - viewportHeight / 2;\n } else {\n const rowBottomY = constrainedIndex * rowHeight + rowHeight;\n return rowBottomY - viewportHeight;\n }\n }\n\n private getConfig(): Config {\n return parseConfig(this.configEnv, this.config);\n }\n\n private ensureLayoutDefined(): void {\n let layout = this.el.querySelector('vertex-scene-tree-table-layout');\n if (layout == null) {\n layout = document.createElement('vertex-scene-tree-table-layout');\n layout.innerHTML = `\n <vertex-scene-tree-table-column>\n <template>\n <vertex-scene-tree-table-cell prop:value=\"{{row.node.name}}\" expand-toggle visibility-toggle></vertex-scene-tree-table-cell>\n </template>\n </vertex-scene-tree-table-column>\n `;\n\n this.el.appendChild(layout);\n }\n this.stateMap.layoutEl = layout;\n }\n\n private updateLayoutElement(): void {\n const layout = this.stateMap.layoutEl;\n if (layout != null) {\n layout.rows = this.rows;\n layout.tree = this.el as HTMLVertexSceneTreeElement;\n layout.totalRows = this.totalRows;\n layout.controller = this.controller;\n layout.rowData = this.rowData;\n } else if (!this.stateMap.componentLoaded && this.totalRows > 0) {\n console.debug(\n 'Scene tree has rows, but the component has not yet rendered'\n );\n }\n }\n\n private getLayoutElement(): HTMLVertexSceneTreeTableLayoutElement {\n if (this.stateMap.layoutEl != null) {\n return this.stateMap.layoutEl;\n } else {\n throw new Error('Layout element is undefined');\n }\n }\n}\n"]}
1
+ {"version":3,"file":"scene-tree.js","sourceRoot":"","sources":["../../../src/components/scene-tree/scene-tree.tsx"],"names":[],"mappings":"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","sourcesContent":["import 'requestidlecallback-polyfill';\n\nimport {\n Component,\n Element,\n Event,\n EventEmitter,\n forceUpdate,\n h,\n Host,\n Listen,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { ElementPool } from '@vertexvis/html-templates';\nimport { Node } from '@vertexvis/scene-tree-protos/scenetree/protos/domain_pb';\nimport { SceneTreeAPIClient } from '@vertexvis/scene-tree-protos/scenetree/protos/scene_tree_api_pb_service';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { Config, parseConfig, PartialConfig } from '../../lib/config';\nimport { Environment } from '../../lib/environment';\nimport { isSceneTreeTableCellElement } from '../scene-tree-table-cell/utils';\nimport { SceneTreeError } from './errors';\nimport {\n FilterTreeOptions,\n SceneTreeController,\n SceneTreeState,\n} from './lib/controller';\nimport { getSceneTreeContainsElement } from './lib/dom';\nimport { SceneTreeErrorCode, SceneTreeErrorDetails } from './lib/errors';\nimport { webSocketSubscriptionTransportFactory } from './lib/grpc';\nimport { isLoadedRow, Row } from './lib/row';\nimport {\n deselectItem,\n hideItem,\n selectFilterResults,\n selectItem,\n selectRangeInSceneTree,\n showItem,\n} from './lib/viewer-ops';\nimport {\n MetadataKey,\n RowArg,\n RowDataProvider,\n SceneTreeOperationOptions,\n ScrollToOptions,\n SelectItemOptions,\n} from './types';\n\n/**\n * The minimum amount of time provided by requestIdleCallback to clear purged\n * data. A value too low may cause contention with browser rendering. A value\n * too high will cause too many items to be accumulated.\n */\nconst MIN_CLEAR_UNUSED_DATA_MS = 25;\n\ninterface StateMap {\n idleCallbackId?: number;\n resizeObserver?: ResizeObserver;\n componentLoaded: boolean;\n\n client?: SceneTreeAPIClient;\n jwt?: string;\n\n onStateChangeDisposable?: Disposable;\n subscribeDisposable?: Disposable;\n viewerDisposable?: Disposable;\n\n elementPool?: ElementPool;\n template?: HTMLTemplateElement;\n\n selectionPath?: string[];\n\n layoutEl?: HTMLVertexSceneTreeTableLayoutElement;\n}\n\ntype OperationHandler = (data: {\n viewer: HTMLVertexViewerElement;\n id: string;\n node: Node.AsObject;\n}) => void | Promise<void>;\n\n/**\n * @slot header - A slot that places content above the rows in the tree. By\n * default, a search toolbar will be placed in this slot. Elements can be\n * stacked by assigning multiple elements to this slot.\n * @slot footer - A slot that places content below the rows in the tree.\n * Elements can be stacked by assigning multiple elements to this slot.\n */\n@Component({\n tag: 'vertex-scene-tree',\n styleUrl: 'scene-tree.css',\n shadow: true,\n})\nexport class SceneTree {\n /**\n * The number of offscreen rows above and below the viewport to render. Having\n * a higher number reduces the chance of the browser not displaying a row\n * while scrolling.\n */\n @Prop()\n public overScanCount = 25;\n\n /**\n * A CSS selector that points to a `<vertex-viewer>` element. Either this\n * property or `viewer` must be set.\n */\n @Prop()\n public viewerSelector?: string;\n\n /**\n * An instance of a `<vertex-viewer>` element. Either this property or\n * `viewerSelector` must be set.\n */\n @Prop({ reflect: true, mutable: true })\n public viewer?: HTMLVertexViewerElement | null;\n\n /**\n * A callback that is invoked immediately before a row is about to rendered.\n * This callback can return additional data that can be bound to in a\n * template.\n *\n * @example\n *\n * ```html\n * <script>\n * const table = document.querySelector('vertex-scene-tree-table');\n * table.rowData = (row) => {\n * return { func: () => console.log('row', row.node.name) };\n * }\n * </script>\n *\n * <vertex-scene-tree>\n * <vertex-scene-tree-table>\n * <vertex-scene-tree-table-column>\n * <template>\n * <button event:click=\"{{row.data.func}}\">Hi</button>\n * </template>\n * </vertex-scene-tree-table-column>\n * </vertex-scene-tree-table>\n * </vertex-scene-tree>\n * ```\n */\n @Prop()\n public rowData?: RowDataProvider;\n\n /**\n * An object to configure the scene tree.\n */\n @Prop()\n public config?: PartialConfig | string;\n\n /**\n * Sets the default environment for the viewer. This setting is used for\n * auto-configuring network hosts.\n *\n * Use the `config` property for manually setting hosts.\n */\n @Prop()\n public configEnv: Environment = 'platprod';\n\n @Prop({ mutable: true })\n public controller?: SceneTreeController;\n\n /**\n * Indicates whether the metadata search should use an exact match.\n */\n @Prop({ mutable: true })\n public metadataSearchExactMatch = false;\n\n /**\n * A list of the metadata keys that a scene tree search should be performed on.\n */\n @Prop({ mutable: true })\n public metadataSearchKeys: MetadataKey[] = [];\n\n /**\n * A list of part metadata keys that will be made available to each row. This\n * metadata can be used for data binding inside the scene tree's template.\n */\n @Prop()\n public metadataKeys: MetadataKey[] = [];\n\n /**\n * An event that is emitted when this <vertex-scene-tree> encounters a connection\n * error.\n */\n @Event()\n public connectionError!: EventEmitter<SceneTreeErrorDetails>;\n\n /**\n * An event that is emitted when the first row of this <vertex-scene-tree> has\n * been rendered.\n */\n @Event()\n public firstRowRendered!: EventEmitter<void>;\n\n @State()\n private rows: Row[] = [];\n\n @State()\n private totalRows = 0;\n\n @State()\n private showLoader = false;\n\n @State()\n private showEmptyResults = false;\n\n /**\n * This stores internal state that you want to preserve across live-reloads,\n * but shouldn't trigger a refresh if the data changes. Marking this with\n * @State to allow to preserve state across live-reloads.\n */\n @State()\n private stateMap: StateMap = {\n componentLoaded: false,\n };\n\n @State()\n private errorDetails: SceneTreeErrorDetails | undefined;\n\n @State()\n private attemptingRetry = false;\n\n @Element()\n private el!: HTMLElement;\n\n private lastSelectedItemId?: string;\n private firstCellRendered = false;\n\n /**\n * Schedules a render of the rows in the scene tree. Useful if any custom\n * data in your scene tree has changed, and you want to update the row's\n * contents.\n *\n * **Note:** This is an asynchronous operation. The update may happen on the\n * next frame.\n */\n @Method()\n public async invalidateRows(): Promise<void> {\n forceUpdate(this.getLayoutElement());\n }\n\n /**\n * Scrolls the tree to the given row index.\n *\n * @param index An index of the row to scroll to.\n * @param options A set of options to configure the scrolling behavior.\n */\n @Method()\n public async scrollToIndex(\n index: number,\n options: ScrollToOptions = {}\n ): Promise<void> {\n const { animate, position = 'middle' } = options;\n const i = Math.max(0, Math.min(index, this.totalRows));\n\n const top = this.getScrollToPosition(i, position);\n\n this.getLayoutElement().scrollToPosition(top, {\n behavior: animate ? 'smooth' : undefined,\n });\n }\n\n /**\n * Scrolls the tree to an item with the given ID. If the node for the item is\n * not expanded, the tree will expand each of its parent nodes.\n *\n * @param itemId An ID of an item to scroll to.\n * @param options A set of options to configure the scrolling behavior.\n * @returns A promise that resolves when the operation is finished.\n */\n @Method()\n public async scrollToItem(\n itemId: string,\n options: ScrollToOptions = {}\n ): Promise<void> {\n const rowsBeforeExpand = this.totalRows;\n const index = await this.controller?.expandParentNodes(itemId);\n\n if (index != null && rowsBeforeExpand !== this.totalRows) {\n return new Promise((resolve) => {\n const layoutEl = this.getLayoutElement();\n const handleLayoutRendered = async (): Promise<void> => {\n layoutEl.removeEventListener('layoutRendered', handleLayoutRendered);\n await this.scrollToIndex(index, options);\n resolve();\n };\n\n layoutEl.addEventListener('layoutRendered', handleLayoutRendered);\n });\n } else if (index != null) {\n await this.scrollToIndex(index, options);\n }\n }\n\n /**\n * Performs an API call to expand all nodes in the tree.\n */\n @Method()\n public async expandAll(): Promise<void> {\n await this.controller?.expandAll();\n }\n\n /**\n * Performs an API call to collapse all nodes in the tree.\n */\n @Method()\n public async collapseAll(): Promise<void> {\n await this.controller?.collapseAll();\n }\n\n /**\n * Performs an API call that will expand the node associated to the specified\n * row or row index.\n *\n * @param row A row, row index, or node to expand.\n */\n @Method()\n public async expandItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ id, node }) => {\n if (!node.expanded) {\n await this.controller?.expandNode(id);\n }\n });\n }\n\n /**\n * Performs an API call that will collapse the node associated to the\n * specified row or row index.\n *\n * @param row A row, row index, or node to collapse.\n */\n @Method()\n public async collapseItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ id, node }) => {\n if (node.expanded) {\n await this.controller?.collapseNode(id);\n }\n });\n }\n\n /**\n * Performs an API call that will either expand or collapse the node\n * associated to the given row or row index.\n *\n * @param row The row, row index, or node to collapse or expand.\n */\n @Method()\n public async toggleExpandItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ node }) => {\n if (node.expanded) {\n await this.collapseItem(node);\n } else {\n await this.expandItem(node);\n }\n });\n }\n\n /**\n * Performs an API call that will either hide or show the item associated to\n * the given row or row index.\n *\n * @param row The row, row index, or node to toggle visibility.\n */\n @Method()\n public async toggleItemVisibility(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id, node }) => {\n if (node.visible || node.partiallyVisible) {\n await hideItem(viewer, id);\n } else {\n await showItem(viewer, id);\n }\n });\n }\n\n /**\n * Performs an API call that will hide the item associated to the given row\n * or row index.\n *\n * @param row The row, row index, or node to hide.\n */\n @Method()\n public async hideItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id, node }) => {\n if (node.visible) {\n await hideItem(viewer, id);\n }\n });\n }\n\n /**\n * Performs an API call that will show the item associated to the given row\n * or row index.\n *\n * @param row The row, row index, or node to show.\n */\n @Method()\n public async showItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id, node }) => {\n if (!node.visible) {\n await showItem(viewer, id);\n }\n });\n }\n\n /**\n * Performs an API call that will select the item associated to the given row\n * or row index.\n *\n * This method supports a `recurseParent` option that allows for recursively\n * selecting the next unselected parent node. This behavior is considered\n * stateful. Each call to `selectItem` will track the ancestry of the passed\n * in `rowArg`. If calling `selectItem` with a row not belonging to the\n * ancestry of a previous selection, then this method will perform a standard\n * selection.\n *\n * @param row The row, row index or node to select.\n * @param options A set of options to configure selection behavior.\n */\n @Method()\n public async selectItem(\n row: RowArg,\n { recurseParent, ...options }: SelectItemOptions = {}\n ): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id }) => {\n const ancestors = (await this.controller?.fetchNodeAncestors(id)) || [];\n const isInPath = this.stateMap.selectionPath?.includes(id);\n\n if (recurseParent && isInPath) {\n const nextNode = ancestors.find(({ selected }) => !selected);\n if (nextNode != null) {\n await this.selectItem(nextNode, options);\n this.lastSelectedItemId = id;\n }\n } else if (options.range && this.lastSelectedItemId != null) {\n const currentRowIndex = await this.controller?.expandParentNodes(id);\n const previouslySelectedIndex =\n await this.controller?.expandParentNodes(this.lastSelectedItemId);\n\n if (previouslySelectedIndex && currentRowIndex) {\n const start = Math.min(previouslySelectedIndex, currentRowIndex);\n const end = Math.max(previouslySelectedIndex, currentRowIndex);\n await selectRangeInSceneTree(viewer, start, end, options);\n }\n } else {\n await selectItem(viewer, id, options);\n this.lastSelectedItemId = id;\n }\n\n this.stateMap.selectionPath = [\n ...ancestors.map(({ id }) => id?.hex || ''),\n id,\n ];\n });\n }\n\n /**\n * Performs an API call that will deselect the item associated to the given\n * row or row index.\n *\n * @param row The row, row index, or node to deselect.\n */\n @Method()\n public async deselectItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id, node }) => {\n if (node.selected) {\n this.lastSelectedItemId = undefined;\n await deselectItem(viewer, id);\n }\n });\n }\n\n /**\n * Returns a row at the given index. If the row data has not been loaded,\n * returns `undefined`.\n *\n * @param index The index of the row.\n * @returns A row, or `undefined` if the row hasn't been loaded.\n */\n @Method()\n public async getRowAtIndex(index: number): Promise<Row> {\n return this.rows[index];\n }\n\n /**\n * Returns the row data from the given mouse or pointer event. The event must\n * originate from a `vertex-scene-tree-table-cell` contained by this element,\n * otherwise `undefined` is returned.\n *\n * @param event A mouse or pointer event that originated from this component.\n * @returns A row, or `undefined` if the row hasn't been loaded.\n */\n @Method()\n public async getRowForEvent(event: MouseEvent | PointerEvent): Promise<Row> {\n const { clientY, target } = event;\n\n if (\n target != null &&\n this.errorDetails == null &&\n getSceneTreeContainsElement(this.el, target as HTMLElement) &&\n isSceneTreeTableCellElement(target)\n ) {\n return this.getRowAtClientY(clientY);\n } else {\n return undefined;\n }\n }\n\n /**\n * Returns the row data from the given vertical client position.\n *\n * @param clientY The vertical client position.\n * @returns A row or `undefined` if the row hasn't been loaded.\n */\n @Method()\n public getRowAtClientY(clientY: number): Promise<Row> {\n const layoutEl = this.getLayoutElement();\n const top = layoutEl.layoutOffset;\n const index = Math.floor(\n (clientY - top + layoutEl.scrollOffset) / layoutEl.rowHeight\n );\n return this.getRowAtIndex(index);\n }\n\n /**\n * Performs an async request that will filter the displayed items in the tree\n * that match the given term and options.\n *\n * @param term The filter term.\n * @param options The options to apply to the filter.\n * @returns A promise that completes when the request has completed. Note,\n * items are displayed asynchronously. So the displayed items may not reflect\n * the result of this filter when the promise completes.\n */\n @Method()\n public async filterItems(\n term: string,\n options: FilterTreeOptions = {}\n ): Promise<void> {\n return this.controller?.filter(term, options);\n }\n\n /**\n * Performs an async request that will select the filtered items in the tree\n * that match the given term.\n *\n * @param term The filter term.\n * @returns A promise that completes when the request has completed.\n */\n @Method()\n public async selectFilteredItems(\n term: string,\n options?: SceneTreeOperationOptions\n ): Promise<void> {\n if (this.viewer != null) {\n const definedMetadataKeys =\n this.metadataSearchKeys.length > 0\n ? this.metadataSearchKeys\n : this.metadataKeys;\n\n if (definedMetadataKeys.length === 0) {\n console.warn(\n \"No metadata keys were found to perform the selection. Defaulting to ['VERTEX_SCENE_ITEM_NAME']\"\n );\n }\n\n const columnsToSearch =\n definedMetadataKeys.length > 0\n ? definedMetadataKeys\n : ['VERTEX_SCENE_ITEM_NAME'];\n\n await selectFilterResults(\n this.viewer,\n term,\n columnsToSearch,\n this.metadataSearchExactMatch,\n {\n append: false,\n ...options,\n }\n );\n }\n }\n\n /**\n * Fetches the metadata keys that are available to the scene tree. Metadata\n * keys can be assigned to the scene tree using the `metadataKeys` property.\n * The scene tree will fetch this metadata and make these values available\n * for data binding.\n *\n * @returns A promise that resolves with the names of available keys.\n */\n @Method()\n public async fetchMetadataKeys(): Promise<MetadataKey[]> {\n return this.controller?.fetchMetadataKeys() ?? [];\n }\n\n /**\n * @ignore\n */\n protected disconnectedCallback(): void {\n this.stateMap.viewerDisposable?.dispose();\n this.controller?.cancel();\n }\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n if (this.controller == null) {\n const { sceneTreeHost } = this.getConfig().network;\n const client = new SceneTreeAPIClient(\n sceneTreeHost,\n this.getConfig().flags.grpcUseStreamingWebSocketTransport\n ? {\n transport: webSocketSubscriptionTransportFactory,\n }\n : undefined\n );\n this.controller = new SceneTreeController(client, 100);\n this.controller?.setMetadataKeys(this.metadataKeys);\n }\n\n this.stateMap.onStateChangeDisposable = this.controller.onStateChange.on(\n (state) => this.handleControllerStateChange(state)\n );\n\n this.connectToViewer();\n }\n\n /**\n * @ignore\n */\n protected async componentDidLoad(): Promise<void> {\n this.ensureLayoutDefined();\n this.updateLayoutElement();\n\n const layoutEl = this.getLayoutElement();\n const resizeObserver = new ResizeObserver(() => {\n this.invalidateRows();\n });\n resizeObserver.observe(layoutEl);\n this.stateMap.resizeObserver = resizeObserver;\n\n this.stateMap.componentLoaded = true;\n\n this.controller?.setMetadataKeys(this.metadataKeys);\n\n if (this.viewer == null) {\n this.errorDetails = new SceneTreeErrorDetails(\n 'MISSING_VIEWER',\n SceneTreeErrorCode.MISSING_VIEWER\n );\n }\n }\n\n public componentWillRender(): void {\n // The controller can load data prior to the first render\n // ensure that this renders any time the state changes.\n this.updateLayoutElement();\n }\n\n /**\n * @ignore\n */\n protected render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n <div class=\"header\">\n <slot name=\"header\">\n <vertex-scene-tree-toolbar class=\"search-toolbar\">\n <vertex-scene-tree-search controller={this.controller} />\n </vertex-scene-tree-toolbar>\n </slot>\n </div>\n\n {this.errorDetails != null && this.renderError(this.errorDetails)}\n\n {this.errorDetails == null && (\n <div class=\"rows-scroll\">\n {this.showLoader && (\n <slot name=\"loading\">\n <vertex-viewer-spinner class=\"loading\" size=\"md\" />\n </slot>\n )}\n <slot />\n {this.showEmptyResults && (\n <slot name=\"empty-results\">\n <div class=\"empty-results\">No Results Found.</div>\n </slot>\n )}\n </div>\n )}\n\n <div class=\"footer\">\n <slot name=\"footer\" />\n </div>\n </Host>\n );\n }\n\n private renderError(details: SceneTreeErrorDetails): h.JSX.IntrinsicElements {\n if (details.code !== SceneTreeErrorCode.SCENE_TREE_DISABLED) {\n return (\n <SceneTreeError details={details}>\n <button\n class=\"button button-secondary\"\n onClick={() => this.retryConnectToViewer()}\n disabled={this.attemptingRetry}\n >\n Retry\n </button>\n </SceneTreeError>\n );\n } else {\n return <SceneTreeError details={details} />;\n }\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(\n newViewer: HTMLVertexViewerElement | undefined,\n oldViewer: HTMLVertexViewerElement | undefined\n ): void {\n // StencilJS will invoke this callback even before the component has been\n // loaded. According to their docs, this shouldn't happen. Return if the\n // component hasn't been loaded.\n // See https://stenciljs.com/docs/reactive-data#watch-decorator\n if (!this.stateMap.componentLoaded) {\n return;\n }\n\n this.connectToViewer();\n }\n\n /**\n * @ignore\n */\n @Watch('controller')\n protected handleControllerChanged(newController: SceneTreeController): void {\n // StencilJS will invoke this callback even before the component has been\n // loaded. According to their docs, this shouldn't happen. Return if the\n // component hasn't been loaded.\n // See https://stenciljs.com/docs/reactive-data#watch-decorator\n if (!this.stateMap.componentLoaded) {\n return;\n }\n\n this.stateMap.onStateChangeDisposable?.dispose();\n\n this.stateMap.onStateChangeDisposable = newController.onStateChange.on(\n (state) => this.handleControllerStateChange(state)\n );\n\n newController.setMetadataKeys(this.metadataKeys);\n }\n\n /**\n * @ignore\n */\n @Watch('metadataKeys')\n protected handleMetadataKeysChanged(): void {\n this.controller?.setMetadataKeys(this.metadataKeys);\n }\n\n private retryConnectToViewer(): void {\n this.attemptingRetry = true;\n this.errorDetails = undefined;\n this.connectToViewer();\n }\n\n private connectToViewer(): void {\n this.stateMap.viewerDisposable?.dispose();\n\n if (this.viewer == null && this.viewerSelector != null) {\n this.viewer = document.querySelector(this.viewerSelector) as\n | HTMLVertexViewerElement\n | undefined;\n }\n\n if (this.viewer != null) {\n this.stateMap.viewerDisposable = this.controller?.connectToViewer(\n this.viewer\n );\n } else {\n this.attemptingRetry = false;\n }\n }\n\n private scheduleClearUnusedData(): void {\n if (this.stateMap.idleCallbackId != null) {\n window.cancelIdleCallback(this.stateMap.idleCallbackId);\n }\n\n this.stateMap.idleCallbackId = window.requestIdleCallback((foo) => {\n const remaining = foo.timeRemaining?.();\n\n if (remaining == null || remaining >= MIN_CLEAR_UNUSED_DATA_MS) {\n const layoutEl = this.getLayoutElement();\n const startIndex = layoutEl.viewportStartIndex;\n const endIndex = layoutEl.viewportEndIndex;\n const [start, end] =\n this.controller?.getPageIndexesForRange(startIndex, endIndex) || [];\n\n if (start != null && end != null) {\n this.controller?.invalidatePagesOutsideRange(start, end, 50);\n }\n } else {\n this.scheduleClearUnusedData();\n }\n });\n }\n\n private handleControllerStateChange(state: SceneTreeState): void {\n this.showLoader = !!state.shouldShowLoading;\n this.showEmptyResults = !!state.shouldShowEmptyResults;\n this.rows = state.rows;\n this.totalRows = state.totalRows;\n\n if (state.connection.type === 'failure') {\n this.errorDetails = state.connection.details;\n this.connectionError.emit(state.connection.details);\n } else if (state.connection.type === 'disconnected') {\n this.errorDetails = new SceneTreeErrorDetails(\n 'DISCONNECTED',\n SceneTreeErrorCode.DISCONNECTED\n );\n } else {\n this.errorDetails = undefined;\n }\n\n if (\n state.connection.type === 'connected' ||\n state.connection.type === 'failure'\n ) {\n this.attemptingRetry = false;\n }\n }\n\n private async performRowOperation(\n rowOrIndex: number | Row | Node.AsObject,\n op: OperationHandler\n ): Promise<void> {\n const row =\n typeof rowOrIndex === 'number' ? this.rows[rowOrIndex] : rowOrIndex;\n\n if (row == null) {\n throw new Error(`Cannot perform scene tree operation. Row not found.`);\n }\n\n const node = isLoadedRow(row) ? row.node : row;\n\n if (node.id == null) {\n throw new Error(`Cannot perform scene tree operation. ID is undefined.`);\n }\n\n if (this.viewer == null) {\n throw new Error(\n `Cannot perform scene tree operation. Cannot get reference to viewer.`\n );\n }\n\n await op({ viewer: this.viewer, id: node.id.hex, node });\n }\n\n @Listen('search')\n protected async handleSearch(event: CustomEvent<string>): Promise<void> {\n const columnsToSearch =\n this.metadataSearchKeys.length > 0\n ? this.metadataSearchKeys\n : this.metadataKeys;\n\n try {\n await this.filterItems(event.detail, {\n columns: columnsToSearch,\n exactMatch: this.metadataSearchExactMatch,\n });\n } catch (e) {\n console.error('Failed to filter tree with exception: ', e);\n }\n }\n\n @Listen('cellLoaded')\n protected async handleCellLoaded(): Promise<void> {\n if (!this.firstCellRendered && this.rows.length > 0) {\n this.firstCellRendered = true;\n this.firstRowRendered.emit();\n }\n }\n\n private getScrollToPosition(\n index: number,\n position: ScrollToOptions['position']\n ): number {\n const layoutEl = this.getLayoutElement();\n const constrainedIndex = Math.max(0, Math.min(index, this.totalRows - 1));\n const viewportHeight = layoutEl.layoutHeight ?? 0;\n const rowHeight = layoutEl.rowHeight;\n\n if (position === 'start') {\n return constrainedIndex * rowHeight;\n } else if (position === 'middle') {\n const rowCenterY = constrainedIndex * rowHeight + rowHeight / 2;\n return rowCenterY - viewportHeight / 2;\n } else {\n const rowBottomY = constrainedIndex * rowHeight + rowHeight;\n return rowBottomY - viewportHeight;\n }\n }\n\n private getConfig(): Config {\n return parseConfig(this.configEnv, this.config);\n }\n\n private ensureLayoutDefined(): void {\n let layout = this.el.querySelector('vertex-scene-tree-table-layout');\n if (layout == null) {\n layout = document.createElement('vertex-scene-tree-table-layout');\n layout.innerHTML = `\n <vertex-scene-tree-table-column>\n <template>\n <vertex-scene-tree-table-cell prop:value=\"{{row.node.name}}\" expand-toggle visibility-toggle></vertex-scene-tree-table-cell>\n </template>\n </vertex-scene-tree-table-column>\n `;\n\n this.el.appendChild(layout);\n }\n this.stateMap.layoutEl = layout;\n }\n\n private updateLayoutElement(): void {\n const layout = this.stateMap.layoutEl;\n if (layout != null) {\n layout.rows = this.rows;\n layout.tree = this.el as HTMLVertexSceneTreeElement;\n layout.totalRows = this.totalRows;\n layout.controller = this.controller;\n layout.rowData = this.rowData;\n } else if (!this.stateMap.componentLoaded && this.totalRows > 0) {\n console.debug(\n 'Scene tree has rows, but the component has not yet rendered'\n );\n }\n }\n\n private getLayoutElement(): HTMLVertexSceneTreeTableLayoutElement {\n if (this.stateMap.layoutEl != null) {\n return this.stateMap.layoutEl;\n } else {\n throw new Error('Layout element is undefined');\n }\n }\n}\n"]}