sadasend 0.0.0-stage → 0.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/LICENSE +21 -0
- package/README.md +527 -2
- package/dist/client.d.ts +452 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +266 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +123 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +176 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/retry.d.ts +42 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +30 -0
- package/dist/retry.js.map +1 -0
- package/dist/webhooks.d.ts +71 -0
- package/dist/webhooks.d.ts.map +1 -0
- package/dist/webhooks.js +96 -0
- package/dist/webhooks.js.map +1 -0
- package/package.json +73 -4
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
import { SadaSendError, type DnsRecord } from './errors.js';
|
|
2
|
+
import { type RetryPolicy } from './retry.js';
|
|
3
|
+
/**
|
|
4
|
+
* The SadaSend client.
|
|
5
|
+
*
|
|
6
|
+
* **Results are a union, not exceptions.** Every guardrail refusal — an agent
|
|
7
|
+
* stopped from mailing outside its allowlist, a send held for approval, a
|
|
8
|
+
* suppressed recipient — is the product working as designed. Throwing on those
|
|
9
|
+
* makes the normal case an exception, and `catch` blocks are where errors go to
|
|
10
|
+
* be swallowed. So `{ ok: true, ... } | { ok: false, error }`, and the compiler
|
|
11
|
+
* makes you look at it.
|
|
12
|
+
*
|
|
13
|
+
* The one thing that *does* throw is `ConnectionError`: not knowing whether the
|
|
14
|
+
* API saw the request is a different situation from being told no.
|
|
15
|
+
*/
|
|
16
|
+
export type Attachment = {
|
|
17
|
+
filename: string;
|
|
18
|
+
content: string;
|
|
19
|
+
contentType?: string;
|
|
20
|
+
contentId?: string;
|
|
21
|
+
};
|
|
22
|
+
export type SendInput = {
|
|
23
|
+
from: string;
|
|
24
|
+
to: string | string[];
|
|
25
|
+
subject?: string;
|
|
26
|
+
html?: string;
|
|
27
|
+
text?: string;
|
|
28
|
+
/** Template name or id, rendered server-side with `variables`. */
|
|
29
|
+
template?: string;
|
|
30
|
+
variables?: Record<string, unknown>;
|
|
31
|
+
/**
|
|
32
|
+
* Where replies go. Not a recipient: it costs no quota and is checked against
|
|
33
|
+
* neither the key's allowlist nor your suppression list.
|
|
34
|
+
*/
|
|
35
|
+
replyTo?: string | string[];
|
|
36
|
+
/**
|
|
37
|
+
* Copied recipients, and recipients in every sense the guardrails care about.
|
|
38
|
+
*
|
|
39
|
+
* They count against quota and are checked against the key's allowlist and
|
|
40
|
+
* your suppression list exactly as `to` is. Putting an address in `bcc` is not
|
|
41
|
+
* a way around a guardrail — it only changes who can see it.
|
|
42
|
+
*/
|
|
43
|
+
cc?: string | string[];
|
|
44
|
+
bcc?: string | string[];
|
|
45
|
+
/**
|
|
46
|
+
* Up to ten labels for the log and the stats.
|
|
47
|
+
*
|
|
48
|
+
* Lowercased and de-duplicated server-side, so `Welcome` and `welcome` are one
|
|
49
|
+
* tag rather than two rows in a breakdown nobody can read. `GET
|
|
50
|
+
* /account/stats?by_tag=true` then gives each its own bounce and complaint
|
|
51
|
+
* rate, against its own send count.
|
|
52
|
+
*/
|
|
53
|
+
tags?: string[];
|
|
54
|
+
headers?: Record<string, string>;
|
|
55
|
+
attachments?: Attachment[];
|
|
56
|
+
scheduledAt?: Date | string;
|
|
57
|
+
/**
|
|
58
|
+
* Run every check and send nothing. The cheapest way to be sure, and the
|
|
59
|
+
* same code path as a real send — a preview down a different path would be a
|
|
60
|
+
* preview of something else.
|
|
61
|
+
*/
|
|
62
|
+
dryRun?: boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Sent as `Idempotency-Key`. **Generated for you if you leave it out**, so a
|
|
65
|
+
* retried request cannot become two emails. Pass your own when the natural
|
|
66
|
+
* key is in your domain — an order id makes "send this receipt once" true
|
|
67
|
+
* across process restarts, which a generated one cannot.
|
|
68
|
+
*/
|
|
69
|
+
idempotencyKey?: string;
|
|
70
|
+
/** Ingress channel override: `sdk` (default), `api`, `mcp`, `smtp`. */
|
|
71
|
+
channel?: string;
|
|
72
|
+
/** Sending source persona: `backend`, `agent`, `automation`, `system`. */
|
|
73
|
+
source?: string;
|
|
74
|
+
/** Associated AI agent identifier or name (e.g. `billing-bot`, `claude-code`). */
|
|
75
|
+
agentName?: string;
|
|
76
|
+
agent_name?: string;
|
|
77
|
+
};
|
|
78
|
+
export type SendResult = {
|
|
79
|
+
ok: true;
|
|
80
|
+
id: string;
|
|
81
|
+
status: 'queued' | 'pending_approval';
|
|
82
|
+
dryRun?: true;
|
|
83
|
+
rendered?: unknown;
|
|
84
|
+
} | {
|
|
85
|
+
ok: false;
|
|
86
|
+
error: SadaSendError;
|
|
87
|
+
};
|
|
88
|
+
export type BatchItemResult = {
|
|
89
|
+
index: number;
|
|
90
|
+
ok: boolean;
|
|
91
|
+
id?: string;
|
|
92
|
+
status?: string;
|
|
93
|
+
error?: string;
|
|
94
|
+
message?: string;
|
|
95
|
+
allowlist?: string[];
|
|
96
|
+
};
|
|
97
|
+
export type BatchResult = {
|
|
98
|
+
results: BatchItemResult[];
|
|
99
|
+
accepted: number;
|
|
100
|
+
refused: number;
|
|
101
|
+
total: number;
|
|
102
|
+
};
|
|
103
|
+
export type MessageStatus = 'queued' | 'sent' | 'delivered' | 'bounced' | 'complained' | 'refused' | 'cancelled' | 'pending_approval';
|
|
104
|
+
export type Message = {
|
|
105
|
+
id: string;
|
|
106
|
+
to: string[];
|
|
107
|
+
from: string;
|
|
108
|
+
subject: string | null;
|
|
109
|
+
status: MessageStatus;
|
|
110
|
+
at: string;
|
|
111
|
+
events?: {
|
|
112
|
+
type: string;
|
|
113
|
+
at: string;
|
|
114
|
+
detail?: string;
|
|
115
|
+
}[];
|
|
116
|
+
channel?: string;
|
|
117
|
+
source?: string;
|
|
118
|
+
agentName?: string | null;
|
|
119
|
+
};
|
|
120
|
+
export type AccountInfo = {
|
|
121
|
+
org: string;
|
|
122
|
+
plan: string;
|
|
123
|
+
state: string;
|
|
124
|
+
emailsUsed: number;
|
|
125
|
+
emailQuota: number;
|
|
126
|
+
domainsUsed: number;
|
|
127
|
+
domainQuota: number;
|
|
128
|
+
retentionDays: number;
|
|
129
|
+
trackOpens: boolean;
|
|
130
|
+
trackClicks: boolean;
|
|
131
|
+
seatsUsed: number;
|
|
132
|
+
seatQuota: number;
|
|
133
|
+
quotaPeriodStart?: string | null;
|
|
134
|
+
quotaPeriodEnd?: string | null;
|
|
135
|
+
nextResetAt?: string | null;
|
|
136
|
+
daysUntilReset?: number | null;
|
|
137
|
+
dailySendLimit?: number | null;
|
|
138
|
+
dailySendsUsed?: number | null;
|
|
139
|
+
dailyResetAt?: string | null;
|
|
140
|
+
dailyResetSeconds?: number | null;
|
|
141
|
+
reputationLevel?: string;
|
|
142
|
+
warmup?: {
|
|
143
|
+
applies: boolean;
|
|
144
|
+
day: number;
|
|
145
|
+
totalDays: number;
|
|
146
|
+
dailyLimit: number;
|
|
147
|
+
dailyUsed: number | null;
|
|
148
|
+
nextDayLimit: number | null;
|
|
149
|
+
resetSeconds: number | null;
|
|
150
|
+
dailyResetAt?: string | null;
|
|
151
|
+
};
|
|
152
|
+
};
|
|
153
|
+
export type AccountStats = {
|
|
154
|
+
window: string;
|
|
155
|
+
sent: number;
|
|
156
|
+
delivered: number;
|
|
157
|
+
deliveryRate: number;
|
|
158
|
+
bounced: number;
|
|
159
|
+
bounceRate: number;
|
|
160
|
+
complained: number;
|
|
161
|
+
complaintRate: number;
|
|
162
|
+
};
|
|
163
|
+
export type AccountVolumeDay = {
|
|
164
|
+
date: string;
|
|
165
|
+
sent: number;
|
|
166
|
+
delivered: number;
|
|
167
|
+
bounced: number;
|
|
168
|
+
complained: number;
|
|
169
|
+
};
|
|
170
|
+
export type AccountVolume = {
|
|
171
|
+
window: string;
|
|
172
|
+
days: AccountVolumeDay[];
|
|
173
|
+
};
|
|
174
|
+
export type ChecklistItem = {
|
|
175
|
+
key: string;
|
|
176
|
+
title: string;
|
|
177
|
+
completed: boolean;
|
|
178
|
+
};
|
|
179
|
+
export type AccountChecklist = {
|
|
180
|
+
items: ChecklistItem[];
|
|
181
|
+
completed: number;
|
|
182
|
+
total: number;
|
|
183
|
+
};
|
|
184
|
+
export type TemplateSummary = {
|
|
185
|
+
id: string;
|
|
186
|
+
name: string;
|
|
187
|
+
version: number;
|
|
188
|
+
};
|
|
189
|
+
export type TemplateDetail = {
|
|
190
|
+
id: string;
|
|
191
|
+
name: string;
|
|
192
|
+
subject: string;
|
|
193
|
+
html?: string;
|
|
194
|
+
text?: string;
|
|
195
|
+
version: number;
|
|
196
|
+
};
|
|
197
|
+
export type WebhookEndpoint = {
|
|
198
|
+
id: string;
|
|
199
|
+
url: string;
|
|
200
|
+
events: string[];
|
|
201
|
+
enabled: boolean;
|
|
202
|
+
};
|
|
203
|
+
export type WebhookDelivery = {
|
|
204
|
+
id: string;
|
|
205
|
+
event: string;
|
|
206
|
+
status: number;
|
|
207
|
+
success: boolean;
|
|
208
|
+
};
|
|
209
|
+
export type CircuitBreaker = {
|
|
210
|
+
agentIdentifier: string;
|
|
211
|
+
agentName: string;
|
|
212
|
+
channel: string;
|
|
213
|
+
trippedAt: string;
|
|
214
|
+
reason: string;
|
|
215
|
+
};
|
|
216
|
+
export type StaffAccess = {
|
|
217
|
+
id: string;
|
|
218
|
+
at: string;
|
|
219
|
+
staff: string;
|
|
220
|
+
role: string;
|
|
221
|
+
reason: string;
|
|
222
|
+
reference?: string;
|
|
223
|
+
messageId?: string;
|
|
224
|
+
subject?: string;
|
|
225
|
+
};
|
|
226
|
+
export type ApiKeySummary = {
|
|
227
|
+
id: string;
|
|
228
|
+
name: string;
|
|
229
|
+
prefix: string;
|
|
230
|
+
mode: string;
|
|
231
|
+
scopes: string[];
|
|
232
|
+
createdAt: string;
|
|
233
|
+
lastUsedAt?: string | null;
|
|
234
|
+
};
|
|
235
|
+
export type HeldApproval = {
|
|
236
|
+
id: string;
|
|
237
|
+
to: string;
|
|
238
|
+
subject: string;
|
|
239
|
+
requestedBy: string;
|
|
240
|
+
at: string;
|
|
241
|
+
};
|
|
242
|
+
export type SupportTicketSummary = {
|
|
243
|
+
id: string;
|
|
244
|
+
subject: string;
|
|
245
|
+
status: string;
|
|
246
|
+
priority: string;
|
|
247
|
+
createdAt: string;
|
|
248
|
+
};
|
|
249
|
+
export type TeamMember = {
|
|
250
|
+
id: string;
|
|
251
|
+
name: string;
|
|
252
|
+
email: string;
|
|
253
|
+
role: string;
|
|
254
|
+
};
|
|
255
|
+
export type DeliverabilityTool = {
|
|
256
|
+
id: string;
|
|
257
|
+
name: string;
|
|
258
|
+
description: string;
|
|
259
|
+
};
|
|
260
|
+
export type Result<T> = {
|
|
261
|
+
ok: true;
|
|
262
|
+
data: T;
|
|
263
|
+
} | {
|
|
264
|
+
ok: false;
|
|
265
|
+
error: SadaSendError;
|
|
266
|
+
};
|
|
267
|
+
export type ClientOptions = {
|
|
268
|
+
apiKey?: string;
|
|
269
|
+
baseUrl?: string;
|
|
270
|
+
/** Per attempt, not for the whole call including retries. */
|
|
271
|
+
timeoutMs?: number;
|
|
272
|
+
retry?: Partial<RetryPolicy>;
|
|
273
|
+
/** For tests and for a runtime with its own instrumented fetch. */
|
|
274
|
+
fetch?: typeof globalThis.fetch;
|
|
275
|
+
/** Default ingress channel: `sdk` (default), `api`, `mcp`, `smtp`. */
|
|
276
|
+
channel?: string;
|
|
277
|
+
/** Default sending source persona: `backend`, `agent`, `automation`, `system`. */
|
|
278
|
+
source?: string;
|
|
279
|
+
/** Default AI agent identifier or name. */
|
|
280
|
+
agentName?: string;
|
|
281
|
+
};
|
|
282
|
+
export declare class SadaSend {
|
|
283
|
+
#private;
|
|
284
|
+
constructor(apiKeyOrOptions?: string | ClientOptions, options?: ClientOptions);
|
|
285
|
+
/**
|
|
286
|
+
* Send an email.
|
|
287
|
+
*
|
|
288
|
+
* ```ts
|
|
289
|
+
* const r = await sadasend.emails.send({ from, to, subject, html });
|
|
290
|
+
* if (!r.ok) return console.error(r.error.message);
|
|
291
|
+
* ```
|
|
292
|
+
*
|
|
293
|
+
* `r.status` is `'pending_approval'` when the key is in approval mode — the
|
|
294
|
+
* message is real and waiting for a person, not lost. Treating that as a
|
|
295
|
+
* success is correct: the send was accepted.
|
|
296
|
+
*/
|
|
297
|
+
readonly emails: {
|
|
298
|
+
send: (input: SendInput) => Promise<SendResult>;
|
|
299
|
+
batch: (items: SendInput[], options?: {
|
|
300
|
+
idempotencyKey?: string;
|
|
301
|
+
}) => Promise<Result<BatchResult>>;
|
|
302
|
+
get: (id: string) => Promise<Result<Message>>;
|
|
303
|
+
resend: (id: string, options?: {
|
|
304
|
+
idempotencyKey?: string;
|
|
305
|
+
}) => Promise<Result<{
|
|
306
|
+
id: string;
|
|
307
|
+
status: MessageStatus;
|
|
308
|
+
}>>;
|
|
309
|
+
list: (params?: {
|
|
310
|
+
status?: MessageStatus;
|
|
311
|
+
q?: string;
|
|
312
|
+
tag?: string;
|
|
313
|
+
channel?: string;
|
|
314
|
+
source?: string;
|
|
315
|
+
agentName?: string;
|
|
316
|
+
agent_name?: string;
|
|
317
|
+
limit?: number;
|
|
318
|
+
cursor?: string;
|
|
319
|
+
}) => Promise<{
|
|
320
|
+
ok: false;
|
|
321
|
+
error: SadaSendError;
|
|
322
|
+
} | {
|
|
323
|
+
ok: true;
|
|
324
|
+
data: {
|
|
325
|
+
messages: Message[];
|
|
326
|
+
total?: number;
|
|
327
|
+
nextCursor: string | null;
|
|
328
|
+
};
|
|
329
|
+
}>;
|
|
330
|
+
cancel: (id: string) => Promise<Result<{
|
|
331
|
+
id: string;
|
|
332
|
+
status: MessageStatus;
|
|
333
|
+
scheduledAt?: string | null;
|
|
334
|
+
}>>;
|
|
335
|
+
};
|
|
336
|
+
readonly account: {
|
|
337
|
+
get: () => Promise<Result<AccountInfo>>;
|
|
338
|
+
stats: (params?: {
|
|
339
|
+
window?: string;
|
|
340
|
+
by_tag?: boolean;
|
|
341
|
+
}) => Promise<Result<AccountStats>>;
|
|
342
|
+
volume: (params?: {
|
|
343
|
+
window?: string;
|
|
344
|
+
}) => Promise<Result<AccountVolume>>;
|
|
345
|
+
checklist: () => Promise<Result<AccountChecklist>>;
|
|
346
|
+
circuitBreakers: () => Promise<Result<{
|
|
347
|
+
circuitBreakers: CircuitBreaker[];
|
|
348
|
+
}>>;
|
|
349
|
+
staffAccess: (params?: {
|
|
350
|
+
limit?: number;
|
|
351
|
+
}) => Promise<Result<{
|
|
352
|
+
accesses: StaffAccess[];
|
|
353
|
+
note?: string;
|
|
354
|
+
}>>;
|
|
355
|
+
};
|
|
356
|
+
readonly domains: {
|
|
357
|
+
list: () => Promise<Result<{
|
|
358
|
+
domains: {
|
|
359
|
+
id: string;
|
|
360
|
+
name: string;
|
|
361
|
+
status: string;
|
|
362
|
+
}[];
|
|
363
|
+
}>>;
|
|
364
|
+
records: (id: string) => Promise<Result<{
|
|
365
|
+
records: DnsRecord[];
|
|
366
|
+
}>>;
|
|
367
|
+
verify: (id: string) => Promise<Result<{
|
|
368
|
+
status: string;
|
|
369
|
+
verified?: boolean;
|
|
370
|
+
inconclusive?: boolean;
|
|
371
|
+
checks?: DnsRecord[];
|
|
372
|
+
records?: DnsRecord[];
|
|
373
|
+
}>>;
|
|
374
|
+
};
|
|
375
|
+
readonly suppressions: {
|
|
376
|
+
list: (params?: {
|
|
377
|
+
q?: string;
|
|
378
|
+
reason?: string;
|
|
379
|
+
limit?: number;
|
|
380
|
+
}) => Promise<Result<{
|
|
381
|
+
suppressions: {
|
|
382
|
+
address: string;
|
|
383
|
+
reason: string;
|
|
384
|
+
createdAt: string;
|
|
385
|
+
}[];
|
|
386
|
+
total: number;
|
|
387
|
+
}>>;
|
|
388
|
+
add: (address: string, reason?: string) => Promise<Result<{
|
|
389
|
+
address: string;
|
|
390
|
+
reason: string;
|
|
391
|
+
already?: boolean;
|
|
392
|
+
}>>;
|
|
393
|
+
};
|
|
394
|
+
readonly templates: {
|
|
395
|
+
list: () => Promise<Result<{
|
|
396
|
+
templates: TemplateSummary[];
|
|
397
|
+
}>>;
|
|
398
|
+
get: (id: string) => Promise<Result<TemplateDetail>>;
|
|
399
|
+
render: (id: string, variables?: Record<string, unknown>) => Promise<Result<{
|
|
400
|
+
subject?: string;
|
|
401
|
+
html?: string;
|
|
402
|
+
text?: string;
|
|
403
|
+
}>>;
|
|
404
|
+
test: (id: string, options: {
|
|
405
|
+
to: string;
|
|
406
|
+
variables?: Record<string, unknown>;
|
|
407
|
+
}) => Promise<Result<{
|
|
408
|
+
ok: boolean;
|
|
409
|
+
messageId: string;
|
|
410
|
+
}>>;
|
|
411
|
+
};
|
|
412
|
+
readonly keys: {
|
|
413
|
+
list: () => Promise<Result<{
|
|
414
|
+
keys: ApiKeySummary[];
|
|
415
|
+
}>>;
|
|
416
|
+
approvals: () => Promise<Result<{
|
|
417
|
+
pending: HeldApproval[];
|
|
418
|
+
}>>;
|
|
419
|
+
};
|
|
420
|
+
readonly support: {
|
|
421
|
+
tickets: (params?: {
|
|
422
|
+
limit?: number;
|
|
423
|
+
}) => Promise<Result<{
|
|
424
|
+
tickets: SupportTicketSummary[];
|
|
425
|
+
}>>;
|
|
426
|
+
ticket: (id: string) => Promise<Result<any>>;
|
|
427
|
+
};
|
|
428
|
+
readonly team: {
|
|
429
|
+
get: () => Promise<Result<{
|
|
430
|
+
members: TeamMember[];
|
|
431
|
+
invitations?: any[];
|
|
432
|
+
}>>;
|
|
433
|
+
};
|
|
434
|
+
readonly tools: {
|
|
435
|
+
list: () => Promise<Result<{
|
|
436
|
+
tools: DeliverabilityTool[];
|
|
437
|
+
}>>;
|
|
438
|
+
check: (check: string, subject: string, selector?: string) => Promise<Result<any>>;
|
|
439
|
+
};
|
|
440
|
+
readonly webhooks: {
|
|
441
|
+
list: () => Promise<Result<{
|
|
442
|
+
webhooks: WebhookEndpoint[];
|
|
443
|
+
}>>;
|
|
444
|
+
deliveries: (id: string, params?: {
|
|
445
|
+
limit?: number;
|
|
446
|
+
event?: string;
|
|
447
|
+
}) => Promise<Result<{
|
|
448
|
+
deliveries: WebhookDelivery[];
|
|
449
|
+
}>>;
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|