@monok/server 2.1.0 → 3.0.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,15 @@ 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 3.0 provides `@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. The host owns image persistence in `onArticle`;
511
+ there is no storage callback, automatic image URL fetch, filesystem or Express
512
+ import in this entry point. `decodeThumbImage` is an optional pure JPEG decoder.
513
+ Its `onArticle` context
514
+ always resolves action to draft or publish. An acknowledgement follows durable
515
+ host persistence, never substitutes for the later publication linkback.
package/README.md CHANGED
@@ -393,3 +393,40 @@ Build the package:
393
393
  ```bash
394
394
  npm run build
395
395
  ```
396
+
397
+
398
+ ## Cloudflare Workers / Fetch content adapter (3.0)
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
+ onArticle: async (article, { action }) => {
409
+ // Implement persistence in your application, including any image handling.
410
+ await persistInYourCms(article, { action });
411
+ },
412
+ });
413
+ // In your Worker/route: return handle(request)
414
+ ```
415
+
416
+ `persistInYourCms` is your own application function, not a package export.
417
+ The original article, including `thumbImageData`, `thumbnail` and other fields,
418
+ is passed to it unchanged. Store, transform or ignore images as your application
419
+ requires. No image-storage callback or image URL request is built into the handler.
420
+
421
+ For convenience, `decodeThumbImage(article, maxImageBytes?)` is an optional export
422
+ that validates and decodes the supplied JPEG base64 into a `Uint8Array`, or returns
423
+ `undefined` when absent. Its default decoded-size limit is 15 MiB. It does not save
424
+ anything, fetch a URL or change the article. You can use it inside your own image
425
+ storage implementation or ignore it entirely.
426
+
427
+ The default base is `/api/monok`. Auth headers, `/info`, `/push`, `/postfilter`,
428
+ and accepted acknowledgements match the Express contract. Default action is draft.
429
+ `getSiteInfo` and `searchArticles` are optional, as in the Express adapter.
430
+ `maxBodyBytes` defaults to 20 MiB. Implement durable retry/idempotency and CMS
431
+ publication callbacks in the host adapter. The web `sendMonokLinkback` uses native
432
+ fetch and the same Monok callback wire format. This entry point is content-only.
package/dist/web.d.ts ADDED
@@ -0,0 +1,29 @@
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 = "3.0.0";
5
+ export interface CreateMonokHandlerOptions {
6
+ apiKey: string;
7
+ basePath?: string;
8
+ maxBodyBytes?: number;
9
+ onArticle: (article: MonokArticle, context: {
10
+ action: MonokArticleAction;
11
+ }) => Promise<void> | void;
12
+ getSiteInfo?: SiteInfoInput | (() => Promise<SiteInfoInput> | SiteInfoInput);
13
+ searchArticles?: (query: PostFilterQuery) => Promise<PostFilterResult[]> | PostFilterResult[];
14
+ }
15
+ export declare class MonokRequestError extends Error {
16
+ status: number;
17
+ constructor(status: number, message: string);
18
+ }
19
+ /** The host supplies its established workspace key; keys never belong in generated frontend code. */
20
+ export declare function matchesMonokKey(candidate: string | null | undefined, expected: string | undefined): Promise<boolean>;
21
+ /** Optional JPEG convenience only. No storage, URL fetching or article mutation. */
22
+ export declare function decodeThumbImage(article: MonokArticle, maxImageBytes?: number): Uint8Array | undefined;
23
+ export declare function createMonokHandler(options: CreateMonokHandlerOptions): (request: Request) => Promise<Response>;
24
+ /** Send only after durable publication and public canonical availability. */
25
+ export declare function sendMonokLinkback(payload: LinkbackPayload, options?: {
26
+ monokBaseUrl?: string;
27
+ fetch?: typeof fetch;
28
+ }): Promise<void>;
29
+ //# 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,SAAS,EAAE,CACT,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE;QACP,MAAM,EAAE,kBAAkB,CAAC;KAC5B,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,oFAAoF;AACpF,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EACrB,aAAa,SAAmB,GAC/B,UAAU,GAAG,SAAS,CAOxB;AACD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,GACjC,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CA8EzC;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,199 @@
1
+ export const MONOK_SERVER_VERSION = "3.0.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
+ /** Optional JPEG convenience only. No storage, URL fetching or article mutation. */
94
+ export function decodeThumbImage(article, maxImageBytes = 15 * 1024 * 1024) {
95
+ if (!Number.isSafeInteger(maxImageBytes) || maxImageBytes <= 0)
96
+ throw Error("Invalid image size limit");
97
+ if (!article.thumbImageData)
98
+ return undefined;
99
+ if (typeof article.thumbImageData !== "string")
100
+ throw new MonokRequestError(400, "Invalid thumbnail");
101
+ return jpeg(article.thumbImageData, maxImageBytes);
102
+ }
103
+ export function createMonokHandler(options) {
104
+ const base = (options.basePath ?? "/api/monok").replace(/\/$/, "");
105
+ const maxBody = options.maxBodyBytes ?? 20 * 1024 * 1024;
106
+ if (!Number.isSafeInteger(maxBody) || maxBody <= 0)
107
+ throw Error("Invalid content size limits");
108
+ return async (request) => {
109
+ try {
110
+ const url = new URL(request.url), path = url.pathname.slice(base.length);
111
+ if (!url.pathname.startsWith(base + "/") || !["/info", "/push", "/postfilter"].includes(path))
112
+ return reply({ error: "Not found" }, 404);
113
+ if (request.method !== (path === "/push" ? "POST" : "GET"))
114
+ return reply({ error: "Method not allowed" }, 405);
115
+ const key = (path === "/push" ? request.headers.get("token") : null) ??
116
+ request.headers.get("X-API-Key") ??
117
+ url.searchParams.get("apikey");
118
+ if (!(await matchesMonokKey(key, options.apiKey)))
119
+ return reply({ error: "Unauthorized" }, 401);
120
+ if (path === "/info") {
121
+ const info = typeof options.getSiteInfo === "function"
122
+ ? await options.getSiteInfo()
123
+ : options.getSiteInfo;
124
+ return reply({
125
+ ...(info ?? {
126
+ js_scripts: "Disabled",
127
+ name: "Custom CMS",
128
+ logo: "",
129
+ categories: [],
130
+ post_types: ["post"],
131
+ tags: [],
132
+ authors: [],
133
+ }),
134
+ version: MONOK_SERVER_VERSION,
135
+ });
136
+ }
137
+ if (path === "/postfilter") {
138
+ if (!options.searchArticles)
139
+ return reply({ error: "Article search not configured" }, 404);
140
+ const q = url.searchParams;
141
+ const query = {
142
+ postType: q.get("post_type")?.trim() || "post",
143
+ amount: positive(q.get("amount"), 10),
144
+ page: positive(q.get("page"), 1),
145
+ };
146
+ for (const [target, source] of [
147
+ ["section", "section"],
148
+ ["tag", "tag"],
149
+ ["query", "q"],
150
+ ]) {
151
+ const value = q.get(source)?.trim();
152
+ if (value)
153
+ query[target] = value;
154
+ }
155
+ const results = await options.searchArticles(query);
156
+ if (!Array.isArray(results))
157
+ throw Error("Invalid search result");
158
+ return reply(results);
159
+ }
160
+ const value = await readJson(request, maxBody);
161
+ if (!value || typeof value !== "object" || Array.isArray(value))
162
+ throw new MonokRequestError(400, "Invalid payload");
163
+ const article = value;
164
+ if (!["string", "number"].includes(typeof article.id) ||
165
+ !String(article.id).trim() ||
166
+ typeof article.title !== "string" ||
167
+ !article.title.trim())
168
+ throw new MonokRequestError(400, "Invalid payload");
169
+ const action = url.searchParams.get("action") ?? article.action ?? "draft";
170
+ if (action !== "draft" && action !== "publish")
171
+ throw new MonokRequestError(400, "action must be either draft or publish");
172
+ await options.onArticle(article, { action });
173
+ return reply({ ok: true, status: "accepted", monokId: article.id });
174
+ }
175
+ catch (error) {
176
+ return error instanceof MonokRequestError
177
+ ? reply({ error: error.message }, error.status)
178
+ : reply({ error: "Content operation failed; retry later" }, 500);
179
+ }
180
+ };
181
+ }
182
+ /** Send only after durable publication and public canonical availability. */
183
+ export async function sendMonokLinkback(payload, options = {}) {
184
+ const response = await (options.fetch ?? fetch)((options.monokBaseUrl ?? "https://app.monok.com").replace(/\/$/, "") + "/api/v1/linkback", {
185
+ method: "POST",
186
+ headers: { "Content-Type": "application/json" },
187
+ body: JSON.stringify({
188
+ id: payload.monokId,
189
+ puff: { title: payload.title },
190
+ url: payload.url,
191
+ source: new URL(payload.url).hostname,
192
+ ...(payload.externalId !== undefined ? { externalId: String(payload.externalId) } : {}),
193
+ ...(payload.thumbnailUrl ? { thumbnail: payload.thumbnailUrl } : {}),
194
+ }),
195
+ });
196
+ if (!response.ok)
197
+ throw Error(`Monok linkback failed (${response.status})`);
198
+ }
199
+ //# 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,199 @@
1
+ export const MONOK_SERVER_VERSION = "3.0.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
+ /** Optional JPEG convenience only. No storage, URL fetching or article mutation. */
94
+ export function decodeThumbImage(article, maxImageBytes = 15 * 1024 * 1024) {
95
+ if (!Number.isSafeInteger(maxImageBytes) || maxImageBytes <= 0)
96
+ throw Error("Invalid image size limit");
97
+ if (!article.thumbImageData)
98
+ return undefined;
99
+ if (typeof article.thumbImageData !== "string")
100
+ throw new MonokRequestError(400, "Invalid thumbnail");
101
+ return jpeg(article.thumbImageData, maxImageBytes);
102
+ }
103
+ export function createMonokHandler(options) {
104
+ const base = (options.basePath ?? "/api/monok").replace(/\/$/, "");
105
+ const maxBody = options.maxBodyBytes ?? 20 * 1024 * 1024;
106
+ if (!Number.isSafeInteger(maxBody) || maxBody <= 0)
107
+ throw Error("Invalid content size limits");
108
+ return async (request) => {
109
+ try {
110
+ const url = new URL(request.url), path = url.pathname.slice(base.length);
111
+ if (!url.pathname.startsWith(base + "/") || !["/info", "/push", "/postfilter"].includes(path))
112
+ return reply({ error: "Not found" }, 404);
113
+ if (request.method !== (path === "/push" ? "POST" : "GET"))
114
+ return reply({ error: "Method not allowed" }, 405);
115
+ const key = (path === "/push" ? request.headers.get("token") : null) ??
116
+ request.headers.get("X-API-Key") ??
117
+ url.searchParams.get("apikey");
118
+ if (!(await matchesMonokKey(key, options.apiKey)))
119
+ return reply({ error: "Unauthorized" }, 401);
120
+ if (path === "/info") {
121
+ const info = typeof options.getSiteInfo === "function"
122
+ ? await options.getSiteInfo()
123
+ : options.getSiteInfo;
124
+ return reply({
125
+ ...(info ?? {
126
+ js_scripts: "Disabled",
127
+ name: "Custom CMS",
128
+ logo: "",
129
+ categories: [],
130
+ post_types: ["post"],
131
+ tags: [],
132
+ authors: [],
133
+ }),
134
+ version: MONOK_SERVER_VERSION,
135
+ });
136
+ }
137
+ if (path === "/postfilter") {
138
+ if (!options.searchArticles)
139
+ return reply({ error: "Article search not configured" }, 404);
140
+ const q = url.searchParams;
141
+ const query = {
142
+ postType: q.get("post_type")?.trim() || "post",
143
+ amount: positive(q.get("amount"), 10),
144
+ page: positive(q.get("page"), 1),
145
+ };
146
+ for (const [target, source] of [
147
+ ["section", "section"],
148
+ ["tag", "tag"],
149
+ ["query", "q"],
150
+ ]) {
151
+ const value = q.get(source)?.trim();
152
+ if (value)
153
+ query[target] = value;
154
+ }
155
+ const results = await options.searchArticles(query);
156
+ if (!Array.isArray(results))
157
+ throw Error("Invalid search result");
158
+ return reply(results);
159
+ }
160
+ const value = await readJson(request, maxBody);
161
+ if (!value || typeof value !== "object" || Array.isArray(value))
162
+ throw new MonokRequestError(400, "Invalid payload");
163
+ const article = value;
164
+ if (!["string", "number"].includes(typeof article.id) ||
165
+ !String(article.id).trim() ||
166
+ typeof article.title !== "string" ||
167
+ !article.title.trim())
168
+ throw new MonokRequestError(400, "Invalid payload");
169
+ const action = url.searchParams.get("action") ?? article.action ?? "draft";
170
+ if (action !== "draft" && action !== "publish")
171
+ throw new MonokRequestError(400, "action must be either draft or publish");
172
+ await options.onArticle(article, { action });
173
+ return reply({ ok: true, status: "accepted", monokId: article.id });
174
+ }
175
+ catch (error) {
176
+ return error instanceof MonokRequestError
177
+ ? reply({ error: error.message }, error.status)
178
+ : reply({ error: "Content operation failed; retry later" }, 500);
179
+ }
180
+ };
181
+ }
182
+ /** Send only after durable publication and public canonical availability. */
183
+ export async function sendMonokLinkback(payload, options = {}) {
184
+ const response = await (options.fetch ?? fetch)((options.monokBaseUrl ?? "https://app.monok.com").replace(/\/$/, "") + "/api/v1/linkback", {
185
+ method: "POST",
186
+ headers: { "Content-Type": "application/json" },
187
+ body: JSON.stringify({
188
+ id: payload.monokId,
189
+ puff: { title: payload.title },
190
+ url: payload.url,
191
+ source: new URL(payload.url).hostname,
192
+ ...(payload.externalId !== undefined ? { externalId: String(payload.externalId) } : {}),
193
+ ...(payload.thumbnailUrl ? { thumbnail: payload.thumbnailUrl } : {}),
194
+ }),
195
+ });
196
+ if (!response.ok)
197
+ throw Error(`Monok linkback failed (${response.status})`);
198
+ }
199
+ //# 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": "3.0.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": [