ttyd-mux 0.3.0 → 0.4.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.
- package/README.md +105 -1
- package/dist/caddy/client.d.ts +3 -55
- package/dist/caddy/client.d.ts.map +1 -1
- package/dist/caddy/client.js +0 -73
- package/dist/caddy/client.js.map +1 -1
- package/dist/caddy/route-builder.d.ts +49 -0
- package/dist/caddy/route-builder.d.ts.map +1 -0
- package/dist/caddy/route-builder.js +175 -0
- package/dist/caddy/route-builder.js.map +1 -0
- package/dist/caddy/types.d.ts +27 -0
- package/dist/caddy/types.d.ts.map +1 -0
- package/dist/caddy/types.js +3 -0
- package/dist/caddy/types.js.map +1 -0
- package/dist/client/api-client.d.ts +26 -0
- package/dist/client/api-client.d.ts.map +1 -0
- package/dist/client/api-client.js +62 -0
- package/dist/client/api-client.js.map +1 -0
- package/dist/client/daemon-client.d.ts +48 -0
- package/dist/client/daemon-client.d.ts.map +1 -0
- package/dist/client/daemon-client.js +205 -0
- package/dist/client/daemon-client.js.map +1 -0
- package/dist/client/index.d.ts +2 -10
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +4 -136
- package/dist/client/index.js.map +1 -1
- package/dist/commands/attach.js +3 -4
- package/dist/commands/attach.js.map +1 -1
- package/dist/commands/caddy.d.ts +2 -1
- package/dist/commands/caddy.d.ts.map +1 -1
- package/dist/commands/caddy.js +227 -75
- package/dist/commands/caddy.js.map +1 -1
- package/dist/commands/daemon.js.map +1 -1
- package/dist/commands/deploy.d.ts +7 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +100 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/doctor.d.ts +8 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +180 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/down.d.ts.map +1 -1
- package/dist/commands/down.js +11 -0
- package/dist/commands/down.js.map +1 -1
- package/dist/commands/reload.d.ts +14 -0
- package/dist/commands/reload.d.ts.map +1 -0
- package/dist/commands/reload.js +50 -0
- package/dist/commands/reload.js.map +1 -0
- package/dist/commands/shutdown.d.ts +2 -1
- package/dist/commands/shutdown.d.ts.map +1 -1
- package/dist/commands/shutdown.js +8 -2
- package/dist/commands/shutdown.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +16 -3
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/stop.js.map +1 -1
- package/dist/commands/up.js.map +1 -1
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +9 -2
- package/dist/config/config.js.map +1 -1
- package/dist/config/index.d.ts +3 -3
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +6 -3
- package/dist/config/index.js.map +1 -1
- package/dist/config/state-store.d.ts +27 -0
- package/dist/config/state-store.d.ts.map +1 -0
- package/dist/config/state-store.js +55 -0
- package/dist/config/state-store.js.map +1 -0
- package/dist/config/state.d.ts +6 -0
- package/dist/config/state.d.ts.map +1 -1
- package/dist/config/state.js +49 -14
- package/dist/config/state.js.map +1 -1
- package/dist/config/types.d.ts +35 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +23 -1
- package/dist/config/types.js.map +1 -1
- package/dist/daemon/api-handler.d.ts +5 -0
- package/dist/daemon/api-handler.d.ts.map +1 -0
- package/dist/daemon/api-handler.js +97 -0
- package/dist/daemon/api-handler.js.map +1 -0
- package/dist/daemon/config-manager.d.ts +43 -0
- package/dist/daemon/config-manager.d.ts.map +1 -0
- package/dist/daemon/config-manager.js +154 -0
- package/dist/daemon/config-manager.js.map +1 -0
- package/dist/daemon/http-proxy.d.ts +27 -0
- package/dist/daemon/http-proxy.d.ts.map +1 -0
- package/dist/daemon/http-proxy.js +110 -0
- package/dist/daemon/http-proxy.js.map +1 -0
- package/dist/daemon/ime-helper.d.ts +1 -1
- package/dist/daemon/ime-helper.d.ts.map +1 -1
- package/dist/daemon/ime-helper.js +284 -10
- package/dist/daemon/ime-helper.js.map +1 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +134 -29
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/portal-utils.d.ts +20 -0
- package/dist/daemon/portal-utils.d.ts.map +1 -0
- package/dist/daemon/portal-utils.js +109 -0
- package/dist/daemon/portal-utils.js.map +1 -0
- package/dist/daemon/portal.d.ts.map +1 -1
- package/dist/daemon/portal.js +20 -77
- package/dist/daemon/portal.js.map +1 -1
- package/dist/daemon/pwa.d.ts +52 -0
- package/dist/daemon/pwa.d.ts.map +1 -0
- package/dist/daemon/pwa.js +229 -0
- package/dist/daemon/pwa.js.map +1 -0
- package/dist/daemon/router.d.ts +15 -0
- package/dist/daemon/router.d.ts.map +1 -0
- package/dist/daemon/router.js +164 -0
- package/dist/daemon/router.js.map +1 -0
- package/dist/daemon/server.d.ts +15 -3
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +23 -271
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/session-manager.d.ts +44 -10
- package/dist/daemon/session-manager.d.ts.map +1 -1
- package/dist/daemon/session-manager.js +125 -49
- package/dist/daemon/session-manager.js.map +1 -1
- package/dist/daemon/session-resolver.d.ts +1 -1
- package/dist/daemon/session-resolver.d.ts.map +1 -1
- package/dist/daemon/session-resolver.js.map +1 -1
- package/dist/daemon/toolbar/config.d.ts +13 -0
- package/dist/daemon/toolbar/config.d.ts.map +1 -0
- package/dist/daemon/toolbar/config.js +13 -0
- package/dist/daemon/toolbar/config.js.map +1 -0
- package/dist/daemon/toolbar/index.d.ts +43 -0
- package/dist/daemon/toolbar/index.d.ts.map +1 -0
- package/dist/daemon/toolbar/index.js +835 -0
- package/dist/daemon/toolbar/index.js.map +1 -0
- package/dist/daemon/toolbar/styles.d.ts +5 -0
- package/dist/daemon/toolbar/styles.d.ts.map +1 -0
- package/dist/daemon/toolbar/styles.js +278 -0
- package/dist/daemon/toolbar/styles.js.map +1 -0
- package/dist/daemon/toolbar/template.d.ts +6 -0
- package/dist/daemon/toolbar/template.d.ts.map +1 -0
- package/dist/daemon/toolbar/template.js +45 -0
- package/dist/daemon/toolbar/template.js.map +1 -0
- package/dist/daemon/ws-proxy.d.ts +17 -0
- package/dist/daemon/ws-proxy.d.ts.map +1 -0
- package/dist/daemon/ws-proxy.js +95 -0
- package/dist/daemon/ws-proxy.js.map +1 -0
- package/dist/deploy/caddyfile.d.ts +8 -0
- package/dist/deploy/caddyfile.d.ts.map +1 -0
- package/dist/deploy/caddyfile.js +62 -0
- package/dist/deploy/caddyfile.js.map +1 -0
- package/dist/deploy/deploy-script.d.ts +8 -0
- package/dist/deploy/deploy-script.d.ts.map +1 -0
- package/dist/deploy/deploy-script.js +72 -0
- package/dist/deploy/deploy-script.js.map +1 -0
- package/dist/deploy/static-portal.d.ts +3 -0
- package/dist/deploy/static-portal.d.ts.map +1 -0
- package/dist/deploy/static-portal.js +59 -0
- package/dist/deploy/static-portal.js.map +1 -0
- package/dist/index.js +38 -9
- package/dist/index.js.map +1 -1
- package/dist/test-setup.d.ts +19 -0
- package/dist/test-setup.d.ts.map +1 -0
- package/dist/test-setup.js +33 -0
- package/dist/test-setup.js.map +1 -0
- package/dist/tmux.d.ts +28 -1
- package/dist/tmux.d.ts.map +1 -1
- package/dist/tmux.js +37 -32
- package/dist/tmux.js.map +1 -1
- package/dist/ui.d.ts +2 -1
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +16 -9
- package/dist/ui.js.map +1 -1
- package/dist/utils/errors.d.ts +4 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +9 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +53 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/process-runner.d.ts +50 -0
- package/dist/utils/process-runner.d.ts.map +1 -0
- package/dist/utils/process-runner.js +73 -0
- package/dist/utils/process-runner.js.map +1 -0
- package/dist/utils/socket-client.d.ts +24 -0
- package/dist/utils/socket-client.d.ts.map +1 -0
- package/dist/utils/socket-client.js +30 -0
- package/dist/utils/socket-client.js.map +1 -0
- package/dist/utils/tmux-client.d.ts +57 -0
- package/dist/utils/tmux-client.d.ts.map +1 -0
- package/dist/utils/tmux-client.js +117 -0
- package/dist/utils/tmux-client.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +4 -0
- package/dist/version.js.map +1 -0
- package/package.json +6 -2
- package/dist/daemon/proxy.d.ts +0 -7
- package/dist/daemon/proxy.d.ts.map +0 -1
- package/dist/daemon/proxy.js +0 -17
- package/dist/daemon/proxy.js.map +0 -1
package/dist/commands/caddy.js
CHANGED
|
@@ -1,72 +1,96 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { connectToCaddy } from '../caddy/client.js';
|
|
2
|
+
import { createPortalRoute, createProxyRoute, createSessionRoute, filterOutSessionRoutes, findServerForHost, findTtydMuxRoutes, getSessionRoutes, routeExists } from '../caddy/route-builder.js';
|
|
3
|
+
import { getSessions, isDaemonRunning } from '../client/index.js';
|
|
2
4
|
import { loadConfig } from '../config/config.js';
|
|
3
|
-
import { handleCliError } from '../utils/errors.js';
|
|
5
|
+
import { handleCliError, requireHostname } from '../utils/errors.js';
|
|
6
|
+
function getHostname(options, config) {
|
|
7
|
+
return options.hostname ?? config.hostname;
|
|
8
|
+
}
|
|
9
|
+
function getAdminApi(options, config) {
|
|
10
|
+
return options.adminApi ?? config.caddy_admin_api;
|
|
11
|
+
}
|
|
4
12
|
// Generate snippet for Caddyfile users
|
|
5
|
-
export function caddySnippetCommand(options) {
|
|
13
|
+
export async function caddySnippetCommand(options) {
|
|
6
14
|
const config = loadConfig(options.config);
|
|
7
15
|
const basePath = config.base_path;
|
|
8
16
|
const daemonPort = config.daemon_port;
|
|
17
|
+
const proxyMode = config.proxy_mode;
|
|
9
18
|
console.log('# Add this to your Caddyfile inside your site block:');
|
|
10
19
|
console.log('');
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
20
|
+
if (proxyMode === 'proxy') {
|
|
21
|
+
// Proxy mode: single route proxies all to daemon
|
|
22
|
+
console.log(`handle ${basePath}/* {`);
|
|
23
|
+
console.log(` reverse_proxy localhost:${daemonPort}`);
|
|
24
|
+
console.log('}');
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
// Static mode: portal/API to daemon, sessions direct to ttyd
|
|
28
|
+
console.log('# Portal and API (via daemon)');
|
|
29
|
+
console.log(`handle ${basePath} {`);
|
|
30
|
+
console.log(` reverse_proxy localhost:${daemonPort}`);
|
|
31
|
+
console.log('}');
|
|
32
|
+
console.log('');
|
|
33
|
+
console.log(`handle ${basePath}/ {`);
|
|
34
|
+
console.log(` reverse_proxy localhost:${daemonPort}`);
|
|
35
|
+
console.log('}');
|
|
36
|
+
console.log('');
|
|
37
|
+
console.log(`handle ${basePath}/api/* {`);
|
|
38
|
+
console.log(` reverse_proxy localhost:${daemonPort}`);
|
|
39
|
+
console.log('}');
|
|
40
|
+
// Get current sessions if daemon is running
|
|
41
|
+
if (await isDaemonRunning()) {
|
|
42
|
+
const sessions = await getSessions(config);
|
|
43
|
+
if (sessions.length > 0) {
|
|
44
|
+
console.log('');
|
|
45
|
+
console.log('# Sessions (direct to ttyd)');
|
|
46
|
+
for (const session of sessions) {
|
|
47
|
+
console.log('');
|
|
48
|
+
console.log(`# Session: ${session.name}`);
|
|
49
|
+
console.log(`handle ${session.fullPath}/* {`);
|
|
50
|
+
console.log(` reverse_proxy localhost:${session.port}`);
|
|
51
|
+
console.log('}');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
console.log('');
|
|
57
|
+
console.log('# Note: Daemon is not running. Start sessions and re-run to see session routes.');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
14
60
|
}
|
|
15
61
|
// Setup route via Admin API
|
|
16
62
|
export async function caddySetupCommand(options) {
|
|
17
63
|
const config = loadConfig(options.config);
|
|
18
|
-
const adminApi = options
|
|
19
|
-
const hostname = options
|
|
20
|
-
|
|
21
|
-
console.error('Error: --hostname is required');
|
|
22
|
-
process.exit(1);
|
|
23
|
-
}
|
|
64
|
+
const adminApi = getAdminApi(options, config);
|
|
65
|
+
const hostname = getHostname(options, config);
|
|
66
|
+
requireHostname(hostname);
|
|
24
67
|
const basePath = config.base_path;
|
|
25
68
|
const daemonPort = config.daemon_port;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
client = await connectToCaddy(adminApi);
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
console.error(`Error: Cannot connect to Caddy Admin API at ${adminApi}`);
|
|
32
|
-
console.error('Make sure Caddy is running and admin API is enabled.');
|
|
33
|
-
process.exit(1);
|
|
34
|
-
}
|
|
69
|
+
const proxyMode = config.proxy_mode;
|
|
70
|
+
const client = await connectToCaddyOrExit(adminApi);
|
|
35
71
|
try {
|
|
36
72
|
const servers = await client.getServers();
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
if (
|
|
42
|
-
|
|
43
|
-
|
|
73
|
+
const serverInfo = findServerForHost(servers, hostname);
|
|
74
|
+
if (proxyMode === 'proxy') {
|
|
75
|
+
// Proxy mode: single proxy route
|
|
76
|
+
const ttydMuxRoute = createProxyRoute(hostname, basePath, `localhost:${daemonPort}`);
|
|
77
|
+
if (serverInfo) {
|
|
78
|
+
if (routeExists(serverInfo.server, hostname, basePath)) {
|
|
79
|
+
console.log(`Route for ${hostname}${basePath}/* already exists.`);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const existingRoutes = serverInfo.server.routes ?? [];
|
|
83
|
+
await client.updateServerRoutes(serverInfo.name, [ttydMuxRoute, ...existingRoutes]);
|
|
84
|
+
console.log(`Added route: ${hostname}${basePath}/* -> localhost:${daemonPort}`);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
await createNewServer(client, hostname, [ttydMuxRoute]);
|
|
88
|
+
console.log(`Created server for ${hostname} with route: ${basePath}/* -> localhost:${daemonPort}`);
|
|
44
89
|
}
|
|
45
|
-
// Prepend route (higher priority)
|
|
46
|
-
const existingRoutes = serverInfo.server.routes ?? [];
|
|
47
|
-
await client.updateServerRoutes(serverInfo.name, [ttydMuxRoute, ...existingRoutes]);
|
|
48
|
-
console.log(`Added route: ${hostname}${basePath}/* -> localhost:${daemonPort}`);
|
|
49
90
|
}
|
|
50
91
|
else {
|
|
51
|
-
//
|
|
52
|
-
|
|
53
|
-
listen: [':443'],
|
|
54
|
-
routes: [
|
|
55
|
-
ttydMuxRoute,
|
|
56
|
-
{
|
|
57
|
-
// Fallback route
|
|
58
|
-
handle: [
|
|
59
|
-
{
|
|
60
|
-
handler: 'static_response',
|
|
61
|
-
body: 'OK'
|
|
62
|
-
}
|
|
63
|
-
]
|
|
64
|
-
}
|
|
65
|
-
]
|
|
66
|
-
};
|
|
67
|
-
const serverName = `srv_${hostname.replace(/\./g, '_')}`;
|
|
68
|
-
await client.createServer(serverName, newServer);
|
|
69
|
-
console.log(`Created server for ${hostname} with route: ${basePath}/* -> localhost:${daemonPort}`);
|
|
92
|
+
// Static mode: portal route + session routes
|
|
93
|
+
await setupStaticMode(client, config, hostname, basePath, daemonPort, serverInfo);
|
|
70
94
|
}
|
|
71
95
|
}
|
|
72
96
|
catch (error) {
|
|
@@ -74,27 +98,67 @@ export async function caddySetupCommand(options) {
|
|
|
74
98
|
process.exit(1);
|
|
75
99
|
}
|
|
76
100
|
}
|
|
101
|
+
async function setupStaticMode(client, config, hostname, basePath, daemonPort, serverInfo) {
|
|
102
|
+
const routes = [];
|
|
103
|
+
// Portal route (for /, /api/*)
|
|
104
|
+
routes.push(createPortalRoute(hostname, basePath, daemonPort));
|
|
105
|
+
console.log(`Portal route: ${hostname}${basePath} -> localhost:${daemonPort}`);
|
|
106
|
+
// Get sessions if daemon is running
|
|
107
|
+
if (await isDaemonRunning()) {
|
|
108
|
+
const sessions = await getSessions(config);
|
|
109
|
+
for (const session of sessions) {
|
|
110
|
+
routes.push(createSessionRoute(hostname, session.fullPath, session.port));
|
|
111
|
+
console.log(`Session route: ${hostname}${session.fullPath}/* -> localhost:${session.port}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
console.log('Note: Daemon is not running. Run "ttyd-mux caddy sync" after starting sessions.');
|
|
116
|
+
}
|
|
117
|
+
if (serverInfo) {
|
|
118
|
+
// Filter out existing ttyd-mux routes and add new ones
|
|
119
|
+
const existingRoutes = serverInfo.server.routes ?? [];
|
|
120
|
+
const cleanedRoutes = existingRoutes.filter((route) => {
|
|
121
|
+
const matches = route.match ?? [];
|
|
122
|
+
return !matches.some((m) => m.host?.includes(hostname) && m.path?.some((p) => p.startsWith(basePath)));
|
|
123
|
+
});
|
|
124
|
+
await client.updateServerRoutes(serverInfo.name, [...routes, ...cleanedRoutes]);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
await createNewServer(client, hostname, routes);
|
|
128
|
+
console.log(`Created new server for ${hostname}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
async function createNewServer(client, hostname, routes) {
|
|
132
|
+
const newServer = {
|
|
133
|
+
listen: [':443'],
|
|
134
|
+
routes: [
|
|
135
|
+
...routes,
|
|
136
|
+
{
|
|
137
|
+
// Fallback route
|
|
138
|
+
handle: [
|
|
139
|
+
{
|
|
140
|
+
handler: 'static_response',
|
|
141
|
+
body: 'OK'
|
|
142
|
+
}
|
|
143
|
+
]
|
|
144
|
+
}
|
|
145
|
+
]
|
|
146
|
+
};
|
|
147
|
+
const serverName = `srv_${hostname.replace(/\./g, '_')}`;
|
|
148
|
+
await client.createServer(serverName, newServer);
|
|
149
|
+
}
|
|
77
150
|
// Remove route via Admin API
|
|
78
151
|
export async function caddyRemoveCommand(options) {
|
|
79
152
|
const config = loadConfig(options.config);
|
|
80
|
-
const adminApi = options
|
|
81
|
-
const hostname = options
|
|
82
|
-
|
|
83
|
-
console.error('Error: --hostname is required');
|
|
84
|
-
process.exit(1);
|
|
85
|
-
}
|
|
153
|
+
const adminApi = getAdminApi(options, config);
|
|
154
|
+
const hostname = getHostname(options, config);
|
|
155
|
+
requireHostname(hostname);
|
|
86
156
|
const basePath = config.base_path;
|
|
87
|
-
|
|
88
|
-
try {
|
|
89
|
-
client = await connectToCaddy(adminApi);
|
|
90
|
-
}
|
|
91
|
-
catch {
|
|
92
|
-
console.error(`Error: Cannot connect to Caddy Admin API at ${adminApi}`);
|
|
93
|
-
process.exit(1);
|
|
94
|
-
}
|
|
157
|
+
const client = await connectToCaddyOrExit(adminApi);
|
|
95
158
|
try {
|
|
96
159
|
const servers = await client.getServers();
|
|
97
|
-
|
|
160
|
+
let removed = false;
|
|
161
|
+
// Find and remove all ttyd-mux routes (both proxy and static mode)
|
|
98
162
|
for (const [serverName, server] of Object.entries(servers)) {
|
|
99
163
|
const routes = server.routes ?? [];
|
|
100
164
|
const filteredRoutes = routes.filter((route) => {
|
|
@@ -103,39 +167,127 @@ export async function caddyRemoveCommand(options) {
|
|
|
103
167
|
});
|
|
104
168
|
if (filteredRoutes.length < routes.length) {
|
|
105
169
|
await client.updateServerRoutes(serverName, filteredRoutes);
|
|
106
|
-
|
|
107
|
-
return;
|
|
170
|
+
removed = true;
|
|
108
171
|
}
|
|
109
172
|
}
|
|
110
|
-
|
|
173
|
+
if (removed) {
|
|
174
|
+
console.log(`Removed all ttyd-mux routes for ${hostname}${basePath}/*`);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
console.log(`No ttyd-mux routes found for ${hostname}${basePath}/*`);
|
|
178
|
+
}
|
|
111
179
|
}
|
|
112
180
|
catch (error) {
|
|
113
181
|
handleCliError('Error', error);
|
|
114
182
|
process.exit(1);
|
|
115
183
|
}
|
|
116
184
|
}
|
|
117
|
-
//
|
|
118
|
-
|
|
185
|
+
// Calculate route diff between daemon sessions and Caddy routes
|
|
186
|
+
function calculateRouteDiff(sessions, existingRoutes) {
|
|
187
|
+
const sessionPaths = new Set(sessions.map((s) => s.fullPath));
|
|
188
|
+
const toAdd = sessions.filter((session) => !existingRoutes.some((r) => r.path === session.fullPath && r.port === session.port));
|
|
189
|
+
const toRemove = existingRoutes.filter((r) => !sessionPaths.has(r.path));
|
|
190
|
+
return { toAdd, toRemove };
|
|
191
|
+
}
|
|
192
|
+
// Check if portal route exists in routes
|
|
193
|
+
function hasPortalRoute(routes, hostname, basePath) {
|
|
194
|
+
return routes.some((route) => {
|
|
195
|
+
const matches = route.match ?? [];
|
|
196
|
+
return matches.some((m) => m.host?.includes(hostname) &&
|
|
197
|
+
m.path?.some((p) => p === basePath || p === `${basePath}/` || p === `${basePath}/api/*`));
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
// Report sync changes to console
|
|
201
|
+
function reportSyncChanges(hostname, toAdd, toRemove) {
|
|
202
|
+
for (const session of toAdd) {
|
|
203
|
+
console.log(`Added: ${hostname}${session.fullPath}/* -> localhost:${session.port}`);
|
|
204
|
+
}
|
|
205
|
+
for (const removed of toRemove) {
|
|
206
|
+
console.log(`Removed: ${hostname}${removed.path}/* -> localhost:${removed.port}`);
|
|
207
|
+
}
|
|
208
|
+
console.log('');
|
|
209
|
+
console.log(`Sync complete. ${toAdd.length} added, ${toRemove.length} removed.`);
|
|
210
|
+
}
|
|
211
|
+
// Sync session routes (static mode only)
|
|
212
|
+
export async function caddySyncCommand(options) {
|
|
119
213
|
const config = loadConfig(options.config);
|
|
120
|
-
|
|
214
|
+
if (config.proxy_mode !== 'static') {
|
|
215
|
+
console.log('Note: sync command is only needed in static mode.');
|
|
216
|
+
console.log('Current proxy_mode is "proxy". Sessions are automatically proxied.');
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
const hostname = getHostname(options, config);
|
|
220
|
+
requireHostname(hostname);
|
|
221
|
+
if (!(await isDaemonRunning())) {
|
|
222
|
+
console.error('Error: Daemon is not running. Start daemon first with "ttyd-mux daemon"');
|
|
223
|
+
process.exit(1);
|
|
224
|
+
}
|
|
225
|
+
const adminApi = getAdminApi(options, config);
|
|
226
|
+
const client = await connectToCaddyOrExit(adminApi);
|
|
121
227
|
const basePath = config.base_path;
|
|
122
|
-
|
|
228
|
+
const daemonPort = config.daemon_port;
|
|
229
|
+
try {
|
|
230
|
+
const serverInfo = await getServerInfoOrExit(client, hostname);
|
|
231
|
+
const sessions = await getSessions(config);
|
|
232
|
+
const sessionPaths = new Set(sessions.map((s) => s.fullPath));
|
|
233
|
+
const existingSessionRoutes = getSessionRoutes(serverInfo.server, hostname, basePath);
|
|
234
|
+
const { toAdd, toRemove } = calculateRouteDiff(sessions, existingSessionRoutes);
|
|
235
|
+
if (toAdd.length === 0 && toRemove.length === 0) {
|
|
236
|
+
console.log('Routes are up to date. No changes needed.');
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
// Build new routes
|
|
240
|
+
const existingRoutes = serverInfo.server.routes ?? [];
|
|
241
|
+
let newRoutes = filterOutSessionRoutes(existingRoutes, hostname, basePath, sessionPaths);
|
|
242
|
+
const sessionRoutes = toAdd.map((s) => createSessionRoute(hostname, s.fullPath, s.port));
|
|
243
|
+
if (!hasPortalRoute(newRoutes, hostname, basePath)) {
|
|
244
|
+
sessionRoutes.push(createPortalRoute(hostname, basePath, daemonPort));
|
|
245
|
+
console.log(`Added portal route: ${hostname}${basePath} -> localhost:${daemonPort}`);
|
|
246
|
+
}
|
|
247
|
+
newRoutes = [...sessionRoutes, ...newRoutes];
|
|
248
|
+
await client.updateServerRoutes(serverInfo.name, newRoutes);
|
|
249
|
+
reportSyncChanges(hostname, toAdd, toRemove);
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
handleCliError('Error', error);
|
|
253
|
+
process.exit(1);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
async function connectToCaddyOrExit(adminApi) {
|
|
123
257
|
try {
|
|
124
|
-
|
|
258
|
+
return await connectToCaddy(adminApi);
|
|
125
259
|
}
|
|
126
260
|
catch {
|
|
127
261
|
console.error(`Error: Cannot connect to Caddy Admin API at ${adminApi}`);
|
|
128
262
|
console.error('Make sure Caddy is running and admin API is enabled.');
|
|
129
263
|
process.exit(1);
|
|
130
264
|
}
|
|
265
|
+
}
|
|
266
|
+
async function getServerInfoOrExit(client, hostname) {
|
|
267
|
+
const servers = await client.getServers();
|
|
268
|
+
const serverInfo = findServerForHost(servers, hostname);
|
|
269
|
+
if (!serverInfo) {
|
|
270
|
+
console.error(`Error: No server found for hostname ${hostname}`);
|
|
271
|
+
console.error('Run "ttyd-mux caddy setup --hostname <hostname>" first.');
|
|
272
|
+
process.exit(1);
|
|
273
|
+
}
|
|
274
|
+
return serverInfo;
|
|
275
|
+
}
|
|
276
|
+
// Show current Caddy status
|
|
277
|
+
export async function caddyStatusCommand(options) {
|
|
278
|
+
const config = loadConfig(options.config);
|
|
279
|
+
const adminApi = getAdminApi(options, config);
|
|
280
|
+
const basePath = config.base_path;
|
|
281
|
+
const client = await connectToCaddyOrExit(adminApi);
|
|
131
282
|
console.log(`Caddy Admin API: ${adminApi}`);
|
|
283
|
+
console.log(`Proxy Mode: ${config.proxy_mode}`);
|
|
132
284
|
console.log('');
|
|
133
285
|
const servers = await client.getServers();
|
|
134
286
|
if (Object.keys(servers).length === 0) {
|
|
135
287
|
console.log('No HTTP servers configured.');
|
|
136
288
|
return;
|
|
137
289
|
}
|
|
138
|
-
const routes =
|
|
290
|
+
const routes = findTtydMuxRoutes(servers, basePath);
|
|
139
291
|
if (routes.length === 0) {
|
|
140
292
|
console.log(`No ttyd-mux routes found (looking for ${basePath}/*)`);
|
|
141
293
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"caddy.js","sourceRoot":"","sources":["../../src/commands/caddy.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"caddy.js","sourceRoot":"","sources":["../../src/commands/caddy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/commands/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/commands/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAOhD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAsB;IACxD,2BAA2B;IAC3B,IAAI,MAAM,eAAe,EAAE,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,oBAAoB;QACpB,MAAM,WAAW,CAAC;YAChB,UAAU,EAAE,OAAO,CAAC,MAAM;YAC1B,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,qDAAqD;QACrD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC5D,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAMD,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA6FzE"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { getSessions, isDaemonRunning } from '../client/index.js';
|
|
5
|
+
import { loadConfig } from '../config/config.js';
|
|
6
|
+
import { getAllSessions } from '../config/state.js';
|
|
7
|
+
import { generateCaddyJson, generateCaddyfileSnippet } from '../deploy/caddyfile.js';
|
|
8
|
+
import { generateDeployScript } from '../deploy/deploy-script.js';
|
|
9
|
+
import { generateStaticPortalHtml } from '../deploy/static-portal.js';
|
|
10
|
+
import { requireHostname } from '../utils/errors.js';
|
|
11
|
+
function getDefaultDeployDir() {
|
|
12
|
+
return join(homedir(), '.local', 'share', 'ttyd-mux', 'deploy');
|
|
13
|
+
}
|
|
14
|
+
export async function deployCommand(options) {
|
|
15
|
+
const config = loadConfig(options.config);
|
|
16
|
+
const hostname = options.hostname ?? config.hostname;
|
|
17
|
+
requireHostname(hostname);
|
|
18
|
+
const deployDir = options.output ?? getDefaultDeployDir();
|
|
19
|
+
const portalDir = join(deployDir, 'portal');
|
|
20
|
+
// Get sessions
|
|
21
|
+
let sessions;
|
|
22
|
+
if (await isDaemonRunning()) {
|
|
23
|
+
const sessionResponses = await getSessions(config);
|
|
24
|
+
sessions = sessionResponses.map((s) => ({
|
|
25
|
+
name: s.name,
|
|
26
|
+
pid: s.pid,
|
|
27
|
+
port: s.port,
|
|
28
|
+
path: s.path,
|
|
29
|
+
dir: s.dir,
|
|
30
|
+
started_at: s.started_at
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
// Fallback to state file
|
|
35
|
+
sessions = getAllSessions();
|
|
36
|
+
}
|
|
37
|
+
console.log('ttyd-mux deploy');
|
|
38
|
+
console.log('================');
|
|
39
|
+
console.log('');
|
|
40
|
+
console.log(`Hostname: ${hostname}`);
|
|
41
|
+
console.log(`Output: ${deployDir}`);
|
|
42
|
+
console.log(`Sessions: ${sessions.length}`);
|
|
43
|
+
console.log('');
|
|
44
|
+
// Create directories
|
|
45
|
+
if (!existsSync(deployDir)) {
|
|
46
|
+
mkdirSync(deployDir, { recursive: true });
|
|
47
|
+
}
|
|
48
|
+
if (!existsSync(portalDir)) {
|
|
49
|
+
mkdirSync(portalDir, { recursive: true });
|
|
50
|
+
}
|
|
51
|
+
// Generate static portal HTML
|
|
52
|
+
const portalHtml = generateStaticPortalHtml(config, sessions);
|
|
53
|
+
const portalPath = join(portalDir, 'index.html');
|
|
54
|
+
writeFileSync(portalPath, portalHtml);
|
|
55
|
+
console.log(`Generated: ${portalPath}`);
|
|
56
|
+
// Generate Caddyfile snippet
|
|
57
|
+
const caddyfileSnippet = generateCaddyfileSnippet(config, sessions, {
|
|
58
|
+
hostname,
|
|
59
|
+
portalDir
|
|
60
|
+
});
|
|
61
|
+
const caddyfilePath = join(deployDir, 'Caddyfile.snippet');
|
|
62
|
+
writeFileSync(caddyfilePath, caddyfileSnippet);
|
|
63
|
+
console.log(`Generated: ${caddyfilePath}`);
|
|
64
|
+
// Generate Caddy JSON routes
|
|
65
|
+
const caddyJson = generateCaddyJson(config, sessions, {
|
|
66
|
+
hostname,
|
|
67
|
+
portalDir
|
|
68
|
+
});
|
|
69
|
+
const caddyJsonPath = join(deployDir, 'caddy-routes.json');
|
|
70
|
+
writeFileSync(caddyJsonPath, JSON.stringify(caddyJson, null, 2));
|
|
71
|
+
console.log(`Generated: ${caddyJsonPath}`);
|
|
72
|
+
// Generate deploy script
|
|
73
|
+
const deployScript = generateDeployScript(config, {
|
|
74
|
+
hostname,
|
|
75
|
+
deployDir,
|
|
76
|
+
caddyAdminApi: config.caddy_admin_api
|
|
77
|
+
});
|
|
78
|
+
const scriptPath = join(deployDir, 'deploy.sh');
|
|
79
|
+
writeFileSync(scriptPath, deployScript, { mode: 0o755 });
|
|
80
|
+
console.log(`Generated: ${scriptPath}`);
|
|
81
|
+
console.log('');
|
|
82
|
+
console.log('Next steps:');
|
|
83
|
+
console.log('');
|
|
84
|
+
console.log('Option 1: Add snippet to Caddyfile');
|
|
85
|
+
console.log(` cat ${caddyfilePath}`);
|
|
86
|
+
console.log('');
|
|
87
|
+
console.log('Option 2: Use Caddy Admin API');
|
|
88
|
+
console.log(` ttyd-mux caddy setup --hostname ${hostname}`);
|
|
89
|
+
console.log('');
|
|
90
|
+
if (sessions.length > 0) {
|
|
91
|
+
console.log('Sessions included:');
|
|
92
|
+
for (const session of sessions) {
|
|
93
|
+
console.log(` - ${session.name} (:${session.port})`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
console.log('Note: No sessions found. Start sessions with "ttyd-mux up" and run deploy again.');
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=deploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAsJD;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA6CzE"}
|