From 07644a6cd1d34acad4036fe86fbfc1ca32b6a555 Mon Sep 17 00:00:00 2001 From: Fabien Benetou Date: Fri, 27 Oct 2023 16:08:42 +0200 Subject: [PATCH] example of state per distance --- index.js | 144 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 index.js diff --git a/index.js b/index.js new file mode 100644 index 0000000..4e37845 --- /dev/null +++ b/index.js @@ -0,0 +1,144 @@ +/* nodejs server to grab the current URL as tridactyl command and serve back page with content */ + +// mkdir tabs polydata + +// autocmd TabEnter .* js fetch("http://localhost:7777/?url="+window.location.href) +// might be interesting to keep track of document.referrer too +// consider instead Firefox Account + +const fs = require('fs'); +const express = require('express') +const cors = require('cors') +const https = require('https') +const path = require('path') +const {execSync} = require('child_process'); +const fetch = require('node-fetch'); + +const app = express() +app.use(cors()) + +app.get('/getpoly', function(req, res){ + const polypath = "polydata" + const url = "https://static.poly.pizza/" + const extensions = [".glb",".webp"] + const filepath = path.join(__dirname, polypath, req.query.id+extensions[0]) + if (!fs.existsSync(filepath)){ + execSync("wget "+url+req.query.id+extensions[0], {cwd:path.join(__dirname,polypath)}) + execSync("wget "+url+req.query.id+extensions[1], {cwd:path.join(__dirname,polypath)}) + } + res.send("received"); +}); + +app.get('/voiceinput', function(req, res){ + console.log(req.query.keyword) + sseSend(req.query.keyword) + res.send("received"); +}); + +app.get('/search', async function(req, res){ + const response = await fetch('https://api.poly.pizza/v1/search/'+req.query.keyword, { + headers: {'x-auth-token': 'e821ece91d1a43c1ac70299368a72b8a'} + }); + const data = await response.json(); + + res.json(data); +}); + +app.get('/cabin', function(req, res){ + res.sendFile(path.join(__dirname, 'cabin.html')) +}); + +app.get('/', function(req, res){ + res.sendFile(path.join(__dirname, 'index.html')) +}); + +app.get('/tabs', function(req, res){ + res.json({"files":fs.readdirSync("tabs")}) +}); + +// resulting in possibly getting /static/screens/1652811988.png +app.get('/screens', function(req, res){ + res.json({"files":fs.readdirSync("screens")}) +}); + +const container = "docker run --rm -e UID=$(id -u) -e GID=$(id -g) " +// could try losing priviledges instead, if possible +fs.watch("cabin.html", (eventType, filename) => { + if (eventType == "change") sseSend(filename+" modified") +}) + + +// SSE to force reload client-side +var connectedClients = [] +function sseSend(data){ + connectedClients.map( res => { + console.log("notifying client") // seems to be call very often (might try to send to closed clients?) + res.write(`data: ${JSON.stringify({status: data})}\n\n`); + }) +} + +app.get('/streaming', (req, res) => { + res.setHeader('Cache-Control', 'no-cache'); + res.setHeader('Content-Type', 'text/event-stream'); + //res.setHeader('Access-Control-Allow-Origin', '*'); + // alread handled at the nginx level + res.setHeader('Connection', 'keep-alive'); + res.setHeader('X-Accel-Buffering', 'no'); + res.flushHeaders(); // flush the headers to establish SSE with client + + res.write(`data: ${JSON.stringify({event: "userconnect"})}\n\n`); // res.write() instead of res.send() + connectedClients.push(res) + + // If client closes connection, stop sending events + res.on('close', () => { + console.log('client dropped me'); + res.end(); + }); +}); + +// consider instead CloudInit so that it can be delegated to another machine + // keeping a pool of available machine would start with a single one + // namely that it is possible to run multiple containers on 1 instance, simultaneously or not. +containersSupportedByLanguage = { + bash: "debian ", + julia: "julia julia -E ", + python: "python python -c ", + // avoided file specific languages + // could be done by writing to a file in the container e.g /tmp/file.c then passing it as parameter +} + + +app.get('/invitereload', function(req, res){ + sseSend("reload") + res.json({"res":"reload requested"}) +}) + +app.get('/command', function(req, res){ + var req = req.query.command + var foundContainer = containersSupportedByLanguage[req.split(" ")[0]] + var code = req.split(" ").slice(1).join(" ") + if (foundContainer) + res.json({"res":execSync(container+foundContainer+code).toString()}) + else + res.json({"res":"language not supported"}) +}); +// could specify name, it then contiue instance + +// ~/.openai-codex-test-xr +// potential alt backend to generate + +app.get('/currenturl', function(req, res){ + // could instead be the webxr page + let now = + new Date() + fs.appendFile('currentURL.txt', now+" "+req.query.url+" "+req.query.referrer+"\n", function (err) { if (err) throw err; }); + // could be JSON instead + res.json({"status":"test"}) +}); + +app.use('/static', express.static(path.join(__dirname, '.'))) +// including currentURL.txt + +const port = 7777 +app.listen(port, () => + console.log('listening on port', port) +);