@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.
Files changed (149) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +191 -2
  3. package/dist/cjs/auth/client.js +1142 -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 +1137 -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,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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"}