{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;AAAA,8BAAgC;AAEhC,iDAA2C;AAC3C,uCAA+D;AAC/D,+CAAyC;AACzC,mCASiB;AACjB,yDAA6D;AAC7D,mCAA6E;AAC7E,6DAAoE;AACpE,wEAA4E;AA2E5E,IAAM,iBAAiB,GAAG,UAAC,MAAW,IAAK,OAAA,MAAM,CAAC,EAAE,EAAT,CAAS,CAAC;AAErD;IAqBE,4BAAY,OAAsB,EAAE,qBAAiE;QAArG,iBA0EC;QAxEG,IAAA,WAAW,GACT,OAAO,YADE,EAAE,mBAAmB,GAC9B,OAAO,oBADuB,EAAE,SAAS,GACzC,OAAO,UADkC,EAAE,YAAY,GACvD,OAAO,aADgD,EAAE,SAAS,GAClE,OAAO,UAD2D,CAC1D;QAEZ,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,eAAe,IAAI,wBAAc,CAAC;QAChE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAE3B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;QAC/C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,IAAI,iBAAiB,CAAC,qBAAqB,CAAC,EAAE;YAC5C,IAAI,CAAC,QAAQ,GAAqB,qBAAqB,CAAC;SACzD;aAAM;YAEL,IAAI,CAAC,QAAQ,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;SACnE;QAED,IAAM,iBAAiB,GAAG,CAAC,UAAC,MAAiB,EAAE,OAAwB;YAGpE,MAAc,CAAC,UAAU,GAAG,OAAO,CAAC;YAErC,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;gBAC/B,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,qBAAU,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,gCAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;gBAIvG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAEnB,OAAO;aACR;YAED,IAAM,iBAAiB,GAAsB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACjE,iBAAiB,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtD,iBAAiB,CAAC,QAAQ,GAAG,KAAK,CAAC;YACnC,iBAAiB,CAAC,MAAM,GAAG,MAAM,CAAC;YAClC,iBAAiB,CAAC,OAAO,GAAG,OAAO,CAAC;YACpC,iBAAiB,CAAC,UAAU,GAAG,EAAE,CAAC;YAElC,IAAM,uBAAuB,GAAG,UAAC,KAAU;gBACzC,IAAI,KAAK,EAAE;oBACT,KAAI,CAAC,SAAS,CACZ,iBAAiB,EACjB,EAAE,EACF,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,EAClD,uBAAY,CAAC,oBAAoB,CAClC,CAAC;oBAEF,UAAU,CAAC;wBAET,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACvC,CAAC,EAAE,EAAE,CAAC,CAAC;iBACR;gBACD,KAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;gBAEhC,IAAI,KAAI,CAAC,YAAY,EAAE;oBACrB,KAAI,CAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;iBAC9C;YACH,CAAC,CAAC;YAEF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;YAC5C,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;YAC5C,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,KAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;QAClD,IAAI,CAAC,YAAY,GAAG;YAClB,KAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;YAC9D,KAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC,CAAC;IACJ,CAAC;IA9Ea,yBAAM,GAApB,UAAqB,OAAsB,EAAE,qBAAiE;QAC5G,OAAO,IAAI,kBAAkB,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;IAChE,CAAC;IA8ED,sBAAW,sCAAM;aAAjB;YACE,OAAO,IAAI,CAAC,QAAQ,CAAC;QACvB,CAAC;;;OAAA;IAEM,kCAAK,GAAZ;QACE,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAEO,yCAAY,GAApB,UAAqB,OAAsB;QACjC,IAAA,OAAO,GAAmC,OAAO,QAA1C,EAAE,SAAS,GAAwB,OAAO,UAA/B,EAAE,MAAM,GAAgB,OAAO,OAAvB,EAAE,SAAS,GAAK,OAAO,UAAZ,CAAa;QAE1D,IAAI,CAAC,OAAO,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;SAC7E;QAED,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAEO,wCAAW,GAAnB,UAAoB,iBAAoC,EAAE,IAAY;QACpE,IAAI,iBAAiB,CAAC,UAAU,IAAI,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;YACtE,IAAI,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE;gBAC7C,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;aAC7C;YAED,OAAO,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAE1C,IAAI,IAAI,CAAC,mBAAmB,EAAE;gBAC5B,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;aAC1D;SACF;IACH,CAAC;IAEO,oCAAO,GAAf,UAAgB,iBAAoC;QAApD,iBAIC;QAHC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,UAAC,IAAI;YACrD,KAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,sCAAS,GAAjB,UAAkB,iBAAoC;QAAtD,iBAkNC;QAjNC,OAAO,UAAC,OAAY;YAClB,IAAI,aAA+B,CAAC;YACpC,IAAI;gBACF,aAAa,GAAG,kDAA0B,CAAC,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;aACpF;YAAC,OAAO,CAAC,EAAE;gBACV,KAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,uBAAY,CAAC,oBAAoB,CAAC,CAAC;gBACnG,OAAO;aACR;YAED,IAAM,IAAI,GAAG,aAAa,CAAC,EAAE,CAAC;YAC9B,QAAQ,aAAa,CAAC,IAAI,EAAE;gBAC1B,KAAK,uBAAY,CAAC,mBAAmB;oBACnC,IAAI,KAAI,CAAC,SAAS,EAAE;wBAClB,iBAAiB,CAAC,WAAW,GAAG,IAAI,OAAO,CAAC,UAAC,OAAO,EAAE,MAAM;4BAC1D,IAAI;gCAGF,OAAO,CAAC,KAAI,CAAC,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;6BAC7F;4BAAC,OAAO,CAAC,EAAE;gCACV,MAAM,CAAC,CAAC,CAAC,CAAC;6BACX;wBACH,CAAC,CAAC,CAAC;qBACJ;oBAED,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,UAAC,MAAM;wBACxC,IAAI,MAAM,KAAK,KAAK,EAAE;4BACpB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;yBAC3C;wBAED,KAAI,CAAC,WAAW,CACd,iBAAiB,EACjB,SAAS,EACT,uBAAY,CAAC,kBAAkB,EAC/B,SAAS,CACV,CAAC;wBAEF,IAAI,KAAI,CAAC,SAAS,EAAE;4BAClB,KAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;4BAEtC,IAAM,gBAAc,GAAG,WAAW,CAAC;gCACjC,IAAI,iBAAiB,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE;oCAC1D,KAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;iCACvC;qCAAM;oCACL,aAAa,CAAC,gBAAc,CAAC,CAAC;iCAC/B;4BACH,CAAC,EAAE,KAAI,CAAC,SAAS,CAAC,CAAC;yBACpB;oBACH,CAAC,CAAC,CAAC,KAAK,CAAC,UAAC,KAAY;wBACpB,KAAI,CAAC,SAAS,CACZ,iBAAiB,EACjB,IAAI,EACJ,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAC1B,uBAAY,CAAC,oBAAoB,CAClC,CAAC;wBAOF,UAAU,CAAC;4BACT,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBACvC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACT,CAAC,CAAC,CAAC;oBACH,MAAM;gBAER,KAAK,uBAAY,CAAC,wBAAwB;oBACxC,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjC,MAAM;gBAER,KAAK,uBAAY,CAAC,SAAS;oBACzB,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,UAAC,UAAU;wBAE5C,IAAI,iBAAiB,CAAC,UAAU,IAAI,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;4BACtE,KAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;yBAC3C;wBAED,IAAM,UAAU,GAAoB;4BAClC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK;4BAClC,SAAS,EAAE,aAAa,CAAC,OAAO,CAAC,SAAS;4BAC1C,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC,aAAa;4BAClD,OAAO,EAAE,mBAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE;4BAChH,cAAc,EAAO,SAAS;4BAC9B,WAAW,EAAO,SAAS;4BAC3B,QAAQ,EAAO,SAAS;4BACxB,MAAM,EAAE,KAAI,CAAC,MAAM;yBACpB,CAAC;wBACF,IAAI,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;wBAGjD,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,oCAAmB,EAAE,CAAC;wBAE3D,IAAI,KAAI,CAAC,WAAW,EAAE;4BACpB,IAAI,kBAAkB,GAAQ,aAAa,CAAC;4BAC5C,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,KAAI,CAAC,WAAW,CAAC,kBAAkB,EAAE,UAAU,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;yBAC9G;wBAED,OAAO,cAAc,CAAC,IAAI,CAAC,UAAC,MAAM;4BAChC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;gCAC9B,IAAM,KAAK,GAAG,4EAA4E,CAAC;gCAC3F,KAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gCAE5D,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;6BACxB;4BAED,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;gCAClB,IAAM,KAAK,GAAG,wFAAwF;oCACpG,iGAAiG,CAAC;gCACpG,KAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gCAE5D,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;6BACxB;4BAED,IAAM,QAAQ,GAAG,OAAO,UAAU,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,eAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;4BACnG,IAAI,gBAA2E,CAAC;4BAChF,IAAM,gBAAgB,GAAG,kBAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAI,CAAC,cAAc,CAAC,CAAC;4BAEhF,IAAK,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAG;gCACjC,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;6BAClE;iCAAM;gCACL,IAAI,QAAQ,GAAwC,KAAI,CAAC,OAAO,CAAC;gCACjE,IAAI,KAAI,CAAC,SAAS,IAAI,2CAAwB,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC,EAAE;oCAC9E,QAAQ,GAAG,KAAI,CAAC,SAAS,CAAC;iCAC3B;gCACD,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EACvD,QAAQ,EACR,KAAI,CAAC,SAAS,EACd,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;6BAC1B;4BAED,OAAO,gBAAgB,CAAC,IAAI,CAAC,UAAC,eAAe,IAAK,OAAA,CAAC;gCACjD,iBAAiB,EAAE,yBAAe,CAAC,eAAe,CAAC,CAAC,CAAC;oCACnD,eAAe,CAAC,CAAC,CAAC,6BAAmB,CAAC,CAAE,eAAe,CAAE,CAAC;gCAC5D,MAAM,QAAA;6BACP,CAAC,EAJgD,CAIhD,CAAC,CAAC;wBACN,CAAC,CAAC,CAAC,IAAI,CAAC,UAAC,EAA6B;gCAA3B,iBAAiB,uBAAA,EAAE,MAAM,YAAA;4BAClC,sBAAY,CACV,iBAAwB,EACxB,UAAC,KAAsB;gCACrB,IAAI,MAAM,GAAG,KAAK,CAAC;gCAEnB,IAAI,MAAM,CAAC,cAAc,EAAE;oCACzB,IAAI;wCACF,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;qCAC/C;oCAAC,OAAO,GAAG,EAAE;wCACZ,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,GAAG,CAAC,CAAC;qCACzD;iCACF;gCAED,KAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,IAAI,EAAE,uBAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;4BAC3E,CAAC,CAAC;iCACD,IAAI,CAAC;gCACJ,KAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,IAAI,EAAE,uBAAY,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;4BAC7E,CAAC,CAAC;iCACD,KAAK,CAAC,UAAC,CAAQ;gCACd,IAAI,KAAK,GAAG,CAAC,CAAC;gCAEd,IAAI,MAAM,CAAC,WAAW,EAAE;oCACtB,IAAI;wCACF,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;qCACvC;oCAAC,OAAO,GAAG,EAAE;wCACZ,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC;qCACvD;iCACF;gCAGD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;oCACnC,KAAK,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;iCACtD;gCAED,KAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;4BACjD,CAAC,CAAC,CAAC;4BAEL,OAAO,iBAAiB,CAAC;wBAC3B,CAAC,CAAC,CAAC,IAAI,CAAC,UAAC,YAA+B;4BACtC,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC;wBACpD,CAAC,CAAC,CAAC,IAAI,CAAC;4BAGN,KAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,IAAI,EAAE,uBAAY,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC;wBAC1F,CAAC,CAAC,CAAC,KAAK,CAAC,UAAC,CAAM;4BACd,IAAI,CAAC,CAAC,MAAM,EAAE;gCACZ,KAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,IAAI,EAAE,uBAAY,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;6BACxF;iCAAM;gCACL,KAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;6BACjE;4BAGD,KAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;4BAC1C,OAAO;wBACT,CAAC,CAAC,CAAC;oBACL,CAAC,CAAC,CAAC,KAAK,CAAC,UAAC,KAAK;wBAEb,KAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;wBACpE,KAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;oBAC5C,CAAC,CAAC,CAAC;oBACH,MAAM;gBAER,KAAK,uBAAY,CAAC,QAAQ;oBAExB,KAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;oBAC1C,MAAM;gBAER;oBACE,KAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;aACjF;QACH,CAAC,CAAC;IACJ,CAAC;IAEO,0CAAa,GAArB,UAAsB,iBAAoC;QACxD,IAAI,iBAAiB,CAAC,QAAQ,EAAE;YAC9B,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,SAAS,EAAE,uBAAY,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;SACpF;aAAM;YACL,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,SAAS,EAAE,uBAAY,CAAC,yBAAyB,EAAE,SAAS,CAAC,CAAC;SACnG;IACH,CAAC;IAEO,wCAAW,GAAnB,UAAoB,iBAAoC,EAAE,IAAY,EAAE,IAAY,EAAE,OAAY;QAChG,IAAM,aAAa,GAAG,kDAA0B,CAAC,iBAAiB,EAAE;YAClE,IAAI,MAAA;YACJ,EAAE,EAAE,IAAI;YACR,OAAO,SAAA;SACR,CAAC,CAAC;QAEH,IAAI,aAAa,IAAI,iBAAiB,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE;YAC3E,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;SAC9D;IACH,CAAC;IAEO,sCAAS,GAAjB,UAAkB,iBAAoC,EAAE,IAAY,EAAE,YAAiB,EACrE,wBAAiC;QACjD,IAAM,iCAAiC,GAAG,wBAAwB,IAAI,uBAAY,CAAC,SAAS,CAAC;QAC7F,IAAI;YACA,uBAAY,CAAC,oBAAoB;YACjC,uBAAY,CAAC,SAAS;SACvB,CAAC,OAAO,CAAC,iCAAiC,CAAC,KAAK,CAAC,CAAC,EAAE;YACrD,MAAM,IAAI,KAAK,CAAC,sEAAsE;gBACpF,oCAAoC,CAAC,CAAC;SACzC;QAED,IAAI,CAAC,WAAW,CACd,iBAAiB,EACjB,IAAI,EACJ,iCAAiC,EACjC,YAAY,CACb,CAAC;IACJ,CAAC;IACH,yBAAC;AAAD,CAAC,AApYD,IAoYC;AApYY,gDAAkB","sourcesContent":["import * as WebSocket from 'ws';\n\nimport MessageTypes from './message-types';\nimport { GRAPHQL_WS, GRAPHQL_SUBSCRIPTIONS } from './protocol';\nimport isObject from './utils/is-object';\nimport {\n parse,\n ExecutionResult,\n GraphQLSchema,\n DocumentNode,\n validate,\n ValidationContext,\n specifiedRules,\n GraphQLFieldResolver,\n} from 'graphql';\nimport { createEmptyIterable } from './utils/empty-iterable';\nimport { createAsyncIterator, forAwaitEach, isAsyncIterable } from 'iterall';\nimport { isASubscriptionOperation } from './utils/is-subscriptions';\nimport { parseLegacyProtocolMessage } from './legacy/parse-legacy-protocol';\nimport { IncomingMessage } from 'http';\n\nexport type ExecutionIterator = AsyncIterator;\n\nexport interface ExecutionParams {\n query: string | DocumentNode;\n variables: { [key: string]: any };\n operationName: string;\n context: TContext;\n formatResponse?: Function;\n formatError?: Function;\n callback?: Function;\n schema?: GraphQLSchema;\n}\n\nexport type ConnectionContext = {\n initPromise?: Promise,\n isLegacy: boolean,\n socket: WebSocket,\n request: IncomingMessage,\n operations: {\n [opId: string]: ExecutionIterator,\n },\n};\n\nexport interface OperationMessagePayload {\n [key: string]: any; // this will support for example any options sent in init like the auth token\n query?: string;\n variables?: { [key: string]: any };\n operationName?: string;\n}\n\nexport interface OperationMessage {\n payload?: OperationMessagePayload;\n id?: string;\n type: string;\n}\n\nexport type ExecuteFunction = (schema: GraphQLSchema,\n document: DocumentNode,\n rootValue?: any,\n contextValue?: any,\n variableValues?: { [key: string]: any },\n operationName?: string,\n fieldResolver?: GraphQLFieldResolver) =>\n ExecutionResult |\n Promise |\n AsyncIterator;\n\nexport type SubscribeFunction = (schema: GraphQLSchema,\n document: DocumentNode,\n rootValue?: any,\n contextValue?: any,\n variableValues?: { [key: string]: any },\n operationName?: string,\n fieldResolver?: GraphQLFieldResolver,\n subscribeFieldResolver?: GraphQLFieldResolver) =>\n AsyncIterator |\n Promise | ExecutionResult>;\n\nexport interface ServerOptions {\n rootValue?: any;\n schema?: GraphQLSchema;\n execute?: ExecuteFunction;\n subscribe?: SubscribeFunction;\n validationRules?:\n Array<(context: ValidationContext) => any> | ReadonlyArray;\n onOperation?: Function;\n onOperationComplete?: Function;\n onConnect?: Function;\n onDisconnect?: Function;\n keepAlive?: number;\n}\n\nconst isWebSocketServer = (socket: any) => socket.on;\n\nexport class SubscriptionServer {\n private onOperation: Function;\n private onOperationComplete: Function;\n private onConnect: Function;\n private onDisconnect: Function;\n\n private wsServer: WebSocket.Server;\n private execute: ExecuteFunction;\n private subscribe: SubscribeFunction;\n private schema: GraphQLSchema;\n private rootValue: any;\n private keepAlive: number;\n private closeHandler: () => void;\n private specifiedRules:\n Array<(context: ValidationContext) => any> |\n ReadonlyArray;\n\n public static create(options: ServerOptions, socketOptionsOrServer: WebSocket.ServerOptions | WebSocket.Server) {\n return new SubscriptionServer(options, socketOptionsOrServer);\n }\n\n constructor(options: ServerOptions, socketOptionsOrServer: WebSocket.ServerOptions | WebSocket.Server) {\n const {\n onOperation, onOperationComplete, onConnect, onDisconnect, keepAlive,\n } = options;\n\n this.specifiedRules = options.validationRules || specifiedRules;\n this.loadExecutor(options);\n\n this.onOperation = onOperation;\n this.onOperationComplete = onOperationComplete;\n this.onConnect = onConnect;\n this.onDisconnect = onDisconnect;\n this.keepAlive = keepAlive;\n\n if (isWebSocketServer(socketOptionsOrServer)) {\n this.wsServer = socketOptionsOrServer;\n } else {\n // Init and connect WebSocket server to http\n this.wsServer = new WebSocket.Server(socketOptionsOrServer || {});\n }\n\n const connectionHandler = ((socket: WebSocket, request: IncomingMessage) => {\n // Add `upgradeReq` to the socket object to support old API, without creating a memory leak\n // See: https://github.com/websockets/ws/pull/1099\n (socket as any).upgradeReq = request;\n // NOTE: the old GRAPHQL_SUBSCRIPTIONS protocol support should be removed in the future\n if (socket.protocol === undefined ||\n (socket.protocol.indexOf(GRAPHQL_WS) === -1 && socket.protocol.indexOf(GRAPHQL_SUBSCRIPTIONS) === -1)) {\n // Close the connection with an error code, ws v2 ensures that the\n // connection is cleaned up even when the closing handshake fails.\n // 1002: protocol error\n socket.close(1002);\n\n return;\n }\n\n const connectionContext: ConnectionContext = Object.create(null);\n connectionContext.initPromise = Promise.resolve(true);\n connectionContext.isLegacy = false;\n connectionContext.socket = socket;\n connectionContext.request = request;\n connectionContext.operations = {};\n\n const connectionClosedHandler = (error: any) => {\n if (error) {\n this.sendError(\n connectionContext,\n '',\n { message: error.message ? error.message : error },\n MessageTypes.GQL_CONNECTION_ERROR,\n );\n\n setTimeout(() => {\n // 1011 is an unexpected condition prevented the request from being fulfilled\n connectionContext.socket.close(1011);\n }, 10);\n }\n this.onClose(connectionContext);\n\n if (this.onDisconnect) {\n this.onDisconnect(socket, connectionContext);\n }\n };\n\n socket.on('error', connectionClosedHandler);\n socket.on('close', connectionClosedHandler);\n socket.on('message', this.onMessage(connectionContext));\n });\n\n this.wsServer.on('connection', connectionHandler);\n this.closeHandler = () => {\n this.wsServer.removeListener('connection', connectionHandler);\n this.wsServer.close();\n };\n }\n\n public get server(): WebSocket.Server {\n return this.wsServer;\n }\n\n public close(): void {\n this.closeHandler();\n }\n\n private loadExecutor(options: ServerOptions) {\n const { execute, subscribe, schema, rootValue } = options;\n\n if (!execute) {\n throw new Error('Must provide `execute` for websocket server constructor.');\n }\n\n this.schema = schema;\n this.rootValue = rootValue;\n this.execute = execute;\n this.subscribe = subscribe;\n }\n\n private unsubscribe(connectionContext: ConnectionContext, opId: string) {\n if (connectionContext.operations && connectionContext.operations[opId]) {\n if (connectionContext.operations[opId].return) {\n connectionContext.operations[opId].return();\n }\n\n delete connectionContext.operations[opId];\n\n if (this.onOperationComplete) {\n this.onOperationComplete(connectionContext.socket, opId);\n }\n }\n }\n\n private onClose(connectionContext: ConnectionContext) {\n Object.keys(connectionContext.operations).forEach((opId) => {\n this.unsubscribe(connectionContext, opId);\n });\n }\n\n private onMessage(connectionContext: ConnectionContext) {\n return (message: any) => {\n let parsedMessage: OperationMessage;\n try {\n parsedMessage = parseLegacyProtocolMessage(connectionContext, JSON.parse(message));\n } catch (e) {\n this.sendError(connectionContext, null, { message: e.message }, MessageTypes.GQL_CONNECTION_ERROR);\n return;\n }\n\n const opId = parsedMessage.id;\n switch (parsedMessage.type) {\n case MessageTypes.GQL_CONNECTION_INIT:\n if (this.onConnect) {\n connectionContext.initPromise = new Promise((resolve, reject) => {\n try {\n // TODO - this should become a function call with just 2 arguments in the future\n // when we release the breaking change api: parsedMessage.payload and connectionContext\n resolve(this.onConnect(parsedMessage.payload, connectionContext.socket, connectionContext));\n } catch (e) {\n reject(e);\n }\n });\n }\n\n connectionContext.initPromise.then((result) => {\n if (result === false) {\n throw new Error('Prohibited connection!');\n }\n\n this.sendMessage(\n connectionContext,\n undefined,\n MessageTypes.GQL_CONNECTION_ACK,\n undefined,\n );\n\n if (this.keepAlive) {\n this.sendKeepAlive(connectionContext);\n // Regular keep alive messages if keepAlive is set\n const keepAliveTimer = setInterval(() => {\n if (connectionContext.socket.readyState === WebSocket.OPEN) {\n this.sendKeepAlive(connectionContext);\n } else {\n clearInterval(keepAliveTimer);\n }\n }, this.keepAlive);\n }\n }).catch((error: Error) => {\n this.sendError(\n connectionContext,\n opId,\n { message: error.message },\n MessageTypes.GQL_CONNECTION_ERROR,\n );\n\n // Close the connection with an error code, ws v2 ensures that the\n // connection is cleaned up even when the closing handshake fails.\n // 1011: an unexpected condition prevented the operation from being fulfilled\n // We are using setTimeout because we want the message to be flushed before\n // disconnecting the client\n setTimeout(() => {\n connectionContext.socket.close(1011);\n }, 10);\n });\n break;\n\n case MessageTypes.GQL_CONNECTION_TERMINATE:\n connectionContext.socket.close();\n break;\n\n case MessageTypes.GQL_START:\n connectionContext.initPromise.then((initResult) => {\n // if we already have a subscription with this id, unsubscribe from it first\n if (connectionContext.operations && connectionContext.operations[opId]) {\n this.unsubscribe(connectionContext, opId);\n }\n\n const baseParams: ExecutionParams = {\n query: parsedMessage.payload.query,\n variables: parsedMessage.payload.variables,\n operationName: parsedMessage.payload.operationName,\n context: isObject(initResult) ? Object.assign(Object.create(Object.getPrototypeOf(initResult)), initResult) : {},\n formatResponse: undefined,\n formatError: undefined,\n callback: undefined,\n schema: this.schema,\n };\n let promisedParams = Promise.resolve(baseParams);\n\n // set an initial mock subscription to only registering opId\n connectionContext.operations[opId] = createEmptyIterable();\n\n if (this.onOperation) {\n let messageForCallback: any = parsedMessage;\n promisedParams = Promise.resolve(this.onOperation(messageForCallback, baseParams, connectionContext.socket));\n }\n\n return promisedParams.then((params) => {\n if (typeof params !== 'object') {\n const error = `Invalid params returned from onOperation! return values must be an object!`;\n this.sendError(connectionContext, opId, { message: error });\n\n throw new Error(error);\n }\n\n if (!params.schema) {\n const error = 'Missing schema information. The GraphQL schema should be provided either statically in' +\n ' the `SubscriptionServer` constructor or as a property on the object returned from onOperation!';\n this.sendError(connectionContext, opId, { message: error });\n\n throw new Error(error);\n }\n\n const document = typeof baseParams.query !== 'string' ? baseParams.query : parse(baseParams.query);\n let executionPromise: Promise | ExecutionResult>;\n const validationErrors = validate(params.schema, document, this.specifiedRules);\n\n if ( validationErrors.length > 0 ) {\n executionPromise = Promise.resolve({ errors: validationErrors });\n } else {\n let executor: SubscribeFunction | ExecuteFunction = this.execute;\n if (this.subscribe && isASubscriptionOperation(document, params.operationName)) {\n executor = this.subscribe;\n }\n executionPromise = Promise.resolve(executor(params.schema,\n document,\n this.rootValue,\n params.context,\n params.variables,\n params.operationName));\n }\n\n return executionPromise.then((executionResult) => ({\n executionIterable: isAsyncIterable(executionResult) ?\n executionResult : createAsyncIterator([ executionResult ]),\n params,\n }));\n }).then(({ executionIterable, params }) => {\n forAwaitEach(\n executionIterable as any,\n (value: ExecutionResult) => {\n let result = value;\n\n if (params.formatResponse) {\n try {\n result = params.formatResponse(value, params);\n } catch (err) {\n console.error('Error in formatResponse function:', err);\n }\n }\n\n this.sendMessage(connectionContext, opId, MessageTypes.GQL_DATA, result);\n })\n .then(() => {\n this.sendMessage(connectionContext, opId, MessageTypes.GQL_COMPLETE, null);\n })\n .catch((e: Error) => {\n let error = e;\n\n if (params.formatError) {\n try {\n error = params.formatError(e, params);\n } catch (err) {\n console.error('Error in formatError function: ', err);\n }\n }\n\n // plain Error object cannot be JSON stringified.\n if (Object.keys(error).length === 0) {\n error = { name: error.name, message: error.message };\n }\n\n this.sendError(connectionContext, opId, error);\n });\n\n return executionIterable;\n }).then((subscription: ExecutionIterator) => {\n connectionContext.operations[opId] = subscription;\n }).then(() => {\n // NOTE: This is a temporary code to support the legacy protocol.\n // As soon as the old protocol has been removed, this coode should also be removed.\n this.sendMessage(connectionContext, opId, MessageTypes.SUBSCRIPTION_SUCCESS, undefined);\n }).catch((e: any) => {\n if (e.errors) {\n this.sendMessage(connectionContext, opId, MessageTypes.GQL_DATA, { errors: e.errors });\n } else {\n this.sendError(connectionContext, opId, { message: e.message });\n }\n\n // Remove the operation on the server side as it will be removed also in the client\n this.unsubscribe(connectionContext, opId);\n return;\n });\n }).catch((error) => {\n // Handle initPromise rejected\n this.sendError(connectionContext, opId, { message: error.message });\n this.unsubscribe(connectionContext, opId);\n });\n break;\n\n case MessageTypes.GQL_STOP:\n // Find subscription id. Call unsubscribe.\n this.unsubscribe(connectionContext, opId);\n break;\n\n default:\n this.sendError(connectionContext, opId, { message: 'Invalid message type!' });\n }\n };\n }\n\n private sendKeepAlive(connectionContext: ConnectionContext): void {\n if (connectionContext.isLegacy) {\n this.sendMessage(connectionContext, undefined, MessageTypes.KEEP_ALIVE, undefined);\n } else {\n this.sendMessage(connectionContext, undefined, MessageTypes.GQL_CONNECTION_KEEP_ALIVE, undefined);\n }\n }\n\n private sendMessage(connectionContext: ConnectionContext, opId: string, type: string, payload: any): void {\n const parsedMessage = parseLegacyProtocolMessage(connectionContext, {\n type,\n id: opId,\n payload,\n });\n\n if (parsedMessage && connectionContext.socket.readyState === WebSocket.OPEN) {\n connectionContext.socket.send(JSON.stringify(parsedMessage));\n }\n }\n\n private sendError(connectionContext: ConnectionContext, opId: string, errorPayload: any,\n overrideDefaultErrorType?: string): void {\n const sanitizedOverrideDefaultErrorType = overrideDefaultErrorType || MessageTypes.GQL_ERROR;\n if ([\n MessageTypes.GQL_CONNECTION_ERROR,\n MessageTypes.GQL_ERROR,\n ].indexOf(sanitizedOverrideDefaultErrorType) === -1) {\n throw new Error('overrideDefaultErrorType should be one of the allowed error messages' +\n ' GQL_CONNECTION_ERROR or GQL_ERROR');\n }\n\n this.sendMessage(\n connectionContext,\n opId,\n sanitizedOverrideDefaultErrorType,\n errorPayload,\n );\n }\n}\n\n"]}