@hyzyn/dsh-docker 0.6.4 → 0.7.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.en.md +31 -16
- package/README.md +31 -18
- package/client-src/current-session.js +52 -0
- package/client-src/docker.css +2180 -0
- package/client-src/index.js +6691 -0
- package/client-src/session-target.js +92 -0
- package/client.js +46 -24
- package/lib/docker.d.ts +62 -5
- package/lib/docker.js +287 -48
- package/lib/docker.js.map +1 -1
- package/lib/index.d.ts +19 -1
- package/lib/index.js +595 -80
- package/lib/index.js.map +1 -1
- package/lib/ssh-exec.d.ts +30 -11
- package/lib/ssh-exec.js +360 -143
- package/lib/ssh-exec.js.map +1 -1
- package/package.json +4 -2
- package/scripts/build-client.mjs +33 -0
- package/scripts/client-smoke.mjs +1851 -0
- package/scripts/route-smoke.mjs +1091 -0
- package/scripts/smoke.mjs +874 -0
package/lib/ssh-exec.d.ts
CHANGED
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
import type { ConnectConfig } from 'ssh2';
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* TOFU 主机指纹记录(与 tty 0.19.0 同形状:同一 host:port 一组指纹)。
|
|
4
|
+
*
|
|
5
|
+
* 为什么要是一个集合:同一台主机往往同时有 rsa + ed25519 两把主机密钥,
|
|
6
|
+
* ssh2 握手时用哪把取决于算法协商——单指纹记录会在算法切换时把健康连接
|
|
7
|
+
* 误判成「指纹变更」(tty 修 D12 时引入多指纹,这里对齐)。
|
|
8
|
+
*/
|
|
3
9
|
export interface HostKeyRecord {
|
|
4
10
|
host: string;
|
|
5
11
|
port: number;
|
|
6
|
-
/** hostVerifier 收到的原样 sha256
|
|
7
|
-
|
|
12
|
+
/** hostVerifier 收到的原样 sha256 十六进制指纹集合。 */
|
|
13
|
+
fingerprints: string[];
|
|
8
14
|
}
|
|
9
15
|
/** 主机指纹钉扎存储(宿主半体实现为配置状态 + settings 持久化)。 */
|
|
10
16
|
export interface HostKeyStore {
|
|
11
|
-
/**
|
|
12
|
-
get(host: string, port: number): string | undefined;
|
|
13
|
-
/**
|
|
17
|
+
/** 已记录的指纹集合(同一 host:port 的全部主机密钥);未记录返回 undefined / 空数组。 */
|
|
18
|
+
get(host: string, port: number): string[] | undefined;
|
|
19
|
+
/** 首次连接握手时记录一条指纹;该主机已有其他算法的指纹时并入集合。 */
|
|
14
20
|
record(host: string, port: number, fingerprint: string): void;
|
|
15
21
|
}
|
|
16
22
|
/** 内联 SSH 连接规格(连接簿条目共用同一形状)。 */
|
|
@@ -32,7 +38,7 @@ export interface ExecResult {
|
|
|
32
38
|
stderr: string;
|
|
33
39
|
/** 超时被强制中断。 */
|
|
34
40
|
timedOut: boolean;
|
|
35
|
-
/**
|
|
41
|
+
/** 输出超过上限被截断(keepTail=true 时保留尾部,否则保留头部)。 */
|
|
36
42
|
truncated: boolean;
|
|
37
43
|
/** 实际耗时(毫秒)。 */
|
|
38
44
|
durationMs: number;
|
|
@@ -44,6 +50,11 @@ export interface ExecOptions {
|
|
|
44
50
|
maxBytes?: number;
|
|
45
51
|
/** 追加到 stdin 的内容(如 `docker exec -i` 需要喂 stdin 时)。 */
|
|
46
52
|
input?: string;
|
|
53
|
+
/**
|
|
54
|
+
* 截断时保留**尾部**(默认保留头部)。logs 的最新行、pull 的 digest、
|
|
55
|
+
* prune 的总计都在输出末尾——这类命令超出上限时该丢的是头部(D14)。
|
|
56
|
+
*/
|
|
57
|
+
keepTail?: boolean;
|
|
47
58
|
}
|
|
48
59
|
export interface ExecLogger {
|
|
49
60
|
info(msg: string): void;
|
|
@@ -119,16 +130,23 @@ export declare function describeExecError(message: string): string;
|
|
|
119
130
|
* 而 `acquire()` 复用 memoized 的 `ready`、不会每次探活。这种时候唯一正确的动作是丢掉
|
|
120
131
|
* 这条连接、重连一次再试;反过来,「命令返回非零」「镜像不存在」这类业务失败**绝不能**
|
|
121
132
|
* 触发重连——那会把一次普通错误变成两条命令。
|
|
133
|
+
*
|
|
134
|
+
* 「Channel open failure / open failed」刻意**不在**传输层名单里:它是远端**拒绝开新
|
|
135
|
+
* 通道**,典型成因是同一连接的 MaxSessions 被长流占满——连接本身是健康的。把它当传输
|
|
136
|
+
* 错误会泄漏健康连接(摘出池却不关闭,keepalive 一直养着),还会把 `describeExecError`
|
|
137
|
+
* 补的可操作文案藏掉(重连后新连接额度是空的,命令反而成功)。见 D07。
|
|
122
138
|
*/
|
|
123
139
|
export declare function isTransportError(message: string): boolean;
|
|
124
140
|
/**
|
|
125
141
|
* 空闲回收判定:busy>0 的连接上挂着长流(docker logs --follow 可以几小时不结束),
|
|
126
|
-
*
|
|
127
|
-
*
|
|
142
|
+
* inflight>0 的连接上有一次性命令在跑(docker pull 默认 600s,期间没有任何请求
|
|
143
|
+
* 刷新 lastUsed)——两类都必须让空闲回收让路,否则在途命令会被 sweeper 掐断在半路
|
|
144
|
+
* (D01)。抽成纯函数便于回归(sweeper 本体依赖定时器,难以直接驱动)。
|
|
128
145
|
*/
|
|
129
146
|
export declare function shouldRecycleConn(conn: {
|
|
130
147
|
lastUsed: number;
|
|
131
148
|
busy: number;
|
|
149
|
+
inflight?: number;
|
|
132
150
|
}, now: number, idleMs?: number): boolean;
|
|
133
151
|
/** 远程一次性命令执行器:懒连接池 + TOFU 指纹 + 输出上限。 */
|
|
134
152
|
export declare class RemoteExec {
|
|
@@ -154,11 +172,12 @@ export declare class RemoteExec {
|
|
|
154
172
|
/**
|
|
155
173
|
* 开一条 exec channel;**传输层**错误时丢掉连接、重连一次(见 `isTransportError`)。
|
|
156
174
|
*
|
|
157
|
-
*
|
|
158
|
-
*
|
|
175
|
+
* 只重试一次:重连之后还报同样的错,多半不是连接的问题(目标本身不可达),
|
|
176
|
+
* 再试只是把失败拖长、还会多压一条命令过去。
|
|
159
177
|
*/
|
|
160
178
|
private openChannel;
|
|
161
179
|
private acquire;
|
|
180
|
+
/** 从池里摘掉一条连接。带 client 时做身份校验:只摘自己这条(D06)。 */
|
|
162
181
|
private dropConn;
|
|
163
182
|
}
|
|
164
183
|
/** 构造连接配置(认证三态 + keepalive + hostHash);与 tty 的 ssh.ts 同策略。 */
|