@mailto.foo/sdk 1.1.1 → 1.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.js +109 -14
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,16 +1,108 @@
|
|
|
1
|
-
|
|
2
|
-
const
|
|
1
|
+
const API_BASE = "https://api-mailto-foo.dan-7bc.workers.dev";
|
|
2
|
+
const fetchPublisherConfig = async (publishKey) => {
|
|
3
|
+
const controller = new AbortController();
|
|
4
|
+
const timeout = setTimeout(() => controller.abort(), 5000);
|
|
5
|
+
try {
|
|
6
|
+
const res = await fetch(`${API_BASE}/config/${publishKey}/config`, { signal: controller.signal });
|
|
7
|
+
clearTimeout(timeout);
|
|
8
|
+
if (!res.ok)
|
|
9
|
+
throw new Error(`Config fetch failed: ${res.status}`);
|
|
10
|
+
return res.json();
|
|
11
|
+
}
|
|
12
|
+
catch (err) {
|
|
13
|
+
clearTimeout(timeout);
|
|
14
|
+
throw err;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
let turnstileScriptPromise = null;
|
|
18
|
+
const loadTurnstileScript = () => {
|
|
19
|
+
if (window.turnstile)
|
|
20
|
+
return Promise.resolve();
|
|
21
|
+
if (turnstileScriptPromise)
|
|
22
|
+
return turnstileScriptPromise;
|
|
23
|
+
turnstileScriptPromise = new Promise((resolve, reject) => {
|
|
24
|
+
const script = document.createElement("script");
|
|
25
|
+
script.src = "https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit";
|
|
26
|
+
script.async = true;
|
|
27
|
+
script.defer = true;
|
|
28
|
+
script.onload = () => resolve();
|
|
29
|
+
script.onerror = (err) => {
|
|
30
|
+
turnstileScriptPromise = null;
|
|
31
|
+
reject(err);
|
|
32
|
+
};
|
|
33
|
+
document.head.appendChild(script);
|
|
34
|
+
});
|
|
35
|
+
return turnstileScriptPromise;
|
|
36
|
+
};
|
|
37
|
+
const showTurnstileFallback = (siteKey) => {
|
|
3
38
|
return new Promise((resolve, reject) => {
|
|
4
|
-
const
|
|
5
|
-
|
|
39
|
+
const overlay = document.createElement("div");
|
|
40
|
+
overlay.style.cssText = [
|
|
41
|
+
"position:fixed",
|
|
42
|
+
"inset:0",
|
|
43
|
+
"z-index:2147483647",
|
|
44
|
+
"display:flex",
|
|
45
|
+
"align-items:center",
|
|
46
|
+
"justify-content:center",
|
|
47
|
+
"background:rgba(0,0,0,0.5)",
|
|
48
|
+
].join(";");
|
|
49
|
+
const widget = document.createElement("div");
|
|
50
|
+
overlay.appendChild(widget);
|
|
51
|
+
document.body.appendChild(overlay);
|
|
52
|
+
let widgetId;
|
|
53
|
+
const cleanup = () => {
|
|
54
|
+
try {
|
|
55
|
+
window.turnstile.remove(widgetId);
|
|
56
|
+
}
|
|
57
|
+
catch { /* ignore */ }
|
|
58
|
+
try {
|
|
59
|
+
document.body.removeChild(overlay);
|
|
60
|
+
}
|
|
61
|
+
catch { /* already removed */ }
|
|
62
|
+
};
|
|
63
|
+
widgetId = window.turnstile.render(widget, {
|
|
64
|
+
sitekey: siteKey,
|
|
65
|
+
callback: (token) => {
|
|
66
|
+
cleanup();
|
|
67
|
+
resolve(token);
|
|
68
|
+
},
|
|
69
|
+
"error-callback": () => {
|
|
70
|
+
cleanup();
|
|
71
|
+
reject(new Error("Turnstile verification failed"));
|
|
72
|
+
},
|
|
73
|
+
"expired-callback": () => {
|
|
74
|
+
cleanup();
|
|
75
|
+
reject(new Error("Turnstile token expired"));
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
};
|
|
80
|
+
const getTurnstileToken = async (siteKey) => {
|
|
81
|
+
await loadTurnstileScript();
|
|
82
|
+
const container = document.createElement("div");
|
|
83
|
+
container.style.cssText = "position:fixed;bottom:0;right:0;z-index:9999;visibility:hidden;";
|
|
84
|
+
document.body.appendChild(container);
|
|
85
|
+
let widgetId;
|
|
86
|
+
const cleanup = () => {
|
|
87
|
+
try {
|
|
88
|
+
window.turnstile.remove(widgetId);
|
|
89
|
+
}
|
|
90
|
+
catch { /* ignore */ }
|
|
91
|
+
try {
|
|
92
|
+
document.body.removeChild(container);
|
|
93
|
+
}
|
|
94
|
+
catch { /* already removed */ }
|
|
95
|
+
};
|
|
96
|
+
const token = await new Promise((resolve, reject) => {
|
|
97
|
+
widgetId = window.turnstile.render(container, {
|
|
98
|
+
sitekey: siteKey,
|
|
99
|
+
appearance: "interaction-only",
|
|
100
|
+
callback: (t) => { cleanup(); resolve(t); },
|
|
101
|
+
"error-callback": () => { cleanup(); resolve(null); },
|
|
102
|
+
"expired-callback": () => { cleanup(); reject(new Error("Turnstile token expired")); },
|
|
6
103
|
});
|
|
7
|
-
cap.solve()
|
|
8
|
-
.then((result) => {
|
|
9
|
-
cap.reset();
|
|
10
|
-
resolve(result.token);
|
|
11
|
-
})
|
|
12
|
-
.catch(reject);
|
|
13
104
|
});
|
|
105
|
+
return token ?? showTurnstileFallback(siteKey);
|
|
14
106
|
};
|
|
15
107
|
export class Mailto {
|
|
16
108
|
publishKey;
|
|
@@ -18,22 +110,25 @@ export class Mailto {
|
|
|
18
110
|
this.publishKey = config.publishKey;
|
|
19
111
|
}
|
|
20
112
|
async subscribe(data) {
|
|
21
|
-
const
|
|
113
|
+
const publisherConfig = await fetchPublisherConfig(this.publishKey);
|
|
114
|
+
const token = publisherConfig.turnstileSiteKey
|
|
115
|
+
? await getTurnstileToken(publisherConfig.turnstileSiteKey)
|
|
116
|
+
: undefined;
|
|
22
117
|
const body = {
|
|
23
118
|
data,
|
|
24
119
|
config: { publishKey: this.publishKey, token },
|
|
25
120
|
};
|
|
26
|
-
const res = await fetch(
|
|
121
|
+
const res = await fetch(`${API_BASE}/subscribe`, {
|
|
27
122
|
method: "POST",
|
|
28
123
|
headers: { "Content-Type": "application/json" },
|
|
29
124
|
body: JSON.stringify(body),
|
|
30
125
|
});
|
|
31
126
|
if (!res.ok) {
|
|
32
127
|
const contentType = res.headers.get("content-type") ?? "";
|
|
33
|
-
const
|
|
128
|
+
const errBody = contentType.includes("application/json")
|
|
34
129
|
? (await res.json()).error ?? "Subscription failed"
|
|
35
130
|
: await res.text();
|
|
36
|
-
throw new Error(
|
|
131
|
+
throw new Error(errBody);
|
|
37
132
|
}
|
|
38
133
|
}
|
|
39
134
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@mailto.foo/sdk",
|
|
3
3
|
"type": "module",
|
|
4
4
|
"description": "Headless email subscription and contact form SDK for mailto.foo",
|
|
5
|
-
"version": "1.
|
|
5
|
+
"version": "1.2.0",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
8
|
"repository": {
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"url": "https://gitlab.com/mailto.foo/sdk/-/boards"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@
|
|
28
|
+
"@mailto.foo/sdk": "file:.yalc/@mailto.foo/sdk"
|
|
29
29
|
},
|
|
30
30
|
"scripts": {
|
|
31
31
|
"build": "tsc",
|