zerodrop-client 0.1.7 → 0.2.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/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +145 -21
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ export interface ZeroDropEmail {
|
|
|
12
12
|
export interface WaitForLatestOptions {
|
|
13
13
|
timeout?: number;
|
|
14
14
|
pollInterval?: number;
|
|
15
|
+
sse?: boolean;
|
|
15
16
|
}
|
|
16
17
|
export interface ZeroDropOptions {
|
|
17
18
|
baseUrl?: string;
|
|
@@ -22,12 +23,16 @@ export declare class ZeroDropTimeoutError extends Error {
|
|
|
22
23
|
export declare class ZeroDropAuthError extends Error {
|
|
23
24
|
constructor();
|
|
24
25
|
}
|
|
26
|
+
export declare class ZeroDropNetworkError extends Error {
|
|
27
|
+
constructor(message: string);
|
|
28
|
+
}
|
|
25
29
|
export declare class ZeroDrop {
|
|
26
30
|
private apiKey;
|
|
27
31
|
private baseUrl;
|
|
28
32
|
constructor(apiKey?: string, options?: ZeroDropOptions);
|
|
29
33
|
generateInbox(): string;
|
|
30
34
|
fetchLatest(inbox: string): Promise<ZeroDropEmail | null>;
|
|
35
|
+
private waitForLatestSSE;
|
|
31
36
|
waitForLatest(inbox: string, options?: WaitForLatestOptions): Promise<ZeroDropEmail>;
|
|
32
37
|
onReceived(inbox: string, webhookUrl: string): Promise<{
|
|
33
38
|
registered: boolean;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,IAAI,CAAC;IACjB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,IAAI,CAAC;IACjB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAO7C;AAED,qBAAa,iBAAkB,SAAQ,KAAK;;CAK3C;AAED,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAO5B;AAmED,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB;IAmB1D,aAAa,IAAI,MAAM;IAWjB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;YAwEjD,gBAAgB;IAoExB,aAAa,CACjB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,aAAa,CAAC;IAuCnB,UAAU,CACd,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,UAAU,EAAE,OAAO,CAAA;KAAE,CAAC;IAkCnC,OAAO,CAAC,KAAK;CAGd;AAMD,eAAe,QAAQ,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// Instant temporary email inboxes for CI/CD
|
|
5
5
|
// ============================================
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.ZeroDrop = exports.ZeroDropAuthError = exports.ZeroDropTimeoutError = void 0;
|
|
7
|
+
exports.ZeroDrop = exports.ZeroDropNetworkError = exports.ZeroDropAuthError = exports.ZeroDropTimeoutError = void 0;
|
|
8
8
|
const BASE_URL = "https://zerodrop.dev";
|
|
9
9
|
const FREE_DOMAIN = "zerodrop-sandbox.online";
|
|
10
10
|
const POLL_INTERVAL = 2000;
|
|
@@ -26,6 +26,14 @@ class ZeroDropAuthError extends Error {
|
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
exports.ZeroDropAuthError = ZeroDropAuthError;
|
|
29
|
+
class ZeroDropNetworkError extends Error {
|
|
30
|
+
constructor(message) {
|
|
31
|
+
super(`ZeroDrop: Network error — ${message}. ` +
|
|
32
|
+
`Check https://zerodrop.instatus.com for service status.`);
|
|
33
|
+
this.name = "ZeroDropNetworkError";
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.ZeroDropNetworkError = ZeroDropNetworkError;
|
|
29
37
|
// ============================================
|
|
30
38
|
// Email body extractor
|
|
31
39
|
// ============================================
|
|
@@ -44,6 +52,24 @@ function extractBody(raw) {
|
|
|
44
52
|
.substring(0, 5000);
|
|
45
53
|
}
|
|
46
54
|
// ============================================
|
|
55
|
+
// Parse raw Redis email string into ZeroDropEmail
|
|
56
|
+
// ============================================
|
|
57
|
+
function parseEmail(raw) {
|
|
58
|
+
var _a, _b;
|
|
59
|
+
const parsed = JSON.parse(raw);
|
|
60
|
+
return {
|
|
61
|
+
id: parsed.id,
|
|
62
|
+
from: parsed.from,
|
|
63
|
+
to: parsed.to,
|
|
64
|
+
subject: parsed.subject || "",
|
|
65
|
+
body: extractBody(parsed.raw),
|
|
66
|
+
rawBody: parsed.raw,
|
|
67
|
+
receivedAt: new Date(parsed.receivedAt),
|
|
68
|
+
otp: (_a = parsed.otp) !== null && _a !== void 0 ? _a : null,
|
|
69
|
+
magicLink: (_b = parsed.magicLink) !== null && _b !== void 0 ? _b : null,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// ============================================
|
|
47
73
|
// Random inbox generator (zero-auth)
|
|
48
74
|
// ============================================
|
|
49
75
|
function generateRandomInboxName() {
|
|
@@ -65,7 +91,7 @@ class ZeroDrop {
|
|
|
65
91
|
if (!apiKey) {
|
|
66
92
|
console.warn("[ZeroDrop] No API key provided. Running in public sandbox mode.\n" +
|
|
67
93
|
"[ZeroDrop] Emails are AI-filtered and inboxes expire in 30 minutes.\n" +
|
|
68
|
-
"[ZeroDrop]
|
|
94
|
+
"[ZeroDrop] Free tier uses a shared domain — for production CI use Workspaces: https://zerodrop.dev");
|
|
69
95
|
}
|
|
70
96
|
}
|
|
71
97
|
// ============================================
|
|
@@ -75,12 +101,11 @@ class ZeroDrop {
|
|
|
75
101
|
// ============================================
|
|
76
102
|
generateInbox() {
|
|
77
103
|
const name = generateRandomInboxName();
|
|
78
|
-
|
|
79
|
-
return `${name}@${domain}`;
|
|
104
|
+
return `${name}@${FREE_DOMAIN}`;
|
|
80
105
|
}
|
|
81
106
|
// ============================================
|
|
82
107
|
// fetchLatest()
|
|
83
|
-
// Fetches current emails for an inbox
|
|
108
|
+
// Fetches current emails for an inbox via REST
|
|
84
109
|
// Returns null if empty
|
|
85
110
|
// ============================================
|
|
86
111
|
async fetchLatest(inbox) {
|
|
@@ -92,13 +117,26 @@ class ZeroDrop {
|
|
|
92
117
|
if (this.apiKey) {
|
|
93
118
|
headers["Authorization"] = `Bearer ${this.apiKey}`;
|
|
94
119
|
}
|
|
95
|
-
|
|
120
|
+
let res;
|
|
121
|
+
try {
|
|
122
|
+
res = await fetch(`${this.baseUrl}/api/inbox/${inboxName}?source=sdk`, { headers });
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
const message = err instanceof Error ? err.message : "fetch failed";
|
|
126
|
+
throw new ZeroDropNetworkError(message);
|
|
127
|
+
}
|
|
96
128
|
if (res.status === 401)
|
|
97
129
|
throw new ZeroDropAuthError();
|
|
98
130
|
if (!res.ok) {
|
|
99
|
-
throw new
|
|
131
|
+
throw new ZeroDropNetworkError(`API returned ${res.status}`);
|
|
132
|
+
}
|
|
133
|
+
let data;
|
|
134
|
+
try {
|
|
135
|
+
data = await res.json();
|
|
136
|
+
}
|
|
137
|
+
catch (_c) {
|
|
138
|
+
throw new ZeroDropNetworkError("Failed to parse API response");
|
|
100
139
|
}
|
|
101
|
-
const data = await res.json();
|
|
102
140
|
if (!data.emails || data.emails.length === 0)
|
|
103
141
|
return null;
|
|
104
142
|
const latest = data.emails[0];
|
|
@@ -115,19 +153,98 @@ class ZeroDrop {
|
|
|
115
153
|
};
|
|
116
154
|
}
|
|
117
155
|
// ============================================
|
|
156
|
+
// waitForLatestSSE()
|
|
157
|
+
// Uses SSE stream for sub-second email delivery
|
|
158
|
+
// Falls back to polling on error
|
|
159
|
+
// ============================================
|
|
160
|
+
async waitForLatestSSE(inbox, timeoutMs) {
|
|
161
|
+
var _a;
|
|
162
|
+
const inboxName = inbox.split("@")[0].toLowerCase();
|
|
163
|
+
const headers = {};
|
|
164
|
+
if (this.apiKey) {
|
|
165
|
+
headers["Authorization"] = `Bearer ${this.apiKey}`;
|
|
166
|
+
}
|
|
167
|
+
let res;
|
|
168
|
+
try {
|
|
169
|
+
res = await fetch(`${this.baseUrl}/api/inbox/${inboxName}/stream`, {
|
|
170
|
+
headers,
|
|
171
|
+
signal: AbortSignal.timeout(timeoutMs + 1000),
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
catch (_b) {
|
|
175
|
+
return null; // Fall back to polling
|
|
176
|
+
}
|
|
177
|
+
if (!res.ok || !res.body)
|
|
178
|
+
return null;
|
|
179
|
+
const reader = res.body.getReader();
|
|
180
|
+
const decoder = new TextDecoder();
|
|
181
|
+
let buffer = "";
|
|
182
|
+
try {
|
|
183
|
+
while (true) {
|
|
184
|
+
const { done, value } = await reader.read();
|
|
185
|
+
if (done)
|
|
186
|
+
break;
|
|
187
|
+
buffer += decoder.decode(value, { stream: true });
|
|
188
|
+
const lines = buffer.split("\n");
|
|
189
|
+
buffer = (_a = lines.pop()) !== null && _a !== void 0 ? _a : "";
|
|
190
|
+
for (const line of lines) {
|
|
191
|
+
if (line.startsWith("data: ")) {
|
|
192
|
+
const data = line.slice(6).trim();
|
|
193
|
+
if (data === "__timeout__")
|
|
194
|
+
return null;
|
|
195
|
+
if (data) {
|
|
196
|
+
try {
|
|
197
|
+
return parseEmail(data);
|
|
198
|
+
}
|
|
199
|
+
catch (_c) {
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
finally {
|
|
208
|
+
reader.cancel();
|
|
209
|
+
}
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
// ============================================
|
|
118
213
|
// waitForLatest()
|
|
119
|
-
//
|
|
214
|
+
// Uses SSE by default for sub-second delivery
|
|
215
|
+
// Falls back to polling if SSE fails
|
|
120
216
|
// Throws ZeroDropTimeoutError on timeout
|
|
121
217
|
// ============================================
|
|
122
218
|
async waitForLatest(inbox, options = {}) {
|
|
123
219
|
var _a, _b;
|
|
124
220
|
const timeout = (_a = options.timeout) !== null && _a !== void 0 ? _a : 10000;
|
|
125
221
|
const pollInterval = (_b = options.pollInterval) !== null && _b !== void 0 ? _b : POLL_INTERVAL;
|
|
222
|
+
const useSSE = options.sse !== false; // SSE on by default
|
|
223
|
+
// Try SSE first
|
|
224
|
+
if (useSSE) {
|
|
225
|
+
try {
|
|
226
|
+
const email = await this.waitForLatestSSE(inbox, timeout);
|
|
227
|
+
if (email)
|
|
228
|
+
return email;
|
|
229
|
+
}
|
|
230
|
+
catch (_c) {
|
|
231
|
+
// SSE failed — fall through to polling
|
|
232
|
+
console.warn("[ZeroDrop] SSE unavailable, falling back to polling");
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// Polling fallback
|
|
126
236
|
const startTime = Date.now();
|
|
127
237
|
while (Date.now() - startTime < timeout) {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
238
|
+
try {
|
|
239
|
+
const email = await this.fetchLatest(inbox);
|
|
240
|
+
if (email)
|
|
241
|
+
return email;
|
|
242
|
+
}
|
|
243
|
+
catch (err) {
|
|
244
|
+
if (err instanceof ZeroDropAuthError)
|
|
245
|
+
throw err;
|
|
246
|
+
console.warn(`[ZeroDrop] Poll error (retrying): ${err.message}`);
|
|
247
|
+
}
|
|
131
248
|
await this.sleep(pollInterval);
|
|
132
249
|
}
|
|
133
250
|
throw new ZeroDropTimeoutError(inbox, timeout);
|
|
@@ -141,18 +258,25 @@ class ZeroDrop {
|
|
|
141
258
|
if (!this.apiKey) {
|
|
142
259
|
throw new ZeroDropAuthError();
|
|
143
260
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
261
|
+
let res;
|
|
262
|
+
try {
|
|
263
|
+
res = await fetch(`${this.baseUrl}/api/webhooks/register`, {
|
|
264
|
+
method: "POST",
|
|
265
|
+
headers: {
|
|
266
|
+
"Content-Type": "application/json",
|
|
267
|
+
"Authorization": `Bearer ${this.apiKey}`,
|
|
268
|
+
},
|
|
269
|
+
body: JSON.stringify({ inbox, webhookUrl }),
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
catch (err) {
|
|
273
|
+
const message = err instanceof Error ? err.message : "fetch failed";
|
|
274
|
+
throw new ZeroDropNetworkError(message);
|
|
275
|
+
}
|
|
152
276
|
if (res.status === 401)
|
|
153
277
|
throw new ZeroDropAuthError();
|
|
154
278
|
if (!res.ok) {
|
|
155
|
-
throw new
|
|
279
|
+
throw new ZeroDropNetworkError(`Webhook registration failed: ${res.status}`);
|
|
156
280
|
}
|
|
157
281
|
return { registered: true };
|
|
158
282
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,+CAA+C;AAC/C,mBAAmB;AACnB,4CAA4C;AAC5C,+CAA+C;;;AAE/C,MAAM,QAAQ,GAAG,sBAAsB,CAAC;AACxC,MAAM,WAAW,GAAG,yBAAyB,CAAC;AAC9C,MAAM,aAAa,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|