X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=index.js;h=ba01d67ffbe60b85403b5026e514b51f34d9a389;hb=04e147e46052f0912440c580cd52b0dc95d715f2;hp=3ffea3d9feef95ac81ac8a66c2b5c68badc018e9;hpb=252a783ab361e62990e31e5cbf483663548a34be;p=zombocom-ai diff --git a/index.js b/index.js index 3ffea3d..ba01d67 100644 --- a/index.js +++ b/index.js @@ -1,3 +1,8 @@ +const fs = require('fs'); + +const util = require('util'); +const execFile = util.promisify(require('child_process').execFile); + const express = require('express'); const app = express(); const http = require('http'); @@ -6,14 +11,83 @@ const { Server } = require("socket.io"); const io = new Server(server); const port = 2122; +const python_path = '/usr/bin/python3' +const generate_image_script = '/home/cworth/src/zombocom-ai/generate-image.py' +const state_file = 'zombocom-state.json' + +var state; + +// Load comments at server startup +fs.readFile(state_file, (err, data) => { + if (err) + state = { images: [], comments: [] }; + else + state = JSON.parse(data); +}); + +// Save comments when server is shutting down +function cleanup() { + fs.writeFileSync('zombocom-state.json', JSON.stringify(state), (error) => { + if (error) + throw error; + }) +} + +// And connect to that on either clean exit... +process.on('exit', cleanup); + +// ... or on a SIGINT (control-C) +process.on('SIGINT', () => { + cleanup(); + process.exit(); +}); + app.get('/index.html', (req, res) => { res.sendFile(__dirname + '/index.html'); }); io.on('connection', (socket) => { - console.log('a user connected'); + + // Replay old comments and images to a newly-joining client + state.comments.forEach((comment) => { + socket.emit('comment', comment) + }); + state.images.forEach((image) => { + socket.emit('image', image) + }); + + // When any client comments, send that to all clients (including sender) socket.on('comment', (comment) => { - console.log('comment: ' + comment); + io.emit('comment', comment); + state.comments.push(comment); + }); + + // Generate an image when requested + socket.on('generate', (request) => { + console.log(`Generating image with code=${request['code']} and prompt=${request['prompt']}`); + async function generate_image(code, prompt) { + var promise; + if (code) { + promise = execFile(python_path, [generate_image_script, `--seed=${code}`, prompt]) + } else { + promise = execFile(python_path, [generate_image_script, prompt]) + } + const child = promise.child; + child.stdout.on('data', (data) => { + const images = JSON.parse(data); + images.forEach((image) => { + console.log(`Emitting image to clients: ${image}`); + io.emit('image', image); + state.images.push(image); + }); + }); + child.stderr.on('data', (data) => { + console.log("Error occurred during generate-image: " + data); + }); + const { stdout, stderr } = await promise; + socket.emit('generation-done'); + } + generate_image(request['code'], request['prompt']); }); });