@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.
- package/dist/src/handlers/dataflow.d.ts.map +1 -1
- package/dist/src/handlers/dataflow.js +56 -57
- package/dist/src/handlers/dataflow.js.map +1 -1
- package/dist/src/handlers/datasets.d.ts +16 -35
- package/dist/src/handlers/datasets.d.ts.map +1 -1
- package/dist/src/handlers/datasets.js +182 -119
- package/dist/src/handlers/datasets.js.map +1 -1
- package/dist/src/handlers/datasets.spec.js +164 -2
- package/dist/src/handlers/datasets.spec.js.map +1 -1
- package/dist/src/routes/datasets.d.ts +0 -7
- package/dist/src/routes/datasets.d.ts.map +1 -1
- package/dist/src/routes/datasets.js +2 -4
- package/dist/src/routes/datasets.js.map +1 -1
- package/dist/src/routes/transfer.d.ts.map +1 -1
- package/dist/src/routes/transfer.js +15 -3
- package/dist/src/routes/transfer.js.map +1 -1
- package/dist/src/server.d.ts +0 -3
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +1 -2
- package/dist/src/server.js.map +1 -1
- package/package.json +4 -4
|
@@ -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,
|
|
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
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
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
|
-
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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,
|
|
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
|
-
|
|
184
|
-
//
|
|
185
|
-
|
|
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
|
|
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
|
-
|
|
248
|
-
//
|
|
249
|
-
//
|
|
250
|
-
|
|
251
|
-
|
|
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
|
-
|
|
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 {
|
|
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 {
|
|
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
|