@sendora/sdk 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +364 -0
- package/dist/base64.d.ts +3 -0
- package/dist/base64.d.ts.map +1 -0
- package/dist/base64.js +17 -0
- package/dist/base64.js.map +1 -0
- package/dist/broadcasts.d.ts +60 -0
- package/dist/broadcasts.d.ts.map +1 -0
- package/dist/broadcasts.js +98 -0
- package/dist/broadcasts.js.map +1 -0
- package/dist/client.d.ts +51 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +69 -0
- package/dist/client.js.map +1 -0
- package/dist/domains.d.ts +34 -0
- package/dist/domains.d.ts.map +1 -0
- package/dist/domains.js +70 -0
- package/dist/domains.js.map +1 -0
- package/dist/email.d.ts +40 -0
- package/dist/email.d.ts.map +1 -0
- package/dist/email.js +68 -0
- package/dist/email.js.map +1 -0
- package/dist/error.d.ts +67 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/error.js +173 -0
- package/dist/error.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/messages.d.ts +37 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +68 -0
- package/dist/messages.js.map +1 -0
- package/dist/pagination.d.ts +3 -0
- package/dist/pagination.d.ts.map +1 -0
- package/dist/pagination.js +14 -0
- package/dist/pagination.js.map +1 -0
- package/dist/retry.d.ts +6 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +14 -0
- package/dist/retry.js.map +1 -0
- package/dist/streams.d.ts +45 -0
- package/dist/streams.d.ts.map +1 -0
- package/dist/streams.js +82 -0
- package/dist/streams.js.map +1 -0
- package/dist/suppressions.d.ts +37 -0
- package/dist/suppressions.d.ts.map +1 -0
- package/dist/suppressions.js +56 -0
- package/dist/suppressions.js.map +1 -0
- package/dist/tokens.d.ts +28 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +57 -0
- package/dist/tokens.js.map +1 -0
- package/dist/transport.d.ts +34 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +146 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +802 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/dist/webhook-verify.d.ts +33 -0
- package/dist/webhook-verify.d.ts.map +1 -0
- package/dist/webhook-verify.js +115 -0
- package/dist/webhook-verify.js.map +1 -0
- package/dist/webhooks.d.ts +63 -0
- package/dist/webhooks.d.ts.map +1 -0
- package/dist/webhooks.js +118 -0
- package/dist/webhooks.js.map +1 -0
- package/package.json +49 -0
- package/skills/sendora/SKILL.md +86 -0
- package/src/base64.ts +17 -0
- package/src/broadcasts.ts +115 -0
- package/src/client.ts +88 -0
- package/src/domains.ts +84 -0
- package/src/email.ts +83 -0
- package/src/error.ts +252 -0
- package/src/index.ts +16 -0
- package/src/messages.ts +88 -0
- package/src/pagination.ts +18 -0
- package/src/retry.ts +20 -0
- package/src/streams.ts +100 -0
- package/src/suppressions.ts +73 -0
- package/src/tokens.ts +70 -0
- package/src/transport.ts +179 -0
- package/src/types.ts +848 -0
- package/src/version.ts +2 -0
- package/src/webhook-verify.ts +147 -0
- package/src/webhooks.ts +157 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAClC;AAED,4BAA4B;AAC5B,MAAM,WAAW,WAAY,SAAQ,cAAc;IACjD;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,8GAA8G;AAC9G,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CAAE,CAAC;AAEnF,6GAA6G;AAC7G,MAAM,WAAW,UAAU;IACzB,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,OAAO,EAAE,UAAU,GAAG,MAAM,CAAC;IAC7B,wGAAwG;IACxG,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACvC;AAED,6DAA6D;AAC7D,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACvC;AAED,oDAAoD;AACpD,MAAM,WAAW,eAAe;IAC9B,+EAA+E;IAC/E,IAAI,EAAE,OAAO,CAAC;IACd,mGAAmG;IACnG,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,oDAAoD;IACpD,EAAE,EAAE,OAAO,EAAE,CAAC;IACd,+CAA+C;IAC/C,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;IAC3B,+BAA+B;IAC/B,GAAG,CAAC,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;IAC5B,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,yGAAyG;IACzG,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7C,gFAAgF;IAChF,WAAW,CAAC,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC;IACvC,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAChC,sFAAsF;IACtF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CAC/C;AAED,iFAAiF;AACjF,MAAM,MAAM,gBAAgB,GAAG,eAAe,GAC5C,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC,CAAC;AAE9F,oEAAoE;AACpE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,EAAE,EAAE,OAAO,EAAE,CAAC;IACd,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;IAC3B,GAAG,CAAC,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7C,WAAW,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAC9C,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CAC/C;AAED,qHAAqH;AACrH,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,sCAAsC;AACtC,MAAM,WAAW,eAAe;IAC9B,iFAAiF;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,gBAAgB,GAAG,QAAQ,GAAG,aAAa,CAAC;AAE5F,4EAA4E;AAC5E,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,gCAAgC;AAChC,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE7C,yHAAyH;AACzH,MAAM,MAAM,eAAe,GACvB;IACE,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,QAAQ,EAAE,OAAO,CAAC;CACnB,GACD;IACE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,iBAAiB,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B,GACD;IAAE,KAAK,EAAE,0BAA0B,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACtF;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC9E;IAAE,KAAK,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC7E;IAAE,KAAK,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC3E;IAAE,KAAK,EAAE,qBAAqB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACjF;IAAE,KAAK,EAAE,uBAAuB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACnF;IAAE,KAAK,EAAE,iCAAiC,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC7F;IAAE,KAAK,EAAE,2BAA2B,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACvF;IACE,KAAK,EAAE,sBAAsB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,mBAAmB,EAAE,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CACjB,GACD;IAAE,KAAK,EAAE,0BAA0B,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACtF;IACE,KAAK,EAAE,cAAc,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CACjB,GACD;IACE,KAAK,EAAE,qBAAqB,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CACjB,GACD;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC9E;IAAE,KAAK,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC3E;IAAE,KAAK,EAAE,mBAAmB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC/E;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAEnF,8FAA8F;AAC9F,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED,6FAA6F;AAC7F,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE/D,mFAAmF;AACnF,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAE1F,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;AAEhD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,qCAAqC;AACrC,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,gBAAgB,EAAE,CAAC;CAChC;AAED,2JAA2J;AAC3J,MAAM,MAAM,gBAAgB,GACxB,WAAW,GACX,UAAU,GACV,QAAQ,GACR,kBAAkB,GAClB,YAAY,GACZ,aAAa,GACb,KAAK,GACL,UAAU,GACV,aAAa,GACb,yBAAyB,GACzB,WAAW,GACX,SAAS,CAAC;AAEd,wCAAwC;AACxC,MAAM,WAAW,YAAY;IAC3B,sFAAsF;IACtF,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,gBAAgB,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,kDAAkD;IAClD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,oCAAoC;IACpC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,6DAA6D;IAC7D,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,4EAA4E;AAC5E,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,uFAAuF;AACvF,MAAM,WAAW,aAAc,SAAQ,OAAO;IAC5C,WAAW,EAAE,iBAAiB,EAAE,CAAC;IACjC,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,wGAAwG;AACxG,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACrC,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,4CAA4C;IAC5C,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED,6FAA6F;AAC7F,MAAM,WAAW,aAAa;IAC5B,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACrC,uCAAuC;IACvC,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;IACjC,kCAAkC;IAClC,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;IAC/B,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED,iDAAiD;AACjD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,6CAA6C;AAC7C,MAAM,WAAW,SAAS;IACxB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED,iEAAiE;AACjE,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD,sFAAsF;IACtF,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED,4DAA4D;AAC5D,MAAM,WAAW,WAAW;IAC1B,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,+FAA+F;IAC/F,MAAM,EAAE,iBAAiB,CAAC;IAC1B,yDAAyD;IACzD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,sDAAsD;AACtD,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,mDAAmD;AACnD,MAAM,WAAW,wBAAwB;IACvC,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,sFAAsF;IACtF,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED,oJAAoJ;AACpJ,MAAM,MAAM,UAAU,GAAG,eAAe,GAAG,WAAW,GAAG,SAAS,CAAC;AAEnE,8IAA8I;AAC9I,MAAM,WAAW,MAAM;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,qFAAqF;IACrF,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,mHAAmH;IACnH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gGAAgG;IAChG,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,mIAAmI;IACnI,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,uCAAuC;AACvC,MAAM,WAAW,mBAAmB;IAClC,0GAA0G;IAC1G,IAAI,EAAE,UAAU,CAAC;IACjB,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,sGAAsG;AACtG,MAAM,WAAW,mBAAmB;IAClC,2BAA2B;IAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,0FAA0F;IAC1F,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CAClD;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,iKAAiK;AACjK,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,WAAW,CAAC;AAEpF,iGAAiG;AACjG,MAAM,WAAW,qBAAqB;IACpC,oEAAoE;IACpE,EAAE,EAAE,OAAO,EAAE,CAAC;IACd,+CAA+C;IAC/C,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;IAC3B,+BAA+B;IAC/B,GAAG,CAAC,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;IAC5B,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC9C,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7C,8IAA8I;IAC9I,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CACpD;AAED,sDAAsD;AACtD,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,IAAI,EAAE,OAAO,CAAC;IACd,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,qHAAqH;IACrH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7C,gGAAgG;IAChG,WAAW,CAAC,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC;IACvC,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAChC,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC9C,gGAAgG;IAChG,QAAQ,EAAE,qBAAqB,EAAE,CAAC;CACnC;AAED,6IAA6I;AAC7I,MAAM,MAAM,oBAAoB,GAAG,mBAAmB,GACpD,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC,CAAC;AAE9F,yEAAyE;AACzE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7C,WAAW,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAC9C,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC9C,QAAQ,EAAE,qBAAqB,EAAE,CAAC;CACnC;AAED,yEAAyE;AACzE,MAAM,WAAW,iBAAiB;IAChC,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,2CAA2C;AAC3C,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,eAAe,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC;IACf,qFAAqF;IACrF,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,oCAAoC;AACpC,MAAM,MAAM,aAAa,GAAG,SAAS,CAAC;AAEtC,sCAAsC;AACtC,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,yEAAyE;AACzE,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,6DAA6D;AAC7D,MAAM,WAAW,YAAa,SAAQ,KAAK;IACzC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,wCAAwC;AACxC,MAAM,MAAM,gBAAgB,GACxB,WAAW,GACX,SAAS,GACT,UAAU,GACV,gBAAgB,GAChB,cAAc,GACd,aAAa,GACb,aAAa,GACb,SAAS,CAAC;AAEd,wCAAwC;AACxC,MAAM,WAAW,oBAAoB;IACnC,wEAAwE;IACxE,GAAG,EAAE,MAAM,CAAC;IACZ,wDAAwD;IACxD,MAAM,CAAC,EAAE,gBAAgB,EAAE,GAAG,SAAS,CAAC;IACxC,uHAAuH;IACvH,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,8JAA8J;IAC9J,cAAc,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;CAC7C;AAED,wDAAwD;AACxD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,WAAW,CAAC;AAElD,+BAA+B;AAC/B,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gFAAgF;IAChF,OAAO,EAAE,OAAO,CAAC;IACjB,4FAA4F;IAC5F,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wEAAwE;AACxE,MAAM,WAAW,cAAe,SAAQ,OAAO;IAC7C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,iFAAiF;AACjF,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,CAAC;AAE9D,MAAM,WAAW,aAAc,SAAQ,SAAS;IAC9C,MAAM,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;CACrC;AAED,uFAAuF;AACvF,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,gBAAgB,CAAC;IACxB,2DAA2D;IAC3D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,kDAAkD;IAClD,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gDAAgD;IAChD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wDAAwD;AACxD,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,wCAAwC;AACxC,MAAM,WAAW,cAAc;IAC7B,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,uCAAuC;AACvC,MAAM,WAAW,mBAAmB;IAClC,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,kEAAkE;AAClE,MAAM,WAAW,SAAS,CAAC,IAAI,SAAS,OAAO,GAAG,KAAK;IACrD,IAAI,EAAE,IAAI,CAAC;IACX,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,qDAAqD;AACrD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,wDAAwD;IACxD,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAC/B,kCAAkC;IAClC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;CACxB;AAED,oGAAoG;AACpG,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;AAEtE,yEAAyE;AACzE,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,KAAK,EAAE;QAAE,UAAU,EAAE,WAAW,CAAC;QAAC,IAAI,EAAE,WAAW,CAAA;KAAE,CAAC;CACvD;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,gDAAgD;AAChD,MAAM,WAAW,kBAAkB;IACjC,oFAAoF;IACpF,EAAE,EAAE,MAAM,CAAC;IACX,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,sDAAsD;IACtD,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,2DAA2D;AAC3D,MAAM,WAAW,cAAe,SAAQ,kBAAkB;IACxD,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE;QACP,kDAAkD;QAClD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,oCAAoC;QACpC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;KACzB,CAAC;CACH;AAED,8GAA8G;AAC9G,MAAM,WAAW,YAAa,SAAQ,kBAAkB;IACtD,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,+DAA+D;QAC/D,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,4DAA4D;QAC5D,IAAI,EAAE,OAAO,CAAC;QACd,wFAAwF;QACxF,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;CACH;AAED,mEAAmE;AACnE,MAAM,WAAW,aAAc,SAAQ,kBAAkB;IACvD,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;KACzB,CAAC;CACH;AAED,+FAA+F;AAC/F,MAAM,WAAW,kBAAmB,SAAQ,kBAAkB;IAC5D,KAAK,EAAE,gBAAgB,CAAC;IACxB,OAAO,EAAE;QACP,8DAA8D;QAC9D,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;KAC7B,CAAC;CACH;AAED,wIAAwI;AACxI,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;IAC3D,KAAK,EAAE,cAAc,CAAC;IACtB,OAAO,EAAE;QACP,6EAA6E;QAC7E,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC;KAC9B,CAAC;CACH;AAED,oCAAoC;AACpC,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,uBAAuB;IACvB,KAAK,EAAE,UAAU,CAAC;IAClB,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,6CAA6C;AAC7C,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,KAAK,EAAE,aAAa,CAAC;CACtB;AAED,6DAA6D;AAC7D,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,KAAK,EAAE,aAAa,CAAC;CACtB;AAED,MAAM,MAAM,UAAU,GACpB,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;AAC9F,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;AAC7F,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,YAAY,GAAG,QAAQ,CAAC;AAC3D,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;AAEhE,qHAAqH;AACrH,MAAM,WAAW,qBAAqB;IACpC,wCAAwC;IACxC,GAAG,EAAE,UAAU,CAAC;IAChB,wDAAwD;IACxD,OAAO,EAAE,UAAU,CAAC;IACpB,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,WAAW,CAAC;IACnB,sEAAsE;IACtE,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,GAAG,EAAE,UAAU,CAAC;IAChB,iDAAiD;IACjD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,8DAA8D;AAC9D,MAAM,WAAW,iBAAiB;IAChC,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,+EAA+E;AAC/E,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sFAAsF;IACtF,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,qBAAqB,CAAC;IACtC,kFAAkF;IAClF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,6EAA6E;AAC7E,MAAM,WAAW,mBAAmB;IAClC,qFAAqF;IACrF,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IAC3C,IAAI,EAAE,cAAc,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,wDAAwD;IACxD,EAAE,EAAE,cAAc,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,cAAc,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,uEAAuE;IACvE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,mEAAmE;IACnE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,6DAA6D;IAC7D,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,iBAAiB,EAAE,CAAC;IACjC,+IAA+I;IAC/I,cAAc,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC;CAChD;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,kBAAkB,GAC3C,CAAC,mBAAmB,GAAG;IAAE,cAAc,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC;AAEzD,wEAAwE;AACxE,MAAM,MAAM,YAAY,GACpB,cAAc,GACd,YAAY,GACZ,aAAa,GACb,kBAAkB,GAClB,iBAAiB,GACjB,eAAe,GACf,eAAe,GACf,YAAY,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,eAAO,MAAM,WAAW,UAAU,CAAC"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { WebhookEvent } from './types.ts';
|
|
2
|
+
export interface VerifyWebhookInput {
|
|
3
|
+
/** The signing secret the webhook was created with; `undefined`, as an unset environment variable gives, throws. */
|
|
4
|
+
secret: string | undefined;
|
|
5
|
+
/** The Sendora-Signature header as received. */
|
|
6
|
+
signature: string | null | undefined;
|
|
7
|
+
/** The raw request body exactly as received; parse nothing before verifying. */
|
|
8
|
+
body: string | Uint8Array;
|
|
9
|
+
/** How old a signature may be, in seconds; five minutes by default. */
|
|
10
|
+
toleranceSeconds?: number | undefined;
|
|
11
|
+
/** The current time in seconds since the epoch; tests pin it. */
|
|
12
|
+
now?: number | undefined;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Checks a webhook request came from Sendora and answers its event, typed
|
|
16
|
+
* by `event`. The header is `Sendora-Signature: t=<unix seconds>,v1=<hex>`,
|
|
17
|
+
* the hex an HMAC-SHA256 with your secret over `<t>.<raw body>`; the
|
|
18
|
+
* timestamp is inside the signed text, so a captured request cannot be
|
|
19
|
+
* replayed after the tolerance. Throws `SendoraError` with
|
|
20
|
+
* `invalid_signature` or `stale_signature`.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* const event = await verifyWebhook({
|
|
24
|
+
* secret: process.env.SENDORA_WEBHOOK_SECRET,
|
|
25
|
+
* signature: req.headers['sendora-signature'],
|
|
26
|
+
* body: rawBody,
|
|
27
|
+
* });
|
|
28
|
+
* if (event.event === 'bounced' && event.details.hard) {
|
|
29
|
+
* await markUndeliverable(event.recipient);
|
|
30
|
+
* }
|
|
31
|
+
*/
|
|
32
|
+
export declare function verifyWebhook(input: VerifyWebhookInput): Promise<WebhookEvent>;
|
|
33
|
+
//# sourceMappingURL=webhook-verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-verify.d.ts","sourceRoot":"","sources":["../src/webhook-verify.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,YAAY,CAAC;AAEjE,MAAM,WAAW,kBAAkB;IACjC,oHAAoH;IACpH,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,gDAAgD;IAChD,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACrC,gFAAgF;IAChF,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAC1B,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;AAmBD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CA2BpF"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { SendoraError } from "./error.js";
|
|
2
|
+
const DEFAULT_TOLERANCE_SECONDS = 300;
|
|
3
|
+
const MAC_HEX = /^[0-9a-f]{64}$/i;
|
|
4
|
+
const eventNames = new Set([
|
|
5
|
+
'delivered',
|
|
6
|
+
'bounced',
|
|
7
|
+
'deferred',
|
|
8
|
+
'spam_complaint',
|
|
9
|
+
'unsubscribed',
|
|
10
|
+
'cap_warning',
|
|
11
|
+
'cap_reached',
|
|
12
|
+
'inbound',
|
|
13
|
+
]);
|
|
14
|
+
const encoder = new TextEncoder();
|
|
15
|
+
const decoder = new TextDecoder();
|
|
16
|
+
/**
|
|
17
|
+
* Checks a webhook request came from Sendora and answers its event, typed
|
|
18
|
+
* by `event`. The header is `Sendora-Signature: t=<unix seconds>,v1=<hex>`,
|
|
19
|
+
* the hex an HMAC-SHA256 with your secret over `<t>.<raw body>`; the
|
|
20
|
+
* timestamp is inside the signed text, so a captured request cannot be
|
|
21
|
+
* replayed after the tolerance. Throws `SendoraError` with
|
|
22
|
+
* `invalid_signature` or `stale_signature`.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* const event = await verifyWebhook({
|
|
26
|
+
* secret: process.env.SENDORA_WEBHOOK_SECRET,
|
|
27
|
+
* signature: req.headers['sendora-signature'],
|
|
28
|
+
* body: rawBody,
|
|
29
|
+
* });
|
|
30
|
+
* if (event.event === 'bounced' && event.details.hard) {
|
|
31
|
+
* await markUndeliverable(event.recipient);
|
|
32
|
+
* }
|
|
33
|
+
*/
|
|
34
|
+
export async function verifyWebhook(input) {
|
|
35
|
+
if (input.secret === undefined || input.secret === '') {
|
|
36
|
+
throw new TypeError('verifyWebhook needs the signing secret the webhook was created with.');
|
|
37
|
+
}
|
|
38
|
+
const signature = parseSignature(input.signature);
|
|
39
|
+
const now = input.now ?? Math.floor(Date.now() / 1000);
|
|
40
|
+
const age = Math.abs(now - signature.timestamp);
|
|
41
|
+
if (age > (input.toleranceSeconds ?? DEFAULT_TOLERANCE_SECONDS)) {
|
|
42
|
+
throw new SendoraError({
|
|
43
|
+
code: 'stale_signature',
|
|
44
|
+
status: null,
|
|
45
|
+
message: `The signature is ${String(age)} seconds old, more than the tolerance allows.`,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const body = typeof input.body === 'string' ? encoder.encode(input.body) : input.body;
|
|
49
|
+
const signed = concat(encoder.encode(`${String(signature.timestamp)}.`), body);
|
|
50
|
+
const key = await crypto.subtle.importKey('raw', encoder.encode(input.secret), { name: 'HMAC', hash: 'SHA-256' }, false, ['verify']);
|
|
51
|
+
if (!(await crypto.subtle.verify('HMAC', key, signature.mac, signed))) {
|
|
52
|
+
throw invalidSignature('The signature does not match the body.');
|
|
53
|
+
}
|
|
54
|
+
return parseEvent(decoder.decode(body));
|
|
55
|
+
}
|
|
56
|
+
function parseSignature(header) {
|
|
57
|
+
if (typeof header !== 'string' || header === '') {
|
|
58
|
+
throw invalidSignature('The request carries no Sendora-Signature header.');
|
|
59
|
+
}
|
|
60
|
+
const parts = new Map();
|
|
61
|
+
for (const part of header.split(',')) {
|
|
62
|
+
const separator = part.indexOf('=');
|
|
63
|
+
if (separator > 0) {
|
|
64
|
+
parts.set(part.slice(0, separator).trim(), part.slice(separator + 1).trim());
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const timestamp = Number(parts.get('t'));
|
|
68
|
+
const hex = parts.get('v1');
|
|
69
|
+
if (!Number.isInteger(timestamp) || hex === undefined || !MAC_HEX.test(hex)) {
|
|
70
|
+
throw invalidSignature('The Sendora-Signature header is malformed.');
|
|
71
|
+
}
|
|
72
|
+
const mac = new Uint8Array(hex.length / 2);
|
|
73
|
+
for (let i = 0; i < mac.length; i += 1) {
|
|
74
|
+
mac[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);
|
|
75
|
+
}
|
|
76
|
+
return { timestamp, mac };
|
|
77
|
+
}
|
|
78
|
+
function parseEvent(text) {
|
|
79
|
+
let value;
|
|
80
|
+
try {
|
|
81
|
+
value = JSON.parse(text);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
throw unknownEvent();
|
|
85
|
+
}
|
|
86
|
+
if (typeof value !== 'object' ||
|
|
87
|
+
value === null ||
|
|
88
|
+
!('event' in value) ||
|
|
89
|
+
typeof value.event !== 'string' ||
|
|
90
|
+
!eventNames.has(value.event) ||
|
|
91
|
+
!('id' in value) ||
|
|
92
|
+
typeof value.id !== 'string' ||
|
|
93
|
+
!('attempt' in value) ||
|
|
94
|
+
typeof value.attempt !== 'number') {
|
|
95
|
+
throw unknownEvent();
|
|
96
|
+
}
|
|
97
|
+
return value;
|
|
98
|
+
}
|
|
99
|
+
function invalidSignature(message) {
|
|
100
|
+
return new SendoraError({ code: 'invalid_signature', status: null, message });
|
|
101
|
+
}
|
|
102
|
+
function unknownEvent() {
|
|
103
|
+
return new SendoraError({
|
|
104
|
+
code: 'unexpected_response',
|
|
105
|
+
status: null,
|
|
106
|
+
message: 'The body is signed but is not an event this SDK knows.',
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
function concat(head, tail) {
|
|
110
|
+
const joined = new Uint8Array(head.length + tail.length);
|
|
111
|
+
joined.set(head, 0);
|
|
112
|
+
joined.set(tail, head.length);
|
|
113
|
+
return joined;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=webhook-verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-verify.js","sourceRoot":"","sources":["../src/webhook-verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { Transport } from './transport.ts';
|
|
2
|
+
import type { CreatedWebhook, CreateWebhookRequest, Delivery, DeliveryPage, DeliveryQuery, ReceiveOptions, RequestOptions, Webhook, WebhookEvent, WebhookList } from './types.ts';
|
|
3
|
+
/** Where the server's events are posted, every delivery of them, and the receiving side. */
|
|
4
|
+
export declare class WebhooksResource {
|
|
5
|
+
#private;
|
|
6
|
+
constructor(transport: Transport);
|
|
7
|
+
/**
|
|
8
|
+
* Registers an https URL on a public host to receive events, all of them
|
|
9
|
+
* unless `events` narrows it, from every stream unless `streamId` limits
|
|
10
|
+
* it to one. The answer carries the signing `secret` once; keep it
|
|
11
|
+
* beside the token and hand it to `receive` or `verifyWebhook`.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* const { secret } = await sendora.webhooks.create({
|
|
15
|
+
* url: 'https://example.se/hooks/sendora',
|
|
16
|
+
* events: ['delivered', 'bounced', 'spam_complaint'],
|
|
17
|
+
* });
|
|
18
|
+
*/
|
|
19
|
+
create(request: CreateWebhookRequest, options?: RequestOptions): Promise<CreatedWebhook>;
|
|
20
|
+
/** Every webhook of the server. */
|
|
21
|
+
list(options?: RequestOptions): Promise<WebhookList>;
|
|
22
|
+
/** One webhook by id. */
|
|
23
|
+
get(webhookId: string, options?: RequestOptions): Promise<Webhook>;
|
|
24
|
+
/** Removes the webhook; deliveries still pending are dropped with it. */
|
|
25
|
+
delete(webhookId: string, options?: RequestOptions): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* One page of the events handed to the webhook, newest first, with the
|
|
28
|
+
* outcome of the last attempt; `status` narrows to `pending`,
|
|
29
|
+
* `delivered` or `dead`.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* const { deliveries } = await sendora.webhooks.deliveries(webhookId, { status: 'dead' });
|
|
33
|
+
*/
|
|
34
|
+
deliveries(webhookId: string, query?: DeliveryQuery, options?: RequestOptions): Promise<DeliveryPage>;
|
|
35
|
+
/** Every delivery the query matches, page by page, for `for await`. */
|
|
36
|
+
deliveriesAll(webhookId: string, query?: DeliveryQuery, options?: RequestOptions): AsyncIterable<Delivery>;
|
|
37
|
+
/**
|
|
38
|
+
* Queues a delivery again, whatever its state, with the same payload.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* for await (const dead of sendora.webhooks.deliveriesAll(webhookId, { status: 'dead' })) {
|
|
42
|
+
* await sendora.webhooks.replay(webhookId, dead.deliveryId);
|
|
43
|
+
* }
|
|
44
|
+
*/
|
|
45
|
+
replay(webhookId: string, deliveryId: string, options?: RequestOptions): Promise<Delivery>;
|
|
46
|
+
/**
|
|
47
|
+
* The receiving side for any framework that hands you a Fetch `Request`
|
|
48
|
+
* (Next.js route handlers, Hono, SvelteKit, Cloudflare Workers): reads the
|
|
49
|
+
* raw body, verifies the signature with the webhook's secret and answers
|
|
50
|
+
* the typed event. For Express or Fastify, pass the raw body to
|
|
51
|
+
* `verifyWebhook` instead. Answer 2xx quickly and do the work afterwards;
|
|
52
|
+
* deliveries arrive at least once, so key your handling on `event.id`.
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* export async function POST(request: Request) {
|
|
56
|
+
* const event = await sendora.webhooks.receive(request, process.env.SENDORA_WEBHOOK_SECRET);
|
|
57
|
+
* await queue.push(event);
|
|
58
|
+
* return new Response(null, { status: 204 });
|
|
59
|
+
* }
|
|
60
|
+
*/
|
|
61
|
+
receive(request: Request, secret: string | undefined, options?: ReceiveOptions): Promise<WebhookEvent>;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=webhooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,cAAc,EACd,cAAc,EACd,OAAO,EACP,YAAY,EACZ,WAAW,EACZ,MAAM,YAAY,CAAC;AAGpB,4FAA4F;AAC5F,qBAAa,gBAAgB;;gBAGf,SAAS,EAAE,SAAS;IAIhC;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,OAAO,EAAE,oBAAoB,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,cAAc,CAAC;IAU5F,mCAAmC;IACnC,IAAI,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,WAAW,CAAC;IASxD,yBAAyB;IACzB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IAStE,yEAAyE;IACzE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAStE;;;;;;;OAOG;IACH,UAAU,CACR,SAAS,EAAE,MAAM,EACjB,KAAK,GAAE,aAAkB,EACzB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,YAAY,CAAC;IAUxB,uEAAuE;IACvE,aAAa,CACX,SAAS,EAAE,MAAM,EACjB,KAAK,GAAE,aAAkB,EACzB,OAAO,GAAE,cAAmB,GAC3B,aAAa,CAAC,QAAQ,CAAC;IAS1B;;;;;;;OAOG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAS9F;;;;;;;;;;;;;;OAcG;IACG,OAAO,CACX,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,YAAY,CAAC;CAQzB"}
|
package/dist/webhooks.js
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { paginate } from "./pagination.js";
|
|
2
|
+
import { verifyWebhook } from "./webhook-verify.js";
|
|
3
|
+
/** Where the server's events are posted, every delivery of them, and the receiving side. */
|
|
4
|
+
export class WebhooksResource {
|
|
5
|
+
#transport;
|
|
6
|
+
constructor(transport) {
|
|
7
|
+
this.#transport = transport;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Registers an https URL on a public host to receive events, all of them
|
|
11
|
+
* unless `events` narrows it, from every stream unless `streamId` limits
|
|
12
|
+
* it to one. The answer carries the signing `secret` once; keep it
|
|
13
|
+
* beside the token and hand it to `receive` or `verifyWebhook`.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* const { secret } = await sendora.webhooks.create({
|
|
17
|
+
* url: 'https://example.se/hooks/sendora',
|
|
18
|
+
* events: ['delivered', 'bounced', 'spam_complaint'],
|
|
19
|
+
* });
|
|
20
|
+
*/
|
|
21
|
+
create(request, options = {}) {
|
|
22
|
+
return this.#transport.request({
|
|
23
|
+
method: 'POST',
|
|
24
|
+
path: '/v1/webhooks',
|
|
25
|
+
body: request,
|
|
26
|
+
idempotent: false,
|
|
27
|
+
signal: options.signal,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/** Every webhook of the server. */
|
|
31
|
+
list(options = {}) {
|
|
32
|
+
return this.#transport.request({
|
|
33
|
+
method: 'GET',
|
|
34
|
+
path: '/v1/webhooks',
|
|
35
|
+
idempotent: true,
|
|
36
|
+
signal: options.signal,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
/** One webhook by id. */
|
|
40
|
+
get(webhookId, options = {}) {
|
|
41
|
+
return this.#transport.request({
|
|
42
|
+
method: 'GET',
|
|
43
|
+
path: `/v1/webhooks/${encodeURIComponent(webhookId)}`,
|
|
44
|
+
idempotent: true,
|
|
45
|
+
signal: options.signal,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/** Removes the webhook; deliveries still pending are dropped with it. */
|
|
49
|
+
delete(webhookId, options = {}) {
|
|
50
|
+
return this.#transport.request({
|
|
51
|
+
method: 'DELETE',
|
|
52
|
+
path: `/v1/webhooks/${encodeURIComponent(webhookId)}`,
|
|
53
|
+
idempotent: true,
|
|
54
|
+
signal: options.signal,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* One page of the events handed to the webhook, newest first, with the
|
|
59
|
+
* outcome of the last attempt; `status` narrows to `pending`,
|
|
60
|
+
* `delivered` or `dead`.
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* const { deliveries } = await sendora.webhooks.deliveries(webhookId, { status: 'dead' });
|
|
64
|
+
*/
|
|
65
|
+
deliveries(webhookId, query = {}, options = {}) {
|
|
66
|
+
return this.#transport.request({
|
|
67
|
+
method: 'GET',
|
|
68
|
+
path: `/v1/webhooks/${encodeURIComponent(webhookId)}/deliveries`,
|
|
69
|
+
query: { limit: query.limit, after: query.after, status: query.status },
|
|
70
|
+
idempotent: true,
|
|
71
|
+
signal: options.signal,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
/** Every delivery the query matches, page by page, for `for await`. */
|
|
75
|
+
deliveriesAll(webhookId, query = {}, options = {}) {
|
|
76
|
+
return paginate((after) => this.deliveries(webhookId, { ...query, after }, options), (page) => page.deliveries, (page) => page.next, query.after);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Queues a delivery again, whatever its state, with the same payload.
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* for await (const dead of sendora.webhooks.deliveriesAll(webhookId, { status: 'dead' })) {
|
|
83
|
+
* await sendora.webhooks.replay(webhookId, dead.deliveryId);
|
|
84
|
+
* }
|
|
85
|
+
*/
|
|
86
|
+
replay(webhookId, deliveryId, options = {}) {
|
|
87
|
+
return this.#transport.request({
|
|
88
|
+
method: 'POST',
|
|
89
|
+
path: `/v1/webhooks/${encodeURIComponent(webhookId)}/deliveries/${encodeURIComponent(deliveryId)}/replay`,
|
|
90
|
+
idempotent: false,
|
|
91
|
+
signal: options.signal,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* The receiving side for any framework that hands you a Fetch `Request`
|
|
96
|
+
* (Next.js route handlers, Hono, SvelteKit, Cloudflare Workers): reads the
|
|
97
|
+
* raw body, verifies the signature with the webhook's secret and answers
|
|
98
|
+
* the typed event. For Express or Fastify, pass the raw body to
|
|
99
|
+
* `verifyWebhook` instead. Answer 2xx quickly and do the work afterwards;
|
|
100
|
+
* deliveries arrive at least once, so key your handling on `event.id`.
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* export async function POST(request: Request) {
|
|
104
|
+
* const event = await sendora.webhooks.receive(request, process.env.SENDORA_WEBHOOK_SECRET);
|
|
105
|
+
* await queue.push(event);
|
|
106
|
+
* return new Response(null, { status: 204 });
|
|
107
|
+
* }
|
|
108
|
+
*/
|
|
109
|
+
async receive(request, secret, options = {}) {
|
|
110
|
+
return verifyWebhook({
|
|
111
|
+
secret,
|
|
112
|
+
signature: request.headers.get('sendora-signature'),
|
|
113
|
+
body: new Uint8Array(await request.arrayBuffer()),
|
|
114
|
+
toleranceSeconds: options.toleranceSeconds,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=webhooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sendora/sdk",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "The official TypeScript SDK for Sendora, transactional email delivery hosted in Sweden.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./package.json": "./package.json"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"src",
|
|
18
|
+
"skills",
|
|
19
|
+
"README.md"
|
|
20
|
+
],
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=20.19"
|
|
23
|
+
},
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "git+https://github.com/hornta/sendora.git",
|
|
27
|
+
"directory": "sdks/typescript"
|
|
28
|
+
},
|
|
29
|
+
"homepage": "https://sendora.se/docs",
|
|
30
|
+
"keywords": [
|
|
31
|
+
"sendora",
|
|
32
|
+
"email",
|
|
33
|
+
"transactional",
|
|
34
|
+
"sdk",
|
|
35
|
+
"sweden"
|
|
36
|
+
],
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"typescript": "~6.0.3",
|
|
39
|
+
"vitest": "^4.1.11",
|
|
40
|
+
"zod": "^4.6.2",
|
|
41
|
+
"@sendora/api": "0.0.0",
|
|
42
|
+
"@sendora/db": "0.0.0",
|
|
43
|
+
"@sendora/domain": "0.0.0",
|
|
44
|
+
"@sendora/observability": "0.0.0"
|
|
45
|
+
},
|
|
46
|
+
"scripts": {
|
|
47
|
+
"build": "node -e \"fs.rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json"
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sendora
|
|
3
|
+
description: Send transactional email through Sendora with @sendora/sdk, read the message log, manage streams, suppressions, tokens, webhooks and sending domains, and receive signed webhooks. Use when a task mentions Sendora, @sendora/sdk, or sending email from a system hosted in Sweden.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Sendora
|
|
7
|
+
|
|
8
|
+
`@sendora/sdk` is the official TypeScript client for the Sendora API. It
|
|
9
|
+
has zero dependencies, runs on Node 20.19 or newer and on any runtime with
|
|
10
|
+
`fetch` and WebCrypto, and is ESM only. The README in this package is the
|
|
11
|
+
complete reference; every call, every error code and every event is in it.
|
|
12
|
+
|
|
13
|
+
## Rules
|
|
14
|
+
|
|
15
|
+
- The API token is a secret. Read it from the environment on the server
|
|
16
|
+
and never send it to a browser. `new Sendora({ token })` throws when the
|
|
17
|
+
token is missing, so construct the client at startup.
|
|
18
|
+
- One client per server token: `const sendora = new Sendora({ token })`.
|
|
19
|
+
Every resource hangs off it: `email`, `messages`, `streams`,
|
|
20
|
+
`suppressions`, `tokens`, `webhooks`, `domains`.
|
|
21
|
+
- Every method takes what the route takes and answers what the route
|
|
22
|
+
answers. Do not build request bodies by hand or call `fetch` yourself.
|
|
23
|
+
- Do not add idempotency keys or retry loops of your own. The SDK gives
|
|
24
|
+
every send a key and repeats a call only when repeating is safe. Pass
|
|
25
|
+
`idempotencyKey` only when a retry may come from another process.
|
|
26
|
+
- Every failed call throws `SendoraError`. Catch it, narrow on
|
|
27
|
+
`error.code`, and let anything else propagate. Never swallow it.
|
|
28
|
+
- A batch never throws for one bad message: read `results[i].status`.
|
|
29
|
+
- Delivery is asynchronous. `email.send` answers `accepted`; whether the
|
|
30
|
+
receiver took the message is in `messages.get(messageId).recipients`
|
|
31
|
+
and in the `delivered`, `bounced`, `deferred` and `spam_complaint`
|
|
32
|
+
webhook events.
|
|
33
|
+
- Verify a webhook before parsing it. With a Fetch `Request`, call
|
|
34
|
+
`sendora.webhooks.receive(request, secret)`; with Express or Fastify,
|
|
35
|
+
call `verifyWebhook` with the secret, the header and the raw body.
|
|
36
|
+
Answer 2xx quickly and do the work afterwards. Deliveries arrive at
|
|
37
|
+
least once, so key handling on `event.id`.
|
|
38
|
+
- Addresses on the suppression list are refused with
|
|
39
|
+
`recipient_suppressed`; lift a hard bounce with
|
|
40
|
+
`suppressions.delete({ address })`; a spam complaint cannot be lifted by
|
|
41
|
+
the customer. Lists are per stream: pass `streamId` when the send went on
|
|
42
|
+
a stream other than the default.
|
|
43
|
+
- `from` must be on a verified sending domain; `domains.create` answers
|
|
44
|
+
the two DNS records to add, and `domains.verify` checks them now.
|
|
45
|
+
- A message goes on the server's default transactional stream unless it
|
|
46
|
+
names another with `streamId`; `streams.create` adds one. Never make a
|
|
47
|
+
stream per message or per customer; a stream is a kind of mail.
|
|
48
|
+
- Mail to many goes as one broadcast: `broadcasts.send({ streamId, from,
|
|
49
|
+
subject, text, messages })` with one entry per recipient, on a
|
|
50
|
+
broadcast stream, at most 50,000 entries; follow it with
|
|
51
|
+
`broadcasts.get(broadcastId)` and stop it with `broadcasts.cancel`.
|
|
52
|
+
Personalise with `{{ key }}` in the content and `substitutions` on each
|
|
53
|
+
entry. Never loop over `email.send` for a list.
|
|
54
|
+
- A message on a broadcast stream must carry `{{ unsubscribe_url }}` in
|
|
55
|
+
its text and its HTML; Sendora puts each recipient's own link there and
|
|
56
|
+
writes the List-Unsubscribe headers itself. An `unsubscribed` event
|
|
57
|
+
tells your system to stop; the address is then on that stream's list.
|
|
58
|
+
|
|
59
|
+
## The shape of a call
|
|
60
|
+
|
|
61
|
+
```ts
|
|
62
|
+
import { Sendora, SendoraError } from '@sendora/sdk';
|
|
63
|
+
|
|
64
|
+
const sendora = new Sendora({ token: process.env.SENDORA_API_TOKEN });
|
|
65
|
+
|
|
66
|
+
try {
|
|
67
|
+
const { messageId } = await sendora.email.send({
|
|
68
|
+
from: { email: 'no-reply@example.se', name: 'Example AB' },
|
|
69
|
+
to: ['anna@example.com'],
|
|
70
|
+
subject: 'Din faktura för september',
|
|
71
|
+
text: 'Hej Anna, fakturan finns bifogad.',
|
|
72
|
+
tag: 'invoice',
|
|
73
|
+
});
|
|
74
|
+
} catch (error) {
|
|
75
|
+
if (error instanceof SendoraError && error.code === 'recipient_suppressed') {
|
|
76
|
+
// error.suppressed lists the addresses and why
|
|
77
|
+
}
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Where to read more
|
|
83
|
+
|
|
84
|
+
- The README of this package: every method, every error code, retries,
|
|
85
|
+
webhooks and events.
|
|
86
|
+
- The guides and the HTTP reference at https://sendora.se/docs.
|
package/src/base64.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
const ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
|
2
|
+
|
|
3
|
+
/** Standard base64 without line breaks, as the API takes attachment content; needs nothing from the runtime. */
|
|
4
|
+
export function toBase64(bytes: Uint8Array): string {
|
|
5
|
+
let out = '';
|
|
6
|
+
for (let i = 0; i < bytes.length; i += 3) {
|
|
7
|
+
const a = bytes[i] ?? 0;
|
|
8
|
+
const b = bytes[i + 1];
|
|
9
|
+
const c = bytes[i + 2];
|
|
10
|
+
const n = (a << 16) | ((b ?? 0) << 8) | (c ?? 0);
|
|
11
|
+
out += ALPHABET.charAt((n >>> 18) & 63);
|
|
12
|
+
out += ALPHABET.charAt((n >>> 12) & 63);
|
|
13
|
+
out += b === undefined ? '=' : ALPHABET.charAt((n >>> 6) & 63);
|
|
14
|
+
out += c === undefined ? '=' : ALPHABET.charAt(n & 63);
|
|
15
|
+
}
|
|
16
|
+
return out;
|
|
17
|
+
}
|