@monok/server 2.1.0 → 2.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/AGENTS.md CHANGED
@@ -501,3 +501,13 @@ or `/postfilter`.
501
501
  - Do not claim end-to-end verification yet. The dashboard currently validates
502
502
  capture and the configured API key, not real signup or purchase; test-customer
503
503
  validation is reserved for a later implementation.
504
+
505
+
506
+ ## Fetch / Cloudflare hosts
507
+
508
+ Version 2.2 adds `@monok/server/web` with `createMonokHandler`. Use it instead of
509
+ Express on Fetch runtimes. It shares the documented content endpoint/metadata/
510
+ search/acknowledgement contract. Supply a CMS-backed `saveImage` callback; there
511
+ is no filesystem or Express import in this entry point. Its `onArticle` context
512
+ always resolves action to draft or publish. An acknowledgement follows durable
513
+ host persistence, never substitutes for the later publication linkback.
package/README.md CHANGED
@@ -393,3 +393,33 @@ Build the package:
393
393
  ```bash
394
394
  npm run build
395
395
  ```
396
+
397
+
398
+ ## Cloudflare Workers / Fetch content adapter (2.2)
399
+
400
+ Use `@monok/server/web` for Workers, Astro server routes, or another Fetch-based
401
+ runtime. This separate export does not import Express, node-fetch or a filesystem.
402
+ Existing Express and affiliate imports keep their current behavior.
403
+
404
+ ```ts
405
+ import { createMonokHandler } from '@monok/server/web';
406
+ const handle = createMonokHandler({
407
+ apiKey: workspaceApiKey,
408
+ getSiteInfo: async () => ({ /* same SiteInfoInput as Express */ }),
409
+ saveImage: async (bytes, filename, article) => saveThroughYourCms(bytes, filename),
410
+ onArticle: async (article, { action, saveThumbImage }) => {
411
+ const image = await saveThumbImage();
412
+ await persistInYourCms(article, { action, image });
413
+ },
414
+ });
415
+ // In your Worker/route: return handle(request)
416
+ ```
417
+
418
+ The default base is `/api/monok`. Auth headers, `/info`, `/push`, `/postfilter`,
419
+ and accepted acknowledgements match the Express contract. Default action is draft.
420
+ `maxBodyBytes` defaults to 20 MiB; `maxImageBytes` defaults to 15 MiB. The image
421
+ hook receives validated JPEG bytes, not a filesystem path; repeated calls within
422
+ one delivery reuse the same promise. Implement durable retry/idempotency and CMS
423
+ publication callbacks in the host adapter. The web `sendMonokLinkback` uses native
424
+ fetch and the same Monok callback wire format. Capture affiliate attribution only
425
+ when independently implementing that integration; this entry point is content-only.
package/dist/web.d.ts ADDED
@@ -0,0 +1,30 @@
1
+ /** Fetch/Worker content integration. This entry point has no Node or Express imports. */
2
+ import type { LinkbackPayload, MonokArticle, MonokArticleAction, PostFilterQuery, PostFilterResult, SiteInfoInput } from "./types.js";
3
+ export type { LinkbackPayload, MonokArticle, PostFilterQuery, PostFilterResult, SiteInfoInput, } from "./types.js";
4
+ export declare const MONOK_SERVER_VERSION = "2.2.0";
5
+ export interface CreateMonokHandlerOptions {
6
+ apiKey: string;
7
+ basePath?: string;
8
+ maxBodyBytes?: number;
9
+ maxImageBytes?: number;
10
+ saveImage?: (bytes: Uint8Array, filename: string, article: MonokArticle) => Promise<string>;
11
+ onArticle: (article: MonokArticle, context: {
12
+ action: MonokArticleAction;
13
+ saveThumbImage: (name?: string) => Promise<string | undefined>;
14
+ }) => Promise<void> | void;
15
+ getSiteInfo?: SiteInfoInput | (() => Promise<SiteInfoInput> | SiteInfoInput);
16
+ searchArticles?: (query: PostFilterQuery) => Promise<PostFilterResult[]> | PostFilterResult[];
17
+ }
18
+ export declare class MonokRequestError extends Error {
19
+ status: number;
20
+ constructor(status: number, message: string);
21
+ }
22
+ /** The host supplies its established workspace key; keys never belong in generated frontend code. */
23
+ export declare function matchesMonokKey(candidate: string | null | undefined, expected: string | undefined): Promise<boolean>;
24
+ export declare function createMonokHandler(options: CreateMonokHandlerOptions): (request: Request) => Promise<Response>;
25
+ /** Send only after durable publication and public canonical availability. */
26
+ export declare function sendMonokLinkback(payload: LinkbackPayload, options?: {
27
+ monokBaseUrl?: string;
28
+ fetch?: typeof fetch;
29
+ }): Promise<void>;
30
+ //# sourceMappingURL=web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACd,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,eAAe,EACf,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,eAAO,MAAM,oBAAoB,UAAU,CAAC;AAQ5C,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5F,SAAS,EAAE,CACT,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE;QACP,MAAM,EAAE,kBAAkB,CAAC;QAC3B,cAAc,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;KAChE,KACE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,aAAa,GAAG,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAAC,CAAC;IAC7E,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,gBAAgB,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC;CAC/F;AACD,qBAAa,iBAAkB,SAAQ,KAAK;IAEjC,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM;CAIlB;AACD,qGAAqG;AACrG,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACpC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,OAAO,CAAC,OAAO,CAAC,CAUlB;AA4DD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,GACjC,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAgGzC;AACD,6EAA6E;AAC7E,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,eAAe,EACxB,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;CAAO,GAC5D,OAAO,CAAC,IAAI,CAAC,CAiBf"}
package/dist/web.js ADDED
@@ -0,0 +1,205 @@
1
+ export const MONOK_SERVER_VERSION = "2.2.0";
2
+ const PRIVATE = {
3
+ "Content-Type": "application/json",
4
+ "Cache-Control": "private, no-store, no-cache, must-revalidate, max-age=0",
5
+ Pragma: "no-cache",
6
+ Expires: "0",
7
+ "Surrogate-Control": "no-store",
8
+ };
9
+ export class MonokRequestError extends Error {
10
+ constructor(status, message) {
11
+ super(message);
12
+ this.status = status;
13
+ }
14
+ }
15
+ /** The host supplies its established workspace key; keys never belong in generated frontend code. */
16
+ export async function matchesMonokKey(candidate, expected) {
17
+ if (!candidate?.trim() || !expected?.trim())
18
+ return false;
19
+ const digest = (value) => crypto.subtle.digest("SHA-256", new TextEncoder().encode(value.trim()));
20
+ const [a, b] = await Promise.all([digest(candidate), digest(expected)]);
21
+ const aa = new Uint8Array(a), bb = new Uint8Array(b);
22
+ let different = 0;
23
+ for (let i = 0; i < aa.length; i++)
24
+ different |= aa[i] ^ bb[i];
25
+ return different === 0;
26
+ }
27
+ function reply(value, status = 200) {
28
+ return new Response(JSON.stringify(value), { status, headers: PRIVATE });
29
+ }
30
+ function positive(value, fallback) {
31
+ if (!value)
32
+ return fallback;
33
+ const n = Number(value);
34
+ if (!/^\d+$/.test(value) || !Number.isSafeInteger(n) || n < 1)
35
+ throw new MonokRequestError(400, "Pagination must be a positive integer");
36
+ return n;
37
+ }
38
+ async function readJson(request, limit) {
39
+ const reader = request.body?.getReader();
40
+ if (!reader)
41
+ throw new MonokRequestError(400, "Invalid payload");
42
+ const chunks = [];
43
+ let size = 0;
44
+ try {
45
+ for (;;) {
46
+ const part = await reader.read();
47
+ if (part.done)
48
+ break;
49
+ size += part.value.byteLength;
50
+ if (size > limit) {
51
+ await reader.cancel();
52
+ throw new MonokRequestError(413, "Request too large");
53
+ }
54
+ chunks.push(part.value);
55
+ }
56
+ }
57
+ finally {
58
+ reader.releaseLock();
59
+ }
60
+ const bytes = new Uint8Array(size);
61
+ let offset = 0;
62
+ for (const chunk of chunks) {
63
+ bytes.set(chunk, offset);
64
+ offset += chunk.length;
65
+ }
66
+ try {
67
+ return JSON.parse(new TextDecoder().decode(bytes));
68
+ }
69
+ catch {
70
+ throw new MonokRequestError(400, "Invalid JSON");
71
+ }
72
+ }
73
+ function jpeg(data, limit) {
74
+ const encoded = data.replace(/^data:image\/jpeg;base64,/i, "").replace(/\s/g, "");
75
+ if (!/^[A-Za-z0-9+/]*={0,2}$/.test(encoded) || encoded.length % 4 === 1)
76
+ throw new MonokRequestError(400, "Invalid JPEG base64");
77
+ if (encoded.length > Math.ceil(limit / 3) * 4)
78
+ throw new MonokRequestError(413, "Image too large");
79
+ let raw;
80
+ try {
81
+ raw = atob(encoded);
82
+ }
83
+ catch {
84
+ throw new MonokRequestError(400, "Invalid JPEG base64");
85
+ }
86
+ const bytes = Uint8Array.from(raw, (c) => c.charCodeAt(0));
87
+ if (bytes.length > limit)
88
+ throw new MonokRequestError(413, "Image too large");
89
+ if (bytes.length < 3 || bytes[0] !== 255 || bytes[1] !== 216 || bytes[2] !== 255)
90
+ throw new MonokRequestError(400, "Expected a JPEG image");
91
+ return bytes;
92
+ }
93
+ export function createMonokHandler(options) {
94
+ const base = (options.basePath ?? "/api/monok").replace(/\/$/, "");
95
+ const maxBody = options.maxBodyBytes ?? 20 * 1024 * 1024, maxImage = options.maxImageBytes ?? 15 * 1024 * 1024;
96
+ if (![maxBody, maxImage].every((n) => Number.isSafeInteger(n) && n > 0))
97
+ throw Error("Invalid content size limits");
98
+ return async (request) => {
99
+ try {
100
+ const url = new URL(request.url), path = url.pathname.slice(base.length);
101
+ if (!url.pathname.startsWith(base + "/") || !["/info", "/push", "/postfilter"].includes(path))
102
+ return reply({ error: "Not found" }, 404);
103
+ if (request.method !== (path === "/push" ? "POST" : "GET"))
104
+ return reply({ error: "Method not allowed" }, 405);
105
+ const key = (path === "/push" ? request.headers.get("token") : null) ??
106
+ request.headers.get("X-API-Key") ??
107
+ url.searchParams.get("apikey");
108
+ if (!(await matchesMonokKey(key, options.apiKey)))
109
+ return reply({ error: "Unauthorized" }, 401);
110
+ if (path === "/info") {
111
+ const info = typeof options.getSiteInfo === "function"
112
+ ? await options.getSiteInfo()
113
+ : options.getSiteInfo;
114
+ return reply({
115
+ ...(info ?? {
116
+ js_scripts: "Disabled",
117
+ name: "Custom CMS",
118
+ logo: "",
119
+ categories: [],
120
+ post_types: ["post"],
121
+ tags: [],
122
+ authors: [],
123
+ }),
124
+ version: MONOK_SERVER_VERSION,
125
+ });
126
+ }
127
+ if (path === "/postfilter") {
128
+ if (!options.searchArticles)
129
+ return reply({ error: "Article search not configured" }, 404);
130
+ const q = url.searchParams;
131
+ const query = {
132
+ postType: q.get("post_type")?.trim() || "post",
133
+ amount: positive(q.get("amount"), 10),
134
+ page: positive(q.get("page"), 1),
135
+ };
136
+ for (const [target, source] of [
137
+ ["section", "section"],
138
+ ["tag", "tag"],
139
+ ["query", "q"],
140
+ ]) {
141
+ const value = q.get(source)?.trim();
142
+ if (value)
143
+ query[target] = value;
144
+ }
145
+ const results = await options.searchArticles(query);
146
+ if (!Array.isArray(results))
147
+ throw Error("Invalid search result");
148
+ return reply(results);
149
+ }
150
+ const value = await readJson(request, maxBody);
151
+ if (!value || typeof value !== "object" || Array.isArray(value))
152
+ throw new MonokRequestError(400, "Invalid payload");
153
+ const article = value;
154
+ if (!["string", "number"].includes(typeof article.id) ||
155
+ !String(article.id).trim() ||
156
+ typeof article.title !== "string" ||
157
+ !article.title.trim())
158
+ throw new MonokRequestError(400, "Invalid payload");
159
+ const action = url.searchParams.get("action") ?? article.action ?? "draft";
160
+ if (action !== "draft" && action !== "publish")
161
+ throw new MonokRequestError(400, "action must be either draft or publish");
162
+ let saved;
163
+ await options.onArticle(article, {
164
+ action,
165
+ saveThumbImage: (name) => {
166
+ if (!saved)
167
+ saved = (async () => {
168
+ if (!article.thumbImageData || !options.saveImage)
169
+ return undefined;
170
+ if (typeof article.thumbImageData !== "string")
171
+ throw new MonokRequestError(400, "Invalid thumbnail");
172
+ const filename = (name ?? article.slug ?? String(article.id)).replace(/[^a-zA-Z0-9_-]/g, "_") +
173
+ ".jpg";
174
+ return options.saveImage(jpeg(article.thumbImageData, maxImage), filename, article);
175
+ })();
176
+ return saved;
177
+ },
178
+ });
179
+ return reply({ ok: true, status: "accepted", monokId: article.id });
180
+ }
181
+ catch (error) {
182
+ return error instanceof MonokRequestError
183
+ ? reply({ error: error.message }, error.status)
184
+ : reply({ error: "Content operation failed; retry later" }, 500);
185
+ }
186
+ };
187
+ }
188
+ /** Send only after durable publication and public canonical availability. */
189
+ export async function sendMonokLinkback(payload, options = {}) {
190
+ const response = await (options.fetch ?? fetch)((options.monokBaseUrl ?? "https://app.monok.com").replace(/\/$/, "") + "/api/v1/linkback", {
191
+ method: "POST",
192
+ headers: { "Content-Type": "application/json" },
193
+ body: JSON.stringify({
194
+ id: payload.monokId,
195
+ puff: { title: payload.title },
196
+ url: payload.url,
197
+ source: new URL(payload.url).hostname,
198
+ ...(payload.externalId !== undefined ? { externalId: String(payload.externalId) } : {}),
199
+ ...(payload.thumbnailUrl ? { thumbnail: payload.thumbnailUrl } : {}),
200
+ }),
201
+ });
202
+ if (!response.ok)
203
+ throw Error(`Monok linkback failed (${response.status})`);
204
+ }
205
+ //# sourceMappingURL=web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,205 @@
1
+ export const MONOK_SERVER_VERSION = "2.2.0";
2
+ const PRIVATE = {
3
+ "Content-Type": "application/json",
4
+ "Cache-Control": "private, no-store, no-cache, must-revalidate, max-age=0",
5
+ Pragma: "no-cache",
6
+ Expires: "0",
7
+ "Surrogate-Control": "no-store",
8
+ };
9
+ export class MonokRequestError extends Error {
10
+ constructor(status, message) {
11
+ super(message);
12
+ this.status = status;
13
+ }
14
+ }
15
+ /** The host supplies its established workspace key; keys never belong in generated frontend code. */
16
+ export async function matchesMonokKey(candidate, expected) {
17
+ if (!candidate?.trim() || !expected?.trim())
18
+ return false;
19
+ const digest = (value) => crypto.subtle.digest("SHA-256", new TextEncoder().encode(value.trim()));
20
+ const [a, b] = await Promise.all([digest(candidate), digest(expected)]);
21
+ const aa = new Uint8Array(a), bb = new Uint8Array(b);
22
+ let different = 0;
23
+ for (let i = 0; i < aa.length; i++)
24
+ different |= aa[i] ^ bb[i];
25
+ return different === 0;
26
+ }
27
+ function reply(value, status = 200) {
28
+ return new Response(JSON.stringify(value), { status, headers: PRIVATE });
29
+ }
30
+ function positive(value, fallback) {
31
+ if (!value)
32
+ return fallback;
33
+ const n = Number(value);
34
+ if (!/^\d+$/.test(value) || !Number.isSafeInteger(n) || n < 1)
35
+ throw new MonokRequestError(400, "Pagination must be a positive integer");
36
+ return n;
37
+ }
38
+ async function readJson(request, limit) {
39
+ const reader = request.body?.getReader();
40
+ if (!reader)
41
+ throw new MonokRequestError(400, "Invalid payload");
42
+ const chunks = [];
43
+ let size = 0;
44
+ try {
45
+ for (;;) {
46
+ const part = await reader.read();
47
+ if (part.done)
48
+ break;
49
+ size += part.value.byteLength;
50
+ if (size > limit) {
51
+ await reader.cancel();
52
+ throw new MonokRequestError(413, "Request too large");
53
+ }
54
+ chunks.push(part.value);
55
+ }
56
+ }
57
+ finally {
58
+ reader.releaseLock();
59
+ }
60
+ const bytes = new Uint8Array(size);
61
+ let offset = 0;
62
+ for (const chunk of chunks) {
63
+ bytes.set(chunk, offset);
64
+ offset += chunk.length;
65
+ }
66
+ try {
67
+ return JSON.parse(new TextDecoder().decode(bytes));
68
+ }
69
+ catch {
70
+ throw new MonokRequestError(400, "Invalid JSON");
71
+ }
72
+ }
73
+ function jpeg(data, limit) {
74
+ const encoded = data.replace(/^data:image\/jpeg;base64,/i, "").replace(/\s/g, "");
75
+ if (!/^[A-Za-z0-9+/]*={0,2}$/.test(encoded) || encoded.length % 4 === 1)
76
+ throw new MonokRequestError(400, "Invalid JPEG base64");
77
+ if (encoded.length > Math.ceil(limit / 3) * 4)
78
+ throw new MonokRequestError(413, "Image too large");
79
+ let raw;
80
+ try {
81
+ raw = atob(encoded);
82
+ }
83
+ catch {
84
+ throw new MonokRequestError(400, "Invalid JPEG base64");
85
+ }
86
+ const bytes = Uint8Array.from(raw, (c) => c.charCodeAt(0));
87
+ if (bytes.length > limit)
88
+ throw new MonokRequestError(413, "Image too large");
89
+ if (bytes.length < 3 || bytes[0] !== 255 || bytes[1] !== 216 || bytes[2] !== 255)
90
+ throw new MonokRequestError(400, "Expected a JPEG image");
91
+ return bytes;
92
+ }
93
+ export function createMonokHandler(options) {
94
+ const base = (options.basePath ?? "/api/monok").replace(/\/$/, "");
95
+ const maxBody = options.maxBodyBytes ?? 20 * 1024 * 1024, maxImage = options.maxImageBytes ?? 15 * 1024 * 1024;
96
+ if (![maxBody, maxImage].every((n) => Number.isSafeInteger(n) && n > 0))
97
+ throw Error("Invalid content size limits");
98
+ return async (request) => {
99
+ try {
100
+ const url = new URL(request.url), path = url.pathname.slice(base.length);
101
+ if (!url.pathname.startsWith(base + "/") || !["/info", "/push", "/postfilter"].includes(path))
102
+ return reply({ error: "Not found" }, 404);
103
+ if (request.method !== (path === "/push" ? "POST" : "GET"))
104
+ return reply({ error: "Method not allowed" }, 405);
105
+ const key = (path === "/push" ? request.headers.get("token") : null) ??
106
+ request.headers.get("X-API-Key") ??
107
+ url.searchParams.get("apikey");
108
+ if (!(await matchesMonokKey(key, options.apiKey)))
109
+ return reply({ error: "Unauthorized" }, 401);
110
+ if (path === "/info") {
111
+ const info = typeof options.getSiteInfo === "function"
112
+ ? await options.getSiteInfo()
113
+ : options.getSiteInfo;
114
+ return reply({
115
+ ...(info ?? {
116
+ js_scripts: "Disabled",
117
+ name: "Custom CMS",
118
+ logo: "",
119
+ categories: [],
120
+ post_types: ["post"],
121
+ tags: [],
122
+ authors: [],
123
+ }),
124
+ version: MONOK_SERVER_VERSION,
125
+ });
126
+ }
127
+ if (path === "/postfilter") {
128
+ if (!options.searchArticles)
129
+ return reply({ error: "Article search not configured" }, 404);
130
+ const q = url.searchParams;
131
+ const query = {
132
+ postType: q.get("post_type")?.trim() || "post",
133
+ amount: positive(q.get("amount"), 10),
134
+ page: positive(q.get("page"), 1),
135
+ };
136
+ for (const [target, source] of [
137
+ ["section", "section"],
138
+ ["tag", "tag"],
139
+ ["query", "q"],
140
+ ]) {
141
+ const value = q.get(source)?.trim();
142
+ if (value)
143
+ query[target] = value;
144
+ }
145
+ const results = await options.searchArticles(query);
146
+ if (!Array.isArray(results))
147
+ throw Error("Invalid search result");
148
+ return reply(results);
149
+ }
150
+ const value = await readJson(request, maxBody);
151
+ if (!value || typeof value !== "object" || Array.isArray(value))
152
+ throw new MonokRequestError(400, "Invalid payload");
153
+ const article = value;
154
+ if (!["string", "number"].includes(typeof article.id) ||
155
+ !String(article.id).trim() ||
156
+ typeof article.title !== "string" ||
157
+ !article.title.trim())
158
+ throw new MonokRequestError(400, "Invalid payload");
159
+ const action = url.searchParams.get("action") ?? article.action ?? "draft";
160
+ if (action !== "draft" && action !== "publish")
161
+ throw new MonokRequestError(400, "action must be either draft or publish");
162
+ let saved;
163
+ await options.onArticle(article, {
164
+ action,
165
+ saveThumbImage: (name) => {
166
+ if (!saved)
167
+ saved = (async () => {
168
+ if (!article.thumbImageData || !options.saveImage)
169
+ return undefined;
170
+ if (typeof article.thumbImageData !== "string")
171
+ throw new MonokRequestError(400, "Invalid thumbnail");
172
+ const filename = (name ?? article.slug ?? String(article.id)).replace(/[^a-zA-Z0-9_-]/g, "_") +
173
+ ".jpg";
174
+ return options.saveImage(jpeg(article.thumbImageData, maxImage), filename, article);
175
+ })();
176
+ return saved;
177
+ },
178
+ });
179
+ return reply({ ok: true, status: "accepted", monokId: article.id });
180
+ }
181
+ catch (error) {
182
+ return error instanceof MonokRequestError
183
+ ? reply({ error: error.message }, error.status)
184
+ : reply({ error: "Content operation failed; retry later" }, 500);
185
+ }
186
+ };
187
+ }
188
+ /** Send only after durable publication and public canonical availability. */
189
+ export async function sendMonokLinkback(payload, options = {}) {
190
+ const response = await (options.fetch ?? fetch)((options.monokBaseUrl ?? "https://app.monok.com").replace(/\/$/, "") + "/api/v1/linkback", {
191
+ method: "POST",
192
+ headers: { "Content-Type": "application/json" },
193
+ body: JSON.stringify({
194
+ id: payload.monokId,
195
+ puff: { title: payload.title },
196
+ url: payload.url,
197
+ source: new URL(payload.url).hostname,
198
+ ...(payload.externalId !== undefined ? { externalId: String(payload.externalId) } : {}),
199
+ ...(payload.thumbnailUrl ? { thumbnail: payload.thumbnailUrl } : {}),
200
+ }),
201
+ });
202
+ if (!response.ok)
203
+ throw Error(`Monok linkback failed (${response.status})`);
204
+ }
205
+ //# sourceMappingURL=web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@monok/server",
3
- "version": "2.1.0",
3
+ "version": "2.2.0",
4
4
  "description": "Monok server integration helpers for content and affiliate attribution",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -12,6 +12,11 @@
12
12
  "import": "./dist/index.js",
13
13
  "require": "./dist-cjs/index.js",
14
14
  "types": "./dist/index.d.ts"
15
+ },
16
+ "./web": {
17
+ "types": "./dist/web.d.ts",
18
+ "import": "./dist/web.js",
19
+ "require": "./dist-cjs/web.js"
15
20
  }
16
21
  },
17
22
  "files": [