@vielzeug/archive 26.11.12 → 26.11.13
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/dist/_server/d1.d.ts +23 -0
- package/dist/_server/d1.d.ts.map +1 -0
- package/dist/_server/execution.d.ts +5 -0
- package/dist/_server/execution.d.ts.map +1 -0
- package/dist/_server/http.cjs +2 -0
- package/dist/_server/http.cjs.map +1 -0
- package/dist/{worker → _server}/http.d.ts +6 -11
- package/dist/_server/http.d.ts.map +1 -0
- package/dist/{worker → _server}/http.js +18 -44
- package/dist/_server/http.js.map +1 -0
- package/dist/{worker/_service.cjs → _server/service.cjs} +1 -1
- package/dist/{worker/_service.js.map → _server/service.cjs.map} +1 -1
- package/dist/{worker/_service.d.ts → _server/service.d.ts} +1 -1
- package/dist/_server/service.d.ts.map +1 -0
- package/dist/{worker/_service.js → _server/service.js} +2 -2
- package/dist/_server/service.js.map +1 -0
- package/dist/_server/uuid.cjs +2 -0
- package/dist/_server/uuid.cjs.map +1 -0
- package/dist/_server/uuid.d.ts +3 -0
- package/dist/_server/uuid.d.ts.map +1 -0
- package/dist/_server/uuid.js +5 -0
- package/dist/_server/uuid.js.map +1 -0
- package/dist/auth/_confirmation.cjs +3 -3
- package/dist/auth/_confirmation.cjs.map +1 -1
- package/dist/auth/_confirmation.js +4 -4
- package/dist/auth/_confirmation.js.map +1 -1
- package/dist/auth/config.cjs.map +1 -1
- package/dist/auth/config.d.ts +1 -1
- package/dist/auth/config.js.map +1 -1
- package/dist/auth/errors.cjs +1 -1
- package/dist/auth/errors.cjs.map +1 -1
- package/dist/auth/errors.d.ts +1 -1
- package/dist/auth/errors.d.ts.map +1 -1
- package/dist/auth/errors.js +1 -1
- package/dist/auth/errors.js.map +1 -1
- package/dist/auth/store.cjs.map +1 -1
- package/dist/auth/store.d.ts +1 -1
- package/dist/auth/store.js.map +1 -1
- package/dist/auth/worker.cjs +1 -1
- package/dist/auth/worker.cjs.map +1 -1
- package/dist/auth/worker.d.ts +1 -1
- package/dist/auth/worker.d.ts.map +1 -1
- package/dist/auth/worker.js +153 -152
- package/dist/auth/worker.js.map +1 -1
- package/dist/errors.cjs +1 -1
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/worker/_cors.cjs +2 -0
- package/dist/worker/_cors.cjs.map +1 -0
- package/dist/worker/_cors.d.ts +13 -0
- package/dist/worker/_cors.d.ts.map +1 -0
- package/dist/worker/_cors.js +32 -0
- package/dist/worker/_cors.js.map +1 -0
- package/dist/worker/_pagination.cjs +1 -1
- package/dist/worker/_pagination.cjs.map +1 -1
- package/dist/worker/_pagination.js +18 -18
- package/dist/worker/_pagination.js.map +1 -1
- package/dist/worker/auth.cjs +1 -1
- package/dist/worker/auth.cjs.map +1 -1
- package/dist/worker/auth.d.ts.map +1 -1
- package/dist/worker/auth.js +18 -18
- package/dist/worker/auth.js.map +1 -1
- package/dist/worker/env.cjs +1 -1
- package/dist/worker/env.cjs.map +1 -1
- package/dist/worker/env.d.ts +1 -22
- package/dist/worker/env.d.ts.map +1 -1
- package/dist/worker/env.js +1 -1
- package/dist/worker/env.js.map +1 -1
- package/dist/worker/publications.cjs +1 -1
- package/dist/worker/publications.cjs.map +1 -1
- package/dist/worker/publications.d.ts.map +1 -1
- package/dist/worker/publications.js +263 -262
- package/dist/worker/publications.js.map +1 -1
- package/dist/worker/worker.cjs +1 -1
- package/dist/worker/worker.cjs.map +1 -1
- package/dist/worker/worker.d.ts +2 -4
- package/dist/worker/worker.d.ts.map +1 -1
- package/dist/worker/worker.js +124 -122
- package/dist/worker/worker.js.map +1 -1
- package/dist/worker.d.ts +5 -3
- package/dist/worker.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/worker/_service.cjs.map +0 -1
- package/dist/worker/_service.d.ts.map +0 -1
- package/dist/worker/http.cjs +0 -2
- package/dist/worker/http.cjs.map +0 -1
- package/dist/worker/http.d.ts.map +0 -1
- package/dist/worker/http.js.map +0 -1
package/dist/auth/worker.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { sha256Hex as e } from "../_crypto.js";
|
|
2
|
-
import {
|
|
3
|
-
import { serviceRequest as
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
2
|
+
import { ApiError as t, badRequest as n, expiredSessionCookie as r, forbidden as i, json as a, noStore as o, queryParams as s, readJsonBody as c, sessionToken as l, toErrorResponse as u, unauthenticated as d } from "../_server/http.js";
|
|
3
|
+
import { serviceRequest as f } from "../_server/service.js";
|
|
4
|
+
import { UUID_RE as p } from "../_server/uuid.js";
|
|
5
|
+
import { ACCOUNT_HEADER as m, ARCHIVE_OPERATOR_ROLE as h, OPERATOR_SESSION_MAX_AGE_SECONDS as g, PUBLISHER_HEADER as _, REQUEST_MARKER_HEADER as v, SESSION_COOKIE_NAME as y, SESSION_MAX_AGE_SECONDS as b, archiveAuthHealthSchema as x, archiveErrorResponseSchema as S, isWellFormedText as C, sessionCookieValue as w, uuidSchema as T } from "../contract.js";
|
|
6
|
+
import { confirmationPage as E, escapeHtml as D } from "./_confirmation.js";
|
|
7
|
+
import { authConfig as O, isWellFormedEmail as k } from "./config.js";
|
|
8
|
+
import { AuthOperationError as A } from "./errors.js";
|
|
9
|
+
import { LINK_TTL_MS as j, authReadiness as M, consumeToken as N, deleteAccount as P, deleteToken as F, ensureUser as I, insertToken as L, readAccount as R, revokeSessions as z, spendLinkBudget as B, spendSignInBudget as V, sweep as H } from "./store.js";
|
|
10
|
+
import { SignJWT as U, errors as W, jwtVerify as G } from "jose";
|
|
10
11
|
// src/auth/worker.ts
|
|
11
|
-
var
|
|
12
|
+
var K = {
|
|
12
13
|
account: /^\/api\/v1\/auth\/account$/,
|
|
13
14
|
health: /^\/api\/v1\/auth\/health$/,
|
|
14
15
|
jwks: /^\/api\/v1\/auth\/jwks\.json$/,
|
|
@@ -16,7 +17,7 @@ var G = {
|
|
|
16
17
|
signIn: /^\/api\/v1\/auth\/sign-in$/,
|
|
17
18
|
signOutAll: /^\/api\/v1\/auth\/sign-out-all$/,
|
|
18
19
|
verify: /^\/api\/v1\/auth\/verify$/
|
|
19
|
-
},
|
|
20
|
+
}, q = {
|
|
20
21
|
account: ["GET", "DELETE"],
|
|
21
22
|
health: ["GET"],
|
|
22
23
|
jwks: ["GET"],
|
|
@@ -24,7 +25,7 @@ var G = {
|
|
|
24
25
|
signIn: ["POST"],
|
|
25
26
|
signOutAll: ["POST"],
|
|
26
27
|
verify: ["GET", "POST"]
|
|
27
|
-
},
|
|
28
|
+
}, J = {
|
|
28
29
|
account: "/auth/account",
|
|
29
30
|
health: "/auth/health",
|
|
30
31
|
jwks: "/auth/jwks.json",
|
|
@@ -32,10 +33,10 @@ var G = {
|
|
|
32
33
|
signIn: "/auth/sign-in",
|
|
33
34
|
signOutAll: "/auth/sign-out-all",
|
|
34
35
|
verify: "/auth/verify"
|
|
35
|
-
}, matchRoute = (e) => Object.keys(
|
|
36
|
+
}, matchRoute = (e) => Object.keys(K).find((t) => K[t].test(new URL(e.url).pathname)), Y = 32, X = /^[A-Za-z0-9_-]{43}$/, Z = 256, Q = 5, randomToken = () => btoa(String.fromCharCode(...crypto.getRandomValues(new Uint8Array(Y)))).replaceAll("+", "-").replaceAll("/", "_").replace(/=+$/, ""), unavailable = () => new A(503, "catalog");
|
|
36
37
|
function requireMutationGuard(e, t, n = !1) {
|
|
37
38
|
let r = e.headers.get("origin");
|
|
38
|
-
if (r === null || !t.allowedOrigins.has(r) && !(n && r === t.publicOrigin) || e.headers.get("x-archive-request") !== "1") throw
|
|
39
|
+
if (r === null || !t.allowedOrigins.has(r) && !(n && r === t.publicOrigin) || e.headers.get("x-archive-request") !== "1") throw i();
|
|
39
40
|
return r;
|
|
40
41
|
}
|
|
41
42
|
function corsHeaders(e, t) {
|
|
@@ -46,44 +47,44 @@ function corsHeaders(e, t) {
|
|
|
46
47
|
vary: "Origin"
|
|
47
48
|
};
|
|
48
49
|
}
|
|
49
|
-
function preflight(e,
|
|
50
|
-
let
|
|
51
|
-
if (Object.keys(
|
|
50
|
+
function preflight(e, t, n) {
|
|
51
|
+
let r = corsHeaders(e, t);
|
|
52
|
+
if (Object.keys(r).length === 0) throw i();
|
|
52
53
|
return new Response(null, {
|
|
53
54
|
headers: {
|
|
54
|
-
...
|
|
55
|
-
"access-control-allow-headers": `Content-Type, ${
|
|
56
|
-
"access-control-allow-methods": [...
|
|
55
|
+
...r,
|
|
56
|
+
"access-control-allow-headers": `Content-Type, ${m}, ${_}, ${v}`,
|
|
57
|
+
"access-control-allow-methods": [...n, "OPTIONS"].join(", "),
|
|
57
58
|
"access-control-max-age": "600"
|
|
58
59
|
},
|
|
59
60
|
status: 204
|
|
60
61
|
});
|
|
61
62
|
}
|
|
62
63
|
var secure = (e) => e.appEnv === "production";
|
|
63
|
-
async function mintSession(e, t,
|
|
64
|
-
let
|
|
64
|
+
async function mintSession(e, t, n, r) {
|
|
65
|
+
let i = n ? g : b;
|
|
65
66
|
return {
|
|
66
|
-
maxAge:
|
|
67
|
-
token: await new
|
|
68
|
-
sessionVersion:
|
|
69
|
-
...
|
|
67
|
+
maxAge: i,
|
|
68
|
+
token: await new U({
|
|
69
|
+
sessionVersion: r,
|
|
70
|
+
...n ? { roles: [h] } : {}
|
|
70
71
|
}).setProtectedHeader({
|
|
71
72
|
alg: "RS256",
|
|
72
73
|
kid: e.signing.kid,
|
|
73
74
|
typ: "JWT"
|
|
74
|
-
}).setIssuedAt().setJti(crypto.randomUUID()).setIssuer(e.issuer).setAudience(e.audience).setSubject(t).setExpirationTime(`${
|
|
75
|
+
}).setIssuedAt().setJti(crypto.randomUUID()).setIssuer(e.issuer).setAudience(e.audience).setSubject(t).setExpirationTime(`${i}s`).sign(e.signing.key)
|
|
75
76
|
};
|
|
76
77
|
}
|
|
77
78
|
async function requireSession(e, t, n) {
|
|
78
|
-
let r =
|
|
79
|
-
if (r === null) throw
|
|
79
|
+
let r = l(e);
|
|
80
|
+
if (r === null) throw d();
|
|
80
81
|
try {
|
|
81
|
-
let { payload: e } = await
|
|
82
|
+
let { payload: e } = await G(r, t.verifier, {
|
|
82
83
|
algorithms: ["RS256"],
|
|
83
84
|
audience: t.audience,
|
|
84
85
|
clockTolerance: Q,
|
|
85
86
|
issuer: t.issuer,
|
|
86
|
-
maxTokenAge:
|
|
87
|
+
maxTokenAge: b,
|
|
87
88
|
requiredClaims: [
|
|
88
89
|
"sub",
|
|
89
90
|
"iss",
|
|
@@ -93,89 +94,89 @@ async function requireSession(e, t, n) {
|
|
|
93
94
|
"sessionVersion"
|
|
94
95
|
]
|
|
95
96
|
}), i = e.sub ?? "";
|
|
96
|
-
if (i.length === 0 || i.length > Z || !
|
|
97
|
+
if (i.length === 0 || i.length > Z || !C(i)) throw d();
|
|
97
98
|
let a = e.sessionVersion;
|
|
98
|
-
if (typeof a != "number" || !Number.isSafeInteger(a) || a < 0 || typeof e.iat != "number" || e.iat > Date.now() / 1e3 + Q || Array.isArray(e.roles) && e.roles.includes("archive-operator") && (typeof e.exp != "number" || e.exp - e.iat > 3600 || Date.now() / 1e3 - e.iat > 3600 + Q)) throw
|
|
99
|
-
let o = await
|
|
100
|
-
if (o === null || o.session_version !== a) throw
|
|
99
|
+
if (typeof a != "number" || !Number.isSafeInteger(a) || a < 0 || typeof e.iat != "number" || e.iat > Date.now() / 1e3 + Q || Array.isArray(e.roles) && e.roles.includes("archive-operator") && (typeof e.exp != "number" || e.exp - e.iat > 3600 || Date.now() / 1e3 - e.iat > 3600 + Q)) throw d();
|
|
100
|
+
let o = await R(n.AUTH_DB, i);
|
|
101
|
+
if (o === null || o.session_version !== a) throw d();
|
|
101
102
|
return {
|
|
102
103
|
sessionVersion: a,
|
|
103
104
|
subject: i,
|
|
104
105
|
token: r
|
|
105
106
|
};
|
|
106
107
|
} catch (e) {
|
|
107
|
-
throw e instanceof
|
|
108
|
+
throw e instanceof W.JOSEError ? d() : e;
|
|
108
109
|
}
|
|
109
110
|
}
|
|
110
111
|
async function sendLink(e, t, n, r) {
|
|
111
|
-
let i = t.appName, a = `The link works once and expires in ${
|
|
112
|
+
let i = t.appName, a = `The link works once and expires in ${j / 6e4} minutes. If you did not request it, ignore this email.`;
|
|
112
113
|
await e.AUTH_EMAIL.send({
|
|
113
114
|
from: t.senderAddress,
|
|
114
|
-
html: `<p>Open this link to sign in to ${
|
|
115
|
+
html: `<p>Open this link to sign in to ${D(i)}:</p><p><a href="${D(r)}">${D(r)}</a></p><p>${a}</p>`,
|
|
115
116
|
subject: `Your ${i} sign-in link`,
|
|
116
117
|
text: `Open this link to sign in to ${i}:\n\n${r}\n\n${a}`,
|
|
117
118
|
to: n
|
|
118
119
|
});
|
|
119
120
|
}
|
|
120
|
-
async function handleSignIn(
|
|
121
|
-
requireMutationGuard(
|
|
122
|
-
let
|
|
123
|
-
if (typeof
|
|
124
|
-
let
|
|
125
|
-
if (
|
|
126
|
-
let
|
|
127
|
-
if (!
|
|
128
|
-
let
|
|
129
|
-
if (
|
|
130
|
-
let
|
|
131
|
-
if (
|
|
132
|
-
let
|
|
133
|
-
await
|
|
121
|
+
async function handleSignIn(r, i, s) {
|
|
122
|
+
requireMutationGuard(r, s);
|
|
123
|
+
let l = await c(r);
|
|
124
|
+
if (typeof l != "object" || !l || Array.isArray(l)) throw n();
|
|
125
|
+
let u = Object.keys(l), d = Reflect.get(l, "email");
|
|
126
|
+
if (u.length !== 1 || u[0] !== "email" || typeof d != "string") throw n();
|
|
127
|
+
let f = d.trim().toLowerCase();
|
|
128
|
+
if (!k(f)) throw n();
|
|
129
|
+
let p = Date.now(), m = await V(i.AUTH_DB, p);
|
|
130
|
+
if (m !== null) throw new t(429, "rate-limited", "Too many sign-in requests. Try again later.", { retryAfterSeconds: m });
|
|
131
|
+
let h = await I(i.AUTH_DB, f), g = await B(i.AUTH_DB, h.id, p);
|
|
132
|
+
if (g !== null) throw new t(429, "rate-limited", "Too many sign-in emails. Try again later.", { retryAfterSeconds: g });
|
|
133
|
+
let _ = randomToken(), v = await e(_);
|
|
134
|
+
await L(i.AUTH_DB, v, h.id, p);
|
|
134
135
|
try {
|
|
135
|
-
await sendLink(
|
|
136
|
+
await sendLink(i, s, h.email, `${s.publicOrigin}/api/v1/auth/verify?token=${_}`);
|
|
136
137
|
} catch (e) {
|
|
137
|
-
throw await
|
|
138
|
+
throw await F(i.AUTH_DB, v).catch(() => void 0), new A(503, "email", { cause: e });
|
|
138
139
|
}
|
|
139
|
-
return
|
|
140
|
+
return a(202, { ok: !0 }, o);
|
|
140
141
|
}
|
|
141
|
-
async function handleVerify(
|
|
142
|
-
if (
|
|
143
|
-
let e =
|
|
144
|
-
if (!
|
|
145
|
-
return
|
|
146
|
-
...
|
|
142
|
+
async function handleVerify(r, i, a) {
|
|
143
|
+
if (r.method === "GET") {
|
|
144
|
+
let e = s(new URL(r.url), ["token"]).get("token") ?? "";
|
|
145
|
+
if (!X.test(e)) throw n("The link is not valid.");
|
|
146
|
+
return E({
|
|
147
|
+
...a,
|
|
147
148
|
nonce: randomToken(),
|
|
148
149
|
token: e
|
|
149
150
|
});
|
|
150
151
|
}
|
|
151
|
-
requireMutationGuard(
|
|
152
|
-
let
|
|
153
|
-
if (typeof
|
|
154
|
-
let
|
|
155
|
-
if (typeof
|
|
156
|
-
let
|
|
157
|
-
if (
|
|
158
|
-
let
|
|
152
|
+
requireMutationGuard(r, a, !0), s(new URL(r.url), []);
|
|
153
|
+
let l = await c(r);
|
|
154
|
+
if (typeof l != "object" || !l || Array.isArray(l) || Object.keys(l).length !== 1) throw n("The link is not valid.");
|
|
155
|
+
let u = Reflect.get(l, "token");
|
|
156
|
+
if (typeof u != "string" || !X.test(u)) throw n("The link is not valid.");
|
|
157
|
+
let d = await N(i.AUTH_DB, await e(u), Date.now());
|
|
158
|
+
if (d === null) throw new t(410, "gone", "That link has expired or was already used.");
|
|
159
|
+
let f = await mintSession(a, d.id, a.operatorEmails.has(d.email), d.sessionVersion);
|
|
159
160
|
return new Response(null, {
|
|
160
161
|
headers: {
|
|
161
|
-
...
|
|
162
|
-
"set-cookie":
|
|
163
|
-
maxAgeSeconds:
|
|
164
|
-
secure: secure(
|
|
162
|
+
...o,
|
|
163
|
+
"set-cookie": w(f.token, {
|
|
164
|
+
maxAgeSeconds: f.maxAge,
|
|
165
|
+
secure: secure(a)
|
|
165
166
|
})
|
|
166
167
|
},
|
|
167
168
|
status: 204
|
|
168
169
|
});
|
|
169
170
|
}
|
|
170
171
|
async function handleExport(e, t, n) {
|
|
171
|
-
let { subject: r } = await requireSession(e, n, t), i = await
|
|
172
|
-
if (i === null) throw
|
|
173
|
-
return
|
|
172
|
+
let { subject: r } = await requireSession(e, n, t), i = await R(t.AUTH_DB, r);
|
|
173
|
+
if (i === null) throw d();
|
|
174
|
+
return a(200, {
|
|
174
175
|
createdAt: i.created_at,
|
|
175
176
|
email: i.email,
|
|
176
177
|
id: i.id,
|
|
177
178
|
lastSignInAt: i.last_sign_in_at
|
|
178
|
-
},
|
|
179
|
+
}, o);
|
|
179
180
|
}
|
|
180
181
|
async function archiveFailure(e) {
|
|
181
182
|
let t = await e.text().catch(() => ""), n = null;
|
|
@@ -184,109 +185,109 @@ async function archiveFailure(e) {
|
|
|
184
185
|
} catch {
|
|
185
186
|
n = null;
|
|
186
187
|
}
|
|
187
|
-
let r =
|
|
188
|
+
let r = S.safeParse(n);
|
|
188
189
|
if (!r.success || e.status < 400 || e.status > 599) throw unavailable();
|
|
189
|
-
let { code: i, message:
|
|
190
|
-
return
|
|
190
|
+
let { code: i, message: s, requestId: c } = r.data.error, l = e.headers.get("retry-after");
|
|
191
|
+
return a(e.status, { error: {
|
|
191
192
|
code: i,
|
|
192
|
-
message:
|
|
193
|
-
requestId:
|
|
194
|
-
} },
|
|
195
|
-
...
|
|
196
|
-
"retry-after":
|
|
197
|
-
} :
|
|
193
|
+
message: s,
|
|
194
|
+
requestId: c
|
|
195
|
+
} }, l !== null && /^\d{1,6}$/.test(l) ? {
|
|
196
|
+
...o,
|
|
197
|
+
"retry-after": l
|
|
198
|
+
} : o);
|
|
198
199
|
}
|
|
199
|
-
async function handleErase(e,
|
|
200
|
-
let s = requireMutationGuard(e,
|
|
201
|
-
if (u === null || !
|
|
202
|
-
if (u !== c) throw new
|
|
200
|
+
async function handleErase(e, i, a) {
|
|
201
|
+
let s = requireMutationGuard(e, a), { subject: c, token: l } = await requireSession(e, a, i), u = e.headers.get(m);
|
|
202
|
+
if (u === null || !T.safeParse(u).success) throw n();
|
|
203
|
+
if (u !== c) throw new t(409, "account-changed", "The signed-in account changed since this request was prepared.");
|
|
203
204
|
let d = new Headers({
|
|
204
|
-
cookie: `${
|
|
205
|
+
cookie: `${y}=${l}`,
|
|
205
206
|
origin: s,
|
|
206
|
-
[
|
|
207
|
-
}),
|
|
208
|
-
if (
|
|
209
|
-
if (!
|
|
210
|
-
d.set(
|
|
207
|
+
[v]: "1"
|
|
208
|
+
}), h = e.headers.get(_);
|
|
209
|
+
if (h !== null) {
|
|
210
|
+
if (!p.test(h)) throw n();
|
|
211
|
+
d.set(_, h);
|
|
211
212
|
}
|
|
212
|
-
let
|
|
213
|
+
let g;
|
|
213
214
|
try {
|
|
214
|
-
|
|
215
|
+
g = await f(i.AUTH_ARCHIVE, new Request(`${a.publicOrigin}/api/v1/me/account`, {
|
|
215
216
|
headers: d,
|
|
216
217
|
method: "DELETE",
|
|
217
218
|
redirect: "manual"
|
|
218
219
|
}), async (e) => e.status === 204 ? (await e.body?.cancel(), e) : archiveFailure(e));
|
|
219
220
|
} catch (e) {
|
|
220
|
-
throw new
|
|
221
|
+
throw new A(503, "catalog", { cause: e });
|
|
221
222
|
}
|
|
222
|
-
return
|
|
223
|
+
return g.status === 204 ? (await P(i.AUTH_DB, c), new Response(null, {
|
|
223
224
|
headers: {
|
|
224
|
-
...
|
|
225
|
-
"set-cookie":
|
|
225
|
+
...o,
|
|
226
|
+
"set-cookie": r(secure(a))
|
|
226
227
|
},
|
|
227
228
|
status: 204
|
|
228
|
-
})) :
|
|
229
|
+
})) : g;
|
|
229
230
|
}
|
|
230
|
-
async function handleSignOutAll(e,
|
|
231
|
-
requireMutationGuard(e,
|
|
232
|
-
let { subject:
|
|
233
|
-
if (
|
|
234
|
-
if (
|
|
235
|
-
if (await
|
|
236
|
-
return
|
|
237
|
-
...
|
|
238
|
-
"set-cookie":
|
|
231
|
+
async function handleSignOutAll(e, i, s) {
|
|
232
|
+
requireMutationGuard(e, s);
|
|
233
|
+
let { subject: c, sessionVersion: l } = await requireSession(e, s, i), u = e.headers.get(m);
|
|
234
|
+
if (u === null || !T.safeParse(u).success) throw n();
|
|
235
|
+
if (u !== c) throw new t(409, "account-changed", "The signed-in account changed since this request was prepared.");
|
|
236
|
+
if (await z(i.AUTH_DB, c, l) === null) throw d();
|
|
237
|
+
return a(200, { ok: !0 }, {
|
|
238
|
+
...o,
|
|
239
|
+
"set-cookie": r(secure(s))
|
|
239
240
|
});
|
|
240
241
|
}
|
|
241
242
|
async function handleHealth(e) {
|
|
242
243
|
let t = null, n = null;
|
|
243
244
|
try {
|
|
244
|
-
await
|
|
245
|
+
await O(e);
|
|
245
246
|
} catch {
|
|
246
247
|
t = "configuration-unavailable";
|
|
247
248
|
}
|
|
248
249
|
if (t === null) try {
|
|
249
|
-
n = await
|
|
250
|
+
n = await M(e.AUTH_DB), n !== 1 && (t = "schema-mismatch");
|
|
250
251
|
} catch {
|
|
251
252
|
t = "database-unavailable";
|
|
252
253
|
}
|
|
253
|
-
return
|
|
254
|
+
return a(t === null ? 200 : 503, x.parse({
|
|
254
255
|
dbSchemaVersion: n,
|
|
255
256
|
reason: t,
|
|
256
257
|
schemaVersion: 1,
|
|
257
258
|
status: t === null ? "ok" : "degraded"
|
|
258
|
-
}),
|
|
259
|
+
}), o);
|
|
259
260
|
}
|
|
260
|
-
async function route(e,
|
|
261
|
-
let
|
|
262
|
-
if (
|
|
263
|
-
if (
|
|
264
|
-
let
|
|
265
|
-
if (
|
|
266
|
-
if (!
|
|
267
|
-
let
|
|
268
|
-
switch (
|
|
261
|
+
async function route(e, n) {
|
|
262
|
+
let r = e.method.toUpperCase(), i = matchRoute(e);
|
|
263
|
+
if (i === void 0) throw new t(404, "not-found", "No such route.");
|
|
264
|
+
if (i === "health" && r === "GET") return handleHealth(n);
|
|
265
|
+
let s = await O(n), c = corsHeaders(e, s);
|
|
266
|
+
if (r === "OPTIONS") return preflight(e, s, q[i]);
|
|
267
|
+
if (!q[i].includes(r)) throw new t(405, "method-not-allowed", "That method is not allowed here.");
|
|
268
|
+
let l;
|
|
269
|
+
switch (i) {
|
|
269
270
|
case "health":
|
|
270
|
-
|
|
271
|
+
l = await handleHealth(n);
|
|
271
272
|
break;
|
|
272
273
|
case "session":
|
|
273
|
-
await requireSession(e,
|
|
274
|
+
await requireSession(e, s, n), l = a(200, { ok: !0 }, o);
|
|
274
275
|
break;
|
|
275
276
|
case "signOutAll":
|
|
276
|
-
|
|
277
|
+
l = await handleSignOutAll(e, n, s);
|
|
277
278
|
break;
|
|
278
279
|
case "jwks":
|
|
279
|
-
|
|
280
|
+
l = a(200, { keys: s.jwks }, o);
|
|
280
281
|
break;
|
|
281
282
|
case "signIn":
|
|
282
|
-
|
|
283
|
+
l = await handleSignIn(e, n, s);
|
|
283
284
|
break;
|
|
284
285
|
case "verify":
|
|
285
|
-
|
|
286
|
+
l = await handleVerify(e, n, s);
|
|
286
287
|
break;
|
|
287
|
-
case "account":
|
|
288
|
+
case "account": l = r === "GET" ? await handleExport(e, n, s) : await handleErase(e, n, s);
|
|
288
289
|
}
|
|
289
|
-
return withCors(
|
|
290
|
+
return withCors(l, c);
|
|
290
291
|
}
|
|
291
292
|
function withCors(e, t) {
|
|
292
293
|
if (Object.keys(t).length === 0) return e;
|
|
@@ -294,7 +295,7 @@ function withCors(e, t) {
|
|
|
294
295
|
for (let [e, r] of Object.entries(t)) n.headers.set(e, r);
|
|
295
296
|
return n;
|
|
296
297
|
}
|
|
297
|
-
var diagnostic = (e) => e instanceof
|
|
298
|
+
var diagnostic = (e) => e instanceof A ? e.authDiagnostic : { kind: "internal" };
|
|
298
299
|
function createAuthWorker() {
|
|
299
300
|
let e = /* @__PURE__ */ new Set(), emit = (t) => {
|
|
300
301
|
for (let n of e) try {
|
|
@@ -302,37 +303,37 @@ function createAuthWorker() {
|
|
|
302
303
|
} catch {}
|
|
303
304
|
};
|
|
304
305
|
return {
|
|
305
|
-
async fetch(
|
|
306
|
-
let
|
|
306
|
+
async fetch(n, r) {
|
|
307
|
+
let i = crypto.randomUUID(), a = Date.now(), o, s;
|
|
307
308
|
try {
|
|
308
|
-
|
|
309
|
+
o = await route(n, r);
|
|
309
310
|
} catch (e) {
|
|
310
|
-
|
|
311
|
-
let
|
|
312
|
-
|
|
313
|
-
...
|
|
311
|
+
s = e, o = u(e, i);
|
|
312
|
+
let a = await O(r).catch(() => null);
|
|
313
|
+
a !== null && (matchRoute(n) === "verify" && n.method === "GET" && e instanceof t && e.status === 400 && (o = E({
|
|
314
|
+
...a,
|
|
314
315
|
nonce: randomToken(),
|
|
315
316
|
token: null
|
|
316
|
-
})),
|
|
317
|
+
})), o = withCors(o, corsHeaders(n, a)));
|
|
317
318
|
}
|
|
318
|
-
if (matchRoute(
|
|
319
|
-
let e = matchRoute(
|
|
319
|
+
if (matchRoute(n) === "verify" && (o.headers.set("cache-control", "no-store"), o.headers.set("referrer-policy", "no-referrer"), o.headers.set("x-content-type-options", "nosniff"), o.headers.has("content-security-policy") || o.headers.set("content-security-policy", "default-src 'none'; base-uri 'none'; frame-ancestors 'none'")), e.size > 0) {
|
|
320
|
+
let e = matchRoute(n), r = o.status < 400 ? "ok" : e === "health" ? "unavailable" : s instanceof t ? s.code : "internal", c = s === void 0 && o.status >= 400 ? S.safeParse(await o.clone().json().catch(() => null)) : null, l = e === "health" && o.status === 503 ? x.safeParse(await o.clone().json().catch(() => null)) : null;
|
|
320
321
|
emit({
|
|
321
|
-
code:
|
|
322
|
-
ms: Math.max(0, Date.now() -
|
|
323
|
-
requestId:
|
|
324
|
-
route: e === void 0 ? "unmatched" :
|
|
325
|
-
status:
|
|
322
|
+
code: c?.success ? c.data.error.code : r,
|
|
323
|
+
ms: Math.max(0, Date.now() - a),
|
|
324
|
+
requestId: i,
|
|
325
|
+
route: e === void 0 ? "unmatched" : J[e],
|
|
326
|
+
status: o.status,
|
|
326
327
|
type: "request",
|
|
327
|
-
...
|
|
328
|
+
...o.status >= 500 ? { diagnostic: l?.success ? { kind: l.data.reason === "configuration-unavailable" ? "configuration" : l.data.reason === "schema-mismatch" ? "schema" : "database" } : s === void 0 ? { kind: "catalog" } : diagnostic(s) } : {}
|
|
328
329
|
});
|
|
329
330
|
}
|
|
330
|
-
return
|
|
331
|
+
return o;
|
|
331
332
|
},
|
|
332
333
|
async scheduled(t, n) {
|
|
333
334
|
try {
|
|
334
|
-
await
|
|
335
|
-
let t = await
|
|
335
|
+
await O(n);
|
|
336
|
+
let t = await H(n.AUTH_DB, Date.now());
|
|
336
337
|
e.size > 0 && emit({
|
|
337
338
|
removed: t,
|
|
338
339
|
status: "ok",
|