@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 +10 -0
- package/README.md +30 -0
- package/dist/web.d.ts +30 -0
- package/dist/web.d.ts.map +1 -0
- package/dist/web.js +205 -0
- package/dist/web.js.map +1 -0
- package/dist-cjs/web.js +205 -0
- package/dist-cjs/web.js.map +1 -0
- package/package.json +6 -1
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
|
package/dist/web.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"AAgBA,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAC5C,MAAM,OAAO,GAAG;IACd,cAAc,EAAE,kBAAkB;IAClC,eAAe,EAAE,yDAAyD;IAC1E,MAAM,EAAE,UAAU;IAClB,OAAO,EAAE,GAAG;IACZ,mBAAmB,EAAE,UAAU;CAChC,CAAC;AAiBF,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YACS,MAAc,EACrB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,WAAM,GAAN,MAAM,CAAQ;IAIvB,CAAC;CACF;AACD,qGAAqG;AACrG,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,SAAoC,EACpC,QAA4B;IAE5B,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC;IAC1D,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE,CAC/B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1E,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,EAC1B,EAAE,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,SAAS,IAAI,EAAE,CAAC,CAAC,CAAE,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC;IACjE,OAAO,SAAS,KAAK,CAAC,CAAC;AACzB,CAAC;AACD,SAAS,KAAK,CAAC,KAAc,EAAE,MAAM,GAAG,GAAG;IACzC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;AAC3E,CAAC;AACD,SAAS,QAAQ,CAAC,KAAoB,EAAE,QAAgB;IACtD,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAC;IAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC3D,MAAM,IAAI,iBAAiB,CAAC,GAAG,EAAE,uCAAuC,CAAC,CAAC;IAC5E,OAAO,CAAC,CAAC;AACX,CAAC;AACD,KAAK,UAAU,QAAQ,CAAC,OAAgB,EAAE,KAAa;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;IACzC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,iBAAiB,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IACjE,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,CAAC;QACH,SAAS,CAAC;YACR,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,IAAI;gBAAE,MAAM;YACrB,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;YAC9B,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;gBACjB,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;gBACtB,MAAM,IAAI,iBAAiB,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;YACxD,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;IACzB,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,iBAAiB,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AACD,SAAS,IAAI,CAAC,IAAY,EAAE,KAAa;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAClF,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC;QACrE,MAAM,IAAI,iBAAiB,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;IAC1D,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;QAC3C,MAAM,IAAI,iBAAiB,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IACtD,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,iBAAiB,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK;QAAE,MAAM,IAAI,iBAAiB,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IAC9E,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;QAC9E,MAAM,IAAI,iBAAiB,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;IAC5D,OAAO,KAAK,CAAC;AACf,CAAC;AACD,MAAM,UAAU,kBAAkB,CAChC,OAAkC;IAElC,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,YAAY,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,EACtD,QAAQ,GAAG,OAAO,CAAC,aAAa,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;IACvD,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrE,MAAM,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAC9B,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAC3F,OAAO,KAAK,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;YAC5C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;gBACxD,OAAO,KAAK,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,GAAG,CAAC,CAAC;YACrD,MAAM,GAAG,GACP,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACxD,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;gBAChC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACjC,IAAI,CAAC,CAAC,MAAM,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC/C,OAAO,KAAK,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,GAAG,CAAC,CAAC;YAC/C,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBACrB,MAAM,IAAI,GACR,OAAO,OAAO,CAAC,WAAW,KAAK,UAAU;oBACvC,CAAC,CAAC,MAAM,OAAO,CAAC,WAAW,EAAE;oBAC7B,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;gBAC1B,OAAO,KAAK,CAAC;oBACX,GAAG,CAAC,IAAI,IAAI;wBACV,UAAU,EAAE,UAAU;wBACtB,IAAI,EAAE,YAAY;wBAClB,IAAI,EAAE,EAAE;wBACR,UAAU,EAAE,EAAE;wBACd,UAAU,EAAE,CAAC,MAAM,CAAC;wBACpB,IAAI,EAAE,EAAE;wBACR,OAAO,EAAE,EAAE;qBACZ,CAAC;oBACF,OAAO,EAAE,oBAAoB;iBAC9B,CAAC,CAAC;YACL,CAAC;YACD,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;gBAC3B,IAAI,CAAC,OAAO,CAAC,cAAc;oBAAE,OAAO,KAAK,CAAC,EAAE,KAAK,EAAE,+BAA+B,EAAE,EAAE,GAAG,CAAC,CAAC;gBAC3F,MAAM,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC;gBAC3B,MAAM,KAAK,GAAoB;oBAC7B,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,MAAM;oBAC9C,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACrC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;iBACjC,CAAC;gBACF,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI;oBAC7B,CAAC,SAAS,EAAE,SAAS,CAAC;oBACtB,CAAC,KAAK,EAAE,KAAK,CAAC;oBACd,CAAC,OAAO,EAAE,GAAG,CAAC;iBACN,EAAE,CAAC;oBACX,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC;oBACpC,IAAI,KAAK;wBAAE,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;gBACnC,CAAC;gBACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;gBACpD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;oBAAE,MAAM,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBAClE,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAC7D,MAAM,IAAI,iBAAiB,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;YACtD,MAAM,OAAO,GAAG,KAAqB,CAAC;YACtC,IACE,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,OAAO,CAAC,EAAE,CAAC;gBACjD,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE;gBAC1B,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ;gBACjC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE;gBAErB,MAAM,IAAI,iBAAiB,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;YACtD,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC;YAC3E,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,SAAS;gBAC5C,MAAM,IAAI,iBAAiB,CAAC,GAAG,EAAE,wCAAwC,CAAC,CAAC;YAC7E,IAAI,KAA8C,CAAC;YACnD,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE;gBAC/B,MAAM;gBACN,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE;oBACvB,IAAI,CAAC,KAAK;wBACR,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE;4BAClB,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,SAAS;gCAAE,OAAO,SAAS,CAAC;4BACpE,IAAI,OAAO,OAAO,CAAC,cAAc,KAAK,QAAQ;gCAC5C,MAAM,IAAI,iBAAiB,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;4BACxD,MAAM,QAAQ,GACZ,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC;gCAC5E,MAAM,CAAC;4BACT,OAAO,OAAO,CAAC,SAAU,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;wBACvF,CAAC,CAAC,EAAE,CAAC;oBACP,OAAO,KAAK,CAAC;gBACf,CAAC;aACF,CAAC,CAAC;YACH,OAAO,KAAK,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,YAAY,iBAAiB;gBACvC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC;gBAC/C,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,uCAAuC,EAAE,EAAE,GAAG,CAAC,CAAC;QACrE,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AACD,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAwB,EACxB,UAA2D,EAAE;IAE7D,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,CAC7C,CAAC,OAAO,CAAC,YAAY,IAAI,uBAAuB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,kBAAkB,EACzF;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,EAAE,EAAE,OAAO,CAAC,OAAO;YACnB,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE;YAC9B,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,MAAM,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ;YACrC,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvF,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrE,CAAC;KACH,CACF,CAAC;IACF,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,KAAK,CAAC,0BAA0B,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9E,CAAC"}
|
package/dist-cjs/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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@monok/server",
|
|
3
|
-
"version": "2.
|
|
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": [
|