@elaraai/e3-api-server 1.0.83 → 1.0.85
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/README.md +88 -11
- package/dist/src/errors.d.ts +15 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +22 -1
- package/dist/src/errors.js.map +1 -1
- package/dist/src/handlers/dataflow.d.ts +89 -18
- package/dist/src/handlers/dataflow.d.ts.map +1 -1
- package/dist/src/handlers/dataflow.js +198 -123
- package/dist/src/handlers/dataflow.js.map +1 -1
- package/dist/src/handlers/dataflow.spec.js +257 -7
- package/dist/src/handlers/dataflow.spec.js.map +1 -1
- package/dist/src/handlers/datasets.d.ts +56 -15
- package/dist/src/handlers/datasets.d.ts.map +1 -1
- package/dist/src/handlers/datasets.js +200 -122
- package/dist/src/handlers/datasets.js.map +1 -1
- package/dist/src/handlers/datasets.spec.js +94 -4
- package/dist/src/handlers/datasets.spec.js.map +1 -1
- package/dist/src/handlers/functions.d.ts +11 -2
- package/dist/src/handlers/functions.d.ts.map +1 -1
- package/dist/src/handlers/functions.js +50 -20
- package/dist/src/handlers/functions.js.map +1 -1
- package/dist/src/handlers/functions.spec.js +26 -15
- package/dist/src/handlers/functions.spec.js.map +1 -1
- package/dist/src/handlers/index.d.ts +2 -2
- package/dist/src/handlers/index.d.ts.map +1 -1
- package/dist/src/handlers/index.js +2 -2
- package/dist/src/handlers/index.js.map +1 -1
- package/dist/src/handlers/packages.d.ts +1 -1
- package/dist/src/handlers/packages.d.ts.map +1 -1
- package/dist/src/handlers/packages.js +1 -1
- package/dist/src/handlers/packages.js.map +1 -1
- package/dist/src/handlers/records.d.ts +27 -7
- package/dist/src/handlers/records.d.ts.map +1 -1
- package/dist/src/handlers/records.js +36 -16
- package/dist/src/handlers/records.js.map +1 -1
- package/dist/src/handlers/records.spec.js +161 -27
- package/dist/src/handlers/records.spec.js.map +1 -1
- package/dist/src/handlers/repository.d.ts +9 -1
- package/dist/src/handlers/repository.d.ts.map +1 -1
- package/dist/src/handlers/repository.js +14 -5
- package/dist/src/handlers/repository.js.map +1 -1
- package/dist/src/handlers/tasks.d.ts +18 -6
- package/dist/src/handlers/tasks.d.ts.map +1 -1
- package/dist/src/handlers/tasks.js +31 -22
- package/dist/src/handlers/tasks.js.map +1 -1
- package/dist/src/handlers/tasks.spec.js +61 -12
- package/dist/src/handlers/tasks.spec.js.map +1 -1
- package/dist/src/handlers/workspaces.d.ts +11 -6
- package/dist/src/handlers/workspaces.d.ts.map +1 -1
- package/dist/src/handlers/workspaces.js +14 -8
- package/dist/src/handlers/workspaces.js.map +1 -1
- package/dist/src/handlers/workspaces.spec.js +25 -9
- package/dist/src/handlers/workspaces.spec.js.map +1 -1
- package/dist/src/identity.d.ts +22 -0
- package/dist/src/identity.d.ts.map +1 -0
- package/dist/src/identity.js +6 -0
- package/dist/src/identity.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/local-dataflow.d.ts +14 -1
- package/dist/src/local-dataflow.d.ts.map +1 -1
- package/dist/src/local-dataflow.js +12 -7
- package/dist/src/local-dataflow.js.map +1 -1
- package/dist/src/middleware/auth.d.ts +1 -11
- package/dist/src/middleware/auth.d.ts.map +1 -1
- package/dist/src/middleware/auth.js.map +1 -1
- package/dist/src/middleware/repository.d.ts +1 -1
- package/dist/src/middleware/repository.d.ts.map +1 -1
- package/dist/src/middleware/repository.js +4 -10
- package/dist/src/middleware/repository.js.map +1 -1
- package/dist/src/middleware/repository.spec.js +7 -6
- package/dist/src/middleware/repository.spec.js.map +1 -1
- package/dist/src/portable.d.ts +47 -0
- package/dist/src/portable.d.ts.map +1 -0
- package/dist/src/portable.js +79 -0
- package/dist/src/portable.js.map +1 -0
- package/dist/src/portable.spec.d.ts +6 -0
- package/dist/src/portable.spec.d.ts.map +1 -0
- package/dist/src/portable.spec.js +325 -0
- package/dist/src/portable.spec.js.map +1 -0
- package/dist/src/routes/dataset-path.d.ts +28 -0
- package/dist/src/routes/dataset-path.d.ts.map +1 -0
- package/dist/src/routes/dataset-path.js +52 -0
- package/dist/src/routes/dataset-path.js.map +1 -0
- package/dist/src/routes/datasets.d.ts +7 -1
- package/dist/src/routes/datasets.d.ts.map +1 -1
- package/dist/src/routes/datasets.js +5 -11
- package/dist/src/routes/datasets.js.map +1 -1
- package/dist/src/routes/executions.d.ts +4 -2
- package/dist/src/routes/executions.d.ts.map +1 -1
- package/dist/src/routes/executions.js +31 -10
- package/dist/src/routes/executions.js.map +1 -1
- package/dist/src/routes/functions.d.ts +16 -8
- package/dist/src/routes/functions.d.ts.map +1 -1
- package/dist/src/routes/functions.js +21 -11
- package/dist/src/routes/functions.js.map +1 -1
- package/dist/src/routes/index.d.ts +4 -3
- package/dist/src/routes/index.d.ts.map +1 -1
- package/dist/src/routes/index.js +1 -0
- package/dist/src/routes/index.js.map +1 -1
- package/dist/src/routes/objects.d.ts +4 -2
- package/dist/src/routes/objects.d.ts.map +1 -1
- package/dist/src/routes/objects.js +5 -8
- package/dist/src/routes/objects.js.map +1 -1
- package/dist/src/routes/package-transfer.d.ts +1 -1
- package/dist/src/routes/package-transfer.d.ts.map +1 -1
- package/dist/src/routes/package-transfer.js +19 -22
- package/dist/src/routes/package-transfer.js.map +1 -1
- package/dist/src/routes/packages.d.ts +1 -1
- package/dist/src/routes/packages.d.ts.map +1 -1
- package/dist/src/routes/query.d.ts +53 -0
- package/dist/src/routes/query.d.ts.map +1 -0
- package/dist/src/routes/query.js +86 -0
- package/dist/src/routes/query.js.map +1 -0
- package/dist/src/routes/query.spec.d.ts +6 -0
- package/dist/src/routes/query.spec.d.ts.map +1 -0
- package/dist/src/routes/query.spec.js +49 -0
- package/dist/src/routes/query.spec.js.map +1 -0
- package/dist/src/routes/records.d.ts +32 -3
- package/dist/src/routes/records.d.ts.map +1 -1
- package/dist/src/routes/records.js +34 -7
- package/dist/src/routes/records.js.map +1 -1
- package/dist/src/routes/repositories.d.ts +1 -1
- package/dist/src/routes/repositories.d.ts.map +1 -1
- package/dist/src/routes/repository.d.ts +6 -1
- package/dist/src/routes/repository.d.ts.map +1 -1
- package/dist/src/routes/repository.js +5 -0
- package/dist/src/routes/repository.js.map +1 -1
- package/dist/src/routes/repository.spec.d.ts +6 -0
- package/dist/src/routes/repository.spec.d.ts.map +1 -0
- package/dist/src/routes/repository.spec.js +84 -0
- package/dist/src/routes/repository.spec.js.map +1 -0
- package/dist/src/routes/tasks.d.ts +1 -1
- package/dist/src/routes/tasks.d.ts.map +1 -1
- package/dist/src/routes/tasks.js +16 -4
- package/dist/src/routes/tasks.js.map +1 -1
- package/dist/src/routes/transfer.d.ts +1 -1
- package/dist/src/routes/transfer.d.ts.map +1 -1
- package/dist/src/routes/transfer.js +7 -27
- package/dist/src/routes/transfer.js.map +1 -1
- package/dist/src/routes/workspaces.d.ts +1 -1
- package/dist/src/routes/workspaces.d.ts.map +1 -1
- package/dist/src/routes/workspaces.js +34 -22
- package/dist/src/routes/workspaces.js.map +1 -1
- package/dist/src/server.js +1 -1
- package/dist/src/server.js.map +1 -1
- package/dist/src/types.d.ts +135 -5
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +7 -5
- package/dist/src/types.js.map +1 -1
- package/package.json +8 -4
|
@@ -12,13 +12,58 @@
|
|
|
12
12
|
import { describe, it } from 'node:test';
|
|
13
13
|
import assert from 'node:assert/strict';
|
|
14
14
|
import { Hono } from 'hono';
|
|
15
|
-
import { NullType, OptionType, decodeBeast2For, encodeBeast2For, none, some, variant } from '@elaraai/east';
|
|
15
|
+
import { NullType, OptionType, decodeBeast2For, encodeBeast2For, equalFor, none, printFor, some, variant } from '@elaraai/east';
|
|
16
16
|
import { Budget, InMemoryStateStore, LocalOrchestrator, MockTaskRunner, stateToStatus, } from '@elaraai/e3-core';
|
|
17
17
|
import { InMemoryStorage } from '@elaraai/e3-core/test';
|
|
18
|
-
import { BEAST2_CONTENT_TYPE, E3_RELEASE } from '@elaraai/e3-types';
|
|
18
|
+
import { BEAST2_CONTENT_TYPE, E3_RELEASE, dataflowForce } from '@elaraai/e3-types';
|
|
19
19
|
import { createExecutionRoutes } from '../routes/executions.js';
|
|
20
20
|
import { createServer } from '../server.js';
|
|
21
21
|
import { DataflowBudgetType, DataflowExecutionStateType, DataflowRequestType, ResponseType } from '../types.js';
|
|
22
|
+
/** A run's state, of no tasks, in workspace `main` of `test-repo`. */
|
|
23
|
+
function runState(id, status) {
|
|
24
|
+
return {
|
|
25
|
+
release: E3_RELEASE, id, repo: 'test-repo', workspace: 'main', startedAt: new Date(Date.now() - 1000), force: dataflowForce(false), filter: none,
|
|
26
|
+
graph: none, graphHash: none, tasks: new Map(), executed: 0n, cached: 0n, failed: 0n, skipped: 0n, status,
|
|
27
|
+
completedAt: none, error: none, versionVectors: new Map(), inputSnapshot: new Map(), taskOutputPaths: [], reexecuted: 0n,
|
|
28
|
+
events: [], eventSeq: 0n,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* A state store that records the reads made of it, as a poll makes them: of
|
|
33
|
+
* the whole state, of a run's summary, and of its events, with the most
|
|
34
|
+
* events each read of them asks for.
|
|
35
|
+
*/
|
|
36
|
+
function countingStore(inner) {
|
|
37
|
+
const reads = [];
|
|
38
|
+
const limits = [];
|
|
39
|
+
const store = {
|
|
40
|
+
create: (state) => inner.create(state),
|
|
41
|
+
read: (repo, workspace, id) => {
|
|
42
|
+
reads.push('read');
|
|
43
|
+
return inner.read(repo, workspace, id);
|
|
44
|
+
},
|
|
45
|
+
readLatest: (repo, workspace) => {
|
|
46
|
+
reads.push('readLatest');
|
|
47
|
+
return inner.readLatest(repo, workspace);
|
|
48
|
+
},
|
|
49
|
+
readLatestSummary: (repo, workspace) => {
|
|
50
|
+
reads.push('readLatestSummary');
|
|
51
|
+
return inner.readLatestSummary(repo, workspace);
|
|
52
|
+
},
|
|
53
|
+
update: (state) => inner.update(state),
|
|
54
|
+
updateTaskStatus: (repo, workspace, id, task, status, details) => inner.updateTaskStatus(repo, workspace, id, task, status, details),
|
|
55
|
+
updateStatus: (repo, workspace, id, status, details) => inner.updateStatus(repo, workspace, id, status, details),
|
|
56
|
+
recordEvent: (repo, workspace, id, event) => inner.recordEvent(repo, workspace, id, event),
|
|
57
|
+
getEventsSince: (repo, workspace, id, since, limit) => {
|
|
58
|
+
reads.push('getEventsSince');
|
|
59
|
+
limits.push(limit);
|
|
60
|
+
return inner.getEventsSince(repo, workspace, id, since, limit);
|
|
61
|
+
},
|
|
62
|
+
delete: (repo, workspace, id) => inner.delete(repo, workspace, id),
|
|
63
|
+
readStored: (repo) => inner.readStored(repo),
|
|
64
|
+
};
|
|
65
|
+
return { store, reads, limits };
|
|
66
|
+
}
|
|
22
67
|
describe('dataflow routes', () => {
|
|
23
68
|
it('start, poll and cancel a run through the orchestrator and the state store their host gives', async () => {
|
|
24
69
|
// A host's own orchestrator, which records its run in the host's store.
|
|
@@ -27,7 +72,7 @@ describe('dataflow routes', () => {
|
|
|
27
72
|
const orchestrator = {
|
|
28
73
|
start: async (_storage, repo, workspace) => {
|
|
29
74
|
await stateStore.create({
|
|
30
|
-
release: E3_RELEASE, id: 'run-1', repo, workspace, startedAt: new Date(Date.now() - 1000), force: false, filter: none,
|
|
75
|
+
release: E3_RELEASE, id: 'run-1', repo, workspace, startedAt: new Date(Date.now() - 1000), force: dataflowForce(false), filter: none,
|
|
31
76
|
graph: none, graphHash: none, tasks: new Map(), executed: 0n, cached: 0n, failed: 0n, skipped: 0n, status: 'running',
|
|
32
77
|
completedAt: none, error: none, versionVectors: new Map(), inputSnapshot: new Map(), taskOutputPaths: [], reexecuted: 0n,
|
|
33
78
|
events: [], eventSeq: 0n,
|
|
@@ -35,9 +80,10 @@ describe('dataflow routes', () => {
|
|
|
35
80
|
return { id: 'run-1', repo, workspace };
|
|
36
81
|
},
|
|
37
82
|
wait: () => new Promise(() => { }),
|
|
38
|
-
getStatus: async (handle) => (
|
|
39
|
-
|
|
83
|
+
getStatus: async (handle) => stateToStatus((await stateStore.read(handle.repo, handle.workspace, handle.id))),
|
|
84
|
+
getProgress: () => Promise.resolve({
|
|
40
85
|
waiting: [{ task: 'train', unit: none, needs: 1024n, since: new Date(0).toISOString() }],
|
|
86
|
+
splits: [],
|
|
41
87
|
}),
|
|
42
88
|
cancel: async (handle) => {
|
|
43
89
|
cancelled.push(handle.id);
|
|
@@ -59,7 +105,7 @@ describe('dataflow routes', () => {
|
|
|
59
105
|
...(body !== undefined && { body }),
|
|
60
106
|
})).arrayBuffer()));
|
|
61
107
|
const poll = async () => decodeState(new Uint8Array(await (await app.request('/api/repos/r/workspaces/main/dataflow/execution')).arrayBuffer()));
|
|
62
|
-
assert.equal((await post('', encodeBeast2For(DataflowRequestType)({ force: false, filter: none }))).type, 'success');
|
|
108
|
+
assert.equal((await post('', encodeBeast2For(DataflowRequestType)({ force: dataflowForce(false), filter: none }))).type, 'success');
|
|
63
109
|
const running = await poll();
|
|
64
110
|
if (running.type !== 'success')
|
|
65
111
|
assert.fail(`the poll was refused: ${running.value.type}`);
|
|
@@ -85,6 +131,7 @@ describe('dataflow routes', () => {
|
|
|
85
131
|
throw new Error('the route waited on a run another host executes');
|
|
86
132
|
},
|
|
87
133
|
getStatus: () => Promise.reject(new Error('not polled')),
|
|
134
|
+
getProgress: () => Promise.reject(new Error('not polled')),
|
|
88
135
|
cancel: async () => { },
|
|
89
136
|
getEvents: async () => [],
|
|
90
137
|
};
|
|
@@ -97,13 +144,216 @@ describe('dataflow routes', () => {
|
|
|
97
144
|
const response = await app.request('/api/repos/r/workspaces/main/dataflow', {
|
|
98
145
|
method: 'POST',
|
|
99
146
|
headers: { 'Content-Type': BEAST2_CONTENT_TYPE },
|
|
100
|
-
body: encodeBeast2For(DataflowRequestType)({ force: false, filter: none }),
|
|
147
|
+
body: encodeBeast2For(DataflowRequestType)({ force: dataflowForce(false), filter: none }),
|
|
101
148
|
});
|
|
102
149
|
assert.equal(response.status, 202);
|
|
103
150
|
assert.equal(decodeBeast2For(ResponseType(NullType))(new Uint8Array(await response.arrayBuffer())).type, 'success');
|
|
104
151
|
await new Promise((resolve) => setTimeout(resolve, 20));
|
|
105
152
|
assert.equal(waits, 0);
|
|
106
153
|
});
|
|
154
|
+
it('start refuses a name no workspace can have, as invalid_name of a workspace, before it asks the orchestrator', async () => {
|
|
155
|
+
// A host's own orchestrator may take a lock named for whatever it is
|
|
156
|
+
// given, and a lock's name may hold `#`: the route checks the name as a
|
|
157
|
+
// workspace's itself, so every host refuses it alike.
|
|
158
|
+
let starts = 0;
|
|
159
|
+
const orchestrator = {
|
|
160
|
+
start: async (_storage, repo, workspace) => {
|
|
161
|
+
starts++;
|
|
162
|
+
return { id: 'run-1', repo, workspace };
|
|
163
|
+
},
|
|
164
|
+
wait: () => new Promise(() => { }),
|
|
165
|
+
getStatus: () => Promise.reject(new Error('not polled')),
|
|
166
|
+
getProgress: () => Promise.reject(new Error('not polled')),
|
|
167
|
+
cancel: async () => { },
|
|
168
|
+
getEvents: async () => [],
|
|
169
|
+
};
|
|
170
|
+
const app = new Hono();
|
|
171
|
+
app.route('/api/repos/:repo/workspaces/:ws/dataflow', createExecutionRoutes(new InMemoryStorage(), () => 'test-repo', {
|
|
172
|
+
getRunner: () => new MockTaskRunner(),
|
|
173
|
+
getOrchestrator: () => orchestrator,
|
|
174
|
+
getStateStore: () => new InMemoryStateStore(),
|
|
175
|
+
}));
|
|
176
|
+
const Answer = ResponseType(NullType);
|
|
177
|
+
const decode = decodeBeast2For(Answer);
|
|
178
|
+
const joins = 'holds "#", which joins the parts of a lock\'s name';
|
|
179
|
+
for (const [name, why] of [
|
|
180
|
+
['bad:name', 'holds ":", which a file name cannot'],
|
|
181
|
+
['a#b', joins],
|
|
182
|
+
['main#dataflow', joins],
|
|
183
|
+
]) {
|
|
184
|
+
const response = await app.request(`/api/repos/r/workspaces/${encodeURIComponent(name)}/dataflow`, {
|
|
185
|
+
method: 'POST',
|
|
186
|
+
headers: { 'Content-Type': BEAST2_CONTENT_TYPE },
|
|
187
|
+
body: encodeBeast2For(DataflowRequestType)({ force: dataflowForce(false), filter: none }),
|
|
188
|
+
});
|
|
189
|
+
const answer = decode(new Uint8Array(await response.arrayBuffer()));
|
|
190
|
+
const refused = variant('error', variant('invalid_name', {
|
|
191
|
+
kind: 'workspace', name, message: `the workspace name ${JSON.stringify(name)} ${why}`,
|
|
192
|
+
}));
|
|
193
|
+
assert.ok(equalFor(Answer)(answer, refused), `${name}: answered ${printFor(Answer)(answer)}`);
|
|
194
|
+
}
|
|
195
|
+
assert.equal(starts, 0, 'the orchestrator was never asked');
|
|
196
|
+
});
|
|
197
|
+
it('poll a run by its cursor: the API\'s events past it, at most a limit, and the cursor past them, reading the run\'s summary and its events a page of the limit at a time', async () => {
|
|
198
|
+
const { store, reads } = countingStore(new InMemoryStateStore());
|
|
199
|
+
const at = new Date(0);
|
|
200
|
+
// Seven events, three the API does not show: the run's start and end, and
|
|
201
|
+
// a task made ready
|
|
202
|
+
await store.create({
|
|
203
|
+
...runState('run-1', 'failed'),
|
|
204
|
+
completedAt: some(at),
|
|
205
|
+
events: [
|
|
206
|
+
variant('execution_started', { seq: 1n, timestamp: at, executionId: 'run-1', totalTasks: 2n }),
|
|
207
|
+
variant('task_started', { seq: 2n, timestamp: at, task: 'etl' }),
|
|
208
|
+
variant('task_completed', { seq: 3n, timestamp: at, task: 'etl', cached: false, outputHash: 'a'.repeat(64), duration: 5n, peakBytes: none }),
|
|
209
|
+
variant('task_ready', { seq: 4n, timestamp: at, task: 'report' }),
|
|
210
|
+
variant('task_started', { seq: 5n, timestamp: at, task: 'report' }),
|
|
211
|
+
variant('task_failed', { seq: 6n, timestamp: at, task: 'report', error: none, exitCode: some(1n), duration: 7n }),
|
|
212
|
+
variant('execution_completed', { seq: 7n, timestamp: at, success: false, executed: 1n, cached: 0n, failed: 1n, skipped: 0n, duration: 12n }),
|
|
213
|
+
],
|
|
214
|
+
eventSeq: 7n,
|
|
215
|
+
});
|
|
216
|
+
const app = new Hono();
|
|
217
|
+
app.route('/api/repos/:repo/workspaces/:ws/dataflow', createExecutionRoutes(new InMemoryStorage(), () => 'test-repo', {
|
|
218
|
+
getRunner: () => new MockTaskRunner(),
|
|
219
|
+
getOrchestrator: () => new LocalOrchestrator(store),
|
|
220
|
+
getStateStore: () => store,
|
|
221
|
+
}));
|
|
222
|
+
const decodeState = decodeBeast2For(ResponseType(DataflowExecutionStateType));
|
|
223
|
+
const poll = async (query) => {
|
|
224
|
+
reads.length = 0;
|
|
225
|
+
const answer = decodeState(new Uint8Array(await (await app.request(`/api/repos/r/workspaces/main/dataflow/execution${query}`)).arrayBuffer()));
|
|
226
|
+
if (answer.type !== 'success')
|
|
227
|
+
assert.fail(`the poll ${query} was refused: ${answer.value.type}`);
|
|
228
|
+
return { events: answer.value.events.map((event) => `${event.type} ${event.value.task}`), nextSeq: answer.value.nextSeq, reads: [...reads] };
|
|
229
|
+
};
|
|
230
|
+
assert.deepEqual(await poll(''), {
|
|
231
|
+
events: ['start etl', 'complete etl', 'start report', 'failed report'], nextSeq: 7n, reads: ['readLatestSummary', 'getEventsSince'],
|
|
232
|
+
});
|
|
233
|
+
assert.deepEqual(await poll('?since=7'), { events: [], nextSeq: 7n, reads: ['readLatestSummary'] }, 'a poll that has every event reads none');
|
|
234
|
+
assert.deepEqual(await poll('?limit=0'), { events: [], nextSeq: 0n, reads: ['readLatestSummary'] }, 'nor does one that asks for none');
|
|
235
|
+
assert.deepEqual(await poll('?limit=1'), {
|
|
236
|
+
events: ['start etl'], nextSeq: 2n, reads: ['readLatestSummary', 'getEventsSince', 'getEventsSince'],
|
|
237
|
+
}, 'a page of one at a time, past the run\'s start, which the API does not show');
|
|
238
|
+
assert.deepEqual(await poll('?since=2&limit=2'), {
|
|
239
|
+
events: ['complete etl', 'start report'], nextSeq: 5n, reads: ['readLatestSummary', 'getEventsSince', 'getEventsSince'],
|
|
240
|
+
}, 'the cursor moves past an event the API does not show between two it serves');
|
|
241
|
+
assert.deepEqual(await poll('?since=5'), { events: ['failed report'], nextSeq: 7n, reads: ['readLatestSummary', 'getEventsSince'] });
|
|
242
|
+
const refused = await app.request('/api/repos/r/workspaces/main/dataflow/execution?since=-1');
|
|
243
|
+
assert.equal(refused.status, 400);
|
|
244
|
+
assert.deepEqual(await refused.json(), { error: { type: 'bad_request', message: 'since must be a non-negative integer, got "-1"' } });
|
|
245
|
+
});
|
|
246
|
+
it('poll a run of more events than a poll is served: at most 1,000, however many it asks for, with the run\'s id and its last event, which say what a poll left', async () => {
|
|
247
|
+
const { store, limits } = countingStore(new InMemoryStateStore());
|
|
248
|
+
const at = new Date(0);
|
|
249
|
+
await store.create({
|
|
250
|
+
...runState('run-1', 'completed'),
|
|
251
|
+
completedAt: some(at),
|
|
252
|
+
events: Array.from({ length: 1_500 }, (_, i) => variant('task_started', { seq: BigInt(i + 1), timestamp: at, task: `t${i + 1}` })),
|
|
253
|
+
eventSeq: 1500n,
|
|
254
|
+
});
|
|
255
|
+
const app = new Hono();
|
|
256
|
+
app.route('/api/repos/:repo/workspaces/:ws/dataflow', createExecutionRoutes(new InMemoryStorage(), () => 'test-repo', {
|
|
257
|
+
getRunner: () => new MockTaskRunner(),
|
|
258
|
+
getOrchestrator: () => new LocalOrchestrator(store),
|
|
259
|
+
getStateStore: () => store,
|
|
260
|
+
}));
|
|
261
|
+
const decodeState = decodeBeast2For(ResponseType(DataflowExecutionStateType));
|
|
262
|
+
const poll = async (query) => {
|
|
263
|
+
const answer = decodeState(new Uint8Array(await (await app.request(`/api/repos/r/workspaces/main/dataflow/execution${query}`)).arrayBuffer()));
|
|
264
|
+
if (answer.type !== 'success')
|
|
265
|
+
assert.fail(`the poll ${query} was refused: ${answer.value.type}`);
|
|
266
|
+
const { runId, events, nextSeq, lastSeq } = answer.value;
|
|
267
|
+
return { runId, served: events.length, first: events[0]?.value.task ?? null, nextSeq, lastSeq };
|
|
268
|
+
};
|
|
269
|
+
assert.deepEqual(await poll(''), { runId: 'run-1', served: 1_000, first: 't1', nextSeq: 1000n, lastSeq: 1500n }, 'a poll that names no limit');
|
|
270
|
+
assert.deepEqual(await poll('?limit=5000'), { runId: 'run-1', served: 1_000, first: 't1', nextSeq: 1000n, lastSeq: 1500n }, 'one that names a larger');
|
|
271
|
+
assert.deepEqual(await poll('?since=1000'), { runId: 'run-1', served: 500, first: 't1001', nextSeq: 1500n, lastSeq: 1500n }, 'the rest, from the cursor it left');
|
|
272
|
+
assert.deepEqual(await poll('?limit=0'), { runId: 'run-1', served: 0, first: null, nextSeq: 0n, lastSeq: 1500n }, 'a poll of no events sees where the run\'s events end');
|
|
273
|
+
assert.deepEqual(limits, [1_000, 1_000, 1_000], 'each poll asks the store for no more events than it serves');
|
|
274
|
+
});
|
|
275
|
+
it('poll a run whose events the API mostly does not show: a page of the limit at a time, at most eight, and the rest over the polls after', async () => {
|
|
276
|
+
const { store, limits } = countingStore(new InMemoryStateStore());
|
|
277
|
+
const at = new Date(0);
|
|
278
|
+
// Twenty tasks made ready, which the API does not show, and two started
|
|
279
|
+
await store.create({
|
|
280
|
+
...runState('run-1', 'completed'),
|
|
281
|
+
completedAt: some(at),
|
|
282
|
+
events: [
|
|
283
|
+
...Array.from({ length: 20 }, (_, i) => variant('task_ready', { seq: BigInt(i + 1), timestamp: at, task: `t${i + 1}` })),
|
|
284
|
+
variant('task_started', { seq: 21n, timestamp: at, task: 't1' }),
|
|
285
|
+
variant('task_started', { seq: 22n, timestamp: at, task: 't2' }),
|
|
286
|
+
],
|
|
287
|
+
eventSeq: 22n,
|
|
288
|
+
});
|
|
289
|
+
const app = new Hono();
|
|
290
|
+
app.route('/api/repos/:repo/workspaces/:ws/dataflow', createExecutionRoutes(new InMemoryStorage(), () => 'test-repo', {
|
|
291
|
+
getRunner: () => new MockTaskRunner(),
|
|
292
|
+
getOrchestrator: () => new LocalOrchestrator(store),
|
|
293
|
+
getStateStore: () => store,
|
|
294
|
+
}));
|
|
295
|
+
const decodeState = decodeBeast2For(ResponseType(DataflowExecutionStateType));
|
|
296
|
+
const poll = async (query) => {
|
|
297
|
+
limits.length = 0;
|
|
298
|
+
const answer = decodeState(new Uint8Array(await (await app.request(`/api/repos/r/workspaces/main/dataflow/execution${query}`)).arrayBuffer()));
|
|
299
|
+
if (answer.type !== 'success')
|
|
300
|
+
assert.fail(`the poll ${query} was refused: ${answer.value.type}`);
|
|
301
|
+
return { events: answer.value.events.map((event) => event.value.task), nextSeq: answer.value.nextSeq, pages: limits.length };
|
|
302
|
+
};
|
|
303
|
+
assert.deepEqual(await poll('?limit=2'), { events: [], nextSeq: 16n, pages: 8 }, 'eight pages of two, none of them shown: the cursor past them');
|
|
304
|
+
assert.deepEqual(await poll('?since=16&limit=2'), { events: ['t1', 't2'], nextSeq: 22n, pages: 3 }, 'the rest, from that cursor');
|
|
305
|
+
});
|
|
306
|
+
it('poll a run up to the last event its summary names: one the run records after the summary is read is the next poll\'s', async () => {
|
|
307
|
+
const inner = new InMemoryStateStore();
|
|
308
|
+
const at = new Date(0);
|
|
309
|
+
await inner.create({ ...runState('run-1', 'running'), events: [variant('task_started', { seq: 1n, timestamp: at, task: 'etl' })], eventSeq: 1n });
|
|
310
|
+
// The run records its next event between the poll's read of its summary
|
|
311
|
+
// and its read of the events.
|
|
312
|
+
let races = true;
|
|
313
|
+
const store = {
|
|
314
|
+
...countingStore(inner).store,
|
|
315
|
+
getEventsSince: async (repo, workspace, id, since) => {
|
|
316
|
+
if (races) {
|
|
317
|
+
races = false;
|
|
318
|
+
await inner.recordEvent(repo, workspace, id, variant('task_started', { seq: 2n, timestamp: at, task: 'report' }));
|
|
319
|
+
}
|
|
320
|
+
return inner.getEventsSince(repo, workspace, id, since);
|
|
321
|
+
},
|
|
322
|
+
};
|
|
323
|
+
const app = new Hono();
|
|
324
|
+
app.route('/api/repos/:repo/workspaces/:ws/dataflow', createExecutionRoutes(new InMemoryStorage(), () => 'test-repo', {
|
|
325
|
+
getRunner: () => new MockTaskRunner(),
|
|
326
|
+
getOrchestrator: () => new LocalOrchestrator(store),
|
|
327
|
+
getStateStore: () => store,
|
|
328
|
+
}));
|
|
329
|
+
const decodeState = decodeBeast2For(ResponseType(DataflowExecutionStateType));
|
|
330
|
+
const poll = async (query) => {
|
|
331
|
+
const answer = decodeState(new Uint8Array(await (await app.request(`/api/repos/r/workspaces/main/dataflow/execution${query}`)).arrayBuffer()));
|
|
332
|
+
if (answer.type !== 'success')
|
|
333
|
+
assert.fail(`the poll ${query} was refused: ${answer.value.type}`);
|
|
334
|
+
return [answer.value.events.map((event) => `${event.type} ${event.value.task}`), answer.value.nextSeq, answer.value.lastSeq];
|
|
335
|
+
};
|
|
336
|
+
assert.deepEqual(await poll(''), [['start etl'], 1n, 1n], 'the events its summary names, and no later one');
|
|
337
|
+
assert.deepEqual(await poll('?since=1'), [['start report'], 2n, 2n], 'the next poll serves it');
|
|
338
|
+
});
|
|
339
|
+
it('poll a run another host runs without reading its state for the waits and progress, which only that host holds', async () => {
|
|
340
|
+
const { store, reads } = countingStore(new InMemoryStateStore());
|
|
341
|
+
await store.create(runState('run-1', 'running'));
|
|
342
|
+
const app = new Hono();
|
|
343
|
+
// This host's orchestrator, over the store the run is kept in, runs none
|
|
344
|
+
// of the runs it is asked of.
|
|
345
|
+
app.route('/api/repos/:repo/workspaces/:ws/dataflow', createExecutionRoutes(new InMemoryStorage(), () => 'test-repo', {
|
|
346
|
+
getRunner: () => new MockTaskRunner(),
|
|
347
|
+
getOrchestrator: () => new LocalOrchestrator(store),
|
|
348
|
+
getStateStore: () => store,
|
|
349
|
+
}));
|
|
350
|
+
const answer = decodeBeast2For(ResponseType(DataflowExecutionStateType))(new Uint8Array(await (await app.request('/api/repos/r/workspaces/main/dataflow/execution')).arrayBuffer()));
|
|
351
|
+
if (answer.type !== 'success')
|
|
352
|
+
assert.fail(`the poll was refused: ${answer.value.type}`);
|
|
353
|
+
assert.equal(answer.value.status.type, 'running');
|
|
354
|
+
assert.deepEqual([answer.value.waiting, answer.value.splits], [[], []]);
|
|
355
|
+
assert.deepEqual(reads, ['readLatestSummary'], 'the run\'s summary alone: it has no events past the cursor');
|
|
356
|
+
});
|
|
107
357
|
it('serve the budget a run gets, with what its runners hold now, and none when mounted without one', async () => {
|
|
108
358
|
const decode = decodeBeast2For(ResponseType(OptionType(DataflowBudgetType)));
|
|
109
359
|
const budgetOf = async (app) => decode(new Uint8Array(await (await app.request('/api/repos/r/workspaces/main/dataflow/budget')).arrayBuffer()));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataflow.spec.js","sourceRoot":"","sources":["../../../src/handlers/dataflow.spec.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dataflow.spec.js","sourceRoot":"","sources":["../../../src/handlers/dataflow.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
3
|
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
4
|
*/
|
|
5
|
+
import { type EastTypeValue } from '@elaraai/east';
|
|
5
6
|
import { type TreePath } from '@elaraai/e3-types';
|
|
6
|
-
import type { StorageBackend, TransferBackend } from '@elaraai/e3-core';
|
|
7
|
+
import type { StorageBackend, TransferBackend } from '@elaraai/e3-core/portable';
|
|
7
8
|
/**
|
|
8
9
|
* List dataset fields at the given path.
|
|
9
10
|
*/
|
|
@@ -31,9 +32,9 @@ export declare function getDataset(storage: StorageBackend, repoPath: string, wo
|
|
|
31
32
|
* tighter response limits (e.g. Lambda proxy's 6 MB, base64-inflated) pass
|
|
32
33
|
* a smaller budget through the route options. */
|
|
33
34
|
export declare const PAGE_BYTE_BUDGET_DEFAULT: number;
|
|
34
|
-
/** Window addressing for {@link getDatasetPage}: an
|
|
35
|
-
* (`offset`/`limit`) or one writer segment (`segment`),
|
|
36
|
-
* to a content hash. */
|
|
35
|
+
/** Window addressing for {@link getDatasetPage} and {@link getValuePage}: an
|
|
36
|
+
* element window (`offset`/`limit`) or one writer segment (`segment`),
|
|
37
|
+
* optionally pinned to a content hash. */
|
|
37
38
|
export interface DatasetPageWindow {
|
|
38
39
|
offset?: number;
|
|
39
40
|
limit?: number;
|
|
@@ -54,12 +55,28 @@ export interface DatasetPageWindow {
|
|
|
54
55
|
join?: boolean;
|
|
55
56
|
/** Content hash the window is addressed against. When it matches the
|
|
56
57
|
* current value the response is immutable (`Cache-Control: immutable`) —
|
|
57
|
-
* the URL is then a pure function of the bytes, so
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
* caches sound. */
|
|
58
|
+
* the URL is then a pure function of the bytes, so a cache can hold it
|
|
59
|
+
* forever with zero staleness: the caller's own, or any between, as the
|
|
60
|
+
* server's {@link PinnedCache} says. A stale hash is refused with 409
|
|
61
|
+
* rather than answered with different bytes, keeping caches sound. */
|
|
61
62
|
hash?: string;
|
|
62
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* Who may keep a hash-pinned answer, which never changes: `private`, the
|
|
66
|
+
* caller's own cache alone (a browser's), or `public`, any cache between it
|
|
67
|
+
* and the server as well (a CDN's). `private` unless a host says otherwise,
|
|
68
|
+
* since an answer holds the rows of a workspace its caller was let read; a
|
|
69
|
+
* host whose data any caller may read opts in to `public`.
|
|
70
|
+
*/
|
|
71
|
+
export type PinnedCache = 'private' | 'public';
|
|
72
|
+
/** Server-side limits for {@link getDatasetPage} and {@link getValuePage}, and
|
|
73
|
+
* who may keep a pinned window. */
|
|
74
|
+
export interface DatasetPageLimits {
|
|
75
|
+
/** Page byte budget (default {@link PAGE_BYTE_BUDGET_DEFAULT}). */
|
|
76
|
+
byteBudget?: number;
|
|
77
|
+
/** Who may keep a hash-pinned window (default `private`). */
|
|
78
|
+
cache?: PinnedCache;
|
|
79
|
+
}
|
|
63
80
|
/**
|
|
64
81
|
* Get one window of a collection dataset as raw BEAST2 bytes.
|
|
65
82
|
*
|
|
@@ -75,13 +92,34 @@ export interface DatasetPageWindow {
|
|
|
75
92
|
* windows verify the segment fences first and reject non-canonical ones as
|
|
76
93
|
* corrupt). A collection stored as one blob is an older e3's and is refused as
|
|
77
94
|
* `dataset_not_indexed`, naming the fix — there is no whole-decode fallback.
|
|
95
|
+
*
|
|
96
|
+
* The window is the stored value's ({@link getValuePage}): the dataset's
|
|
97
|
+
* status and pin are checked here first, and an index window is a record's.
|
|
78
98
|
*/
|
|
79
|
-
/** Server-side limits for {@link getDatasetPage}. */
|
|
80
|
-
export interface DatasetPageLimits {
|
|
81
|
-
/** Page byte budget (default {@link PAGE_BYTE_BUDGET_DEFAULT}). */
|
|
82
|
-
byteBudget?: number;
|
|
83
|
-
}
|
|
84
99
|
export declare function getDatasetPage(storage: StorageBackend, repoPath: string, workspace: string, treePath: TreePath, window: DatasetPageWindow, limits?: DatasetPageLimits): Promise<Response>;
|
|
100
|
+
/**
|
|
101
|
+
* Get one window of a stored collection by its hash, as raw BEAST2 bytes: the
|
|
102
|
+
* window a dataset page serves, of a value a host names itself — a record's
|
|
103
|
+
* state at a past commit, say.
|
|
104
|
+
*
|
|
105
|
+
* @remarks
|
|
106
|
+
* The body, the `X-*` headers and the refusals are a dataset page's
|
|
107
|
+
* ({@link getDatasetPage}): `X-Content-SHA256` is `hash`, and a window pinned
|
|
108
|
+
* to it (`window.hash`) is answered immutable, as content-addressed, while a
|
|
109
|
+
* pin to any other hash is refused with 409. An index window is a record
|
|
110
|
+
* dataset's, which a value has none of.
|
|
111
|
+
*
|
|
112
|
+
* @param storage - Storage backend
|
|
113
|
+
* @param repoPath - Repository identifier
|
|
114
|
+
* @param hash - The stored collection's hash: the segment manifest it is kept as
|
|
115
|
+
* @param type - The collection's type: an Array, a Set or a Dict
|
|
116
|
+
* @param window - An element window (`offset`/`limit`) or one writer segment,
|
|
117
|
+
* and an optional pin
|
|
118
|
+
* @param limits - The page byte budget, and who may keep a pinned window
|
|
119
|
+
* (`private` unless it says otherwise)
|
|
120
|
+
* @returns The window, or a JSON error
|
|
121
|
+
*/
|
|
122
|
+
export declare function getValuePage(storage: StorageBackend, repoPath: string, hash: string, type: EastTypeValue, window: DatasetPageWindow, limits?: DatasetPageLimits): Promise<Response>;
|
|
85
123
|
/** Query for {@link findDatasetKey}, optionally pinned to a content hash
|
|
86
124
|
* with the same semantics as {@link DatasetPageWindow.hash}. Exactly one
|
|
87
125
|
* form: `key` (a whole-key `.east` literal, any key type), `prefix`
|
|
@@ -125,9 +163,12 @@ export interface DatasetFindQuery {
|
|
|
125
163
|
* Responds with JSON `{ found, row, count }`: `row` is the match's global
|
|
126
164
|
* element index (for a prefix, the range's first row; for a miss, the
|
|
127
165
|
* key's insertion row), `count` the number of matched rows. Hash-pinned
|
|
128
|
-
* queries are immutable-cacheable exactly like page windows
|
|
166
|
+
* queries are immutable-cacheable exactly like page windows, by the caches
|
|
167
|
+
* `options.cache` lets keep them (`private` unless it says otherwise).
|
|
129
168
|
*/
|
|
130
|
-
export declare function findDatasetKey(storage: StorageBackend, repoPath: string, workspace: string, treePath: TreePath, query: DatasetFindQuery
|
|
169
|
+
export declare function findDatasetKey(storage: StorageBackend, repoPath: string, workspace: string, treePath: TreePath, query: DatasetFindQuery, options?: {
|
|
170
|
+
readonly cache?: PinnedCache;
|
|
171
|
+
}): Promise<Response>;
|
|
131
172
|
/**
|
|
132
173
|
* Set a dataset value from raw BEAST2 bytes, read as they arrive.
|
|
133
174
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datasets.d.ts","sourceRoot":"","sources":["../../../src/handlers/datasets.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"datasets.d.ts","sourceRoot":"","sources":["../../../src/handlers/datasets.ts"],"names":[],"mappings":"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"}
|