local-serverless-stack 0.0.1
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/CHANGELOG.md +104 -0
- package/LICENSE +21 -0
- package/README.md +653 -0
- package/bin/cli.js +204 -0
- package/dist/server/dev/dynamo-proxy.d.ts +3 -0
- package/dist/server/dev/dynamo-proxy.d.ts.map +1 -0
- package/dist/server/dev/dynamo-proxy.js +35 -0
- package/dist/server/dev/dynamo-proxy.js.map +1 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +67 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/routes/resources.d.ts +3 -0
- package/dist/server/routes/resources.d.ts.map +1 -0
- package/dist/server/routes/resources.js +16 -0
- package/dist/server/routes/resources.js.map +1 -0
- package/dist/server/routes/services.d.ts +5 -0
- package/dist/server/routes/services.d.ts.map +1 -0
- package/dist/server/routes/services.js +217 -0
- package/dist/server/routes/services.js.map +1 -0
- package/dist/server/services/cache-manager.d.ts +21 -0
- package/dist/server/services/cache-manager.d.ts.map +1 -0
- package/dist/server/services/cache-manager.js +70 -0
- package/dist/server/services/cache-manager.js.map +1 -0
- package/dist/server/services/cloudformation-parser.d.ts +88 -0
- package/dist/server/services/cloudformation-parser.d.ts.map +1 -0
- package/dist/server/services/cloudformation-parser.js +112 -0
- package/dist/server/services/cloudformation-parser.js.map +1 -0
- package/dist/server/services/localstack-manager.d.ts +23 -0
- package/dist/server/services/localstack-manager.d.ts.map +1 -0
- package/dist/server/services/localstack-manager.js +142 -0
- package/dist/server/services/localstack-manager.js.map +1 -0
- package/dist/server/services/process-manager.d.ts +41 -0
- package/dist/server/services/process-manager.d.ts.map +1 -0
- package/dist/server/services/process-manager.js +119 -0
- package/dist/server/services/process-manager.js.map +1 -0
- package/dist/server/services/resource-provisioner.d.ts +37 -0
- package/dist/server/services/resource-provisioner.d.ts.map +1 -0
- package/dist/server/services/resource-provisioner.js +539 -0
- package/dist/server/services/resource-provisioner.js.map +1 -0
- package/dist/ui/assets/index-7WT0rkfU.css +1 -0
- package/dist/ui/assets/index-M0lXeUj-.js +19 -0
- package/dist/ui/index.html +16 -0
- package/package.json +89 -0
- package/packages/serverless-plugin/README.md +95 -0
- package/packages/serverless-plugin/dist/index.d.ts +2 -0
- package/packages/serverless-plugin/dist/index.d.ts.map +1 -0
- package/packages/serverless-plugin/dist/index.js +88 -0
- package/packages/serverless-plugin/dist/index.js.map +1 -0
package/bin/cli.js
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const { spawn } = require('child_process');
|
|
4
|
+
const fs = require('fs');
|
|
5
|
+
const path = require('path');
|
|
6
|
+
const os = require('os');
|
|
7
|
+
|
|
8
|
+
const PID_FILE = path.join(os.tmpdir(), 'lss-orchestrator.pid');
|
|
9
|
+
const LOG_FILE = path.join(os.tmpdir(), 'lss-orchestrator.log');
|
|
10
|
+
|
|
11
|
+
// Resolve orchestrator path - works both in development and when installed via npm
|
|
12
|
+
function getOrchestratorPath() {
|
|
13
|
+
// Try to find the orchestrator relative to this script
|
|
14
|
+
// When installed via npm: node_modules/local-serverless-stack/bin/cli.js
|
|
15
|
+
// In development: /workspaces/local-serverless-stack/bin/cli.js
|
|
16
|
+
const candidates = [
|
|
17
|
+
// Installed via npm in node_modules
|
|
18
|
+
path.join(__dirname, '../dist/server/index.js'),
|
|
19
|
+
// Development mode
|
|
20
|
+
path.join(__dirname, '..', 'dist', 'server', 'index.js')
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
for (const candidate of candidates) {
|
|
24
|
+
if (fs.existsSync(candidate)) {
|
|
25
|
+
return candidate;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function startOrchestrator() {
|
|
33
|
+
if (fs.existsSync(PID_FILE)) {
|
|
34
|
+
const pid = fs.readFileSync(PID_FILE, 'utf8').trim();
|
|
35
|
+
try {
|
|
36
|
+
process.kill(pid, 0);
|
|
37
|
+
console.log('✅ LSS Orchestrator already running (PID:', pid + ')');
|
|
38
|
+
console.log('📊 Dashboard: http://localhost:3100');
|
|
39
|
+
console.log('🔧 LocalStack: http://localhost:4566');
|
|
40
|
+
return;
|
|
41
|
+
} catch (e) {
|
|
42
|
+
fs.unlinkSync(PID_FILE);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const orchestratorPath = getOrchestratorPath();
|
|
47
|
+
|
|
48
|
+
if (!orchestratorPath) {
|
|
49
|
+
console.error('❌ Orchestrator not found or not built.');
|
|
50
|
+
console.error('');
|
|
51
|
+
console.error('If you are developing LSS, run:');
|
|
52
|
+
console.error(' cd /path/to/local-serverless-stack && npm run build');
|
|
53
|
+
console.error('');
|
|
54
|
+
console.error('If you installed via npm, please report this as a bug.');
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const logFd = fs.openSync(LOG_FILE, 'a');
|
|
59
|
+
|
|
60
|
+
// Check for flags
|
|
61
|
+
const enableDynamoProxy = process.argv.includes('--enable-dynamo-proxy');
|
|
62
|
+
|
|
63
|
+
// Build environment variables
|
|
64
|
+
const env = { ...process.env };
|
|
65
|
+
if (enableDynamoProxy) {
|
|
66
|
+
env.ENABLE_DYNAMO_PROXY = 'true';
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const child = spawn('node', [orchestratorPath], {
|
|
70
|
+
detached: true,
|
|
71
|
+
stdio: ['ignore', logFd, logFd],
|
|
72
|
+
env
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
child.unref();
|
|
76
|
+
|
|
77
|
+
fs.closeSync(logFd);
|
|
78
|
+
fs.writeFileSync(PID_FILE, child.pid.toString());
|
|
79
|
+
|
|
80
|
+
console.log('🚀 LSS Orchestrator started (PID:', child.pid + ')');
|
|
81
|
+
console.log('📊 Dashboard: http://localhost:3100');
|
|
82
|
+
console.log('🔧 LocalStack: http://localhost:4566');
|
|
83
|
+
if (enableDynamoProxy) {
|
|
84
|
+
console.log('🔄 DynamoDB Proxy: http://localhost:8000 (enabled)');
|
|
85
|
+
}
|
|
86
|
+
console.log('📝 Logs:', LOG_FILE);
|
|
87
|
+
|
|
88
|
+
setTimeout(() => {
|
|
89
|
+
try {
|
|
90
|
+
process.kill(child.pid, 0);
|
|
91
|
+
console.log('✅ Service is running');
|
|
92
|
+
} catch (e) {
|
|
93
|
+
console.error('❌ Service failed to start. Check logs:', LOG_FILE);
|
|
94
|
+
if (fs.existsSync(PID_FILE)) {
|
|
95
|
+
fs.unlinkSync(PID_FILE);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}, 2000);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function stopOrchestrator() {
|
|
102
|
+
if (!fs.existsSync(PID_FILE)) {
|
|
103
|
+
console.log('⚠️ LSS Orchestrator is not running');
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const pid = fs.readFileSync(PID_FILE, 'utf8').trim();
|
|
108
|
+
|
|
109
|
+
try {
|
|
110
|
+
process.kill(pid, 'SIGTERM');
|
|
111
|
+
fs.unlinkSync(PID_FILE);
|
|
112
|
+
console.log('🛑 LSS Orchestrator stopped (PID:', pid + ')');
|
|
113
|
+
} catch (e) {
|
|
114
|
+
console.error('❌ Failed to stop process:', e.message);
|
|
115
|
+
if (fs.existsSync(PID_FILE)) {
|
|
116
|
+
fs.unlinkSync(PID_FILE);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function showStatus() {
|
|
122
|
+
if (!fs.existsSync(PID_FILE)) {
|
|
123
|
+
console.log('⚪ LSS Orchestrator: NOT RUNNING');
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const pid = fs.readFileSync(PID_FILE, 'utf8').trim();
|
|
128
|
+
|
|
129
|
+
try {
|
|
130
|
+
process.kill(pid, 0);
|
|
131
|
+
console.log('🟢 LSS Orchestrator: RUNNING (PID:', pid + ')');
|
|
132
|
+
console.log('📊 Dashboard: http://localhost:3100');
|
|
133
|
+
console.log('🔧 LocalStack: http://localhost:4566');
|
|
134
|
+
console.log('📝 Logs:', LOG_FILE);
|
|
135
|
+
} catch (e) {
|
|
136
|
+
console.log('⚪ LSS Orchestrator: NOT RUNNING (stale PID file)');
|
|
137
|
+
fs.unlinkSync(PID_FILE);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function showHelp() {
|
|
142
|
+
console.log(`
|
|
143
|
+
Local Serverless Stack (LSS) CLI
|
|
144
|
+
|
|
145
|
+
Usage: npx lss <command> [options]
|
|
146
|
+
|
|
147
|
+
Commands:
|
|
148
|
+
start Start the LSS Orchestrator in background
|
|
149
|
+
stop Stop the LSS Orchestrator
|
|
150
|
+
status Check if the orchestrator is running
|
|
151
|
+
logs Show the logs
|
|
152
|
+
help Show this help message
|
|
153
|
+
|
|
154
|
+
Options:
|
|
155
|
+
--enable-dynamo-proxy Enable DynamoDB proxy on port 8000 (for start command)
|
|
156
|
+
|
|
157
|
+
Examples:
|
|
158
|
+
npx lss start # Start the orchestrator
|
|
159
|
+
npx lss start --enable-dynamo-proxy # Start with DynamoDB proxy enabled
|
|
160
|
+
npx lss stop # Stop the orchestrator
|
|
161
|
+
npx lss status # Check status
|
|
162
|
+
npx lss logs # View logs
|
|
163
|
+
`);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function showLogs() {
|
|
167
|
+
if (!fs.existsSync(LOG_FILE)) {
|
|
168
|
+
console.log('⚠️ No logs found');
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
console.log('📝 Logs from:', LOG_FILE);
|
|
173
|
+
console.log('---');
|
|
174
|
+
const logs = fs.readFileSync(LOG_FILE, 'utf8');
|
|
175
|
+
const lines = logs.split('\n');
|
|
176
|
+
const lastLines = lines.slice(-50).join('\n');
|
|
177
|
+
console.log(lastLines);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const command = process.argv[2];
|
|
181
|
+
|
|
182
|
+
switch (command) {
|
|
183
|
+
case 'start':
|
|
184
|
+
startOrchestrator();
|
|
185
|
+
break;
|
|
186
|
+
case 'stop':
|
|
187
|
+
stopOrchestrator();
|
|
188
|
+
break;
|
|
189
|
+
case 'status':
|
|
190
|
+
showStatus();
|
|
191
|
+
break;
|
|
192
|
+
case 'logs':
|
|
193
|
+
showLogs();
|
|
194
|
+
break;
|
|
195
|
+
case 'help':
|
|
196
|
+
case '--help':
|
|
197
|
+
case '-h':
|
|
198
|
+
showHelp();
|
|
199
|
+
break;
|
|
200
|
+
default:
|
|
201
|
+
console.log('❌ Unknown command:', command);
|
|
202
|
+
showHelp();
|
|
203
|
+
process.exit(1);
|
|
204
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamo-proxy.d.ts","sourceRoot":"","sources":["../../../src/server/dev/dynamo-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAIxB,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,SAAO,wEAwCnE"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import http from 'http';
|
|
2
|
+
// Temporary DynamoDB proxy: forwards http://localhost:8000 -> LocalStack (e.g., http://localhost:4566)
|
|
3
|
+
// Controlled by ENABLE_DYNAMO_PROXY env var; remove when no longer needed.
|
|
4
|
+
export function startDynamoProxy(targetEndpoint, port = 8000) {
|
|
5
|
+
const targetBase = targetEndpoint.replace(/\/$/, '');
|
|
6
|
+
const server = http.createServer((req, res) => {
|
|
7
|
+
if (!req.url) {
|
|
8
|
+
res.statusCode = 400;
|
|
9
|
+
res.end('Bad Request');
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const url = `${targetBase}${req.url}`;
|
|
13
|
+
const headers = { ...(req.headers || {}) };
|
|
14
|
+
delete headers['host'];
|
|
15
|
+
const upstream = http.request(url, {
|
|
16
|
+
method: req.method,
|
|
17
|
+
headers,
|
|
18
|
+
}, upstreamRes => {
|
|
19
|
+
res.writeHead(upstreamRes.statusCode || 502, upstreamRes.headers);
|
|
20
|
+
upstreamRes.pipe(res);
|
|
21
|
+
});
|
|
22
|
+
upstream.on('error', err => {
|
|
23
|
+
console.error('Proxy error:', err);
|
|
24
|
+
if (!res.headersSent)
|
|
25
|
+
res.writeHead(502);
|
|
26
|
+
res.end('Bad Gateway');
|
|
27
|
+
});
|
|
28
|
+
req.pipe(upstream);
|
|
29
|
+
});
|
|
30
|
+
server.listen(port, () => {
|
|
31
|
+
console.log(`✅ DynamoDB proxy listening on http://localhost:${port} -> ${targetBase}`);
|
|
32
|
+
});
|
|
33
|
+
return server;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=dynamo-proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamo-proxy.js","sourceRoot":"","sources":["../../../src/server/dev/dynamo-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,uGAAuG;AACvG,2EAA2E;AAC3E,MAAM,UAAU,gBAAgB,CAAC,cAAsB,EAAE,IAAI,GAAG,IAAI;IAClE,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC5C,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACvB,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,UAAU,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAA8B,CAAC;QACvE,OAAQ,OAAe,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAC3B,GAAG,EACH;YACE,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,OAAO;SACR,EACD,WAAW,CAAC,EAAE;YACZ,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,UAAU,IAAI,GAAG,EAAE,WAAW,CAAC,OAAmC,CAAC,CAAC;YAC9F,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC,CACF,CAAC;QAEF,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE;YACzB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;YACnC,IAAI,CAAC,GAAG,CAAC,WAAW;gBAAE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACzC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;QACvB,OAAO,CAAC,GAAG,CAAC,kDAAkD,IAAI,OAAO,UAAU,EAAE,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import cors from 'cors';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
import { servicesRouter, processManager } from './routes/services.js';
|
|
6
|
+
import { resourcesRouter } from './routes/resources.js';
|
|
7
|
+
import { LocalStackManager } from './services/localstack-manager.js';
|
|
8
|
+
import { startDynamoProxy } from './dev/dynamo-proxy.js';
|
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
const __dirname = path.dirname(__filename);
|
|
11
|
+
const app = express();
|
|
12
|
+
const PORT = process.env.PORT || 3100;
|
|
13
|
+
// Middleware
|
|
14
|
+
app.use(cors());
|
|
15
|
+
app.use(express.json());
|
|
16
|
+
// API routes
|
|
17
|
+
app.use('/api/services', servicesRouter);
|
|
18
|
+
app.use('/api/resources', resourcesRouter);
|
|
19
|
+
// Health check
|
|
20
|
+
app.get('/api/health', (_req, res) => {
|
|
21
|
+
res.json({
|
|
22
|
+
status: 'ok',
|
|
23
|
+
localstack: LocalStackManager.getInstance().isRunning(),
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
// Serve frontend build (fallback for SPA)
|
|
27
|
+
// __dirname is dist/server, so ../ui points to dist/ui
|
|
28
|
+
const uiBuildPath = path.join(__dirname, '../ui');
|
|
29
|
+
app.use(express.static(uiBuildPath));
|
|
30
|
+
app.get('*', (_req, res) => {
|
|
31
|
+
res.sendFile(path.join(uiBuildPath, 'index.html'));
|
|
32
|
+
});
|
|
33
|
+
// Start server and LocalStack
|
|
34
|
+
async function start() {
|
|
35
|
+
try {
|
|
36
|
+
console.log('🚀 Starting Orchestrator Server...');
|
|
37
|
+
// Initialize LocalStack
|
|
38
|
+
const localstack = LocalStackManager.getInstance();
|
|
39
|
+
await localstack.start();
|
|
40
|
+
app.listen(PORT, () => {
|
|
41
|
+
console.log(`✅ Server running on http://localhost:${PORT}`);
|
|
42
|
+
console.log(`✅ LocalStack running on ${localstack.getEndpoint()}`);
|
|
43
|
+
});
|
|
44
|
+
// Optional temporary DynamoDB proxy (port 8000) -> LocalStack (4566)
|
|
45
|
+
// Enable by setting ENABLE_DYNAMO_PROXY=true|1
|
|
46
|
+
const DYNAMO_PROXY_ENABLED = String(process.env.ENABLE_DYNAMO_PROXY || '').toLowerCase() === 'true' || process.env.ENABLE_DYNAMO_PROXY === '1';
|
|
47
|
+
if (DYNAMO_PROXY_ENABLED) {
|
|
48
|
+
const port = Number(process.env.DYNAMO_PROXY_PORT || 8000);
|
|
49
|
+
startDynamoProxy(localstack.getEndpoint(), port);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
console.error('❌ Failed to start server:', error);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Graceful shutdown
|
|
58
|
+
process.on('SIGINT', async () => {
|
|
59
|
+
console.log('\n🛑 Shutting down gracefully...');
|
|
60
|
+
processManager.stopAll();
|
|
61
|
+
await processManager.cleanup();
|
|
62
|
+
const localstack = LocalStackManager.getInstance();
|
|
63
|
+
await localstack.stop();
|
|
64
|
+
process.exit(0);
|
|
65
|
+
});
|
|
66
|
+
start();
|
|
67
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../src/server/routes/resources.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAaxB,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Router } from 'express';
|
|
2
|
+
import { ResourceProvisioner } from '../services/resource-provisioner.js';
|
|
3
|
+
const router = Router();
|
|
4
|
+
const provisioner = new ResourceProvisioner();
|
|
5
|
+
// List all provisioned resources
|
|
6
|
+
router.get('/', async (_req, res) => {
|
|
7
|
+
try {
|
|
8
|
+
const resources = await provisioner.listAllResources();
|
|
9
|
+
res.json(resources);
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
res.status(500).json({ error: error.message });
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
export { router as resourcesRouter };
|
|
16
|
+
//# sourceMappingURL=resources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../../src/server/routes/resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;AACxB,MAAM,WAAW,GAAG,IAAI,mBAAmB,EAAE,CAAC;AAE9C,iCAAiC;AACjC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,IAAa,EAAE,GAAa,EAAE,EAAE;IACrD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,gBAAgB,EAAE,CAAC;QACvD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ProcessManager } from '../services/process-manager.js';
|
|
2
|
+
declare const router: import("express-serve-static-core").Router;
|
|
3
|
+
declare const processManager: ProcessManager;
|
|
4
|
+
export { router as servicesRouter, processManager };
|
|
5
|
+
//# sourceMappingURL=services.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../../src/server/routes/services.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,QAAA,MAAM,MAAM,4CAAW,CAAC;AAIxB,QAAA,MAAM,cAAc,gBAAuB,CAAC;AA0O5C,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { Router } from 'express';
|
|
2
|
+
import fs from 'fs/promises';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { CloudFormationParser } from '../services/cloudformation-parser.js';
|
|
5
|
+
import { CacheManager } from '../services/cache-manager.js';
|
|
6
|
+
import { ResourceProvisioner } from '../services/resource-provisioner.js';
|
|
7
|
+
import { ProcessManager } from '../services/process-manager.js';
|
|
8
|
+
const router = Router();
|
|
9
|
+
const parser = new CloudFormationParser();
|
|
10
|
+
const cache = new CacheManager();
|
|
11
|
+
const provisioner = new ResourceProvisioner();
|
|
12
|
+
const processManager = new ProcessManager();
|
|
13
|
+
// Initialize cache
|
|
14
|
+
await cache.init();
|
|
15
|
+
// Register a service
|
|
16
|
+
router.post('/register', async (req, res) => {
|
|
17
|
+
try {
|
|
18
|
+
const { servicePath, invokePort } = req.body;
|
|
19
|
+
if (!servicePath) {
|
|
20
|
+
return res.status(400).json({ error: 'servicePath is required' });
|
|
21
|
+
}
|
|
22
|
+
// Validate servicePath to prevent path traversal
|
|
23
|
+
const resolvedPath = path.resolve(servicePath);
|
|
24
|
+
if (resolvedPath.includes('..') || !resolvedPath.startsWith('/')) {
|
|
25
|
+
return res.status(400).json({ error: 'Invalid service path' });
|
|
26
|
+
}
|
|
27
|
+
// Validate invokePort
|
|
28
|
+
if (invokePort && (typeof invokePort !== 'number' || invokePort < 1024 || invokePort > 65535)) {
|
|
29
|
+
return res.status(400).json({ error: 'Invalid invokePort, must be between 1024-65535' });
|
|
30
|
+
}
|
|
31
|
+
// Read CloudFormation template
|
|
32
|
+
const templatePath = path.join(resolvedPath, '.serverless', 'cloudformation-template-update-stack.json');
|
|
33
|
+
const templateContent = await fs.readFile(templatePath, 'utf-8');
|
|
34
|
+
const template = JSON.parse(templateContent);
|
|
35
|
+
// Parse resources
|
|
36
|
+
const resources = parser.parse(template);
|
|
37
|
+
const templateHash = parser.calculateHash(template);
|
|
38
|
+
// Extract service name
|
|
39
|
+
const serviceName = path.basename(servicePath);
|
|
40
|
+
// Save to cache
|
|
41
|
+
await cache.saveTemplate(serviceName, template, {
|
|
42
|
+
root: servicePath,
|
|
43
|
+
templateHash,
|
|
44
|
+
lastUpdated: Date.now(),
|
|
45
|
+
status: 'registered',
|
|
46
|
+
invokePort,
|
|
47
|
+
});
|
|
48
|
+
// Provision resources to LocalStack
|
|
49
|
+
await provisioner.provisionResources(serviceName, resources, {
|
|
50
|
+
invokePort,
|
|
51
|
+
});
|
|
52
|
+
return res.json({
|
|
53
|
+
success: true,
|
|
54
|
+
serviceName,
|
|
55
|
+
resourcesCount: resources.length,
|
|
56
|
+
resources: resources.map(r => ({
|
|
57
|
+
type: r.type,
|
|
58
|
+
name: 'name' in r ? r.name : r.functionName,
|
|
59
|
+
})),
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
console.error('Registration error:', error);
|
|
64
|
+
const message = error instanceof Error ? 'Failed to register service' : 'Unknown error';
|
|
65
|
+
return res.status(500).json({ error: message });
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
// List all services
|
|
69
|
+
router.get('/', async (_req, res) => {
|
|
70
|
+
try {
|
|
71
|
+
const services = await cache.listServices();
|
|
72
|
+
return res.json(services);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
console.error('Error listing services:', error);
|
|
76
|
+
return res.status(500).json({ error: 'Failed to list services' });
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
// Get service details
|
|
80
|
+
router.get('/:name', async (req, res) => {
|
|
81
|
+
try {
|
|
82
|
+
const serviceName = req.params.name;
|
|
83
|
+
if (!serviceName || typeof serviceName !== 'string' || serviceName.includes('/') || serviceName.includes('..')) {
|
|
84
|
+
return res.status(400).json({ error: 'Invalid service name' });
|
|
85
|
+
}
|
|
86
|
+
const metadata = await cache.getMetadata(serviceName);
|
|
87
|
+
if (!metadata) {
|
|
88
|
+
return res.status(404).json({ error: 'Service not found' });
|
|
89
|
+
}
|
|
90
|
+
const template = await cache.getTemplate(serviceName);
|
|
91
|
+
const resources = parser.parse(template);
|
|
92
|
+
return res.json({
|
|
93
|
+
...metadata,
|
|
94
|
+
resourcesCount: resources.length,
|
|
95
|
+
resources: resources.map(r => ({
|
|
96
|
+
type: r.type,
|
|
97
|
+
name: 'name' in r ? r.name : r.functionName,
|
|
98
|
+
})),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
console.error('Error fetching service:', error);
|
|
103
|
+
return res.status(500).json({ error: 'Failed to fetch service details' });
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
// Delete service
|
|
107
|
+
router.delete('/:name', async (req, res) => {
|
|
108
|
+
try {
|
|
109
|
+
const serviceName = req.params.name;
|
|
110
|
+
if (!serviceName || typeof serviceName !== 'string' || serviceName.includes('/') || serviceName.includes('..')) {
|
|
111
|
+
return res.status(400).json({ error: 'Invalid service name' });
|
|
112
|
+
}
|
|
113
|
+
// Clean up resources from LocalStack
|
|
114
|
+
await provisioner.cleanupResources(serviceName);
|
|
115
|
+
// Delete from cache
|
|
116
|
+
await cache.deleteService(serviceName);
|
|
117
|
+
return res.json({ success: true });
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
console.error('Error deleting service:', error);
|
|
121
|
+
return res.status(500).json({ error: 'Failed to delete service' });
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
// Update service status
|
|
125
|
+
router.patch('/:name/status', async (req, res) => {
|
|
126
|
+
try {
|
|
127
|
+
const serviceName = req.params.name;
|
|
128
|
+
if (!serviceName || typeof serviceName !== 'string' || serviceName.includes('/') || serviceName.includes('..')) {
|
|
129
|
+
return res.status(400).json({ error: 'Invalid service name' });
|
|
130
|
+
}
|
|
131
|
+
const { status, pid } = req.body;
|
|
132
|
+
// Validate status
|
|
133
|
+
const validStatuses = ['registered', 'running', 'stopped', 'error'];
|
|
134
|
+
if (status && !validStatuses.includes(status)) {
|
|
135
|
+
return res.status(400).json({ error: 'Invalid status value' });
|
|
136
|
+
}
|
|
137
|
+
// Validate PID
|
|
138
|
+
if (pid !== undefined && (typeof pid !== 'number' || pid < 0)) {
|
|
139
|
+
return res.status(400).json({ error: 'Invalid PID' });
|
|
140
|
+
}
|
|
141
|
+
await cache.updateMetadata(serviceName, { status, pid });
|
|
142
|
+
return res.json({ success: true });
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
console.error('Error updating service status:', error);
|
|
146
|
+
return res.status(500).json({ error: 'Failed to update service status' });
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
// Start a service process (serverless offline / npm start)
|
|
150
|
+
router.post('/:name/start', async (req, res) => {
|
|
151
|
+
try {
|
|
152
|
+
const serviceName = req.params.name;
|
|
153
|
+
if (!serviceName || typeof serviceName !== 'string' || serviceName.includes('/') || serviceName.includes('..')) {
|
|
154
|
+
return res.status(400).json({ error: 'Invalid service name' });
|
|
155
|
+
}
|
|
156
|
+
const metadata = await cache.getMetadata(serviceName);
|
|
157
|
+
if (!metadata) {
|
|
158
|
+
return res.status(404).json({ error: 'Service not found' });
|
|
159
|
+
}
|
|
160
|
+
const { cwd, command, args, env, stage } = req.body || {};
|
|
161
|
+
// Validate command whitelist
|
|
162
|
+
const allowedCommands = ['npm', 'npx', 'yarn', 'node'];
|
|
163
|
+
if (command && !allowedCommands.includes(command)) {
|
|
164
|
+
return res.status(400).json({ error: 'Command not allowed' });
|
|
165
|
+
}
|
|
166
|
+
const runArgs = args && Array.isArray(args) && args.length > 0 ? args : ['run', stage ? `start:${stage}` : 'start'];
|
|
167
|
+
const result = processManager.start(serviceName, {
|
|
168
|
+
cwd: cwd || metadata.root,
|
|
169
|
+
command,
|
|
170
|
+
args: runArgs,
|
|
171
|
+
env,
|
|
172
|
+
});
|
|
173
|
+
await cache.updateMetadata(serviceName, { status: 'running', pid: result.pid || undefined });
|
|
174
|
+
return res.json({ success: true, pid: result.pid, status: result.status });
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
console.error('Error starting service:', error);
|
|
178
|
+
return res.status(500).json({ error: 'Failed to start service' });
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
// Stop a service process
|
|
182
|
+
router.post('/:name/stop', async (req, res) => {
|
|
183
|
+
try {
|
|
184
|
+
const serviceName = req.params.name;
|
|
185
|
+
if (!serviceName || typeof serviceName !== 'string' || serviceName.includes('/') || serviceName.includes('..')) {
|
|
186
|
+
return res.status(400).json({ error: 'Invalid service name' });
|
|
187
|
+
}
|
|
188
|
+
const metadata = await cache.getMetadata(serviceName);
|
|
189
|
+
if (!metadata) {
|
|
190
|
+
return res.status(404).json({ error: 'Service not found' });
|
|
191
|
+
}
|
|
192
|
+
const result = processManager.stop(serviceName);
|
|
193
|
+
await cache.updateMetadata(serviceName, { status: 'stopped', pid: undefined });
|
|
194
|
+
return res.json({ success: result.stopped });
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
console.error('Error stopping service:', error);
|
|
198
|
+
return res.status(500).json({ error: 'Failed to stop service' });
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
// Fetch logs for a running service
|
|
202
|
+
router.get('/:name/logs', async (req, res) => {
|
|
203
|
+
try {
|
|
204
|
+
const serviceName = req.params.name;
|
|
205
|
+
if (!serviceName || typeof serviceName !== 'string' || serviceName.includes('/') || serviceName.includes('..')) {
|
|
206
|
+
return res.status(400).json({ error: 'Invalid service name' });
|
|
207
|
+
}
|
|
208
|
+
const info = processManager.getLogs(serviceName);
|
|
209
|
+
return res.json(info);
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
console.error('Error fetching logs:', error);
|
|
213
|
+
return res.status(500).json({ error: 'Failed to fetch logs' });
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
export { router as servicesRouter, processManager };
|
|
217
|
+
//# sourceMappingURL=services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.js","sourceRoot":"","sources":["../../../src/server/routes/services.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface ServiceMetadata {
|
|
2
|
+
name: string;
|
|
3
|
+
root: string;
|
|
4
|
+
templateHash: string;
|
|
5
|
+
lastUpdated: number;
|
|
6
|
+
pid?: number;
|
|
7
|
+
status: 'registered' | 'running' | 'stopped';
|
|
8
|
+
invokePort?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare class CacheManager {
|
|
11
|
+
private cacheDir;
|
|
12
|
+
constructor();
|
|
13
|
+
init(): Promise<void>;
|
|
14
|
+
saveTemplate(serviceName: string, template: any, metadata: Omit<ServiceMetadata, 'name'>): Promise<void>;
|
|
15
|
+
getTemplate(serviceName: string): Promise<any | null>;
|
|
16
|
+
getMetadata(serviceName: string): Promise<ServiceMetadata | null>;
|
|
17
|
+
updateMetadata(serviceName: string, updates: Partial<ServiceMetadata>): Promise<void>;
|
|
18
|
+
listServices(): Promise<ServiceMetadata[]>;
|
|
19
|
+
deleteService(serviceName: string): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=cache-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-manager.d.ts","sourceRoot":"","sources":["../../../src/server/services/cache-manager.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAS;;IAMnB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxG,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAUrD,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAUjE,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAYrF,YAAY,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAoB1C,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIxD"}
|