From 8ed9df7bb9c9ab635169968153d8f9e32567169d Mon Sep 17 00:00:00 2001 From: Stanislav Lvovsky Date: Thu, 12 Nov 2020 22:30:51 +0200 Subject: [PATCH 1/4] add basctl server --- bas-platform/package.json | 4 ++-- bas-platform/src/extension.ts | 36 ++++++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/bas-platform/package.json b/bas-platform/package.json index 56d3c88..9020ecc 100644 --- a/bas-platform/package.json +++ b/bas-platform/package.json @@ -2,7 +2,7 @@ "name": "bas-platform", "displayName": "BAS Platform Extension", "description": "SAP Business Application Studio platform extension", - "version": "0.0.5", + "version": "0.0.7", "publisher": "SAPOSS", "license": "Apache-2.0", "engines": { @@ -46,4 +46,4 @@ "vscode-test": "^1.2.2" }, "dependencies": {} -} +} \ No newline at end of file diff --git a/bas-platform/src/extension.ts b/bas-platform/src/extension.ts index c88f831..8a56b76 100644 --- a/bas-platform/src/extension.ts +++ b/bas-platform/src/extension.ts @@ -1,8 +1,13 @@ import * as vscode from 'vscode'; import { bas } from './api'; import { _performAction } from "./actions/performer"; +import * as net from 'net'; +import * as fs from 'fs'; -const subscriptions: Array= []; +const subscriptions: Array = []; + +const SOCKETFILE = '/extbin/basctlSocket'; +let basctlServer: net.Server; function performScheduledActions() { const actionsSettings = vscode.workspace.getConfiguration(); @@ -16,9 +21,36 @@ function performScheduledActions() { } } +function startBasctlServer() { + fs.stat(SOCKETFILE, err => { + if (err) { + createServer(); + } else { + fs.unlink(SOCKETFILE, err => { + if (err) { + throw new Error(err.message); + } + createServer(); + }); + } + }); +} + +function createServer() { + basctlServer = net.createServer(stream => { + stream.on("data", (dataBuffer: any) => { + const data = JSON.parse(dataBuffer.toString()); + const uri = vscode.Uri.parse(data.url, true); + vscode.env.openExternal(uri); // TODO: cast to IAction + }); + }).listen(SOCKETFILE); +} + export async function activate(context: vscode.ExtensionContext) { performScheduledActions(); + startBasctlServer(); + return bas; } @@ -26,4 +58,6 @@ export function deactivate() { for (const subscription of subscriptions) { subscription.dispose(); } + + basctlServer.close(); } From 20f2b5aae814769259c479af4fd96a7fc8a1b572 Mon Sep 17 00:00:00 2001 From: Stanislav Lvovsky Date: Sun, 15 Nov 2020 12:54:39 +0200 Subject: [PATCH 2/4] add server --- bas-platform/package.json | 9 ++-- bas-platform/src/actions/basctlAction.ts | 69 ++++++++++++++++++++++++ bas-platform/src/extension.ts | 43 +++------------ 3 files changed, 82 insertions(+), 39 deletions(-) create mode 100644 bas-platform/src/actions/basctlAction.ts diff --git a/bas-platform/package.json b/bas-platform/package.json index 9020ecc..027ef88 100644 --- a/bas-platform/package.json +++ b/bas-platform/package.json @@ -39,11 +39,14 @@ "test": "node ./out/test/runTest.js", "package": "vsce package ." }, + "dependencies": { + "lodash": "^4.17.20" + }, "devDependencies": { + "@types/lodash": "^4.14.165", "@types/vscode": "^1.40.0", "typescript": "^3.9.7", "vsce": "^1.69.0", "vscode-test": "^1.2.2" - }, - "dependencies": {} -} \ No newline at end of file + } +} diff --git a/bas-platform/src/actions/basctlAction.ts b/bas-platform/src/actions/basctlAction.ts new file mode 100644 index 0000000..2c16e0b --- /dev/null +++ b/bas-platform/src/actions/basctlAction.ts @@ -0,0 +1,69 @@ +import * as vscode from 'vscode'; +import * as net from 'net'; +import * as fs from 'fs'; +import * as _ from 'lodash'; +// import { bas } from '../api'; + +const SOCKETFILE = '/extbin/basctlSocket'; + +let basctlServer: net.Server; + + +function _addBasctlAction(socket: net.Socket) { + //const openExternal = new bas.actions.ExecuteAction(); + //openExternal.executeAction = async () => { + socket.on("data", dataBuffer => { + let data; + try { + const strData = _.toString(dataBuffer); + vscode.window.showInformationMessage("Client string - " + strData); + data = JSON.parse(strData); + vscode.window.showInformationMessage("Client data.url - " + data.url); + } catch (error) { + const errorMessage = _.get(error, "stack", _.get(error, "message", "failed to parse data")); + vscode.window.showErrorMessage(errorMessage); + return; + } + + if (data.command === "open") { + vscode.window.showInformationMessage("got open command with url - " + data.url); + const uri = vscode.Uri.parse(data.url, true); + vscode.env.openExternal(uri); + } + }); + // } + + //bas.actions.performAction(openExternal); +} + +export function closeBasctlServer() { + if (basctlServer) { + basctlServer.close(); + } +} + +function createBasctlServer() { + try { + basctlServer = net.createServer(socket => { + _addBasctlAction(socket); + }).listen(SOCKETFILE); + } catch (error) { + const errorMessage = _.get(error, "stack", _.get(error, "message", "failed to start basctl server")); + vscode.window.showErrorMessage(errorMessage); + } +} + +export function startBasctlServer() { + fs.stat(SOCKETFILE, err => { + if (err) { + createBasctlServer(); + } else { + fs.unlink(SOCKETFILE, err => { + if (err) { + throw new Error(err.message); + } + createBasctlServer(); + }); + } + }); +} diff --git a/bas-platform/src/extension.ts b/bas-platform/src/extension.ts index 8a56b76..ab8e10b 100644 --- a/bas-platform/src/extension.ts +++ b/bas-platform/src/extension.ts @@ -1,18 +1,14 @@ import * as vscode from 'vscode'; import { bas } from './api'; import { _performAction } from "./actions/performer"; -import * as net from 'net'; -import * as fs from 'fs'; +import { startBasctlServer, closeBasctlServer } from './actions/basctlAction'; const subscriptions: Array = []; -const SOCKETFILE = '/extbin/basctlSocket'; -let basctlServer: net.Server; - function performScheduledActions() { const actionsSettings = vscode.workspace.getConfiguration(); - let actionsList: any[] | undefined = actionsSettings.get("actions"); - if (actionsList && actionsList.length > 0) { + const actionsList: any[] | undefined = actionsSettings.get("actions"); + if (actionsList && actionsList.length) { for (const action of actionsList) { console.log(`performing action ${action.name} of type ${action.constructor.name}`) _performAction(action); @@ -21,43 +17,18 @@ function performScheduledActions() { } } -function startBasctlServer() { - fs.stat(SOCKETFILE, err => { - if (err) { - createServer(); - } else { - fs.unlink(SOCKETFILE, err => { - if (err) { - throw new Error(err.message); - } - createServer(); - }); - } - }); -} - -function createServer() { - basctlServer = net.createServer(stream => { - stream.on("data", (dataBuffer: any) => { - const data = JSON.parse(dataBuffer.toString()); - const uri = vscode.Uri.parse(data.url, true); - vscode.env.openExternal(uri); // TODO: cast to IAction - }); - }).listen(SOCKETFILE); -} +export async function activate() { + startBasctlServer(); -export async function activate(context: vscode.ExtensionContext) { performScheduledActions(); - startBasctlServer(); - return bas; } export function deactivate() { + closeBasctlServer(); + for (const subscription of subscriptions) { subscription.dispose(); } - - basctlServer.close(); } From d125285e1419eba87fc23e670dd91fab7b183646 Mon Sep 17 00:00:00 2001 From: Stanislav Lvovsky Date: Sun, 15 Nov 2020 13:05:25 +0200 Subject: [PATCH 3/4] fix: add server --- bas-platform/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bas-platform/package.json b/bas-platform/package.json index 027ef88..163e7bc 100644 --- a/bas-platform/package.json +++ b/bas-platform/package.json @@ -6,7 +6,7 @@ "publisher": "SAPOSS", "license": "Apache-2.0", "engines": { - "vscode": "^1.44.2" + "vscode": "^1.44.2" }, "repository": { "type": "git", @@ -49,4 +49,4 @@ "vsce": "^1.69.0", "vscode-test": "^1.2.2" } -} +} \ No newline at end of file From 3bab15c59475af8cc7b571f1fceb0ba1f77d8fc6 Mon Sep 17 00:00:00 2001 From: Stanislav Lvovsky Date: Sun, 15 Nov 2020 13:12:03 +0200 Subject: [PATCH 4/4] refactor: improve basctl server logic --- bas-platform/src/actions/basctlAction.ts | 44 +++++++++++++----------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/bas-platform/src/actions/basctlAction.ts b/bas-platform/src/actions/basctlAction.ts index 2c16e0b..05d1919 100644 --- a/bas-platform/src/actions/basctlAction.ts +++ b/bas-platform/src/actions/basctlAction.ts @@ -12,30 +12,33 @@ let basctlServer: net.Server; function _addBasctlAction(socket: net.Socket) { //const openExternal = new bas.actions.ExecuteAction(); //openExternal.executeAction = async () => { - socket.on("data", dataBuffer => { - let data; - try { - const strData = _.toString(dataBuffer); - vscode.window.showInformationMessage("Client string - " + strData); - data = JSON.parse(strData); - vscode.window.showInformationMessage("Client data.url - " + data.url); - } catch (error) { - const errorMessage = _.get(error, "stack", _.get(error, "message", "failed to parse data")); - vscode.window.showErrorMessage(errorMessage); - return; - } + socket.on("data", dataBuffer => { + const data: any = getRequestData(dataBuffer); - if (data.command === "open") { - vscode.window.showInformationMessage("got open command with url - " + data.url); - const uri = vscode.Uri.parse(data.url, true); - vscode.env.openExternal(uri); - } - }); - // } + if (data.command === "open") { + const uri = vscode.Uri.parse(data.url, true); + vscode.env.openExternal(uri); + } + }); + // } //bas.actions.performAction(openExternal); } +function getRequestData(dataBuffer: any) { + try { + return JSON.parse(_.toString(dataBuffer)); + } catch (error) { + showErrorMessage(error, "failed to parse basctl request data"); + return {}; + } +} + +function showErrorMessage(error: any, defaultError: string) { + const errorMessage = _.get(error, "stack", _.get(error, "message", defaultError)); + vscode.window.showErrorMessage(errorMessage); +} + export function closeBasctlServer() { if (basctlServer) { basctlServer.close(); @@ -48,8 +51,7 @@ function createBasctlServer() { _addBasctlAction(socket); }).listen(SOCKETFILE); } catch (error) { - const errorMessage = _.get(error, "stack", _.get(error, "message", "failed to start basctl server")); - vscode.window.showErrorMessage(errorMessage); + showErrorMessage(error, "failed to start basctl server"); } }