@elaraai/e3-api-server 1.0.84 → 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 +92 -2
- 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 +12 -1
- 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 +160 -26
- 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 +24 -8
- 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 +63 -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
|
@@ -5,18 +5,24 @@
|
|
|
5
5
|
/**
|
|
6
6
|
* Record route tests: the audit actor is derived from the verified identity
|
|
7
7
|
* (a forged request actor is ignored) when auth is configured, honoured from
|
|
8
|
-
* the request otherwise;
|
|
8
|
+
* the request otherwise; compaction is gated to an elevated role; and the
|
|
9
|
+
* routes keep to the host's limits — a mutation's run and a compaction's
|
|
10
|
+
* retries stop under its deadline, a history request that names no limit is
|
|
11
|
+
* answered with its page, and a limit no request could meet is refused when
|
|
12
|
+
* the routes are mounted.
|
|
9
13
|
*/
|
|
10
14
|
import { describe, it, beforeEach } from 'node:test';
|
|
11
15
|
import assert from 'node:assert/strict';
|
|
12
16
|
import { Hono } from 'hono';
|
|
13
|
-
import { IntegerType, encodeBeast2For, decodeBeast2For, toEastTypeValue, variant, some, none } from '@elaraai/east';
|
|
14
|
-
import { MockTaskRunner, recordHistory } from '@elaraai/e3-core';
|
|
17
|
+
import { IntegerType, compareFor, encodeBeast2For, decodeBeast2For, equalFor, printFor, toEastTypeValue, variant, some, none } from '@elaraai/east';
|
|
18
|
+
import { MockTaskRunner, recordHistory, uuidv7 } from '@elaraai/e3-core';
|
|
15
19
|
import { InMemoryStorage } from '@elaraai/e3-core/test';
|
|
16
20
|
import { BEAST2_CONTENT_TYPE, PackageObjectType, RecordObjectType, MutationObjectType, RecordCommitType, WorkspaceRecordType, } from '@elaraai/e3-types';
|
|
17
21
|
import { createWorkspaceRecordRoutes } from '../routes/records.js';
|
|
18
22
|
import { effectiveBudgetMs } from './records.js';
|
|
19
|
-
|
|
23
|
+
// Through the handlers entry, as a host reaches it.
|
|
24
|
+
import { mutationResultOf } from './index.js';
|
|
25
|
+
import { ResponseType, MutationResultType, MutationCallRequestType, RecordHistoryResultType, } from '../types.js';
|
|
20
26
|
describe('effectiveBudgetMs', () => {
|
|
21
27
|
it('returns undefined when no budget is supplied (local default: no gateway, no cap)', () => {
|
|
22
28
|
assert.equal(effectiveBudgetMs(undefined), undefined);
|
|
@@ -35,10 +41,6 @@ const REPO = 'test-repo';
|
|
|
35
41
|
const WS = 'main';
|
|
36
42
|
const encodeInt = encodeBeast2For(IntegerType);
|
|
37
43
|
const encodeMutationCall = encodeBeast2For(MutationCallRequestType);
|
|
38
|
-
async function decodeResponse(response, type) {
|
|
39
|
-
const body = new Uint8Array(await response.arrayBuffer());
|
|
40
|
-
return decodeBeast2For(ResponseType(type))(body);
|
|
41
|
-
}
|
|
42
44
|
/** Seed an InMemoryStorage with a deployed `counter` record + `increment` mutation. */
|
|
43
45
|
async function seedDeployedRecord(storage) {
|
|
44
46
|
await storage.repos.create(REPO);
|
|
@@ -77,15 +79,53 @@ async function seedDeployedRecord(storage) {
|
|
|
77
79
|
})));
|
|
78
80
|
await storage.datasets.write(REPO, WS, 'records/counter', variant('value', { hash: stateHash, versions: new Map([['.records.counter', genesisHash]]) }));
|
|
79
81
|
}
|
|
80
|
-
/** Mount the record routes, optionally injecting an
|
|
81
|
-
|
|
82
|
+
/** Mount the record routes under the host's options, optionally injecting an
|
|
83
|
+
* authenticated identity. */
|
|
84
|
+
function buildApp(storage, runner, identity, options = {}) {
|
|
82
85
|
const app = new Hono();
|
|
83
86
|
if (identity) {
|
|
84
87
|
app.use('*', async (c, next) => { c.set('identity', identity); await next(); });
|
|
85
88
|
}
|
|
86
|
-
app.route('/api/repos/:repo/workspaces/:ws/records', createWorkspaceRecordRoutes(storage, () => REPO, () => runner));
|
|
89
|
+
app.route('/api/repos/:repo/workspaces/:ws/records', createWorkspaceRecordRoutes(storage, () => REPO, () => runner, options));
|
|
87
90
|
return app;
|
|
88
91
|
}
|
|
92
|
+
const decodeMutationAnswer = decodeBeast2For(ResponseType(MutationResultType));
|
|
93
|
+
const printMutationAnswer = printFor(ResponseType(MutationResultType));
|
|
94
|
+
const decodeHistoryAnswer = decodeBeast2For(ResponseType(RecordHistoryResultType));
|
|
95
|
+
const printHistoryAnswer = printFor(ResponseType(RecordHistoryResultType));
|
|
96
|
+
const mutationResultEqual = equalFor(MutationResultType);
|
|
97
|
+
const printMutationResult = printFor(MutationResultType);
|
|
98
|
+
const compareInt = compareFor(IntegerType);
|
|
99
|
+
const printInt = printFor(IntegerType);
|
|
100
|
+
/** A mutation route's answer as the client decodes it: its result, or its
|
|
101
|
+
* error. */
|
|
102
|
+
async function mutationAnswer(response) {
|
|
103
|
+
return decodeMutationAnswer(new Uint8Array(await response.arrayBuffer()));
|
|
104
|
+
}
|
|
105
|
+
/** A mutation route's result, as the client decodes it: the route must have
|
|
106
|
+
* answered one, not an error. */
|
|
107
|
+
async function mutationResult(response) {
|
|
108
|
+
const answer = await mutationAnswer(response);
|
|
109
|
+
if (answer.type !== 'success')
|
|
110
|
+
assert.fail(`the route answered ${printMutationAnswer(answer)}`);
|
|
111
|
+
return answer.value;
|
|
112
|
+
}
|
|
113
|
+
/** A history route's page, as the client decodes it. */
|
|
114
|
+
async function historyResult(response) {
|
|
115
|
+
const answer = decodeHistoryAnswer(new Uint8Array(await response.arrayBuffer()));
|
|
116
|
+
if (answer.type !== 'success')
|
|
117
|
+
assert.fail(`the route answered ${printHistoryAnswer(answer)}`);
|
|
118
|
+
return answer.value;
|
|
119
|
+
}
|
|
120
|
+
/** A runner whose every run ends only when it is aborted, as a program that
|
|
121
|
+
* outruns its limit does. */
|
|
122
|
+
class StalledRunner extends MockTaskRunner {
|
|
123
|
+
execute(_storage, _taskHash, _inputs, options) {
|
|
124
|
+
return new Promise((resolve) => {
|
|
125
|
+
options.signal.addEventListener('abort', () => resolve({ state: 'error', cached: false, cancelled: true, executionId: uuidv7() }), { once: true });
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
89
129
|
function postMutate(app, actor, extraHeaders) {
|
|
90
130
|
return Promise.resolve(app.request(`/api/repos/r/workspaces/${WS}/records/counter/mutations/increment`, {
|
|
91
131
|
method: 'POST',
|
|
@@ -100,6 +140,9 @@ function postCompact(app) {
|
|
|
100
140
|
body: new Uint8Array(),
|
|
101
141
|
}));
|
|
102
142
|
}
|
|
143
|
+
function getHistory(app, query = '') {
|
|
144
|
+
return Promise.resolve(app.request(`/api/repos/r/workspaces/${WS}/records/counter/history${query}`));
|
|
145
|
+
}
|
|
103
146
|
describe('record routes', () => {
|
|
104
147
|
let storage;
|
|
105
148
|
let runner;
|
|
@@ -111,31 +154,27 @@ describe('record routes', () => {
|
|
|
111
154
|
});
|
|
112
155
|
it('threads the Idempotency-Key header through the route so a retry dedups (no double-apply)', async () => {
|
|
113
156
|
const app = buildApp(storage, runner); // no auth
|
|
114
|
-
const first = await
|
|
115
|
-
const second = await
|
|
116
|
-
assert.equal(first.
|
|
117
|
-
assert.
|
|
118
|
-
assert.equal(second.value.outcome.value.commitHash, first.value.outcome.value.commitHash, 'the retry returns the original commit');
|
|
157
|
+
const first = await mutationResult(await postMutate(app, none, { 'Idempotency-Key': 'k1' }));
|
|
158
|
+
const second = await mutationResult(await postMutate(app, none, { 'Idempotency-Key': 'k1' }));
|
|
159
|
+
assert.equal(first.outcome.type, 'committed');
|
|
160
|
+
assert.ok(mutationResultEqual(second, first), `the retry returns the original commit, not ${printMutationResult(second)}`);
|
|
119
161
|
// genesis + exactly one commit: the keyed retry did not append a duplicate.
|
|
120
162
|
assert.equal((await recordHistory(storage, REPO, WS, 'counter')).length, 2);
|
|
121
163
|
});
|
|
122
164
|
it('without the header a normal mutation still commits', async () => {
|
|
123
165
|
const app = buildApp(storage, runner);
|
|
124
|
-
|
|
125
|
-
assert.equal(result.value.outcome.type, 'committed');
|
|
166
|
+
assert.equal((await mutationResult(await postMutate(app, none))).outcome.type, 'committed');
|
|
126
167
|
assert.equal((await recordHistory(storage, REPO, WS, 'counter')).length, 2);
|
|
127
168
|
});
|
|
128
169
|
it('records the authenticated identity as the actor, ignoring a forged request actor', async () => {
|
|
129
170
|
const app = buildApp(storage, runner, { sub: 'u1', email: 'alice@x.io', roles: [] });
|
|
130
|
-
|
|
131
|
-
assert.equal(result.type, 'success');
|
|
132
|
-
assert.equal(result.value.outcome.type, 'committed');
|
|
171
|
+
assert.equal((await mutationResult(await postMutate(app, some('cli:attacker')))).outcome.type, 'committed');
|
|
133
172
|
const history = await recordHistory(storage, REPO, WS, 'counter');
|
|
134
173
|
assert.equal(history[0].commit.actor, 'auth:alice@x.io'); // forged 'cli:attacker' ignored
|
|
135
174
|
});
|
|
136
175
|
it('honours the client-supplied actor when no auth is configured', async () => {
|
|
137
176
|
const app = buildApp(storage, runner); // no identity
|
|
138
|
-
assert.equal((await
|
|
177
|
+
assert.equal((await mutationResult(await postMutate(app, some('cli:bob')))).outcome.type, 'committed');
|
|
139
178
|
assert.equal((await recordHistory(storage, REPO, WS, 'counter'))[0].commit.actor, 'cli:bob');
|
|
140
179
|
});
|
|
141
180
|
it('falls back to "api" for an unauthenticated request with no actor', async () => {
|
|
@@ -143,11 +182,106 @@ describe('record routes', () => {
|
|
|
143
182
|
assert.equal((await recordHistory(storage, REPO, WS, 'counter'))[0].commit.actor, 'api');
|
|
144
183
|
});
|
|
145
184
|
it('gates compaction behind an elevated role when authenticated', async () => {
|
|
146
|
-
const denied = await
|
|
147
|
-
|
|
185
|
+
const denied = await mutationAnswer(await postCompact(buildApp(storage, runner, { sub: 'u1', roles: ['member'] })));
|
|
186
|
+
if (denied.type !== 'error')
|
|
187
|
+
assert.fail(`the compaction answered ${printMutationAnswer(denied)}`);
|
|
148
188
|
assert.equal(denied.value.type, 'permission_denied');
|
|
149
|
-
const allowed = await
|
|
150
|
-
assert.
|
|
189
|
+
const allowed = await mutationResult(await postCompact(buildApp(storage, runner, { sub: 'u1', roles: ['admin'] })));
|
|
190
|
+
assert.equal(allowed.outcome.type, 'committed', 'an elevated role compacts');
|
|
191
|
+
});
|
|
192
|
+
it('stops a mutation\'s run under the host\'s deadline, answering timed_out rather than outlasting it', async () => {
|
|
193
|
+
// The run ends only when its limit aborts it. Under a 2.1 s deadline the
|
|
194
|
+
// route keeps 2 s for the commit and the answer, so the run's limit is
|
|
195
|
+
// what remains of the other 100 ms, not the request's 60 s default.
|
|
196
|
+
const app = buildApp(storage, new StalledRunner(), undefined, { syncDeadlineMs: 2_100 });
|
|
197
|
+
const { outcome } = await mutationResult(await postMutate(app, none));
|
|
198
|
+
if (outcome.type !== 'timed_out')
|
|
199
|
+
assert.fail(`the mutation answered ${printMutationResult({ outcome })}`);
|
|
200
|
+
assert.ok(compareInt(outcome.value.ms, 1n) >= 0 && compareInt(outcome.value.ms, 100n) <= 0, `the run's limit was the deadline's rest, ${printInt(outcome.value.ms)} ms`);
|
|
201
|
+
assert.equal((await recordHistory(storage, REPO, WS, 'counter')).length, 1, 'nothing was committed');
|
|
202
|
+
});
|
|
203
|
+
it('stops a contended compaction\'s retries under the host\'s deadline, answering conflict', async (t) => {
|
|
204
|
+
const genesis = await storage.datasets.read(REPO, WS, 'records/counter');
|
|
205
|
+
assert.ok(genesis && genesis.type === 'value');
|
|
206
|
+
const stateHash = genesis.value.hash;
|
|
207
|
+
// Every attempt loses its swap to a writer that commits between its read
|
|
208
|
+
// and its write, and takes a tenth of a second of a clock that moves only
|
|
209
|
+
// as the test moves it. Under a 2.2 s deadline the route keeps 2 s for the
|
|
210
|
+
// commit and the answer, so two attempts spend the rest, where the
|
|
211
|
+
// compaction's own 30 s window would take three hundred.
|
|
212
|
+
t.mock.timers.enable({ apis: ['Date'], now: Date.now() });
|
|
213
|
+
const datasets = storage.datasets;
|
|
214
|
+
const readVersioned = datasets.readVersioned.bind(datasets);
|
|
215
|
+
let attempts = 0;
|
|
216
|
+
datasets.readVersioned = async (repo, ws, path) => {
|
|
217
|
+
const read = await readVersioned(repo, ws, path);
|
|
218
|
+
attempts++;
|
|
219
|
+
t.mock.timers.tick(100);
|
|
220
|
+
await datasets.write(repo, ws, path, variant('value', {
|
|
221
|
+
hash: stateHash, versions: new Map([['.records.counter', attempts.toString(16).padEnd(64, '0')]]),
|
|
222
|
+
}));
|
|
223
|
+
return read;
|
|
224
|
+
};
|
|
225
|
+
let result;
|
|
226
|
+
try {
|
|
227
|
+
result = await mutationResult(await postCompact(buildApp(storage, runner, undefined, { syncDeadlineMs: 2_200 })));
|
|
228
|
+
}
|
|
229
|
+
finally {
|
|
230
|
+
datasets.readVersioned = readVersioned;
|
|
231
|
+
}
|
|
232
|
+
const conflicted = { outcome: variant('conflict', { attempts: 2n, detail: none }) };
|
|
233
|
+
assert.ok(mutationResultEqual(result, conflicted), `the compaction answered ${printMutationResult(result)}`);
|
|
234
|
+
assert.equal(attempts, 2, 'no attempt was made once the deadline was spent');
|
|
235
|
+
});
|
|
236
|
+
it('answers a history request that names no limit with the host\'s page, and one that names a limit with that', async () => {
|
|
237
|
+
const app = buildApp(storage, runner, undefined, { historyLimit: 2 });
|
|
238
|
+
// Each run's output is a stored state, which the next mutation reads.
|
|
239
|
+
runner.setDefaultResult({ state: 'success', cached: false, outputHash: await storage.objects.write(REPO, encodeInt(5n)) });
|
|
240
|
+
for (let i = 0; i < 3; i++) {
|
|
241
|
+
assert.equal((await mutationResult(await postMutate(app, none))).outcome.type, 'committed');
|
|
242
|
+
}
|
|
243
|
+
const all = (await recordHistory(storage, REPO, WS, 'counter')).map((entry) => entry.hash);
|
|
244
|
+
assert.equal(all.length, 4, '$init and three commits');
|
|
245
|
+
const page = await historyResult(await getHistory(app));
|
|
246
|
+
assert.deepEqual(page.commits.map((commit) => commit.hash), all.slice(0, 2), 'the newest page');
|
|
247
|
+
const asked = await historyResult(await getHistory(app, '?limit=3'));
|
|
248
|
+
assert.deepEqual(asked.commits.map((commit) => commit.hash), all.slice(0, 3), 'a request\'s own limit wins');
|
|
249
|
+
// The client pages on from the page's last commit's parent.
|
|
250
|
+
const last = page.commits.at(-1);
|
|
251
|
+
if (last.parent.type !== 'some')
|
|
252
|
+
assert.fail('the page ended at the root');
|
|
253
|
+
const next = await historyResult(await getHistory(app, `?from=${last.parent.value}`));
|
|
254
|
+
assert.deepEqual(next.commits.map((commit) => commit.hash), all.slice(2), 'the rest of the chain');
|
|
255
|
+
});
|
|
256
|
+
it('refuses a deadline or a history page no request could meet when the routes are mounted', () => {
|
|
257
|
+
for (const syncDeadlineMs of [0, -1, NaN]) {
|
|
258
|
+
assert.throws(() => createWorkspaceRecordRoutes(storage, () => REPO, () => runner, { syncDeadlineMs }), { name: 'RangeError', message: `syncDeadlineMs must be a positive number of milliseconds, got ${syncDeadlineMs}` });
|
|
259
|
+
}
|
|
260
|
+
for (const historyLimit of [0, 1.5, NaN]) {
|
|
261
|
+
assert.throws(() => createWorkspaceRecordRoutes(storage, () => REPO, () => runner, { historyLimit }), { name: 'RangeError', message: `historyLimit must be a positive whole number of commits, got ${historyLimit}` });
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
describe('mutationResultOf', () => {
|
|
266
|
+
it('answers every outcome as the mutation and compact routes answer it', () => {
|
|
267
|
+
// A host answers a record operation no route serves — a rollback through
|
|
268
|
+
// recordSystemCommit, say — with it, so a client reads the answer as it
|
|
269
|
+
// reads a mutation's.
|
|
270
|
+
const commitHash = 'a'.repeat(64);
|
|
271
|
+
const stateHash = 'b'.repeat(64);
|
|
272
|
+
const stale = 'update of "p-7", whose row no longer matches the patch';
|
|
273
|
+
const cases = [
|
|
274
|
+
[{ kind: 'committed', commitHash, stateHash }, { outcome: variant('committed', { commitHash, stateHash }) }],
|
|
275
|
+
[{ kind: 'invalid', message: 'record \'nope\' not found' }, { outcome: variant('invalid', { message: 'record \'nope\' not found' }) }],
|
|
276
|
+
[{ kind: 'failed', exitCode: 3, stderr: 'the tail' }, { outcome: variant('failed', { exitCode: 3n, stderr: 'the tail' }) }],
|
|
277
|
+
[{ kind: 'timed_out', ms: 50, stderr: 'slow reducer' }, { outcome: variant('timed_out', { ms: 50n, stderr: 'slow reducer' }) }],
|
|
278
|
+
[{ kind: 'conflict', attempts: 2 }, { outcome: variant('conflict', { attempts: 2n, detail: none }) }],
|
|
279
|
+
[{ kind: 'conflict', attempts: 1, detail: stale }, { outcome: variant('conflict', { attempts: 1n, detail: some(stale) }) }],
|
|
280
|
+
];
|
|
281
|
+
for (const [outcome, expected] of cases) {
|
|
282
|
+
const result = mutationResultOf(outcome);
|
|
283
|
+
assert.ok(mutationResultEqual(result, expected), `${outcome.kind}: ${printMutationResult(result)}`);
|
|
284
|
+
}
|
|
151
285
|
});
|
|
152
286
|
});
|
|
153
287
|
//# sourceMappingURL=records.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"records.spec.js","sourceRoot":"","sources":["../../../src/handlers/records.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACpH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAExF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,kFAAkF,EAAE,GAAG,EAAE;QAC1F,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,yEAAyE;QACzE,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,MAAM,IAAI,GAAG,WAAW,CAAC;AACzB,MAAM,EAAE,GAAG,MAAM,CAAC;AAClB,MAAM,SAAS,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;AAC/C,MAAM,kBAAkB,GAAG,eAAe,CAAC,uBAAuB,CAAC,CAAC;AAEpE,KAAK,UAAU,cAAc,CAAI,QAAkB,EAAE,IAAS;IAC5D,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1D,OAAO,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAA+B,CAAC;AACjF,CAAC;AAED,uFAAuF;AACvF,KAAK,UAAU,kBAAkB,CAAC,OAAwB;IACxD,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEjC,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IACnE,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC,gBAAgB,CAAC,CAAC;QACtF,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI;KACpH,CAAC,CAAC,CAAC;IACJ,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,0CAA0C;IAC/G,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC,kBAAkB,CAAC,CAAC;QACpF,MAAM,EAAE,UAAU;QAClB,QAAQ,EAAE,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QACxC,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,wBAAwB,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;QACtG,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC;QAC7B,SAAS,EAAE,EAAE;KACd,CAAC,CAAC,CAAC;IACJ,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC,gBAAgB,CAAC,CAAC;QAClF,IAAI,EAAE,iBAAiB;QACvB,SAAS,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5C,OAAO,EAAE,IAAI,GAAG,EAAE;QAClB,UAAU,EAAE,EAAE;KACf,CAAC,CAAC,CAAC;IAEJ,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC;QAC1C,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC;gBACpC,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,eAAe,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;aACvF,CAAC,CAAC,CAAC;KACL,CAAC,CAAC,CAAC;IACJ,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC;QACnF,KAAK,EAAE,IAAI,GAAG,EAAE;QAChB,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,iBAAiB,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;QACrH,SAAS,EAAE,IAAI,GAAG,EAAE;QACpB,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QACxC,OAAO,EAAE,IAAI,GAAG,EAAE;KACnB,CAAC,CAAC,CAAC;IAEJ,MAAM,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC;QACpF,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI;KACpH,CAAC,CAAC,CAAC,CAAC;IACL,MAAM,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,iBAAiB,EACtD,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACnG,CAAC;AAID,+EAA+E;AAC/E,SAAS,QAAQ,CAAC,OAAwB,EAAE,MAAsB,EAAE,QAA4D;IAC9H,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,IAAI,QAAQ,EAAE,CAAC;QACb,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,GAAI,CAAS,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3F,CAAC;IACD,GAAG,CAAC,KAAK,CAAC,yCAAyC,EAAE,2BAA2B,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IACrH,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CAAC,GAAS,EAAE,KAAkB,EAAE,YAAqC;IACtF,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,2BAA2B,EAAE,sCAAsC,EAAE;QACtG,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,mBAAmB,EAAE,GAAG,YAAY,EAAE;QACjE,IAAI,EAAE,kBAAkB,CAAC,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;KACzE,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,WAAW,CAAC,GAAS;IAC5B,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,2BAA2B,EAAE,0BAA0B,EAAE;QAC1F,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,mBAAmB,EAAE;QAChD,IAAI,EAAE,IAAI,UAAU,EAAE;KACvB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,OAAwB,CAAC;IAC7B,IAAI,MAAsB,CAAC;IAE3B,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;QAChC,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QAC9B,MAAM,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5I,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0FAA0F,EAAE,KAAK,IAAI,EAAE;QACxG,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU;QACjD,MAAM,KAAK,GAAG,MAAM,cAAc,CAAM,MAAM,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,EAAE,kBAAkB,CAAC,CAAC;QACtH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAM,MAAM,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,EAAE,kBAAkB,CAAC,CAAC;QACvH,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,uCAAuC,CAAC,CAAC;QACnI,4EAA4E;QAC5E,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAM,MAAM,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAC1F,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kFAAkF,EAAE,KAAK,IAAI,EAAE;QAChG,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACrF,MAAM,MAAM,GAAG,MAAM,cAAc,CAAM,MAAM,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAC1G,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAErD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;QAClE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,gCAAgC;IAC7F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc;QACrD,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,cAAc,CAAM,MAAM,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACtI,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,MAAM,GAAG,MAAM,cAAc,CAAM,MAAM,WAAW,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAC7I,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAE,MAAM,CAAC,KAA0B,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;QAE3E,MAAM,OAAO,GAAG,MAAM,cAAc,CAAM,MAAM,WAAW,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAC7I,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAE,OAAO,CAAC,KAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IACnH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"records.spec.js","sourceRoot":"","sources":["../../../src/handlers/records.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
4
|
*/
|
|
5
5
|
import { type GcRequest } from '@elaraai/e3-types';
|
|
6
|
-
import type { RepoGcStore, StorageBackend } from '@elaraai/e3-core';
|
|
6
|
+
import type { RepoGcStore, StorageBackend } from '@elaraai/e3-core/portable';
|
|
7
7
|
/**
|
|
8
8
|
* The repositories a host keeps, by name.
|
|
9
9
|
*
|
|
@@ -40,6 +40,14 @@ export declare function getStatus(storage: StorageBackend, repoPath: string): Pr
|
|
|
40
40
|
* The repository's record: the release of e3 that last wrote it, and the store
|
|
41
41
|
* upgrades it has had.
|
|
42
42
|
*
|
|
43
|
+
* @remarks
|
|
44
|
+
* A read: it applies no upgrade the repository owes, and waits on no work
|
|
45
|
+
* running in it. Behind the repository gate it never finds one owed, since the
|
|
46
|
+
* gate has applied them or refused the request. Without the gate — a host
|
|
47
|
+
* that mounts the route bare, or calls this itself — a repository that owes
|
|
48
|
+
* upgrades is answered as the gate answers it: 503
|
|
49
|
+
* `repository_upgrade_pending`, with a `Retry-After`.
|
|
50
|
+
*
|
|
43
51
|
* @param storage - Storage backend
|
|
44
52
|
* @param repoPath - Repository identifier
|
|
45
53
|
* @returns The response: the record, or the error
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/handlers/repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/handlers/repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAwB,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAIzE,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAS7E;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,CAMjF;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAkB/F;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAmC/F;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,QAAQ,CAAC,CAmBnB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,QAAQ,CAAC,CAOnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,OAAO,CAC3B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,QAAQ,CAAC,CAcnB;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,QAAQ,CAAC,CAYnB"}
|
|
@@ -2,12 +2,11 @@
|
|
|
2
2
|
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
3
|
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
4
|
*/
|
|
5
|
-
import { randomUUID } from 'node:crypto';
|
|
6
5
|
import { ArrayType, NullType, StringType, none, variant } from '@elaraai/east';
|
|
7
6
|
import { RepositoryRecordType } from '@elaraai/e3-types';
|
|
8
|
-
import { RepoAlreadyExistsError, RepoNotFoundError, packageList, repositoryOpen, workspaceList } from '@elaraai/e3-core';
|
|
7
|
+
import { RepoAlreadyExistsError, RepoNotFoundError, RepositoryUpgradePendingError, packageList, repositoryOpen, workspaceList, } from '@elaraai/e3-core/portable';
|
|
9
8
|
import { sendSuccess, sendSuccessWithStatus, sendError } from '../beast2.js';
|
|
10
|
-
import { errorToVariant } from '../errors.js';
|
|
9
|
+
import { errorToVariant, sendUpgradePending } from '../errors.js';
|
|
11
10
|
import { RepositoryStatusType, GcStartResultType, GcStatusResultType, } from '../types.js';
|
|
12
11
|
/**
|
|
13
12
|
* The repositories a host keeps, by name.
|
|
@@ -118,15 +117,25 @@ export async function getStatus(storage, repoPath) {
|
|
|
118
117
|
* The repository's record: the release of e3 that last wrote it, and the store
|
|
119
118
|
* upgrades it has had.
|
|
120
119
|
*
|
|
120
|
+
* @remarks
|
|
121
|
+
* A read: it applies no upgrade the repository owes, and waits on no work
|
|
122
|
+
* running in it. Behind the repository gate it never finds one owed, since the
|
|
123
|
+
* gate has applied them or refused the request. Without the gate — a host
|
|
124
|
+
* that mounts the route bare, or calls this itself — a repository that owes
|
|
125
|
+
* upgrades is answered as the gate answers it: 503
|
|
126
|
+
* `repository_upgrade_pending`, with a `Retry-After`.
|
|
127
|
+
*
|
|
121
128
|
* @param storage - Storage backend
|
|
122
129
|
* @param repoPath - Repository identifier
|
|
123
130
|
* @returns The response: the record, or the error
|
|
124
131
|
*/
|
|
125
132
|
export async function getRecord(storage, repoPath) {
|
|
126
133
|
try {
|
|
127
|
-
return sendSuccess(RepositoryRecordType, await repositoryOpen(storage, repoPath));
|
|
134
|
+
return sendSuccess(RepositoryRecordType, await repositoryOpen(storage, repoPath, { apply: false, waitMs: 0 }));
|
|
128
135
|
}
|
|
129
136
|
catch (err) {
|
|
137
|
+
if (err instanceof RepositoryUpgradePendingError)
|
|
138
|
+
return sendUpgradePending(err);
|
|
130
139
|
return sendError(RepositoryRecordType, errorToVariant(err));
|
|
131
140
|
}
|
|
132
141
|
}
|
|
@@ -146,7 +155,7 @@ export async function getRecord(storage, repoPath) {
|
|
|
146
155
|
*/
|
|
147
156
|
export async function startGc(repo, request, gcStore) {
|
|
148
157
|
try {
|
|
149
|
-
const executionId = randomUUID();
|
|
158
|
+
const executionId = globalThis.crypto.randomUUID();
|
|
150
159
|
await gcStore.create(executionId, {
|
|
151
160
|
repo,
|
|
152
161
|
request,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/handlers/repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/handlers/repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAkB,MAAM,mBAAmB,CAAC;AACzE,OAAO,EACL,sBAAsB,EAAE,iBAAiB,EAAE,6BAA6B,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,GACrH,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAErB;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAuB;IAC5D,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAuB,EAAE,IAAY;IAC1E,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBACxC,OAAO,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,eAAe,IAAI,kCAAkC,EAAE,CAAC,CAAC,CAAC;YACxH,CAAC;YACD,OAAO,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,eAAe,IAAI,kBAAkB,EAAE,CAAC,CAAC,CAAC;QACxG,CAAC;QAED,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO,qBAAqB,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,sBAAsB,EAAE,CAAC;YAC1C,OAAO,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,eAAe,IAAI,kBAAkB,EAAE,CAAC,CAAC,CAAC;QACxG,CAAC;QACD,OAAO,SAAS,CAAC,UAAU,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAuB,EAAE,IAAY;IAC1E,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACxE,CAAC;QAED,iEAAiE;QACjE,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACxC,OAAO,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;QAED,MAAM,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QAE1D,IAAI,MAA0B,CAAC;QAC/B,GAAG,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACjE,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,CAAC,QAAQ,MAAM,EAAE;QAEjB,MAAM,GAAG,SAAS,CAAC;QACnB,GAAG,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACpE,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,CAAC,QAAQ,MAAM,EAAE;QAEjB,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEjC,OAAO,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,iBAAiB,EAAE,CAAC;YACrC,OAAO,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,SAAS,CAAC,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAuB,EACvB,QAAgB;IAEhB,IAAI,CAAC;QACH,gBAAgB;QAChB,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAE1D,gCAAgC;QAChC,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAE1D,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC;YAChC,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACrC,cAAc,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;SAC1C,CAAC;QACF,OAAO,WAAW,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,SAAS,CAAC,oBAAoB,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAuB,EACvB,QAAgB;IAEhB,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,oBAAoB,EAAE,MAAM,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACjH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,6BAA6B;YAAE,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACjF,OAAO,SAAS,CAAC,oBAAoB,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,IAAY,EACZ,OAAkB,EAClB,OAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACnD,MAAM,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE;YAChC,IAAI;YACJ,OAAO;YACP,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;YACtE,SAAS,EAAE,IAAI,IAAI,EAAE;SACtB,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACzC,OAAO,qBAAqB,CAAC,iBAAiB,EAAE,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,SAAS,CAAC,iBAAiB,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAoB,EACpB,IAAY,EACZ,WAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC3C,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACtC,OAAO,SAAS,CAAC,kBAAkB,EAAE,OAAO,CAAC,UAAU,EAAE;gBACvD,OAAO,EAAE,eAAe,IAAI,oBAAoB,WAAW,GAAG;aAC/D,CAAC,CAAC,CAAC;QACN,CAAC;QACD,OAAO,WAAW,CAAC,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,SAAS,CAAC,kBAAkB,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC"}
|
|
@@ -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 type { StorageBackend } from '@elaraai/e3-core';
|
|
5
|
+
import type { StorageBackend } from '@elaraai/e3-core/portable';
|
|
6
6
|
/**
|
|
7
7
|
* List all tasks in a workspace.
|
|
8
8
|
*/
|
|
@@ -12,10 +12,22 @@ export declare function listTasks(storage: StorageBackend, repoPath: string, wor
|
|
|
12
12
|
*/
|
|
13
13
|
export declare function getTask(storage: StorageBackend, repoPath: string, workspace: string, taskName: string): Promise<Response>;
|
|
14
14
|
/**
|
|
15
|
-
* List
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* are recorded under its hash too, and are left out: they are not its
|
|
15
|
+
* List a page of a task's history: its runs, the latest first — every attempt,
|
|
16
|
+
* a forced re-run or a retry after a failure among them — those before the run
|
|
17
|
+
* `page.before` names when given, at most `page.limit` of them. A split task's
|
|
18
|
+
* units are recorded under its hash too, and are left out: they are not its
|
|
19
|
+
* runs. It reads the task's index of runs (`RefStore.executionListRuns`), so a
|
|
20
|
+
* page costs what it holds, however long the task has run.
|
|
21
|
+
*
|
|
22
|
+
* @param storage - Storage backend
|
|
23
|
+
* @param repoPath - The repository's path
|
|
24
|
+
* @param workspace - The workspace
|
|
25
|
+
* @param taskName - The task
|
|
26
|
+
* @param page - The run the page begins before, if any, and the most it holds
|
|
27
|
+
* @returns The page, or the error
|
|
19
28
|
*/
|
|
20
|
-
export declare function listExecutions(storage: StorageBackend, repoPath: string, workspace: string, taskName: string,
|
|
29
|
+
export declare function listExecutions(storage: StorageBackend, repoPath: string, workspace: string, taskName: string, page: {
|
|
30
|
+
before?: string;
|
|
31
|
+
limit: number;
|
|
32
|
+
}): Promise<Response>;
|
|
21
33
|
//# sourceMappingURL=tasks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../../src/handlers/tasks.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../../src/handlers/tasks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAKhE;;GAEG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,CAAC,CAiBnB;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,QAAQ,CAAC,CAiBnB;AA2GD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACvC,OAAO,CAAC,QAAQ,CAAC,CASnB"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
4
|
*/
|
|
5
5
|
import { ArrayType, none, some, variant } from '@elaraai/east';
|
|
6
|
-
import { workspaceListTasks, workspaceGetTask, workspaceGetTaskHash,
|
|
6
|
+
import { workspaceListTasks, workspaceGetTask, workspaceGetTaskHash, } from '@elaraai/e3-core/portable';
|
|
7
7
|
import { sendSuccess, sendError } from '../beast2.js';
|
|
8
8
|
import { errorToVariant } from '../errors.js';
|
|
9
9
|
import { TaskListItemType, TaskDetailsType, ExecutionListItemType } from '../types.js';
|
|
@@ -72,12 +72,14 @@ function calculateDuration(startedAt, completedAt) {
|
|
|
72
72
|
return BigInt(Math.round(completedAt.getTime() - startedAt.getTime()));
|
|
73
73
|
}
|
|
74
74
|
/**
|
|
75
|
-
* One execution as the history lists it
|
|
75
|
+
* One execution as the history lists it: a cancelled or interrupted one with
|
|
76
|
+
* why it stopped.
|
|
76
77
|
*/
|
|
77
|
-
function toExecutionListItem(inputsHash, status) {
|
|
78
|
+
function toExecutionListItem(inputsHash, executionId, status) {
|
|
78
79
|
if (status.type === 'success') {
|
|
79
80
|
return {
|
|
80
81
|
inputsHash,
|
|
82
|
+
executionId,
|
|
81
83
|
inputHashes: status.value.inputHashes,
|
|
82
84
|
status: statusToApiStatus(status),
|
|
83
85
|
startedAt: status.value.startedAt.toISOString(),
|
|
@@ -85,11 +87,13 @@ function toExecutionListItem(inputsHash, status) {
|
|
|
85
87
|
duration: some(calculateDuration(status.value.startedAt, status.value.completedAt)),
|
|
86
88
|
exitCode: none,
|
|
87
89
|
peakBytes: status.value.peakBytes,
|
|
90
|
+
reason: none,
|
|
88
91
|
};
|
|
89
92
|
}
|
|
90
93
|
if (status.type === 'failed') {
|
|
91
94
|
return {
|
|
92
95
|
inputsHash,
|
|
96
|
+
executionId,
|
|
93
97
|
inputHashes: status.value.inputHashes,
|
|
94
98
|
status: statusToApiStatus(status),
|
|
95
99
|
startedAt: status.value.startedAt.toISOString(),
|
|
@@ -97,11 +101,13 @@ function toExecutionListItem(inputsHash, status) {
|
|
|
97
101
|
duration: some(calculateDuration(status.value.startedAt, status.value.completedAt)),
|
|
98
102
|
exitCode: some(status.value.exitCode),
|
|
99
103
|
peakBytes: status.value.peakBytes,
|
|
104
|
+
reason: none,
|
|
100
105
|
};
|
|
101
106
|
}
|
|
102
107
|
if (status.type === 'cancelled') {
|
|
103
108
|
return {
|
|
104
109
|
inputsHash,
|
|
110
|
+
executionId,
|
|
105
111
|
inputHashes: status.value.inputHashes,
|
|
106
112
|
status: statusToApiStatus(status),
|
|
107
113
|
startedAt: status.value.startedAt.toISOString(),
|
|
@@ -109,13 +115,15 @@ function toExecutionListItem(inputsHash, status) {
|
|
|
109
115
|
duration: some(calculateDuration(status.value.startedAt, status.value.completedAt)),
|
|
110
116
|
exitCode: none,
|
|
111
117
|
peakBytes: none,
|
|
118
|
+
reason: some(status.value.reason),
|
|
112
119
|
};
|
|
113
120
|
}
|
|
114
121
|
// An interruption's completedAt is when it was found, not when the runner
|
|
115
|
-
// stopped, so it has no duration.
|
|
122
|
+
// stopped, so it has no duration, as an error has none.
|
|
116
123
|
if (status.type === 'error' || status.type === 'interrupted') {
|
|
117
124
|
return {
|
|
118
125
|
inputsHash,
|
|
126
|
+
executionId,
|
|
119
127
|
inputHashes: status.value.inputHashes,
|
|
120
128
|
status: statusToApiStatus(status),
|
|
121
129
|
startedAt: status.value.startedAt.toISOString(),
|
|
@@ -123,11 +131,13 @@ function toExecutionListItem(inputsHash, status) {
|
|
|
123
131
|
duration: none,
|
|
124
132
|
exitCode: none,
|
|
125
133
|
peakBytes: none,
|
|
134
|
+
reason: status.type === 'interrupted' ? some(status.value.reason) : none,
|
|
126
135
|
};
|
|
127
136
|
}
|
|
128
137
|
// running
|
|
129
138
|
return {
|
|
130
139
|
inputsHash,
|
|
140
|
+
executionId,
|
|
131
141
|
inputHashes: status.value.inputHashes,
|
|
132
142
|
status: statusToApiStatus(status),
|
|
133
143
|
startedAt: status.value.startedAt.toISOString(),
|
|
@@ -135,30 +145,29 @@ function toExecutionListItem(inputsHash, status) {
|
|
|
135
145
|
duration: none,
|
|
136
146
|
exitCode: none,
|
|
137
147
|
peakBytes: none,
|
|
148
|
+
reason: none,
|
|
138
149
|
};
|
|
139
150
|
}
|
|
140
151
|
/**
|
|
141
|
-
* List
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
* are recorded under its hash too, and are left out: they are not its
|
|
152
|
+
* List a page of a task's history: its runs, the latest first — every attempt,
|
|
153
|
+
* a forced re-run or a retry after a failure among them — those before the run
|
|
154
|
+
* `page.before` names when given, at most `page.limit` of them. A split task's
|
|
155
|
+
* units are recorded under its hash too, and are left out: they are not its
|
|
156
|
+
* runs. It reads the task's index of runs (`RefStore.executionListRuns`), so a
|
|
157
|
+
* page costs what it holds, however long the task has run.
|
|
158
|
+
*
|
|
159
|
+
* @param storage - Storage backend
|
|
160
|
+
* @param repoPath - The repository's path
|
|
161
|
+
* @param workspace - The workspace
|
|
162
|
+
* @param taskName - The task
|
|
163
|
+
* @param page - The run the page begins before, if any, and the most it holds
|
|
164
|
+
* @returns The page, or the error
|
|
145
165
|
*/
|
|
146
|
-
export async function listExecutions(storage, repoPath, workspace, taskName,
|
|
166
|
+
export async function listExecutions(storage, repoPath, workspace, taskName, page) {
|
|
147
167
|
try {
|
|
148
168
|
const taskHash = await workspaceGetTaskHash(storage, repoPath, workspace, taskName);
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
for (const inputsHash of inputsHashes) {
|
|
152
|
-
const statuses = all
|
|
153
|
-
? await Promise.all((await executionListIds(storage, repoPath, taskHash, inputsHash))
|
|
154
|
-
.map(executionId => executionGet(storage, repoPath, taskHash, inputsHash, executionId)))
|
|
155
|
-
: [await executionGetLatest(storage, repoPath, taskHash, inputsHash)];
|
|
156
|
-
for (const status of statuses) {
|
|
157
|
-
if (status && !status.value.unit)
|
|
158
|
-
result.push(toExecutionListItem(inputsHash, status));
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
return sendSuccess(ArrayType(ExecutionListItemType), result);
|
|
169
|
+
const runs = await storage.refs.executionListRuns(repoPath, taskHash, page);
|
|
170
|
+
return sendSuccess(ArrayType(ExecutionListItemType), runs.map(({ inputsHash, executionId, status }) => toExecutionListItem(inputsHash, executionId, status)));
|
|
162
171
|
}
|
|
163
172
|
catch (err) {
|
|
164
173
|
return sendError(ArrayType(ExecutionListItemType), errorToVariant(err));
|