@elaraai/e3-api-server 1.0.57 → 1.0.59

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.
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) 2025 Elara AI Pty Ltd
3
3
  * Licensed under BSL 1.1. See LICENSE for details.
4
4
  */
5
- import { NullType, ArrayType, StringType, decodeBeast2, decodeBeast2For, encodeBeast2For, openBeast2PagesFor, some, none, variant, toEastTypeValue, isVariant } from '@elaraai/east';
5
+ import { NullType, ArrayType, StringType, decodeBeast2, encodeBeast2For, openBeast2PagesFor, readBeast2ExtentsRanged, carveBeast2Ranged, some, none, variant, toEastTypeValue, isVariant } from '@elaraai/east';
6
6
  import { workspaceListTree, workspaceGetDatasetHash, workspaceGetDatasetStatus, workspaceSetDataset, workspaceGetTree, } from '@elaraai/e3-core';
7
7
  import { BEAST2_CONTENT_TYPE } from '@elaraai/e3-core';
8
8
  import { sendSuccess, sendError } from '../beast2.js';
@@ -94,45 +94,52 @@ const PAGE_MAX_LIMIT = 10_000;
94
94
  * tighter response limits (e.g. Lambda proxy's 6 MB, base64-inflated) pass
95
95
  * a smaller budget through the route options. */
96
96
  export const PAGE_BYTE_BUDGET_DEFAULT = 4 * 1024 * 1024;
97
- /** Largest un-indexed blob the fallback will whole-decode. The decode runs
98
- * synchronously in the server process — an unbounded one wedges the event
99
- * loop (or the whole process) and takes every other request down with it,
100
- * which is fatal for in-process hosts like the VS Code extension. Above
101
- * this, paging an un-indexed blob is refused with a clear remedy. */
102
- export const PAGE_UNINDEXED_MAX_BYTES_DEFAULT = 64 * 1024 * 1024;
103
- /** Largest blob the page endpoint will buffer at all. Indexed blobs decode
104
- * O(segment) but are still read whole today (a transient allocation);
105
- * above this cap even that is refused until range reads land. */
97
+ /** Largest blob the page endpoint will buffer when the storage backend
98
+ * cannot serve ranged reads (`objects.readRange` absent) and every page
99
+ * request must read the blob whole. Backends with ranged reads never
100
+ * buffer the blob, so no cap applies — per-window memory is O(window) at
101
+ * any blob size. */
106
102
  export const PAGE_READ_MAX_BYTES_DEFAULT = 512 * 1024 * 1024;
107
- /**
108
- * Per-hash LRU of decoded dataset values.
109
- *
110
- * Backs the whole-decode fallback for blobs without a pageable segment
111
- * index. Objects are immutable and content-addressed, so entries never
112
- * invalidate — capacity is the only bound.
113
- */
114
- export class DecodedValueCache {
115
- capacity;
116
- map = new Map();
117
- constructor(capacity) {
118
- this.capacity = capacity;
103
+ const EXTENTS_CACHE_MAX_ENTRIES = 64;
104
+ /** Cap on the cache's total retained bytes. The newest entry always stays
105
+ * (serving the request needs it regardless), so one giant index can still
106
+ * be held — but never alongside others. */
107
+ const EXTENTS_CACHE_MAX_BYTES = 16 * 1024 * 1024;
108
+ const extentsCache = new Map();
109
+ let extentsCacheBytes = 0;
110
+ /** Evicts oldest entries until the count and byte budgets hold, always
111
+ * keeping at least the newest entry. */
112
+ function evictExtents() {
113
+ while (extentsCache.size > 1 &&
114
+ (extentsCache.size > EXTENTS_CACHE_MAX_ENTRIES || extentsCacheBytes > EXTENTS_CACHE_MAX_BYTES)) {
115
+ const oldest = extentsCache.keys().next().value;
116
+ extentsCacheBytes -= extentsCache.get(oldest).bytes;
117
+ extentsCache.delete(oldest);
119
118
  }
120
- get(hash) {
121
- if (!this.map.has(hash))
122
- return undefined;
123
- const value = this.map.get(hash);
124
- this.map.delete(hash);
125
- this.map.set(hash, value);
126
- return value;
119
+ }
120
+ /** Fetches (or reuses) a blob's ranged extents, LRU-cached per hash and
121
+ * bounded by retained bytes. */
122
+ async function cachedRangedExtents(hash, size, readRange) {
123
+ const cached = extentsCache.get(hash);
124
+ if (cached) {
125
+ extentsCache.delete(hash);
126
+ extentsCache.set(hash, cached); // refresh recency
127
+ return cached;
127
128
  }
128
- set(hash, value) {
129
- if (this.map.has(hash))
130
- this.map.delete(hash);
131
- this.map.set(hash, value);
132
- if (this.map.size > this.capacity) {
133
- this.map.delete(this.map.keys().next().value);
134
- }
129
+ const extents = await readBeast2ExtentsRanged({ size, read: readRange });
130
+ const cumulative = new Array(extents.counts.length);
131
+ let running = 0;
132
+ for (let i = 0; i < extents.counts.length; i++) {
133
+ running += extents.counts[i];
134
+ cumulative[i] = running;
135
135
  }
136
+ // offsets + counts + cumulative at 8 bytes per element, plus the header.
137
+ const bytes = extents.head.byteLength + 24 * extents.counts.length;
138
+ const entry = { extents, cumulative, bytes };
139
+ extentsCache.set(hash, entry);
140
+ extentsCacheBytes += bytes;
141
+ evictExtents();
142
+ return entry;
136
143
  }
137
144
  function pageError(type, message, status = 400, headers) {
138
145
  return new Response(JSON.stringify({ error: { type, message } }), {
@@ -140,9 +147,8 @@ function pageError(type, message, status = 400, headers) {
140
147
  headers: { 'Content-Type': 'application/json', 'Cache-Control': 'no-store', ...headers },
141
148
  });
142
149
  }
143
- export async function getDatasetPage(storage, repoPath, workspace, treePath, window, cache, limits) {
150
+ export async function getDatasetPage(storage, repoPath, workspace, treePath, window, limits) {
144
151
  const byteBudget = limits?.byteBudget ?? PAGE_BYTE_BUDGET_DEFAULT;
145
- const unindexedMaxBytes = limits?.unindexedMaxBytes ?? PAGE_UNINDEXED_MAX_BYTES_DEFAULT;
146
152
  const readMaxBytes = limits?.readMaxBytes ?? PAGE_READ_MAX_BYTES_DEFAULT;
147
153
  try {
148
154
  if (treePath.length === 0) {
@@ -180,9 +186,137 @@ export async function getDatasetPage(storage, repoPath, workspace, treePath, win
180
186
  if (!segmentMode && (!Number.isInteger(offset) || offset < 0 || !Number.isInteger(requestedLimit) || requestedLimit < 1)) {
181
187
  return pageError('bad_request', `offset must be a non-negative integer and limit a positive integer, got offset=${offset} limit=${requestedLimit}`);
182
188
  }
183
- // The absolute buffering cap protects the server process itself — the
184
- // endpoint reads the whole blob today (range reads are the follow-up).
185
- const statSize = status.size ?? 0;
189
+ const statSize = status.size ?? (await storage.objects.stat(repoPath, status.hash)).size;
190
+ // The byte budget turns the requested element limit into an effective one
191
+ // using the blob's average element size, so pages stay bounded even for
192
+ // very wide rows.
193
+ const effectiveLimit = (totalElements) => {
194
+ const avgBytes = totalElements > 0 ? statSize / totalElements : 1;
195
+ const byBudget = Math.max(1, Math.floor(byteBudget / Math.max(1, avgBytes)));
196
+ return Math.max(1, Math.min(requestedLimit, PAGE_MAX_LIMIT, byBudget));
197
+ };
198
+ const pageHeaders = (totalElements, segmentCount, pageOffset, pageCount) => ({
199
+ 'Content-Type': BEAST2_CONTENT_TYPE,
200
+ // Hash-pinned windows are content-addressed: same URL ⇒ same bytes,
201
+ // forever — cacheable at any layer with no invalidation. Unpinned
202
+ // windows track the mutable current value and must not be cached.
203
+ 'Cache-Control': window.hash !== undefined ? 'public, max-age=31536000, immutable' : 'no-store',
204
+ 'X-Content-SHA256': status.hash,
205
+ // The stored blob's full byte size — the page endpoint is then
206
+ // self-describing (no separate status call needed for the header
207
+ // line); Content-Length remains the page's own bytes.
208
+ 'X-Total-Bytes': String(statSize),
209
+ 'X-Total-Elements': String(totalElements),
210
+ // Always exact: Array counts index stream order, and v5 Set/Dict
211
+ // segments are disjoint ranges of the canonical value.
212
+ 'X-Total-Exactness': 'exact',
213
+ 'X-Segment-Count': String(segmentCount),
214
+ 'X-Page-Offset': String(pageOffset),
215
+ 'X-Page-Count': String(pageCount),
216
+ });
217
+ // Ranged path: backends with `objects.readRange` never buffer the blob.
218
+ // The tail (index) and head (header sections) are read once per content
219
+ // hash and cached; each window then reads only the byte ranges of the
220
+ // segments it touches — per-request memory is O(window) at any blob
221
+ // size, so no cap applies (#513).
222
+ const readRange = storage.objects.readRange?.bind(storage.objects);
223
+ if (readRange) {
224
+ let cached;
225
+ try {
226
+ cached = await cachedRangedExtents(status.hash, statSize, (offset, length) => readRange(repoPath, status.hash, offset, length));
227
+ }
228
+ catch (err) {
229
+ // Only the reader's own blob-shape refusals mean "not indexed" — a
230
+ // blob predating the stored-segmented contract (or injected raw).
231
+ // Anything else (storage I/O, missing object) is a real failure and
232
+ // must surface as one, not masquerade as a re-write suggestion.
233
+ const message = err instanceof Error ? err.message : String(err);
234
+ if (!/^(beast2 v5:|Data too short for Beast2|Invalid Beast2)/.test(message)) {
235
+ throw err;
236
+ }
237
+ return pageError('dataset_not_indexed', 'Dataset blob carries no pageable segment index — re-write the dataset (re-run the producing task, or set the value again) to store it in the indexed form.');
238
+ }
239
+ const { extents, cumulative } = cached;
240
+ if (!extents.selfContained) {
241
+ return pageError('dataset_not_indexed', 'Dataset blob carries no pageable segment index — re-write the dataset (re-run the producing task, or set the value again) to store it in the indexed form.');
242
+ }
243
+ const segmentCount = extents.offsets.length;
244
+ const totalElements = extents.elementCount;
245
+ // The touched segment span [from, to) and the window placement.
246
+ let from;
247
+ let to;
248
+ let limit = 0;
249
+ if (segmentMode) {
250
+ const seg = window.segment;
251
+ if (seg >= segmentCount) {
252
+ return pageError('bad_request', `segment ${seg} out of range (${segmentCount} segments)`);
253
+ }
254
+ from = seg;
255
+ to = seg + 1;
256
+ }
257
+ else {
258
+ limit = effectiveLimit(totalElements);
259
+ if (offset >= totalElements) {
260
+ from = 0;
261
+ to = 0; // empty window past the end
262
+ }
263
+ else {
264
+ from = 0;
265
+ while (cumulative[from] <= offset)
266
+ from++;
267
+ const lastRow = Math.min(offset + limit, totalElements) - 1;
268
+ to = from;
269
+ while (cumulative[to] <= lastRow)
270
+ to++;
271
+ to++;
272
+ }
273
+ }
274
+ const spanStart = to > from ? extents.offsets[from] : 0;
275
+ const spanEnd = to > from
276
+ ? (to < segmentCount ? extents.offsets[to] : extents.segmentsEnd)
277
+ : 0;
278
+ const frames = to > from
279
+ ? await readRange(repoPath, status.hash, spanStart, spanEnd - spanStart)
280
+ : new Uint8Array(0);
281
+ const windowBlob = carveBeast2Ranged(extents, frames, from, to);
282
+ const pages = openBeast2PagesFor(typeValue)(windowBlob);
283
+ let windowValue;
284
+ let pageOffset;
285
+ let pageCount;
286
+ if (segmentMode) {
287
+ try {
288
+ windowValue = pages.segment(0);
289
+ }
290
+ catch (err) {
291
+ return pageError('dataset_not_segmented', err instanceof Error ? err.message : String(err));
292
+ }
293
+ pageCount = extents.counts[from];
294
+ pageOffset = from === 0 ? 0 : cumulative[from - 1];
295
+ }
296
+ else {
297
+ const base = from > 0 ? cumulative[from - 1] : 0;
298
+ try {
299
+ windowValue = pages.slice(to > from ? offset - base : 0, limit);
300
+ }
301
+ catch (err) {
302
+ return pageError('dataset_not_canonical', err instanceof Error ? err.message : String(err));
303
+ }
304
+ pageCount = kind === 'Array'
305
+ ? windowValue.length
306
+ : windowValue.size;
307
+ pageOffset = offset;
308
+ }
309
+ const body = encodeBeast2For(typeValue)(windowValue);
310
+ return new Response(body, {
311
+ status: 200,
312
+ headers: {
313
+ ...pageHeaders(totalElements, segmentCount, pageOffset, pageCount),
314
+ 'Content-Length': String(body.byteLength),
315
+ },
316
+ });
317
+ }
318
+ // Fallback path (no ranged reads): the whole blob is buffered per
319
+ // request, so the absolute cap protects the server process itself.
186
320
  if (statSize > readMaxBytes) {
187
321
  return pageError('dataset_too_large', `Dataset is ${Math.round(statSize / 1024 / 1024)} MB — beyond the ${Math.round(readMaxBytes / 1024 / 1024)} MB paging cap. Download it instead.`);
188
322
  }
@@ -194,14 +328,6 @@ export async function getDatasetPage(storage, repoPath, workspace, treePath, win
194
328
  catch {
195
329
  pages = null; // No index/footer — every existing whole-value blob.
196
330
  }
197
- // The byte budget turns the requested element limit into an effective one
198
- // using the blob's average element size, so pages stay bounded even for
199
- // very wide rows.
200
- const effectiveLimit = (totalElements) => {
201
- const avgBytes = totalElements > 0 ? data.byteLength / totalElements : 1;
202
- const byBudget = Math.max(1, Math.floor(byteBudget / Math.max(1, avgBytes)));
203
- return Math.max(1, Math.min(requestedLimit, PAGE_MAX_LIMIT, byBudget));
204
- };
205
331
  let windowValue;
206
332
  let totalElements;
207
333
  let pageOffset;
@@ -227,7 +353,7 @@ export async function getDatasetPage(storage, repoPath, workspace, treePath, win
227
353
  pageOffset += pages.counts[i];
228
354
  }
229
355
  else if (pages !== null && pages.selfContained) {
230
- // The indexed fast path, every collection kind: Array windows address
356
+ // The indexed path, every collection kind: Array windows address
231
357
  // stream order, Set/Dict windows the canonical key order (fences are
232
358
  // verified on first access; a non-canonical blob is corrupt).
233
359
  totalElements = pages.elementCount;
@@ -244,81 +370,18 @@ export async function getDatasetPage(storage, repoPath, workspace, treePath, win
244
370
  pageOffset = offset;
245
371
  }
246
372
  else {
247
- let merged = cache.get(status.hash);
248
- // The whole-decode guardrail: a huge synchronous decode wedges the
249
- // server for every caller. Already-cached values serve for free.
250
- if (merged === undefined && data.byteLength > unindexedMaxBytes) {
251
- const mb = Math.round(data.byteLength / 1024 / 1024);
252
- const capMb = Math.round(unindexedMaxBytes / 1024 / 1024);
253
- return pageError('dataset_too_large_unindexed', `Dataset is ${mb} MB and stored without a pageable segment index — beyond the ${capMb} MB whole-decode cap. Re-run the producing task (current runners store large collections segmented) or download it.`);
254
- }
255
- if (merged === undefined) {
256
- merged = decodeBeast2For(typeValue)(data);
257
- cache.set(status.hash, merged);
258
- }
259
- if (kind === 'Array') {
260
- const arr = merged;
261
- totalElements = arr.length;
262
- const limit = effectiveLimit(totalElements);
263
- windowValue = arr.slice(offset, offset + limit);
264
- pageCount = windowValue.length;
265
- }
266
- else if (kind === 'Set') {
267
- const set = merged;
268
- totalElements = set.size;
269
- const limit = effectiveLimit(totalElements);
270
- const win = new Set();
271
- let i = 0;
272
- for (const item of set) {
273
- if (i >= offset + limit)
274
- break;
275
- if (i >= offset)
276
- win.add(item);
277
- i++;
278
- }
279
- windowValue = win;
280
- pageCount = win.size;
281
- }
282
- else {
283
- const map = merged;
284
- totalElements = map.size;
285
- const limit = effectiveLimit(totalElements);
286
- const win = new Map();
287
- let i = 0;
288
- for (const [k, v] of map.entries()) {
289
- if (i >= offset + limit)
290
- break;
291
- if (i >= offset)
292
- win.set(k, v);
293
- i++;
294
- }
295
- windowValue = win;
296
- pageCount = win.size;
297
- }
298
- pageOffset = offset;
373
+ // Collection datasets are stored segmented + indexed by every writer
374
+ // at every size; a blob without a pageable index predates that
375
+ // contract (or was injected raw) and is refused rather than
376
+ // whole-decoded — re-writing the dataset produces the indexed form.
377
+ return pageError('dataset_not_indexed', 'Dataset blob carries no pageable segment index — re-write the dataset (re-run the producing task, or set the value again) to store it in the indexed form.');
299
378
  }
300
379
  const body = encodeBeast2For(typeValue)(windowValue);
301
380
  return new Response(body, {
302
381
  status: 200,
303
382
  headers: {
304
- 'Content-Type': BEAST2_CONTENT_TYPE,
383
+ ...pageHeaders(totalElements, pages ? pages.segmentCount : 0, pageOffset, pageCount),
305
384
  'Content-Length': String(body.byteLength),
306
- // Hash-pinned windows are content-addressed: same URL ⇒ same bytes,
307
- // forever — cacheable at any layer with no invalidation. Unpinned
308
- // windows track the mutable current value and must not be cached.
309
- 'Cache-Control': window.hash !== undefined ? 'public, max-age=31536000, immutable' : 'no-store',
310
- 'X-Content-SHA256': status.hash,
311
- // The stored blob's full byte size — the page endpoint is then
312
- // self-describing (no separate status call needed for the header
313
- // line); Content-Length remains the page's own bytes.
314
- 'X-Total-Bytes': String(data.byteLength),
315
- 'X-Total-Elements': String(totalElements),
316
- // Always exact: Array counts index stream order, and v5 Set/Dict
317
- // segments are disjoint ranges of the canonical value.
318
- 'X-Total-Exactness': 'exact',
319
- 'X-Segment-Count': String(pages ? pages.segmentCount : 0),
320
- 'X-Page-Offset': String(pageOffset),
321
- 'X-Page-Count': String(pageCount),
322
385
  },
323
386
  });
324
387
  }
@@ -1 +1 @@
1
- {"version":3,"file":"datasets.js","sourceRoot":"","sources":["../../../src/handlers/datasets.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"datasets.js","sourceRoot":"","sources":["../../../src/handlers/datasets.ts"],"names":[],"mappings":"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"}
@@ -4,10 +4,11 @@
4
4
  */
5
5
  import { describe, it } from 'node:test';
6
6
  import assert from 'node:assert/strict';
7
- import { encodeBeast2For, StringType, variant } from '@elaraai/east';
7
+ import { ArrayType, IntegerType, StringType, StructType, decodeBeast2For, encodeBeast2For, encodeBeast2PagedFor, equalFor, none, toEastTypeValue, variant, } from '@elaraai/east';
8
8
  import { BEAST2_CONTENT_TYPE, computeHash, InMemoryTransferBackend } from '@elaraai/e3-core';
9
9
  import { InMemoryStorage } from '@elaraai/e3-core/test';
10
- import { getDataset } from './datasets.js';
10
+ import { PackageObjectType, WorkspaceStateType } from '@elaraai/e3-types';
11
+ import { getDataset, getDatasetPage } from './datasets.js';
11
12
  /**
12
13
  * ~`byteLength` bytes of high-entropy ASCII, deterministic across runs.
13
14
  *
@@ -172,4 +173,165 @@ describe('getDataset', () => {
172
173
  assert.equal(body.error.type, 'bad_request');
173
174
  });
174
175
  });
176
+ const RowType = StructType({ id: IntegerType, name: StringType });
177
+ const RowsType = ArrayType(RowType);
178
+ const rowsPath = [variant('field', 'inputs'), variant('field', 'rows')];
179
+ function makeRows(n) {
180
+ return Array.from({ length: n }, (_, i) => ({ id: BigInt(i), name: `row-${i % 97}` }));
181
+ }
182
+ /** Seeds a deployed workspace whose `.inputs.rows` dataset holds `blob`. */
183
+ async function seedRowsDataset(storage, blob) {
184
+ await storage.repos.create(REPO);
185
+ const hash = await storage.objects.write(REPO, blob);
186
+ const structure = variant('struct', new Map([
187
+ ['inputs', variant('struct', new Map([
188
+ ['rows', variant('value', { type: toEastTypeValue(RowsType), writable: true })],
189
+ ]))],
190
+ ]));
191
+ const pkgHash = await storage.objects.write(REPO, encodeBeast2For(PackageObjectType)({
192
+ tasks: new Map(),
193
+ data: { structure, refs: new Map([['inputs/rows', variant('value', { hash, versions: new Map() })]]) },
194
+ functions: new Map(),
195
+ records: new Map(),
196
+ }));
197
+ await storage.refs.workspaceWrite(REPO, WS, encodeBeast2For(WorkspaceStateType)({
198
+ packageName: 'pages', packageVersion: '1.0.0', packageHash: pkgHash, deployedAt: new Date(0), currentRunId: none,
199
+ }));
200
+ await storage.datasets.write(REPO, WS, 'inputs/rows', variant('value', { hash, versions: new Map() }));
201
+ return hash;
202
+ }
203
+ /** Counts whole-object and ranged reads of `watchedHash` (the dataset blob —
204
+ * workspace/package object reads are expected and not counted). */
205
+ function spyObjectReads(storage, watchedHash) {
206
+ const objects = storage.objects;
207
+ let whole = 0;
208
+ let ranged = 0;
209
+ const origRead = objects.read.bind(objects);
210
+ const origRange = objects.readRange.bind(objects);
211
+ objects.read = (repo, hash) => {
212
+ if (hash === watchedHash)
213
+ whole++;
214
+ return origRead(repo, hash);
215
+ };
216
+ objects.readRange = (repo, hash, offset, length) => {
217
+ if (hash === watchedHash)
218
+ ranged += length;
219
+ return origRange(repo, hash, offset, length);
220
+ };
221
+ return { wholeReads: () => whole, rangedBytes: () => ranged };
222
+ }
223
+ describe('getDatasetPage (ranged reads)', () => {
224
+ it('serves element windows through ranged reads without buffering the blob', async () => {
225
+ const storage = new InMemoryStorage();
226
+ // Incompressible per-row names so the deflated blob comfortably exceeds
227
+ // the 64 KiB tail probe — otherwise the probe alone covers the blob and
228
+ // the read-volume assertion below measures nothing.
229
+ const rows = Array.from({ length: 8000 }, (_, i) => {
230
+ let seed = (Math.imul(i, 2654435761) + 1) >>> 0;
231
+ const chars = new Array(48);
232
+ for (let j = 0; j < 48; j++) {
233
+ seed = (Math.imul(seed, 1664525) + 1013904223) >>> 0;
234
+ chars[j] = String.fromCharCode(33 + ((seed >>> 16) % 94));
235
+ }
236
+ return { id: BigInt(i), name: chars.join('') };
237
+ });
238
+ const blob = encodeBeast2PagedFor(RowsType, { batchSize: 100 })(rows);
239
+ assert.ok(blob.byteLength > 128 * 1024, `fixture (${blob.byteLength} bytes) must dwarf the 64 KiB tail probe`);
240
+ const hash = await seedRowsDataset(storage, blob);
241
+ const spy = spyObjectReads(storage, hash);
242
+ const response = await getDatasetPage(storage, REPO, WS, rowsPath, { offset: 900, limit: 200 });
243
+ assert.equal(response.status, 200);
244
+ assert.equal(response.headers.get('X-Total-Elements'), '8000');
245
+ assert.equal(response.headers.get('X-Total-Bytes'), String(blob.byteLength));
246
+ assert.equal(response.headers.get('X-Page-Offset'), '900');
247
+ assert.equal(response.headers.get('X-Page-Count'), '200');
248
+ const page = decodeBeast2For(RowsType)(new Uint8Array(await response.arrayBuffer()));
249
+ assert.ok(equalFor(RowsType)(page, rows.slice(900, 1100)), 'window equals the expected slice');
250
+ assert.equal(spy.wholeReads(), 0, 'the ranged path must never read the blob whole');
251
+ assert.ok(spy.rangedBytes() < blob.byteLength / 2, `ranged reads (${spy.rangedBytes()} bytes) must stay well under the blob (${blob.byteLength} bytes)`);
252
+ // A second window on the same hash reuses the cached extents: only the
253
+ // window's own frame bytes are read.
254
+ const before = spy.rangedBytes();
255
+ const deep = await getDatasetPage(storage, REPO, WS, rowsPath, { offset: 7500, limit: 100 });
256
+ assert.equal(deep.status, 200);
257
+ const deepPage = decodeBeast2For(RowsType)(new Uint8Array(await deep.arrayBuffer()));
258
+ assert.ok(equalFor(RowsType)(deepPage, rows.slice(7500, 7600)));
259
+ assert.ok(spy.rangedBytes() - before < 64 * 1024, 'a cached-extents window reads only its own segments');
260
+ });
261
+ it('pages blobs beyond the fallback cap — no size limit on the ranged path', async () => {
262
+ const storage = new InMemoryStorage();
263
+ const rows = makeRows(2500);
264
+ const blob = encodeBeast2PagedFor(RowsType, { batchSize: 100 })(rows);
265
+ await seedRowsDataset(storage, blob);
266
+ // A cap far below the blob size: the ranged path must ignore it.
267
+ const response = await getDatasetPage(storage, REPO, WS, rowsPath, { offset: 2400, limit: 1000 }, { readMaxBytes: 1024 });
268
+ assert.equal(response.status, 200);
269
+ assert.equal(response.headers.get('X-Page-Count'), '100', 'tail clamp still applies');
270
+ const page = decodeBeast2For(RowsType)(new Uint8Array(await response.arrayBuffer()));
271
+ assert.ok(equalFor(RowsType)(page, rows.slice(2400)));
272
+ });
273
+ it('serves segment windows and empty past-the-end windows', async () => {
274
+ const storage = new InMemoryStorage();
275
+ const rows = makeRows(2500);
276
+ const blob = encodeBeast2PagedFor(RowsType, { batchSize: 100 })(rows);
277
+ await seedRowsDataset(storage, blob);
278
+ const seg = await getDatasetPage(storage, REPO, WS, rowsPath, { segment: 1 });
279
+ assert.equal(seg.status, 200);
280
+ assert.equal(seg.headers.get('X-Page-Offset'), '100');
281
+ assert.equal(seg.headers.get('X-Page-Count'), '100');
282
+ const segPage = decodeBeast2For(RowsType)(new Uint8Array(await seg.arrayBuffer()));
283
+ assert.ok(equalFor(RowsType)(segPage, rows.slice(100, 200)));
284
+ const past = await getDatasetPage(storage, REPO, WS, rowsPath, { offset: 5000, limit: 100 });
285
+ assert.equal(past.status, 200);
286
+ assert.equal(past.headers.get('X-Page-Count'), '0');
287
+ assert.equal(past.headers.get('X-Page-Offset'), '5000');
288
+ assert.deepEqual(decodeBeast2For(RowsType)(new Uint8Array(await past.arrayBuffer())), []);
289
+ });
290
+ it('refuses index-less blobs without buffering them', async () => {
291
+ const storage = new InMemoryStorage();
292
+ // Whole-value v5 encode: no index — predates the stored-segmented contract.
293
+ const blob = encodeBeast2For(RowsType)(makeRows(50));
294
+ const hash = await seedRowsDataset(storage, blob);
295
+ const spy = spyObjectReads(storage, hash);
296
+ const response = await getDatasetPage(storage, REPO, WS, rowsPath, { offset: 0, limit: 10 });
297
+ assert.equal(response.status, 400);
298
+ const body = await response.json();
299
+ assert.equal(body.error.type, 'dataset_not_indexed');
300
+ assert.equal(spy.wholeReads(), 0, 'the refusal must come from the tail probe, not a whole read');
301
+ });
302
+ it('surfaces storage failures as errors, never as dataset_not_indexed', async () => {
303
+ const storage = new InMemoryStorage();
304
+ // Distinct row count → distinct content hash, so the module-level
305
+ // extents cache cannot mask the injected failure.
306
+ const rows = makeRows(600);
307
+ const blob = encodeBeast2PagedFor(RowsType, { batchSize: 100 })(rows);
308
+ await seedRowsDataset(storage, blob);
309
+ // The blob IS indexed; the BACKEND fails at read time. The old bare
310
+ // catch would answer dataset_not_indexed ("re-write the dataset") for
311
+ // what is really an I/O failure.
312
+ storage.objects.readRange = () => Promise.reject(new Error('injected storage failure'));
313
+ const response = await getDatasetPage(storage, REPO, WS, rowsPath, { offset: 0, limit: 10 });
314
+ assert.notEqual(response.status, 200);
315
+ const body = await response.json();
316
+ assert.notEqual(body.error.type, 'dataset_not_indexed', 'an I/O failure must not masquerade as a re-write suggestion');
317
+ assert.match(body.error.message, /injected storage failure/);
318
+ });
319
+ it('falls back to whole reads — and keeps the cap — when the backend has no ranged reads', async () => {
320
+ const storage = new InMemoryStorage();
321
+ const rows = makeRows(500);
322
+ const blob = encodeBeast2PagedFor(RowsType, { batchSize: 100 })(rows);
323
+ await seedRowsDataset(storage, blob);
324
+ // Simulate a backend without ranged reads (e.g. a store that has not
325
+ // implemented the optional method yet).
326
+ storage.objects.readRange = undefined;
327
+ const capped = await getDatasetPage(storage, REPO, WS, rowsPath, { offset: 0, limit: 10 }, { readMaxBytes: 1024 });
328
+ assert.equal(capped.status, 400);
329
+ const body = await capped.json();
330
+ assert.equal(body.error.type, 'dataset_too_large');
331
+ const served = await getDatasetPage(storage, REPO, WS, rowsPath, { offset: 90, limit: 20 });
332
+ assert.equal(served.status, 200);
333
+ const page = decodeBeast2For(RowsType)(new Uint8Array(await served.arrayBuffer()));
334
+ assert.ok(equalFor(RowsType)(page, rows.slice(90, 110)), 'the fallback still pages correctly');
335
+ });
336
+ });
175
337
  //# sourceMappingURL=datasets.spec.js.map