release: WRNexusJS 0.4.0

This commit is contained in:
2026-07-27 12:42:18 +05:30
parent 8b728a3e5d
commit 30e5721e84
250 changed files with 10065 additions and 3923 deletions
+20 -7
View File
@@ -34,7 +34,8 @@ function json(body: unknown, status = 200, headers: HeadersInit = {}): Response
async function readPayload(request: Request): Promise<Record<string, unknown>> {
const contentType = request.headers.get("content-type") ?? "";
if (contentType.includes("application/json")) return (await request.json()) as Record<string, unknown>;
if (contentType.includes("application/json"))
return (await request.json()) as Record<string, unknown>;
if (contentType.includes("form")) {
const form = await request.formData();
const payload: Record<string, unknown> = {};
@@ -88,15 +89,22 @@ export function createCaptchaHttpHandlers(
counters.set(key, counter);
}
counter.count += 1;
return { allowed: counter.count <= maximum, retryAfter: Math.max(1, Math.ceil((counter.resetAt - now) / 1000)) };
return {
allowed: counter.count <= maximum,
retryAfter: Math.max(1, Math.ceil((counter.resetAt - now) / 1000)),
};
};
const create = async (request: Request, ctx?: Context): Promise<Response> => {
if (!originAllowed(request)) return json({ success: false, code: "origin-rejected" }, 403);
if (request.method !== "POST") return json({ success: false, code: "method-not-allowed" }, 405, { allow: "POST" });
if (request.method !== "POST")
return json({ success: false, code: "method-not-allowed" }, 405, { allow: "POST" });
const ip = clientIp(request, ctx, options.trustProxy ?? false);
const limit = withinLimit(`create:${ip}`, options.createLimit ?? 30);
if (!limit.allowed) return json({ success: false, code: "rate-limited" }, 429, { "retry-after": String(limit.retryAfter) });
if (!limit.allowed)
return json({ success: false, code: "rate-limited" }, 429, {
"retry-after": String(limit.retryAfter),
});
try {
const payload = await readPayload(request);
const challenge = await engine.create({
@@ -118,10 +126,14 @@ export function createCaptchaHttpHandlers(
const verify = async (request: Request, ctx?: Context): Promise<Response> => {
if (!originAllowed(request)) return json({ success: false, code: "origin-rejected" }, 403);
if (request.method !== "POST") return json({ success: false, code: "method-not-allowed" }, 405, { allow: "POST" });
if (request.method !== "POST")
return json({ success: false, code: "method-not-allowed" }, 405, { allow: "POST" });
const ip = clientIp(request, ctx, options.trustProxy ?? false);
const limit = withinLimit(`verify:${ip}`, options.verifyLimit ?? 60);
if (!limit.allowed) return json({ success: false, code: "rate-limited" }, 429, { "retry-after": String(limit.retryAfter) });
if (!limit.allowed)
return json({ success: false, code: "rate-limited" }, 429, {
"retry-after": String(limit.retryAfter),
});
try {
const payload = await readPayload(request);
const result = await engine.verify({
@@ -143,7 +155,8 @@ export function createCaptchaHttpHandlers(
const audio = async (request: Request): Promise<Response> => {
if (!originAllowed(request)) return new Response("Forbidden", { status: 403 });
if (request.method !== "GET" && request.method !== "HEAD") return new Response("Method Not Allowed", { status: 405 });
if (request.method !== "GET" && request.method !== "HEAD")
return new Response("Method Not Allowed", { status: 405 });
const url = new URL(request.url);
const prefix = `${engine.basePath}/audio/`;
const id = decodeURIComponent(url.pathname.slice(prefix.length));