5分钟上手electerm插件开发:打造专属文件传输工具
你是否还在为找不到合适的文件传输工具而烦恼?是否需要在不同服务器间频繁切换时重复繁琐的操作?本文将带你从零开始开发一个electerm自定义文件传输插件,通过简单的步骤实现高效、个性化的文件传输功能。
插件开发基础
electerm作为一款功能强大的终端工具,支持SSH、Telnet、SFTP等多种连接方式。其插件系统允许开发者扩展核心功能,而文件传输正是最常见的扩展场景之一。
核心模块解析
文件传输功能主要依赖以下核心模块:
- Transfer类:src/app/server/transfer.js提供了基础文件传输实现,支持断点续传和并发传输
- FtpTransfer类:src/app/server/ftp-transfer.js专门处理FTP协议的文件传输
- SessionServer:src/app/server/session-server.js负责管理传输会话和生命周期
这些模块通过统一的接口协作,确保不同协议(SFTP/FTP)的传输操作具有一致的使用体验。
开发步骤
1. 创建插件结构
首先,在项目中创建以下目录结构:
plugins/
└── custom-transfer/
├── index.js # 插件入口
├── transfer.js # 自定义传输实现
└── package.json # 插件配置
2. 实现自定义传输类
创建transfer.js文件,继承基础Transfer类并添加自定义逻辑:
const { Transfer } = require('../../app/server/transfer');
class CustomTransfer extends Transfer {
constructor(options) {
super(options);
this.customOption = options.customOption || 'default';
}
// 重写文件读取方法,添加自定义日志
onSrcOpen(err, sourceHandle) {
console.log(`[CustomTransfer] 开始读取文件: ${this.srcPath}`);
super.onSrcOpen(err, sourceHandle);
}
// 添加自定义进度报告
onData(count) {
const progress = Math.round((count / this.fsize) * 100);
this.ws.s({
id: 'transfer:customProgress:' + this.id,
data: {
progress,
message: `传输中: ${progress}%`
}
});
super.onData(count);
}
}
module.exports = { CustomTransfer };
3. 注册插件
在index.js中实现插件注册逻辑:
const { CustomTransfer } = require('./transfer');
module.exports = {
// 插件元数据
meta: {
name: 'custom-transfer',
version: '1.0.0',
description: '自定义文件传输插件,支持进度报告和日志记录'
},
// 初始化函数
init(app) {
// 注册自定义传输处理器
app.registerTransferHandler('custom', {
createTransfer: (options) => new CustomTransfer(options),
supportedProtocols: ['sftp', 'ftp']
});
console.log('Custom transfer plugin initialized');
}
};
4. 集成到主应用
修改会话服务器代码,添加自定义传输支持:
// 在session-server.js中添加
const { CustomTransfer } = require('../plugins/custom-transfer/transfer');
// 修改传输创建逻辑
const Cls = isCustom ? CustomTransfer : isFtp ? FtpTransfer : Transfer;
使用示例
基本用法
创建传输任务时指定自定义传输类型:
// 创建自定义传输任务
const transfer = new CustomTransfer({
remotePath: '/remote/path/file.txt',
localPath: '/local/path/file.txt',
type: 'download',
sftp: sftpClient,
ws: webSocket,
customOption: 'verbose'
});
进度监控
通过WebSocket接收自定义进度消息:
ws.on('message', (data) => {
const message = JSON.parse(data);
if (message.id.startsWith('transfer:customProgress:')) {
console.log(message.data.message);
// 更新UI进度条
updateProgressBar(message.data.progress);
}
});
高级功能扩展
1. 添加文件校验
扩展onEnd方法实现传输后校验:
async onEnd() {
await this.verifyFileIntegrity();
super.onEnd();
}
async verifyFileIntegrity() {
const remoteHash = await this.calculateRemoteHash();
const localHash = await this.calculateLocalHash();
if (remoteHash !== localHash) {
this.onError(new Error('文件校验失败: 哈希不匹配'));
} else {
this.ws.s({
id: 'transfer:verification:' + this.id,
data: { verified: true }
});
}
}
2. 实现传输队列
创建传输管理器处理多个文件的顺序传输:
class TransferQueue {
constructor() {
this.queue = [];
this.running = false;
}
addTransfer(transfer) {
this.queue.push(transfer);
if (!this.running) {
this.processNext();
}
}
async processNext() {
if (this.queue.length === 0) {
this.running = false;
return;
}
this.running = true;
const transfer = this.queue.shift();
try {
await new Promise((resolve, reject) => {
transfer.on('end', resolve);
transfer.on('error', reject);
});
} catch (err) {
console.error('传输失败:', err);
}
this.processNext();
}
}
调试与测试
调试技巧
- 使用electerm内置日志工具:
const log = require('../../common/log');
log.debug('自定义传输开始', this.srcPath, this.dstPath);
- 在开发模式下启用调试输出:
electerm --dev --debug-plugins
单元测试
创建基本测试用例:
const { CustomTransfer } = require('./transfer');
const { expect } = require('chai');
describe('CustomTransfer', () => {
it('should calculate correct progress', () => {
const transfer = new CustomTransfer({
fsize: 1000,
ws: { s: () => {} }
});
transfer.onData(500);
// 验证进度计算是否正确
});
});
总结
通过本文的步骤,你已经学会如何开发一个electerm文件传输插件。这个插件不仅实现了基本的文件传输功能,还添加了自定义进度报告和日志记录功能。你可以根据实际需求进一步扩展,如添加文件加密、压缩传输或集成云存储服务等高级功能。
electerm的插件系统为开发者提供了灵活的扩展方式,通过合理利用现有模块和API,可以快速构建出功能丰富的插件,提升终端工作效率。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



