turbodata 0.1.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.
Files changed (104) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +27 -0
  3. package/README.md +215 -0
  4. package/dist/compression.d.ts +8 -0
  5. package/dist/compression.d.ts.map +1 -0
  6. package/dist/compression.js +19 -0
  7. package/dist/compression.js.map +1 -0
  8. package/dist/index.d.ts +16 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +23 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/io.d.ts +37 -0
  13. package/dist/io.d.ts.map +1 -0
  14. package/dist/io.js +174 -0
  15. package/dist/io.js.map +1 -0
  16. package/dist/iterators/message_heap.d.ts +17 -0
  17. package/dist/iterators/message_heap.d.ts.map +1 -0
  18. package/dist/iterators/message_heap.js +83 -0
  19. package/dist/iterators/message_heap.js.map +1 -0
  20. package/dist/iterators/preloaded_topics_group_iterator.d.ts +38 -0
  21. package/dist/iterators/preloaded_topics_group_iterator.d.ts.map +1 -0
  22. package/dist/iterators/preloaded_topics_group_iterator.js +109 -0
  23. package/dist/iterators/preloaded_topics_group_iterator.js.map +1 -0
  24. package/dist/iterators/topics_group_iterator.d.ts +45 -0
  25. package/dist/iterators/topics_group_iterator.d.ts.map +1 -0
  26. package/dist/iterators/topics_group_iterator.js +132 -0
  27. package/dist/iterators/topics_group_iterator.js.map +1 -0
  28. package/dist/loaded_bytes.d.ts +12 -0
  29. package/dist/loaded_bytes.d.ts.map +1 -0
  30. package/dist/loaded_bytes.js +43 -0
  31. package/dist/loaded_bytes.js.map +1 -0
  32. package/dist/msgpack.d.ts +10 -0
  33. package/dist/msgpack.d.ts.map +1 -0
  34. package/dist/msgpack.js +44 -0
  35. package/dist/msgpack.js.map +1 -0
  36. package/dist/multi_reader.d.ts +56 -0
  37. package/dist/multi_reader.d.ts.map +1 -0
  38. package/dist/multi_reader.js +281 -0
  39. package/dist/multi_reader.js.map +1 -0
  40. package/dist/read_fetcher.d.ts +9 -0
  41. package/dist/read_fetcher.d.ts.map +1 -0
  42. package/dist/read_fetcher.js +59 -0
  43. package/dist/read_fetcher.js.map +1 -0
  44. package/dist/read_options.d.ts +40 -0
  45. package/dist/read_options.d.ts.map +1 -0
  46. package/dist/read_options.js +16 -0
  47. package/dist/read_options.js.map +1 -0
  48. package/dist/read_planner.d.ts +37 -0
  49. package/dist/read_planner.d.ts.map +1 -0
  50. package/dist/read_planner.js +110 -0
  51. package/dist/read_planner.js.map +1 -0
  52. package/dist/read_source.d.ts +19 -0
  53. package/dist/read_source.d.ts.map +1 -0
  54. package/dist/read_source.js +15 -0
  55. package/dist/read_source.js.map +1 -0
  56. package/dist/read_strategy.d.ts +52 -0
  57. package/dist/read_strategy.d.ts.map +1 -0
  58. package/dist/read_strategy.js +70 -0
  59. package/dist/read_strategy.js.map +1 -0
  60. package/dist/reader.d.ts +209 -0
  61. package/dist/reader.d.ts.map +1 -0
  62. package/dist/reader.js +649 -0
  63. package/dist/reader.js.map +1 -0
  64. package/dist/sample.d.ts +41 -0
  65. package/dist/sample.d.ts.map +1 -0
  66. package/dist/sample.js +528 -0
  67. package/dist/sample.js.map +1 -0
  68. package/dist/sort_and_filter.d.ts +25 -0
  69. package/dist/sort_and_filter.d.ts.map +1 -0
  70. package/dist/sort_and_filter.js +126 -0
  71. package/dist/sort_and_filter.js.map +1 -0
  72. package/dist/sources/blob.d.ts +8 -0
  73. package/dist/sources/blob.d.ts.map +1 -0
  74. package/dist/sources/blob.js +38 -0
  75. package/dist/sources/blob.js.map +1 -0
  76. package/dist/sources/http.d.ts +17 -0
  77. package/dist/sources/http.d.ts.map +1 -0
  78. package/dist/sources/http.js +90 -0
  79. package/dist/sources/http.js.map +1 -0
  80. package/dist/types.d.ts +75 -0
  81. package/dist/types.d.ts.map +1 -0
  82. package/dist/types.js +29 -0
  83. package/dist/types.js.map +1 -0
  84. package/package.json +61 -0
  85. package/src/compression.ts +28 -0
  86. package/src/index.ts +70 -0
  87. package/src/io.ts +214 -0
  88. package/src/iterators/message_heap.ts +104 -0
  89. package/src/iterators/preloaded_topics_group_iterator.ts +143 -0
  90. package/src/iterators/topics_group_iterator.ts +180 -0
  91. package/src/loaded_bytes.ts +61 -0
  92. package/src/msgpack.ts +46 -0
  93. package/src/multi_reader.ts +337 -0
  94. package/src/read_fetcher.ts +74 -0
  95. package/src/read_options.ts +58 -0
  96. package/src/read_planner.ts +153 -0
  97. package/src/read_source.ts +33 -0
  98. package/src/read_strategy.ts +111 -0
  99. package/src/reader.ts +910 -0
  100. package/src/sample.ts +715 -0
  101. package/src/sort_and_filter.ts +167 -0
  102. package/src/sources/blob.ts +52 -0
  103. package/src/sources/http.ts +121 -0
  104. package/src/types.ts +110 -0
package/dist/reader.js ADDED
@@ -0,0 +1,649 @@
1
+ // Copyright 2026 Wanjia He
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ import { defaultDecompressor } from "./compression.js";
15
+ import { BinaryReader, readFooter, readIndexChunk, readSummary } from "./io.js";
16
+ import { PreloadedTopicsGroupIterator } from "./iterators/preloaded_topics_group_iterator.js";
17
+ import { MessageHeap } from "./iterators/message_heap.js";
18
+ import { TopicsGroupIterator } from "./iterators/topics_group_iterator.js";
19
+ import { LoadedBytes } from "./loaded_bytes.js";
20
+ import { fetchAll } from "./read_fetcher.js";
21
+ import { plan } from "./read_planner.js";
22
+ import { MAX_INT64 } from "./read_options.js";
23
+ import { sampleMessages } from "./sample.js";
24
+ import { sortAndFilter } from "./sort_and_filter.js";
25
+ import { FOOTER_LEN, MAGIC, META_KEY_COMPRESSED, META_KEY_VIDEO, } from "./types.js";
26
+ /**
27
+ * Thrown when a configured topic remap collapses two in-file topics onto the
28
+ * same exposed name. Detected lazily against the summary on first use.
29
+ */
30
+ export class TopicRemapError extends Error {
31
+ exposed;
32
+ first;
33
+ second;
34
+ constructor(exposed, first, second) {
35
+ super(`turbodata: topic remap produces duplicate exposed name "${exposed}" (from in-file topics "${first}" and "${second}")`);
36
+ this.name = "TopicRemapError";
37
+ this.exposed = exposed;
38
+ this.first = first;
39
+ this.second = second;
40
+ }
41
+ }
42
+ /**
43
+ * Default strategy for Reader.sample when none is supplied. Mirrors the Go and
44
+ * Python DEFAULT_SAMPLE_STRATEGY (1 MiB coalesce, 4 MiB split, 16-way fanout).
45
+ */
46
+ export const DEFAULT_SAMPLE_STRATEGY = {
47
+ coalesceGap: 1n << 20n,
48
+ splitThreshold: 4n << 20n,
49
+ maxConcurrency: 16,
50
+ };
51
+ /**
52
+ * Aggregated precondition failures from Reader.sample, raised before any data
53
+ * I/O. `violations` lists every problem found across all queries.
54
+ */
55
+ export class SampleValidationError extends Error {
56
+ violations;
57
+ constructor(violations) {
58
+ super(`sample: ${violations.length} validation error(s): ${violations.join("; ")}`);
59
+ this.name = "SampleValidationError";
60
+ this.violations = violations;
61
+ }
62
+ }
63
+ /**
64
+ * N timestamps starting at `start`, each `stride` apart. Useful for "N samples
65
+ * at a given frequency from T" patterns. Mirrors Go LinSpaceTimestamps.
66
+ * Returns [] when count <= 0; throws when stride <= 0 (would break the
67
+ * strictly-increasing contract on SampleQuery.timestamps).
68
+ */
69
+ export function linSpaceTimestamps(start, stride, count) {
70
+ if (count <= 0) {
71
+ return [];
72
+ }
73
+ if (stride <= 0n) {
74
+ throw new Error("linSpaceTimestamps requires stride > 0");
75
+ }
76
+ const out = new Array(count);
77
+ for (let i = 0; i < count; i++) {
78
+ out[i] = start + BigInt(i) * stride;
79
+ }
80
+ return out;
81
+ }
82
+ export class Reader {
83
+ rs;
84
+ decompress;
85
+ // Lazy-loaded summary metadata.
86
+ cachedSize;
87
+ cachedSummary;
88
+ // Cached per-exposed-topic bounds, computed lazily by topicBounds().
89
+ boundsCache;
90
+ // topicRemap maps in-file -> exposed names; undefined means identity.
91
+ topicRemap;
92
+ // Cached prepareRename outputs (computed lazily once the summary is known).
93
+ // renameInverse maps exposed -> in-file; renameErr captures a collision
94
+ // detected against the actual summary.
95
+ renamePrepared = false;
96
+ renameInverse;
97
+ renameErr;
98
+ constructor(rs, opts = {}) {
99
+ this.rs = rs;
100
+ this.decompress = opts.decompress ?? defaultDecompressor;
101
+ const remap = opts.topicRemap;
102
+ this.topicRemap =
103
+ remap !== undefined && Object.keys(remap).length > 0
104
+ ? new Map(Object.entries(remap))
105
+ : undefined;
106
+ }
107
+ /**
108
+ * Build the exposed -> in-file inverse map once the summary is known and
109
+ * validate that no two topics collapse onto the same exposed name. Results
110
+ * (including any error) are cached. Returns undefined when no remap is set.
111
+ */
112
+ prepareRename(summary) {
113
+ if (this.renamePrepared) {
114
+ if (this.renameErr !== undefined) {
115
+ throw this.renameErr;
116
+ }
117
+ return this.renameInverse;
118
+ }
119
+ this.renamePrepared = true;
120
+ if (this.topicRemap === undefined) {
121
+ return undefined;
122
+ }
123
+ const inverse = new Map();
124
+ for (const ti of summary.topicsInfos) {
125
+ for (const tm of ti.topicMetadatas) {
126
+ const exposed = this.topicRemap.get(tm.name) ?? tm.name;
127
+ const prev = inverse.get(exposed);
128
+ if (prev !== undefined) {
129
+ this.renameErr = new TopicRemapError(exposed, prev, tm.name);
130
+ throw this.renameErr;
131
+ }
132
+ inverse.set(exposed, tm.name);
133
+ }
134
+ }
135
+ this.renameInverse = inverse;
136
+ return inverse;
137
+ }
138
+ /**
139
+ * Return a copy of `summary` with TopicMetadata.name rewritten to exposed
140
+ * names. Index-chunk lists and metadata maps are shared (read-only here).
141
+ * Returns the original summary when no remap is configured.
142
+ */
143
+ exposedSummary(summary) {
144
+ if (this.topicRemap === undefined) {
145
+ return summary;
146
+ }
147
+ this.prepareRename(summary);
148
+ return {
149
+ topicsInfos: summary.topicsInfos.map((ti) => ({
150
+ topicMetadatas: ti.topicMetadatas.map((tm) => ({
151
+ id: tm.id,
152
+ name: this.topicRemap.get(tm.name) ?? tm.name,
153
+ metadata: tm.metadata,
154
+ messageCount: tm.messageCount,
155
+ })),
156
+ indexChunkInfoList: ti.indexChunkInfoList,
157
+ totalLen: ti.totalLen,
158
+ })),
159
+ };
160
+ }
161
+ /**
162
+ * Returns the parsed summary, loading and caching it on first call. When a
163
+ * topic remap is configured, TopicMetadata.name reports exposed names.
164
+ */
165
+ async summary() {
166
+ return this.exposedSummary(await this.summaryWithHint(0n));
167
+ }
168
+ async summaryWithHint(prefetch) {
169
+ if (this.cachedSummary !== undefined) {
170
+ return this.cachedSummary;
171
+ }
172
+ if (this.cachedSize === undefined) {
173
+ this.cachedSize = await this.rs.size();
174
+ }
175
+ const size = this.cachedSize;
176
+ if (size < BigInt(FOOTER_LEN)) {
177
+ throw new Error("file is too small to contain a footer");
178
+ }
179
+ let pf = prefetch;
180
+ if (pf <= 0n) {
181
+ pf = BigInt(FOOTER_LEN);
182
+ }
183
+ if (pf > size) {
184
+ pf = size;
185
+ }
186
+ const tail = await this.rs.read(size - pf, pf);
187
+ const footerStart = tail.byteLength - FOOTER_LEN;
188
+ if (footerStart < 0) {
189
+ throw new Error("tail read shorter than footer");
190
+ }
191
+ const footer = readFooter(new BinaryReader(tail.subarray(footerStart)));
192
+ if (!magicEquals(footer.magic, MAGIC)) {
193
+ throw new Error("invalid magic number");
194
+ }
195
+ const summaryLen = footer.summaryLen;
196
+ let compressedSummary;
197
+ const tailLen = BigInt(tail.byteLength);
198
+ if (tailLen >= summaryLen + BigInt(FOOTER_LEN)) {
199
+ const start = Number(tailLen - BigInt(FOOTER_LEN) - summaryLen);
200
+ compressedSummary = tail.subarray(start, start + Number(summaryLen));
201
+ }
202
+ else {
203
+ compressedSummary = await this.rs.read(size - summaryLen - BigInt(FOOTER_LEN), summaryLen);
204
+ }
205
+ const decompressed = this.decompress(compressedSummary);
206
+ const summary = readSummary(new BinaryReader(decompressed));
207
+ this.cachedSummary = summary;
208
+ return summary;
209
+ }
210
+ /**
211
+ * Read messages. Returns an async iterable; iterating consumes lazily.
212
+ *
213
+ * Concurrency note: because the iterator carries internal mutable state
214
+ * (cursors and a reusable buffer), only one iteration at a time over the
215
+ * same returned async iterable is supported.
216
+ */
217
+ readMessages(opts = {}) {
218
+ const reader = this;
219
+ const tailPrefetch = opts.tailPrefetch ?? 0n;
220
+ const startTimestamp = opts.startTimestamp ?? 0n;
221
+ const endTimestamp = opts.endTimestamp ?? MAX_INT64;
222
+ const reverse = opts.order === "reverse-time";
223
+ const wantedNames = opts.topicNames;
224
+ const strategy = opts.strategy;
225
+ const copy = opts.copy === true;
226
+ const videoDecodable = opts.videoDecodable === true;
227
+ let initialized = false;
228
+ let exhausted = false;
229
+ let groupIts = [];
230
+ const heap = new MessageHeap(reverse);
231
+ const idToName = new Map();
232
+ const init = async () => {
233
+ const summary = await reader.summaryWithHint(tailPrefetch);
234
+ // When a remap is configured, caller-supplied topicNames arrive in
235
+ // exposed-name space. Internal matching stays in in-file space, so
236
+ // translate exposed -> in-file (unknown names pass through and match
237
+ // nothing). idToName is built in exposed space for output.
238
+ const remap = reader.topicRemap;
239
+ const inverse = remap !== undefined ? reader.prepareRename(summary) : undefined;
240
+ // Build topic-name allowlist. Defaults to "all topics".
241
+ let wantedSet;
242
+ if (wantedNames !== undefined) {
243
+ wantedSet =
244
+ inverse !== undefined
245
+ ? new Set(wantedNames.map((n) => inverse.get(n) ?? n))
246
+ : new Set(wantedNames);
247
+ }
248
+ else {
249
+ wantedSet = collectAllTopicNames(summary);
250
+ }
251
+ // Translate names -> ids; remember reverse mapping (exposed names).
252
+ const topicIds = new Set();
253
+ for (const ti of summary.topicsInfos) {
254
+ for (const tm of ti.topicMetadatas) {
255
+ if (!wantedSet.has(tm.name)) {
256
+ continue;
257
+ }
258
+ topicIds.add(tm.id);
259
+ idToName.set(tm.id, remap?.get(tm.name) ?? tm.name);
260
+ }
261
+ }
262
+ if (strategy !== undefined) {
263
+ groupIts = await reader.prepareCostAware({
264
+ summary,
265
+ topicIds,
266
+ wantedSet,
267
+ startTimestamp,
268
+ endTimestamp,
269
+ reverse,
270
+ strategy,
271
+ videoDecodable,
272
+ });
273
+ }
274
+ else {
275
+ groupIts = reader.prepareDefault({
276
+ summary,
277
+ topicIds,
278
+ wantedSet,
279
+ startTimestamp,
280
+ endTimestamp,
281
+ reverse,
282
+ videoDecodable,
283
+ });
284
+ }
285
+ // Prime the heap with one message from each group.
286
+ for (let i = 0; i < groupIts.length; i++) {
287
+ const m = await groupIts[i].next();
288
+ if (m === undefined) {
289
+ continue;
290
+ }
291
+ heap.push(m.timestamp, {
292
+ groupIdx: i,
293
+ topicId: m.topicId,
294
+ data: m.data,
295
+ });
296
+ }
297
+ };
298
+ const iter = {
299
+ [Symbol.asyncIterator]() {
300
+ return iter;
301
+ },
302
+ async next() {
303
+ if (exhausted) {
304
+ return { value: undefined, done: true };
305
+ }
306
+ if (!initialized) {
307
+ await init();
308
+ initialized = true;
309
+ }
310
+ const top = heap.pop();
311
+ if (top === undefined) {
312
+ exhausted = true;
313
+ return { value: undefined, done: true };
314
+ }
315
+ const out = {
316
+ timestamp: top.priority,
317
+ topicName: idToName.get(top.value.topicId) ?? "",
318
+ data: copy ? new Uint8Array(top.value.data) : top.value.data,
319
+ };
320
+ // Pull the next message from the same group and re-heap.
321
+ const nm = await groupIts[top.value.groupIdx].next();
322
+ if (nm !== undefined) {
323
+ heap.push(nm.timestamp, {
324
+ groupIdx: top.value.groupIdx,
325
+ topicId: nm.topicId,
326
+ data: nm.data,
327
+ });
328
+ }
329
+ return { value: out, done: false };
330
+ },
331
+ async return() {
332
+ exhausted = true;
333
+ return { value: undefined, done: true };
334
+ },
335
+ };
336
+ return iter;
337
+ }
338
+ /**
339
+ * Floor-message lookup at concrete timestamps per topic. For each
340
+ * (queries[i].topic, queries[i].timestamps[j]) pair, out[i][j] is the
341
+ * message with the greatest timestamp <= timestamps[j], or found=false when
342
+ * none exists.
343
+ *
344
+ * Preconditions, validated before any data I/O (all violations aggregated
345
+ * into a single SampleValidationError):
346
+ * - each queries[i].timestamps must be strictly increasing
347
+ * - each queries[i].topic must be unique across all i
348
+ * - each queries[i].topic must exist in the file's summary
349
+ *
350
+ * All data I/O runs concurrently under the hood, governed by the strategy.
351
+ */
352
+ async sample(queries, opts = {}) {
353
+ const strategy = opts.strategy ?? DEFAULT_SAMPLE_STRATEGY;
354
+ const videoDecodable = opts.videoDecodable === true;
355
+ const summary = await this.summaryWithHint(opts.tailPrefetch ?? 0n);
356
+ // When a remap is configured, queries arrive in exposed-name space.
357
+ // Translate to in-file names before validation and the engine call;
358
+ // SampleResult is positional, so no translation back is needed.
359
+ if (this.topicRemap !== undefined) {
360
+ const inverse = this.prepareRename(summary);
361
+ queries = queries.map((q) => ({
362
+ topic: inverse?.get(q.topic) ?? q.topic,
363
+ timestamps: q.timestamps,
364
+ }));
365
+ }
366
+ validateSampleQueries(queries, summary);
367
+ const specs = queries.map((q) => ({
368
+ topic: q.topic,
369
+ timestamps: q.timestamps,
370
+ }));
371
+ // SampleHit and SampleResult are structurally identical; the engine's
372
+ // hits double as results.
373
+ return sampleMessages(this.rs, summary, specs, strategy, this.decompress, videoDecodable);
374
+ }
375
+ /**
376
+ * Per-exposed-topic bounds, computed once from the cached summary. Honors any
377
+ * configured remap so keys are exposed names. Used by MultiReader to merge
378
+ * streams and enforce video time-disjointness. Mirrors go (*Reader).topicBounds
379
+ * and py Reader._topic_bounds.
380
+ *
381
+ * @internal
382
+ */
383
+ async topicBounds() {
384
+ if (this.boundsCache !== undefined) {
385
+ return this.boundsCache;
386
+ }
387
+ const summary = await this.summaryWithHint(0n);
388
+ this.prepareRename(summary);
389
+ const out = new Map();
390
+ for (const ti of summary.topicsInfos) {
391
+ if (ti.indexChunkInfoList.length === 0) {
392
+ continue;
393
+ }
394
+ let minTs = ti.indexChunkInfoList[0].startTimestamp;
395
+ let maxTs = ti.indexChunkInfoList[0].endTimestamp;
396
+ for (const info of ti.indexChunkInfoList) {
397
+ if (info.startTimestamp < minTs) {
398
+ minTs = info.startTimestamp;
399
+ }
400
+ if (info.endTimestamp > maxTs) {
401
+ maxTs = info.endTimestamp;
402
+ }
403
+ }
404
+ const isVideo = isVideoTopicsInfo(ti);
405
+ for (const tm of ti.topicMetadatas) {
406
+ const exposed = this.topicRemap?.get(tm.name) ?? tm.name;
407
+ out.set(exposed, { isVideo, minTs, maxTs });
408
+ }
409
+ }
410
+ this.boundsCache = out;
411
+ return out;
412
+ }
413
+ // ---- Default path setup ---------------------------------------------
414
+ prepareDefault(args) {
415
+ const out = [];
416
+ for (const ti of args.summary.topicsInfos) {
417
+ // Skip groups with no relevant topic.
418
+ if (!groupHasAnyOf(ti, args.wantedSet)) {
419
+ continue;
420
+ }
421
+ const it = new TopicsGroupIterator({
422
+ rs: this.rs,
423
+ decompress: this.decompress,
424
+ topicIds: args.topicIds,
425
+ startTimestamp: args.startTimestamp,
426
+ endTimestamp: args.endTimestamp,
427
+ reverse: args.reverse,
428
+ topicsInfo: ti,
429
+ videoDecodable: args.videoDecodable && isVideoTopicsInfo(ti),
430
+ });
431
+ if (!it.hasAny()) {
432
+ continue;
433
+ }
434
+ out.push({ next: () => it.next() });
435
+ }
436
+ return out;
437
+ }
438
+ // ---- Cost-aware path setup ------------------------------------------
439
+ async prepareCostAware(args) {
440
+ const scoped = [];
441
+ for (const ti of args.summary.topicsInfos) {
442
+ if (!groupHasAnyOf(ti, args.wantedSet)) {
443
+ continue;
444
+ }
445
+ const isCompressed = ti.topicMetadatas[0]?.metadata.get(META_KEY_COMPRESSED) === true;
446
+ const groupVideo = args.videoDecodable && isVideoTopicsInfo(ti);
447
+ const filteredInfos = [];
448
+ const filteredLens = [];
449
+ for (let i = 0; i < ti.indexChunkInfoList.length; i++) {
450
+ const info = ti.indexChunkInfoList[i];
451
+ if (info.endTimestamp < args.startTimestamp) {
452
+ continue;
453
+ }
454
+ if (info.startTimestamp > args.endTimestamp) {
455
+ break;
456
+ }
457
+ filteredInfos.push(info);
458
+ let ln;
459
+ if (i < ti.indexChunkInfoList.length - 1) {
460
+ ln = ti.indexChunkInfoList[i + 1].offset - info.offset;
461
+ }
462
+ else {
463
+ ln = ti.totalLen - info.offset + ti.indexChunkInfoList[0].offset;
464
+ }
465
+ filteredLens.push(ln);
466
+ }
467
+ if (filteredInfos.length === 0) {
468
+ continue;
469
+ }
470
+ scoped.push({
471
+ topicsInfo: ti,
472
+ isCompressed,
473
+ groupVideo,
474
+ filteredInfos,
475
+ filteredInfoLs: filteredLens,
476
+ });
477
+ }
478
+ if (scoped.length === 0) {
479
+ return [];
480
+ }
481
+ // ---- Phase A: plan + fetch index chunks across all groups.
482
+ const rangesA = [];
483
+ for (const g of scoped) {
484
+ for (let ci = 0; ci < g.filteredInfos.length; ci++) {
485
+ rangesA.push({
486
+ offset: g.filteredInfos[ci].offset,
487
+ length: g.filteredInfoLs[ci],
488
+ });
489
+ }
490
+ }
491
+ const plannedA = plan(rangesA, args.strategy);
492
+ const bufsA = await fetchAll(this.rs, plannedA.ops, args.strategy.maxConcurrency);
493
+ const loadedIndex = new LoadedBytes(rangesA, plannedA.locations, bufsA);
494
+ const perGroupChunks = scoped.map(() => []);
495
+ for (let gi = 0; gi < scoped.length; gi++) {
496
+ const g = scoped[gi];
497
+ for (let ci = 0; ci < g.filteredInfos.length; ci++) {
498
+ const raw = loadedIndex.get(g.filteredInfos[ci].offset);
499
+ if (raw === undefined) {
500
+ throw new Error(`cost-aware setup: missing index chunk at offset ${g.filteredInfos[ci].offset}`);
501
+ }
502
+ const decompressed = this.decompress(raw);
503
+ const ic = readIndexChunk(new BinaryReader(decompressed));
504
+ const f = sortAndFilter(ic.topicIndexes, ic.uncompressedLen, args.topicIds, args.startTimestamp, args.endTimestamp, g.groupVideo);
505
+ perGroupChunks[gi].push({
506
+ indexChunk: ic,
507
+ messages: f.msgs,
508
+ messageLens: f.lens,
509
+ });
510
+ }
511
+ }
512
+ // ---- Phase B: plan + fetch data ranges. Chunk-level for compressed,
513
+ // per-message for uncompressed.
514
+ const rangesB = [];
515
+ for (let gi = 0; gi < scoped.length; gi++) {
516
+ const g = scoped[gi];
517
+ if (g.isCompressed) {
518
+ for (const dc of perGroupChunks[gi]) {
519
+ if (dc.messages.length === 0) {
520
+ continue;
521
+ }
522
+ rangesB.push({
523
+ offset: dc.indexChunk.chunkOffset,
524
+ length: dc.indexChunk.chunkLen,
525
+ });
526
+ }
527
+ continue;
528
+ }
529
+ for (const dc of perGroupChunks[gi]) {
530
+ for (let k = 0; k < dc.messages.length; k++) {
531
+ const m = dc.messages[k];
532
+ rangesB.push({
533
+ offset: dc.indexChunk.chunkOffset + m.offsetInChunk,
534
+ length: dc.messageLens[k],
535
+ });
536
+ }
537
+ }
538
+ }
539
+ const plannedB = plan(rangesB, args.strategy);
540
+ const bufsB = await fetchAll(this.rs, plannedB.ops, args.strategy.maxConcurrency);
541
+ const loadedData = new LoadedBytes(rangesB, plannedB.locations, bufsB);
542
+ // ---- Build per-group iterators.
543
+ const iters = [];
544
+ for (let gi = 0; gi < scoped.length; gi++) {
545
+ const g = scoped[gi];
546
+ const indexChunks = [];
547
+ const chunkMsgs = [];
548
+ const chunkLens = [];
549
+ for (const dc of perGroupChunks[gi]) {
550
+ if (dc.messages.length === 0) {
551
+ continue;
552
+ }
553
+ indexChunks.push(dc.indexChunk);
554
+ chunkMsgs.push(dc.messages);
555
+ chunkLens.push(dc.messageLens);
556
+ }
557
+ if (indexChunks.length === 0) {
558
+ continue;
559
+ }
560
+ iters.push(new PreloadedTopicsGroupIterator({
561
+ isCompressed: g.isCompressed,
562
+ reverse: args.reverse,
563
+ indexChunks,
564
+ chunkMessages: chunkMsgs,
565
+ chunkMsgLens: chunkLens,
566
+ loadedData,
567
+ decompress: this.decompress,
568
+ }));
569
+ }
570
+ // Wrap in the shared GroupIt shape so the merge loop in readMessages can
571
+ // treat default and cost-aware iterators identically.
572
+ return iters.map((it) => ({
573
+ next: async () => it.next(),
574
+ }));
575
+ }
576
+ }
577
+ function magicEquals(a, b) {
578
+ if (a.byteLength !== b.byteLength) {
579
+ return false;
580
+ }
581
+ for (let i = 0; i < a.byteLength; i++) {
582
+ if (a[i] !== b[i]) {
583
+ return false;
584
+ }
585
+ }
586
+ return true;
587
+ }
588
+ /**
589
+ * Returns nothing when all preconditions hold; otherwise throws a
590
+ * SampleValidationError listing every violation (unknown/duplicate topic,
591
+ * non-strictly-increasing timestamps). Mirrors go validateSampleQueries.
592
+ */
593
+ function validateSampleQueries(queries, summary) {
594
+ const known = new Set();
595
+ for (const ti of summary.topicsInfos) {
596
+ for (const tm of ti.topicMetadatas) {
597
+ known.add(tm.name);
598
+ }
599
+ }
600
+ const seen = new Map();
601
+ const violations = [];
602
+ for (let i = 0; i < queries.length; i++) {
603
+ const q = queries[i];
604
+ if (!known.has(q.topic)) {
605
+ violations.push(`queries[${i}]: unknown topic "${q.topic}"`);
606
+ }
607
+ const prev = seen.get(q.topic);
608
+ if (prev !== undefined) {
609
+ violations.push(`queries[${i}]: duplicate topic "${q.topic}" already used by queries[${prev}]`);
610
+ }
611
+ else {
612
+ seen.set(q.topic, i);
613
+ }
614
+ for (let j = 1; j < q.timestamps.length; j++) {
615
+ if (q.timestamps[j] <= q.timestamps[j - 1]) {
616
+ violations.push(`queries[${i}].timestamps not strictly increasing at position ${j} (${q.timestamps[j]} <= ${q.timestamps[j - 1]})`);
617
+ }
618
+ }
619
+ }
620
+ if (violations.length > 0) {
621
+ throw new SampleValidationError(violations);
622
+ }
623
+ }
624
+ function collectAllTopicNames(summary) {
625
+ const out = new Set();
626
+ for (const ti of summary.topicsInfos) {
627
+ for (const tm of ti.topicMetadatas) {
628
+ out.add(tm.name);
629
+ }
630
+ }
631
+ return out;
632
+ }
633
+ function groupHasAnyOf(ti, names) {
634
+ for (const tm of ti.topicMetadatas) {
635
+ if (names.has(tm.name)) {
636
+ return true;
637
+ }
638
+ }
639
+ return false;
640
+ }
641
+ /**
642
+ * Whether the (single) topic in this group was opened with video=true. Video
643
+ * groups always have exactly one topic, so the first metadata suffices.
644
+ * Mirrors py _is_video_topics_info.
645
+ */
646
+ function isVideoTopicsInfo(ti) {
647
+ return ti.topicMetadatas[0]?.metadata.get(META_KEY_VIDEO) === true;
648
+ }
649
+ //# sourceMappingURL=reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["../src/reader.ts"],"names":[],"mappings":"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"}