@supacloud/lite 0.29.4 → 0.30.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.
package/dist/index.js CHANGED
@@ -88,7 +88,7 @@ function randomToken(bytes = 32) {
88
88
  // package.json
89
89
  var package_default = {
90
90
  name: "@supacloud/lite",
91
- version: "0.29.4",
91
+ version: "0.30.0",
92
92
  description: "Bun-native, single-project Supabase-compatible backend powered by PGlite or native PostgreSQL",
93
93
  type: "module",
94
94
  license: "Apache-2.0",
@@ -147,16 +147,16 @@ var package_default = {
147
147
  "@electric-sql/pglite-pgmq": "0.0.8",
148
148
  "@electric-sql/pglite-pgvector": "0.0.11",
149
149
  "@electric-sql/pglite-postgis": "0.2.10",
150
- "@supacloud/db": "^0.17.0",
150
+ "@supacloud/db": "0.18.1",
151
151
  "exact-mirror": "1.2.6",
152
152
  tar: "^7.5.22",
153
153
  typebox: "1.3.37"
154
154
  },
155
155
  devDependencies: {
156
- "@supacloud/app": "file:../app",
157
- "@supacloud/contracts": "file:../contracts",
158
- "@supacloud/compiler": "file:../compiler",
159
- "@supacloud/elysia": "file:../elysia",
156
+ "@supacloud/app": "0.27.2",
157
+ "@supacloud/contracts": "0.11.2",
158
+ "@supacloud/compiler": "0.46.7",
159
+ "@supacloud/elysia": "0.33.2",
160
160
  "@supabase/supabase-js": "^2.117.3",
161
161
  "@types/bun": "^1.4.3",
162
162
  effect: "4.0.5",
@@ -165,13 +165,13 @@ var package_default = {
165
165
  typescript: "^7.0.2"
166
166
  },
167
167
  overrides: {
168
- "@supacloud/db": "^0.17.0",
169
- "@supacloud/app": "file:../app",
170
- "@supacloud/compiler": "file:../compiler",
171
- "@supacloud/elysia": "file:../elysia",
172
- "@supacloud/contracts": "file:../contracts",
173
- "@supacloud/commands": "file:../commands",
174
- "@supacloud/delivery": "file:../delivery",
168
+ "@supacloud/db": "0.18.1",
169
+ "@supacloud/app": "0.27.2",
170
+ "@supacloud/compiler": "0.46.7",
171
+ "@supacloud/elysia": "0.33.2",
172
+ "@supacloud/contracts": "0.11.2",
173
+ "@supacloud/commands": "0.9.4",
174
+ "@supacloud/delivery": "0.19.1",
175
175
  "@graphql-tools/utils": "^12.0.4"
176
176
  },
177
177
  engines: {
@@ -248,6 +248,13 @@ function isAllowedRedirect(requested, siteUrl, allowList = []) {
248
248
  }
249
249
 
250
250
  // src/runtime/auth/oauth.ts
251
+ class OAuthAccountIneligibleError extends Error {
252
+ code;
253
+ constructor(code) {
254
+ super(code);
255
+ this.code = code;
256
+ }
257
+ }
251
258
  var PRESETS = {
252
259
  google: {
253
260
  authorizeUrl: "https://accounts.google.com/o/oauth2/v2/auth",
@@ -370,14 +377,30 @@ class OAuthService {
370
377
  const msg = encodeURIComponent(e instanceof Error ? e.message : "oauth_error");
371
378
  return redirect(`${flow.redirect_to}#error=server_error&error_description=${msg}`);
372
379
  }
373
- const userId = await this.upsertUser(provider.name, profile);
380
+ let userId;
381
+ try {
382
+ userId = await this.upsertUser(provider.name, profile);
383
+ } catch (e) {
384
+ if (e instanceof OAuthAccountIneligibleError) {
385
+ return redirect(`${flow.redirect_to}#error=access_denied&error_code=${e.code}`);
386
+ }
387
+ throw e;
388
+ }
374
389
  if (flow.code_challenge) {
375
390
  const authCode = randomToken(24);
376
391
  await this.db.query(`insert into auth.flow_state (provider, provider_state, redirect_to, code_challenge, code_challenge_method, auth_code, user_id, expires_at)
377
392
  values ($1, $2, $3, $4, $5, $6, $7, now() + interval '5 minutes')`, [flow.provider, randomToken(16), flow.redirect_to, flow.code_challenge, flow.code_challenge_method, authCode, userId]);
378
393
  return redirect(`${flow.redirect_to}?code=${authCode}`);
379
394
  }
380
- const session = await createSession(userId);
395
+ let session;
396
+ try {
397
+ session = await createSession(userId);
398
+ } catch (e) {
399
+ if (e instanceof OAuthAccountIneligibleError) {
400
+ return redirect(`${flow.redirect_to}#error=access_denied&error_code=${e.code}`);
401
+ }
402
+ throw e;
403
+ }
381
404
  const hash = `#access_token=${session.access_token}&refresh_token=${session.refresh_token}&expires_in=${session.expires_in}&token_type=bearer&provider_token=`;
382
405
  return redirect(`${flow.redirect_to}${hash}`);
383
406
  }
@@ -428,31 +451,37 @@ class OAuthService {
428
451
  return profile;
429
452
  }
430
453
  async upsertUser(provider, profile) {
431
- const existing = await this.db.query(`select user_id from auth.identities where provider = $1 and provider_id = $2`, [provider, profile.id]);
454
+ return this.db.transaction((query) => this.upsertUserInTransaction(query, provider, profile));
455
+ }
456
+ async upsertUserInTransaction(query, provider, profile) {
457
+ const existing = await query(`select user_id from auth.identities where provider = $1 and provider_id = $2`, [provider, profile.id]);
432
458
  if (existing.rows[0]) {
433
- await this.db.query(`update auth.identities set last_sign_in_at = now(), identity_data = $3 where provider = $1 and provider_id = $2`, [
459
+ await this.assertUserEligible(query, existing.rows[0].user_id);
460
+ await query(`update auth.identities set last_sign_in_at = now(), identity_data = $3 where provider = $1 and provider_id = $2`, [
434
461
  provider,
435
462
  profile.id,
436
463
  JSON.stringify({ sub: profile.id, email: profile.email, ...profile.metadata })
437
464
  ]);
438
- await this.db.query(`update auth.users set last_sign_in_at = now() where id = $1`, [existing.rows[0].user_id]);
465
+ await query(`update auth.users set last_sign_in_at = now() where id = $1`, [existing.rows[0].user_id]);
439
466
  return existing.rows[0].user_id;
440
467
  }
441
468
  let userId;
442
469
  const email = profile.email?.toLowerCase() ?? null;
443
470
  const verified = !!profile.email && profile.emailVerified === true;
444
471
  if (email && verified) {
445
- const byEmail = await this.db.query(`select id from auth.users where email = $1`, [email]);
472
+ const byEmail = await query(`select id from auth.users where email = $1`, [email]);
446
473
  userId = byEmail.rows[0]?.id;
474
+ if (userId)
475
+ await this.assertUserEligible(query, userId);
447
476
  }
448
477
  if (!userId) {
449
478
  let userEmail = verified ? email : null;
450
479
  if (userEmail) {
451
- const taken = await this.db.query(`select 1 from auth.users where email = $1`, [userEmail]);
480
+ const taken = await query(`select 1 from auth.users where email = $1`, [userEmail]);
452
481
  if (taken.rows.length > 0)
453
482
  userEmail = null;
454
483
  }
455
- const created = await this.db.query(`insert into auth.users (aud, role, email, email_confirmed_at, last_sign_in_at, raw_app_meta_data, raw_user_meta_data)
484
+ const created = await query(`insert into auth.users (aud, role, email, email_confirmed_at, last_sign_in_at, raw_app_meta_data, raw_user_meta_data)
456
485
  values ('authenticated','authenticated',$1, $2, now(),
457
486
  $3::jsonb, $4::jsonb) returning id`, [
458
487
  userEmail,
@@ -465,12 +494,22 @@ class OAuthService {
465
494
  throw new Error("OAuth user creation returned no row");
466
495
  userId = user.id;
467
496
  }
468
- await this.db.query(`insert into auth.identities (user_id, provider, provider_id, identity_data)
497
+ await query(`insert into auth.identities (user_id, provider, provider_id, identity_data)
469
498
  values ($1, $2, $3, $4::jsonb)`, [userId, provider, profile.id, JSON.stringify({ sub: profile.id, email: profile.email, ...profile.metadata })]);
470
499
  if (!userId)
471
500
  throw new Error("OAuth identity has no user ID");
472
501
  return userId;
473
502
  }
503
+ async assertUserEligible(query, userId) {
504
+ const users = await query(`select deleted_at is not null as is_deleted,
505
+ coalesce(banned_until > now(), false) as is_banned
506
+ from auth.users where id = $1 for update`, [userId]);
507
+ const user = users.rows[0];
508
+ if (!user || user.is_deleted)
509
+ throw new OAuthAccountIneligibleError("user_not_found");
510
+ if (user.is_banned)
511
+ throw new OAuthAccountIneligibleError("user_banned");
512
+ }
474
513
  }
475
514
  function redirect(location) {
476
515
  return new Response(null, { status: 303, headers: { location } });
@@ -1356,6 +1395,8 @@ class AuthHandler {
1356
1395
  return await this.admin(req, ctx, path, method);
1357
1396
  return authError(404, "not_found", `unknown auth endpoint: ${path}`);
1358
1397
  } catch (e) {
1398
+ if (e instanceof OAuthAccountIneligibleError)
1399
+ return authError(400, e.code, e.message);
1359
1400
  const msg = e instanceof Error ? e.message : String(e);
1360
1401
  return authError(500, "unexpected_failure", msg);
1361
1402
  }
@@ -1419,8 +1460,12 @@ class AuthHandler {
1419
1460
  const body = await req.json().catch(() => ({}));
1420
1461
  if (grantType === "password") {
1421
1462
  const email = (body.email ?? "").toLowerCase().trim();
1422
- const res = await this.db.query(`select * from auth.users where email = $1`, [email]);
1463
+ const res = await this.db.query(`select *, coalesce(banned_until > now(), false) as is_banned
1464
+ from auth.users where email = $1 and deleted_at is null`, [email]);
1423
1465
  const user = res.rows[0];
1466
+ if (user?.encrypted_password && user.is_banned) {
1467
+ return authError(400, "user_banned", "User is banned");
1468
+ }
1424
1469
  if (!user || !user.encrypted_password || !await verifyPassword(body.password ?? "", user.encrypted_password)) {
1425
1470
  await this.audit("login_failed", { actorEmail: email, traits: { grant_type: "password" } });
1426
1471
  return authError(400, "invalid_credentials", "Invalid login credentials");
@@ -1446,8 +1491,7 @@ class AuthHandler {
1446
1491
  const userId = await this.oauth.exchangePkce(authCode, verifier);
1447
1492
  if (!userId)
1448
1493
  return authError(403, "flow_state_not_found", "invalid or expired auth code");
1449
- const ures = await this.db.query(`select * from auth.users where id = $1`, [userId]);
1450
- return json(200, await this.sessionForOAuth(ures.rows[0]));
1494
+ return json(200, await this.sessionForOAuth(userId));
1451
1495
  }
1452
1496
  return authError(400, "invalid_grant", `unsupported grant_type: ${grantType}`);
1453
1497
  }
@@ -1742,7 +1786,10 @@ Or sign in with this link: ${link}`
1742
1786
  tokenTypes: `{${types.join(",")}}`,
1743
1787
  email: email?.toLowerCase().trim() ?? null
1744
1788
  };
1745
- return this.db.transaction((query) => this.claimEmailToken(query, redemption));
1789
+ return this.db.transaction(async (query) => {
1790
+ const user = await this.claimEmailToken(query, redemption);
1791
+ return user ? this.sessionFor(user, undefined, undefined, query) : null;
1792
+ });
1746
1793
  }
1747
1794
  async claimEmailToken(query, redemption) {
1748
1795
  const candidate = await this.findEmailTokenCandidate(query, redemption);
@@ -1754,7 +1801,10 @@ Or sign in with this link: ${link}`
1754
1801
  return claimedToken ? this.confirmEmailTokenUser(query, claimedToken) : null;
1755
1802
  }
1756
1803
  async lockAndDeleteEmailToken(query, candidate, redemption) {
1757
- await query(`select id from auth.users where id = $1 for update`, [candidate.user_id]);
1804
+ const eligible = await query(`select id from auth.users where id = $1 and deleted_at is null
1805
+ and (banned_until is null or banned_until <= now()) for update`, [candidate.user_id]);
1806
+ if (eligible.rows.length === 0)
1807
+ return null;
1758
1808
  const claimedTokens = await query(`delete from auth.one_time_tokens
1759
1809
  where id = $1 and token = $2 and token_type = any($3::text[])
1760
1810
  and expires_at > now() and attempts < $4
@@ -1807,10 +1857,10 @@ Or sign in with this link: ${link}`
1807
1857
  return json(200, session);
1808
1858
  }
1809
1859
  const types = body.type === "recovery" ? ["recovery"] : body.type === "magiclink" ? ["magiclink"] : ["otp", "magiclink"];
1810
- const user = await this.redeem(token, types, body.email);
1811
- if (!user)
1860
+ const session = await this.redeem(token, types, body.email);
1861
+ if (!session)
1812
1862
  return authError(403, "otp_expired", "Token has expired or is invalid");
1813
- return json(200, await this.sessionFor(user));
1863
+ return json(200, session);
1814
1864
  }
1815
1865
  async redeemPhoneOtp(phone, code) {
1816
1866
  const tokenDigest = `hmac-sha256:v1:${await keyedDigest(this.config.jwtSecret, "supacloud-lite:phone-otp:v1", `${phone}\x00${code}`)}`;
@@ -1851,11 +1901,10 @@ Or sign in with this link: ${link}`
1851
1901
  const token = url.searchParams.get("token") ?? "";
1852
1902
  const type = url.searchParams.get("type") ?? "magiclink";
1853
1903
  const redirectTo = resolveRedirect(url.searchParams.get("redirect_to"), this.config.siteUrl, this.config.uriAllowList, this.config.enforceRedirectAllowList);
1854
- const user = await this.redeem(token, [type]);
1855
- if (!user) {
1904
+ const session = await this.redeem(token, [type]);
1905
+ if (!session) {
1856
1906
  return new Response(null, { status: 303, headers: { location: `${redirectTo}#error=access_denied&error_code=otp_expired` } });
1857
1907
  }
1858
- const session = await this.sessionFor(user);
1859
1908
  const hash = `#access_token=${session.access_token}&refresh_token=${session.refresh_token}&expires_in=${session.expires_in}&token_type=bearer&type=${type}`;
1860
1909
  return new Response(null, { status: 303, headers: { location: `${redirectTo}${hash}` } });
1861
1910
  }
@@ -2156,6 +2205,11 @@ Or sign in with this link: ${link}`
2156
2205
  return authError(422, "mfa_verification_failed", "Invalid TOTP code entered");
2157
2206
  }
2158
2207
  const session = await this.db.transaction(async (query) => {
2208
+ const currentUsers = await query(`select * from auth.users where id = $1 and deleted_at is null
2209
+ and (banned_until is null or banned_until <= now()) for update`, [user.id]);
2210
+ const currentUser = currentUsers.rows[0];
2211
+ if (!currentUser)
2212
+ return null;
2159
2213
  const claimed = await query(`update auth.mfa_challenges set verified_at = now()
2160
2214
  where id = $1 and factor_id = $2 and verified_at is null and expires_at >= now()
2161
2215
  returning id`, [challenge.id, factorId]);
@@ -2164,7 +2218,7 @@ Or sign in with this link: ${link}`
2164
2218
  if (factor.status !== "verified") {
2165
2219
  await query(`update auth.mfa_factors set status = 'verified', updated_at = now() where id = $1`, [factorId]);
2166
2220
  }
2167
- return this.sessionFor(user, undefined, {
2221
+ return this.sessionFor(currentUser, undefined, {
2168
2222
  aal: "aal2",
2169
2223
  amr: [
2170
2224
  { method: "password", timestamp: Math.floor(Date.now() / 1000) },
@@ -2225,6 +2279,18 @@ Or sign in with this link: ${link}`
2225
2279
  }
2226
2280
  async rotateRefreshToken(token) {
2227
2281
  return this.db.transaction(async (query) => {
2282
+ const availableToken = await this.findAvailableRefreshToken(query, token);
2283
+ if (!availableToken)
2284
+ return authError(400, "refresh_token_not_found", "Invalid Refresh Token: Refresh Token Not Found");
2285
+ const userResult = await query(`select *, coalesce(banned_until > now(), false) as is_banned
2286
+ from auth.users where id = $1 for update`, [availableToken.user_id]);
2287
+ const user = userResult.rows[0];
2288
+ if (!user || user.deleted_at !== null) {
2289
+ return authError(400, "refresh_token_not_found", "Invalid Refresh Token: Refresh Token Not Found");
2290
+ }
2291
+ if (user.is_banned) {
2292
+ return authError(400, "user_banned", "Invalid Refresh Token: User Banned");
2293
+ }
2228
2294
  const claimedToken = await this.claimRefreshToken(query, token);
2229
2295
  if (!claimedToken)
2230
2296
  return authError(400, "refresh_token_not_found", "Invalid Refresh Token: Refresh Token Not Found");
@@ -2232,14 +2298,19 @@ Or sign in with this link: ${link}`
2232
2298
  const expiryError = this.refreshExpiryError(claimedToken, sessionStartedAt);
2233
2299
  if (expiryError)
2234
2300
  return expiryError;
2235
- const userResult = await query(`select * from auth.users where id = $1`, [claimedToken.user_id]);
2236
- const session = await this.sessionFor(userResult.rows[0], token, {
2301
+ const session = await this.sessionFor(user, token, {
2237
2302
  sessionId: claimedToken.session_id ?? undefined,
2238
2303
  sessionStartedAt: sessionStartedAt === null ? undefined : Math.floor(sessionStartedAt / 1000)
2239
2304
  }, query);
2240
2305
  return json(200, session);
2241
2306
  });
2242
2307
  }
2308
+ async findAvailableRefreshToken(query, token) {
2309
+ const available = await query(`select user_id, session_id, created_at
2310
+ from auth.refresh_tokens
2311
+ where token = $1 and revoked is not true`, [token]);
2312
+ return available.rows[0];
2313
+ }
2243
2314
  async claimRefreshToken(query, token) {
2244
2315
  const claimed = await query(`update auth.refresh_tokens set revoked = true, updated_at = now()
2245
2316
  where token = $1 and revoked is not true
@@ -2267,7 +2338,8 @@ Or sign in with this link: ${link}`
2267
2338
  const claims = await this.claimsFromBearer(req);
2268
2339
  if (!claims?.sub)
2269
2340
  return null;
2270
- const res = await this.db.query(`select * from auth.users where id = $1`, [claims.sub]);
2341
+ const res = await this.db.query(`select * from auth.users where id = $1 and deleted_at is null
2342
+ and (banned_until is null or banned_until <= now())`, [claims.sub]);
2271
2343
  return res.rows[0] ?? null;
2272
2344
  }
2273
2345
  async claimsFromBearer(req) {
@@ -2296,14 +2368,22 @@ Or sign in with this link: ${link}`
2296
2368
  is_anonymous: u.is_anonymous ?? false
2297
2369
  };
2298
2370
  }
2299
- sessionForOAuth(user) {
2300
- return this.sessionFor(user, undefined, {
2301
- amr: [{ method: "oauth", timestamp: Math.floor(Date.now() / 1000) }]
2371
+ sessionForOAuth(userId) {
2372
+ return this.db.transaction(async (query) => {
2373
+ const res = await query(`select *, coalesce(banned_until > now(), false) as is_banned
2374
+ from auth.users where id = $1 for update`, [userId]);
2375
+ const user = res.rows[0];
2376
+ if (!user || user.deleted_at !== null)
2377
+ throw new OAuthAccountIneligibleError("user_not_found");
2378
+ if (user.is_banned)
2379
+ throw new OAuthAccountIneligibleError("user_banned");
2380
+ return this.sessionFor(user, undefined, {
2381
+ amr: [{ method: "oauth", timestamp: Math.floor(Date.now() / 1000) }]
2382
+ }, query);
2302
2383
  });
2303
2384
  }
2304
2385
  async oauthSessionTokensFor(userId) {
2305
- const res = await this.db.query(`select * from auth.users where id = $1`, [userId]);
2306
- const session = await this.sessionForOAuth(res.rows[0]);
2386
+ const session = await this.sessionForOAuth(userId);
2307
2387
  return { access_token: session.access_token, refresh_token: session.refresh_token, expires_in: session.expires_in };
2308
2388
  }
2309
2389
  async sessionFor(user, parentToken, opts, query = (sql, params) => this.db.query(sql, params)) {
@@ -8968,8 +9048,18 @@ var IMAGE_FORMAT_CONTENT_TYPES = {
8968
9048
  gif: "image/gif"
8969
9049
  };
8970
9050
  var MAX_TRANSFORM_DIMENSION = 2500;
8971
- var MAX_TRANSFORM_BYTES = 25 * 1024 * 1024;
9051
+ var MAX_TRANSFORM_BYTES = 500 * 1024 * 1024;
8972
9052
  var MAX_TRANSFORM_PIXELS = 50000000;
9053
+ function resolveImageTransformLimits(options = {}) {
9054
+ const maxInputBytes = options.maxInputBytes === undefined ? MAX_TRANSFORM_BYTES : options.maxInputBytes;
9055
+ const maxOutputBytes = options.maxOutputBytes === undefined ? MAX_TRANSFORM_BYTES : options.maxOutputBytes;
9056
+ for (const [name, value] of Object.entries({ maxInputBytes, maxOutputBytes })) {
9057
+ if (!Number.isSafeInteger(value) || value < 1 || value > MAX_TRANSFORM_BYTES) {
9058
+ throw new Error(`Invalid image transformation ${name}: expected 1..${MAX_TRANSFORM_BYTES} bytes`);
9059
+ }
9060
+ }
9061
+ return { maxInputBytes, maxOutputBytes };
9062
+ }
8973
9063
  function invalid(message) {
8974
9064
  return { ok: false, status: 400, error: "InvalidTransformation", message };
8975
9065
  }
@@ -9027,7 +9117,16 @@ function parseImageTransform(query) {
9027
9117
  if (quality !== undefined && format === "png") {
9028
9118
  return invalid("quality is supported only for jpeg and webp output");
9029
9119
  }
9030
- return { ok: true, value: { width, height, resize, quality, format } };
9120
+ return {
9121
+ ok: true,
9122
+ value: {
9123
+ resize,
9124
+ format,
9125
+ ...width === undefined ? {} : { width },
9126
+ ...height === undefined ? {} : { height },
9127
+ ...quality === undefined ? {} : { quality }
9128
+ }
9129
+ };
9031
9130
  }
9032
9131
  function imageTransformToSearchParams(options) {
9033
9132
  const query = new URLSearchParams;
@@ -9101,15 +9200,16 @@ function applyResize(image, metadata, options) {
9101
9200
  const proportionalWidth = Math.max(1, Math.round(metadata.width * height / metadata.height));
9102
9201
  image.resize(proportionalWidth);
9103
9202
  }
9104
- async function transformImage(source, options, knownSourceSize) {
9203
+ async function transformImage(source, options, knownSourceSize, configuredLimits = {}) {
9204
+ const limits = resolveImageTransformLimits(configuredLimits);
9105
9205
  const actualSourceSize = source instanceof Uint8Array ? source.byteLength : await Promise.resolve(source.size);
9106
9206
  const sourceSize = Math.max(knownSourceSize ?? 0, actualSourceSize);
9107
- if (sourceSize > MAX_TRANSFORM_BYTES) {
9207
+ if (sourceSize > limits.maxInputBytes) {
9108
9208
  return {
9109
9209
  ok: false,
9110
9210
  status: 413,
9111
9211
  error: "ImageTooLarge",
9112
- message: "The source image exceeds the 25MB transformation limit"
9212
+ message: `The source image exceeds the transformation limit (${limits.maxInputBytes} bytes)`
9113
9213
  };
9114
9214
  }
9115
9215
  const image = new Bun.Image(source, { maxPixels: MAX_TRANSFORM_PIXELS });
@@ -9142,12 +9242,12 @@ async function transformImage(source, options, knownSourceSize) {
9142
9242
  }
9143
9243
  try {
9144
9244
  const bytes = await image.bytes();
9145
- if (bytes.byteLength > MAX_TRANSFORM_BYTES) {
9245
+ if (bytes.byteLength > limits.maxOutputBytes) {
9146
9246
  return {
9147
9247
  ok: false,
9148
9248
  status: 413,
9149
9249
  error: "ImageTooLarge",
9150
- message: "The transformed image exceeds the 25MB transformation limit"
9250
+ message: `The transformed image exceeds the transformation limit (${limits.maxOutputBytes} bytes)`
9151
9251
  };
9152
9252
  }
9153
9253
  return { ok: true, bytes, contentType };
@@ -9350,10 +9450,12 @@ class StorageHandler {
9350
9450
  tusUploads = new Map;
9351
9451
  mutationTail = Promise.resolve();
9352
9452
  imageTransforms = new ImageTransformCache;
9453
+ transformLimits;
9353
9454
  constructor(db, driver, config) {
9354
9455
  this.db = db;
9355
9456
  this.driver = driver;
9356
9457
  this.config = config;
9458
+ this.transformLimits = resolveImageTransformLimits(config.imageTransformLimits);
9357
9459
  }
9358
9460
  async ensureBuckets(buckets) {
9359
9461
  for (const b of buckets) {
@@ -9629,7 +9731,7 @@ class StorageHandler {
9629
9731
  const source = await this.readObjectSource(row);
9630
9732
  if (source === null)
9631
9733
  throw new StorageObjectMissingError;
9632
- return transformImage(source, parsed.value, objectSize(row));
9734
+ return transformImage(source, parsed.value, objectSize(row), this.transformLimits);
9633
9735
  });
9634
9736
  } catch (error) {
9635
9737
  if (error instanceof StorageObjectMissingError) {
@@ -11476,6 +11578,7 @@ ${msg.text}` : `[mail] to=${msg.to} subject="${msg.subject}"`));
11476
11578
  const storage = new StorageHandler(db, config.storageDriver ?? new MemoryStorageDriver, {
11477
11579
  jwtSecret,
11478
11580
  defaultFileSizeLimit: config.storageFileSizeLimit,
11581
+ imageTransformLimits: config.storageImageTransformLimits,
11479
11582
  log
11480
11583
  });
11481
11584
  if (config.buckets?.length) {
@@ -13697,6 +13800,19 @@ function readStorage(root) {
13697
13800
  const limit = getByteSize(storage, "file_size_limit");
13698
13801
  if (limit !== undefined)
13699
13802
  out.fileSizeLimit = limit;
13803
+ const image = tableAt(root, "storage.image_transformation");
13804
+ if (image) {
13805
+ const limits = {};
13806
+ for (const [key, field] of [["max_input_bytes", "maxInputBytes"], ["max_output_bytes", "maxOutputBytes"]]) {
13807
+ if (!image.values.has(key))
13808
+ continue;
13809
+ const value = getByteSize(image, key);
13810
+ if (value === undefined)
13811
+ throw new Error(`Invalid image transformation ${key}`);
13812
+ limits[field] = value;
13813
+ }
13814
+ out.imageTransformLimits = resolveImageTransformLimits(limits);
13815
+ }
13700
13816
  const buckets = tableAt(root, "storage.buckets");
13701
13817
  if (buckets && buckets.children.size > 0) {
13702
13818
  out.buckets = [...buckets.children].map(([id, t]) => ({
@@ -14037,8 +14153,22 @@ async function loadFunctionsUnlocked(projectDir, options, mode) {
14037
14153
  import { lstat, readdir as readdir2, readFile as readFile5 } from "fs/promises";
14038
14154
  import { join as join6 } from "path";
14039
14155
 
14040
- // node_modules/@supacloud/db/dist/index.js
14156
+ // ../db/dist/index.js
14041
14157
  import { createHash as createHash4 } from "crypto";
14158
+
14159
+ // ../contracts/dist/index.mjs
14160
+ var commandErrorBrand = Symbol.for("@supacloud/contracts/CommandError/v1");
14161
+ var commandErrorCodes = new Set([
14162
+ "COMMAND_INPUT_INVALID",
14163
+ "COMMAND_REJECTED",
14164
+ "COMMAND_UNAVAILABLE",
14165
+ "COMMAND_IDEMPOTENCY_CONFLICT",
14166
+ "COMMAND_RECEIPT_INVALID",
14167
+ "COMMAND_OUTCOME_UNKNOWN",
14168
+ "COMMAND_INPUT_EXPIRED"
14169
+ ]);
14170
+
14171
+ // ../db/dist/index.js
14042
14172
  var TOKEN = /__[A-Z][A-Z0-9_]*__/g;
14043
14173
  var RESERVED_TOKEN = /__SC_BINDING_[A-Z0-9_]+__/;
14044
14174
  var HASH = /^[a-f0-9]{64}$/;
@@ -14582,6 +14712,7 @@ async function createProjectBackend(options = {}) {
14582
14712
  dbSchemas: config.api.schemas,
14583
14713
  maxRows: config.api.maxRows,
14584
14714
  storageFileSizeLimit: config.storage.fileSizeLimit,
14715
+ storageImageTransformLimits: config.storage.imageTransformLimits,
14585
14716
  buckets: config.storage.buckets,
14586
14717
  migrations: options.applyMigrations === false ? [] : project.migrations,
14587
14718
  seedSql: options.applyMigrations === false || options.includeSeed === false ? undefined : project.seedSql,
@@ -1 +1 @@
1
- {"version":3,"file":"project-runtime.d.ts","sourceRoot":"","sources":["../src/project-runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project-runtime.d.ts","sourceRoot":"","sources":["../src/project-runtime.ts"],"names":[],"mappings":"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"}
@@ -163,6 +163,7 @@ export declare class AuthHandler {
163
163
  private ensureEmailIdentity;
164
164
  private userJsonWithRelations;
165
165
  private rotateRefreshToken;
166
+ private findAvailableRefreshToken;
166
167
  private claimRefreshToken;
167
168
  private refreshSessionStartedAt;
168
169
  private refreshExpiryError;
@@ -1 +1 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/runtime/auth/handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/runtime/auth/handler.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,10 @@
12
12
  */
13
13
  import type { Database } from '../db/database.js';
14
14
  type OAuthRawProfile = Record<string, unknown>;
15
+ export declare class OAuthAccountIneligibleError extends Error {
16
+ readonly code: 'user_banned' | 'user_not_found';
17
+ constructor(code: 'user_banned' | 'user_not_found');
18
+ }
15
19
  /** Operator-supplied config for one OAuth provider. Endpoint URLs are optional for presets (google, github). */
16
20
  export interface OAuthProviderConfig {
17
21
  /** OAuth client id issued by the provider */
@@ -75,6 +79,8 @@ export declare class OAuthService {
75
79
  private exchangeCode;
76
80
  private fetchProfile;
77
81
  private upsertUser;
82
+ private upsertUserInTransaction;
83
+ private assertUserEligible;
78
84
  }
79
85
  /** The minimal session the callback puts in the redirect fragment for the implicit flow. */
80
86
  export interface OAuthSession {
@@ -1 +1 @@
1
- {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../src/runtime/auth/oauth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAIjD,KAAK,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE9C,gHAAgH;AAChH,MAAM,WAAW,mBAAmB;IAClC,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAA;IAChB,iDAAiD;IACjD,YAAY,EAAE,MAAM,CAAA;IACpB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oEAAoE;IACpE,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,YAAY,CAAA;CACpD;AAED,wEAAwE;AACxE,MAAM,WAAW,YAAY;IAC3B,oEAAoE;IACpE,EAAE,EAAE,MAAM,CAAA;IACV,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qFAAqF;IACrF,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC;AAED,UAAU,gBAAiB,SAAQ,QAAQ,CAAC,IAAI,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;IAClF,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,YAAY,CAAA;CACnD;AAgCD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,mBAAmB,GAAG,gBAAgB,CAsBxF;AAED,uFAAuF;AACvF,qBAAa,YAAY;IAIrB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IAEf,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,wBAAwB;IATlC,OAAO,CAAC,SAAS,CAAsC;gBAG7C,EAAE,EAAE,QAAQ,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EACpC,SAAS,GAAE,OAAO,KAAa,EAC/B,YAAY,GAAE,MAAM,EAAO,EAC3B,wBAAwB,UAAQ;IAO1C,qDAAqD;IACrD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,OAAO,CAAC,WAAW;IAInB,gEAAgE;IAC1D,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;IAgC5C,0EAA0E;IACpE,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;IA0CrG,oFAAoF;IAC9E,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YAiBhE,YAAY;YAmBZ,YAAY;YAUZ,UAAU;CA2DzB;AAED,4FAA4F;AAC5F,MAAM,WAAW,YAAY;IAC3B,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAA;IACpB,2BAA2B;IAC3B,aAAa,EAAE,MAAM,CAAA;IACrB,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAA;CACnB"}
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../src/runtime/auth/oauth.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAA8B,MAAM,wBAAwB,CAAA;AAGrF,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAE3C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAIrD,OAAO,EAAE,eAAe,EAAwB,MAAM,uBAAuB,CAAA;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAoB,MAAM,kBAAkB,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,KAAK,EAAE,aAAa,EAAU,aAAa,EAA6B,MAAM,YAAY,CAAA;AAEjG,OAAO,EAAkC,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAKrF,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,EAAE,SAAS,EAAE,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AACzE,OAAO,EAAE,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC9E,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACxD,OAAO,EACL,gBAAgB,EAChB,2BAA2B,EAC3B,wBAAwB,EACxB,kBAAkB,EAClB,KAAK,YAAY,EACjB,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,GACpB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AACzE,OAAO,EAAE,eAAe,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACjG,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC/E,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACtF,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3D,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAExD;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,iBAAiB,CAAA;IAC1B,oGAAoG;IACpG,KAAK,EAAE,OAAO,KAAK,CAAA;IACnB,mFAAmF;IACnF,EAAE,EAAE,QAAQ,CAAA;IACZ,6EAA6E;IAC7E,QAAQ,EAAE,cAAc,CAAA;IACxB,6EAA6E;IAC7E,SAAS,EAAE,gBAAgB,CAAA;IAC3B,qEAAqE;IACrE,QAAQ,EAAE,eAAe,CAAA;IACzB,mCAAmC;IACnC,IAAI,EAAE,WAAW,CAAA;IACjB,wDAAwD;IACxD,GAAG,EAAE,UAAU,CAAA;IACf,6EAA6E;IAC7E,SAAS,EAAE,gBAAgB,CAAA;IAC3B,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAA;IACf,+CAA+C;IAC/C,cAAc,EAAE,MAAM,CAAA;IACtB,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAA;IACjB,kEAAkE;IAClE,IAAI,EAAE,SAAS,CAAA;IACf,4FAA4F;IAC5F,KAAK,EAAE,WAAW,GAAG,IAAI,CAAA;IACzB,gHAAgH;IAChH,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAA;IACzB,8CAA8C;IAC9C,OAAO,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAC7E,gGAAgG;IAChG,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B;AAWD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,aAAa,CAAC,MAAM,GAAE,aAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAwZ7F"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,7 @@ import type { AuthSettings } from '../auth/settings.js';
12
12
  import type { OAuthProviderConfig } from '../auth/oauth.js';
13
13
  import type { RateLimitRule } from '../auth/rate-limit.js';
14
14
  import type { BucketSeed } from '../types.js';
15
+ import { type ImageTransformLimits } from '../storage/image-transform.js';
15
16
  import { type RuntimeMode } from '../functions/profile.js';
16
17
  import type { GraphqlOptions } from '../graphql.js';
17
18
  import { type Environment } from './config-toml.js';
@@ -70,6 +71,8 @@ export interface ApiConfig {
70
71
  export interface StorageConfig {
71
72
  /** [storage].file_size_limit: default per-bucket byte limit */
72
73
  fileSizeLimit?: number;
74
+ /** [storage.image_transformation].max_input_bytes / max_output_bytes */
75
+ imageTransformLimits?: ImageTransformLimits;
73
76
  /** [storage.buckets.*]: buckets to create at boot */
74
77
  buckets?: BucketSeed[];
75
78
  }
@@ -1 +1 @@
1
- {"version":3,"file":"load-config.d.ts","sourceRoot":"","sources":["../../../src/runtime/node/load-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"load-config.d.ts","sourceRoot":"","sources":["../../../src/runtime/node/load-config.ts"],"names":[],"mappings":"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"}