From 4f831a0d5b01c15cc30c3f4286fefc9cef4f9ae9 Mon Sep 17 00:00:00 2001 From: Levi Yan Date: Wed, 15 Jan 2025 15:13:26 +0800 Subject: [PATCH] feat: add communication method without return value that communicate with devstar-home --- src/home.ts | 182 +++++++++++++++++++++++++++------------------------- 1 file changed, 95 insertions(+), 87 deletions(-) diff --git a/src/home.ts b/src/home.ts index b0ab399..930ca26 100644 --- a/src/home.ts +++ b/src/home.ts @@ -9,7 +9,7 @@ export default class DSHome { private remoteContainer: RemoteContainer; private user: User; private devstarHomePageUrl: string; - private devstarDomain: string|undefined + private devstarDomain: string | undefined constructor(context: vscode.ExtensionContext) { this.context = context; @@ -40,94 +40,100 @@ export default class DSHome { panel.webview.onDidReceiveMessage( async (message) => { const data = message.data - switch (message.command) { - // ----------------- frequent ----------------------- - case 'getUserToken': - const userToken = this.user.getUserTokenFromLocal() - if (userToken === undefined) { - panel.webview.postMessage({ command: 'getUserToken', data: { userToken: '' } }) + const need_return = message.need_return + if (!need_return) { + // ================= don't need return ============== + } else { + // ================= need return ==================== + 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; - } else { - panel.webview.postMessage({ command: 'getUserToken', data: { userToken: userToken } }) + case 'openRemoteFolder': + this.remoteContainer.openRemoteFolder(data.host, data.username, data.port, data.path); break; - } - case 'getUsername': - const username = this.user.getUsernameFromLocal() - if (username === undefined) { - panel.webview.postMessage({ command: 'getUsername', data: { username: '' } }) + case 'getDevstarDomain': + panel.webview.postMessage({ command: 'getDevstarDomain', data: { devstarDomain: this.devstarDomain } }) 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; - case 'openRemoteFolder': - this.remoteContainer.openRemoteFolder(data.host, data.username, data.port, data.path); - 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 } }) - break; - } 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 } }); - break; - } else { - panel.webview.postMessage({ command: 'setUsername', data: { ok: false } }); - break; - } - case 'getUserPublicKey': - var userPublicKey = ''; - if (this.user.existUserPrivateKey()) { - userPublicKey = this.user.getUserPublicKey(); - panel.webview.postMessage({ command: 'getUserPublicKey', data: { userPublicKey: userPublicKey } }) - break; - } else { - 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 } }) - 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 } }) + // ----------------- not frequent ----------------------- + case 'setUserToken': + this.user.setUserTokenToLocal(data.userToken) + if (data.userToken === this.user.getUserTokenFromLocal()) { + panel.webview.postMessage({ command: 'setUserToken', data: { ok: true } }) + break; + } 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 } }); + break; + } else { + panel.webview.postMessage({ command: 'setUsername', data: { ok: false } }); + break; + } + case 'getUserPublicKey': + var userPublicKey = ''; + if (this.user.existUserPrivateKey()) { + userPublicKey = this.user.getUserPublicKey(); + panel.webview.postMessage({ command: 'getUserPublicKey', data: { userPublicKey: userPublicKey } }) + break; + } else { + 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 } }) + 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, @@ -183,7 +189,7 @@ export default class DSHome { async function communicateVSCode(command, data) { return new Promise((resolve, reject) => { // request to vscode - vscode.postMessage({ command: command, data: data }) + vscode.postMessage({ command: command, need_return: true, data: data }) function handleResponse(event) { const jsonData = event.data; @@ -223,6 +229,8 @@ export default class DSHome { if (iframe && iframe.contentWindow) { 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) { console.error('Error parsing message:', error);