@elaraai/e3-api-server 0.0.1-alpha.2
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/LICENSE.md +50 -0
- package/README.md +156 -0
- package/dist/src/beast2.d.ts +20 -0
- package/dist/src/beast2.d.ts.map +1 -0
- package/dist/src/beast2.js +47 -0
- package/dist/src/beast2.js.map +1 -0
- package/dist/src/cli.d.ts +7 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +34 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/errors.d.ts +10 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +73 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/index.d.ts +13 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +13 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/routes/datasets.d.ts +7 -0
- package/dist/src/routes/datasets.d.ts.map +1 -0
- package/dist/src/routes/datasets.js +98 -0
- package/dist/src/routes/datasets.js.map +1 -0
- package/dist/src/routes/executions.d.ts +7 -0
- package/dist/src/routes/executions.d.ts.map +1 -0
- package/dist/src/routes/executions.js +303 -0
- package/dist/src/routes/executions.js.map +1 -0
- package/dist/src/routes/packages.d.ts +7 -0
- package/dist/src/routes/packages.d.ts.map +1 -0
- package/dist/src/routes/packages.js +124 -0
- package/dist/src/routes/packages.js.map +1 -0
- package/dist/src/routes/repository.d.ts +7 -0
- package/dist/src/routes/repository.d.ts.map +1 -0
- package/dist/src/routes/repository.js +67 -0
- package/dist/src/routes/repository.js.map +1 -0
- package/dist/src/routes/tasks.d.ts +7 -0
- package/dist/src/routes/tasks.d.ts.map +1 -0
- package/dist/src/routes/tasks.js +58 -0
- package/dist/src/routes/tasks.js.map +1 -0
- package/dist/src/routes/workspaces.d.ts +7 -0
- package/dist/src/routes/workspaces.d.ts.map +1 -0
- package/dist/src/routes/workspaces.js +133 -0
- package/dist/src/routes/workspaces.js.map +1 -0
- package/dist/src/server.d.ts +37 -0
- package/dist/src/server.d.ts.map +1 -0
- package/dist/src/server.js +83 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/types.d.ts +1310 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +471 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils.d.ts +25 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +27 -0
- package/dist/src/utils.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'node:fs/promises';
|
|
6
|
+
import * as os from 'node:os';
|
|
7
|
+
import * as path from 'node:path';
|
|
8
|
+
import { Hono } from 'hono';
|
|
9
|
+
import { ArrayType, BlobType, NullType, some, none } from '@elaraai/east';
|
|
10
|
+
import { WorkspaceStateType, parsePackageRef } from '@elaraai/e3-types';
|
|
11
|
+
import { workspaceList, workspaceCreate, workspaceRemove, workspaceGetState, workspaceDeploy, workspaceExport, packageGetLatestVersion, } from '@elaraai/e3-core';
|
|
12
|
+
import { decodeBody, sendSuccess, sendError } from '../beast2.js';
|
|
13
|
+
import { errorToVariant } from '../errors.js';
|
|
14
|
+
import { WorkspaceInfoType, CreateWorkspaceType, DeployRequestType } from '../types.js';
|
|
15
|
+
export function createWorkspaceRoutes(repoPath) {
|
|
16
|
+
const app = new Hono();
|
|
17
|
+
// GET /api/workspaces - List all workspaces
|
|
18
|
+
app.get('/', async (c) => {
|
|
19
|
+
try {
|
|
20
|
+
const workspaces = await workspaceList(repoPath);
|
|
21
|
+
const result = await Promise.all(workspaces.map(async (name) => {
|
|
22
|
+
const state = await workspaceGetState(repoPath, name);
|
|
23
|
+
if (state) {
|
|
24
|
+
return {
|
|
25
|
+
name,
|
|
26
|
+
deployed: true,
|
|
27
|
+
packageName: some(state.packageName),
|
|
28
|
+
packageVersion: some(state.packageVersion),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
return {
|
|
33
|
+
name,
|
|
34
|
+
deployed: false,
|
|
35
|
+
packageName: none,
|
|
36
|
+
packageVersion: none,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}));
|
|
40
|
+
return sendSuccess(c, ArrayType(WorkspaceInfoType), result);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
return sendError(c, ArrayType(WorkspaceInfoType), errorToVariant(err));
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
// POST /api/workspaces - Create a new workspace
|
|
47
|
+
app.post('/', async (c) => {
|
|
48
|
+
try {
|
|
49
|
+
const body = await decodeBody(c, CreateWorkspaceType);
|
|
50
|
+
await workspaceCreate(repoPath, body.name);
|
|
51
|
+
return sendSuccess(c, WorkspaceInfoType, {
|
|
52
|
+
name: body.name,
|
|
53
|
+
deployed: false,
|
|
54
|
+
packageName: none,
|
|
55
|
+
packageVersion: none,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
return sendError(c, WorkspaceInfoType, errorToVariant(err));
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
// GET /api/workspaces/:name - Get workspace state
|
|
63
|
+
app.get('/:name', async (c) => {
|
|
64
|
+
try {
|
|
65
|
+
const name = c.req.param('name');
|
|
66
|
+
const state = await workspaceGetState(repoPath, name);
|
|
67
|
+
if (!state) {
|
|
68
|
+
// Workspace exists but not deployed - return error
|
|
69
|
+
return sendError(c, WorkspaceStateType, errorToVariant(new Error(`Workspace '${name}' is not deployed`)));
|
|
70
|
+
}
|
|
71
|
+
return sendSuccess(c, WorkspaceStateType, state);
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
return sendError(c, WorkspaceStateType, errorToVariant(err));
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
// DELETE /api/workspaces/:name - Remove a workspace
|
|
78
|
+
app.delete('/:name', async (c) => {
|
|
79
|
+
try {
|
|
80
|
+
const name = c.req.param('name');
|
|
81
|
+
await workspaceRemove(repoPath, name);
|
|
82
|
+
return sendSuccess(c, NullType, null);
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
return sendError(c, NullType, errorToVariant(err));
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
// POST /api/workspaces/:name/deploy - Deploy a package to a workspace
|
|
89
|
+
app.post('/:name/deploy', async (c) => {
|
|
90
|
+
try {
|
|
91
|
+
const name = c.req.param('name');
|
|
92
|
+
if (!name) {
|
|
93
|
+
return sendError(c, NullType, errorToVariant(new Error('Missing workspace name parameter')));
|
|
94
|
+
}
|
|
95
|
+
const body = await decodeBody(c, DeployRequestType);
|
|
96
|
+
const { name: pkgName, version: maybeVersion } = parsePackageRef(body.packageRef);
|
|
97
|
+
const pkgVersion = maybeVersion ?? await packageGetLatestVersion(repoPath, pkgName);
|
|
98
|
+
if (!pkgVersion) {
|
|
99
|
+
return sendError(c, NullType, errorToVariant(new Error(`Package not found: ${pkgName}`)));
|
|
100
|
+
}
|
|
101
|
+
await workspaceDeploy(repoPath, name, pkgName, pkgVersion);
|
|
102
|
+
return sendSuccess(c, NullType, null);
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
return sendError(c, NullType, errorToVariant(err));
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
// GET /api/workspaces/:name/export - Export workspace as a package zip
|
|
109
|
+
app.get('/:name/export', async (c) => {
|
|
110
|
+
try {
|
|
111
|
+
const name = c.req.param('name');
|
|
112
|
+
if (!name) {
|
|
113
|
+
return sendError(c, BlobType, errorToVariant(new Error('Missing workspace name parameter')));
|
|
114
|
+
}
|
|
115
|
+
// Export to temp file
|
|
116
|
+
const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'e3-ws-export-'));
|
|
117
|
+
const tempPath = path.join(tempDir, 'workspace.zip');
|
|
118
|
+
try {
|
|
119
|
+
await workspaceExport(repoPath, name, tempPath);
|
|
120
|
+
const archive = await fs.readFile(tempPath);
|
|
121
|
+
return sendSuccess(c, BlobType, new Uint8Array(archive));
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
return sendError(c, BlobType, errorToVariant(err));
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
return app;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=workspaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaces.js","sourceRoot":"","sources":["../../../src/routes/workspaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import { type ServerType } from '@hono/node-server';
|
|
6
|
+
/**
|
|
7
|
+
* Server configuration options.
|
|
8
|
+
*/
|
|
9
|
+
export interface ServerConfig {
|
|
10
|
+
/** Path to e3 repository (required) */
|
|
11
|
+
repo: string;
|
|
12
|
+
/** HTTP port (default: 3000) */
|
|
13
|
+
port?: number;
|
|
14
|
+
/** Bind address (default: "localhost") */
|
|
15
|
+
host?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Server instance handle.
|
|
19
|
+
*/
|
|
20
|
+
export interface Server {
|
|
21
|
+
/** Start the server */
|
|
22
|
+
start(): Promise<void>;
|
|
23
|
+
/** Stop the server */
|
|
24
|
+
stop(): Promise<void>;
|
|
25
|
+
/** The underlying HTTP server */
|
|
26
|
+
readonly httpServer: ServerType;
|
|
27
|
+
/** The port the server is listening on */
|
|
28
|
+
readonly port: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Create an e3 API server.
|
|
32
|
+
*
|
|
33
|
+
* @param config - Server configuration
|
|
34
|
+
* @returns Server instance
|
|
35
|
+
*/
|
|
36
|
+
export declare function createServer(config: ServerConfig): Server;
|
|
37
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAS,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAQ3D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,uBAAuB;IACvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,sBAAsB;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,iCAAiC;IACjC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,0CAA0C;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA2EzD"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import { Hono } from 'hono';
|
|
6
|
+
import { serve } from '@hono/node-server';
|
|
7
|
+
import { createRepositoryRoutes } from './routes/repository.js';
|
|
8
|
+
import { createPackageRoutes } from './routes/packages.js';
|
|
9
|
+
import { createWorkspaceRoutes } from './routes/workspaces.js';
|
|
10
|
+
import { createDatasetRoutes } from './routes/datasets.js';
|
|
11
|
+
import { createTaskRoutes } from './routes/tasks.js';
|
|
12
|
+
import { createExecutionRoutes } from './routes/executions.js';
|
|
13
|
+
/**
|
|
14
|
+
* Create an e3 API server.
|
|
15
|
+
*
|
|
16
|
+
* @param config - Server configuration
|
|
17
|
+
* @returns Server instance
|
|
18
|
+
*/
|
|
19
|
+
export function createServer(config) {
|
|
20
|
+
const { repo: repoPath, port = 3000, host = 'localhost' } = config;
|
|
21
|
+
const app = new Hono();
|
|
22
|
+
// Repository routes: /api/status, /api/gc
|
|
23
|
+
app.route('/api', createRepositoryRoutes(repoPath));
|
|
24
|
+
// Package routes: /api/packages/*
|
|
25
|
+
app.route('/api/packages', createPackageRoutes(repoPath));
|
|
26
|
+
// Workspace routes: /api/workspaces/*
|
|
27
|
+
const workspaceRoutes = createWorkspaceRoutes(repoPath);
|
|
28
|
+
app.route('/api/workspaces', workspaceRoutes);
|
|
29
|
+
// Dataset routes mounted under workspaces: /api/workspaces/:ws/list, /get, /set
|
|
30
|
+
const datasetRoutes = createDatasetRoutes(repoPath);
|
|
31
|
+
app.route('/api/workspaces/:ws', datasetRoutes);
|
|
32
|
+
// Task routes: /api/workspaces/:ws/tasks/*
|
|
33
|
+
const taskRoutes = createTaskRoutes(repoPath);
|
|
34
|
+
app.route('/api/workspaces/:ws/tasks', taskRoutes);
|
|
35
|
+
// Execution routes: /api/workspaces/:ws/start, /status, /graph, /logs/:task
|
|
36
|
+
const executionRoutes = createExecutionRoutes(repoPath);
|
|
37
|
+
app.route('/api/workspaces/:ws', executionRoutes);
|
|
38
|
+
let httpServer = null;
|
|
39
|
+
let actualPort = port;
|
|
40
|
+
const server = {
|
|
41
|
+
async start() {
|
|
42
|
+
return new Promise((resolve) => {
|
|
43
|
+
httpServer = serve({
|
|
44
|
+
fetch: app.fetch,
|
|
45
|
+
port,
|
|
46
|
+
hostname: host,
|
|
47
|
+
}, (info) => {
|
|
48
|
+
actualPort = info.port;
|
|
49
|
+
resolve();
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
},
|
|
53
|
+
async stop() {
|
|
54
|
+
return new Promise((resolve, reject) => {
|
|
55
|
+
if (!httpServer) {
|
|
56
|
+
resolve();
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
// Force close all connections immediately
|
|
60
|
+
httpServer.closeAllConnections();
|
|
61
|
+
httpServer.close((err) => {
|
|
62
|
+
if (err) {
|
|
63
|
+
reject(err);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
resolve();
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
},
|
|
71
|
+
get httpServer() {
|
|
72
|
+
if (!httpServer) {
|
|
73
|
+
throw new Error('Server not started');
|
|
74
|
+
}
|
|
75
|
+
return httpServer;
|
|
76
|
+
},
|
|
77
|
+
get port() {
|
|
78
|
+
return actualPort;
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
return server;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
|