@kaitranntt/ccs 8.2.0-dev.4 → 8.2.0-dev.5
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.
|
@@ -5,6 +5,11 @@
|
|
|
5
5
|
* { baseUrl: string, port: number, authMode: "loopback" }
|
|
6
6
|
*
|
|
7
7
|
* authMode is always "loopback" for v1 (auth-enabled unsupported until v1.1).
|
|
8
|
+
*
|
|
9
|
+
* Reuse-first behavior: before starting a new server, launch probes the candidate
|
|
10
|
+
* ports (bar.json port first, then 3000, 3001, 3002, 8000, 8080) for a live CCS
|
|
11
|
+
* server at GET /api/bar/summary. A 200 response means the server is already
|
|
12
|
+
* running; launch reuses it without attempting to bind a new one.
|
|
8
13
|
*/
|
|
9
14
|
export interface BarDiscoveryJson {
|
|
10
15
|
baseUrl: string;
|
|
@@ -16,6 +21,12 @@ export interface DashboardInfo {
|
|
|
16
21
|
baseUrl: string;
|
|
17
22
|
}
|
|
18
23
|
export interface LaunchDeps {
|
|
24
|
+
/**
|
|
25
|
+
* Probe candidate ports for a running CCS server.
|
|
26
|
+
* Returns { port, baseUrl } of the first live server found, or null if none.
|
|
27
|
+
* Never throws — any error is treated as "not found".
|
|
28
|
+
*/
|
|
29
|
+
findRunningServer: () => Promise<DashboardInfo | null>;
|
|
19
30
|
/**
|
|
20
31
|
* Ensure the CCS web-server / dashboard is running.
|
|
21
32
|
* Returns { port, baseUrl } of the running server.
|
|
@@ -34,5 +45,20 @@ export interface LaunchDeps {
|
|
|
34
45
|
* Returns null when the file is absent or malformed.
|
|
35
46
|
*/
|
|
36
47
|
export declare function resolveBarPort(ccsDir: string): number | null;
|
|
48
|
+
/**
|
|
49
|
+
* Probe candidate ports for a running CCS server.
|
|
50
|
+
*
|
|
51
|
+
* Both IPv4 (127.0.0.1) and IPv6 (::1) loopback addresses are probed for
|
|
52
|
+
* each port. This is necessary because `ccs config` starts the server with
|
|
53
|
+
* host 'localhost', which macOS resolves to ::1 — an IPv4-only probe would
|
|
54
|
+
* miss that server and start a redundant second instance.
|
|
55
|
+
*
|
|
56
|
+
* All probes are fired concurrently (cheap loopback requests) so worst-case
|
|
57
|
+
* latency is ~1.5 s (one timeout) rather than N × 1.5 s sequentially.
|
|
58
|
+
* Priority selection is still applied after all results are in: the bar.json
|
|
59
|
+
* port is preferred over the defaults (3000, 3001, 3002, 8000, 8080), and
|
|
60
|
+
* within a port 127.0.0.1 is preferred over [::1].
|
|
61
|
+
*/
|
|
62
|
+
export declare function defaultFindRunningServer(ccsDir: string): Promise<DashboardInfo | null>;
|
|
37
63
|
export declare function handleBarLaunch(_args: string[], deps?: Partial<LaunchDeps>): Promise<void>;
|
|
38
64
|
//# sourceMappingURL=launch-subcommand.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch-subcommand.d.ts","sourceRoot":"","sources":["../../../src/commands/bar/launch-subcommand.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"launch-subcommand.d.ts","sourceRoot":"","sources":["../../../src/commands/bar/launch-subcommand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB;;;;OAIG;IACH,iBAAiB,EAAE,MAAM,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IACvD;;;;OAIG;IACH,eAAe,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9C,sEAAsE;IACtE,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,qEAAqE;IACrE,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB,oFAAoF;IACpF,cAAc,EAAE,MAAM,CAAC;CACxB;AAMD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS5D;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAiD5F;AA4CD,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EAAE,EACf,IAAI,GAAE,OAAO,CAAC,UAAU,CAAM,GAC7B,OAAO,CAAC,IAAI,CAAC,CAyEf"}
|
|
@@ -6,6 +6,11 @@
|
|
|
6
6
|
* { baseUrl: string, port: number, authMode: "loopback" }
|
|
7
7
|
*
|
|
8
8
|
* authMode is always "loopback" for v1 (auth-enabled unsupported until v1.1).
|
|
9
|
+
*
|
|
10
|
+
* Reuse-first behavior: before starting a new server, launch probes the candidate
|
|
11
|
+
* ports (bar.json port first, then 3000, 3001, 3002, 8000, 8080) for a live CCS
|
|
12
|
+
* server at GET /api/bar/summary. A 200 response means the server is already
|
|
13
|
+
* running; launch reuses it without attempting to bind a new one.
|
|
9
14
|
*/
|
|
10
15
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
16
|
if (k2 === undefined) k2 = k;
|
|
@@ -31,7 +36,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
31
36
|
return result;
|
|
32
37
|
};
|
|
33
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
|
-
exports.handleBarLaunch = exports.resolveBarPort = void 0;
|
|
39
|
+
exports.handleBarLaunch = exports.defaultFindRunningServer = exports.resolveBarPort = void 0;
|
|
35
40
|
const fs = __importStar(require("fs"));
|
|
36
41
|
const os = __importStar(require("os"));
|
|
37
42
|
const path = __importStar(require("path"));
|
|
@@ -58,12 +63,76 @@ exports.resolveBarPort = resolveBarPort;
|
|
|
58
63
|
// ---------------------------------------------------------------------------
|
|
59
64
|
// Default production dependencies
|
|
60
65
|
// ---------------------------------------------------------------------------
|
|
66
|
+
/**
|
|
67
|
+
* Probe candidate ports for a running CCS server.
|
|
68
|
+
*
|
|
69
|
+
* Both IPv4 (127.0.0.1) and IPv6 (::1) loopback addresses are probed for
|
|
70
|
+
* each port. This is necessary because `ccs config` starts the server with
|
|
71
|
+
* host 'localhost', which macOS resolves to ::1 — an IPv4-only probe would
|
|
72
|
+
* miss that server and start a redundant second instance.
|
|
73
|
+
*
|
|
74
|
+
* All probes are fired concurrently (cheap loopback requests) so worst-case
|
|
75
|
+
* latency is ~1.5 s (one timeout) rather than N × 1.5 s sequentially.
|
|
76
|
+
* Priority selection is still applied after all results are in: the bar.json
|
|
77
|
+
* port is preferred over the defaults (3000, 3001, 3002, 8000, 8080), and
|
|
78
|
+
* within a port 127.0.0.1 is preferred over [::1].
|
|
79
|
+
*/
|
|
80
|
+
async function defaultFindRunningServer(ccsDir) {
|
|
81
|
+
const { request } = await Promise.resolve().then(() => __importStar(require('undici')));
|
|
82
|
+
/**
|
|
83
|
+
* Probe a single URL. Resolves to { ok: true } on HTTP 200, { ok: false }
|
|
84
|
+
* on any other status or error (connection refused, timeout, etc.).
|
|
85
|
+
* Never rejects — all errors are absorbed so Promise.all never short-circuits.
|
|
86
|
+
*/
|
|
87
|
+
async function probe(url) {
|
|
88
|
+
try {
|
|
89
|
+
const { statusCode, body } = await request(url, {
|
|
90
|
+
method: 'GET',
|
|
91
|
+
headersTimeout: 1500,
|
|
92
|
+
bodyTimeout: 1500,
|
|
93
|
+
});
|
|
94
|
+
// Drain the body to avoid hanging sockets regardless of status.
|
|
95
|
+
// body.dump() is not available in Bun's undici shim; body.text() works
|
|
96
|
+
// cross-runtime and fully consumes the response stream.
|
|
97
|
+
await body.text();
|
|
98
|
+
return { ok: statusCode === 200 };
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return { ok: false };
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const barJsonPort = resolveBarPort(ccsDir);
|
|
105
|
+
const base = [3000, 3001, 3002, 8000, 8080];
|
|
106
|
+
const candidates = barJsonPort !== null ? [barJsonPort, ...base.filter((p) => p !== barJsonPort)] : base;
|
|
107
|
+
// Build the ordered list of (port, host, baseUrl) tuples. Within each port,
|
|
108
|
+
// IPv4 comes before IPv6 to preserve the existing priority semantics.
|
|
109
|
+
const probeTargets = candidates.flatMap((port) => [
|
|
110
|
+
{ port, baseUrl: `http://127.0.0.1:${port}`, url: `http://127.0.0.1:${port}/api/bar/summary` },
|
|
111
|
+
{ port, baseUrl: `http://[::1]:${port}`, url: `http://[::1]:${port}/api/bar/summary` },
|
|
112
|
+
]);
|
|
113
|
+
// Fire all probes concurrently. Each probe resolves (never rejects), so
|
|
114
|
+
// Promise.all collects all results without short-circuiting on failure.
|
|
115
|
+
const results = await Promise.all(probeTargets.map((t) => probe(t.url)));
|
|
116
|
+
// Walk the results in priority order and return the first successful hit.
|
|
117
|
+
for (let i = 0; i < probeTargets.length; i++) {
|
|
118
|
+
if (results[i].ok) {
|
|
119
|
+
const { port, baseUrl } = probeTargets[i];
|
|
120
|
+
return { port, baseUrl };
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
exports.defaultFindRunningServer = defaultFindRunningServer;
|
|
61
126
|
async function defaultEnsureDashboard() {
|
|
62
127
|
// Reuse the same startup path as `ccs config`:
|
|
63
128
|
// find a free port then start the web-server via startServer().
|
|
64
129
|
const getPort = (await Promise.resolve().then(() => __importStar(require('get-port')))).default;
|
|
65
130
|
const { startServer } = await Promise.resolve().then(() => __importStar(require('../../web-server')));
|
|
66
|
-
|
|
131
|
+
// Pass host: '127.0.0.1' so getPort probes the same address that startServer
|
|
132
|
+
// will bind. On macOS, a wildcard bind and a specific 127.0.0.1 bind are
|
|
133
|
+
// independent: getPort without a host can return 3000 "free" while a live
|
|
134
|
+
// CCS server already holds 127.0.0.1:3000, causing EADDRINUSE on startServer.
|
|
135
|
+
const port = await getPort({ port: [3000, 3001, 3002, 8000, 8080], host: '127.0.0.1' });
|
|
67
136
|
// Bind IPv4 loopback explicitly. Without a host, startServer defaults to
|
|
68
137
|
// 'localhost', which on macOS resolves to ::1 (IPv6) — but bar.json's baseUrl
|
|
69
138
|
// (and the Swift app) use 127.0.0.1, so the app could not reach its own server.
|
|
@@ -94,16 +163,34 @@ async function handleBarLaunch(_args, deps = {}) {
|
|
|
94
163
|
const openApp = deps.openApp ?? defaultOpenApp;
|
|
95
164
|
const ccsDir = (deps.getCcsDir ?? defaultGetCcsDir)();
|
|
96
165
|
const appInstallPath = deps.appInstallPath ?? DEFAULT_APP_INSTALL_PATH;
|
|
97
|
-
//
|
|
98
|
-
|
|
166
|
+
// Wire findRunningServer after ccsDir is resolved so the default impl can
|
|
167
|
+
// read bar.json from the correct directory.
|
|
168
|
+
const findRunningServer = deps.findRunningServer ?? (() => defaultFindRunningServer(ccsDir));
|
|
169
|
+
// 1. Try to reuse an already-running CCS server; fall back to starting one.
|
|
170
|
+
// Probe errors are treated as "not found" — they never abort the launch flow.
|
|
171
|
+
let running = null;
|
|
99
172
|
try {
|
|
100
|
-
|
|
173
|
+
running = await findRunningServer();
|
|
101
174
|
}
|
|
102
|
-
catch
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
175
|
+
catch {
|
|
176
|
+
// Any probe error counts as null; ensureDashboard() is the fallback.
|
|
177
|
+
}
|
|
178
|
+
let dashboardInfo;
|
|
179
|
+
let reused = false;
|
|
180
|
+
if (running !== null) {
|
|
181
|
+
dashboardInfo = running;
|
|
182
|
+
reused = true;
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
try {
|
|
186
|
+
dashboardInfo = await ensureDashboard();
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
190
|
+
console.error(`[X] Could not start CCS web-server: ${msg}`);
|
|
191
|
+
console.error('[i] Run `ccs config` to start the dashboard manually.');
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
107
194
|
}
|
|
108
195
|
// 2. Write bar.json — this is the single source of discovery for the Swift app.
|
|
109
196
|
const barJson = {
|
|
@@ -120,7 +207,12 @@ async function handleBarLaunch(_args, deps = {}) {
|
|
|
120
207
|
console.error(`[X] Failed to write bar.json: ${msg}`);
|
|
121
208
|
return;
|
|
122
209
|
}
|
|
123
|
-
|
|
210
|
+
if (reused) {
|
|
211
|
+
console.log(`[OK] Reusing running CCS web-server at ${dashboardInfo.baseUrl}`);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
console.log(`[OK] CCS web-server running at ${dashboardInfo.baseUrl}`);
|
|
215
|
+
}
|
|
124
216
|
console.log(`[i] Discovery file written: ${path.join(ccsDir, 'bar.json')}`);
|
|
125
217
|
// 3. Open the app.
|
|
126
218
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch-subcommand.js","sourceRoot":"","sources":["../../../src/commands/bar/launch-subcommand.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"launch-subcommand.js","sourceRoot":"","sources":["../../../src/commands/bar/launch-subcommand.ts"],"names":[],"mappings":"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"}
|