@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.
Files changed (93) hide show
  1. package/README.md +364 -0
  2. package/dist/base64.d.ts +3 -0
  3. package/dist/base64.d.ts.map +1 -0
  4. package/dist/base64.js +17 -0
  5. package/dist/base64.js.map +1 -0
  6. package/dist/broadcasts.d.ts +60 -0
  7. package/dist/broadcasts.d.ts.map +1 -0
  8. package/dist/broadcasts.js +98 -0
  9. package/dist/broadcasts.js.map +1 -0
  10. package/dist/client.d.ts +51 -0
  11. package/dist/client.d.ts.map +1 -0
  12. package/dist/client.js +69 -0
  13. package/dist/client.js.map +1 -0
  14. package/dist/domains.d.ts +34 -0
  15. package/dist/domains.d.ts.map +1 -0
  16. package/dist/domains.js +70 -0
  17. package/dist/domains.js.map +1 -0
  18. package/dist/email.d.ts +40 -0
  19. package/dist/email.d.ts.map +1 -0
  20. package/dist/email.js +68 -0
  21. package/dist/email.js.map +1 -0
  22. package/dist/error.d.ts +67 -0
  23. package/dist/error.d.ts.map +1 -0
  24. package/dist/error.js +173 -0
  25. package/dist/error.js.map +1 -0
  26. package/dist/index.d.ts +17 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +5 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/messages.d.ts +37 -0
  31. package/dist/messages.d.ts.map +1 -0
  32. package/dist/messages.js +68 -0
  33. package/dist/messages.js.map +1 -0
  34. package/dist/pagination.d.ts +3 -0
  35. package/dist/pagination.d.ts.map +1 -0
  36. package/dist/pagination.js +14 -0
  37. package/dist/pagination.js.map +1 -0
  38. package/dist/retry.d.ts +6 -0
  39. package/dist/retry.d.ts.map +1 -0
  40. package/dist/retry.js +14 -0
  41. package/dist/retry.js.map +1 -0
  42. package/dist/streams.d.ts +45 -0
  43. package/dist/streams.d.ts.map +1 -0
  44. package/dist/streams.js +82 -0
  45. package/dist/streams.js.map +1 -0
  46. package/dist/suppressions.d.ts +37 -0
  47. package/dist/suppressions.d.ts.map +1 -0
  48. package/dist/suppressions.js +56 -0
  49. package/dist/suppressions.js.map +1 -0
  50. package/dist/tokens.d.ts +28 -0
  51. package/dist/tokens.d.ts.map +1 -0
  52. package/dist/tokens.js +57 -0
  53. package/dist/tokens.js.map +1 -0
  54. package/dist/transport.d.ts +34 -0
  55. package/dist/transport.d.ts.map +1 -0
  56. package/dist/transport.js +146 -0
  57. package/dist/transport.js.map +1 -0
  58. package/dist/types.d.ts +802 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +2 -0
  61. package/dist/types.js.map +1 -0
  62. package/dist/version.d.ts +3 -0
  63. package/dist/version.d.ts.map +1 -0
  64. package/dist/version.js +3 -0
  65. package/dist/version.js.map +1 -0
  66. package/dist/webhook-verify.d.ts +33 -0
  67. package/dist/webhook-verify.d.ts.map +1 -0
  68. package/dist/webhook-verify.js +115 -0
  69. package/dist/webhook-verify.js.map +1 -0
  70. package/dist/webhooks.d.ts +63 -0
  71. package/dist/webhooks.d.ts.map +1 -0
  72. package/dist/webhooks.js +118 -0
  73. package/dist/webhooks.js.map +1 -0
  74. package/package.json +49 -0
  75. package/skills/sendora/SKILL.md +86 -0
  76. package/src/base64.ts +17 -0
  77. package/src/broadcasts.ts +115 -0
  78. package/src/client.ts +88 -0
  79. package/src/domains.ts +84 -0
  80. package/src/email.ts +83 -0
  81. package/src/error.ts +252 -0
  82. package/src/index.ts +16 -0
  83. package/src/messages.ts +88 -0
  84. package/src/pagination.ts +18 -0
  85. package/src/retry.ts +20 -0
  86. package/src/streams.ts +100 -0
  87. package/src/suppressions.ts +73 -0
  88. package/src/tokens.ts +70 -0
  89. package/src/transport.ts +179 -0
  90. package/src/types.ts +848 -0
  91. package/src/version.ts +2 -0
  92. package/src/webhook-verify.ts +147 -0
  93. package/src/webhooks.ts +157 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ /** The package version, sent as the User-Agent; a test holds it equal to package.json. */
2
+ export declare const SDK_VERSION = "1.1.0";
3
+ //# sourceMappingURL=version.d.ts.map
@@ -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"}
@@ -0,0 +1,3 @@
1
+ /** The package version, sent as the User-Agent; a test holds it equal to package.json. */
2
+ export const SDK_VERSION = '1.1.0';
3
+ //# sourceMappingURL=version.js.map
@@ -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"}
@@ -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
+ }