@xiaoqiong0v0/opencode-ssh-tool 0.6.17 → 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.md +34 -3
- package/dist/agent.d.ts +7 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +1 -0
- package/dist/agent.js.map +1 -1
- package/dist/base-session.d.ts +5 -1
- package/dist/base-session.d.ts.map +1 -1
- package/dist/base-session.js +4 -2
- package/dist/base-session.js.map +1 -1
- package/dist/cli-args.d.ts +19 -0
- package/dist/cli-args.d.ts.map +1 -0
- package/dist/cli-args.js +88 -0
- package/dist/cli-args.js.map +1 -0
- package/dist/constants.d.ts +42 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +44 -1
- package/dist/constants.js.map +1 -1
- package/dist/i18n.d.ts +188 -12
- package/dist/i18n.d.ts.map +1 -1
- package/dist/i18n.js +164 -12
- package/dist/i18n.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +313 -26
- package/dist/index.js.map +1 -1
- package/dist/path-utils.d.ts +8 -0
- package/dist/path-utils.d.ts.map +1 -0
- package/dist/path-utils.js +17 -0
- package/dist/path-utils.js.map +1 -0
- package/dist/payload.d.ts +49 -0
- package/dist/payload.d.ts.map +1 -0
- package/dist/payload.js +101 -0
- package/dist/payload.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +123 -1
- package/dist/server.js.map +1 -1
- package/dist/session.d.ts +59 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +215 -1
- package/dist/session.js.map +1 -1
- package/dist/transfer-events.d.ts +41 -0
- package/dist/transfer-events.d.ts.map +1 -0
- package/dist/transfer-events.js +79 -0
- package/dist/transfer-events.js.map +1 -0
- package/dist/transfer.d.ts +121 -0
- package/dist/transfer.d.ts.map +1 -0
- package/dist/transfer.js +1001 -0
- package/dist/transfer.js.map +1 -0
- package/dist/web/app.css +47 -1
- package/dist/web/app.js +10 -10
- package/dist/web/index.html +11 -0
- package/package.json +2 -2
package/dist/session.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type DownloadOptions, type TransferResult, type UploadOptions } from "./transfer.js";
|
|
1
2
|
import type { ExecResult } from "./base-session.js";
|
|
2
3
|
import { BaseSession } from "./base-session.js";
|
|
3
4
|
export interface SessionStatus {
|
|
@@ -24,6 +25,11 @@ export declare class SshSession extends BaseSession {
|
|
|
24
25
|
private _host;
|
|
25
26
|
private _user;
|
|
26
27
|
private _port;
|
|
28
|
+
/**
|
|
29
|
+
* 文件传输串行链:同一 SshSession 的 upload/download 依次执行,避免同名目标并发竞争。
|
|
30
|
+
* 只串行传输,不影响 PTY 命令执行(SFTP 走独立 channel,不占用 busy/PTY)。
|
|
31
|
+
*/
|
|
32
|
+
private _transferChain;
|
|
27
33
|
protected get _extraResult(): Partial<ExecResult>;
|
|
28
34
|
protected _ready(): boolean;
|
|
29
35
|
protected _write(data: string): void;
|
|
@@ -34,6 +40,59 @@ export declare class SshSession extends BaseSession {
|
|
|
34
40
|
port?: number;
|
|
35
41
|
password?: string;
|
|
36
42
|
}): Promise<ConnectResult>;
|
|
43
|
+
/**
|
|
44
|
+
* 上传本机文件到远端(SFTP,不占用 PTY/busy)。
|
|
45
|
+
* 同一会话串行执行;每次操作打开独立 SFTP subsystem,结束即关闭。
|
|
46
|
+
* @param opts 上传参数(本地/远端路径、overwrite、mkdir、超时、大小上限)
|
|
47
|
+
* @returns 传输结果(路径/实际字节/耗时,不含内容)
|
|
48
|
+
*/
|
|
49
|
+
uploadFile(opts: Omit<UploadOptions, "sftp">): Promise<TransferResult>;
|
|
50
|
+
/**
|
|
51
|
+
* 下载远端文件到本机(SFTP,不占用 PTY/busy)。
|
|
52
|
+
* 同一会话串行执行;每次操作打开独立 SFTP subsystem,结束即关闭。
|
|
53
|
+
* @param opts 下载参数(远端/本地路径、overwrite、mkdir、超时、大小上限)
|
|
54
|
+
* @returns 传输结果(路径/实际字节/耗时,不含内容)
|
|
55
|
+
*/
|
|
56
|
+
downloadFile(opts: Omit<DownloadOptions, "sftp">): Promise<TransferResult>;
|
|
57
|
+
/**
|
|
58
|
+
* 串行化文件传输:前一个任务成功或失败后都继续执行下一个(失败不阻塞队列)。
|
|
59
|
+
* @param job 传输任务
|
|
60
|
+
* @returns 任务结果
|
|
61
|
+
*/
|
|
62
|
+
private _enqueueTransfer;
|
|
63
|
+
/**
|
|
64
|
+
* 打开 SFTP subsystem 执行任务,结束后始终关闭该 SFTP 通道。
|
|
65
|
+
* - 开通道也受总 deadline 约束;超时/迟到通道一律 destroy;
|
|
66
|
+
* - 通道 error 常驻监听:ssh2 在 ready 后已移除其内部 onError,
|
|
67
|
+
* 无监听会让协议异常变成未捕获 error;这里只记日志并中止本次传输,不改 PTY/连接状态;
|
|
68
|
+
* - **串行契约**:通道 error/超时后不立即结算,而是先中止 job(AbortSignal)并等它真正 settle
|
|
69
|
+
* 再 finish,避免下一个传输与孤儿 job 并行;job 自身 deadline + 清理预算应有界,
|
|
70
|
+
* 超过 TRANSFER_JOB_SETTLE_TIMEOUT_MS(12s)仍未结束则强制结算(此时通道已中止,job 无法再提交);
|
|
71
|
+
* - 连接已断开/SFTP 不可用时返回 sftp_unavailable。
|
|
72
|
+
* @param timeoutMs 本次传输总超时(含开通道)
|
|
73
|
+
* @param job 使用 SFTP 的任务(remainingMs 为开通道后的剩余时间,abortSignal 用于通道级中止)
|
|
74
|
+
* @returns 任务结果
|
|
75
|
+
*/
|
|
76
|
+
private _withSftp;
|
|
37
77
|
getStatus(): SessionStatus;
|
|
38
78
|
}
|
|
79
|
+
/** runSshTransfer 参数 */
|
|
80
|
+
export interface SshTransferRunParams<T> {
|
|
81
|
+
/** 解析后的终端会话(index 层传入,必须为 SshSession) */
|
|
82
|
+
session: unknown;
|
|
83
|
+
/** 权限审批(index 层传入 ctx.ask 调用;在传输前执行) */
|
|
84
|
+
ask: () => Promise<void>;
|
|
85
|
+
/** 审批通过后的实际传输 */
|
|
86
|
+
run: (session: SshSession) => Promise<T>;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* index 层文件传输统一入口:先做 SSH 会话判定,再审批,最后才执行传输。
|
|
90
|
+
* - 非 SshSession(LocalSession / docker / wsl)→ ssh_only,不审批、不打开 SFTP;
|
|
91
|
+
* - 审批拒绝 → denied,同样不开始传输;
|
|
92
|
+
* - 顺序固定:instanceof → ask → run,避免"先传后审"或对本地会话假装可传。
|
|
93
|
+
* @param params 会话、审批回调、传输回调
|
|
94
|
+
* @returns 传输结果
|
|
95
|
+
* @throws {TransferError} code=ssh_only / denied 或传输本身的错误
|
|
96
|
+
*/
|
|
97
|
+
export declare function runSshTransfer<T>(params: SshTransferRunParams<T>): Promise<T>;
|
|
39
98
|
//# sourceMappingURL=session.d.ts.map
|
package/dist/session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAkE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7J,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,CAAA;IAClB,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,qBAAa,UAAW,SAAQ,WAAW;IACzC,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,KAAK,CAAK;IAClB;;;OAGG;IACH,OAAO,CAAC,cAAc,CAAsC;IAE5D,SAAS,KAAK,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC,CAAgC;IAEjF,SAAS,CAAC,MAAM,IAAI,OAAO,CAE1B;IAED,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEnC;IAED,SAAS,CAAC,eAAe,IAAI,IAAI,CAIhC;IAEK,OAAO,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAiH5G;IAED;;;;;OAKG;IACG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAQ3E;IAED;;;;;OAKG;IACG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAQ/E;IAED;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,SAAS;IAiIjB,SAAS,IAAI,aAAa,CAYzB;CACF;AAED,wBAAwB;AACxB,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,yCAAyC;IACzC,OAAO,EAAE,OAAO,CAAA;IAChB,wCAAwC;IACxC,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACxB,iBAAiB;IACjB,GAAG,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;CACzC;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAUnF"}
|
package/dist/session.js
CHANGED
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
// 完成标记法:每条命令后追加一条标记命令,完成后输出 <SSH_DONE:nonce:seq:退出码>(不依赖 PROMPT_COMMAND/PS1 钩子)
|
|
3
3
|
import { Client } from "ssh2";
|
|
4
4
|
import log, { isDebugEnabled, ssh2Trace } from "./log.js";
|
|
5
|
-
import { INJECT_TIMEOUT_MS, PTY_COLS, PTY_ROWS, READY_TIMEOUT_MS, SSH_KEEPALIVE_COUNT_MAX, SSH_KEEPALIVE_INTERVAL_MS, } from "./constants.js";
|
|
5
|
+
import { INJECT_TIMEOUT_MS, PTY_COLS, PTY_ROWS, READY_TIMEOUT_MS, SSH_KEEPALIVE_COUNT_MAX, SSH_KEEPALIVE_INTERVAL_MS, TRANSFER_JOB_SETTLE_TIMEOUT_MS, TRANSFER_TIMEOUT_MS, } from "./constants.js";
|
|
6
6
|
import { tr } from "./i18n.js";
|
|
7
7
|
import { resolveAuth, resolvePassword } from "./ssh-auth.js";
|
|
8
|
+
import { assertTransferCapable, downloadFile, uploadFile, TransferError } from "./transfer.js";
|
|
8
9
|
import { BaseSession } from "./base-session.js";
|
|
9
10
|
export class SshSession extends BaseSession {
|
|
10
11
|
_client = null;
|
|
@@ -12,6 +13,11 @@ export class SshSession extends BaseSession {
|
|
|
12
13
|
_host = "";
|
|
13
14
|
_user = "";
|
|
14
15
|
_port = 22;
|
|
16
|
+
/**
|
|
17
|
+
* 文件传输串行链:同一 SshSession 的 upload/download 依次执行,避免同名目标并发竞争。
|
|
18
|
+
* 只串行传输,不影响 PTY 命令执行(SFTP 走独立 channel,不占用 busy/PTY)。
|
|
19
|
+
*/
|
|
20
|
+
_transferChain = Promise.resolve();
|
|
15
21
|
get _extraResult() { return { host: this._host }; }
|
|
16
22
|
_ready() {
|
|
17
23
|
return this._connected && this._stream !== null && this._adapter !== null;
|
|
@@ -139,6 +145,193 @@ export class SshSession extends BaseSession {
|
|
|
139
145
|
client.connect(config);
|
|
140
146
|
});
|
|
141
147
|
}
|
|
148
|
+
/**
|
|
149
|
+
* 上传本机文件到远端(SFTP,不占用 PTY/busy)。
|
|
150
|
+
* 同一会话串行执行;每次操作打开独立 SFTP subsystem,结束即关闭。
|
|
151
|
+
* @param opts 上传参数(本地/远端路径、overwrite、mkdir、超时、大小上限)
|
|
152
|
+
* @returns 传输结果(路径/实际字节/耗时,不含内容)
|
|
153
|
+
*/
|
|
154
|
+
async uploadFile(opts) {
|
|
155
|
+
assertTransferCapable(this);
|
|
156
|
+
const timeoutMs = opts.timeoutMs ?? TRANSFER_TIMEOUT_MS;
|
|
157
|
+
return this._enqueueTransfer(() => this._withSftp(timeoutMs, (sftp, remainingMs, abortSignal) => uploadFile({ ...opts, sftp, timeoutMs: remainingMs, abortSignal })));
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* 下载远端文件到本机(SFTP,不占用 PTY/busy)。
|
|
161
|
+
* 同一会话串行执行;每次操作打开独立 SFTP subsystem,结束即关闭。
|
|
162
|
+
* @param opts 下载参数(远端/本地路径、overwrite、mkdir、超时、大小上限)
|
|
163
|
+
* @returns 传输结果(路径/实际字节/耗时,不含内容)
|
|
164
|
+
*/
|
|
165
|
+
async downloadFile(opts) {
|
|
166
|
+
assertTransferCapable(this);
|
|
167
|
+
const timeoutMs = opts.timeoutMs ?? TRANSFER_TIMEOUT_MS;
|
|
168
|
+
return this._enqueueTransfer(() => this._withSftp(timeoutMs, (sftp, remainingMs, abortSignal) => downloadFile({ ...opts, sftp, timeoutMs: remainingMs, abortSignal })));
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* 串行化文件传输:前一个任务成功或失败后都继续执行下一个(失败不阻塞队列)。
|
|
172
|
+
* @param job 传输任务
|
|
173
|
+
* @returns 任务结果
|
|
174
|
+
*/
|
|
175
|
+
_enqueueTransfer(job) {
|
|
176
|
+
const run = this._transferChain.then(job, job);
|
|
177
|
+
this._transferChain = run.then(() => undefined, () => undefined);
|
|
178
|
+
return run;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* 打开 SFTP subsystem 执行任务,结束后始终关闭该 SFTP 通道。
|
|
182
|
+
* - 开通道也受总 deadline 约束;超时/迟到通道一律 destroy;
|
|
183
|
+
* - 通道 error 常驻监听:ssh2 在 ready 后已移除其内部 onError,
|
|
184
|
+
* 无监听会让协议异常变成未捕获 error;这里只记日志并中止本次传输,不改 PTY/连接状态;
|
|
185
|
+
* - **串行契约**:通道 error/超时后不立即结算,而是先中止 job(AbortSignal)并等它真正 settle
|
|
186
|
+
* 再 finish,避免下一个传输与孤儿 job 并行;job 自身 deadline + 清理预算应有界,
|
|
187
|
+
* 超过 TRANSFER_JOB_SETTLE_TIMEOUT_MS(12s)仍未结束则强制结算(此时通道已中止,job 无法再提交);
|
|
188
|
+
* - 连接已断开/SFTP 不可用时返回 sftp_unavailable。
|
|
189
|
+
* @param timeoutMs 本次传输总超时(含开通道)
|
|
190
|
+
* @param job 使用 SFTP 的任务(remainingMs 为开通道后的剩余时间,abortSignal 用于通道级中止)
|
|
191
|
+
* @returns 任务结果
|
|
192
|
+
*/
|
|
193
|
+
_withSftp(timeoutMs, job) {
|
|
194
|
+
const client = this._client;
|
|
195
|
+
if (!this._connected || !client) {
|
|
196
|
+
return Promise.reject(new TransferError("sftp_unavailable", undefined, "SSH session is not connected"));
|
|
197
|
+
}
|
|
198
|
+
const deadlineAt = Date.now() + Math.max(1, timeoutMs);
|
|
199
|
+
this._lastActive = Date.now();
|
|
200
|
+
return new Promise((resolve, reject) => {
|
|
201
|
+
let settled = false;
|
|
202
|
+
let jobStarted = false;
|
|
203
|
+
let jobSettled = false;
|
|
204
|
+
let channel = null;
|
|
205
|
+
let timer = null;
|
|
206
|
+
let settleTimer = null;
|
|
207
|
+
let pendingError = null;
|
|
208
|
+
const controller = new AbortController();
|
|
209
|
+
const clearTimers = () => {
|
|
210
|
+
if (timer) {
|
|
211
|
+
clearTimeout(timer);
|
|
212
|
+
timer = null;
|
|
213
|
+
}
|
|
214
|
+
if (settleTimer) {
|
|
215
|
+
clearTimeout(settleTimer);
|
|
216
|
+
settleTimer = null;
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
const finish = (err, value) => {
|
|
220
|
+
if (settled)
|
|
221
|
+
return;
|
|
222
|
+
settled = true;
|
|
223
|
+
clearTimers();
|
|
224
|
+
this._lastActive = Date.now();
|
|
225
|
+
if (err)
|
|
226
|
+
reject(err);
|
|
227
|
+
else
|
|
228
|
+
resolve(value);
|
|
229
|
+
};
|
|
230
|
+
/** 通道级失败:job 已在跑时等它 settle(有兜底上限),保证同一会话的传输不并行 */
|
|
231
|
+
const failAfterJob = (err) => {
|
|
232
|
+
if (settled)
|
|
233
|
+
return;
|
|
234
|
+
pendingError = err;
|
|
235
|
+
if (!jobStarted || jobSettled) {
|
|
236
|
+
finish(err);
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
if (!settleTimer) {
|
|
240
|
+
settleTimer = setTimeout(() => finish(pendingError ?? err), TRANSFER_JOB_SETTLE_TIMEOUT_MS);
|
|
241
|
+
}
|
|
242
|
+
};
|
|
243
|
+
/** 中止传输 job(signal → transfer deadline 立即拒绝)并销毁通道,然后按串行契约结算 */
|
|
244
|
+
const abortJob = (err) => {
|
|
245
|
+
try {
|
|
246
|
+
controller.abort(err);
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
/* 忽略 */
|
|
250
|
+
}
|
|
251
|
+
try {
|
|
252
|
+
channel?.destroy();
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
/* 通道可能尚未就绪/已关闭 */
|
|
256
|
+
}
|
|
257
|
+
failAfterJob(err);
|
|
258
|
+
};
|
|
259
|
+
timer = setTimeout(() => {
|
|
260
|
+
abortJob(new TransferError("timeout", undefined, `SFTP channel timeout after ${timeoutMs}ms`));
|
|
261
|
+
}, Math.max(1, deadlineAt - Date.now()));
|
|
262
|
+
try {
|
|
263
|
+
client.sftp((err, sftp) => {
|
|
264
|
+
if (settled) {
|
|
265
|
+
// 通道在超时/失败之后才就绪:直接销毁,避免泄漏
|
|
266
|
+
try {
|
|
267
|
+
sftp?.destroy();
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
/* 忽略 */
|
|
271
|
+
}
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
if (err || !sftp) {
|
|
275
|
+
finish(new TransferError("sftp_unavailable", undefined, err?.message ?? "SFTP subsystem unavailable"));
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
channel = sftp;
|
|
279
|
+
// 常驻 error 监听:不改变 PTY/连接状态,只中止本次 transfer(等 job settle 后再结算)
|
|
280
|
+
sftp.on("error", (e) => {
|
|
281
|
+
log.error(`SFTP 通道错误 (session ${this.sessionID}, term ${this.name})`, e);
|
|
282
|
+
abortJob(new TransferError("io", undefined, `SFTP channel error: ${e.message}`));
|
|
283
|
+
});
|
|
284
|
+
const remaining = deadlineAt - Date.now();
|
|
285
|
+
if (remaining <= 0) {
|
|
286
|
+
abortJob(new TransferError("timeout", undefined, `SFTP channel timeout after ${timeoutMs}ms`));
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
jobStarted = true;
|
|
290
|
+
let work;
|
|
291
|
+
try {
|
|
292
|
+
work = job(sftp, remaining, controller.signal);
|
|
293
|
+
}
|
|
294
|
+
catch (e) {
|
|
295
|
+
jobSettled = true;
|
|
296
|
+
try {
|
|
297
|
+
sftp.destroy();
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
/* 忽略 */
|
|
301
|
+
}
|
|
302
|
+
failAfterJob(e instanceof Error ? e : new Error(String(e)));
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
work.then((value) => {
|
|
306
|
+
jobSettled = true;
|
|
307
|
+
try {
|
|
308
|
+
sftp.end();
|
|
309
|
+
}
|
|
310
|
+
catch {
|
|
311
|
+
/* 忽略 */
|
|
312
|
+
}
|
|
313
|
+
// 已发生通道级失败时以失败为准,不能把迟到成功当成功返回
|
|
314
|
+
if (pendingError)
|
|
315
|
+
finish(pendingError);
|
|
316
|
+
else
|
|
317
|
+
finish(null, value);
|
|
318
|
+
}, (e) => {
|
|
319
|
+
jobSettled = true;
|
|
320
|
+
try {
|
|
321
|
+
sftp.end();
|
|
322
|
+
}
|
|
323
|
+
catch {
|
|
324
|
+
/* 忽略 */
|
|
325
|
+
}
|
|
326
|
+
finish(e instanceof Error ? e : new Error(String(e)));
|
|
327
|
+
});
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
catch (e) {
|
|
331
|
+
failAfterJob(new TransferError("sftp_unavailable", undefined, e instanceof Error ? e.message : String(e)));
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
}
|
|
142
335
|
getStatus() {
|
|
143
336
|
return {
|
|
144
337
|
connected: this._connected,
|
|
@@ -153,4 +346,25 @@ export class SshSession extends BaseSession {
|
|
|
153
346
|
};
|
|
154
347
|
}
|
|
155
348
|
}
|
|
349
|
+
/**
|
|
350
|
+
* index 层文件传输统一入口:先做 SSH 会话判定,再审批,最后才执行传输。
|
|
351
|
+
* - 非 SshSession(LocalSession / docker / wsl)→ ssh_only,不审批、不打开 SFTP;
|
|
352
|
+
* - 审批拒绝 → denied,同样不开始传输;
|
|
353
|
+
* - 顺序固定:instanceof → ask → run,避免"先传后审"或对本地会话假装可传。
|
|
354
|
+
* @param params 会话、审批回调、传输回调
|
|
355
|
+
* @returns 传输结果
|
|
356
|
+
* @throws {TransferError} code=ssh_only / denied 或传输本身的错误
|
|
357
|
+
*/
|
|
358
|
+
export async function runSshTransfer(params) {
|
|
359
|
+
if (!(params.session instanceof SshSession)) {
|
|
360
|
+
throw new TransferError("ssh_only", undefined, "file transfer requires an SSH session");
|
|
361
|
+
}
|
|
362
|
+
try {
|
|
363
|
+
await params.ask();
|
|
364
|
+
}
|
|
365
|
+
catch {
|
|
366
|
+
throw new TransferError("denied", undefined, "transfer denied by user");
|
|
367
|
+
}
|
|
368
|
+
return params.run(params.session);
|
|
369
|
+
}
|
|
156
370
|
//# sourceMappingURL=session.js.map
|
package/dist/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/** 传输方向 */
|
|
2
|
+
export type TransferDirection = "upload" | "download";
|
|
3
|
+
/** 传输任务状态(running=传输中;done=成功;failed=失败) */
|
|
4
|
+
export type TransferState = "running" | "done" | "failed";
|
|
5
|
+
/** 传输任务元数据(不含文件内容) */
|
|
6
|
+
export interface TransferTask {
|
|
7
|
+
/** 任务 ID(agent 生成,随机 UUID) */
|
|
8
|
+
id: string;
|
|
9
|
+
/** 所属主会话 ID */
|
|
10
|
+
sessionID: string;
|
|
11
|
+
/** 终端名 */
|
|
12
|
+
name: string;
|
|
13
|
+
/** 传输方向 */
|
|
14
|
+
direction: TransferDirection;
|
|
15
|
+
/** 本机路径(成功时由结果回填展开后的实际路径) */
|
|
16
|
+
localPath: string;
|
|
17
|
+
/** 远端路径 */
|
|
18
|
+
remotePath: string;
|
|
19
|
+
/** 当前状态 */
|
|
20
|
+
state: TransferState;
|
|
21
|
+
/** 已传字节数 */
|
|
22
|
+
bytes: number;
|
|
23
|
+
/** 总字节数(来自 stat;未知时为 0) */
|
|
24
|
+
total: number;
|
|
25
|
+
/** 开始时间(毫秒时间戳) */
|
|
26
|
+
startedAt: number;
|
|
27
|
+
/** 结束时间(毫秒时间戳;running 时缺省) */
|
|
28
|
+
endedAt?: number;
|
|
29
|
+
/** 失败机器码(如 exists/timeout/denied;成功时缺省) */
|
|
30
|
+
errorCode?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 解析并校验不可信的传输任务(agent 上报 / 测试输入)。
|
|
34
|
+
* - 字段类型与长度严格校验,未知 direction/state 一律拒绝;
|
|
35
|
+
* - 只保留协议白名单字段,丢弃未知字段(防止文件内容/额外敏感数据被透传);
|
|
36
|
+
* - 不校验 bytes ≤ total(进度回调与最终结果允许在文件增长等边界下不严格相等)。
|
|
37
|
+
* @param value 不可信输入
|
|
38
|
+
* @returns 校验通过的任务副本;不合法时 null
|
|
39
|
+
*/
|
|
40
|
+
export declare function parseTransferTask(value: unknown): TransferTask | null;
|
|
41
|
+
//# sourceMappingURL=transfer-events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer-events.d.ts","sourceRoot":"","sources":["../src/transfer-events.ts"],"names":[],"mappings":"AAiBA,WAAW;AACX,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,UAAU,CAAA;AAErD,4CAA4C;AAC5C,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAA;AAEzD,sBAAsB;AACtB,MAAM,WAAW,YAAY;IAC3B,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,eAAe;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW;IACX,SAAS,EAAE,iBAAiB,CAAA;IAC5B,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW;IACX,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW;IACX,KAAK,EAAE,aAAa,CAAA;IACpB,YAAY;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,kBAAkB;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAoBD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI,CAgCrE"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// 文件传输任务事件(agent → server → Web):只承载元数据,绝不包含文件内容。
|
|
2
|
+
//
|
|
3
|
+
// 协议:
|
|
4
|
+
// - agent → server:{ type: "transfer", task }
|
|
5
|
+
// - server → web: { type: "transfer", task } 广播;{ type: "transfers", tasks } 快照
|
|
6
|
+
//
|
|
7
|
+
// 本模块只做类型定义与不可信输入的严格校验;server 在写内存/广播前必须先经 parseTransferTask,
|
|
8
|
+
// 避免 agent 侧的异常值(未知方向/状态、超长路径、负数字节等)污染服务端状态或 Web 页面。
|
|
9
|
+
import { TRANSFER_TASK_ERROR_CODE_MAX, TRANSFER_TASK_ID_MAX, TRANSFER_TASK_NAME_MAX, TRANSFER_TASK_PATH_MAX, TRANSFER_TASK_SESSION_ID_MAX, } from "./constants.js";
|
|
10
|
+
const DIRECTIONS = ["upload", "download"];
|
|
11
|
+
const STATES = ["running", "done", "failed"];
|
|
12
|
+
/**
|
|
13
|
+
* 判断是否为长度受限的非空字符串。
|
|
14
|
+
* @param value 待校验值
|
|
15
|
+
* @param max 最大长度
|
|
16
|
+
* @returns true 表示合法
|
|
17
|
+
*/
|
|
18
|
+
function isBoundedNonEmptyString(value, max) {
|
|
19
|
+
return typeof value === "string" && value.length > 0 && value.length <= max;
|
|
20
|
+
}
|
|
21
|
+
/** 判断是否为非负有限整数(字节数/时间戳) */
|
|
22
|
+
function isNonNegativeInt(value) {
|
|
23
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 解析并校验不可信的传输任务(agent 上报 / 测试输入)。
|
|
27
|
+
* - 字段类型与长度严格校验,未知 direction/state 一律拒绝;
|
|
28
|
+
* - 只保留协议白名单字段,丢弃未知字段(防止文件内容/额外敏感数据被透传);
|
|
29
|
+
* - 不校验 bytes ≤ total(进度回调与最终结果允许在文件增长等边界下不严格相等)。
|
|
30
|
+
* @param value 不可信输入
|
|
31
|
+
* @returns 校验通过的任务副本;不合法时 null
|
|
32
|
+
*/
|
|
33
|
+
export function parseTransferTask(value) {
|
|
34
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
35
|
+
return null;
|
|
36
|
+
const v = value;
|
|
37
|
+
if (!isBoundedNonEmptyString(v.id, TRANSFER_TASK_ID_MAX))
|
|
38
|
+
return null;
|
|
39
|
+
if (!isBoundedNonEmptyString(v.sessionID, TRANSFER_TASK_SESSION_ID_MAX))
|
|
40
|
+
return null;
|
|
41
|
+
if (!isBoundedNonEmptyString(v.name, TRANSFER_TASK_NAME_MAX))
|
|
42
|
+
return null;
|
|
43
|
+
if (typeof v.direction !== "string" || !DIRECTIONS.includes(v.direction))
|
|
44
|
+
return null;
|
|
45
|
+
if (!isBoundedNonEmptyString(v.localPath, TRANSFER_TASK_PATH_MAX))
|
|
46
|
+
return null;
|
|
47
|
+
if (!isBoundedNonEmptyString(v.remotePath, TRANSFER_TASK_PATH_MAX))
|
|
48
|
+
return null;
|
|
49
|
+
if (typeof v.state !== "string" || !STATES.includes(v.state))
|
|
50
|
+
return null;
|
|
51
|
+
if (!isNonNegativeInt(v.bytes))
|
|
52
|
+
return null;
|
|
53
|
+
if (!isNonNegativeInt(v.total))
|
|
54
|
+
return null;
|
|
55
|
+
if (!isNonNegativeInt(v.startedAt))
|
|
56
|
+
return null;
|
|
57
|
+
if (v.endedAt !== undefined && !isNonNegativeInt(v.endedAt))
|
|
58
|
+
return null;
|
|
59
|
+
if (v.errorCode !== undefined && !isBoundedNonEmptyString(v.errorCode, TRANSFER_TASK_ERROR_CODE_MAX))
|
|
60
|
+
return null;
|
|
61
|
+
const task = {
|
|
62
|
+
id: v.id,
|
|
63
|
+
sessionID: v.sessionID,
|
|
64
|
+
name: v.name,
|
|
65
|
+
direction: v.direction,
|
|
66
|
+
localPath: v.localPath,
|
|
67
|
+
remotePath: v.remotePath,
|
|
68
|
+
state: v.state,
|
|
69
|
+
bytes: v.bytes,
|
|
70
|
+
total: v.total,
|
|
71
|
+
startedAt: v.startedAt,
|
|
72
|
+
};
|
|
73
|
+
if (v.endedAt !== undefined)
|
|
74
|
+
task.endedAt = v.endedAt;
|
|
75
|
+
if (v.errorCode !== undefined)
|
|
76
|
+
task.errorCode = v.errorCode;
|
|
77
|
+
return task;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=transfer-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer-events.js","sourceRoot":"","sources":["../src/transfer-events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import type { Readable, Writable } from "node:stream";
|
|
2
|
+
import type { ReadStreamOptions, Stats, WriteStreamOptions } from "ssh2";
|
|
3
|
+
/** 传输错误机器码(展示文案由 index.ts 按语言映射,不在本模块硬编码可见文本) */
|
|
4
|
+
export type TransferErrorCode = "exists" | "local_missing" | "local_is_dir" | "remote_missing" | "remote_is_dir" | "symlink" | "parent_missing" | "too_large" | "sftp_unavailable" | "timeout" | "io" | "unsupported" | "ssh_only" | "denied" | "tilde_user" | "remote_path_backslash";
|
|
5
|
+
/**
|
|
6
|
+
* 传输错误:只携带机器码 + 路径 + 内部诊断信息,展示文案由调用方按语言生成。
|
|
7
|
+
*/
|
|
8
|
+
export declare class TransferError extends Error {
|
|
9
|
+
readonly code: TransferErrorCode;
|
|
10
|
+
/** 出错涉及的路径(本地或远端,供文案回显) */
|
|
11
|
+
readonly path?: string;
|
|
12
|
+
/** 内部诊断信息(仅用于日志/io 文案,不是可见文案本身) */
|
|
13
|
+
readonly detail?: string;
|
|
14
|
+
/**
|
|
15
|
+
* @param code 机器码
|
|
16
|
+
* @param path 出错路径
|
|
17
|
+
* @param detail 内部诊断信息
|
|
18
|
+
*/
|
|
19
|
+
constructor(code: TransferErrorCode, path?: string, detail?: string);
|
|
20
|
+
}
|
|
21
|
+
/** 本模块使用的最小 SFTP 接口(与 ssh2 SFTPWrapper 结构兼容,单测可注入 fake) */
|
|
22
|
+
export interface TransferSftp {
|
|
23
|
+
stat(path: string, callback: (err: Error | undefined, stats: Stats) => void): void;
|
|
24
|
+
lstat(path: string, callback: (err: Error | undefined, stats: Stats) => void): void;
|
|
25
|
+
mkdir(path: string, callback: (err?: Error | null) => void): void;
|
|
26
|
+
rename(srcPath: string, destPath: string, callback: (err?: Error | null) => void): void;
|
|
27
|
+
unlink(path: string, callback: (err?: Error | null) => void): void;
|
|
28
|
+
realpath(path: string, callback: (err: Error | undefined, absPath: string) => void): void;
|
|
29
|
+
createReadStream(path: string, options?: ReadStreamOptions): Readable;
|
|
30
|
+
createWriteStream(path: string, options?: WriteStreamOptions): Writable;
|
|
31
|
+
end(): void;
|
|
32
|
+
destroy(): void;
|
|
33
|
+
}
|
|
34
|
+
/** 传输结果(成功时返回;不含文件内容) */
|
|
35
|
+
export interface TransferResult {
|
|
36
|
+
/** 实际使用的插件进程本机路径(~ 已展开) */
|
|
37
|
+
localPath: string;
|
|
38
|
+
/** 实际使用的远端路径(~/ 已由 SFTP 展开为绝对路径) */
|
|
39
|
+
remotePath: string;
|
|
40
|
+
/** 实际读/写字节数(来自流计数,不使用传输前 stat 值) */
|
|
41
|
+
bytes: number;
|
|
42
|
+
/** 耗时(毫秒) */
|
|
43
|
+
duration: number;
|
|
44
|
+
}
|
|
45
|
+
/** 上传参数(sftp 由 SshSession 注入) */
|
|
46
|
+
export interface UploadOptions {
|
|
47
|
+
sftp: TransferSftp;
|
|
48
|
+
localPath: string;
|
|
49
|
+
remotePath: string;
|
|
50
|
+
/** 目标存在时是否允许覆盖(默认 false = 独占创建,直接失败) */
|
|
51
|
+
overwrite?: boolean;
|
|
52
|
+
/** 父目录不存在时是否递归创建(默认 false = parent_missing) */
|
|
53
|
+
mkdir?: boolean;
|
|
54
|
+
/** 整个传输的超时(毫秒,默认 TRANSFER_TIMEOUT_MS) */
|
|
55
|
+
timeoutMs?: number;
|
|
56
|
+
/** 大小上限(字节,默认 MAX_TRANSFER_BYTES) */
|
|
57
|
+
maxBytes?: number;
|
|
58
|
+
/** 外部中止信号(会话层通道错误/超时注入;中止后立即拒绝且不再提交) */
|
|
59
|
+
abortSignal?: AbortSignal;
|
|
60
|
+
/**
|
|
61
|
+
* 进度回调(已传字节数 / 总字节数):拿到本地 stat 后先回调 `(0, size)`,
|
|
62
|
+
* 之后每累计一块回调一次;回调抛错会被吞掉,不影响传输本身。
|
|
63
|
+
*/
|
|
64
|
+
onProgress?: (bytes: number, total: number) => void;
|
|
65
|
+
}
|
|
66
|
+
/** 下载参数(sftp 由 SshSession 注入) */
|
|
67
|
+
export interface DownloadOptions {
|
|
68
|
+
sftp: TransferSftp;
|
|
69
|
+
remotePath: string;
|
|
70
|
+
localPath: string;
|
|
71
|
+
/** 本地目标存在时是否允许覆盖(默认 false = 独占创建,直接失败) */
|
|
72
|
+
overwrite?: boolean;
|
|
73
|
+
/** 本地父目录不存在时是否递归创建(默认 false = parent_missing) */
|
|
74
|
+
mkdir?: boolean;
|
|
75
|
+
/** 整个传输的超时(毫秒,默认 TRANSFER_TIMEOUT_MS) */
|
|
76
|
+
timeoutMs?: number;
|
|
77
|
+
/** 大小上限(字节,默认 MAX_TRANSFER_BYTES) */
|
|
78
|
+
maxBytes?: number;
|
|
79
|
+
/** 外部中止信号(会话层通道错误/超时注入;中止后立即拒绝且不再提交) */
|
|
80
|
+
abortSignal?: AbortSignal;
|
|
81
|
+
/** 进度回调(已传字节数 / 总字节数);语义同 UploadOptions.onProgress */
|
|
82
|
+
onProgress?: (bytes: number, total: number) => void;
|
|
83
|
+
}
|
|
84
|
+
/** 可执行文件传输的会话能力(仅 SshSession 实现;LocalSession 明确没有) */
|
|
85
|
+
export interface TransferCapableSession {
|
|
86
|
+
uploadFile(opts: Omit<UploadOptions, "sftp">): Promise<TransferResult>;
|
|
87
|
+
downloadFile(opts: Omit<DownloadOptions, "sftp">): Promise<TransferResult>;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 上传:插件进程本机普通文件 → SSH 远端(SFTP)。
|
|
91
|
+
* 默认独占创建目标(flags "wx");overwrite 时写同目录临时文件再 rename 提交。
|
|
92
|
+
* 任一步失败清理临时/已创建的部分文件;超时中止通道且不主动发起新的 rename/commit(已发出的 rename 可能仍被执行)。
|
|
93
|
+
* @param opts 上传参数
|
|
94
|
+
* @returns 传输结果(路径/实际字节/耗时,不含内容)
|
|
95
|
+
*/
|
|
96
|
+
export declare function uploadFile(opts: UploadOptions): Promise<TransferResult>;
|
|
97
|
+
/**
|
|
98
|
+
* 下载:SSH 远端普通文件(SFTP)→ 插件进程本机。
|
|
99
|
+
* 默认本地独占创建(fs flags "wx");overwrite 时写同目录临时文件再 rename 提交。
|
|
100
|
+
* 任一步失败清理临时/已创建的部分文件;超时中止通道且不主动发起新的 rename/commit(已发出的 rename 可能仍被执行)。
|
|
101
|
+
* @param opts 下载参数
|
|
102
|
+
* @returns 传输结果(路径/实际字节/耗时,不含内容)
|
|
103
|
+
*/
|
|
104
|
+
export declare function downloadFile(opts: DownloadOptions): Promise<TransferResult>;
|
|
105
|
+
/**
|
|
106
|
+
* 校验 upload/download 的位置参数:必须恰好两个非空路径(多给/少给都报用法)。
|
|
107
|
+
* @param positionals 位置参数
|
|
108
|
+
* @returns 两个路径;不合法时 null
|
|
109
|
+
*/
|
|
110
|
+
export declare function parseTransferPositionals(positionals: string[]): {
|
|
111
|
+
first: string;
|
|
112
|
+
second: string;
|
|
113
|
+
} | null;
|
|
114
|
+
/**
|
|
115
|
+
* 断言会话具备文件传输能力(仅 SSH 会话):LocalSession 等明确拒绝。
|
|
116
|
+
* 用结构判定而非 instanceof,避免 transfer.ts 反向依赖 session.ts(循环导入)。
|
|
117
|
+
* @param session 终端会话
|
|
118
|
+
* @throws {TransferError} code=ssh_only
|
|
119
|
+
*/
|
|
120
|
+
export declare function assertTransferCapable(session: unknown): asserts session is TransferCapableSession;
|
|
121
|
+
//# sourceMappingURL=transfer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../src/transfer.ts"],"names":[],"mappings":"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"}
|