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