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.
- package/README.md +10 -9
- package/dist/admin/api.d.ts +62 -1
- package/dist/admin/api.js +209 -10
- package/dist/admin/api.js.map +1 -1
- package/dist/admin/ui.d.ts +1 -1
- package/dist/admin/ui.js +1548 -16
- package/dist/admin/ui.js.map +1 -1
- package/dist/auth/handler.d.ts +52 -5
- package/dist/auth/handler.js +147 -36
- package/dist/auth/handler.js.map +1 -1
- package/dist/auth/inbox.d.ts +4 -2
- package/dist/auth/inbox.js +1 -0
- package/dist/auth/inbox.js.map +1 -1
- package/dist/auth/oauth.d.ts +30 -4
- package/dist/auth/oauth.js +22 -6
- package/dist/auth/oauth.js.map +1 -1
- package/dist/auth/password.d.ts +5 -0
- package/dist/auth/password.js +7 -0
- package/dist/auth/password.js.map +1 -1
- package/dist/auth/qr.d.ts +1 -1
- package/dist/auth/qr.js +1 -1
- package/dist/auth/rate-limit.d.ts +33 -0
- package/dist/auth/rate-limit.js +63 -0
- package/dist/auth/rate-limit.js.map +1 -0
- package/dist/auth/redirect.d.ts +20 -0
- package/dist/auth/redirect.js +79 -0
- package/dist/auth/redirect.js.map +1 -0
- package/dist/auth/settings.d.ts +55 -0
- package/dist/auth/settings.js +116 -0
- package/dist/auth/settings.js.map +1 -0
- package/dist/auth/totp.js +1 -1
- package/dist/cli.js +66 -30
- package/dist/cli.js.map +1 -1
- package/dist/cron/service.d.ts +15 -2
- package/dist/cron/service.js +19 -2
- package/dist/cron/service.js.map +1 -1
- package/dist/db/bootstrap.d.ts +13 -6
- package/dist/db/bootstrap.js +26 -5
- package/dist/db/bootstrap.js.map +1 -1
- package/dist/db/database.d.ts +61 -3
- package/dist/db/database.js +72 -9
- package/dist/db/database.js.map +1 -1
- package/dist/db/emulated.d.ts +39 -2
- package/dist/db/emulated.js +39 -23
- package/dist/db/emulated.js.map +1 -1
- package/dist/db/engine.d.ts +19 -5
- package/dist/db/engine.js +4 -2
- package/dist/db/engine.js.map +1 -1
- package/dist/db/inspect.d.ts +6 -1
- package/dist/db/inspect.js +2 -1
- package/dist/db/inspect.js.map +1 -1
- package/dist/db/pglite-engine.d.ts +7 -1
- package/dist/db/pglite-engine.js +7 -1
- package/dist/db/pglite-engine.js.map +1 -1
- package/dist/db/pgmem-engine.d.ts +9 -3
- package/dist/db/pgmem-engine.js +13 -7
- package/dist/db/pgmem-engine.js.map +1 -1
- package/dist/db/schema-diff.d.ts +9 -1
- package/dist/db/schema-diff.js +19 -5
- package/dist/db/schema-diff.js.map +1 -1
- package/dist/db/sql-compat.d.ts +2 -2
- package/dist/db/sql-compat.js +2 -2
- package/dist/functions/deno-shim.d.ts +6 -17
- package/dist/functions/deno-shim.js +42 -10
- package/dist/functions/deno-shim.js.map +1 -1
- package/dist/functions/handler.d.ts +9 -4
- package/dist/functions/handler.js +9 -1
- package/dist/functions/handler.js.map +1 -1
- package/dist/gen-types.d.ts +6 -1
- package/dist/gen-types.js +53 -41
- package/dist/gen-types.js.map +1 -1
- package/dist/index.d.ts +33 -3
- package/dist/index.js +170 -30
- package/dist/index.js.map +1 -1
- package/dist/jwt.d.ts +4 -1
- package/dist/jwt.js +4 -2
- package/dist/jwt.js.map +1 -1
- package/dist/log-buffer.d.ts +7 -1
- package/dist/log-buffer.js +3 -0
- package/dist/log-buffer.js.map +1 -1
- package/dist/net/service.d.ts +35 -6
- package/dist/net/service.js +72 -17
- package/dist/net/service.js.map +1 -1
- package/dist/node/bun-server.d.ts +2 -1
- package/dist/node/bun-server.js +11 -1
- package/dist/node/bun-server.js.map +1 -1
- package/dist/node/bundle-function.d.ts +1 -1
- package/dist/node/bundle-function.js +1 -1
- package/dist/node/config-toml.d.ts +31 -0
- package/dist/node/config-toml.js +186 -0
- package/dist/node/config-toml.js.map +1 -0
- package/dist/node/db-diff.d.ts +13 -1
- package/dist/node/db-diff.js +3 -1
- package/dist/node/db-diff.js.map +1 -1
- package/dist/node/fs-driver.d.ts +16 -1
- package/dist/node/fs-driver.js +20 -1
- package/dist/node/fs-driver.js.map +1 -1
- package/dist/node/index.d.ts +2 -2
- package/dist/node/index.js +1 -1
- package/dist/node/index.js.map +1 -1
- package/dist/node/load-config.d.ts +80 -0
- package/dist/node/load-config.js +230 -0
- package/dist/node/load-config.js.map +1 -0
- package/dist/node/load-functions.d.ts +17 -2
- package/dist/node/load-functions.js +17 -4
- package/dist/node/load-functions.js.map +1 -1
- package/dist/node/native/database-url.d.ts +25 -0
- package/dist/node/native/database-url.js +38 -0
- package/dist/node/native/database-url.js.map +1 -0
- package/dist/node/native/engine.d.ts +7 -0
- package/dist/node/native/engine.js +63 -85
- package/dist/node/native/engine.js.map +1 -1
- package/dist/node/native/wire-engine.d.ts +16 -0
- package/dist/node/native/wire-engine.js +83 -0
- package/dist/node/native/wire-engine.js.map +1 -0
- package/dist/node/native/wire.d.ts +25 -8
- package/dist/node/native/wire.js +130 -15
- package/dist/node/native/wire.js.map +1 -1
- package/dist/node/project.d.ts +15 -1
- package/dist/node/project.js +19 -7
- package/dist/node/project.js.map +1 -1
- package/dist/node/server-shared.d.ts +4 -1
- package/dist/node/server.d.ts +11 -0
- package/dist/node/server.js +11 -0
- package/dist/node/server.js.map +1 -1
- package/dist/node/ws.d.ts +26 -1
- package/dist/node/ws.js +26 -3
- package/dist/node/ws.js.map +1 -1
- package/dist/realtime/engine.d.ts +6 -0
- package/dist/realtime/engine.js +45 -34
- package/dist/realtime/engine.js.map +1 -1
- package/dist/rest/build.d.ts +44 -1
- package/dist/rest/build.js +96 -10
- package/dist/rest/build.js.map +1 -1
- package/dist/rest/errors.d.ts +8 -0
- package/dist/rest/errors.js +12 -1
- package/dist/rest/errors.js.map +1 -1
- package/dist/rest/handler.d.ts +17 -1
- package/dist/rest/handler.js +125 -10
- package/dist/rest/handler.js.map +1 -1
- package/dist/rest/parse.d.ts +26 -1
- package/dist/rest/parse.js +29 -2
- package/dist/rest/parse.js.map +1 -1
- package/dist/retention/service.d.ts +3 -0
- package/dist/retention/service.js +3 -1
- package/dist/retention/service.js.map +1 -1
- package/dist/security.d.ts +22 -0
- package/dist/security.js +47 -0
- package/dist/security.js.map +1 -0
- package/dist/storage/driver.d.ts +8 -1
- package/dist/storage/driver.js +4 -1
- package/dist/storage/driver.js.map +1 -1
- package/dist/storage/handler.d.ts +20 -1
- package/dist/storage/handler.js +272 -16
- package/dist/storage/handler.js.map +1 -1
- package/dist/types.d.ts +84 -1
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -1
- package/dist/webhooks/service.d.ts +25 -2
- package/dist/webhooks/service.js +21 -3
- package/dist/webhooks/service.js.map +1 -1
- 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
|
|
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
|
|
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
|
|
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":"AAAA;;;GAGG;AAEH,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAA;AACjC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAA;AAEjC,SAAS,gBAAgB,CAAC,KAAiB;IACzC,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,MAAM,KAAK,GAAG,MAAM,CAAA;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;QAC7C,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAA;IAChE,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;AAChF,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IACxD,MAAM,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACjE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;IAC3B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;IACvE,OAAO,KAAK,CAAA;AACd,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,MAAc,EAAE,KAAe;IACpD,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAC5B,KAAK,EACL,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EACtB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EACjC,KAAK,EACL,CAAC,KAAK,CAAC,CACR,CAAA;AACH,CAAC;
|
|
1
|
+
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"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"}
|
package/dist/log-buffer.d.ts
CHANGED
|
@@ -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
|
}
|
package/dist/log-buffer.js
CHANGED
|
@@ -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
|
}
|
package/dist/log-buffer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-buffer.js","sourceRoot":"","sources":["../src/log-buffer.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/net/service.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* In-process HTTP sender for the pg_net emulation
|
|
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.
|
|
11
|
-
* (loopback / private / link-local / cloud-metadata)
|
|
12
|
-
*
|
|
13
|
-
*
|
|
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
|
-
|
|
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;
|
package/dist/net/service.js
CHANGED
|
@@ -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.
|
|
5
|
-
* (loopback / private / link-local / cloud-metadata)
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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(() =>
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
package/dist/net/service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/net/service.ts"],"names":[],"mappings":"AASA,0EAA0E;AAC1E,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAA;AAE3C
|
|
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)
|
|
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>;
|
package/dist/node/bun-server.js
CHANGED
|
@@ -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
|
-
|
|
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":"
|
|
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
|
|
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
|
|
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;
|