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
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PWA (Progressive Web App) support for ttyd-mux
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* - Web App Manifest for "Add to Home Screen" functionality
|
|
6
|
+
* - Service Worker for installability
|
|
7
|
+
* - App icons (SVG with PNG fallbacks)
|
|
8
|
+
*/
|
|
9
|
+
import { deflateSync as zlibDeflateSync } from 'node:zlib';
|
|
10
|
+
/**
|
|
11
|
+
* Generate Web App Manifest JSON
|
|
12
|
+
*/
|
|
13
|
+
export function generateManifest(basePath) {
|
|
14
|
+
return {
|
|
15
|
+
name: 'ttyd-mux',
|
|
16
|
+
short_name: 'ttyd-mux',
|
|
17
|
+
description: 'Terminal session manager',
|
|
18
|
+
start_url: `${basePath}/`,
|
|
19
|
+
display: 'fullscreen',
|
|
20
|
+
orientation: 'any',
|
|
21
|
+
background_color: '#1a1a2e',
|
|
22
|
+
theme_color: '#00d9ff',
|
|
23
|
+
icons: [
|
|
24
|
+
{
|
|
25
|
+
src: `${basePath}/icon.svg`,
|
|
26
|
+
sizes: 'any',
|
|
27
|
+
type: 'image/svg+xml',
|
|
28
|
+
purpose: 'any'
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
src: `${basePath}/icon-192.png`,
|
|
32
|
+
sizes: '192x192',
|
|
33
|
+
type: 'image/png'
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
src: `${basePath}/icon-512.png`,
|
|
37
|
+
sizes: '512x512',
|
|
38
|
+
type: 'image/png'
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Service Worker script
|
|
45
|
+
*
|
|
46
|
+
* Minimal implementation for PWA installability.
|
|
47
|
+
* Uses network-first strategy since terminal requires online connectivity.
|
|
48
|
+
*/
|
|
49
|
+
export const serviceWorkerScript = `// ttyd-mux Service Worker
|
|
50
|
+
self.addEventListener('install', (event) => {
|
|
51
|
+
// Skip waiting to activate immediately
|
|
52
|
+
self.skipWaiting();
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
self.addEventListener('activate', (event) => {
|
|
56
|
+
// Claim all clients immediately
|
|
57
|
+
event.waitUntil(clients.claim());
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
self.addEventListener('fetch', (event) => {
|
|
61
|
+
// Network-first strategy - terminal requires online connectivity
|
|
62
|
+
event.respondWith(fetch(event.request));
|
|
63
|
+
});
|
|
64
|
+
`;
|
|
65
|
+
/**
|
|
66
|
+
* SVG icon for ttyd-mux
|
|
67
|
+
*
|
|
68
|
+
* Simple terminal prompt icon (>_) with the app's color scheme.
|
|
69
|
+
*/
|
|
70
|
+
export const iconSvg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
|
71
|
+
<rect width="512" height="512" rx="64" fill="#1a1a2e"/>
|
|
72
|
+
<text x="256" y="320" font-family="monospace" font-size="200" font-weight="bold" fill="#00d9ff" text-anchor="middle">>_</text>
|
|
73
|
+
</svg>`;
|
|
74
|
+
/**
|
|
75
|
+
* Generate PNG icon from SVG using canvas
|
|
76
|
+
*
|
|
77
|
+
* Note: This is a simplified approach. For production, consider pre-generating
|
|
78
|
+
* PNG files or using a proper SVG-to-PNG library.
|
|
79
|
+
*
|
|
80
|
+
* The PNG data below is a pre-rendered version of the SVG icon.
|
|
81
|
+
*/
|
|
82
|
+
// 192x192 PNG icon (base64 encoded)
|
|
83
|
+
// Simple terminal icon with >_ symbol
|
|
84
|
+
export const icon192Base64 = generateIconPngBase64(192);
|
|
85
|
+
// 512x512 PNG icon (base64 encoded)
|
|
86
|
+
export const icon512Base64 = generateIconPngBase64(512);
|
|
87
|
+
/**
|
|
88
|
+
* Generate a simple PNG icon as base64
|
|
89
|
+
*
|
|
90
|
+
* Creates a minimal valid PNG with the terminal icon appearance.
|
|
91
|
+
* Uses a simple solid color placeholder that matches the theme.
|
|
92
|
+
*/
|
|
93
|
+
function generateIconPngBase64(size) {
|
|
94
|
+
// Create PNG using minimal valid PNG structure
|
|
95
|
+
// This creates a simple colored square as a fallback
|
|
96
|
+
// Real icons should be pre-generated for better quality
|
|
97
|
+
const png = createMinimalPng(size, size, [0x1a, 0x1a, 0x2e]); // #1a1a2e background
|
|
98
|
+
return Buffer.from(png).toString('base64');
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Create minimal valid PNG data
|
|
102
|
+
*/
|
|
103
|
+
function createMinimalPng(width, height, rgb) {
|
|
104
|
+
// PNG signature
|
|
105
|
+
const signature = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
|
|
106
|
+
// IHDR chunk
|
|
107
|
+
const ihdr = createIhdrChunk(width, height);
|
|
108
|
+
// IDAT chunk (image data)
|
|
109
|
+
const idat = createIdatChunk(width, height, rgb);
|
|
110
|
+
// IEND chunk
|
|
111
|
+
const iend = createIendChunk();
|
|
112
|
+
// Combine all parts
|
|
113
|
+
const totalLength = signature.length + ihdr.length + idat.length + iend.length;
|
|
114
|
+
const png = new Uint8Array(totalLength);
|
|
115
|
+
let offset = 0;
|
|
116
|
+
png.set(signature, offset);
|
|
117
|
+
offset += signature.length;
|
|
118
|
+
png.set(ihdr, offset);
|
|
119
|
+
offset += ihdr.length;
|
|
120
|
+
png.set(idat, offset);
|
|
121
|
+
offset += idat.length;
|
|
122
|
+
png.set(iend, offset);
|
|
123
|
+
return png;
|
|
124
|
+
}
|
|
125
|
+
function createIhdrChunk(width, height) {
|
|
126
|
+
const data = new Uint8Array(13);
|
|
127
|
+
const view = new DataView(data.buffer);
|
|
128
|
+
view.setUint32(0, width, false); // width
|
|
129
|
+
view.setUint32(4, height, false); // height
|
|
130
|
+
data[8] = 8; // bit depth
|
|
131
|
+
data[9] = 2; // color type (RGB)
|
|
132
|
+
data[10] = 0; // compression
|
|
133
|
+
data[11] = 0; // filter
|
|
134
|
+
data[12] = 0; // interlace
|
|
135
|
+
return createChunk('IHDR', data);
|
|
136
|
+
}
|
|
137
|
+
function createIdatChunk(width, height, rgb) {
|
|
138
|
+
// Create uncompressed image data
|
|
139
|
+
// Each row: filter byte (0) + RGB pixels
|
|
140
|
+
const rowSize = 1 + width * 3;
|
|
141
|
+
const rawData = new Uint8Array(height * rowSize);
|
|
142
|
+
for (let y = 0; y < height; y++) {
|
|
143
|
+
const rowOffset = y * rowSize;
|
|
144
|
+
rawData[rowOffset] = 0; // No filter
|
|
145
|
+
for (let x = 0; x < width; x++) {
|
|
146
|
+
const pixelOffset = rowOffset + 1 + x * 3;
|
|
147
|
+
rawData[pixelOffset] = rgb[0];
|
|
148
|
+
rawData[pixelOffset + 1] = rgb[1];
|
|
149
|
+
rawData[pixelOffset + 2] = rgb[2];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Compress with zlib (deflate)
|
|
153
|
+
const compressed = deflateSync(rawData);
|
|
154
|
+
return createChunk('IDAT', compressed);
|
|
155
|
+
}
|
|
156
|
+
function createIendChunk() {
|
|
157
|
+
return createChunk('IEND', new Uint8Array(0));
|
|
158
|
+
}
|
|
159
|
+
function createChunk(type, data) {
|
|
160
|
+
const chunk = new Uint8Array(12 + data.length);
|
|
161
|
+
const view = new DataView(chunk.buffer);
|
|
162
|
+
// Length
|
|
163
|
+
view.setUint32(0, data.length, false);
|
|
164
|
+
// Type
|
|
165
|
+
for (let i = 0; i < 4; i++) {
|
|
166
|
+
chunk[4 + i] = type.charCodeAt(i);
|
|
167
|
+
}
|
|
168
|
+
// Data
|
|
169
|
+
chunk.set(data, 8);
|
|
170
|
+
// CRC (of type + data)
|
|
171
|
+
const crcData = new Uint8Array(4 + data.length);
|
|
172
|
+
crcData.set(chunk.subarray(4, 8), 0);
|
|
173
|
+
crcData.set(data, 4);
|
|
174
|
+
const crc = crc32(crcData);
|
|
175
|
+
view.setUint32(8 + data.length, crc, false);
|
|
176
|
+
return chunk;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Simple deflate compression (zlib format)
|
|
180
|
+
*/
|
|
181
|
+
function deflateSync(data) {
|
|
182
|
+
return zlibDeflateSync(Buffer.from(data));
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* CRC32 calculation for PNG chunks
|
|
186
|
+
*/
|
|
187
|
+
function crc32(data) {
|
|
188
|
+
// CRC32 lookup table
|
|
189
|
+
const table = new Uint32Array(256);
|
|
190
|
+
for (let i = 0; i < 256; i++) {
|
|
191
|
+
let c = i;
|
|
192
|
+
for (let j = 0; j < 8; j++) {
|
|
193
|
+
c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
|
|
194
|
+
}
|
|
195
|
+
table[i] = c;
|
|
196
|
+
}
|
|
197
|
+
let crc = 0xffffffff;
|
|
198
|
+
for (const byte of data) {
|
|
199
|
+
const index = (crc ^ byte) & 0xff;
|
|
200
|
+
crc = (table[index] ?? 0) ^ (crc >>> 8);
|
|
201
|
+
}
|
|
202
|
+
return (crc ^ 0xffffffff) >>> 0;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Get PNG icon as Buffer
|
|
206
|
+
*/
|
|
207
|
+
export function getIconPng(size) {
|
|
208
|
+
const base64 = size === 192 ? icon192Base64 : icon512Base64;
|
|
209
|
+
return Buffer.from(base64, 'base64');
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Get SVG icon as string
|
|
213
|
+
*/
|
|
214
|
+
export function getIconSvg() {
|
|
215
|
+
return iconSvg;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Get Service Worker script
|
|
219
|
+
*/
|
|
220
|
+
export function getServiceWorker() {
|
|
221
|
+
return serviceWorkerScript;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Get manifest JSON string
|
|
225
|
+
*/
|
|
226
|
+
export function getManifestJson(basePath) {
|
|
227
|
+
return JSON.stringify(generateManifest(basePath), null, 2);
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=pwa.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pwa.js","sourceRoot":"","sources":["../../src/daemon/pwa.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
+
import type { Config, SessionState } from '../config/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Set security headers on response
|
|
5
|
+
*/
|
|
6
|
+
export declare function setSecurityHeaders(res: ServerResponse): void;
|
|
7
|
+
/**
|
|
8
|
+
* Find session that matches the given path
|
|
9
|
+
*/
|
|
10
|
+
export declare function findSessionForPath(config: Config, path: string): SessionState | null;
|
|
11
|
+
/**
|
|
12
|
+
* Handle incoming HTTP request
|
|
13
|
+
*/
|
|
14
|
+
export declare function handleRequest(config: Config, req: IncomingMessage, res: ServerResponse): void;
|
|
15
|
+
//# sourceMappingURL=router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/daemon/router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAW9D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAK5D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAYpF;AA+ED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAgE7F"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { normalizeBasePath } from '../config/config.js';
|
|
2
|
+
import { createLogger } from '../utils/logger.js';
|
|
3
|
+
import { handleApiRequest } from './api-handler.js';
|
|
4
|
+
import { proxyToSession } from './http-proxy.js';
|
|
5
|
+
import { generatePortalHtml } from './portal.js';
|
|
6
|
+
import { getIconPng, getIconSvg, getManifestJson, getServiceWorker } from './pwa.js';
|
|
7
|
+
import { sessionManager } from './session-manager.js';
|
|
8
|
+
import { getToolbarJs } from './toolbar/index.js';
|
|
9
|
+
const log = createLogger('router');
|
|
10
|
+
/**
|
|
11
|
+
* Set security headers on response
|
|
12
|
+
*/
|
|
13
|
+
export function setSecurityHeaders(res) {
|
|
14
|
+
res.setHeader('X-Content-Type-Options', 'nosniff');
|
|
15
|
+
res.setHeader('X-Frame-Options', 'SAMEORIGIN');
|
|
16
|
+
res.setHeader('X-XSS-Protection', '1; mode=block');
|
|
17
|
+
res.setHeader('Referrer-Policy', 'strict-origin-when-cross-origin');
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Find session that matches the given path
|
|
21
|
+
*/
|
|
22
|
+
export function findSessionForPath(config, path) {
|
|
23
|
+
const sessions = sessionManager.listSessions();
|
|
24
|
+
const basePath = normalizeBasePath(config.base_path);
|
|
25
|
+
for (const session of sessions) {
|
|
26
|
+
const sessionFullPath = `${basePath}${session.path}`;
|
|
27
|
+
if (path.startsWith(`${sessionFullPath}/`) || path === sessionFullPath) {
|
|
28
|
+
return session;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Serve portal HTML page
|
|
35
|
+
*/
|
|
36
|
+
function servePortal(config, res) {
|
|
37
|
+
const sessions = sessionManager.listSessions();
|
|
38
|
+
const html = generatePortalHtml(config, sessions);
|
|
39
|
+
res.writeHead(200, {
|
|
40
|
+
'Content-Type': 'text/html; charset=utf-8',
|
|
41
|
+
'Content-Length': Buffer.byteLength(html)
|
|
42
|
+
});
|
|
43
|
+
res.end(html);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Serve PWA manifest.json
|
|
47
|
+
*/
|
|
48
|
+
function servePwaManifest(res, basePath) {
|
|
49
|
+
const json = getManifestJson(basePath);
|
|
50
|
+
res.writeHead(200, {
|
|
51
|
+
'Content-Type': 'application/manifest+json',
|
|
52
|
+
'Content-Length': Buffer.byteLength(json)
|
|
53
|
+
});
|
|
54
|
+
res.end(json);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Serve PWA Service Worker
|
|
58
|
+
*/
|
|
59
|
+
function servePwaServiceWorker(res) {
|
|
60
|
+
const script = getServiceWorker();
|
|
61
|
+
res.writeHead(200, {
|
|
62
|
+
'Content-Type': 'application/javascript',
|
|
63
|
+
'Content-Length': Buffer.byteLength(script),
|
|
64
|
+
'Service-Worker-Allowed': '/'
|
|
65
|
+
});
|
|
66
|
+
res.end(script);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Serve PWA SVG icon
|
|
70
|
+
*/
|
|
71
|
+
function servePwaIconSvg(res) {
|
|
72
|
+
const svg = getIconSvg();
|
|
73
|
+
res.writeHead(200, {
|
|
74
|
+
'Content-Type': 'image/svg+xml',
|
|
75
|
+
'Content-Length': Buffer.byteLength(svg),
|
|
76
|
+
'Cache-Control': 'public, max-age=86400'
|
|
77
|
+
});
|
|
78
|
+
res.end(svg);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Serve PWA PNG icon
|
|
82
|
+
*/
|
|
83
|
+
function servePwaIconPng(res, size) {
|
|
84
|
+
const png = getIconPng(size);
|
|
85
|
+
res.writeHead(200, {
|
|
86
|
+
'Content-Type': 'image/png',
|
|
87
|
+
'Content-Length': png.length,
|
|
88
|
+
'Cache-Control': 'public, max-age=86400'
|
|
89
|
+
});
|
|
90
|
+
res.end(png);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Serve toolbar JavaScript
|
|
94
|
+
*/
|
|
95
|
+
function serveToolbarJs(config, res) {
|
|
96
|
+
const script = getToolbarJs(config.toolbar);
|
|
97
|
+
res.writeHead(200, {
|
|
98
|
+
'Content-Type': 'application/javascript',
|
|
99
|
+
'Content-Length': Buffer.byteLength(script),
|
|
100
|
+
'Cache-Control': 'public, max-age=3600'
|
|
101
|
+
});
|
|
102
|
+
res.end(script);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Handle incoming HTTP request
|
|
106
|
+
*/
|
|
107
|
+
export function handleRequest(config, req, res) {
|
|
108
|
+
const url = req.url ?? '/';
|
|
109
|
+
const method = req.method ?? 'GET';
|
|
110
|
+
const basePath = normalizeBasePath(config.base_path);
|
|
111
|
+
// Apply security headers to all responses
|
|
112
|
+
setSecurityHeaders(res);
|
|
113
|
+
log.debug(`Request: ${method} ${url}`);
|
|
114
|
+
// API routes
|
|
115
|
+
if (url.startsWith(`${basePath}/api/`)) {
|
|
116
|
+
handleApiRequest(config, req, res);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
// PWA routes
|
|
120
|
+
if (url === `${basePath}/manifest.json`) {
|
|
121
|
+
servePwaManifest(res, basePath);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (url === `${basePath}/sw.js`) {
|
|
125
|
+
servePwaServiceWorker(res);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (url === `${basePath}/icon.svg`) {
|
|
129
|
+
servePwaIconSvg(res);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (url === `${basePath}/icon-192.png`) {
|
|
133
|
+
servePwaIconPng(res, 192);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (url === `${basePath}/icon-512.png`) {
|
|
137
|
+
servePwaIconPng(res, 512);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
// Toolbar JavaScript
|
|
141
|
+
if (url === `${basePath}/toolbar.js`) {
|
|
142
|
+
serveToolbarJs(config, res);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
// Portal page
|
|
146
|
+
if (url === basePath || url === `${basePath}/`) {
|
|
147
|
+
if (method === 'GET') {
|
|
148
|
+
log.debug('Serving portal page');
|
|
149
|
+
servePortal(config, res);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Try to proxy to a session
|
|
154
|
+
const session = findSessionForPath(config, url);
|
|
155
|
+
if (session) {
|
|
156
|
+
proxyToSession(req, res, session.port, basePath);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
// Not found
|
|
160
|
+
log.debug(`Not found: ${url}`);
|
|
161
|
+
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
|
162
|
+
res.end('Not Found');
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/daemon/router.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon/server.d.ts
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
import { type Server } from 'node:http';
|
|
2
|
-
import type { Config
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
import type { Config } from '../config/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Set the config getter function (called by daemon on startup)
|
|
5
|
+
*/
|
|
6
|
+
export declare function setConfigGetter(getter: () => Config): void;
|
|
7
|
+
/**
|
|
8
|
+
* Create the daemon HTTP server with WebSocket support
|
|
9
|
+
*
|
|
10
|
+
* Note: When ConfigManager is initialized (via setConfigGetter), the server
|
|
11
|
+
* uses the dynamic config for each request to support hot-reloading.
|
|
12
|
+
* Otherwise, it falls back to the initialConfig (for testing).
|
|
13
|
+
*
|
|
14
|
+
* @param initialConfig - Initial config (used as fallback when ConfigManager not initialized)
|
|
15
|
+
*/
|
|
16
|
+
export declare function createDaemonServer(initialConfig: Config): Server;
|
|
5
17
|
//# sourceMappingURL=server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,WAAW,CAAC;AAGtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAOhD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,MAAM,GAAG,IAAI,CAE1D;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAehE"}
|