@elaraai/east 1.0.76 → 1.0.77
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/src/serialization/beast2/index.d.ts +21 -0
- package/dist/src/serialization/beast2/index.d.ts.map +1 -1
- package/dist/src/serialization/beast2/index.js +55 -0
- package/dist/src/serialization/beast2/index.js.map +1 -1
- package/dist/src/serialization/beast2/v5/deflate.d.ts.map +1 -1
- package/dist/src/serialization/beast2/v5/deflate.js +147 -50
- package/dist/src/serialization/beast2/v5/deflate.js.map +1 -1
- package/dist/src/serialization/beast2/v5/deflate.spec.d.ts +6 -0
- package/dist/src/serialization/beast2/v5/deflate.spec.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/deflate.spec.js +237 -0
- package/dist/src/serialization/beast2/v5/deflate.spec.js.map +1 -0
- package/dist/src/serialization/beast2/v5/frame-pool.d.ts +119 -0
- package/dist/src/serialization/beast2/v5/frame-pool.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/frame-pool.js +235 -0
- package/dist/src/serialization/beast2/v5/frame-pool.js.map +1 -0
- package/dist/src/serialization/beast2/v5/frame-pool.spec.d.ts +6 -0
- package/dist/src/serialization/beast2/v5/frame-pool.spec.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/frame-pool.spec.js +287 -0
- package/dist/src/serialization/beast2/v5/frame-pool.spec.js.map +1 -0
- package/dist/src/serialization/beast2/v5/frame-worker.d.ts +6 -0
- package/dist/src/serialization/beast2/v5/frame-worker.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/frame-worker.js +40 -0
- package/dist/src/serialization/beast2/v5/frame-worker.js.map +1 -0
- package/dist/src/serialization/beast2/v5/stream.d.ts +63 -2
- package/dist/src/serialization/beast2/v5/stream.d.ts.map +1 -1
- package/dist/src/serialization/beast2/v5/stream.js +132 -9
- package/dist/src/serialization/beast2/v5/stream.js.map +1 -1
- package/dist/src/serialization/index.d.ts +1 -1
- package/dist/src/serialization/index.d.ts.map +1 -1
- package/dist/src/serialization/index.js +1 -1
- package/dist/src/serialization/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* The parallel frame writer (issue #763), held to the serial algorithm.
|
|
7
|
+
*
|
|
8
|
+
* A pooled writer puts the same frames on the wire in the same order, so the
|
|
9
|
+
* one thing that could move is the SEGMENTATION: the paged encoder sizes each
|
|
10
|
+
* batch from the bytes emitted so far, and with frames still deflating on
|
|
11
|
+
* workers those bytes are only known within bounds. The encoder decides at
|
|
12
|
+
* both bounds and settles when they disagree. The oracle below is the serial
|
|
13
|
+
* algorithm as it stood before #763 — a writer that never pools, refined from
|
|
14
|
+
* the bytes its sink actually received — and every case must match it byte
|
|
15
|
+
* for byte: at a target that pins the element cap (bounds always agree) and at
|
|
16
|
+
* targets small enough that the refinement is live on every batch (bounds
|
|
17
|
+
* often disagree).
|
|
18
|
+
*
|
|
19
|
+
* Throughput is printed under `EAST_POOL_BENCH=1`, never asserted.
|
|
20
|
+
*/
|
|
21
|
+
import { describe, test } from "node:test";
|
|
22
|
+
import assert from "node:assert/strict";
|
|
23
|
+
import { ArrayType, DictType, IntegerType, StringType } from "../../../types.js";
|
|
24
|
+
import { compareFor } from "../../../comparison.js";
|
|
25
|
+
import { SortedMap } from "../../../index.js";
|
|
26
|
+
import { Beast2Writer, BEAST2_PAGED_BATCH_DEFAULT, decodeBeast2For, encodeBeast2PagedFor, } from "../index.js";
|
|
27
|
+
import { configureFramePool, framePool } from "./frame-pool.js";
|
|
28
|
+
/** xorshift32 — a fixed stream, so a failure reproduces exactly. */
|
|
29
|
+
function rng(seed) {
|
|
30
|
+
let s = seed >>> 0 || 1;
|
|
31
|
+
return () => {
|
|
32
|
+
s ^= s << 13;
|
|
33
|
+
s >>>= 0;
|
|
34
|
+
s ^= s >>> 17;
|
|
35
|
+
s ^= s << 5;
|
|
36
|
+
s >>>= 0;
|
|
37
|
+
return s;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** Strings of widely varying width — the running average moves, so the
|
|
41
|
+
* refinement is exercised. Well past the pool's 8 MiB start threshold. */
|
|
42
|
+
function strings(n, seed) {
|
|
43
|
+
const next = rng(seed);
|
|
44
|
+
const out = new Array(n);
|
|
45
|
+
for (let i = 0; i < n; i++) {
|
|
46
|
+
const width = 8 + (next() % 1400);
|
|
47
|
+
let s = "";
|
|
48
|
+
for (let k = 0; k < width; k++)
|
|
49
|
+
s += String.fromCharCode(97 + (next() % 26));
|
|
50
|
+
out[i] = s;
|
|
51
|
+
}
|
|
52
|
+
return out;
|
|
53
|
+
}
|
|
54
|
+
/** The serial paged encode exactly as it stood before #763. */
|
|
55
|
+
function serialPaged(type, items, makeBatch, target) {
|
|
56
|
+
const chunks = [];
|
|
57
|
+
let bytes = 0;
|
|
58
|
+
const probeN = Math.min(16, items.length);
|
|
59
|
+
let next = BEAST2_PAGED_BATCH_DEFAULT;
|
|
60
|
+
if (probeN > 0) {
|
|
61
|
+
let scratch = 0;
|
|
62
|
+
const probe = new Beast2Writer(type, (b) => { scratch += b.length; });
|
|
63
|
+
const header = scratch;
|
|
64
|
+
probe.write(makeBatch(items.slice(0, probeN)));
|
|
65
|
+
const avg = Math.max(1, (scratch - header) / probeN);
|
|
66
|
+
next = Math.max(1, Math.min(BEAST2_PAGED_BATCH_DEFAULT, Math.floor(target / avg)));
|
|
67
|
+
}
|
|
68
|
+
const writer = new Beast2Writer(type, (b) => { chunks.push(b); bytes += b.length; });
|
|
69
|
+
const header = bytes;
|
|
70
|
+
let written = 0;
|
|
71
|
+
for (let i = 0; i < items.length;) {
|
|
72
|
+
const j = Math.min(items.length, i + next);
|
|
73
|
+
writer.write(makeBatch(items.slice(i, j)));
|
|
74
|
+
written += j - i;
|
|
75
|
+
i = j;
|
|
76
|
+
const avg = Math.max(1, (bytes - header) / written);
|
|
77
|
+
next = Math.max(1, Math.min(BEAST2_PAGED_BATCH_DEFAULT, Math.floor(target / avg)));
|
|
78
|
+
}
|
|
79
|
+
writer.finish();
|
|
80
|
+
const out = new Uint8Array(bytes);
|
|
81
|
+
let pos = 0;
|
|
82
|
+
for (const c of chunks) {
|
|
83
|
+
out.set(c, pos);
|
|
84
|
+
pos += c.length;
|
|
85
|
+
}
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
/** Resolves after `ms` milliseconds. */
|
|
89
|
+
function sleep(ms) {
|
|
90
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
91
|
+
}
|
|
92
|
+
/** Chunks joined into one buffer. */
|
|
93
|
+
function concat(chunks) {
|
|
94
|
+
let length = 0;
|
|
95
|
+
for (const c of chunks)
|
|
96
|
+
length += c.length;
|
|
97
|
+
const out = new Uint8Array(length);
|
|
98
|
+
let pos = 0;
|
|
99
|
+
for (const c of chunks) {
|
|
100
|
+
out.set(c, pos);
|
|
101
|
+
pos += c.length;
|
|
102
|
+
}
|
|
103
|
+
return out;
|
|
104
|
+
}
|
|
105
|
+
/** First differing index, or -1. */
|
|
106
|
+
function firstDifference(a, b) {
|
|
107
|
+
const n = Math.min(a.length, b.length);
|
|
108
|
+
for (let i = 0; i < n; i++)
|
|
109
|
+
if (a[i] !== b[i])
|
|
110
|
+
return i;
|
|
111
|
+
return a.length === b.length ? -1 : n;
|
|
112
|
+
}
|
|
113
|
+
describe("beast2 v5 parallel frame writer", () => {
|
|
114
|
+
const TARGETS = [2 * 1024 * 1024, 64 * 1024, 4096];
|
|
115
|
+
test("a pooled Array encode is byte-identical to the serial algorithm", () => {
|
|
116
|
+
const items = strings(24_000, 0x5eed);
|
|
117
|
+
const type = ArrayType(StringType);
|
|
118
|
+
for (const target of TARGETS) {
|
|
119
|
+
const pooled = encodeBeast2PagedFor(type, { targetSegmentBytes: target })(items);
|
|
120
|
+
const serial = serialPaged(type, items, (batch) => batch, target);
|
|
121
|
+
assert.equal(firstDifference(pooled, serial), -1, `target ${target}: pooled and serial bytes differ`);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
test("a pooled Dict encode is byte-identical to the serial algorithm, and decodes", () => {
|
|
125
|
+
const values = strings(20_000, 0xd1c7);
|
|
126
|
+
const cmp = compareFor(IntegerType);
|
|
127
|
+
const entries = values.map((v, i) => [BigInt(i * 3), v]);
|
|
128
|
+
const type = DictType(IntegerType, StringType);
|
|
129
|
+
const value = new SortedMap(entries, cmp);
|
|
130
|
+
for (const target of TARGETS) {
|
|
131
|
+
const pooled = encodeBeast2PagedFor(type, { targetSegmentBytes: target })(value);
|
|
132
|
+
const serial = serialPaged(type, entries, (batch) => new Map(batch), target);
|
|
133
|
+
assert.equal(firstDifference(pooled, serial), -1, `target ${target}: pooled and serial bytes differ`);
|
|
134
|
+
if (target === TARGETS[0]) {
|
|
135
|
+
const decoded = decodeBeast2For(type)(pooled);
|
|
136
|
+
assert.equal(decoded.size, entries.length);
|
|
137
|
+
assert.equal(decoded.get(3n * 777n), values[777]);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
test("the pool is created on a multi-core Node host", () => {
|
|
142
|
+
// Informational context for the identity tests above: on a single-core
|
|
143
|
+
// runner the writer frames inline and they still hold, trivially.
|
|
144
|
+
const pool = framePool();
|
|
145
|
+
if (pool !== null)
|
|
146
|
+
assert.ok(pool.workers >= 2);
|
|
147
|
+
});
|
|
148
|
+
test("reports throughput when asked", { skip: process.env.EAST_POOL_BENCH !== "1" }, () => {
|
|
149
|
+
const items = strings(60_000, 0xbe7c);
|
|
150
|
+
const type = ArrayType(StringType);
|
|
151
|
+
framePool(); // start-up is once per process; keep it out of the timing
|
|
152
|
+
const t0 = performance.now();
|
|
153
|
+
const serial = serialPaged(type, items, (batch) => batch, 2 * 1024 * 1024);
|
|
154
|
+
const t1 = performance.now();
|
|
155
|
+
const pooled = encodeBeast2PagedFor(type)(items);
|
|
156
|
+
const t2 = performance.now();
|
|
157
|
+
console.log(` paged encode of ${(serial.length / 1e6).toFixed(1)} MB: serial ${(t1 - t0).toFixed(0)} ms, ` +
|
|
158
|
+
`pooled ${(t2 - t1).toFixed(0)} ms (${((t1 - t0) / (t2 - t1)).toFixed(2)}x on ${framePool()?.workers ?? 1} workers), ` +
|
|
159
|
+
`identical: ${firstDifference(serial, pooled) === -1}`);
|
|
160
|
+
});
|
|
161
|
+
test("an idle pool retires its workers, and the next pooled encode starts a new pool", async (t) => {
|
|
162
|
+
const before = framePool();
|
|
163
|
+
if (before === null) {
|
|
164
|
+
t.skip("no frame pool on this host — frames are written inline");
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const previous = configureFramePool({ idleMs: 50 });
|
|
168
|
+
try {
|
|
169
|
+
const type = ArrayType(StringType);
|
|
170
|
+
const items = strings(24_000, 0x1d1e);
|
|
171
|
+
const target = 64 * 1024;
|
|
172
|
+
const serial = serialPaged(type, items, (batch) => batch, target);
|
|
173
|
+
assert.equal(firstDifference(encodeBeast2PagedFor(type, { targetSegmentBytes: target })(items), serial), -1);
|
|
174
|
+
// The check runs on a timer, so wait for the retirement rather than for
|
|
175
|
+
// a fixed time — a loaded host delays timers.
|
|
176
|
+
const deadline = Date.now() + 10_000;
|
|
177
|
+
while (framePool() === before && Date.now() < deadline)
|
|
178
|
+
await sleep(25);
|
|
179
|
+
assert.notEqual(framePool(), before, "the idle pool retired and a new one started");
|
|
180
|
+
assert.equal(firstDifference(encodeBeast2PagedFor(type, { targetSegmentBytes: target })(items), serial), -1, "the new pool writes the same bytes");
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
configureFramePool(previous);
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
test("a writer that outlives an idle retirement frames on the new pool, byte-identically", async (t) => {
|
|
187
|
+
const pool = framePool();
|
|
188
|
+
if (pool === null) {
|
|
189
|
+
t.skip("no frame pool on this host — frames are written inline");
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
// A shorter wait too: if the writer handed frames to the retired workers,
|
|
193
|
+
// this fails in seconds rather than a minute — yet far longer than any
|
|
194
|
+
// healthy frame takes on a loaded runner.
|
|
195
|
+
const previous = configureFramePool({ idleMs: 50, waitTimeoutMs: 10_000 });
|
|
196
|
+
try {
|
|
197
|
+
const type = ArrayType(StringType);
|
|
198
|
+
const items = strings(24_000, 0x0a7e);
|
|
199
|
+
const batches = (from, to) => {
|
|
200
|
+
const out = [];
|
|
201
|
+
for (let i = from; i < to; i += 500)
|
|
202
|
+
out.push(items.slice(i, Math.min(to, i + 500)));
|
|
203
|
+
return out;
|
|
204
|
+
};
|
|
205
|
+
// A long-lived writer (an emit sink between batches) goes quiet with
|
|
206
|
+
// nothing in flight, long enough for its pool to retire.
|
|
207
|
+
const chunks = [];
|
|
208
|
+
const writer = new Beast2Writer(type, (b) => { chunks.push(b); }, { parallel: true });
|
|
209
|
+
for (const batch of batches(0, 16_000))
|
|
210
|
+
writer.write(batch);
|
|
211
|
+
writer.settle();
|
|
212
|
+
const deadline = Date.now() + 10_000;
|
|
213
|
+
while (framePool() === pool && Date.now() < deadline)
|
|
214
|
+
await sleep(25);
|
|
215
|
+
assert.notEqual(framePool(), pool, "the quiet pool retired");
|
|
216
|
+
for (const batch of batches(16_000, items.length))
|
|
217
|
+
writer.write(batch);
|
|
218
|
+
writer.finish();
|
|
219
|
+
const inlineChunks = [];
|
|
220
|
+
const inline = new Beast2Writer(type, (b) => { inlineChunks.push(b); });
|
|
221
|
+
for (const batch of batches(0, items.length))
|
|
222
|
+
inline.write(batch);
|
|
223
|
+
inline.finish();
|
|
224
|
+
assert.equal(firstDifference(concat(chunks), concat(inlineChunks)), -1, "the writer's stream is the inline stream");
|
|
225
|
+
assert.notEqual(framePool(), null, "no worker was lost along the way");
|
|
226
|
+
}
|
|
227
|
+
finally {
|
|
228
|
+
configureFramePool(previous);
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
// LAST in this file: losing a worker abandons the process's pool, so every
|
|
232
|
+
// encode after it in this process frames inline.
|
|
233
|
+
test("a lost frame worker fails its frame instead of hanging, and the process frames inline after", async (t) => {
|
|
234
|
+
const pool = framePool();
|
|
235
|
+
if (pool === null) {
|
|
236
|
+
t.skip("no frame pool on this host — frames are written inline");
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
const type = ArrayType(StringType);
|
|
240
|
+
const items = strings(24_000, 0x1057);
|
|
241
|
+
const batches = (from, to) => {
|
|
242
|
+
const out = [];
|
|
243
|
+
for (let i = from; i < to; i += 500)
|
|
244
|
+
out.push(items.slice(i, Math.min(to, i + 500)));
|
|
245
|
+
return out;
|
|
246
|
+
};
|
|
247
|
+
// A parallel writer already framing on the pool — well past the pool's
|
|
248
|
+
// start threshold — with nothing in flight when the worker is lost.
|
|
249
|
+
const survivorChunks = [];
|
|
250
|
+
const survivor = new Beast2Writer(type, (b) => { survivorChunks.push(b); }, { parallel: true });
|
|
251
|
+
for (const batch of batches(0, 16_000))
|
|
252
|
+
survivor.write(batch);
|
|
253
|
+
survivor.settle();
|
|
254
|
+
const logical = new Uint8Array(64 * 1024).fill(0x61);
|
|
255
|
+
assert.ok(pool.submit(logical, "deflate").take().length > 0, "a live worker builds the frame");
|
|
256
|
+
// A worker that dies without reporting: the thread is gone, the frame it
|
|
257
|
+
// was handed stays pending. Only this wait is shortened — a healthy frame
|
|
258
|
+
// on a loaded runner must never be mistaken for a lost one.
|
|
259
|
+
await pool.terminateWorkers();
|
|
260
|
+
const previous = configureFramePool({ waitTimeoutMs: 200 });
|
|
261
|
+
try {
|
|
262
|
+
const orphan = pool.submit(logical, "deflate");
|
|
263
|
+
const started = Date.now();
|
|
264
|
+
assert.throws(() => orphan.take(), /a frame worker stopped responding — its thread was lost/);
|
|
265
|
+
assert.ok(Date.now() - started < 10_000, "the configured wait applies, not the minute-long default");
|
|
266
|
+
}
|
|
267
|
+
finally {
|
|
268
|
+
configureFramePool(previous);
|
|
269
|
+
}
|
|
270
|
+
assert.equal(framePool(), null, "the process frames inline from then on");
|
|
271
|
+
// The surviving writer follows the process inline rather than handing
|
|
272
|
+
// frames to the abandoned pool, and its stream is the inline stream.
|
|
273
|
+
for (const batch of batches(16_000, items.length))
|
|
274
|
+
survivor.write(batch);
|
|
275
|
+
survivor.finish();
|
|
276
|
+
const inlineChunks = [];
|
|
277
|
+
const inline = new Beast2Writer(type, (b) => { inlineChunks.push(b); });
|
|
278
|
+
for (const batch of batches(0, items.length))
|
|
279
|
+
inline.write(batch);
|
|
280
|
+
inline.finish();
|
|
281
|
+
assert.equal(firstDifference(concat(survivorChunks), concat(inlineChunks)), -1, "a writer that outlives the loss writes the inline bytes");
|
|
282
|
+
// ...and a new encode writes exactly the serial bytes.
|
|
283
|
+
const target = 64 * 1024;
|
|
284
|
+
assert.equal(firstDifference(encodeBeast2PagedFor(type, { targetSegmentBytes: target })(items), serialPaged(type, items, (batch) => batch, target)), -1, "inline framing after the loss is byte-identical to the serial algorithm");
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
//# sourceMappingURL=frame-pool.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame-pool.spec.js","sourceRoot":"","sources":["../../../../../src/serialization/beast2/v5/frame-pool.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame-worker.d.ts","sourceRoot":"","sources":["../../../../../src/serialization/beast2/v5/frame-worker.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Beast2 v5 frame worker — one of {@link framePool}'s threads.
|
|
7
|
+
*
|
|
8
|
+
* Receives a segment's logical bytes in a `SharedArrayBuffer`, writes the frame
|
|
9
|
+
* with the same `writeFrame` the inline writer uses (so the bytes cannot
|
|
10
|
+
* differ), copies it into the job's output buffer, and flips the job's status
|
|
11
|
+
* cell. Only bytes cross the thread boundary — never an East value.
|
|
12
|
+
*
|
|
13
|
+
* @packageDocumentation
|
|
14
|
+
*/
|
|
15
|
+
import { parentPort, workerData } from "node:worker_threads";
|
|
16
|
+
import { BufferWriter } from "../../binary-utils.js";
|
|
17
|
+
import { FRAME_STATUS } from "./frame-pool.js";
|
|
18
|
+
import { writeFrame } from "./frames.js";
|
|
19
|
+
// Report that this worker loaded — the pool hands itself out only once every
|
|
20
|
+
// worker has (see `framePool`).
|
|
21
|
+
const { ready, index } = workerData;
|
|
22
|
+
const readyCells = new Int32Array(ready);
|
|
23
|
+
Atomics.store(readyCells, index, 1);
|
|
24
|
+
Atomics.notify(readyCells, index);
|
|
25
|
+
parentPort?.on("message", (job) => {
|
|
26
|
+
const status = new Int32Array(job.status);
|
|
27
|
+
try {
|
|
28
|
+
const frame = new BufferWriter();
|
|
29
|
+
writeFrame(frame, new Uint8Array(job.input, 0, job.length), job.codec);
|
|
30
|
+
const bytes = frame.toUint8Array();
|
|
31
|
+
new Uint8Array(job.output).set(bytes);
|
|
32
|
+
Atomics.store(status, 1, bytes.length);
|
|
33
|
+
Atomics.store(status, 0, FRAME_STATUS.DONE);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
Atomics.store(status, 0, FRAME_STATUS.FAILED);
|
|
37
|
+
}
|
|
38
|
+
Atomics.notify(status, 0);
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=frame-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame-worker.js","sourceRoot":"","sources":["../../../../../src/serialization/beast2/v5/frame-worker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAoB,MAAM,aAAa,CAAC;AAE3D,6EAA6E;AAC7E,gCAAgC;AAChC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,UAAyD,CAAC;AACnF,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;AACzC,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACpC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AAWlC,UAAU,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,GAAa,EAAE,EAAE;IAC1C,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC;QACjC,UAAU,CAAC,KAAK,EAAE,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;QACnC,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC"}
|
|
@@ -43,6 +43,20 @@ export type Beast2WriterOptions = {
|
|
|
43
43
|
* to rebuild segments byte-compatible with an existing blob's header.
|
|
44
44
|
* When set, `sourceMap` must be the prefix's own decoded source map. */
|
|
45
45
|
headerPrefix?: Uint8Array;
|
|
46
|
+
/**
|
|
47
|
+
* Deflate frames on worker threads (issue #763). Defaults to `false`.
|
|
48
|
+
*
|
|
49
|
+
* The bytes are identical either way — frames reach the sink in order and
|
|
50
|
+
* index offsets are assigned as they land — but with frames in flight the
|
|
51
|
+
* sink has only received the ones already done. A caller that sizes its
|
|
52
|
+
* next batch from the bytes written must therefore read
|
|
53
|
+
* {@link Beast2Writer.emittedBounds} rather than count sink bytes, or its
|
|
54
|
+
* segmentation would depend on thread timing. The pool has one worker per
|
|
55
|
+
* CPU the process may use, at most 32 — a writer keeps two frames per worker
|
|
56
|
+
* in flight, and throughput flattens well before that. Node only; elsewhere,
|
|
57
|
+
* and on a single CPU, the writer frames inline.
|
|
58
|
+
*/
|
|
59
|
+
parallel?: boolean;
|
|
46
60
|
};
|
|
47
61
|
/**
|
|
48
62
|
* Append-only streaming writer for a v5 collection blob.
|
|
@@ -81,6 +95,15 @@ export declare class Beast2Writer<T extends EastType = EastType> {
|
|
|
81
95
|
private hasLast;
|
|
82
96
|
private bytesWritten;
|
|
83
97
|
private finished;
|
|
98
|
+
private readonly parallel;
|
|
99
|
+
/** `undefined` until decided; `null` when frames are written inline. */
|
|
100
|
+
private pool;
|
|
101
|
+
private logicalWritten;
|
|
102
|
+
/** Frames submitted to the pool and not yet on the sink, in order. */
|
|
103
|
+
private readonly inflight;
|
|
104
|
+
private inflightLogical;
|
|
105
|
+
/** {@link settle} calls that found frames in flight. */
|
|
106
|
+
private settlesInflight;
|
|
84
107
|
/**
|
|
85
108
|
* @param type - the collection type this stream holds (Array/Set/Dict)
|
|
86
109
|
* @param sink - receives output bytes as they are produced
|
|
@@ -102,13 +125,51 @@ export declare class Beast2Writer<T extends EastType = EastType> {
|
|
|
102
125
|
* or an external sort), or encode arrival order as an Array of entries.
|
|
103
126
|
*
|
|
104
127
|
* @param batch - a value of the declared collection type
|
|
105
|
-
* @throws {Error} When called after {@link finish},
|
|
106
|
-
* batch violates the stream's strict ascending (key) order
|
|
128
|
+
* @throws {Error} When called after {@link finish}, when a Set/Dict
|
|
129
|
+
* batch violates the stream's strict ascending (key) order, or — for a
|
|
130
|
+
* parallel writer — when a frame worker failed to build a frame or stopped
|
|
131
|
+
* responding. A lost frame cannot be rebuilt, so the stream fails loudly
|
|
132
|
+
* and cannot be finished; the process frames inline from then on.
|
|
107
133
|
*/
|
|
108
134
|
write(batch: ValueTypeOf<T>): void;
|
|
135
|
+
/**
|
|
136
|
+
* Brackets the total bytes the writer will have passed to its sink once
|
|
137
|
+
* every in-flight frame lands.
|
|
138
|
+
*
|
|
139
|
+
* `lo` is exactly the bytes the sink has received; `hi` adds each
|
|
140
|
+
* in-flight frame's logical bytes plus a header bound (a frame's payload
|
|
141
|
+
* never exceeds its logical bytes). A serial writer has `lo === hi`. A
|
|
142
|
+
* decision that is monotone in the byte count — the paged encoders' batch
|
|
143
|
+
* refinement — is exact when it agrees at both bounds; otherwise
|
|
144
|
+
* {@link settle} first.
|
|
145
|
+
*
|
|
146
|
+
* @returns the bounds, in bytes
|
|
147
|
+
*/
|
|
148
|
+
emittedBounds(): {
|
|
149
|
+
lo: number;
|
|
150
|
+
hi: number;
|
|
151
|
+
};
|
|
152
|
+
/** Waits for every in-flight frame and passes it to the sink, after which
|
|
153
|
+
* {@link emittedBounds} is exact. A no-op for a serial writer. */
|
|
154
|
+
settle(): void;
|
|
155
|
+
/** The pool to frame on — decided once a parallel writer has produced
|
|
156
|
+
* enough bytes to be worth it. While frames are in flight the writer keeps
|
|
157
|
+
* the pool they are on, so frames cannot interleave out of order; with none
|
|
158
|
+
* in flight it follows the process's current pool — a new one after an idle
|
|
159
|
+
* pool retired its workers, `null` once a pool has lost a worker — so a
|
|
160
|
+
* writer never submits to terminated workers. A writer demoted to inline
|
|
161
|
+
* framing stays inline. */
|
|
162
|
+
private poolFor;
|
|
163
|
+
/** Passes the done frames at the head of the in-flight queue to the sink,
|
|
164
|
+
* in order, assigning index offsets as they land; blocks until at least
|
|
165
|
+
* `minimum` have been passed (`Infinity` settles the queue). */
|
|
166
|
+
private appendFrames;
|
|
109
167
|
/**
|
|
110
168
|
* Terminates the stream: writes the terminator frame and, unless disabled,
|
|
111
169
|
* the index and footer. Idempotent.
|
|
170
|
+
*
|
|
171
|
+
* @throws {Error} For a parallel writer, when an in-flight frame's worker
|
|
172
|
+
* failed or stopped responding (see {@link write}).
|
|
112
173
|
*/
|
|
113
174
|
finish(): void;
|
|
114
175
|
/** Validates that a Set/Dict batch continues the stream's strict ascent
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../../../../src/serialization/beast2/v5/stream.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,KAAK,aAAa,EAAuC,MAAM,0BAA0B,CAAC;AACnG,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAG/D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAIjD,OAAO,EAAE,KAAK,mBAAmB,EAAwB,MAAM,cAAc,CAAC;AAE9E,OAAO,EAAE,KAAK,WAAW,EAA4C,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../../../../src/serialization/beast2/v5/stream.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,KAAK,aAAa,EAAuC,MAAM,0BAA0B,CAAC;AACnG,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAG/D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAIjD,OAAO,EAAE,KAAK,mBAAmB,EAAwB,MAAM,cAAc,CAAC;AAE9E,OAAO,EAAE,KAAK,WAAW,EAA4C,MAAM,aAAa,CAAC;AAiBzF,OAAO,EAAE,KAAK,qBAAqB,EAA8G,MAAM,YAAY,CAAC;AAuBpK,oFAAoF;AACpF,MAAM,MAAM,mBAAmB,GAAG;IAChC,gDAAgD;IAChD,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;6CACyC;IACzC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;8BAC0B;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B;;;;6EAIyE;IACzE,YAAY,CAAC,EAAE,UAAU,CAAC;IAC1B;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAeF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,YAAY,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ;IACrD,yCAAyC;IACzC,QAAQ,SAAK;IACb,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgB;IACrC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA8B;IACnD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAU;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8C;IAC1E,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2C;IACjE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsC;IAC/D,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,wEAAwE;IACxE,OAAO,CAAC,IAAI,CAA+B;IAC3C,OAAO,CAAC,cAAc,CAAK;IAC3B,sEAAsE;IACtE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgD;IACzE,OAAO,CAAC,eAAe,CAAK;IAC5B,wDAAwD;IACxD,OAAO,CAAC,eAAe,CAAK;IAE5B;;;;;;OAMG;gBACS,IAAI,EAAE,CAAC,GAAG,aAAa,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,mBAAmB;IA6DrG;;;;;;;;;;;;;;;;;;OAkBG;IACH,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI;IA+ClC;;;;;;;;;;;;OAYG;IACH,aAAa,IAAI;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE;IAQ3C;uEACmE;IACnE,MAAM,IAAI,IAAI;IAKd;;;;;;gCAM4B;IAC5B,OAAO,CAAC,OAAO;IAUf;;qEAEiE;IACjE,OAAO,CAAC,YAAY;IAcpB;;;;;;OAMG;IACH,MAAM,IAAI,IAAI;IAed;iFAC6E;IAC7E,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,IAAI;CAIb;AAuBD;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,aAAa,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,UAAU,CAcrK;AAMD;;;kCAGkC;AAClC,eAAO,MAAM,0BAA0B,OAAQ,CAAC;AAEhD;;;4EAG4E;AAC5E,eAAO,MAAM,iCAAiC,QAAkB,CAAC;AAMjE,wDAAwD;AACxD,MAAM,MAAM,wBAAwB,GAAG;IACrC;8CAC0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;qDAEiD;IACjD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gDAAgD;IAChD,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,aAAa,EAAE,OAAO,CAAC,EAAE,wBAAwB,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,UAAU,CAmG3J;AAyFD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,aAAa,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAoCjK;AAmBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,WAAW,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ;IACpD,wEAAwE;IACxE,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC;;0CAEsC;IACtC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,oDAAoD;IACpD,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,iFAAiF;IACjF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgB;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuF;IACrH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAC3D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAW;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsC;IAC/D,2EAA2E;IAC3E,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,QAAQ,CAAsE;IACtF;;;;;;0BAMsB;IACtB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0D;IAEvF,gDAAgD;gBACpC,MAAM,EAAE,UAAU,GAAG,qBAAqB,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,mBAAmB;IA0C/G,sCAAsC;IACtC,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED;;;+CAG2C;IAC3C,OAAO,CAAC,WAAW;IAMnB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC;IAKlC,4EAA4E;IAC5E,OAAO,CAAC,iBAAiB;IAoBzB;;;;2CAIuC;IACvC,OAAO,CAAC,aAAa;IA8BrB;;;;sCAIkC;IAClC,OAAO,CAAC,QAAQ;IA6BhB;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK;IAUzJ;4DACwD;IACxD,OAAO,CAAC,YAAY;IAiBpB;;iFAE6E;IAC7E,OAAO,CAAC,cAAc;IAQtB;uEACmE;IACnE,OAAO,CAAC,UAAU;IAUlB;;;;;;;OAOG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK;IAYpE;;;;;;;;;;;;;;;;;;OAkBG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC;IAuDpD;;;;;;;;;;OAUG;IACH,GAAG,CACD,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,GAClG,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,SAAS;CA4BhH;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,aAAa,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,qBAAqB,KAAK,WAAW,CAAC,CAAC,CAAC,CAI7K"}
|