orez 0.1.36 → 0.1.38

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 (130) hide show
  1. package/dist/cli-entry.js +0 -0
  2. package/dist/cli.js +7 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config.d.ts +1 -0
  5. package/dist/config.d.ts.map +1 -1
  6. package/dist/config.js +1 -0
  7. package/dist/config.js.map +1 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +14 -11
  10. package/dist/index.js.map +1 -1
  11. package/dist/pg-proxy.d.ts.map +1 -1
  12. package/dist/pg-proxy.js +8 -4
  13. package/dist/pg-proxy.js.map +1 -1
  14. package/dist/pglite-manager.d.ts +12 -0
  15. package/dist/pglite-manager.d.ts.map +1 -1
  16. package/dist/pglite-manager.js +81 -0
  17. package/dist/pglite-manager.js.map +1 -1
  18. package/dist/recovery.js +2 -2
  19. package/dist/recovery.js.map +1 -1
  20. package/dist/replication/change-tracker.js +9 -9
  21. package/dist/replication/change-tracker.js.map +1 -1
  22. package/dist/replication/handler.d.ts +12 -0
  23. package/dist/replication/handler.d.ts.map +1 -1
  24. package/dist/replication/handler.js +34 -6
  25. package/dist/replication/handler.js.map +1 -1
  26. package/dist/worker/browser-build-config.d.ts +59 -0
  27. package/dist/worker/browser-build-config.d.ts.map +1 -0
  28. package/dist/worker/browser-build-config.js +101 -0
  29. package/dist/worker/browser-build-config.js.map +1 -0
  30. package/dist/worker/browser-embed.d.ts +58 -0
  31. package/dist/worker/browser-embed.d.ts.map +1 -0
  32. package/dist/worker/browser-embed.js +195 -0
  33. package/dist/worker/browser-embed.js.map +1 -0
  34. package/dist/worker/cf-patches.d.ts +20 -0
  35. package/dist/worker/cf-patches.d.ts.map +1 -0
  36. package/dist/worker/cf-patches.js +94 -0
  37. package/dist/worker/cf-patches.js.map +1 -0
  38. package/dist/worker/index.d.ts +12 -0
  39. package/dist/worker/index.d.ts.map +1 -0
  40. package/dist/worker/index.js +105 -0
  41. package/dist/worker/index.js.map +1 -0
  42. package/dist/worker/shims/fastify.d.ts +80 -0
  43. package/dist/worker/shims/fastify.d.ts.map +1 -0
  44. package/dist/worker/shims/fastify.js +223 -0
  45. package/dist/worker/shims/fastify.js.map +1 -0
  46. package/dist/worker/shims/http-service.d.ts +104 -0
  47. package/dist/worker/shims/http-service.d.ts.map +1 -0
  48. package/dist/worker/shims/http-service.js +198 -0
  49. package/dist/worker/shims/http-service.js.map +1 -0
  50. package/dist/worker/shims/node-stub.d.ts +147 -0
  51. package/dist/worker/shims/node-stub.d.ts.map +1 -0
  52. package/dist/worker/shims/node-stub.js +204 -0
  53. package/dist/worker/shims/node-stub.js.map +1 -0
  54. package/dist/worker/shims/postgres.d.ts +115 -0
  55. package/dist/worker/shims/postgres.d.ts.map +1 -0
  56. package/dist/worker/shims/postgres.js +1181 -0
  57. package/dist/worker/shims/postgres.js.map +1 -0
  58. package/dist/worker/shims/sqlite-browser.d.ts +54 -0
  59. package/dist/worker/shims/sqlite-browser.d.ts.map +1 -0
  60. package/dist/worker/shims/sqlite-browser.js +144 -0
  61. package/dist/worker/shims/sqlite-browser.js.map +1 -0
  62. package/dist/worker/shims/sqlite.d.ts +126 -0
  63. package/dist/worker/shims/sqlite.d.ts.map +1 -0
  64. package/dist/worker/shims/sqlite.js +599 -0
  65. package/dist/worker/shims/sqlite.js.map +1 -0
  66. package/dist/worker/shims/stream-browser.d.ts +9 -0
  67. package/dist/worker/shims/stream-browser.d.ts.map +1 -0
  68. package/dist/worker/shims/stream-browser.js +13 -0
  69. package/dist/worker/shims/stream-browser.js.map +1 -0
  70. package/dist/worker/shims/ws-browser.d.ts +50 -0
  71. package/dist/worker/shims/ws-browser.d.ts.map +1 -0
  72. package/dist/worker/shims/ws-browser.js +105 -0
  73. package/dist/worker/shims/ws-browser.js.map +1 -0
  74. package/dist/worker/shims/ws.d.ts +62 -0
  75. package/dist/worker/shims/ws.d.ts.map +1 -0
  76. package/dist/worker/shims/ws.js +310 -0
  77. package/dist/worker/shims/ws.js.map +1 -0
  78. package/dist/worker/types.d.ts +57 -0
  79. package/dist/worker/types.d.ts.map +1 -0
  80. package/dist/worker/types.js +9 -0
  81. package/dist/worker/types.js.map +1 -0
  82. package/dist/worker/zero-cache-embed-cf.d.ts +63 -0
  83. package/dist/worker/zero-cache-embed-cf.d.ts.map +1 -0
  84. package/dist/worker/zero-cache-embed-cf.js +268 -0
  85. package/dist/worker/zero-cache-embed-cf.js.map +1 -0
  86. package/dist/worker/zero-cache-embed.d.ts +66 -0
  87. package/dist/worker/zero-cache-embed.d.ts.map +1 -0
  88. package/dist/worker/zero-cache-embed.js +200 -0
  89. package/dist/worker/zero-cache-embed.js.map +1 -0
  90. package/package.json +62 -3
  91. package/src/cli-entry.ts +0 -0
  92. package/src/cli.ts +8 -1
  93. package/src/config.ts +2 -0
  94. package/src/index.ts +15 -10
  95. package/src/integration/integration.test.ts +1 -1
  96. package/src/integration/restore-live-stress.test.ts +2 -2
  97. package/src/pg-proxy.ts +9 -4
  98. package/src/pglite-manager.ts +111 -0
  99. package/src/recovery.ts +2 -2
  100. package/src/replication/change-tracker.test.ts +1 -1
  101. package/src/replication/change-tracker.ts +9 -9
  102. package/src/replication/handler.test.ts +37 -0
  103. package/src/replication/handler.ts +46 -6
  104. package/src/wasm-sqlite.test.ts +2 -1
  105. package/src/worker/browser-build-config.test.ts +59 -0
  106. package/src/worker/browser-build-config.ts +105 -0
  107. package/src/worker/browser-embed.ts +306 -0
  108. package/src/worker/cf-patches.ts +114 -0
  109. package/src/worker/embed-integration.test.ts +321 -0
  110. package/src/worker/index.ts +138 -0
  111. package/src/worker/shims/fastify.test.ts +255 -0
  112. package/src/worker/shims/fastify.ts +292 -0
  113. package/src/worker/shims/http-service.test.ts +355 -0
  114. package/src/worker/shims/http-service.ts +293 -0
  115. package/src/worker/shims/node-stub.ts +223 -0
  116. package/src/worker/shims/postgres.test.ts +364 -0
  117. package/src/worker/shims/postgres.ts +1434 -0
  118. package/src/worker/shims/sqlite-browser.test.ts +233 -0
  119. package/src/worker/shims/sqlite-browser.ts +178 -0
  120. package/src/worker/shims/sqlite.test.ts +641 -0
  121. package/src/worker/shims/sqlite.ts +731 -0
  122. package/src/worker/shims/ws-browser.test.ts +184 -0
  123. package/src/worker/shims/ws-browser.ts +125 -0
  124. package/src/worker/shims/ws.test.ts +288 -0
  125. package/src/worker/shims/ws.ts +367 -0
  126. package/src/worker/types.ts +75 -0
  127. package/src/worker/worker-integration.test.ts +223 -0
  128. package/src/worker/worker.test.ts +136 -0
  129. package/src/worker/zero-cache-embed-cf.ts +367 -0
  130. package/src/worker/zero-cache-embed.ts +277 -0
@@ -0,0 +1,50 @@
1
+ /**
2
+ * browser WebSocket/MessagePort adapter for the ws shim.
3
+ *
4
+ * wraps a browser WebSocket or MessagePort to match the interface
5
+ * that the existing ws shim (orez/worker/shims/ws) expects. this lets
6
+ * zero-cache handle WebSocket connections in browser Web Workers.
7
+ *
8
+ * usage:
9
+ * import { messagePortToWs, browserWsToWs } from 'orez/worker/shims/ws-browser'
10
+ *
11
+ * // from a MessageChannel (worker ↔ main thread)
12
+ * const channel = new MessageChannel()
13
+ * const serverWs = messagePortToWs(channel.port2)
14
+ *
15
+ * // from a browser WebSocket
16
+ * const ws = new WebSocket('ws://...')
17
+ * const shimWs = browserWsToWs(ws)
18
+ */
19
+ interface WsCompatible {
20
+ readyState: number;
21
+ send(data: string | ArrayBuffer | ArrayBufferView): void;
22
+ close(code?: number, reason?: string): void;
23
+ addEventListener(type: string, handler: (event: any) => void): void;
24
+ removeEventListener(type: string, handler: (event: any) => void): void;
25
+ }
26
+ /**
27
+ * wrap a MessagePort to look like a WebSocket.
28
+ *
29
+ * MessagePort uses postMessage/onmessage, while the ws shim expects
30
+ * send/addEventListener('message'). this bridges the two.
31
+ */
32
+ export declare function messagePortToWs(port: MessagePort): WsCompatible;
33
+ /**
34
+ * wrap a browser WebSocket to match the ws shim's expected interface.
35
+ *
36
+ * browser WebSocket and the ws shim's CFWebSocket interface are very
37
+ * similar but have subtle differences. this normalizes them.
38
+ */
39
+ export declare function browserWsToWs(ws: WebSocket): WsCompatible;
40
+ /**
41
+ * create a connected pair of WebSocket-like objects for in-process
42
+ * communication (e.g., when zero-cache and Zero client are in the
43
+ * same browser context). uses MessageChannel internally.
44
+ *
45
+ * returns [client, server] — client goes to Zero client, server
46
+ * goes to the browser embed's handleWebSocket().
47
+ */
48
+ export declare function createInProcessPair(): [WsCompatible, WsCompatible];
49
+ export {};
50
+ //# sourceMappingURL=ws-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-browser.d.ts","sourceRoot":"","sources":["../../../src/worker/shims/ws-browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,UAAU,YAAY;IACpB,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;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,CA+C/D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,SAAS,GAAG,YAAY,CAsBzD;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAGlE"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * browser WebSocket/MessagePort adapter for the ws shim.
3
+ *
4
+ * wraps a browser WebSocket or MessagePort to match the interface
5
+ * that the existing ws shim (orez/worker/shims/ws) expects. this lets
6
+ * zero-cache handle WebSocket connections in browser Web Workers.
7
+ *
8
+ * usage:
9
+ * import { messagePortToWs, browserWsToWs } from 'orez/worker/shims/ws-browser'
10
+ *
11
+ * // from a MessageChannel (worker ↔ main thread)
12
+ * const channel = new MessageChannel()
13
+ * const serverWs = messagePortToWs(channel.port2)
14
+ *
15
+ * // from a browser WebSocket
16
+ * const ws = new WebSocket('ws://...')
17
+ * const shimWs = browserWsToWs(ws)
18
+ */
19
+ /**
20
+ * wrap a MessagePort to look like a WebSocket.
21
+ *
22
+ * MessagePort uses postMessage/onmessage, while the ws shim expects
23
+ * send/addEventListener('message'). this bridges the two.
24
+ */
25
+ export function messagePortToWs(port) {
26
+ const listeners = new Map();
27
+ let closed = false;
28
+ function addListener(type, handler) {
29
+ if (!listeners.has(type))
30
+ listeners.set(type, new Set());
31
+ listeners.get(type).add(handler);
32
+ }
33
+ function removeListener(type, handler) {
34
+ listeners.get(type)?.delete(handler);
35
+ }
36
+ function emit(type, event) {
37
+ for (const h of listeners.get(type) || [])
38
+ h(event);
39
+ }
40
+ // forward port messages → ws 'message' events
41
+ port.onmessage = (event) => {
42
+ emit('message', { data: event.data });
43
+ };
44
+ port.onmessageerror = (event) => {
45
+ emit('error', { message: 'MessagePort error', error: event });
46
+ };
47
+ return {
48
+ get readyState() {
49
+ return closed ? 3 : 1; // CLOSED or OPEN
50
+ },
51
+ send(data) {
52
+ if (closed)
53
+ return;
54
+ // MessagePort uses postMessage (structured clone)
55
+ port.postMessage(data);
56
+ },
57
+ close(code, _reason) {
58
+ if (closed)
59
+ return;
60
+ closed = true;
61
+ port.close();
62
+ emit('close', { code: code ?? 1000, reason: '', wasClean: true });
63
+ },
64
+ addEventListener: addListener,
65
+ removeEventListener: removeListener,
66
+ };
67
+ }
68
+ /**
69
+ * wrap a browser WebSocket to match the ws shim's expected interface.
70
+ *
71
+ * browser WebSocket and the ws shim's CFWebSocket interface are very
72
+ * similar but have subtle differences. this normalizes them.
73
+ */
74
+ export function browserWsToWs(ws) {
75
+ return {
76
+ get readyState() {
77
+ return ws.readyState;
78
+ },
79
+ send(data) {
80
+ ws.send(data);
81
+ },
82
+ close(code, reason) {
83
+ ws.close(code, reason);
84
+ },
85
+ addEventListener(type, handler) {
86
+ ws.addEventListener(type, handler);
87
+ },
88
+ removeEventListener(type, handler) {
89
+ ws.removeEventListener(type, handler);
90
+ },
91
+ };
92
+ }
93
+ /**
94
+ * create a connected pair of WebSocket-like objects for in-process
95
+ * communication (e.g., when zero-cache and Zero client are in the
96
+ * same browser context). uses MessageChannel internally.
97
+ *
98
+ * returns [client, server] — client goes to Zero client, server
99
+ * goes to the browser embed's handleWebSocket().
100
+ */
101
+ export function createInProcessPair() {
102
+ const channel = new MessageChannel();
103
+ return [messagePortToWs(channel.port1), messagePortToWs(channel.port2)];
104
+ }
105
+ //# sourceMappingURL=ws-browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-browser.js","sourceRoot":"","sources":["../../../src/worker/shims/ws-browser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * ws (websocket) shim for cloudflare workers.
3
+ *
4
+ * wraps CF Workers WebSocket (from WebSocketPair) to implement the
5
+ * ws npm package API that zero-cache uses. enables bundler aliasing
6
+ * so zero-cache's WebSocket handling works with CF durable WebSockets.
7
+ *
8
+ * usage with bundler alias:
9
+ * alias: { 'ws': './src/worker/shims/ws.js' }
10
+ */
11
+ import EventEmitter from 'node:events';
12
+ import { Duplex } from 'node:stream';
13
+ interface CFWebSocket {
14
+ send(data: string | ArrayBuffer | ArrayBufferView): void;
15
+ close(code?: number, reason?: string): void;
16
+ addEventListener(type: string, handler: (event: any) => void): void;
17
+ removeEventListener(type: string, handler: (event: any) => void): void;
18
+ readyState: number;
19
+ accept?(): void;
20
+ }
21
+ declare class WebSocket extends EventEmitter {
22
+ #private;
23
+ static readonly CONNECTING = 0;
24
+ static readonly OPEN = 1;
25
+ static readonly CLOSING = 2;
26
+ static readonly CLOSED = 3;
27
+ readonly CONNECTING = 0;
28
+ readonly OPEN = 1;
29
+ readonly CLOSING = 2;
30
+ readonly CLOSED = 3;
31
+ constructor(urlOrSocket: string | CFWebSocket, _protocols?: unknown, _opts?: unknown);
32
+ get url(): string;
33
+ get readyState(): number;
34
+ send(data: string | Buffer | ArrayBuffer | ArrayBufferView, cb?: (err?: Error) => void): void;
35
+ close(code?: number, reason?: string): void;
36
+ terminate(): void;
37
+ ping(_data?: unknown, _mask?: boolean, _cb?: () => void): void;
38
+ addEventListener(type: string, handler: (event: any) => void): void;
39
+ removeEventListener(type: string, handler: (event: any) => void): void;
40
+ }
41
+ declare class WebSocketServer extends EventEmitter {
42
+ constructor(_opts?: {
43
+ noServer?: boolean;
44
+ });
45
+ close(cb?: (err?: Error) => void): void;
46
+ /**
47
+ * handle a WebSocket upgrade. on CF Workers the upgrade is already done
48
+ * (WebSocketPair), so this just wraps the CF WebSocket in our shim.
49
+ *
50
+ * @param message - the HTTP request (IncomingMessage-like object)
51
+ * @param socket - the underlying socket (CF WebSocket on CF Workers)
52
+ * @param head - upgrade head buffer
53
+ * @param callback - receives the wrapped WebSocket
54
+ */
55
+ handleUpgrade(_message: unknown, socket: CFWebSocket | unknown, _head: unknown, callback: (ws: WebSocket) => void): void;
56
+ }
57
+ declare function createWebSocketStream(ws: WebSocket, _opts?: {
58
+ decodeStrings?: boolean;
59
+ }): Duplex;
60
+ export default WebSocket;
61
+ export { WebSocket, WebSocketServer, createWebSocketStream };
62
+ //# sourceMappingURL=ws.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../../src/worker/shims/ws.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AAEH,OAAO,YAAY,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AASpC,UAAU,WAAW;IACnB,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;IACtE,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,IAAI,IAAI,CAAA;CAChB;AAKD,cAAM,SAAU,SAAQ,YAAY;;IAClC,MAAM,CAAC,QAAQ,CAAC,UAAU,KAAa;IACvC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAO;IAC3B,MAAM,CAAC,QAAQ,CAAC,OAAO,KAAU;IACjC,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAS;IAE/B,QAAQ,CAAC,UAAU,KAAa;IAChC,QAAQ,CAAC,IAAI,KAAO;IACpB,QAAQ,CAAC,OAAO,KAAU;IAC1B,QAAQ,CAAC,MAAM,KAAS;gBAMZ,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,OAAO;IA6HpF,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,CACF,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,eAAe,EACrD,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,IAAI,GACzB,IAAI;IAmBP,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAQ3C,SAAS,IAAI,IAAI;IAMjB,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI;IAU9D,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAKnE,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;CAiCvE;AAKD,cAAM,eAAgB,SAAQ,YAAY;gBAC5B,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE;IAI1C,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAKvC;;;;;;;;OAQG;IACH,aAAa,CACX,QAAQ,EAAE,OAAO,EACjB,MAAM,EAAE,WAAW,GAAG,OAAO,EAC7B,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,IAAI,GAChC,IAAI;CAKR;AAMD,iBAAS,qBAAqB,CAC5B,EAAE,EAAE,SAAS,EACb,KAAK,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,GAClC,MAAM,CAoDR;AAED,eAAe,SAAS,CAAA;AACxB,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,qBAAqB,EAAE,CAAA"}
@@ -0,0 +1,310 @@
1
+ // NOTE THIS IS NOT OREZ NODE THIS IS NOT A GOOD REFERENCE BECAUSE ITS OUR EARLY GUESS AT WHAT COULD WORK
2
+ // DO NOT STUDY THIS, THE OTHER STUFF IN SRC IS WHERE YOU EANT TO LOOK
3
+ /**
4
+ * ws (websocket) shim for cloudflare workers.
5
+ *
6
+ * wraps CF Workers WebSocket (from WebSocketPair) to implement the
7
+ * ws npm package API that zero-cache uses. enables bundler aliasing
8
+ * so zero-cache's WebSocket handling works with CF durable WebSockets.
9
+ *
10
+ * usage with bundler alias:
11
+ * alias: { 'ws': './src/worker/shims/ws.js' }
12
+ */
13
+ import EventEmitter from 'node:events';
14
+ import { Duplex } from 'node:stream';
15
+ // -- readyState constants --
16
+ const CONNECTING = 0;
17
+ const OPEN = 1;
18
+ const CLOSING = 2;
19
+ const CLOSED = 3;
20
+ // -- WebSocket shim --
21
+ // wraps a CF WebSocket to match the ws package WebSocket API
22
+ class WebSocket extends EventEmitter {
23
+ static CONNECTING = CONNECTING;
24
+ static OPEN = OPEN;
25
+ static CLOSING = CLOSING;
26
+ static CLOSED = CLOSED;
27
+ CONNECTING = CONNECTING;
28
+ OPEN = OPEN;
29
+ CLOSING = CLOSING;
30
+ CLOSED = CLOSED;
31
+ #ws;
32
+ #url;
33
+ #listeners = new Map();
34
+ constructor(urlOrSocket, _protocols, _opts) {
35
+ super();
36
+ if (typeof urlOrSocket === 'string') {
37
+ this.#url = urlOrSocket;
38
+ // check for in-process connections (fastify shim uses port 0 or 1)
39
+ const parsedUrl = new URL(urlOrSocket, 'http://localhost');
40
+ const isInProcess = parsedUrl.port === '0' ||
41
+ parsedUrl.port === '1' ||
42
+ parsedUrl.hostname === 'localhost';
43
+ if (isInProcess) {
44
+ // in-process: connect via fastify server's handoff mechanism
45
+ const fastifyInstance = globalThis.__orez_fastify_instance;
46
+ if (fastifyInstance?.server) {
47
+ // create paired message channels for bidirectional communication
48
+ // the client-side WS (this) and serverWs are cross-linked so
49
+ // ping/pong, messages, and close propagate between them
50
+ const clientSide = this;
51
+ const serverWs = {
52
+ readyState: 1,
53
+ _listeners: {},
54
+ send: (data) => {
55
+ // deliver to client side
56
+ queueMicrotask(() => clientSide.emit('message', data));
57
+ },
58
+ close: (code, reason) => {
59
+ serverWs.readyState = 3;
60
+ queueMicrotask(() => clientSide.emit('close', code || 1000, reason || ''));
61
+ },
62
+ ping: () => {
63
+ // ping from server → deliver 'ping' event to client
64
+ // (expectPingsForLiveness listens for 'ping', not 'pong')
65
+ queueMicrotask(() => clientSide.emit('ping'));
66
+ },
67
+ addEventListener: (type, handler) => {
68
+ if (!serverWs._listeners[type])
69
+ serverWs._listeners[type] = [];
70
+ serverWs._listeners[type].push(handler);
71
+ },
72
+ removeEventListener: (type, handler) => {
73
+ const arr = serverWs._listeners[type];
74
+ if (arr) {
75
+ const idx = arr.indexOf(handler);
76
+ if (idx >= 0)
77
+ arr.splice(idx, 1);
78
+ }
79
+ },
80
+ };
81
+ this.#ws = {
82
+ accept: () => { },
83
+ send: (data) => {
84
+ // deliver to server side
85
+ const handlers = serverWs._listeners['message'] || [];
86
+ for (const h of handlers)
87
+ h({ data });
88
+ },
89
+ close: (code, reason) => {
90
+ const handlers = serverWs._listeners['close'] || [];
91
+ for (const h of handlers)
92
+ h({ code, reason });
93
+ },
94
+ addEventListener: () => { },
95
+ removeEventListener: () => { },
96
+ get readyState() {
97
+ return 1;
98
+ },
99
+ };
100
+ // emit handoff to fastify server
101
+ const path = parsedUrl.pathname + parsedUrl.search;
102
+ queueMicrotask(() => {
103
+ fastifyInstance.server.emit('message', [
104
+ 'handoff',
105
+ {
106
+ message: { url: path, headers: {}, method: 'GET' },
107
+ head: new Uint8Array(0),
108
+ },
109
+ ], serverWs);
110
+ this.emit('open');
111
+ });
112
+ }
113
+ else {
114
+ // no fastify instance — emit close immediately
115
+ queueMicrotask(() => this.emit('close', 1006, 'no fastify server'));
116
+ }
117
+ }
118
+ else if (typeof globalThis.WebSocket === 'function') {
119
+ // real outbound WebSocket for external connections
120
+ const nativeWs = new globalThis.WebSocket(urlOrSocket);
121
+ this.#ws = {
122
+ accept: () => { },
123
+ send: (data) => nativeWs.send(data),
124
+ close: (code, reason) => nativeWs.close(code, reason),
125
+ addEventListener: (type, handler) => nativeWs.addEventListener(type, handler),
126
+ removeEventListener: (type, handler) => nativeWs.removeEventListener(type, handler),
127
+ get readyState() {
128
+ return nativeWs.readyState;
129
+ },
130
+ };
131
+ nativeWs.addEventListener('open', () => this.emit('open'));
132
+ nativeWs.addEventListener('message', (ev) => this.emit('message', ev.data));
133
+ nativeWs.addEventListener('close', (ev) => this.emit('close', ev.code, ev.reason));
134
+ nativeWs.addEventListener('error', (ev) => this.emit('error', new Error('WebSocket error')));
135
+ }
136
+ else {
137
+ throw new Error('ws shim: outbound WebSocket connections not yet supported. ' +
138
+ 'use the CF Workers fetch API for outbound WebSocket.');
139
+ }
140
+ }
141
+ else {
142
+ this.#ws = urlOrSocket;
143
+ this.#url = '';
144
+ this.#setupListeners();
145
+ }
146
+ }
147
+ get url() {
148
+ return this.#url;
149
+ }
150
+ get readyState() {
151
+ return this.#ws.readyState;
152
+ }
153
+ send(data, cb) {
154
+ try {
155
+ if (typeof data === 'string') {
156
+ this.#ws.send(data);
157
+ }
158
+ else if (Buffer.isBuffer(data)) {
159
+ this.#ws.send(new Uint8Array(data.buffer, data.byteOffset, data.byteLength));
160
+ }
161
+ else if (data instanceof ArrayBuffer) {
162
+ this.#ws.send(data);
163
+ }
164
+ else if (ArrayBuffer.isView(data)) {
165
+ this.#ws.send(new Uint8Array(data.buffer, data.byteOffset, data.byteLength));
166
+ }
167
+ else {
168
+ this.#ws.send(String(data));
169
+ }
170
+ cb?.();
171
+ }
172
+ catch (err) {
173
+ cb?.(err);
174
+ }
175
+ }
176
+ close(code, reason) {
177
+ try {
178
+ this.#ws.close(code, reason);
179
+ }
180
+ catch {
181
+ // socket may already be closed
182
+ }
183
+ }
184
+ terminate() {
185
+ // real ws.terminate() destroys the socket without a close frame.
186
+ // CF Workers don't expose raw socket destroy, so close with 1000.
187
+ this.close(1000);
188
+ }
189
+ ping(_data, _mask, _cb) {
190
+ // forward ping to underlying socket if it supports it (in-process pairs)
191
+ if (typeof this.#ws.ping === 'function') {
192
+ ;
193
+ this.#ws.ping();
194
+ }
195
+ // also emit pong locally (CF WebSockets handle ping/pong at platform level)
196
+ this.emit('pong');
197
+ }
198
+ // standard EventTarget-style addEventListener (used by Connection)
199
+ addEventListener(type, handler) {
200
+ // wrap to emit EventEmitter-style
201
+ this.on(type, handler);
202
+ }
203
+ removeEventListener(type, handler) {
204
+ this.off(type, handler);
205
+ }
206
+ #setupListeners() {
207
+ // match ws npm package event signatures:
208
+ // message: (data: Buffer|string, isBinary: boolean)
209
+ // close: (code: number, reason: string)
210
+ // error: (err: Error)
211
+ const onMessage = (event) => {
212
+ const data = event.data;
213
+ this.emit('message', data, typeof data !== 'string');
214
+ };
215
+ const onClose = (event) => {
216
+ this.emit('close', event.code ?? 1000, event.reason ?? '');
217
+ };
218
+ const onError = (event) => {
219
+ this.emit('error', event.error ?? new Error(event.message ?? 'WebSocket error'));
220
+ };
221
+ const onOpen = () => {
222
+ this.emit('open');
223
+ };
224
+ this.#ws.addEventListener('message', onMessage);
225
+ this.#ws.addEventListener('close', onClose);
226
+ this.#ws.addEventListener('error', onError);
227
+ this.#ws.addEventListener('open', onOpen);
228
+ this.#listeners.set('message', onMessage);
229
+ this.#listeners.set('close', onClose);
230
+ this.#listeners.set('error', onError);
231
+ this.#listeners.set('open', onOpen);
232
+ }
233
+ }
234
+ // -- WebSocketServer shim --
235
+ // zero-cache uses WebSocketServer with { noServer: true } for handleUpgrade
236
+ class WebSocketServer extends EventEmitter {
237
+ constructor(_opts) {
238
+ super();
239
+ }
240
+ close(cb) {
241
+ // no-op — browser embed has no real server to close
242
+ cb?.();
243
+ }
244
+ /**
245
+ * handle a WebSocket upgrade. on CF Workers the upgrade is already done
246
+ * (WebSocketPair), so this just wraps the CF WebSocket in our shim.
247
+ *
248
+ * @param message - the HTTP request (IncomingMessage-like object)
249
+ * @param socket - the underlying socket (CF WebSocket on CF Workers)
250
+ * @param head - upgrade head buffer
251
+ * @param callback - receives the wrapped WebSocket
252
+ */
253
+ handleUpgrade(_message, socket, _head, callback) {
254
+ // wrap the CF WebSocket in our shim
255
+ const ws = new WebSocket(socket);
256
+ callback(ws);
257
+ }
258
+ }
259
+ // -- createWebSocketStream --
260
+ // creates a Node.js Duplex stream from a WebSocket.
261
+ // used by zero-cache's Connection class for streaming messages.
262
+ function createWebSocketStream(ws, _opts) {
263
+ const duplex = new Duplex({
264
+ objectMode: false,
265
+ decodeStrings: false,
266
+ read() {
267
+ // data is pushed from ws message events
268
+ },
269
+ write(chunk, _encoding, callback) {
270
+ try {
271
+ ws.send(typeof chunk === 'string' ? chunk : chunk.toString(), callback);
272
+ }
273
+ catch (err) {
274
+ callback(err);
275
+ }
276
+ },
277
+ destroy(err, callback) {
278
+ ws.close();
279
+ callback(err);
280
+ },
281
+ });
282
+ // pipe ws messages into the readable side
283
+ ws.on('message', (event) => {
284
+ const data = event?.data ?? event;
285
+ if (typeof data === 'string') {
286
+ duplex.push(data);
287
+ }
288
+ else if (data instanceof ArrayBuffer) {
289
+ duplex.push(Buffer.from(data));
290
+ }
291
+ else if (ArrayBuffer.isView(data)) {
292
+ duplex.push(Buffer.from(data.buffer, data.byteOffset, data.byteLength));
293
+ }
294
+ else {
295
+ duplex.push(String(data));
296
+ }
297
+ });
298
+ ws.on('close', () => {
299
+ duplex.push(null); // signal end of readable
300
+ duplex.destroy();
301
+ });
302
+ ws.on('error', (event) => {
303
+ const err = event?.error ?? new Error(event?.message ?? 'WebSocket error');
304
+ duplex.destroy(err);
305
+ });
306
+ return duplex;
307
+ }
308
+ export default WebSocket;
309
+ export { WebSocket, WebSocketServer, createWebSocketStream };
310
+ //# sourceMappingURL=ws.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws.js","sourceRoot":"","sources":["../../../src/worker/shims/ws.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * orez/worker types.
3
+ *
4
+ * interfaces for the embeddable orez worker that runs PGlite + change
5
+ * tracking without Node.js dependencies. designed for CF Workers/DO
6
+ * but usable in any JS runtime (browser, vitest, bun, deno).
7
+ */
8
+ import type { Mutex } from '../mutex.js';
9
+ import type { ChangeRecord } from '../replication/change-tracker.js';
10
+ import type { ReplicationWriter } from '../replication/handler.js';
11
+ import type { PGlite, PGliteOptions, Results } from '@electric-sql/pglite';
12
+ /** options for creating an orez worker */
13
+ export interface OrezWorkerOptions {
14
+ /**
15
+ * pre-created PGlite instance. when provided, orez wraps it
16
+ * without managing its lifecycle (caller is responsible for closing).
17
+ */
18
+ pglite?: PGlite;
19
+ /**
20
+ * PGlite constructor options. used when `pglite` is not provided.
21
+ * in CF Workers, pass wasmModule/fsBundle/loadDataDir here.
22
+ */
23
+ pgliteOptions?: PGliteOptions;
24
+ /** publication names to track. defaults to all public tables. */
25
+ publications?: string[];
26
+ /** log level (default: 'warn') */
27
+ logLevel?: 'error' | 'warn' | 'info' | 'debug';
28
+ }
29
+ /** the orez worker instance */
30
+ export interface OrezWorker {
31
+ /** the underlying PGlite instance */
32
+ readonly db: PGlite;
33
+ /** mutex for serializing PGlite access */
34
+ readonly mutex: Mutex;
35
+ /** run a parameterized query */
36
+ query<T extends Record<string, unknown> = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<Results<T>>;
37
+ /** execute raw SQL (DDL, multi-statement) */
38
+ exec(sql: string): Promise<void>;
39
+ /** install/reinstall change tracking triggers on all published tables */
40
+ installChangeTracking(): Promise<void>;
41
+ /** get changes since a watermark */
42
+ getChangesSince(watermark: number, limit?: number): Promise<ChangeRecord[]>;
43
+ /** get current watermark value */
44
+ getCurrentWatermark(): Promise<number>;
45
+ /** purge consumed changes up to watermark */
46
+ purgeChanges(watermark: number): Promise<number>;
47
+ /**
48
+ * start streaming replication to a writer.
49
+ * runs until the writer is closed or the worker is shut down.
50
+ */
51
+ startReplication(writer: ReplicationWriter): Promise<void>;
52
+ /** whether this worker owns the PGlite instance (manages its lifecycle) */
53
+ readonly ownsInstance: boolean;
54
+ /** close the worker. if ownsInstance, also closes PGlite. */
55
+ close(): Promise<void>;
56
+ }
57
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/worker/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAClE,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAE1E,0CAA0C;AAC1C,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf;;;OAGG;IACH,aAAa,CAAC,EAAE,aAAa,CAAA;IAE7B,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IAEvB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;CAC/C;AAED,+BAA+B;AAC/B,MAAM,WAAW,UAAU;IACzB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IAEnB,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;IAErB,gCAAgC;IAChC,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/D,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IAEtB,6CAA6C;IAC7C,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEhC,yEAAyE;IACzE,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAEtC,oCAAoC;IACpC,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IAE3E,kCAAkC;IAClC,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;IAEtC,6CAA6C;IAC7C,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAEhD;;;OAGG;IACH,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE1D,2EAA2E;IAC3E,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;IAE9B,6DAA6D;IAC7D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * orez/worker types.
3
+ *
4
+ * interfaces for the embeddable orez worker that runs PGlite + change
5
+ * tracking without Node.js dependencies. designed for CF Workers/DO
6
+ * but usable in any JS runtime (browser, vitest, bun, deno).
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/worker/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}