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.
- package/dist/cli-entry.js +0 -0
- package/dist/cli.js +7 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -11
- package/dist/index.js.map +1 -1
- package/dist/pg-proxy.d.ts.map +1 -1
- package/dist/pg-proxy.js +8 -4
- package/dist/pg-proxy.js.map +1 -1
- package/dist/pglite-manager.d.ts +12 -0
- package/dist/pglite-manager.d.ts.map +1 -1
- package/dist/pglite-manager.js +81 -0
- package/dist/pglite-manager.js.map +1 -1
- package/dist/recovery.js +2 -2
- package/dist/recovery.js.map +1 -1
- package/dist/replication/change-tracker.js +9 -9
- package/dist/replication/change-tracker.js.map +1 -1
- package/dist/replication/handler.d.ts +12 -0
- package/dist/replication/handler.d.ts.map +1 -1
- package/dist/replication/handler.js +34 -6
- package/dist/replication/handler.js.map +1 -1
- package/dist/worker/browser-build-config.d.ts +59 -0
- package/dist/worker/browser-build-config.d.ts.map +1 -0
- package/dist/worker/browser-build-config.js +101 -0
- package/dist/worker/browser-build-config.js.map +1 -0
- package/dist/worker/browser-embed.d.ts +58 -0
- package/dist/worker/browser-embed.d.ts.map +1 -0
- package/dist/worker/browser-embed.js +195 -0
- package/dist/worker/browser-embed.js.map +1 -0
- package/dist/worker/cf-patches.d.ts +20 -0
- package/dist/worker/cf-patches.d.ts.map +1 -0
- package/dist/worker/cf-patches.js +94 -0
- package/dist/worker/cf-patches.js.map +1 -0
- package/dist/worker/index.d.ts +12 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +105 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/shims/fastify.d.ts +80 -0
- package/dist/worker/shims/fastify.d.ts.map +1 -0
- package/dist/worker/shims/fastify.js +223 -0
- package/dist/worker/shims/fastify.js.map +1 -0
- package/dist/worker/shims/http-service.d.ts +104 -0
- package/dist/worker/shims/http-service.d.ts.map +1 -0
- package/dist/worker/shims/http-service.js +198 -0
- package/dist/worker/shims/http-service.js.map +1 -0
- package/dist/worker/shims/node-stub.d.ts +147 -0
- package/dist/worker/shims/node-stub.d.ts.map +1 -0
- package/dist/worker/shims/node-stub.js +204 -0
- package/dist/worker/shims/node-stub.js.map +1 -0
- package/dist/worker/shims/postgres.d.ts +115 -0
- package/dist/worker/shims/postgres.d.ts.map +1 -0
- package/dist/worker/shims/postgres.js +1181 -0
- package/dist/worker/shims/postgres.js.map +1 -0
- package/dist/worker/shims/sqlite-browser.d.ts +54 -0
- package/dist/worker/shims/sqlite-browser.d.ts.map +1 -0
- package/dist/worker/shims/sqlite-browser.js +144 -0
- package/dist/worker/shims/sqlite-browser.js.map +1 -0
- package/dist/worker/shims/sqlite.d.ts +126 -0
- package/dist/worker/shims/sqlite.d.ts.map +1 -0
- package/dist/worker/shims/sqlite.js +599 -0
- package/dist/worker/shims/sqlite.js.map +1 -0
- package/dist/worker/shims/stream-browser.d.ts +9 -0
- package/dist/worker/shims/stream-browser.d.ts.map +1 -0
- package/dist/worker/shims/stream-browser.js +13 -0
- package/dist/worker/shims/stream-browser.js.map +1 -0
- package/dist/worker/shims/ws-browser.d.ts +50 -0
- package/dist/worker/shims/ws-browser.d.ts.map +1 -0
- package/dist/worker/shims/ws-browser.js +105 -0
- package/dist/worker/shims/ws-browser.js.map +1 -0
- package/dist/worker/shims/ws.d.ts +62 -0
- package/dist/worker/shims/ws.d.ts.map +1 -0
- package/dist/worker/shims/ws.js +310 -0
- package/dist/worker/shims/ws.js.map +1 -0
- package/dist/worker/types.d.ts +57 -0
- package/dist/worker/types.d.ts.map +1 -0
- package/dist/worker/types.js +9 -0
- package/dist/worker/types.js.map +1 -0
- package/dist/worker/zero-cache-embed-cf.d.ts +63 -0
- package/dist/worker/zero-cache-embed-cf.d.ts.map +1 -0
- package/dist/worker/zero-cache-embed-cf.js +268 -0
- package/dist/worker/zero-cache-embed-cf.js.map +1 -0
- package/dist/worker/zero-cache-embed.d.ts +66 -0
- package/dist/worker/zero-cache-embed.d.ts.map +1 -0
- package/dist/worker/zero-cache-embed.js +200 -0
- package/dist/worker/zero-cache-embed.js.map +1 -0
- package/package.json +62 -3
- package/src/cli-entry.ts +0 -0
- package/src/cli.ts +8 -1
- package/src/config.ts +2 -0
- package/src/index.ts +15 -10
- package/src/integration/integration.test.ts +1 -1
- package/src/integration/restore-live-stress.test.ts +2 -2
- package/src/pg-proxy.ts +9 -4
- package/src/pglite-manager.ts +111 -0
- package/src/recovery.ts +2 -2
- package/src/replication/change-tracker.test.ts +1 -1
- package/src/replication/change-tracker.ts +9 -9
- package/src/replication/handler.test.ts +37 -0
- package/src/replication/handler.ts +46 -6
- package/src/wasm-sqlite.test.ts +2 -1
- package/src/worker/browser-build-config.test.ts +59 -0
- package/src/worker/browser-build-config.ts +105 -0
- package/src/worker/browser-embed.ts +306 -0
- package/src/worker/cf-patches.ts +114 -0
- package/src/worker/embed-integration.test.ts +321 -0
- package/src/worker/index.ts +138 -0
- package/src/worker/shims/fastify.test.ts +255 -0
- package/src/worker/shims/fastify.ts +292 -0
- package/src/worker/shims/http-service.test.ts +355 -0
- package/src/worker/shims/http-service.ts +293 -0
- package/src/worker/shims/node-stub.ts +223 -0
- package/src/worker/shims/postgres.test.ts +364 -0
- package/src/worker/shims/postgres.ts +1434 -0
- package/src/worker/shims/sqlite-browser.test.ts +233 -0
- package/src/worker/shims/sqlite-browser.ts +178 -0
- package/src/worker/shims/sqlite.test.ts +641 -0
- package/src/worker/shims/sqlite.ts +731 -0
- package/src/worker/shims/ws-browser.test.ts +184 -0
- package/src/worker/shims/ws-browser.ts +125 -0
- package/src/worker/shims/ws.test.ts +288 -0
- package/src/worker/shims/ws.ts +367 -0
- package/src/worker/types.ts +75 -0
- package/src/worker/worker-integration.test.ts +223 -0
- package/src/worker/worker.test.ts +136 -0
- package/src/worker/zero-cache-embed-cf.ts +367 -0
- 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"}
|