@elaraai/e3-api-server 1.0.79 → 1.0.80
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 +83 -19
- package/dist/src/beast2.js +1 -1
- package/dist/src/beast2.js.map +1 -1
- package/dist/src/cli.js +13 -0
- package/dist/src/cli.js.map +1 -1
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +8 -1
- package/dist/src/errors.js.map +1 -1
- package/dist/src/handlers/dataflow.d.ts +58 -11
- package/dist/src/handlers/dataflow.d.ts.map +1 -1
- package/dist/src/handlers/dataflow.js +120 -48
- package/dist/src/handlers/dataflow.js.map +1 -1
- package/dist/src/handlers/dataflow.spec.d.ts +6 -0
- package/dist/src/handlers/dataflow.spec.d.ts.map +1 -0
- package/dist/src/handlers/dataflow.spec.js +106 -0
- package/dist/src/handlers/dataflow.spec.js.map +1 -0
- package/dist/src/handlers/datasets.d.ts +60 -34
- package/dist/src/handlers/datasets.d.ts.map +1 -1
- package/dist/src/handlers/datasets.js +452 -306
- package/dist/src/handlers/datasets.js.map +1 -1
- package/dist/src/handlers/datasets.spec.js +338 -119
- package/dist/src/handlers/datasets.spec.js.map +1 -1
- package/dist/src/handlers/functions.d.ts.map +1 -1
- package/dist/src/handlers/functions.js +10 -8
- package/dist/src/handlers/functions.js.map +1 -1
- package/dist/src/handlers/functions.spec.js +2 -2
- 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/records.d.ts.map +1 -1
- package/dist/src/handlers/records.js +15 -12
- package/dist/src/handlers/records.js.map +1 -1
- package/dist/src/handlers/records.spec.js +9 -5
- package/dist/src/handlers/records.spec.js.map +1 -1
- package/dist/src/handlers/repository.d.ts +59 -10
- package/dist/src/handlers/repository.d.ts.map +1 -1
- package/dist/src/handlers/repository.js +147 -40
- package/dist/src/handlers/repository.js.map +1 -1
- package/dist/src/handlers/tasks.d.ts +2 -1
- package/dist/src/handlers/tasks.d.ts.map +1 -1
- package/dist/src/handlers/tasks.js +31 -8
- package/dist/src/handlers/tasks.js.map +1 -1
- package/dist/src/handlers/tasks.spec.d.ts +6 -0
- package/dist/src/handlers/tasks.spec.d.ts.map +1 -0
- package/dist/src/handlers/tasks.spec.js +64 -0
- package/dist/src/handlers/tasks.spec.js.map +1 -0
- package/dist/src/handlers/workspaces.d.ts +44 -6
- package/dist/src/handlers/workspaces.d.ts.map +1 -1
- package/dist/src/handlers/workspaces.js +74 -40
- package/dist/src/handlers/workspaces.js.map +1 -1
- package/dist/src/handlers/workspaces.spec.d.ts +6 -0
- package/dist/src/handlers/workspaces.spec.d.ts.map +1 -0
- package/dist/src/handlers/workspaces.spec.js +164 -0
- package/dist/src/handlers/workspaces.spec.js.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/local-dataflow.d.ts +14 -0
- package/dist/src/local-dataflow.d.ts.map +1 -0
- package/dist/src/local-dataflow.js +41 -0
- package/dist/src/local-dataflow.js.map +1 -0
- package/dist/src/middleware/repository.d.ts +39 -0
- package/dist/src/middleware/repository.d.ts.map +1 -0
- package/dist/src/middleware/repository.js +77 -0
- package/dist/src/middleware/repository.js.map +1 -0
- package/dist/src/routes/data.d.ts +2 -2
- package/dist/src/routes/data.d.ts.map +1 -1
- package/dist/src/routes/data.js +22 -45
- package/dist/src/routes/data.js.map +1 -1
- package/dist/src/routes/datasets.d.ts +0 -3
- package/dist/src/routes/datasets.d.ts.map +1 -1
- package/dist/src/routes/datasets.js +40 -8
- package/dist/src/routes/datasets.js.map +1 -1
- package/dist/src/routes/executions.d.ts +37 -2
- package/dist/src/routes/executions.d.ts.map +1 -1
- package/dist/src/routes/executions.js +21 -12
- package/dist/src/routes/executions.js.map +1 -1
- package/dist/src/routes/index.d.ts +2 -1
- 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 +16 -2
- package/dist/src/routes/objects.d.ts.map +1 -1
- package/dist/src/routes/objects.js +34 -3
- package/dist/src/routes/objects.js.map +1 -1
- package/dist/src/routes/repositories.d.ts +26 -0
- package/dist/src/routes/repositories.d.ts.map +1 -0
- package/dist/src/routes/repositories.js +58 -0
- package/dist/src/routes/repositories.js.map +1 -0
- package/dist/src/routes/repositories.spec.d.ts +6 -0
- package/dist/src/routes/repositories.spec.d.ts.map +1 -0
- package/dist/src/routes/repositories.spec.js +77 -0
- package/dist/src/routes/repositories.spec.js.map +1 -0
- package/dist/src/routes/repository.d.ts +12 -2
- package/dist/src/routes/repository.d.ts.map +1 -1
- package/dist/src/routes/repository.js +24 -9
- package/dist/src/routes/repository.js.map +1 -1
- package/dist/src/routes/transfer.d.ts +11 -9
- package/dist/src/routes/transfer.d.ts.map +1 -1
- package/dist/src/routes/transfer.js +90 -115
- package/dist/src/routes/transfer.js.map +1 -1
- package/dist/src/routes/workspaces.d.ts +14 -1
- package/dist/src/routes/workspaces.d.ts.map +1 -1
- package/dist/src/routes/workspaces.js +57 -46
- package/dist/src/routes/workspaces.js.map +1 -1
- package/dist/src/server.d.ts +18 -6
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +55 -182
- package/dist/src/server.js.map +1 -1
- package/dist/src/server.spec.d.ts +6 -0
- package/dist/src/server.spec.d.ts.map +1 -0
- package/dist/src/server.spec.js +59 -0
- package/dist/src/server.spec.js.map +1 -0
- package/dist/src/types.d.ts +200 -16
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +5 -2
- package/dist/src/types.js.map +1 -1
- package/package.json +5 -5
- package/dist/src/async-operation-state.d.ts +0 -37
- package/dist/src/async-operation-state.d.ts.map +0 -1
- package/dist/src/async-operation-state.js +0 -118
- package/dist/src/async-operation-state.js.map +0 -1
- package/dist/src/orchestrator-manager.d.ts +0 -45
- package/dist/src/orchestrator-manager.d.ts.map +0 -1
- package/dist/src/orchestrator-manager.js +0 -150
- package/dist/src/orchestrator-manager.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspaces.d.ts","sourceRoot":"","sources":["../../../src/handlers/workspaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"workspaces.d.ts","sourceRoot":"","sources":["../../../src/handlers/workspaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EACmF,KAAK,sBAAsB,EACpH,MAAM,mBAAmB,CAAC;AAW3B,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAKzF;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,QAAQ,CAAC,CA2BnB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,CAYnB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,CAUnB;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,CAmDnB;AA8CD;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,CAOnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,sBAAsB,EAC/B,WAAW,EAAE,oBAAoB,GAChC,OAAO,CAAC,QAAQ,CAAC,CAwBnB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,oBAAoB,EACjC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,QAAQ,CAAC,CAYnB"}
|
|
@@ -2,13 +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
|
|
6
|
-
import
|
|
7
|
-
import * as path from 'node:path';
|
|
8
|
-
import { BlobType, NullType, some, none, variant } from '@elaraai/east';
|
|
5
|
+
import { randomUUID } from 'node:crypto';
|
|
6
|
+
import { NullType, some, none, variant } from '@elaraai/east';
|
|
9
7
|
import { ArrayType } from '@elaraai/east';
|
|
10
|
-
import { WorkspaceStateType, parsePackageRef } from '@elaraai/e3-types';
|
|
11
|
-
import { workspaceList, workspaceCreate, workspaceRemove, workspaceGetState,
|
|
8
|
+
import { PackageJobResponseType, WorkspaceDeployStatusType, WorkspaceStateType, parsePackageRef, } from '@elaraai/e3-types';
|
|
9
|
+
import { workspaceList, workspaceCreate, workspaceRemove, workspaceGetState, workspaceStatus, packageGetLatestVersion, packageResolve, PackageNotFoundError, } from '@elaraai/e3-core';
|
|
12
10
|
import { sendSuccess, sendError } from '../beast2.js';
|
|
13
11
|
import { errorToVariant } from '../errors.js';
|
|
14
12
|
import { WorkspaceInfoType, WorkspaceStatusResultType } from '../types.js';
|
|
@@ -77,10 +75,17 @@ export async function getWorkspace(storage, repoPath, name) {
|
|
|
77
75
|
}
|
|
78
76
|
/**
|
|
79
77
|
* Get comprehensive workspace status.
|
|
78
|
+
*
|
|
79
|
+
* @param storage - Storage backend
|
|
80
|
+
* @param runner - The runner the repository's tasks run on, which says
|
|
81
|
+
* whether an execution recorded running can still finish
|
|
82
|
+
* @param repoPath - Repository identifier
|
|
83
|
+
* @param name - Workspace name
|
|
84
|
+
* @returns The response: the status, or the error
|
|
80
85
|
*/
|
|
81
|
-
export async function getWorkspaceStatus(storage, repoPath, name) {
|
|
86
|
+
export async function getWorkspaceStatus(storage, runner, repoPath, name) {
|
|
82
87
|
try {
|
|
83
|
-
const status = await workspaceStatus(storage, repoPath, name);
|
|
88
|
+
const status = await workspaceStatus(storage, runner, repoPath, name);
|
|
84
89
|
// Convert numbers to bigints for BEAST2 serialization
|
|
85
90
|
const result = {
|
|
86
91
|
workspace: status.workspace,
|
|
@@ -104,6 +109,7 @@ export async function getWorkspaceStatus(storage, repoPath, name) {
|
|
|
104
109
|
inputs: t.inputs,
|
|
105
110
|
output: t.output,
|
|
106
111
|
dependsOn: t.dependsOn,
|
|
112
|
+
peakBytes: t.peakBytes === null ? none : some(BigInt(t.peakBytes)),
|
|
107
113
|
})),
|
|
108
114
|
summary: {
|
|
109
115
|
datasets: {
|
|
@@ -185,51 +191,79 @@ export async function deleteWorkspace(storage, repoPath, name) {
|
|
|
185
191
|
}
|
|
186
192
|
}
|
|
187
193
|
/**
|
|
188
|
-
*
|
|
194
|
+
* Start deploying a package to a workspace, as a job the client polls.
|
|
195
|
+
*
|
|
196
|
+
* @remarks
|
|
197
|
+
* A deploy that migrates a record, or builds an index over one, takes as long
|
|
198
|
+
* as the record is large, which outlasts a request. So the deploy runs as a
|
|
199
|
+
* job, in the compute the store dispatches it to: a local server's own
|
|
200
|
+
* process, or a cloud's. The package is resolved first, so a deploy of one the
|
|
201
|
+
* repository does not hold is refused at once, as `package_not_found`, and the
|
|
202
|
+
* job deploys exactly the version resolved.
|
|
203
|
+
*
|
|
204
|
+
* The job never opens a path-initialised input's file: its path is on the
|
|
205
|
+
* machine that exported the package. Each such input is left unassigned, and
|
|
206
|
+
* `e3 workspace deploy <url>` completes it over the dataset transfer protocol
|
|
207
|
+
* once the job has finished.
|
|
208
|
+
*
|
|
209
|
+
* @param storage - Storage backend
|
|
210
|
+
* @param repoPath - Repository identifier
|
|
211
|
+
* @param repo - The repository's name, which the job is filed under
|
|
212
|
+
* @param workspace - Workspace name
|
|
213
|
+
* @param request - The package, and what the deploy does with a record it
|
|
214
|
+
* cannot keep as it is
|
|
215
|
+
* @param deployStore - Where the job is filed, and dispatched from
|
|
216
|
+
* @returns The response: the job's id, or the error
|
|
189
217
|
*/
|
|
190
|
-
export async function
|
|
218
|
+
export async function startWorkspaceDeploy(storage, repoPath, repo, workspace, request, deployStore) {
|
|
191
219
|
try {
|
|
192
|
-
const { name
|
|
193
|
-
const
|
|
194
|
-
if (
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
220
|
+
const { name, version: maybeVersion } = parsePackageRef(request.packageRef);
|
|
221
|
+
const version = maybeVersion ?? await packageGetLatestVersion(storage, repoPath, name);
|
|
222
|
+
if (version === undefined)
|
|
223
|
+
throw new PackageNotFoundError(name);
|
|
224
|
+
await packageResolve(storage, repoPath, name, version);
|
|
225
|
+
const id = randomUUID();
|
|
226
|
+
await deployStore.create(id, {
|
|
227
|
+
repo,
|
|
228
|
+
workspace,
|
|
229
|
+
packageName: name,
|
|
230
|
+
packageVersion: version,
|
|
231
|
+
schema: request.schema,
|
|
232
|
+
allowDropRecords: request.allowDropRecords,
|
|
233
|
+
plan: request.plan,
|
|
234
|
+
status: variant('processing', variant('pending', null)),
|
|
235
|
+
createdAt: new Date(),
|
|
207
236
|
});
|
|
208
|
-
|
|
237
|
+
await deployStore.execute(id, repo);
|
|
238
|
+
return sendSuccess(PackageJobResponseType, { id });
|
|
209
239
|
}
|
|
210
240
|
catch (err) {
|
|
211
|
-
return sendError(
|
|
241
|
+
return sendError(PackageJobResponseType, errorToVariant(err));
|
|
212
242
|
}
|
|
213
243
|
}
|
|
214
244
|
/**
|
|
215
|
-
*
|
|
245
|
+
* A deploy job's status: still running, what the deploy did, or why it did
|
|
246
|
+
* not.
|
|
247
|
+
*
|
|
248
|
+
* @param deployStore - Where the job is filed
|
|
249
|
+
* @param repo - The repository's name
|
|
250
|
+
* @param workspace - Workspace name
|
|
251
|
+
* @param id - The job's id
|
|
252
|
+
* @returns The response: the status, or the error when this workspace started
|
|
253
|
+
* no such job
|
|
216
254
|
*/
|
|
217
|
-
export async function
|
|
255
|
+
export async function getWorkspaceDeployStatus(deployStore, repo, workspace, id) {
|
|
218
256
|
try {
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
const archive = await fs.readFile(tempPath);
|
|
225
|
-
return sendSuccess(BlobType, new Uint8Array(archive));
|
|
226
|
-
}
|
|
227
|
-
finally {
|
|
228
|
-
await fs.rm(tempDir, { recursive: true, force: true });
|
|
257
|
+
const job = await deployStore.get(id);
|
|
258
|
+
if (job === null || job.repo !== repo || job.workspace !== workspace) {
|
|
259
|
+
return sendError(WorkspaceDeployStatusType, variant('internal', {
|
|
260
|
+
message: `workspace '${workspace}' has no deploy job '${id}'`,
|
|
261
|
+
}));
|
|
229
262
|
}
|
|
263
|
+
return sendSuccess(WorkspaceDeployStatusType, job.status);
|
|
230
264
|
}
|
|
231
265
|
catch (err) {
|
|
232
|
-
return sendError(
|
|
266
|
+
return sendError(WorkspaceDeployStatusType, errorToVariant(err));
|
|
233
267
|
}
|
|
234
268
|
}
|
|
235
269
|
//# sourceMappingURL=workspaces.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspaces.js","sourceRoot":"","sources":["../../../src/handlers/workspaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"workspaces.js","sourceRoot":"","sources":["../../../src/handlers/workspaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaces.spec.d.ts","sourceRoot":"","sources":["../../../src/handlers/workspaces.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Deploy route tests: a deploy runs as a job the client polls, on the runner
|
|
7
|
+
* the job's store was given — an embedder mounts these routes with a store and
|
|
8
|
+
* a runner of its own — and without one, a deploy that owes an index build
|
|
9
|
+
* fails before it writes anything.
|
|
10
|
+
*/
|
|
11
|
+
import { describe, it, beforeEach } from 'node:test';
|
|
12
|
+
import assert from 'node:assert/strict';
|
|
13
|
+
import { Hono } from 'hono';
|
|
14
|
+
import { DictType, NullType, StringType, StructType, encodeBeast2For, decodeBeast2For, toEastTypeValue, variant, none } from '@elaraai/east';
|
|
15
|
+
import { InMemoryTransferBackend, MockTaskRunner, readRecordState, storeDatasetBytes, workspaceCreate, workspaceGetState, } from '@elaraai/e3-core';
|
|
16
|
+
import { InMemoryStorage } from '@elaraai/e3-core/test';
|
|
17
|
+
import { BEAST2_CONTENT_TYPE, PackageJobResponseType, PackageObjectType, RecordObjectType, RecordIndexObjectType, WorkspaceDeployRequestType, WorkspaceDeployStatusType, } from '@elaraai/e3-types';
|
|
18
|
+
import { createWorkspaceRoutes } from '../routes/workspaces.js';
|
|
19
|
+
import { ResponseType } from '../types.js';
|
|
20
|
+
const REPO = 'test-repo';
|
|
21
|
+
const WS = 'main';
|
|
22
|
+
const PlansType = DictType(StringType, StringType);
|
|
23
|
+
const decodeStarted = decodeBeast2For(ResponseType(PackageJobResponseType));
|
|
24
|
+
const decodeStatus = decodeBeast2For(ResponseType(WorkspaceDeployStatusType));
|
|
25
|
+
/**
|
|
26
|
+
* Seed `planrecords@1.0.0` — an empty `plans` record declaring one index — and
|
|
27
|
+
* an empty workspace to deploy it to.
|
|
28
|
+
*
|
|
29
|
+
* @returns An empty stored index collection: what a build of that index writes
|
|
30
|
+
*/
|
|
31
|
+
async function seedIndexedPackage(storage) {
|
|
32
|
+
await storage.repos.create(REPO);
|
|
33
|
+
const state = await storeDatasetBytes(storage, REPO, encodeBeast2For(PlansType)(new Map()));
|
|
34
|
+
const ir = await storage.objects.write(REPO, new Uint8Array([0])); // stand-in IR: the mock runner never reads it
|
|
35
|
+
const index = await storage.objects.write(REPO, encodeBeast2For(RecordIndexObjectType)({
|
|
36
|
+
keyIr: ir,
|
|
37
|
+
multi: false,
|
|
38
|
+
valueIr: none,
|
|
39
|
+
keyType: toEastTypeValue(StringType),
|
|
40
|
+
valueType: toEastTypeValue(NullType),
|
|
41
|
+
buildIr: ir,
|
|
42
|
+
runner: variant('east_node', { platforms: [] }),
|
|
43
|
+
}));
|
|
44
|
+
const record = await storage.objects.write(REPO, encodeBeast2For(RecordObjectType)({
|
|
45
|
+
path: 'records/plans', mutations: new Map(), indexes: new Map([['by_value', index]]), migrations: [],
|
|
46
|
+
}));
|
|
47
|
+
const structure = variant('struct', new Map([
|
|
48
|
+
['records', variant('struct', new Map([
|
|
49
|
+
['plans', variant('value', { type: toEastTypeValue(PlansType), writable: false })],
|
|
50
|
+
]))],
|
|
51
|
+
]));
|
|
52
|
+
const pkg = await storage.objects.write(REPO, encodeBeast2For(PackageObjectType)({
|
|
53
|
+
tasks: new Map(),
|
|
54
|
+
data: { structure, refs: new Map([['records/plans', variant('value', { hash: state, versions: new Map() })]]) },
|
|
55
|
+
functions: new Map(),
|
|
56
|
+
records: new Map([['plans', record]]),
|
|
57
|
+
sources: new Map(),
|
|
58
|
+
}));
|
|
59
|
+
await storage.refs.packageWrite(REPO, 'planrecords', '1.0.0', pkg);
|
|
60
|
+
await workspaceCreate(storage, REPO, WS);
|
|
61
|
+
return storeDatasetBytes(storage, REPO, encodeBeast2For(DictType(StructType({ ik: StringType, k: StringType }), NullType))(new Map()));
|
|
62
|
+
}
|
|
63
|
+
/** The workspace routes, whose deploy jobs run on `getRunner`'s runner. */
|
|
64
|
+
function routes(storage, getRunner) {
|
|
65
|
+
const app = new Hono();
|
|
66
|
+
app.route('/api/repos/:repo/workspaces', createWorkspaceRoutes(storage, () => REPO, new InMemoryTransferBackend({
|
|
67
|
+
storage,
|
|
68
|
+
getRepoPath: () => REPO,
|
|
69
|
+
...(getRunner !== undefined && { getRunner }),
|
|
70
|
+
}), getRunner ?? (() => new MockTaskRunner())));
|
|
71
|
+
return app;
|
|
72
|
+
}
|
|
73
|
+
/** Start a deploy of `packageRef`: the job's id, or why the server started none. */
|
|
74
|
+
async function start(app, packageRef = 'planrecords@1.0.0') {
|
|
75
|
+
const response = await app.request(`/api/repos/r/workspaces/${WS}/deploy`, {
|
|
76
|
+
method: 'POST',
|
|
77
|
+
headers: { 'Content-Type': BEAST2_CONTENT_TYPE },
|
|
78
|
+
body: encodeBeast2For(WorkspaceDeployRequestType)({
|
|
79
|
+
packageRef, schema: variant('migrate', null), allowDropRecords: false, plan: false,
|
|
80
|
+
}),
|
|
81
|
+
});
|
|
82
|
+
return decodeStarted(new Uint8Array(await response.arrayBuffer()));
|
|
83
|
+
}
|
|
84
|
+
/** A deploy job's status. */
|
|
85
|
+
async function poll(app, id) {
|
|
86
|
+
const response = await app.request(`/api/repos/r/workspaces/${WS}/deploy/${id}`);
|
|
87
|
+
const answer = decodeStatus(new Uint8Array(await response.arrayBuffer()));
|
|
88
|
+
if (answer.type !== 'success')
|
|
89
|
+
assert.fail(`the poll was refused: ${answer.value.type}`);
|
|
90
|
+
return answer.value;
|
|
91
|
+
}
|
|
92
|
+
/** A deploy job's status once it has finished. */
|
|
93
|
+
async function finished(app, id) {
|
|
94
|
+
for (;;) {
|
|
95
|
+
const status = await poll(app, id);
|
|
96
|
+
if (status.type !== 'processing')
|
|
97
|
+
return status;
|
|
98
|
+
await new Promise((resolve) => setTimeout(resolve, 5));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
describe('deploy route', () => {
|
|
102
|
+
let storage;
|
|
103
|
+
let emptyIndex;
|
|
104
|
+
beforeEach(async () => {
|
|
105
|
+
storage = new InMemoryStorage();
|
|
106
|
+
emptyIndex = await seedIndexedPackage(storage);
|
|
107
|
+
});
|
|
108
|
+
it("runs a deploy as a job, which builds a record's indexes on the runner its store was given", async () => {
|
|
109
|
+
const runner = new MockTaskRunner();
|
|
110
|
+
runner.setDefaultResult({ state: 'success', cached: false, outputHash: emptyIndex });
|
|
111
|
+
const app = routes(storage, () => runner);
|
|
112
|
+
const started = await start(app);
|
|
113
|
+
if (started.type !== 'success')
|
|
114
|
+
assert.fail(`the deploy was refused: ${started.value.type}`);
|
|
115
|
+
const status = await finished(app, started.value.id);
|
|
116
|
+
if (status.type !== 'completed')
|
|
117
|
+
assert.fail(`the deploy did not complete: ${status.type}`);
|
|
118
|
+
assert.deepEqual(status.value.records.map((plan) => [plan.record, plan.action.type]), [['records/plans', 'mint']]);
|
|
119
|
+
assert.deepEqual(status.value.indexes.map((plan) => [plan.record, plan.index, plan.action.type]), [['records/plans', 'by_value', 'build']]);
|
|
120
|
+
assert.ok(runner.getCalls().length > 0, 'the index was built on the runner the store was given');
|
|
121
|
+
const ref = await storage.datasets.read(REPO, WS, 'records/plans');
|
|
122
|
+
assert.ok(ref && ref.type === 'value');
|
|
123
|
+
assert.deepEqual([...(await readRecordState(storage, REPO, ref.value.hash)).indexes.keys()], ['by_value']);
|
|
124
|
+
});
|
|
125
|
+
it('answers before the deploy has finished, and the job reports it once it has', async () => {
|
|
126
|
+
// A build that holds until released: a deploy over a large record, which
|
|
127
|
+
// outlasts the request that starts it.
|
|
128
|
+
let release;
|
|
129
|
+
const released = new Promise((resolve) => { release = resolve; });
|
|
130
|
+
const runner = {
|
|
131
|
+
execute: async () => {
|
|
132
|
+
await released;
|
|
133
|
+
return { state: 'success', cached: false, executionId: 'held', outputHash: emptyIndex };
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
const app = routes(storage, () => runner);
|
|
137
|
+
const started = await start(app);
|
|
138
|
+
if (started.type !== 'success')
|
|
139
|
+
assert.fail(`the deploy was refused: ${started.value.type}`);
|
|
140
|
+
assert.equal((await poll(app, started.value.id)).type, 'processing');
|
|
141
|
+
assert.equal(await workspaceGetState(storage, REPO, WS), null, 'nothing is deployed while the job runs');
|
|
142
|
+
release();
|
|
143
|
+
assert.equal((await finished(app, started.value.id)).type, 'completed');
|
|
144
|
+
assert.equal((await workspaceGetState(storage, REPO, WS))?.packageName, 'planrecords');
|
|
145
|
+
});
|
|
146
|
+
it('without a runner, fails a deploy that owes an index build, and writes nothing', async () => {
|
|
147
|
+
const app = routes(storage);
|
|
148
|
+
const started = await start(app);
|
|
149
|
+
if (started.type !== 'success')
|
|
150
|
+
assert.fail(`the deploy was refused: ${started.value.type}`);
|
|
151
|
+
const status = await finished(app, started.value.id);
|
|
152
|
+
if (status.type !== 'failed')
|
|
153
|
+
assert.fail(`the deploy did not fail: ${status.type}`);
|
|
154
|
+
assert.match(status.value.message, /given no task runner/);
|
|
155
|
+
assert.equal(await workspaceGetState(storage, REPO, WS), null, 'the workspace is still undeployed');
|
|
156
|
+
assert.deepEqual(await storage.datasets.list(REPO, WS), [], 'no ref was written');
|
|
157
|
+
});
|
|
158
|
+
it('refuses a package the repository does not hold at once, starting no job', async () => {
|
|
159
|
+
const started = await start(routes(storage), 'planrecords@9.9.9');
|
|
160
|
+
assert.equal(started.type, 'error');
|
|
161
|
+
assert.equal(started.value.type, 'package_not_found');
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
//# sourceMappingURL=workspaces.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaces.spec.js","sourceRoot":"","sources":["../../../src/handlers/workspaces.spec.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -10,7 +10,10 @@
|
|
|
10
10
|
*/
|
|
11
11
|
export { createServer, type ServerConfig, type Server } from './server.js';
|
|
12
12
|
export { ApiTypes } from './types.js';
|
|
13
|
+
export { resolveBudget, type BudgetSettings } from '@elaraai/e3-core';
|
|
13
14
|
export * from './handlers/index.js';
|
|
15
|
+
export * from './routes/index.js';
|
|
14
16
|
export { createAuthMiddleware, type AuthConfig } from './middleware/auth.js';
|
|
17
|
+
export { createRepositoryGate, createSingleRepositoryGate } from './middleware/repository.js';
|
|
15
18
|
export { sendSuccess, sendError, sendSuccessWithStatus, decodeBeast2, decodeBody } from './beast2.js';
|
|
16
19
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAItC,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGtE,cAAc,qBAAqB,CAAC;AAGpC,cAAc,mBAAmB,CAAC;AAGlC,OAAO,EAAE,oBAAoB,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAG7E,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAG9F,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,qBAAqB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -10,10 +10,17 @@
|
|
|
10
10
|
*/
|
|
11
11
|
export { createServer } from './server.js';
|
|
12
12
|
export { ApiTypes } from './types.js';
|
|
13
|
+
// How `ServerConfig.budget` settings resolve, for an embedder that checks them
|
|
14
|
+
// before it starts a server
|
|
15
|
+
export { resolveBudget } from '@elaraai/e3-core';
|
|
13
16
|
// Export handlers for Lambda reuse
|
|
14
17
|
export * from './handlers/index.js';
|
|
18
|
+
// The route factories, which another host mounts with seams of its own
|
|
19
|
+
export * from './routes/index.js';
|
|
15
20
|
// Export auth middleware
|
|
16
21
|
export { createAuthMiddleware } from './middleware/auth.js';
|
|
22
|
+
// The gate every request to one repository passes
|
|
23
|
+
export { createRepositoryGate, createSingleRepositoryGate } from './middleware/repository.js';
|
|
17
24
|
// Export BEAST2 helpers for custom integrations
|
|
18
25
|
export { sendSuccess, sendError, sendSuccessWithStatus, decodeBeast2, decodeBody } from './beast2.js';
|
|
19
26
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAkC,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,mCAAmC;AACnC,cAAc,qBAAqB,CAAC;AAEpC,yBAAyB;AACzB,OAAO,EAAE,oBAAoB,EAAmB,MAAM,sBAAsB,CAAC;AAE7E,gDAAgD;AAChD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,qBAAqB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAkC,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,+EAA+E;AAC/E,4BAA4B;AAC5B,OAAO,EAAE,aAAa,EAAuB,MAAM,kBAAkB,CAAC;AAEtE,mCAAmC;AACnC,cAAc,qBAAqB,CAAC;AAEpC,uEAAuE;AACvE,cAAc,mBAAmB,CAAC;AAElC,yBAAyB;AACzB,OAAO,EAAE,oBAAoB,EAAmB,MAAM,sBAAsB,CAAC;AAE7E,kDAAkD;AAClD,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAE9F,gDAAgD;AAChD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,qBAAqB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import type { DataflowSeams } from './routes/executions.js';
|
|
6
|
+
/**
|
|
7
|
+
* The orchestrator and state store of each repository a local server serves,
|
|
8
|
+
* each made as its repository is first asked for and kept for the server's
|
|
9
|
+
* life, so a poll or a cancel reaches the run its start began.
|
|
10
|
+
*
|
|
11
|
+
* @returns The seams' getters, for the dataflow routes
|
|
12
|
+
*/
|
|
13
|
+
export declare function localDataflow(): Pick<DataflowSeams, 'getOrchestrator' | 'getStateStore'>;
|
|
14
|
+
//# sourceMappingURL=local-dataflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-dataflow.d.ts","sourceRoot":"","sources":["../../src/local-dataflow.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D;;;;;;GAMG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAAC,aAAa,EAAE,iBAAiB,GAAG,eAAe,CAAC,CAuBxF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* The local server's dataflow wiring: a LocalOrchestrator for each repository
|
|
7
|
+
* it serves, over a FileStateStore in the repository's workspaces directory.
|
|
8
|
+
* The dataflow routes run, poll and cancel a repository's dataflows through
|
|
9
|
+
* them, as a cloud's routes do through its own.
|
|
10
|
+
*/
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { LocalOrchestrator, FileStateStore, } from '@elaraai/e3-core';
|
|
13
|
+
/**
|
|
14
|
+
* The orchestrator and state store of each repository a local server serves,
|
|
15
|
+
* each made as its repository is first asked for and kept for the server's
|
|
16
|
+
* life, so a poll or a cancel reaches the run its start began.
|
|
17
|
+
*
|
|
18
|
+
* @returns The seams' getters, for the dataflow routes
|
|
19
|
+
*/
|
|
20
|
+
export function localDataflow() {
|
|
21
|
+
const stateStores = new Map();
|
|
22
|
+
const orchestrators = new Map();
|
|
23
|
+
const getStateStore = (repoPath) => {
|
|
24
|
+
let store = stateStores.get(repoPath);
|
|
25
|
+
if (store === undefined) {
|
|
26
|
+
store = new FileStateStore(join(repoPath, 'workspaces'));
|
|
27
|
+
stateStores.set(repoPath, store);
|
|
28
|
+
}
|
|
29
|
+
return store;
|
|
30
|
+
};
|
|
31
|
+
const getOrchestrator = (repoPath) => {
|
|
32
|
+
let orchestrator = orchestrators.get(repoPath);
|
|
33
|
+
if (orchestrator === undefined) {
|
|
34
|
+
orchestrator = new LocalOrchestrator(getStateStore(repoPath));
|
|
35
|
+
orchestrators.set(repoPath, orchestrator);
|
|
36
|
+
}
|
|
37
|
+
return orchestrator;
|
|
38
|
+
};
|
|
39
|
+
return { getOrchestrator, getStateStore };
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=local-dataflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-dataflow.js","sourceRoot":"","sources":["../../src/local-dataflow.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,iBAAiB,EACjB,cAAc,GAGf,MAAM,kBAAkB,CAAC;AAG1B;;;;;;GAMG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,WAAW,GAAG,IAAI,GAAG,EAA0B,CAAC;IACtD,MAAM,aAAa,GAAG,IAAI,GAAG,EAA6B,CAAC;IAE3D,MAAM,aAAa,GAAG,CAAC,QAAgB,EAAuB,EAAE;QAC9D,IAAI,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;YACzD,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,QAAgB,EAAwB,EAAE;QACjE,IAAI,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,YAAY,GAAG,IAAI,iBAAiB,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC9D,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC,CAAC;IAEF,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* The gate every request to one repository passes, mounted on
|
|
7
|
+
* `/api/repos/:repo/*` ahead of the routes and after any auth, so an
|
|
8
|
+
* unauthorized request is answered 401 rather than 404. A refusal is JSON with
|
|
9
|
+
* its HTTP status, since a gate cannot know the BEAST2 type the route answers.
|
|
10
|
+
*
|
|
11
|
+
* Creating and removing a repository, at `/api/repos/:repo` itself, pass either
|
|
12
|
+
* gate, whatever order a host mounts them in: they act on a repository that may
|
|
13
|
+
* not exist yet, or is being removed, and their routes answer for it.
|
|
14
|
+
*/
|
|
15
|
+
import type { MiddlewareHandler } from 'hono';
|
|
16
|
+
import { type StorageBackend } from '@elaraai/e3-core';
|
|
17
|
+
/**
|
|
18
|
+
* The gate of a host's repositories: the repository exists, is not being
|
|
19
|
+
* removed, and is opened as every way into a repository opens it — upgraded in
|
|
20
|
+
* place when an older release wrote it, and refused, naming the fix, when this
|
|
21
|
+
* e3 cannot read it. A repository being removed answers its status alone, and
|
|
22
|
+
* is not opened. It goes through the storage backend's `RepoStore`, so a host
|
|
23
|
+
* mounts it over its own.
|
|
24
|
+
*
|
|
25
|
+
* @param storage - Storage backend, whose `RepoStore` keeps the repositories
|
|
26
|
+
* @param getRepoPath - A repository's identifier from its name, as the stores
|
|
27
|
+
* other than the `RepoStore` take it
|
|
28
|
+
* @returns The middleware
|
|
29
|
+
*/
|
|
30
|
+
export declare function createRepositoryGate(storage: StorageBackend, getRepoPath: (repo: string) => string): MiddlewareHandler;
|
|
31
|
+
/**
|
|
32
|
+
* The gate of a server of one repository: the repository is `default`, and a
|
|
33
|
+
* request to any other is not found. The server opens its repository as it
|
|
34
|
+
* starts.
|
|
35
|
+
*
|
|
36
|
+
* @returns The middleware
|
|
37
|
+
*/
|
|
38
|
+
export declare function createSingleRepositoryGate(): MiddlewareHandler;
|
|
39
|
+
//# sourceMappingURL=repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/middleware/repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAW,iBAAiB,EAAE,MAAM,MAAM,CAAC;AACvD,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAQvE;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GACpC,iBAAiB,CAmCnB;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,IAAI,iBAAiB,CAU9D"}
|