@aotter/mantle-cloudflare 0.1.0-alpha.9 → 0.1.2-alpha.2
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/README.md +88 -13
- package/dist/auth/conventionalAuth.d.ts +1 -0
- package/dist/auth/conventionalAuth.d.ts.map +1 -1
- package/dist/auth/conventionalAuth.js +2 -0
- package/dist/auth/conventionalAuth.js.map +1 -1
- package/dist/auth/createAuth.d.ts +24 -11
- package/dist/auth/createAuth.d.ts.map +1 -1
- package/dist/auth/createAuth.js +274 -23
- package/dist/auth/createAuth.js.map +1 -1
- package/dist/auth/emailTemplates.d.ts +7 -0
- package/dist/auth/emailTemplates.d.ts.map +1 -0
- package/dist/auth/emailTemplates.js +27 -0
- package/dist/auth/emailTemplates.js.map +1 -0
- package/dist/bindings/KvSiteConfigRepository.d.ts +44 -0
- package/dist/bindings/KvSiteConfigRepository.d.ts.map +1 -0
- package/dist/bindings/KvSiteConfigRepository.js +286 -0
- package/dist/bindings/KvSiteConfigRepository.js.map +1 -0
- package/dist/bindings/R2MediaStorage.d.ts +2 -3
- package/dist/bindings/R2MediaStorage.d.ts.map +1 -1
- package/dist/bindings/R2MediaStorage.js +59 -42
- package/dist/bindings/R2MediaStorage.js.map +1 -1
- package/dist/bindings/WorkersQueueHookDispatcher.d.ts.map +1 -1
- package/dist/bindings/WorkersQueueHookDispatcher.js +10 -8
- package/dist/bindings/WorkersQueueHookDispatcher.js.map +1 -1
- package/dist/bindings/conventionalBindings.d.ts +3 -1
- package/dist/bindings/conventionalBindings.d.ts.map +1 -1
- package/dist/bindings/conventionalBindings.js +4 -1
- package/dist/bindings/conventionalBindings.js.map +1 -1
- package/dist/bindings/index.d.ts +1 -0
- package/dist/bindings/index.d.ts.map +1 -1
- package/dist/bindings/index.js +1 -0
- package/dist/bindings/index.js.map +1 -1
- package/dist/mount/bootRuntimeOnce.d.ts +4 -0
- package/dist/mount/bootRuntimeOnce.d.ts.map +1 -1
- package/dist/mount/bootRuntimeOnce.js +53 -27
- package/dist/mount/bootRuntimeOnce.js.map +1 -1
- package/dist/mount/cmsConfig.d.ts +12 -1
- package/dist/mount/cmsConfig.d.ts.map +1 -1
- package/dist/mount/mountMcp.d.ts.map +1 -1
- package/dist/mount/mountMcp.js +76 -92
- package/dist/mount/mountMcp.js.map +1 -1
- package/dist/mount/mountPublicRoutes.d.ts +1 -0
- package/dist/mount/mountPublicRoutes.d.ts.map +1 -1
- package/dist/mount/mountPublicRoutes.js +74 -59
- package/dist/mount/mountPublicRoutes.js.map +1 -1
- package/dist/mount/mountRuntimeEndpoints.d.ts.map +1 -1
- package/dist/mount/mountRuntimeEndpoints.js +20 -3
- package/dist/mount/mountRuntimeEndpoints.js.map +1 -1
- package/dist/mount/resolveCaller.d.ts +1 -1
- package/dist/mount/resolveCaller.d.ts.map +1 -1
- package/dist/mount/resolveCaller.js +5 -3
- package/dist/mount/resolveCaller.js.map +1 -1
- package/dist/oauth/cachePolicy.d.ts +3 -1
- package/dist/oauth/cachePolicy.d.ts.map +1 -1
- package/dist/oauth/cachePolicy.js +10 -2
- package/dist/oauth/cachePolicy.js.map +1 -1
- package/dist/oauth/index.d.ts +2 -2
- package/dist/oauth/index.d.ts.map +1 -1
- package/dist/oauth/index.js +2 -2
- package/dist/oauth/index.js.map +1 -1
- package/dist/requestDiagnostics.d.ts +53 -0
- package/dist/requestDiagnostics.d.ts.map +1 -0
- package/dist/requestDiagnostics.js +32 -0
- package/dist/requestDiagnostics.js.map +1 -0
- package/dist/testing.d.ts +19 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +263 -0
- package/dist/testing.js.map +1 -0
- package/dist/worker/createMantleWorker.d.ts +5 -0
- package/dist/worker/createMantleWorker.d.ts.map +1 -1
- package/dist/worker/createMantleWorker.js +58 -19
- package/dist/worker/createMantleWorker.js.map +1 -1
- package/package.json +24 -17
- package/dist/auth/rejectCrossOriginMutation.d.ts +0 -2
- package/dist/auth/rejectCrossOriginMutation.d.ts.map +0 -1
- package/dist/auth/rejectCrossOriginMutation.js +0 -15
- package/dist/auth/rejectCrossOriginMutation.js.map +0 -1
- package/dist/oauth/consentHtml.d.ts +0 -15
- package/dist/oauth/consentHtml.d.ts.map +0 -1
- package/dist/oauth/consentHtml.js +0 -91
- package/dist/oauth/consentHtml.js.map +0 -1
- package/dist/oauth/mountOAuth.d.ts +0 -9
- package/dist/oauth/mountOAuth.d.ts.map +0 -1
- package/dist/oauth/mountOAuth.js +0 -37
- package/dist/oauth/mountOAuth.js.map +0 -1
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Hono, } from "hono";
|
|
2
|
+
import { mountMantleOAuth } from "@aotter/mantle-admin";
|
|
2
3
|
import { conventionalMcpResource, createConventionalAuth, setupIncompleteAuthResponse, } from "../auth/conventionalAuth.js";
|
|
3
4
|
import { createConventionalBindings, } from "../bindings/conventionalBindings.js";
|
|
4
5
|
import { createMantleRuntimeRef, } from "../mount/bootRuntimeOnce.js";
|
|
5
6
|
import { createMcpApiHandler } from "../mount/mountMcp.js";
|
|
6
7
|
import { mountAdmin } from "../mount/mountAdmin.js";
|
|
7
8
|
import { mountRuntimeEndpoints } from "../mount/mountRuntimeEndpoints.js";
|
|
8
|
-
import {
|
|
9
|
-
import { applyCachePolicy, PUBLIC_CACHE_TAG } from "../oauth/cachePolicy.js";
|
|
9
|
+
import { applyCachePolicy, normalizeCacheScope, scopedPublicCacheTag, } from "../oauth/cachePolicy.js";
|
|
10
10
|
/** Fixed namespaces owned by Mantle's standard Worker surfaces. */
|
|
11
11
|
export const MANTLE_RESERVED_PATH_PREFIXES = [
|
|
12
12
|
"/admin",
|
|
@@ -26,7 +26,9 @@ export function createMantleWorker(options) {
|
|
|
26
26
|
const assemble = (env) => {
|
|
27
27
|
if (assembled)
|
|
28
28
|
return assembled;
|
|
29
|
-
const
|
|
29
|
+
const cacheScope = normalizeCacheScope(resolve(options.cacheScope, env));
|
|
30
|
+
const publicCacheTag = scopedPublicCacheTag(cacheScope);
|
|
31
|
+
const conventional = createConventionalBindings(env, cacheScope);
|
|
30
32
|
const bindings = options.bindings?.(env, conventional) ?? conventional;
|
|
31
33
|
const auth = options.auth?.(env) ?? createConventionalAuth(env);
|
|
32
34
|
let ref = null;
|
|
@@ -35,10 +37,12 @@ export function createMantleWorker(options) {
|
|
|
35
37
|
: Promise.reject(new Error("Mantle runtime is unavailable until `extend` returns."));
|
|
36
38
|
const bootstrap = { env, auth, bindings, getRuntime };
|
|
37
39
|
const extension = options.extend?.(bootstrap) ?? {};
|
|
40
|
+
const sharedPublicCacheTag = extension.credentialResolver ? undefined : publicCacheTag;
|
|
38
41
|
ref = createMantleRuntimeRef({
|
|
39
42
|
plan: options.plan,
|
|
40
43
|
handlers: mergeHandlers(options.handlers, extension.handlers),
|
|
41
44
|
siteDefaults: resolve(options.siteDefaults, env),
|
|
45
|
+
cacheScope: sharedPublicCacheTag ? cacheScope : undefined,
|
|
42
46
|
templates: options.templates,
|
|
43
47
|
publicPathResolver: options.publicPathResolver,
|
|
44
48
|
reservedHttpPathPrefixes: [
|
|
@@ -51,13 +55,33 @@ export function createMantleWorker(options) {
|
|
|
51
55
|
auth,
|
|
52
56
|
credentialResolver: extension.credentialResolver,
|
|
53
57
|
jwtBearer: extension.jwtBearer,
|
|
54
|
-
onPublicChange: purgePublicCache,
|
|
58
|
+
onPublicChange: () => purgePublicCache(sharedPublicCacheTag),
|
|
55
59
|
});
|
|
56
60
|
const app = new Hono();
|
|
61
|
+
// Preserve Hono HTTP responses; redact unexpected failures at the facade.
|
|
62
|
+
app.onError((error, c) => {
|
|
63
|
+
if ("getResponse" in error) {
|
|
64
|
+
const response = error.getResponse();
|
|
65
|
+
return c.newResponse(response.body, response);
|
|
66
|
+
}
|
|
67
|
+
throw error;
|
|
68
|
+
});
|
|
69
|
+
// Schema readiness belongs to database consumers, not static dispatch.
|
|
70
|
+
app.use("*", async (c, next) => {
|
|
71
|
+
const path = c.req.path;
|
|
72
|
+
if (hasOwnedPrefix(path, auth.basePath)
|
|
73
|
+
|| hasOwnedPrefix(path, "/oauth")
|
|
74
|
+
|| hasOwnedPrefix(path, "/mcp")
|
|
75
|
+
|| hasOwnedPrefix(path, "/admin/api")
|
|
76
|
+
|| path.startsWith(MANTLE_RESERVED_WELL_KNOWN_PREFIX)) {
|
|
77
|
+
await getRuntime();
|
|
78
|
+
}
|
|
79
|
+
await next();
|
|
80
|
+
});
|
|
57
81
|
mountRuntimeEndpoints(app, ref);
|
|
58
82
|
if (bindings.adminAssets)
|
|
59
83
|
mountAdmin(app, ref, bindings.adminAssets);
|
|
60
|
-
|
|
84
|
+
mountMantleOAuth(app, { auth, assets: bindings.adminAssets });
|
|
61
85
|
const mcpResource = auth.mcpResource ?? conventionalMcpResource(env);
|
|
62
86
|
const publicMcp = createMcpApiHandler({
|
|
63
87
|
ref,
|
|
@@ -78,48 +102,63 @@ export function createMantleWorker(options) {
|
|
|
78
102
|
ref,
|
|
79
103
|
});
|
|
80
104
|
assertExtensionRoutes(app, standardRouteCount, auth.basePath);
|
|
105
|
+
// A convention, not a reserved namespace: an existing host route wins.
|
|
106
|
+
app.get("/favicon.ico", async (c) => {
|
|
107
|
+
const icons = (await (await ref.get()).siteConfig.load()).icons;
|
|
108
|
+
const icon = icons.find((candidate) => candidate.mimeType === "image/png" && !candidate.theme)
|
|
109
|
+
?? icons.find((candidate) => !candidate.theme)
|
|
110
|
+
?? icons[0];
|
|
111
|
+
if (!icon)
|
|
112
|
+
return c.notFound();
|
|
113
|
+
const target = new URL(icon.src, c.req.url);
|
|
114
|
+
if (target.origin === new URL(c.req.url).origin && target.pathname === "/favicon.ico") {
|
|
115
|
+
return await bindings.adminAssets?.fetch(new Request(target)) ?? c.notFound();
|
|
116
|
+
}
|
|
117
|
+
return c.redirect(icon.src);
|
|
118
|
+
});
|
|
81
119
|
const next = {
|
|
82
120
|
auth,
|
|
83
121
|
getRuntime,
|
|
84
|
-
fetch: async (request, workerEnv, ctx) => applyCachePolicy(request, await app.fetch(request, workerEnv, ctx)),
|
|
122
|
+
fetch: async (request, workerEnv, ctx) => applyCachePolicy(request, await app.fetch(request, workerEnv, ctx), sharedPublicCacheTag ?? null),
|
|
85
123
|
};
|
|
86
124
|
assembled = next;
|
|
125
|
+
void auth.ready?.catch(() => {
|
|
126
|
+
if (assembled === next)
|
|
127
|
+
assembled = null;
|
|
128
|
+
});
|
|
87
129
|
return next;
|
|
88
130
|
};
|
|
89
131
|
return {
|
|
90
|
-
getRuntime(env) {
|
|
91
|
-
|
|
132
|
+
async getRuntime(env) {
|
|
133
|
+
const worker = assemble(env);
|
|
134
|
+
const [runtime] = await Promise.all([worker.getRuntime(), worker.auth.ready]);
|
|
135
|
+
return runtime;
|
|
92
136
|
},
|
|
93
137
|
async fetch(request, env, ctx) {
|
|
94
138
|
return runMantleWorkerRequest(async () => {
|
|
95
139
|
const worker = assemble(env);
|
|
140
|
+
if (worker.auth.ready)
|
|
141
|
+
ctx.waitUntil(worker.auth.ready);
|
|
96
142
|
const setupIncomplete = await setupIncompleteAuthResponse(request, worker.auth);
|
|
97
143
|
if (setupIncomplete)
|
|
98
144
|
return setupIncomplete;
|
|
99
|
-
if (!isRuntimeIndependentOAuthRequest(request))
|
|
100
|
-
await worker.getRuntime();
|
|
101
145
|
return worker.fetch(request, env, ctx);
|
|
102
146
|
});
|
|
103
147
|
},
|
|
104
148
|
};
|
|
105
149
|
}
|
|
106
|
-
async function purgePublicCache() {
|
|
150
|
+
async function purgePublicCache(publicCacheTag) {
|
|
151
|
+
if (!publicCacheTag)
|
|
152
|
+
return;
|
|
107
153
|
const { cache } = await import("cloudflare:workers");
|
|
108
154
|
// Miniflare does not simulate entrypoint caching or its purge API.
|
|
109
155
|
if (typeof cache.purge !== "function")
|
|
110
156
|
return;
|
|
111
|
-
const result = await cache.purge({ tags: [
|
|
157
|
+
const result = await cache.purge({ tags: [publicCacheTag] });
|
|
112
158
|
if (!result.success) {
|
|
113
159
|
console.error("Mantle public cache purge failed", result.errors);
|
|
114
160
|
}
|
|
115
161
|
}
|
|
116
|
-
function isRuntimeIndependentOAuthRequest(request) {
|
|
117
|
-
const pathname = new URL(request.url).pathname;
|
|
118
|
-
if (pathname.startsWith(MANTLE_RESERVED_WELL_KNOWN_PREFIX))
|
|
119
|
-
return true;
|
|
120
|
-
return (pathname === "/mcp" || pathname.startsWith("/mcp/")) &&
|
|
121
|
-
!request.headers.has("authorization");
|
|
122
|
-
}
|
|
123
162
|
/** Redacted fail-closed boundary for facade and low-level Worker assembly failures. */
|
|
124
163
|
export async function runMantleWorkerRequest(run) {
|
|
125
164
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createMantleWorker.js","sourceRoot":"","sources":["../../src/worker/createMantleWorker.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,GAIL,MAAM,MAAM,CAAC;AAOd,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,2BAA2B,GAE5B,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,0BAA0B,GAE3B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,sBAAsB,GAGvB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAE1E,OAAO,
|
|
1
|
+
{"version":3,"file":"createMantleWorker.js","sourceRoot":"","sources":["../../src/worker/createMantleWorker.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aotter/mantle-cloudflare",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2-alpha.2",
|
|
4
4
|
"description": "Cloudflare Workers adapter for Mantle runtime, Admin, MCP, and public Web mounts.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://mantle.tools/",
|
|
@@ -22,6 +22,10 @@
|
|
|
22
22
|
".": {
|
|
23
23
|
"types": "./dist/index.d.ts",
|
|
24
24
|
"import": "./dist/index.js"
|
|
25
|
+
},
|
|
26
|
+
"./testing": {
|
|
27
|
+
"types": "./dist/testing.d.ts",
|
|
28
|
+
"import": "./dist/testing.js"
|
|
25
29
|
}
|
|
26
30
|
},
|
|
27
31
|
"files": [
|
|
@@ -29,30 +33,32 @@
|
|
|
29
33
|
"README.md"
|
|
30
34
|
],
|
|
31
35
|
"dependencies": {
|
|
32
|
-
"@better-auth/cimd": "
|
|
33
|
-
"@better-auth/mcp": "
|
|
34
|
-
"@better-auth/oauth-provider": "
|
|
35
|
-
"@aotter/mantle-admin": "0.1.
|
|
36
|
-
"@aotter/mantle-runtime": "0.1.
|
|
37
|
-
"@aotter/mantle-spec": "0.1.
|
|
38
|
-
"@aotter/mantle-web": "0.1.
|
|
36
|
+
"@better-auth/cimd": "1.7.2",
|
|
37
|
+
"@better-auth/mcp": "1.7.2",
|
|
38
|
+
"@better-auth/oauth-provider": "1.7.2",
|
|
39
|
+
"@aotter/mantle-admin": "0.1.2-alpha.2",
|
|
40
|
+
"@aotter/mantle-runtime": "0.1.2-alpha.2",
|
|
41
|
+
"@aotter/mantle-spec": "0.1.2-alpha.2",
|
|
42
|
+
"@aotter/mantle-web": "0.1.2-alpha.2"
|
|
39
43
|
},
|
|
40
44
|
"peerDependencies": {
|
|
41
45
|
"aws4fetch": "^1.0.20",
|
|
42
|
-
"better-auth": "
|
|
46
|
+
"better-auth": "1.7.2",
|
|
43
47
|
"hono": "^4.12.0",
|
|
44
|
-
"zod": "^4.
|
|
48
|
+
"zod": "^4.5.0"
|
|
45
49
|
},
|
|
46
50
|
"devDependencies": {
|
|
47
|
-
"@
|
|
51
|
+
"@better-auth/core": "1.7.2",
|
|
52
|
+
"@better-auth/utils": "0.4.2",
|
|
53
|
+
"@cloudflare/workers-types": "^5.20260826.1",
|
|
48
54
|
"@types/node": "^26",
|
|
49
55
|
"aws4fetch": "^1.0.20",
|
|
50
|
-
"better-auth": "
|
|
51
|
-
"hono": "^4.
|
|
56
|
+
"better-auth": "1.7.2",
|
|
57
|
+
"hono": "^4.13.3",
|
|
52
58
|
"typescript": "^6.0.3",
|
|
53
|
-
"vitest": "^4.1.
|
|
54
|
-
"wrangler": "^4.
|
|
55
|
-
"zod": "^4.4
|
|
59
|
+
"vitest": "^4.1.11",
|
|
60
|
+
"wrangler": "^4.126.0",
|
|
61
|
+
"zod": "^4.5.4"
|
|
56
62
|
},
|
|
57
63
|
"scripts": {
|
|
58
64
|
"prebuild": "rm -rf dist .tsbuildinfo",
|
|
@@ -61,6 +67,7 @@
|
|
|
61
67
|
"test": "pnpm test:facade-types && vitest run",
|
|
62
68
|
"test:facade-types": "tsc --ignoreConfig --noEmit --strict --target ES2022 --module NodeNext --moduleResolution NodeNext --skipLibCheck --types @cloudflare/workers-types,node test/createMantleWorker.typecheck.ts",
|
|
63
69
|
"bench:http-dispatch": "vitest bench --run test/http-dispatch.bench.ts",
|
|
64
|
-
"bench:wrangler": "pnpm --filter @aotter/mantle-
|
|
70
|
+
"bench:wrangler": "pnpm --filter '@aotter/mantle-cloudflare^...' build && node ../../../scripts/run-wrangler-performance.mjs && node test/performance/generate-parity-plan.mjs && BENCH_QUICK=1 BENCH_ROUNDS=10 node ../../../scripts/run-wrangler-parity.mjs",
|
|
71
|
+
"bench:parity": "pnpm --filter '@aotter/mantle-cloudflare^...' build && node test/performance/generate-parity-plan.mjs && node ../../../scripts/run-wrangler-parity.mjs"
|
|
65
72
|
}
|
|
66
73
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rejectCrossOriginMutation.d.ts","sourceRoot":"","sources":["../../src/auth/rejectCrossOriginMutation.ts"],"names":[],"mappings":"AAAA,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,IAAI,CAa3E"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export function rejectCrossOriginMutation(request) {
|
|
2
|
-
if (request.method === "GET" || request.method === "HEAD" || request.method === "OPTIONS") {
|
|
3
|
-
return null;
|
|
4
|
-
}
|
|
5
|
-
const site = request.headers.get("sec-fetch-site");
|
|
6
|
-
if (site && site !== "same-origin" && site !== "none") {
|
|
7
|
-
return new Response("cross-origin session mutation rejected", { status: 403 });
|
|
8
|
-
}
|
|
9
|
-
const origin = request.headers.get("origin");
|
|
10
|
-
if (origin && origin !== new URL(request.url).origin) {
|
|
11
|
-
return new Response("origin mismatch", { status: 403 });
|
|
12
|
-
}
|
|
13
|
-
return null;
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=rejectCrossOriginMutation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rejectCrossOriginMutation.js","sourceRoot":"","sources":["../../src/auth/rejectCrossOriginMutation.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACxD,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC1F,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACnD,IAAI,IAAI,IAAI,IAAI,KAAK,aAAa,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACtD,OAAO,IAAI,QAAQ,CAAC,wCAAwC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,MAAM,IAAI,MAAM,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;QACrD,OAAO,IAAI,QAAQ,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OAuth consent UI renderer. Self-contained HTML — no external assets,
|
|
3
|
-
* no framework and no Admin UI dependency.
|
|
4
|
-
* Supports zh-TW and en locales.
|
|
5
|
-
*/
|
|
6
|
-
export interface ConsentModel {
|
|
7
|
-
readonly clientName: string;
|
|
8
|
-
readonly redirectUri: string;
|
|
9
|
-
readonly scopes: readonly string[];
|
|
10
|
-
readonly oauthQuery: string;
|
|
11
|
-
}
|
|
12
|
-
/** Detect consent UI locale from Accept-Language header. */
|
|
13
|
-
export declare function detectConsentLocale(acceptLanguage: string | null): "zh-TW" | "en";
|
|
14
|
-
export declare function renderConsentHtml(locale: "zh-TW" | "en", model: ConsentModel | null): string;
|
|
15
|
-
//# sourceMappingURL=consentHtml.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"consentHtml.d.ts","sourceRoot":"","sources":["../../src/oauth/consentHtml.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,4DAA4D;AAC5D,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,CAKjF;AA0DD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,GAAG,MAAM,CA4B5F"}
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OAuth consent UI renderer. Self-contained HTML — no external assets,
|
|
3
|
-
* no framework and no Admin UI dependency.
|
|
4
|
-
* Supports zh-TW and en locales.
|
|
5
|
-
*/
|
|
6
|
-
/** Detect consent UI locale from Accept-Language header. */
|
|
7
|
-
export function detectConsentLocale(acceptLanguage) {
|
|
8
|
-
if (!acceptLanguage)
|
|
9
|
-
return "en";
|
|
10
|
-
const lower = acceptLanguage.toLowerCase();
|
|
11
|
-
if (lower.includes("zh-tw") || lower.includes("zh_tw"))
|
|
12
|
-
return "zh-TW";
|
|
13
|
-
return "en";
|
|
14
|
-
}
|
|
15
|
-
const STRINGS = {
|
|
16
|
-
en: {
|
|
17
|
-
title: "Authorize · mantle",
|
|
18
|
-
eyebrow: "Authorize MCP access",
|
|
19
|
-
heading: (client) => `Allow ${client} to access your CMS?`,
|
|
20
|
-
redirectLabel: "Will redirect to",
|
|
21
|
-
scopesLabel: "Requested scopes",
|
|
22
|
-
approve: "Approve",
|
|
23
|
-
deny: "Deny",
|
|
24
|
-
invalidTitle: "Invalid authorization request",
|
|
25
|
-
invalidBody: "Missing or malformed consent payload. Return to your MCP client and try again.",
|
|
26
|
-
},
|
|
27
|
-
"zh-TW": {
|
|
28
|
-
title: "授權 · mantle",
|
|
29
|
-
eyebrow: "授權 MCP 存取",
|
|
30
|
-
heading: (client) => `允許 ${client} 存取您的 CMS?`,
|
|
31
|
-
redirectLabel: "將重新導向至",
|
|
32
|
-
scopesLabel: "請求的授權範圍",
|
|
33
|
-
approve: "同意",
|
|
34
|
-
deny: "拒絕",
|
|
35
|
-
invalidTitle: "無效的授權請求",
|
|
36
|
-
invalidBody: "缺少或格式錯誤的授權資訊,請返回 MCP 客戶端重試。",
|
|
37
|
-
},
|
|
38
|
-
};
|
|
39
|
-
function escapeHtml(s) {
|
|
40
|
-
return s
|
|
41
|
-
.replace(/&/g, "&")
|
|
42
|
-
.replace(/</g, "<")
|
|
43
|
-
.replace(/>/g, ">")
|
|
44
|
-
.replace(/"/g, """)
|
|
45
|
-
.replace(/'/g, "'");
|
|
46
|
-
}
|
|
47
|
-
const CSS = `
|
|
48
|
-
:root{--mantle-blue-deep:#1a3062;--app-background:#f6f8fc;--foreground:#172033;--card:#fff;--card-foreground:#172033;--border:#d7dce7;--muted:#f1f3f8;--muted-foreground:#596579;--primary:#1a3062;--primary-foreground:#fff;--secondary:#edf1fa;--secondary-foreground:#1a3062;--accent:#e2e8f5;--ring:#4d6aac;--radius:.625rem}
|
|
49
|
-
*{box-sizing:border-box}
|
|
50
|
-
body{margin:0;min-height:100svh;display:flex;align-items:center;justify-content:center;padding:1rem;font-family:ui-sans-serif,system-ui,sans-serif;color:var(--foreground);background:var(--app-background)}
|
|
51
|
-
.card{max-width:32rem;width:100%;padding:2rem;border-radius:calc(var(--radius) + .125rem);color:var(--card-foreground);background:var(--card);border:1px solid var(--border);box-shadow:0 12px 36px color-mix(in srgb,var(--mantle-blue-deep) 8%,transparent);backdrop-filter:blur(48px) saturate(135%)}
|
|
52
|
-
.eyebrow{font-size:.7rem;text-transform:uppercase;letter-spacing:.18em;font-weight:500;color:var(--muted-foreground);margin:0 0 .5rem}
|
|
53
|
-
h1{font-size:1.5rem;line-height:1.3;font-weight:500;margin:0 0 .75rem;letter-spacing:-.02em}
|
|
54
|
-
p{margin:0 0 1rem;font-size:.95rem;line-height:1.55}
|
|
55
|
-
.muted{color:var(--muted-foreground);font-size:.875rem}
|
|
56
|
-
code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.8rem;padding:.125rem .4rem;border-radius:.25rem;background:var(--muted);overflow-wrap:anywhere}
|
|
57
|
-
.scopes{margin:0 0 1.5rem;display:flex;flex-wrap:wrap;gap:.375rem}
|
|
58
|
-
.scope{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.75rem;padding:.25rem .5rem;border-radius:.25rem;background:var(--muted)}
|
|
59
|
-
form{display:flex;gap:.75rem}
|
|
60
|
-
button{flex:1;padding:.625rem 1rem;border:0;border-radius:.5rem;font:inherit;font-weight:500;cursor:pointer;transition:opacity .15s,background .15s}
|
|
61
|
-
button:focus-visible{outline:2px solid var(--ring);outline-offset:2px}
|
|
62
|
-
button[value="approve"]{background:var(--primary);color:var(--primary-foreground)}
|
|
63
|
-
button[value="approve"]:hover{opacity:.9}
|
|
64
|
-
button[value="deny"]{background:var(--secondary);color:var(--secondary-foreground)}
|
|
65
|
-
button[value="deny"]:hover{background:var(--accent)}
|
|
66
|
-
@media(max-width:30rem){form{flex-direction:column}}
|
|
67
|
-
`.trim();
|
|
68
|
-
export function renderConsentHtml(locale, model) {
|
|
69
|
-
const t = STRINGS[locale];
|
|
70
|
-
const lang = locale === "zh-TW" ? "zh-Hant-TW" : "en";
|
|
71
|
-
const head = `<!doctype html><html lang="${lang}"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><title>${t.title}</title><style>${CSS}</style></head><body><main class="card">`;
|
|
72
|
-
const tail = `</main></body></html>`;
|
|
73
|
-
if (!model) {
|
|
74
|
-
return `${head}<p class="eyebrow">${t.eyebrow}</p><h1>${t.invalidTitle}</h1><p class="muted">${t.invalidBody}</p>${tail}`;
|
|
75
|
-
}
|
|
76
|
-
const scopesBlock = model.scopes.length > 0
|
|
77
|
-
? `<p class="eyebrow">${t.scopesLabel}</p><div class="scopes">${model.scopes.map((s) => `<span class="scope">${escapeHtml(s)}</span>`).join("")}</div>`
|
|
78
|
-
: "";
|
|
79
|
-
return (`${head}` +
|
|
80
|
-
`<p class="eyebrow">${t.eyebrow}</p>` +
|
|
81
|
-
`<h1>${t.heading(escapeHtml(model.clientName))}</h1>` +
|
|
82
|
-
`<p class="muted">${t.redirectLabel} <code>${escapeHtml(model.redirectUri)}</code></p>` +
|
|
83
|
-
`${scopesBlock}` +
|
|
84
|
-
`<form method="post" action="/oauth/consent">` +
|
|
85
|
-
`<input type="hidden" name="oauth_query" value="${escapeHtml(model.oauthQuery)}"/>` +
|
|
86
|
-
`<button type="submit" name="decision" value="approve">${t.approve}</button>` +
|
|
87
|
-
`<button type="submit" name="decision" value="deny">${t.deny}</button>` +
|
|
88
|
-
`</form>` +
|
|
89
|
-
`${tail}`);
|
|
90
|
-
}
|
|
91
|
-
//# sourceMappingURL=consentHtml.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"consentHtml.js","sourceRoot":"","sources":["../../src/oauth/consentHtml.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { Env, Hono } from "hono";
|
|
2
|
-
import type { Auth } from "../auth/createAuth.js";
|
|
3
|
-
export interface MountAuthorizeOptions {
|
|
4
|
-
readonly auth: Auth;
|
|
5
|
-
}
|
|
6
|
-
/** Mount Mantle's small server-rendered consent page. Better Auth owns the
|
|
7
|
-
* signed authorization query, client lookup, decision, and redirect. */
|
|
8
|
-
export declare function mountAuthorize<E extends Env>(app: Hono<E>, options: MountAuthorizeOptions): void;
|
|
9
|
-
//# sourceMappingURL=mountOAuth.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mountOAuth.d.ts","sourceRoot":"","sources":["../../src/oauth/mountOAuth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,KAAK,EAAE,IAAI,EAAuB,MAAM,uBAAuB,CAAC;AAOvE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;CACrB;AAED;wEACwE;AACxE,wBAAgB,cAAc,CAAC,CAAC,SAAS,GAAG,EAC1C,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,EACZ,OAAO,EAAE,qBAAqB,GAC7B,IAAI,CAiCN"}
|
package/dist/oauth/mountOAuth.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { rejectCrossOriginMutation } from "../auth/rejectCrossOriginMutation.js";
|
|
2
|
-
import { detectConsentLocale, renderConsentHtml, } from "./consentHtml.js";
|
|
3
|
-
/** Mount Mantle's small server-rendered consent page. Better Auth owns the
|
|
4
|
-
* signed authorization query, client lookup, decision, and redirect. */
|
|
5
|
-
export function mountAuthorize(app, options) {
|
|
6
|
-
const { auth } = options;
|
|
7
|
-
app.get("/oauth/consent", async (c) => {
|
|
8
|
-
const locale = detectConsentLocale(c.req.header("accept-language") ?? null);
|
|
9
|
-
let model = null;
|
|
10
|
-
try {
|
|
11
|
-
model = await auth.getOAuthConsentRequest(c.req.raw);
|
|
12
|
-
}
|
|
13
|
-
catch {
|
|
14
|
-
// Invalid, expired, or unauthenticated signed queries render the same
|
|
15
|
-
// non-sensitive failure page.
|
|
16
|
-
}
|
|
17
|
-
return c.html(renderConsentHtml(locale, model), model ? 200 : 400);
|
|
18
|
-
});
|
|
19
|
-
app.post("/oauth/consent", async (c) => {
|
|
20
|
-
const rejected = rejectCrossOriginMutation(c.req.raw);
|
|
21
|
-
if (rejected)
|
|
22
|
-
return rejected;
|
|
23
|
-
const body = await c.req.text();
|
|
24
|
-
const decision = new URLSearchParams(body).get("decision");
|
|
25
|
-
if (decision !== "approve" && decision !== "deny") {
|
|
26
|
-
return new Response("invalid consent decision", { status: 400 });
|
|
27
|
-
}
|
|
28
|
-
try {
|
|
29
|
-
const redirect = await auth.completeOAuthConsent(new Request(c.req.raw, { body }), decision === "approve");
|
|
30
|
-
return c.redirect(redirect, 302);
|
|
31
|
-
}
|
|
32
|
-
catch {
|
|
33
|
-
return new Response("invalid authorization request", { status: 400 });
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=mountOAuth.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mountOAuth.js","sourceRoot":"","sources":["../../src/oauth/mountOAuth.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EACL,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAM1B;wEACwE;AACxE,MAAM,UAAU,cAAc,CAC5B,GAAY,EACZ,OAA8B;IAE9B,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAEzB,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,MAAM,GAAG,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,CAAC;QAC5E,IAAI,KAAK,GAA+B,IAAI,CAAC;QAC7C,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,sEAAsE;YACtE,8BAA8B;QAChC,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACrC,MAAM,QAAQ,GAAG,yBAAyB,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtD,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC3D,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YAClD,OAAO,IAAI,QAAQ,CAAC,0BAA0B,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAC9C,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAChC,QAAQ,KAAK,SAAS,CACvB,CAAC;YACF,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,QAAQ,CAAC,+BAA+B,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|