testeranto 0.205.0 → 0.206.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/Dockerfile.mothership +14 -4
  2. package/Dockerfile.node +5 -3
  3. package/bundle.js +5 -4
  4. package/dist/common/src/app/backend/PM_0.js +3 -0
  5. package/dist/common/src/app/backend/PM_1_WithProcesses.js +2 -0
  6. package/dist/common/src/app/backend/PM_2_WithTCP.js +2 -0
  7. package/dist/common/src/app/backend/PM_WithHelpo.js +1 -0
  8. package/dist/common/src/app/backend/main.js +27 -26
  9. package/dist/common/src/app/frontend/useFs.js +2 -1
  10. package/dist/common/src/mothership/mothership.js +197 -0
  11. package/dist/common/src/testeranto.js +31 -42
  12. package/dist/common/tsconfig.common.tsbuildinfo +1 -1
  13. package/dist/module/src/app/backend/PM_0.js +3 -0
  14. package/dist/module/src/app/backend/PM_1_WithProcesses.js +2 -0
  15. package/dist/module/src/app/backend/PM_2_WithTCP.js +2 -0
  16. package/dist/module/src/app/backend/PM_WithHelpo.js +1 -0
  17. package/dist/module/src/app/backend/main.js +27 -26
  18. package/dist/module/src/app/frontend/useFs.js +2 -1
  19. package/dist/module/src/mothership/mothership.js +196 -0
  20. package/dist/module/src/testeranto.js +31 -42
  21. package/dist/module/tsconfig.module.tsbuildinfo +1 -1
  22. package/dist/prebuild/App.css +68 -12
  23. package/dist/prebuild/App.js +8 -91
  24. package/dist/prebuild/mothership.mjs +4 -0
  25. package/dist/types/src/app/backend/PM_1_WithProcesses.d.ts +0 -1
  26. package/dist/types/src/app/backend/PM_WithBuild.d.ts +0 -1
  27. package/dist/types/src/app/backend/main.d.ts +1 -0
  28. package/dist/types/src/app/frontend/useFs.d.ts +1 -1
  29. package/dist/types/src/mothership/mothership.d.ts +1 -0
  30. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  31. package/docker-compose.yml +54 -54
  32. package/package.json +8 -3
  33. package/src/app/backend/PM_0.ts +3 -0
  34. package/src/app/backend/PM_1_WithProcesses.ts +4 -2
  35. package/src/app/backend/PM_2_WithTCP.ts +3 -0
  36. package/src/app/backend/PM_WithBuild.ts +0 -2
  37. package/src/app/backend/PM_WithHelpo.ts +1 -1
  38. package/src/app/backend/main.ts +26 -8
  39. package/src/app/frontend/useFs.ts +2 -1
  40. package/src/mothership/mothership.ts +218 -0
  41. package/src/testeranto.ts +47 -45
  42. package/dist/common/src/mothership/index.js +0 -183
  43. package/dist/module/src/mothership/index.js +0 -178
  44. package/dist/prebuild/esbuildConfigs/eslint-formatter-testeranto.mjs +0 -22
  45. package/dist/prebuild/init-docs.mjs +0 -43
  46. package/dist/prebuild/testeranto.mjs +0 -5352
  47. package/dist/types/src/mothership/index.d.ts +0 -2
  48. package/src/mothership/index.ts +0 -216
@@ -1,2 +0,0 @@
1
- declare const _default: (port: number) => import("express-serve-static-core").Express;
2
- export default _default;
@@ -1,216 +0,0 @@
1
- import express from "express";
2
- import Docker from "dockerode";
3
-
4
- const app = express();
5
- app.use(express.json());
6
-
7
- const docker = new Docker();
8
-
9
- // Track running services
10
- const runningServices = new Map();
11
-
12
- // Service to build file mapping
13
- const serviceBuildFiles = {
14
- 'node-build': 'src/builders/node.ts',
15
- 'web-build': 'src/builders/web.ts',
16
- 'golang-build': 'src/builders/golang.ts',
17
- 'python-build': 'src/builders/python.ts'
18
- };
19
-
20
- // Automatically start build services on mothership startup
21
- async function initializeServices() {
22
- console.log('Initializing build services...');
23
-
24
- for (const serviceName of Object.keys(serviceBuildFiles)) {
25
- try {
26
- // Get all containers
27
- const containers = await docker.listContainers({ all: true });
28
-
29
- // Find the container for the requested service
30
- const containerInfo = containers.find(container =>
31
- container.Names.some(name => name.includes(serviceName))
32
- );
33
-
34
- if (containerInfo) {
35
- const container = docker.getContainer(containerInfo.Id);
36
-
37
- // Start the container if it's not running
38
- if (containerInfo.State !== 'running') {
39
- console.log(`Starting ${serviceName}...`);
40
- await container.start();
41
- } else {
42
- console.log(`${serviceName} is already running`);
43
- }
44
-
45
- runningServices.set(serviceName, containerInfo.Id);
46
- } else {
47
- console.warn(`Container for ${serviceName} not found`);
48
- }
49
- } catch (error) {
50
- console.error(`Error initializing ${serviceName}:`, error);
51
- }
52
- }
53
- console.log('Build services initialization complete');
54
- }
55
-
56
- // Initialize services when mothership starts
57
- initializeServices();
58
-
59
- app.get("/", (req, res) => {
60
- res.send("Mothership is running");
61
- });
62
-
63
- // Start a specific service
64
- app.post("/services/:serviceName/start", async (req, res) => {
65
- const { serviceName } = req.params;
66
-
67
- try {
68
- // Get all containers
69
- const containers = await docker.listContainers({ all: true });
70
-
71
- // Find the container for the requested service
72
- const containerInfo = containers.find(container =>
73
- container.Names.some(name => name.includes(serviceName))
74
- );
75
-
76
- if (!containerInfo) {
77
- return res.status(404).json({ error: `Service ${serviceName} not found` });
78
- }
79
-
80
- const container = docker.getContainer(containerInfo.Id);
81
-
82
- // Start the container if it's not running
83
- if (containerInfo.State !== 'running') {
84
- await container.start();
85
- }
86
-
87
- runningServices.set(serviceName, containerInfo.Id);
88
- res.status(200).json({
89
- status: 'started',
90
- service: serviceName,
91
- containerId: containerInfo.Id
92
- });
93
- } catch (error) {
94
- console.error(`Error starting service ${serviceName}:`, error);
95
- res.status(500).json({ error: `Failed to start service: ${error.message}` });
96
- }
97
- });
98
-
99
- // Stop a specific service
100
- app.post("/services/:serviceName/stop", async (req, res) => {
101
- const { serviceName } = req.params;
102
-
103
- try {
104
- const containerId = runningServices.get(serviceName);
105
- if (!containerId) {
106
- return res.status(404).json({ error: `Service ${serviceName} is not running` });
107
- }
108
-
109
- const container = docker.getContainer(containerId);
110
- await container.stop();
111
- runningServices.delete(serviceName);
112
-
113
- res.status(200).json({
114
- status: 'stopped',
115
- service: serviceName
116
- });
117
- } catch (error) {
118
- console.error(`Error stopping service ${serviceName}:`, error);
119
- res.status(500).json({ error: `Failed to stop service: ${error.message}` });
120
- }
121
- });
122
-
123
- // Get status of all services
124
- app.get("/services", async (req, res) => {
125
- try {
126
- const containers = await docker.listContainers({ all: true });
127
- const services = containers
128
- .filter(container =>
129
- container.Names.some(name => name.match(/_(node-build|web-build|golang-build|python-build|mothership)_/))
130
- )
131
- .map(container => ({
132
- name: container.Names[0].replace('/', ''),
133
- id: container.Id,
134
- status: container.State,
135
- image: container.Image
136
- }));
137
-
138
- res.status(200).json({ services });
139
- } catch (error) {
140
- console.error("Error listing services:", error);
141
- res.status(500).json({ error: `Failed to list services: ${error.message}` });
142
- }
143
- });
144
-
145
- // Trigger a build in a specific service
146
- app.post("/build/:serviceName", async (req, res) => {
147
- const { serviceName } = req.params;
148
-
149
- try {
150
- const containerId = runningServices.get(serviceName);
151
- if (!containerId) {
152
- return res.status(404).json({ error: `Service ${serviceName} is not running` });
153
- }
154
-
155
- const container = docker.getContainer(containerId);
156
-
157
- // Execute the build command in the container
158
- const buildFile = serviceBuildFiles[serviceName];
159
- if (!buildFile) {
160
- return res.status(400).json({ error: `No build file configured for ${serviceName}` });
161
- }
162
-
163
- // Run the TypeScript build file using ts-node
164
- const exec = await container.exec({
165
- Cmd: ['npx', 'ts-node', '--transpile-only', buildFile],
166
- AttachStdout: true,
167
- AttachStderr: true
168
- });
169
-
170
- // Start the exec instance
171
- const stream = await exec.start({ hijack: true, stdin: false });
172
-
173
- // Collect output
174
- let output = '';
175
- stream.on('data', (chunk: Buffer) => {
176
- output += chunk.toString();
177
- });
178
-
179
- stream.on('end', () => {
180
- res.status(200).json({
181
- status: 'build completed',
182
- service: serviceName,
183
- output: output
184
- });
185
- });
186
-
187
- stream.on('error', (error) => {
188
- console.error(`Stream error for ${serviceName}:`, error);
189
- res.status(500).json({ error: `Build stream error: ${error.message}` });
190
- });
191
-
192
- } catch (error) {
193
- console.error(`Error triggering build for ${serviceName}:`, error);
194
- res.status(500).json({ error: `Failed to trigger build: ${error.message}` });
195
- }
196
- });
197
-
198
- // Get build file for each service
199
- app.get("/build-files", (req, res) => {
200
- res.status(200).json(serviceBuildFiles);
201
- });
202
-
203
- // Claim resource endpoint
204
- app.get("/claim", (req, res) => {
205
- const { resource } = req.query;
206
- console.log(`Resource claimed: ${resource}`);
207
- res.status(200).json({ status: 'claimed', resource });
208
- });
209
-
210
- export default (port: number) => {
211
- app.listen(port, () => {
212
- console.log(`Mothership listening on port ${port}`);
213
- });
214
-
215
- return app;
216
- };