import * as vscode from 'vscode'; import * as os from 'os'; import RemoteContainer from './remote-container'; import User from './user'; import * as utils from './utils' export default class DSHome { private context: vscode.ExtensionContext; private remoteContainer: RemoteContainer; private user:User; static defaultUrl = 'http://localhost:8080/test/index.html'; constructor(context: vscode.ExtensionContext) { this.context = context; this.user = new User(context); this.remoteContainer = new RemoteContainer(this.user); } async toggle(url: string = DSHome.defaultUrl) { console.log(url); const panel = vscode.window.createWebviewPanel( 'homeWebview', 'Home', vscode.ViewColumn.One, { enableScripts: true, } ); utils.fetch(url).then(async (content) => { panel.webview.html = await this.getWebviewContent(content); }) 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: ''}}) 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; case 'openRemoteFolder': this.remoteContainer.openRemoteFolder(data.host, data.username, data.port, data.path); 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}}) } }, undefined, this.context.subscriptions ); this.context.subscriptions.push(panel) } async getWebviewContent(content: string): Promise { return `${content}` } }