@ulvio/client 0.1.0 → 0.3.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 +34 -36
- package/dist/index.cjs +54 -107
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +23 -17
- package/dist/index.d.ts +23 -17
- package/dist/index.js +53 -104
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
// src/errors.ts
|
|
2
2
|
var CONNECTOR_UNHEALTHY_CODE = "CONNECTOR_UNHEALTHY";
|
|
3
|
-
var
|
|
4
|
-
var HTML_TO_PDF_NOT_CONFIGURED_CODE = "html_to_pdf_not_configured";
|
|
5
|
-
var UTILITIES_NOT_CONFIGURED_CODE = "utilities_not_configured";
|
|
3
|
+
var NOT_CONFIGURED_CODE = "not_configured";
|
|
6
4
|
var UlvioError = class extends Error {
|
|
7
5
|
code;
|
|
8
6
|
status;
|
|
@@ -41,40 +39,20 @@ var HttpClient = class {
|
|
|
41
39
|
this.config = config;
|
|
42
40
|
}
|
|
43
41
|
config;
|
|
44
|
-
|
|
45
|
-
const url = this.config.
|
|
46
|
-
const key = this.config.
|
|
42
|
+
requireConfig(method) {
|
|
43
|
+
const url = this.config.baseUrl;
|
|
44
|
+
const key = this.config.apiKey;
|
|
47
45
|
if (!url || !key) {
|
|
46
|
+
const missing = !url && !key ? "baseUrl and apiKey" : !url ? "baseUrl" : "apiKey";
|
|
48
47
|
throw new UlvioError(
|
|
49
|
-
|
|
50
|
-
`${method} requires
|
|
48
|
+
NOT_CONFIGURED_CODE,
|
|
49
|
+
`${method} requires ${missing} to be set on the Ulvio client`
|
|
51
50
|
);
|
|
52
51
|
}
|
|
53
52
|
return { url: trimSlash(url), key };
|
|
54
53
|
}
|
|
55
|
-
|
|
56
|
-
const url = this.
|
|
57
|
-
if (!url) {
|
|
58
|
-
throw new UlvioError(
|
|
59
|
-
HTML_TO_PDF_NOT_CONFIGURED_CODE,
|
|
60
|
-
`${method} requires htmlToPdfApiUrl to be set on the Ulvio client`
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
return trimSlash(url);
|
|
64
|
-
}
|
|
65
|
-
requireUtilities(method) {
|
|
66
|
-
const url = this.config.utilitiesApiUrl;
|
|
67
|
-
if (!url) {
|
|
68
|
-
throw new UlvioError(
|
|
69
|
-
UTILITIES_NOT_CONFIGURED_CODE,
|
|
70
|
-
`${method} requires utilitiesApiUrl to be set on the Ulvio client`
|
|
71
|
-
);
|
|
72
|
-
}
|
|
73
|
-
return trimSlash(url);
|
|
74
|
-
}
|
|
75
|
-
// ── Platform (authenticated) ──────────────────────────────────────────
|
|
76
|
-
async platformRequest(callerName, method, path, options = {}) {
|
|
77
|
-
const { url, key } = this.requirePlatform(callerName);
|
|
54
|
+
async request(callerName, method, path, options = {}) {
|
|
55
|
+
const { url, key } = this.requireConfig(callerName);
|
|
78
56
|
const res = await fetch(`${url}${path}`, {
|
|
79
57
|
method,
|
|
80
58
|
headers: {
|
|
@@ -86,8 +64,8 @@ var HttpClient = class {
|
|
|
86
64
|
if (!res.ok) throw await parseError(res);
|
|
87
65
|
return await res.json();
|
|
88
66
|
}
|
|
89
|
-
async
|
|
90
|
-
const { url, key } = this.
|
|
67
|
+
async requestRaw(callerName, method, path, options = {}) {
|
|
68
|
+
const { url, key } = this.requireConfig(callerName);
|
|
91
69
|
const headers = { ...options.headers };
|
|
92
70
|
if (options.contentType) headers["Content-Type"] = options.contentType;
|
|
93
71
|
headers["Authorization"] = `Bearer ${key}`;
|
|
@@ -99,30 +77,6 @@ var HttpClient = class {
|
|
|
99
77
|
if (!res.ok) throw await parseError(res);
|
|
100
78
|
return res;
|
|
101
79
|
}
|
|
102
|
-
// ── HTML-to-PDF (unauthenticated) ─────────────────────────────────────
|
|
103
|
-
async htmlToPdfFetch(callerName, path, init) {
|
|
104
|
-
const url = this.requireHtmlToPdf(callerName);
|
|
105
|
-
return fetch(`${url}${path}`, init);
|
|
106
|
-
}
|
|
107
|
-
// ── Utilities (unauthenticated) ───────────────────────────────────────
|
|
108
|
-
async utilitiesRequest(callerName, method, path, options = {}) {
|
|
109
|
-
const url = this.requireUtilities(callerName);
|
|
110
|
-
const res = await fetch(`${url}${path}`, {
|
|
111
|
-
method,
|
|
112
|
-
headers: { "Content-Type": "application/json" },
|
|
113
|
-
body: options.body !== void 0 ? JSON.stringify(options.body) : void 0
|
|
114
|
-
});
|
|
115
|
-
const data = await res.json().catch(() => void 0);
|
|
116
|
-
if (!res.ok) {
|
|
117
|
-
const errBody = data;
|
|
118
|
-
throw new UlvioError(
|
|
119
|
-
errBody?.error?.code ?? "request_failed",
|
|
120
|
-
errBody?.error?.message ?? res.statusText,
|
|
121
|
-
{ status: res.status, response: data }
|
|
122
|
-
);
|
|
123
|
-
}
|
|
124
|
-
return data;
|
|
125
|
-
}
|
|
126
80
|
};
|
|
127
81
|
|
|
128
82
|
// src/clients/mail.ts
|
|
@@ -132,7 +86,7 @@ var MailClient = class {
|
|
|
132
86
|
}
|
|
133
87
|
http;
|
|
134
88
|
sendTransactional(params) {
|
|
135
|
-
return this.http.
|
|
89
|
+
return this.http.request(
|
|
136
90
|
"client.mail.sendTransactional()",
|
|
137
91
|
"POST",
|
|
138
92
|
"/v1/transactional-mail/send",
|
|
@@ -148,7 +102,7 @@ var MailboxClient = class {
|
|
|
148
102
|
}
|
|
149
103
|
http;
|
|
150
104
|
send(params) {
|
|
151
|
-
return this.http.
|
|
105
|
+
return this.http.request(
|
|
152
106
|
"client.mailbox.send()",
|
|
153
107
|
"POST",
|
|
154
108
|
"/v1/mailbox/send",
|
|
@@ -157,21 +111,21 @@ var MailboxClient = class {
|
|
|
157
111
|
}
|
|
158
112
|
list(limit) {
|
|
159
113
|
const qs = limit !== void 0 ? `?limit=${limit}` : "";
|
|
160
|
-
return this.http.
|
|
114
|
+
return this.http.request(
|
|
161
115
|
"client.mailbox.list()",
|
|
162
116
|
"GET",
|
|
163
117
|
`/v1/mailbox/messages${qs}`
|
|
164
118
|
);
|
|
165
119
|
}
|
|
166
120
|
get(id) {
|
|
167
|
-
return this.http.
|
|
121
|
+
return this.http.request(
|
|
168
122
|
"client.mailbox.get()",
|
|
169
123
|
"GET",
|
|
170
124
|
`/v1/mailbox/messages/${encodeURIComponent(id)}`
|
|
171
125
|
);
|
|
172
126
|
}
|
|
173
127
|
markProcessed(id) {
|
|
174
|
-
return this.http.
|
|
128
|
+
return this.http.request(
|
|
175
129
|
"client.mailbox.markProcessed()",
|
|
176
130
|
"POST",
|
|
177
131
|
`/v1/mailbox/messages/${encodeURIComponent(id)}/mark-processed`
|
|
@@ -181,7 +135,7 @@ var MailboxClient = class {
|
|
|
181
135
|
* Download a mailbox message attachment as a Buffer.
|
|
182
136
|
*/
|
|
183
137
|
async getAttachment(messageId, attachmentId) {
|
|
184
|
-
const res = await this.http.
|
|
138
|
+
const res = await this.http.requestRaw(
|
|
185
139
|
"client.mailbox.getAttachment()",
|
|
186
140
|
"GET",
|
|
187
141
|
`/v1/mailbox/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachmentId)}`
|
|
@@ -190,7 +144,7 @@ var MailboxClient = class {
|
|
|
190
144
|
return Buffer.from(arrayBuffer);
|
|
191
145
|
}
|
|
192
146
|
getConnectorStatus() {
|
|
193
|
-
return this.http.
|
|
147
|
+
return this.http.request(
|
|
194
148
|
"client.mailbox.getConnectorStatus()",
|
|
195
149
|
"GET",
|
|
196
150
|
"/v1/mailbox/connector-status"
|
|
@@ -200,7 +154,7 @@ var MailboxClient = class {
|
|
|
200
154
|
* Dev-only: toggle the mock connector's health state.
|
|
201
155
|
*/
|
|
202
156
|
setConnectorStatus(healthy) {
|
|
203
|
-
return this.http.
|
|
157
|
+
return this.http.request(
|
|
204
158
|
"client.mailbox.setConnectorStatus()",
|
|
205
159
|
"PATCH",
|
|
206
160
|
"/v1/mailbox/connector-status",
|
|
@@ -216,7 +170,7 @@ var SmsClient = class {
|
|
|
216
170
|
}
|
|
217
171
|
http;
|
|
218
172
|
send(params) {
|
|
219
|
-
return this.http.
|
|
173
|
+
return this.http.request(
|
|
220
174
|
"client.sms.send()",
|
|
221
175
|
"POST",
|
|
222
176
|
"/v1/sms/send",
|
|
@@ -232,7 +186,7 @@ var WhatsAppClient = class {
|
|
|
232
186
|
}
|
|
233
187
|
http;
|
|
234
188
|
send(params) {
|
|
235
|
-
return this.http.
|
|
189
|
+
return this.http.request(
|
|
236
190
|
"client.whatsapp.send()",
|
|
237
191
|
"POST",
|
|
238
192
|
"/v1/whatsapp/send",
|
|
@@ -248,7 +202,7 @@ var VoiceClient = class {
|
|
|
248
202
|
}
|
|
249
203
|
http;
|
|
250
204
|
transcribe(params) {
|
|
251
|
-
return this.http.
|
|
205
|
+
return this.http.request(
|
|
252
206
|
"client.voice.transcribe()",
|
|
253
207
|
"POST",
|
|
254
208
|
"/v1/voice/send",
|
|
@@ -264,7 +218,7 @@ var FilesClient = class {
|
|
|
264
218
|
}
|
|
265
219
|
http;
|
|
266
220
|
async upload(key, file, contentType = "application/octet-stream") {
|
|
267
|
-
const res = await this.http.
|
|
221
|
+
const res = await this.http.requestRaw(
|
|
268
222
|
"client.files.upload()",
|
|
269
223
|
"PUT",
|
|
270
224
|
`/v1/files/${encodeURI(key)}`,
|
|
@@ -276,7 +230,7 @@ var FilesClient = class {
|
|
|
276
230
|
* Download a file. Returns the raw Response for streaming.
|
|
277
231
|
*/
|
|
278
232
|
get(key) {
|
|
279
|
-
return this.http.
|
|
233
|
+
return this.http.requestRaw(
|
|
280
234
|
"client.files.get()",
|
|
281
235
|
"GET",
|
|
282
236
|
`/v1/files/${encodeURI(key)}`
|
|
@@ -288,21 +242,21 @@ var FilesClient = class {
|
|
|
288
242
|
if (limit !== void 0) params.set("limit", String(limit));
|
|
289
243
|
if (cursor) params.set("cursor", cursor);
|
|
290
244
|
const qs = params.toString();
|
|
291
|
-
return this.http.
|
|
245
|
+
return this.http.request(
|
|
292
246
|
"client.files.list()",
|
|
293
247
|
"GET",
|
|
294
248
|
`/v1/files${qs ? `?${qs}` : ""}`
|
|
295
249
|
);
|
|
296
250
|
}
|
|
297
251
|
delete(key) {
|
|
298
|
-
return this.http.
|
|
252
|
+
return this.http.request(
|
|
299
253
|
"client.files.delete()",
|
|
300
254
|
"DELETE",
|
|
301
255
|
`/v1/files/${encodeURI(key)}`
|
|
302
256
|
);
|
|
303
257
|
}
|
|
304
258
|
deleteMany(prefix) {
|
|
305
|
-
return this.http.
|
|
259
|
+
return this.http.request(
|
|
306
260
|
"client.files.deleteMany()",
|
|
307
261
|
"DELETE",
|
|
308
262
|
`/v1/files?prefix=${encodeURIComponent(prefix)}`
|
|
@@ -313,7 +267,7 @@ var FilesClient = class {
|
|
|
313
267
|
* @param expiresIn TTL in seconds (default 3600, min 60, max 86400)
|
|
314
268
|
*/
|
|
315
269
|
presignedDownloadUrl(key, expiresIn) {
|
|
316
|
-
return this.http.
|
|
270
|
+
return this.http.request(
|
|
317
271
|
"client.files.presignedDownloadUrl()",
|
|
318
272
|
"POST",
|
|
319
273
|
"/v1/files/presigned-download",
|
|
@@ -326,7 +280,7 @@ var FilesClient = class {
|
|
|
326
280
|
* @param maxSize Max file size in bytes (default 50MB)
|
|
327
281
|
*/
|
|
328
282
|
presignedUploadUrl(key, contentType, expiresIn, maxSize) {
|
|
329
|
-
return this.http.
|
|
283
|
+
return this.http.request(
|
|
330
284
|
"client.files.presignedUploadUrl()",
|
|
331
285
|
"POST",
|
|
332
286
|
"/v1/files/presigned-upload",
|
|
@@ -370,7 +324,7 @@ var AiClient = class {
|
|
|
370
324
|
http;
|
|
371
325
|
async parse(params) {
|
|
372
326
|
const wire = buildPayload(params);
|
|
373
|
-
const response = await this.http.
|
|
327
|
+
const response = await this.http.request(
|
|
374
328
|
"client.ai.parse()",
|
|
375
329
|
"POST",
|
|
376
330
|
"/v1/ai/parse",
|
|
@@ -380,7 +334,7 @@ var AiClient = class {
|
|
|
380
334
|
}
|
|
381
335
|
async *stream(params) {
|
|
382
336
|
const wire = buildPayload(params);
|
|
383
|
-
const res = await this.http.
|
|
337
|
+
const res = await this.http.requestRaw(
|
|
384
338
|
"client.ai.stream()",
|
|
385
339
|
"POST",
|
|
386
340
|
"/v1/ai/stream",
|
|
@@ -452,19 +406,16 @@ var HtmlToPdfClient = class {
|
|
|
452
406
|
}
|
|
453
407
|
http;
|
|
454
408
|
async convert(params, callbacks) {
|
|
455
|
-
const res = await this.http.
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
{ status: res.status, response: data }
|
|
466
|
-
);
|
|
467
|
-
}
|
|
409
|
+
const res = await this.http.requestRaw(
|
|
410
|
+
"client.htmlToPdf.convert()",
|
|
411
|
+
"POST",
|
|
412
|
+
"/html-to-pdf/convert",
|
|
413
|
+
{
|
|
414
|
+
body: JSON.stringify(params),
|
|
415
|
+
contentType: "application/json",
|
|
416
|
+
headers: { Accept: "text/event-stream" }
|
|
417
|
+
}
|
|
418
|
+
);
|
|
468
419
|
if (!res.body) {
|
|
469
420
|
throw new UlvioError("html_to_pdf_no_body", "html-to-pdf service returned no body", {
|
|
470
421
|
status: res.status
|
|
@@ -514,42 +465,42 @@ var UtilitiesClient = class {
|
|
|
514
465
|
}
|
|
515
466
|
http;
|
|
516
467
|
compileMjml(params) {
|
|
517
|
-
return this.http.
|
|
468
|
+
return this.http.request(
|
|
518
469
|
"client.utilities.compileMjml()",
|
|
519
470
|
"POST",
|
|
520
|
-
"/
|
|
471
|
+
"/utilities/mjml/compile",
|
|
521
472
|
{ body: params }
|
|
522
473
|
);
|
|
523
474
|
}
|
|
524
475
|
renderLiquid(params) {
|
|
525
|
-
return this.http.
|
|
476
|
+
return this.http.request(
|
|
526
477
|
"client.utilities.renderLiquid()",
|
|
527
478
|
"POST",
|
|
528
|
-
"/
|
|
479
|
+
"/utilities/liquidjs/render",
|
|
529
480
|
{ body: params }
|
|
530
481
|
);
|
|
531
482
|
}
|
|
532
483
|
extractLiquidVariables(params) {
|
|
533
|
-
return this.http.
|
|
484
|
+
return this.http.request(
|
|
534
485
|
"client.utilities.extractLiquidVariables()",
|
|
535
486
|
"POST",
|
|
536
|
-
"/
|
|
487
|
+
"/utilities/liquidjs/variables",
|
|
537
488
|
{ body: params }
|
|
538
489
|
);
|
|
539
490
|
}
|
|
540
491
|
renderMarkdown(params) {
|
|
541
|
-
return this.http.
|
|
492
|
+
return this.http.request(
|
|
542
493
|
"client.utilities.renderMarkdown()",
|
|
543
494
|
"POST",
|
|
544
|
-
"/
|
|
495
|
+
"/utilities/markdown/render",
|
|
545
496
|
{ body: params }
|
|
546
497
|
);
|
|
547
498
|
}
|
|
548
499
|
renderEmail(params) {
|
|
549
|
-
return this.http.
|
|
500
|
+
return this.http.request(
|
|
550
501
|
"client.utilities.renderEmail()",
|
|
551
502
|
"POST",
|
|
552
|
-
"/
|
|
503
|
+
"/utilities/render-email",
|
|
553
504
|
{ body: params }
|
|
554
505
|
);
|
|
555
506
|
}
|
|
@@ -566,7 +517,7 @@ var Ulvio = class {
|
|
|
566
517
|
ai;
|
|
567
518
|
htmlToPdf;
|
|
568
519
|
utilities;
|
|
569
|
-
constructor(config
|
|
520
|
+
constructor(config) {
|
|
570
521
|
const http = new HttpClient(config);
|
|
571
522
|
this.mail = new MailClient(http);
|
|
572
523
|
this.mailbox = new MailboxClient(http);
|
|
@@ -583,13 +534,11 @@ export {
|
|
|
583
534
|
AiClient,
|
|
584
535
|
CONNECTOR_UNHEALTHY_CODE,
|
|
585
536
|
FilesClient,
|
|
586
|
-
HTML_TO_PDF_NOT_CONFIGURED_CODE,
|
|
587
537
|
HtmlToPdfClient,
|
|
588
538
|
MailClient,
|
|
589
539
|
MailboxClient,
|
|
590
|
-
|
|
540
|
+
NOT_CONFIGURED_CODE,
|
|
591
541
|
SmsClient,
|
|
592
|
-
UTILITIES_NOT_CONFIGURED_CODE,
|
|
593
542
|
Ulvio,
|
|
594
543
|
UlvioError,
|
|
595
544
|
UtilitiesClient,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/clients/mail.ts","../src/clients/mailbox.ts","../src/clients/sms.ts","../src/clients/whatsapp.ts","../src/clients/voice.ts","../src/clients/files.ts","../src/clients/ai.ts","../src/clients/html-to-pdf.ts","../src/clients/utilities.ts","../src/index.ts"],"sourcesContent":["export interface ErrorResponseBody {\n error: {\n code?: string;\n message: string;\n };\n}\n\nexport const CONNECTOR_UNHEALTHY_CODE = 'CONNECTOR_UNHEALTHY';\n\nexport const PLATFORM_NOT_CONFIGURED_CODE = 'platform_not_configured';\nexport const HTML_TO_PDF_NOT_CONFIGURED_CODE = 'html_to_pdf_not_configured';\nexport const UTILITIES_NOT_CONFIGURED_CODE = 'utilities_not_configured';\n\nexport class UlvioError extends Error {\n readonly code: string;\n readonly status?: number;\n readonly response?: unknown;\n\n constructor(\n code: string,\n message: string,\n options: { status?: number; response?: unknown; cause?: unknown } = {},\n ) {\n super(message, { cause: options.cause });\n this.name = 'UlvioError';\n this.code = code;\n this.status = options.status;\n this.response = options.response;\n }\n}\n\nexport function isConnectorUnhealthyError(err: unknown): boolean {\n if (err instanceof UlvioError) return err.code === CONNECTOR_UNHEALTHY_CODE;\n const response = (err as { response?: ErrorResponseBody })?.response;\n return response?.error?.code === CONNECTOR_UNHEALTHY_CODE;\n}\n","import {\n ErrorResponseBody,\n HTML_TO_PDF_NOT_CONFIGURED_CODE,\n PLATFORM_NOT_CONFIGURED_CODE,\n UTILITIES_NOT_CONFIGURED_CODE,\n UlvioError,\n} from './errors.js';\n\nexport interface UlvioConfig {\n platformApiUrl?: string;\n platformApiKey?: string;\n htmlToPdfApiUrl?: string;\n utilitiesApiUrl?: string;\n}\n\ninterface RequestOptions {\n body?: unknown;\n}\n\ninterface RequestRawOptions {\n body?: BodyInit;\n contentType?: string;\n headers?: Record<string, string>;\n}\n\nfunction trimSlash(url: string): string {\n return url.replace(/\\/$/, '');\n}\n\nasync function parseError(res: Response, fallbackCode = 'request_failed'): Promise<UlvioError> {\n let body: ErrorResponseBody | undefined;\n try {\n body = (await res.json()) as ErrorResponseBody;\n } catch {\n body = undefined;\n }\n const code = body?.error?.code ?? fallbackCode;\n const message = body?.error?.message ?? res.statusText;\n return new UlvioError(code, message, { status: res.status, response: body });\n}\n\nexport class HttpClient {\n constructor(private readonly config: UlvioConfig) {}\n\n private requirePlatform(method: string): { url: string; key: string } {\n const url = this.config.platformApiUrl;\n const key = this.config.platformApiKey;\n if (!url || !key) {\n throw new UlvioError(\n PLATFORM_NOT_CONFIGURED_CODE,\n `${method} requires platformApiUrl and platformApiKey to be set on the Ulvio client`,\n );\n }\n return { url: trimSlash(url), key };\n }\n\n private requireHtmlToPdf(method: string): string {\n const url = this.config.htmlToPdfApiUrl;\n if (!url) {\n throw new UlvioError(\n HTML_TO_PDF_NOT_CONFIGURED_CODE,\n `${method} requires htmlToPdfApiUrl to be set on the Ulvio client`,\n );\n }\n return trimSlash(url);\n }\n\n private requireUtilities(method: string): string {\n const url = this.config.utilitiesApiUrl;\n if (!url) {\n throw new UlvioError(\n UTILITIES_NOT_CONFIGURED_CODE,\n `${method} requires utilitiesApiUrl to be set on the Ulvio client`,\n );\n }\n return trimSlash(url);\n }\n\n // ── Platform (authenticated) ──────────────────────────────────────────\n\n async platformRequest<T>(\n callerName: string,\n method: string,\n path: string,\n options: RequestOptions = {},\n ): Promise<T> {\n const { url, key } = this.requirePlatform(callerName);\n const res = await fetch(`${url}${path}`, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${key}`,\n },\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\n });\n if (!res.ok) throw await parseError(res);\n return (await res.json()) as T;\n }\n\n async platformRequestRaw(\n callerName: string,\n method: string,\n path: string,\n options: RequestRawOptions = {},\n ): Promise<Response> {\n const { url, key } = this.requirePlatform(callerName);\n const headers: Record<string, string> = { ...options.headers };\n if (options.contentType) headers['Content-Type'] = options.contentType;\n headers['Authorization'] = `Bearer ${key}`;\n const res = await fetch(`${url}${path}`, {\n method,\n headers,\n body: options.body,\n });\n if (!res.ok) throw await parseError(res);\n return res;\n }\n\n // ── HTML-to-PDF (unauthenticated) ─────────────────────────────────────\n\n async htmlToPdfFetch(\n callerName: string,\n path: string,\n init: RequestInit,\n ): Promise<Response> {\n const url = this.requireHtmlToPdf(callerName);\n return fetch(`${url}${path}`, init);\n }\n\n // ── Utilities (unauthenticated) ───────────────────────────────────────\n\n async utilitiesRequest<T>(\n callerName: string,\n method: string,\n path: string,\n options: RequestOptions = {},\n ): Promise<T> {\n const url = this.requireUtilities(callerName);\n const res = await fetch(`${url}${path}`, {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\n });\n const data = (await res.json().catch(() => undefined)) as T | undefined;\n if (!res.ok) {\n const errBody = data as ErrorResponseBody | undefined;\n throw new UlvioError(\n errBody?.error?.code ?? 'request_failed',\n errBody?.error?.message ?? res.statusText,\n { status: res.status, response: data },\n );\n }\n return data as T;\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface Attachment {\n filename: string;\n /** Base64-encoded file content. */\n content: string;\n content_type: string;\n}\n\nexport interface TransactionalMailSendRequest {\n from: string;\n to: string[];\n subject: string;\n body_html?: string;\n body_text?: string;\n reply_to?: string;\n attachments?: Attachment[];\n}\n\nexport interface TransactionalMailSendResponse {\n message_id: string;\n}\n\nexport class MailClient {\n constructor(private readonly http: HttpClient) {}\n\n sendTransactional(\n params: TransactionalMailSendRequest,\n ): Promise<TransactionalMailSendResponse> {\n return this.http.platformRequest<TransactionalMailSendResponse>(\n 'client.mail.sendTransactional()',\n 'POST',\n '/v1/transactional-mail/send',\n { body: params },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type { Attachment } from './mail.js';\n\nexport interface MailboxSendRequest {\n to: string[];\n cc?: string[];\n bcc?: string[];\n subject: string;\n body_html?: string;\n body_text?: string;\n /** Message ID to reply to. Threads the message correctly. */\n reply_to_id?: string;\n attachments?: Attachment[];\n}\n\nexport interface MailboxSendResponse {\n message_id: string;\n}\n\nexport interface MailboxAttachment {\n id: string;\n filename: string;\n content_type: string;\n size_bytes: number;\n}\n\nexport interface MailboxMessageSummary {\n id: string;\n subject: string;\n from: string;\n to: string[];\n /** First 150 characters of the body, HTML stripped. */\n preview: string;\n received_at: string;\n has_attachments: boolean;\n is_read: boolean;\n is_processed: boolean;\n processed_at: string | null;\n}\n\nexport interface MailboxMessagesListResponse {\n messages: MailboxMessageSummary[];\n total: number;\n}\n\nexport interface MailboxMessageDetail {\n id: string;\n subject: string;\n from: string;\n to: string[];\n cc: string[];\n bcc: string[];\n body_html?: string;\n body_text?: string;\n received_at: string;\n is_read: boolean;\n is_processed: boolean;\n processed_at: string | null;\n attachments: MailboxAttachment[];\n}\n\nexport interface MailboxMarkProcessedResponse {\n ok: true;\n id: string;\n already_processed: boolean;\n processed_at: string;\n}\n\nexport interface MailboxConnectorStatus {\n healthy: boolean;\n state: 'healthy' | 'unhealthy';\n /** ISO timestamp of the last state change, or null if never changed. */\n changed_at: string | null;\n}\n\nexport class MailboxClient {\n constructor(private readonly http: HttpClient) {}\n\n send(params: MailboxSendRequest): Promise<MailboxSendResponse> {\n return this.http.platformRequest<MailboxSendResponse>(\n 'client.mailbox.send()',\n 'POST',\n '/v1/mailbox/send',\n { body: params },\n );\n }\n\n list(limit?: number): Promise<MailboxMessagesListResponse> {\n const qs = limit !== undefined ? `?limit=${limit}` : '';\n return this.http.platformRequest<MailboxMessagesListResponse>(\n 'client.mailbox.list()',\n 'GET',\n `/v1/mailbox/messages${qs}`,\n );\n }\n\n get(id: string): Promise<MailboxMessageDetail> {\n return this.http.platformRequest<MailboxMessageDetail>(\n 'client.mailbox.get()',\n 'GET',\n `/v1/mailbox/messages/${encodeURIComponent(id)}`,\n );\n }\n\n markProcessed(id: string): Promise<MailboxMarkProcessedResponse> {\n return this.http.platformRequest<MailboxMarkProcessedResponse>(\n 'client.mailbox.markProcessed()',\n 'POST',\n `/v1/mailbox/messages/${encodeURIComponent(id)}/mark-processed`,\n );\n }\n\n /**\n * Download a mailbox message attachment as a Buffer.\n */\n async getAttachment(messageId: string, attachmentId: string): Promise<Buffer> {\n const res = await this.http.platformRequestRaw(\n 'client.mailbox.getAttachment()',\n 'GET',\n `/v1/mailbox/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachmentId)}`,\n );\n const arrayBuffer = await res.arrayBuffer();\n return Buffer.from(arrayBuffer);\n }\n\n getConnectorStatus(): Promise<MailboxConnectorStatus> {\n return this.http.platformRequest<MailboxConnectorStatus>(\n 'client.mailbox.getConnectorStatus()',\n 'GET',\n '/v1/mailbox/connector-status',\n );\n }\n\n /**\n * Dev-only: toggle the mock connector's health state.\n */\n setConnectorStatus(healthy: boolean): Promise<MailboxConnectorStatus> {\n return this.http.platformRequest<MailboxConnectorStatus>(\n 'client.mailbox.setConnectorStatus()',\n 'PATCH',\n '/v1/mailbox/connector-status',\n { body: { healthy } },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface SmsSendRequest {\n /** Sender phone number in E.164 format. */\n from: string;\n /** Recipient phone number in E.164 format. */\n to: string;\n /** SMS text content. Max 1600 characters. */\n body: string;\n}\n\nexport interface SmsSendResponse {\n message_id: string;\n status: 'queued';\n}\n\nexport class SmsClient {\n constructor(private readonly http: HttpClient) {}\n\n send(params: SmsSendRequest): Promise<SmsSendResponse> {\n return this.http.platformRequest<SmsSendResponse>(\n 'client.sms.send()',\n 'POST',\n '/v1/sms/send',\n { body: params },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface WhatsAppParameter {\n type: 'text' | 'image' | 'document' | 'video';\n parameter_name?: string;\n text?: string;\n image?: { link: string };\n document?: { link: string; filename: string };\n video?: { link: string };\n}\n\nexport interface WhatsAppComponent {\n type: 'header' | 'body' | 'button';\n sub_type?: 'url' | 'quick_reply';\n index?: number;\n parameters: WhatsAppParameter[];\n}\n\nexport interface WhatsAppSendRequest {\n /** Recipient phone number in E.164 format. */\n to: string;\n /** Pre-approved WhatsApp template name. */\n template_name: string;\n /** BCP 47 language code (e.g. \"en\", \"nl\", \"fr\"). */\n language_code: string;\n components?: WhatsAppComponent[];\n}\n\nexport interface WhatsAppSendResponse {\n message_id: string;\n status: 'queued';\n}\n\nexport class WhatsAppClient {\n constructor(private readonly http: HttpClient) {}\n\n send(params: WhatsAppSendRequest): Promise<WhatsAppSendResponse> {\n return this.http.platformRequest<WhatsAppSendResponse>(\n 'client.whatsapp.send()',\n 'POST',\n '/v1/whatsapp/send',\n { body: params },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface VoiceTranscribeRequest {\n /** Base64-encoded audio buffer. */\n file: string;\n file_name: string;\n /** Optional BCP-47 language code (e.g. \"en\", \"nl\"). */\n language_code?: string;\n}\n\nexport interface VoiceTranscribeResponse {\n job_id: string;\n status: string;\n text: string;\n}\n\nexport class VoiceClient {\n constructor(private readonly http: HttpClient) {}\n\n transcribe(params: VoiceTranscribeRequest): Promise<VoiceTranscribeResponse> {\n return this.http.platformRequest<VoiceTranscribeResponse>(\n 'client.voice.transcribe()',\n 'POST',\n '/v1/voice/send',\n { body: params },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface FileUploadResponse {\n key: string;\n content_type: string;\n size_bytes: number;\n}\n\nexport interface FileListItem {\n key: string;\n is_folder: boolean;\n content_type: string | null;\n size_bytes: number;\n created_at: string | null;\n}\n\nexport interface FileListResponse {\n files: FileListItem[];\n next_cursor: string | null;\n}\n\nexport interface PresignedUrlResponse {\n url: string;\n expires_in: number;\n}\n\nexport type FileUploadBody = Buffer | Uint8Array | ReadableStream | string;\n\nexport class FilesClient {\n constructor(private readonly http: HttpClient) {}\n\n async upload(\n key: string,\n file: FileUploadBody,\n contentType: string = 'application/octet-stream',\n ): Promise<FileUploadResponse> {\n const res = await this.http.platformRequestRaw(\n 'client.files.upload()',\n 'PUT',\n `/v1/files/${encodeURI(key)}`,\n { body: file as BodyInit, contentType },\n );\n return (await res.json()) as FileUploadResponse;\n }\n\n /**\n * Download a file. Returns the raw Response for streaming.\n */\n get(key: string): Promise<Response> {\n return this.http.platformRequestRaw(\n 'client.files.get()',\n 'GET',\n `/v1/files/${encodeURI(key)}`,\n );\n }\n\n list(prefix?: string, limit?: number, cursor?: string): Promise<FileListResponse> {\n const params = new URLSearchParams();\n if (prefix) params.set('prefix', prefix);\n if (limit !== undefined) params.set('limit', String(limit));\n if (cursor) params.set('cursor', cursor);\n const qs = params.toString();\n return this.http.platformRequest<FileListResponse>(\n 'client.files.list()',\n 'GET',\n `/v1/files${qs ? `?${qs}` : ''}`,\n );\n }\n\n delete(key: string): Promise<{ ok: true }> {\n return this.http.platformRequest<{ ok: true }>(\n 'client.files.delete()',\n 'DELETE',\n `/v1/files/${encodeURI(key)}`,\n );\n }\n\n deleteMany(prefix: string): Promise<{ ok: true; deleted: number }> {\n return this.http.platformRequest<{ ok: true; deleted: number }>(\n 'client.files.deleteMany()',\n 'DELETE',\n `/v1/files?prefix=${encodeURIComponent(prefix)}`,\n );\n }\n\n /**\n * Generate a time-limited download URL for a file.\n * @param expiresIn TTL in seconds (default 3600, min 60, max 86400)\n */\n presignedDownloadUrl(key: string, expiresIn?: number): Promise<PresignedUrlResponse> {\n return this.http.platformRequest<PresignedUrlResponse>(\n 'client.files.presignedDownloadUrl()',\n 'POST',\n '/v1/files/presigned-download',\n { body: { key, expires_in: expiresIn } },\n );\n }\n\n /**\n * Generate a time-limited upload URL for a file.\n * @param expiresIn TTL in seconds (default 3600, min 60, max 86400)\n * @param maxSize Max file size in bytes (default 50MB)\n */\n presignedUploadUrl(\n key: string,\n contentType: string,\n expiresIn?: number,\n maxSize?: number,\n ): Promise<PresignedUrlResponse> {\n return this.http.platformRequest<PresignedUrlResponse>(\n 'client.files.presignedUploadUrl()',\n 'POST',\n '/v1/files/presigned-upload',\n {\n body: { key, content_type: contentType, expires_in: expiresIn, max_size: maxSize },\n },\n );\n }\n}\n","import { z } from 'zod';\nimport type { HttpClient } from '../http.js';\nimport { UlvioError, type ErrorResponseBody } from '../errors.js';\n\nexport type Role = 'user' | 'assistant' | 'system';\n\nexport interface InputMessage {\n role: Role;\n content: string;\n}\n\nexport type Input = string | InputMessage[];\n\nexport interface ParseRequest<TSchema extends z.ZodType> {\n /** Model identifier, e.g. \"claude-opus-4-7\", \"claude-sonnet-4-6\". */\n model: string;\n input: Input;\n /** Zod schema describing the structured output shape. */\n schema: TSchema;\n}\n\nexport interface ParseResponse<T> {\n data: T;\n}\n\nexport type StreamEvent<T> =\n | { type: 'partial'; data: Partial<T> }\n | { type: 'complete'; data: T }\n | { type: 'error'; message: string };\n\ninterface WirePayload {\n model: string;\n input: Input;\n /** JSON Schema serialized from the supplied Zod schema. */\n schema: unknown;\n}\n\nfunction buildPayload<TSchema extends z.ZodType>(\n params: ParseRequest<TSchema>,\n): WirePayload {\n return {\n model: params.model,\n input: params.input,\n schema: z.toJSONSchema(params.schema),\n };\n}\n\nfunction parseSseEvents(chunk: string): Array<{ event: string; data: string }> {\n const events: Array<{ event: string; data: string }> = [];\n let currentEvent = '';\n let currentData = '';\n\n for (const line of chunk.split('\\n')) {\n if (line.startsWith('event: ')) {\n currentEvent = line.slice(7);\n } else if (line.startsWith('data: ')) {\n currentData = line.slice(6);\n } else if (line === '' && currentEvent) {\n events.push({ event: currentEvent, data: currentData });\n currentEvent = '';\n currentData = '';\n }\n }\n\n return events;\n}\n\nexport class AiClient {\n constructor(private readonly http: HttpClient) {}\n\n async parse<TSchema extends z.ZodType>(\n params: ParseRequest<TSchema>,\n ): Promise<z.infer<TSchema>> {\n const wire = buildPayload(params);\n const response = await this.http.platformRequest<ParseResponse<unknown>>(\n 'client.ai.parse()',\n 'POST',\n '/v1/ai/parse',\n { body: wire },\n );\n return params.schema.parse(response.data) as z.infer<TSchema>;\n }\n\n async *stream<TSchema extends z.ZodType>(\n params: ParseRequest<TSchema>,\n ): AsyncGenerator<StreamEvent<z.infer<TSchema>>, void, void> {\n const wire = buildPayload(params);\n const res = await this.http.platformRequestRaw(\n 'client.ai.stream()',\n 'POST',\n '/v1/ai/stream',\n {\n body: JSON.stringify(wire),\n contentType: 'application/json',\n headers: { Accept: 'text/event-stream' },\n },\n );\n\n if (!res.body) {\n throw new UlvioError('stream_no_body', 'AI stream returned no response body', {\n status: res.status,\n });\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n const events = parseSseEvents(buffer);\n const lastBoundary = buffer.lastIndexOf('\\n\\n');\n buffer = lastBoundary >= 0 ? buffer.slice(lastBoundary + 2) : buffer;\n\n for (const { event, data } of events) {\n switch (event) {\n case 'partial':\n yield { type: 'partial', data: JSON.parse(data) as Partial<z.infer<TSchema>> };\n break;\n case 'complete': {\n const parsed = params.schema.parse(JSON.parse(data));\n yield { type: 'complete', data: parsed as z.infer<TSchema> };\n return;\n }\n case 'error': {\n const errBody = JSON.parse(data) as ErrorResponseBody['error'] | { message: string };\n throw new UlvioError(\n ('code' in errBody && errBody.code) || 'ai_stream_error',\n errBody.message,\n );\n }\n }\n }\n }\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { UlvioError, type ErrorResponseBody } from '../errors.js';\n\nexport interface PdfOptions {\n format?: string;\n printBackground?: boolean;\n margin?: {\n top?: string;\n right?: string;\n bottom?: string;\n left?: string;\n };\n}\n\nexport interface HtmlToPdfBase64Request {\n /** Base64-encoded HTML content. Provide either `html` or `sourceUrl`. */\n html?: string;\n sourceUrl?: string;\n outputMode: 'base64';\n options?: PdfOptions;\n}\n\nexport interface HtmlToPdfUploadRequest {\n html?: string;\n sourceUrl?: string;\n /** Pre-signed URL the service will PUT the rendered PDF to. */\n uploadUrl: string;\n options?: PdfOptions;\n}\n\nexport type HtmlToPdfRequest = HtmlToPdfBase64Request | HtmlToPdfUploadRequest;\n\nexport interface HtmlToPdfBase64Response {\n pdf: string;\n}\n\nexport interface HtmlToPdfUploadResponse {\n uploaded: true;\n bytes: number;\n}\n\nexport type HtmlToPdfResponse = HtmlToPdfBase64Response | HtmlToPdfUploadResponse;\n\nexport interface QueuedEvent {\n position: number;\n}\n\nexport interface ProcessingEvent {\n step: string;\n progress: number;\n}\n\nexport interface HtmlToPdfCallbacks {\n onQueued?: (data: QueuedEvent) => void;\n onProcessing?: (data: ProcessingEvent) => void;\n}\n\nfunction parseSseEvents(chunk: string): Array<{ event: string; data: string }> {\n const events: Array<{ event: string; data: string }> = [];\n let currentEvent = '';\n let currentData = '';\n\n for (const line of chunk.split('\\n')) {\n if (line.startsWith('event: ')) {\n currentEvent = line.slice(7);\n } else if (line.startsWith('data: ')) {\n currentData = line.slice(6);\n } else if (line === '' && currentEvent) {\n events.push({ event: currentEvent, data: currentData });\n currentEvent = '';\n currentData = '';\n }\n }\n\n return events;\n}\n\nexport class HtmlToPdfClient {\n constructor(private readonly http: HttpClient) {}\n\n async convert(\n params: HtmlToPdfBase64Request,\n callbacks?: HtmlToPdfCallbacks,\n ): Promise<HtmlToPdfBase64Response>;\n async convert(\n params: HtmlToPdfUploadRequest,\n callbacks?: HtmlToPdfCallbacks,\n ): Promise<HtmlToPdfUploadResponse>;\n async convert(\n params: HtmlToPdfRequest,\n callbacks?: HtmlToPdfCallbacks,\n ): Promise<HtmlToPdfResponse> {\n const res = await this.http.htmlToPdfFetch('client.htmlToPdf.convert()', '/api/html-to-pdf', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(params),\n });\n\n if (!res.ok) {\n const data = (await res.json().catch(() => undefined)) as\n | ErrorResponseBody\n | undefined;\n throw new UlvioError(\n data?.error?.code ?? 'html_to_pdf_failed',\n data?.error?.message ?? res.statusText,\n { status: res.status, response: data },\n );\n }\n\n if (!res.body) {\n throw new UlvioError('html_to_pdf_no_body', 'html-to-pdf service returned no body', {\n status: res.status,\n });\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n const events = parseSseEvents(buffer);\n const lastBoundary = buffer.lastIndexOf('\\n\\n');\n buffer = lastBoundary >= 0 ? buffer.slice(lastBoundary + 2) : buffer;\n\n for (const { event, data } of events) {\n switch (event) {\n case 'queued':\n callbacks?.onQueued?.(JSON.parse(data) as QueuedEvent);\n break;\n case 'processing':\n callbacks?.onProcessing?.(JSON.parse(data) as ProcessingEvent);\n break;\n case 'complete':\n return JSON.parse(data) as HtmlToPdfResponse;\n case 'error': {\n const errBody = JSON.parse(data) as { code?: string; message: string };\n throw new UlvioError(\n errBody.code ?? 'html_to_pdf_error',\n errBody.message,\n );\n }\n }\n }\n }\n\n throw new UlvioError(\n 'html_to_pdf_truncated',\n 'SSE stream ended without a complete event',\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\n// MJML\n\nexport interface MjmlValidationError {\n line: number;\n message: string;\n tagName: string;\n formattedMessage: string;\n}\n\nexport interface MjmlCompileRequest {\n mjml: string;\n options?: {\n minify?: boolean;\n beautify?: boolean;\n validationLevel?: 'strict' | 'soft' | 'skip';\n };\n}\n\nexport interface MjmlCompileResponse {\n html: string;\n errors: MjmlValidationError[];\n}\n\n// LiquidJS\n\nexport interface LiquidRenderRequest {\n template: string;\n data: Record<string, unknown>;\n}\n\nexport interface LiquidRenderResponse {\n result: string;\n}\n\nexport interface LiquidVariablesRequest {\n template: string;\n}\n\nexport interface LiquidVariablesResponse {\n variables: string[];\n}\n\n// Markdown\n\nexport interface MarkdownRenderRequest {\n markdown: string;\n}\n\nexport interface MarkdownRenderResponse {\n html: string;\n}\n\n// Combined Liquid → MJML pipeline\n\nexport interface RenderEmailRequest {\n mjml: string;\n data: Record<string, unknown>;\n options?: {\n minify?: boolean;\n beautify?: boolean;\n validationLevel?: 'strict' | 'soft' | 'skip';\n };\n}\n\nexport interface RenderEmailResponse {\n html: string;\n errors: MjmlValidationError[];\n}\n\nexport class UtilitiesClient {\n constructor(private readonly http: HttpClient) {}\n\n compileMjml(params: MjmlCompileRequest): Promise<MjmlCompileResponse> {\n return this.http.utilitiesRequest<MjmlCompileResponse>(\n 'client.utilities.compileMjml()',\n 'POST',\n '/api/mjml/compile',\n { body: params },\n );\n }\n\n renderLiquid(params: LiquidRenderRequest): Promise<LiquidRenderResponse> {\n return this.http.utilitiesRequest<LiquidRenderResponse>(\n 'client.utilities.renderLiquid()',\n 'POST',\n '/api/liquidjs/render',\n { body: params },\n );\n }\n\n extractLiquidVariables(\n params: LiquidVariablesRequest,\n ): Promise<LiquidVariablesResponse> {\n return this.http.utilitiesRequest<LiquidVariablesResponse>(\n 'client.utilities.extractLiquidVariables()',\n 'POST',\n '/api/liquidjs/variables',\n { body: params },\n );\n }\n\n renderMarkdown(params: MarkdownRenderRequest): Promise<MarkdownRenderResponse> {\n return this.http.utilitiesRequest<MarkdownRenderResponse>(\n 'client.utilities.renderMarkdown()',\n 'POST',\n '/api/markdown/render',\n { body: params },\n );\n }\n\n renderEmail(params: RenderEmailRequest): Promise<RenderEmailResponse> {\n return this.http.utilitiesRequest<RenderEmailResponse>(\n 'client.utilities.renderEmail()',\n 'POST',\n '/api/render-email',\n { body: params },\n );\n }\n}\n","import { HttpClient, type UlvioConfig } from './http.js';\nimport { MailClient } from './clients/mail.js';\nimport { MailboxClient } from './clients/mailbox.js';\nimport { SmsClient } from './clients/sms.js';\nimport { WhatsAppClient } from './clients/whatsapp.js';\nimport { VoiceClient } from './clients/voice.js';\nimport { FilesClient } from './clients/files.js';\nimport { AiClient } from './clients/ai.js';\nimport { HtmlToPdfClient } from './clients/html-to-pdf.js';\nimport { UtilitiesClient } from './clients/utilities.js';\n\nexport class Ulvio {\n readonly mail: MailClient;\n readonly mailbox: MailboxClient;\n readonly sms: SmsClient;\n readonly whatsapp: WhatsAppClient;\n readonly voice: VoiceClient;\n readonly files: FilesClient;\n readonly ai: AiClient;\n readonly htmlToPdf: HtmlToPdfClient;\n readonly utilities: UtilitiesClient;\n\n constructor(config: UlvioConfig = {}) {\n const http = new HttpClient(config);\n this.mail = new MailClient(http);\n this.mailbox = new MailboxClient(http);\n this.sms = new SmsClient(http);\n this.whatsapp = new WhatsAppClient(http);\n this.voice = new VoiceClient(http);\n this.files = new FilesClient(http);\n this.ai = new AiClient(http);\n this.htmlToPdf = new HtmlToPdfClient(http);\n this.utilities = new UtilitiesClient(http);\n }\n}\n\nexport type { UlvioConfig } from './http.js';\n\n// Errors\nexport {\n UlvioError,\n CONNECTOR_UNHEALTHY_CODE,\n PLATFORM_NOT_CONFIGURED_CODE,\n HTML_TO_PDF_NOT_CONFIGURED_CODE,\n UTILITIES_NOT_CONFIGURED_CODE,\n isConnectorUnhealthyError,\n type ErrorResponseBody,\n} from './errors.js';\n\n// Sub-client classes\nexport { MailClient } from './clients/mail.js';\nexport { MailboxClient } from './clients/mailbox.js';\nexport { SmsClient } from './clients/sms.js';\nexport { WhatsAppClient } from './clients/whatsapp.js';\nexport { VoiceClient } from './clients/voice.js';\nexport { FilesClient } from './clients/files.js';\nexport { AiClient } from './clients/ai.js';\nexport { HtmlToPdfClient } from './clients/html-to-pdf.js';\nexport { UtilitiesClient } from './clients/utilities.js';\n\n// Mail types\nexport type {\n Attachment,\n TransactionalMailSendRequest,\n TransactionalMailSendResponse,\n} from './clients/mail.js';\n\n// Mailbox types\nexport type {\n MailboxSendRequest,\n MailboxSendResponse,\n MailboxAttachment,\n MailboxMessageSummary,\n MailboxMessagesListResponse,\n MailboxMessageDetail,\n MailboxMarkProcessedResponse,\n MailboxConnectorStatus,\n} from './clients/mailbox.js';\n\n// SMS types\nexport type { SmsSendRequest, SmsSendResponse } from './clients/sms.js';\n\n// WhatsApp types\nexport type {\n WhatsAppParameter,\n WhatsAppComponent,\n WhatsAppSendRequest,\n WhatsAppSendResponse,\n} from './clients/whatsapp.js';\n\n// Voice types\nexport type { VoiceTranscribeRequest, VoiceTranscribeResponse } from './clients/voice.js';\n\n// Files types\nexport type {\n FileUploadResponse,\n FileListItem,\n FileListResponse,\n PresignedUrlResponse,\n FileUploadBody,\n} from './clients/files.js';\n\n// AI types\nexport type {\n Role,\n InputMessage,\n Input,\n ParseRequest,\n ParseResponse,\n StreamEvent,\n} from './clients/ai.js';\n\n// HTML-to-PDF types\nexport type {\n PdfOptions,\n HtmlToPdfBase64Request,\n HtmlToPdfUploadRequest,\n HtmlToPdfRequest,\n HtmlToPdfBase64Response,\n HtmlToPdfUploadResponse,\n HtmlToPdfResponse,\n QueuedEvent,\n ProcessingEvent,\n HtmlToPdfCallbacks,\n} from './clients/html-to-pdf.js';\n\n// Utilities types\nexport type {\n MjmlValidationError,\n MjmlCompileRequest,\n MjmlCompileResponse,\n LiquidRenderRequest,\n LiquidRenderResponse,\n LiquidVariablesRequest,\n LiquidVariablesResponse,\n MarkdownRenderRequest,\n MarkdownRenderResponse,\n RenderEmailRequest,\n RenderEmailResponse,\n} from './clients/utilities.js';\n"],"mappings":"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","names":["parseSseEvents"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/clients/mail.ts","../src/clients/mailbox.ts","../src/clients/sms.ts","../src/clients/whatsapp.ts","../src/clients/voice.ts","../src/clients/files.ts","../src/clients/ai.ts","../src/clients/html-to-pdf.ts","../src/clients/utilities.ts","../src/index.ts"],"sourcesContent":["export interface ErrorResponseBody {\n error: {\n code?: string;\n message: string;\n };\n}\n\nexport const CONNECTOR_UNHEALTHY_CODE = 'CONNECTOR_UNHEALTHY';\n\nexport const NOT_CONFIGURED_CODE = 'not_configured';\n\nexport class UlvioError extends Error {\n readonly code: string;\n readonly status?: number;\n readonly response?: unknown;\n\n constructor(\n code: string,\n message: string,\n options: { status?: number; response?: unknown; cause?: unknown } = {},\n ) {\n super(message, { cause: options.cause });\n this.name = 'UlvioError';\n this.code = code;\n this.status = options.status;\n this.response = options.response;\n }\n}\n\nexport function isConnectorUnhealthyError(err: unknown): boolean {\n if (err instanceof UlvioError) return err.code === CONNECTOR_UNHEALTHY_CODE;\n const response = (err as { response?: ErrorResponseBody })?.response;\n return response?.error?.code === CONNECTOR_UNHEALTHY_CODE;\n}\n","import { ErrorResponseBody, NOT_CONFIGURED_CODE, UlvioError } from './errors.js';\n\nexport interface UlvioConfig {\n baseUrl?: string;\n apiKey?: string;\n}\n\ninterface RequestOptions {\n body?: unknown;\n}\n\ninterface RequestRawOptions {\n body?: BodyInit;\n contentType?: string;\n headers?: Record<string, string>;\n}\n\nfunction trimSlash(url: string): string {\n return url.replace(/\\/$/, '');\n}\n\nasync function parseError(res: Response, fallbackCode = 'request_failed'): Promise<UlvioError> {\n let body: ErrorResponseBody | undefined;\n try {\n body = (await res.json()) as ErrorResponseBody;\n } catch {\n body = undefined;\n }\n const code = body?.error?.code ?? fallbackCode;\n const message = body?.error?.message ?? res.statusText;\n return new UlvioError(code, message, { status: res.status, response: body });\n}\n\nexport class HttpClient {\n constructor(private readonly config: UlvioConfig) {}\n\n private requireConfig(method: string): { url: string; key: string } {\n const url = this.config.baseUrl;\n const key = this.config.apiKey;\n if (!url || !key) {\n const missing = !url && !key ? 'baseUrl and apiKey' : !url ? 'baseUrl' : 'apiKey';\n throw new UlvioError(\n NOT_CONFIGURED_CODE,\n `${method} requires ${missing} to be set on the Ulvio client`,\n );\n }\n return { url: trimSlash(url), key };\n }\n\n async request<T>(\n callerName: string,\n method: string,\n path: string,\n options: RequestOptions = {},\n ): Promise<T> {\n const { url, key } = this.requireConfig(callerName);\n const res = await fetch(`${url}${path}`, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${key}`,\n },\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\n });\n if (!res.ok) throw await parseError(res);\n return (await res.json()) as T;\n }\n\n async requestRaw(\n callerName: string,\n method: string,\n path: string,\n options: RequestRawOptions = {},\n ): Promise<Response> {\n const { url, key } = this.requireConfig(callerName);\n const headers: Record<string, string> = { ...options.headers };\n if (options.contentType) headers['Content-Type'] = options.contentType;\n headers['Authorization'] = `Bearer ${key}`;\n const res = await fetch(`${url}${path}`, {\n method,\n headers,\n body: options.body,\n });\n if (!res.ok) throw await parseError(res);\n return res;\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface Attachment {\n filename: string;\n /** Base64-encoded file content. */\n content: string;\n content_type: string;\n}\n\nexport interface TransactionalMailSendRequest {\n from: string;\n to: string[];\n subject: string;\n body_html?: string;\n body_text?: string;\n reply_to?: string;\n attachments?: Attachment[];\n}\n\nexport interface TransactionalMailSendResponse {\n message_id: string;\n}\n\nexport class MailClient {\n constructor(private readonly http: HttpClient) {}\n\n sendTransactional(\n params: TransactionalMailSendRequest,\n ): Promise<TransactionalMailSendResponse> {\n return this.http.request<TransactionalMailSendResponse>(\n 'client.mail.sendTransactional()',\n 'POST',\n '/v1/transactional-mail/send',\n { body: params },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type { Attachment } from './mail.js';\n\nexport interface MailboxSendRequest {\n to: string[];\n cc?: string[];\n bcc?: string[];\n subject: string;\n body_html?: string;\n body_text?: string;\n /** Message ID to reply to. Threads the message correctly. */\n reply_to_id?: string;\n attachments?: Attachment[];\n}\n\nexport interface MailboxSendResponse {\n message_id: string;\n}\n\nexport interface MailboxAttachment {\n id: string;\n filename: string;\n content_type: string;\n size_bytes: number;\n}\n\nexport interface MailboxMessageSummary {\n id: string;\n subject: string;\n from: string;\n to: string[];\n /** First 150 characters of the body, HTML stripped. */\n preview: string;\n received_at: string;\n has_attachments: boolean;\n is_read: boolean;\n is_processed: boolean;\n processed_at: string | null;\n}\n\nexport interface MailboxMessagesListResponse {\n messages: MailboxMessageSummary[];\n total: number;\n}\n\nexport interface MailboxMessageDetail {\n id: string;\n subject: string;\n from: string;\n to: string[];\n cc: string[];\n bcc: string[];\n body_html?: string;\n body_text?: string;\n received_at: string;\n is_read: boolean;\n is_processed: boolean;\n processed_at: string | null;\n attachments: MailboxAttachment[];\n}\n\nexport interface MailboxMarkProcessedResponse {\n ok: true;\n id: string;\n already_processed: boolean;\n processed_at: string;\n}\n\nexport interface MailboxConnectorStatus {\n healthy: boolean;\n state: 'healthy' | 'unhealthy';\n /** ISO timestamp of the last state change, or null if never changed. */\n changed_at: string | null;\n}\n\nexport class MailboxClient {\n constructor(private readonly http: HttpClient) {}\n\n send(params: MailboxSendRequest): Promise<MailboxSendResponse> {\n return this.http.request<MailboxSendResponse>(\n 'client.mailbox.send()',\n 'POST',\n '/v1/mailbox/send',\n { body: params },\n );\n }\n\n list(limit?: number): Promise<MailboxMessagesListResponse> {\n const qs = limit !== undefined ? `?limit=${limit}` : '';\n return this.http.request<MailboxMessagesListResponse>(\n 'client.mailbox.list()',\n 'GET',\n `/v1/mailbox/messages${qs}`,\n );\n }\n\n get(id: string): Promise<MailboxMessageDetail> {\n return this.http.request<MailboxMessageDetail>(\n 'client.mailbox.get()',\n 'GET',\n `/v1/mailbox/messages/${encodeURIComponent(id)}`,\n );\n }\n\n markProcessed(id: string): Promise<MailboxMarkProcessedResponse> {\n return this.http.request<MailboxMarkProcessedResponse>(\n 'client.mailbox.markProcessed()',\n 'POST',\n `/v1/mailbox/messages/${encodeURIComponent(id)}/mark-processed`,\n );\n }\n\n /**\n * Download a mailbox message attachment as a Buffer.\n */\n async getAttachment(messageId: string, attachmentId: string): Promise<Buffer> {\n const res = await this.http.requestRaw(\n 'client.mailbox.getAttachment()',\n 'GET',\n `/v1/mailbox/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachmentId)}`,\n );\n const arrayBuffer = await res.arrayBuffer();\n return Buffer.from(arrayBuffer);\n }\n\n getConnectorStatus(): Promise<MailboxConnectorStatus> {\n return this.http.request<MailboxConnectorStatus>(\n 'client.mailbox.getConnectorStatus()',\n 'GET',\n '/v1/mailbox/connector-status',\n );\n }\n\n /**\n * Dev-only: toggle the mock connector's health state.\n */\n setConnectorStatus(healthy: boolean): Promise<MailboxConnectorStatus> {\n return this.http.request<MailboxConnectorStatus>(\n 'client.mailbox.setConnectorStatus()',\n 'PATCH',\n '/v1/mailbox/connector-status',\n { body: { healthy } },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface SmsSendRequest {\n /** Sender phone number in E.164 format. */\n from: string;\n /** Recipient phone number in E.164 format. */\n to: string;\n /** SMS text content. Max 1600 characters. */\n body: string;\n}\n\nexport interface SmsSendResponse {\n message_id: string;\n status: 'queued';\n}\n\nexport class SmsClient {\n constructor(private readonly http: HttpClient) {}\n\n send(params: SmsSendRequest): Promise<SmsSendResponse> {\n return this.http.request<SmsSendResponse>(\n 'client.sms.send()',\n 'POST',\n '/v1/sms/send',\n { body: params },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface WhatsAppParameter {\n type: 'text' | 'image' | 'document' | 'video';\n parameter_name?: string;\n text?: string;\n image?: { link: string };\n document?: { link: string; filename: string };\n video?: { link: string };\n}\n\nexport interface WhatsAppComponent {\n type: 'header' | 'body' | 'button';\n sub_type?: 'url' | 'quick_reply';\n index?: number;\n parameters: WhatsAppParameter[];\n}\n\nexport interface WhatsAppSendRequest {\n /** Recipient phone number in E.164 format. */\n to: string;\n /** Pre-approved WhatsApp template name. */\n template_name: string;\n /** BCP 47 language code (e.g. \"en\", \"nl\", \"fr\"). */\n language_code: string;\n components?: WhatsAppComponent[];\n}\n\nexport interface WhatsAppSendResponse {\n message_id: string;\n status: 'queued';\n}\n\nexport class WhatsAppClient {\n constructor(private readonly http: HttpClient) {}\n\n send(params: WhatsAppSendRequest): Promise<WhatsAppSendResponse> {\n return this.http.request<WhatsAppSendResponse>(\n 'client.whatsapp.send()',\n 'POST',\n '/v1/whatsapp/send',\n { body: params },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface VoiceTranscribeRequest {\n /** Base64-encoded audio buffer. */\n file: string;\n file_name: string;\n /** Optional BCP-47 language code (e.g. \"en\", \"nl\"). */\n language_code?: string;\n}\n\nexport interface VoiceTranscribeResponse {\n job_id: string;\n status: string;\n text: string;\n}\n\nexport class VoiceClient {\n constructor(private readonly http: HttpClient) {}\n\n transcribe(params: VoiceTranscribeRequest): Promise<VoiceTranscribeResponse> {\n return this.http.request<VoiceTranscribeResponse>(\n 'client.voice.transcribe()',\n 'POST',\n '/v1/voice/send',\n { body: params },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface FileUploadResponse {\n key: string;\n content_type: string;\n size_bytes: number;\n}\n\nexport interface FileListItem {\n key: string;\n is_folder: boolean;\n content_type: string | null;\n size_bytes: number;\n created_at: string | null;\n}\n\nexport interface FileListResponse {\n files: FileListItem[];\n next_cursor: string | null;\n}\n\nexport interface PresignedUrlResponse {\n url: string;\n expires_in: number;\n}\n\nexport type FileUploadBody = Buffer | Uint8Array | ReadableStream | string;\n\nexport class FilesClient {\n constructor(private readonly http: HttpClient) {}\n\n async upload(\n key: string,\n file: FileUploadBody,\n contentType: string = 'application/octet-stream',\n ): Promise<FileUploadResponse> {\n const res = await this.http.requestRaw(\n 'client.files.upload()',\n 'PUT',\n `/v1/files/${encodeURI(key)}`,\n { body: file as BodyInit, contentType },\n );\n return (await res.json()) as FileUploadResponse;\n }\n\n /**\n * Download a file. Returns the raw Response for streaming.\n */\n get(key: string): Promise<Response> {\n return this.http.requestRaw(\n 'client.files.get()',\n 'GET',\n `/v1/files/${encodeURI(key)}`,\n );\n }\n\n list(prefix?: string, limit?: number, cursor?: string): Promise<FileListResponse> {\n const params = new URLSearchParams();\n if (prefix) params.set('prefix', prefix);\n if (limit !== undefined) params.set('limit', String(limit));\n if (cursor) params.set('cursor', cursor);\n const qs = params.toString();\n return this.http.request<FileListResponse>(\n 'client.files.list()',\n 'GET',\n `/v1/files${qs ? `?${qs}` : ''}`,\n );\n }\n\n delete(key: string): Promise<{ ok: true }> {\n return this.http.request<{ ok: true }>(\n 'client.files.delete()',\n 'DELETE',\n `/v1/files/${encodeURI(key)}`,\n );\n }\n\n deleteMany(prefix: string): Promise<{ ok: true; deleted: number }> {\n return this.http.request<{ ok: true; deleted: number }>(\n 'client.files.deleteMany()',\n 'DELETE',\n `/v1/files?prefix=${encodeURIComponent(prefix)}`,\n );\n }\n\n /**\n * Generate a time-limited download URL for a file.\n * @param expiresIn TTL in seconds (default 3600, min 60, max 86400)\n */\n presignedDownloadUrl(key: string, expiresIn?: number): Promise<PresignedUrlResponse> {\n return this.http.request<PresignedUrlResponse>(\n 'client.files.presignedDownloadUrl()',\n 'POST',\n '/v1/files/presigned-download',\n { body: { key, expires_in: expiresIn } },\n );\n }\n\n /**\n * Generate a time-limited upload URL for a file.\n * @param expiresIn TTL in seconds (default 3600, min 60, max 86400)\n * @param maxSize Max file size in bytes (default 50MB)\n */\n presignedUploadUrl(\n key: string,\n contentType: string,\n expiresIn?: number,\n maxSize?: number,\n ): Promise<PresignedUrlResponse> {\n return this.http.request<PresignedUrlResponse>(\n 'client.files.presignedUploadUrl()',\n 'POST',\n '/v1/files/presigned-upload',\n {\n body: { key, content_type: contentType, expires_in: expiresIn, max_size: maxSize },\n },\n );\n }\n}\n","import { z } from 'zod';\nimport type { HttpClient } from '../http.js';\nimport { UlvioError, type ErrorResponseBody } from '../errors.js';\n\nexport type Role = 'user' | 'assistant' | 'system';\n\nexport interface InputTextPart { type: 'input_text'; text: string }\nexport interface InputImagePart { type: 'input_image'; image_url: string }\nexport interface InputFilePart { type: 'input_file'; filename: string; file_data: string }\nexport type ContentPart = InputTextPart | InputImagePart | InputFilePart;\n\nexport interface InputMessage {\n role: Role;\n content: string | ContentPart[];\n}\n\nexport type Input = string | InputMessage[];\n\nexport interface ParseRequest<TSchema extends z.ZodType> {\n /** Model identifier, e.g. \"claude-opus-4-7\", \"claude-sonnet-4-6\". */\n model: string;\n input: Input;\n /** Zod schema describing the structured output shape. */\n schema: TSchema;\n}\n\nexport interface ParseResponse<T> {\n data: T;\n}\n\nexport type StreamEvent<T> =\n | { type: 'partial'; data: Partial<T> }\n | { type: 'complete'; data: T }\n | { type: 'error'; message: string };\n\ninterface WirePayload {\n model: string;\n input: Input;\n /** JSON Schema serialized from the supplied Zod schema. */\n schema: unknown;\n}\n\nfunction buildPayload<TSchema extends z.ZodType>(\n params: ParseRequest<TSchema>,\n): WirePayload {\n return {\n model: params.model,\n input: params.input,\n schema: z.toJSONSchema(params.schema),\n };\n}\n\nfunction parseSseEvents(chunk: string): Array<{ event: string; data: string }> {\n const events: Array<{ event: string; data: string }> = [];\n let currentEvent = '';\n let currentData = '';\n\n for (const line of chunk.split('\\n')) {\n if (line.startsWith('event: ')) {\n currentEvent = line.slice(7);\n } else if (line.startsWith('data: ')) {\n currentData = line.slice(6);\n } else if (line === '' && currentEvent) {\n events.push({ event: currentEvent, data: currentData });\n currentEvent = '';\n currentData = '';\n }\n }\n\n return events;\n}\n\nexport class AiClient {\n constructor(private readonly http: HttpClient) {}\n\n async parse<TSchema extends z.ZodType>(\n params: ParseRequest<TSchema>,\n ): Promise<z.infer<TSchema>> {\n const wire = buildPayload(params);\n const response = await this.http.request<ParseResponse<unknown>>(\n 'client.ai.parse()',\n 'POST',\n '/v1/ai/parse',\n { body: wire },\n );\n return params.schema.parse(response.data) as z.infer<TSchema>;\n }\n\n async *stream<TSchema extends z.ZodType>(\n params: ParseRequest<TSchema>,\n ): AsyncGenerator<StreamEvent<z.infer<TSchema>>, void, void> {\n const wire = buildPayload(params);\n const res = await this.http.requestRaw(\n 'client.ai.stream()',\n 'POST',\n '/v1/ai/stream',\n {\n body: JSON.stringify(wire),\n contentType: 'application/json',\n headers: { Accept: 'text/event-stream' },\n },\n );\n\n if (!res.body) {\n throw new UlvioError('stream_no_body', 'AI stream returned no response body', {\n status: res.status,\n });\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n const events = parseSseEvents(buffer);\n const lastBoundary = buffer.lastIndexOf('\\n\\n');\n buffer = lastBoundary >= 0 ? buffer.slice(lastBoundary + 2) : buffer;\n\n for (const { event, data } of events) {\n switch (event) {\n case 'partial':\n yield { type: 'partial', data: JSON.parse(data) as Partial<z.infer<TSchema>> };\n break;\n case 'complete': {\n const parsed = params.schema.parse(JSON.parse(data));\n yield { type: 'complete', data: parsed as z.infer<TSchema> };\n return;\n }\n case 'error': {\n const errBody = JSON.parse(data) as ErrorResponseBody['error'] | { message: string };\n throw new UlvioError(\n ('code' in errBody && errBody.code) || 'ai_stream_error',\n errBody.message,\n );\n }\n }\n }\n }\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { UlvioError } from '../errors.js';\n\nexport interface PdfOptions {\n format?: string;\n printBackground?: boolean;\n margin?: {\n top?: string;\n right?: string;\n bottom?: string;\n left?: string;\n };\n}\n\nexport interface HtmlToPdfBase64Request {\n /** Base64-encoded HTML content. Provide either `html` or `sourceUrl`. */\n html?: string;\n sourceUrl?: string;\n outputMode: 'base64';\n options?: PdfOptions;\n}\n\nexport interface HtmlToPdfUploadRequest {\n html?: string;\n sourceUrl?: string;\n /** Pre-signed URL the service will PUT the rendered PDF to. */\n uploadUrl: string;\n options?: PdfOptions;\n}\n\nexport type HtmlToPdfRequest = HtmlToPdfBase64Request | HtmlToPdfUploadRequest;\n\nexport interface HtmlToPdfBase64Response {\n pdf: string;\n}\n\nexport interface HtmlToPdfUploadResponse {\n uploaded: true;\n bytes: number;\n}\n\nexport type HtmlToPdfResponse = HtmlToPdfBase64Response | HtmlToPdfUploadResponse;\n\nexport interface QueuedEvent {\n position: number;\n}\n\nexport interface ProcessingEvent {\n step: string;\n progress: number;\n}\n\nexport interface HtmlToPdfCallbacks {\n onQueued?: (data: QueuedEvent) => void;\n onProcessing?: (data: ProcessingEvent) => void;\n}\n\nfunction parseSseEvents(chunk: string): Array<{ event: string; data: string }> {\n const events: Array<{ event: string; data: string }> = [];\n let currentEvent = '';\n let currentData = '';\n\n for (const line of chunk.split('\\n')) {\n if (line.startsWith('event: ')) {\n currentEvent = line.slice(7);\n } else if (line.startsWith('data: ')) {\n currentData = line.slice(6);\n } else if (line === '' && currentEvent) {\n events.push({ event: currentEvent, data: currentData });\n currentEvent = '';\n currentData = '';\n }\n }\n\n return events;\n}\n\nexport class HtmlToPdfClient {\n constructor(private readonly http: HttpClient) {}\n\n async convert(\n params: HtmlToPdfBase64Request,\n callbacks?: HtmlToPdfCallbacks,\n ): Promise<HtmlToPdfBase64Response>;\n async convert(\n params: HtmlToPdfUploadRequest,\n callbacks?: HtmlToPdfCallbacks,\n ): Promise<HtmlToPdfUploadResponse>;\n async convert(\n params: HtmlToPdfRequest,\n callbacks?: HtmlToPdfCallbacks,\n ): Promise<HtmlToPdfResponse> {\n const res = await this.http.requestRaw(\n 'client.htmlToPdf.convert()',\n 'POST',\n '/html-to-pdf/convert',\n {\n body: JSON.stringify(params),\n contentType: 'application/json',\n headers: { Accept: 'text/event-stream' },\n },\n );\n\n if (!res.body) {\n throw new UlvioError('html_to_pdf_no_body', 'html-to-pdf service returned no body', {\n status: res.status,\n });\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n const events = parseSseEvents(buffer);\n const lastBoundary = buffer.lastIndexOf('\\n\\n');\n buffer = lastBoundary >= 0 ? buffer.slice(lastBoundary + 2) : buffer;\n\n for (const { event, data } of events) {\n switch (event) {\n case 'queued':\n callbacks?.onQueued?.(JSON.parse(data) as QueuedEvent);\n break;\n case 'processing':\n callbacks?.onProcessing?.(JSON.parse(data) as ProcessingEvent);\n break;\n case 'complete':\n return JSON.parse(data) as HtmlToPdfResponse;\n case 'error': {\n const errBody = JSON.parse(data) as { code?: string; message: string };\n throw new UlvioError(\n errBody.code ?? 'html_to_pdf_error',\n errBody.message,\n );\n }\n }\n }\n }\n\n throw new UlvioError(\n 'html_to_pdf_truncated',\n 'SSE stream ended without a complete event',\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\n// MJML\n\nexport interface MjmlValidationError {\n line: number;\n message: string;\n tagName: string;\n formattedMessage: string;\n}\n\nexport interface MjmlCompileRequest {\n mjml: string;\n options?: {\n minify?: boolean;\n beautify?: boolean;\n validationLevel?: 'strict' | 'soft' | 'skip';\n };\n}\n\nexport interface MjmlCompileResponse {\n html: string;\n errors: MjmlValidationError[];\n}\n\n// LiquidJS\n\nexport interface LiquidRenderRequest {\n template: string;\n data: Record<string, unknown>;\n}\n\nexport interface LiquidRenderResponse {\n result: string;\n}\n\nexport interface LiquidVariablesRequest {\n template: string;\n}\n\nexport interface LiquidVariablesResponse {\n variables: string[];\n}\n\n// Markdown\n\nexport interface MarkdownRenderRequest {\n markdown: string;\n}\n\nexport interface MarkdownRenderResponse {\n html: string;\n}\n\n// Combined Liquid → MJML pipeline\n\nexport interface RenderEmailRequest {\n mjml: string;\n data: Record<string, unknown>;\n options?: {\n minify?: boolean;\n beautify?: boolean;\n validationLevel?: 'strict' | 'soft' | 'skip';\n };\n}\n\nexport interface RenderEmailResponse {\n html: string;\n errors: MjmlValidationError[];\n}\n\nexport class UtilitiesClient {\n constructor(private readonly http: HttpClient) {}\n\n compileMjml(params: MjmlCompileRequest): Promise<MjmlCompileResponse> {\n return this.http.request<MjmlCompileResponse>(\n 'client.utilities.compileMjml()',\n 'POST',\n '/utilities/mjml/compile',\n { body: params },\n );\n }\n\n renderLiquid(params: LiquidRenderRequest): Promise<LiquidRenderResponse> {\n return this.http.request<LiquidRenderResponse>(\n 'client.utilities.renderLiquid()',\n 'POST',\n '/utilities/liquidjs/render',\n { body: params },\n );\n }\n\n extractLiquidVariables(\n params: LiquidVariablesRequest,\n ): Promise<LiquidVariablesResponse> {\n return this.http.request<LiquidVariablesResponse>(\n 'client.utilities.extractLiquidVariables()',\n 'POST',\n '/utilities/liquidjs/variables',\n { body: params },\n );\n }\n\n renderMarkdown(params: MarkdownRenderRequest): Promise<MarkdownRenderResponse> {\n return this.http.request<MarkdownRenderResponse>(\n 'client.utilities.renderMarkdown()',\n 'POST',\n '/utilities/markdown/render',\n { body: params },\n );\n }\n\n renderEmail(params: RenderEmailRequest): Promise<RenderEmailResponse> {\n return this.http.request<RenderEmailResponse>(\n 'client.utilities.renderEmail()',\n 'POST',\n '/utilities/render-email',\n { body: params },\n );\n }\n}\n","import { HttpClient, type UlvioConfig } from './http.js';\nimport { MailClient } from './clients/mail.js';\nimport { MailboxClient } from './clients/mailbox.js';\nimport { SmsClient } from './clients/sms.js';\nimport { WhatsAppClient } from './clients/whatsapp.js';\nimport { VoiceClient } from './clients/voice.js';\nimport { FilesClient } from './clients/files.js';\nimport { AiClient } from './clients/ai.js';\nimport { HtmlToPdfClient } from './clients/html-to-pdf.js';\nimport { UtilitiesClient } from './clients/utilities.js';\n\nexport class Ulvio {\n readonly mail: MailClient;\n readonly mailbox: MailboxClient;\n readonly sms: SmsClient;\n readonly whatsapp: WhatsAppClient;\n readonly voice: VoiceClient;\n readonly files: FilesClient;\n readonly ai: AiClient;\n readonly htmlToPdf: HtmlToPdfClient;\n readonly utilities: UtilitiesClient;\n\n constructor(config: UlvioConfig) {\n const http = new HttpClient(config);\n this.mail = new MailClient(http);\n this.mailbox = new MailboxClient(http);\n this.sms = new SmsClient(http);\n this.whatsapp = new WhatsAppClient(http);\n this.voice = new VoiceClient(http);\n this.files = new FilesClient(http);\n this.ai = new AiClient(http);\n this.htmlToPdf = new HtmlToPdfClient(http);\n this.utilities = new UtilitiesClient(http);\n }\n}\n\nexport type { UlvioConfig } from './http.js';\n\n// Errors\nexport {\n UlvioError,\n CONNECTOR_UNHEALTHY_CODE,\n NOT_CONFIGURED_CODE,\n isConnectorUnhealthyError,\n type ErrorResponseBody,\n} from './errors.js';\n\n// Sub-client classes\nexport { MailClient } from './clients/mail.js';\nexport { MailboxClient } from './clients/mailbox.js';\nexport { SmsClient } from './clients/sms.js';\nexport { WhatsAppClient } from './clients/whatsapp.js';\nexport { VoiceClient } from './clients/voice.js';\nexport { FilesClient } from './clients/files.js';\nexport { AiClient } from './clients/ai.js';\nexport { HtmlToPdfClient } from './clients/html-to-pdf.js';\nexport { UtilitiesClient } from './clients/utilities.js';\n\n// Mail types\nexport type {\n Attachment,\n TransactionalMailSendRequest,\n TransactionalMailSendResponse,\n} from './clients/mail.js';\n\n// Mailbox types\nexport type {\n MailboxSendRequest,\n MailboxSendResponse,\n MailboxAttachment,\n MailboxMessageSummary,\n MailboxMessagesListResponse,\n MailboxMessageDetail,\n MailboxMarkProcessedResponse,\n MailboxConnectorStatus,\n} from './clients/mailbox.js';\n\n// SMS types\nexport type { SmsSendRequest, SmsSendResponse } from './clients/sms.js';\n\n// WhatsApp types\nexport type {\n WhatsAppParameter,\n WhatsAppComponent,\n WhatsAppSendRequest,\n WhatsAppSendResponse,\n} from './clients/whatsapp.js';\n\n// Voice types\nexport type { VoiceTranscribeRequest, VoiceTranscribeResponse } from './clients/voice.js';\n\n// Files types\nexport type {\n FileUploadResponse,\n FileListItem,\n FileListResponse,\n PresignedUrlResponse,\n FileUploadBody,\n} from './clients/files.js';\n\n// AI types\nexport type {\n Role,\n InputTextPart,\n InputImagePart,\n InputFilePart,\n ContentPart,\n InputMessage,\n Input,\n ParseRequest,\n ParseResponse,\n StreamEvent,\n} from './clients/ai.js';\n\n// HTML-to-PDF types\nexport type {\n PdfOptions,\n HtmlToPdfBase64Request,\n HtmlToPdfUploadRequest,\n HtmlToPdfRequest,\n HtmlToPdfBase64Response,\n HtmlToPdfUploadResponse,\n HtmlToPdfResponse,\n QueuedEvent,\n ProcessingEvent,\n HtmlToPdfCallbacks,\n} from './clients/html-to-pdf.js';\n\n// Utilities types\nexport type {\n MjmlValidationError,\n MjmlCompileRequest,\n MjmlCompileResponse,\n LiquidRenderRequest,\n LiquidRenderResponse,\n LiquidVariablesRequest,\n LiquidVariablesResponse,\n MarkdownRenderRequest,\n MarkdownRenderResponse,\n RenderEmailRequest,\n RenderEmailResponse,\n} from './clients/utilities.js';\n"],"mappings":"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","names":["parseSseEvents"]}
|