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 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,kBAAkB,GAA6B;IACnD,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,gEAAgE;AAChE,IAAI,YAAY,GAAc,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAc,IAAI,MAAM,CAAC;AAEvF,SAAS,eAAe;IACtB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,SAAS,CAAC,KAAe;IAChC,OAAO,kBAAkB,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,YAAY,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,aAAa,CAAC,KAAe,EAAE,SAAiB,EAAE,OAAe;IACxE,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACjD,OAAO,IAAI,SAAS,KAAK,UAAU,KAAK,SAAS,KAAK,OAAO,EAAE,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAe;IACzC,YAAY,GAAG,KAAK,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,OAAO;QACL,KAAK,CAAC,OAAe,EAAE,GAAG,IAAe;YACvC,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAED,IAAI,CAAC,OAAe,EAAE,GAAG,IAAe;YACtC,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAED,IAAI,CAAC,OAAe,EAAE,GAAG,IAAe;YACtC,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAED,KAAK,CAAC,OAAe,EAAE,GAAG,IAAe;YACvC,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * ProcessRunner interface for abstracting process spawning
3
+ * Allows mocking in tests without actually spawning processes
4
+ */
5
+ import { type ChildProcess, type SpawnOptions, type SpawnSyncReturns } from 'node:child_process';
6
+ export interface ExecSyncOptions {
7
+ cwd?: string;
8
+ encoding?: 'utf-8' | 'utf8' | 'ascii' | 'base64' | 'hex' | 'latin1' | 'binary';
9
+ stdio?: 'pipe' | 'ignore' | 'inherit';
10
+ }
11
+ export interface SpawnSyncOptions {
12
+ cwd?: string;
13
+ stdio?: 'pipe' | 'ignore' | 'inherit';
14
+ }
15
+ export interface ProcessRunner {
16
+ /**
17
+ * Spawn a child process
18
+ */
19
+ spawn(command: string, args: string[], options?: SpawnOptions): ChildProcess;
20
+ /**
21
+ * Spawn a command synchronously with array arguments (safe from injection)
22
+ */
23
+ spawnSync(command: string, args: string[], options?: SpawnSyncOptions): SpawnSyncReturns<string>;
24
+ /**
25
+ * Execute a command synchronously
26
+ * @deprecated Use spawnSync with array arguments to prevent command injection
27
+ */
28
+ execSync(command: string, options?: ExecSyncOptions): string;
29
+ /**
30
+ * Check if a process with the given PID is running
31
+ */
32
+ isProcessRunning(pid: number): boolean;
33
+ /**
34
+ * Send a signal to a process
35
+ */
36
+ kill(pid: number, signal?: NodeJS.Signals | number): void;
37
+ /**
38
+ * Check if a port is available (not in use)
39
+ */
40
+ isPortAvailable(port: number): Promise<boolean>;
41
+ }
42
+ /**
43
+ * Default implementation using Node.js child_process
44
+ */
45
+ export declare const defaultProcessRunner: ProcessRunner;
46
+ /**
47
+ * Create a mock ProcessRunner for testing
48
+ */
49
+ export declare function createMockProcessRunner(overrides?: Partial<ProcessRunner>): ProcessRunner;
50
+ //# sourceMappingURL=process-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-runner.d.ts","sourceRoot":"","sources":["../../src/utils/process-runner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAItB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC/E,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;CACvC;AAED,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,YAAY,CAAC;IAE7E;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEjG;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,MAAM,CAAC;IAE7D;;OAEG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAEvC;;OAEG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC;IAE1D;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACjD;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,aA8ClC,CAAC;AAEF;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAmBzF"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * ProcessRunner interface for abstracting process spawning
3
+ * Allows mocking in tests without actually spawning processes
4
+ */
5
+ import { execSync, spawn, spawnSync } from 'node:child_process';
6
+ import { createServer } from 'node:net';
7
+ /**
8
+ * Default implementation using Node.js child_process
9
+ */
10
+ export const defaultProcessRunner = {
11
+ spawn(command, args, options) {
12
+ return spawn(command, args, options ?? {});
13
+ },
14
+ spawnSync(command, args, options) {
15
+ return spawnSync(command, args, {
16
+ ...options,
17
+ encoding: 'utf-8'
18
+ });
19
+ },
20
+ execSync(command, options) {
21
+ return execSync(command, {
22
+ ...options,
23
+ encoding: options?.encoding ?? 'utf-8'
24
+ });
25
+ },
26
+ isProcessRunning(pid) {
27
+ try {
28
+ process.kill(pid, 0);
29
+ return true;
30
+ }
31
+ catch {
32
+ return false;
33
+ }
34
+ },
35
+ kill(pid, signal) {
36
+ process.kill(pid, signal);
37
+ },
38
+ isPortAvailable(port) {
39
+ return new Promise((resolve) => {
40
+ const server = createServer();
41
+ server.once('error', () => {
42
+ resolve(false);
43
+ });
44
+ server.once('listening', () => {
45
+ server.close(() => {
46
+ resolve(true);
47
+ });
48
+ });
49
+ server.listen(port, '127.0.0.1');
50
+ });
51
+ }
52
+ };
53
+ /**
54
+ * Create a mock ProcessRunner for testing
55
+ */
56
+ export function createMockProcessRunner(overrides) {
57
+ return {
58
+ spawn: overrides?.spawn ??
59
+ (() => {
60
+ throw new Error('spawn not mocked');
61
+ }),
62
+ spawnSync: overrides?.spawnSync ??
63
+ (() => ({ status: 0, stdout: '', stderr: '', pid: 0, output: [], signal: null })),
64
+ execSync: overrides?.execSync ?? (() => ''),
65
+ isProcessRunning: overrides?.isProcessRunning ?? (() => false),
66
+ kill: overrides?.kill ??
67
+ (() => {
68
+ /* no-op mock */
69
+ }),
70
+ isPortAvailable: overrides?.isPortAvailable ?? (() => Promise.resolve(true))
71
+ };
72
+ }
73
+ //# sourceMappingURL=process-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-runner.js","sourceRoot":"","sources":["../../src/utils/process-runner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAIL,QAAQ,EACR,KAAK,EACL,SAAS,EACV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AA8CxC;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAkB;IACjD,KAAK,CAAC,OAAe,EAAE,IAAc,EAAE,OAAsB;QAC3D,OAAO,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,SAAS,CAAC,OAAe,EAAE,IAAc,EAAE,OAA0B;QACnE,OAAO,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE;YAC9B,GAAG,OAAO;YACV,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;IACL,CAAC;IAED,QAAQ,CAAC,OAAe,EAAE,OAAyB;QACjD,OAAO,QAAQ,CAAC,OAAO,EAAE;YACvB,GAAG,OAAO;YACV,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,OAAO;SACvC,CAAW,CAAC;IACf,CAAC;IAED,gBAAgB,CAAC,GAAW;QAC1B,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAW,EAAE,MAAgC;QAChD,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED,eAAe,CAAC,IAAY;QAC1B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;gBACxB,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;gBAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;oBAChB,OAAO,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,SAAkC;IACxE,OAAO;QACL,KAAK,EACH,SAAS,EAAE,KAAK;YAChB,CAAC,GAAG,EAAE;gBACJ,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACtC,CAAC,CAAC;QACJ,SAAS,EACP,SAAS,EAAE,SAAS;YACpB,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACnF,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;QAC3C,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;QAC9D,IAAI,EACF,SAAS,EAAE,IAAI;YACf,CAAC,GAAG,EAAE;gBACJ,gBAAgB;YAClB,CAAC,CAAC;QACJ,eAAe,EAAE,SAAS,EAAE,eAAe,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KAC7E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * SocketClient interface for abstracting Unix socket communication
3
+ * Allows mocking in tests without actual socket connections
4
+ */
5
+ import { type Socket } from 'node:net';
6
+ export interface SocketClient {
7
+ /**
8
+ * Connect to a Unix socket
9
+ */
10
+ connect(path: string): Socket;
11
+ /**
12
+ * Check if a socket file exists
13
+ */
14
+ exists(path: string): boolean;
15
+ }
16
+ /**
17
+ * Default implementation using Node.js net module
18
+ */
19
+ export declare const defaultSocketClient: SocketClient;
20
+ /**
21
+ * Create a mock SocketClient for testing
22
+ */
23
+ export declare function createMockSocketClient(overrides?: Partial<SocketClient>): SocketClient;
24
+ //# sourceMappingURL=socket-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-client.d.ts","sourceRoot":"","sources":["../../src/utils/socket-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,KAAK,MAAM,EAAW,MAAM,UAAU,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAE9B;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/B;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,YAQjC,CAAC;AAEF;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAStF"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * SocketClient interface for abstracting Unix socket communication
3
+ * Allows mocking in tests without actual socket connections
4
+ */
5
+ import { existsSync } from 'node:fs';
6
+ import { connect } from 'node:net';
7
+ /**
8
+ * Default implementation using Node.js net module
9
+ */
10
+ export const defaultSocketClient = {
11
+ connect(path) {
12
+ return connect(path);
13
+ },
14
+ exists(path) {
15
+ return existsSync(path);
16
+ }
17
+ };
18
+ /**
19
+ * Create a mock SocketClient for testing
20
+ */
21
+ export function createMockSocketClient(overrides) {
22
+ return {
23
+ connect: overrides?.connect ??
24
+ (() => {
25
+ throw new Error('connect not mocked');
26
+ }),
27
+ exists: overrides?.exists ?? (() => false)
28
+ };
29
+ }
30
+ //# sourceMappingURL=socket-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-client.js","sourceRoot":"","sources":["../../src/utils/socket-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAe,OAAO,EAAE,MAAM,UAAU,CAAC;AAchD;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAiB;IAC/C,OAAO,CAAC,IAAY;QAClB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAiC;IACtE,OAAO;QACL,OAAO,EACL,SAAS,EAAE,OAAO;YAClB,CAAC,GAAG,EAAE;gBACJ,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACxC,CAAC,CAAC;QACJ,MAAM,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;KAC3C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * TmuxClient interface for abstracting tmux interactions
3
+ * Allows mocking in tests without actual tmux commands
4
+ */
5
+ import { type ProcessRunner } from './process-runner.js';
6
+ /**
7
+ * Represents a tmux session
8
+ */
9
+ export interface TmuxSession {
10
+ name: string;
11
+ windows: number;
12
+ created: Date;
13
+ attached: boolean;
14
+ }
15
+ /**
16
+ * Validate session name to prevent command injection
17
+ */
18
+ export declare function isValidSessionName(name: string): boolean;
19
+ /**
20
+ * Sanitize session name by removing invalid characters
21
+ */
22
+ export declare function sanitizeSessionName(name: string): string;
23
+ export interface TmuxClient {
24
+ /**
25
+ * Check if currently inside a tmux session
26
+ */
27
+ isInsideTmux(): boolean;
28
+ /**
29
+ * Check if tmux is installed
30
+ */
31
+ isInstalled(): boolean;
32
+ /**
33
+ * List all tmux sessions
34
+ */
35
+ listSessions(): TmuxSession[];
36
+ /**
37
+ * Check if a session exists
38
+ */
39
+ sessionExists(sessionName: string): boolean;
40
+ /**
41
+ * Ensure a session exists, creating it if necessary
42
+ */
43
+ ensureSession(sessionName: string, cwd?: string): void;
44
+ }
45
+ /**
46
+ * Create a TmuxClient with optional ProcessRunner injection
47
+ */
48
+ export declare function createTmuxClient(processRunner?: ProcessRunner): TmuxClient;
49
+ /**
50
+ * Default TmuxClient using real tmux commands
51
+ */
52
+ export declare const defaultTmuxClient: TmuxClient;
53
+ /**
54
+ * Create a mock TmuxClient for testing
55
+ */
56
+ export declare function createMockTmuxClient(overrides?: Partial<TmuxClient>): TmuxClient;
57
+ //# sourceMappingURL=tmux-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tmux-client.d.ts","sourceRoot":"","sources":["../../src/utils/tmux-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,aAAa,EAAwB,MAAM,qBAAqB,CAAC;AAE/E;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;CACnB;AAUD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASxD;AAYD,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,YAAY,IAAI,OAAO,CAAC;IAExB;;OAEG;IACH,WAAW,IAAI,OAAO,CAAC;IAEvB;;OAEG;IACH,YAAY,IAAI,WAAW,EAAE,CAAC;IAE9B;;OAEG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAE5C;;OAEG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,aAAa,GAAE,aAAoC,GAAG,UAAU,CA0DhG;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAA+B,CAAC;AAEhE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAYhF"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * TmuxClient interface for abstracting tmux interactions
3
+ * Allows mocking in tests without actual tmux commands
4
+ */
5
+ import { defaultProcessRunner } from './process-runner.js';
6
+ const SESSION_FORMAT = '#{session_name}|#{session_windows}|#{session_created}|#{session_attached}';
7
+ /**
8
+ * Valid session name pattern: alphanumeric, underscore, hyphen, dot (max 64 chars)
9
+ * Prevents command injection attacks
10
+ */
11
+ const VALID_SESSION_NAME = /^[a-zA-Z0-9_.-]{1,64}$/;
12
+ /**
13
+ * Validate session name to prevent command injection
14
+ */
15
+ export function isValidSessionName(name) {
16
+ return VALID_SESSION_NAME.test(name);
17
+ }
18
+ /**
19
+ * Sanitize session name by removing invalid characters
20
+ */
21
+ export function sanitizeSessionName(name) {
22
+ // Replace invalid characters with hyphen, then collapse multiple hyphens
23
+ return (name
24
+ .replace(/[^a-zA-Z0-9_.-]/g, '-')
25
+ .replace(/-+/g, '-')
26
+ .replace(/^-|-$/g, '')
27
+ .slice(0, 64) || 'session');
28
+ }
29
+ function parseSessionLine(line) {
30
+ const [name = '', windows = '0', created = '0', attached] = line.split('|');
31
+ return {
32
+ name,
33
+ windows: Number.parseInt(windows, 10),
34
+ created: new Date(Number.parseInt(created, 10) * 1000),
35
+ attached: attached === '1'
36
+ };
37
+ }
38
+ /**
39
+ * Create a TmuxClient with optional ProcessRunner injection
40
+ */
41
+ export function createTmuxClient(processRunner = defaultProcessRunner) {
42
+ return {
43
+ isInsideTmux() {
44
+ return !!process.env['TMUX'];
45
+ },
46
+ isInstalled() {
47
+ try {
48
+ processRunner.execSync('which tmux', { stdio: 'ignore' });
49
+ return true;
50
+ }
51
+ catch {
52
+ return false;
53
+ }
54
+ },
55
+ listSessions() {
56
+ try {
57
+ const output = processRunner.execSync(`tmux list-sessions -F "${SESSION_FORMAT}"`, {
58
+ encoding: 'utf-8'
59
+ });
60
+ return output
61
+ .trim()
62
+ .split('\n')
63
+ .filter((line) => line.length > 0)
64
+ .map(parseSessionLine);
65
+ }
66
+ catch {
67
+ return [];
68
+ }
69
+ },
70
+ sessionExists(sessionName) {
71
+ if (!isValidSessionName(sessionName)) {
72
+ return false;
73
+ }
74
+ // Use spawnSync with array arguments to prevent command injection
75
+ const result = processRunner.spawnSync('tmux', ['has-session', '-t', sessionName], {
76
+ stdio: 'ignore'
77
+ });
78
+ return result.status === 0;
79
+ },
80
+ ensureSession(sessionName, cwd) {
81
+ if (!isValidSessionName(sessionName)) {
82
+ throw new Error(`Invalid session name: ${sessionName}`);
83
+ }
84
+ if (!this.sessionExists(sessionName)) {
85
+ // Use spawnSync with array arguments to prevent command injection
86
+ const args = ['new-session', '-d', '-s', sessionName];
87
+ if (cwd) {
88
+ args.push('-c', cwd);
89
+ }
90
+ const result = processRunner.spawnSync('tmux', args, { stdio: 'ignore' });
91
+ if (result.status !== 0) {
92
+ throw new Error(`Failed to create tmux session: ${sessionName}`);
93
+ }
94
+ }
95
+ }
96
+ };
97
+ }
98
+ /**
99
+ * Default TmuxClient using real tmux commands
100
+ */
101
+ export const defaultTmuxClient = createTmuxClient();
102
+ /**
103
+ * Create a mock TmuxClient for testing
104
+ */
105
+ export function createMockTmuxClient(overrides) {
106
+ return {
107
+ isInsideTmux: overrides?.isInsideTmux ?? (() => false),
108
+ isInstalled: overrides?.isInstalled ?? (() => true),
109
+ listSessions: overrides?.listSessions ?? (() => []),
110
+ sessionExists: overrides?.sessionExists ?? (() => false),
111
+ ensureSession: overrides?.ensureSession ??
112
+ (() => {
113
+ /* no-op mock */
114
+ })
115
+ };
116
+ }
117
+ //# sourceMappingURL=tmux-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tmux-client.js","sourceRoot":"","sources":["../../src/utils/tmux-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const NAME: "ttyd-mux";
2
+ export declare const VERSION: "0.4.0";
3
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,IAAI,EAAG,UAAmB,CAAC;AACxC,eAAO,MAAM,OAAO,EAAG,OAAgB,CAAC"}
@@ -0,0 +1,4 @@
1
+ // This file is auto-generated. Do not edit manually.
2
+ export const NAME = 'ttyd-mux';
3
+ export const VERSION = '0.4.0';
4
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,MAAM,CAAC,MAAM,IAAI,GAAG,UAAmB,CAAC;AACxC,MAAM,CAAC,MAAM,OAAO,GAAG,OAAgB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ttyd-mux",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "ttyd session multiplexer - manage multiple ttyd+tmux web terminal sessions / 複数の ttyd+tmux Web ターミナルセッションを管理する CLI ツール",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -15,12 +15,15 @@
15
15
  "check:fix": "biome check ./src --write",
16
16
  "format": "biome format ./src --write",
17
17
  "test": "bun test src/",
18
+ "test:coverage": "bun test src/ --coverage",
19
+ "complexity": "node scripts/complexity-report.mjs",
18
20
  "test:watch": "bun test src/ --watch",
19
21
  "test:e2e": "bunx playwright test",
20
22
  "test:e2e:headed": "bunx playwright test --headed",
21
23
  "test:e2e:debug": "bunx playwright test --debug",
22
24
  "validate": "bun run typecheck && bun run check && bun run test",
23
- "build": "tsc",
25
+ "prebuild": "node scripts/gen-version.mjs",
26
+ "build": "tsc && tsc-alias",
24
27
  "build:binary": "bun build src/index.ts --compile --outfile ttyd-mux",
25
28
  "prepublishOnly": "npm run build"
26
29
  },
@@ -33,6 +36,7 @@
33
36
  "@types/proper-lockfile": "^4.1.4",
34
37
  "@types/ws": "^8.18.1",
35
38
  "playwright": "^1.58.2",
39
+ "tsc-alias": "^1.8.16",
36
40
  "typescript": "^5.6.0"
37
41
  },
38
42
  "files": [
@@ -1,7 +0,0 @@
1
- import type { Config, SessionState } from '../config/types.js';
2
- /**
3
- * Find a session that matches the given URL path.
4
- * Used to route requests to the correct ttyd instance.
5
- */
6
- export declare function findSessionForPath(config: Config, path: string): SessionState | null;
7
- //# sourceMappingURL=proxy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/daemon/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG/D;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,YAAY,GAAG,IAAI,CAYrB"}
@@ -1,17 +0,0 @@
1
- import { listSessions } from './session-manager.js';
2
- /**
3
- * Find a session that matches the given URL path.
4
- * Used to route requests to the correct ttyd instance.
5
- */
6
- export function findSessionForPath(config, path) {
7
- const sessions = listSessions();
8
- const basePath = config.base_path.replace(/\/$/, '');
9
- for (const session of sessions) {
10
- const sessionFullPath = `${basePath}${session.path}`;
11
- if (path.startsWith(`${sessionFullPath}/`) || path === sessionFullPath) {
12
- return session;
13
- }
14
- }
15
- return null;
16
- }
17
- //# sourceMappingURL=proxy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/daemon/proxy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAc,EACd,IAAY;IAEZ,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAErD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,eAAe,GAAG,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QACrD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,eAAe,GAAG,CAAC,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;YACvE,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}