@riseonly/sdk 0.1.1-next.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -9
- package/dist/index.cjs +314 -79
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +56 -34
- package/dist/index.d.ts +56 -34
- package/dist/index.js +314 -81
- package/dist/index.js.map +1 -1
- package/package.json +6 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/errors.ts","../src/client.ts","../src/webhook.ts","../src/bot.ts","../src/utils.ts"],"names":["createServer","createHmac","timingSafeEqual"],"mappings":";;;;;;;;AAAO,IAAM,gBAAA,GAAmB;AAEzB,IAAM,oBAAA,GAAuB;AAE7B,IAAM,qBAAA,GAAwB;AAE9B,IAAM,kBAAA,GAAqB;AAE3B,IAAM,iBAAA,GAAoB;AAAA,EAC/B,OAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF;AAIO,IAAM,YAAA,GAAe;AAAA,EAC1B,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF;AAIO,IAAM,YAAA,GAAe;AAAA,EAC1B,QAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF;AAIO,IAAM,cAAA,GAAiB;AAAA,EAC5B,SAAA;AAAA,EACA,mBAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF;;;AChEO,IAAM,aAAA,GAAN,MAAM,cAAA,SAAsB,KAAA,CAAM;AAAA,EAC9B,IAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EAET,WAAA,CAAY,OAAA,EAAiB,IAAA,EAAc,UAAA,EAAqB,QAAA,EAAoB;AAClF,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AAAA,EAEA,OAAO,gBAAgB,IAAA,EAIL;AAChB,IAAA,OAAO,IAAI,cAAA;AAAA,MACT,IAAA,CAAK,WAAA;AAAA,MACL,IAAA,CAAK,UAAA;AAAA,MACL,KAAK,UAAA,EAAY,WAAA;AAAA,MACjB;AAAA,KACF;AAAA,EACF;AACF;AAEO,IAAM,oBAAA,GAAN,cAAmC,aAAA,CAAc;AAAA,EACpC,KAAA;AAAA,EAElB,WAAA,CAAY,OAAA,EAAiB,KAAA,EAAiB,IAAA,GAAO,CAAA,EAAG;AACtD,IAAA,KAAA,CAAM,SAAS,IAAI,CAAA;AACnB,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AACF;AAEO,IAAM,oBAAA,GAAN,cAAmC,oBAAA,CAAqB;AAAA,EAC7D,WAAA,CAAY,UAAU,mBAAA,EAAqB;AACzC,IAAA,KAAA,CAAM,OAAA,EAAS,QAAW,GAAG,CAAA;AAC7B,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AAAA,EACd;AACF;;;ACNO,IAAM,YAAN,MAAgB;AAAA,EACZ,KAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,qBAAA;AAAA,EAET,WAAA,CAAY,KAAA,EAAe,OAAA,GAAyB,EAAC,EAAG;AACtD,IAAA,IAAI,CAAC,KAAA,EAAO,IAAA,EAAK,EAAG;AAClB,MAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,IACzC;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,MAAM,IAAA,EAAK;AACxB,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,OAAA,IAAW,gBAAA,EAAkB,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtE,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,KAAA,IAAS,UAAA,CAAW,KAAA,CAAM,KAAK,UAAU,CAAA;AAClE,IAAA,IAAA,CAAK,gBAAA,GAAmB,QAAQ,gBAAA,IAAoB,GAAA;AACpD,IAAA,IAAA,CAAK,qBAAA,GAAwB,QAAQ,qBAAA,IAAyB,KAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,MAAA,EAA6C;AACjE,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAO,GAAG,oBAAoB,CAAA,aAAA,CAAA;AAClD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,MACzC,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS,EAAE,MAAA,EAAQ,kBAAA,EAAmB;AAAA,MACtC;AAAA,KACD,CAAA;AACD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,wCAAA,EAA2C,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IAC7F;AACA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACJ,MAAA,EACA,OAAA,GAAmC,EAAC,EACpC,OAAA,GAA0B,EAAC,EACf;AACZ,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAA,CAAW,MAAA,EAAQ,SAAS,OAAO,CAAA;AAC/D,IAAA,OAAO,QAAA,CAAS,MAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QACJ,MAAA,EACA,OAAA,GAAmC,EAAC,EACpC,OAAA,GAA0B,EAAC,EACwB;AACnD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,cAAA,CAAe,MAAM,CAAA;AACtC,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,aAAA,EAAe,CAAA,IAAA,EAAO,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,MAChC,MAAA,EAAQ,kBAAA;AAAA,MACR,cAAA,EAAgB;AAAA,KAClB;AACA,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,OAAA,CAAQ,kBAAkB,IAAI,OAAA,CAAQ,SAAA;AAAA,IACxC;AAEA,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,UAAU,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,gBAAgB,CAAA;AAC1E,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,GACnB,WAAA,CAAY,GAAA,CAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,UAAA,CAAW,MAAM,CAAC,CAAA,GACnD,UAAA,CAAW,MAAA;AAEf,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,QACnC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAAA,QAC5B;AAAA,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACzD,QAAA,MAAM,IAAI,oBAAA,EAAqB;AAAA,MACjC;AACA,MAAA,MAAM,IAAI,oBAAA,CAAqB,wBAAA,EAA0B,KAAK,CAAA;AAAA,IAChE,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,OAAO,CAAA;AAAA,IACtB;AAEA,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACZ,MAAA,MAAM,aAAA,CAAc,gBAAgB,IAAI,CAAA;AAAA,IAC1C;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAM,OAAA,EAAyC;AACnD,IAAA,OAAO,IAAA,CAAK,UAAA,CAAiB,OAAA,EAAS,IAAI,OAAO,CAAA;AAAA,EACnD;AAAA,EAEA,MAAM,YAAY,OAAA,EAA+C;AAC/D,IAAA,MAAM,EAAE,SAAA,EAAW,GAAG,OAAA,EAAQ,GAAI,OAAA;AAClC,IAAA,OAAO,KAAK,UAAA,CAAoB,aAAA,EAAe,OAAA,EAAS,EAAE,WAAW,CAAA;AAAA,EACvE;AAAA,EAEA,MAAM,SAAA,CAAU,KAAA,EAAmB,OAAA,EAA6C;AAC9E,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,WAAA,EAAa,OAAA,EAAS,OAAO,OAAO,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAM,SAAA,CAAU,KAAA,EAAmB,OAAA,EAA6C;AAC9E,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,WAAA,EAAa,OAAA,EAAS,OAAO,OAAO,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAM,YAAA,CAAa,QAAA,EAAsB,OAAA,EAA6C;AACpF,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,cAAA,EAAgB,UAAA,EAAY,UAAU,OAAO,CAAA;AAAA,EACrE;AAAA,EAEA,MAAM,SAAA,CAAU,KAAA,EAAmB,OAAA,EAA6C;AAC9E,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,WAAA,EAAa,OAAA,EAAS,OAAO,OAAO,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAM,SAAA,CAAU,KAAA,EAAmB,OAAA,EAA6C;AAC9E,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,WAAA,EAAa,OAAA,EAAS,OAAO,OAAO,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAM,aAAA,CAAc,SAAA,EAAuB,OAAA,EAA6C;AACtF,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,eAAA,EAAiB,WAAA,EAAa,WAAW,OAAO,CAAA;AAAA,EACxE;AAAA,EAEA,MAAM,gBAAgB,OAAA,EAAmD;AACvE,IAAA,MAAM,EAAE,SAAA,EAAW,GAAG,OAAA,EAAQ,GAAI,OAAA;AAClC,IAAA,OAAO,KAAK,UAAA,CAAoB,iBAAA,EAAmB,OAAA,EAAS,EAAE,WAAW,CAAA;AAAA,EAC3E;AAAA,EAEA,MAAM,cAAc,OAAA,EAAiD;AACnE,IAAA,MAAM,EAAE,SAAA,EAAW,GAAG,OAAA,EAAQ,GAAI,OAAA;AAClC,IAAA,OAAO,KAAK,UAAA,CAAoB,eAAA,EAAiB,OAAA,EAAS,EAAE,WAAW,CAAA;AAAA,EACzE;AAAA,EAEA,MAAM,eAAe,OAAA,EAAkD;AACrE,IAAA,MAAM,EAAE,SAAA,EAAW,GAAG,OAAA,EAAQ,GAAI,OAAA;AAClC,IAAA,OAAO,KAAK,UAAA,CAAoB,gBAAA,EAAkB,OAAA,EAAS,EAAE,WAAW,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAM,UAAA,CAAW,OAAA,GAA6B,EAAC,EAAsB;AACnE,IAAA,MAAM,EAAE,SAAA,EAAW,GAAG,OAAA,EAAQ,GAAI,OAAA;AAClC,IAAA,OAAO,KAAK,UAAA,CAAqB,YAAA,EAAc,OAAA,EAAS,EAAE,WAAW,CAAA;AAAA,EACvE;AAAA,EAEA,MAAM,WAAW,OAAA,EAAuD;AACtE,IAAA,MAAM,EAAE,SAAA,EAAW,GAAG,OAAA,EAAQ,GAAI,OAAA;AAClC,IAAA,OAAO,KAAK,UAAA,CAA6B,YAAA,EAAc,OAAA,EAAS,EAAE,WAAW,CAAA;AAAA,EAC/E;AAAA,EAEA,MAAM,aAAA,CAAc,OAAA,GAAgC,EAAC,EAAqB;AACxE,IAAA,MAAM,EAAE,SAAA,EAAW,GAAG,OAAA,EAAQ,GAAI,OAAA;AAClC,IAAA,OAAO,KAAK,UAAA,CAAoB,eAAA,EAAiB,OAAA,EAAS,EAAE,WAAW,CAAA;AAAA,EACzE;AAAA,EAEA,MAAM,eAAe,OAAA,EAAgD;AACnE,IAAA,OAAO,IAAA,CAAK,UAAA,CAAwB,gBAAA,EAAkB,IAAI,OAAO,CAAA;AAAA,EACnE;AAAA,EAEA,MAAM,cAAc,OAAA,EAAiD;AACnE,IAAA,MAAM,EAAE,SAAA,EAAW,GAAG,OAAA,EAAQ,GAAI,OAAA;AAClC,IAAA,OAAO,KAAK,UAAA,CAAoB,eAAA,EAAiB,OAAA,EAAS,EAAE,WAAW,CAAA;AAAA,EACzE;AAAA,EAEA,MAAM,aAAA,CAAc,OAAA,GAAgC,EAAC,EAA0B;AAC7E,IAAA,MAAM,EAAE,SAAA,EAAW,GAAG,OAAA,EAAQ,GAAI,OAAA;AAClC,IAAA,OAAO,KAAK,UAAA,CAAyB,eAAA,EAAiB,OAAA,EAAS,EAAE,WAAW,CAAA;AAAA,EAC9E;AAAA,EAEA,MAAM,gBAAA,CAAiB,OAAA,GAAmC,EAAC,EAAqB;AAC9E,IAAA,MAAM,EAAE,SAAA,EAAW,GAAG,OAAA,EAAQ,GAAI,OAAA;AAClC,IAAA,OAAO,KAAK,UAAA,CAAoB,kBAAA,EAAoB,OAAA,EAAS,EAAE,WAAW,CAAA;AAAA,EAC5E;AAAA,EAEA,MAAM,oBAAoB,OAAA,EAAuD;AAC/E,IAAA,MAAM,EAAE,SAAA,EAAW,GAAG,OAAA,EAAQ,GAAI,OAAA;AAClC,IAAA,OAAO,KAAK,UAAA,CAAoB,qBAAA,EAAuB,OAAA,EAAS,EAAE,WAAW,CAAA;AAAA,EAC/E;AAAA,EAEA,MAAM,QAAQ,OAAA,EAAwC;AACpD,IAAA,MAAM,EAAE,SAAA,EAAW,GAAG,OAAA,EAAQ,GAAI,OAAA;AAClC,IAAA,OAAO,KAAK,UAAA,CAAiB,SAAA,EAAW,OAAA,EAAS,EAAE,WAAW,CAAA;AAAA,EAChE;AAAA,EAEA,MAAc,SAAA,CACZ,MAAA,EACA,KAAA,EACA,OACA,OAAA,EACkB;AAClB,IAAA,MAAM,EAAE,SAAA,EAAW,GAAG,OAAA,EAAQ,GAAI,OAAA;AAClC,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,MACV,MAAA;AAAA,MACA;AAAA,QACE,GAAG,OAAA;AAAA,QACH,CAAC,KAAK,GAAG,IAAA,CAAK,eAAe,KAAK;AAAA,OACpC;AAAA,MACA,EAAE,SAAA;AAAU,KACd;AAAA,EACF;AAAA,EAEQ,eAAe,KAAA,EAAoD;AACzE,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,OAAO,KAAA,CAAM,OAAA;AAAA,IACf;AACA,IAAA,IAAI,MAAM,GAAA,EAAK;AACb,MAAA,OAAO,KAAA,CAAM,GAAA;AAAA,IACf;AACA,IAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,EACjD;AAAA,EAEQ,eAAe,MAAA,EAAwB;AAC7C,IAAA,IAAI,KAAK,qBAAA,EAAuB;AAC9B,MAAA,OAAO,GAAG,IAAA,CAAK,OAAO,OAAO,IAAA,CAAK,KAAK,IAAI,MAAM,CAAA,CAAA;AAAA,IACnD;AACA,IAAA,OAAO,GAAG,IAAA,CAAK,OAAO,CAAA,EAAG,oBAAoB,IAAI,MAAM,CAAA,CAAA;AAAA,EACzD;AACF;;;ACvPO,SAAS,mBAAmB,IAAA,EAAuB;AACxD,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,IAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,EAClD;AACA,EAAA,MAAM,MAAA,GAAS,IAAA;AACf,EAAA,IAAI,OAAO,MAAA,CAAO,SAAA,KAAc,QAAA,EAAU;AACxC,IAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,EACrD;AACA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,mBAAA,CACd,SACA,WAAA,EACS;AACT,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,cAAc,OAAA,CAAQ,qBAAqB,KAAK,OAAA,CAAQ,qBAAA,CAAsB,aAAa,CAAA;AACjG,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAW,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,GAAI,WAAA,CAAY,CAAC,CAAA,GAAI,WAAA;AAC/D,EAAA,OAAO,QAAA,KAAa,WAAA;AACtB;AAKO,SAAS,qBAAqB,OAAA,EAIlC;AACD,EAAA,OAAO,OAAO,OAAA,KAAyE;AACrF,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,mBAAA,CAAoB,OAAA,CAAQ,OAAA,EAAS,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC9D,QAAA,OAAO,EAAE,QAAQ,GAAA,EAAK,IAAA,EAAM,EAAE,EAAA,EAAI,KAAA,EAAO,WAAA,EAAa,wBAAA,EAAyB,EAAE;AAAA,MACnF;AACA,MAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,OAAA,CAAQ,IAAI,CAAA;AAC9C,MAAA,MAAM,OAAA,CAAQ,SAAS,MAAM,CAAA;AAC7B,MAAA,OAAO,EAAE,MAAA,EAAQ,GAAA,EAAK,MAAM,EAAE,EAAA,EAAI,MAAK,EAAE;AAAA,IAC3C,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,OAAA,CAAQ,UAAU,KAAK,CAAA;AAC7B,MAAA,OAAO,EAAE,QAAQ,GAAA,EAAK,IAAA,EAAM,EAAE,EAAA,EAAI,KAAA,EAAO,WAAA,EAAa,yBAAA,EAA0B,EAAE;AAAA,IACpF;AAAA,EACF,CAAA;AACF;;;AC3CO,IAAM,WAAA,GAAN,cAA0B,SAAA,CAAU;AAAA,EACxB,SAAA,GAA8C;AAAA,IAC7D,SAAS,EAAC;AAAA,IACV,gBAAgB,EAAC;AAAA,IACjB,gBAAgB,EAAC;AAAA,IACjB,QAAQ,EAAC;AAAA,IACT,eAAe,EAAC;AAAA,IAChB,OAAO;AAAC,GACV;AAAA,EAEQ,cAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,YAAA;AAAA,EACA,MAAA,GAAS,CAAA;AAAA,EACT,aAAA;AAAA,EAER,WAAA,CAAY,KAAA,EAAe,OAAA,GAAsB,EAAC,EAAG;AACnD,IAAA,KAAA,CAAM,OAAO,OAAO,CAAA;AACpB,IAAA,IAAA,CAAK,cAAA,GAAiB,uBAAA,CAAwB,OAAA,CAAQ,OAAO,CAAA;AAC7D,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAA,CAAQ,OAAA,KAAY,KAAA,GAAQ,SAAY,OAAA,CAAQ,OAAA;AACtE,IAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,MAAA,IAAA,CAAK,cAAA,CAAe,kBAAkB,OAAA,CAAQ,eAAA;AAAA,IAChD;AACA,IAAA,IAAI,IAAA,CAAK,eAAe,SAAA,EAAW;AACjC,MAAA,KAAK,KAAK,YAAA,EAAa;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,EAAA,CAAuB,OAAU,OAAA,EAA+B;AAC9D,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,CAAE,IAAA,CAAK,OAAO,CAAA;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAwB,OAAU,OAAA,EAA+B;AAC/D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AACpC,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,MAAA,CAAO,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,IACxB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,CAAyB,OAAU,OAAA,EAA+B;AAChE,IAAA,MAAM,OAAA,IAAW,IAAI,IAAA,KAAqC;AACxD,MAAA,IAAA,CAAK,GAAA,CAAI,OAAO,OAAyB,CAAA;AACzC,MAAA,OACE,OAAA,CACA,GAAG,IAAI,CAAA;AAAA,IACX,CAAA,CAAA;AACA,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO,OAAO,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CAAa,OAAA,GAA0B,EAAC,EAAkB;AAC9D,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,cAAA,GAAiB,EAAE,GAAG,IAAA,CAAK,gBAAgB,GAAG,OAAA,EAAS,WAAW,IAAA,EAAK;AAC5E,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,eAAA,EAAgB;AACxC,IAAA,KAAK,KAAK,QAAA,EAAS;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAA6B;AACjC,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CAAa,OAAA,GAAgC,EAAC,EAAkB;AACpE,IAAA,MAAM,SAAS,EAAE,GAAG,IAAA,CAAK,cAAA,EAAgB,GAAG,OAAA,EAAQ;AACpD,IAAA,IAAA,CAAK,cAAA,GAAiB,MAAA;AACtB,IAAA,MAAM,IAAA,GAAO,OAAO,IAAA,IAAQ,GAAA;AAC5B,IAAA,MAAM,IAAA,GAAO,OAAO,IAAA,IAAQ,SAAA;AAC5B,IAAA,MAAM,IAAA,GAAO,OAAO,IAAA,IAAQ,GAAA;AAE5B,IAAA,MAAM,UAAU,oBAAA,CAAqB;AAAA,MACnC,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,QAAA,EAAU,CAAC,MAAA,KAAW,IAAA,CAAK,cAAc,MAAM,CAAA;AAAA,MAC/C,SAAS,CAAC,KAAA,KAAU,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK;AAAA,KAC7C,CAAA;AAED,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,aAAA,GAAgBA,iBAAA,CAAa,OAAO,GAAA,EAAK,GAAA,KAAQ;AACpD,MAAA,IAAI,GAAA,CAAI,MAAA,KAAW,MAAA,IAAU,GAAA,CAAI,GAAA,EAAK,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,KAAM,IAAA,EAAM;AAC5D,QAAA,OAAA,CAAQ,GAAA,EAAK,GAAA,EAAK,EAAE,EAAA,EAAI,OAAO,CAAA;AAC/B,QAAA;AAAA,MACF;AACA,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,GAAG,CAAA;AACnC,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ;AAAA,UAC3B,OAAA,EAAS,gBAAA,CAAiB,GAAA,CAAI,OAAO,CAAA;AAAA,UACrC;AAAA,SACD,CAAA;AACD,QAAA,OAAA,CAAQ,GAAA,EAAK,MAAA,CAAO,MAAA,EAAQ,MAAA,CAAO,IAAI,CAAA;AAAA,MACzC,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,KAAK,CAAA;AAC9B,QAAA,OAAA,CAAQ,GAAA,EAAK,GAAA,EAAK,EAAE,EAAA,EAAI,OAAO,CAAA;AAAA,MACjC;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,IAAA,CAAK,aAAA,CAAe,IAAA,CAAK,OAAA,EAAS,MAAM,CAAA;AACxC,MAAA,IAAA,CAAK,cAAe,MAAA,CAAO,IAAA,EAAM,IAAA,EAAM,MAAM,SAAS,CAAA;AAAA,IACxD,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAA6B;AACjC,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,SAAS,IAAA,CAAK,aAAA;AACpB,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AACrB,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,MAAA,CAAO,KAAA,CAAM,CAAC,KAAA,KAAW,KAAA,GAAQ,OAAO,KAAK,CAAA,GAAI,SAAU,CAAA;AAAA,IAC7D,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,MAAA,EAA+B;AACjD,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,MAAM,CAAA;AAChC,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,MAAA,CAAO,SAAS,MAAM,CAAA;AAAA,IACnD;AACA,IAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,EAAkB,MAAA,CAAO,gBAAgB,MAAM,CAAA;AAAA,IACjE;AACA,IAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,EAAkB,MAAA,CAAO,gBAAgB,MAAM,CAAA;AAAA,IACjE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CAAM,OAAA,EAAkB,IAAA,EAAc,KAAA,GAAiC,EAAC,EAAqB;AACjG,IAAA,OAAO,KAAK,WAAA,CAAY;AAAA,MACtB,OAAA,EAAS,QAAQ,IAAA,CAAK,EAAA;AAAA,MACtB,IAAA;AAAA,MACA,qBAAqB,OAAA,CAAQ,UAAA;AAAA,MAC7B,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CAAO,KAAA,EAAsB,IAAA,EAAe,YAAY,KAAA,EAAyB;AACrF,IAAA,OAAO,KAAK,mBAAA,CAAoB;AAAA,MAC9B,mBAAmB,KAAA,CAAM,EAAA;AAAA,MACzB,IAAA;AAAA,MACA,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,QAAA,GAA0B;AACtC,IAAA,OAAO,KAAK,OAAA,EAAS;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW;AAAA,UACpC,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,OAAA,EAAS,KAAK,cAAA,CAAe,OAAA;AAAA,UAC7B,KAAA,EAAO,KAAK,cAAA,CAAe,KAAA;AAAA,UAC3B,eAAA,EAAiB,KAAK,cAAA,CAAe,eAAA;AAAA,UACrC,MAAA,EAAQ,KAAK,YAAA,EAAc;AAAA,SAC5B,CAAA;AACD,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,UAAA,IAAI,MAAA,CAAO,SAAA,GAAY,IAAA,CAAK,MAAA,EAAQ;AAClC,YAAA;AAAA,UACF;AACA,UAAA,IAAA,CAAK,SAAS,IAAA,CAAK,GAAA,CAAI,KAAK,MAAA,EAAQ,MAAA,CAAO,YAAY,CAAC,CAAA;AACxD,UAAA,MAAM,IAAA,CAAK,cAAc,MAAM,CAAA;AAC/B,UAAA,SAAA,IAAa,CAAA;AAAA,QACf;AACA,QAAA,IAAI,cAAc,CAAA,EAAG;AACnB,UAAA,MAAM,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,QAAA,IAAY,GAAI,CAAA;AAAA,QAClD;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,YAAA,CAAa,KAAK,CAAA,EAAG;AACxC,UAAA;AAAA,QACF;AACA,QAAA,MAAM,IAAA,CAAK,IAAA,CAAK,eAAA,EAAiB,KAAK,CAAA;AACtC,QAAA,IAAI,KAAA,YAAiB,aAAA,IAAiB,KAAA,CAAM,UAAA,EAAY;AACtD,UAAA,MAAM,KAAA,CAAM,KAAA,CAAM,UAAA,GAAa,GAAI,CAAA;AAAA,QACrC,CAAA,MAAO;AACL,UAAA,MAAM,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,QAAA,IAAY,GAAI,CAAA;AAAA,QAClD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,IAAA,CACZ,KAAA,EAAA,GACG,IAAA,EACY;AACf,IAAA,KAAA,MAAW,YAAY,CAAC,GAAG,KAAK,SAAA,CAAU,KAAK,CAAC,CAAA,EAAG;AACjD,MAAA,IAAI;AACF,QAAA,MAAO,QAAA,CAA4E,GAAG,IAAI,CAAA;AAAA,MAC5F,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,KAAK,CAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,wBACP,KAAA,EACyC;AACzC,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,EAAE,UAAU,GAAA,EAAM,OAAA,EAAS,IAAI,KAAA,EAAO,GAAA,EAAK,WAAW,KAAA,EAAM;AAAA,EACrE;AACA,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,OAAO,EAAE,UAAU,GAAA,EAAM,OAAA,EAAS,IAAI,KAAA,EAAO,GAAA,EAAK,WAAW,IAAA,EAAK;AAAA,EACpE;AACA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,GAAA;AAAA,IACV,OAAA,EAAS,EAAA;AAAA,IACT,KAAA,EAAO,GAAA;AAAA,IACP,SAAA,EAAW,IAAA;AAAA,IACX,GAAG;AAAA,GACL;AACF;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAEA,SAAS,aAAa,KAAA,EAAyB;AAC7C,EAAA,OAAO,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA;AAClD;AAEA,SAAS,iBACP,OAAA,EAC+C;AAC/C,EAAA,MAAM,aAA4D,EAAC;AACnE,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,IAAA,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA;AAAA,EACpB;AACA,EAAA,OAAO,UAAA;AACT;AAEA,eAAe,aAAa,GAAA,EAAwC;AAClE,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,WAAA,MAAiB,SAAS,GAAA,EAAK;AAC7B,IAAA,MAAA,CAAO,IAAA,CAAK,OAAO,QAAA,CAAS,KAAK,IAAI,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,EACjE;AACA,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,OAAO,IAAA,CAAK,MAAM,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA;AAC1D;AAEA,SAAS,OAAA,CAAQ,GAAA,EAAqB,MAAA,EAAgB,IAAA,EAAsB;AAC1E,EAAA,GAAA,CAAI,UAAA,GAAa,MAAA;AACjB,EAAA,GAAA,CAAI,SAAA,CAAU,gBAAgB,kBAAkB,CAAA;AAChD,EAAA,GAAA,CAAI,IAAI,IAAA,KAAS,MAAA,GAAY,SAAY,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAC/D;ACtSA,IAAM,iBAAA,GAAoB,gBAAA;AAKnB,SAAS,cAAc,OAAA,EAAiC;AAC7D,EAAA,MAAM,MAAA,GAAS,OAAO,WAAA,CAAY,IAAI,gBAAgB,OAAO,CAAA,CAAE,SAAS,CAAA;AACxE,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,yBAAyB,MAAA,EAAgC;AACvE,EAAA,OAAO,OAAO,OAAA,CAAQ,MAAM,CAAA,CACzB,MAAA,CAAO,CAAC,CAAC,GAAG,CAAA,KAAM,GAAA,KAAQ,MAAM,CAAA,CAChC,IAAA,CAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAA,KAAM,IAAA,CAAK,cAAc,KAAK,CAAC,CAAA,CACnD,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM,GAAG,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA,CACvC,KAAK,IAAI,CAAA;AACd;AAKO,SAAS,qBAAqB,QAAA,EAA0B;AAC7D,EAAA,OAAOC,oBAAW,QAAA,EAAU,YAAY,EAAE,MAAA,CAAO,QAAQ,EAAE,MAAA,EAAO;AACpE;AAKO,SAAS,YAAA,CAAa,UAAkB,eAAA,EAAiC;AAC9E,EAAA,MAAM,MAAA,GAAS,qBAAqB,QAAQ,CAAA;AAC5C,EAAA,OAAOA,mBAAA,CAAW,UAAU,MAAM,CAAA,CAAE,OAAO,eAAe,CAAA,CAAE,OAAO,KAAK,CAAA;AAC1E;AAKO,SAAS,cAAA,CAAe,UAAkB,OAAA,EAAiC;AAChF,EAAA,MAAM,MAAA,GAAS,cAAc,OAAO,CAAA;AACpC,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAAA,EAC7C;AACA,EAAA,IAAI,CAAC,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA,EAAG;AACjC,IAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,EAClD;AAEA,EAAA,MAAM,eAAA,GAAkB,yBAAyB,MAAM,CAAA;AACvD,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,EAAU,eAAe,CAAA;AAEvD,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,QAAA,EAAU,KAAK,CAAA;AACzC,EAAA,IAAI,IAAA,CAAK,WAAW,KAAA,CAAM,MAAA,IAAU,CAACC,wBAAA,CAAgB,IAAA,EAAM,KAAK,CAAA,EAAG;AACjE,IAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,EAClD;AAEA,EAAA,MAAM,YAAY,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA,GAAI,MAAA;AAClE,EAAA,IAAI,SAAA,KAAc,UAAa,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,IAAK,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,EAAG;AACnF,IAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,EACzC;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,6BAA6B,SAAA,EAAkC;AAC7E,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,SAAS,CAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAI,GAAA,CAAI,IAAA;AAChE,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAI,eAAA,CAAgB,IAAI,CAAA,CAAE,IAAI,kBAAkB,CAAA;AACzD;AAKO,SAAS,eAAA,GAA0B;AACxC,EAAA,OAAO,OAAO,UAAA,EAAW;AAC3B","file":"index.cjs","sourcesContent":["export const DEFAULT_API_BASE = 'https://api.riseonly.net';\n\nexport const CANONICAL_API_PREFIX = '/api/bot/v1';\n\nexport const WEBHOOK_SECRET_HEADER = 'x-riseonly-bot-api-secret-token';\n\nexport const IDEMPOTENCY_HEADER = 'x-request-id';\n\nexport const SUPPORTED_METHODS = [\n 'getMe',\n 'sendMessage',\n 'sendPhoto',\n 'sendVideo',\n 'sendDocument',\n 'sendAudio',\n 'sendVoice',\n 'sendAnimation',\n 'editMessageText',\n 'deleteMessage',\n 'sendChatAction',\n 'getUpdates',\n 'setWebhook',\n 'deleteWebhook',\n 'getWebhookInfo',\n 'setMyCommands',\n 'getMyCommands',\n 'deleteMyCommands',\n 'answerCallbackQuery',\n 'getChat',\n] as const;\n\nexport type BotApiMethod = (typeof SUPPORTED_METHODS)[number];\n\nexport const UPDATE_TYPES = [\n 'message',\n 'edited_message',\n 'callback_query',\n 'chat_member',\n 'my_chat_member',\n] as const;\n\nexport type UpdateType = (typeof UPDATE_TYPES)[number];\n\nexport const CHAT_ACTIONS = [\n 'typing',\n 'upload_photo',\n 'record_video',\n 'upload_video',\n 'record_voice',\n 'upload_voice',\n 'upload_document',\n 'choose_sticker',\n 'find_location',\n 'record_video_note',\n 'upload_video_note',\n] as const;\n\nexport type ChatAction = (typeof CHAT_ACTIONS)[number];\n\nexport const COMMAND_SCOPES = [\n 'default',\n 'all_private_chats',\n 'all_group_chats',\n 'all_chat_administrators',\n] as const;\n\nexport type CommandScope = (typeof COMMAND_SCOPES)[number] | `chat:${string}` | `chat_administrators:${string}`;\n","export class RiseonlyError extends Error {\n readonly code: number;\n readonly retryAfter?: number;\n readonly response?: unknown;\n\n constructor(message: string, code: number, retryAfter?: number, response?: unknown) {\n super(message);\n this.name = 'RiseonlyError';\n this.code = code;\n this.retryAfter = retryAfter;\n this.response = response;\n }\n\n static fromApiResponse(body: {\n error_code: number;\n description: string;\n parameters?: { retry_after?: number };\n }): RiseonlyError {\n return new RiseonlyError(\n body.description,\n body.error_code,\n body.parameters?.retry_after,\n body,\n );\n }\n}\n\nexport class RiseonlyNetworkError extends RiseonlyError {\n override readonly cause?: unknown;\n\n constructor(message: string, cause?: unknown, code = 0) {\n super(message, code);\n this.name = 'RiseonlyNetworkError';\n this.cause = cause;\n }\n}\n\nexport class RiseonlyTimeoutError extends RiseonlyNetworkError {\n constructor(message = 'Request timed out') {\n super(message, undefined, 408);\n this.name = 'RiseonlyTimeoutError';\n }\n}\n","import {\n CANONICAL_API_PREFIX,\n DEFAULT_API_BASE,\n IDEMPOTENCY_HEADER,\n} from './constants.js';\nimport { RiseonlyError, RiseonlyNetworkError, RiseonlyTimeoutError } from './errors.js';\nimport type {\n AnswerCallbackQueryOptions,\n ApiEnvelope,\n BotCommand,\n Capabilities,\n Chat,\n ClientOptions,\n DeleteMessageOptions,\n DeleteMyCommandsOptions,\n DeleteWebhookOptions,\n EditMessageTextOptions,\n GetChatOptions,\n GetMyCommandsOptions,\n GetUpdatesOptions,\n MediaInput,\n Message,\n RequestOptions,\n SendChatActionOptions,\n SendMediaOptions,\n SendMessageOptions,\n SetMyCommandsOptions,\n SetWebhookOptions,\n SetWebhookResult,\n Update,\n User,\n WebhookInfo,\n} from './types/index.js';\n\ntype QueryValue = string | number | boolean | undefined | null;\n\nexport class ApiClient {\n readonly token: string;\n readonly baseUrl: string;\n readonly fetchImpl: typeof fetch;\n readonly requestTimeoutMs: number;\n readonly useCompatibleEndpoint: boolean;\n\n constructor(token: string, options: ClientOptions = {}) {\n if (!token?.trim()) {\n throw new Error('bot token is required');\n }\n this.token = token.trim();\n this.baseUrl = (options.baseUrl ?? DEFAULT_API_BASE).replace(/\\/$/, '');\n this.fetchImpl = options.fetch ?? globalThis.fetch.bind(globalThis);\n this.requestTimeoutMs = options.requestTimeoutMs ?? 60_000;\n this.useCompatibleEndpoint = options.useCompatibleEndpoint ?? false;\n }\n\n /**\n * Returns the platform capabilities document.\n */\n async getCapabilities(signal?: AbortSignal): Promise<Capabilities> {\n const url = `${this.baseUrl}${CANONICAL_API_PREFIX}/capabilities`;\n const response = await this.fetchImpl(url, {\n method: 'GET',\n headers: { Accept: 'application/json' },\n signal,\n });\n if (!response.ok) {\n throw new RiseonlyNetworkError(`capabilities request failed with status ${response.status}`);\n }\n return response.json() as Promise<Capabilities>;\n }\n\n /**\n * Calls a Bot API method and returns the typed result.\n */\n async callMethod<T>(\n method: string,\n payload: Record<string, unknown> = {},\n options: RequestOptions = {},\n ): Promise<T> {\n const envelope = await this.request<T>(method, payload, options);\n return envelope.result;\n }\n\n /**\n * Performs a raw Bot API request and returns the full envelope.\n */\n async request<T>(\n method: string,\n payload: Record<string, unknown> = {},\n options: RequestOptions = {},\n ): Promise<ApiEnvelope<T> & { ok: true; result: T }> {\n const url = this.buildMethodUrl(method);\n const headers: Record<string, string> = {\n Authorization: `Bot ${this.token}`,\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n };\n if (options.requestId) {\n headers[IDEMPOTENCY_HEADER] = options.requestId;\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.requestTimeoutMs);\n const signal = options.signal\n ? AbortSignal.any([options.signal, controller.signal])\n : controller.signal;\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n signal,\n });\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw new RiseonlyTimeoutError();\n }\n throw new RiseonlyNetworkError('network request failed', error);\n } finally {\n clearTimeout(timeout);\n }\n\n const body = (await response.json()) as ApiEnvelope<T>;\n if (!body.ok) {\n throw RiseonlyError.fromApiResponse(body);\n }\n return body;\n }\n\n async getMe(options?: RequestOptions): Promise<User> {\n return this.callMethod<User>('getMe', {}, options);\n }\n\n async sendMessage(options: SendMessageOptions): Promise<Message> {\n const { requestId, ...payload } = options;\n return this.callMethod<Message>('sendMessage', payload, { requestId });\n }\n\n async sendPhoto(photo: MediaInput, options: SendMediaOptions): Promise<Message> {\n return this.sendMedia('sendPhoto', 'photo', photo, options);\n }\n\n async sendVideo(video: MediaInput, options: SendMediaOptions): Promise<Message> {\n return this.sendMedia('sendVideo', 'video', video, options);\n }\n\n async sendDocument(document: MediaInput, options: SendMediaOptions): Promise<Message> {\n return this.sendMedia('sendDocument', 'document', document, options);\n }\n\n async sendAudio(audio: MediaInput, options: SendMediaOptions): Promise<Message> {\n return this.sendMedia('sendAudio', 'audio', audio, options);\n }\n\n async sendVoice(voice: MediaInput, options: SendMediaOptions): Promise<Message> {\n return this.sendMedia('sendVoice', 'voice', voice, options);\n }\n\n async sendAnimation(animation: MediaInput, options: SendMediaOptions): Promise<Message> {\n return this.sendMedia('sendAnimation', 'animation', animation, options);\n }\n\n async editMessageText(options: EditMessageTextOptions): Promise<Message> {\n const { requestId, ...payload } = options;\n return this.callMethod<Message>('editMessageText', payload, { requestId });\n }\n\n async deleteMessage(options: DeleteMessageOptions): Promise<boolean> {\n const { requestId, ...payload } = options;\n return this.callMethod<boolean>('deleteMessage', payload, { requestId });\n }\n\n async sendChatAction(options: SendChatActionOptions): Promise<boolean> {\n const { requestId, ...payload } = options;\n return this.callMethod<boolean>('sendChatAction', payload, { requestId });\n }\n\n async getUpdates(options: GetUpdatesOptions = {}): Promise<Update[]> {\n const { requestId, ...payload } = options;\n return this.callMethod<Update[]>('getUpdates', payload, { requestId });\n }\n\n async setWebhook(options: SetWebhookOptions): Promise<SetWebhookResult> {\n const { requestId, ...payload } = options;\n return this.callMethod<SetWebhookResult>('setWebhook', payload, { requestId });\n }\n\n async deleteWebhook(options: DeleteWebhookOptions = {}): Promise<boolean> {\n const { requestId, ...payload } = options;\n return this.callMethod<boolean>('deleteWebhook', payload, { requestId });\n }\n\n async getWebhookInfo(options?: RequestOptions): Promise<WebhookInfo> {\n return this.callMethod<WebhookInfo>('getWebhookInfo', {}, options);\n }\n\n async setMyCommands(options: SetMyCommandsOptions): Promise<boolean> {\n const { requestId, ...payload } = options;\n return this.callMethod<boolean>('setMyCommands', payload, { requestId });\n }\n\n async getMyCommands(options: GetMyCommandsOptions = {}): Promise<BotCommand[]> {\n const { requestId, ...payload } = options;\n return this.callMethod<BotCommand[]>('getMyCommands', payload, { requestId });\n }\n\n async deleteMyCommands(options: DeleteMyCommandsOptions = {}): Promise<boolean> {\n const { requestId, ...payload } = options;\n return this.callMethod<boolean>('deleteMyCommands', payload, { requestId });\n }\n\n async answerCallbackQuery(options: AnswerCallbackQueryOptions): Promise<boolean> {\n const { requestId, ...payload } = options;\n return this.callMethod<boolean>('answerCallbackQuery', payload, { requestId });\n }\n\n async getChat(options: GetChatOptions): Promise<Chat> {\n const { requestId, ...payload } = options;\n return this.callMethod<Chat>('getChat', payload, { requestId });\n }\n\n private async sendMedia(\n method: string,\n field: string,\n media: MediaInput,\n options: SendMediaOptions,\n ): Promise<Message> {\n const { requestId, ...payload } = options;\n return this.callMethod<Message>(\n method,\n {\n ...payload,\n [field]: this.normalizeMedia(media),\n },\n { requestId },\n );\n }\n\n private normalizeMedia(media: MediaInput): string | Record<string, string> {\n if (typeof media === 'string') {\n return media;\n }\n if (media.file_id) {\n return media.file_id;\n }\n if (media.url) {\n return media.url;\n }\n throw new Error('media requires file_id or url');\n }\n\n private buildMethodUrl(method: string): string {\n if (this.useCompatibleEndpoint) {\n return `${this.baseUrl}/bot${this.token}/${method}`;\n }\n return `${this.baseUrl}${CANONICAL_API_PREFIX}/${method}`;\n }\n}\n\nexport function buildQuery(params: Record<string, QueryValue>): string {\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) {\n continue;\n }\n search.set(key, String(value));\n }\n const query = search.toString();\n return query ? `?${query}` : '';\n}\n","import { WEBHOOK_SECRET_HEADER } from './constants.js';\nimport type { Update } from './types/index.js';\n\nexport interface WebhookRequest {\n headers: Record<string, string | string[] | undefined>;\n body: unknown;\n}\n\n/**\n * Parses a webhook request body into an Update object.\n */\nexport function parseWebhookUpdate(body: unknown): Update {\n if (!body || typeof body !== 'object') {\n throw new Error('webhook body must be an object');\n }\n const update = body as Update;\n if (typeof update.update_id !== 'number') {\n throw new Error('webhook body is missing update_id');\n }\n return update;\n}\n\n/**\n * Verifies the webhook secret header sent by Riseonly.\n */\nexport function verifyWebhookSecret(\n headers: Record<string, string | string[] | undefined>,\n secretToken?: string,\n): boolean {\n if (!secretToken) {\n return true;\n }\n const headerValue = headers[WEBHOOK_SECRET_HEADER] ?? headers[WEBHOOK_SECRET_HEADER.toLowerCase()];\n if (!headerValue) {\n return false;\n }\n const received = Array.isArray(headerValue) ? headerValue[0] : headerValue;\n return received === secretToken;\n}\n\n/**\n * Creates a minimal request handler for frameworks like Express or Fastify.\n */\nexport function createWebhookHandler(options: {\n secretToken?: string;\n onUpdate: (update: Update) => void | Promise<void>;\n onError?: (error: unknown) => void | Promise<void>;\n}) {\n return async (request: WebhookRequest): Promise<{ status: number; body?: unknown }> => {\n try {\n if (!verifyWebhookSecret(request.headers, options.secretToken)) {\n return { status: 401, body: { ok: false, description: 'invalid webhook secret' } };\n }\n const update = parseWebhookUpdate(request.body);\n await options.onUpdate(update);\n return { status: 200, body: { ok: true } };\n } catch (error) {\n await options.onError?.(error);\n return { status: 400, body: { ok: false, description: 'invalid webhook payload' } };\n }\n };\n}\n","import { createServer, type IncomingMessage, type Server, type ServerResponse } from 'node:http';\n\nimport { ApiClient } from './client.js';\nimport { RiseonlyError } from './errors.js';\nimport { createWebhookHandler } from './webhook.js';\nimport type {\n BotEvent,\n BotEventMap,\n BotOptions,\n CallbackQuery,\n Message,\n PollingOptions,\n Update,\n WebhookServerOptions,\n} from './types/index.js';\n\ntype Listener<T extends BotEvent> = BotEventMap[T][];\n\nexport class RiseonlyBot extends ApiClient {\n private readonly listeners: { [K in BotEvent]: Listener<K> } = {\n message: [],\n edited_message: [],\n callback_query: [],\n update: [],\n polling_error: [],\n error: [],\n };\n\n private pollingOptions: PollingOptions;\n private webhookOptions?: WebhookServerOptions;\n private polling = false;\n private pollingAbort?: AbortController;\n private offset = 0;\n private webhookServer?: Server;\n\n constructor(token: string, options: BotOptions = {}) {\n super(token, options);\n this.pollingOptions = normalizePollingOptions(options.polling);\n this.webhookOptions = options.webhook === false ? undefined : options.webhook;\n if (options.allowed_updates) {\n this.pollingOptions.allowed_updates = options.allowed_updates;\n }\n if (this.pollingOptions.autoStart) {\n void this.startPolling();\n }\n }\n\n /**\n * Registers an event listener.\n */\n on<T extends BotEvent>(event: T, handler: BotEventMap[T]): this {\n this.listeners[event].push(handler);\n return this;\n }\n\n /**\n * Removes a previously registered listener.\n */\n off<T extends BotEvent>(event: T, handler: BotEventMap[T]): this {\n const bucket = this.listeners[event];\n const index = bucket.indexOf(handler);\n if (index >= 0) {\n bucket.splice(index, 1);\n }\n return this;\n }\n\n /**\n * Registers a one-time event listener.\n */\n once<T extends BotEvent>(event: T, handler: BotEventMap[T]): this {\n const wrapper = ((...args: Parameters<BotEventMap[T]>) => {\n this.off(event, wrapper as BotEventMap[T]);\n return (\n handler as unknown as (...inner: Parameters<BotEventMap[T]>) => void | Promise<void>\n )(...args);\n }) as unknown as BotEventMap[T];\n return this.on(event, wrapper);\n }\n\n /**\n * Starts long polling for bot updates.\n */\n async startPolling(options: PollingOptions = {}): Promise<void> {\n if (this.polling) {\n return;\n }\n this.polling = true;\n this.pollingOptions = { ...this.pollingOptions, ...options, autoStart: true };\n this.pollingAbort = new AbortController();\n void this.pollLoop();\n }\n\n /**\n * Stops long polling.\n */\n async stopPolling(): Promise<void> {\n this.polling = false;\n this.pollingAbort?.abort();\n this.pollingAbort = undefined;\n }\n\n /**\n * Starts a built-in HTTP server that receives webhook updates.\n */\n async startWebhook(options: WebhookServerOptions = {}): Promise<void> {\n const config = { ...this.webhookOptions, ...options };\n this.webhookOptions = config;\n const path = config.path ?? '/';\n const host = config.host ?? '0.0.0.0';\n const port = config.port ?? 3000;\n\n const handler = createWebhookHandler({\n secretToken: config.secretToken,\n onUpdate: (update) => this.processUpdate(update),\n onError: (error) => this.emit('error', error),\n });\n\n if (this.webhookServer) {\n return;\n }\n\n this.webhookServer = createServer(async (req, res) => {\n if (req.method !== 'POST' || req.url?.split('?')[0] !== path) {\n respond(res, 404, { ok: false });\n return;\n }\n try {\n const body = await readJsonBody(req);\n const result = await handler({\n headers: normalizeHeaders(req.headers),\n body,\n });\n respond(res, result.status, result.body);\n } catch (error) {\n await this.emit('error', error);\n respond(res, 500, { ok: false });\n }\n });\n\n await new Promise<void>((resolve, reject) => {\n this.webhookServer!.once('error', reject);\n this.webhookServer!.listen(port, host, () => resolve());\n });\n }\n\n /**\n * Stops the built-in webhook server.\n */\n async stopWebhook(): Promise<void> {\n if (!this.webhookServer) {\n return;\n }\n const server = this.webhookServer;\n this.webhookServer = undefined;\n await new Promise<void>((resolve, reject) => {\n server.close((error) => (error ? reject(error) : resolve()));\n });\n }\n\n /**\n * Processes a single update and dispatches events.\n */\n async processUpdate(update: Update): Promise<void> {\n await this.emit('update', update);\n if (update.message) {\n await this.emit('message', update.message, update);\n }\n if (update.edited_message) {\n await this.emit('edited_message', update.edited_message, update);\n }\n if (update.callback_query) {\n await this.emit('callback_query', update.callback_query, update);\n }\n }\n\n /**\n * Sends a text message to a chat.\n */\n async reply(message: Message, text: string, extra: Record<string, unknown> = {}): Promise<Message> {\n return this.sendMessage({\n chat_id: message.chat.id,\n text,\n reply_to_message_id: message.message_id,\n ...extra,\n });\n }\n\n /**\n * Answers a callback query and optionally sends a toast.\n */\n async answer(query: CallbackQuery, text?: string, showAlert = false): Promise<boolean> {\n return this.answerCallbackQuery({\n callback_query_id: query.id,\n text,\n show_alert: showAlert,\n });\n }\n\n private async pollLoop(): Promise<void> {\n while (this.polling) {\n try {\n const updates = await this.getUpdates({\n offset: this.offset,\n timeout: this.pollingOptions.timeout,\n limit: this.pollingOptions.limit,\n allowed_updates: this.pollingOptions.allowed_updates,\n signal: this.pollingAbort?.signal,\n });\n let processed = 0;\n for (const update of updates) {\n if (update.update_id < this.offset) {\n continue;\n }\n this.offset = Math.max(this.offset, update.update_id + 1);\n await this.processUpdate(update);\n processed += 1;\n }\n if (processed === 0) {\n await sleep(this.pollingOptions.interval ?? 1000);\n }\n } catch (error) {\n if (!this.polling || isAbortError(error)) {\n return;\n }\n await this.emit('polling_error', error);\n if (error instanceof RiseonlyError && error.retryAfter) {\n await sleep(error.retryAfter * 1000);\n } else {\n await sleep(this.pollingOptions.interval ?? 1000);\n }\n }\n }\n }\n\n private async emit<T extends BotEvent>(\n event: T,\n ...args: Parameters<BotEventMap[T]>\n ): Promise<void> {\n for (const listener of [...this.listeners[event]]) {\n try {\n await (listener as (...inner: Parameters<BotEventMap[T]>) => void | Promise<void>)(...args);\n } catch (error) {\n await this.emit('error', error);\n }\n }\n }\n}\n\nfunction normalizePollingOptions(\n value: BotOptions['polling'],\n): PollingOptions & { autoStart: boolean } {\n if (!value) {\n return { interval: 1000, timeout: 30, limit: 100, autoStart: false };\n }\n if (value === true) {\n return { interval: 1000, timeout: 30, limit: 100, autoStart: true };\n }\n return {\n interval: 1000,\n timeout: 30,\n limit: 100,\n autoStart: true,\n ...value,\n };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === 'AbortError';\n}\n\nfunction normalizeHeaders(\n headers: IncomingMessage['headers'],\n): Record<string, string | string[] | undefined> {\n const normalized: Record<string, string | string[] | undefined> = {};\n for (const [key, value] of Object.entries(headers)) {\n normalized[key] = value;\n }\n return normalized;\n}\n\nasync function readJsonBody(req: IncomingMessage): Promise<unknown> {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n if (chunks.length === 0) {\n return {};\n }\n return JSON.parse(Buffer.concat(chunks).toString('utf8')) as unknown;\n}\n\nfunction respond(res: ServerResponse, status: number, body?: unknown): void {\n res.statusCode = status;\n res.setHeader('Content-Type', 'application/json');\n res.end(body === undefined ? undefined : JSON.stringify(body));\n}\n","import { createHmac, timingSafeEqual } from 'node:crypto';\n\nexport interface InitDataFields {\n [key: string]: string;\n}\n\nconst INIT_DATA_HASH_RE = /^[0-9a-f]{64}$/;\n\n/**\n * Parses URL-encoded init data into key/value fields.\n */\nexport function parseInitData(encoded: string): InitDataFields {\n const fields = Object.fromEntries(new URLSearchParams(encoded).entries());\n return fields;\n}\n\n/**\n * Builds the data check string used for init data signature verification.\n */\nexport function buildInitDataCheckString(fields: InitDataFields): string {\n return Object.entries(fields)\n .filter(([key]) => key !== 'hash')\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, value]) => `${key}=${value}`)\n .join('\\n');\n}\n\n/**\n * Derives the HMAC secret from a bot token.\n */\nexport function deriveInitDataSecret(botToken: string): Buffer {\n return createHmac('sha256', 'WebAppData').update(botToken).digest();\n}\n\n/**\n * Computes the expected init data hash for a bot token.\n */\nexport function signInitData(botToken: string, dataCheckString: string): string {\n const secret = deriveInitDataSecret(botToken);\n return createHmac('sha256', secret).update(dataCheckString).digest('hex');\n}\n\n/**\n * Verifies signed mini app init data.\n */\nexport function verifyInitData(botToken: string, encoded: string): InitDataFields {\n const fields = parseInitData(encoded);\n const hash = fields.hash;\n if (!hash) {\n throw new Error('init data hash is missing');\n }\n if (!INIT_DATA_HASH_RE.test(hash)) {\n throw new Error('init data signature is invalid');\n }\n\n const dataCheckString = buildInitDataCheckString(fields);\n const expected = signInitData(botToken, dataCheckString);\n\n const left = Buffer.from(hash, 'hex');\n const right = Buffer.from(expected, 'hex');\n if (left.length !== right.length || !timingSafeEqual(left, right)) {\n throw new Error('init data signature is invalid');\n }\n\n const expiresAt = fields.expires_at ? Number(fields.expires_at) : undefined;\n if (expiresAt !== undefined && Number.isFinite(expiresAt) && expiresAt < Date.now()) {\n throw new Error('init data has expired');\n }\n\n return fields;\n}\n\n/**\n * Extracts init data from a launch URL hash fragment.\n */\nexport function extractInitDataFromLaunchUrl(launchUrl: string): string | null {\n const url = new URL(launchUrl);\n const hash = url.hash.startsWith('#') ? url.hash.slice(1) : url.hash;\n if (!hash) {\n return null;\n }\n return new URLSearchParams(hash).get('riseonlyInitData');\n}\n\n/**\n * Creates a random idempotency key for Bot API requests.\n */\nexport function createRequestId(): string {\n return crypto.randomUUID();\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/errors.ts","../src/client.ts","../src/webhook.ts","../src/bot.ts","../src/utils.ts"],"names":["timingSafeEqual","createServer","createHmac"],"mappings":"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","file":"index.cjs","sourcesContent":["export const DEFAULT_API_BASE = 'https://api.riseonly.net';\n\nexport const CANONICAL_API_PREFIX = '/api/bot/v1';\n\nexport const WEBHOOK_SECRET_HEADER = 'x-riseonly-bot-api-secret-token';\n\nexport const IDEMPOTENCY_HEADER = 'x-request-id';\n\nexport const SUPPORTED_METHODS = [\n 'getMe',\n 'sendMessage',\n 'sendPhoto',\n 'sendVideo',\n 'sendDocument',\n 'sendAudio',\n 'sendVoice',\n 'sendAnimation',\n 'editMessageText',\n 'deleteMessage',\n 'sendChatAction',\n 'getUpdates',\n 'setWebhook',\n 'deleteWebhook',\n 'getWebhookInfo',\n 'setMyCommands',\n 'getMyCommands',\n 'deleteMyCommands',\n 'answerCallbackQuery',\n 'getChat',\n] as const;\n\nexport type BotApiMethod = (typeof SUPPORTED_METHODS)[number];\n\nexport const UPDATE_TYPES = [\n 'message',\n 'edited_message',\n 'callback_query',\n 'chat_member',\n 'my_chat_member',\n] as const;\n\nexport type UpdateType = (typeof UPDATE_TYPES)[number];\n\nexport const CHAT_ACTIONS = [\n 'typing',\n 'upload_photo',\n 'record_video',\n 'upload_video',\n 'record_voice',\n 'upload_voice',\n 'upload_document',\n 'choose_sticker',\n 'find_location',\n 'record_video_note',\n 'upload_video_note',\n] as const;\n\nexport type ChatAction = (typeof CHAT_ACTIONS)[number];\n\nexport const COMMAND_SCOPES = [\n 'default',\n 'all_private_chats',\n 'all_group_chats',\n 'all_chat_administrators',\n] as const;\n\nexport type CommandScope = (typeof COMMAND_SCOPES)[number] | `chat:${string}` | `chat_administrators:${string}`;\n","export class RiseonlyError extends Error {\n readonly code: number;\n readonly retryAfter?: number;\n readonly response?: unknown;\n\n constructor(message: string, code: number, retryAfter?: number, response?: unknown) {\n super(message);\n this.name = 'RiseonlyError';\n this.code = code;\n this.retryAfter = retryAfter;\n this.response = response;\n }\n\n static fromApiResponse(body: {\n error_code: number;\n description: string;\n parameters?: { retry_after?: number };\n }): RiseonlyError {\n return new RiseonlyError(\n body.description,\n body.error_code,\n body.parameters?.retry_after,\n body,\n );\n }\n}\n\nexport class RiseonlyNetworkError extends RiseonlyError {\n override readonly cause?: unknown;\n\n constructor(message: string, cause?: unknown, code = 0) {\n super(message, code);\n this.name = 'RiseonlyNetworkError';\n this.cause = cause;\n }\n}\n\nexport class RiseonlyTimeoutError extends RiseonlyNetworkError {\n constructor(message = 'Request timed out') {\n super(message, undefined, 408);\n this.name = 'RiseonlyTimeoutError';\n }\n}\n\nexport class RiseonlyAbortError extends RiseonlyNetworkError {\n constructor(message = 'Request was aborted', cause?: unknown) {\n super(message, cause, 499);\n this.name = 'RiseonlyAbortError';\n }\n}\n\nexport class RiseonlyResponseError extends RiseonlyNetworkError {\n readonly status: number;\n readonly body?: string;\n\n constructor(message: string, status: number, body?: string) {\n super(message, undefined, status);\n this.name = 'RiseonlyResponseError';\n this.status = status;\n this.body = body;\n }\n}\n","import {\n CANONICAL_API_PREFIX,\n DEFAULT_API_BASE,\n IDEMPOTENCY_HEADER,\n} from './constants.js';\nimport {\n RiseonlyAbortError,\n RiseonlyError,\n RiseonlyNetworkError,\n RiseonlyResponseError,\n RiseonlyTimeoutError,\n} from './errors.js';\nimport type {\n AnswerCallbackQueryOptions,\n ApiEnvelope,\n BotCommand,\n Capabilities,\n Chat,\n ClientOptions,\n DeleteMessageOptions,\n DeleteMyCommandsOptions,\n DeleteWebhookOptions,\n EditMessageTextOptions,\n GetChatOptions,\n GetMyCommandsOptions,\n GetUpdatesOptions,\n MediaInput,\n Message,\n RequestOptions,\n SendChatActionOptions,\n SendMediaOptions,\n SendMessageOptions,\n SetMyCommandsOptions,\n SetWebhookOptions,\n SetWebhookResult,\n Update,\n User,\n WebhookInfo,\n} from './types/index.js';\n\ntype QueryValue = string | number | boolean | undefined | null;\n\nexport class ApiClient {\n readonly token: string;\n readonly baseUrl: string;\n readonly fetchImpl: typeof fetch;\n readonly requestTimeoutMs: number;\n readonly useCompatibleEndpoint: boolean;\n\n constructor(token: string, options: ClientOptions = {}) {\n if (!token?.trim()) {\n throw new Error('bot token is required');\n }\n this.token = token.trim();\n this.baseUrl = (options.baseUrl ?? DEFAULT_API_BASE).replace(/\\/$/, '');\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (typeof fetchImpl !== 'function') {\n throw new Error('global fetch is unavailable; provide ClientOptions.fetch');\n }\n this.fetchImpl = options.fetch ? fetchImpl : fetchImpl.bind(globalThis);\n this.requestTimeoutMs = options.requestTimeoutMs ?? 60_000;\n if (!Number.isFinite(this.requestTimeoutMs) || this.requestTimeoutMs <= 0) {\n throw new Error('requestTimeoutMs must be a positive number');\n }\n this.useCompatibleEndpoint = options.useCompatibleEndpoint ?? false;\n }\n\n /**\n * Returns the platform capabilities document.\n */\n async getCapabilities(signal?: AbortSignal): Promise<Capabilities> {\n const url = `${this.baseUrl}${CANONICAL_API_PREFIX}/capabilities`;\n const { response, body } = await this.fetchJson(url, {\n method: 'GET',\n headers: { Accept: 'application/json' },\n }, { signal });\n if (!response.ok) {\n throw new RiseonlyResponseError(\n `capabilities request failed with status ${response.status}`,\n response.status,\n serializeResponseBody(body),\n );\n }\n if (!isRecord(body) || !Array.isArray(body.methods)) {\n throw new RiseonlyResponseError('capabilities response is invalid', response.status);\n }\n return body as unknown as Capabilities;\n }\n\n /**\n * Calls a Bot API method and returns the typed result.\n */\n async callMethod<T>(\n method: string,\n payload: Record<string, unknown> = {},\n options: RequestOptions = {},\n ): Promise<T> {\n const envelope = await this.request<T>(method, payload, options);\n return envelope.result;\n }\n\n /**\n * Performs a raw Bot API request and returns the full envelope.\n */\n async request<T>(\n method: string,\n payload: Record<string, unknown> = {},\n options: RequestOptions = {},\n ): Promise<ApiEnvelope<T> & { ok: true; result: T }> {\n const url = this.buildMethodUrl(method);\n const headers: Record<string, string> = {\n Authorization: `Bot ${this.token}`,\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n };\n if (options.requestId) {\n headers[IDEMPOTENCY_HEADER] = options.requestId;\n }\n\n const { response, body } = await this.fetchJson(\n url,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n },\n options,\n );\n if (isApiErrorResponse(body)) {\n throw RiseonlyError.fromApiResponse(body);\n }\n if (!response.ok) {\n throw new RiseonlyResponseError(\n `Bot API request failed with status ${response.status}`,\n response.status,\n serializeResponseBody(body),\n );\n }\n if (!isRecord(body) || body.ok !== true || !('result' in body)) {\n throw new RiseonlyResponseError('Bot API response envelope is invalid', response.status);\n }\n return body as unknown as ApiEnvelope<T> & { ok: true; result: T };\n }\n\n async getMe(options?: RequestOptions): Promise<User> {\n return this.callMethod<User>('getMe', {}, options);\n }\n\n async sendMessage(options: SendMessageOptions): Promise<Message> {\n const { request, payload } = splitRequestOptions(options);\n return this.callMethod<Message>('sendMessage', payload, request);\n }\n\n async sendPhoto(photo: MediaInput, options: SendMediaOptions): Promise<Message> {\n return this.sendMedia('sendPhoto', 'photo', photo, options);\n }\n\n async sendVideo(video: MediaInput, options: SendMediaOptions): Promise<Message> {\n return this.sendMedia('sendVideo', 'video', video, options);\n }\n\n async sendDocument(document: MediaInput, options: SendMediaOptions): Promise<Message> {\n return this.sendMedia('sendDocument', 'document', document, options);\n }\n\n async sendAudio(audio: MediaInput, options: SendMediaOptions): Promise<Message> {\n return this.sendMedia('sendAudio', 'audio', audio, options);\n }\n\n async sendVoice(voice: MediaInput, options: SendMediaOptions): Promise<Message> {\n return this.sendMedia('sendVoice', 'voice', voice, options);\n }\n\n async sendAnimation(animation: MediaInput, options: SendMediaOptions): Promise<Message> {\n return this.sendMedia('sendAnimation', 'animation', animation, options);\n }\n\n async editMessageText(options: EditMessageTextOptions): Promise<Message> {\n const { request, payload } = splitRequestOptions(options);\n return this.callMethod<Message>('editMessageText', payload, request);\n }\n\n async deleteMessage(options: DeleteMessageOptions): Promise<boolean> {\n const { request, payload } = splitRequestOptions(options);\n return this.callMethod<boolean>('deleteMessage', payload, request);\n }\n\n async sendChatAction(options: SendChatActionOptions): Promise<boolean> {\n const { request, payload } = splitRequestOptions(options);\n return this.callMethod<boolean>('sendChatAction', payload, request);\n }\n\n async getUpdates(options: GetUpdatesOptions = {}): Promise<Update[]> {\n const { request, payload } = splitRequestOptions(options);\n const serverTimeoutMs = (options.timeout ?? 0) * 1000 + 5_000;\n request.timeoutMs ??= Math.max(this.requestTimeoutMs, serverTimeoutMs);\n return this.callMethod<Update[]>('getUpdates', payload, request);\n }\n\n async setWebhook(options: SetWebhookOptions): Promise<SetWebhookResult> {\n const { request, payload } = splitRequestOptions(options);\n return this.callMethod<SetWebhookResult>('setWebhook', payload, request);\n }\n\n async deleteWebhook(options: DeleteWebhookOptions = {}): Promise<boolean> {\n const { request, payload } = splitRequestOptions(options);\n return this.callMethod<boolean>('deleteWebhook', payload, request);\n }\n\n async getWebhookInfo(options?: RequestOptions): Promise<WebhookInfo> {\n return this.callMethod<WebhookInfo>('getWebhookInfo', {}, options);\n }\n\n async setMyCommands(options: SetMyCommandsOptions): Promise<boolean> {\n const { request, payload } = splitRequestOptions(options);\n return this.callMethod<boolean>('setMyCommands', payload, request);\n }\n\n async getMyCommands(options: GetMyCommandsOptions = {}): Promise<BotCommand[]> {\n const { request, payload } = splitRequestOptions(options);\n return this.callMethod<BotCommand[]>('getMyCommands', payload, request);\n }\n\n async deleteMyCommands(options: DeleteMyCommandsOptions = {}): Promise<boolean> {\n const { request, payload } = splitRequestOptions(options);\n return this.callMethod<boolean>('deleteMyCommands', payload, request);\n }\n\n async answerCallbackQuery(options: AnswerCallbackQueryOptions): Promise<boolean> {\n const { request, payload } = splitRequestOptions(options);\n return this.callMethod<boolean>('answerCallbackQuery', payload, request);\n }\n\n async getChat(options: GetChatOptions): Promise<Chat> {\n const { request, payload } = splitRequestOptions(options);\n return this.callMethod<Chat>('getChat', payload, request);\n }\n\n private async sendMedia(\n method: string,\n field: string,\n media: MediaInput,\n options: SendMediaOptions,\n ): Promise<Message> {\n const { request, payload } = splitRequestOptions(options);\n return this.callMethod<Message>(\n method,\n {\n ...payload,\n [field]: this.normalizeMedia(media),\n },\n request,\n );\n }\n\n private normalizeMedia(media: MediaInput): string | Record<string, string | number> {\n if (typeof media === 'string') {\n return media;\n }\n if (media.file_id || media.url) {\n return Object.fromEntries(\n Object.entries(media).filter((entry): entry is [string, string | number] =>\n typeof entry[1] === 'string' || typeof entry[1] === 'number'\n ),\n );\n }\n throw new Error('media requires file_id or url');\n }\n\n private buildMethodUrl(method: string): string {\n if (this.useCompatibleEndpoint) {\n return `${this.baseUrl}/bot${this.token}/${method}`;\n }\n return `${this.baseUrl}${CANONICAL_API_PREFIX}/${method}`;\n }\n\n private async fetchJson(\n url: string,\n init: RequestInit,\n options: Pick<RequestOptions, 'signal' | 'timeoutMs'> = {},\n ): Promise<{ response: Response; body: unknown }> {\n const controller = new AbortController();\n let timedOut = false;\n const timeoutMs = options.timeoutMs ?? this.requestTimeoutMs;\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new Error('timeoutMs must be a positive number');\n }\n const abortFromCaller = () => controller.abort(options.signal?.reason);\n if (options.signal?.aborted) {\n throw new RiseonlyAbortError('Request was aborted', options.signal.reason);\n }\n options.signal?.addEventListener('abort', abortFromCaller, { once: true });\n const timeout = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, timeoutMs);\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, { ...init, signal: controller.signal });\n } catch (error) {\n if (controller.signal.aborted) {\n if (timedOut) {\n throw new RiseonlyTimeoutError();\n }\n throw new RiseonlyAbortError('Request was aborted', error);\n }\n throw new RiseonlyNetworkError('network request failed', error);\n } finally {\n clearTimeout(timeout);\n options.signal?.removeEventListener('abort', abortFromCaller);\n }\n\n let text: string;\n try {\n text = await response.text();\n } catch (error) {\n throw new RiseonlyNetworkError('unable to read response body', error, response.status);\n }\n if (!text) {\n throw new RiseonlyResponseError('Bot API returned an empty response', response.status);\n }\n try {\n return { response, body: JSON.parse(text) as unknown };\n } catch {\n throw new RiseonlyResponseError(\n 'Bot API returned a non-JSON response',\n response.status,\n text.slice(0, 4_096),\n );\n }\n }\n}\n\nfunction splitRequestOptions<T extends RequestOptions>(\n options: T,\n): { request: RequestOptions; payload: Record<string, unknown> } {\n const { requestId, signal, timeoutMs, ...payload } = options;\n return {\n request: { requestId, signal, timeoutMs },\n payload: payload as Record<string, unknown>,\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isApiErrorResponse(value: unknown): value is {\n ok: false;\n error_code: number;\n description: string;\n parameters?: { retry_after?: number };\n} {\n return isRecord(value)\n && value.ok === false\n && typeof value.error_code === 'number'\n && typeof value.description === 'string';\n}\n\nfunction serializeResponseBody(body: unknown): string | undefined {\n try {\n return JSON.stringify(body).slice(0, 4_096);\n } catch {\n return undefined;\n }\n}\n\nexport function buildQuery(params: Record<string, QueryValue>): string {\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) {\n continue;\n }\n search.set(key, String(value));\n }\n const query = search.toString();\n return query ? `?${query}` : '';\n}\n","import { timingSafeEqual } from 'node:crypto';\n\nimport { WEBHOOK_SECRET_HEADER } from './constants.js';\nimport type { Update } from './types/index.js';\n\nexport interface WebhookRequest {\n headers: Record<string, string | string[] | undefined>;\n body: unknown;\n}\n\n/**\n * Parses a webhook request body into an Update object.\n */\nexport function parseWebhookUpdate(body: unknown): Update {\n if (!body || typeof body !== 'object') {\n throw new Error('webhook body must be an object');\n }\n const update = body as Update;\n if (typeof update.update_id !== 'number') {\n throw new Error('webhook body is missing update_id');\n }\n return update;\n}\n\n/**\n * Verifies the webhook secret header sent by Riseonly.\n */\nexport function verifyWebhookSecret(\n headers: Record<string, string | string[] | undefined>,\n secretToken?: string,\n): boolean {\n if (!secretToken) {\n return true;\n }\n const headerEntry = Object.entries(headers).find(\n ([name]) => name.toLowerCase() === WEBHOOK_SECRET_HEADER,\n );\n const headerValue = headerEntry?.[1];\n if (!headerValue) {\n return false;\n }\n const received = Array.isArray(headerValue) ? headerValue[0] : headerValue;\n if (typeof received !== 'string') {\n return false;\n }\n const actual = Buffer.from(received);\n const expected = Buffer.from(secretToken);\n return actual.length === expected.length && timingSafeEqual(actual, expected);\n}\n\n/**\n * Creates a minimal request handler for frameworks like Express or Fastify.\n */\nexport function createWebhookHandler(options: {\n secretToken?: string;\n onUpdate: (update: Update) => void | Promise<void>;\n onError?: (error: unknown) => void | Promise<void>;\n}) {\n return async (request: WebhookRequest): Promise<{ status: number; body?: unknown }> => {\n if (!verifyWebhookSecret(request.headers, options.secretToken)) {\n return { status: 401, body: { ok: false, description: 'invalid webhook secret' } };\n }\n\n let update: Update;\n try {\n update = parseWebhookUpdate(request.body);\n } catch (error) {\n await notifyWebhookError(options.onError, error);\n return { status: 400, body: { ok: false, description: 'invalid webhook payload' } };\n }\n\n try {\n await options.onUpdate(update);\n return { status: 200, body: { ok: true } };\n } catch (error) {\n await notifyWebhookError(options.onError, error);\n return { status: 500, body: { ok: false, description: 'webhook handler failed' } };\n }\n };\n}\n\nasync function notifyWebhookError(\n handler: ((error: unknown) => void | Promise<void>) | undefined,\n error: unknown,\n): Promise<void> {\n try {\n await handler?.(error);\n } catch {\n return;\n }\n}\n","import { createServer, type IncomingMessage, type Server, type ServerResponse } from 'node:http';\n\nimport { ApiClient } from './client.js';\nimport { RiseonlyError } from './errors.js';\nimport { createWebhookHandler } from './webhook.js';\nimport type {\n BotEvent,\n BotEventMap,\n BotOptions,\n BotSetupOptions,\n CallbackQuery,\n Message,\n PollingOptions,\n TextHandler,\n Update,\n WebhookServerOptions,\n} from './types/index.js';\n\ntype Listener<T extends BotEvent> = BotEventMap[T][];\n\nexport class RiseonlyBot extends ApiClient {\n private readonly listeners: { [K in BotEvent]: Listener<K> } = {\n message: [],\n edited_message: [],\n callback_query: [],\n update: [],\n polling_error: [],\n error: [],\n };\n\n private pollingOptions: PollingOptions;\n private webhookOptions?: WebhookServerOptions;\n private polling = false;\n private pollingAbort?: AbortController;\n private pollingTask?: Promise<void>;\n private offset = 0;\n private webhookServer?: Server;\n\n constructor(token: string, options: BotOptions = {}) {\n super(token, options);\n this.pollingOptions = normalizePollingOptions(options.polling);\n this.webhookOptions = options.webhook === false ? undefined : options.webhook;\n if (options.allowed_updates) {\n this.pollingOptions.allowed_updates = options.allowed_updates;\n }\n if (this.pollingOptions.autoStart) {\n void this.startPolling();\n }\n }\n\n /**\n * Registers an event listener.\n */\n on<T extends BotEvent>(event: T, handler: BotEventMap[T]): this {\n this.listeners[event].push(handler);\n return this;\n }\n\n /**\n * Removes a previously registered listener.\n */\n off<T extends BotEvent>(event: T, handler: BotEventMap[T]): this {\n const bucket = this.listeners[event];\n const index = bucket.indexOf(handler);\n if (index >= 0) {\n bucket.splice(index, 1);\n }\n return this;\n }\n\n /**\n * Registers a one-time event listener.\n */\n once<T extends BotEvent>(event: T, handler: BotEventMap[T]): this {\n const wrapper = ((...args: Parameters<BotEventMap[T]>) => {\n this.off(event, wrapper as BotEventMap[T]);\n return (\n handler as unknown as (...inner: Parameters<BotEventMap[T]>) => void | Promise<void>\n )(...args);\n }) as unknown as BotEventMap[T];\n return this.on(event, wrapper);\n }\n\n command(commands: string | string[], handler: BotEventMap['message']): this {\n const accepted = new Set(\n (Array.isArray(commands) ? commands : [commands])\n .map((command) => command.replace(/^\\//, '').toLowerCase())\n .filter(Boolean),\n );\n return this.on('message', async (message, update) => {\n const text = message.text?.trim();\n if (!text?.startsWith('/')) {\n return;\n }\n const token = text.split(/\\s+/, 1)[0]!.slice(1).split('@', 1)[0]!.toLowerCase();\n if (accepted.has(token)) {\n await handler(message, update);\n }\n });\n }\n\n hears(trigger: string | RegExp, handler: TextHandler): this {\n return this.on('message', async (message, update) => {\n if (message.text === undefined) {\n return;\n }\n if (typeof trigger === 'string') {\n if (message.text === trigger) {\n await handler(message, null, update);\n }\n return;\n }\n trigger.lastIndex = 0;\n const match = trigger.exec(message.text);\n if (match) {\n await handler(message, match, update);\n }\n });\n }\n\n action(trigger: string | RegExp, handler: BotEventMap['callback_query']): this {\n return this.on('callback_query', async (query, update) => {\n if (query.data === undefined) {\n return;\n }\n const matches = typeof trigger === 'string'\n ? query.data === trigger\n : testPattern(trigger, query.data);\n if (matches) {\n await handler(query, update);\n }\n });\n }\n\n catch(handler: BotEventMap['error']): this {\n return this.on('error', handler);\n }\n\n async setup(options: BotSetupOptions): Promise<void> {\n if (options.commands) {\n await this.setMyCommands({\n commands: options.commands,\n scope: options.commandScope,\n language_code: options.languageCode,\n });\n }\n if (options.webhook === false) {\n await this.deleteWebhook();\n } else if (options.webhook) {\n await this.setWebhook(options.webhook);\n }\n }\n\n /**\n * Starts long polling for bot updates.\n */\n async startPolling(options: PollingOptions = {}): Promise<void> {\n if (this.polling) {\n return;\n }\n this.polling = true;\n this.pollingOptions = { ...this.pollingOptions, ...options, autoStart: true };\n this.pollingAbort = new AbortController();\n this.pollingTask = this.pollLoop();\n }\n\n /**\n * Stops long polling.\n */\n async stopPolling(): Promise<void> {\n this.polling = false;\n this.pollingAbort?.abort();\n await this.pollingTask;\n this.pollingAbort = undefined;\n this.pollingTask = undefined;\n }\n\n async launch(options: PollingOptions = {}): Promise<void> {\n await this.startPolling(options);\n }\n\n async stop(): Promise<void> {\n await Promise.all([this.stopPolling(), this.stopWebhook()]);\n }\n\n /**\n * Starts a built-in HTTP server that receives webhook updates.\n */\n async startWebhook(options: WebhookServerOptions = {}): Promise<void> {\n const config = { ...this.webhookOptions, ...options };\n this.webhookOptions = config;\n const path = config.path ?? '/';\n const host = config.host ?? '0.0.0.0';\n const port = config.port ?? 3000;\n if (!path.startsWith('/')) {\n throw new Error('webhook path must start with /');\n }\n if (config.maxBodyBytes !== undefined && config.maxBodyBytes <= 0) {\n throw new Error('maxBodyBytes must be positive');\n }\n\n const handler = createWebhookHandler({\n secretToken: config.secretToken,\n onUpdate: (update) => this.processUpdate(update),\n onError: (error) => this.emit('error', error),\n });\n\n if (this.webhookServer) {\n return;\n }\n\n this.webhookServer = createServer(async (req, res) => {\n if (req.method !== 'POST' || req.url?.split('?')[0] !== path) {\n respond(res, 404, { ok: false });\n return;\n }\n try {\n const body = await readJsonBody(req, config.maxBodyBytes);\n const result = await handler({\n headers: normalizeHeaders(req.headers),\n body,\n });\n respond(res, result.status, result.body);\n } catch (error) {\n await this.emitError(error);\n const status = error instanceof WebhookPayloadTooLargeError ? 413 : 500;\n respond(res, status, { ok: false });\n }\n });\n\n await new Promise<void>((resolve, reject) => {\n this.webhookServer!.once('error', reject);\n this.webhookServer!.listen(port, host, () => resolve());\n });\n }\n\n /**\n * Stops the built-in webhook server.\n */\n async stopWebhook(): Promise<void> {\n if (!this.webhookServer) {\n return;\n }\n const server = this.webhookServer;\n this.webhookServer = undefined;\n await new Promise<void>((resolve, reject) => {\n server.close((error) => (error ? reject(error) : resolve()));\n });\n }\n\n /**\n * Processes a single update and dispatches events.\n */\n async processUpdate(update: Update): Promise<void> {\n await this.emit('update', update);\n if (update.message) {\n await this.emit('message', update.message, update);\n }\n if (update.edited_message) {\n await this.emit('edited_message', update.edited_message, update);\n }\n if (update.callback_query) {\n await this.emit('callback_query', update.callback_query, update);\n }\n }\n\n /**\n * Sends a text message to a chat.\n */\n async reply(message: Message, text: string, extra: Record<string, unknown> = {}): Promise<Message> {\n return this.sendMessage({\n chat_id: message.chat.id,\n text,\n reply_to_message_id: message.message_id,\n ...extra,\n });\n }\n\n /**\n * Answers a callback query and optionally sends a toast.\n */\n async answer(query: CallbackQuery, text?: string, showAlert = false): Promise<boolean> {\n return this.answerCallbackQuery({\n callback_query_id: query.id,\n text,\n show_alert: showAlert,\n });\n }\n\n private async pollLoop(): Promise<void> {\n while (this.polling) {\n try {\n const updates = await this.getUpdates({\n offset: this.offset,\n timeout: this.pollingOptions.timeout,\n limit: this.pollingOptions.limit,\n allowed_updates: this.pollingOptions.allowed_updates,\n signal: this.pollingAbort?.signal,\n });\n let processed = 0;\n for (const update of updates) {\n if (update.update_id < this.offset) {\n continue;\n }\n await this.processUpdate(update);\n this.offset = Math.max(this.offset, update.update_id + 1);\n processed += 1;\n }\n if (processed === 0) {\n await sleep(this.pollingOptions.interval ?? 1000);\n }\n } catch (error) {\n if (!this.polling || isAbortError(error)) {\n return;\n }\n try {\n await this.emit('polling_error', error);\n } catch {\n // The original update stays unacknowledged and is retried by offset.\n }\n if (error instanceof RiseonlyError && error.retryAfter) {\n await sleep(error.retryAfter * 1000);\n } else {\n await sleep(this.pollingOptions.interval ?? 1000);\n }\n }\n }\n }\n\n private async emit<T extends BotEvent>(\n event: T,\n ...args: Parameters<BotEventMap[T]>\n ): Promise<void> {\n let firstError: unknown;\n for (const listener of [...this.listeners[event]]) {\n try {\n await (listener as (...inner: Parameters<BotEventMap[T]>) => void | Promise<void>)(...args);\n } catch (error) {\n firstError ??= error;\n if (event !== 'error') {\n await this.emitError(error);\n }\n }\n }\n if (firstError !== undefined) {\n throw firstError;\n }\n }\n\n private async emitError(error: unknown): Promise<void> {\n for (const listener of [...this.listeners.error]) {\n try {\n await listener(error);\n } catch {\n continue;\n }\n }\n }\n}\n\nfunction normalizePollingOptions(\n value: BotOptions['polling'],\n): PollingOptions & { autoStart: boolean } {\n if (!value) {\n return { interval: 1000, timeout: 30, limit: 100, autoStart: false };\n }\n if (value === true) {\n return { interval: 1000, timeout: 30, limit: 100, autoStart: true };\n }\n return {\n interval: 1000,\n timeout: 30,\n limit: 100,\n autoStart: true,\n ...value,\n };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && (error.name === 'AbortError' || error.name === 'RiseonlyAbortError');\n}\n\nfunction testPattern(pattern: RegExp, value: string): boolean {\n pattern.lastIndex = 0;\n return pattern.test(value);\n}\n\nfunction normalizeHeaders(\n headers: IncomingMessage['headers'],\n): Record<string, string | string[] | undefined> {\n const normalized: Record<string, string | string[] | undefined> = {};\n for (const [key, value] of Object.entries(headers)) {\n normalized[key] = value;\n }\n return normalized;\n}\n\nclass WebhookPayloadTooLargeError extends Error {}\n\nasync function readJsonBody(req: IncomingMessage, maxBodyBytes = 1024 * 1024): Promise<unknown> {\n const chunks: Buffer[] = [];\n let received = 0;\n for await (const chunk of req) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n received += buffer.length;\n if (received > maxBodyBytes) {\n req.resume();\n throw new WebhookPayloadTooLargeError('webhook payload is too large');\n }\n chunks.push(buffer);\n }\n if (chunks.length === 0) {\n return {};\n }\n return JSON.parse(Buffer.concat(chunks).toString('utf8')) as unknown;\n}\n\nfunction respond(res: ServerResponse, status: number, body?: unknown): void {\n res.statusCode = status;\n res.setHeader('Content-Type', 'application/json');\n res.end(body === undefined ? undefined : JSON.stringify(body));\n}\n","import { createHmac, timingSafeEqual } from 'node:crypto';\n\nexport interface InitDataFields {\n [key: string]: string;\n}\n\nconst INIT_DATA_HASH_RE = /^[0-9a-f]{64}$/;\n\n/**\n * Parses URL-encoded init data into key/value fields.\n */\nexport function parseInitData(encoded: string): InitDataFields {\n const fields = Object.fromEntries(new URLSearchParams(encoded).entries());\n return fields;\n}\n\n/**\n * Builds the data check string used for init data signature verification.\n */\nexport function buildInitDataCheckString(fields: InitDataFields): string {\n return Object.entries(fields)\n .filter(([key]) => key !== 'hash')\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, value]) => `${key}=${value}`)\n .join('\\n');\n}\n\n/**\n * Derives the HMAC secret from a bot token.\n */\nexport function deriveInitDataSecret(botToken: string): Buffer {\n return createHmac('sha256', 'WebAppData').update(botToken).digest();\n}\n\n/**\n * Computes the expected init data hash for a bot token.\n */\nexport function signInitData(botToken: string, dataCheckString: string): string {\n const secret = deriveInitDataSecret(botToken);\n return createHmac('sha256', secret).update(dataCheckString).digest('hex');\n}\n\n/**\n * Verifies signed mini app init data.\n */\nexport function verifyInitData(botToken: string, encoded: string): InitDataFields {\n const fields = parseInitData(encoded);\n const hash = fields.hash;\n if (!hash) {\n throw new Error('init data hash is missing');\n }\n if (!INIT_DATA_HASH_RE.test(hash)) {\n throw new Error('init data signature is invalid');\n }\n\n const dataCheckString = buildInitDataCheckString(fields);\n const expected = signInitData(botToken, dataCheckString);\n\n const left = Buffer.from(hash, 'hex');\n const right = Buffer.from(expected, 'hex');\n if (left.length !== right.length || !timingSafeEqual(left, right)) {\n throw new Error('init data signature is invalid');\n }\n\n const authDate = Number(fields.auth_date);\n const expiresAt = Number(fields.expires_at);\n if (!Number.isSafeInteger(authDate) || !Number.isSafeInteger(expiresAt) || expiresAt <= authDate) {\n throw new Error('init data timestamps are invalid');\n }\n if (expiresAt < Date.now()) {\n throw new Error('init data has expired');\n }\n\n return fields;\n}\n\n/**\n * Extracts init data from a launch URL hash fragment.\n */\nexport function extractInitDataFromLaunchUrl(launchUrl: string): string | null {\n const url = new URL(launchUrl);\n const hash = url.hash.startsWith('#') ? url.hash.slice(1) : url.hash;\n if (!hash) {\n return null;\n }\n return new URLSearchParams(hash).get('riseonlyInitData');\n}\n\n/**\n * Creates a random idempotency key for Bot API requests.\n */\nexport function createRequestId(): string {\n return crypto.randomUUID();\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -45,6 +45,7 @@ interface ClientOptions {
|
|
|
45
45
|
interface RequestOptions {
|
|
46
46
|
requestId?: string;
|
|
47
47
|
signal?: AbortSignal;
|
|
48
|
+
timeoutMs?: number;
|
|
48
49
|
}
|
|
49
50
|
interface User {
|
|
50
51
|
id: string;
|
|
@@ -58,7 +59,7 @@ interface User {
|
|
|
58
59
|
is_premium?: boolean;
|
|
59
60
|
is_official?: boolean;
|
|
60
61
|
is_online?: boolean;
|
|
61
|
-
last_seen?:
|
|
62
|
+
last_seen?: number;
|
|
62
63
|
bot_owner_id?: string;
|
|
63
64
|
can_join_groups?: boolean;
|
|
64
65
|
supports_inline_queries?: boolean;
|
|
@@ -66,12 +67,15 @@ interface User {
|
|
|
66
67
|
}
|
|
67
68
|
interface Chat {
|
|
68
69
|
id: string;
|
|
69
|
-
type
|
|
70
|
+
type?: 'private' | 'group' | 'channel' | string;
|
|
70
71
|
title?: string;
|
|
71
72
|
username?: string;
|
|
72
73
|
description?: string;
|
|
74
|
+
photo?: string;
|
|
73
75
|
avatar_url?: string;
|
|
74
76
|
member_count?: number;
|
|
77
|
+
is_public?: boolean;
|
|
78
|
+
is_verified?: boolean;
|
|
75
79
|
}
|
|
76
80
|
interface MediaVariant {
|
|
77
81
|
variant_type?: string;
|
|
@@ -233,94 +237,86 @@ interface SetWebhookResult {
|
|
|
233
237
|
url: string;
|
|
234
238
|
enabled: boolean;
|
|
235
239
|
}
|
|
236
|
-
interface SendMessageOptions {
|
|
240
|
+
interface SendMessageOptions extends RequestOptions {
|
|
237
241
|
chat_id: string;
|
|
238
|
-
text
|
|
239
|
-
caption?: string;
|
|
242
|
+
text: string;
|
|
240
243
|
parse_mode?: string;
|
|
241
244
|
disable_notification?: boolean;
|
|
242
245
|
reply_to_message_id?: string;
|
|
243
246
|
reply_markup?: ReplyMarkup;
|
|
244
|
-
requestId?: string;
|
|
245
247
|
}
|
|
246
|
-
interface SendMediaOptions {
|
|
248
|
+
interface SendMediaOptions extends RequestOptions {
|
|
247
249
|
chat_id: string;
|
|
248
250
|
caption?: string;
|
|
249
251
|
disable_notification?: boolean;
|
|
250
252
|
reply_to_message_id?: string;
|
|
251
253
|
reply_markup?: ReplyMarkup;
|
|
252
|
-
requestId?: string;
|
|
253
254
|
}
|
|
254
|
-
interface EditMessageTextOptions {
|
|
255
|
+
interface EditMessageTextOptions extends RequestOptions {
|
|
255
256
|
chat_id?: string;
|
|
256
257
|
message_id?: string;
|
|
257
258
|
inline_message_id?: string;
|
|
258
259
|
text: string;
|
|
259
260
|
parse_mode?: string;
|
|
260
261
|
reply_markup?: ReplyMarkup;
|
|
261
|
-
requestId?: string;
|
|
262
262
|
}
|
|
263
|
-
interface DeleteMessageOptions {
|
|
263
|
+
interface DeleteMessageOptions extends RequestOptions {
|
|
264
264
|
chat_id: string;
|
|
265
265
|
message_id: string;
|
|
266
|
-
requestId?: string;
|
|
267
266
|
}
|
|
268
|
-
interface SendChatActionOptions {
|
|
267
|
+
interface SendChatActionOptions extends RequestOptions {
|
|
269
268
|
chat_id: string;
|
|
270
269
|
action: ChatAction;
|
|
271
|
-
requestId?: string;
|
|
272
270
|
}
|
|
273
|
-
interface GetUpdatesOptions {
|
|
271
|
+
interface GetUpdatesOptions extends RequestOptions {
|
|
274
272
|
offset?: number;
|
|
275
273
|
limit?: number;
|
|
276
274
|
timeout?: number;
|
|
277
275
|
allowed_updates?: UpdateType[];
|
|
278
|
-
requestId?: string;
|
|
279
|
-
signal?: AbortSignal;
|
|
280
276
|
}
|
|
281
|
-
interface SetWebhookOptions {
|
|
277
|
+
interface SetWebhookOptions extends RequestOptions {
|
|
282
278
|
url: string;
|
|
283
279
|
secret_token?: string;
|
|
284
280
|
max_connections?: number;
|
|
285
281
|
allowed_updates?: UpdateType[];
|
|
286
282
|
drop_pending_updates?: boolean;
|
|
287
|
-
requestId?: string;
|
|
288
283
|
}
|
|
289
|
-
interface DeleteWebhookOptions {
|
|
284
|
+
interface DeleteWebhookOptions extends RequestOptions {
|
|
290
285
|
drop_pending_updates?: boolean;
|
|
291
|
-
requestId?: string;
|
|
292
286
|
}
|
|
293
|
-
interface SetMyCommandsOptions {
|
|
287
|
+
interface SetMyCommandsOptions extends RequestOptions {
|
|
294
288
|
commands: BotCommand[];
|
|
295
289
|
scope?: CommandScope;
|
|
296
290
|
language_code?: string;
|
|
297
|
-
requestId?: string;
|
|
298
291
|
}
|
|
299
|
-
interface GetMyCommandsOptions {
|
|
292
|
+
interface GetMyCommandsOptions extends RequestOptions {
|
|
300
293
|
scope?: CommandScope;
|
|
301
294
|
language_code?: string;
|
|
302
|
-
requestId?: string;
|
|
303
295
|
}
|
|
304
|
-
interface DeleteMyCommandsOptions {
|
|
296
|
+
interface DeleteMyCommandsOptions extends RequestOptions {
|
|
305
297
|
scope?: CommandScope;
|
|
306
298
|
language_code?: string;
|
|
307
|
-
requestId?: string;
|
|
308
299
|
}
|
|
309
|
-
interface AnswerCallbackQueryOptions {
|
|
300
|
+
interface AnswerCallbackQueryOptions extends RequestOptions {
|
|
310
301
|
callback_query_id: string;
|
|
311
302
|
text?: string;
|
|
312
303
|
show_alert?: boolean;
|
|
313
304
|
url?: string;
|
|
314
|
-
requestId?: string;
|
|
315
305
|
}
|
|
316
|
-
interface GetChatOptions {
|
|
306
|
+
interface GetChatOptions extends RequestOptions {
|
|
317
307
|
chat_id: string;
|
|
318
|
-
requestId?: string;
|
|
319
308
|
}
|
|
320
|
-
|
|
309
|
+
interface MediaReference {
|
|
321
310
|
file_id?: string;
|
|
322
311
|
url?: string;
|
|
323
|
-
|
|
312
|
+
file_name?: string;
|
|
313
|
+
mime_type?: string;
|
|
314
|
+
thumbnail_url?: string;
|
|
315
|
+
duration?: number;
|
|
316
|
+
width?: number;
|
|
317
|
+
height?: number;
|
|
318
|
+
}
|
|
319
|
+
type MediaInput = string | MediaReference;
|
|
324
320
|
interface PollingOptions {
|
|
325
321
|
interval?: number;
|
|
326
322
|
timeout?: number;
|
|
@@ -333,15 +329,23 @@ interface WebhookServerOptions {
|
|
|
333
329
|
host?: string;
|
|
334
330
|
port?: number;
|
|
335
331
|
secretToken?: string;
|
|
332
|
+
maxBodyBytes?: number;
|
|
336
333
|
}
|
|
337
334
|
interface BotOptions extends ClientOptions {
|
|
338
335
|
polling?: boolean | PollingOptions;
|
|
339
336
|
webhook?: false | WebhookServerOptions;
|
|
340
337
|
allowed_updates?: UpdateType[];
|
|
341
338
|
}
|
|
339
|
+
interface BotSetupOptions {
|
|
340
|
+
commands?: BotCommand[];
|
|
341
|
+
commandScope?: CommandScope;
|
|
342
|
+
languageCode?: string;
|
|
343
|
+
webhook?: SetWebhookOptions | false;
|
|
344
|
+
}
|
|
342
345
|
type MessageHandler = (message: Message, update: Update) => void | Promise<void>;
|
|
343
346
|
type EditedMessageHandler = (message: Message, update: Update) => void | Promise<void>;
|
|
344
347
|
type CallbackQueryHandler = (query: CallbackQuery, update: Update) => void | Promise<void>;
|
|
348
|
+
type TextHandler = (message: Message, match: RegExpExecArray | null, update: Update) => void | Promise<void>;
|
|
345
349
|
type UpdateHandler = (update: Update) => void | Promise<void>;
|
|
346
350
|
type ErrorHandler = (error: unknown) => void | Promise<void>;
|
|
347
351
|
type PollingErrorHandler = (error: unknown) => void | Promise<void>;
|
|
@@ -400,6 +404,7 @@ declare class ApiClient {
|
|
|
400
404
|
private sendMedia;
|
|
401
405
|
private normalizeMedia;
|
|
402
406
|
private buildMethodUrl;
|
|
407
|
+
private fetchJson;
|
|
403
408
|
}
|
|
404
409
|
|
|
405
410
|
declare class RiseonlyBot extends ApiClient {
|
|
@@ -408,6 +413,7 @@ declare class RiseonlyBot extends ApiClient {
|
|
|
408
413
|
private webhookOptions?;
|
|
409
414
|
private polling;
|
|
410
415
|
private pollingAbort?;
|
|
416
|
+
private pollingTask?;
|
|
411
417
|
private offset;
|
|
412
418
|
private webhookServer?;
|
|
413
419
|
constructor(token: string, options?: BotOptions);
|
|
@@ -423,6 +429,11 @@ declare class RiseonlyBot extends ApiClient {
|
|
|
423
429
|
* Registers a one-time event listener.
|
|
424
430
|
*/
|
|
425
431
|
once<T extends BotEvent>(event: T, handler: BotEventMap[T]): this;
|
|
432
|
+
command(commands: string | string[], handler: BotEventMap['message']): this;
|
|
433
|
+
hears(trigger: string | RegExp, handler: TextHandler): this;
|
|
434
|
+
action(trigger: string | RegExp, handler: BotEventMap['callback_query']): this;
|
|
435
|
+
catch(handler: BotEventMap['error']): this;
|
|
436
|
+
setup(options: BotSetupOptions): Promise<void>;
|
|
426
437
|
/**
|
|
427
438
|
* Starts long polling for bot updates.
|
|
428
439
|
*/
|
|
@@ -431,6 +442,8 @@ declare class RiseonlyBot extends ApiClient {
|
|
|
431
442
|
* Stops long polling.
|
|
432
443
|
*/
|
|
433
444
|
stopPolling(): Promise<void>;
|
|
445
|
+
launch(options?: PollingOptions): Promise<void>;
|
|
446
|
+
stop(): Promise<void>;
|
|
434
447
|
/**
|
|
435
448
|
* Starts a built-in HTTP server that receives webhook updates.
|
|
436
449
|
*/
|
|
@@ -453,6 +466,7 @@ declare class RiseonlyBot extends ApiClient {
|
|
|
453
466
|
answer(query: CallbackQuery, text?: string, showAlert?: boolean): Promise<boolean>;
|
|
454
467
|
private pollLoop;
|
|
455
468
|
private emit;
|
|
469
|
+
private emitError;
|
|
456
470
|
}
|
|
457
471
|
|
|
458
472
|
declare class RiseonlyError extends Error {
|
|
@@ -475,6 +489,14 @@ declare class RiseonlyNetworkError extends RiseonlyError {
|
|
|
475
489
|
declare class RiseonlyTimeoutError extends RiseonlyNetworkError {
|
|
476
490
|
constructor(message?: string);
|
|
477
491
|
}
|
|
492
|
+
declare class RiseonlyAbortError extends RiseonlyNetworkError {
|
|
493
|
+
constructor(message?: string, cause?: unknown);
|
|
494
|
+
}
|
|
495
|
+
declare class RiseonlyResponseError extends RiseonlyNetworkError {
|
|
496
|
+
readonly status: number;
|
|
497
|
+
readonly body?: string;
|
|
498
|
+
constructor(message: string, status: number, body?: string);
|
|
499
|
+
}
|
|
478
500
|
|
|
479
501
|
interface WebhookRequest {
|
|
480
502
|
headers: Record<string, string | string[] | undefined>;
|
|
@@ -532,4 +554,4 @@ declare function extractInitDataFromLaunchUrl(launchUrl: string): string | null;
|
|
|
532
554
|
*/
|
|
533
555
|
declare function createRequestId(): string;
|
|
534
556
|
|
|
535
|
-
export { type AnswerCallbackQueryOptions, ApiClient, type ApiEnvelope, type ApiErrorResponse, type ApiResponse, type BotCommand, type BotEvent, type BotEventMap, type BotOptions, CANONICAL_API_PREFIX, CHAT_ACTIONS, COMMAND_SCOPES, type CallbackQuery, type CallbackQueryHandler, type Capabilities, type Chat, type ClientOptions, DEFAULT_API_BASE, type DeleteMessageOptions, type DeleteMyCommandsOptions, type DeleteWebhookOptions, type EditMessageTextOptions, type EditedMessageHandler, type ErrorHandler, type ForceReply, type ForwardOrigin, type GetChatOptions, type GetMyCommandsOptions, type GetUpdatesOptions, IDEMPOTENCY_HEADER, type InlineKeyboardButton, type InlineKeyboardMarkup, type MediaFile, type MediaInput, type MediaVariant, type Message, type MessageEntity, type MessageHandler, type PollingErrorHandler, type PollingOptions, type ReactionCount, type ReplyKeyboardButton, type ReplyKeyboardMarkup, type ReplyKeyboardRemove, type ReplyMarkup, type RequestOptions, RiseonlyBot, RiseonlyError, RiseonlyNetworkError, RiseonlyTimeoutError, SUPPORTED_METHODS, type SendChatActionOptions, type SendMediaOptions, type SendMessageOptions, type SetMyCommandsOptions, type SetWebhookOptions, type SetWebhookResult, UPDATE_TYPES, type Update, type UpdateHandler, type User, WEBHOOK_SECRET_HEADER, type WebAppData, type WebAppInfo, type WebhookInfo, type WebhookServerOptions, buildInitDataCheckString, createRequestId, createWebhookHandler, deriveInitDataSecret, extractInitDataFromLaunchUrl, parseInitData, parseWebhookUpdate, signInitData, verifyInitData, verifyWebhookSecret };
|
|
557
|
+
export { type AnswerCallbackQueryOptions, ApiClient, type ApiEnvelope, type ApiErrorResponse, type ApiResponse, type BotCommand, type BotEvent, type BotEventMap, type BotOptions, type BotSetupOptions, CANONICAL_API_PREFIX, CHAT_ACTIONS, COMMAND_SCOPES, type CallbackQuery, type CallbackQueryHandler, type Capabilities, type Chat, type ClientOptions, DEFAULT_API_BASE, type DeleteMessageOptions, type DeleteMyCommandsOptions, type DeleteWebhookOptions, type EditMessageTextOptions, type EditedMessageHandler, type ErrorHandler, type ForceReply, type ForwardOrigin, type GetChatOptions, type GetMyCommandsOptions, type GetUpdatesOptions, IDEMPOTENCY_HEADER, type InlineKeyboardButton, type InlineKeyboardMarkup, type MediaFile, type MediaInput, type MediaReference, type MediaVariant, type Message, type MessageEntity, type MessageHandler, type PollingErrorHandler, type PollingOptions, type ReactionCount, type ReplyKeyboardButton, type ReplyKeyboardMarkup, type ReplyKeyboardRemove, type ReplyMarkup, type RequestOptions, RiseonlyAbortError, RiseonlyBot, RiseonlyError, RiseonlyNetworkError, RiseonlyResponseError, RiseonlyTimeoutError, SUPPORTED_METHODS, type SendChatActionOptions, type SendMediaOptions, type SendMessageOptions, type SetMyCommandsOptions, type SetWebhookOptions, type SetWebhookResult, type TextHandler, UPDATE_TYPES, type Update, type UpdateHandler, type User, WEBHOOK_SECRET_HEADER, type WebAppData, type WebAppInfo, type WebhookInfo, type WebhookServerOptions, buildInitDataCheckString, createRequestId, createWebhookHandler, deriveInitDataSecret, extractInitDataFromLaunchUrl, parseInitData, parseWebhookUpdate, signInitData, verifyInitData, verifyWebhookSecret };
|