feat: add communication method without return value that communicate with devstar-home

This commit is contained in:
Levi Yan
2025-01-15 15:13:26 +08:00
parent 5e0848715b
commit 4f831a0d5b

View File

@@ -9,7 +9,7 @@ export default class DSHome {
private remoteContainer: RemoteContainer; private remoteContainer: RemoteContainer;
private user: User; private user: User;
private devstarHomePageUrl: string; private devstarHomePageUrl: string;
private devstarDomain: string|undefined private devstarDomain: string | undefined
constructor(context: vscode.ExtensionContext) { constructor(context: vscode.ExtensionContext) {
this.context = context; this.context = context;
@@ -40,94 +40,100 @@ export default class DSHome {
panel.webview.onDidReceiveMessage( panel.webview.onDidReceiveMessage(
async (message) => { async (message) => {
const data = message.data const data = message.data
switch (message.command) { const need_return = message.need_return
// ----------------- frequent ----------------------- if (!need_return) {
case 'getUserToken': // ================= don't need return ==============
const userToken = this.user.getUserTokenFromLocal() } else {
if (userToken === undefined) { // ================= need return ====================
panel.webview.postMessage({ command: 'getUserToken', data: { userToken: '' } }) switch (message.command) {
// ----------------- frequent -----------------------
case 'getUserToken':
const userToken = this.user.getUserTokenFromLocal()
if (userToken === undefined) {
panel.webview.postMessage({ command: 'getUserToken', data: { userToken: '' } })
break;
} 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: '' } })
break;
} else {
panel.webview.postMessage({ command: 'getUsername', data: { username: username } })
break;
}
case 'firstOpenRemoteFolder':
await this.remoteContainer.firstConnect(data.host, data.username, data.port)
.then((_res) => {
if (_res == 'success') {
// only success then open folder
this.remoteContainer.openRemoteFolder(data.host, data.username, data.port, data.path);
}
}).catch(error => {
console.error(`Failed to connect ${data.host}: `, error)
})
break; break;
} else { case 'openRemoteFolder':
panel.webview.postMessage({ command: 'getUserToken', data: { userToken: userToken } }) this.remoteContainer.openRemoteFolder(data.host, data.username, data.port, data.path);
break; break;
} case 'getDevstarDomain':
case 'getUsername': panel.webview.postMessage({ command: 'getDevstarDomain', data: { devstarDomain: this.devstarDomain } })
const username = this.user.getUsernameFromLocal()
if (username === undefined) {
panel.webview.postMessage({ command: 'getUsername', data: { username: '' } })
break; break;
} else { // ----------------- not frequent -----------------------
panel.webview.postMessage({ command: 'getUsername', data: { username: username } }) case 'setUserToken':
break; this.user.setUserTokenToLocal(data.userToken)
} if (data.userToken === this.user.getUserTokenFromLocal()) {
case 'firstOpenRemoteFolder': panel.webview.postMessage({ command: 'setUserToken', data: { ok: true } })
await this.remoteContainer.firstConnect(data.host, data.username, data.port) break;
.then((_res) => { } else {
if (_res == 'success') { panel.webview.postMessage({ command: 'setUserToken', data: { ok: false } })
// only success then open folder break;
this.remoteContainer.openRemoteFolder(data.host, data.username, data.port, data.path); }
} case 'setUsername':
}).catch(error => { this.user.setUsernameToLocal(data.username);
console.error(`Failed to connect ${data.host}: `, error) if (data.username === this.user.getUsernameFromLocal()) {
}) panel.webview.postMessage({ command: 'setUsername', data: { ok: true } });
break; break;
case 'openRemoteFolder': } else {
this.remoteContainer.openRemoteFolder(data.host, data.username, data.port, data.path); panel.webview.postMessage({ command: 'setUsername', data: { ok: false } });
break; break;
case 'getDevstarDomain': }
panel.webview.postMessage({command: 'getDevstarDomain', data:{ devstarDomain: this.devstarDomain}}) case 'getUserPublicKey':
break; var userPublicKey = '';
// ----------------- not frequent ----------------------- if (this.user.existUserPrivateKey()) {
case 'setUserToken': userPublicKey = this.user.getUserPublicKey();
this.user.setUserTokenToLocal(data.userToken) panel.webview.postMessage({ command: 'getUserPublicKey', data: { userPublicKey: userPublicKey } })
if (data.userToken === this.user.getUserTokenFromLocal()) { break;
panel.webview.postMessage({ command: 'setUserToken', data: { ok: true } }) } else {
break; panel.webview.postMessage({ command: 'getUserPublicKey', data: { userPublicKey: userPublicKey } })
} else { break;
panel.webview.postMessage({ command: 'setUserToken', data: { ok: false } }) }
break; case 'createUserPublicKey':
} await this.user.createUserSSHKey();
case 'setUsername': if (this.user.existUserPublicKey()) {
this.user.setUsernameToLocal(data.username); panel.webview.postMessage({ command: 'createUserPublicKey', data: { ok: true } })
if (data.username === this.user.getUsernameFromLocal()) { break;
panel.webview.postMessage({ command: 'setUsername', data: { ok: true } }); } else {
break; panel.webview.postMessage({ command: 'createUserPublicKey', data: { ok: false } })
} else { break;
panel.webview.postMessage({ command: 'setUsername', data: { ok: false } }); }
break; case 'getMachineName':
} const machineName = os.hostname();
case 'getUserPublicKey': panel.webview.postMessage({ command: 'getMachineName', data: { machineName: machineName } })
var userPublicKey = ''; case 'getDefaultPublicKey':
if (this.user.existUserPrivateKey()) { var defaultPublicKey;
userPublicKey = this.user.getUserPublicKey(); if (utils.existDefaultPublicKey()) {
panel.webview.postMessage({ command: 'getUserPublicKey', data: { userPublicKey: userPublicKey } }) defaultPublicKey = utils.getDefaultPublicKey();
break; } else {
} else { // if default public key doesn't exist, create it
panel.webview.postMessage({ command: 'getUserPublicKey', data: { userPublicKey: userPublicKey } }) utils.createSSHKey();
break; defaultPublicKey = utils.getDefaultPublicKey();
} }
case 'createUserPublicKey': panel.webview.postMessage({ command: 'getDefaultPublicKey', data: { defaultPublicKey: defaultPublicKey } })
await this.user.createUserSSHKey(); }
if (this.user.existUserPublicKey()) {
panel.webview.postMessage({ command: 'createUserPublicKey', data: { ok: true } })
break;
} else {
panel.webview.postMessage({ command: 'createUserPublicKey', data: { ok: false } })
break;
}
case 'getMachineName':
const machineName = os.hostname();
panel.webview.postMessage({ command: 'getMachineName', data: { machineName: machineName } })
case 'getDefaultPublicKey':
var defaultPublicKey;
if (utils.existDefaultPublicKey()) {
defaultPublicKey = utils.getDefaultPublicKey();
} else {
// if default public key doesn't exist, create it
utils.createSSHKey();
defaultPublicKey = utils.getDefaultPublicKey();
}
panel.webview.postMessage({ command: 'getDefaultPublicKey', data: { defaultPublicKey: defaultPublicKey } })
} }
}, },
undefined, undefined,
@@ -183,7 +189,7 @@ export default class DSHome {
async function communicateVSCode(command, data) { async function communicateVSCode(command, data) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
// request to vscode // request to vscode
vscode.postMessage({ command: command, data: data }) vscode.postMessage({ command: command, need_return: true, data: data })
function handleResponse(event) { function handleResponse(event) {
const jsonData = event.data; const jsonData = event.data;
@@ -223,6 +229,8 @@ export default class DSHome {
if (iframe && iframe.contentWindow) { if (iframe && iframe.contentWindow) {
iframe.contentWindow.postMessage({ action: actionFromHome, data: dataFromVSCodeResponse }, '*') iframe.contentWindow.postMessage({ action: actionFromHome, data: dataFromVSCodeResponse }, '*')
} }
} else if (jsonData.target === 'vscode_no_return') {
vscode.postMessage({ command: jsonData.action, need_return: false, data: jsonData.data })
} }
} catch (error) { } catch (error) {
console.error('Error parsing message:', error); console.error('Error parsing message:', error);