orez-sync-executor 0.11.1 → 0.11.2
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/realtime/host.d.ts +7 -0
- package/dist/realtime/host.d.ts.map +1 -0
- package/dist/realtime/host.js +77 -0
- package/dist/realtime/host.js.map +1 -0
- package/dist/realtime/hub.d.ts +67 -0
- package/dist/realtime/hub.d.ts.map +1 -0
- package/dist/realtime/hub.js +456 -0
- package/dist/realtime/hub.js.map +1 -0
- package/dist/realtime/index.d.ts +24 -0
- package/dist/realtime/index.d.ts.map +1 -0
- package/dist/realtime/index.js +27 -0
- package/dist/realtime/index.js.map +1 -0
- package/dist/realtime/local.d.ts +15 -0
- package/dist/realtime/local.d.ts.map +1 -0
- package/dist/realtime/local.js +63 -0
- package/dist/realtime/local.js.map +1 -0
- package/dist/realtime/manifest.d.ts +51 -0
- package/dist/realtime/manifest.d.ts.map +1 -0
- package/dist/realtime/manifest.js +110 -0
- package/dist/realtime/manifest.js.map +1 -0
- package/dist/realtime/message-port.d.ts +34 -0
- package/dist/realtime/message-port.d.ts.map +1 -0
- package/dist/realtime/message-port.js +141 -0
- package/dist/realtime/message-port.js.map +1 -0
- package/dist/realtime/producer-socket.d.ts +10 -0
- package/dist/realtime/producer-socket.d.ts.map +1 -0
- package/dist/realtime/producer-socket.js +90 -0
- package/dist/realtime/producer-socket.js.map +1 -0
- package/dist/realtime/producer.d.ts +16 -0
- package/dist/realtime/producer.d.ts.map +1 -0
- package/dist/realtime/producer.js +51 -0
- package/dist/realtime/producer.js.map +1 -0
- package/dist/realtime/protocol.d.ts +99 -0
- package/dist/realtime/protocol.d.ts.map +1 -0
- package/dist/realtime/protocol.js +191 -0
- package/dist/realtime/protocol.js.map +1 -0
- package/dist/realtime/publisher.d.ts +28 -0
- package/dist/realtime/publisher.d.ts.map +1 -0
- package/dist/realtime/publisher.js +309 -0
- package/dist/realtime/publisher.js.map +1 -0
- package/dist/realtime/socket-host.d.ts +25 -0
- package/dist/realtime/socket-host.d.ts.map +1 -0
- package/dist/realtime/socket-host.js +105 -0
- package/dist/realtime/socket-host.js.map +1 -0
- package/dist/realtime/store.d.ts +28 -0
- package/dist/realtime/store.d.ts.map +1 -0
- package/dist/realtime/store.js +0 -0
- package/dist/realtime/store.js.map +1 -0
- package/dist/realtime/writer.d.ts +17 -0
- package/dist/realtime/writer.d.ts.map +1 -0
- package/dist/realtime/writer.js +138 -0
- package/dist/realtime/writer.js.map +1 -0
- package/package.json +5 -1
- package/dist/adapters.d.ts +0 -25
- package/dist/adapters.d.ts.map +0 -1
- package/dist/adapters.js +0 -116
- package/dist/adapters.js.map +0 -1
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
// The producer side of a streaming field.
|
|
2
|
+
//
|
|
3
|
+
// A producer opens one generation per field, pushes values, and finishes by
|
|
4
|
+
// running the application's authoritative durable write. Orez never performs
|
|
5
|
+
// that write: in a delegated-push deployment the application worker is the
|
|
6
|
+
// write authority, so the commit is a callback the application supplies.
|
|
7
|
+
//
|
|
8
|
+
// The transport is injected. Trusted server code gets an in-process publisher
|
|
9
|
+
// on the native and local hosts; on Cloudflare the same interface is backed by
|
|
10
|
+
// one private service-bound producer WebSocket per generation.
|
|
11
|
+
import { canonicalTopic } from './protocol.js';
|
|
12
|
+
export class RealtimePublisher {
|
|
13
|
+
#transport;
|
|
14
|
+
#manifest;
|
|
15
|
+
#now;
|
|
16
|
+
#randomID;
|
|
17
|
+
constructor(transport, manifest, options = {}) {
|
|
18
|
+
this.#transport = transport;
|
|
19
|
+
this.#manifest = manifest;
|
|
20
|
+
this.#now = options.now ?? (() => Date.now());
|
|
21
|
+
this.#randomID = options.randomID ?? (() => crypto.randomUUID());
|
|
22
|
+
}
|
|
23
|
+
async begin(table, field, options) {
|
|
24
|
+
const spec = this.#manifest.fields.get(`${table}.${field}`);
|
|
25
|
+
if (!spec) {
|
|
26
|
+
throw new TypeError(`'${table}.${field}' is not a streaming field in this manifest`);
|
|
27
|
+
}
|
|
28
|
+
const topic = { table, key: options.key, field };
|
|
29
|
+
for (const column of spec.primaryKey) {
|
|
30
|
+
if (options.key[column] === undefined) {
|
|
31
|
+
throw new TypeError(`streaming topic '${table}.${field}' is missing primary key column '${column}'`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const streamID = this.#randomID();
|
|
35
|
+
await this.#transport.begin(topic, streamID);
|
|
36
|
+
return new Session(this.#transport, spec, topic, canonicalTopic(spec.primaryKey, topic), streamID, this.#now);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
class Session {
|
|
40
|
+
streamID;
|
|
41
|
+
topic;
|
|
42
|
+
#transport;
|
|
43
|
+
#spec;
|
|
44
|
+
#id;
|
|
45
|
+
#now;
|
|
46
|
+
#seq = 0;
|
|
47
|
+
// what the subscribers have been told, so append mode can ship the suffix
|
|
48
|
+
#delivered = '';
|
|
49
|
+
#started = false;
|
|
50
|
+
#closed = false;
|
|
51
|
+
#pending;
|
|
52
|
+
#inFlight = Promise.resolve();
|
|
53
|
+
// A background flush cannot reject into the caller's stack, so a transport
|
|
54
|
+
// failure (most often: this generation was superseded by a retry) is held
|
|
55
|
+
// here and raised on the next set/finish. Without this the failure would
|
|
56
|
+
// surface as an unhandled rejection and the producer would keep writing into
|
|
57
|
+
// a stream nobody accepts.
|
|
58
|
+
#failure;
|
|
59
|
+
constructor(transport, spec, topic, id, streamID, now) {
|
|
60
|
+
this.#transport = transport;
|
|
61
|
+
this.#spec = spec;
|
|
62
|
+
this.topic = topic;
|
|
63
|
+
this.#id = id;
|
|
64
|
+
this.streamID = streamID;
|
|
65
|
+
this.#now = now;
|
|
66
|
+
this.#pending = {
|
|
67
|
+
value: undefined,
|
|
68
|
+
windowBytes: 0,
|
|
69
|
+
windowUpdates: 0,
|
|
70
|
+
windowStartedAt: now(),
|
|
71
|
+
timer: undefined,
|
|
72
|
+
flushing: false,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
set(value) {
|
|
76
|
+
this.#throwIfUnusable();
|
|
77
|
+
this.#validate(value);
|
|
78
|
+
this.#pending.value = value;
|
|
79
|
+
this.#schedule();
|
|
80
|
+
}
|
|
81
|
+
// Deliver whatever is pending now, waiting only as long as the manifest's
|
|
82
|
+
// rate bounds require. `set` is fire-and-forget by design so a token loop
|
|
83
|
+
// never awaits; this is for the places a producer needs the value to have
|
|
84
|
+
// actually left: a semantic checkpoint, or a deterministic test.
|
|
85
|
+
//
|
|
86
|
+
// It waits rather than bypassing the bound, so a producer calling flush in a
|
|
87
|
+
// loop still cannot exceed its declared maxUpdatesPerSecond.
|
|
88
|
+
async flush() {
|
|
89
|
+
this.#throwIfUnusable();
|
|
90
|
+
if (this.#pending.value === undefined)
|
|
91
|
+
return;
|
|
92
|
+
const delay = this.#delayUntilAllowed();
|
|
93
|
+
if (delay > 0)
|
|
94
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
95
|
+
// A scheduled flush can fire during that wait, and if it failed then this
|
|
96
|
+
// generation is dead and its pending value was never delivered. Re-checking
|
|
97
|
+
// is what keeps flush() honest: it either delivered, or it throws. Without
|
|
98
|
+
// it the scheduled flush's suffix bookkeeping makes the retry here a no-op
|
|
99
|
+
// and the producer is told its value went out when it did not.
|
|
100
|
+
this.#throwIfUnusable();
|
|
101
|
+
this.#cancelTimer();
|
|
102
|
+
await this.#flush(false);
|
|
103
|
+
}
|
|
104
|
+
async finish(value, commit) {
|
|
105
|
+
this.#throwIfUnusable();
|
|
106
|
+
this.#validate(value);
|
|
107
|
+
this.#pending.value = value;
|
|
108
|
+
this.#cancelTimer();
|
|
109
|
+
// 1. flush the final value so subscribers see it before the commit round-trip
|
|
110
|
+
await this.#flush(true);
|
|
111
|
+
// 2. the application's authoritative durable write. Orez cannot do this
|
|
112
|
+
// generically: in a delegated-push deployment the application worker is
|
|
113
|
+
// the write authority.
|
|
114
|
+
await commit();
|
|
115
|
+
// 3. `end` puts every subscriber in `committing`, holding the final overlay
|
|
116
|
+
// until their own Zero query produces the committed value. No waiting on
|
|
117
|
+
// replication here: the client's durable-equality check is what ends the
|
|
118
|
+
// overlay, and blocking the generation on replica observation would
|
|
119
|
+
// couple producer lifetime to pull lag for no extra safety.
|
|
120
|
+
this.#closed = true;
|
|
121
|
+
await this.#emit({
|
|
122
|
+
topic: this.#id,
|
|
123
|
+
streamID: this.streamID,
|
|
124
|
+
seq: ++this.#seq,
|
|
125
|
+
op: 'end',
|
|
126
|
+
});
|
|
127
|
+
await this.#transport.end(this.streamID);
|
|
128
|
+
}
|
|
129
|
+
async abort() {
|
|
130
|
+
if (this.#closed)
|
|
131
|
+
return;
|
|
132
|
+
this.#closed = true;
|
|
133
|
+
this.#cancelTimer();
|
|
134
|
+
await this.#emit({
|
|
135
|
+
topic: this.#id,
|
|
136
|
+
streamID: this.streamID,
|
|
137
|
+
seq: ++this.#seq,
|
|
138
|
+
op: 'abort',
|
|
139
|
+
});
|
|
140
|
+
await this.#transport.end(this.streamID);
|
|
141
|
+
}
|
|
142
|
+
#throwIfUnusable() {
|
|
143
|
+
if (this.#failure)
|
|
144
|
+
throw this.#failure;
|
|
145
|
+
if (this.#closed)
|
|
146
|
+
throw new Error('streaming field generation is already closed');
|
|
147
|
+
}
|
|
148
|
+
#validate(value) {
|
|
149
|
+
if (this.#spec.mode === 'append' && typeof value !== 'string') {
|
|
150
|
+
throw new TypeError(`streaming field '${this.#spec.table}.${this.#spec.field}' is append mode and takes a string`);
|
|
151
|
+
}
|
|
152
|
+
if (this.#spec.validate && !this.#spec.validate(value)) {
|
|
153
|
+
throw new TypeError(`streaming field '${this.#spec.table}.${this.#spec.field}' rejected a value in validate()`);
|
|
154
|
+
}
|
|
155
|
+
const bytes = byteLength(typeof value === 'string' ? value : JSON.stringify(value ?? null));
|
|
156
|
+
if (bytes > this.#spec.maxBytes) {
|
|
157
|
+
throw new RangeError(`streaming field '${this.#spec.table}.${this.#spec.field}' value is ${bytes} bytes, over its ${this.#spec.maxBytes} maxBytes`);
|
|
158
|
+
}
|
|
159
|
+
if (this.#spec.mode === 'append' && this.#started) {
|
|
160
|
+
// append ships suffixes, so the value must only ever grow. A producer that
|
|
161
|
+
// rewrites history needs `mode: 'replace'`; silently shipping a bogus
|
|
162
|
+
// suffix would leave every subscriber with a corrupted value.
|
|
163
|
+
const next = value;
|
|
164
|
+
if (!next.startsWith(this.#delivered)) {
|
|
165
|
+
// A text column holding JSON is the common way to hit this: the
|
|
166
|
+
// manifest infers append from the Zero column type, but the producer
|
|
167
|
+
// replaces the value rather than extending it. Naming the fix here
|
|
168
|
+
// saves the reader from inferring it from a corrupted overlay.
|
|
169
|
+
throw new TypeError(`streaming field '${this.#spec.table}.${this.#spec.field}' is append mode, but its new value is not an extension of what was already sent. ` +
|
|
170
|
+
`Append ships only the added suffix, so the value must grow. If this field is replaced rather than extended (a JSON payload in a text column, for example), declare mode: 'replace' for it in the manifest.`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
#schedule() {
|
|
175
|
+
if (this.#pending.timer || this.#pending.flushing || this.#failure)
|
|
176
|
+
return;
|
|
177
|
+
const delay = this.#delayUntilAllowed();
|
|
178
|
+
if (delay === 0) {
|
|
179
|
+
void this.#flush(false).catch((error) => this.#fail(error));
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
this.#pending.timer = setTimeout(() => {
|
|
183
|
+
this.#pending.timer = undefined;
|
|
184
|
+
void this.#flush(false).catch((error) => this.#fail(error));
|
|
185
|
+
}, delay);
|
|
186
|
+
}
|
|
187
|
+
// How long before another update may go out, honouring BOTH manifest bounds.
|
|
188
|
+
// In append mode the byte budget is charged against new bytes only, which is
|
|
189
|
+
// what keeps a long generation's update rate flat instead of degrading as the
|
|
190
|
+
// accumulated value grows.
|
|
191
|
+
#delayUntilAllowed() {
|
|
192
|
+
const now = this.#now();
|
|
193
|
+
const elapsed = now - this.#pending.windowStartedAt;
|
|
194
|
+
if (elapsed >= 1000)
|
|
195
|
+
return 0;
|
|
196
|
+
const newBytes = this.#pendingBytes();
|
|
197
|
+
const overUpdates = this.#pending.windowUpdates >= this.#spec.maxUpdatesPerSecond;
|
|
198
|
+
const overBytes = this.#pending.windowBytes + newBytes > this.#spec.maxBytesPerSecond;
|
|
199
|
+
if (!overUpdates && !overBytes) {
|
|
200
|
+
// spread updates evenly rather than bursting then starving
|
|
201
|
+
const minGap = Math.floor(1000 / this.#spec.maxUpdatesPerSecond);
|
|
202
|
+
const sinceWindowStart = elapsed;
|
|
203
|
+
const expected = this.#pending.windowUpdates * minGap;
|
|
204
|
+
return Math.max(0, expected - sinceWindowStart);
|
|
205
|
+
}
|
|
206
|
+
return 1000 - elapsed;
|
|
207
|
+
}
|
|
208
|
+
#pendingBytes() {
|
|
209
|
+
const value = this.#pending.value;
|
|
210
|
+
if (this.#spec.mode === 'append') {
|
|
211
|
+
const text = value ?? '';
|
|
212
|
+
return byteLength(text.slice(this.#delivered.length));
|
|
213
|
+
}
|
|
214
|
+
return byteLength(JSON.stringify(value ?? null));
|
|
215
|
+
}
|
|
216
|
+
async #flush(final) {
|
|
217
|
+
const value = this.#pending.value;
|
|
218
|
+
if (value === undefined)
|
|
219
|
+
return;
|
|
220
|
+
this.#pending.flushing = true;
|
|
221
|
+
try {
|
|
222
|
+
const now = this.#now();
|
|
223
|
+
if (now - this.#pending.windowStartedAt >= 1000) {
|
|
224
|
+
this.#pending.windowStartedAt = now;
|
|
225
|
+
this.#pending.windowBytes = 0;
|
|
226
|
+
this.#pending.windowUpdates = 0;
|
|
227
|
+
}
|
|
228
|
+
let update;
|
|
229
|
+
if (this.#spec.mode === 'append' && this.#started) {
|
|
230
|
+
const text = value.slice(this.#delivered.length);
|
|
231
|
+
if (!text && !final)
|
|
232
|
+
return;
|
|
233
|
+
update = {
|
|
234
|
+
topic: this.#id,
|
|
235
|
+
streamID: this.streamID,
|
|
236
|
+
seq: ++this.#seq,
|
|
237
|
+
op: 'append',
|
|
238
|
+
text,
|
|
239
|
+
};
|
|
240
|
+
this.#delivered = value;
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
update = {
|
|
244
|
+
topic: this.#id,
|
|
245
|
+
streamID: this.streamID,
|
|
246
|
+
seq: ++this.#seq,
|
|
247
|
+
op: 'snapshot',
|
|
248
|
+
value,
|
|
249
|
+
};
|
|
250
|
+
this.#started = true;
|
|
251
|
+
this.#delivered = this.#spec.mode === 'append' ? value : '';
|
|
252
|
+
}
|
|
253
|
+
this.#pending.windowBytes += this.#pendingBytes();
|
|
254
|
+
this.#pending.windowUpdates++;
|
|
255
|
+
await this.#emit(update);
|
|
256
|
+
}
|
|
257
|
+
finally {
|
|
258
|
+
this.#pending.flushing = false;
|
|
259
|
+
}
|
|
260
|
+
// a value that arrived while this flush was in flight still needs sending
|
|
261
|
+
if (!final && this.#pendingHasNewBytes())
|
|
262
|
+
this.#schedule();
|
|
263
|
+
}
|
|
264
|
+
#pendingHasNewBytes() {
|
|
265
|
+
if (this.#spec.mode !== 'append')
|
|
266
|
+
return false;
|
|
267
|
+
const text = this.#pending.value ?? '';
|
|
268
|
+
return text.length > this.#delivered.length;
|
|
269
|
+
}
|
|
270
|
+
#cancelTimer() {
|
|
271
|
+
if (this.#pending.timer) {
|
|
272
|
+
clearTimeout(this.#pending.timer);
|
|
273
|
+
this.#pending.timer = undefined;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
// Serialize every emit for the generation. WebSocket ordering owns frame
|
|
277
|
+
// order on the wire, but two overlapping flushes could otherwise hand the
|
|
278
|
+
// transport its frames out of sequence.
|
|
279
|
+
#emit(update) {
|
|
280
|
+
this.#inFlight = this.#inFlight.then(() => this.#transport.publish(update));
|
|
281
|
+
return this.#inFlight;
|
|
282
|
+
}
|
|
283
|
+
// Record a background failure and stop the generation. `finish` and `abort`
|
|
284
|
+
// await their emits directly, so they still reject into the caller; only the
|
|
285
|
+
// scheduled flushes route through here.
|
|
286
|
+
#fail(error) {
|
|
287
|
+
this.#failure = error instanceof Error ? error : new Error(String(error));
|
|
288
|
+
this.#closed = true;
|
|
289
|
+
this.#cancelTimer();
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
function byteLength(value) {
|
|
293
|
+
let bytes = 0;
|
|
294
|
+
for (let index = 0; index < value.length; index++) {
|
|
295
|
+
const code = value.charCodeAt(index);
|
|
296
|
+
if (code < 0x80)
|
|
297
|
+
bytes += 1;
|
|
298
|
+
else if (code < 0x800)
|
|
299
|
+
bytes += 2;
|
|
300
|
+
else if (code >= 0xd800 && code < 0xdc00) {
|
|
301
|
+
bytes += 4;
|
|
302
|
+
index++;
|
|
303
|
+
}
|
|
304
|
+
else
|
|
305
|
+
bytes += 3;
|
|
306
|
+
}
|
|
307
|
+
return bytes;
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=publisher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publisher.js","sourceRoot":"","sources":["../../src/realtime/publisher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { RealtimeHub } from './hub.js';
|
|
2
|
+
import type { HubOptions, RealtimeIdentity } from './hub.js';
|
|
3
|
+
import type { RealtimeTopic } from './protocol.js';
|
|
4
|
+
export type HostSocket = {
|
|
5
|
+
send(data: string): void;
|
|
6
|
+
};
|
|
7
|
+
export type HostConnection = {
|
|
8
|
+
handleMessage(raw: string): void;
|
|
9
|
+
close(): void;
|
|
10
|
+
topics(): readonly RealtimeTopic[];
|
|
11
|
+
};
|
|
12
|
+
export type RealtimeSocketHost = {
|
|
13
|
+
readonly hub: RealtimeHub;
|
|
14
|
+
acceptSubscriber(socket: HostSocket, identity: RealtimeIdentity, connectionID: string): HostConnection;
|
|
15
|
+
acceptProducer(socket: HostSocket, producerID: string): HostConnection;
|
|
16
|
+
rehydrate(entries: readonly {
|
|
17
|
+
socket: HostSocket;
|
|
18
|
+
identity: RealtimeIdentity;
|
|
19
|
+
connectionID: string;
|
|
20
|
+
topics: readonly RealtimeTopic[];
|
|
21
|
+
}[]): Promise<readonly HostConnection[]>;
|
|
22
|
+
flush(): void;
|
|
23
|
+
};
|
|
24
|
+
export declare function createSocketHost(options: HubOptions): RealtimeSocketHost;
|
|
25
|
+
//# sourceMappingURL=socket-host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket-host.d.ts","sourceRoot":"","sources":["../../src/realtime/socket-host.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAGtC,OAAO,KAAK,EAA8B,UAAU,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AACxF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAElD,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB,CAAA;AAOD,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,KAAK,IAAI,IAAI,CAAA;IACb,MAAM,IAAI,SAAS,aAAa,EAAE,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAA;IAIzB,gBAAgB,CACd,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,gBAAgB,EAC1B,YAAY,EAAE,MAAM,GACnB,cAAc,CAAA;IAIjB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,cAAc,CAAA;IAkBtE,SAAS,CACP,OAAO,EAAE,SAAS;QAChB,MAAM,EAAE,UAAU,CAAA;QAClB,QAAQ,EAAE,gBAAgB,CAAA;QAC1B,YAAY,EAAE,MAAM,CAAA;QACpB,MAAM,EAAE,SAAS,aAAa,EAAE,CAAA;KACjC,EAAE,GACF,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC,CAAA;IACrC,KAAK,IAAI,IAAI,CAAA;CACd,CAAA;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,kBAAkB,CA+FxE"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// The host role over sockets, for any runtime that has them.
|
|
2
|
+
//
|
|
3
|
+
// A Cloudflare Durable Object, a Node WebSocket server, and a test harness
|
|
4
|
+
// differ in how they accept a socket and in nothing else. So this owns the
|
|
5
|
+
// parts that are the same everywhere (which frames a role may send, when a
|
|
6
|
+
// connection is dropped, what survives a cold start) and leaves each runtime
|
|
7
|
+
// only its own socket lifecycle.
|
|
8
|
+
//
|
|
9
|
+
// The role split is enforced here rather than trusted. A subscriber socket is
|
|
10
|
+
// accepted as a subscriber and can never publish, whatever it sends: it has no
|
|
11
|
+
// producer handle, and the hub checks the handle rather than the frame. That is
|
|
12
|
+
// why a leaked streamID grants nothing.
|
|
13
|
+
import { applyClientFrame, applyProducerFrame } from './host.js';
|
|
14
|
+
import { RealtimeHub } from './hub.js';
|
|
15
|
+
import { decodeFrame, encodeFrame } from './protocol.js';
|
|
16
|
+
export function createSocketHost(options) {
|
|
17
|
+
const hub = new RealtimeHub(options);
|
|
18
|
+
// One subscriber, whether it is being accepted for the first time or rebuilt
|
|
19
|
+
// after an eviction. Both paths need the same tracking, so neither gets its
|
|
20
|
+
// own copy of it.
|
|
21
|
+
const subscriber = (socket, identity, connectionID) => {
|
|
22
|
+
// keyed for dedup, valued with the structured topic so `topics()` can hand
|
|
23
|
+
// back something `rehydrate` accepts without a second parser
|
|
24
|
+
const owned = new Map();
|
|
25
|
+
const connection = {
|
|
26
|
+
id: connectionID,
|
|
27
|
+
identity,
|
|
28
|
+
send: (frame) => {
|
|
29
|
+
socket.send(encodeFrame(frame));
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
const host = {
|
|
33
|
+
handleMessage(raw) {
|
|
34
|
+
const frame = decodeFrame(raw);
|
|
35
|
+
if (!frame)
|
|
36
|
+
return;
|
|
37
|
+
// A subscriber channel is never a publish channel, whatever arrives on
|
|
38
|
+
// it. Producer frames are not merely ignored by the hub here; they are
|
|
39
|
+
// refused before reaching it.
|
|
40
|
+
if (frame[0] !== 'subscribe' && frame[0] !== 'unsubscribe')
|
|
41
|
+
return;
|
|
42
|
+
if (frame[0] === 'subscribe')
|
|
43
|
+
owned.set(topicKey(frame[1].topic), frame[1].topic);
|
|
44
|
+
else
|
|
45
|
+
owned.delete(topicKey(frame[1].topic));
|
|
46
|
+
void applyClientFrame(hub, connection, frame);
|
|
47
|
+
},
|
|
48
|
+
close() {
|
|
49
|
+
hub.dropConnection(connectionID);
|
|
50
|
+
},
|
|
51
|
+
topics: () => [...owned.values()],
|
|
52
|
+
};
|
|
53
|
+
return { connection, owned, host };
|
|
54
|
+
};
|
|
55
|
+
return {
|
|
56
|
+
hub,
|
|
57
|
+
acceptSubscriber: (socket, identity, connectionID) => subscriber(socket, identity, connectionID).host,
|
|
58
|
+
acceptProducer(socket, producerID) {
|
|
59
|
+
const producer = {
|
|
60
|
+
id: producerID,
|
|
61
|
+
send: (frame) => {
|
|
62
|
+
socket.send(encodeFrame(frame));
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
return {
|
|
66
|
+
handleMessage(raw) {
|
|
67
|
+
const frame = decodeFrame(raw);
|
|
68
|
+
if (!frame)
|
|
69
|
+
return;
|
|
70
|
+
if (frame[0] !== 'begin' && frame[0] !== 'publish')
|
|
71
|
+
return;
|
|
72
|
+
applyProducerFrame(hub, producer, frame);
|
|
73
|
+
},
|
|
74
|
+
close() {
|
|
75
|
+
hub.dropProducer(producerID);
|
|
76
|
+
},
|
|
77
|
+
topics: () => [],
|
|
78
|
+
};
|
|
79
|
+
},
|
|
80
|
+
async rehydrate(entries) {
|
|
81
|
+
const restored = [];
|
|
82
|
+
for (const entry of entries) {
|
|
83
|
+
const { connection, owned, host } = subscriber(entry.socket, entry.identity, entry.connectionID);
|
|
84
|
+
for (const topic of entry.topics) {
|
|
85
|
+
// recorded before the result, exactly as a live subscribe frame does:
|
|
86
|
+
// a topic denied during the gap stays the client's asserted interest,
|
|
87
|
+
// so a membership that comes back is picked up at the next eviction
|
|
88
|
+
// instead of being forgotten here.
|
|
89
|
+
owned.set(topicKey(topic), topic);
|
|
90
|
+
await hub.subscribe(connection, topic);
|
|
91
|
+
}
|
|
92
|
+
restored.push(host);
|
|
93
|
+
}
|
|
94
|
+
return restored;
|
|
95
|
+
},
|
|
96
|
+
flush: () => hub.flush(),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
// Dedup key only. Never persisted and never parsed back: `topics()` hands out
|
|
100
|
+
// the structured topic, so there is no second encoding to keep in agreement
|
|
101
|
+
// with canonicalTopic.
|
|
102
|
+
function topicKey(topic) {
|
|
103
|
+
return JSON.stringify(topic);
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=socket-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket-host.js","sourceRoot":"","sources":["../../src/realtime/socket-host.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { StreamingFieldHandle } from './manifest.js';
|
|
2
|
+
import type { FieldUpdate } from './protocol.js';
|
|
3
|
+
export type StreamingPhase = 'committing' | 'durable' | 'stale' | 'streaming';
|
|
4
|
+
export type StreamingFieldState<Value> = {
|
|
5
|
+
readonly value: Value;
|
|
6
|
+
readonly phase: StreamingPhase;
|
|
7
|
+
readonly streamID: string | null;
|
|
8
|
+
};
|
|
9
|
+
export declare function canonicalEncode(value: unknown): string;
|
|
10
|
+
export type RealtimeStoreOptions = {
|
|
11
|
+
readonly send: (frame: unknown) => void;
|
|
12
|
+
readonly staleAfterMs?: number;
|
|
13
|
+
readonly onError?: (message: string) => void;
|
|
14
|
+
};
|
|
15
|
+
export declare class RealtimeStore {
|
|
16
|
+
#private;
|
|
17
|
+
constructor(options: RealtimeStoreOptions);
|
|
18
|
+
subscribe(handle: StreamingFieldHandle, listener: () => void): () => void;
|
|
19
|
+
read<Value>(handle: StreamingFieldHandle, base: Value): StreamingFieldState<Value>;
|
|
20
|
+
applyUpdates(updates: readonly FieldUpdate[]): void;
|
|
21
|
+
handleSubscribed(topic: string, status: 'active' | 'pending'): void;
|
|
22
|
+
handleSubscribeError(topic: string, reason: string): void;
|
|
23
|
+
retryPending(): void;
|
|
24
|
+
handleDisconnect(): void;
|
|
25
|
+
handleReconnect(): void;
|
|
26
|
+
get topicCount(): number;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/realtime/store.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,oBAAoB,EAAsB,MAAM,eAAe,CAAA;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,eAAe,CAAA;AAE/D,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,CAAA;AAE7E,MAAM,MAAM,mBAAmB,CAAC,KAAK,IAAI;IACvC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAA;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACjC,CAAA;AA0CD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGtD;AAaD,MAAM,MAAM,oBAAoB,GAAG;IAEjC,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACvC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAI9B,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAC7C,CAAA;AAED,qBAAa,aAAa;;gBASZ,OAAO,EAAE,oBAAoB;IASzC,SAAS,CAAC,MAAM,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAsCzE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,IAAI,EAAE,KAAK,GAAG,mBAAmB,CAAC,KAAK,CAAC;IAkDlF,YAAY,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,GAAG,IAAI;IAqInD,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI;IAcnE,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAiBzD,YAAY,IAAI,IAAI;IAUpB,gBAAgB,IAAI,IAAI;IAYxB,eAAe,IAAI,IAAI;IAOvB,IAAI,UAAU,IAAI,MAAM,CAEvB;CACF"}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/realtime/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { StreamingFieldHandle } from './manifest.js';
|
|
2
|
+
import type { RealtimeTopic } from './protocol.js';
|
|
3
|
+
import type { RealtimePublisher } from './publisher.js';
|
|
4
|
+
export type FieldWriterOptions = {
|
|
5
|
+
readonly onError?: (error: Error, topic: RealtimeTopic) => void;
|
|
6
|
+
};
|
|
7
|
+
export declare class FieldWriter {
|
|
8
|
+
#private;
|
|
9
|
+
constructor(publisher: RealtimePublisher, options?: FieldWriterOptions);
|
|
10
|
+
set(handle: StreamingFieldHandle, value: unknown): void;
|
|
11
|
+
flush(handle: StreamingFieldHandle): Promise<void>;
|
|
12
|
+
finish(handle: StreamingFieldHandle, value: unknown, commit: () => Promise<void>): Promise<void>;
|
|
13
|
+
abort(handle: StreamingFieldHandle): Promise<void>;
|
|
14
|
+
isStreaming(handle: StreamingFieldHandle): boolean;
|
|
15
|
+
abortAll(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/realtime/writer.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,gBAAgB,CAAA;AAUtE,MAAM,MAAM,kBAAkB,GAAG;IAI/B,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;CAChE,CAAA;AAED,qBAAa,WAAW;;gBAKV,SAAS,EAAE,iBAAiB,EAAE,OAAO,GAAE,kBAAuB;IAqB1E,GAAG,CAAC,MAAM,EAAE,oBAAoB,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAwCjD,KAAK,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IASlD,MAAM,CACV,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC;IAqBV,KAAK,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxD,WAAW,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO;IAQ5C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAiBhC"}
|