tinbase 0.9.0 → 0.10.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 (162) hide show
  1. package/README.md +10 -9
  2. package/dist/admin/api.d.ts +62 -1
  3. package/dist/admin/api.js +209 -10
  4. package/dist/admin/api.js.map +1 -1
  5. package/dist/admin/ui.d.ts +1 -1
  6. package/dist/admin/ui.js +1548 -16
  7. package/dist/admin/ui.js.map +1 -1
  8. package/dist/auth/handler.d.ts +52 -5
  9. package/dist/auth/handler.js +147 -36
  10. package/dist/auth/handler.js.map +1 -1
  11. package/dist/auth/inbox.d.ts +4 -2
  12. package/dist/auth/inbox.js +1 -0
  13. package/dist/auth/inbox.js.map +1 -1
  14. package/dist/auth/oauth.d.ts +30 -4
  15. package/dist/auth/oauth.js +22 -6
  16. package/dist/auth/oauth.js.map +1 -1
  17. package/dist/auth/password.d.ts +5 -0
  18. package/dist/auth/password.js +7 -0
  19. package/dist/auth/password.js.map +1 -1
  20. package/dist/auth/qr.d.ts +1 -1
  21. package/dist/auth/qr.js +1 -1
  22. package/dist/auth/rate-limit.d.ts +33 -0
  23. package/dist/auth/rate-limit.js +63 -0
  24. package/dist/auth/rate-limit.js.map +1 -0
  25. package/dist/auth/redirect.d.ts +20 -0
  26. package/dist/auth/redirect.js +79 -0
  27. package/dist/auth/redirect.js.map +1 -0
  28. package/dist/auth/settings.d.ts +55 -0
  29. package/dist/auth/settings.js +116 -0
  30. package/dist/auth/settings.js.map +1 -0
  31. package/dist/auth/totp.js +1 -1
  32. package/dist/cli.js +66 -30
  33. package/dist/cli.js.map +1 -1
  34. package/dist/cron/service.d.ts +15 -2
  35. package/dist/cron/service.js +19 -2
  36. package/dist/cron/service.js.map +1 -1
  37. package/dist/db/bootstrap.d.ts +13 -6
  38. package/dist/db/bootstrap.js +26 -5
  39. package/dist/db/bootstrap.js.map +1 -1
  40. package/dist/db/database.d.ts +61 -3
  41. package/dist/db/database.js +72 -9
  42. package/dist/db/database.js.map +1 -1
  43. package/dist/db/emulated.d.ts +39 -2
  44. package/dist/db/emulated.js +39 -23
  45. package/dist/db/emulated.js.map +1 -1
  46. package/dist/db/engine.d.ts +19 -5
  47. package/dist/db/engine.js +4 -2
  48. package/dist/db/engine.js.map +1 -1
  49. package/dist/db/inspect.d.ts +6 -1
  50. package/dist/db/inspect.js +2 -1
  51. package/dist/db/inspect.js.map +1 -1
  52. package/dist/db/pglite-engine.d.ts +7 -1
  53. package/dist/db/pglite-engine.js +7 -1
  54. package/dist/db/pglite-engine.js.map +1 -1
  55. package/dist/db/pgmem-engine.d.ts +9 -3
  56. package/dist/db/pgmem-engine.js +13 -7
  57. package/dist/db/pgmem-engine.js.map +1 -1
  58. package/dist/db/schema-diff.d.ts +9 -1
  59. package/dist/db/schema-diff.js +19 -5
  60. package/dist/db/schema-diff.js.map +1 -1
  61. package/dist/db/sql-compat.d.ts +2 -2
  62. package/dist/db/sql-compat.js +2 -2
  63. package/dist/functions/deno-shim.d.ts +6 -17
  64. package/dist/functions/deno-shim.js +42 -10
  65. package/dist/functions/deno-shim.js.map +1 -1
  66. package/dist/functions/handler.d.ts +9 -4
  67. package/dist/functions/handler.js +9 -1
  68. package/dist/functions/handler.js.map +1 -1
  69. package/dist/gen-types.d.ts +6 -1
  70. package/dist/gen-types.js +53 -41
  71. package/dist/gen-types.js.map +1 -1
  72. package/dist/index.d.ts +33 -3
  73. package/dist/index.js +170 -30
  74. package/dist/index.js.map +1 -1
  75. package/dist/jwt.d.ts +4 -1
  76. package/dist/jwt.js +4 -2
  77. package/dist/jwt.js.map +1 -1
  78. package/dist/log-buffer.d.ts +7 -1
  79. package/dist/log-buffer.js +3 -0
  80. package/dist/log-buffer.js.map +1 -1
  81. package/dist/net/service.d.ts +35 -6
  82. package/dist/net/service.js +72 -17
  83. package/dist/net/service.js.map +1 -1
  84. package/dist/node/bun-server.d.ts +2 -1
  85. package/dist/node/bun-server.js +11 -1
  86. package/dist/node/bun-server.js.map +1 -1
  87. package/dist/node/bundle-function.d.ts +1 -1
  88. package/dist/node/bundle-function.js +1 -1
  89. package/dist/node/config-toml.d.ts +31 -0
  90. package/dist/node/config-toml.js +186 -0
  91. package/dist/node/config-toml.js.map +1 -0
  92. package/dist/node/db-diff.d.ts +13 -1
  93. package/dist/node/db-diff.js +3 -1
  94. package/dist/node/db-diff.js.map +1 -1
  95. package/dist/node/fs-driver.d.ts +16 -1
  96. package/dist/node/fs-driver.js +20 -1
  97. package/dist/node/fs-driver.js.map +1 -1
  98. package/dist/node/index.d.ts +2 -2
  99. package/dist/node/index.js +1 -1
  100. package/dist/node/index.js.map +1 -1
  101. package/dist/node/load-config.d.ts +80 -0
  102. package/dist/node/load-config.js +230 -0
  103. package/dist/node/load-config.js.map +1 -0
  104. package/dist/node/load-functions.d.ts +17 -2
  105. package/dist/node/load-functions.js +17 -4
  106. package/dist/node/load-functions.js.map +1 -1
  107. package/dist/node/native/database-url.d.ts +25 -0
  108. package/dist/node/native/database-url.js +38 -0
  109. package/dist/node/native/database-url.js.map +1 -0
  110. package/dist/node/native/engine.d.ts +7 -0
  111. package/dist/node/native/engine.js +63 -85
  112. package/dist/node/native/engine.js.map +1 -1
  113. package/dist/node/native/wire-engine.d.ts +16 -0
  114. package/dist/node/native/wire-engine.js +83 -0
  115. package/dist/node/native/wire-engine.js.map +1 -0
  116. package/dist/node/native/wire.d.ts +25 -8
  117. package/dist/node/native/wire.js +130 -15
  118. package/dist/node/native/wire.js.map +1 -1
  119. package/dist/node/project.d.ts +15 -1
  120. package/dist/node/project.js +19 -7
  121. package/dist/node/project.js.map +1 -1
  122. package/dist/node/server-shared.d.ts +4 -1
  123. package/dist/node/server.d.ts +11 -0
  124. package/dist/node/server.js +11 -0
  125. package/dist/node/server.js.map +1 -1
  126. package/dist/node/ws.d.ts +26 -1
  127. package/dist/node/ws.js +26 -3
  128. package/dist/node/ws.js.map +1 -1
  129. package/dist/realtime/engine.d.ts +6 -0
  130. package/dist/realtime/engine.js +45 -34
  131. package/dist/realtime/engine.js.map +1 -1
  132. package/dist/rest/build.d.ts +44 -1
  133. package/dist/rest/build.js +96 -10
  134. package/dist/rest/build.js.map +1 -1
  135. package/dist/rest/errors.d.ts +8 -0
  136. package/dist/rest/errors.js +12 -1
  137. package/dist/rest/errors.js.map +1 -1
  138. package/dist/rest/handler.d.ts +17 -1
  139. package/dist/rest/handler.js +125 -10
  140. package/dist/rest/handler.js.map +1 -1
  141. package/dist/rest/parse.d.ts +26 -1
  142. package/dist/rest/parse.js +29 -2
  143. package/dist/rest/parse.js.map +1 -1
  144. package/dist/retention/service.d.ts +3 -0
  145. package/dist/retention/service.js +3 -1
  146. package/dist/retention/service.js.map +1 -1
  147. package/dist/security.d.ts +22 -0
  148. package/dist/security.js +47 -0
  149. package/dist/security.js.map +1 -0
  150. package/dist/storage/driver.d.ts +8 -1
  151. package/dist/storage/driver.js +4 -1
  152. package/dist/storage/driver.js.map +1 -1
  153. package/dist/storage/handler.d.ts +20 -1
  154. package/dist/storage/handler.js +272 -16
  155. package/dist/storage/handler.js.map +1 -1
  156. package/dist/types.d.ts +84 -1
  157. package/dist/types.js +10 -0
  158. package/dist/types.js.map +1 -1
  159. package/dist/webhooks/service.d.ts +25 -2
  160. package/dist/webhooks/service.js +21 -3
  161. package/dist/webhooks/service.js.map +1 -1
  162. package/package.json +5 -3
package/dist/jwt.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * Minimal HS256 JWT implementation on WebCrypto.
3
- * Works in Node (>=18) and browsers — no dependencies.
3
+ * Works in Node (>=18) and browsers - no dependencies.
4
4
  */
5
+ /** Standard + Supabase/GoTrue claims carried in an access token. Open-ended: any extra claims are preserved. */
5
6
  export interface JwtClaims {
6
7
  [key: string]: unknown;
7
8
  sub?: string;
@@ -19,9 +20,11 @@ export interface JwtClaims {
19
20
  timestamp: number;
20
21
  }[];
21
22
  }
23
+ /** Sign claims as an HS256 JWT. */
22
24
  export declare function signJwt(claims: JwtClaims, secret: string): Promise<string>;
23
25
  /** Verifies signature and expiry. Returns claims, or null when invalid. */
24
26
  export declare function verifyJwt(token: string, secret: string): Promise<JwtClaims | null>;
25
27
  /** Decode without verification (for introspection/debugging only). */
26
28
  export declare function decodeJwt(token: string): JwtClaims | null;
29
+ /** A URL-safe random token (base64url of `bytes` CSPRNG bytes). Used for refresh/one-time/link tokens. */
27
30
  export declare function randomToken(bytes?: number): string;
package/dist/jwt.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Minimal HS256 JWT implementation on WebCrypto.
3
- * Works in Node (>=18) and browsers — no dependencies.
3
+ * Works in Node (>=18) and browsers - no dependencies.
4
4
  */
5
5
  const encoder = new TextEncoder();
6
6
  const decoder = new TextDecoder();
@@ -24,6 +24,7 @@ function base64UrlToBytes(str) {
24
24
  async function hmacKey(secret, usage) {
25
25
  return crypto.subtle.importKey('raw', encoder.encode(secret), { name: 'HMAC', hash: 'SHA-256' }, false, [usage]);
26
26
  }
27
+ /** Sign claims as an HS256 JWT. */
27
28
  export async function signJwt(claims, secret) {
28
29
  const header = bytesToBase64Url(encoder.encode(JSON.stringify({ alg: 'HS256', typ: 'JWT' })));
29
30
  const payload = bytesToBase64Url(encoder.encode(JSON.stringify(claims)));
@@ -39,7 +40,7 @@ export async function verifyJwt(token, secret) {
39
40
  return null;
40
41
  const [header, payload, signature] = parts;
41
42
  try {
42
- // Pin the algorithm to HS256 — reject alg:"none" and any alg-swap attempt
43
+ // Pin the algorithm to HS256 - reject alg:"none" and any alg-swap attempt
43
44
  // rather than relying on the HMAC verify to fail.
44
45
  const head = JSON.parse(decoder.decode(base64UrlToBytes(header)));
45
46
  if (head.alg !== 'HS256')
@@ -69,6 +70,7 @@ export function decodeJwt(token) {
69
70
  return null;
70
71
  }
71
72
  }
73
+ /** A URL-safe random token (base64url of `bytes` CSPRNG bytes). Used for refresh/one-time/link tokens. */
72
74
  export function randomToken(bytes = 32) {
73
75
  const buf = new Uint8Array(bytes);
74
76
  crypto.getRandomValues(buf);
package/dist/jwt.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.js","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jwt.js","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"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"}
@@ -1,21 +1,27 @@
1
1
  /**
2
2
  * In-memory ring buffer of recent server log lines, surfaced in the Studio
3
3
  * "Logs" pane (and available as backend.logs). Captures request lines and the
4
- * internal log() output (migrations, mail, webhooks, cron). Dev convenience —
4
+ * internal log() output (migrations, mail, webhooks, cron). Dev convenience -
5
5
  * bounded, never persisted.
6
6
  */
7
+ /** Severity derived from response status (or passed explicitly by internal log calls). */
7
8
  export type LogLevel = 'info' | 'warn' | 'error';
9
+ /** One buffered log line. */
8
10
  export interface LogEntry {
11
+ /** ISO timestamp when pushed. */
9
12
  ts: string;
10
13
  level: LogLevel;
11
14
  msg: string;
12
15
  }
16
+ /** Bounded FIFO of the most recent {@link LogEntry} lines; oldest are dropped past `cap`. */
13
17
  export declare class LogBuffer {
14
18
  private cap;
15
19
  private entries;
16
20
  constructor(cap?: number);
21
+ /** Append a line, evicting the oldest once over capacity. */
17
22
  push(msg: string, level?: LogLevel): void;
18
23
  /** Most recent first. */
19
24
  list(limit?: number): LogEntry[];
25
+ /** Drop all buffered lines. */
20
26
  clear(): void;
21
27
  }
@@ -1,9 +1,11 @@
1
+ /** Bounded FIFO of the most recent {@link LogEntry} lines; oldest are dropped past `cap`. */
1
2
  export class LogBuffer {
2
3
  cap;
3
4
  entries = [];
4
5
  constructor(cap = 500) {
5
6
  this.cap = cap;
6
7
  }
8
+ /** Append a line, evicting the oldest once over capacity. */
7
9
  push(msg, level = 'info') {
8
10
  this.entries.push({ ts: new Date().toISOString(), level, msg });
9
11
  if (this.entries.length > this.cap)
@@ -13,6 +15,7 @@ export class LogBuffer {
13
15
  list(limit = 200) {
14
16
  return this.entries.slice(-limit).reverse();
15
17
  }
18
+ /** Drop all buffered lines. */
16
19
  clear() {
17
20
  this.entries = [];
18
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"log-buffer.js","sourceRoot":"","sources":["../src/log-buffer.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,SAAS;IAEA;IADZ,OAAO,GAAe,EAAE,CAAA;IAChC,YAAoB,MAAM,GAAG;QAAT,QAAG,GAAH,GAAG,CAAM;IAAG,CAAC;IAEjC,IAAI,CAAC,GAAW,EAAE,QAAkB,MAAM;QACxC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;QAC/D,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG;YAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;IAC5F,CAAC;IAED,yBAAyB;IACzB,IAAI,CAAC,KAAK,GAAG,GAAG;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAA;IAC7C,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,EAAE,CAAA;IACnB,CAAC;CACF"}
1
+ {"version":3,"file":"log-buffer.js","sourceRoot":"","sources":["../src/log-buffer.ts"],"names":[],"mappings":"AAiBA,6FAA6F;AAC7F,MAAM,OAAO,SAAS;IAEA;IADZ,OAAO,GAAe,EAAE,CAAA;IAChC,YAAoB,MAAM,GAAG;QAAT,QAAG,GAAH,GAAG,CAAM;IAAG,CAAC;IAEjC,6DAA6D;IAC7D,IAAI,CAAC,GAAW,EAAE,QAAkB,MAAM;QACxC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;QAC/D,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG;YAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;IAC5F,CAAC;IAED,yBAAyB;IACzB,IAAI,CAAC,KAAK,GAAG,GAAG;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAA;IAC7C,CAAC;IAED,+BAA+B;IAC/B,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,EAAE,CAAA;IACnB,CAAC;CACF"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * In-process HTTP sender for the pg_net emulation — the execution half of the
2
+ * In-process HTTP sender for the pg_net emulation - the execution half of the
3
3
  * net.* surface (the net.http_get/post/delete SQL functions live in
4
4
  * db/emulated.ts). It drains net.http_request_queue, performs each request with
5
5
  * fetch, and records the reply in net._http_response, mirroring pg_net's
@@ -7,20 +7,41 @@
7
7
  */
8
8
  import type { Database } from '../db/database.js';
9
9
  /**
10
- * Reject requests to non-public destinations. This is a literal-host guard
11
- * (loopback / private / link-local / cloud-metadata), which blocks the common
12
- * SSRF vectors without an async DNS lookup. Returns an error string, or null
13
- * when the URL is allowed.
10
+ * Reject requests to non-public destinations. A synchronous literal-host guard
11
+ * (loopback / private / link-local / cloud-metadata) that also rejects
12
+ * alternate numeric IP encodings which would slip past the literal checks but
13
+ * still connect to a real address. No DNS lookup - a public hostname that
14
+ * *resolves* to private space (DNS rebinding) is a residual this doesn't cover;
15
+ * doing so would add a per-request lookup that can hang for 30s on an
16
+ * unresolvable host. Returns an error string, or null when the URL is allowed.
14
17
  */
15
18
  export declare function blockedNetTarget(rawUrl: string): string | null;
19
+ /**
20
+ * fetch with an SSRF guard that re-validates every redirect hop. Default fetch
21
+ * follows redirects without re-checking, so a public URL could 3xx into private
22
+ * space; this follows manually (capped at {@link MAX_REDIRECTS}) and runs
23
+ * {@link blockedNetTarget} on each target. Throws with the block reason on a
24
+ * rejected hop.
25
+ */
26
+ export declare function guardedFetch(fetchImpl: typeof fetch, url: string, init?: RequestInit): Promise<Response>;
27
+ /** Outcome of one drained request, passed to the optional `onDeliver` callback. */
16
28
  export interface NetDelivery {
29
+ /** net.http_request_queue row id */
17
30
  id: number;
18
31
  method: string;
19
32
  url: string;
33
+ /** response status; undefined when the request failed before a reply */
20
34
  status?: number;
35
+ /** true if the request aborted on its timeout */
21
36
  timedOut: boolean;
37
+ /** failure reason (network error, blocked target, etc.); undefined on success */
22
38
  error?: string;
23
39
  }
40
+ /**
41
+ * Drains net.http_request_queue on an interval, performs each request, and
42
+ * records the reply in net._http_response - the pg_net background worker,
43
+ * in-process.
44
+ */
24
45
  export declare class NetService {
25
46
  private db;
26
47
  private fetchImpl;
@@ -29,11 +50,19 @@ export declare class NetService {
29
50
  private onDeliver?;
30
51
  private timer;
31
52
  private draining;
53
+ /** The in-flight tick, tracked so stop() can drain it before db.close(). */
54
+ private inFlight;
32
55
  constructor(db: Database, fetchImpl?: typeof fetch,
33
56
  /** how often to drain the queue (ms) */
34
57
  tickMs?: number, onDeliver?: ((d: NetDelivery) => void) | undefined);
58
+ /** Begin draining the queue on the tick interval; no-op if already running. */
35
59
  start(): void;
36
- stop(): void;
60
+ /**
61
+ * Stop the drain loop and wait for any in-flight tick to finish before the
62
+ * caller closes the database - the single connection busy-loops if closed
63
+ * while a query is still queued.
64
+ */
65
+ stop(): Promise<void>;
37
66
  /** Drain any queued requests once (also callable directly in tests). */
38
67
  tick(): Promise<void>;
39
68
  private deliver;
@@ -1,10 +1,15 @@
1
1
  /** Cap on the response body we buffer into net._http_response (bytes). */
2
2
  const MAX_RESPONSE_BYTES = 10 * 1024 * 1024;
3
+ /** Max redirect hops guardedFetch will follow, re-validating each target. */
4
+ const MAX_REDIRECTS = 5;
3
5
  /**
4
- * Reject requests to non-public destinations. This is a literal-host guard
5
- * (loopback / private / link-local / cloud-metadata), which blocks the common
6
- * SSRF vectors without an async DNS lookup. Returns an error string, or null
7
- * when the URL is allowed.
6
+ * Reject requests to non-public destinations. A synchronous literal-host guard
7
+ * (loopback / private / link-local / cloud-metadata) that also rejects
8
+ * alternate numeric IP encodings which would slip past the literal checks but
9
+ * still connect to a real address. No DNS lookup - a public hostname that
10
+ * *resolves* to private space (DNS rebinding) is a residual this doesn't cover;
11
+ * doing so would add a per-request lookup that can hang for 30s on an
12
+ * unresolvable host. Returns an error string, or null when the URL is allowed.
8
13
  */
9
14
  export function blockedNetTarget(rawUrl) {
10
15
  let u;
@@ -21,6 +26,13 @@ export function blockedNetTarget(rawUrl) {
21
26
  return 'blocked host: localhost';
22
27
  if (isPrivateIp(host))
23
28
  return `blocked host: ${host}`;
29
+ // Reject alternate numeric encodings of an IP that pass the literal checks but
30
+ // still reach a real address - http://2130706433 and http://0x7f000001 both
31
+ // connect to 127.0.0.1. A genuine DNS name contains a letter and is not
32
+ // 0x-prefixed; dotted-IPv4 and IPv6 literals were already checked above.
33
+ if (!host.includes(':') && !/^\d{1,3}(\.\d{1,3}){3}$/.test(host) && (host.startsWith('0x') || !/[a-z]/i.test(host))) {
34
+ return `blocked host: ${host} (non-DNS address encoding)`;
35
+ }
24
36
  return null;
25
37
  }
26
38
  function isPrivateIp(host) {
@@ -49,6 +61,32 @@ function isPrivateIp(host) {
49
61
  return isPrivateIp(host.slice(7)); // IPv4-mapped
50
62
  return false;
51
63
  }
64
+ /**
65
+ * fetch with an SSRF guard that re-validates every redirect hop. Default fetch
66
+ * follows redirects without re-checking, so a public URL could 3xx into private
67
+ * space; this follows manually (capped at {@link MAX_REDIRECTS}) and runs
68
+ * {@link blockedNetTarget} on each target. Throws with the block reason on a
69
+ * rejected hop.
70
+ */
71
+ export async function guardedFetch(fetchImpl, url, init = {}) {
72
+ let current = url;
73
+ for (let hop = 0; hop <= MAX_REDIRECTS; hop++) {
74
+ const blocked = blockedNetTarget(current);
75
+ if (blocked)
76
+ throw new Error(blocked);
77
+ const res = await fetchImpl(current, { ...init, redirect: 'manual' });
78
+ const location = res.status >= 300 && res.status < 400 ? res.headers.get('location') : null;
79
+ if (!location)
80
+ return res;
81
+ current = new URL(location, current).toString();
82
+ }
83
+ throw new Error(`too many redirects (>${MAX_REDIRECTS})`);
84
+ }
85
+ /**
86
+ * Drains net.http_request_queue on an interval, performs each request, and
87
+ * records the reply in net._http_response - the pg_net background worker,
88
+ * in-process.
89
+ */
52
90
  export class NetService {
53
91
  db;
54
92
  fetchImpl;
@@ -56,6 +94,8 @@ export class NetService {
56
94
  onDeliver;
57
95
  timer = null;
58
96
  draining = false;
97
+ /** The in-flight tick, tracked so stop() can drain it before db.close(). */
98
+ inFlight = null;
59
99
  constructor(db, fetchImpl = fetch,
60
100
  /** how often to drain the queue (ms) */
61
101
  tickMs = 500, onDeliver) {
@@ -64,22 +104,32 @@ export class NetService {
64
104
  this.tickMs = tickMs;
65
105
  this.onDeliver = onDeliver;
66
106
  }
107
+ /** Begin draining the queue on the tick interval; no-op if already running. */
67
108
  start() {
68
109
  if (this.timer)
69
110
  return;
70
- this.timer = setInterval(() => void this.tick(), this.tickMs);
111
+ this.timer = setInterval(() => {
112
+ this.inFlight = this.tick();
113
+ }, this.tickMs);
71
114
  if (typeof this.timer === 'object' && 'unref' in this.timer)
72
115
  this.timer.unref();
73
116
  }
74
- stop() {
117
+ /**
118
+ * Stop the drain loop and wait for any in-flight tick to finish before the
119
+ * caller closes the database - the single connection busy-loops if closed
120
+ * while a query is still queued.
121
+ */
122
+ async stop() {
75
123
  if (this.timer)
76
124
  clearInterval(this.timer);
77
125
  this.timer = null;
126
+ await this.inFlight?.catch(() => { });
127
+ this.inFlight = null;
78
128
  }
79
129
  /** Drain any queued requests once (also callable directly in tests). */
80
130
  async tick() {
81
131
  if (this.draining)
82
- return; // never overlap drains — one writer at a time
132
+ return; // never overlap drains - one writer at a time
83
133
  this.draining = true;
84
134
  try {
85
135
  let rows;
@@ -89,8 +139,18 @@ export class NetService {
89
139
  catch {
90
140
  return; // net.* not present (e.g. the pg-mem subset engine)
91
141
  }
92
- for (const row of rows)
93
- await this.deliver(row);
142
+ for (const row of rows) {
143
+ try {
144
+ await this.deliver(row);
145
+ }
146
+ catch (e) {
147
+ // A malformed row must never poison the loop or reject out of the
148
+ // setInterval callback - dequeue it with the error recorded instead.
149
+ const msg = e instanceof Error ? e.message : String(e);
150
+ await this.record(row.id, null, null, null, null, false, msg);
151
+ this.onDeliver?.({ id: row.id, method: row.method, url: row.url, timedOut: false, error: msg });
152
+ }
153
+ }
94
154
  }
95
155
  finally {
96
156
  this.draining = false;
@@ -106,16 +166,11 @@ export class NetService {
106
166
  let respHeaders = null;
107
167
  let timedOut = false;
108
168
  let errorMsg = null;
109
- const blocked = blockedNetTarget(row.url);
110
- if (blocked) {
111
- clearTimeout(timer);
112
- await this.record(row.id, null, null, null, content, false, blocked);
113
- this.onDeliver?.({ id: row.id, method: row.method, url: row.url, timedOut: false, error: blocked });
114
- return;
115
- }
116
169
  try {
117
170
  const hasBody = row.method !== 'GET' && row.method !== 'HEAD';
118
- const res = await this.fetchImpl(row.url, {
171
+ // guardedFetch enforces the SSRF policy on the initial URL and every
172
+ // redirect hop (a plain fetch would follow a 3xx into private space).
173
+ const res = await guardedFetch(this.fetchImpl, row.url, {
119
174
  method: row.method,
120
175
  headers,
121
176
  body: hasBody ? row.body ?? undefined : undefined,
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/net/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/net/service.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * Bun-native server: Bun.serve with first-class WebSockets. Used automatically
3
- * when the CLI runs under Bun (including single-binary builds) — same backend,
3
+ * when the CLI runs under Bun (including single-binary builds) - same backend,
4
4
  * same RealtimeSocketLike contract as the node:http path.
5
5
  */
6
6
  import type { SupaliteBackendShape } from './server-shared.js';
7
7
  import type { RunningServer, ServeOptions } from './server.js';
8
+ /** Bun equivalent of {@link import('./server.js').serve}; same backend contract. */
8
9
  export declare function serveBun(backend: SupaliteBackendShape, opts?: ServeOptions): Promise<RunningServer>;
@@ -1,3 +1,4 @@
1
+ /** Bun equivalent of {@link import('./server.js').serve}; same backend contract. */
1
2
  export async function serveBun(backend, opts = {}) {
2
3
  const host = opts.host ?? '127.0.0.1';
3
4
  const server = Bun.serve({
@@ -11,7 +12,16 @@ export async function serveBun(backend, opts = {}) {
11
12
  return undefined;
12
13
  return new Response('upgrade failed', { status: 400 });
13
14
  }
14
- return backend.fetch(req);
15
+ // Expose the connecting client's address for rate limiting, stripping any
16
+ // client-supplied value first so the header can't be forged - the node:http
17
+ // server does the same from req.socket.remoteAddress. Without this, a
18
+ // spoofed x-tinbase-remote-addr rotated per request defeats the limiter.
19
+ const headers = new Headers(req.headers);
20
+ headers.delete('x-tinbase-remote-addr');
21
+ const ip = srv.requestIP(req)?.address;
22
+ if (ip)
23
+ headers.set('x-tinbase-remote-addr', ip);
24
+ return backend.fetch(new Request(req, { headers }));
15
25
  },
16
26
  websocket: {
17
27
  open(ws) {
@@ -1 +1 @@
1
- {"version":3,"file":"bun-server.js","sourceRoot":"","sources":["../../src/node/bun-server.ts"],"names":[],"mappings":"AAeA,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAA6B,EAAE,OAAqB,EAAE;IACnF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,WAAW,CAAA;IAErC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK;QACxB,QAAQ,EAAE,IAAI;QACd,KAAK,CAAC,KAAK,CAAC,GAAY,EAAE,GAAQ;YAChC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAC5B,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,CAAC;gBACzG,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,OAAO,EAAE,EAAE,CAAC,CAAA;gBACtF,IAAI,EAAE;oBAAE,OAAO,SAAS,CAAA;gBACxB,OAAO,IAAI,QAAQ,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;YACxD,CAAC;YACD,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC3B,CAAC;QACD,SAAS,EAAE;YACT,IAAI,CAAC,EAA6F;gBAChG,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CACtC;oBACE,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC7B,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC;iBAChD,EACD,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CACrB,CAAA;gBACD,EAAE,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;YAC3B,CAAC;YACD,OAAO,CAAC,EAAoB,EAAE,OAA4B;gBACxD,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,CAAA;YAC7F,CAAC;YACD,KAAK,CAAC,EAAoB;gBACxB,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAA;YAC5B,CAAC;SACF;KACF,CAAC,CAAA;IAEF,OAAO;QACL,MAAM,EAAE,MAAe;QACvB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,GAAG,EAAE,UAAU,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE;QACpC,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnB,CAAC;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"bun-server.js","sourceRoot":"","sources":["../../src/node/bun-server.ts"],"names":[],"mappings":"AAiBA,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAA6B,EAAE,OAAqB,EAAE;IACnF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,WAAW,CAAA;IAErC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK;QACxB,QAAQ,EAAE,IAAI;QACd,KAAK,CAAC,KAAK,CAAC,GAAY,EAAE,GAAQ;YAChC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAC5B,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,CAAC;gBACzG,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,OAAO,EAAE,EAAE,CAAC,CAAA;gBACtF,IAAI,EAAE;oBAAE,OAAO,SAAS,CAAA;gBACxB,OAAO,IAAI,QAAQ,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;YACxD,CAAC;YACD,0EAA0E;YAC1E,4EAA4E;YAC5E,sEAAsE;YACtE,yEAAyE;YACzE,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YACxC,OAAO,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAA;YACvC,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,OAAO,CAAA;YACtC,IAAI,EAAE;gBAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAA;YAChD,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;QACrD,CAAC;QACD,SAAS,EAAE;YACT,IAAI,CAAC,EAA6F;gBAChG,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CACtC;oBACE,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC7B,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC;iBAChD,EACD,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CACrB,CAAA;gBACD,EAAE,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;YAC3B,CAAC;YACD,OAAO,CAAC,EAAoB,EAAE,OAA4B;gBACxD,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,CAAA;YAC7F,CAAC;YACD,KAAK,CAAC,EAAoB;gBACxB,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAA;YAC5B,CAAC;SACF;KACF,CAAC,CAAA;IAEF,OAAO;QACL,MAAM,EAAE,MAAe;QACvB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,GAAG,EAAE,UAAU,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE;QACpC,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnB,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -1,4 +1,4 @@
1
- /** Map a Deno-style specifier to a fetchable URL. Pure — unit tested. */
1
+ /** Map a Deno-style specifier to a fetchable URL. Pure - unit tested. */
2
2
  export declare function rewriteRemoteSpecifier(spec: string): string;
3
3
  /**
4
4
  * Bundle `entryPath` to a single ESM file and return its path (written under
@@ -15,7 +15,7 @@ import { mkdir, readFile, writeFile } from 'node:fs/promises';
15
15
  import { existsSync } from 'node:fs';
16
16
  import { tmpdir } from 'node:os';
17
17
  import { join } from 'node:path';
18
- /** Map a Deno-style specifier to a fetchable URL. Pure — unit tested. */
18
+ /** Map a Deno-style specifier to a fetchable URL. Pure - unit tested. */
19
19
  export function rewriteRemoteSpecifier(spec) {
20
20
  if (spec.startsWith('npm:'))
21
21
  return `https://esm.sh/${spec.slice(4)}`;
@@ -0,0 +1,31 @@
1
+ /** A parsed table: its scalar/array values plus nested child tables. */
2
+ export interface ConfigTable {
3
+ /** scalar and single-line-array values declared directly under this table, by key */
4
+ values: Map<string, string | string[]>;
5
+ /** nested child tables, by their (single, undotted) segment name */
6
+ children: Map<string, ConfigTable>;
7
+ }
8
+ /** Parse config.toml at `projectDir/supabase/config.toml`; empty root if absent/unreadable. */
9
+ export declare function loadConfigToml(projectDir: string, env?: NodeJS.ProcessEnv): ConfigTable;
10
+ /** Parse TOML `text` into a table tree, resolving `env(VAR)` references. */
11
+ export declare function parseConfigToml(text: string, env?: NodeJS.ProcessEnv): ConfigTable;
12
+ /** Child table at a dotted path, or undefined if any segment is missing. */
13
+ export declare function tableAt(root: ConfigTable, path: string): ConfigTable | undefined;
14
+ /** String value at `key`, or undefined if absent, empty, or an array. */
15
+ export declare function getString(table: ConfigTable | undefined, key: string): string | undefined;
16
+ /** Boolean value at `key`, or undefined if absent or not exactly true/false. */
17
+ export declare function getBool(table: ConfigTable | undefined, key: string): boolean | undefined;
18
+ /** Integer value at `key` (base 10), or undefined if absent or unparseable. */
19
+ export declare function getInt(table: ConfigTable | undefined, key: string): number | undefined;
20
+ /** String-array value at `key`, or undefined if absent or a scalar. */
21
+ export declare function getStringArray(table: ConfigTable | undefined, key: string): string[] | undefined;
22
+ /**
23
+ * Parse a Supabase duration string ("1m", "24h", "10s", "50m") to seconds.
24
+ * Returns undefined if absent or malformed.
25
+ */
26
+ export declare function getDurationSeconds(table: ConfigTable | undefined, key: string): number | undefined;
27
+ /**
28
+ * Parse a Supabase byte-size string ("50MiB", "5MB", "500KB") to bytes.
29
+ * Returns undefined if absent or malformed.
30
+ */
31
+ export declare function getByteSize(table: ConfigTable | undefined, key: string): number | undefined;