@flarestudio/fcc-workbench 1.0.23 → 1.0.24
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/dist/modules/docker.d.ts +0 -17
- package/dist/modules/docker.js +66 -85
- package/dist/modules/docker.js.map +1 -1
- package/package.json +1 -1
package/dist/modules/docker.d.ts
CHANGED
|
@@ -1,21 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Run a docker-compose command (up, down, logs, build).
|
|
3
|
-
* Streams output directly to the terminal.
|
|
4
|
-
*/
|
|
5
1
|
export declare function runDockerCompose(args: string[]): Promise<void>;
|
|
6
2
|
export declare function stopStack(): Promise<void>;
|
|
7
3
|
export declare function tailServiceLogs(service: string, lines?: number): Promise<string>;
|
|
8
4
|
export declare function findContainersUsingHostPorts(ports: number[]): Promise<string[]>;
|
|
9
|
-
/**
|
|
10
|
-
* Check if the ext-proxy is healthy by polling its /info endpoint.
|
|
11
|
-
* Returns true when ready, throws after timeout.
|
|
12
|
-
*/
|
|
13
|
-
export declare function waitForProxy(proxyUrl?: string, timeoutMs?: number): Promise<boolean>;
|
|
14
|
-
/**
|
|
15
|
-
* Fetch the TEE public key and version info from the running ext-proxy.
|
|
16
|
-
* The /info endpoint lives on the EXTERNAL port (6676).
|
|
17
|
-
* Retries because the external server starts after the DB sync completes.
|
|
18
|
-
*/
|
|
19
5
|
export declare function fetchProxyInfo(proxyUrl?: string, retries?: number, delayMs?: number): Promise<{
|
|
20
6
|
publicKey: string;
|
|
21
7
|
platform: number;
|
|
@@ -24,7 +10,4 @@ export declare function fetchProxyInfo(proxyUrl?: string, retries?: number, dela
|
|
|
24
10
|
initialOwner: string;
|
|
25
11
|
version: string;
|
|
26
12
|
}>;
|
|
27
|
-
/**
|
|
28
|
-
* Check if Docker Desktop is running by pinging docker info.
|
|
29
|
-
*/
|
|
30
13
|
export declare function isDockerRunning(): Promise<boolean>;
|
package/dist/modules/docker.js
CHANGED
|
@@ -1,82 +1,96 @@
|
|
|
1
1
|
import { spawn } from 'child_process';
|
|
2
|
-
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
function projectRoot() {
|
|
3
5
|
try {
|
|
4
|
-
|
|
6
|
+
const cwd = process.cwd();
|
|
7
|
+
const yaml = path.join(cwd, 'docker-compose.yml');
|
|
8
|
+
const yml = path.join(cwd, 'docker-compose.yaml');
|
|
9
|
+
if (fs.existsSync(yaml))
|
|
10
|
+
return cwd;
|
|
11
|
+
if (fs.existsSync(yml))
|
|
12
|
+
return cwd;
|
|
13
|
+
return cwd;
|
|
5
14
|
}
|
|
6
15
|
catch {
|
|
7
|
-
// If the current directory was deleted, Node may start with an invalid cwd.
|
|
8
|
-
// For docker compose commands we can omit cwd and let it inherit a valid one,
|
|
9
|
-
// but for compose-file discovery we prefer the caller to be in the project dir.
|
|
10
16
|
return undefined;
|
|
11
17
|
}
|
|
12
18
|
}
|
|
13
|
-
function
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
function composeFileArgs(cwd) {
|
|
20
|
+
if (!cwd)
|
|
21
|
+
return [];
|
|
22
|
+
const yaml = path.join(cwd, 'docker-compose.yml');
|
|
23
|
+
const yml = path.join(cwd, 'docker-compose.yaml');
|
|
24
|
+
if (fs.existsSync(yaml))
|
|
25
|
+
return ['-f', yaml];
|
|
26
|
+
if (fs.existsSync(yml))
|
|
27
|
+
return ['-f', yml];
|
|
28
|
+
return [];
|
|
22
29
|
}
|
|
23
|
-
|
|
24
|
-
* Run a docker-compose command (up, down, logs, build).
|
|
25
|
-
* Streams output directly to the terminal.
|
|
26
|
-
*/
|
|
27
|
-
export function runDockerCompose(args) {
|
|
30
|
+
function run(command, args, cwd, inherit = true) {
|
|
28
31
|
return new Promise((resolve, reject) => {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
stdio: 'inherit',
|
|
32
|
+
const child = spawn(command, args, {
|
|
33
|
+
cwd,
|
|
32
34
|
shell: false,
|
|
33
|
-
|
|
34
|
-
});
|
|
35
|
-
child.on('error', (err) => {
|
|
36
|
-
// Fallback to v1 if v2 not found
|
|
37
|
-
if (err.message.includes('ENOENT') || err.message.includes('not found')) {
|
|
38
|
-
const fallback = spawn('docker-compose', args, {
|
|
39
|
-
stdio: 'inherit',
|
|
40
|
-
shell: false,
|
|
41
|
-
cwd: safeCwd(),
|
|
42
|
-
});
|
|
43
|
-
fallback.on('error', reject);
|
|
44
|
-
fallback.on('close', (code) => {
|
|
45
|
-
if (code === 0)
|
|
46
|
-
resolve();
|
|
47
|
-
else
|
|
48
|
-
reject(new Error(`docker-compose exited with code ${code}`));
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
reject(err);
|
|
53
|
-
}
|
|
35
|
+
stdio: inherit ? 'inherit' : ['ignore', 'pipe', 'pipe'],
|
|
54
36
|
});
|
|
37
|
+
child.on('error', reject);
|
|
55
38
|
child.on('close', (code) => {
|
|
56
39
|
if (code === 0)
|
|
57
40
|
resolve();
|
|
58
41
|
else
|
|
59
|
-
reject(new Error(
|
|
42
|
+
reject(new Error(`${command} exited with code ${code}`));
|
|
60
43
|
});
|
|
61
44
|
});
|
|
62
45
|
}
|
|
46
|
+
function runCapture(command, args, cwd) {
|
|
47
|
+
return new Promise((resolve) => {
|
|
48
|
+
const child = spawn(command, args, {
|
|
49
|
+
cwd,
|
|
50
|
+
shell: false,
|
|
51
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
52
|
+
});
|
|
53
|
+
let out = '';
|
|
54
|
+
child.stdout?.on('data', (d) => (out += d.toString()));
|
|
55
|
+
child.stderr?.on('data', (d) => (out += d.toString()));
|
|
56
|
+
child.on('error', () => resolve({ code: 1, out }));
|
|
57
|
+
child.on('close', (code) => resolve({ code: code ?? 1, out: out.trim() }));
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
export async function runDockerCompose(args) {
|
|
61
|
+
const cwd = projectRoot();
|
|
62
|
+
const fileArgs = composeFileArgs(cwd);
|
|
63
|
+
try {
|
|
64
|
+
await run('docker', ['compose', ...fileArgs, ...args], cwd);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
try {
|
|
68
|
+
await run('docker-compose', [...fileArgs, ...args], cwd);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
throw err;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
63
75
|
export async function stopStack() {
|
|
64
76
|
await runDockerCompose(['down']);
|
|
65
77
|
}
|
|
66
78
|
export async function tailServiceLogs(service, lines = 200) {
|
|
67
|
-
const
|
|
79
|
+
const cwd = projectRoot();
|
|
80
|
+
const fileArgs = composeFileArgs(cwd);
|
|
81
|
+
const { out } = await runCapture('docker', ['compose', ...fileArgs, 'logs', '--no-color', '--tail', String(lines), service], cwd);
|
|
68
82
|
return out;
|
|
69
83
|
}
|
|
70
84
|
export async function findContainersUsingHostPorts(ports) {
|
|
71
|
-
const { out } = await runCapture('docker', ['ps', '--format', '{{.Names}}
|
|
85
|
+
const { out } = await runCapture('docker', ['ps', '--format', '{{.Names}}\t{{.Ports}}']);
|
|
72
86
|
if (!out)
|
|
73
87
|
return [];
|
|
74
|
-
const lines = out.split('\n').map((
|
|
88
|
+
const lines = out.split('\n').map((line) => line.trim()).filter(Boolean);
|
|
75
89
|
const matches = [];
|
|
76
90
|
for (const line of lines) {
|
|
77
91
|
const [name, portsText = ''] = line.split('\t');
|
|
78
|
-
for (const
|
|
79
|
-
if (portsText.includes(`:${
|
|
92
|
+
for (const port of ports) {
|
|
93
|
+
if (portsText.includes(`:${port}->`)) {
|
|
80
94
|
matches.push(`${name} (${portsText})`);
|
|
81
95
|
break;
|
|
82
96
|
}
|
|
@@ -84,30 +98,6 @@ export async function findContainersUsingHostPorts(ports) {
|
|
|
84
98
|
}
|
|
85
99
|
return matches;
|
|
86
100
|
}
|
|
87
|
-
/**
|
|
88
|
-
* Check if the ext-proxy is healthy by polling its /info endpoint.
|
|
89
|
-
* Returns true when ready, throws after timeout.
|
|
90
|
-
*/
|
|
91
|
-
export async function waitForProxy(proxyUrl = 'http://localhost:6675', timeoutMs = 60000) {
|
|
92
|
-
const deadline = Date.now() + timeoutMs;
|
|
93
|
-
while (Date.now() < deadline) {
|
|
94
|
-
try {
|
|
95
|
-
const res = await fetch(`${proxyUrl}/info`);
|
|
96
|
-
if (res.ok)
|
|
97
|
-
return true;
|
|
98
|
-
}
|
|
99
|
-
catch {
|
|
100
|
-
// not ready yet
|
|
101
|
-
}
|
|
102
|
-
await new Promise((r) => setTimeout(r, 2000));
|
|
103
|
-
}
|
|
104
|
-
throw new Error(`Proxy at ${proxyUrl} did not become healthy within ${timeoutMs / 1000}s`);
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Fetch the TEE public key and version info from the running ext-proxy.
|
|
108
|
-
* The /info endpoint lives on the EXTERNAL port (6676).
|
|
109
|
-
* Retries because the external server starts after the DB sync completes.
|
|
110
|
-
*/
|
|
111
101
|
export async function fetchProxyInfo(proxyUrl = 'http://localhost:6676', retries = 15, delayMs = 3000) {
|
|
112
102
|
for (let i = 0; i < retries; i++) {
|
|
113
103
|
try {
|
|
@@ -116,7 +106,6 @@ export async function fetchProxyInfo(proxyUrl = 'http://localhost:6676', retries
|
|
|
116
106
|
const data = await res.json();
|
|
117
107
|
const teeInfo = data.teeInfo ?? data.tee_info ?? {};
|
|
118
108
|
const machineData = data.machineData ?? data.machine_data ?? {};
|
|
119
|
-
// Extract public key (concatenate x and y)
|
|
120
109
|
const pkObj = machineData.publicKey ?? teeInfo.publicKey ?? {};
|
|
121
110
|
const x = (pkObj.x ?? '').replace('0x', '');
|
|
122
111
|
const y = (pkObj.y ?? '').replace('0x', '');
|
|
@@ -130,14 +119,10 @@ export async function fetchProxyInfo(proxyUrl = 'http://localhost:6676', retries
|
|
|
130
119
|
version: teeInfo.version ?? machineData.version ?? '',
|
|
131
120
|
};
|
|
132
121
|
}
|
|
133
|
-
if (res.status !== 503)
|
|
122
|
+
if (res.status !== 503)
|
|
134
123
|
throw new Error(`Proxy /info returned ${res.status}`);
|
|
135
|
-
}
|
|
136
124
|
}
|
|
137
125
|
catch (err) {
|
|
138
|
-
// These all mean the external server hasn't started yet — keep retrying.
|
|
139
|
-
// NOTE: undici wraps the real error: err.message = "fetch failed", err.cause.message = "read ECONNRESET"
|
|
140
|
-
// So we must check BOTH, not one-or-the-other.
|
|
141
126
|
const msg = `${err?.message ?? ''} ${err?.cause?.message ?? ''}`.toLowerCase();
|
|
142
127
|
const isTransient = msg.includes('econnreset') ||
|
|
143
128
|
msg.includes('und_err_socket') ||
|
|
@@ -148,16 +133,12 @@ export async function fetchProxyInfo(proxyUrl = 'http://localhost:6676', retries
|
|
|
148
133
|
if (!isTransient)
|
|
149
134
|
throw err;
|
|
150
135
|
}
|
|
151
|
-
if (i < retries - 1)
|
|
136
|
+
if (i < retries - 1)
|
|
152
137
|
await new Promise((r) => setTimeout(r, delayMs));
|
|
153
|
-
}
|
|
154
138
|
}
|
|
155
139
|
throw new Error('Proxy /info did not become available. Is the TEE stack running and synced?');
|
|
156
140
|
}
|
|
157
|
-
|
|
158
|
-
* Check if Docker Desktop is running by pinging docker info.
|
|
159
|
-
*/
|
|
160
|
-
export function isDockerRunning() {
|
|
141
|
+
export async function isDockerRunning() {
|
|
161
142
|
return new Promise((resolve) => {
|
|
162
143
|
const child = spawn('docker', ['info'], { stdio: 'pipe', shell: false });
|
|
163
144
|
child.on('close', (code) => resolve(code === 0));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/modules/docker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/modules/docker.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED