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.
Files changed (196) hide show
  1. package/README.md +105 -1
  2. package/dist/caddy/client.d.ts +3 -55
  3. package/dist/caddy/client.d.ts.map +1 -1
  4. package/dist/caddy/client.js +0 -73
  5. package/dist/caddy/client.js.map +1 -1
  6. package/dist/caddy/route-builder.d.ts +49 -0
  7. package/dist/caddy/route-builder.d.ts.map +1 -0
  8. package/dist/caddy/route-builder.js +175 -0
  9. package/dist/caddy/route-builder.js.map +1 -0
  10. package/dist/caddy/types.d.ts +27 -0
  11. package/dist/caddy/types.d.ts.map +1 -0
  12. package/dist/caddy/types.js +3 -0
  13. package/dist/caddy/types.js.map +1 -0
  14. package/dist/client/api-client.d.ts +26 -0
  15. package/dist/client/api-client.d.ts.map +1 -0
  16. package/dist/client/api-client.js +62 -0
  17. package/dist/client/api-client.js.map +1 -0
  18. package/dist/client/daemon-client.d.ts +48 -0
  19. package/dist/client/daemon-client.d.ts.map +1 -0
  20. package/dist/client/daemon-client.js +205 -0
  21. package/dist/client/daemon-client.js.map +1 -0
  22. package/dist/client/index.d.ts +2 -10
  23. package/dist/client/index.d.ts.map +1 -1
  24. package/dist/client/index.js +4 -136
  25. package/dist/client/index.js.map +1 -1
  26. package/dist/commands/attach.js +3 -4
  27. package/dist/commands/attach.js.map +1 -1
  28. package/dist/commands/caddy.d.ts +2 -1
  29. package/dist/commands/caddy.d.ts.map +1 -1
  30. package/dist/commands/caddy.js +227 -75
  31. package/dist/commands/caddy.js.map +1 -1
  32. package/dist/commands/daemon.js.map +1 -1
  33. package/dist/commands/deploy.d.ts +7 -0
  34. package/dist/commands/deploy.d.ts.map +1 -0
  35. package/dist/commands/deploy.js +100 -0
  36. package/dist/commands/deploy.js.map +1 -0
  37. package/dist/commands/doctor.d.ts +8 -0
  38. package/dist/commands/doctor.d.ts.map +1 -0
  39. package/dist/commands/doctor.js +180 -0
  40. package/dist/commands/doctor.js.map +1 -0
  41. package/dist/commands/down.d.ts.map +1 -1
  42. package/dist/commands/down.js +11 -0
  43. package/dist/commands/down.js.map +1 -1
  44. package/dist/commands/reload.d.ts +14 -0
  45. package/dist/commands/reload.d.ts.map +1 -0
  46. package/dist/commands/reload.js +50 -0
  47. package/dist/commands/reload.js.map +1 -0
  48. package/dist/commands/shutdown.d.ts +2 -1
  49. package/dist/commands/shutdown.d.ts.map +1 -1
  50. package/dist/commands/shutdown.js +8 -2
  51. package/dist/commands/shutdown.js.map +1 -1
  52. package/dist/commands/start.d.ts.map +1 -1
  53. package/dist/commands/start.js +16 -3
  54. package/dist/commands/start.js.map +1 -1
  55. package/dist/commands/status.js.map +1 -1
  56. package/dist/commands/stop.js.map +1 -1
  57. package/dist/commands/up.js.map +1 -1
  58. package/dist/config/config.d.ts.map +1 -1
  59. package/dist/config/config.js +9 -2
  60. package/dist/config/config.js.map +1 -1
  61. package/dist/config/index.d.ts +3 -3
  62. package/dist/config/index.d.ts.map +1 -1
  63. package/dist/config/index.js +6 -3
  64. package/dist/config/index.js.map +1 -1
  65. package/dist/config/state-store.d.ts +27 -0
  66. package/dist/config/state-store.d.ts.map +1 -0
  67. package/dist/config/state-store.js +55 -0
  68. package/dist/config/state-store.js.map +1 -0
  69. package/dist/config/state.d.ts +6 -0
  70. package/dist/config/state.d.ts.map +1 -1
  71. package/dist/config/state.js +49 -14
  72. package/dist/config/state.js.map +1 -1
  73. package/dist/config/types.d.ts +35 -0
  74. package/dist/config/types.d.ts.map +1 -1
  75. package/dist/config/types.js +23 -1
  76. package/dist/config/types.js.map +1 -1
  77. package/dist/daemon/api-handler.d.ts +5 -0
  78. package/dist/daemon/api-handler.d.ts.map +1 -0
  79. package/dist/daemon/api-handler.js +97 -0
  80. package/dist/daemon/api-handler.js.map +1 -0
  81. package/dist/daemon/config-manager.d.ts +43 -0
  82. package/dist/daemon/config-manager.d.ts.map +1 -0
  83. package/dist/daemon/config-manager.js +154 -0
  84. package/dist/daemon/config-manager.js.map +1 -0
  85. package/dist/daemon/http-proxy.d.ts +27 -0
  86. package/dist/daemon/http-proxy.d.ts.map +1 -0
  87. package/dist/daemon/http-proxy.js +110 -0
  88. package/dist/daemon/http-proxy.js.map +1 -0
  89. package/dist/daemon/ime-helper.d.ts +1 -1
  90. package/dist/daemon/ime-helper.d.ts.map +1 -1
  91. package/dist/daemon/ime-helper.js +284 -10
  92. package/dist/daemon/ime-helper.js.map +1 -1
  93. package/dist/daemon/index.d.ts.map +1 -1
  94. package/dist/daemon/index.js +134 -29
  95. package/dist/daemon/index.js.map +1 -1
  96. package/dist/daemon/portal-utils.d.ts +20 -0
  97. package/dist/daemon/portal-utils.d.ts.map +1 -0
  98. package/dist/daemon/portal-utils.js +109 -0
  99. package/dist/daemon/portal-utils.js.map +1 -0
  100. package/dist/daemon/portal.d.ts.map +1 -1
  101. package/dist/daemon/portal.js +20 -77
  102. package/dist/daemon/portal.js.map +1 -1
  103. package/dist/daemon/pwa.d.ts +52 -0
  104. package/dist/daemon/pwa.d.ts.map +1 -0
  105. package/dist/daemon/pwa.js +229 -0
  106. package/dist/daemon/pwa.js.map +1 -0
  107. package/dist/daemon/router.d.ts +15 -0
  108. package/dist/daemon/router.d.ts.map +1 -0
  109. package/dist/daemon/router.js +164 -0
  110. package/dist/daemon/router.js.map +1 -0
  111. package/dist/daemon/server.d.ts +15 -3
  112. package/dist/daemon/server.d.ts.map +1 -1
  113. package/dist/daemon/server.js +23 -271
  114. package/dist/daemon/server.js.map +1 -1
  115. package/dist/daemon/session-manager.d.ts +44 -10
  116. package/dist/daemon/session-manager.d.ts.map +1 -1
  117. package/dist/daemon/session-manager.js +125 -49
  118. package/dist/daemon/session-manager.js.map +1 -1
  119. package/dist/daemon/session-resolver.d.ts +1 -1
  120. package/dist/daemon/session-resolver.d.ts.map +1 -1
  121. package/dist/daemon/session-resolver.js.map +1 -1
  122. package/dist/daemon/toolbar/config.d.ts +13 -0
  123. package/dist/daemon/toolbar/config.d.ts.map +1 -0
  124. package/dist/daemon/toolbar/config.js +13 -0
  125. package/dist/daemon/toolbar/config.js.map +1 -0
  126. package/dist/daemon/toolbar/index.d.ts +43 -0
  127. package/dist/daemon/toolbar/index.d.ts.map +1 -0
  128. package/dist/daemon/toolbar/index.js +835 -0
  129. package/dist/daemon/toolbar/index.js.map +1 -0
  130. package/dist/daemon/toolbar/styles.d.ts +5 -0
  131. package/dist/daemon/toolbar/styles.d.ts.map +1 -0
  132. package/dist/daemon/toolbar/styles.js +278 -0
  133. package/dist/daemon/toolbar/styles.js.map +1 -0
  134. package/dist/daemon/toolbar/template.d.ts +6 -0
  135. package/dist/daemon/toolbar/template.d.ts.map +1 -0
  136. package/dist/daemon/toolbar/template.js +45 -0
  137. package/dist/daemon/toolbar/template.js.map +1 -0
  138. package/dist/daemon/ws-proxy.d.ts +17 -0
  139. package/dist/daemon/ws-proxy.d.ts.map +1 -0
  140. package/dist/daemon/ws-proxy.js +95 -0
  141. package/dist/daemon/ws-proxy.js.map +1 -0
  142. package/dist/deploy/caddyfile.d.ts +8 -0
  143. package/dist/deploy/caddyfile.d.ts.map +1 -0
  144. package/dist/deploy/caddyfile.js +62 -0
  145. package/dist/deploy/caddyfile.js.map +1 -0
  146. package/dist/deploy/deploy-script.d.ts +8 -0
  147. package/dist/deploy/deploy-script.d.ts.map +1 -0
  148. package/dist/deploy/deploy-script.js +72 -0
  149. package/dist/deploy/deploy-script.js.map +1 -0
  150. package/dist/deploy/static-portal.d.ts +3 -0
  151. package/dist/deploy/static-portal.d.ts.map +1 -0
  152. package/dist/deploy/static-portal.js +59 -0
  153. package/dist/deploy/static-portal.js.map +1 -0
  154. package/dist/index.js +38 -9
  155. package/dist/index.js.map +1 -1
  156. package/dist/test-setup.d.ts +19 -0
  157. package/dist/test-setup.d.ts.map +1 -0
  158. package/dist/test-setup.js +33 -0
  159. package/dist/test-setup.js.map +1 -0
  160. package/dist/tmux.d.ts +28 -1
  161. package/dist/tmux.d.ts.map +1 -1
  162. package/dist/tmux.js +37 -32
  163. package/dist/tmux.js.map +1 -1
  164. package/dist/ui.d.ts +2 -1
  165. package/dist/ui.d.ts.map +1 -1
  166. package/dist/ui.js +16 -9
  167. package/dist/ui.js.map +1 -1
  168. package/dist/utils/errors.d.ts +4 -0
  169. package/dist/utils/errors.d.ts.map +1 -1
  170. package/dist/utils/errors.js +9 -1
  171. package/dist/utils/errors.js.map +1 -1
  172. package/dist/utils/logger.d.ts +14 -0
  173. package/dist/utils/logger.d.ts.map +1 -0
  174. package/dist/utils/logger.js +53 -0
  175. package/dist/utils/logger.js.map +1 -0
  176. package/dist/utils/process-runner.d.ts +50 -0
  177. package/dist/utils/process-runner.d.ts.map +1 -0
  178. package/dist/utils/process-runner.js +73 -0
  179. package/dist/utils/process-runner.js.map +1 -0
  180. package/dist/utils/socket-client.d.ts +24 -0
  181. package/dist/utils/socket-client.d.ts.map +1 -0
  182. package/dist/utils/socket-client.js +30 -0
  183. package/dist/utils/socket-client.js.map +1 -0
  184. package/dist/utils/tmux-client.d.ts +57 -0
  185. package/dist/utils/tmux-client.d.ts.map +1 -0
  186. package/dist/utils/tmux-client.js +117 -0
  187. package/dist/utils/tmux-client.js.map +1 -0
  188. package/dist/version.d.ts +3 -0
  189. package/dist/version.d.ts.map +1 -0
  190. package/dist/version.js +4 -0
  191. package/dist/version.js.map +1 -0
  192. package/package.json +6 -2
  193. package/dist/daemon/proxy.d.ts +0 -7
  194. package/dist/daemon/proxy.d.ts.map +0 -1
  195. package/dist/daemon/proxy.js +0 -17
  196. 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">&gt;_</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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"}
@@ -1,5 +1,17 @@
1
1
  import { type Server } from 'node:http';
2
- import type { Config, SessionState } from '../config/types.js';
3
- export declare function findSessionForPath(config: Config, path: string): SessionState | null;
4
- export declare function createDaemonServer(config: Config): Server;
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,EAAwB,KAAK,MAAM,EAAqC,MAAM,WAAW,CAAC;AAOjG,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA2E/D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAYpF;AAkOD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAWzD"}
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"}