@team-work/sandbox-client 0.1.1-beta.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 +69 -0
- package/dist/cli/config-cmd.d.ts +3 -0
- package/dist/cli/config-cmd.js +60 -0
- package/dist/cli/config-cmd.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +30 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/list-cmd.d.ts +3 -0
- package/dist/cli/list-cmd.js +36 -0
- package/dist/cli/list-cmd.js.map +1 -0
- package/dist/cli/log-cmd.d.ts +3 -0
- package/dist/cli/log-cmd.js +118 -0
- package/dist/cli/log-cmd.js.map +1 -0
- package/dist/cli/start-cmd.d.ts +3 -0
- package/dist/cli/start-cmd.js +69 -0
- package/dist/cli/start-cmd.js.map +1 -0
- package/dist/cli/status-cmd.d.ts +3 -0
- package/dist/cli/status-cmd.js +46 -0
- package/dist/cli/status-cmd.js.map +1 -0
- package/dist/cli/stop-cmd.d.ts +3 -0
- package/dist/cli/stop-cmd.js +115 -0
- package/dist/cli/stop-cmd.js.map +1 -0
- package/dist/cli/update-cmd.d.ts +3 -0
- package/dist/cli/update-cmd.js +16 -0
- package/dist/cli/update-cmd.js.map +1 -0
- package/dist/client/frames.d.ts +111 -0
- package/dist/client/frames.js +22 -0
- package/dist/client/frames.js.map +1 -0
- package/dist/client/handshake.d.ts +7 -0
- package/dist/client/handshake.js +83 -0
- package/dist/client/handshake.js.map +1 -0
- package/dist/client/protocol.d.ts +36 -0
- package/dist/client/protocol.js +39 -0
- package/dist/client/protocol.js.map +1 -0
- package/dist/client/ws-client.d.ts +48 -0
- package/dist/client/ws-client.js +272 -0
- package/dist/client/ws-client.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.js +68 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/paths.d.ts +14 -0
- package/dist/config/paths.js +41 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/schema.d.ts +17 -0
- package/dist/config/schema.js +52 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/daemon/detach.d.ts +17 -0
- package/dist/daemon/detach.js +30 -0
- package/dist/daemon/detach.js.map +1 -0
- package/dist/daemon/launch.d.ts +15 -0
- package/dist/daemon/launch.js +70 -0
- package/dist/daemon/launch.js.map +1 -0
- package/dist/daemon/signal.d.ts +7 -0
- package/dist/daemon/signal.js +22 -0
- package/dist/daemon/signal.js.map +1 -0
- package/dist/handlers/rpc/exec-shell.d.ts +13 -0
- package/dist/handlers/rpc/exec-shell.js +52 -0
- package/dist/handlers/rpc/exec-shell.js.map +1 -0
- package/dist/handlers/rpc/file-ops.d.ts +17 -0
- package/dist/handlers/rpc/file-ops.js +163 -0
- package/dist/handlers/rpc/file-ops.js.map +1 -0
- package/dist/handlers/rpc/router.d.ts +9 -0
- package/dist/handlers/rpc/router.js +98 -0
- package/dist/handlers/rpc/router.js.map +1 -0
- package/dist/handlers/terminal/manager.d.ts +20 -0
- package/dist/handlers/terminal/manager.js +75 -0
- package/dist/handlers/terminal/manager.js.map +1 -0
- package/dist/handlers/terminal/pty-session.d.ts +17 -0
- package/dist/handlers/terminal/pty-session.js +76 -0
- package/dist/handlers/terminal/pty-session.js.map +1 -0
- package/dist/handlers/terminal/router.d.ts +6 -0
- package/dist/handlers/terminal/router.js +25 -0
- package/dist/handlers/terminal/router.js.map +1 -0
- package/dist/instance/id.d.ts +5 -0
- package/dist/instance/id.js +17 -0
- package/dist/instance/id.js.map +1 -0
- package/dist/instance/store.d.ts +33 -0
- package/dist/instance/store.js +155 -0
- package/dist/instance/store.js.map +1 -0
- package/dist/instance/types.d.ts +28 -0
- package/dist/instance/types.js +7 -0
- package/dist/instance/types.js.map +1 -0
- package/dist/logging/logger.d.ts +11 -0
- package/dist/logging/logger.js +42 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/system/report.d.ts +2 -0
- package/dist/system/report.js +61 -0
- package/dist/system/report.js.map +1 -0
- package/dist/update/self-update.d.ts +8 -0
- package/dist/update/self-update.js +41 -0
- package/dist/update/self-update.js.map +1 -0
- package/dist/utils/info.d.ts +11 -0
- package/dist/utils/info.js +21 -0
- package/dist/utils/info.js.map +1 -0
- package/dist/utils/pem.d.ts +15 -0
- package/dist/utils/pem.js +31 -0
- package/dist/utils/pem.js.map +1 -0
- package/package.json +44 -0
- package/scripts/fix-pty-perms.js +30 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-client.js","sourceRoot":"","sources":["../../src/client/ws-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { TwConfig } from './schema.js';
|
|
2
|
+
export type { TwConfig };
|
|
3
|
+
export declare function loadConfig(): TwConfig;
|
|
4
|
+
export declare function getConfig<K extends keyof TwConfig>(key: K): TwConfig[K];
|
|
5
|
+
export declare function setConfig(key: string, value: string): void;
|
|
6
|
+
export declare function unsetConfig(key: string): void;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loadConfig = loadConfig;
|
|
4
|
+
exports.getConfig = getConfig;
|
|
5
|
+
exports.setConfig = setConfig;
|
|
6
|
+
exports.unsetConfig = unsetConfig;
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const node_path_1 = require("node:path");
|
|
9
|
+
const paths_js_1 = require("./paths.js");
|
|
10
|
+
const schema_js_1 = require("./schema.js");
|
|
11
|
+
/**
|
|
12
|
+
* 配置读写。文件权限 0600(仅属主可读写)。
|
|
13
|
+
* 文件格式:JSON。不存在时按默认值创建。
|
|
14
|
+
*/
|
|
15
|
+
function ensureFile() {
|
|
16
|
+
if (!(0, node_fs_1.existsSync)(paths_js_1.CONFIG_FILE)) {
|
|
17
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(paths_js_1.CONFIG_FILE), { recursive: true });
|
|
18
|
+
(0, node_fs_1.writeFileSync)(paths_js_1.CONFIG_FILE, JSON.stringify(schema_js_1.DEFAULT_CONFIG, null, 2), { mode: 0o600 });
|
|
19
|
+
(0, node_fs_1.chmodSync)(paths_js_1.CONFIG_FILE, 0o600);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function loadConfig() {
|
|
23
|
+
ensureFile();
|
|
24
|
+
let raw;
|
|
25
|
+
try {
|
|
26
|
+
raw = (0, node_fs_1.readFileSync)(paths_js_1.CONFIG_FILE, 'utf8');
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return { ...schema_js_1.DEFAULT_CONFIG };
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
const parsed = JSON.parse(raw);
|
|
33
|
+
return (0, schema_js_1.applyDefaults)(parsed);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// 配置损坏:返回默认,不静默覆盖以免丢用户配置
|
|
37
|
+
return { ...schema_js_1.DEFAULT_CONFIG };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function saveConfig(config) {
|
|
41
|
+
ensureFile();
|
|
42
|
+
(0, node_fs_1.writeFileSync)(paths_js_1.CONFIG_FILE, JSON.stringify(config, null, 2), { mode: 0o600 });
|
|
43
|
+
(0, node_fs_1.chmodSync)(paths_js_1.CONFIG_FILE, 0o600);
|
|
44
|
+
}
|
|
45
|
+
function getConfig(key) {
|
|
46
|
+
return loadConfig()[key];
|
|
47
|
+
}
|
|
48
|
+
function setConfig(key, value) {
|
|
49
|
+
if (!(0, schema_js_1.isValidKey)(key)) {
|
|
50
|
+
throw new Error(`未知配置项: ${key}(合法: serverUrl, logDir)`);
|
|
51
|
+
}
|
|
52
|
+
const err = (0, schema_js_1.validateConfigValue)(key, value);
|
|
53
|
+
if (err) {
|
|
54
|
+
throw new Error(err);
|
|
55
|
+
}
|
|
56
|
+
const config = loadConfig();
|
|
57
|
+
config[key] = value;
|
|
58
|
+
saveConfig(config);
|
|
59
|
+
}
|
|
60
|
+
function unsetConfig(key) {
|
|
61
|
+
if (!(0, schema_js_1.isValidKey)(key)) {
|
|
62
|
+
throw new Error(`未知配置项: ${key}`);
|
|
63
|
+
}
|
|
64
|
+
const config = loadConfig();
|
|
65
|
+
config[key] = schema_js_1.DEFAULT_CONFIG[key];
|
|
66
|
+
saveConfig(config);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":";;AAqBA,gCAeC;AAQD,8BAEC;AAED,8BAWC;AAED,kCAOC;AApED,qCAAwF;AACxF,yCAAoC;AAEpC,yCAAyC;AACzC,2CAAuG;AAIvG;;;GAGG;AAEH,SAAS,UAAU;IACjB,IAAI,CAAC,IAAA,oBAAU,EAAC,sBAAW,CAAC,EAAE,CAAC;QAC7B,IAAA,mBAAS,EAAC,IAAA,mBAAO,EAAC,sBAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,IAAA,uBAAa,EAAC,sBAAW,EAAE,IAAI,CAAC,SAAS,CAAC,0BAAc,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACrF,IAAA,mBAAS,EAAC,sBAAW,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC;AACH,CAAC;AAED,SAAgB,UAAU;IACxB,UAAU,EAAE,CAAC;IACb,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,IAAA,sBAAY,EAAC,sBAAW,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,0BAAc,EAAE,CAAC;IAC/B,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsB,CAAC;QACpD,OAAO,IAAA,yBAAa,EAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;QACzB,OAAO,EAAE,GAAG,0BAAc,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,MAAgB;IAClC,UAAU,EAAE,CAAC;IACb,IAAA,uBAAa,EAAC,sBAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7E,IAAA,mBAAS,EAAC,sBAAW,EAAE,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,SAAgB,SAAS,CAA2B,GAAM;IACxD,OAAO,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,SAAgB,SAAS,CAAC,GAAW,EAAE,KAAa;IAClD,IAAI,CAAC,IAAA,sBAAU,EAAC,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,yBAAyB,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,GAAG,GAAG,IAAA,+BAAmB,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC5C,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACpB,UAAU,CAAC,MAAM,CAAC,CAAC;AACrB,CAAC;AAED,SAAgB,WAAW,CAAC,GAAW;IACrC,IAAI,CAAC,IAAA,sBAAU,EAAC,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;IACnC,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,CAAC,GAAG,CAAC,GAAG,0BAAc,CAAC,GAAG,CAAC,CAAC;IAClC,UAAU,CAAC,MAAM,CAAC,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** team-work CLI 本地数据根目录:~/.tw */
|
|
2
|
+
export declare const TW_HOME: string;
|
|
3
|
+
/** 配置文件 */
|
|
4
|
+
export declare const CONFIG_FILE: string;
|
|
5
|
+
/** 实例状态目录 */
|
|
6
|
+
export declare const INSTANCES_DIR: string;
|
|
7
|
+
/** 默认日志目录 */
|
|
8
|
+
export declare const DEFAULT_LOG_DIR: string;
|
|
9
|
+
/** 某实例的日志文件 */
|
|
10
|
+
export declare const instanceLogFile: (logDir: string, instanceId: string) => string;
|
|
11
|
+
/** 某实例的状态文件 */
|
|
12
|
+
export declare const instanceStateFile: (instanceId: string) => string;
|
|
13
|
+
/** 清理超过 maxAgeMs 的废弃日志文件,返回被删除的文件数 */
|
|
14
|
+
export declare function purgeOldLogs(logDir: string, maxAgeMs: number): number;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.instanceStateFile = exports.instanceLogFile = exports.DEFAULT_LOG_DIR = exports.INSTANCES_DIR = exports.CONFIG_FILE = exports.TW_HOME = void 0;
|
|
4
|
+
exports.purgeOldLogs = purgeOldLogs;
|
|
5
|
+
const node_os_1 = require("node:os");
|
|
6
|
+
const node_path_1 = require("node:path");
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
/** team-work CLI 本地数据根目录:~/.tw */
|
|
9
|
+
exports.TW_HOME = (0, node_path_1.join)((0, node_os_1.homedir)(), '.tw');
|
|
10
|
+
/** 配置文件 */
|
|
11
|
+
exports.CONFIG_FILE = (0, node_path_1.join)(exports.TW_HOME, 'config.json');
|
|
12
|
+
/** 实例状态目录 */
|
|
13
|
+
exports.INSTANCES_DIR = (0, node_path_1.join)(exports.TW_HOME, 'instances');
|
|
14
|
+
/** 默认日志目录 */
|
|
15
|
+
exports.DEFAULT_LOG_DIR = (0, node_path_1.join)(exports.TW_HOME, 'logs');
|
|
16
|
+
/** 某实例的日志文件 */
|
|
17
|
+
const instanceLogFile = (logDir, instanceId) => (0, node_path_1.join)(logDir, `${instanceId}.log`);
|
|
18
|
+
exports.instanceLogFile = instanceLogFile;
|
|
19
|
+
/** 某实例的状态文件 */
|
|
20
|
+
const instanceStateFile = (instanceId) => (0, node_path_1.join)(exports.INSTANCES_DIR, `${instanceId}.json`);
|
|
21
|
+
exports.instanceStateFile = instanceStateFile;
|
|
22
|
+
/** 清理超过 maxAgeMs 的废弃日志文件,返回被删除的文件数 */
|
|
23
|
+
function purgeOldLogs(logDir, maxAgeMs) {
|
|
24
|
+
let n = 0;
|
|
25
|
+
for (const f of (0, node_fs_1.readdirSync)(logDir)) {
|
|
26
|
+
if (!f.endsWith('.log'))
|
|
27
|
+
continue;
|
|
28
|
+
try {
|
|
29
|
+
const st = (0, node_fs_1.statSync)((0, node_path_1.join)(logDir, f));
|
|
30
|
+
if (Date.now() - st.mtimeMs > maxAgeMs) {
|
|
31
|
+
(0, node_fs_1.unlinkSync)((0, node_path_1.join)(logDir, f));
|
|
32
|
+
n++;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// 跳过无法访问的文件
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return n;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":";;;AAyBA,oCAeC;AAxCD,qCAAkC;AAClC,yCAAiC;AACjC,qCAA4D;AAE5D,kCAAkC;AACrB,QAAA,OAAO,GAAG,IAAA,gBAAI,EAAC,IAAA,iBAAO,GAAE,EAAE,KAAK,CAAC,CAAC;AAE9C,WAAW;AACE,QAAA,WAAW,GAAG,IAAA,gBAAI,EAAC,eAAO,EAAE,aAAa,CAAC,CAAC;AAExD,aAAa;AACA,QAAA,aAAa,GAAG,IAAA,gBAAI,EAAC,eAAO,EAAE,WAAW,CAAC,CAAC;AAExD,aAAa;AACA,QAAA,eAAe,GAAG,IAAA,gBAAI,EAAC,eAAO,EAAE,MAAM,CAAC,CAAC;AAErD,eAAe;AACR,MAAM,eAAe,GAAG,CAAC,MAAc,EAAE,UAAkB,EAAU,EAAE,CAC5E,IAAA,gBAAI,EAAC,MAAM,EAAE,GAAG,UAAU,MAAM,CAAC,CAAC;AADvB,QAAA,eAAe,mBACQ;AAEpC,eAAe;AACR,MAAM,iBAAiB,GAAG,CAAC,UAAkB,EAAU,EAAE,CAC9D,IAAA,gBAAI,EAAC,qBAAa,EAAE,GAAG,UAAU,OAAO,CAAC,CAAC;AAD/B,QAAA,iBAAiB,qBACc;AAE5C,sCAAsC;AACtC,SAAgB,YAAY,CAAC,MAAc,EAAE,QAAgB;IAC3D,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,CAAC,IAAI,IAAA,qBAAW,EAAC,MAAM,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,SAAS;QAClC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAA,kBAAQ,EAAC,IAAA,gBAAI,EAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;YACrC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC;gBACvC,IAAA,oBAAU,EAAC,IAAA,gBAAI,EAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC5B,CAAC,EAAE,CAAC;YACN,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 配置 schema:合法 key、默认值、校验。
|
|
3
|
+
* sandboxId 不在此处——它由 `tw start <sandboxId> <privateKey>` 位置参数传入。
|
|
4
|
+
*/
|
|
5
|
+
export interface TwConfig {
|
|
6
|
+
/** sandbox ws 地址,如 ws://10.0.0.1:18081/ws/sandbox/cli */
|
|
7
|
+
serverUrl: string;
|
|
8
|
+
/** 日志目录,默认 ~/.tw/logs */
|
|
9
|
+
logDir: string;
|
|
10
|
+
}
|
|
11
|
+
export declare const DEFAULT_CONFIG: TwConfig;
|
|
12
|
+
export declare const CONFIG_KEYS: (keyof TwConfig)[];
|
|
13
|
+
export declare function isValidKey(key: string): key is keyof TwConfig;
|
|
14
|
+
/** 校验单个配置值,返回 null 表示通过,否则返回错误信息 */
|
|
15
|
+
export declare function validateConfigValue(key: keyof TwConfig, value: string): string | null;
|
|
16
|
+
/** 应用默认值(logDir 为空时回退到默认) */
|
|
17
|
+
export declare function applyDefaults(raw: Partial<TwConfig>): TwConfig;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 配置 schema:合法 key、默认值、校验。
|
|
4
|
+
* sandboxId 不在此处——它由 `tw start <sandboxId> <privateKey>` 位置参数传入。
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.CONFIG_KEYS = exports.DEFAULT_CONFIG = void 0;
|
|
8
|
+
exports.isValidKey = isValidKey;
|
|
9
|
+
exports.validateConfigValue = validateConfigValue;
|
|
10
|
+
exports.applyDefaults = applyDefaults;
|
|
11
|
+
exports.DEFAULT_CONFIG = {
|
|
12
|
+
serverUrl: '',
|
|
13
|
+
logDir: '',
|
|
14
|
+
};
|
|
15
|
+
/** 合法配置 key 与其校验器 */
|
|
16
|
+
const VALIDATORS = {
|
|
17
|
+
serverUrl: (v) => {
|
|
18
|
+
if (!v)
|
|
19
|
+
return 'serverUrl 不能为空';
|
|
20
|
+
if (!/^wss?:\/\//.test(v))
|
|
21
|
+
return 'serverUrl 必须以 ws:// 或 wss:// 开头';
|
|
22
|
+
try {
|
|
23
|
+
// eslint-disable-next-line no-new
|
|
24
|
+
new URL(v);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return 'serverUrl 不是合法 URL';
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
},
|
|
31
|
+
logDir: (v) => {
|
|
32
|
+
if (!v)
|
|
33
|
+
return null; // 允许空,用默认值
|
|
34
|
+
return null;
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
exports.CONFIG_KEYS = Object.keys(exports.DEFAULT_CONFIG);
|
|
38
|
+
function isValidKey(key) {
|
|
39
|
+
return key in exports.DEFAULT_CONFIG;
|
|
40
|
+
}
|
|
41
|
+
/** 校验单个配置值,返回 null 表示通过,否则返回错误信息 */
|
|
42
|
+
function validateConfigValue(key, value) {
|
|
43
|
+
return VALIDATORS[key](value);
|
|
44
|
+
}
|
|
45
|
+
/** 应用默认值(logDir 为空时回退到默认) */
|
|
46
|
+
function applyDefaults(raw) {
|
|
47
|
+
return {
|
|
48
|
+
serverUrl: raw.serverUrl ?? exports.DEFAULT_CONFIG.serverUrl,
|
|
49
|
+
logDir: raw.logDir || exports.DEFAULT_CONFIG.logDir,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAmCH,gCAEC;AAGD,kDAEC;AAGD,sCAKC;AAzCY,QAAA,cAAc,GAAa;IACtC,SAAS,EAAE,EAAE;IACb,MAAM,EAAE,EAAE;CACX,CAAC;AAEF,qBAAqB;AACrB,MAAM,UAAU,GAAyD;IACvE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;QACf,IAAI,CAAC,CAAC;YAAE,OAAO,gBAAgB,CAAC;QAChC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,iCAAiC,CAAC;QACpE,IAAI,CAAC;YACH,kCAAkC;YAClC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACb,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,oBAAoB,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE;QACZ,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,WAAW;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC;AAEW,QAAA,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,sBAAc,CAAuB,CAAC;AAE7E,SAAgB,UAAU,CAAC,GAAW;IACpC,OAAO,GAAG,IAAI,sBAAc,CAAC;AAC/B,CAAC;AAED,oCAAoC;AACpC,SAAgB,mBAAmB,CAAC,GAAmB,EAAE,KAAa;IACpE,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,6BAA6B;AAC7B,SAAgB,aAAa,CAAC,GAAsB;IAClD,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,sBAAc,CAAC,SAAS;QACpD,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,sBAAc,CAAC,MAAM;KAC5C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { InstanceRecord } from '../instance/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* 后台启动:spawn 一个 detached 子进程跑前台模式,父进程立即退出。
|
|
5
|
+
* 子进程启动后写状态文件;父进程轮询状态文件确认启动并取 pid。
|
|
6
|
+
*/
|
|
7
|
+
export declare function detachStart(args: {
|
|
8
|
+
sandboxId: string;
|
|
9
|
+
privateKey: string;
|
|
10
|
+
entryPath: string;
|
|
11
|
+
instanceId?: string;
|
|
12
|
+
}): {
|
|
13
|
+
instanceId: string;
|
|
14
|
+
child: ReturnType<typeof spawn>;
|
|
15
|
+
};
|
|
16
|
+
/** 轮询状态文件直到出现或超时,返回实例记录 */
|
|
17
|
+
export declare function waitForInstance(instanceId: string, timeoutMs?: number): Promise<InstanceRecord | null>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.detachStart = detachStart;
|
|
4
|
+
exports.waitForInstance = waitForInstance;
|
|
5
|
+
const node_child_process_1 = require("node:child_process");
|
|
6
|
+
const id_js_1 = require("../instance/id.js");
|
|
7
|
+
const store_js_1 = require("../instance/store.js");
|
|
8
|
+
/**
|
|
9
|
+
* 后台启动:spawn 一个 detached 子进程跑前台模式,父进程立即退出。
|
|
10
|
+
* 子进程启动后写状态文件;父进程轮询状态文件确认启动并取 pid。
|
|
11
|
+
*/
|
|
12
|
+
function detachStart(args) {
|
|
13
|
+
const instanceId = args.instanceId || (0, id_js_1.generateInstanceId)();
|
|
14
|
+
const child = (0, node_child_process_1.spawn)(process.execPath, [args.entryPath, 'start', args.sandboxId, args.privateKey, '--daemon', '--id', instanceId], { detached: true, stdio: 'ignore' });
|
|
15
|
+
child.unref();
|
|
16
|
+
return { instanceId, child };
|
|
17
|
+
}
|
|
18
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
19
|
+
/** 轮询状态文件直到出现或超时,返回实例记录 */
|
|
20
|
+
async function waitForInstance(instanceId, timeoutMs = 3000) {
|
|
21
|
+
const deadline = Date.now() + timeoutMs;
|
|
22
|
+
while (Date.now() < deadline) {
|
|
23
|
+
const rec = (0, store_js_1.loadInstance)(instanceId);
|
|
24
|
+
if (rec)
|
|
25
|
+
return rec;
|
|
26
|
+
await sleep(50);
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=detach.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detach.js","sourceRoot":"","sources":["../../src/daemon/detach.ts"],"names":[],"mappings":";;AAUA,kCAcC;AAKD,0CAWC;AAxCD,2DAA2C;AAE3C,6CAAuD;AACvD,mDAAoD;AAGpD;;;GAGG;AACH,SAAgB,WAAW,CAAC,IAK3B;IACC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAA,0BAAkB,GAAE,CAAC;IAC3D,MAAM,KAAK,GAAG,IAAA,0BAAK,EACjB,OAAO,CAAC,QAAQ,EAChB,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAC1F,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CACpC,CAAC;IACF,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAE1E,2BAA2B;AACpB,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,SAAS,GAAG,IAAI;IAEhB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAA,uBAAY,EAAC,UAAU,CAAC,CAAC;QACrC,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;QACpB,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { TwConfig } from '../config/index.js';
|
|
2
|
+
import { getLogger } from '../logging/logger.js';
|
|
3
|
+
export interface DaemonOptions {
|
|
4
|
+
sandboxId: string;
|
|
5
|
+
privateKey: string;
|
|
6
|
+
config: TwConfig;
|
|
7
|
+
instanceId?: string;
|
|
8
|
+
foreground?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 守护进程主逻辑(前台或后台子进程均走这里):
|
|
12
|
+
* init logger → 写状态文件 → 建 WsClient → 注册信号 → run → 退出。
|
|
13
|
+
*/
|
|
14
|
+
export declare function runDaemon(opts: DaemonOptions): Promise<number>;
|
|
15
|
+
export { getLogger };
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getLogger = void 0;
|
|
4
|
+
exports.runDaemon = runDaemon;
|
|
5
|
+
const node_os_1 = require("node:os");
|
|
6
|
+
const paths_js_1 = require("../config/paths.js");
|
|
7
|
+
const ws_client_js_1 = require("../client/ws-client.js");
|
|
8
|
+
const logger_js_1 = require("../logging/logger.js");
|
|
9
|
+
Object.defineProperty(exports, "getLogger", { enumerable: true, get: function () { return logger_js_1.getLogger; } });
|
|
10
|
+
const id_js_1 = require("../instance/id.js");
|
|
11
|
+
const store_js_1 = require("../instance/store.js");
|
|
12
|
+
const signal_js_1 = require("./signal.js");
|
|
13
|
+
/**
|
|
14
|
+
* 守护进程主逻辑(前台或后台子进程均走这里):
|
|
15
|
+
* init logger → 写状态文件 → 建 WsClient → 注册信号 → run → 退出。
|
|
16
|
+
*/
|
|
17
|
+
async function runDaemon(opts) {
|
|
18
|
+
const instanceId = opts.instanceId || (0, id_js_1.generateInstanceId)();
|
|
19
|
+
const logDir = opts.config.logDir || paths_js_1.DEFAULT_LOG_DIR;
|
|
20
|
+
const logger = (0, logger_js_1.initLogger)(logDir, instanceId, opts.foreground);
|
|
21
|
+
// 启动前清理 7 天前的废弃日志
|
|
22
|
+
const cleaned = (0, paths_js_1.purgeOldLogs)(logDir, 7 * 24 * 60 * 60 * 1000);
|
|
23
|
+
if (cleaned > 0) {
|
|
24
|
+
logger.info({ count: cleaned, logDir }, 'purged old log files');
|
|
25
|
+
}
|
|
26
|
+
// 写初始状态文件
|
|
27
|
+
const rec = {
|
|
28
|
+
id: instanceId,
|
|
29
|
+
pid: process.pid,
|
|
30
|
+
sandboxId: opts.sandboxId,
|
|
31
|
+
tokenHash: (0, store_js_1.tokenHash)(opts.privateKey),
|
|
32
|
+
serverUrl: opts.config.serverUrl,
|
|
33
|
+
startedAt: new Date().toISOString(),
|
|
34
|
+
status: 'running',
|
|
35
|
+
wsState: 'connecting',
|
|
36
|
+
lastSeenAt: new Date().toISOString(),
|
|
37
|
+
logFile: (0, paths_js_1.instanceLogFile)(logDir, instanceId),
|
|
38
|
+
};
|
|
39
|
+
(0, store_js_1.saveInstance)(rec);
|
|
40
|
+
const client = new ws_client_js_1.WsClient({
|
|
41
|
+
serverUrl: opts.config.serverUrl,
|
|
42
|
+
sandboxId: opts.sandboxId,
|
|
43
|
+
privateKey: opts.privateKey,
|
|
44
|
+
logger,
|
|
45
|
+
onWsState: (s) => (0, store_js_1.updateInstance)(instanceId, { wsState: s, lastSeenAt: new Date().toISOString() }),
|
|
46
|
+
});
|
|
47
|
+
(0, signal_js_1.installSignalHandlers)(client, logger);
|
|
48
|
+
logger.info({ pid: process.pid, sandboxId: opts.sandboxId, serverUrl: opts.config.serverUrl, host: (0, node_os_1.hostname)() }, 'tw daemon starting');
|
|
49
|
+
let exitCode = 0;
|
|
50
|
+
let reason = 'signal';
|
|
51
|
+
try {
|
|
52
|
+
reason = await client.run();
|
|
53
|
+
exitCode = reason === 'auth-failed' || reason === 'reconnect-exhausted' ? 1 : 0;
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
reason = 'crashed';
|
|
57
|
+
exitCode = 1;
|
|
58
|
+
logger.error({ err: err instanceof Error ? err.message : String(err) }, 'daemon crashed');
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
// 退出前确保日志落盘(pino sync 已即时写,但显式 flush 一道保险)
|
|
62
|
+
logger.flush?.();
|
|
63
|
+
logger.info({ reason }, 'daemon exited, removing instance record');
|
|
64
|
+
logger.flush?.();
|
|
65
|
+
// 删除实例记录:退出即清理,list 只剩激活态
|
|
66
|
+
(0, store_js_1.removeInstance)(instanceId);
|
|
67
|
+
}
|
|
68
|
+
return exitCode;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=launch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch.js","sourceRoot":"","sources":["../../src/daemon/launch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Logger } from '../logging/logger.js';
|
|
2
|
+
import { WsClient } from '../client/ws-client.js';
|
|
3
|
+
/**
|
|
4
|
+
* 优雅退出:收到 SIGTERM/SIGINT 后通知 WsClient 关闭。
|
|
5
|
+
* 二次信号(Ctrl-C 再按)强制退出,避免卡死。
|
|
6
|
+
*/
|
|
7
|
+
export declare function installSignalHandlers(client: WsClient, logger: Logger): void;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.installSignalHandlers = installSignalHandlers;
|
|
4
|
+
/**
|
|
5
|
+
* 优雅退出:收到 SIGTERM/SIGINT 后通知 WsClient 关闭。
|
|
6
|
+
* 二次信号(Ctrl-C 再按)强制退出,避免卡死。
|
|
7
|
+
*/
|
|
8
|
+
function installSignalHandlers(client, logger) {
|
|
9
|
+
let forced = false;
|
|
10
|
+
const handler = (sig) => {
|
|
11
|
+
if (forced) {
|
|
12
|
+
logger.warn({ sig }, 'second signal, force exit');
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
forced = true;
|
|
16
|
+
logger.info({ sig }, 'signal received, shutting down');
|
|
17
|
+
client.shutdown();
|
|
18
|
+
};
|
|
19
|
+
process.on('SIGTERM', () => handler('SIGTERM'));
|
|
20
|
+
process.on('SIGINT', () => handler('SIGINT'));
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=signal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal.js","sourceRoot":"","sources":["../../src/daemon/signal.ts"],"names":[],"mappings":";;AAOA,sDAaC;AAjBD;;;GAGG;AACH,SAAgB,qBAAqB,CAAC,MAAgB,EAAE,MAAc;IACpE,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,OAAO,GAAG,CAAC,GAAmB,EAAE,EAAE;QACtC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,2BAA2B,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,GAAG,IAAI,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,gCAAgC,CAAC,CAAC;QACvD,MAAM,CAAC,QAAQ,EAAE,CAAC;IACpB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Logger } from '../../logging/logger.js';
|
|
2
|
+
/**
|
|
3
|
+
* exec_shell RPC handler:spawn 子进程执行 shell,stdout/stderr 流式分片转发,
|
|
4
|
+
* 结束时发 rpc-end。不使用 pty(与 sandbox mock-cli 一致)。
|
|
5
|
+
*
|
|
6
|
+
* 协议:CLI 回 0..n 个 rpc-stream{stream:'stdout'|'stderr',data} + 恰好一个 rpc-end{exitCode}。
|
|
7
|
+
*/
|
|
8
|
+
export interface ExecShellCallbacks {
|
|
9
|
+
onStream: (stream: 'stdout' | 'stderr', data: string) => void;
|
|
10
|
+
onEnd: (exitCode: number) => void;
|
|
11
|
+
onError: (error: string) => void;
|
|
12
|
+
}
|
|
13
|
+
export declare function execShell(command: string, cwd: string | undefined, timeoutMs: number | undefined, cb: ExecShellCallbacks, logger?: Logger): void;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.execShell = execShell;
|
|
4
|
+
const node_child_process_1 = require("node:child_process");
|
|
5
|
+
function execShell(command, cwd, timeoutMs, cb, logger) {
|
|
6
|
+
if (typeof command !== 'string' || !command) {
|
|
7
|
+
cb.onError('command required');
|
|
8
|
+
cb.onEnd(-1);
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const child = (0, node_child_process_1.spawn)(command, {
|
|
12
|
+
shell: true,
|
|
13
|
+
cwd: typeof cwd === 'string' && cwd ? cwd : undefined,
|
|
14
|
+
env: process.env,
|
|
15
|
+
// 不分配 pty;流式收集 stdout/stderr
|
|
16
|
+
});
|
|
17
|
+
let ended = false;
|
|
18
|
+
const end = (code) => {
|
|
19
|
+
if (ended)
|
|
20
|
+
return;
|
|
21
|
+
ended = true;
|
|
22
|
+
cb.onEnd(code);
|
|
23
|
+
};
|
|
24
|
+
child.stdout?.on('data', (chunk) => {
|
|
25
|
+
cb.onStream('stdout', chunk.toString('utf8'));
|
|
26
|
+
});
|
|
27
|
+
child.stderr?.on('data', (chunk) => {
|
|
28
|
+
cb.onStream('stderr', chunk.toString('utf8'));
|
|
29
|
+
});
|
|
30
|
+
child.on('error', (err) => {
|
|
31
|
+
logger?.error({ err: err.message }, 'exec_shell spawn error');
|
|
32
|
+
cb.onStream('stderr', String(err));
|
|
33
|
+
end(-1);
|
|
34
|
+
});
|
|
35
|
+
child.on('close', (code, signal) => {
|
|
36
|
+
if (signal) {
|
|
37
|
+
cb.onStream('stderr', `process killed by signal ${signal}`);
|
|
38
|
+
}
|
|
39
|
+
end(code ?? -1);
|
|
40
|
+
});
|
|
41
|
+
// 超时:杀进程并结束
|
|
42
|
+
if (timeoutMs && timeoutMs > 0) {
|
|
43
|
+
const timer = setTimeout(() => {
|
|
44
|
+
if (!ended) {
|
|
45
|
+
logger?.warn({ timeoutMs }, 'exec_shell timeout, killing');
|
|
46
|
+
child.kill('SIGTERM');
|
|
47
|
+
}
|
|
48
|
+
}, timeoutMs);
|
|
49
|
+
child.on('close', () => clearTimeout(timer));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=exec-shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec-shell.js","sourceRoot":"","sources":["../../../src/handlers/rpc/exec-shell.ts"],"names":[],"mappings":";;AAiBA,8BAuDC;AAxED,2DAA2C;AAiB3C,SAAgB,SAAS,CACvB,OAAe,EACf,GAAuB,EACvB,SAA6B,EAC7B,EAAsB,EACtB,MAAe;IAEf,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5C,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAC/B,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACb,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,IAAA,0BAAK,EAAC,OAAO,EAAE;QAC3B,KAAK,EAAE,IAAI;QACX,GAAG,EAAE,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;QACrD,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,6BAA6B;KAC9B,CAAC,CAAC;IAEH,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE;QAC3B,IAAI,KAAK;YAAE,OAAO;QAClB,KAAK,GAAG,IAAI,CAAC;QACb,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;QACzC,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;QACzC,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACxB,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,wBAAwB,CAAC,CAAC;QAC9D,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACnC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACV,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QACjC,IAAI,MAAM,EAAE,CAAC;YACX,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,4BAA4B,MAAM,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,YAAY;IACZ,IAAI,SAAS,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,6BAA6B,CAAC,CAAC;gBAC3D,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;QACH,CAAC,EAAE,SAAS,CAAC,CAAC;QACd,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { DirEntry, OkPathResult, StatResult } from '../../client/frames.js';
|
|
2
|
+
export declare function uploadFile(path: unknown, chunkDataB64: unknown, isLast: unknown): OkPathResult;
|
|
3
|
+
export declare function fileUploadAborted(path: unknown): void;
|
|
4
|
+
export type DownloadChunkCb = (chunkB64: string, isLast: boolean) => void;
|
|
5
|
+
/**
|
|
6
|
+
* 分片下载。支持 offset/length 做 Range 段级下载(段内仍分片回吐):
|
|
7
|
+
* - offset(字节):起始位置,默认 0
|
|
8
|
+
* - length(字节):读取长度,默认到文件尾
|
|
9
|
+
* isLast=true 表示本段(或整个文件)的最后一片。
|
|
10
|
+
*/
|
|
11
|
+
export declare function downloadFile(path: unknown, chunkB64: (c: string, last: boolean) => void, offset?: unknown, length?: unknown): void;
|
|
12
|
+
export declare function readFile(path: unknown): string;
|
|
13
|
+
export declare function writeFile(path: unknown, content: unknown): OkPathResult;
|
|
14
|
+
export declare function listDir(path: unknown): DirEntry[];
|
|
15
|
+
export declare function makeDir(path: unknown): OkPathResult;
|
|
16
|
+
export declare function remove(path: unknown): OkPathResult;
|
|
17
|
+
export declare function stat(path: unknown): StatResult;
|