cli: merge with api-client

This commit is contained in:
Thomas Hobson 2021-03-13 16:08:35 +13:00
parent e5000917e8
commit a1536ffe56
No known key found for this signature in database
GPG Key ID: 9F1FD9D87950DB6F
8 changed files with 28 additions and 102 deletions

View File

@ -1 +0,0 @@
node_modules

View File

@ -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}

View File

@ -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 <thomas@hexf.me>",
"license": "MIT",
"dependencies": {
"node-fetch": "^2.6.1"
}
}

View File

@ -1,4 +1,4 @@
const {PistonEngine} = require('piston-api-client'); const fetch = require('node-fetch');
const fs = require('fs'); const fs = require('fs');
const path = require('path'); const path = require('path');
const chalk = require('chalk'); const chalk = require('chalk');
@ -34,8 +34,6 @@ exports.builder = {
exports.handler = async function(argv){ exports.handler = async function(argv){
const api = new PistonEngine(argv['piston-url']);
const files = [...(argv.files || []),argv.file] const files = [...(argv.files || []),argv.file]
.map(file_path => ({ .map(file_path => ({
name: path.basename(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, language: argv.language,
version: argv['language-version'], version: argv['language-version'],
files: files, files: files,
@ -59,7 +57,16 @@ exports.handler = async function(argv){
stdin, stdin,
compile_timeout: argv.ct, compile_timeout: argv.ct,
run_timeout: argv.rt 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){ function step(name, ctx){
console.log(chalk.bold(`== ${name} ==`)) console.log(chalk.bold(`== ${name} ==`))

View File

@ -1,4 +1,4 @@
const {PistonEngine} = require('piston-api-client'); const fetch = require('node-fetch');
const chalk = require('chalk'); const chalk = require('chalk');
exports.command = ['install <language> <language-version>'] exports.command = ['install <language> <language-version>']
@ -14,14 +14,14 @@ const msg_format = {
} }
exports.handler = async function(argv){ 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)); console.log(msg_format.color(install));
} }

View File

@ -1,4 +1,4 @@
const {PistonEngine} = require('piston-api-client'); const fetch = require('node-fetch');
const chalk = require('chalk'); const chalk = require('chalk');
exports.command = ['list'] exports.command = ['list']
@ -18,6 +18,12 @@ exports.handler = async function(argv){
const packages = await api.list_packages(); 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 const pkg_msg = packages
.map(msg_format.color) .map(msg_format.color)

View File

@ -7,7 +7,7 @@
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"chalk": "^4.1.0", "chalk": "^4.1.0",
"piston-api-client": "file:../api-client", "node-fetch": "^2.6.1",
"yargs": "^16.2.0" "yargs": "^16.2.0"
} }
} }

View File

@ -73,11 +73,6 @@ node-fetch@^2.6.1:
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== 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: require-directory@^2.1.1:
version "2.1.1" version "2.1.1"
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"