From f615e26493b7b587aae9b6f6bcb72626d772e196 Mon Sep 17 00:00:00 2001 From: Thomas Hobson Date: Sat, 13 Mar 2021 13:19:05 +1300 Subject: [PATCH 1/5] cli: change shebang to use env --- cli/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/index.js b/cli/index.js index ff29736..803e3af 100755 --- a/cli/index.js +++ b/cli/index.js @@ -1,4 +1,4 @@ -#!/usr/bin/node +#!/usr/bin/env node require('yargs')(process.argv.slice(2)) .option('piston-url', { alias: ['u'], From 69c013fa7a860ecc73e64775689ed053e237d66f Mon Sep 17 00:00:00 2001 From: Thomas Hobson Date: Sat, 13 Mar 2021 14:31:40 +1300 Subject: [PATCH 2/5] dev: nix shell file --- shell.nix | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 shell.nix diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..732c1b1 --- /dev/null +++ b/shell.nix @@ -0,0 +1,5 @@ +{ pkgs ? import {} }: + pkgs.mkShell { + # nativeBuildInputs is usually what you want -- tools you need to run + nativeBuildInputs = [ pkgs.buildPackages.nodejs-15_x ]; +} \ No newline at end of file From e5000917e8b5ccb701bee427fa0f92748c1b90a0 Mon Sep 17 00:00:00 2001 From: Thomas Hobson Date: Sat, 13 Mar 2021 15:58:30 +1300 Subject: [PATCH 3/5] dev(nix-shell): add yarn --- shell.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell.nix b/shell.nix index 732c1b1..f9063bc 100644 --- a/shell.nix +++ b/shell.nix @@ -1,5 +1,5 @@ { pkgs ? import {} }: pkgs.mkShell { # nativeBuildInputs is usually what you want -- tools you need to run - nativeBuildInputs = [ pkgs.buildPackages.nodejs-15_x ]; + nativeBuildInputs = [ pkgs.nodejs-15_x pkgs.yarn ]; } \ No newline at end of file From a1536ffe565e1641db8f50c269de96241a1e587d Mon Sep 17 00:00:00 2001 From: Thomas Hobson Date: Sat, 13 Mar 2021 16:08:35 +1300 Subject: [PATCH 4/5] cli: merge with api-client --- api-client/.gitignore | 1 - api-client/index.cjs | 70 -------------------------- api-client/package.json | 11 ---- cli/commands/execute.js | 17 +++++-- cli/commands/ppman_commands/install.js | 16 +++--- cli/commands/ppman_commands/list.js | 8 ++- cli/package.json | 2 +- cli/yarn.lock | 5 -- 8 files changed, 28 insertions(+), 102 deletions(-) delete mode 100644 api-client/.gitignore delete mode 100644 api-client/index.cjs delete mode 100644 api-client/package.json diff --git a/api-client/.gitignore b/api-client/.gitignore deleted file mode 100644 index b512c09..0000000 --- a/api-client/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules \ No newline at end of file diff --git a/api-client/index.cjs b/api-client/index.cjs deleted file mode 100644 index 14723dd..0000000 --- a/api-client/index.cjs +++ /dev/null @@ -1,70 +0,0 @@ -const fetch = require('node-fetch') - -function url_join(base, endpoint){ - return base + endpoint - //return new URL(endpoint, base).href; -} - -class APIWrapper { - #base; - constructor(base_url){ - this.#base = base_url.toString() - } - - async query(endpoint, options={}){ - const url = url_join(this.#base, endpoint); - return await fetch(url, options) - .then(res=>res.json()) - .then(res=>{if(res.data)return res.data; throw new Error(res.message)}); - } - - get(endpoint){ - return this.query(endpoint); - } - - post(endpoint, body={}){ - return this.query(endpoint, { - method: 'post', - headers: {'Content-Type': 'application/json'}, - body: JSON.stringify(body) - }) - } - - delete(endpoint, body={}){ - return this.query(endpoint, { - method: 'delete', - headers: {'Content-Type': 'application/json'}, - body: JSON.stringify(body) - }) - } - - get url_base(){ - return this.#base - } -} - - -class PistonEngine extends APIWrapper { - constructor(base_url = 'http://127.0.0.1:6969'){ - super(base_url); - } - - run_job({language, version, files, main, args, stdin, compile_timeout, run_timeout}){ - return this.post(`/jobs`, {language, version, files, main, args, stdin, compile_timeout, run_timeout}) - } - - list_packages(){ - return this.get('/packages').then(x=>x.packages) - } - - install_package({language, version}){ - return this.post(`/packages/${language}/${version}`); - } - - uninstall_package({language, version}){ - return this.post(`/packages/${language}/${version}`); - } -} - - -module.exports = {PistonEngine} \ No newline at end of file diff --git a/api-client/package.json b/api-client/package.json deleted file mode 100644 index a0f144d..0000000 --- a/api-client/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "piston-api-client", - "version": "1.0.0", - "description": "Wraps API of Piston Engine API", - "main": "index.cjs", - "author": "Thomas Hobson ", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.6.1" - } -} diff --git a/cli/commands/execute.js b/cli/commands/execute.js index 8d5ed69..f782207 100644 --- a/cli/commands/execute.js +++ b/cli/commands/execute.js @@ -1,4 +1,4 @@ -const {PistonEngine} = require('piston-api-client'); +const fetch = require('node-fetch'); const fs = require('fs'); const path = require('path'); const chalk = require('chalk'); @@ -34,8 +34,6 @@ exports.builder = { exports.handler = async function(argv){ - const api = new PistonEngine(argv['piston-url']); - const files = [...(argv.files || []),argv.file] .map(file_path => ({ name: path.basename(file_path), @@ -50,7 +48,7 @@ exports.handler = async function(argv){ })) || ""; - const response = await api.run_job({ + const request = { language: argv.language, version: argv['language-version'], files: files, @@ -59,7 +57,16 @@ exports.handler = async function(argv){ stdin, compile_timeout: argv.ct, run_timeout: argv.rt - }) + }; + + const response = await fetch(argv['piston-url'] + '/jobs', { + method: 'post', + headers: {'Content-Type': 'application/json'}, + body: JSON.stringify(request) + }) + .then(res=>res.json()) + .then(res=>{if(res.data)return res.data; throw new Error(res.message)}) + .catch(x=>x); function step(name, ctx){ console.log(chalk.bold(`== ${name} ==`)) diff --git a/cli/commands/ppman_commands/install.js b/cli/commands/ppman_commands/install.js index 39d0a28..792a9be 100644 --- a/cli/commands/ppman_commands/install.js +++ b/cli/commands/ppman_commands/install.js @@ -1,4 +1,4 @@ -const {PistonEngine} = require('piston-api-client'); +const fetch = require('node-fetch'); const chalk = require('chalk'); exports.command = ['install '] @@ -14,14 +14,14 @@ const msg_format = { } exports.handler = async function(argv){ - const api = new PistonEngine(argv['piston-url']); + const install = await fetch( + `${argv['piston-url']}/packages/${argv['language']}/${argv['language-version']}`, + {method: 'post'} + ) + .then(res=>res.json()) + .then(res=>{if(res.data)return res.data; throw new Error(res.message)}) + .catch(x=>x); - const opts = { - language: argv['language'], - version: argv['language-version'] - }; - - const install = await api.install_package(opts).catch(x=>x); console.log(msg_format.color(install)); } \ No newline at end of file diff --git a/cli/commands/ppman_commands/list.js b/cli/commands/ppman_commands/list.js index 4a44dcf..c3aa894 100644 --- a/cli/commands/ppman_commands/list.js +++ b/cli/commands/ppman_commands/list.js @@ -1,4 +1,4 @@ -const {PistonEngine} = require('piston-api-client'); +const fetch = require('node-fetch'); const chalk = require('chalk'); exports.command = ['list'] @@ -18,6 +18,12 @@ exports.handler = async function(argv){ const packages = await api.list_packages(); + const packages = await fetch(argv['piston-url'] + '/packages') + .then(res=>res.json()) + .then(res=>{if(res.data)return res.data; throw new Error(res.message)}); + .then(res=>res.packages) + .catch(x=>x) + const pkg_msg = packages .map(msg_format.color) diff --git a/cli/package.json b/cli/package.json index ca8f8f5..2075189 100644 --- a/cli/package.json +++ b/cli/package.json @@ -7,7 +7,7 @@ "license": "MIT", "dependencies": { "chalk": "^4.1.0", - "piston-api-client": "file:../api-client", + "node-fetch": "^2.6.1", "yargs": "^16.2.0" } } diff --git a/cli/yarn.lock b/cli/yarn.lock index d6958b1..c7d3bdb 100644 --- a/cli/yarn.lock +++ b/cli/yarn.lock @@ -73,11 +73,6 @@ node-fetch@^2.6.1: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== -"piston-api-client@file:../api-client": - version "1.0.0" - dependencies: - node-fetch "^2.6.1" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" From 5a05537a7fc5970011882bc730c7e0d5b3effb20 Mon Sep 17 00:00:00 2001 From: Thomas Hobson Date: Sat, 13 Mar 2021 16:44:33 +1300 Subject: [PATCH 5/5] cli: switch to axios --- cli/commands/execute.js | 12 +++-------- cli/commands/ppman_commands/install.js | 20 +++++++----------- cli/commands/ppman_commands/list.js | 17 +++++---------- cli/index.js | 14 ++++++++++++- cli/package.json | 2 +- cli/yarn.lock | 29 ++++++++++++++++---------- 6 files changed, 48 insertions(+), 46 deletions(-) diff --git a/cli/commands/execute.js b/cli/commands/execute.js index f782207..3d04ec6 100644 --- a/cli/commands/execute.js +++ b/cli/commands/execute.js @@ -1,4 +1,4 @@ -const fetch = require('node-fetch'); +//const fetch = require('node-fetch'); const fs = require('fs'); const path = require('path'); const chalk = require('chalk'); @@ -59,14 +59,8 @@ exports.handler = async function(argv){ run_timeout: argv.rt }; - const response = await fetch(argv['piston-url'] + '/jobs', { - method: 'post', - headers: {'Content-Type': 'application/json'}, - body: JSON.stringify(request) - }) - .then(res=>res.json()) - .then(res=>{if(res.data)return res.data; throw new Error(res.message)}) - .catch(x=>x); + let response = await argv.axios.post('/jobs', request); + response = response.data function step(name, ctx){ console.log(chalk.bold(`== ${name} ==`)) diff --git a/cli/commands/ppman_commands/install.js b/cli/commands/ppman_commands/install.js index 792a9be..151ab1d 100644 --- a/cli/commands/ppman_commands/install.js +++ b/cli/commands/ppman_commands/install.js @@ -1,4 +1,3 @@ -const fetch = require('node-fetch'); const chalk = require('chalk'); exports.command = ['install '] @@ -13,15 +12,12 @@ const msg_format = { } -exports.handler = async function(argv){ - const install = await fetch( - `${argv['piston-url']}/packages/${argv['language']}/${argv['language-version']}`, - {method: 'post'} - ) - .then(res=>res.json()) - .then(res=>{if(res.data)return res.data; throw new Error(res.message)}) - .catch(x=>x); - - - console.log(msg_format.color(install)); +exports.handler = async function({axios, language, languageVersion}){ + try{ + const install = await axios.post(`/packages/${language}/${languageVersion}`) + + console.log(msg_format.color(install.data)); + }catch({response}){ + console.error(response.data.message) + } } \ No newline at end of file diff --git a/cli/commands/ppman_commands/list.js b/cli/commands/ppman_commands/list.js index c3aa894..5d6584e 100644 --- a/cli/commands/ppman_commands/list.js +++ b/cli/commands/ppman_commands/list.js @@ -1,4 +1,4 @@ -const fetch = require('node-fetch'); +//const fetch = require('node-fetch'); const chalk = require('chalk'); exports.command = ['list'] @@ -13,19 +13,12 @@ const msg_format = { } -exports.handler = async function(argv){ - const api = new PistonEngine(argv['piston-url']); +exports.handler = async function({axios}){ - const packages = await api.list_packages(); + const packages = await axios.get('/packages'); - const packages = await fetch(argv['piston-url'] + '/packages') - .then(res=>res.json()) - .then(res=>{if(res.data)return res.data; throw new Error(res.message)}); - .then(res=>res.packages) - .catch(x=>x) - - - const pkg_msg = packages + + const pkg_msg = packages.data.data.packages .map(msg_format.color) .join('\n'); diff --git a/cli/index.js b/cli/index.js index 803e3af..8bb17e0 100755 --- a/cli/index.js +++ b/cli/index.js @@ -1,4 +1,15 @@ #!/usr/bin/env node + +const axios = require('axios').default; + +const axios_instance = function(argv){ + argv.axios = axios.create({ + baseURL: argv['piston-url'] + }); + + return argv; +}; + require('yargs')(process.argv.slice(2)) .option('piston-url', { alias: ['u'], @@ -6,9 +17,10 @@ require('yargs')(process.argv.slice(2)) desc: 'Piston API URL', string: true }) + .middleware(axios_instance) .scriptName("piston") .commandDir('commands') .demandCommand() .help() .wrap(72) - .argv + .argv; diff --git a/cli/package.json b/cli/package.json index 2075189..5d89dfd 100644 --- a/cli/package.json +++ b/cli/package.json @@ -6,8 +6,8 @@ "author": "Thomas Hobson ", "license": "MIT", "dependencies": { + "axios": "^0.21.1", "chalk": "^4.1.0", - "node-fetch": "^2.6.1", "yargs": "^16.2.0" } } diff --git a/cli/yarn.lock b/cli/yarn.lock index c7d3bdb..2d24666 100644 --- a/cli/yarn.lock +++ b/cli/yarn.lock @@ -14,6 +14,13 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +axios@^0.21.1: + version "0.21.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" + integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== + dependencies: + follow-redirects "^1.10.0" + chalk@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" @@ -53,6 +60,11 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +follow-redirects@^1.10.0: + version "1.13.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.3.tgz#e5598ad50174c1bc4e872301e82ac2cd97f90267" + integrity sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA== + get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -68,20 +80,15 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -node-fetch@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" @@ -116,9 +123,9 @@ y18n@^5.0.5: integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== yargs-parser@^20.2.2: - version "20.2.6" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.6.tgz#69f920addf61aafc0b8b89002f5d66e28f2d8b20" - integrity sha512-AP1+fQIWSM/sMiET8fyayjx/J+JmTPt2Mr0FkrgqB4todtfa53sOsrSAcIrJRD5XS20bKUwaDIuMkWKCEiQLKA== + version "20.2.7" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" + integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== yargs@^16.2.0: version "16.2.0"