删除不必要代码&&修改工作流文件
Some checks failed
CI/CD Pipeline for DevStar Extension / build (pull_request) Has been cancelled
Some checks failed
CI/CD Pipeline for DevStar Extension / build (pull_request) Has been cancelled
This commit is contained in:
@@ -22,6 +22,10 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
npm install
|
npm install
|
||||||
|
|
||||||
|
- name: 安装 Git
|
||||||
|
run: |
|
||||||
|
apk add --no-cache git
|
||||||
|
|
||||||
- name: 构建插件
|
- name: 构建插件
|
||||||
run: |
|
run: |
|
||||||
npm run package
|
npm run package
|
||||||
|
|||||||
88
src/home.ts
88
src/home.ts
@@ -79,95 +79,9 @@ export default class DSHome {
|
|||||||
async (message) => {
|
async (message) => {
|
||||||
const data = message.data;
|
const data = message.data;
|
||||||
const need_return = message.need_return;
|
const need_return = message.need_return;
|
||||||
if (need_return) {
|
if (!need_return) {
|
||||||
// ================= need return ====================
|
|
||||||
switch (message.command) {
|
switch (message.command) {
|
||||||
// ----------------- frequent -----------------------
|
|
||||||
case 'getHomeConfig':
|
|
||||||
const config = {
|
|
||||||
language: vscode.env.language
|
|
||||||
};
|
|
||||||
panel.webview.postMessage({ command: 'getHomeConfig', data: { homeConfig: config } });
|
|
||||||
break;
|
|
||||||
case 'getUserToken':
|
|
||||||
const userToken = this.user.getUserTokenFromLocal();
|
|
||||||
if (userToken === undefined) {
|
|
||||||
panel.webview.postMessage({ command: 'getUserToken', data: { userToken: '' } });
|
|
||||||
} else {
|
|
||||||
panel.webview.postMessage({ command: 'getUserToken', data: { userToken: userToken } });
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'getUsername':
|
|
||||||
const username = this.user.getUsernameFromLocal();
|
|
||||||
if (username === undefined) {
|
|
||||||
panel.webview.postMessage({ command: 'getUsername', data: { username: '' } });
|
|
||||||
} else {
|
|
||||||
panel.webview.postMessage({ command: 'getUsername', data: { username: username } });
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'firstOpenRemoteFolder':
|
|
||||||
// data.host - project name
|
|
||||||
await this.remoteContainer.firstOpenProject(data.host, data.hostname, data.port, data.username, data.path, this.context);
|
|
||||||
break;
|
|
||||||
case 'openRemoteFolder':
|
|
||||||
this.remoteContainer.openRemoteFolder(data.host, data.port, data.username, data.path, this.context);
|
|
||||||
break;
|
|
||||||
case 'getDevstarDomain':
|
|
||||||
panel.webview.postMessage({ command: 'getDevstarDomain', data: { devstarDomain: this.devstarDomain } });
|
|
||||||
break;
|
|
||||||
// ----------------- not frequent -----------------------
|
|
||||||
case 'setUserToken':
|
|
||||||
this.user.setUserTokenToLocal(data.userToken);
|
|
||||||
if (data.userToken === this.user.getUserTokenFromLocal()) {
|
|
||||||
panel.webview.postMessage({ command: 'setUserToken', data: { ok: true } });
|
|
||||||
} else {
|
|
||||||
panel.webview.postMessage({ command: 'setUserToken', data: { ok: false } });
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'setUsername':
|
|
||||||
this.user.setUsernameToLocal(data.username);
|
|
||||||
if (data.username === this.user.getUsernameFromLocal()) {
|
|
||||||
panel.webview.postMessage({ command: 'setUsername', data: { ok: true } });
|
|
||||||
} else {
|
|
||||||
panel.webview.postMessage({ command: 'setUsername', data: { ok: false } });
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'getUserPublicKey':
|
|
||||||
let userPublicKey = '';
|
|
||||||
if (this.user.existUserPrivateKey()) {
|
|
||||||
userPublicKey = this.user.getUserPublicKey();
|
|
||||||
}
|
|
||||||
panel.webview.postMessage({ command: 'getUserPublicKey', data: { userPublicKey: userPublicKey } });
|
|
||||||
break;
|
|
||||||
case 'createUserPublicKey':
|
|
||||||
await this.user.createUserSSHKey();
|
|
||||||
if (this.user.existUserPublicKey()) {
|
|
||||||
panel.webview.postMessage({ command: 'createUserPublicKey', data: { ok: true } });
|
|
||||||
} else {
|
|
||||||
panel.webview.postMessage({ command: 'createUserPublicKey', data: { ok: false } });
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'getMachineName':
|
|
||||||
const machineName = os.hostname();
|
|
||||||
panel.webview.postMessage({ command: 'getMachineName', data: { machineName: machineName } });
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// ================= don't need return ==============
|
|
||||||
// frequent
|
|
||||||
switch (message.command) {
|
|
||||||
// ----------------- frequent -----------------------
|
|
||||||
case 'showInformationNotification':
|
|
||||||
vscode.window.showInformationMessage(data.message);
|
|
||||||
break;
|
|
||||||
case 'showWarningNotification':
|
|
||||||
vscode.window.showWarningMessage(data.message);
|
|
||||||
break;
|
|
||||||
case 'showErrorNotification':
|
|
||||||
await utils.showErrorNotification(data.message);
|
|
||||||
break;
|
|
||||||
case 'openExternalUrl':
|
case 'openExternalUrl':
|
||||||
// 修复:直接从 message 中获取 url,而不是从 data
|
|
||||||
const url = message.url || (data && data.url);
|
const url = message.url || (data && data.url);
|
||||||
if (url) {
|
if (url) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -210,11 +210,6 @@ export class DevStarExtension {
|
|||||||
vscode.commands.registerCommand('devstar.showHome', () =>
|
vscode.commands.registerCommand('devstar.showHome', () =>
|
||||||
this.dsHome.toggle()
|
this.dsHome.toggle()
|
||||||
),
|
),
|
||||||
vscode.commands.registerCommand('devstar.showPortMappings', () => {
|
|
||||||
// 这里需要根据当前活动连接获取hostname和port
|
|
||||||
// 简化实现:显示所有活动的端口映射
|
|
||||||
this.remoteContainer.showPortMappingsInOutputChannel('current', 0);
|
|
||||||
}),
|
|
||||||
vscode.commands.registerCommand('devstar.clean', () => {
|
vscode.commands.registerCommand('devstar.clean', () => {
|
||||||
// 先清除ssh key
|
// 先清除ssh key
|
||||||
if (fs.existsSync(this.user.getUserPrivateKeyPath())) {
|
if (fs.existsSync(this.user.getUserPrivateKeyPath())) {
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ export default class RemoteContainer {
|
|||||||
private user: User;
|
private user: User;
|
||||||
private sshProcesses?: Map<string, any>;
|
private sshProcesses?: Map<string, any>;
|
||||||
private portMappings: Map<string, Array<{ containerPort: number, localPort: number, label: string, source: string }>> = new Map();
|
private portMappings: Map<string, Array<{ containerPort: number, localPort: number, label: string, source: string }>> = new Map();
|
||||||
private statusBarItems?: Map<string, vscode.StatusBarItem>;
|
|
||||||
|
|
||||||
constructor(user: User) {
|
constructor(user: User) {
|
||||||
this.user = user;
|
this.user = user;
|
||||||
@@ -313,93 +312,10 @@ export default class RemoteContainer {
|
|||||||
} else if (selection === '在浏览器中打开' && portMappings.length > 0) {
|
} else if (selection === '在浏览器中打开' && portMappings.length > 0) {
|
||||||
vscode.env.openExternal(vscode.Uri.parse(`http://localhost:${portMappings[0].localPort}`));
|
vscode.env.openExternal(vscode.Uri.parse(`http://localhost:${portMappings[0].localPort}`));
|
||||||
} else if (selection === '查看详细信息') {
|
} else if (selection === '查看详细信息') {
|
||||||
this.showPortMappingsInOutputChannel('current', 0);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 注册端口映射查看命令
|
|
||||||
*/
|
|
||||||
private registerPortMappingsCommands(mappingKey: string, portMappings: Array<{ containerPort: number, localPort: number, label: string, source: string }>): void {
|
|
||||||
const showPortMappingsCommand = `devstar.showPortMappings.${mappingKey.replace(/[^a-zA-Z0-9]/g, '_')}`;
|
|
||||||
|
|
||||||
vscode.commands.registerCommand(showPortMappingsCommand, () => {
|
|
||||||
this.showPortMappingsSummary(portMappings);
|
|
||||||
});
|
|
||||||
|
|
||||||
this.createStatusBarItem(mappingKey, portMappings);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 创建状态栏项目
|
|
||||||
*/
|
|
||||||
private createStatusBarItem(mappingKey: string, portMappings: Array<{ containerPort: number, localPort: number, label: string, source: string }>): void {
|
|
||||||
if (portMappings.length === 0) return;
|
|
||||||
|
|
||||||
const statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 100);
|
|
||||||
|
|
||||||
statusBarItem.text = `$(plug) ${portMappings.length} Ports`;
|
|
||||||
statusBarItem.tooltip = `点击查看 ${portMappings.length} 个端口映射详情`;
|
|
||||||
|
|
||||||
statusBarItem.command = `devstar.showPortMappings.${mappingKey.replace(/[^a-zA-Z0-9]/g, '_')}`;
|
|
||||||
|
|
||||||
statusBarItem.show();
|
|
||||||
|
|
||||||
if (!this.statusBarItems) {
|
|
||||||
this.statusBarItems = new Map();
|
|
||||||
}
|
|
||||||
this.statusBarItems.set(mappingKey, statusBarItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取当前活动的端口映射信息
|
|
||||||
*/
|
|
||||||
public getActivePortMappings(hostname: string, port: number): Array<{ containerPort: number, localPort: number, label: string, source: string }> {
|
|
||||||
const mappingKey = `${hostname}:${port}`;
|
|
||||||
return this.portMappings.get(mappingKey) || [];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 显示端口映射面板
|
|
||||||
*/
|
|
||||||
public showPortMappingsPanel(hostname: string, port: number): void {
|
|
||||||
const mappings = this.getActivePortMappings(hostname, port);
|
|
||||||
if (mappings.length === 0) {
|
|
||||||
vscode.window.showInformationMessage('当前没有活动的端口映射');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.showPortMappingsSummary(mappings);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 在输出通道显示详细的端口映射信息
|
|
||||||
*/
|
|
||||||
public showPortMappingsInOutputChannel(hostname: string, port: number): void {
|
|
||||||
const mappings = this.getActivePortMappings(hostname, port);
|
|
||||||
if (mappings.length === 0) {
|
|
||||||
vscode.window.showInformationMessage('当前没有活动的端口映射');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const outputChannel = vscode.window.createOutputChannel('DevStar Port Mappings');
|
|
||||||
outputChannel.show();
|
|
||||||
|
|
||||||
outputChannel.appendLine(`🎯 端口映射信息 - ${hostname}:${port}`);
|
|
||||||
outputChannel.appendLine('='.repeat(50));
|
|
||||||
|
|
||||||
mappings.forEach((mapping, index) => {
|
|
||||||
outputChannel.appendLine(`${index + 1}. ${mapping.label}`);
|
|
||||||
outputChannel.appendLine(` 容器端口: ${mapping.containerPort}`);
|
|
||||||
outputChannel.appendLine(` 本地端口: ${mapping.localPort}`);
|
|
||||||
outputChannel.appendLine(` 访问地址: http://localhost:${mapping.localPort}`);
|
|
||||||
outputChannel.appendLine(` 配置来源: ${mapping.source}`);
|
|
||||||
outputChannel.appendLine('');
|
|
||||||
});
|
|
||||||
|
|
||||||
outputChannel.appendLine('💡 提示: 您可以在浏览器中访问上述本地端口来访问容器中的服务');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 本地环境,保存项目的ssh连接信息
|
* 本地环境,保存项目的ssh连接信息
|
||||||
@@ -444,10 +360,6 @@ export default class RemoteContainer {
|
|||||||
// 调用 setupPortForwardingFromGlobalState 方法
|
// 调用 setupPortForwardingFromGlobalState 方法
|
||||||
await this.setupPortForwardingFromGlobalState(sshConfig.hostname, port, context);
|
await this.setupPortForwardingFromGlobalState(sshConfig.hostname, port, context);
|
||||||
|
|
||||||
setTimeout(() => {
|
|
||||||
this.showPortMappingsPanel(sshConfig.hostname, port);
|
|
||||||
}, 3000);
|
|
||||||
|
|
||||||
} catch (portError) {
|
} catch (portError) {
|
||||||
vscode.window.showWarningMessage('端口映射设置失败,但容器连接已建立');
|
vscode.window.showWarningMessage('端口映射设置失败,但容器连接已建立');
|
||||||
}
|
}
|
||||||
@@ -504,43 +416,6 @@ export default class RemoteContainer {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 清理端口映射和相关UI
|
|
||||||
*/
|
|
||||||
public cleanupPortForwarding(hostname?: string, port?: number): void {
|
|
||||||
if (this.sshProcesses) {
|
|
||||||
for (const [key, process] of this.sshProcesses.entries()) {
|
|
||||||
try {
|
|
||||||
process.kill();
|
|
||||||
} catch (error) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.sshProcesses.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.statusBarItems) {
|
|
||||||
if (hostname && port) {
|
|
||||||
const mappingKey = `${hostname}:${port}`;
|
|
||||||
const statusBarItem = this.statusBarItems.get(mappingKey);
|
|
||||||
if (statusBarItem) {
|
|
||||||
statusBarItem.dispose();
|
|
||||||
this.statusBarItems.delete(mappingKey);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (const [_, statusBarItem] of this.statusBarItems) {
|
|
||||||
statusBarItem.dispose();
|
|
||||||
}
|
|
||||||
this.statusBarItems.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hostname && port) {
|
|
||||||
const mappingKey = `${hostname}:${port}`;
|
|
||||||
this.portMappings.delete(mappingKey);
|
|
||||||
} else {
|
|
||||||
this.portMappings.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 从 globalState 获取 forwardPorts 并建立端口映射
|
* 从 globalState 获取 forwardPorts 并建立端口映射
|
||||||
@@ -572,7 +447,6 @@ export default class RemoteContainer {
|
|||||||
|
|
||||||
if (portMappings.length > 0) {
|
if (portMappings.length > 0) {
|
||||||
this.showPortMappingsSummary(portMappings);
|
this.showPortMappingsSummary(portMappings);
|
||||||
this.registerPortMappingsCommands(mappingKey, portMappings);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 使用完毕后立即清除 globalState 中的 forwardPorts,避免影响下一个项目
|
// 使用完毕后立即清除 globalState 中的 forwardPorts,避免影响下一个项目
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import DevstarAPIHandler from './devstar-api';
|
|||||||
import * as utils from './utils';
|
import * as utils from './utils';
|
||||||
const {
|
const {
|
||||||
generateKeyPairSync,
|
generateKeyPairSync,
|
||||||
createHash
|
|
||||||
} = require('node:crypto');
|
} = require('node:crypto');
|
||||||
const sshpk = require('sshpk');
|
const sshpk = require('sshpk');
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import * as https from 'https';
|
|||||||
import * as vscode from 'vscode';
|
import * as vscode from 'vscode';
|
||||||
import * as os from 'os';
|
import * as os from 'os';
|
||||||
import { exec } from 'child_process';
|
import { exec } from 'child_process';
|
||||||
import * as path from 'path';
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
generateKeyPairSync,
|
generateKeyPairSync,
|
||||||
|
|||||||
Reference in New Issue
Block a user