orez 0.2.20 → 0.2.24
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/browser.d.ts +5 -0
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +1 -0
- package/dist/browser.js.map +1 -1
- package/dist/worker/browser-admin.d.ts +13 -0
- package/dist/worker/browser-admin.d.ts.map +1 -0
- package/dist/worker/browser-admin.js +33 -0
- package/dist/worker/browser-admin.js.map +1 -0
- package/dist/worker/browser-embed.d.ts +12 -12
- package/dist/worker/browser-embed.d.ts.map +1 -1
- package/dist/worker/browser-embed.js +7 -0
- package/dist/worker/browser-embed.js.map +1 -1
- package/package.json +2 -2
- package/src/browser.ts +7 -0
- package/src/worker/browser-admin.ts +52 -0
- package/src/worker/browser-embed-admin.test.ts +75 -0
- package/src/worker/browser-embed.ts +21 -12
package/dist/browser.d.ts
CHANGED
|
@@ -24,6 +24,11 @@ export interface OrezBrowserConfig {
|
|
|
24
24
|
initSql?: string;
|
|
25
25
|
/** log level */
|
|
26
26
|
logLevel?: string;
|
|
27
|
+
/**
|
|
28
|
+
* intercept browser-mode orez admin routes before they reach zero-cache.
|
|
29
|
+
* default: true.
|
|
30
|
+
*/
|
|
31
|
+
disableAdminApi?: boolean;
|
|
27
32
|
}
|
|
28
33
|
export interface OrezBrowserInstance {
|
|
29
34
|
/** PGlite proxies (for direct queries from project-server) */
|
package/dist/browser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAMtD,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd,wCAAwC;IACxC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IAEvB,uCAAuC;IACvC,eAAe,EAAE,MAAM,CAAA;IAEvB,kCAAkC;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAEzB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,gBAAgB;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAMtD,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd,wCAAwC;IACxC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IAEvB,uCAAuC;IACvC,eAAe,EAAE,MAAM,CAAA;IAEvB,kCAAkC;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAEzB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,gBAAgB;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,SAAS,EAAE;QACT,QAAQ,EAAE,cAAc,CAAA;QACxB,GAAG,EAAE,cAAc,CAAA;QACnB,GAAG,EAAE,cAAc,CAAA;KACpB,CAAA;IAED,gEAAgE;IAChE,iBAAiB,IAAI,IAAI,CAAA;IAEzB,uDAAuD;IACvD,eAAe,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAA;IAE9E,yCAAyC;IACzC,UAAU,CAAC,OAAO,EAAE;QAClB,MAAM,EAAE,MAAM,CAAA;QACd,GAAG,EAAE,MAAM,CAAA;QACX,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAChC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KACrB,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAE9E,sBAAsB;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,mBAAmB,CAAC,CAiI9B"}
|
package/dist/browser.js
CHANGED
package/dist/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface HttpRequest {
|
|
2
|
+
method: string;
|
|
3
|
+
url: string;
|
|
4
|
+
headers?: Record<string, string>;
|
|
5
|
+
body?: string | null;
|
|
6
|
+
}
|
|
7
|
+
export interface HttpResponse {
|
|
8
|
+
status: number;
|
|
9
|
+
headers: Record<string, string>;
|
|
10
|
+
body: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function handleDisabledBrowserAdminRequest(request: HttpRequest): HttpResponse | null;
|
|
13
|
+
//# sourceMappingURL=browser-admin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-admin.d.ts","sourceRoot":"","sources":["../../src/worker/browser-admin.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,IAAI,EAAE,MAAM,CAAA;CACb;AAiBD,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,WAAW,GACnB,YAAY,GAAG,IAAI,CAqBrB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
const ADMIN_HEADERS = {
|
|
2
|
+
'access-control-allow-origin': '*',
|
|
3
|
+
'access-control-allow-methods': 'GET, OPTIONS',
|
|
4
|
+
'access-control-allow-headers': '*',
|
|
5
|
+
'content-type': 'application/json',
|
|
6
|
+
};
|
|
7
|
+
function jsonResponse(status, body) {
|
|
8
|
+
return {
|
|
9
|
+
status,
|
|
10
|
+
headers: ADMIN_HEADERS,
|
|
11
|
+
body: JSON.stringify(body),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export function handleDisabledBrowserAdminRequest(request) {
|
|
15
|
+
const url = new URL(request.url, 'http://localhost');
|
|
16
|
+
if (!url.pathname.startsWith('/__orez/'))
|
|
17
|
+
return null;
|
|
18
|
+
const method = request.method.toUpperCase();
|
|
19
|
+
if (method === 'OPTIONS') {
|
|
20
|
+
return { status: 200, headers: ADMIN_HEADERS, body: '' };
|
|
21
|
+
}
|
|
22
|
+
if (method !== 'GET') {
|
|
23
|
+
return jsonResponse(405, { error: 'method not allowed', admin: 'disabled' });
|
|
24
|
+
}
|
|
25
|
+
if (url.pathname === '/__orez/api/logs') {
|
|
26
|
+
return jsonResponse(200, { entries: [], cursor: 0, admin: 'disabled' });
|
|
27
|
+
}
|
|
28
|
+
if (url.pathname === '/__orez/api/status') {
|
|
29
|
+
return jsonResponse(200, { ready: true, admin: 'disabled' });
|
|
30
|
+
}
|
|
31
|
+
return jsonResponse(404, { error: 'not found', admin: 'disabled' });
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=browser-admin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-admin.js","sourceRoot":"","sources":["../../src/worker/browser-admin.ts"],"names":[],"mappings":"AAaA,MAAM,aAAa,GAAG;IACpB,6BAA6B,EAAE,GAAG;IAClC,8BAA8B,EAAE,cAAc;IAC9C,8BAA8B,EAAE,GAAG;IACnC,cAAc,EAAE,kBAAkB;CACnC,CAAA;AAED,SAAS,YAAY,CAAC,MAAc,EAAE,IAAa;IACjD,OAAO;QACL,MAAM;QACN,OAAO,EAAE,aAAa;QACtB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAA;AACH,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,OAAoB;IAEpB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAA;IACpD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAA;IAErD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAA;IAC3C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;IAC1D,CAAC;IACD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,YAAY,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAA;IAC9E,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,KAAK,kBAAkB,EAAE,CAAC;QACxC,OAAO,YAAY,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAA;IACzE,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,KAAK,oBAAoB,EAAE,CAAC;QAC1C,OAAO,YAAY,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAA;IAC9D,CAAC;IAED,OAAO,YAAY,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAA;AACrE,CAAC"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import type { HttpRequest, HttpResponse } from './browser-admin.js';
|
|
1
2
|
import type { PGlite } from '@electric-sql/pglite';
|
|
3
|
+
export type { HttpRequest, HttpResponse } from './browser-admin.js';
|
|
2
4
|
export interface ZeroCacheEmbedBrowserOptions {
|
|
3
5
|
/** PGlite instance */
|
|
4
6
|
pglite: PGlite;
|
|
@@ -16,17 +18,16 @@ export interface ZeroCacheEmbedBrowserOptions {
|
|
|
16
18
|
env?: Record<string, string>;
|
|
17
19
|
/** timeout in ms waiting for zero-cache ready (default: 30000) */
|
|
18
20
|
readyTimeout?: number;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
body: string;
|
|
21
|
+
/**
|
|
22
|
+
* intercept browser-mode orez admin routes before they reach zero-cache.
|
|
23
|
+
*
|
|
24
|
+
* browser embeds do not run the node admin dashboard or log store. leaving
|
|
25
|
+
* `/__orez/*` to fall through to zero-cache makes disabled admin look like
|
|
26
|
+
* an app/zero route miss. keep the contract explicit by returning empty
|
|
27
|
+
* admin responses for the small read-only surface and 404 for the rest.
|
|
28
|
+
* default: true.
|
|
29
|
+
*/
|
|
30
|
+
disableAdminApi?: boolean;
|
|
30
31
|
}
|
|
31
32
|
/** WebSocket-like object — matches CF WebSocket, browser WebSocket, or MessagePort adapter */
|
|
32
33
|
interface WsLike {
|
|
@@ -54,5 +55,4 @@ export interface ZeroCacheEmbedBrowser {
|
|
|
54
55
|
stop(): Promise<void>;
|
|
55
56
|
}
|
|
56
57
|
export declare function startZeroCacheEmbedBrowser(opts: ZeroCacheEmbedBrowserOptions): Promise<ZeroCacheEmbedBrowser>;
|
|
57
|
-
export {};
|
|
58
58
|
//# sourceMappingURL=browser-embed.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-embed.d.ts","sourceRoot":"","sources":["../../src/worker/browser-embed.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"browser-embed.d.ts","sourceRoot":"","sources":["../../src/worker/browser-embed.ts"],"names":[],"mappings":"AAwCA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAElD,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAOnE,MAAM,WAAW,4BAA4B;IAC3C,sBAAsB;IACtB,MAAM,EAAE,MAAM,CAAA;IAEd;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAEhB,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd,wBAAwB;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IAEvB,+CAA+C;IAC/C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAE5B,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,8FAA8F;AAC9F,UAAU,MAAM;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,eAAe,GAAG,IAAI,CAAA;IACxD,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3C,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,CAAA;IACnE,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,CAAA;CACvE;AAED,MAAM,WAAW,qBAAqB;IACpC,kCAAkC;IAClC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IAEvB;;;;OAIG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAE/C;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;IAEvD,sBAAsB;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB;AAED,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,4BAA4B,GACjC,OAAO,CAAC,qBAAqB,CAAC,CAmOhC"}
|
|
@@ -32,11 +32,13 @@ import EventEmitter from 'node:events';
|
|
|
32
32
|
// static import so the bundler can follow the dependency tree.
|
|
33
33
|
// @ts-expect-error — internal zero-cache module, no type declarations
|
|
34
34
|
import { runWorker as _runWorker } from '@rocicorp/zero/out/zero-cache/src/server/runner/run-worker.js';
|
|
35
|
+
import { handleDisabledBrowserAdminRequest } from './browser-admin.js';
|
|
35
36
|
const runWorkerFn = _runWorker;
|
|
36
37
|
export async function startZeroCacheEmbedBrowser(opts) {
|
|
37
38
|
const appId = opts.appId || 'zero';
|
|
38
39
|
const publications = opts.publications?.join(',') || `orez_${appId}_public`;
|
|
39
40
|
const readyTimeout = opts.readyTimeout ?? 30000;
|
|
41
|
+
const disableAdminApi = opts.disableAdminApi ?? true;
|
|
40
42
|
// set up sqlite storage from sql.js or in-memory
|
|
41
43
|
if (opts.sqlite) {
|
|
42
44
|
// consumer provided a sql.js Database — create adapter
|
|
@@ -196,6 +198,11 @@ export async function startZeroCacheEmbedBrowser(opts) {
|
|
|
196
198
|
}
|
|
197
199
|
},
|
|
198
200
|
async handleHttp(request) {
|
|
201
|
+
if (disableAdminApi) {
|
|
202
|
+
const adminResponse = handleDisabledBrowserAdminRequest(request);
|
|
203
|
+
if (adminResponse)
|
|
204
|
+
return adminResponse;
|
|
205
|
+
}
|
|
199
206
|
if (!isReady || !fastifyInstance?.inject) {
|
|
200
207
|
return { status: 503, headers: {}, body: 'not ready' };
|
|
201
208
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-embed.js","sourceRoot":"","sources":["../../src/worker/browser-embed.ts"],"names":[],"mappings":"AAAA,yGAAyG;AACzG,sEAAsE;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,YAAY,MAAM,aAAa,CAAA;AAEtC,+DAA+D;AAC/D,sEAAsE;AACtE,OAAO,EAAE,SAAS,IAAI,UAAU,EAAE,MAAM,+DAA+D,CAAA;
|
|
1
|
+
{"version":3,"file":"browser-embed.js","sourceRoot":"","sources":["../../src/worker/browser-embed.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "orez",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.24",
|
|
4
4
|
"description": "PGlite-powered zero-sync development backend. No Docker required.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
"dependencies": {
|
|
80
80
|
"@electric-sql/pglite": "0.4.1",
|
|
81
81
|
"@electric-sql/pglite-tools": "^0.3.1",
|
|
82
|
-
"bedrock-sqlite": "0.2.
|
|
82
|
+
"bedrock-sqlite": "0.2.24",
|
|
83
83
|
"citty": "^0.2.0",
|
|
84
84
|
"pg-gateway": "0.3.0-beta.4",
|
|
85
85
|
"pgsql-parser": "^17.9.11",
|
package/src/browser.ts
CHANGED
|
@@ -35,6 +35,12 @@ export interface OrezBrowserConfig {
|
|
|
35
35
|
|
|
36
36
|
/** log level */
|
|
37
37
|
logLevel?: string
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* intercept browser-mode orez admin routes before they reach zero-cache.
|
|
41
|
+
* default: true.
|
|
42
|
+
*/
|
|
43
|
+
disableAdminApi?: boolean
|
|
38
44
|
}
|
|
39
45
|
|
|
40
46
|
export interface OrezBrowserInstance {
|
|
@@ -157,6 +163,7 @@ export async function startOrezBrowser(
|
|
|
157
163
|
pglite: pgPostgres as unknown as PGlite,
|
|
158
164
|
appId,
|
|
159
165
|
publications: config.publications,
|
|
166
|
+
disableAdminApi: config.disableAdminApi ?? true,
|
|
160
167
|
env: {
|
|
161
168
|
ZERO_LOG_LEVEL: config.logLevel || 'info',
|
|
162
169
|
},
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export interface HttpRequest {
|
|
2
|
+
method: string
|
|
3
|
+
url: string
|
|
4
|
+
headers?: Record<string, string>
|
|
5
|
+
body?: string | null
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface HttpResponse {
|
|
9
|
+
status: number
|
|
10
|
+
headers: Record<string, string>
|
|
11
|
+
body: string
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const ADMIN_HEADERS = {
|
|
15
|
+
'access-control-allow-origin': '*',
|
|
16
|
+
'access-control-allow-methods': 'GET, OPTIONS',
|
|
17
|
+
'access-control-allow-headers': '*',
|
|
18
|
+
'content-type': 'application/json',
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function jsonResponse(status: number, body: unknown): HttpResponse {
|
|
22
|
+
return {
|
|
23
|
+
status,
|
|
24
|
+
headers: ADMIN_HEADERS,
|
|
25
|
+
body: JSON.stringify(body),
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function handleDisabledBrowserAdminRequest(
|
|
30
|
+
request: HttpRequest
|
|
31
|
+
): HttpResponse | null {
|
|
32
|
+
const url = new URL(request.url, 'http://localhost')
|
|
33
|
+
if (!url.pathname.startsWith('/__orez/')) return null
|
|
34
|
+
|
|
35
|
+
const method = request.method.toUpperCase()
|
|
36
|
+
if (method === 'OPTIONS') {
|
|
37
|
+
return { status: 200, headers: ADMIN_HEADERS, body: '' }
|
|
38
|
+
}
|
|
39
|
+
if (method !== 'GET') {
|
|
40
|
+
return jsonResponse(405, { error: 'method not allowed', admin: 'disabled' })
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (url.pathname === '/__orez/api/logs') {
|
|
44
|
+
return jsonResponse(200, { entries: [], cursor: 0, admin: 'disabled' })
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (url.pathname === '/__orez/api/status') {
|
|
48
|
+
return jsonResponse(200, { ready: true, admin: 'disabled' })
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return jsonResponse(404, { error: 'not found', admin: 'disabled' })
|
|
52
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import { handleDisabledBrowserAdminRequest } from './browser-admin.js'
|
|
4
|
+
|
|
5
|
+
describe('disabled browser admin api', () => {
|
|
6
|
+
it('ignores non-admin routes', () => {
|
|
7
|
+
expect(
|
|
8
|
+
handleDisabledBrowserAdminRequest({
|
|
9
|
+
method: 'GET',
|
|
10
|
+
url: '/sync/v1/connect',
|
|
11
|
+
})
|
|
12
|
+
).toBeNull()
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
it('serves empty logs for disabled browser admin', () => {
|
|
16
|
+
const response = handleDisabledBrowserAdminRequest({
|
|
17
|
+
method: 'GET',
|
|
18
|
+
url: '/__orez/api/logs?limit=100',
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
expect(response?.status).toBe(200)
|
|
22
|
+
expect(response?.headers['content-type']).toBe('application/json')
|
|
23
|
+
expect(JSON.parse(response?.body ?? '')).toEqual({
|
|
24
|
+
entries: [],
|
|
25
|
+
cursor: 0,
|
|
26
|
+
admin: 'disabled',
|
|
27
|
+
})
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
it('serves status for disabled browser admin', () => {
|
|
31
|
+
const response = handleDisabledBrowserAdminRequest({
|
|
32
|
+
method: 'GET',
|
|
33
|
+
url: 'http://localhost:7849/__orez/api/status',
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
expect(response?.status).toBe(200)
|
|
37
|
+
expect(JSON.parse(response?.body ?? '')).toEqual({
|
|
38
|
+
ready: true,
|
|
39
|
+
admin: 'disabled',
|
|
40
|
+
})
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
it('handles preflight and disallows writes', () => {
|
|
44
|
+
expect(
|
|
45
|
+
handleDisabledBrowserAdminRequest({
|
|
46
|
+
method: 'OPTIONS',
|
|
47
|
+
url: '/__orez/api/logs',
|
|
48
|
+
})?.status
|
|
49
|
+
).toBe(200)
|
|
50
|
+
|
|
51
|
+
const response = handleDisabledBrowserAdminRequest({
|
|
52
|
+
method: 'POST',
|
|
53
|
+
url: '/__orez/api/actions/restart-zero',
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
expect(response?.status).toBe(405)
|
|
57
|
+
expect(JSON.parse(response?.body ?? '')).toEqual({
|
|
58
|
+
error: 'method not allowed',
|
|
59
|
+
admin: 'disabled',
|
|
60
|
+
})
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
it('keeps unknown admin routes explicit', () => {
|
|
64
|
+
const response = handleDisabledBrowserAdminRequest({
|
|
65
|
+
method: 'GET',
|
|
66
|
+
url: '/__orez/api/actions/restart-zero',
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
expect(response?.status).toBe(404)
|
|
70
|
+
expect(JSON.parse(response?.body ?? '')).toEqual({
|
|
71
|
+
error: 'not found',
|
|
72
|
+
admin: 'disabled',
|
|
73
|
+
})
|
|
74
|
+
})
|
|
75
|
+
})
|
|
@@ -36,8 +36,13 @@ import EventEmitter from 'node:events'
|
|
|
36
36
|
// @ts-expect-error — internal zero-cache module, no type declarations
|
|
37
37
|
import { runWorker as _runWorker } from '@rocicorp/zero/out/zero-cache/src/server/runner/run-worker.js'
|
|
38
38
|
|
|
39
|
+
import { handleDisabledBrowserAdminRequest } from './browser-admin.js'
|
|
40
|
+
|
|
41
|
+
import type { HttpRequest, HttpResponse } from './browser-admin.js'
|
|
39
42
|
import type { PGlite } from '@electric-sql/pglite'
|
|
40
43
|
|
|
44
|
+
export type { HttpRequest, HttpResponse } from './browser-admin.js'
|
|
45
|
+
|
|
41
46
|
const runWorkerFn = _runWorker as (
|
|
42
47
|
parent: unknown,
|
|
43
48
|
env: Record<string, string>
|
|
@@ -65,19 +70,17 @@ export interface ZeroCacheEmbedBrowserOptions {
|
|
|
65
70
|
|
|
66
71
|
/** timeout in ms waiting for zero-cache ready (default: 30000) */
|
|
67
72
|
readyTimeout?: number
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export interface HttpRequest {
|
|
71
|
-
method: string
|
|
72
|
-
url: string
|
|
73
|
-
headers?: Record<string, string>
|
|
74
|
-
body?: string | null
|
|
75
|
-
}
|
|
76
73
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
74
|
+
/**
|
|
75
|
+
* intercept browser-mode orez admin routes before they reach zero-cache.
|
|
76
|
+
*
|
|
77
|
+
* browser embeds do not run the node admin dashboard or log store. leaving
|
|
78
|
+
* `/__orez/*` to fall through to zero-cache makes disabled admin look like
|
|
79
|
+
* an app/zero route miss. keep the contract explicit by returning empty
|
|
80
|
+
* admin responses for the small read-only surface and 404 for the rest.
|
|
81
|
+
* default: true.
|
|
82
|
+
*/
|
|
83
|
+
disableAdminApi?: boolean
|
|
81
84
|
}
|
|
82
85
|
|
|
83
86
|
/** WebSocket-like object — matches CF WebSocket, browser WebSocket, or MessagePort adapter */
|
|
@@ -116,6 +119,7 @@ export async function startZeroCacheEmbedBrowser(
|
|
|
116
119
|
const appId = opts.appId || 'zero'
|
|
117
120
|
const publications = opts.publications?.join(',') || `orez_${appId}_public`
|
|
118
121
|
const readyTimeout = opts.readyTimeout ?? 30000
|
|
122
|
+
const disableAdminApi = opts.disableAdminApi ?? true
|
|
119
123
|
|
|
120
124
|
// set up sqlite storage from sql.js or in-memory
|
|
121
125
|
if (opts.sqlite) {
|
|
@@ -303,6 +307,11 @@ export async function startZeroCacheEmbedBrowser(
|
|
|
303
307
|
},
|
|
304
308
|
|
|
305
309
|
async handleHttp(request: HttpRequest): Promise<HttpResponse> {
|
|
310
|
+
if (disableAdminApi) {
|
|
311
|
+
const adminResponse = handleDisabledBrowserAdminRequest(request)
|
|
312
|
+
if (adminResponse) return adminResponse
|
|
313
|
+
}
|
|
314
|
+
|
|
306
315
|
if (!isReady || !fastifyInstance?.inject) {
|
|
307
316
|
return { status: 503, headers: {}, body: 'not ready' }
|
|
308
317
|
}
|