Preview and stl mvp working

This commit is contained in:
Kurt Hutten
2021-11-21 17:49:22 +11:00
parent 8bdfec02d9
commit b1ff7796b9
8 changed files with 57 additions and 110 deletions

View File

@@ -1,21 +1,5 @@
import { writeFiles, runCommand } from '../common/utils'
import { nanoid } from 'nanoid'
const { readFile } = require('fs/promises')
const fs = require('fs');
const { spawn } = require('child_process');
function* getXDisplayNumber() {
const startValue = 99;
let i = startValue;
while(true) {
i -= 1;
// Never hit zero since 0 is usually used by desktop users.
if (i <= 0) i = startValue;
yield ':' + i;
}
}
export const runCurv = async ({
file,
@@ -54,61 +38,23 @@ export const runCurv = async ({
const fullPath = `/tmp/${tempFile}/output.gz`
const imPath = `/tmp/${tempFile}/output.png`
const customizerPath = `/tmp/${tempFile}/customizer.param`
const summaryPath = `/tmp/${tempFile}/summary.json` // contains camera info
const code = file;
const DISPLAY = getXDisplayNumber().next().value;
const xvfbProcess = spawn(
'Xvfb',
[DISPLAY, '-ac', '-nocursor', '-screen', '0', '480x500x24'],
);
const curvProcess = spawn(
'curv',
['-' ],
{ env: Object.assign({}, process.env, { DISPLAY, PATH: '/usr/local/bin' }) }
);
curvProcess.stdin.write(code);
curvProcess.stdin.end();
let statusSet = false;
let contentTypeSet = false;
curvProcess.stderr.on('data', (buf) => {
const data = buf.toString('utf8');
if (data.indexOf('shape') >= 0) {
setTimeout(() => {
const screenshotProcess = spawn('maim', ['--hidecursor', imPath], { env: { DISPLAY } });
screenshotProcess.on('close', () => {
curvProcess.kill();
xvfbProcess.kill();
});
}, 1000);
}
if (data.indexOf('ERROR') < 0) { return; }
curvProcess.kill();
xvfbProcess.kill();
});
const command = [
'xvfb-run --auto-servernum --server-args "-screen 0 1024x768x24" curv',
`-o ${imPath}`,
`-O xsize=${x}`,
`-O ysize=${y}`,
`-O bg=webRGB[26,26,29]`, // #1A1A1D
`/tmp/${tempFile}/main.curv`,
].join(' ')
console.log('command', command)
try {
const files: string[] = await Promise.all(
[customizerPath, summaryPath].map((path) =>
readFile(path, { encoding: 'ascii' })
)
)
const [params, cameraInfo] = files.map((fileStr: string) =>
JSON.parse(fileStr)
)
const consoleMessage = await runCommand(command, 15000)
await writeFiles(
[
{
file: JSON.stringify({
cameraInfo: viewAll ? cameraInfo.camera : undefined,
customizerParams: params.parameters,
consoleMessage,
type: 'png',
}),
@@ -143,7 +89,6 @@ export const stlExport = async ({ file, settings: { parameters } } = {}) => {
)
const fullPath = `/tmp/${tempFile}/output.gz`
const stlPath = `/tmp/${tempFile}/output.stl`
const customizerPath = `/tmp/${tempFile}/customizer.param`
const command = [
'curv',
'-o', stlPath,
@@ -155,14 +100,10 @@ export const stlExport = async ({ file, settings: { parameters } } = {}) => {
try {
// lambda will time out before this, we might need to look at background jobs if we do git integration stl generation
const consoleMessage = await runCommand(command, 60000)
const params = JSON.parse(
await readFile(customizerPath, { encoding: 'ascii' })
).parameters
await writeFiles(
[
{
file: JSON.stringify({
customizerParams: params,
consoleMessage,
type: 'stl',
}),
@@ -175,7 +116,7 @@ export const stlExport = async ({ file, settings: { parameters } } = {}) => {
`cat ${stlPath} /var/task/cadhub-concat-split /tmp/${tempFile}/metadata.json | gzip > ${fullPath}`,
15000
)
return { consoleMessage, fullPath, customizerPath }
return { consoleMessage, fullPath }
} catch (error) {
return { error, fullPath }
}