@somewhere-cloud/sdk 0.0.0-stage → 0.13.1
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/LICENSE +21 -0
- package/README.md +191 -2
- package/dist/cjs/auth/client.js +1142 -0
- package/dist/cjs/auth/client.js.map +1 -0
- package/dist/cjs/auth/continuation.js +27 -0
- package/dist/cjs/auth/continuation.js.map +1 -0
- package/dist/cjs/auth/index.js +21 -0
- package/dist/cjs/auth/index.js.map +1 -0
- package/dist/cjs/auth/react.js +295 -0
- package/dist/cjs/auth/react.js.map +1 -0
- package/dist/cjs/auth/server.js +368 -0
- package/dist/cjs/auth/server.js.map +1 -0
- package/dist/cjs/client.js +392 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/errors.js +16 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.cjs +215 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/query-cache.js +91 -0
- package/dist/cjs/query-cache.js.map +1 -0
- package/dist/cjs/resources/auth.js +875 -0
- package/dist/cjs/resources/auth.js.map +1 -0
- package/dist/cjs/resources/calls.js +42 -0
- package/dist/cjs/resources/calls.js.map +1 -0
- package/dist/cjs/resources/chat.js +82 -0
- package/dist/cjs/resources/chat.js.map +1 -0
- package/dist/cjs/resources/db.js +124 -0
- package/dist/cjs/resources/db.js.map +1 -0
- package/dist/cjs/resources/emails.js +39 -0
- package/dist/cjs/resources/emails.js.map +1 -0
- package/dist/cjs/resources/fs.js +141 -0
- package/dist/cjs/resources/fs.js.map +1 -0
- package/dist/cjs/resources/functions.js +145 -0
- package/dist/cjs/resources/functions.js.map +1 -0
- package/dist/cjs/resources/inbox.js +76 -0
- package/dist/cjs/resources/inbox.js.map +1 -0
- package/dist/cjs/resources/payments.js +68 -0
- package/dist/cjs/resources/payments.js.map +1 -0
- package/dist/cjs/resources/postgrest.js +391 -0
- package/dist/cjs/resources/postgrest.js.map +1 -0
- package/dist/cjs/resources/projects.js +71 -0
- package/dist/cjs/resources/projects.js.map +1 -0
- package/dist/cjs/resources/storage.js +191 -0
- package/dist/cjs/resources/storage.js.map +1 -0
- package/dist/cjs/resources/tasks.js +99 -0
- package/dist/cjs/resources/tasks.js.map +1 -0
- package/dist/cjs/resources/video.js +50 -0
- package/dist/cjs/resources/video.js.map +1 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/esm/auth/client.js +1137 -0
- package/dist/esm/auth/client.js.map +1 -0
- package/dist/esm/auth/continuation.js +22 -0
- package/dist/esm/auth/continuation.js.map +1 -0
- package/dist/esm/auth/index.js +5 -0
- package/dist/esm/auth/index.js.map +1 -0
- package/dist/esm/auth/react.js +279 -0
- package/dist/esm/auth/react.js.map +1 -0
- package/dist/esm/auth/server.js +365 -0
- package/dist/esm/auth/server.js.map +1 -0
- package/dist/esm/client.js +388 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/errors.js +12 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.js +188 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/query-cache.js +87 -0
- package/dist/esm/query-cache.js.map +1 -0
- package/dist/esm/resources/auth.js +871 -0
- package/dist/esm/resources/auth.js.map +1 -0
- package/dist/esm/resources/calls.js +38 -0
- package/dist/esm/resources/calls.js.map +1 -0
- package/dist/esm/resources/chat.js +77 -0
- package/dist/esm/resources/chat.js.map +1 -0
- package/dist/esm/resources/db.js +120 -0
- package/dist/esm/resources/db.js.map +1 -0
- package/dist/esm/resources/emails.js +35 -0
- package/dist/esm/resources/emails.js.map +1 -0
- package/dist/esm/resources/fs.js +137 -0
- package/dist/esm/resources/fs.js.map +1 -0
- package/dist/esm/resources/functions.js +141 -0
- package/dist/esm/resources/functions.js.map +1 -0
- package/dist/esm/resources/inbox.js +70 -0
- package/dist/esm/resources/inbox.js.map +1 -0
- package/dist/esm/resources/payments.js +64 -0
- package/dist/esm/resources/payments.js.map +1 -0
- package/dist/esm/resources/postgrest.js +386 -0
- package/dist/esm/resources/postgrest.js.map +1 -0
- package/dist/esm/resources/projects.js +67 -0
- package/dist/esm/resources/projects.js.map +1 -0
- package/dist/esm/resources/storage.js +186 -0
- package/dist/esm/resources/storage.js.map +1 -0
- package/dist/esm/resources/tasks.js +95 -0
- package/dist/esm/resources/tasks.js.map +1 -0
- package/dist/esm/resources/video.js +46 -0
- package/dist/esm/resources/video.js.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/types/auth/client.d.ts +272 -0
- package/dist/types/auth/client.d.ts.map +1 -0
- package/dist/types/auth/continuation.d.ts +10 -0
- package/dist/types/auth/continuation.d.ts.map +1 -0
- package/dist/types/auth/index.d.ts +2 -0
- package/dist/types/auth/index.d.ts.map +1 -0
- package/dist/types/auth/react.d.ts +140 -0
- package/dist/types/auth/react.d.ts.map +1 -0
- package/dist/types/auth/server.d.ts +124 -0
- package/dist/types/auth/server.d.ts.map +1 -0
- package/dist/types/client.d.ts +128 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/errors.d.ts +17 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/index.d.ts +145 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/query-cache.d.ts +59 -0
- package/dist/types/query-cache.d.ts.map +1 -0
- package/dist/types/resources/auth.d.ts +188 -0
- package/dist/types/resources/auth.d.ts.map +1 -0
- package/dist/types/resources/calls.d.ts +27 -0
- package/dist/types/resources/calls.d.ts.map +1 -0
- package/dist/types/resources/chat.d.ts +24 -0
- package/dist/types/resources/chat.d.ts.map +1 -0
- package/dist/types/resources/db.d.ts +81 -0
- package/dist/types/resources/db.d.ts.map +1 -0
- package/dist/types/resources/emails.d.ts +20 -0
- package/dist/types/resources/emails.d.ts.map +1 -0
- package/dist/types/resources/fs.d.ts +68 -0
- package/dist/types/resources/fs.d.ts.map +1 -0
- package/dist/types/resources/functions.d.ts +30 -0
- package/dist/types/resources/functions.d.ts.map +1 -0
- package/dist/types/resources/inbox.d.ts +52 -0
- package/dist/types/resources/inbox.d.ts.map +1 -0
- package/dist/types/resources/payments.d.ts +31 -0
- package/dist/types/resources/payments.d.ts.map +1 -0
- package/dist/types/resources/postgrest.d.ts +121 -0
- package/dist/types/resources/postgrest.d.ts.map +1 -0
- package/dist/types/resources/projects.d.ts +79 -0
- package/dist/types/resources/projects.d.ts.map +1 -0
- package/dist/types/resources/storage.d.ts +63 -0
- package/dist/types/resources/storage.d.ts.map +1 -0
- package/dist/types/resources/tasks.d.ts +87 -0
- package/dist/types/resources/tasks.d.ts.map +1 -0
- package/dist/types/resources/video.d.ts +30 -0
- package/dist/types/resources/video.d.ts.map +1 -0
- package/dist/types/types.d.ts +379 -0
- package/dist/types/types.d.ts.map +1 -0
- package/package.json +86 -4
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.somewhereAuth = somewhereAuth;
|
|
4
|
+
const continuation_js_1 = require("./continuation.js");
|
|
5
|
+
function json(data, status = 200) {
|
|
6
|
+
return new Response(JSON.stringify(data), {
|
|
7
|
+
status,
|
|
8
|
+
headers: { 'Content-Type': 'application/json' },
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
/** A refused verification call, keeping the platform's code and 4xx status. */
|
|
12
|
+
function verificationFailed(err) {
|
|
13
|
+
const e = (err && typeof err === 'object' ? err : {});
|
|
14
|
+
const code = typeof e.code === 'string' && /^[A-Z][A-Z0-9_]{0,63}$/.test(e.code) ? e.code : 'EMAIL_VERIFICATION_FAILED';
|
|
15
|
+
const status = typeof e.status === 'number' && Number.isInteger(e.status) && e.status >= 400 && e.status < 500 ? e.status : 502;
|
|
16
|
+
const message = typeof e.message === 'string' && e.message ? e.message : 'Email verification failed.';
|
|
17
|
+
return json({ error: code, message }, status);
|
|
18
|
+
}
|
|
19
|
+
function logoutRefused(code, message, status) {
|
|
20
|
+
return json({ ok: false, error: code, message }, status);
|
|
21
|
+
}
|
|
22
|
+
/** A sign-out the platform did not confirm: its code when it is a code, its
|
|
23
|
+
* status when it is a 4xx, otherwise 502. Never a 2xx. The outcome is unknown
|
|
24
|
+
* here, so the message never claims the session stayed signed in. */
|
|
25
|
+
function logoutFailed(err) {
|
|
26
|
+
const e = (err && typeof err === 'object' ? err : {});
|
|
27
|
+
const code = typeof e.code === 'string' && /^[A-Z][A-Z0-9_]{0,63}$/.test(e.code) ? e.code : 'SIGN_OUT_FAILED';
|
|
28
|
+
const status = typeof e.status === 'number' && Number.isInteger(e.status) && e.status >= 400 && e.status < 500 ? e.status : 502;
|
|
29
|
+
return logoutRefused(code, 'Could not confirm sign-out.', status);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* When the session just issued expires, in epoch ms: the runtime's expires_at; else the `exp` of the
|
|
33
|
+
* access token actually issued; else the issuer's expires_in. Every cookie-mode session reply carries
|
|
34
|
+
* it, so the client schedules its refresh from the real expiry. A reply without one made the client
|
|
35
|
+
* refresh at once, and a page change mid-refresh orphaned its pending marker (platform
|
|
36
|
+
* pfb_01e440702f31). Undefined only when the bundle says nothing about expiry.
|
|
37
|
+
*/
|
|
38
|
+
function issuedExpiresAt(d) {
|
|
39
|
+
if (typeof d.expires_at === 'number' && Number.isFinite(d.expires_at) && d.expires_at > 0)
|
|
40
|
+
return d.expires_at;
|
|
41
|
+
const access = d.token ?? d.access_token;
|
|
42
|
+
if (typeof access === 'string') {
|
|
43
|
+
try {
|
|
44
|
+
const exp = Number(JSON.parse(atob(access.split('.')[1].replace(/-/g, '+').replace(/_/g, '/'))).exp);
|
|
45
|
+
if (Number.isFinite(exp) && exp > 0)
|
|
46
|
+
return exp * 1000;
|
|
47
|
+
}
|
|
48
|
+
catch { /* not a JWT: fall through to expires_in */ }
|
|
49
|
+
}
|
|
50
|
+
if (typeof d.expires_in === 'number' && Number.isFinite(d.expires_in) && d.expires_in > 0)
|
|
51
|
+
return Date.now() + d.expires_in * 1000;
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Runtime response-contract compatibility (platform tsk_72c4b4d2, A-F05).
|
|
56
|
+
* Runtime 2026081605+ cookie helpers return the documented { user } envelope;
|
|
57
|
+
* older baked bundles return the bare user object (or null). Accept both so
|
|
58
|
+
* one SDK version serves projects on either runtime generation.
|
|
59
|
+
*/
|
|
60
|
+
function unwrapAuthUser(result) {
|
|
61
|
+
if (result && typeof result === 'object' && 'user' in result) {
|
|
62
|
+
return result.user ?? null;
|
|
63
|
+
}
|
|
64
|
+
return result ?? null;
|
|
65
|
+
}
|
|
66
|
+
async function somewhereAuth(req, sw) {
|
|
67
|
+
const url = new URL(req.url);
|
|
68
|
+
// The path after the (last) `/auth` segment — robust to whatever prefix the
|
|
69
|
+
// app mounts the handler at (/api/auth, /auth, …).
|
|
70
|
+
const m = url.pathname.match(/\/auth(\/[A-Za-z0-9/_-]*)?$/);
|
|
71
|
+
const sub = (m && m[1]) || '/';
|
|
72
|
+
const method = req.method.toUpperCase();
|
|
73
|
+
// SESSION COOKIES ARE THE ONLY DEFAULT (platform tsk_d05a6cfb, pfb_e1254f754222).
|
|
74
|
+
//
|
|
75
|
+
// A browser must never receive the token pair: a body the page can read is
|
|
76
|
+
// a session any injected script can steal. Before 0.10.0 a caller with no
|
|
77
|
+
// `X-Sw-Auth-Mode` header got the cookie AND the 0.1.x token bundle in the
|
|
78
|
+
// body, so a plain-fetch browser sign-in handed JS-readable tokens to the
|
|
79
|
+
// page. What each caller sees now:
|
|
80
|
+
// no header, or `cookie` — cookies + `{ user, cookie_session: true }`.
|
|
81
|
+
// `header` (or `token`/`bearer`) — the explicit opt-in for a server or
|
|
82
|
+
// native client that holds its own session:
|
|
83
|
+
// the token bundle, and no cookie is set.
|
|
84
|
+
// An app that sets its OWN cookie is untouched either way: this handler only
|
|
85
|
+
// ever adds the platform `__Host-` pair, and never reads or clears another
|
|
86
|
+
// name.
|
|
87
|
+
const modeHint = (req.headers.get('X-Sw-Auth-Mode') || '').toLowerCase();
|
|
88
|
+
const tokenMode = modeHint === 'header' || modeHint === 'token' || modeHint === 'bearer';
|
|
89
|
+
const wantsCookie = !tokenMode;
|
|
90
|
+
// Optional on the namespace: an older baked runtime without it answers
|
|
91
|
+
// COOKIE_SESSION_UNAVAILABLE below, never the token pair.
|
|
92
|
+
const canCookie = wantsCookie && typeof sw.auth.setSessionCookies === 'function';
|
|
93
|
+
// Set the httpOnly pair from a platform token bundle. Returns the unwrapped
|
|
94
|
+
// bundle when the session was staged, or null when there is no pair to stage
|
|
95
|
+
// (e.g. mfa_required, or an opted-out/older runtime) so the caller answers
|
|
96
|
+
// with the token body.
|
|
97
|
+
const stageSessionCookies = (bundle) => {
|
|
98
|
+
if (!canCookie)
|
|
99
|
+
return null;
|
|
100
|
+
const b = (bundle ?? {});
|
|
101
|
+
const d = b.data ?? b;
|
|
102
|
+
const access = d.token ?? d.access_token;
|
|
103
|
+
const refresh = d.refresh_token;
|
|
104
|
+
if (!access || !refresh)
|
|
105
|
+
return null;
|
|
106
|
+
sw.auth.setSessionCookies(String(access), String(refresh));
|
|
107
|
+
return d;
|
|
108
|
+
};
|
|
109
|
+
// Answer a sign-in: the token bundle only to an explicit opt-in; everyone
|
|
110
|
+
// else gets the cookie handshake. A bundle with no token pair (an MFA
|
|
111
|
+
// challenge) carries no session and passes through. A pair this runtime
|
|
112
|
+
// cannot put in a cookie is refused, never handed to the caller.
|
|
113
|
+
const sessionResponse = (bundle) => {
|
|
114
|
+
const challenge = (0, continuation_js_1.mfaChallenge)(bundle);
|
|
115
|
+
if (challenge)
|
|
116
|
+
return json(challenge);
|
|
117
|
+
if (tokenMode)
|
|
118
|
+
return json(bundle);
|
|
119
|
+
const staged = stageSessionCookies(bundle);
|
|
120
|
+
if (staged)
|
|
121
|
+
return json({ user: staged.user ?? null, cookie_session: true, expires_at: issuedExpiresAt(staged) });
|
|
122
|
+
const b = (bundle ?? {});
|
|
123
|
+
const d = b.data ?? b;
|
|
124
|
+
if (d.token || d.access_token || d.refresh_token) {
|
|
125
|
+
return json({
|
|
126
|
+
error: 'COOKIE_SESSION_UNAVAILABLE',
|
|
127
|
+
message: 'This deploy cannot set a session cookie, so the sign-in was not completed. Redeploy to pick up the current runtime. A server or native client that holds its own session can send X-Sw-Auth-Mode: header to receive tokens instead.',
|
|
128
|
+
}, 501);
|
|
129
|
+
}
|
|
130
|
+
return json(bundle);
|
|
131
|
+
};
|
|
132
|
+
const readBody = async () => {
|
|
133
|
+
try {
|
|
134
|
+
return (await req.json());
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return {};
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
try {
|
|
141
|
+
if (method === 'POST' && sub === '/signup') {
|
|
142
|
+
const b = await readBody();
|
|
143
|
+
if (wantsCookie && typeof sw.auth.signupWithCookie === 'function') {
|
|
144
|
+
const result = await sw.auth.signupWithCookie(req, String(b.email ?? ''), String(b.password ?? ''), { display_name: (b.display_name ?? b.displayName) });
|
|
145
|
+
return (0, continuation_js_1.mfaChallenge)(result) ? json((0, continuation_js_1.mfaChallenge)(result)) : json({ user: unwrapAuthUser(result), cookie_session: true, expires_at: result.expires_at });
|
|
146
|
+
}
|
|
147
|
+
const d = await sw.auth.signup({
|
|
148
|
+
email: String(b.email ?? ''),
|
|
149
|
+
password: String(b.password ?? ''),
|
|
150
|
+
display_name: (b.display_name ?? b.displayName),
|
|
151
|
+
});
|
|
152
|
+
return sessionResponse(d);
|
|
153
|
+
}
|
|
154
|
+
if (method === 'POST' && sub === '/login') {
|
|
155
|
+
const b = await readBody();
|
|
156
|
+
if (wantsCookie && typeof sw.auth.loginWithCookie === 'function') {
|
|
157
|
+
const result = await sw.auth.loginWithCookie(req, String(b.email ?? ''), String(b.password ?? ''));
|
|
158
|
+
return (0, continuation_js_1.mfaChallenge)(result) ? json((0, continuation_js_1.mfaChallenge)(result)) : json({ user: unwrapAuthUser(result), cookie_session: true, expires_at: result.expires_at });
|
|
159
|
+
}
|
|
160
|
+
const d = await sw.auth.login({ email: String(b.email ?? ''), password: String(b.password ?? '') });
|
|
161
|
+
return sessionResponse(d);
|
|
162
|
+
}
|
|
163
|
+
if (method === 'POST' && sub === '/mfa/challenge') {
|
|
164
|
+
const b = await readBody();
|
|
165
|
+
if (typeof b.mfa_token !== 'string' || !b.mfa_token || typeof b.code !== 'string' || !b.code.trim()) {
|
|
166
|
+
return json({ error: 'VALIDATION_ERROR', message: 'A pending MFA challenge and code are required.' }, 400);
|
|
167
|
+
}
|
|
168
|
+
const complete = wantsCookie ? sw.auth.mfa?.challengeWithCookie : sw.auth.mfa?.challenge;
|
|
169
|
+
if (!complete)
|
|
170
|
+
return json({ error: 'MFA_UNAVAILABLE', message: 'This deploy does not support MFA completion. Redeploy with the current runtime.' }, 501);
|
|
171
|
+
const result = await complete.call(sw.auth.mfa, { mfa_token: b.mfa_token, code: b.code });
|
|
172
|
+
return wantsCookie
|
|
173
|
+
? json({ user: unwrapAuthUser(result), cookie_session: true, expires_at: result.expires_at })
|
|
174
|
+
: sessionResponse(result);
|
|
175
|
+
}
|
|
176
|
+
if (method === 'POST' && sub === '/logout') {
|
|
177
|
+
// Header mode: the platform revokes a session by its refresh token, which
|
|
178
|
+
// the client sends as X-Refresh-Token; the access bearer alone revokes
|
|
179
|
+
// nothing. Only a confirmed revoke answers 2xx. Every refusal stays
|
|
180
|
+
// non-2xx — SESSION_NOT_FOUND included, because a rotated-away token can
|
|
181
|
+
// miss a newer live session — so the client keeps the sign-out owed.
|
|
182
|
+
const headerRefresh = req.headers.get('X-Refresh-Token');
|
|
183
|
+
if (headerRefresh !== null) {
|
|
184
|
+
if (!headerRefresh.trim())
|
|
185
|
+
return logoutRefused('VALIDATION_ERROR', 'X-Refresh-Token is empty; nothing was signed out.', 400);
|
|
186
|
+
let result;
|
|
187
|
+
try {
|
|
188
|
+
result = await sw.auth.logout({ refresh_token: headerRefresh });
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
return logoutFailed(err);
|
|
192
|
+
}
|
|
193
|
+
if (result?.logged_out !== true) {
|
|
194
|
+
return logoutRefused('SIGN_OUT_UNCONFIRMED', 'Could not confirm sign-out.', 502);
|
|
195
|
+
}
|
|
196
|
+
return json({ ok: true });
|
|
197
|
+
}
|
|
198
|
+
// A bearer with no refresh token is a header client that cannot be signed
|
|
199
|
+
// out here (SDK 0.11.4 and earlier sent only the bearer). Refuse instead of
|
|
200
|
+
// answering ok for a session that stays live.
|
|
201
|
+
if (/^bearer\s/i.test(req.headers.get('Authorization') || '')) {
|
|
202
|
+
return logoutRefused('LOGOUT_REFRESH_REQUIRED', 'Header sign-out needs the session refresh token in X-Refresh-Token; nothing was signed out.', 400);
|
|
203
|
+
}
|
|
204
|
+
// Cookie mode: logoutWithCookie revokes the session from the refresh
|
|
205
|
+
// cookie and parks the Set-Cookie expirations. Only its confirmed
|
|
206
|
+
// { ok: true } answers 2xx; a refusal or unconfirmed revocation keeps its
|
|
207
|
+
// code and stays non-2xx, so the client keeps the sign-out owed.
|
|
208
|
+
if (typeof sw.auth.logoutWithCookie !== 'function') {
|
|
209
|
+
// A runtime without the cookie helper cannot revoke a cookie session;
|
|
210
|
+
// nothing is called, so nothing was signed out.
|
|
211
|
+
return logoutRefused('COOKIE_SESSION_UNAVAILABLE', 'This runtime cannot sign out a cookie session; nothing was signed out.', 501);
|
|
212
|
+
}
|
|
213
|
+
let cookieResult;
|
|
214
|
+
try {
|
|
215
|
+
cookieResult = await sw.auth.logoutWithCookie(req);
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
return logoutFailed(err);
|
|
219
|
+
}
|
|
220
|
+
if (cookieResult?.ok !== true) {
|
|
221
|
+
return logoutRefused('SIGN_OUT_UNCONFIRMED', 'Could not confirm sign-out.', 502);
|
|
222
|
+
}
|
|
223
|
+
return json({ ok: true });
|
|
224
|
+
}
|
|
225
|
+
if (method === 'POST' && sub === '/refresh') {
|
|
226
|
+
if (!sw.auth.refreshSession)
|
|
227
|
+
return json({ error: 'REFRESH_UNAVAILABLE' }, 501);
|
|
228
|
+
try {
|
|
229
|
+
return json(await sw.auth.refreshSession(req));
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
return verificationFailed(err);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
if (method === 'GET' && sub === '/me') {
|
|
236
|
+
const user = await sw.auth.fromRequest(req);
|
|
237
|
+
return json({ user: user ?? null });
|
|
238
|
+
}
|
|
239
|
+
// Email verification. The account is the request's own session (the
|
|
240
|
+
// httpOnly cookie, or a Bearer header); no token is read here or returned.
|
|
241
|
+
if (method === 'GET' && sub === '/verify-email') {
|
|
242
|
+
const user = (await sw.auth.fromRequest(req));
|
|
243
|
+
if (!user)
|
|
244
|
+
return json({ error: 'AUTH_REQUIRED', message: 'Sign in required.' }, 401);
|
|
245
|
+
return json({ email_verified: user.email_verified === true });
|
|
246
|
+
}
|
|
247
|
+
if (method === 'POST' && (sub === '/request-email-verification' || sub === '/verify-email')) {
|
|
248
|
+
if (typeof sw.auth.requestEmailVerificationWithCookie !== 'function' || typeof sw.auth.verifyEmailWithCookie !== 'function') {
|
|
249
|
+
return json({ error: 'EMAIL_VERIFICATION_UNAVAILABLE', message: 'This deploy predates email verification for cookie sessions. Redeploy to pick up the current runtime.' }, 501);
|
|
250
|
+
}
|
|
251
|
+
try {
|
|
252
|
+
if (sub === '/request-email-verification')
|
|
253
|
+
return json(await sw.auth.requestEmailVerificationWithCookie(req));
|
|
254
|
+
const b = await readBody();
|
|
255
|
+
return json(await sw.auth.verifyEmailWithCookie(req, { code: String(b.code ?? '') }));
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
return verificationFailed(err);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
if (method === 'POST' && sub === '/magic-link') {
|
|
262
|
+
const b = await readBody();
|
|
263
|
+
const d = await sw.auth.signInWithOtp({
|
|
264
|
+
email: String(b.email ?? ''),
|
|
265
|
+
redirect_uri: typeof b.redirect_uri === 'string' ? b.redirect_uri : undefined,
|
|
266
|
+
});
|
|
267
|
+
return json(d);
|
|
268
|
+
}
|
|
269
|
+
if (method === 'POST' && sub === '/magic-link/verify') {
|
|
270
|
+
const b = await readBody();
|
|
271
|
+
const d = await sw.auth.verifyOtp({ token: String(b.token ?? '') });
|
|
272
|
+
return sessionResponse(d);
|
|
273
|
+
}
|
|
274
|
+
// Entitlements (sw.billing): the project's plan catalog, for a pricing page.
|
|
275
|
+
// The catalog is project-wide and non-secret. 404s on a runtime without
|
|
276
|
+
// sw.billing so an older deploy degrades instead of throwing.
|
|
277
|
+
if (method === 'GET' && sub === '/plans') {
|
|
278
|
+
if (typeof sw.billing?.plans !== 'function') {
|
|
279
|
+
return json({ error: 'NOT_FOUND', message: 'Entitlements are not available on this runtime.' }, 404);
|
|
280
|
+
}
|
|
281
|
+
const result = (await sw.billing.plans());
|
|
282
|
+
return json({ plans: result?.plans ?? [] });
|
|
283
|
+
}
|
|
284
|
+
// Start a subscription checkout for the SIGNED-IN user (<PricingTable>'s
|
|
285
|
+
// Subscribe button). SECURITY: the runtime derives the buyer from the
|
|
286
|
+
// request's signed-in user — NEVER a body-supplied id — so there's no IDOR
|
|
287
|
+
// on a money op; fromRequest here only answers a clean 401 first. The only
|
|
288
|
+
// client input is which plan slug to buy. The worker resolves that plan's
|
|
289
|
+
// price from the billing catalog.
|
|
290
|
+
if (method === 'POST' && sub === '/billing/checkout') {
|
|
291
|
+
if (typeof sw.payments?.checkoutForUser !== 'function') {
|
|
292
|
+
return json({ error: 'NOT_FOUND', message: 'Billing is not available on this runtime.' }, 404);
|
|
293
|
+
}
|
|
294
|
+
const me = (await sw.auth.fromRequest(req));
|
|
295
|
+
if (!me || !me.id)
|
|
296
|
+
return json({ error: 'AUTH_REQUIRED', message: 'Sign in required.' }, 401);
|
|
297
|
+
const b = await readBody();
|
|
298
|
+
if (typeof b.plan !== 'string' || !b.plan) {
|
|
299
|
+
return json({ error: 'VALIDATION_ERROR', message: 'plan is required.' }, 400);
|
|
300
|
+
}
|
|
301
|
+
const result = await sw.payments.checkoutForUser({
|
|
302
|
+
plan: b.plan,
|
|
303
|
+
success_url: typeof b.success_url === 'string' ? b.success_url : undefined,
|
|
304
|
+
cancel_url: typeof b.cancel_url === 'string' ? b.cancel_url : undefined,
|
|
305
|
+
});
|
|
306
|
+
return json(result);
|
|
307
|
+
}
|
|
308
|
+
// Open the Stripe billing portal for the SIGNED-IN user (<BillingPortal>).
|
|
309
|
+
// SECURITY: same as checkout — the runtime resolves this user's
|
|
310
|
+
// stripe_customer_id from their session server-side; no id crosses from
|
|
311
|
+
// the browser, so a user can only ever manage their OWN subscription.
|
|
312
|
+
if (method === 'POST' && sub === '/billing/portal') {
|
|
313
|
+
if (typeof sw.payments?.portalForUser !== 'function') {
|
|
314
|
+
return json({ error: 'NOT_FOUND', message: 'Billing is not available on this runtime.' }, 404);
|
|
315
|
+
}
|
|
316
|
+
const me = (await sw.auth.fromRequest(req));
|
|
317
|
+
if (!me || !me.id)
|
|
318
|
+
return json({ error: 'AUTH_REQUIRED', message: 'Sign in required.' }, 401);
|
|
319
|
+
const b = await readBody();
|
|
320
|
+
const result = await sw.payments.portalForUser({
|
|
321
|
+
return_url: typeof b.return_url === 'string' ? b.return_url : undefined,
|
|
322
|
+
});
|
|
323
|
+
return json(result);
|
|
324
|
+
}
|
|
325
|
+
// Social sign-in is bound to the browser that starts it: the runtime stages
|
|
326
|
+
// this attempt's verifier cookie on this response and only its challenge
|
|
327
|
+
// travels in the URL. There is no unbound fallback to the old URL builders.
|
|
328
|
+
const oauthStartRoute = method === 'GET' ? /^\/(google|github|discord)-url$/.exec(sub) : null;
|
|
329
|
+
if (oauthStartRoute) {
|
|
330
|
+
if (typeof sw.auth.oauthStart !== 'function') {
|
|
331
|
+
return json({ error: 'OAUTH_START_UNAVAILABLE', message: 'This deploy predates browser-bound social sign-in. Redeploy to pick up the current runtime.' }, 501);
|
|
332
|
+
}
|
|
333
|
+
const provider = oauthStartRoute[1];
|
|
334
|
+
const redirectUri = url.searchParams.get('redirect_uri') || `${url.origin}/api/auth/callback`;
|
|
335
|
+
return json({ url: await sw.auth.oauthStart(provider, { redirect_uri: redirectUri }) });
|
|
336
|
+
}
|
|
337
|
+
if (method === 'POST' && sub === '/google') {
|
|
338
|
+
const b = await readBody();
|
|
339
|
+
const d = await sw.auth.googleExchange({ code: String(b.code ?? ''), attempt: String(b.attempt ?? '') });
|
|
340
|
+
return sessionResponse(d);
|
|
341
|
+
}
|
|
342
|
+
if (method === 'POST' && sub === '/github') {
|
|
343
|
+
const b = await readBody();
|
|
344
|
+
const d = await sw.auth.githubExchange({ code: String(b.code ?? ''), attempt: String(b.attempt ?? '') });
|
|
345
|
+
return sessionResponse(d);
|
|
346
|
+
}
|
|
347
|
+
if (method === 'POST' && sub === '/discord') {
|
|
348
|
+
const b = await readBody();
|
|
349
|
+
const d = await sw.auth.discordExchange({ code: String(b.code ?? ''), attempt: String(b.attempt ?? '') });
|
|
350
|
+
return sessionResponse(d);
|
|
351
|
+
}
|
|
352
|
+
return json({ error: 'NOT_FOUND', message: `No @somewhere-cloud/sdk/auth route for ${method} ${sub}` }, 404);
|
|
353
|
+
}
|
|
354
|
+
catch (err) {
|
|
355
|
+
if (err && typeof err === 'object' && 'code' in err && err.code === 'MFA_REQUIRED' && 'mfa_token' in err && typeof err.mfa_token === 'string' && err.mfa_token) {
|
|
356
|
+
return json({ mfa_required: true, mfa_token: err.mfa_token });
|
|
357
|
+
}
|
|
358
|
+
// The runtime could not adjudicate the session (outage, timeout, malformed
|
|
359
|
+
// answer). Keep that classification, with a fixed message, so a client
|
|
360
|
+
// reads it as "unknown", never as signed out.
|
|
361
|
+
if (err && typeof err === 'object' && 'code' in err && err.code === 'AUTH_VERIFY_UNAVAILABLE') {
|
|
362
|
+
return json({ error: 'AUTH_VERIFY_UNAVAILABLE', message: 'Identity verification is temporarily unavailable. Please retry.' }, 503);
|
|
363
|
+
}
|
|
364
|
+
const status = err?.status ?? 400;
|
|
365
|
+
return json({ error: 'AUTH_ERROR', message: err?.message || 'Auth failed' }, status);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/auth/server.ts"],"names":[],"mappings":"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"}
|