@mailto.foo/sdk 1.1.1 → 1.2.1

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 CHANGED
@@ -1,16 +1,108 @@
1
- import Cap from "@cap.js/widget";
2
- const getToken = () => {
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 cap = new Cap({
5
- apiEndpoint: "https://captcha.mailto.foo/api/",
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 token = await getToken();
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("https://api-mailto-foo.dan-7bc.workers.dev/subscribe", {
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 body = contentType.includes("application/json")
128
+ const errBody = contentType.includes("application/json")
34
129
  ? (await res.json()).error ?? "Subscription failed"
35
130
  : await res.text();
36
- throw new Error(body);
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":"AAAA,OAAO,GAAG,MAAM,gBAAgB,CAAC;AAgBjC,MAAM,QAAQ,GAAG,GAAoB,EAAE;IACrC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,IAAK,GAAW,CAAC;YAC3B,WAAW,EAAE,iCAAiC;SAC/C,CAAC,CAAC;QAEH,GAAG,CAAC,KAAK,EAAE;aACR,IAAI,CAAC,CAAC,MAAW,EAAE,EAAE;YACpB,GAAG,CAAC,KAAK,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC,CAAC;aACD,KAAK,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,OAAO,MAAM;IACT,UAAU,CAAS;IAE3B,YAAY,MAAuB;QACjC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAmB;QACjC,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;QAE/B,MAAM,IAAI,GAAkB;YAC1B,IAAI;YACJ,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE;SAC/C,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,sDAAsD,EAAE;YAC9E,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YAC1D,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC;gBACnD,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,EAAyB,CAAA,CAAC,KAAK,IAAI,qBAAqB;gBACzE,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;CACF"}
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.1.1",
5
+ "version": "1.2.1",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "repository": {
@@ -13,6 +13,12 @@
13
13
  "files": [
14
14
  "dist/**/*"
15
15
  ],
16
+ "scripts": {
17
+ "build": "tsc",
18
+ "check": "biome check --write ./src",
19
+ "workflow:check": "biome check ./src",
20
+ "release": "pnpm run build && changeset publish"
21
+ },
16
22
  "author": "saikksub<saikksub@gmail.com>",
17
23
  "license": "MIT",
18
24
  "devDependencies": {
@@ -23,14 +29,5 @@
23
29
  },
24
30
  "bugs": {
25
31
  "url": "https://gitlab.com/mailto.foo/sdk/-/boards"
26
- },
27
- "dependencies": {
28
- "@cap.js/widget": "^0.1.53"
29
- },
30
- "scripts": {
31
- "build": "tsc",
32
- "check": "biome check --write ./src",
33
- "workflow:check": "biome check ./src",
34
- "release": "pnpm run build && changeset publish"
35
32
  }
36
- }
33
+ }