set up local development for openscad lamdas

and make a start on combining with Three.js IdeViewer
Resolves #227

related #231
This commit is contained in:
Kurt Hutten
2021-03-10 08:14:32 +11:00
parent 384d8231e8
commit 10062513fd
13 changed files with 4613 additions and 3490 deletions

11
api/src/docker/Dockerfile Normal file
View File

@@ -0,0 +1,11 @@
FROM node:14
COPY package.json ./
COPY yarn.lock ./
COPY aws-emulator.js ./
RUN npm install
EXPOSE 8080
CMD ["node", "./aws-emulator.js"]

View File

@@ -9,14 +9,25 @@ But Kurt Hutten credentials for deployment, though if you wanted to set your own
## testing changes locally
Honestly it's a pain in the neck, for a number of reasons.
You'll need to have Docker installed
Because of the way the docker containers to be deployed as lambdas on aws are somewhat specialised for the purpose we're using `docker-compose` to spin one up for each function/endpoint. But more work needs to be done to get this to work with the app locally.
Because of the way the docker containers to be deployed as lambdas on aws are somewhat specialised for the purpose we're using `docker-compose` to spin one up for each function/endpoint. So we've added a aws-emulation layer
first cd into this folder `cd api/src/docker`
then
```bash
docker-compose up --build
```
The first time you run the, when it has to build the main image it will take some time, but launching again will be quicker.
After which we'll also spin up a light express server to act as an emulator to transform some the request from the front end into how the lambda's expect them.
```
yarn install
yarn emulate
```
You can now change the url in `web/src/helpers/cadPackages/openScadController.js` from the aws url to `http://localhost:8080`
If you change anything in the `api/src/docker/openscad` directory, you will need to stop the docker process and restart it (will be fairly quick if you're only changing the js)

View File

@@ -0,0 +1,34 @@
const express = require('express')
var cors = require('cors')
const axios = require('axios')
const stream = require('stream')
const app = express()
const port = 8080
app.use(express.json())
app.use(cors())
const invocationURL = (port) =>
`http://localhost:${port}/2015-03-31/functions/function/invocations`
app.post('/render', async (req, res) => {
const { data } = await axios.post(invocationURL(5052), {
body: Buffer.from(JSON.stringify(req.body)).toString('base64'),
})
if (data.statusCode !== 200) {
res.status(data.statusCode)
res.send(res.body)
} else {
const fileContents = Buffer.from(data.body, 'base64')
const readStream = new stream.PassThrough()
readStream.end(fileContents)
res.set('Content-disposition', 'attachment; filename=' + 'output')
res.set('Content-Type', 'image/png')
readStream.pipe(res)
}
})
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
})

View File

@@ -1,16 +1,27 @@
services:
# aws-emulator:
# build: .
# networks:
# - awsland
# ports:
# - "5050:8080"
openscad-health:
build: ./openscad/.
image: openscad
command: openscad.health
ports:
- "5051:8080"
openscad-render:
image: openscad
# build: ./openscad/.
command: openscad.render
# networks:
# - awsland
ports:
- "5052:8080"
openscad-export:
image: openscad
# build: ./openscad/.
@@ -18,3 +29,6 @@ services:
ports:
- "5053:8080"
# networks:
# awsland:
# name: awsland

View File

@@ -5,15 +5,23 @@ const { nanoid } = require('nanoid')
module.exports.runScad = async ({
file,
settings: { size: { x = 500, y = 500 } = {} } = {}, // TODO add view settings
settings: {
size: { x = 500, y = 500 } = {},
camera: {
position = { x: 40, y: 40, z: 40 },
rotation = { x: 55, y: 0, z: 25 },
} = {},
} = {}, // TODO add view settings
} = {}) => {
const tempFile = await makeFile(file)
const { x: rx, y: ry, z: rz } = rotation
const { x: px, y: py, z: pz } = position
const cameraArg = `--camera=${px},${py},${pz},${rx},${ry},${rz},300`
const command = `xvfb-run --auto-servernum --server-args "-screen 0 1024x768x24" openscad -o /tmp/${tempFile}/output.png ${cameraArg} --imgsize=${x},${y} /tmp/${tempFile}/main.scad`
console.log('command', command)
try {
const result = await runCommand(
`xvfb-run --auto-servernum --server-args "-screen 0 1024x768x24" openscad -o /tmp/${tempFile}/output.png --imgsize=${x},${y} /tmp/${tempFile}/main.scad`,
10000
)
const result = await runCommand(command, 10000)
return { result, tempFile }
} catch (error) {
return { error, tempFile }

View File

@@ -0,0 +1,20 @@
{
"name": "aws-emulator",
"version": "1.0.0",
"description": "thin layer so that we can use docker lambdas locally",
"scripts": {
"lambdas": "docker-compose up --build",
"emulate": "nodemon ./aws-emulator.js",
"watch": "concurrently \"yarn lambdas\" \"yarn emulate\""
},
"main": "aws-emulator.js",
"dependencies": {
"axios": "^0.21.1",
"cors": "^2.8.5",
"express": "^4.17.1"
},
"devDependencies": {
"concurrently": "^6.0.0",
"nodemon": "^2.0.7"
}
}

View File

@@ -3,8 +3,8 @@ service: cad-lambdas
#app: your-app-name
#org: your-org-name
plugins:
- serverless-offline
# plugins:
# - serverless-offline
# You can pin your service to only deploy with a specific Serverless version
# Check out our docs for more details

1479
api/src/docker/yarn.lock Normal file

File diff suppressed because it is too large Load Diff