orez 0.2.25 → 0.2.26

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 (117) hide show
  1. package/dist/cf-do/watermark.d.ts +21 -0
  2. package/dist/cf-do/watermark.d.ts.map +1 -0
  3. package/dist/cf-do/watermark.js +93 -0
  4. package/dist/cf-do/watermark.js.map +1 -0
  5. package/dist/cf-do/worker.d.ts +48 -22
  6. package/dist/cf-do/worker.d.ts.map +1 -1
  7. package/dist/cf-do/worker.js +642 -269
  8. package/dist/cf-do/worker.js.map +1 -1
  9. package/dist/config.js +1 -1
  10. package/dist/config.js.map +1 -1
  11. package/dist/do-sql-tracking.d.ts +6 -0
  12. package/dist/do-sql-tracking.d.ts.map +1 -0
  13. package/dist/do-sql-tracking.js +14 -0
  14. package/dist/do-sql-tracking.js.map +1 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +28 -14
  17. package/dist/index.js.map +1 -1
  18. package/dist/pg-proxy-browser.js +6 -6
  19. package/dist/pg-proxy-browser.js.map +1 -1
  20. package/dist/pg-proxy-do-backend.d.ts +96 -17
  21. package/dist/pg-proxy-do-backend.d.ts.map +1 -1
  22. package/dist/pg-proxy-do-backend.js +6033 -454
  23. package/dist/pg-proxy-do-backend.js.map +1 -1
  24. package/dist/replication/change-tracker.d.ts.map +1 -1
  25. package/dist/replication/change-tracker.js +18 -1
  26. package/dist/replication/change-tracker.js.map +1 -1
  27. package/dist/replication/handler.d.ts.map +1 -1
  28. package/dist/replication/handler.js +7 -2
  29. package/dist/replication/handler.js.map +1 -1
  30. package/dist/replication/pgoutput-encoder.d.ts.map +1 -1
  31. package/dist/replication/pgoutput-encoder.js +72 -30
  32. package/dist/replication/pgoutput-encoder.js.map +1 -1
  33. package/dist/worker/browser-build-config.d.ts.map +1 -1
  34. package/dist/worker/browser-build-config.js +2 -1
  35. package/dist/worker/browser-build-config.js.map +1 -1
  36. package/dist/worker/cf-patches.d.ts +5 -2
  37. package/dist/worker/cf-patches.d.ts.map +1 -1
  38. package/dist/worker/cf-patches.js +238 -4
  39. package/dist/worker/cf-patches.js.map +1 -1
  40. package/dist/worker/shims/node-stub.d.ts +35 -0
  41. package/dist/worker/shims/node-stub.d.ts.map +1 -1
  42. package/dist/worker/shims/node-stub.js +53 -1
  43. package/dist/worker/shims/node-stub.js.map +1 -1
  44. package/dist/worker/shims/oxfmt.d.ts +4 -0
  45. package/dist/worker/shims/oxfmt.d.ts.map +1 -0
  46. package/dist/worker/shims/oxfmt.js +4 -0
  47. package/dist/worker/shims/oxfmt.js.map +1 -0
  48. package/dist/worker/shims/postgres-socket.js +1 -1
  49. package/dist/worker/shims/postgres-socket.js.map +1 -1
  50. package/dist/worker/shims/sqlite.d.ts +1 -0
  51. package/dist/worker/shims/sqlite.d.ts.map +1 -1
  52. package/dist/worker/shims/sqlite.js +229 -9
  53. package/dist/worker/shims/sqlite.js.map +1 -1
  54. package/dist/worker/shims/ws.d.ts.map +1 -1
  55. package/dist/worker/shims/ws.js +45 -0
  56. package/dist/worker/shims/ws.js.map +1 -1
  57. package/dist/worker/shims/zero-process-env.d.ts +2 -0
  58. package/dist/worker/shims/zero-process-env.d.ts.map +1 -0
  59. package/dist/worker/shims/zero-process-env.js +9 -0
  60. package/dist/worker/shims/zero-process-env.js.map +1 -0
  61. package/dist/worker/zero-cache-embed-cf.d.ts +29 -12
  62. package/dist/worker/zero-cache-embed-cf.d.ts.map +1 -1
  63. package/dist/worker/zero-cache-embed-cf.js +83 -14
  64. package/dist/worker/zero-cache-embed-cf.js.map +1 -1
  65. package/package.json +6 -2
  66. package/src/cf-do/.wrangler/cache/cf.json +1 -0
  67. package/src/cf-do/.wrangler/state/v3/cache/miniflare-CacheObject/metadata.sqlite +0 -0
  68. package/src/cf-do/.wrangler/state/v3/cache/miniflare-CacheObject/metadata.sqlite-shm +0 -0
  69. package/src/cf-do/.wrangler/state/v3/cache/miniflare-CacheObject/metadata.sqlite-wal +0 -0
  70. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/0f0f3bdf0abda097eb6f1246db4657d9fc622081362d894d82c1a1ce067b05b6.sqlite +0 -0
  71. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/1ddd3a4a48a11b51658444f5458a1fb175194b1d5b6a5bda20ef3fe3205b900c.sqlite +0 -0
  72. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/204a39120310d37e972c5914cfd71ad55c151bdb9e8ed289a5f8c5b052dd60e4.sqlite +0 -0
  73. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/3835f242df9728adba3d127a238793fd054ed3e51df3f60749ee744c469bf2a2.sqlite +0 -0
  74. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/4aa9c80eb716cf55b8995ccf7afab0b36c683e6da07d7c37a3f9c570136036df.sqlite +0 -0
  75. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/533e2fd1d6ea46e7a9a0017916ef341802d438d72583462755f2c1f8225e9bf2.sqlite +0 -0
  76. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/5ffa1aced1225ecaeac6366f7586aa3de92761cdff8711d81fbd81f248076abd.sqlite +0 -0
  77. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/686c3a9f0d7e59ed2ab607efd4b76d779c97cafeb3818380033bf7c7eb86c819.sqlite +0 -0
  78. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/6e8214e8dcfadd0deb52d64e5e9ca85c6b329ace11193909845995396914c473.sqlite +0 -0
  79. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/78d9ec9ff873d3fe3507ff53c2a6f6dfc408b4268eb0db3f2a146c0678965366.sqlite +0 -0
  80. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/7eff9f0ed7e27ad0d3f9d923de0682fab1928591172c1ba336c5f79a134a5d85.sqlite +0 -0
  81. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/836cda5b995b25867d722ed4f4c2292167e80351a3c6038db626648eb247dd8b.sqlite +0 -0
  82. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/91ef63b112209ab30172763acd8a0935106c248f7f1bcae5545ce37a9f201551.sqlite +0 -0
  83. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/a66ea4293a5f5938bc6d116edfa2522bb85bc37aea3541fbc09c3b613b9b32c0.sqlite +0 -0
  84. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/ceb2ab26b80590840b65651deb6e948d3bf81565c6751f3a58752cf4bf4aecae.sqlite +0 -0
  85. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/metadata.sqlite +0 -0
  86. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/metadata.sqlite-shm +0 -0
  87. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/metadata.sqlite-wal +0 -0
  88. package/src/cf-do/ARCHITECTURE.md +83 -0
  89. package/src/cf-do/watermark.test.ts +103 -0
  90. package/src/cf-do/watermark.ts +118 -0
  91. package/src/cf-do/worker.ts +1033 -0
  92. package/src/cf-do/wrangler.toml +11 -0
  93. package/src/config.ts +1 -1
  94. package/src/do-sql-tracking.test.ts +19 -0
  95. package/src/do-sql-tracking.ts +19 -0
  96. package/src/index.ts +29 -14
  97. package/src/pg-proxy-browser.ts +6 -6
  98. package/src/pg-proxy-do-backend.test.ts +3890 -0
  99. package/src/pg-proxy-do-backend.ts +6799 -482
  100. package/src/replication/change-tracker.ts +16 -1
  101. package/src/replication/handler.test.ts +35 -0
  102. package/src/replication/handler.ts +7 -2
  103. package/src/replication/pgoutput-encoder.test.ts +71 -2
  104. package/src/replication/pgoutput-encoder.ts +65 -30
  105. package/src/worker/browser-build-config.test.ts +12 -0
  106. package/src/worker/browser-build-config.ts +2 -1
  107. package/src/worker/cf-patches.ts +274 -4
  108. package/src/worker/shims/node-stub.ts +53 -1
  109. package/src/worker/shims/oxfmt.ts +3 -0
  110. package/src/worker/shims/postgres-socket.ts +1 -1
  111. package/src/worker/shims/sqlite.test.ts +145 -0
  112. package/src/worker/shims/sqlite.ts +256 -9
  113. package/src/worker/shims/ws.ts +45 -0
  114. package/src/worker/shims/zero-process-env.ts +11 -0
  115. package/src/worker/zero-cache-embed-cf.ts +114 -18
  116. package/src/query-rewrites.test.ts +0 -30
  117. package/src/query-rewrites.ts +0 -152
@@ -4,39 +4,57 @@
4
4
  * runs zero-cache in-process with SINGLE_PROCESS=1, using bundler aliases
5
5
  * to swap Node.js dependencies for CF-compatible shims:
6
6
  *
7
- * postgres → orez/worker/shims/postgres (PGlite-backed)
7
+ * postgres → orez/worker/shims/postgres-browser
8
+ * (real postgres package over MessagePort)
8
9
  * @rocicorp/zero-sqlite3 → orez/worker/shims/sqlite (DO SQLite)
9
10
  * fastify → orez/worker/shims/fastify (route capture)
10
11
  * ws → orez/worker/shims/ws (CF WebSocket)
11
12
  *
12
- * the consumer's wrangler.toml must configure these aliases and enable
13
- * nodejs_compat for the remaining Node.js APIs (events, stream, etc.).
13
+ * the postgres MessagePort proxy is backed by DoBackend, so zero-cache still
14
+ * uses its real PG wire protocol, but storage is Cloudflare DO SQLite instead
15
+ * of PGlite.
14
16
  *
15
17
  * usage in a Durable Object:
16
18
  *
17
19
  * import { startZeroCacheEmbedCF } from 'orez/worker'
18
20
  *
19
21
  * // in ensureInitialized():
20
- * globalThis.__orez_pglite = pglite // for postgres shim
21
- * globalThis.__orez_do_sqlite = ctx.storage.sql // for sqlite shim
22
- *
23
22
  * const zc = await startZeroCacheEmbedCF({ ... })
24
23
  *
25
24
  * // in DO fetch():
26
25
  * return zc.handleRequest(request)
27
26
  */
28
- import type { PGlite } from '@electric-sql/pglite';
27
+ import './shims/zero-process-env.js';
28
+ import { DoBackend } from '../pg-proxy-do-backend.js';
29
29
  export interface ZeroCacheEmbedCFOptions {
30
- /** PGlite instance (also registered on globalThis.__orez_pglite) */
31
- pglite: PGlite;
32
30
  /** DO SQLite storage (also registered on globalThis.__orez_do_sqlite) */
33
31
  doSqlite: unknown;
32
+ /**
33
+ * base URL for the DO SQL execution endpoints (`/exec`, `/batch`).
34
+ * ignored when `backends` is supplied.
35
+ */
36
+ backendUrl?: string;
37
+ /** custom fetch used by DoBackend; lets a DO route directly to another DO stub. */
38
+ backendFetch?: typeof fetch;
39
+ /** namespace sent to the DO SQL endpoints. */
40
+ backendNamespace?: string;
41
+ /** pre-created DoBackend instances. mainly useful for tests. */
42
+ backends?: {
43
+ postgres: DoBackend;
44
+ cvr: DoBackend;
45
+ cdb: DoBackend;
46
+ };
47
+ /** postgres username/password expected by the in-process proxy. */
48
+ pgUser?: string;
49
+ pgPassword?: string;
34
50
  /** zero app ID (default: 'zero') */
35
51
  appId?: string;
36
52
  /** publication names */
37
53
  publications?: string[];
38
54
  /** additional env vars passed to zero-cache */
39
55
  env?: Record<string, string>;
56
+ /** fetch implementation for Worker-local mutate/query API URLs. */
57
+ apiFetch?: typeof fetch;
40
58
  /** timeout in ms waiting for zero-cache ready (default: 30000) */
41
59
  readyTimeout?: number;
42
60
  }
@@ -55,9 +73,8 @@ export interface ZeroCacheEmbedCF {
55
73
  /**
56
74
  * start zero-cache in embedded CF Workers mode.
57
75
  *
58
- * must be called AFTER setting up globalThis:
59
- * globalThis.__orez_pglite = pgliteInstance
60
- * globalThis.__orez_do_sqlite = ctx.storage.sql
76
+ * must be called with a DO SQLite handle for zero-cache's replica storage and
77
+ * a DoBackend target for upstream/CVR/change Postgres connections.
61
78
  */
62
79
  export declare function startZeroCacheEmbedCF(opts: ZeroCacheEmbedCFOptions): Promise<ZeroCacheEmbedCF>;
63
80
  //# sourceMappingURL=zero-cache-embed-cf.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"zero-cache-embed-cf.d.ts","sourceRoot":"","sources":["../../src/worker/zero-cache-embed-cf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AASH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAOlD,MAAM,WAAW,uBAAuB;IACtC,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAA;IAEd,yEAAyE;IACzE,QAAQ,EAAE,OAAO,CAAA;IAEjB,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;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,kCAAkC;IAClC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IAEvB;;;;OAIG;IACH,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAElD,sBAAsB;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAwL3B"}
1
+ {"version":3,"file":"zero-cache-embed-cf.d.ts","sourceRoot":"","sources":["../../src/worker/zero-cache-embed-cf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,6BAA6B,CAAA;AAUpC,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAOrD,MAAM,WAAW,uBAAuB;IACtC,yEAAyE;IACzE,QAAQ,EAAE,OAAO,CAAA;IAEjB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB,mFAAmF;IACnF,YAAY,CAAC,EAAE,OAAO,KAAK,CAAA;IAE3B,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAEzB,gEAAgE;IAChE,QAAQ,CAAC,EAAE;QACT,QAAQ,EAAE,SAAS,CAAA;QACnB,GAAG,EAAE,SAAS,CAAA;QACd,GAAG,EAAE,SAAS,CAAA;KACf,CAAA;IAED,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB,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,mEAAmE;IACnE,QAAQ,CAAC,EAAE,OAAO,KAAK,CAAA;IAEvB,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,kCAAkC;IAClC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IAEvB;;;;OAIG;IACH,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAElD,sBAAsB;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAgQ3B"}
@@ -4,46 +4,83 @@
4
4
  * runs zero-cache in-process with SINGLE_PROCESS=1, using bundler aliases
5
5
  * to swap Node.js dependencies for CF-compatible shims:
6
6
  *
7
- * postgres → orez/worker/shims/postgres (PGlite-backed)
7
+ * postgres → orez/worker/shims/postgres-browser
8
+ * (real postgres package over MessagePort)
8
9
  * @rocicorp/zero-sqlite3 → orez/worker/shims/sqlite (DO SQLite)
9
10
  * fastify → orez/worker/shims/fastify (route capture)
10
11
  * ws → orez/worker/shims/ws (CF WebSocket)
11
12
  *
12
- * the consumer's wrangler.toml must configure these aliases and enable
13
- * nodejs_compat for the remaining Node.js APIs (events, stream, etc.).
13
+ * the postgres MessagePort proxy is backed by DoBackend, so zero-cache still
14
+ * uses its real PG wire protocol, but storage is Cloudflare DO SQLite instead
15
+ * of PGlite.
14
16
  *
15
17
  * usage in a Durable Object:
16
18
  *
17
19
  * import { startZeroCacheEmbedCF } from 'orez/worker'
18
20
  *
19
21
  * // in ensureInitialized():
20
- * globalThis.__orez_pglite = pglite // for postgres shim
21
- * globalThis.__orez_do_sqlite = ctx.storage.sql // for sqlite shim
22
- *
23
22
  * const zc = await startZeroCacheEmbedCF({ ... })
24
23
  *
25
24
  * // in DO fetch():
26
25
  * return zc.handleRequest(request)
27
26
  */
27
+ import './shims/zero-process-env.js';
28
28
  import EventEmitter from 'node:events';
29
29
  // static import so wrangler can follow the dependency tree and bundle
30
30
  // zero-cache with all its transitive deps + our shim aliases.
31
31
  // @ts-expect-error — internal zero-cache module, no type declarations
32
32
  import { runWorker as _runWorker } from '@rocicorp/zero/out/zero-cache/src/server/runner/run-worker.js';
33
+ import { createBrowserProxy } from '../pg-proxy-browser.js';
34
+ import { DoBackend } from '../pg-proxy-do-backend.js';
33
35
  const runWorkerFn = _runWorker;
34
36
  /**
35
37
  * start zero-cache in embedded CF Workers mode.
36
38
  *
37
- * must be called AFTER setting up globalThis:
38
- * globalThis.__orez_pglite = pgliteInstance
39
- * globalThis.__orez_do_sqlite = ctx.storage.sql
39
+ * must be called with a DO SQLite handle for zero-cache's replica storage and
40
+ * a DoBackend target for upstream/CVR/change Postgres connections.
40
41
  */
41
42
  export async function startZeroCacheEmbedCF(opts) {
42
43
  const appId = opts.appId || 'zero';
43
44
  const publications = opts.publications?.join(',') || `orez_${appId}_public`;
44
45
  const readyTimeout = opts.readyTimeout ?? 30000;
45
- globalThis.__orez_pglite = opts.pglite;
46
+ const pgUser = opts.pgUser || 'user';
47
+ const pgPassword = opts.pgPassword || '';
48
+ const backendUrl = opts.backendUrl || 'https://orez-do-backend.local';
49
+ const backendNamespace = opts.backendNamespace || appId;
50
+ const backends = opts.backends ??
51
+ {
52
+ postgres: new DoBackend(backendUrl, 'postgres', backendNamespace, {
53
+ fetch: opts.backendFetch,
54
+ }),
55
+ cvr: new DoBackend(backendUrl, 'zero_cvr', backendNamespace, {
56
+ fetch: opts.backendFetch,
57
+ }),
58
+ cdb: new DoBackend(backendUrl, 'zero_cdb', backendNamespace, {
59
+ fetch: opts.backendFetch,
60
+ }),
61
+ };
62
+ await Promise.all([
63
+ backends.postgres.waitReady,
64
+ backends.cvr.waitReady,
65
+ backends.cdb.waitReady,
66
+ ]);
67
+ const proxy = await createBrowserProxy({
68
+ postgres: backends.postgres,
69
+ cvr: backends.cvr,
70
+ cdb: backends.cdb,
71
+ postgresReplicas: [],
72
+ }, {
73
+ pgUser,
74
+ pgPassword,
75
+ singleDb: false,
76
+ logLevel: opts.env?.ZERO_LOG_LEVEL || 'info',
77
+ });
46
78
  globalThis.__orez_do_sqlite = opts.doSqlite;
79
+ globalThis.__orez_proxy_connect = (port) => {
80
+ proxy.handleConnection(port);
81
+ };
82
+ globalThis.__orez_proxy_user = pgUser;
83
+ globalThis.__orez_proxy_password = pgPassword;
47
84
  globalThis.process ??= {};
48
85
  globalThis.process.env ??= {};
49
86
  globalThis.process.pid ??= 1;
@@ -67,29 +104,44 @@ export async function startZeroCacheEmbedCF(opts) {
67
104
  const origExit = globalThis.process.exit;
68
105
  const origNodeEnv = globalThis.process.env.NODE_ENV;
69
106
  const origKill = globalThis.process.kill;
107
+ const origFetch = globalThis.fetch;
70
108
  globalThis.process.exit = (code) => {
71
109
  parent.emit('exit', code ?? 0);
72
110
  };
111
+ if (opts.apiFetch) {
112
+ ;
113
+ globalThis.fetch = (input, init) => {
114
+ const request = new Request(input, init);
115
+ const url = new URL(request.url);
116
+ if (url.hostname === 'orez-zero-api.local')
117
+ return opts.apiFetch(request);
118
+ return origFetch(input, init);
119
+ };
120
+ }
73
121
  // build env for zero-cache
74
122
  const env = {
75
123
  ...globalThis.process.env,
76
124
  SINGLE_PROCESS: '1',
77
125
  NODE_ENV: 'development',
78
- // these connection strings are intercepted by the postgres shim
79
- ZERO_UPSTREAM_DB: 'pglite://in-process',
80
- ZERO_CVR_DB: 'pglite://in-process',
81
- ZERO_CHANGE_DB: 'pglite://in-process',
126
+ // postgres-browser intercepts these URLs and routes PG wire over
127
+ // MessagePort to the DoBackend-backed proxy above.
128
+ ZERO_UPSTREAM_DB: `postgres://${pgUser}:ignored@127.0.0.1/postgres`,
129
+ ZERO_CVR_DB: `postgres://${pgUser}:ignored@127.0.0.1/zero_cvr`,
130
+ ZERO_CHANGE_DB: `postgres://${pgUser}:ignored@127.0.0.1/zero_cdb`,
82
131
  // this path is intercepted by the sqlite shim
83
132
  ZERO_REPLICA_FILE: ':do-sqlite:',
84
133
  // don't bind a port — we route via inject/handoff
85
134
  ZERO_PORT: '0',
86
135
  ZERO_APP_ID: appId,
87
136
  ZERO_APP_PUBLICATIONS: publications,
137
+ ZERO_ADMIN_PASSWORD: opts.env?.ZERO_ADMIN_PASSWORD || crypto.randomUUID(),
88
138
  ZERO_LOG_LEVEL: opts.env?.ZERO_LOG_LEVEL || 'info',
89
139
  ZERO_NUM_SYNC_WORKERS: opts.env?.ZERO_NUM_SYNC_WORKERS || '1',
90
140
  ZERO_ENABLE_QUERY_PLANNER: 'false',
91
141
  ...opts.env,
92
142
  };
143
+ Object.assign(globalThis.process.env, env);
144
+ const debugEmbed = env.OREZ_DEBUG_EMBED === '1' || globalThis.__OREZ_DEBUG_EMBED__ === true;
93
145
  // wrap parent with onMessageType/onceMessageType helpers
94
146
  // must forward sendHandle (second arg) for WebSocket handoff
95
147
  const wrappedParent = new Proxy(parent, {
@@ -131,6 +183,8 @@ export async function startZeroCacheEmbedCF(opts) {
131
183
  reject(new Error(`zero-cache CF embed: timed out waiting for ready after ${readyTimeout}ms`));
132
184
  }, readyTimeout);
133
185
  parentEmitter.on('message', (msg) => {
186
+ if (debugEmbed)
187
+ console.debug('[orez-zero-cache-cf] parent message', msg);
134
188
  if (Array.isArray(msg) && msg[0] === 'ready') {
135
189
  clearTimeout(timeout);
136
190
  isReady = true;
@@ -140,6 +194,8 @@ export async function startZeroCacheEmbedCF(opts) {
140
194
  });
141
195
  // start zero-cache
142
196
  runWorkerPromise = runWorkerFn(wrappedParent, env).catch((err) => {
197
+ if (debugEmbed)
198
+ console.error('[orez-zero-cache-cf] runWorker error', err);
143
199
  if (!isReady) {
144
200
  throw err;
145
201
  }
@@ -172,6 +228,12 @@ export async function startZeroCacheEmbedCF(opts) {
172
228
  await Promise.race([runWorkerPromise, new Promise((r) => setTimeout(r, 5000))]);
173
229
  }
174
230
  await new Promise((r) => setTimeout(r, 200));
231
+ proxy.close();
232
+ await Promise.all([
233
+ backends.postgres.close(),
234
+ backends.cvr.close(),
235
+ backends.cdb.close(),
236
+ ]);
175
237
  // restore all modified globals
176
238
  if (origExit) {
177
239
  ;
@@ -185,7 +247,14 @@ export async function startZeroCacheEmbedCF(opts) {
185
247
  ;
186
248
  globalThis.process.kill = origKill;
187
249
  }
250
+ if (opts.apiFetch) {
251
+ ;
252
+ globalThis.fetch = origFetch;
253
+ }
188
254
  delete globalThis.process.env.SINGLE_PROCESS;
255
+ delete globalThis.__orez_proxy_connect;
256
+ delete globalThis.__orez_proxy_user;
257
+ delete globalThis.__orez_proxy_password;
189
258
  },
190
259
  };
191
260
  }
@@ -1 +1 @@
1
- {"version":3,"file":"zero-cache-embed-cf.js","sourceRoot":"","sources":["../../src/worker/zero-cache-embed-cf.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"zero-cache-embed-cf.js","sourceRoot":"","sources":["../../src/worker/zero-cache-embed-cf.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.25",
3
+ "version": "0.2.26",
4
4
  "description": "PGlite-powered zero-sync development backend. No Docker required.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -34,6 +34,10 @@
34
34
  "./worker/shims/*": {
35
35
  "types": "./dist/worker/shims/*.d.ts",
36
36
  "import": "./dist/worker/shims/*.js"
37
+ },
38
+ "./cf-do": {
39
+ "types": "./dist/cf-do/worker.d.ts",
40
+ "import": "./dist/cf-do/worker.js"
37
41
  }
38
42
  },
39
43
  "bin": {
@@ -79,7 +83,7 @@
79
83
  "dependencies": {
80
84
  "@electric-sql/pglite": "0.4.1",
81
85
  "@electric-sql/pglite-tools": "^0.3.1",
82
- "bedrock-sqlite": "0.2.25",
86
+ "bedrock-sqlite": "0.2.26",
83
87
  "citty": "^0.2.0",
84
88
  "pg-gateway": "0.3.0-beta.4",
85
89
  "pgsql-parser": "^17.9.11",
@@ -0,0 +1 @@
1
+ {"httpProtocol":"HTTP/1.1","clientAcceptEncoding":"gzip, deflate, br","requestPriority":"","edgeRequestKeepAliveStatus":1,"requestHeaderNames":{},"clientTcpRtt":74,"clientQuicRtt":0,"colo":"LAX","asn":21928,"asOrganization":"T-Mobile USA, Inc.","country":"US","isEUCountry":false,"city":"Honolulu","continent":"NA","region":"Hawaii","regionCode":"HI","timezone":"Pacific/Honolulu","longitude":"-157.85833","latitude":"21.30694","postalCode":"96802","metroCode":"744","tlsVersion":"TLSv1.3","tlsCipher":"AEAD-AES256-GCM-SHA384","tlsClientRandom":"8lAacoE+Gg3H5AKn8BQNpAGr3fgr0OV1txs9E+GEKXk=","tlsClientCiphersSha1":"JZtiTn8H/ntxORk+XXvU2EvNoz8=","tlsClientExtensionsSha1":"Y7DIC8A6G0/aXviZ8ie/xDbJb7g=","tlsClientExtensionsSha1Le":"6e+q3vPm88rSgMTN/h7WTTxQ2wQ=","tlsExportedAuthenticator":{"clientHandshake":"88b6a0bf9d7b4c6bc26b9f11255fe3f55b2bae485c86026892687913505e6a337a54221c8ec52b88741035fde8e80b91","serverHandshake":"a611a55711347da40c0167874992b47d75a4de9ed1c0bc731dd1f80051efde3b73a8baff4e484f30b284d662cd503dcb","clientFinished":"81b77db43ca14e8934ebd5f4c6d3656a1ccc726f04a10164cf7d599128d7dfbd3fa15f932068a583f288a0327d69a5f5","serverFinished":"68efa1737e629e56c92cbb680f96730052e8269e6248b62dd26a62d3ea7be55991e9f0ea85e6bebf95dbc6adbb41334e"},"tlsClientHelloLength":"386","tlsClientAuth":{"certPresented":"0","certVerified":"NONE","certRevoked":"0","certIssuerDN":"","certSubjectDN":"","certIssuerDNRFC2253":"","certSubjectDNRFC2253":"","certIssuerDNLegacy":"","certSubjectDNLegacy":"","certSerial":"","certIssuerSerial":"","certSKI":"","certIssuerSKI":"","certFingerprintSHA1":"","certFingerprintSHA256":"","certNotBefore":"","certNotAfter":"","certRFC9440":"","certRFC9440TooLarge":false,"certChainRFC9440":"","certChainRFC9440TooLarge":false},"verifiedBotCategory":"","edgeL4":{"deliveryRate":52536},"botManagement":{"corporateProxy":false,"verifiedBot":false,"jsDetection":{"passed":false},"staticResource":false,"detectionIds":{},"score":99}}
@@ -0,0 +1,83 @@
1
+ # orez/cf-do architecture - READ FIRST
2
+
3
+ ## The fundamental constraint
4
+
5
+ **Cloudflare Durable Objects have a 128 MB memory budget per instance.**
6
+
7
+ PGlite + WASM Postgres + extension binaries pushes real deployments over that
8
+ budget. That is the dead end. zero-cache is still essential: it owns the sync
9
+ protocol, IVM/CVR machinery, replication handling, and client semantics.
10
+
11
+ The orez Cloudflare path is therefore:
12
+
13
+ - **yes** real `@rocicorp/zero` zero-cache
14
+ - **yes** Durable Object SQLite as the durable storage engine
15
+ - **yes** orez `DoBackend` serving Postgres-protocol semantics to zero-cache
16
+ - **no** PGlite
17
+ - **no** `pglite.wasm`, `pglite.data`, extension `.so` files, or WASM Postgres
18
+
19
+ ## Production shape
20
+
21
+ ```
22
+ ┌────────────────────────────────────────────────────────────────┐
23
+ │ Worker │
24
+ │ │
25
+ │ /sync/v* and /api/zero/* ─────► ZERO_CACHE_DO singleton │
26
+ │ everything else ──────────────► ASSETS │
27
+ └────────────────────────────────────────────────────────────────┘
28
+
29
+ ┌────────────────────────────────────────────────────────────────┐
30
+ │ ZERO_CACHE_DO Durable Object │
31
+ │ │
32
+ │ startZeroCacheEmbedCF() runs real zero-cache in-process │
33
+ │ │ │
34
+ │ ├─ zero-cache replica/CVR/CDB SQLite │
35
+ │ │ @rocicorp/zero-sqlite3 -> orez worker SQLite shim │
36
+ │ │ backed by ctx.storage.sql │
37
+ │ │ │
38
+ │ └─ zero-cache upstream Postgres connections │
39
+ │ postgres -> orez postgres browser shim │
40
+ │ DoBackend -> ZERO_SQL_DO /exec and /batch │
41
+ └────────────────────────────────────────────────────────────────┘
42
+
43
+ ┌────────────────────────────────────────────────────────────────┐
44
+ │ ZERO_SQL_DO Durable Object │
45
+ │ │
46
+ │ ZeroDO raw SQL endpoints │
47
+ │ /exec, /batch, /changes, /notify, /__orez/* │
48
+ │ ctx.storage.sql │
49
+ │ _orez.changes populated by SQL tracking triggers │
50
+ └────────────────────────────────────────────────────────────────┘
51
+ ```
52
+
53
+ All app traffic for a deployed project must use singleton DO IDs for both
54
+ `ZERO_CACHE_DO` and `ZERO_SQL_DO`; otherwise browser sessions will not share the
55
+ same zero-cache process and durable SQLite state.
56
+
57
+ ## Important files
58
+
59
+ - `src/worker/zero-cache-embed-cf.ts` - starts real zero-cache inside a Durable
60
+ Object and wires its storage/network dependencies to CF-safe shims.
61
+ - `src/worker/cf-patches.ts` - patches zero-cache internals so its worker
62
+ graph and writer run in the Workers runtime.
63
+ - `src/pg-proxy-do-backend.ts` - translates Postgres protocol operations from
64
+ zero-cache into DO SQL endpoint requests.
65
+ - `src/cf-do/worker.ts` - `ZeroDO`, the generic DO SQL backend. It also still
66
+ contains a bespoke Zero sync protocol handler used for development and
67
+ protocol experiments, but the production Soot deploy path uses real
68
+ zero-cache through `startZeroCacheEmbedCF()`.
69
+ - `src/do-sql-tracking.ts` and `src/replication/*` - change tracking and
70
+ logical replication support over `_orez.changes`.
71
+
72
+ ## What not to do
73
+
74
+ - Do not import `@electric-sql/pglite` into the Cloudflare DO deploy path.
75
+ - Do not bundle PGlite WASM/data/extensions into the deploy template.
76
+ - Do not replace zero-cache with the bespoke handler for production sync.
77
+ - Do not add a second fallback path that silently switches between PGlite,
78
+ bespoke sync, and zero-cache. There should be one production path:
79
+ zero-cache -> orez Postgres protocol -> DO SQLite.
80
+
81
+ If a future change needs more Postgres behavior, implement it in
82
+ `DoBackend`/the SQL translator or the DO SQL backend. Do not put PGlite back in
83
+ the request path.
@@ -0,0 +1,103 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import { DurableWatermarkState } from './watermark.js'
4
+
5
+ class FakeResult {
6
+ constructor(private readonly rows: Array<Record<string, unknown>> = []) {}
7
+
8
+ one() {
9
+ return this.rows[0]
10
+ }
11
+
12
+ toArray() {
13
+ return this.rows
14
+ }
15
+ }
16
+
17
+ class FakeSql {
18
+ changes: Array<{ watermark: number }> = []
19
+ state = 0
20
+ sequence = { name: '_orez___zero_watermark', last_value: 1, is_called: 0 }
21
+
22
+ exec(sql: string, ...params: unknown[]) {
23
+ if (sql.startsWith('CREATE TABLE IF NOT EXISTS')) return new FakeResult()
24
+
25
+ if (sql.startsWith('SELECT last_value FROM "_zero_change_state"')) {
26
+ return new FakeResult([{ last_value: this.state }])
27
+ }
28
+
29
+ if (sql.startsWith('INSERT OR IGNORE INTO "_zero_change_state"')) {
30
+ return new FakeResult()
31
+ }
32
+
33
+ if (sql.startsWith('UPDATE "_zero_change_state" SET last_value = ?')) {
34
+ this.state = Number(params[0])
35
+ return new FakeResult()
36
+ }
37
+
38
+ if (
39
+ sql.startsWith('SELECT COALESCE(MAX(watermark), 0) AS watermark FROM _zero_changes')
40
+ ) {
41
+ const watermark = Math.max(0, ...this.changes.map((change) => change.watermark))
42
+ return new FakeResult([{ watermark }])
43
+ }
44
+
45
+ if (sql.includes('sqlite_master') && sql.includes('%zero_watermark%')) {
46
+ return new FakeResult([{ name: this.sequence.name }])
47
+ }
48
+
49
+ if (sql.startsWith('SELECT last_value, is_called FROM "_orez___zero_watermark"')) {
50
+ return new FakeResult([
51
+ {
52
+ last_value: this.sequence.last_value,
53
+ is_called: this.sequence.is_called,
54
+ },
55
+ ])
56
+ }
57
+
58
+ if (sql.startsWith('INSERT OR IGNORE INTO "_orez___zero_watermark"')) {
59
+ return new FakeResult()
60
+ }
61
+
62
+ if (sql.startsWith('UPDATE "_orez___zero_watermark" SET last_value = ?')) {
63
+ this.sequence.last_value = Number(params[0])
64
+ this.sequence.is_called = 1
65
+ return new FakeResult()
66
+ }
67
+
68
+ throw new Error(`unexpected fake sql: ${sql}`)
69
+ }
70
+ }
71
+
72
+ describe('DurableWatermarkState', () => {
73
+ it('does not reuse watermarks after consumed changes are purged', () => {
74
+ const sql = new FakeSql()
75
+ const watermarks = new DurableWatermarkState(sql)
76
+
77
+ expect(watermarks.current()).toBe(0)
78
+
79
+ const first = watermarks.next()
80
+ sql.changes.push({ watermark: first })
81
+ watermarks.mark(first)
82
+ expect(first).toBe(1)
83
+
84
+ sql.changes = []
85
+
86
+ const second = watermarks.next()
87
+ sql.changes.push({ watermark: second })
88
+ watermarks.mark(second)
89
+
90
+ expect(second).toBe(2)
91
+ expect(sql.sequence).toMatchObject({ last_value: 2, is_called: 1 })
92
+ })
93
+
94
+ it('synchronizes from existing change rows and sequence state', () => {
95
+ const sql = new FakeSql()
96
+ sql.changes.push({ watermark: 7 })
97
+ const watermarks = new DurableWatermarkState(sql)
98
+
99
+ expect(watermarks.current()).toBe(7)
100
+ expect(sql.state).toBe(7)
101
+ expect(sql.sequence).toMatchObject({ last_value: 7, is_called: 1 })
102
+ })
103
+ })