From 8307c5d849e436638518dee3c5fc5eb2969579ce Mon Sep 17 00:00:00 2001 From: Jason Park Date: Sun, 23 Jun 2019 20:18:32 +0900 Subject: [PATCH] Use AWS Lambda instead of Docker to compile Java --- CONTRIBUTING.md | 6 ++- package-lock.json | 89 ++++++++++++++++++++++++++++++++++ package.json | 1 + src/config/environments.ts | 8 +++ src/tracers/DockerTracer.ts | 2 - src/tracers/LambdaTracer.ts | 33 +++++++++++++ src/tracers/java/Dockerfile | 8 --- src/tracers/java/JavaTracer.ts | 4 +- 8 files changed, 138 insertions(+), 13 deletions(-) create mode 100644 src/tracers/LambdaTracer.ts delete mode 100644 src/tracers/java/Dockerfile diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0638941..dbd56dc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -20,10 +20,14 @@ Are you a first-timer in contributing to open source? [These guidelines](https:/ 4. Create `.env.local` in the project root: ```bash + # By putting dummy values, GitHub sign in will not work locally GITHUB_CLIENT_ID = dummy GITHUB_CLIENT_SECRET = dummy + + # By putting dummy values, extracting visualizing commands will not work locally (except for JavaScript). + AWS_ACCESS_KEY_ID = dummy + AWS_SECRET_ACCESS_KEY = dummy ``` - It's safe to put any dummy value to them unless you need the GitHub sign in functionality locally. 5. Install dependencies, and run the server. diff --git a/package-lock.json b/package-lock.json index ea58289..646e43c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -198,6 +198,22 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "aws-sdk": { + "version": "2.480.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.480.0.tgz", + "integrity": "sha512-X6xOgBeg8ZZJPnL4/wHXFIP6QF2SBABqw/F5l5zT/vEPUfmrIg24LVSUwPXmV6ZMh4hwsuuOjO910MbjNoHXXg==", + "requires": { + "buffer": "4.9.1", + "events": "1.1.1", + "ieee754": "1.1.8", + "jmespath": "0.15.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.3.2", + "xml2js": "0.4.19" + } + }, "axios": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", @@ -213,6 +229,11 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" + }, "basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -258,6 +279,16 @@ "concat-map": "0.0.1" } }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, "buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -516,6 +547,11 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + }, "express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", @@ -711,6 +747,11 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" + }, "indent-string": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", @@ -772,12 +813,22 @@ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", "dev": true }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -1091,11 +1142,21 @@ "ipaddr.js": "1.9.0" } }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -1185,6 +1246,11 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" + }, "semver": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", @@ -1494,6 +1560,15 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -1534,6 +1609,20 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" + }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", diff --git a/package.json b/package.json index 3d61eac..5c7f111 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "tslint": "^5.16.0" }, "dependencies": { + "aws-sdk": "^2.480.0", "axios": "^0.19.0", "body-parser": "^1.18.2", "compression": "^1.7.3", diff --git a/src/config/environments.ts b/src/config/environments.ts index 0a8ae31..1824314 100644 --- a/src/config/environments.ts +++ b/src/config/environments.ts @@ -27,6 +27,9 @@ const { GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET, + + AWS_ACCESS_KEY_ID, + AWS_SECRET_ACCESS_KEY, } = process.env; const isEnabled = (v: string) => v === '1'; @@ -48,6 +51,8 @@ const missingVars = [ ] : []), 'GITHUB_CLIENT_ID', 'GITHUB_CLIENT_SECRET', + 'AWS_ACCESS_KEY_ID', + 'AWS_SECRET_ACCESS_KEY', ].filter(variable => process.env[variable] === undefined); if (missingVars.length) throw new Error(`The following environment variables are missing: ${missingVars.join(', ')}`); @@ -71,3 +76,6 @@ export const credentials: ServerOptions | undefined = isEnabled(CREDENTIALS_ENAB export const githubClientId = GITHUB_CLIENT_ID; export const githubClientSecret = GITHUB_CLIENT_SECRET; + +export const awsAccessKeyId = AWS_ACCESS_KEY_ID; +export const awsSecretAccessKey = AWS_SECRET_ACCESS_KEY; diff --git a/src/tracers/DockerTracer.ts b/src/tracers/DockerTracer.ts index e22692f..3672e2f 100644 --- a/src/tracers/DockerTracer.ts +++ b/src/tracers/DockerTracer.ts @@ -15,8 +15,6 @@ export class DockerTracer extends Tracer { super(lang); this.directory = path.resolve(__dirname, lang); this.imageName = `tracer-${this.lang}`; - - this.build = this.build.bind(this); } build(release: Release) { diff --git a/src/tracers/LambdaTracer.ts b/src/tracers/LambdaTracer.ts new file mode 100644 index 0000000..b608a45 --- /dev/null +++ b/src/tracers/LambdaTracer.ts @@ -0,0 +1,33 @@ +import AWS from 'aws-sdk'; +import express from 'express'; +import { Release, Tracer } from 'tracers/Tracer'; +import { awsAccessKeyId, awsSecretAccessKey } from 'config/environments'; +import { BadRequest } from 'ts-httpexceptions'; + +export class LambdaTracer extends Tracer { + static lambda = new AWS.Lambda({ + region: 'us-east-2', + accessKeyId: awsAccessKeyId, + secretAccessKey: awsSecretAccessKey, + }); + + async build(release: Release) { + } + + route(router: express.Router) { + router.post(`/${this.lang}`, (req, res, next) => { + const {code} = req.body; + LambdaTracer.lambda.invoke({ + FunctionName: `extractor-${this.lang}`, + InvocationType: 'RequestResponse', + Payload: JSON.stringify(code), + }, function (err, data) { + if (err) return next(err); + if (typeof data.Payload !== 'string') return next(new Error('Unexpected Payload Type')); + const payload = JSON.parse(data.Payload); + if (!payload.success) return next(new BadRequest(payload.errorMessage)); + res.send(payload.commands); + }); + }); + } +} diff --git a/src/tracers/java/Dockerfile b/src/tracers/java/Dockerfile deleted file mode 100644 index 8aabc07..0000000 --- a/src/tracers/java/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM openjdk:8 - -ARG tag_name - -RUN curl --create-dirs -o /usr/local/lib/algorithm-visualizer.jar -L "https://github.com/algorithm-visualizer/tracers.java/releases/download/${tag_name}/algorithm-visualizer.jar" - -CMD javac -cp /usr/local/lib/algorithm-visualizer.jar Main.java \ - && java -cp /usr/local/lib/algorithm-visualizer.jar:. Main diff --git a/src/tracers/java/JavaTracer.ts b/src/tracers/java/JavaTracer.ts index 043c3c6..e4e5f2b 100644 --- a/src/tracers/java/JavaTracer.ts +++ b/src/tracers/java/JavaTracer.ts @@ -1,6 +1,6 @@ -import { DockerTracer } from 'tracers/DockerTracer'; +import { LambdaTracer } from 'tracers/LambdaTracer'; -export class JavaTracer extends DockerTracer { +export class JavaTracer extends LambdaTracer { constructor() { super('java'); }