@elaraai/e3-api-server 1.0.84 → 1.0.86

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/README.md +88 -11
  2. package/dist/src/errors.d.ts +15 -0
  3. package/dist/src/errors.d.ts.map +1 -1
  4. package/dist/src/errors.js +22 -1
  5. package/dist/src/errors.js.map +1 -1
  6. package/dist/src/handlers/dataflow.d.ts +89 -18
  7. package/dist/src/handlers/dataflow.d.ts.map +1 -1
  8. package/dist/src/handlers/dataflow.js +198 -123
  9. package/dist/src/handlers/dataflow.js.map +1 -1
  10. package/dist/src/handlers/dataflow.spec.js +257 -7
  11. package/dist/src/handlers/dataflow.spec.js.map +1 -1
  12. package/dist/src/handlers/datasets.d.ts +56 -15
  13. package/dist/src/handlers/datasets.d.ts.map +1 -1
  14. package/dist/src/handlers/datasets.js +200 -122
  15. package/dist/src/handlers/datasets.js.map +1 -1
  16. package/dist/src/handlers/datasets.spec.js +92 -2
  17. package/dist/src/handlers/datasets.spec.js.map +1 -1
  18. package/dist/src/handlers/functions.d.ts +11 -2
  19. package/dist/src/handlers/functions.d.ts.map +1 -1
  20. package/dist/src/handlers/functions.js +50 -20
  21. package/dist/src/handlers/functions.js.map +1 -1
  22. package/dist/src/handlers/functions.spec.js +12 -1
  23. package/dist/src/handlers/functions.spec.js.map +1 -1
  24. package/dist/src/handlers/index.d.ts +2 -2
  25. package/dist/src/handlers/index.d.ts.map +1 -1
  26. package/dist/src/handlers/index.js +2 -2
  27. package/dist/src/handlers/index.js.map +1 -1
  28. package/dist/src/handlers/packages.d.ts +1 -1
  29. package/dist/src/handlers/packages.d.ts.map +1 -1
  30. package/dist/src/handlers/packages.js +1 -1
  31. package/dist/src/handlers/packages.js.map +1 -1
  32. package/dist/src/handlers/records.d.ts +27 -7
  33. package/dist/src/handlers/records.d.ts.map +1 -1
  34. package/dist/src/handlers/records.js +36 -16
  35. package/dist/src/handlers/records.js.map +1 -1
  36. package/dist/src/handlers/records.spec.js +160 -26
  37. package/dist/src/handlers/records.spec.js.map +1 -1
  38. package/dist/src/handlers/repository.d.ts +9 -1
  39. package/dist/src/handlers/repository.d.ts.map +1 -1
  40. package/dist/src/handlers/repository.js +14 -5
  41. package/dist/src/handlers/repository.js.map +1 -1
  42. package/dist/src/handlers/tasks.d.ts +18 -6
  43. package/dist/src/handlers/tasks.d.ts.map +1 -1
  44. package/dist/src/handlers/tasks.js +31 -22
  45. package/dist/src/handlers/tasks.js.map +1 -1
  46. package/dist/src/handlers/tasks.spec.js +61 -12
  47. package/dist/src/handlers/tasks.spec.js.map +1 -1
  48. package/dist/src/handlers/workspaces.d.ts +11 -6
  49. package/dist/src/handlers/workspaces.d.ts.map +1 -1
  50. package/dist/src/handlers/workspaces.js +14 -8
  51. package/dist/src/handlers/workspaces.js.map +1 -1
  52. package/dist/src/handlers/workspaces.spec.js +24 -8
  53. package/dist/src/handlers/workspaces.spec.js.map +1 -1
  54. package/dist/src/identity.d.ts +22 -0
  55. package/dist/src/identity.d.ts.map +1 -0
  56. package/dist/src/identity.js +6 -0
  57. package/dist/src/identity.js.map +1 -0
  58. package/dist/src/index.d.ts +1 -0
  59. package/dist/src/index.d.ts.map +1 -1
  60. package/dist/src/index.js +3 -0
  61. package/dist/src/index.js.map +1 -1
  62. package/dist/src/local-dataflow.d.ts +14 -1
  63. package/dist/src/local-dataflow.d.ts.map +1 -1
  64. package/dist/src/local-dataflow.js +12 -7
  65. package/dist/src/local-dataflow.js.map +1 -1
  66. package/dist/src/middleware/auth.d.ts +1 -11
  67. package/dist/src/middleware/auth.d.ts.map +1 -1
  68. package/dist/src/middleware/auth.js.map +1 -1
  69. package/dist/src/middleware/repository.d.ts +1 -1
  70. package/dist/src/middleware/repository.d.ts.map +1 -1
  71. package/dist/src/middleware/repository.js +4 -10
  72. package/dist/src/middleware/repository.js.map +1 -1
  73. package/dist/src/middleware/repository.spec.js +7 -6
  74. package/dist/src/middleware/repository.spec.js.map +1 -1
  75. package/dist/src/portable.d.ts +47 -0
  76. package/dist/src/portable.d.ts.map +1 -0
  77. package/dist/src/portable.js +79 -0
  78. package/dist/src/portable.js.map +1 -0
  79. package/dist/src/portable.spec.d.ts +6 -0
  80. package/dist/src/portable.spec.d.ts.map +1 -0
  81. package/dist/src/portable.spec.js +325 -0
  82. package/dist/src/portable.spec.js.map +1 -0
  83. package/dist/src/routes/dataset-path.d.ts +28 -0
  84. package/dist/src/routes/dataset-path.d.ts.map +1 -0
  85. package/dist/src/routes/dataset-path.js +52 -0
  86. package/dist/src/routes/dataset-path.js.map +1 -0
  87. package/dist/src/routes/datasets.d.ts +7 -1
  88. package/dist/src/routes/datasets.d.ts.map +1 -1
  89. package/dist/src/routes/datasets.js +5 -11
  90. package/dist/src/routes/datasets.js.map +1 -1
  91. package/dist/src/routes/executions.d.ts +4 -2
  92. package/dist/src/routes/executions.d.ts.map +1 -1
  93. package/dist/src/routes/executions.js +31 -10
  94. package/dist/src/routes/executions.js.map +1 -1
  95. package/dist/src/routes/functions.d.ts +16 -8
  96. package/dist/src/routes/functions.d.ts.map +1 -1
  97. package/dist/src/routes/functions.js +21 -11
  98. package/dist/src/routes/functions.js.map +1 -1
  99. package/dist/src/routes/index.d.ts +4 -3
  100. package/dist/src/routes/index.d.ts.map +1 -1
  101. package/dist/src/routes/index.js +1 -0
  102. package/dist/src/routes/index.js.map +1 -1
  103. package/dist/src/routes/objects.d.ts +4 -2
  104. package/dist/src/routes/objects.d.ts.map +1 -1
  105. package/dist/src/routes/objects.js +5 -8
  106. package/dist/src/routes/objects.js.map +1 -1
  107. package/dist/src/routes/package-transfer.d.ts +1 -1
  108. package/dist/src/routes/package-transfer.d.ts.map +1 -1
  109. package/dist/src/routes/package-transfer.js +19 -22
  110. package/dist/src/routes/package-transfer.js.map +1 -1
  111. package/dist/src/routes/packages.d.ts +1 -1
  112. package/dist/src/routes/packages.d.ts.map +1 -1
  113. package/dist/src/routes/query.d.ts +53 -0
  114. package/dist/src/routes/query.d.ts.map +1 -0
  115. package/dist/src/routes/query.js +86 -0
  116. package/dist/src/routes/query.js.map +1 -0
  117. package/dist/src/routes/query.spec.d.ts +6 -0
  118. package/dist/src/routes/query.spec.d.ts.map +1 -0
  119. package/dist/src/routes/query.spec.js +49 -0
  120. package/dist/src/routes/query.spec.js.map +1 -0
  121. package/dist/src/routes/records.d.ts +32 -3
  122. package/dist/src/routes/records.d.ts.map +1 -1
  123. package/dist/src/routes/records.js +34 -7
  124. package/dist/src/routes/records.js.map +1 -1
  125. package/dist/src/routes/repositories.d.ts +1 -1
  126. package/dist/src/routes/repositories.d.ts.map +1 -1
  127. package/dist/src/routes/repository.d.ts +6 -1
  128. package/dist/src/routes/repository.d.ts.map +1 -1
  129. package/dist/src/routes/repository.js +5 -0
  130. package/dist/src/routes/repository.js.map +1 -1
  131. package/dist/src/routes/repository.spec.d.ts +6 -0
  132. package/dist/src/routes/repository.spec.d.ts.map +1 -0
  133. package/dist/src/routes/repository.spec.js +84 -0
  134. package/dist/src/routes/repository.spec.js.map +1 -0
  135. package/dist/src/routes/tasks.d.ts +1 -1
  136. package/dist/src/routes/tasks.d.ts.map +1 -1
  137. package/dist/src/routes/tasks.js +16 -4
  138. package/dist/src/routes/tasks.js.map +1 -1
  139. package/dist/src/routes/transfer.d.ts +1 -1
  140. package/dist/src/routes/transfer.d.ts.map +1 -1
  141. package/dist/src/routes/transfer.js +7 -27
  142. package/dist/src/routes/transfer.js.map +1 -1
  143. package/dist/src/routes/workspaces.d.ts +1 -1
  144. package/dist/src/routes/workspaces.d.ts.map +1 -1
  145. package/dist/src/routes/workspaces.js +34 -22
  146. package/dist/src/routes/workspaces.js.map +1 -1
  147. package/dist/src/server.js +1 -1
  148. package/dist/src/server.js.map +1 -1
  149. package/dist/src/types.d.ts +63 -5
  150. package/dist/src/types.d.ts.map +1 -1
  151. package/dist/src/types.js +7 -5
  152. package/dist/src/types.js.map +1 -1
  153. 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
- ...stateToStatus((await stateStore.read(handle.repo, handle.workspace, handle.id))),
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 element window
35
- * (`offset`/`limit`) or one writer segment (`segment`), optionally pinned
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 any HTTP cache (edge
58
- * CDN, browser) can hold it forever with zero staleness. A stale hash is
59
- * refused with 409 rather than answered with different bytes, keeping
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): Promise<Response>;
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":"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"}
1
+ {"version":3,"file":"datasets.d.ts","sourceRoot":"","sources":["../../../src/handlers/datasets.ts"],"names":[],"mappings":"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"}