@elaraai/e3-api-server 0.0.2-beta.4 → 0.0.2-beta.41
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 +145 -30
- package/dist/src/async-operation-state.d.ts +37 -0
- package/dist/src/async-operation-state.d.ts.map +1 -0
- package/dist/src/async-operation-state.js +118 -0
- package/dist/src/async-operation-state.js.map +1 -0
- package/dist/src/auth/device.d.ts +26 -0
- package/dist/src/auth/device.d.ts.map +1 -0
- package/dist/src/auth/device.js +227 -0
- package/dist/src/auth/device.js.map +1 -0
- package/dist/src/auth/discovery.d.ts +23 -0
- package/dist/src/auth/discovery.d.ts.map +1 -0
- package/dist/src/auth/discovery.js +40 -0
- package/dist/src/auth/discovery.js.map +1 -0
- package/dist/src/auth/index.d.ts +56 -0
- package/dist/src/auth/index.d.ts.map +1 -0
- package/dist/src/auth/index.js +69 -0
- package/dist/src/auth/index.js.map +1 -0
- package/dist/src/auth/keys.d.ts +55 -0
- package/dist/src/auth/keys.d.ts.map +1 -0
- package/dist/src/auth/keys.js +78 -0
- package/dist/src/auth/keys.js.map +1 -0
- package/dist/src/beast2.d.ts +15 -3
- package/dist/src/beast2.d.ts.map +1 -1
- package/dist/src/beast2.js +38 -8
- package/dist/src/beast2.js.map +1 -1
- package/dist/src/cli.js +58 -6
- package/dist/src/cli.js.map +1 -1
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +8 -2
- package/dist/src/errors.js.map +1 -1
- package/dist/src/handlers/dataflow.d.ts +43 -0
- package/dist/src/handlers/dataflow.d.ts.map +1 -0
- package/dist/src/handlers/dataflow.js +363 -0
- package/dist/src/handlers/dataflow.js.map +1 -0
- package/dist/src/handlers/datasets.d.ts +38 -0
- package/dist/src/handlers/datasets.d.ts.map +1 -0
- package/dist/src/handlers/datasets.js +222 -0
- package/dist/src/handlers/datasets.js.map +1 -0
- package/dist/src/handlers/index.d.ts +11 -0
- package/dist/src/handlers/index.d.ts.map +1 -0
- package/dist/src/handlers/index.js +11 -0
- package/dist/src/handlers/index.js.map +1 -0
- package/dist/src/handlers/packages.d.ts +18 -0
- package/dist/src/handlers/packages.d.ts.map +1 -0
- package/dist/src/handlers/packages.js +51 -0
- package/dist/src/handlers/packages.js.map +1 -0
- package/dist/src/handlers/repository.d.ts +24 -0
- package/dist/src/handlers/repository.d.ts.map +1 -0
- package/dist/src/handlers/repository.js +79 -0
- package/dist/src/handlers/repository.js.map +1 -0
- package/dist/src/handlers/tasks.d.ts +18 -0
- package/dist/src/handlers/tasks.d.ts.map +1 -0
- package/dist/src/handlers/tasks.js +134 -0
- package/dist/src/handlers/tasks.js.map +1 -0
- package/dist/src/handlers/workspaces.d.ts +34 -0
- package/dist/src/handlers/workspaces.d.ts.map +1 -0
- package/dist/src/handlers/workspaces.js +225 -0
- package/dist/src/handlers/workspaces.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 +6 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/middleware/auth.d.ts +51 -0
- package/dist/src/middleware/auth.d.ts.map +1 -0
- package/dist/src/middleware/auth.js +158 -0
- package/dist/src/middleware/auth.js.map +1 -0
- package/dist/src/orchestrator-manager.d.ts +45 -0
- package/dist/src/orchestrator-manager.d.ts.map +1 -0
- package/dist/src/orchestrator-manager.js +150 -0
- package/dist/src/orchestrator-manager.js.map +1 -0
- package/dist/src/routes/data.d.ts +21 -0
- package/dist/src/routes/data.d.ts.map +1 -0
- package/dist/src/routes/data.js +125 -0
- package/dist/src/routes/data.js.map +1 -0
- package/dist/src/routes/datasets.d.ts +2 -1
- package/dist/src/routes/datasets.d.ts.map +1 -1
- package/dist/src/routes/datasets.js +59 -83
- package/dist/src/routes/datasets.js.map +1 -1
- package/dist/src/routes/executions.d.ts +2 -1
- package/dist/src/routes/executions.d.ts.map +1 -1
- package/dist/src/routes/executions.js +54 -287
- package/dist/src/routes/executions.js.map +1 -1
- package/dist/src/routes/index.d.ts +15 -0
- package/dist/src/routes/index.d.ts.map +1 -0
- package/dist/src/routes/index.js +15 -0
- package/dist/src/routes/index.js.map +1 -0
- package/dist/src/routes/objects.d.ts +8 -0
- package/dist/src/routes/objects.d.ts.map +1 -0
- package/dist/src/routes/objects.js +38 -0
- package/dist/src/routes/objects.js.map +1 -0
- package/dist/src/routes/package-transfer.d.ts +23 -0
- package/dist/src/routes/package-transfer.d.ts.map +1 -0
- package/dist/src/routes/package-transfer.js +168 -0
- package/dist/src/routes/package-transfer.js.map +1 -0
- package/dist/src/routes/packages.d.ts +2 -1
- package/dist/src/routes/packages.d.ts.map +1 -1
- package/dist/src/routes/packages.js +18 -109
- package/dist/src/routes/packages.js.map +1 -1
- package/dist/src/routes/repository.d.ts +2 -1
- package/dist/src/routes/repository.d.ts.map +1 -1
- package/dist/src/routes/repository.js +19 -54
- package/dist/src/routes/repository.js.map +1 -1
- package/dist/src/routes/tasks.d.ts +2 -1
- package/dist/src/routes/tasks.d.ts.map +1 -1
- package/dist/src/routes/tasks.js +22 -46
- package/dist/src/routes/tasks.js.map +1 -1
- package/dist/src/routes/transfer.d.ts +19 -0
- package/dist/src/routes/transfer.d.ts.map +1 -0
- package/dist/src/routes/transfer.js +124 -0
- package/dist/src/routes/transfer.js.map +1 -0
- package/dist/src/routes/workspaces.d.ts +2 -1
- package/dist/src/routes/workspaces.d.ts.map +1 -1
- package/dist/src/routes/workspaces.js +45 -116
- package/dist/src/routes/workspaces.js.map +1 -1
- package/dist/src/server.d.ts +24 -3
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +266 -19
- package/dist/src/server.js.map +1 -1
- package/dist/src/types.d.ts +1385 -731
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +238 -2
- package/dist/src/types.js.map +1 -1
- package/package.json +16 -4
package/dist/src/server.js
CHANGED
|
@@ -2,44 +2,291 @@
|
|
|
2
2
|
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
3
|
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
4
|
*/
|
|
5
|
+
import * as path from 'node:path';
|
|
5
6
|
import { Hono } from 'hono';
|
|
6
7
|
import { cors } from 'hono/cors';
|
|
7
8
|
import { serve } from '@hono/node-server';
|
|
8
|
-
import {
|
|
9
|
+
import { LocalStorage, RepoAlreadyExistsError, RepoNotFoundError, InMemoryTransferBackend } from '@elaraai/e3-core';
|
|
10
|
+
import { createAuthMiddleware } from './middleware/auth.js';
|
|
11
|
+
import { createOidcProvider } from './auth/index.js';
|
|
12
|
+
import { sendError, sendSuccessWithStatus, sendSuccess } from './beast2.js';
|
|
13
|
+
import { StringType, NullType, variant, ArrayType } from '@elaraai/east';
|
|
14
|
+
import { errorToVariant } from './errors.js';
|
|
9
15
|
import { createPackageRoutes } from './routes/packages.js';
|
|
10
16
|
import { createWorkspaceRoutes } from './routes/workspaces.js';
|
|
11
17
|
import { createDatasetRoutes } from './routes/datasets.js';
|
|
12
18
|
import { createTaskRoutes } from './routes/tasks.js';
|
|
13
19
|
import { createExecutionRoutes } from './routes/executions.js';
|
|
20
|
+
import { createRepositoryRoutes } from './routes/repository.js';
|
|
21
|
+
import { createObjectRoutes } from './routes/objects.js';
|
|
22
|
+
import { createTransferRoutes } from './routes/transfer.js';
|
|
23
|
+
import { createPackageTransferRoutes } from './routes/package-transfer.js';
|
|
24
|
+
import { createDataEndpoints } from './routes/data.js';
|
|
14
25
|
/**
|
|
15
26
|
* Create an e3 API server.
|
|
16
27
|
*
|
|
28
|
+
* The server operates in multi-repo mode, serving multiple repositories
|
|
29
|
+
* from subdirectories of the configured reposDir.
|
|
30
|
+
*
|
|
31
|
+
* URL structure:
|
|
32
|
+
* - GET /api/repos - List available repositories
|
|
33
|
+
* - /api/repos/:repo/... - Repository-specific endpoints
|
|
34
|
+
*
|
|
17
35
|
* @param config - Server configuration
|
|
18
36
|
* @returns Server instance
|
|
19
37
|
*/
|
|
20
|
-
export function createServer(config) {
|
|
21
|
-
const {
|
|
38
|
+
export async function createServer(config) {
|
|
39
|
+
const { reposDir, singleRepoPath, port = 3000, host = 'localhost', cors: enableCors = false, auth, oidc } = config;
|
|
40
|
+
// Validate config: exactly one of reposDir or singleRepoPath must be specified
|
|
41
|
+
if (reposDir && singleRepoPath) {
|
|
42
|
+
throw new Error('Cannot specify both reposDir and singleRepoPath');
|
|
43
|
+
}
|
|
44
|
+
if (!reposDir && !singleRepoPath) {
|
|
45
|
+
throw new Error('Must specify either reposDir or singleRepoPath');
|
|
46
|
+
}
|
|
47
|
+
const isSingleRepoMode = !!singleRepoPath;
|
|
48
|
+
// Single storage instance shared across all requests
|
|
49
|
+
// Pass reposDir for multi-repo mode to enable storage.repos.* operations
|
|
50
|
+
const storage = new LocalStorage(isSingleRepoMode ? undefined : reposDir);
|
|
51
|
+
// Helper to compute repo path from repo name
|
|
52
|
+
// In single-repo mode, middleware validates 'default' before routes are called
|
|
53
|
+
const getRepoPath = (repoName) => {
|
|
54
|
+
if (isSingleRepoMode) {
|
|
55
|
+
// Middleware ensures repoName === 'default' before we get here
|
|
56
|
+
return singleRepoPath;
|
|
57
|
+
}
|
|
58
|
+
return path.join(reposDir, repoName);
|
|
59
|
+
};
|
|
22
60
|
const app = new Hono();
|
|
23
61
|
// Enable CORS if configured
|
|
24
62
|
if (enableCors) {
|
|
25
63
|
app.use('*', cors({ origin: '*' }));
|
|
64
|
+
// Allow Private Network Access (required for extension webviews on WiFi)
|
|
65
|
+
app.use('*', async (c, next) => {
|
|
66
|
+
await next();
|
|
67
|
+
if (c.req.header('Access-Control-Request-Private-Network') === 'true') {
|
|
68
|
+
c.header('Access-Control-Allow-Private-Network', 'true');
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
// Create OIDC provider if configured (built-in auth server)
|
|
73
|
+
let oidcProvider;
|
|
74
|
+
if (oidc) {
|
|
75
|
+
oidcProvider = createOidcProvider(oidc);
|
|
76
|
+
// Mount OIDC routes at root (/.well-known/*, /oauth2/*, /device)
|
|
77
|
+
app.route('/', oidcProvider.routes);
|
|
78
|
+
}
|
|
79
|
+
// Transfer backend for presigned URL object transfer
|
|
80
|
+
const transferBackend = new InMemoryTransferBackend({ baseUrl: '' });
|
|
81
|
+
// Data routes (no auth — capability-URL pattern via UUID)
|
|
82
|
+
// Must be mounted BEFORE auth middleware so they bypass JWT validation.
|
|
83
|
+
// In cloud deployments these URLs are S3 presigned URLs that reject auth headers.
|
|
84
|
+
const pkgTransfer = createPackageTransferRoutes(storage, getRepoPath, transferBackend);
|
|
85
|
+
const dsTransfer = createTransferRoutes(storage, getRepoPath, transferBackend);
|
|
86
|
+
const dataEndpoints = createDataEndpoints(transferBackend, storage, getRepoPath);
|
|
87
|
+
app.route('/api/uploads', dataEndpoints.uploads);
|
|
88
|
+
app.route('/api/downloads', dataEndpoints.downloads);
|
|
89
|
+
// Apply auth middleware to all repo-specific routes if configured
|
|
90
|
+
// If OIDC is enabled but auth is not separately configured, use OIDC keys for validation
|
|
91
|
+
if (auth) {
|
|
92
|
+
const authMiddleware = await createAuthMiddleware(auth);
|
|
93
|
+
app.use('/api/repos/:repo/*', authMiddleware);
|
|
94
|
+
}
|
|
95
|
+
else if (oidcProvider) {
|
|
96
|
+
// Use the OIDC provider's keys for JWT validation
|
|
97
|
+
const authMiddleware = await createAuthMiddleware({
|
|
98
|
+
jwksUrl: `${oidc.baseUrl}/.well-known/jwks.json`,
|
|
99
|
+
issuer: oidc.baseUrl,
|
|
100
|
+
audience: oidc.baseUrl,
|
|
101
|
+
// Provide keys directly to avoid HTTP fetch to self
|
|
102
|
+
_internalKeys: oidcProvider.keys,
|
|
103
|
+
});
|
|
104
|
+
app.use('/api/repos/:repo/*', authMiddleware);
|
|
105
|
+
}
|
|
106
|
+
// Single-repo mode: validate repo name and handle disabled operations
|
|
107
|
+
// Runs AFTER auth middleware (so unauthorized users get 401, not 404/405)
|
|
108
|
+
// Uses JSON error responses with HTTP error status codes because middleware
|
|
109
|
+
// cannot know the BEAST2 success type expected by the handler.
|
|
110
|
+
if (isSingleRepoMode) {
|
|
111
|
+
// Block repo-level PUT (create) and DELETE (remove) in single-repo mode
|
|
112
|
+
app.put('/api/repos/:repo', (c) => {
|
|
113
|
+
return c.json({
|
|
114
|
+
error: 'method_not_allowed',
|
|
115
|
+
message: 'Repository creation is disabled in single-repo mode'
|
|
116
|
+
}, 405);
|
|
117
|
+
});
|
|
118
|
+
app.delete('/api/repos/:repo', (c) => {
|
|
119
|
+
const repo = c.req.param('repo');
|
|
120
|
+
if (repo === 'default') {
|
|
121
|
+
return c.json({
|
|
122
|
+
error: 'method_not_allowed',
|
|
123
|
+
message: 'Repository deletion is disabled in single-repo mode'
|
|
124
|
+
}, 405);
|
|
125
|
+
}
|
|
126
|
+
return c.json({ error: 'not_found', message: `Repository '${repo}' not found` }, 404);
|
|
127
|
+
});
|
|
128
|
+
// Validate repo name for all sub-routes
|
|
129
|
+
app.use('/api/repos/:repo/*', async (c, next) => {
|
|
130
|
+
const repo = c.req.param('repo');
|
|
131
|
+
if (repo !== 'default') {
|
|
132
|
+
return c.json({ error: 'not_found', message: `Repository '${repo}' not found` }, 404);
|
|
133
|
+
}
|
|
134
|
+
await next();
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
// Validate repository exists and is accessible before processing requests (multi-repo mode only)
|
|
138
|
+
// In single-repo mode, this is handled by the middleware above
|
|
139
|
+
// Skip validation for PUT/DELETE on /api/repos/:repo (repo create/remove)
|
|
140
|
+
// Skip validation for /api/repos/:repo/delete/* (repo deletion status - repo may already be deleted)
|
|
141
|
+
// Uses JSON error responses with HTTP 404 because middleware cannot know
|
|
142
|
+
// the BEAST2 success type expected by the handler.
|
|
143
|
+
if (!isSingleRepoMode) {
|
|
144
|
+
app.use('/api/repos/:repo/*', async (c, next) => {
|
|
145
|
+
// Skip validation for repo create/remove operations at the repo level
|
|
146
|
+
// These operate on repos that may not exist yet (PUT) or are being deleted (DELETE)
|
|
147
|
+
const method = c.req.method;
|
|
148
|
+
const reqPath = c.req.path;
|
|
149
|
+
// Check if this is the base repo path (no subpath after repo name)
|
|
150
|
+
const repoPathMatch = reqPath.match(/^\/api\/repos\/[^/]+$/);
|
|
151
|
+
if (repoPathMatch && (method === 'PUT' || method === 'DELETE')) {
|
|
152
|
+
await next();
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
// Skip validation for delete status endpoint (repo may already be deleted)
|
|
156
|
+
const deleteStatusMatch = reqPath.match(/^\/api\/repos\/[^/]+\/delete\/[^/]+$/);
|
|
157
|
+
if (deleteStatusMatch) {
|
|
158
|
+
await next();
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const repo = c.req.param('repo');
|
|
162
|
+
// Check repo metadata for status
|
|
163
|
+
const metadata = await storage.repos.getMetadata(repo);
|
|
164
|
+
if (!metadata) {
|
|
165
|
+
return c.json({ error: 'not_found', message: `Repository '${repo}' not found` }, 404);
|
|
166
|
+
}
|
|
167
|
+
// If repo is in 'deleting' state, treat as not found for most operations
|
|
168
|
+
// Exception: status endpoint shows 'deleting' state (but we still check repo exists above)
|
|
169
|
+
const statusMatch = reqPath.match(/^\/api\/repos\/[^/]+\/status$/);
|
|
170
|
+
if (metadata.status === 'deleting' && !statusMatch) {
|
|
171
|
+
return c.json({ error: 'not_found', message: `Repository '${repo}' not found` }, 404);
|
|
172
|
+
}
|
|
173
|
+
// Also validate the repo structure (for backwards compat with repos without metadata)
|
|
174
|
+
const repoPath = getRepoPath(repo);
|
|
175
|
+
try {
|
|
176
|
+
await storage.validateRepository(repoPath);
|
|
177
|
+
}
|
|
178
|
+
catch (err) {
|
|
179
|
+
if (err instanceof RepoNotFoundError) {
|
|
180
|
+
return c.json({ error: 'not_found', message: `Repository '${repo}' not found` }, 404);
|
|
181
|
+
}
|
|
182
|
+
throw err;
|
|
183
|
+
}
|
|
184
|
+
await next();
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
// GET /api/repos - List available repositories
|
|
188
|
+
app.get('/api/repos', async () => {
|
|
189
|
+
if (isSingleRepoMode) {
|
|
190
|
+
return sendSuccess(ArrayType(StringType), ['default']);
|
|
191
|
+
}
|
|
192
|
+
try {
|
|
193
|
+
const repos = await storage.repos.list();
|
|
194
|
+
return sendSuccess(ArrayType(StringType), repos);
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
return sendError(ArrayType(StringType), errorToVariant(err));
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
// PUT /api/repos/:repo - Create a new repository (multi-repo mode only)
|
|
201
|
+
// Note: Single-repo mode handler is registered earlier and takes precedence
|
|
202
|
+
if (!isSingleRepoMode) {
|
|
203
|
+
app.put('/api/repos/:repo', async (c) => {
|
|
204
|
+
const repo = c.req.param('repo');
|
|
205
|
+
try {
|
|
206
|
+
// Check if repo exists and is in 'deleting' state
|
|
207
|
+
const existing = await storage.repos.getMetadata(repo);
|
|
208
|
+
if (existing) {
|
|
209
|
+
if (existing.status === 'deleting') {
|
|
210
|
+
return sendError(StringType, variant('internal', { message: `Repository '${repo}' cleanup in progress, try later` }));
|
|
211
|
+
}
|
|
212
|
+
return sendError(StringType, variant('internal', { message: `Repository '${repo}' already exists` }));
|
|
213
|
+
}
|
|
214
|
+
await storage.repos.create(repo);
|
|
215
|
+
return sendSuccessWithStatus(StringType, repo, 201);
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
if (err instanceof RepoAlreadyExistsError) {
|
|
219
|
+
return sendError(StringType, variant('internal', { message: `Repository '${repo}' already exists` }));
|
|
220
|
+
}
|
|
221
|
+
return sendError(StringType, errorToVariant(err));
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
// DELETE /api/repos/:repo - Remove a repository (async, multi-repo mode only)
|
|
225
|
+
// Uses the resumable deletion pattern:
|
|
226
|
+
// 1. Mark repo as 'deleting' (atomic tombstone)
|
|
227
|
+
// 2. Delete refs synchronously (fast)
|
|
228
|
+
// 3. Delete objects in batches
|
|
229
|
+
// 4. Remove repo metadata
|
|
230
|
+
// Note: For cloud (e3-aws), step 3 would be async via GC
|
|
231
|
+
app.delete('/api/repos/:repo', async (c) => {
|
|
232
|
+
const repo = c.req.param('repo');
|
|
233
|
+
try {
|
|
234
|
+
// Check if repo exists
|
|
235
|
+
const existing = await storage.repos.getMetadata(repo);
|
|
236
|
+
if (!existing) {
|
|
237
|
+
return sendError(NullType, variant('repository_not_found', { repo }));
|
|
238
|
+
}
|
|
239
|
+
// If already deleting, return success (idempotent)
|
|
240
|
+
if (existing.status === 'deleting') {
|
|
241
|
+
return sendSuccess(NullType, null);
|
|
242
|
+
}
|
|
243
|
+
// 1. Atomically mark as 'deleting'
|
|
244
|
+
await storage.repos.setStatus(repo, 'deleting', 'active');
|
|
245
|
+
// 2. Delete refs synchronously (fast for local storage)
|
|
246
|
+
let cursor;
|
|
247
|
+
do {
|
|
248
|
+
const result = await storage.repos.deleteRefsBatch(repo, cursor);
|
|
249
|
+
cursor = result.status === 'continue' ? result.cursor : undefined;
|
|
250
|
+
} while (cursor);
|
|
251
|
+
// 3. Delete objects in batches (for local storage, this is synchronous)
|
|
252
|
+
cursor = undefined;
|
|
253
|
+
do {
|
|
254
|
+
const result = await storage.repos.deleteObjectsBatch(repo, cursor);
|
|
255
|
+
cursor = result.status === 'continue' ? result.cursor : undefined;
|
|
256
|
+
} while (cursor);
|
|
257
|
+
// 4. Remove repo metadata/directory
|
|
258
|
+
await storage.repos.remove(repo);
|
|
259
|
+
return sendSuccess(NullType, null);
|
|
260
|
+
}
|
|
261
|
+
catch (err) {
|
|
262
|
+
if (err instanceof RepoNotFoundError) {
|
|
263
|
+
return sendError(NullType, variant('repository_not_found', { repo }));
|
|
264
|
+
}
|
|
265
|
+
return sendError(NullType, errorToVariant(err));
|
|
266
|
+
}
|
|
267
|
+
});
|
|
26
268
|
}
|
|
27
|
-
//
|
|
28
|
-
|
|
29
|
-
//
|
|
30
|
-
app.route('/api/
|
|
31
|
-
//
|
|
32
|
-
|
|
33
|
-
app.route('/api/
|
|
34
|
-
//
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
app.route('/api/workspaces/:ws/
|
|
40
|
-
//
|
|
41
|
-
|
|
42
|
-
|
|
269
|
+
// Mount repository-specific routes
|
|
270
|
+
// Each route file creates a sub-app that uses getRepoPath to resolve the repo
|
|
271
|
+
// Repository status and GC: /api/repos/:repo/status, /api/repos/:repo/gc
|
|
272
|
+
app.route('/api/repos/:repo', createRepositoryRoutes(storage, getRepoPath));
|
|
273
|
+
// Package transfer routes: repo-level import/export + package-level export trigger
|
|
274
|
+
app.route('/api/repos/:repo', pkgTransfer.repoApi);
|
|
275
|
+
app.route('/api/repos/:repo/packages', pkgTransfer.pkgApi);
|
|
276
|
+
// Package routes: /api/repos/:repo/packages/*
|
|
277
|
+
app.route('/api/repos/:repo/packages', createPackageRoutes(storage, getRepoPath));
|
|
278
|
+
// Workspace routes: /api/repos/:repo/workspaces/*
|
|
279
|
+
app.route('/api/repos/:repo/workspaces', createWorkspaceRoutes(storage, getRepoPath));
|
|
280
|
+
// Dataset transfer auth routes (init + commit) mount alongside dataset routes
|
|
281
|
+
app.route('/api/repos/:repo/workspaces/:ws/datasets', dsTransfer.api);
|
|
282
|
+
// Dataset routes: /api/repos/:repo/workspaces/:ws/datasets/*
|
|
283
|
+
app.route('/api/repos/:repo/workspaces/:ws/datasets', createDatasetRoutes(storage, getRepoPath, transferBackend));
|
|
284
|
+
// Task routes: /api/repos/:repo/workspaces/:ws/tasks/*
|
|
285
|
+
app.route('/api/repos/:repo/workspaces/:ws/tasks', createTaskRoutes(storage, getRepoPath));
|
|
286
|
+
// Execution/Dataflow routes: /api/repos/:repo/workspaces/:ws/dataflow/*
|
|
287
|
+
app.route('/api/repos/:repo/workspaces/:ws/dataflow', createExecutionRoutes(storage, getRepoPath));
|
|
288
|
+
// Object routes: /api/repos/:repo/objects/:hash
|
|
289
|
+
app.route('/api/repos/:repo/objects', createObjectRoutes(storage, getRepoPath));
|
|
43
290
|
let httpServer = null;
|
|
44
291
|
let actualPort = port;
|
|
45
292
|
const server = {
|
package/dist/src/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
|