orez 0.3.8 → 0.4.0
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/bench/serial-mutations.bench.js +1 -1
- package/dist/cf-do/worker.d.ts +1 -1
- package/dist/cf-do/worker.d.ts.map +1 -1
- package/dist/cf-do/worker.js +4 -4
- package/dist/cf-do/worker.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -2
- package/dist/index.js.map +1 -1
- package/dist/pg-proxy-browser.d.ts.map +1 -1
- package/dist/pg-proxy-browser.js +14 -2
- package/dist/pg-proxy-browser.js.map +1 -1
- package/dist/pg-proxy-do-backend.d.ts.map +1 -1
- package/dist/pg-proxy-do-backend.js +117 -34
- package/dist/pg-proxy-do-backend.js.map +1 -1
- package/dist/pg-proxy.d.ts +16 -1
- package/dist/pg-proxy.d.ts.map +1 -1
- package/dist/pg-proxy.js +17 -1
- package/dist/pg-proxy.js.map +1 -1
- package/dist/pg-sqlite-compiler/index.d.ts.map +1 -1
- package/dist/pg-sqlite-compiler/index.js +3 -1
- package/dist/pg-sqlite-compiler/index.js.map +1 -1
- package/dist/pg-sqlite-compiler/passes/types.js +1 -1
- package/dist/pg-sqlite-compiler/passes/types.js.map +1 -1
- package/dist/replication/handler.d.ts.map +1 -1
- package/dist/replication/handler.js +8 -3
- package/dist/replication/handler.js.map +1 -1
- package/dist/sqlite-keyword-identifiers.d.ts +3 -0
- package/dist/sqlite-keyword-identifiers.d.ts.map +1 -0
- package/dist/sqlite-keyword-identifiers.js +233 -0
- package/dist/sqlite-keyword-identifiers.js.map +1 -0
- package/dist/worker/cf-patches.d.ts.map +1 -1
- package/dist/worker/cf-patches.js +46 -7
- package/dist/worker/cf-patches.js.map +1 -1
- package/dist/worker/{hibernated-websocket-handoff.d.ts → durable-object-websocket-handoff.d.ts} +11 -17
- package/dist/worker/durable-object-websocket-handoff.d.ts.map +1 -0
- package/dist/worker/durable-object-websocket-handoff.js +230 -0
- package/dist/worker/durable-object-websocket-handoff.js.map +1 -0
- package/dist/worker/shims/sqlite.d.ts.map +1 -1
- package/dist/worker/shims/sqlite.js +242 -30
- package/dist/worker/shims/sqlite.js.map +1 -1
- package/dist/worker/zero-cache-embed-cf.d.ts +6 -13
- package/dist/worker/zero-cache-embed-cf.d.ts.map +1 -1
- package/dist/worker/zero-cache-embed-cf.js +12 -20
- package/dist/worker/zero-cache-embed-cf.js.map +1 -1
- package/package.json +4 -4
- package/dist/cf-do/test-protocol.d.ts +0 -11
- package/dist/cf-do/test-protocol.d.ts.map +0 -1
- package/dist/cf-do/test-protocol.js +0 -137
- package/dist/cf-do/test-protocol.js.map +0 -1
- package/dist/query-rewrites.d.ts +0 -2
- package/dist/query-rewrites.d.ts.map +0 -1
- package/dist/query-rewrites.js +0 -140
- package/dist/query-rewrites.js.map +0 -1
- package/dist/worker/hibernated-websocket-handoff.d.ts.map +0 -1
- package/dist/worker/hibernated-websocket-handoff.js +0 -212
- package/dist/worker/hibernated-websocket-handoff.js.map +0 -1
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
const OPEN = 1;
|
|
2
|
-
const CLOSING = 2;
|
|
3
|
-
const CLOSED = 3;
|
|
4
|
-
const ZERO_CACHE_SOCKET_ATTACHMENT_TYPE = 'orez-zero-cache-handoff-v1';
|
|
5
|
-
function isHandoffAttachment(value) {
|
|
6
|
-
if (!value || typeof value !== 'object')
|
|
7
|
-
return false;
|
|
8
|
-
const record = value;
|
|
9
|
-
return (record.type === ZERO_CACHE_SOCKET_ATTACHMENT_TYPE &&
|
|
10
|
-
typeof record.id === 'string' &&
|
|
11
|
-
Boolean(record.message) &&
|
|
12
|
-
typeof record.message === 'object');
|
|
13
|
-
}
|
|
14
|
-
function errorMessage(error) {
|
|
15
|
-
return error instanceof Error ? error.message : String(error);
|
|
16
|
-
}
|
|
17
|
-
function createLocalSocketBridge(cfSocket, onClose) {
|
|
18
|
-
const listeners = new Map();
|
|
19
|
-
let readyState = OPEN;
|
|
20
|
-
function addEventListener(type, handler) {
|
|
21
|
-
let handlers = listeners.get(type);
|
|
22
|
-
if (!handlers) {
|
|
23
|
-
handlers = new Set();
|
|
24
|
-
listeners.set(type, handlers);
|
|
25
|
-
}
|
|
26
|
-
handlers.add(handler);
|
|
27
|
-
}
|
|
28
|
-
function removeEventListener(type, handler) {
|
|
29
|
-
listeners.get(type)?.delete(handler);
|
|
30
|
-
}
|
|
31
|
-
function emit(type, event) {
|
|
32
|
-
const handlers = listeners.get(type);
|
|
33
|
-
if (!handlers)
|
|
34
|
-
return;
|
|
35
|
-
for (const handler of [...handlers])
|
|
36
|
-
handler(event);
|
|
37
|
-
}
|
|
38
|
-
function markClosed(code, reason, wasClean) {
|
|
39
|
-
if (readyState === CLOSED)
|
|
40
|
-
return;
|
|
41
|
-
readyState = CLOSED;
|
|
42
|
-
emit('close', { code, reason, wasClean });
|
|
43
|
-
listeners.clear();
|
|
44
|
-
onClose();
|
|
45
|
-
}
|
|
46
|
-
const localSocket = {
|
|
47
|
-
accept() { },
|
|
48
|
-
get readyState() {
|
|
49
|
-
return readyState;
|
|
50
|
-
},
|
|
51
|
-
send(data) {
|
|
52
|
-
if (readyState !== OPEN || cfSocket.readyState === CLOSED) {
|
|
53
|
-
throw new Error('WebSocket is closed');
|
|
54
|
-
}
|
|
55
|
-
cfSocket.send(data);
|
|
56
|
-
},
|
|
57
|
-
close(code, reason) {
|
|
58
|
-
if (readyState === CLOSED)
|
|
59
|
-
return;
|
|
60
|
-
readyState = CLOSING;
|
|
61
|
-
try {
|
|
62
|
-
cfSocket.close(code, reason);
|
|
63
|
-
}
|
|
64
|
-
finally {
|
|
65
|
-
markClosed(code ?? 1000, reason ?? '', true);
|
|
66
|
-
}
|
|
67
|
-
},
|
|
68
|
-
addEventListener,
|
|
69
|
-
removeEventListener,
|
|
70
|
-
receive(data) {
|
|
71
|
-
if (readyState === CLOSED)
|
|
72
|
-
return;
|
|
73
|
-
readyState = OPEN;
|
|
74
|
-
emit('message', { data });
|
|
75
|
-
},
|
|
76
|
-
closeFromPeer(code, reason, wasClean) {
|
|
77
|
-
markClosed(code, reason, wasClean);
|
|
78
|
-
},
|
|
79
|
-
errorFromPeer(error) {
|
|
80
|
-
emit('error', { error, message: errorMessage(error) });
|
|
81
|
-
markClosed(1011, errorMessage(error), false);
|
|
82
|
-
},
|
|
83
|
-
};
|
|
84
|
-
return localSocket;
|
|
85
|
-
}
|
|
86
|
-
export class HibernatedWebSocketHandoff {
|
|
87
|
-
getFastify;
|
|
88
|
-
#bridges = new Map();
|
|
89
|
-
#socketIds = new WeakMap();
|
|
90
|
-
constructor(getFastify) {
|
|
91
|
-
this.getFastify = getFastify;
|
|
92
|
-
}
|
|
93
|
-
accept(durableObjectState, server, message) {
|
|
94
|
-
const id = crypto.randomUUID();
|
|
95
|
-
const attachment = {
|
|
96
|
-
type: ZERO_CACHE_SOCKET_ATTACHMENT_TYPE,
|
|
97
|
-
id,
|
|
98
|
-
message,
|
|
99
|
-
};
|
|
100
|
-
durableObjectState.acceptWebSocket(server);
|
|
101
|
-
server.serializeAttachment(attachment);
|
|
102
|
-
this.#socketIds.set(server, id);
|
|
103
|
-
const bridge = this.#createBridge(id, server, message);
|
|
104
|
-
const handed = this.#handoff(bridge);
|
|
105
|
-
// durable diagnostic: a `handoff=false` here means no fastify instance
|
|
106
|
-
// consumed the upgrade (the CF-DO sync-dead class — see the /sync emit
|
|
107
|
-
// fallback in #handoff). one cheap line per connection, greppable in
|
|
108
|
-
// `wrangler tail`.
|
|
109
|
-
console.log(`[orez-ws] accept handoff=${handed} url=${message.url}`);
|
|
110
|
-
if (!handed) {
|
|
111
|
-
bridge.close(1011, 'zero-cache websocket route unavailable', false);
|
|
112
|
-
return false;
|
|
113
|
-
}
|
|
114
|
-
return true;
|
|
115
|
-
}
|
|
116
|
-
handleMessage(socket, messageData) {
|
|
117
|
-
const bridge = this.#bridgeForSocket(socket);
|
|
118
|
-
if (!bridge) {
|
|
119
|
-
socket.close(1011, 'missing zero-cache websocket attachment');
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
bridge.receive(messageData);
|
|
123
|
-
}
|
|
124
|
-
handleClose(socket, code, reason, wasClean) {
|
|
125
|
-
const bridge = this.#bridgeForSocket(socket);
|
|
126
|
-
if (!bridge)
|
|
127
|
-
return;
|
|
128
|
-
bridge.close(code, reason, wasClean);
|
|
129
|
-
}
|
|
130
|
-
handleError(socket, error) {
|
|
131
|
-
const bridge = this.#bridgeForSocket(socket);
|
|
132
|
-
if (!bridge)
|
|
133
|
-
return;
|
|
134
|
-
bridge.error(error);
|
|
135
|
-
}
|
|
136
|
-
#bridgeForSocket(socket) {
|
|
137
|
-
const attachment = this.#attachmentForSocket(socket);
|
|
138
|
-
if (!attachment)
|
|
139
|
-
return undefined;
|
|
140
|
-
const existing = this.#bridges.get(attachment.id);
|
|
141
|
-
if (existing)
|
|
142
|
-
return existing;
|
|
143
|
-
const bridge = this.#createBridge(attachment.id, socket, attachment.message);
|
|
144
|
-
if (!this.#handoff(bridge)) {
|
|
145
|
-
bridge.close(1011, 'zero-cache websocket route unavailable', false);
|
|
146
|
-
return undefined;
|
|
147
|
-
}
|
|
148
|
-
return bridge;
|
|
149
|
-
}
|
|
150
|
-
#attachmentForSocket(socket) {
|
|
151
|
-
const attachment = socket.deserializeAttachment();
|
|
152
|
-
if (isHandoffAttachment(attachment))
|
|
153
|
-
return attachment;
|
|
154
|
-
const id = this.#socketIds.get(socket);
|
|
155
|
-
if (!id)
|
|
156
|
-
return undefined;
|
|
157
|
-
const bridge = this.#bridges.get(id);
|
|
158
|
-
if (!bridge)
|
|
159
|
-
return undefined;
|
|
160
|
-
return {
|
|
161
|
-
type: ZERO_CACHE_SOCKET_ATTACHMENT_TYPE,
|
|
162
|
-
id,
|
|
163
|
-
message: bridge.message,
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
#createBridge(id, cfSocket, message) {
|
|
167
|
-
const localSocket = createLocalSocketBridge(cfSocket, () => {
|
|
168
|
-
this.#bridges.delete(id);
|
|
169
|
-
this.#socketIds.delete(cfSocket);
|
|
170
|
-
});
|
|
171
|
-
const bridge = {
|
|
172
|
-
id,
|
|
173
|
-
message,
|
|
174
|
-
socket: localSocket,
|
|
175
|
-
receive: localSocket.receive,
|
|
176
|
-
close: localSocket.closeFromPeer,
|
|
177
|
-
error: localSocket.errorFromPeer,
|
|
178
|
-
};
|
|
179
|
-
this.#bridges.set(id, bridge);
|
|
180
|
-
this.#socketIds.set(cfSocket, id);
|
|
181
|
-
return bridge;
|
|
182
|
-
}
|
|
183
|
-
#handoff(bridge) {
|
|
184
|
-
const handoffMsg = { message: bridge.message, head: new Uint8Array(0) };
|
|
185
|
-
const g = globalThis;
|
|
186
|
-
const instances = g.__orez_fastify_instances ?? [];
|
|
187
|
-
// 1. {websocket:true} routes (e.g. /replication/*/changes) are matched by
|
|
188
|
-
// the fastify shim's tryHandoff. iterate every instance, stop at first.
|
|
189
|
-
for (const inst of instances) {
|
|
190
|
-
if (inst?.tryHandoff?.(handoffMsg, bridge.socket))
|
|
191
|
-
return true;
|
|
192
|
-
}
|
|
193
|
-
const fallback = (this.getFastify() ?? g.__orez_fastify_instance);
|
|
194
|
-
if (!instances.length && fallback?.tryHandoff?.(handoffMsg, bridge.socket)) {
|
|
195
|
-
return true;
|
|
196
|
-
}
|
|
197
|
-
// 2. the /sync/v*/connect path is served by the ZeroDispatcher's
|
|
198
|
-
// server.onMessageType('handoff') listener, NOT a {websocket:true} route,
|
|
199
|
-
// so tryHandoff never matches it. emit the handoff on the dispatcher's
|
|
200
|
-
// server — mirroring the in-process ws shim (shims/ws.ts:187-189). WITHOUT
|
|
201
|
-
// this, the DO acceptWebSocket()s the server half, tryHandoff returns
|
|
202
|
-
// false, the upgrade returns a 404 with no paired client socket, and the
|
|
203
|
-
// browser sees an abnormal close (1006) → deployed-app sync is dead.
|
|
204
|
-
const server = fallback?.server;
|
|
205
|
-
if (server?.emit) {
|
|
206
|
-
server.emit('message', ['handoff', handoffMsg], bridge.socket);
|
|
207
|
-
return true;
|
|
208
|
-
}
|
|
209
|
-
return false;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
//# sourceMappingURL=hibernated-websocket-handoff.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hibernated-websocket-handoff.js","sourceRoot":"","sources":["../../src/worker/hibernated-websocket-handoff.ts"],"names":[],"mappings":"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"}
|