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 @@
|
|
|
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 @@
|
|
|
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"}
|
package/dist/version.js
ADDED
|
@@ -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
|
+
"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
|
-
"
|
|
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": [
|
package/dist/daemon/proxy.d.ts
DELETED
|
@@ -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"}
|
package/dist/daemon/proxy.js
DELETED
|
@@ -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
|
package/dist/daemon/proxy.js.map
DELETED
|
@@ -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"}
|